From ed328950552b6a8eaa72993e1aa093fb3e7e093b Mon Sep 17 00:00:00 2001 From: Javier Quinteros Date: Sat, 1 Aug 2020 22:59:05 +0200 Subject: [PATCH] Iterate channel by channel in StationWS to be able to merge the epochs and keep the generator as it is --- dasscripts/tdmsws.py | 92 ++++++++++++++++++++++++++++---------------- 1 file changed, 59 insertions(+), 33 deletions(-) diff --git a/dasscripts/tdmsws.py b/dasscripts/tdmsws.py index f4d8b45..b7e1aba 100755 --- a/dasscripts/tdmsws.py +++ b/dasscripts/tdmsws.py @@ -394,39 +394,65 @@ class StationAPI(object): channels = streams if len(streams) else None - t = TDMS(self.__experiment, directory=self.__directory, starttime=starttime, endtime=endtime, iterate='M', - channels=channels) - with t: - lat = None - lon = None - elev = None - samprate = None - # stt = t.starttime - # ent = t.endtime - for data in t: - if lat is None: - lat = data[latkey] - if lon is None: - lon = data[lonkey] - if elev is None: - elev = data[elevkey] - if samprate is None: - samprate = data[srkey] - - # if not data['data']: - # yield json.dumps(data, default=datetime.isoformat) - - if data['data']: - stt = data['starttime'] - ent = data['endtime'] - if level == 'station': - text = 'XX|%s||FH1|%s|%s|%s|SiteName|%s|%s\n' %\ - (data['id'], lat, lon, elev, stt.isoformat(), ent.isoformat()) - else: - text = 'XX|%s||FH1|%s|%s|%s|depth|azimuth|dip|DAS|Scale|ScaleFrequency|ScaleUnits|%s|%s|%s\n' %\ - (data['id'], lat, lon, elev, samprate, stt.isoformat(), ent.isoformat()) - # yield json.dumps(data, default=datetime.isoformat) - yield text + # It is not optimal to cycle through channels instead of reading them all at once + # However it is the best to merge time windows from files int one epoch + # This allows to construct the generator returning one line at each iteration + for ch in channels: + cherrypy.log('Channel %s' % ch) + t = TDMS(self.__experiment, directory=self.__directory, starttime=starttime, endtime=endtime, iterate='M', + channels=[ch]) + result = dict() + with t: + lat = None + lon = None + elev = None + samprate = None + # stt = t.starttime + # ent = t.endtime + for data in t: + if lat is None: + lat = data[latkey] + if lon is None: + lon = data[lonkey] + if elev is None: + elev = data[elevkey] + if samprate is None: + samprate = data[srkey] + + # if not data['data']: + # yield json.dumps(data, default=datetime.isoformat) + + if data['data']: + # cherrypy.log('%s' % data) + + stt = data['starttime'] + ent = data['endtime'] + if level == 'station': + key = 'XX|%s||FH1|%s|%s|%s|SiteName' % (data['id'], lat, lon, elev) + # text = 'XX|%s||FH1|%s|%s|%s|SiteName|%s|%s\n' %\ + # (data['id'], lat, lon, elev, stt.isoformat(), ent.isoformat()) + else: + key = 'XX|%s||FH1|%s|%s|%s|depth|azimuth|dip|DAS|Scale|ScaleFrequency|ScaleUnits|%s' % \ + (data['id'], lat, lon, elev, samprate) + + # text = 'XX|%s||FH1|%s|%s|%s|depth|azimuth|dip|DAS|Scale|ScaleFrequency|ScaleUnits|%s|%s|%s\n' %\ + # (data['id'], lat, lon, elev, samprate, stt.isoformat(), ent.isoformat()) + + if key in result: + # Get the minimum starttime + stt = stt if stt < result[key][0] else result[key][0] + # Get the maximum endtime + ent = ent if ent > result[key][1] else result[key][1] + + result[key] = (stt, ent) + + # Send the epoch(s) + for key in result: + # Key is in the proper format for station or channel level. We only need to add the start and end time + text = '%s|%s|%s\n' % (key, stt.isoformat(), ent.isoformat()) + + # yield json.dumps(data, default=datetime.isoformat) + yield text return -- GitLab