# DESCRIPTION
# A. Ursi 2022 #
import numpy as np
import os
import scipy.fftpack
from astropy.io import fits
from astropy.table import Table
from pathlib import Path
from agilepy.core.AGBaseAnalysis import AGBaseAnalysis
from agilepy.utils.AstroUtils import AstroUtils
from agilepy.utils.Utils import Utils
[docs]class AGRatemeters(AGBaseAnalysis):
"""
This class contains the high-level API to run analysis of the AGILE Ratemeters.
The constructor of this class requires a ``yaml configuration file``.
"""
[docs] def __init__(self, configurationFilePath):
"""AGRatemeters constructor.
Args:
configurationFilePath (str): a relative or absolute path to the yaml configuration file.
Raises:
AGILENotFoundError: if the AGILE environment variable is not set.
PFILESNotFoundError: if the PFILES environment variable is not set.
Example:
>>> from agilepy.api import AGRatemeters
>>> agratemeters = AGratemeters('agconfig.yaml')
"""
# Load the AGBaseAnalysis object and attributes
super().__init__(configurationFilePath)
self.config.loadConfigurationsForClass("AGRatemeters")
self.logger = self.agilepyLogger.getLogger(__name__, "AGRatemeters")
# Set attributes
self._ratemetersTables = None
# End initialization
self.logger.info("AGRatemeters initialized")
[docs] @staticmethod
def getConfiguration(confFilePath, outputDir, filePath, timetype, T0,
background_tmin="null", background_tmax="null", signal_tmin="null", signal_tmax="null",
userName="my_name", sourceName="rm-source", verboselvl=0,
):
"""Utility method to create a configuration file.
Args:
confFilePath (str): the path and filename of the configuration file that is going to be created.
outputDir (str): the path to the output directory. The output directory will be created using the following format: 'userName_sourceName_todaydate'
filePath (str): The path to the data file.
timetype (str): Format of the Burst Reference Time T0.
T0 (float or str): Value of the Burst Reference Time T0.
background_tmin (float): Min Time for Background computation.
background_tmax (float): Max Time for Background computation.
signal_tmin (float): Min Time for Signal computation.
signal_tmax (float): Max Time for Signal computation.
userName (str): the username of who is running the software.
sourceName (str): the name of the source.
verboselvl (int): the verbosity level of the console output. Message types: level 0 => critical, warning, level 1 => critical, warning, info, level 2 => critical, warning, info, debug
Returns:
None
"""
configuration = f"""
output:
outdir: {outputDir}
filenameprefix: ratemeters_product
sourcename: {sourceName}
username: {userName}
verboselvl: {verboselvl}
selection:
file_path: {filePath}
analysis:
timetype: \"{timetype}\"
T0: \"{T0}\"
background_tmin: {background_tmin}
background_tmax: {background_tmax}
signal_tmin: {signal_tmin}
signal_tmax: {signal_tmax}
"""
full_file_path = Utils._expandEnvVar(confFilePath)
parent_directory = Path(full_file_path).absolute().parent
parent_directory.mkdir(exist_ok=True, parents=True)
with open(full_file_path,"w") as cf:
cf.write(configuration)
return None
def _detrendData(self, data, sampling=0.512, frequency_cut_range=(1.0E-4,1.0E-2)):
"""Apply Detrending algorithm of Background Modulation using Fast Fourier Transform.
Arguments:
data (np.array): Array of (Time, Value) data.
sampling (float): Sampling in seconds to compute the frequencies.
frequency_cut_range ( (float, float) ): Range of frequencies to cut.
Return:
-------
data_cut_signal (np.array): Detrended values.
"""
times = data['OBT'].data
values= data['COUNTS'].data
# Create array of indices, one per time row, then normalize it.
data_xf = np.arange(len(data))
data_xf = data_xf/float(times[-1]-times[0])
# Computes the power spectrum (squared magnitude of FFT), normalized by total signal power.
data_yf = (2 / np.sum(values)) * abs(scipy.fftpack.fft(values))**2 #* scipy.fftpack.rfft(y)
# Truncate to positive frequencies
half = len(data_xf) // 2
data_xf = data_xf[:half]
data_yf = data_yf[:half]
# Computes the real FFT of the signal, and the frequency bins according to the given sampling.
data_f_signal = scipy.fftpack.rfft(values)
data_W = scipy.fftpack.fftfreq(len(values), d=sampling)
# Frequency Filtering: keep only low and high frequrencies, then merge
data_cut_f_signalsx = data_f_signal.copy()
data_cut_f_signaldx = data_f_signal.copy()
data_cut_f_signalsx[(data_W>frequency_cut_range[0])] = 0
data_cut_f_signaldx[(data_W<frequency_cut_range[1])] = 0
data_cut_f_signal = data_cut_f_signalsx + data_cut_f_signaldx
# Obtain the time-domain signal with Inverse FFT
data_cut_signal = scipy.fftpack.irfft(data_cut_f_signal)
return data_cut_signal
[docs] def readRatemeters(self, filePath=None, writeFiles=True):
"""Read a file with ratemeters data and store it in a table.
The table contains three columns: OBT Time (AGILE TT), Measured Counts, Detrended Counts.
The detrending algorithm uses Fast Fourier Transforms.
Parameters
----------
filePath (str) : Input file. If None, read from the configuration.
writeFiles (bool) : Boolean flag to write the ratemeters light curves.
Return
------
ratemeters_table (dict of astropy.Table.table) : each Table contains OBT time (AGILE TT), Counts, Detrended Counts.
"""
# If arguments are not provided explicitly, set them from the configuration
filePath = filePath if filePath is not None else self.config.getOptionValue("file_path")
if not os.path.isfile(filePath):
raise FileNotFoundError
self.logger.info(f"Converting 3913 file: {filePath}")
# From every row of the 1913 file, read appropriate (time, value) and append them to each array.
# For each row of the 3913 file, append 8 values to each array from different columns,
# corresponding to 8 acquisition times shifted by (-8.196 + N*1.024), with N ranging from 0 to 7.
# For SA data, there are 16 columns as the time shift unit is 0.512 second.
GRID_1X = []
GRID_2X = []
GRID_3X = []
GRID_4X = []
GRID_5X = []
GRID_6X = []
GRID_1Z = []
GRID_2Z = []
GRID_3Z = []
GRID_4Z = []
GRID_5Z = []
GRID_6Z = []
AC_SIDE0 = []
AC_SIDE1 = []
AC_SIDE2 = []
AC_SIDE3 = []
AC_SIDE4 = []
MCAL_X_CH01 = []
MCAL_X_CH02 = []
MCAL_X_CH03 = []
MCAL_X_CH04 = []
MCAL_X_CH05 = []
MCAL_X_CH06 = []
MCAL_X_CH07 = []
MCAL_X_CH08 = []
MCAL_X_CH09 = []
MCAL_X_CH10 = []
MCAL_X_CH11 = []
MCAL_Z_CH01 = []
MCAL_Z_CH02 = []
MCAL_Z_CH03 = []
MCAL_Z_CH04 = []
MCAL_Z_CH05 = []
MCAL_Z_CH06 = []
MCAL_Z_CH07 = []
MCAL_Z_CH08 = []
MCAL_Z_CH09 = []
MCAL_Z_CH10 = []
MCAL_Z_CH11 = []
SA_DET1_LAD1_CH1 = []
SA_DET1_LAD1_CH2 = []
SA_DET1_LAD1_CH3 = []
SA_DET1_LAD2_CH1 = []
SA_DET1_LAD2_CH2 = []
SA_DET1_LAD2_CH3 = []
SA_DET2_LAD1_CH1 = []
SA_DET2_LAD1_CH2 = []
SA_DET2_LAD1_CH3 = []
SA_DET2_LAD2_CH1 = []
SA_DET2_LAD2_CH2 = []
SA_DET2_LAD2_CH3 = []
SA_DET3_LAD1_CH1 = []
SA_DET3_LAD1_CH2 = []
SA_DET3_LAD1_CH3 = []
SA_DET3_LAD2_CH1 = []
SA_DET3_LAD2_CH2 = []
SA_DET3_LAD2_CH3 = []
SA_DET4_LAD1_CH1 = []
SA_DET4_LAD1_CH2 = []
SA_DET4_LAD1_CH3 = []
SA_DET4_LAD2_CH1 = []
SA_DET4_LAD2_CH2 = []
SA_DET4_LAD2_CH3 = []
# Read the input file
# f"/ASDC_PROC2/DATA_2/COR/PKP{CONT}_1_3913_000.lv1.cor.gz"
with fits.open(filePath) as hdulist:
tbdata = hdulist[1].data
for i in range(0,int(tbdata.shape[0])):
base_time = float(tbdata[i][19])
###################
# SILICON TRACKER #
###################
GRID_1X.append([base_time+0.000-8.196, int(tbdata[i][25])])
GRID_1X.append([base_time+1.024-8.196, int(tbdata[i][37])])
GRID_1X.append([base_time+2.048-8.196, int(tbdata[i][49])])
GRID_1X.append([base_time+3.072-8.196, int(tbdata[i][61])])
GRID_1X.append([base_time+4.096-8.196, int(tbdata[i][73])])
GRID_1X.append([base_time+5.120-8.196, int(tbdata[i][85])])
GRID_1X.append([base_time+6.144-8.196, int(tbdata[i][97])])
GRID_1X.append([base_time+7.168-8.196, int(tbdata[i][109])])
GRID_2X.append([base_time+0.000-8.196, int(tbdata[i][26])])
GRID_2X.append([base_time+1.024-8.196, int(tbdata[i][38])])
GRID_2X.append([base_time+2.048-8.196, int(tbdata[i][50])])
GRID_2X.append([base_time+3.072-8.196, int(tbdata[i][62])])
GRID_2X.append([base_time+4.096-8.196, int(tbdata[i][74])])
GRID_2X.append([base_time+5.120-8.196, int(tbdata[i][86])])
GRID_2X.append([base_time+6.144-8.196, int(tbdata[i][98])])
GRID_2X.append([base_time+7.168-8.196, int(tbdata[i][110])])
GRID_3X.append([base_time+0.000-8.196, int(tbdata[i][27])])
GRID_3X.append([base_time+1.024-8.196, int(tbdata[i][39])])
GRID_3X.append([base_time+2.048-8.196, int(tbdata[i][51])])
GRID_3X.append([base_time+3.072-8.196, int(tbdata[i][63])])
GRID_3X.append([base_time+4.096-8.196, int(tbdata[i][75])])
GRID_3X.append([base_time+5.120-8.196, int(tbdata[i][87])])
GRID_3X.append([base_time+6.144-8.196, int(tbdata[i][99])])
GRID_3X.append([base_time+7.168-8.196, int(tbdata[i][111])])
GRID_4X.append([base_time+0.000-8.196, int(tbdata[i][28])])
GRID_4X.append([base_time+1.024-8.196, int(tbdata[i][40])])
GRID_4X.append([base_time+2.048-8.196, int(tbdata[i][52])])
GRID_4X.append([base_time+3.072-8.196, int(tbdata[i][64])])
GRID_4X.append([base_time+4.096-8.196, int(tbdata[i][76])])
GRID_4X.append([base_time+5.120-8.196, int(tbdata[i][88])])
GRID_4X.append([base_time+6.144-8.196, int(tbdata[i][100])])
GRID_4X.append([base_time+7.168-8.196, int(tbdata[i][112])])
GRID_5X.append([base_time+0.000-8.196, int(tbdata[i][29])])
GRID_5X.append([base_time+1.024-8.196, int(tbdata[i][41])])
GRID_5X.append([base_time+2.048-8.196, int(tbdata[i][53])])
GRID_5X.append([base_time+3.072-8.196, int(tbdata[i][65])])
GRID_5X.append([base_time+4.096-8.196, int(tbdata[i][77])])
GRID_5X.append([base_time+5.120-8.196, int(tbdata[i][89])])
GRID_5X.append([base_time+6.144-8.196, int(tbdata[i][101])])
GRID_5X.append([base_time+7.168-8.196, int(tbdata[i][113])])
GRID_6X.append([base_time+0.000-8.196, int(tbdata[i][30])])
GRID_6X.append([base_time+1.024-8.196, int(tbdata[i][42])])
GRID_6X.append([base_time+2.048-8.196, int(tbdata[i][54])])
GRID_6X.append([base_time+3.072-8.196, int(tbdata[i][66])])
GRID_6X.append([base_time+4.096-8.196, int(tbdata[i][78])])
GRID_6X.append([base_time+5.120-8.196, int(tbdata[i][90])])
GRID_6X.append([base_time+6.144-8.196, int(tbdata[i][102])])
GRID_6X.append([base_time+7.168-8.196, int(tbdata[i][114])])
GRID_1Z.append([base_time+0.000-8.196, int(tbdata[i][31])])
GRID_1Z.append([base_time+1.024-8.196, int(tbdata[i][43])])
GRID_1Z.append([base_time+2.048-8.196, int(tbdata[i][55])])
GRID_1Z.append([base_time+3.072-8.196, int(tbdata[i][67])])
GRID_1Z.append([base_time+4.096-8.196, int(tbdata[i][79])])
GRID_1Z.append([base_time+5.120-8.196, int(tbdata[i][91])])
GRID_1Z.append([base_time+6.144-8.196, int(tbdata[i][103])])
GRID_1Z.append([base_time+7.168-8.196, int(tbdata[i][115])])
GRID_2Z.append([base_time+0.000-8.196, int(tbdata[i][32])])
GRID_2Z.append([base_time+1.024-8.196, int(tbdata[i][44])])
GRID_2Z.append([base_time+2.048-8.196, int(tbdata[i][56])])
GRID_2Z.append([base_time+3.072-8.196, int(tbdata[i][68])])
GRID_2Z.append([base_time+4.096-8.196, int(tbdata[i][80])])
GRID_2Z.append([base_time+5.120-8.196, int(tbdata[i][92])])
GRID_2Z.append([base_time+6.144-8.196, int(tbdata[i][104])])
GRID_2Z.append([base_time+7.168-8.196, int(tbdata[i][116])])
GRID_3Z.append([base_time+0.000-8.196, int(tbdata[i][33])])
GRID_3Z.append([base_time+1.024-8.196, int(tbdata[i][45])])
GRID_3Z.append([base_time+2.048-8.196, int(tbdata[i][57])])
GRID_3Z.append([base_time+3.072-8.196, int(tbdata[i][69])])
GRID_3Z.append([base_time+4.096-8.196, int(tbdata[i][81])])
GRID_3Z.append([base_time+5.120-8.196, int(tbdata[i][93])])
GRID_3Z.append([base_time+6.144-8.196, int(tbdata[i][105])])
GRID_3Z.append([base_time+7.168-8.196, int(tbdata[i][117])])
GRID_4Z.append([base_time+0.000-8.196, int(tbdata[i][34])])
GRID_4Z.append([base_time+1.024-8.196, int(tbdata[i][46])])
GRID_4Z.append([base_time+2.048-8.196, int(tbdata[i][58])])
GRID_4Z.append([base_time+3.072-8.196, int(tbdata[i][70])])
GRID_4Z.append([base_time+4.096-8.196, int(tbdata[i][82])])
GRID_4Z.append([base_time+5.120-8.196, int(tbdata[i][94])])
GRID_4Z.append([base_time+6.144-8.196, int(tbdata[i][106])])
GRID_4Z.append([base_time+7.168-8.196, int(tbdata[i][118])])
GRID_5Z.append([base_time+0.000-8.196, int(tbdata[i][35])])
GRID_5Z.append([base_time+1.024-8.196, int(tbdata[i][47])])
GRID_5Z.append([base_time+2.048-8.196, int(tbdata[i][59])])
GRID_5Z.append([base_time+3.072-8.196, int(tbdata[i][71])])
GRID_5Z.append([base_time+4.096-8.196, int(tbdata[i][83])])
GRID_5Z.append([base_time+5.120-8.196, int(tbdata[i][95])])
GRID_5Z.append([base_time+6.144-8.196, int(tbdata[i][107])])
GRID_5Z.append([base_time+7.168-8.196, int(tbdata[i][119])])
GRID_6Z.append([base_time+0.000-8.196, int(tbdata[i][36])])
GRID_6Z.append([base_time+1.024-8.196, int(tbdata[i][48])])
GRID_6Z.append([base_time+2.048-8.196, int(tbdata[i][60])])
GRID_6Z.append([base_time+3.072-8.196, int(tbdata[i][72])])
GRID_6Z.append([base_time+4.096-8.196, int(tbdata[i][84])])
GRID_6Z.append([base_time+5.120-8.196, int(tbdata[i][96])])
GRID_6Z.append([base_time+6.144-8.196, int(tbdata[i][108])])
GRID_6Z.append([base_time+7.168-8.196, int(tbdata[i][120])])
####################
# ANTI-COINCIDENCE #
####################
AC_SIDE0.append([base_time+0.000-8.196, int(tbdata[i][121])])
AC_SIDE0.append([base_time+1.024-8.196, int(tbdata[i][126])])
AC_SIDE0.append([base_time+2.048-8.196, int(tbdata[i][131])])
AC_SIDE0.append([base_time+3.072-8.196, int(tbdata[i][136])])
AC_SIDE0.append([base_time+4.096-8.196, int(tbdata[i][141])])
AC_SIDE0.append([base_time+5.120-8.196, int(tbdata[i][146])])
AC_SIDE0.append([base_time+6.144-8.196, int(tbdata[i][151])])
AC_SIDE0.append([base_time+7.168-8.196, int(tbdata[i][156])])
AC_SIDE1.append([base_time+0.000-8.196, int(tbdata[i][122])])
AC_SIDE1.append([base_time+1.024-8.196, int(tbdata[i][127])])
AC_SIDE1.append([base_time+2.048-8.196, int(tbdata[i][132])])
AC_SIDE1.append([base_time+3.072-8.196, int(tbdata[i][137])])
AC_SIDE1.append([base_time+4.096-8.196, int(tbdata[i][142])])
AC_SIDE1.append([base_time+5.120-8.196, int(tbdata[i][147])])
AC_SIDE1.append([base_time+6.144-8.196, int(tbdata[i][152])])
AC_SIDE1.append([base_time+7.168-8.196, int(tbdata[i][157])])
AC_SIDE2.append([base_time+0.000-8.196, int(tbdata[i][123])])
AC_SIDE2.append([base_time+1.024-8.196, int(tbdata[i][128])])
AC_SIDE2.append([base_time+2.048-8.196, int(tbdata[i][133])])
AC_SIDE2.append([base_time+3.072-8.196, int(tbdata[i][138])])
AC_SIDE2.append([base_time+4.096-8.196, int(tbdata[i][143])])
AC_SIDE2.append([base_time+5.120-8.196, int(tbdata[i][148])])
AC_SIDE2.append([base_time+6.144-8.196, int(tbdata[i][153])])
AC_SIDE2.append([base_time+7.168-8.196, int(tbdata[i][158])])
AC_SIDE3.append([base_time+0.000-8.196, int(tbdata[i][124])])
AC_SIDE3.append([base_time+1.024-8.196, int(tbdata[i][129])])
AC_SIDE3.append([base_time+2.048-8.196, int(tbdata[i][134])])
AC_SIDE3.append([base_time+3.072-8.196, int(tbdata[i][139])])
AC_SIDE3.append([base_time+4.096-8.196, int(tbdata[i][144])])
AC_SIDE3.append([base_time+5.120-8.196, int(tbdata[i][149])])
AC_SIDE3.append([base_time+6.144-8.196, int(tbdata[i][154])])
AC_SIDE3.append([base_time+7.168-8.196, int(tbdata[i][159])])
AC_SIDE4.append([base_time+0.000-8.196, int(tbdata[i][125])])
AC_SIDE4.append([base_time+1.024-8.196, int(tbdata[i][130])])
AC_SIDE4.append([base_time+2.048-8.196, int(tbdata[i][135])])
AC_SIDE4.append([base_time+3.072-8.196, int(tbdata[i][140])])
AC_SIDE4.append([base_time+4.096-8.196, int(tbdata[i][145])])
AC_SIDE4.append([base_time+5.120-8.196, int(tbdata[i][150])])
AC_SIDE4.append([base_time+6.144-8.196, int(tbdata[i][155])])
AC_SIDE4.append([base_time+7.168-8.196, int(tbdata[i][160])])
####################
# MINI-CALORIMETER #
####################
MCAL_X_CH01.append([base_time+0.000-8.196, int(tbdata[i][161])])
MCAL_X_CH01.append([base_time+1.024-8.196, int(tbdata[i][183])])
MCAL_X_CH01.append([base_time+2.048-8.196, int(tbdata[i][205])])
MCAL_X_CH01.append([base_time+3.072-8.196, int(tbdata[i][227])])
MCAL_X_CH01.append([base_time+4.096-8.196, int(tbdata[i][249])])
MCAL_X_CH01.append([base_time+5.120-8.196, int(tbdata[i][271])])
MCAL_X_CH01.append([base_time+6.144-8.196, int(tbdata[i][293])])
MCAL_X_CH01.append([base_time+7.168-8.196, int(tbdata[i][315])])
MCAL_X_CH02.append([base_time+0.000-8.196, int(tbdata[i][162])])
MCAL_X_CH02.append([base_time+1.024-8.196, int(tbdata[i][184])])
MCAL_X_CH02.append([base_time+2.048-8.196, int(tbdata[i][206])])
MCAL_X_CH02.append([base_time+3.072-8.196, int(tbdata[i][228])])
MCAL_X_CH02.append([base_time+4.096-8.196, int(tbdata[i][250])])
MCAL_X_CH02.append([base_time+5.120-8.196, int(tbdata[i][272])])
MCAL_X_CH02.append([base_time+6.144-8.196, int(tbdata[i][294])])
MCAL_X_CH02.append([base_time+7.168-8.196, int(tbdata[i][316])])
MCAL_X_CH03.append([base_time+0.000-8.196, int(tbdata[i][163])])
MCAL_X_CH03.append([base_time+1.024-8.196, int(tbdata[i][185])])
MCAL_X_CH03.append([base_time+2.048-8.196, int(tbdata[i][207])])
MCAL_X_CH03.append([base_time+3.072-8.196, int(tbdata[i][229])])
MCAL_X_CH03.append([base_time+4.096-8.196, int(tbdata[i][251])])
MCAL_X_CH03.append([base_time+5.120-8.196, int(tbdata[i][273])])
MCAL_X_CH03.append([base_time+6.144-8.196, int(tbdata[i][295])])
MCAL_X_CH03.append([base_time+7.168-8.196, int(tbdata[i][317])])
MCAL_X_CH04.append([base_time+0.000-8.196, int(tbdata[i][164])])
MCAL_X_CH04.append([base_time+1.024-8.196, int(tbdata[i][186])])
MCAL_X_CH04.append([base_time+2.048-8.196, int(tbdata[i][208])])
MCAL_X_CH04.append([base_time+3.072-8.196, int(tbdata[i][230])])
MCAL_X_CH04.append([base_time+4.096-8.196, int(tbdata[i][252])])
MCAL_X_CH04.append([base_time+5.120-8.196, int(tbdata[i][274])])
MCAL_X_CH04.append([base_time+6.144-8.196, int(tbdata[i][296])])
MCAL_X_CH04.append([base_time+7.168-8.196, int(tbdata[i][318])])
MCAL_X_CH05.append([base_time+0.000-8.196, int(tbdata[i][165])])
MCAL_X_CH05.append([base_time+1.024-8.196, int(tbdata[i][187])])
MCAL_X_CH05.append([base_time+2.048-8.196, int(tbdata[i][209])])
MCAL_X_CH05.append([base_time+3.072-8.196, int(tbdata[i][231])])
MCAL_X_CH05.append([base_time+4.096-8.196, int(tbdata[i][253])])
MCAL_X_CH05.append([base_time+5.120-8.196, int(tbdata[i][275])])
MCAL_X_CH05.append([base_time+6.144-8.196, int(tbdata[i][297])])
MCAL_X_CH05.append([base_time+7.168-8.196, int(tbdata[i][319])])
MCAL_X_CH06.append([base_time+0.000-8.196, int(tbdata[i][166])])
MCAL_X_CH06.append([base_time+1.024-8.196, int(tbdata[i][188])])
MCAL_X_CH06.append([base_time+2.048-8.196, int(tbdata[i][210])])
MCAL_X_CH06.append([base_time+3.072-8.196, int(tbdata[i][232])])
MCAL_X_CH06.append([base_time+4.096-8.196, int(tbdata[i][254])])
MCAL_X_CH06.append([base_time+5.120-8.196, int(tbdata[i][276])])
MCAL_X_CH06.append([base_time+6.144-8.196, int(tbdata[i][298])])
MCAL_X_CH06.append([base_time+7.168-8.196, int(tbdata[i][320])])
MCAL_X_CH07.append([base_time+0.000-8.196, int(tbdata[i][167])])
MCAL_X_CH07.append([base_time+1.024-8.196, int(tbdata[i][189])])
MCAL_X_CH07.append([base_time+2.048-8.196, int(tbdata[i][211])])
MCAL_X_CH07.append([base_time+3.072-8.196, int(tbdata[i][233])])
MCAL_X_CH07.append([base_time+4.096-8.196, int(tbdata[i][255])])
MCAL_X_CH07.append([base_time+5.120-8.196, int(tbdata[i][277])])
MCAL_X_CH07.append([base_time+6.144-8.196, int(tbdata[i][299])])
MCAL_X_CH07.append([base_time+7.168-8.196, int(tbdata[i][321])])
MCAL_X_CH08.append([base_time+0.000-8.196, int(tbdata[i][168])])
MCAL_X_CH08.append([base_time+1.024-8.196, int(tbdata[i][190])])
MCAL_X_CH08.append([base_time+2.048-8.196, int(tbdata[i][212])])
MCAL_X_CH08.append([base_time+3.072-8.196, int(tbdata[i][234])])
MCAL_X_CH08.append([base_time+4.096-8.196, int(tbdata[i][256])])
MCAL_X_CH08.append([base_time+5.120-8.196, int(tbdata[i][278])])
MCAL_X_CH08.append([base_time+6.144-8.196, int(tbdata[i][300])])
MCAL_X_CH08.append([base_time+7.168-8.196, int(tbdata[i][322])])
MCAL_X_CH09.append([base_time+0.000-8.196, int(tbdata[i][169])])
MCAL_X_CH09.append([base_time+1.024-8.196, int(tbdata[i][191])])
MCAL_X_CH09.append([base_time+2.048-8.196, int(tbdata[i][213])])
MCAL_X_CH09.append([base_time+3.072-8.196, int(tbdata[i][235])])
MCAL_X_CH09.append([base_time+4.096-8.196, int(tbdata[i][257])])
MCAL_X_CH09.append([base_time+5.120-8.196, int(tbdata[i][279])])
MCAL_X_CH09.append([base_time+6.144-8.196, int(tbdata[i][301])])
MCAL_X_CH09.append([base_time+7.168-8.196, int(tbdata[i][323])])
MCAL_X_CH10.append([base_time+0.000-8.196, int(tbdata[i][170])])
MCAL_X_CH10.append([base_time+1.024-8.196, int(tbdata[i][192])])
MCAL_X_CH10.append([base_time+2.048-8.196, int(tbdata[i][214])])
MCAL_X_CH10.append([base_time+3.072-8.196, int(tbdata[i][236])])
MCAL_X_CH10.append([base_time+4.096-8.196, int(tbdata[i][258])])
MCAL_X_CH10.append([base_time+5.120-8.196, int(tbdata[i][280])])
MCAL_X_CH10.append([base_time+6.144-8.196, int(tbdata[i][302])])
MCAL_X_CH10.append([base_time+7.168-8.196, int(tbdata[i][324])])
MCAL_X_CH11.append([base_time+0.000-8.196, int(tbdata[i][171])])
MCAL_X_CH11.append([base_time+1.024-8.196, int(tbdata[i][193])])
MCAL_X_CH11.append([base_time+2.048-8.196, int(tbdata[i][215])])
MCAL_X_CH11.append([base_time+3.072-8.196, int(tbdata[i][237])])
MCAL_X_CH11.append([base_time+4.096-8.196, int(tbdata[i][259])])
MCAL_X_CH11.append([base_time+5.120-8.196, int(tbdata[i][281])])
MCAL_X_CH11.append([base_time+6.144-8.196, int(tbdata[i][303])])
MCAL_X_CH11.append([base_time+7.168-8.196, int(tbdata[i][325])])
MCAL_Z_CH01.append([base_time+0.000-8.196, int(tbdata[i][172])])
MCAL_Z_CH01.append([base_time+1.024-8.196, int(tbdata[i][194])])
MCAL_Z_CH01.append([base_time+2.048-8.196, int(tbdata[i][216])])
MCAL_Z_CH01.append([base_time+3.072-8.196, int(tbdata[i][238])])
MCAL_Z_CH01.append([base_time+4.096-8.196, int(tbdata[i][260])])
MCAL_Z_CH01.append([base_time+5.120-8.196, int(tbdata[i][282])])
MCAL_Z_CH01.append([base_time+6.144-8.196, int(tbdata[i][304])])
MCAL_Z_CH01.append([base_time+7.168-8.196, int(tbdata[i][326])])
MCAL_Z_CH02.append([base_time+0.000-8.196, int(tbdata[i][173])])
MCAL_Z_CH02.append([base_time+1.024-8.196, int(tbdata[i][195])])
MCAL_Z_CH02.append([base_time+2.048-8.196, int(tbdata[i][217])])
MCAL_Z_CH02.append([base_time+3.072-8.196, int(tbdata[i][239])])
MCAL_Z_CH02.append([base_time+4.096-8.196, int(tbdata[i][261])])
MCAL_Z_CH02.append([base_time+5.120-8.196, int(tbdata[i][283])])
MCAL_Z_CH02.append([base_time+6.144-8.196, int(tbdata[i][305])])
MCAL_Z_CH02.append([base_time+7.168-8.196, int(tbdata[i][327])])
MCAL_Z_CH03.append([base_time+0.000-8.196, int(tbdata[i][174])])
MCAL_Z_CH03.append([base_time+1.024-8.196, int(tbdata[i][196])])
MCAL_Z_CH03.append([base_time+2.048-8.196, int(tbdata[i][218])])
MCAL_Z_CH03.append([base_time+3.072-8.196, int(tbdata[i][240])])
MCAL_Z_CH03.append([base_time+4.096-8.196, int(tbdata[i][262])])
MCAL_Z_CH03.append([base_time+5.120-8.196, int(tbdata[i][284])])
MCAL_Z_CH03.append([base_time+6.144-8.196, int(tbdata[i][306])])
MCAL_Z_CH03.append([base_time+7.168-8.196, int(tbdata[i][328])])
MCAL_Z_CH04.append([base_time+0.000-8.196, int(tbdata[i][175])])
MCAL_Z_CH04.append([base_time+1.024-8.196, int(tbdata[i][197])])
MCAL_Z_CH04.append([base_time+2.048-8.196, int(tbdata[i][219])])
MCAL_Z_CH04.append([base_time+3.072-8.196, int(tbdata[i][241])])
MCAL_Z_CH04.append([base_time+4.096-8.196, int(tbdata[i][262])])
MCAL_Z_CH04.append([base_time+5.120-8.196, int(tbdata[i][285])])
MCAL_Z_CH04.append([base_time+6.144-8.196, int(tbdata[i][307])])
MCAL_Z_CH04.append([base_time+7.168-8.196, int(tbdata[i][329])])
MCAL_Z_CH05.append([base_time+0.000-8.196, int(tbdata[i][176])])
MCAL_Z_CH05.append([base_time+1.024-8.196, int(tbdata[i][198])])
MCAL_Z_CH05.append([base_time+2.048-8.196, int(tbdata[i][220])])
MCAL_Z_CH05.append([base_time+3.072-8.196, int(tbdata[i][242])])
MCAL_Z_CH05.append([base_time+4.096-8.196, int(tbdata[i][264])])
MCAL_Z_CH05.append([base_time+5.120-8.196, int(tbdata[i][286])])
MCAL_Z_CH05.append([base_time+6.144-8.196, int(tbdata[i][308])])
MCAL_Z_CH05.append([base_time+7.168-8.196, int(tbdata[i][330])])
MCAL_Z_CH06.append([base_time+0.000-8.196, int(tbdata[i][177])])
MCAL_Z_CH06.append([base_time+1.024-8.196, int(tbdata[i][199])])
MCAL_Z_CH06.append([base_time+2.048-8.196, int(tbdata[i][221])])
MCAL_Z_CH06.append([base_time+3.072-8.196, int(tbdata[i][243])])
MCAL_Z_CH06.append([base_time+4.096-8.196, int(tbdata[i][265])])
MCAL_Z_CH06.append([base_time+5.120-8.196, int(tbdata[i][287])])
MCAL_Z_CH06.append([base_time+6.144-8.196, int(tbdata[i][309])])
MCAL_Z_CH06.append([base_time+7.168-8.196, int(tbdata[i][331])])
MCAL_Z_CH07.append([base_time+0.000-8.196, int(tbdata[i][178])])
MCAL_Z_CH07.append([base_time+1.024-8.196, int(tbdata[i][200])])
MCAL_Z_CH07.append([base_time+2.048-8.196, int(tbdata[i][222])])
MCAL_Z_CH07.append([base_time+3.072-8.196, int(tbdata[i][244])])
MCAL_Z_CH07.append([base_time+4.096-8.196, int(tbdata[i][266])])
MCAL_Z_CH07.append([base_time+5.120-8.196, int(tbdata[i][288])])
MCAL_Z_CH07.append([base_time+6.144-8.196, int(tbdata[i][310])])
MCAL_Z_CH07.append([base_time+7.168-8.196, int(tbdata[i][332])])
MCAL_Z_CH08.append([base_time+0.000-8.196, int(tbdata[i][179])])
MCAL_Z_CH08.append([base_time+1.024-8.196, int(tbdata[i][201])])
MCAL_Z_CH08.append([base_time+2.048-8.196, int(tbdata[i][223])])
MCAL_Z_CH08.append([base_time+3.072-8.196, int(tbdata[i][245])])
MCAL_Z_CH08.append([base_time+4.096-8.196, int(tbdata[i][267])])
MCAL_Z_CH08.append([base_time+5.120-8.196, int(tbdata[i][289])])
MCAL_Z_CH08.append([base_time+6.144-8.196, int(tbdata[i][311])])
MCAL_Z_CH08.append([base_time+7.168-8.196, int(tbdata[i][333])])
MCAL_Z_CH09.append([base_time+0.000-8.196, int(tbdata[i][180])])
MCAL_Z_CH09.append([base_time+1.024-8.196, int(tbdata[i][202])])
MCAL_Z_CH09.append([base_time+2.048-8.196, int(tbdata[i][224])])
MCAL_Z_CH09.append([base_time+3.072-8.196, int(tbdata[i][246])])
MCAL_Z_CH09.append([base_time+4.096-8.196, int(tbdata[i][268])])
MCAL_Z_CH09.append([base_time+5.120-8.196, int(tbdata[i][290])])
MCAL_Z_CH09.append([base_time+6.144-8.196, int(tbdata[i][312])])
MCAL_Z_CH09.append([base_time+7.168-8.196, int(tbdata[i][334])])
MCAL_Z_CH10.append([base_time+0.000-8.196, int(tbdata[i][181])])
MCAL_Z_CH10.append([base_time+1.024-8.196, int(tbdata[i][203])])
MCAL_Z_CH10.append([base_time+2.048-8.196, int(tbdata[i][225])])
MCAL_Z_CH10.append([base_time+3.072-8.196, int(tbdata[i][247])])
MCAL_Z_CH10.append([base_time+4.096-8.196, int(tbdata[i][269])])
MCAL_Z_CH10.append([base_time+5.120-8.196, int(tbdata[i][291])])
MCAL_Z_CH10.append([base_time+6.144-8.196, int(tbdata[i][313])])
MCAL_Z_CH10.append([base_time+7.168-8.196, int(tbdata[i][335])])
MCAL_Z_CH11.append([base_time+0.000-8.196, int(tbdata[i][182])])
MCAL_Z_CH11.append([base_time+1.024-8.196, int(tbdata[i][204])])
MCAL_Z_CH11.append([base_time+2.048-8.196, int(tbdata[i][226])])
MCAL_Z_CH11.append([base_time+3.072-8.196, int(tbdata[i][248])])
MCAL_Z_CH11.append([base_time+4.096-8.196, int(tbdata[i][270])])
MCAL_Z_CH11.append([base_time+5.120-8.196, int(tbdata[i][292])])
MCAL_Z_CH11.append([base_time+6.144-8.196, int(tbdata[i][314])])
MCAL_Z_CH11.append([base_time+7.168-8.196, int(tbdata[i][336])])
###############
# SUPER-AGILE #
###############
SA_DET1_LAD1_CH1.append([base_time+0.000-8.196, int(tbdata[i][337])])
SA_DET1_LAD1_CH1.append([base_time+0.512-8.196, int(tbdata[i][361])])
SA_DET1_LAD1_CH1.append([base_time+1.024-8.196, int(tbdata[i][385])])
SA_DET1_LAD1_CH1.append([base_time+1.536-8.196, int(tbdata[i][409])])
SA_DET1_LAD1_CH1.append([base_time+2.048-8.196, int(tbdata[i][433])])
SA_DET1_LAD1_CH1.append([base_time+2.560-8.196, int(tbdata[i][457])])
SA_DET1_LAD1_CH1.append([base_time+3.072-8.196, int(tbdata[i][481])])
SA_DET1_LAD1_CH1.append([base_time+3.584-8.196, int(tbdata[i][505])])
SA_DET1_LAD1_CH1.append([base_time+4.096-8.196, int(tbdata[i][529])])
SA_DET1_LAD1_CH1.append([base_time+4.608-8.196, int(tbdata[i][553])])
SA_DET1_LAD1_CH1.append([base_time+5.120-8.196, int(tbdata[i][577])])
SA_DET1_LAD1_CH1.append([base_time+5.632-8.196, int(tbdata[i][601])])
SA_DET1_LAD1_CH1.append([base_time+6.144-8.196, int(tbdata[i][625])])
SA_DET1_LAD1_CH1.append([base_time+6.656-8.196, int(tbdata[i][649])])
SA_DET1_LAD1_CH1.append([base_time+7.168-8.196, int(tbdata[i][673])])
SA_DET1_LAD1_CH1.append([base_time+7.680-8.196, int(tbdata[i][697])])
SA_DET1_LAD1_CH2.append([base_time+0.000-8.196, int(tbdata[i][338])])
SA_DET1_LAD1_CH2.append([base_time+0.512-8.196, int(tbdata[i][362])])
SA_DET1_LAD1_CH2.append([base_time+1.024-8.196, int(tbdata[i][386])])
SA_DET1_LAD1_CH2.append([base_time+1.536-8.196, int(tbdata[i][410])])
SA_DET1_LAD1_CH2.append([base_time+2.048-8.196, int(tbdata[i][434])])
SA_DET1_LAD1_CH2.append([base_time+2.560-8.196, int(tbdata[i][458])])
SA_DET1_LAD1_CH2.append([base_time+3.072-8.196, int(tbdata[i][482])])
SA_DET1_LAD1_CH2.append([base_time+3.584-8.196, int(tbdata[i][506])])
SA_DET1_LAD1_CH2.append([base_time+4.096-8.196, int(tbdata[i][530])])
SA_DET1_LAD1_CH2.append([base_time+4.608-8.196, int(tbdata[i][554])])
SA_DET1_LAD1_CH2.append([base_time+5.120-8.196, int(tbdata[i][578])])
SA_DET1_LAD1_CH2.append([base_time+5.632-8.196, int(tbdata[i][602])])
SA_DET1_LAD1_CH2.append([base_time+6.144-8.196, int(tbdata[i][626])])
SA_DET1_LAD1_CH2.append([base_time+6.656-8.196, int(tbdata[i][650])])
SA_DET1_LAD1_CH2.append([base_time+7.168-8.196, int(tbdata[i][674])])
SA_DET1_LAD1_CH2.append([base_time+7.680-8.196, int(tbdata[i][698])])
SA_DET1_LAD1_CH3.append([base_time+0.000-8.196, int(tbdata[i][339])])
SA_DET1_LAD1_CH3.append([base_time+0.512-8.196, int(tbdata[i][363])])
SA_DET1_LAD1_CH3.append([base_time+1.024-8.196, int(tbdata[i][387])])
SA_DET1_LAD1_CH3.append([base_time+1.536-8.196, int(tbdata[i][411])])
SA_DET1_LAD1_CH3.append([base_time+2.048-8.196, int(tbdata[i][435])])
SA_DET1_LAD1_CH3.append([base_time+2.560-8.196, int(tbdata[i][459])])
SA_DET1_LAD1_CH3.append([base_time+3.072-8.196, int(tbdata[i][483])])
SA_DET1_LAD1_CH3.append([base_time+3.584-8.196, int(tbdata[i][507])])
SA_DET1_LAD1_CH3.append([base_time+4.096-8.196, int(tbdata[i][531])])
SA_DET1_LAD1_CH3.append([base_time+4.608-8.196, int(tbdata[i][555])])
SA_DET1_LAD1_CH3.append([base_time+5.120-8.196, int(tbdata[i][579])])
SA_DET1_LAD1_CH3.append([base_time+5.632-8.196, int(tbdata[i][603])])
SA_DET1_LAD1_CH3.append([base_time+6.144-8.196, int(tbdata[i][627])])
SA_DET1_LAD1_CH3.append([base_time+6.656-8.196, int(tbdata[i][651])])
SA_DET1_LAD1_CH3.append([base_time+7.168-8.196, int(tbdata[i][675])])
SA_DET1_LAD1_CH3.append([base_time+7.680-8.196, int(tbdata[i][699])])
SA_DET1_LAD2_CH1.append([base_time+0.000-8.196, int(tbdata[i][340])])
SA_DET1_LAD2_CH1.append([base_time+0.512-8.196, int(tbdata[i][364])])
SA_DET1_LAD2_CH1.append([base_time+1.024-8.196, int(tbdata[i][388])])
SA_DET1_LAD2_CH1.append([base_time+1.536-8.196, int(tbdata[i][412])])
SA_DET1_LAD2_CH1.append([base_time+2.048-8.196, int(tbdata[i][436])])
SA_DET1_LAD2_CH1.append([base_time+2.560-8.196, int(tbdata[i][460])])
SA_DET1_LAD2_CH1.append([base_time+3.072-8.196, int(tbdata[i][484])])
SA_DET1_LAD2_CH1.append([base_time+3.584-8.196, int(tbdata[i][508])])
SA_DET1_LAD2_CH1.append([base_time+4.096-8.196, int(tbdata[i][532])])
SA_DET1_LAD2_CH1.append([base_time+4.608-8.196, int(tbdata[i][556])])
SA_DET1_LAD2_CH1.append([base_time+5.120-8.196, int(tbdata[i][580])])
SA_DET1_LAD2_CH1.append([base_time+5.632-8.196, int(tbdata[i][604])])
SA_DET1_LAD2_CH1.append([base_time+6.144-8.196, int(tbdata[i][628])])
SA_DET1_LAD2_CH1.append([base_time+6.656-8.196, int(tbdata[i][652])])
SA_DET1_LAD2_CH1.append([base_time+7.168-8.196, int(tbdata[i][676])])
SA_DET1_LAD2_CH1.append([base_time+7.680-8.196, int(tbdata[i][700])])
SA_DET1_LAD2_CH2.append([base_time+0.000-8.196, int(tbdata[i][341])])
SA_DET1_LAD2_CH2.append([base_time+0.512-8.196, int(tbdata[i][365])])
SA_DET1_LAD2_CH2.append([base_time+1.024-8.196, int(tbdata[i][389])])
SA_DET1_LAD2_CH2.append([base_time+1.536-8.196, int(tbdata[i][413])])
SA_DET1_LAD2_CH2.append([base_time+2.048-8.196, int(tbdata[i][437])])
SA_DET1_LAD2_CH2.append([base_time+2.560-8.196, int(tbdata[i][461])])
SA_DET1_LAD2_CH2.append([base_time+3.072-8.196, int(tbdata[i][485])])
SA_DET1_LAD2_CH2.append([base_time+3.584-8.196, int(tbdata[i][509])])
SA_DET1_LAD2_CH2.append([base_time+4.096-8.196, int(tbdata[i][533])])
SA_DET1_LAD2_CH2.append([base_time+4.608-8.196, int(tbdata[i][557])])
SA_DET1_LAD2_CH2.append([base_time+5.120-8.196, int(tbdata[i][581])])
SA_DET1_LAD2_CH2.append([base_time+5.632-8.196, int(tbdata[i][605])])
SA_DET1_LAD2_CH2.append([base_time+6.144-8.196, int(tbdata[i][629])])
SA_DET1_LAD2_CH2.append([base_time+6.656-8.196, int(tbdata[i][653])])
SA_DET1_LAD2_CH2.append([base_time+7.168-8.196, int(tbdata[i][677])])
SA_DET1_LAD2_CH2.append([base_time+7.680-8.196, int(tbdata[i][701])])
SA_DET1_LAD2_CH3.append([base_time+0.000-8.196, int(tbdata[i][342])])
SA_DET1_LAD2_CH3.append([base_time+0.512-8.196, int(tbdata[i][366])])
SA_DET1_LAD2_CH3.append([base_time+1.024-8.196, int(tbdata[i][390])])
SA_DET1_LAD2_CH3.append([base_time+1.536-8.196, int(tbdata[i][414])])
SA_DET1_LAD2_CH3.append([base_time+2.048-8.196, int(tbdata[i][438])])
SA_DET1_LAD2_CH3.append([base_time+2.560-8.196, int(tbdata[i][462])])
SA_DET1_LAD2_CH3.append([base_time+3.072-8.196, int(tbdata[i][486])])
SA_DET1_LAD2_CH3.append([base_time+3.584-8.196, int(tbdata[i][510])])
SA_DET1_LAD2_CH3.append([base_time+4.096-8.196, int(tbdata[i][534])])
SA_DET1_LAD2_CH3.append([base_time+4.608-8.196, int(tbdata[i][558])])
SA_DET1_LAD2_CH3.append([base_time+5.120-8.196, int(tbdata[i][582])])
SA_DET1_LAD2_CH3.append([base_time+5.632-8.196, int(tbdata[i][606])])
SA_DET1_LAD2_CH3.append([base_time+6.144-8.196, int(tbdata[i][630])])
SA_DET1_LAD2_CH3.append([base_time+6.656-8.196, int(tbdata[i][654])])
SA_DET1_LAD2_CH3.append([base_time+7.168-8.196, int(tbdata[i][678])])
SA_DET1_LAD2_CH3.append([base_time+7.680-8.196, int(tbdata[i][702])])
SA_DET2_LAD1_CH1.append([base_time+0.000-8.196, int(tbdata[i][343])])
SA_DET2_LAD1_CH1.append([base_time+0.512-8.196, int(tbdata[i][367])])
SA_DET2_LAD1_CH1.append([base_time+1.024-8.196, int(tbdata[i][391])])
SA_DET2_LAD1_CH1.append([base_time+1.536-8.196, int(tbdata[i][415])])
SA_DET2_LAD1_CH1.append([base_time+2.048-8.196, int(tbdata[i][439])])
SA_DET2_LAD1_CH1.append([base_time+2.560-8.196, int(tbdata[i][463])])
SA_DET2_LAD1_CH1.append([base_time+3.072-8.196, int(tbdata[i][487])])
SA_DET2_LAD1_CH1.append([base_time+3.584-8.196, int(tbdata[i][511])])
SA_DET2_LAD1_CH1.append([base_time+4.096-8.196, int(tbdata[i][535])])
SA_DET2_LAD1_CH1.append([base_time+4.608-8.196, int(tbdata[i][559])])
SA_DET2_LAD1_CH1.append([base_time+5.120-8.196, int(tbdata[i][583])])
SA_DET2_LAD1_CH1.append([base_time+5.632-8.196, int(tbdata[i][607])])
SA_DET2_LAD1_CH1.append([base_time+6.144-8.196, int(tbdata[i][631])])
SA_DET2_LAD1_CH1.append([base_time+6.656-8.196, int(tbdata[i][655])])
SA_DET2_LAD1_CH1.append([base_time+7.168-8.196, int(tbdata[i][679])])
SA_DET2_LAD1_CH1.append([base_time+7.680-8.196, int(tbdata[i][703])])
SA_DET2_LAD1_CH2.append([base_time+0.000-8.196, int(tbdata[i][344])])
SA_DET2_LAD1_CH2.append([base_time+0.512-8.196, int(tbdata[i][368])])
SA_DET2_LAD1_CH2.append([base_time+1.024-8.196, int(tbdata[i][392])])
SA_DET2_LAD1_CH2.append([base_time+1.536-8.196, int(tbdata[i][416])])
SA_DET2_LAD1_CH2.append([base_time+2.048-8.196, int(tbdata[i][440])])
SA_DET2_LAD1_CH2.append([base_time+2.560-8.196, int(tbdata[i][464])])
SA_DET2_LAD1_CH2.append([base_time+3.072-8.196, int(tbdata[i][488])])
SA_DET2_LAD1_CH2.append([base_time+3.584-8.196, int(tbdata[i][512])])
SA_DET2_LAD1_CH2.append([base_time+4.096-8.196, int(tbdata[i][536])])
SA_DET2_LAD1_CH2.append([base_time+4.608-8.196, int(tbdata[i][560])])
SA_DET2_LAD1_CH2.append([base_time+5.120-8.196, int(tbdata[i][584])])
SA_DET2_LAD1_CH2.append([base_time+5.632-8.196, int(tbdata[i][608])])
SA_DET2_LAD1_CH2.append([base_time+6.144-8.196, int(tbdata[i][632])])
SA_DET2_LAD1_CH2.append([base_time+6.656-8.196, int(tbdata[i][656])])
SA_DET2_LAD1_CH2.append([base_time+7.168-8.196, int(tbdata[i][680])])
SA_DET2_LAD1_CH2.append([base_time+7.680-8.196, int(tbdata[i][704])])
SA_DET2_LAD1_CH3.append([base_time+0.000-8.196, int(tbdata[i][345])])
SA_DET2_LAD1_CH3.append([base_time+0.512-8.196, int(tbdata[i][369])])
SA_DET2_LAD1_CH3.append([base_time+1.024-8.196, int(tbdata[i][393])])
SA_DET2_LAD1_CH3.append([base_time+1.536-8.196, int(tbdata[i][417])])
SA_DET2_LAD1_CH3.append([base_time+2.048-8.196, int(tbdata[i][441])])
SA_DET2_LAD1_CH3.append([base_time+2.560-8.196, int(tbdata[i][465])])
SA_DET2_LAD1_CH3.append([base_time+3.072-8.196, int(tbdata[i][489])])
SA_DET2_LAD1_CH3.append([base_time+3.584-8.196, int(tbdata[i][513])])
SA_DET2_LAD1_CH3.append([base_time+4.096-8.196, int(tbdata[i][537])])
SA_DET2_LAD1_CH3.append([base_time+4.608-8.196, int(tbdata[i][561])])
SA_DET2_LAD1_CH3.append([base_time+5.120-8.196, int(tbdata[i][585])])
SA_DET2_LAD1_CH3.append([base_time+5.632-8.196, int(tbdata[i][609])])
SA_DET2_LAD1_CH3.append([base_time+6.144-8.196, int(tbdata[i][633])])
SA_DET2_LAD1_CH3.append([base_time+6.656-8.196, int(tbdata[i][657])])
SA_DET2_LAD1_CH3.append([base_time+7.168-8.196, int(tbdata[i][681])])
SA_DET2_LAD1_CH3.append([base_time+7.680-8.196, int(tbdata[i][705])])
SA_DET2_LAD2_CH1.append([base_time+0.000-8.196, int(tbdata[i][346])])
SA_DET2_LAD2_CH1.append([base_time+0.512-8.196, int(tbdata[i][370])])
SA_DET2_LAD2_CH1.append([base_time+1.024-8.196, int(tbdata[i][394])])
SA_DET2_LAD2_CH1.append([base_time+1.536-8.196, int(tbdata[i][418])])
SA_DET2_LAD2_CH1.append([base_time+2.048-8.196, int(tbdata[i][442])])
SA_DET2_LAD2_CH1.append([base_time+2.560-8.196, int(tbdata[i][466])])
SA_DET2_LAD2_CH1.append([base_time+3.072-8.196, int(tbdata[i][490])])
SA_DET2_LAD2_CH1.append([base_time+3.584-8.196, int(tbdata[i][514])])
SA_DET2_LAD2_CH1.append([base_time+4.096-8.196, int(tbdata[i][538])])
SA_DET2_LAD2_CH1.append([base_time+4.608-8.196, int(tbdata[i][562])])
SA_DET2_LAD2_CH1.append([base_time+5.120-8.196, int(tbdata[i][586])])
SA_DET2_LAD2_CH1.append([base_time+5.632-8.196, int(tbdata[i][610])])
SA_DET2_LAD2_CH1.append([base_time+6.144-8.196, int(tbdata[i][634])])
SA_DET2_LAD2_CH1.append([base_time+6.656-8.196, int(tbdata[i][658])])
SA_DET2_LAD2_CH1.append([base_time+7.168-8.196, int(tbdata[i][682])])
SA_DET2_LAD2_CH1.append([base_time+7.680-8.196, int(tbdata[i][706])])
SA_DET2_LAD2_CH2.append([base_time+0.000-8.196, int(tbdata[i][347])])
SA_DET2_LAD2_CH2.append([base_time+0.512-8.196, int(tbdata[i][371])])
SA_DET2_LAD2_CH2.append([base_time+1.024-8.196, int(tbdata[i][395])])
SA_DET2_LAD2_CH2.append([base_time+1.536-8.196, int(tbdata[i][419])])
SA_DET2_LAD2_CH2.append([base_time+2.048-8.196, int(tbdata[i][443])])
SA_DET2_LAD2_CH2.append([base_time+2.560-8.196, int(tbdata[i][467])])
SA_DET2_LAD2_CH2.append([base_time+3.072-8.196, int(tbdata[i][491])])
SA_DET2_LAD2_CH2.append([base_time+3.584-8.196, int(tbdata[i][515])])
SA_DET2_LAD2_CH2.append([base_time+4.096-8.196, int(tbdata[i][539])])
SA_DET2_LAD2_CH2.append([base_time+4.608-8.196, int(tbdata[i][563])])
SA_DET2_LAD2_CH2.append([base_time+5.120-8.196, int(tbdata[i][587])])
SA_DET2_LAD2_CH2.append([base_time+5.632-8.196, int(tbdata[i][611])])
SA_DET2_LAD2_CH2.append([base_time+6.144-8.196, int(tbdata[i][635])])
SA_DET2_LAD2_CH2.append([base_time+6.656-8.196, int(tbdata[i][659])])
SA_DET2_LAD2_CH2.append([base_time+7.168-8.196, int(tbdata[i][683])])
SA_DET2_LAD2_CH2.append([base_time+7.680-8.196, int(tbdata[i][707])])
SA_DET2_LAD2_CH3.append([base_time+0.000-8.196, int(tbdata[i][348])])
SA_DET2_LAD2_CH3.append([base_time+0.512-8.196, int(tbdata[i][372])])
SA_DET2_LAD2_CH3.append([base_time+1.024-8.196, int(tbdata[i][396])])
SA_DET2_LAD2_CH3.append([base_time+1.536-8.196, int(tbdata[i][420])])
SA_DET2_LAD2_CH3.append([base_time+2.048-8.196, int(tbdata[i][444])])
SA_DET2_LAD2_CH3.append([base_time+2.560-8.196, int(tbdata[i][468])])
SA_DET2_LAD2_CH3.append([base_time+3.072-8.196, int(tbdata[i][492])])
SA_DET2_LAD2_CH3.append([base_time+3.584-8.196, int(tbdata[i][516])])
SA_DET2_LAD2_CH3.append([base_time+4.096-8.196, int(tbdata[i][540])])
SA_DET2_LAD2_CH3.append([base_time+4.608-8.196, int(tbdata[i][564])])
SA_DET2_LAD2_CH3.append([base_time+5.120-8.196, int(tbdata[i][588])])
SA_DET2_LAD2_CH3.append([base_time+5.632-8.196, int(tbdata[i][612])])
SA_DET2_LAD2_CH3.append([base_time+6.144-8.196, int(tbdata[i][636])])
SA_DET2_LAD2_CH3.append([base_time+6.656-8.196, int(tbdata[i][660])])
SA_DET2_LAD2_CH3.append([base_time+7.168-8.196, int(tbdata[i][684])])
SA_DET2_LAD2_CH3.append([base_time+7.680-8.196, int(tbdata[i][708])])
SA_DET3_LAD1_CH1.append([base_time+0.000-8.196, int(tbdata[i][349])])
SA_DET3_LAD1_CH1.append([base_time+0.512-8.196, int(tbdata[i][373])])
SA_DET3_LAD1_CH1.append([base_time+1.024-8.196, int(tbdata[i][397])])
SA_DET3_LAD1_CH1.append([base_time+1.536-8.196, int(tbdata[i][421])])
SA_DET3_LAD1_CH1.append([base_time+2.048-8.196, int(tbdata[i][445])])
SA_DET3_LAD1_CH1.append([base_time+2.560-8.196, int(tbdata[i][469])])
SA_DET3_LAD1_CH1.append([base_time+3.072-8.196, int(tbdata[i][493])])
SA_DET3_LAD1_CH1.append([base_time+3.584-8.196, int(tbdata[i][517])])
SA_DET3_LAD1_CH1.append([base_time+4.096-8.196, int(tbdata[i][541])])
SA_DET3_LAD1_CH1.append([base_time+4.608-8.196, int(tbdata[i][565])])
SA_DET3_LAD1_CH1.append([base_time+5.120-8.196, int(tbdata[i][589])])
SA_DET3_LAD1_CH1.append([base_time+5.632-8.196, int(tbdata[i][613])])
SA_DET3_LAD1_CH1.append([base_time+6.144-8.196, int(tbdata[i][637])])
SA_DET3_LAD1_CH1.append([base_time+6.656-8.196, int(tbdata[i][661])])
SA_DET3_LAD1_CH1.append([base_time+7.168-8.196, int(tbdata[i][685])])
SA_DET3_LAD1_CH1.append([base_time+7.680-8.196, int(tbdata[i][709])])
SA_DET3_LAD1_CH2.append([base_time+0.000-8.196, int(tbdata[i][350])])
SA_DET3_LAD1_CH2.append([base_time+0.512-8.196, int(tbdata[i][374])])
SA_DET3_LAD1_CH2.append([base_time+1.024-8.196, int(tbdata[i][398])])
SA_DET3_LAD1_CH2.append([base_time+1.536-8.196, int(tbdata[i][422])])
SA_DET3_LAD1_CH2.append([base_time+2.048-8.196, int(tbdata[i][446])])
SA_DET3_LAD1_CH2.append([base_time+2.560-8.196, int(tbdata[i][470])])
SA_DET3_LAD1_CH2.append([base_time+3.072-8.196, int(tbdata[i][494])])
SA_DET3_LAD1_CH2.append([base_time+3.584-8.196, int(tbdata[i][518])])
SA_DET3_LAD1_CH2.append([base_time+4.096-8.196, int(tbdata[i][542])])
SA_DET3_LAD1_CH2.append([base_time+4.608-8.196, int(tbdata[i][566])])
SA_DET3_LAD1_CH2.append([base_time+5.120-8.196, int(tbdata[i][590])])
SA_DET3_LAD1_CH2.append([base_time+5.632-8.196, int(tbdata[i][614])])
SA_DET3_LAD1_CH2.append([base_time+6.144-8.196, int(tbdata[i][638])])
SA_DET3_LAD1_CH2.append([base_time+6.656-8.196, int(tbdata[i][662])])
SA_DET3_LAD1_CH2.append([base_time+7.168-8.196, int(tbdata[i][686])])
SA_DET3_LAD1_CH2.append([base_time+7.680-8.196, int(tbdata[i][710])])
SA_DET3_LAD1_CH3.append([base_time+0.000-8.196, int(tbdata[i][351])])
SA_DET3_LAD1_CH3.append([base_time+0.512-8.196, int(tbdata[i][375])])
SA_DET3_LAD1_CH3.append([base_time+1.024-8.196, int(tbdata[i][399])])
SA_DET3_LAD1_CH3.append([base_time+1.536-8.196, int(tbdata[i][423])])
SA_DET3_LAD1_CH3.append([base_time+2.048-8.196, int(tbdata[i][447])])
SA_DET3_LAD1_CH3.append([base_time+2.560-8.196, int(tbdata[i][471])])
SA_DET3_LAD1_CH3.append([base_time+3.072-8.196, int(tbdata[i][495])])
SA_DET3_LAD1_CH3.append([base_time+3.584-8.196, int(tbdata[i][519])])
SA_DET3_LAD1_CH3.append([base_time+4.096-8.196, int(tbdata[i][543])])
SA_DET3_LAD1_CH3.append([base_time+4.608-8.196, int(tbdata[i][567])])
SA_DET3_LAD1_CH3.append([base_time+5.120-8.196, int(tbdata[i][591])])
SA_DET3_LAD1_CH3.append([base_time+5.632-8.196, int(tbdata[i][615])])
SA_DET3_LAD1_CH3.append([base_time+6.144-8.196, int(tbdata[i][639])])
SA_DET3_LAD1_CH3.append([base_time+6.656-8.196, int(tbdata[i][663])])
SA_DET3_LAD1_CH3.append([base_time+7.168-8.196, int(tbdata[i][687])])
SA_DET3_LAD1_CH3.append([base_time+7.680-8.196, int(tbdata[i][711])])
SA_DET3_LAD2_CH1.append([base_time+0.000-8.196, int(tbdata[i][352])])
SA_DET3_LAD2_CH1.append([base_time+0.512-8.196, int(tbdata[i][376])])
SA_DET3_LAD2_CH1.append([base_time+1.024-8.196, int(tbdata[i][400])])
SA_DET3_LAD2_CH1.append([base_time+1.536-8.196, int(tbdata[i][424])])
SA_DET3_LAD2_CH1.append([base_time+2.048-8.196, int(tbdata[i][448])])
SA_DET3_LAD2_CH1.append([base_time+2.560-8.196, int(tbdata[i][472])])
SA_DET3_LAD2_CH1.append([base_time+3.072-8.196, int(tbdata[i][496])])
SA_DET3_LAD2_CH1.append([base_time+3.584-8.196, int(tbdata[i][520])])
SA_DET3_LAD2_CH1.append([base_time+4.096-8.196, int(tbdata[i][544])])
SA_DET3_LAD2_CH1.append([base_time+4.608-8.196, int(tbdata[i][568])])
SA_DET3_LAD2_CH1.append([base_time+5.120-8.196, int(tbdata[i][592])])
SA_DET3_LAD2_CH1.append([base_time+5.632-8.196, int(tbdata[i][616])])
SA_DET3_LAD2_CH1.append([base_time+6.144-8.196, int(tbdata[i][640])])
SA_DET3_LAD2_CH1.append([base_time+6.656-8.196, int(tbdata[i][664])])
SA_DET3_LAD2_CH1.append([base_time+7.168-8.196, int(tbdata[i][688])])
SA_DET3_LAD2_CH1.append([base_time+7.680-8.196, int(tbdata[i][712])])
SA_DET3_LAD2_CH2.append([base_time+0.000-8.196, int(tbdata[i][353])])
SA_DET3_LAD2_CH2.append([base_time+0.512-8.196, int(tbdata[i][377])])
SA_DET3_LAD2_CH2.append([base_time+1.024-8.196, int(tbdata[i][401])])
SA_DET3_LAD2_CH2.append([base_time+1.536-8.196, int(tbdata[i][425])])
SA_DET3_LAD2_CH2.append([base_time+2.048-8.196, int(tbdata[i][449])])
SA_DET3_LAD2_CH2.append([base_time+2.560-8.196, int(tbdata[i][473])])
SA_DET3_LAD2_CH2.append([base_time+3.072-8.196, int(tbdata[i][497])])
SA_DET3_LAD2_CH2.append([base_time+3.584-8.196, int(tbdata[i][521])])
SA_DET3_LAD2_CH2.append([base_time+4.096-8.196, int(tbdata[i][545])])
SA_DET3_LAD2_CH2.append([base_time+4.608-8.196, int(tbdata[i][569])])
SA_DET3_LAD2_CH2.append([base_time+5.120-8.196, int(tbdata[i][593])])
SA_DET3_LAD2_CH2.append([base_time+5.632-8.196, int(tbdata[i][617])])
SA_DET3_LAD2_CH2.append([base_time+6.144-8.196, int(tbdata[i][641])])
SA_DET3_LAD2_CH2.append([base_time+6.656-8.196, int(tbdata[i][665])])
SA_DET3_LAD2_CH2.append([base_time+7.168-8.196, int(tbdata[i][689])])
SA_DET3_LAD2_CH2.append([base_time+7.680-8.196, int(tbdata[i][713])])
SA_DET3_LAD2_CH3.append([base_time+0.000-8.196, int(tbdata[i][354])])
SA_DET3_LAD2_CH3.append([base_time+0.512-8.196, int(tbdata[i][378])])
SA_DET3_LAD2_CH3.append([base_time+1.024-8.196, int(tbdata[i][402])])
SA_DET3_LAD2_CH3.append([base_time+1.536-8.196, int(tbdata[i][426])])
SA_DET3_LAD2_CH3.append([base_time+2.048-8.196, int(tbdata[i][450])])
SA_DET3_LAD2_CH3.append([base_time+2.560-8.196, int(tbdata[i][474])])
SA_DET3_LAD2_CH3.append([base_time+3.072-8.196, int(tbdata[i][498])])
SA_DET3_LAD2_CH3.append([base_time+3.584-8.196, int(tbdata[i][522])])
SA_DET3_LAD2_CH3.append([base_time+4.096-8.196, int(tbdata[i][546])])
SA_DET3_LAD2_CH3.append([base_time+4.608-8.196, int(tbdata[i][570])])
SA_DET3_LAD2_CH3.append([base_time+5.120-8.196, int(tbdata[i][594])])
SA_DET3_LAD2_CH3.append([base_time+5.632-8.196, int(tbdata[i][618])])
SA_DET3_LAD2_CH3.append([base_time+6.144-8.196, int(tbdata[i][642])])
SA_DET3_LAD2_CH3.append([base_time+6.656-8.196, int(tbdata[i][666])])
SA_DET3_LAD2_CH3.append([base_time+7.168-8.196, int(tbdata[i][690])])
SA_DET3_LAD2_CH3.append([base_time+7.680-8.196, int(tbdata[i][714])])
SA_DET4_LAD1_CH1.append([base_time+0.000-8.196, int(tbdata[i][355])])
SA_DET4_LAD1_CH1.append([base_time+0.512-8.196, int(tbdata[i][379])])
SA_DET4_LAD1_CH1.append([base_time+1.024-8.196, int(tbdata[i][403])])
SA_DET4_LAD1_CH1.append([base_time+1.536-8.196, int(tbdata[i][427])])
SA_DET4_LAD1_CH1.append([base_time+2.048-8.196, int(tbdata[i][451])])
SA_DET4_LAD1_CH1.append([base_time+2.560-8.196, int(tbdata[i][475])])
SA_DET4_LAD1_CH1.append([base_time+3.072-8.196, int(tbdata[i][499])])
SA_DET4_LAD1_CH1.append([base_time+3.584-8.196, int(tbdata[i][523])])
SA_DET4_LAD1_CH1.append([base_time+4.096-8.196, int(tbdata[i][547])])
SA_DET4_LAD1_CH1.append([base_time+4.608-8.196, int(tbdata[i][571])])
SA_DET4_LAD1_CH1.append([base_time+5.120-8.196, int(tbdata[i][595])])
SA_DET4_LAD1_CH1.append([base_time+5.632-8.196, int(tbdata[i][619])])
SA_DET4_LAD1_CH1.append([base_time+6.144-8.196, int(tbdata[i][643])])
SA_DET4_LAD1_CH1.append([base_time+6.656-8.196, int(tbdata[i][667])])
SA_DET4_LAD1_CH1.append([base_time+7.168-8.196, int(tbdata[i][691])])
SA_DET4_LAD1_CH1.append([base_time+7.680-8.196, int(tbdata[i][715])])
SA_DET4_LAD1_CH2.append([base_time+0.000-8.196, int(tbdata[i][356])])
SA_DET4_LAD1_CH2.append([base_time+0.512-8.196, int(tbdata[i][380])])
SA_DET4_LAD1_CH2.append([base_time+1.024-8.196, int(tbdata[i][404])])
SA_DET4_LAD1_CH2.append([base_time+1.536-8.196, int(tbdata[i][428])])
SA_DET4_LAD1_CH2.append([base_time+2.048-8.196, int(tbdata[i][452])])
SA_DET4_LAD1_CH2.append([base_time+2.560-8.196, int(tbdata[i][476])])
SA_DET4_LAD1_CH2.append([base_time+3.072-8.196, int(tbdata[i][500])])
SA_DET4_LAD1_CH2.append([base_time+3.584-8.196, int(tbdata[i][524])])
SA_DET4_LAD1_CH2.append([base_time+4.096-8.196, int(tbdata[i][548])])
SA_DET4_LAD1_CH2.append([base_time+4.608-8.196, int(tbdata[i][572])])
SA_DET4_LAD1_CH2.append([base_time+5.120-8.196, int(tbdata[i][596])])
SA_DET4_LAD1_CH2.append([base_time+5.632-8.196, int(tbdata[i][620])])
SA_DET4_LAD1_CH2.append([base_time+6.144-8.196, int(tbdata[i][644])])
SA_DET4_LAD1_CH2.append([base_time+6.656-8.196, int(tbdata[i][668])])
SA_DET4_LAD1_CH2.append([base_time+7.168-8.196, int(tbdata[i][692])])
SA_DET4_LAD1_CH2.append([base_time+7.680-8.196, int(tbdata[i][716])])
SA_DET4_LAD1_CH3.append([base_time+0.000-8.196, int(tbdata[i][357])])
SA_DET4_LAD1_CH3.append([base_time+0.512-8.196, int(tbdata[i][381])])
SA_DET4_LAD1_CH3.append([base_time+1.024-8.196, int(tbdata[i][405])])
SA_DET4_LAD1_CH3.append([base_time+1.536-8.196, int(tbdata[i][429])])
SA_DET4_LAD1_CH3.append([base_time+2.048-8.196, int(tbdata[i][453])])
SA_DET4_LAD1_CH3.append([base_time+2.560-8.196, int(tbdata[i][477])])
SA_DET4_LAD1_CH3.append([base_time+3.072-8.196, int(tbdata[i][501])])
SA_DET4_LAD1_CH3.append([base_time+3.584-8.196, int(tbdata[i][525])])
SA_DET4_LAD1_CH3.append([base_time+4.096-8.196, int(tbdata[i][549])])
SA_DET4_LAD1_CH3.append([base_time+4.608-8.196, int(tbdata[i][573])])
SA_DET4_LAD1_CH3.append([base_time+5.120-8.196, int(tbdata[i][597])])
SA_DET4_LAD1_CH3.append([base_time+5.632-8.196, int(tbdata[i][621])])
SA_DET4_LAD1_CH3.append([base_time+6.144-8.196, int(tbdata[i][645])])
SA_DET4_LAD1_CH3.append([base_time+6.656-8.196, int(tbdata[i][669])])
SA_DET4_LAD1_CH3.append([base_time+7.168-8.196, int(tbdata[i][693])])
SA_DET4_LAD1_CH3.append([base_time+7.680-8.196, int(tbdata[i][717])])
SA_DET4_LAD2_CH1.append([base_time+0.000-8.196, int(tbdata[i][358])])
SA_DET4_LAD2_CH1.append([base_time+0.512-8.196, int(tbdata[i][382])])
SA_DET4_LAD2_CH1.append([base_time+1.024-8.196, int(tbdata[i][406])])
SA_DET4_LAD2_CH1.append([base_time+1.536-8.196, int(tbdata[i][430])])
SA_DET4_LAD2_CH1.append([base_time+2.048-8.196, int(tbdata[i][454])])
SA_DET4_LAD2_CH1.append([base_time+2.560-8.196, int(tbdata[i][478])])
SA_DET4_LAD2_CH1.append([base_time+3.072-8.196, int(tbdata[i][502])])
SA_DET4_LAD2_CH1.append([base_time+3.584-8.196, int(tbdata[i][526])])
SA_DET4_LAD2_CH1.append([base_time+4.096-8.196, int(tbdata[i][550])])
SA_DET4_LAD2_CH1.append([base_time+4.608-8.196, int(tbdata[i][574])])
SA_DET4_LAD2_CH1.append([base_time+5.120-8.196, int(tbdata[i][598])])
SA_DET4_LAD2_CH1.append([base_time+5.632-8.196, int(tbdata[i][622])])
SA_DET4_LAD2_CH1.append([base_time+6.144-8.196, int(tbdata[i][646])])
SA_DET4_LAD2_CH1.append([base_time+6.656-8.196, int(tbdata[i][670])])
SA_DET4_LAD2_CH1.append([base_time+7.168-8.196, int(tbdata[i][694])])
SA_DET4_LAD2_CH1.append([base_time+7.680-8.196, int(tbdata[i][718])])
SA_DET4_LAD2_CH2.append([base_time+0.000-8.196, int(tbdata[i][359])])
SA_DET4_LAD2_CH2.append([base_time+0.512-8.196, int(tbdata[i][383])])
SA_DET4_LAD2_CH2.append([base_time+1.024-8.196, int(tbdata[i][407])])
SA_DET4_LAD2_CH2.append([base_time+1.536-8.196, int(tbdata[i][431])])
SA_DET4_LAD2_CH2.append([base_time+2.048-8.196, int(tbdata[i][455])])
SA_DET4_LAD2_CH2.append([base_time+2.560-8.196, int(tbdata[i][479])])
SA_DET4_LAD2_CH2.append([base_time+3.072-8.196, int(tbdata[i][503])])
SA_DET4_LAD2_CH2.append([base_time+3.584-8.196, int(tbdata[i][527])])
SA_DET4_LAD2_CH2.append([base_time+4.096-8.196, int(tbdata[i][551])])
SA_DET4_LAD2_CH2.append([base_time+4.608-8.196, int(tbdata[i][575])])
SA_DET4_LAD2_CH2.append([base_time+5.120-8.196, int(tbdata[i][599])])
SA_DET4_LAD2_CH2.append([base_time+5.632-8.196, int(tbdata[i][623])])
SA_DET4_LAD2_CH2.append([base_time+6.144-8.196, int(tbdata[i][647])])
SA_DET4_LAD2_CH2.append([base_time+6.656-8.196, int(tbdata[i][671])])
SA_DET4_LAD2_CH2.append([base_time+7.168-8.196, int(tbdata[i][695])])
SA_DET4_LAD2_CH2.append([base_time+7.680-8.196, int(tbdata[i][719])])
SA_DET4_LAD2_CH3.append([base_time+0.000-8.196, int(tbdata[i][360])])
SA_DET4_LAD2_CH3.append([base_time+0.512-8.196, int(tbdata[i][384])])
SA_DET4_LAD2_CH3.append([base_time+1.024-8.196, int(tbdata[i][408])])
SA_DET4_LAD2_CH3.append([base_time+1.536-8.196, int(tbdata[i][432])])
SA_DET4_LAD2_CH3.append([base_time+2.048-8.196, int(tbdata[i][456])])
SA_DET4_LAD2_CH3.append([base_time+2.560-8.196, int(tbdata[i][480])])
SA_DET4_LAD2_CH3.append([base_time+3.072-8.196, int(tbdata[i][504])])
SA_DET4_LAD2_CH3.append([base_time+3.584-8.196, int(tbdata[i][528])])
SA_DET4_LAD2_CH3.append([base_time+4.096-8.196, int(tbdata[i][552])])
SA_DET4_LAD2_CH3.append([base_time+4.608-8.196, int(tbdata[i][576])])
SA_DET4_LAD2_CH3.append([base_time+5.120-8.196, int(tbdata[i][600])])
SA_DET4_LAD2_CH3.append([base_time+5.632-8.196, int(tbdata[i][624])])
SA_DET4_LAD2_CH3.append([base_time+6.144-8.196, int(tbdata[i][648])])
SA_DET4_LAD2_CH3.append([base_time+6.656-8.196, int(tbdata[i][672])])
SA_DET4_LAD2_CH3.append([base_time+7.168-8.196, int(tbdata[i][696])])
SA_DET4_LAD2_CH3.append([base_time+7.680-8.196, int(tbdata[i][720])])
#################
# CREATE TABLES #
#################
self.logger.info(f"Computing Ratemeters Time Series...")
# All Data was read.
# Now sum all the contributions into 1 array per instrument, merging all channels.
# SILICON TRACKER
GRID = Table()
GRID['OBT'] = [row[0] for row in GRID_1X]
GRID_counts = []
for j in range(len(GRID_1X)):
GRID_counts.append(
[GRID_1X[j][1]+GRID_2X[j][1]+GRID_3X[j][1]+GRID_4X[j][1]+GRID_5X[j][1]+GRID_6X[j][1]+
GRID_1Z[j][1]+GRID_2Z[j][1]+GRID_3Z[j][1]+GRID_4Z[j][1]+GRID_5Z[j][1]+GRID_6Z[j][1]
])
GRID['COUNTS'] = np.array(GRID_counts).flatten()
# ANTI-COINCIDENCES
AC_SIDE0 = np.array(AC_SIDE0)
AC_SIDE1 = np.array(AC_SIDE1)
AC_SIDE2 = np.array(AC_SIDE2)
AC_SIDE3 = np.array(AC_SIDE3)
AC_SIDE4 = np.array(AC_SIDE4)
AC_SIDE0 = Table([AC_SIDE0[:,0],AC_SIDE0[:,1]], names=('OBT','COUNTS'), dtype=('f8','i4'))
AC_SIDE1 = Table([AC_SIDE1[:,0],AC_SIDE1[:,1]], names=('OBT','COUNTS'), dtype=('f8','i4'))
AC_SIDE2 = Table([AC_SIDE2[:,0],AC_SIDE2[:,1]], names=('OBT','COUNTS'), dtype=('f8','i4'))
AC_SIDE3 = Table([AC_SIDE3[:,0],AC_SIDE3[:,1]], names=('OBT','COUNTS'), dtype=('f8','i4'))
AC_SIDE4 = Table([AC_SIDE4[:,0],AC_SIDE4[:,1]], names=('OBT','COUNTS'), dtype=('f8','i4'))
# MINI-CALORIMETER
MCAL = Table()
MCAL['OBT'] = [row[0] for row in MCAL_X_CH01]
MCAL_counts = []
for j in range(len(MCAL_X_CH01)):
MCAL_counts.append(
[MCAL_X_CH01[j][1]+MCAL_X_CH02[j][1]+MCAL_X_CH03[j][1]+MCAL_X_CH04[j][1]+MCAL_X_CH05[j][1]+MCAL_X_CH06[j][1]+MCAL_X_CH07[j][1]+MCAL_X_CH08[j][1]+MCAL_X_CH09[j][1]+MCAL_X_CH10[j][1]+MCAL_X_CH11[j][1]+
MCAL_Z_CH01[j][1]+MCAL_Z_CH02[j][1]+MCAL_Z_CH03[j][1]+MCAL_Z_CH04[j][1]+MCAL_Z_CH05[j][1]+MCAL_Z_CH06[j][1]+MCAL_Z_CH07[j][1]+MCAL_Z_CH08[j][1]+MCAL_Z_CH09[j][1]+MCAL_Z_CH10[j][1]+MCAL_Z_CH11[j][1]
])
MCAL['COUNTS'] = np.array(MCAL_counts).flatten()
# SUPER-AGILE
SA = Table()
SA['OBT'] = [row[0] for row in SA_DET1_LAD1_CH1]
SA_counts = []
for j in range(len(SA_DET1_LAD1_CH1)):
SA_counts.append(
[SA_DET1_LAD1_CH1[j][1]+SA_DET1_LAD1_CH2[j][1]+SA_DET1_LAD1_CH3[j][1]+
SA_DET1_LAD2_CH1[j][1]+SA_DET1_LAD2_CH2[j][1]+SA_DET1_LAD2_CH3[j][1]+
SA_DET2_LAD1_CH1[j][1]+SA_DET2_LAD1_CH2[j][1]+SA_DET2_LAD1_CH3[j][1]+
SA_DET2_LAD2_CH1[j][1]+SA_DET2_LAD2_CH2[j][1]+SA_DET2_LAD2_CH3[j][1]+
SA_DET3_LAD1_CH1[j][1]+SA_DET3_LAD1_CH2[j][1]+SA_DET3_LAD1_CH3[j][1]+
SA_DET3_LAD2_CH1[j][1]+SA_DET3_LAD2_CH2[j][1]+SA_DET3_LAD2_CH3[j][1]+
SA_DET4_LAD1_CH1[j][1]+SA_DET4_LAD1_CH2[j][1]+SA_DET4_LAD1_CH3[j][1]+
SA_DET4_LAD2_CH1[j][1]+SA_DET4_LAD2_CH2[j][1]+SA_DET4_LAD2_CH3[j][1]
])
SA['COUNTS'] = np.array(SA_counts).flatten()
#################################################
# APPLY FFT DETRENDING OF BACKGROUND MODULATION #
#################################################
GRID['COUNTS_D'] = self._detrendData( GRID, sampling=0.512, frequency_cut_range=(1.0E-4,1.0E-2))
SA['COUNTS_D'] = self._detrendData( SA, sampling=0.512, frequency_cut_range=(1.0E-4,1.0E-2))
MCAL['COUNTS_D'] = self._detrendData( MCAL, sampling=1.024, frequency_cut_range=(1.0E-5,3.0E-2))
AC_SIDE0['COUNTS_D'] = self._detrendData(AC_SIDE0, sampling=1.024, frequency_cut_range=(1.0E-5,3.0E-2))
AC_SIDE1['COUNTS_D'] = self._detrendData(AC_SIDE1, sampling=1.024, frequency_cut_range=(1.0E-5,3.0E-2))
AC_SIDE2['COUNTS_D'] = self._detrendData(AC_SIDE2, sampling=1.024, frequency_cut_range=(1.0E-5,3.0E-2))
AC_SIDE3['COUNTS_D'] = self._detrendData(AC_SIDE3, sampling=1.024, frequency_cut_range=(1.0E-5,3.0E-2))
AC_SIDE4['COUNTS_D'] = self._detrendData(AC_SIDE4, sampling=1.024, frequency_cut_range=(1.0E-5,3.0E-2))
# Sort by Time
SA.sort('OBT')
AC_SIDE0.sort('OBT')
AC_SIDE1.sort('OBT')
AC_SIDE2.sort('OBT')
AC_SIDE3.sort('OBT')
AC_SIDE4.sort('OBT')
MCAL.sort('OBT')
GRID.sort('OBT')
###########################
# CREATE RATEMETERS FILES #
###########################
if writeFiles:
self.logger.info(f"Writing Ratemeters Time Series in: {self.outdir}")
output_directory = Path(self.outdir).absolute().joinpath("rm")
output_directory.mkdir(exist_ok=True, parents=True)
GRID.write( output_directory.joinpath('RM-GRID_LC.txt'), format='ascii', delimiter=' ', overwrite=True)
SA.write( output_directory.joinpath('RM-SA_LC.txt'), format='ascii', delimiter=' ', overwrite=True)
MCAL.write( output_directory.joinpath('RM-MCAL_LC.txt'), format='ascii', delimiter=' ', overwrite=True)
AC_SIDE0.write(output_directory.joinpath('RM-AC0_LC.txt'), format='ascii', delimiter=' ', overwrite=True)
AC_SIDE1.write(output_directory.joinpath('RM-AC1_LC.txt'), format='ascii', delimiter=' ', overwrite=True)
AC_SIDE2.write(output_directory.joinpath('RM-AC2_LC.txt'), format='ascii', delimiter=' ', overwrite=True)
AC_SIDE3.write(output_directory.joinpath('RM-AC3_LC.txt'), format='ascii', delimiter=' ', overwrite=True)
AC_SIDE4.write(output_directory.joinpath('RM-AC4_LC.txt'), format='ascii', delimiter=' ', overwrite=True)
# Return
ratemetersTables = {"GRID":GRID,"MCAL":MCAL,"SA":SA,"AC0":AC_SIDE0,"AC1":AC_SIDE1,"AC2":AC_SIDE2,"AC3":AC_SIDE3,"AC4":AC_SIDE4}
self._ratemetersTables = ratemetersTables
self.logger.info(f"Done.")
return ratemetersTables
@property
def ratemetersTables(self):
return self._ratemetersTables
[docs] def plotRatemeters(self, plotInstruments=["3RM"], plotRange=(-100, 100), useDetrendedData=True):
"""Plot Ratemeters Light Curves.
Args:
plotInstruments (list of str): Keys of the instruments to plot (including "2RM", "3RM", "8RM"). Defaults to ["3RM"].
plotRange (tuple(float, float)): Time limits of the plots, in seconds relative to T0.
useDetrendedData (bool): If True, plot detrended counts, otherwise plot raw counts. Defaults to True.
Returns:
plots (list(str) or None): Plot output paths.
"""
data_flag = "D" if useDetrendedData else "ND"
plots = []
# Plot the chosen instruments
if "2RM" in plotInstruments:
instrument_list = ["AC0","MCAL"]
filePath = Path(self.outdir).absolute().joinpath(f"plots/ratemeters_{data_flag}_2RM.png")
plot = self.plottingUtils.plotRatemeters(self._ratemetersTables,instrument_list,self.config.getOptionValue("T0"),plotRange,useDetrendedData,filePath)
plots.append(plot)
if "3RM" in plotInstruments:
instrument_list = ["SA","AC0","MCAL"]
filePath = Path(self.outdir).absolute().joinpath(f"plots/ratemeters_{data_flag}_3RM.png")
plot = self.plottingUtils.plotRatemeters(self._ratemetersTables,instrument_list,self.config.getOptionValue("T0"),plotRange,useDetrendedData,filePath)
plots.append(plot)
if "8RM" in plotInstruments:
instrument_list = ["SA","GRID","AC0","AC1","AC2","AC3","AC4","MCAL"]
filePath = Path(self.outdir).absolute().joinpath(f"plots/ratemeters_{data_flag}_8RM.png")
plot = self.plottingUtils.plotRatemeters(self._ratemetersTables,instrument_list,self.config.getOptionValue("T0"),plotRange,useDetrendedData,filePath)
plots.append(plot)
# Requested Instruments
# Remove "2RM", "3RM", "8RM".
instrument_list = [item for item in plotInstruments if item not in ("2RM","3RM","8RM")]
if len(instrument_list)==0:
return plots
fileName = f"ratemeters_{data_flag}_"+"_".join(instrument_list)+".png"
filePath = Path(self.outdir).absolute().joinpath(f"plots/{fileName}")
plot = self.plottingUtils.plotRatemeters(self._ratemetersTables,instrument_list,self.config.getOptionValue("T0"),plotRange,useDetrendedData,filePath)
plots.append(plot)
return plots
def _analyseTable(self, data_table, backgroundRange, signalRange, useDetrendedData=True):
"""Analyse the Burst in a given table.
Args:
data_table (astropy.table.Table): Ratemeters Light Curve Table.
backgroundRange (tuple(float, float)): Time range for background selection, in seconds relative to T0.
signalRange (tuple(float, float)): Time range for signal selection, in seconds relative to T0.
useDetrendedData (bool): If True, use detrended data.
Return:
results (dict): Dictionary with ON and OFF counts and time interval. Also includes background rate and Li&Ma significance.
"""
# Get T0
T0 = self.getOption("T0")
time = data_table['OBT'].data - T0
counts = data_table['COUNTS_D'].data if useDetrendedData else data_table['COUNTS'].data
# Evaluate Background
mask_bkg = (time>=backgroundRange[0])&(time<=backgroundRange[1])
time_bkg = time[mask_bkg]
counts_bkg = counts[mask_bkg]
N_OFF = np.round(np.sum(counts_bkg)).astype(int) # Round is needed for detrended data
t_OFF = np.round(time_bkg[-1]-time_bkg[0],3)
# Evaluate Signal
mask_sig = (time>=signalRange[0])&(time<=signalRange[1])
time_sig = time[mask_sig]
counts_sig = counts[mask_sig]
N_ON = np.round(np.sum(counts_sig)).astype(int)
t_ON = np.round(time_sig[-1]-time_sig[0],3)
# Collect Results
R_BKG = N_OFF/t_OFF
li_ma = AstroUtils.li_ma(N_ON, N_OFF, t_ON / t_OFF)
results = {"t_ON":t_ON,"N_ON":N_ON,"t_OFF":t_OFF,"N_OFF":N_OFF,"R_BKG":np.round(R_BKG,3),"lima":np.round(li_ma,3)}
return results
[docs] def analyseSignal(self, backgroundRange=(None,None), signalRange=(None,None), useDetrendedData=True):
"""Analyse the Burst in all tables.
Args:
backgroundRange (tuple(float, float)): Time range for background selection, in seconds relative to T0.
signalRange (tuple(float, float)): Time range for signal selection, in seconds relative to T0.
useDetrendedData (bool): If True, use detrended data.
Returns:
results (astropy.table.Table): Results table with Aperture Photometry Information.
"""
# Set Background and Signal Range from configuration if None
bkgRange = (backgroundRange[0] if backgroundRange[0] is not None else self.config.getOptionValue("background_tmin"),
backgroundRange[1] if backgroundRange[1] is not None else self.config.getOptionValue("background_tmax")
)
sigRange = (signalRange[0] if signalRange[0] is not None else self.config.getOptionValue("signal_tmin"),
signalRange[1] if signalRange[1] is not None else self.config.getOptionValue("signal_tmax"))
# Results table
self.logger.info(f"Analyse Ratemeters Time Series...")
results = Table(names=("instrument","t_ON","N_ON","t_OFF","N_OFF","R_BKG","lima"),
dtype=(str,float,int,float,int,float,float))
for instr, data_table in self._ratemetersTables.items():
res = self._analyseTable(data_table, bkgRange, sigRange, useDetrendedData)
res['instrument'] = instr
results.add_row(res)
self.logger.info(f"{instr}: {res['N_ON']} counts above a background rate of {res['R_BKG']} Hz")
# Return
self.logger.info(f"Done.")
return results
[docs] def estimateDuration(self, dataRange, backgroundRange=(None,None), signalRange=(None,None), useDetrendedData=True, plotDuration=True):
"""Estimate the Duration of the Burst with Cumulative Light Curves.
Args:
dataRange (tuple(float, float)): Time range for the plot.
backgroundRange (tuple(float, float)): Time range for background selection, in seconds relative to T0.
signalRange (tuple(float, float)): Time range for signal selection, in seconds relative to T0.
useDetrendedData (bool): If True, use detrended data.
plotDuration (bool): if True, plot the Cumulative Light Curves.
Raises:
ValueError: if dataRange does not contain the Background or Signal Range.
Returns:
data_dict (dict): Dictionary of results.
plot (str or None): Plot output path.
"""
# Set Background and Signal Range from configuration if None
bkgRange = (backgroundRange[0] if backgroundRange[0] is not None else self.config.getOptionValue("background_tmin"),
backgroundRange[1] if backgroundRange[1] is not None else self.config.getOptionValue("background_tmax")
)
sigRange = (signalRange[0] if signalRange[0] is not None else self.config.getOptionValue("signal_tmin"),
signalRange[1] if signalRange[1] is not None else self.config.getOptionValue("signal_tmax"))
# Data Range Must contain both Signal and Background ranges
if dataRange[0]>min(bkgRange[0],sigRange[0]): raise ValueError(f"Tmin of Data Range must be <= {min(bkgRange[0],sigRange[0])}")
if dataRange[1]<max(bkgRange[1],sigRange[1]): raise ValueError(f"Tmax of Data Range must be >= {min(bkgRange[1],sigRange[1])}")
# Set T0
T0 = self.config.getOptionValue("T0")
instruments = ["SA", "MCAL", "AC0"]
active_instruments = []
self.logger.info("Computing Duration in SuperAGILE, MCAL and AC Top...")
data_dict={}
for instr in instruments:
# Select data in the given data range
data_full = self._ratemetersTables[instr]
mask = (data_full['OBT']>T0+dataRange[0])&(data_full['OBT']<T0+dataRange[1])
time = data_full[mask]['OBT'].data - T0
counts= data_full[mask]['COUNTS_D'].data if useDetrendedData else data_full[mask]['COUNTS'].data
# Subtract Avg background where the detector is active (counts>0)
bkg_mask = (time>=bkgRange[0])&(time<=bkgRange[1])
bkg_mean = np.mean(counts[bkg_mask])
# Compute the Cumulative, background subtracted Light Curve where the detector is active
counts_bkgsub = np.where(counts>0, counts-bkg_mean, 0)
integral_counts = np.cumsum(counts_bkgsub)
# Identify the Region where the Signal is rising, within the Signal Window
sig_mask = (time>=sigRange[0])&(time<=sigRange[1])
rise_mask= np.diff(integral_counts, prepend=integral_counts[0]) > 0
sigrise_time = time[sig_mask&rise_mask]
try:
duration = sigrise_time[-1] - sigrise_time[0]
except IndexError:
duration = 0.0
# Bundle Results for the Plot
data_dict[instr] = {'time':time,'counts':counts,'counts_bkgsub':counts_bkgsub,'integral_counts':integral_counts,'sigrise_time':sigrise_time,'duration':duration}
# Do not plot if inactive
if np.max(counts)<1e-3:
self.logger.warning(f"Detector {instr} not active.")
continue
# If active, print results and plot
self.logger.info(f"Duration (Signal Rise Time) in {instr}: {duration:.3g} s")
active_instruments.append(instr)
# Plot if requested
plot = None
if plotDuration:
data_flag = "D" if useDetrendedData else "ND"
filePath = Path(self.outdir).absolute().joinpath(f"plots/ratemeters_duration_{data_flag}.png")
plot = self.plottingUtils.plotRatemetersDuration(
data_dict,active_instruments,self.config.getOptionValue("T0"),
bkgRange, sigRange, dataRange, filePath
)
# Return
self.logger.info(f"Done.")
return (data_dict, plot)