REST-for-Physics  v2.3
Rare Event Searches ToolKit for Physics
TRestTrack2DAnalysisProcess.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
99
100#include "TRestTrack2DAnalysisProcess.h"
101using namespace std;
102
103// Comparator function for sorting in descending order
104bool sortByValueDescending(const std::pair<int, Double_t>& a, const std::pair<int, Double_t>& b) {
105 return a.second > b.second; // Change to < for ascending order
106}
107
109
110TRestTrack2DAnalysisProcess::TRestTrack2DAnalysisProcess() { Initialize(); }
111
112TRestTrack2DAnalysisProcess::TRestTrack2DAnalysisProcess(const char* configFilename) {
113 Initialize();
114 if (LoadConfigFromFile(configFilename)) LoadDefaultConfig();
115}
116
117TRestTrack2DAnalysisProcess::~TRestTrack2DAnalysisProcess() { delete fTrackEvent; }
118
119void TRestTrack2DAnalysisProcess::LoadDefaultConfig() { SetTitle("Default config"); }
120
122 SetSectionName(this->ClassName());
123 SetLibraryVersion(LIBRARY_VERSION);
124
125 fTrackEvent = new TRestTrackEvent();
126}
127
128void TRestTrack2DAnalysisProcess::LoadConfig(const string& configFilename, const string& name) {
129 if (LoadConfigFromFile(configFilename, name)) LoadDefaultConfig();
130}
131
133
135 fTrackEvent = (TRestTrackEvent*)inputEvent;
136
140
142 Double_t XZ_TotalEnergyX;
143 Double_t YZ_TotalEnergyY;
144
146 int NTracksX;
147 int NTracksY;
148
151 map<int, Double_t> XZ_EnergyX;
152 map<int, Double_t> YZ_EnergyY;
153
155 map<int, int> XZ_NHitsX;
156 map<int, int> YZ_NHitsY;
157
159 map<int, Double_t> XZ_SigmaX;
160 map<int, Double_t> XZ_SigmaZ;
161 map<int, Double_t> YZ_SigmaY;
162 map<int, Double_t> YZ_SigmaZ;
163
164 map<int, Double_t> XZ_YZ_SigmaXYBalance;
165 map<int, Double_t> XZ_YZ_SigmaZBalance;
166
167 map<int, Double_t> XZ_SkewZ;
168 map<int, Double_t> YZ_SkewZ;
169
171 map<int, Double_t> XZ_GaussSigmaX;
172 map<int, Double_t> XZ_GaussSigmaZ;
173 map<int, Double_t> YZ_GaussSigmaY;
174 map<int, Double_t> YZ_GaussSigmaZ;
175
176 map<int, Double_t> XZ_YZ_GaussSigmaXYBalance;
177 map<int, Double_t> XZ_YZ_GaussSigmaZBalance;
178
180 map<int, Double_t> XZ_LengthX;
181 map<int, Double_t> YZ_LengthY;
182
183 map<int, Double_t> XZ_VolumeX;
184 map<int, Double_t> YZ_VolumeY;
185
186 map<int, Double_t> XZ_MeanX;
187 map<int, Double_t> XZ_MeanZ;
188 map<int, Double_t> YZ_MeanY;
189 map<int, Double_t> YZ_MeanZ;
190
192 Double_t XZ_FirstSecondTracksDistanceXZ;
193 Double_t YZ_FirstSecondTracksDistanceYZ;
194
196 Double_t MaxTrack_XZ_YZ_SigmaZ;
197 Double_t MaxTrack_XZ_YZ_GaussSigmaZ;
198 Double_t MaxTrack_XZ_YZ_SkewXY;
199 Double_t MaxTrack_XZ_YZ_SkewZ;
200
204
205 NTracksX = fTrackEvent->GetNumberOfTracks("X");
206 NTracksY = fTrackEvent->GetNumberOfTracks("Y");
207
209 for (int tck = 0; tck < fTrackEvent->GetNumberOfTracks(); tck++) {
210 if (!fTrackEvent->isTopLevel(tck)) continue;
211
212 TRestTrack* t = fTrackEvent->GetTrack(tck);
213
214 if (t->isXZ()) {
215 XZ_NHitsX[t->GetTrackID()] = t->GetNumberOfHits();
216 XZ_EnergyX[t->GetTrackID()] = t->GetTrackEnergy();
217 XZ_SigmaX[t->GetTrackID()] = t->GetHits()->GetSigmaX();
218 XZ_SigmaZ[t->GetTrackID()] = t->GetHits()->GetSigmaZ2();
219 XZ_GaussSigmaX[t->GetTrackID()] = t->GetHits()->GetGaussSigmaX();
220 XZ_GaussSigmaZ[t->GetTrackID()] = t->GetHits()->GetGaussSigmaZ();
221 XZ_LengthX[t->GetTrackID()] = t->GetLength();
222 XZ_VolumeX[t->GetTrackID()] = t->GetVolume();
223 XZ_MeanX[t->GetTrackID()] = t->GetMeanPosition().X();
224 XZ_MeanZ[t->GetTrackID()] = t->GetMeanPosition().Z();
225 XZ_SkewZ[t->GetTrackID()] = t->GetHits()->GetSkewZ();
226
227 YZ_NHitsY[t->GetTrackID()] = 0;
228 YZ_EnergyY[t->GetTrackID()] = 0;
229 YZ_SigmaY[t->GetTrackID()] = 0;
230 YZ_SigmaZ[t->GetTrackID()] = 0;
231 YZ_GaussSigmaY[t->GetTrackID()] = 0;
232 YZ_GaussSigmaZ[t->GetTrackID()] = 0;
233 YZ_LengthY[t->GetTrackID()] = 0;
234 YZ_VolumeY[t->GetTrackID()] = 0;
235 YZ_MeanY[t->GetTrackID()] = 0;
236 YZ_MeanZ[t->GetTrackID()] = 0;
237 YZ_SkewZ[t->GetTrackID()] = 0;
238 } else if (t->isYZ()) {
239 XZ_NHitsX[t->GetTrackID()] = 0;
240 XZ_EnergyX[t->GetTrackID()] = 0;
241 XZ_SigmaX[t->GetTrackID()] = 0;
242 XZ_SigmaZ[t->GetTrackID()] = 0;
243 XZ_GaussSigmaX[t->GetTrackID()] = 0;
244 XZ_GaussSigmaZ[t->GetTrackID()] = 0;
245 XZ_LengthX[t->GetTrackID()] = 0;
246 XZ_VolumeX[t->GetTrackID()] = 0;
247 XZ_MeanX[t->GetTrackID()] = 0;
248 XZ_MeanZ[t->GetTrackID()] = 0;
249 XZ_SkewZ[t->GetTrackID()] = 0;
250
251 YZ_NHitsY[t->GetTrackID()] = t->GetNumberOfHits();
252 YZ_EnergyY[t->GetTrackID()] = t->GetTrackEnergy();
253 YZ_SigmaY[t->GetTrackID()] = t->GetHits()->GetSigmaY();
254 YZ_SigmaZ[t->GetTrackID()] = t->GetHits()->GetSigmaZ2();
255 YZ_GaussSigmaY[t->GetTrackID()] = t->GetHits()->GetGaussSigmaY();
256 YZ_GaussSigmaZ[t->GetTrackID()] = t->GetHits()->GetGaussSigmaZ();
257 YZ_LengthY[t->GetTrackID()] = t->GetLength();
258 YZ_VolumeY[t->GetTrackID()] = t->GetVolume();
259 YZ_MeanY[t->GetTrackID()] = t->GetMeanPosition().Y();
260 YZ_MeanZ[t->GetTrackID()] = t->GetMeanPosition().Z();
261 YZ_SkewZ[t->GetTrackID()] = t->GetHits()->GetSkewZ();
262 } else {
263 XZ_EnergyX[t->GetTrackID()] = 0;
264 XZ_SigmaX[t->GetTrackID()] = 0;
265 XZ_SigmaZ[t->GetTrackID()] = 0;
266 XZ_GaussSigmaX[t->GetTrackID()] = 0;
267 XZ_GaussSigmaZ[t->GetTrackID()] = 0;
268 XZ_LengthX[t->GetTrackID()] = 0;
269 XZ_VolumeX[t->GetTrackID()] = 0;
270 XZ_MeanX[t->GetTrackID()] = 0;
271 XZ_MeanZ[t->GetTrackID()] = 0;
272 XZ_SkewZ[t->GetTrackID()] = 0;
273
274 YZ_EnergyY[t->GetTrackID()] = 0;
275 YZ_SigmaY[t->GetTrackID()] = 0;
276 YZ_SigmaZ[t->GetTrackID()] = 0;
277 YZ_GaussSigmaY[t->GetTrackID()] = 0;
278 YZ_GaussSigmaZ[t->GetTrackID()] = 0;
279 YZ_LengthY[t->GetTrackID()] = 0;
280 YZ_VolumeY[t->GetTrackID()] = 0;
281 YZ_MeanY[t->GetTrackID()] = 0;
282 YZ_MeanZ[t->GetTrackID()] = 0;
283 YZ_SkewZ[t->GetTrackID()] = 0;
284 }
285 }
286
288 vector<pair<int, Double_t>> energiesX;
289 vector<pair<int, Double_t>> energiesY;
290
292 map<int, Double_t>::iterator it;
293 for (it = XZ_EnergyX.begin(); it != XZ_EnergyX.end(); it++) {
294 energiesX.push_back(make_pair(it->first, it->second));
295 }
296 for (it = YZ_EnergyY.begin(); it != YZ_EnergyY.end(); it++) {
297 energiesY.push_back(make_pair(it->first, it->second));
298 }
299
301 sort(energiesX.begin(), energiesX.end(), sortByValueDescending);
302 sort(energiesY.begin(), energiesY.end(), sortByValueDescending);
303
305 for (int i = 0; i < min(NTracksX, NTracksY); i++) {
306 XZ_YZ_SigmaXYBalance[i] = (XZ_SigmaX[energiesX[i].first] - YZ_SigmaY[energiesY[i].first]) /
307 (XZ_SigmaX[energiesX[i].first] + YZ_SigmaY[energiesY[i].first]);
308 XZ_YZ_SigmaZBalance[i] = (XZ_SigmaZ[energiesX[i].first] - YZ_SigmaZ[energiesY[i].first]) /
309 (XZ_SigmaZ[energiesX[i].first] + YZ_SigmaZ[energiesY[i].first]);
310 XZ_YZ_GaussSigmaXYBalance[i] =
311 (XZ_GaussSigmaX[energiesX[i].first] - YZ_GaussSigmaY[energiesY[i].first]) /
312 (XZ_GaussSigmaX[energiesX[i].first] + YZ_GaussSigmaY[energiesY[i].first]);
313 XZ_YZ_GaussSigmaZBalance[i] =
314 (XZ_GaussSigmaZ[energiesX[i].first] - YZ_GaussSigmaZ[energiesY[i].first]) /
315 (XZ_GaussSigmaZ[energiesX[i].first] + YZ_GaussSigmaZ[energiesY[i].first]);
316 }
317
319 if (fTrackEvent->GetNumberOfTracks() > 1) {
320 Double_t dXz = 0, dxZ = 0, dYz = 0, dyZ = 0;
321
322 dXz = abs(XZ_MeanX[energiesX[0].first] - XZ_MeanX[energiesX[1].first]);
323 dxZ = abs(XZ_MeanZ[energiesX[0].first] - XZ_MeanZ[energiesX[1].first]);
324
325 dYz = abs(YZ_MeanY[energiesY[0].first] - YZ_MeanY[energiesY[1].first]);
326 dyZ = abs(YZ_MeanZ[energiesY[0].first] - YZ_MeanZ[energiesY[1].first]);
327
328 XZ_FirstSecondTracksDistanceXZ = TMath::Sqrt(dXz * dXz + dxZ * dxZ);
329 YZ_FirstSecondTracksDistanceYZ = TMath::Sqrt(dYz * dYz + dyZ * dyZ);
330 } else {
331 XZ_FirstSecondTracksDistanceXZ = 0;
332 YZ_FirstSecondTracksDistanceYZ = 0;
333 }
334
336 XZ_TotalEnergyX = 0;
337 YZ_TotalEnergyY = 0;
338
339 for (auto pair : energiesX) {
340 XZ_TotalEnergyX += pair.second;
341 }
342 for (auto pair : energiesY) {
343 YZ_TotalEnergyY += pair.second;
344 }
345
347 TRestHits hits;
348 TRestHits* hitsXZ = nullptr;
349 TRestHits* hitsYZ = nullptr;
350 if (fTrackEvent->GetMaxEnergyTrack("X")) hitsXZ = fTrackEvent->GetMaxEnergyTrack("X")->GetHits();
351 if (fTrackEvent->GetMaxEnergyTrack("Y")) hitsYZ = fTrackEvent->GetMaxEnergyTrack("Y")->GetHits();
352
353 auto hitsBoth = {hitsXZ, hitsYZ};
354
355 for (auto arg : hitsBoth) {
356 if (arg == nullptr) continue;
357 for (unsigned int n = 0; n < arg->GetNumberOfHits(); n++) {
358 // your code in the existing loop, replacing `hits` by `arg`
359 Double_t eDep = arg->GetEnergy(n);
360 Double_t x = arg->GetX(n);
361 Double_t y = arg->GetY(n);
362 Double_t z = arg->GetZ(n);
363 auto time = arg->GetTime(n);
364 auto type = arg->GetType(n);
365
366 hits.AddHit({x, y, z}, eDep, time, type);
367 }
368 }
369
370 MaxTrack_XZ_YZ_SigmaZ = hits.GetSigmaZ2();
371 MaxTrack_XZ_YZ_GaussSigmaZ = hits.GetGaussSigmaZ();
372 MaxTrack_XZ_YZ_SkewXY = hits.GetSkewXY();
373 MaxTrack_XZ_YZ_SkewZ = hits.GetSkewZ();
374
378
379 // --- Number of tracks and energy --- //
380 SetObservableValue("NTracks", fTrackEvent->GetNumberOfTracks());
381 SetObservableValue("NTracksX", NTracksX);
382 SetObservableValue("NTracksY", NTracksY);
383 SetObservableValue("TotalEnergy", fTrackEvent->GetEnergy());
384 SetObservableValue("XZ_TotalEnergyX", XZ_TotalEnergyX);
385 SetObservableValue("YZ_TotalEnergyY", YZ_TotalEnergyY);
386
387 // --- Map observables --- //
388 SetObservableValue("Map_XZ_NHitsX", XZ_NHitsX);
389 SetObservableValue("Map_XZ_EnergyX", XZ_EnergyX);
390 SetObservableValue("Map_XZ_SigmaX", XZ_SigmaX);
391 SetObservableValue("Map_XZ_SigmaZ", XZ_SigmaZ);
392 SetObservableValue("Map_XZ_GaussSigmaX", XZ_GaussSigmaX);
393 SetObservableValue("Map_XZ_GaussSigmaZ", XZ_GaussSigmaZ);
394 SetObservableValue("Map_XZ_LengthX", XZ_LengthX);
395 SetObservableValue("Map_XZ_VolumeX", XZ_VolumeX);
396 SetObservableValue("Map_XZ_MeanX", XZ_MeanX);
397 SetObservableValue("Map_XZ_MeanZ", XZ_MeanZ);
398 SetObservableValue("Map_XZ_SkewZ", XZ_SkewZ);
399
400 SetObservableValue("Map_YZ_NHitsY", YZ_NHitsY);
401 SetObservableValue("Map_YZ_EnergyY", YZ_EnergyY);
402 SetObservableValue("Map_YZ_SigmaY", YZ_SigmaY);
403 SetObservableValue("Map_YZ_SigmaZ", YZ_SigmaZ);
404 SetObservableValue("Map_YZ_GaussSigmaY", YZ_GaussSigmaY);
405 SetObservableValue("Map_YZ_GaussSigmaZ", YZ_GaussSigmaZ);
406 SetObservableValue("Map_YZ_LengthY", YZ_LengthY);
407 SetObservableValue("Map_YZ_VolumeY", YZ_VolumeY);
408 SetObservableValue("Map_YZ_MeanY", YZ_MeanY);
409 SetObservableValue("Map_YZ_MeanZ", YZ_MeanZ);
410 SetObservableValue("Map_YZ_SkewZ", YZ_SkewZ);
411
412 SetObservableValue("Map_XZ_YZ_SigmaXYBalance", XZ_YZ_SigmaXYBalance);
413 SetObservableValue("Map_XZ_YZ_SigmaZBalance", XZ_YZ_SigmaZBalance);
414 SetObservableValue("Map_XZ_YZ_GaussSigmaXYBalance", XZ_YZ_GaussSigmaXYBalance);
415 SetObservableValue("Map_XZ_YZ_GaussSigmaZBalance", XZ_YZ_GaussSigmaZBalance);
416
417 // --- Max track observables --- //
418 SetObservableValue("MaxTrack_XZ_NHitsX", XZ_NHitsX[energiesX[0].first]);
419 SetObservableValue("MaxTrack_XZ_EnergyX", XZ_EnergyX[energiesX[0].first]);
420 SetObservableValue("MaxTrack_XZ_SigmaX", XZ_SigmaX[energiesX[0].first]);
421 SetObservableValue("MaxTrack_XZ_SigmaZ", XZ_SigmaZ[energiesX[0].first]);
422 SetObservableValue("MaxTrack_XZ_GaussSigmaX", XZ_GaussSigmaX[energiesX[0].first]);
423 SetObservableValue("MaxTrack_XZ_GaussSigmaZ", XZ_GaussSigmaZ[energiesX[0].first]);
424 SetObservableValue("MaxTrack_XZ_LengthX", XZ_LengthX[energiesX[0].first]);
425 SetObservableValue("MaxTrack_XZ_VolumeX", XZ_VolumeX[energiesX[0].first]);
426 SetObservableValue("MaxTrack_XZ_MeanX", XZ_MeanX[energiesX[0].first]);
427 SetObservableValue("MaxTrack_XZ_MeanZ", XZ_MeanZ[energiesX[0].first]);
428 SetObservableValue("MaxTrack_XZ_SkewZ", XZ_SkewZ[energiesX[0].first]);
429
430 SetObservableValue("MaxTrack_YZ_NHitsY", YZ_NHitsY[energiesY[0].first]);
431 SetObservableValue("MaxTrack_YZ_EnergyY", YZ_EnergyY[energiesY[0].first]);
432 SetObservableValue("MaxTrack_YZ_SigmaY", YZ_SigmaY[energiesY[0].first]);
433 SetObservableValue("MaxTrack_YZ_SigmaZ", YZ_SigmaZ[energiesY[0].first]);
434 SetObservableValue("MaxTrack_YZ_GaussSigmaY", YZ_GaussSigmaY[energiesY[0].first]);
435 SetObservableValue("MaxTrack_YZ_GaussSigmaZ", YZ_GaussSigmaZ[energiesY[0].first]);
436 SetObservableValue("MaxTrack_YZ_LengthY", YZ_LengthY[energiesY[0].first]);
437 SetObservableValue("MaxTrack_YZ_VolumeY", YZ_VolumeY[energiesY[0].first]);
438 SetObservableValue("MaxTrack_YZ_MeanY", YZ_MeanY[energiesY[0].first]);
439 SetObservableValue("MaxTrack_YZ_MeanZ", YZ_MeanZ[energiesY[0].first]);
440 SetObservableValue("MaxTrack_YZ_SkewZ", YZ_SkewZ[energiesY[0].first]);
441
442 SetObservableValue("MaxTrack_XZ_YZ_SigmaXYBalance", XZ_YZ_SigmaXYBalance[0]);
443 SetObservableValue("MaxTrack_XZ_YZ_SigmaZBalance", XZ_YZ_SigmaZBalance[0]);
444 SetObservableValue("MaxTrack_XZ_YZ_GaussSigmaXYBalance", XZ_YZ_GaussSigmaXYBalance[0]);
445 SetObservableValue("MaxTrack_XZ_YZ_GaussSigmaZBalance", XZ_YZ_GaussSigmaZBalance[0]);
446
447 SetObservableValue("MaxTrack_XZ_YZ_Energy", energiesX[0].second + energiesY[0].second);
448 SetObservableValue("MaxTrack_XZ_YZ_MaxTrackEnergyPercentage",
449 (energiesX[0].second + energiesY[0].second) / fTrackEvent->GetEnergy());
450 SetObservableValue("MaxTrack_XZ_YZ_EnergyBalanceXY", (energiesX[0].second - energiesY[0].second) /
451 (energiesX[0].second + energiesY[0].second));
452
453 // --- Second max track observables --- //
454 SetObservableValue("SecondMaxTrack_XZ_NHitsX", XZ_NHitsX[energiesX[1].first]);
455 SetObservableValue("SecondMaxTrack_XZ_EnergyX", XZ_EnergyX[energiesX[1].first]);
456 SetObservableValue("SecondMaxTrack_XZ_SigmaX", XZ_SigmaX[energiesX[1].first]);
457 SetObservableValue("SecondMaxTrack_XZ_SigmaZ", XZ_SigmaZ[energiesX[1].first]);
458 SetObservableValue("SecondMaxTrack_XZ_GaussSigmaX", XZ_GaussSigmaX[energiesX[1].first]);
459 SetObservableValue("SecondMaxTrack_XZ_GaussSigmaZ", XZ_GaussSigmaZ[energiesX[1].first]);
460 SetObservableValue("SecondMaxTrack_XZ_LengthX", XZ_LengthX[energiesX[1].first]);
461 SetObservableValue("SecondMaxTrack_XZ_VolumeX", XZ_VolumeX[energiesX[1].first]);
462 SetObservableValue("SecondMaxTrack_XZ_MeanX", XZ_MeanX[energiesX[1].first]);
463 SetObservableValue("SecondMaxTrack_XZ_MeanZ", XZ_MeanZ[energiesX[1].first]);
464 SetObservableValue("SecondMaxTrack_XZ_SkewZ", XZ_SkewZ[energiesX[1].first]);
465
466 SetObservableValue("SecondMaxTrack_YZ_NHitsY", YZ_NHitsY[energiesY[1].first]);
467 SetObservableValue("SecondMaxTrack_YZ_EnergyY", YZ_EnergyY[energiesY[1].first]);
468 SetObservableValue("SecondMaxTrack_YZ_SigmaY", YZ_SigmaY[energiesY[1].first]);
469 SetObservableValue("SecondMaxTrack_YZ_SigmaZ", YZ_SigmaZ[energiesY[1].first]);
470 SetObservableValue("SecondMaxTrack_YZ_GaussSigmaY", YZ_GaussSigmaY[energiesY[1].first]);
471 SetObservableValue("SecondMaxTrack_YZ_GaussSigmaZ", YZ_GaussSigmaZ[energiesY[1].first]);
472 SetObservableValue("SecondMaxTrack_YZ_LengthY", YZ_LengthY[energiesY[1].first]);
473 SetObservableValue("SecondMaxTrack_YZ_VolumeY", YZ_VolumeY[energiesY[1].first]);
474 SetObservableValue("SecondMaxTrack_YZ_MeanY", YZ_MeanY[energiesY[1].first]);
475 SetObservableValue("SecondMaxTrack_YZ_MeanZ", YZ_MeanZ[energiesY[1].first]);
476 SetObservableValue("SecondMaxTrack_YZ_SkewZ", YZ_SkewZ[energiesY[1].first]);
477
478 SetObservableValue("SecondMaxTrack_XZ_YZ_SigmaXYBalance", XZ_YZ_SigmaXYBalance[1]);
479 SetObservableValue("SecondMaxTrack_XZ_YZ_SigmaZBalance", XZ_YZ_SigmaZBalance[1]);
480 SetObservableValue("SecondMaxTrack_XZ_YZ_GaussSigmaXYBalance", XZ_YZ_GaussSigmaXYBalance[1]);
481 SetObservableValue("SecondMaxTrack_XZ_YZ_GaussSigmaZBalance", XZ_YZ_GaussSigmaZBalance[1]);
482
483 if (fTrackEvent->GetNumberOfTracks() > 1) {
484 SetObservableValue("SecondMaxTrack_XZ_YZ_Energy", energiesX[1].second + energiesY[1].second);
485 SetObservableValue("SecondMaxTrack_XZ_YZ_EnergyPercentage",
486 (energiesX[1].second + energiesY[1].second) / fTrackEvent->GetEnergy());
488 "SecondMaxTrack_XZ_YZ_EnergyBalanceXY",
489 (energiesX[1].second - energiesY[1].second) / (energiesX[1].second + energiesY[1].second));
490 } else {
491 SetObservableValue("SecondMaxTrack_XZ_YZ_Energy", 0);
492 SetObservableValue("SecondMaxTrack_XZ_YZ_EnergyPercentage", 0);
493 SetObservableValue("SecondMaxTrack_XZ_YZ_EnergyBalanceXY", 0);
494 }
495
496 // --- Distance obsevables between first two tracks --- //
497 SetObservableValue("XZ_FirstSecondTracksDistanceXZ", XZ_FirstSecondTracksDistanceXZ);
498 SetObservableValue("YZ_FirstSecondTracksDistanceYZ", YZ_FirstSecondTracksDistanceYZ);
499 SetObservableValue("XZ_YZ_FirstSecondTracksDistanceSum",
500 TMath::Sqrt(XZ_FirstSecondTracksDistanceXZ * XZ_FirstSecondTracksDistanceXZ +
501 YZ_FirstSecondTracksDistanceYZ * YZ_FirstSecondTracksDistanceYZ));
502
503 // --- Observables merging max tracks XZ and YZ --- //
504 SetObservableValue("MaxTrack_XZ_YZ_SigmaZ", MaxTrack_XZ_YZ_SigmaZ);
505 SetObservableValue("MaxTrack_XZ_YZ_GaussSigmaZ", MaxTrack_XZ_YZ_GaussSigmaZ);
506 SetObservableValue("MaxTrack_XZ_YZ_SkewXY", MaxTrack_XZ_YZ_SkewXY);
507 SetObservableValue("MaxTrack_XZ_YZ_SkewZ", MaxTrack_XZ_YZ_SkewZ);
508
509 return fTrackEvent;
510}
511
513 // Function to be executed once at the end of the process
514 // (after all events have been processed)
515
516 // Start by calling the EndProcess function of the abstract class.
517 // Comment this if you don't want it.
518 // TRestEventProcess::EndProcess();
519}
520
void SetObservableValue(const std::string &name, const T &value)
Set observable value for AnalysisTree.
A base class for any REST event.
Definition: TRestEvent.h:38
It saves a 3-coordinate position and an energy for each punctual deposition.
Definition: TRestHits.h:39
Double_t GetSkewXY() const
It returns the 2-dimensional skewness on the XY-plane which is a measure of the hits distribution asy...
Definition: TRestHits.cxx:979
Double_t GetGaussSigmaX(Double_t error=150.0, Int_t nHitsMin=100000)
It computes the gaussian sigma in the X-coordinate. It adds a hit to the right and a hit to the left,...
Definition: TRestHits.cxx:762
Double_t GetSigmaX() const
It calculates the hits standard deviation in the X-coordinate.
Definition: TRestHits.cxx:685
Double_t GetGaussSigmaZ(Double_t error=150.0, Int_t nHitsMin=100000)
It computes the gaussian sigma in the Z-coordinate. It adds a hit to the right and a hit to the left,...
Definition: TRestHits.cxx:907
void AddHit(const TVector3 &position, Double_t energy, Double_t time=0, REST_HitType type=XYZ)
Adds a new hit to the list of hits using a TVector3.
Definition: TRestHits.cxx:345
Double_t GetGaussSigmaY(Double_t error=150.0, Int_t nHitsMin=100000)
It computes the gaussian sigma in the Y-coordinate. It adds a hit to the right and a hit to the left,...
Definition: TRestHits.cxx:836
Double_t GetSigmaZ2() const
It returns the hits distribution variance on the Z-axis.
Definition: TRestHits.cxx:997
Double_t GetSkewZ() const
It returns the hits distribution skewness, or asymmetry on the Z-axis.
Definition: TRestHits.cxx:1013
Double_t GetSigmaY() const
It calculates the hits standard deviation in the Y-coordinate.
Definition: TRestHits.cxx:703
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
An analysis REST process to extract valuable information from Track type of data.
TRestEvent * ProcessEvent(TRestEvent *inputEvent) override
Process one event.
void InitFromConfigFile() override
To make settings from rml file. This method must be implemented in the derived class.
void InitProcess() override
To be executed at the beginning of the run (outside event loop)
void EndProcess() override
To be executed at the end of the run (outside event loop)
void Initialize() override
Making default settings.