REST-for-Physics  v2.3
Rare Event Searches ToolKit for Physics
Loading...
Searching...
No Matches
TRestDetectorSignalRecoveryProcess.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
52//
94#include "TRestDetectorSignalRecoveryProcess.h"
95
96using namespace std;
97
99
104
118 Initialize();
119
120 if (LoadConfigFromFile(configFilename) == -1) LoadDefaultConfig();
121
123}
124
129
134 SetName("removeChannels-Default");
135 SetTitle("Default config");
136}
137
143 SetSectionName(this->ClassName());
144 SetLibraryVersion(LIBRARY_VERSION);
145
146 fInputSignalEvent = nullptr;
148}
149
162void TRestDetectorSignalRecoveryProcess::LoadConfig(const string& configFilename, const string& name) {
163 if (LoadConfigFromFile(configFilename, name) == -1) LoadDefaultConfig();
164}
165
172 fReadout = GetMetadata<TRestDetectorReadout>();
173
174 if (fReadout == nullptr) {
175 RESTError << "TRestDetectorSignalRecoveryProcess. Readout has not been initialized!" << RESTendl;
176 exit(-1);
177 }
178}
179
185
186 for (int n = 0; n < fInputSignalEvent->GetNumberOfSignals(); n++)
187 fOutputSignalEvent->AddSignal(*fInputSignalEvent->GetSignal(n));
188
189 Int_t idL;
190 Int_t idR;
191 for (unsigned int x = 0; x < fChannelIds.size(); x++) {
192 Int_t type = GetAdjacentSignalIds(fChannelIds[x], idL, idR);
193 RESTDebug << "Channel id : " << fChannelIds[x] << " Left : " << idL << " Right : " << idR << RESTendl;
194
195 if (idL == -1 || idR == -1) continue;
196
197 TRestDetectorSignal* leftSgnl = fInputSignalEvent->GetSignalById(idL);
198 TRestDetectorSignal* rightSgnl = fInputSignalEvent->GetSignalById(idR);
199
204
205 if (leftSgnl == nullptr || rightSgnl == nullptr) continue;
206
207 TRestDetectorSignal recoveredSignal;
208 recoveredSignal.SetID(fChannelIds[x]);
209
210 if (type == 1) // Only one dead channel
211 {
212 for (int n = 0; n < leftSgnl->GetNumberOfPoints(); n++) {
213 recoveredSignal.IncreaseAmplitude(leftSgnl->GetTime(n), leftSgnl->GetData(n) / 2.);
215 leftSgnl->IncreaseAmplitude(leftSgnl->GetTime(n), -1. * leftSgnl->GetData(n) / 2.);
216 }
217
218 for (int n = 0; n < rightSgnl->GetNumberOfPoints(); n++) {
219 recoveredSignal.IncreaseAmplitude(rightSgnl->GetTime(n), rightSgnl->GetData(n) / 2.);
221 rightSgnl->IncreaseAmplitude(rightSgnl->GetTime(n), -1. * rightSgnl->GetData(n) / 2.);
222 }
223 } else if (type == 2 || type == 3) { // We got two dead-channels
224 if (type == 2) // The other dead channel is the one at the left
225 {
226 for (int n = 0; n < leftSgnl->GetNumberOfPoints(); n++)
227 recoveredSignal.IncreaseAmplitude(leftSgnl->GetTime(n), leftSgnl->GetData(n) / 6.);
228
229 for (int n = 0; n < rightSgnl->GetNumberOfPoints(); n++)
230 recoveredSignal.IncreaseAmplitude(rightSgnl->GetTime(n), 2 * rightSgnl->GetData(n) / 6.);
231 }
232
233 if (type == 3) // The other dead channel is the one at the right
234 {
235 for (int n = 0; n < leftSgnl->GetNumberOfPoints(); n++)
236 recoveredSignal.IncreaseAmplitude(leftSgnl->GetTime(n), 2 * leftSgnl->GetData(n) / 6.);
237
238 for (int n = 0; n < rightSgnl->GetNumberOfPoints(); n++)
239 recoveredSignal.IncreaseAmplitude(rightSgnl->GetTime(n), rightSgnl->GetData(n) / 6.);
240 }
241
244 for (int n = 0; n < leftSgnl->GetNumberOfPoints(); n++)
245 leftSgnl->IncreaseAmplitude(leftSgnl->GetTime(n), -1. * leftSgnl->GetData(n) / 4.);
246 for (int n = 0; n < rightSgnl->GetNumberOfPoints(); n++)
247 rightSgnl->IncreaseAmplitude(rightSgnl->GetTime(n), -1. * rightSgnl->GetData(n) / 4.);
248 } else {
249 RESTWarning << "Adjacent channels for signal " << fChannelIds[x] << " not found " << RESTendl;
250 continue;
251 }
252
253 if (fOutputSignalEvent->GetSignalIndex(fChannelIds[x]) > 0)
254 fOutputSignalEvent->RemoveSignalWithId(fChannelIds[x]);
255
256 fOutputSignalEvent->AddSignal(recoveredSignal);
257
258 /*cout << "Channel recovered!! " << endl;
259 if( leftSgnl != nullptr && rightSgnl != nullptr )
260 for( int n = 0; n < nPoints; n++ )
261 cout << "Sample " << n << " : " << leftSgnl->GetData(n) << " + " << rightSgnl->GetData(n) << "
262 = " << recoveredSignal.GetData(n) << endl;*/
263
264 RESTDebug << "Channel recovered!! " << RESTendl;
265 if (leftSgnl != nullptr && rightSgnl != nullptr)
266 for (int n = 0; n < leftSgnl->GetNumberOfPoints(); n++)
267 RESTDebug << "Sample " << n << " : " << leftSgnl->GetData(n) << " + " << rightSgnl->GetData(n)
268 << " = " << recoveredSignal.GetData(n) << RESTendl;
269 }
270
271 RESTDebug << "Channels after : " << fOutputSignalEvent->GetNumberOfSignals() << RESTendl;
272
273 return fOutputSignalEvent;
274}
275
287int TRestDetectorSignalRecoveryProcess::GetAdjacentSignalIds(Int_t signalId, Int_t& idLeft, Int_t& idRight) {
288 idLeft = -1;
289 idRight = -1;
290
291 for (int p = 0; p < fReadout->GetNumberOfReadoutPlanes(); p++) {
293 for (size_t m = 0; m < plane->GetNumberOfModules(); m++) {
294 TRestDetectorReadoutModule* mod = plane->GetModule(m);
295 // We iterate over all readout modules searching for the one that contains
296 // our signal id
297 if (mod->IsDaqIDInside(signalId)) {
298 // If we find it we use the readoutModule id, and the signalId
299 // corresponding to the physical readout channel
300 Int_t readoutChannelID = mod->DaqToReadoutChannel(signalId);
301
302 idLeft = mod->GetChannel(readoutChannelID - 1)->GetDaqID();
303 idRight = mod->GetChannel(readoutChannelID + 1)->GetDaqID();
304
305 // If idLeft is a dead channel we take the previous channel
306 if (std::find(fChannelIds.begin(), fChannelIds.end(), idLeft) != fChannelIds.end()) {
307 idLeft = mod->GetChannel(readoutChannelID - 2)->GetDaqID();
308 return 2;
309 }
310
311 // If idRight is a dead channel we take the next channel
312 if (std::find(fChannelIds.begin(), fChannelIds.end(), idRight) != fChannelIds.end()) {
313 idRight = mod->GetChannel(readoutChannelID + 2)->GetDaqID();
314 return 3;
315 }
316 return 1;
317 }
318 }
319 }
320 return 0;
321}
Int_t GetDaqID() const
Returns the corresponding daq channel id.
TRestDetectorReadoutChannel * GetChannel(size_t n)
Returns a pointer to a readout channel by index.
Bool_t IsDaqIDInside(Int_t daqID)
Determines if a given daqID number is in the range of the module.
Int_t DaqToReadoutChannel(Int_t daqChannel)
Returns the physical readout channel index for a given daq id channel number.
size_t GetNumberOfModules() const
Returns the total number of modules in the readout plane.
TRestDetectorReadoutModule * GetModule(size_t mod)
Returns a pointer to a readout module using its std::vector index.
TRestDetectorReadoutPlane * GetReadoutPlane(int p)
Returns a pointer to the readout plane by index.
A process allowing to recover selected channels from a TRestRawSignalEvent.
void InitProcess() override
Function to initialize the process. TRestDetectorSignalRecoveryProcess requires to get a pointer to T...
void LoadDefaultConfig()
Function to load the default config in absence of RML input.
int GetAdjacentSignalIds(Int_t signalId, Int_t &idLeft, Int_t &idRight)
It returns the channel daq id of the adjacent readout channels. It will properly identify that we got...
TRestDetectorSignalEvent * fOutputSignalEvent
A pointer to the specific TRestDetectorSignalEvent input.
void Initialize() override
Function to initialize input/output event members and define the section name.
void PrintMetadata() override
It prints out the process parameters stored in the metadata structure.
TRestDetectorSignalEvent * fInputSignalEvent
A pointer to the specific TRestDetectorSignalEvent input.
TRestEvent * ProcessEvent(TRestEvent *eventInput) override
The main processing event function.
void LoadConfig(const std::string &configFilename, const std::string &name="")
Function to load the configuration from an external configuration file.
TRestDetectorReadout * fReadout
A pointer to the readout that will be extracted from TRestRun.
void IncreaseAmplitude(TVector2 p)
If the point already exists inside the detector signal event, the amplitude value will be added to th...
A base class for any REST event.
Definition TRestEvent.h:38
endl_t RESTendl
Termination flag object for TRestStringOutput.
Int_t LoadConfigFromFile(const std::string &configFilename, const std::string &sectionName="")
Give the file name, find out the corresponding section. Then call the main starter.
void SetLibraryVersion(TString version)
Set the library version of this metadata class.
void SetSectionName(std::string sName)
set the section name, clear the section content