def scan_cha(d): last_file = {} for f in os.listdir(d): try: (net, sta, loc, cha, ext, year, doy) = f.split('.') nets.add((net, int(year))) except ValueError: logs.error("invalid SDS file:" + p, True) continue if (net, sta, loc, cha) not in timespan: continue try: if doy > last_file[loc][0]: last_file[loc] = (doy, f) except KeyError: last_file[loc] = (doy, f) for (loc, (doy, f)) in last_file.items(): with open(d + '/' + f, 'rb') as fd: nslc = tuple(f.split('.')[:4]) rec = mseedlite.Record(fd) fd.seek(-rec.size, 2) rec = mseedlite.Record(fd) ts = timespan[nslc] if ts.start < rec.end_time < ts.end: ts.start = rec.end_time elif rec.end_time >= ts.end: del timespan[nslc]
def __time2recno(self, msFile, reclen, timeStart, recStart, timeEnd, recEnd, searchTime): if searchTime <= timeStart: msFile.seek(recStart * reclen) rec = mseedlite.Record(msFile) return (recStart, rec.end_time) if searchTime >= timeEnd: msFile.seek(recEnd * reclen) rec = mseedlite.Record(msFile) return (recEnd, rec.end_time) t1 = timeStart r1 = recStart t2 = timeEnd r2 = recEnd rn = int(r1 + (r2 - r1) * _total_seconds(searchTime - t1) / _total_seconds(t2 - t1)) if rn < recStart: rn = recStart if rn > recEnd: rn = recEnd while True: msFile.seek(rn * reclen) rec = mseedlite.Record(msFile) if rec.begin_time < searchTime: r1 = rn t1 = rec.begin_time if t1 == t2: break rn = int(r1 + (r2 - r1) * _total_seconds(searchTime - t1) / _total_seconds(t2 - t1)) if rn < recStart: rn = recStart if rn > recEnd: rn = recEnd if rn == r1: break else: r2 = rn t2 = rec.begin_time if t1 == t2: break rn = int(r2 - (r2 - r1) * _total_seconds(t2 - searchTime) / _total_seconds(t2 - t1)) if rn < recStart: rn = recStart if rn > recEnd: rn = recEnd if rn == r2: break return (rn, rec.end_time)
def __getWaveform(self, startt, endt, msFile, bufferSize): if startt >= endt: return rec = mseedlite.Record(msFile) reclen = rec.size recStart = 0 timeStart = rec.begin_time if rec.begin_time >= endt: return msFile.seek(-reclen, 2) rec = mseedlite.Record(msFile) recEnd = msFile.tell() / reclen - 1 timeEnd = rec.begin_time if rec.end_time <= startt: return if timeStart >= timeEnd: Logging.error("%s: overlap detected (start=%s, end=%s)" % (msFile.name, timeStart, timeEnd)) return (lower, et1) = self.__time2recno(msFile, reclen, timeStart, recStart, timeEnd, recEnd, startt) (upper, et2) = self.__time2recno(msFile, reclen, startt, lower, timeEnd, recEnd, endt) if upper < lower: Logging.error("%s: overlap detected (lower=%d, upper=%d)" % (msFile.name, lower, upper)) upper = lower msFile.seek(lower * reclen) remaining = (upper - lower + 1) * reclen check = True if bufferSize % reclen: bufferSize += reclen - bufferSize % reclen while remaining > 0: size = min(remaining, bufferSize) data = msFile.read(size) remaining -= size offset = 0 if not data: return if check: while offset < len(data): rec = mseedlite.Record(data[offset:offset+reclen]) if rec.begin_time >= endt: return if rec.end_time > startt: break offset += reclen check = False if offset < len(data): yield data[offset:] if offset else data while True: data = msFile.read(reclen) if not data: return rec = mseedlite.Record(data) if rec.begin_time >= endt: return yield data