From a44be2eb891062fb885a9db6aea4ee3a01e91c83 Mon Sep 17 00:00:00 2001
From: arigdon-usgs <arigdon@usgs.gov>
Date: Mon, 30 Jul 2018 12:54:16 -0600
Subject: [PATCH] Cleaned up merge_stream(), takes empty channels out at the
 beginning and adds them in before the merge() function

---
 geomagio/TimeseriesUtility.py  | 27 +++++++++++----------------
 test/TimeseriesUtility_test.py | 24 ++++++++++++++++++------
 2 files changed, 29 insertions(+), 22 deletions(-)

diff --git a/geomagio/TimeseriesUtility.py b/geomagio/TimeseriesUtility.py
index 89ad4ff9..4fc34689 100644
--- a/geomagio/TimeseriesUtility.py
+++ b/geomagio/TimeseriesUtility.py
@@ -195,36 +195,31 @@ def merge_streams(*streams):
         stream with contiguous traces merged, and gaps filled with numpy.nan
     """
     merged = obspy.core.Stream()
-    masked_trace = None
+    masked = obspy.core.Stream()
 
-    # add unmasked, split traces to be merged
+    # sort out empty
     for stream in streams:
-        merged += mask_stream(stream)
-
-    # if trace is completely masked separate out to be added back in later
-    for trace in merged:
-        if trace.data.mask.all():
-            if not masked_trace:
-                masked_trace = trace
+        for trace in stream:
+            if numpy.isnan(trace.data).all():
+                masked += trace
             else:
-                masked_trace += trace
+                merged += trace
+
+    merged = mask_stream(merged)
 
     # split traces that contain gaps
     merged = merged.split()
 
+    merged += masked
+
     # merge data
     merged.merge(
             # 1 = do not interpolate
             interpolation_samples=1,
+            fill_value=numpy.NaN,
             # 1 = when there is overlap, use data from trace with last endtime
             method=1)
 
-    # trim masked trace to the same size as other traces (not done in merge())
-    # and add back to merged stream
-    if masked_trace:
-        masked_trace.trim(merged[0].stats.starttime, merged[0].stats.endtime)
-        merged += masked_trace
-
     # convert back to NaN filled array
     merged = unmask_stream(merged)
     return merged
diff --git a/test/TimeseriesUtility_test.py b/test/TimeseriesUtility_test.py
index 644c7f76..4a7a2587 100644
--- a/test/TimeseriesUtility_test.py
+++ b/test/TimeseriesUtility_test.py
@@ -136,12 +136,24 @@ def test_merge_streams():
     for trace in timeseries2:
         trace.stats.starttime = UTCDateTime('2018-01-01T00:02:00Z')
         trace.stats.npts = npts2
-    Merged_streams1 = TimeseriesUtility.merge_streams(timeseries1)
+    merged_streams1 = TimeseriesUtility.merge_streams(timeseries1)
     # Make sure the empty 'F' was not removed from stream
-    assert_equals(len(timeseries1), len(Merged_streams1))
+    assert_equals(1, len(merged_streams1.select(channel = 'F')))
     # Merge multiple streams with overlapping timestamps
     timeseries = timeseries1 + timeseries2
-    Merged_streams = TimeseriesUtility.merge_streams(timeseries)
-    assert_equals(len(Merged_streams), len(timeseries1))
-    assert_equals(len(Merged_streams[0].data), 6)
-    assert_equals(len(Merged_streams[2]), 6)
+    merged_streams = TimeseriesUtility.merge_streams(timeseries)
+    assert_equals(len(merged_streams), len(timeseries1))
+    assert_equals(len(merged_streams[0].data), 6)
+    assert_equals(len(merged_streams[2]), 6)
+
+    trace7 = __create_trace('H', [1,1,1,1])
+    trace8 = __create_trace('E', [numpy.nan, numpy.nan, numpy.nan, numpy.nan])
+    trace9 = __create_trace('F', [numpy.nan, numpy.nan, numpy.nan, numpy.nan])
+    timeseries3 = Stream(traces=[trace7,trace8,trace9])
+    npts3 = len(trace7.data)
+    for trace in timeseries3:
+        trace.stats.starttime = UTCDateTime('2018-01-01T00:00:00Z')
+        trace.stats.npts = npts3
+    merged_streams3 = TimeseriesUtility.merge_streams(timeseries3)
+    assert_equals(len(timeseries3),len(merged_streams3))
+
-- 
GitLab