Processing continuous data

When processing continuous-time signals such as various types of filtering, downsampling, cosine taper, time differentiation or integration, processing each single file and then splicing then will cause data discontinuity. Using the collection class to process continuous data can solve the continuity problem of these operations.

Collection

The Collection class is used to store continuous data belonging to the same acquisition. It saves the list of continuous data file paths flist and the start time of each file ftime, as well as the metadata information of the acquisition, including the number of channels nch, the track spacing dx, the gauge length gauge_length, the sampling rate fs, the number of sampling points of a single file nt and the duration of a single file flength. When initializing a class instance, by default, the metadata of the second data file is read to obtain all metadata information, and the start time of each file ftime is automatically calculated based on the start time start_time of the second data:

>>> from daspy import Collection
>>> coll = Collection('data/*.h5')
>>> coll
       flist: 2608 files
              [data/TEST_2000m_4m_1_5000Hz_200Hz_UTC8_202312132304.h5,
               data/TEST_2000m_4m_1_5000Hz_200Hz_UTC8_202312132305.h5,
               ...,
               data/TEST_2000m_4m_1_5000Hz_200Hz_UTC8_202312151831.h5]
       ftime: 2023-12-13 23:04:00.558582+00:00 to 2023-12-15 18:32:00.558582+00:00
     flength: 60.0
         nch: 1956
          nt: 12000
          dx: 1.022494912147522
          fs: 200.0
gauge_length: 4.0
  • Set meta_from_file='all' to read metadata for each file. DASPy will check if all metadata are consistent, data is continuous, and save and calculate required properties. Metadata of various types can also be specified directly. This method is very time-consuming for large amounts of continuous data.

  • Set timeinfo_format to get the start time from the file name, check for continuity and calculate flength. timeinfo_format='DAS_%Y-%m-%dT%H:%M:%S%z.h5' indicates the time corresponding to the file name, timeinfo_format=(slice(33:45), '%Y%m%d%H%M%S') indicates the time corresponding to the slice of the file name.

Data Selection

Select data for a certain time period from the Collection class:

>>> from daspy import DASDateTime
>>> coll.select(stime = DASDateTime(2023, 12, 14, 12), etime=DASDateTime(2023, 12, 14, 13))
       flist: 61 files
              [data/TEST_2000m_4m_1_5000Hz_200Hz_UTC8_202312141159.h5,
               data/TEST_2000m_4m_1_5000Hz_200Hz_UTC8_202312141200.h5,
               ...,
               data/TEST_2000m_4m_1_5000Hz_200Hz_UTC8_202312141259.h5]
       ftime: 2023-12-13 23:04:00.558582+00:00 to 2023-12-15 18:32:00.558582+00:00
     flength: 60.0
         nch: 1956
          nt: 12000
          dx: 1.022494912147522
          fs: 200.0
gauge_length: 4.0

Setting readsec=True will directly read the data of the required period as an instance of the Section class and return it.

Continuous Data Processing

The Collection.process method can read all files in turn as Section class instances, perform a series of required processing, add a suffix and save to the target directory. This method will solve data discontinuity by caching filter states and other methods. An example of low-pass filtering all data and downsampling by 5 times in both time and space domains, and then integrating:

>>> operations = [['downsampling', dict(tint=5, xint=5, lowpass_filter=True)],
                  ['time_integration', dict()]]
>>> coll.process(operations, savepath='../processed', suffix='_pro')