REST-for-Physics  v2.3
Rare Event Searches ToolKit for Physics
TRestRawTDSToSignalProcess.cxx
1 /*************************************************************************
2  * This file is part of the REST software framework. *
3  * *
4  * Copyright (C) 2016 GIFNA/TREX (University of Zaragoza) *
5  * For more information see http://gifna.unizar.es/trex *
6  * *
7  * REST is free software: you can redistribute it and/or modify *
8  * it under the terms of the GNU General Public License as published by *
9  * the Free Software Foundation, either version 3 of the License, or *
10  * (at your option) any later version. *
11  * *
12  * REST is distributed in the hope that it will be useful, *
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15  * GNU General Public License for more details. *
16  * *
17  * You should have a copy of the GNU General Public License along with *
18  * REST in $REST_PATH/LICENSE. *
19  * If not, see http://www.gnu.org/licenses/. *
20  * For the list of contributors see $REST_PATH/CREDITS. *
21  *************************************************************************/
22 
53 
54 #include "TRestRawTDSToSignalProcess.h"
55 
57 
62 
67 
73 
82  ANABlockHead blockhead;
83  if (fread(&blockhead, sizeof(blockhead), 1, fInputBinFile) != 1) return;
84  totalBytesReaded = sizeof(blockhead);
85  nSamples = blockhead.NEvents;
86  nChannels = blockhead.NHits / blockhead.NEvents;
87  fRate = blockhead.SRate;
88  pulseDepth = blockhead.PSize;
89  RESTDebug << "nSamples " << nSamples << " NChannels " << nChannels << RESTendl;
90  RESTDebug << "SRATE: " << (double)fRate << " PULSE DEPTH: " << pulseDepth
91  << " PRETRIGGER: " << blockhead.Pretrigger << RESTendl;
92  for (int i = 0; i < nChannels; i++) {
93  fScale[i] = blockhead.mVdiv[i];
94  negPolarity[i] = blockhead.NegPolarity[i];
95  }
96  tNow = static_cast<double>(blockhead.TimeStamp);
97  fRunInfo->SetStartTimeStamp(tNow);
98 }
99 
104  // TDS block and event header
105  ANABlockHead blockhead;
106  ANAEventHead eventhead;
107 
108  // Initialize fSignalEvent, so it is empty if already filled in
109  fSignalEvent->Initialize();
110 
111  // Read block header if any, note that we have nSamples events between 2 block headers
112  if (nEvents % nSamples == 0 && nEvents != 0) {
113  if (fread(&blockhead, sizeof(blockhead), 1, fInputBinFile) != 1) return nullptr;
114  totalBytesReaded += sizeof(blockhead);
115  // Update timestamp from the blockHeader
116  tNow = static_cast<double>(blockhead.TimeStamp);
117  }
118 
119  // Always read event header at the beginning of event
120  if (fread(&eventhead, sizeof(eventhead), 1, fInputBinFile) != 1) return nullptr;
121  totalBytesReaded += sizeof(eventhead);
122  // This vector holds data which has a length of pulseDepth
123  std::vector<Char_t> buffer(pulseDepth);
124  fSignalEvent->SetID(nEvents);
125  fSignalEvent->SetTime(tNow + static_cast<double>(eventhead.clockTicksLT) * 1E-6);
126  // Need to initialize TRestRawSignal with the proper data length
127  TRestRawSignal sgnl(pulseDepth);
128 
129  // We loop over the recorded channels, we have one data frame per channel
130  for (int i = 0; i < nChannels; i++) {
131  sgnl.SetSignalID(i);
132  fSignalEvent->AddSignal(sgnl);
133  // Read data frame and store in buffer
134  if (fread((char*)&buffer[0], pulseDepth, 1, fInputBinFile) != 1) return nullptr;
135  totalBytesReaded += pulseDepth;
136  for (int j = 0; j < pulseDepth; j++) {
137  Short_t data = buffer[j];
138  if (negPolarity[i]) data *= -1; // Inversion in case pulses are negative
139  data += 128; // Add 128 since the oscilloscope range is [-128:128]
140  fSignalEvent->AddChargeToSignal(i, j, data);
141  }
142  }
143 
144  // Set end time stamp for the run
145  fRunInfo->SetEndTimeStamp(tNow + static_cast<double>(eventhead.clockTicksLT) * 1E-6);
146  nEvents++;
147 
148  return fSignalEvent;
149 }
TRestRun * fRunInfo
< Pointer to TRestRun object where to find metadata.
A base class for any REST event.
Definition: TRestEvent.h:38
void SetTime(Double_t time)
Definition: TRestEvent.cxx:85
endl_t RESTendl
Termination flag object for TRestStringOutput.
void AddChargeToSignal(Int_t sgnlID, Int_t bin, Short_t value)
It defines a Short_t array with a physical parameter that evolves in time using a fixed time bin.
void SetSignalID(Int_t sID)
It sets the id number of the signal.
A process to read binary files produced with TDS (Tektronix oscilloscope) DAQ.
TRestRawTDSToSignalProcess()
Default constructor.
void Initialize() override
Function to initialize input/output event members and define the section name, calls parent TRestRawT...
~TRestRawTDSToSignalProcess()
Default destructor.
TRestEvent * ProcessEvent(TRestEvent *inputEvent) override
The main processing event function.
void InitProcess() override
Process initialization. Read first header block and initializes several variables such as: nSamples,...
void Initialize() override
Making default settings.