def create_fradcdata(series, frame_epoch=0, channelgroup=0, channelid=0, nbits=16): """Create a `~frameCPP.FrAdcData` from a `~gwpy.types.Series` .. note:: Currently this method is restricted to 1-dimensional arrays. Parameters ---------- series : `~gwpy.types.Series` the input data array to store frame_epoch : `float`, `int`, optional the GPS start epoch of the `Frame` that will contain this data structure Returns ------- frdata : `~frameCPP.FrAdcData` the newly created data structure Notes ----- See Table 10 (§4.3.2.4) of LIGO-T970130 for more details """ from LDAStools import frameCPP # assert correct type if not series.xunit.is_equivalent('s') or series.ndim != 1: raise TypeError("only 1-dimensional timeseries data can be " "written as FrAdcData") frdata = frameCPP.FrAdcData( str(series.channel or series.name), channelgroup, channelid, nbits, (1 / series.dx.to('s')).value ) frdata.SetTimeOffset( float(LIGOTimeGPS(series.x0.value) - LIGOTimeGPS(frame_epoch)), ) return frdata
def append_to_frame(frame, timeseries, type='proc', channelid=0): """Append data from a `TimeSeries` to a `~frameCPP.FrameH` Parameters ---------- frame : `~frameCPP.FrameH` frame object to append to timeseries : `TimeSeries` the timeseries to append type : `str` the type of the channel, one of 'adc', 'proc', 'sim' channelid : `int`, optional the ID of the channel within the group (only used for ADC channels) """ if timeseries.channel: channel = str(timeseries.channel) else: channel = str(timeseries.name) offset = timeseries.t0.value - float(LIGOTimeGPS(*frame.GetGTime())) # create the data container if type.lower() == 'adc': frdata = frameCPP.FrAdcData( channel, 0, # channel group channelid, # channel number in group 16, # number of bits in ADC timeseries.sample_rate.value, # sample rate ) append = frame.AppendFrAdcData elif type.lower() == 'proc': frdata = frameCPP.FrProcData( channel, # channel name str(timeseries.name), # comment frameCPP.FrProcData.TIME_SERIES, # ID as time-series frameCPP.FrProcData.UNKNOWN_SUB_TYPE, # empty sub-type (fseries) offset, # offset of first sample relative to frame start abs(timeseries.span), # duration of data 0., # heterodyne frequency 0., # phase of heterodyne 0., # frequency range 0., # resolution bandwidth ) append = frame.AppendFrProcData elif type.lower() == 'sim': frdata = frameCPP.FrSimData( str(timeseries.channel), # channel name str(timeseries.name), # comment timeseries.sample_rate.value, # sample rate offset, # time offset of first sample 0., # heterodyne frequency 0., # phase of heterodyne ) append = frame.AppendFrSimData else: raise RuntimeError("Invalid channel type %r, please select one of " "'adc, 'proc', or 'sim'" % type) # append an FrVect frdata.AppendData(create_frvect(timeseries)) append(frdata)