100#include "TRestTrack2DAnalysisProcess.h"
104bool sortByValueDescending(
const std::pair<int, Double_t>& a,
const std::pair<int, Double_t>& b) {
105 return a.second > b.second;
110TRestTrack2DAnalysisProcess::TRestTrack2DAnalysisProcess() {
Initialize(); }
112TRestTrack2DAnalysisProcess::TRestTrack2DAnalysisProcess(
const char* configFilename) {
117TRestTrack2DAnalysisProcess::~TRestTrack2DAnalysisProcess() {
delete fTrackEvent; }
119void TRestTrack2DAnalysisProcess::LoadDefaultConfig() { SetTitle(
"Default config"); }
128void TRestTrack2DAnalysisProcess::LoadConfig(
const string& configFilename,
const string& name) {
142 Double_t XZ_TotalEnergyX;
143 Double_t YZ_TotalEnergyY;
151 map<int, Double_t> XZ_EnergyX;
152 map<int, Double_t> YZ_EnergyY;
155 map<int, int> XZ_NHitsX;
156 map<int, int> YZ_NHitsY;
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;
164 map<int, Double_t> XZ_YZ_SigmaXYBalance;
165 map<int, Double_t> XZ_YZ_SigmaZBalance;
167 map<int, Double_t> XZ_SkewZ;
168 map<int, Double_t> YZ_SkewZ;
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;
176 map<int, Double_t> XZ_YZ_GaussSigmaXYBalance;
177 map<int, Double_t> XZ_YZ_GaussSigmaZBalance;
180 map<int, Double_t> XZ_LengthX;
181 map<int, Double_t> YZ_LengthY;
183 map<int, Double_t> XZ_VolumeX;
184 map<int, Double_t> YZ_VolumeY;
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;
192 Double_t XZ_FirstSecondTracksDistanceXZ;
193 Double_t YZ_FirstSecondTracksDistanceYZ;
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;
205 NTracksX = fTrackEvent->GetNumberOfTracks(
"X");
206 NTracksY = fTrackEvent->GetNumberOfTracks(
"Y");
209 for (
int tck = 0; tck < fTrackEvent->GetNumberOfTracks(); tck++) {
210 if (!fTrackEvent->isTopLevel(tck))
continue;
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();
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();
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;
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();
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();
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;
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;
288 vector<pair<int, Double_t>> energiesX;
289 vector<pair<int, Double_t>> energiesY;
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));
296 for (it = YZ_EnergyY.begin(); it != YZ_EnergyY.end(); it++) {
297 energiesY.push_back(make_pair(it->first, it->second));
301 sort(energiesX.begin(), energiesX.end(), sortByValueDescending);
302 sort(energiesY.begin(), energiesY.end(), sortByValueDescending);
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]);
319 if (fTrackEvent->GetNumberOfTracks() > 1) {
320 Double_t dXz = 0, dxZ = 0, dYz = 0, dyZ = 0;
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]);
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]);
328 XZ_FirstSecondTracksDistanceXZ = TMath::Sqrt(dXz * dXz + dxZ * dxZ);
329 YZ_FirstSecondTracksDistanceYZ = TMath::Sqrt(dYz * dYz + dyZ * dyZ);
331 XZ_FirstSecondTracksDistanceXZ = 0;
332 YZ_FirstSecondTracksDistanceYZ = 0;
339 for (
auto pair : energiesX) {
340 XZ_TotalEnergyX += pair.second;
342 for (
auto pair : energiesY) {
343 YZ_TotalEnergyY += pair.second;
350 if (fTrackEvent->GetMaxEnergyTrack(
"X")) hitsXZ = fTrackEvent->GetMaxEnergyTrack(
"X")->GetHits();
351 if (fTrackEvent->GetMaxEnergyTrack(
"Y")) hitsYZ = fTrackEvent->GetMaxEnergyTrack(
"Y")->GetHits();
353 auto hitsBoth = {hitsXZ, hitsYZ};
355 for (
auto arg : hitsBoth) {
356 if (arg ==
nullptr)
continue;
357 for (
unsigned int n = 0; n < arg->GetNumberOfHits(); n++) {
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);
366 hits.
AddHit({x, y, z}, eDep, time, type);
372 MaxTrack_XZ_YZ_SkewXY = hits.
GetSkewXY();
373 MaxTrack_XZ_YZ_SkewZ = hits.
GetSkewZ();
444 SetObservableValue(
"MaxTrack_XZ_YZ_GaussSigmaXYBalance", XZ_YZ_GaussSigmaXYBalance[0]);
447 SetObservableValue(
"MaxTrack_XZ_YZ_Energy", energiesX[0].second + energiesY[0].second);
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));
458 SetObservableValue(
"SecondMaxTrack_XZ_GaussSigmaX", XZ_GaussSigmaX[energiesX[1].first]);
459 SetObservableValue(
"SecondMaxTrack_XZ_GaussSigmaZ", XZ_GaussSigmaZ[energiesX[1].first]);
470 SetObservableValue(
"SecondMaxTrack_YZ_GaussSigmaY", YZ_GaussSigmaY[energiesY[1].first]);
471 SetObservableValue(
"SecondMaxTrack_YZ_GaussSigmaZ", YZ_GaussSigmaZ[energiesY[1].first]);
480 SetObservableValue(
"SecondMaxTrack_XZ_YZ_GaussSigmaXYBalance", XZ_YZ_GaussSigmaXYBalance[1]);
481 SetObservableValue(
"SecondMaxTrack_XZ_YZ_GaussSigmaZBalance", XZ_YZ_GaussSigmaZBalance[1]);
483 if (fTrackEvent->GetNumberOfTracks() > 1) {
484 SetObservableValue(
"SecondMaxTrack_XZ_YZ_Energy", energiesX[1].second + energiesY[1].second);
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));
500 TMath::Sqrt(XZ_FirstSecondTracksDistanceXZ * XZ_FirstSecondTracksDistanceXZ +
501 YZ_FirstSecondTracksDistanceYZ * YZ_FirstSecondTracksDistanceYZ));
void SetObservableValue(const std::string &name, const T &value)
Set observable value for AnalysisTree.
A base class for any REST event.
It saves a 3-coordinate position and an energy for each punctual deposition.
Double_t GetSkewXY() const
It returns the 2-dimensional skewness on the XY-plane which is a measure of the hits distribution asy...
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,...
Double_t GetSigmaX() const
It calculates the hits standard deviation in the X-coordinate.
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,...
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.
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,...
Double_t GetSigmaZ2() const
It returns the hits distribution variance on the Z-axis.
Double_t GetSkewZ() const
It returns the hits distribution skewness, or asymmetry on the Z-axis.
Double_t GetSigmaY() const
It calculates the hits standard deviation in the Y-coordinate.
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.