HighLAND
numuCCMultiPiAnalysis.cxx
1 #include "numuCCMultiPiAnalysis.hxx"
2 #include "Parameters.hxx"
3 #include "numuCCMultiPiFGD2Selection.hxx"
4 #include "oaAnalysisTreeConverter.hxx"
5 #include "CategoriesUtils.hxx"
6 #include "BasicUtils.hxx"
7 
8 const bool DEBUG = false; // debugging flag for FillTruthTree (increases verbosity)
9 
10 const unsigned int NMAXTPCSEC = 20;
11 const unsigned int NMAXFGDSEC = 20;
12 const unsigned int NMAXTPC1 = 20;
13 
14 //********************************************************************
15 numuCCMultiPiAnalysis::numuCCMultiPiAnalysis(AnalysisAlgorithm* ana) : baseTrackerAnalysis(ana){
16 //********************************************************************
17 
18  // Add the package version
19  ND::versioning().AddPackage("numuCCMultiPiAnalysis", anaUtils::GetSoftwareVersionFromPath((std::string)getenv("NUMUCCMULTIPIANALYSISROOT")));
20 
21  // Create a numuCCAnalysis passing this analysis to the constructor. In that way the same managers are used
22  _numuCCAnalysis = new numuCCAnalysis(this);
23 
24  // Use the numuCCAnalysis (in practice that means that the same box and event will be used for the numuCCAnalysis as for this analysis)
25  UseAnalysis(_numuCCAnalysis);
26 }
27 
28 //********************************************************************
30 //********************************************************************
31 
32  // Initialize the numuCCAnalysis
33  if (!_numuCCAnalysis->Initialize()) return false;
34 
35  // Minimum accum level to save event into the output tree
36  SetMinAccumCutLevelToSave(ND::params().GetParameterI("numuCCMultiPiAnalysis.MinAccumLevelToSave"));
37 
38  // which analysis: FGD1, FGD2 or FGDs
39  _whichFGD = ND::params().GetParameterI("numuCCMultiPiAnalysis.Selections.whichFGD");
40  if (_whichFGD == 3) {
41  std::cout << "----------------------------------------------------" << std::endl;
42  std::cout << "WARNING: only for events with accum_level > 5 the vars in the output microtree will surely refer to the muon candidate in that FGD" << std::endl;
43  std::cout << "----------------------------------------------------" << std::endl;
44  }
45 
46  // Select the FGD
47  if (_whichFGD == 1) _fgdID = SubDetId::kFGD1;
48  if (_whichFGD == 2) _fgdID = SubDetId::kFGD2;
49  if (_whichFGD > 2) _fgdID = SubDetId::kFGD;
50 
51  // Add Pion SI info to the micro-trees
52  _addPionSIinfo = (bool)ND::params().GetParameterI("numuCCMultiPiAnalysis.MicroTrees.AddPionSIinfo");
53 
54  return true;
55 }
56 
57 //********************************************************************
58 void numuCCMultiPiAnalysis::DefineSelections(){
59 //********************************************************************
60 
61  // Add the selection to the Selection Manager
62  if (_whichFGD==1) // FGD1
63  sel().AddSelection("kTrackerNumuCCMultiPi", "numuCC multi-pionselection", new numuCCMultiPiSelection());
64  else if (_whichFGD==2) // FGD2
65  sel().AddSelection("kTrackerNumuCCMultiPiFGD2", "numuCCFGD2 multi-pionselection", new numuCCMultiPiFGD2Selection());
66  else if (_whichFGD==3) { // both FGDs, in 2 selections
67  sel().AddSelection("kTrackerNumuCCMultiPi", "numuCC multi-pionselection", new numuCCMultiPiSelection());
68  sel().AddSelection("kTrackerNumuCCMultiPiFGD2", "numuCCFGD2 multi-pionselection", new numuCCMultiPiFGD2Selection());
69  }
70 }
71 
72 //********************************************************************
73 void numuCCMultiPiAnalysis::DefineMicroTrees(bool addBase){
74 //********************************************************************
75 
76  // -------- Add variables to the analysis tree ----------------------
77 
78  // Variables from the numuCCAnalysis analysis (including the ones in baseTrackerAnalysis by default, otherwise addBase should be false)
79  if (addBase) _numuCCAnalysis->DefineMicroTrees(addBase);
80 
81  // --- Add here more variables for the CCMultiPi analysis -----
82 
83  AddVarI(output(),MuonVertexId, "");
84  AddVarI(output(),MuonIndex,"");
85 
86  // --- Pion candidates
87  AddVarVF(output(),NegPionMom,"", NNegPion);
88  AddVarVF(output(),NegPionPidLik,"", NNegPion);
89  AddVarVF(output(),NegPionElPidLik,"", NNegPion);
90  AddVarVI(output(),NegPionTId,"", NNegPion);
91  AddVarVI(output(),NegPionIndex,"", NNegPion);
92  AddVarVI(output(),NegPionParentTId,"", NNegPion);
93  AddVarVI(output(),NegPionGParentTId,"",NNegPion);
94  AddVarVI(output(),NegPionVId,"", NNegPion);
95  AddVarMF(output(),NegPionDir,"", NNegPion,-NMAXTPCSEC,3);
96  AddVarMF(output(),NegPionPosStart,"", NNegPion,-NMAXTPCSEC,3);
97  AddVarMF(output(),NegPionPosEnd,"", NNegPion,-NMAXTPCSEC,3);
98 
99  AddToyVarVF(output(),PosPionMom,"", NPosPion);
100  AddToyVarVF(output(),PosPionTheta,"", NPosPion);
101  AddVarVF(output(),PosPionPidLik,"", NPosPion);
102  AddVarVF(output(),PosPionElPidLik,"", NPosPion);
103  AddVarVI(output(),PosPionTId,"", NPosPion);
104  AddVarVI(output(),PosPionIndex,"", NPosPion);
105  AddVarVI(output(),PosPionParentTId,"", NPosPion);
106  AddVarVI(output(),PosPionGParentTId,"",NPosPion);
107  AddVarVI(output(),PosPionVId,"", NPosPion);
108  AddVarMF(output(),PosPionDir,"", NPosPion,-NMAXTPCSEC,3);
109  AddVarMF(output(),PosPionPosStart,"", NPosPion,-NMAXTPCSEC,3);
110  AddVarMF(output(),PosPionPosEnd,"", NPosPion,-NMAXTPCSEC,3);
111 
112  // --- Pi0 candidates
113  AddVarVF(output(),Pi0ElMom,"", NPi0El);
114  AddVarVF(output(),Pi0ElPull,"", NPi0El);
115  AddVarVI(output(),Pi0ElTId,"", NPi0El);
116  AddVarVI(output(),Pi0ElIndex,"", NPi0El);
117  AddVarVI(output(),Pi0ElParentTId,"", NPi0El);
118  AddVarVI(output(),Pi0ElGParentTId,"",NPi0El);
119  AddVarVI(output(),Pi0ElVId,"", NPi0El);
120  AddVarMF(output(),Pi0ElDir,"", NPi0El,-NMAXTPCSEC,3);
121  AddVarMF(output(),Pi0ElPosStart,"", NPi0El,-NMAXTPCSEC,3);
122  AddVarMF(output(),Pi0ElPosEnd,"", NPi0El,-NMAXTPCSEC,3);
123 
124  AddVarVF(output(),Pi0PosMom,"", NPi0Pos);
125  AddVarVF(output(),Pi0PosPull,"", NPi0Pos);
126  AddVarVI(output(),Pi0PosTId,"", NPi0Pos);
127  AddVarVI(output(),Pi0PosIndex,"", NPi0Pos);
128  AddVarVI(output(),Pi0PosParentTId,"", NPi0Pos);
129  AddVarVI(output(),Pi0PosGParentTId,"",NPi0Pos);
130  AddVarVI(output(),Pi0PosVId,"", NPi0Pos);
131  AddVarMF(output(),Pi0PosDir,"", NPi0Pos,-NMAXTPCSEC,3);
132  AddVarMF(output(),Pi0PosPosStart,"", NPi0Pos,-NMAXTPCSEC,3);
133  AddVarMF(output(),Pi0PosPosEnd,"", NPi0Pos,-NMAXTPCSEC,3);
134 
135  // --- ALL TPC sec tracks
136  AddVarVF(output(),TPCSecMom,"", NTPCSec);
137  AddVarVF(output(),TPCSecMuPidLik,"", NTPCSec);
138  AddVarVF(output(),TPCSecPiPidLik,"", NTPCSec);
139  AddVarVF(output(),TPCSecPrPidLik,"", NTPCSec);
140  AddVarVF(output(),TPCSecElPidLik,"", NTPCSec);
141  AddVarVI(output(),TPCSecDetectors,"", NTPCSec);
142  AddVarVI(output(),TPCSecQ,"", NTPCSec);
143  AddVarVI(output(),TPCSecTId,"", NTPCSec);
144  AddVarVI(output(),TPCSecIndex,"", NTPCSec);
145  AddVarVI(output(),TPCSecParentTId,"", NTPCSec);
146  AddVarVI(output(),TPCSecGParentTId,"",NTPCSec);
147  AddVarMF(output(),TPCSecDir,"", NTPCSec,-NMAXTPCSEC,3);
148  AddVarMF(output(),TPCSecPosStart,"", NTPCSec,-NMAXTPCSEC,3);
149  AddVarMF(output(),TPCSecPosEnd,"", NTPCSec,-NMAXTPCSEC,3);
150 
151  // ---- IsoFGD Pion tracks -----
152  AddVarVF(output(),FGDPiLength,"", NFGDPi);
153  AddVarVF(output(),FGDPiPiPull,"", NFGDPi);
154  AddVarVF(output(),FGDPiAvgTime,"", NFGDPi);
155  AddVarVF(output(),FGDPiDistance,"", NFGDPi);
156  AddVarVF(output(),FGDPiMuonangle,"", NFGDPi);
157  AddVarVF(output(),FGDPiCosTheta,"", NFGDPi);
158  AddVarVI(output(),FGDPiTId,"", NFGDPi);
159  AddVarVI(output(),FGDPiIndex,"", NFGDPi);
160  AddVarVI(output(),FGDPiParentTId,"", NFGDPi);
161  AddVarVI(output(),FGDPiGParentTId,"", NFGDPi);
162  AddVarVI(output(),FGDPiVId,"", NFGDPi);
163  AddVarMF(output(),FGDPiDir,"", NFGDPi,-NMAXTPCSEC,3);
164  AddVarMF(output(),FGDPiPosStart,"", NFGDPi,-NMAXTPCSEC,3);
165  AddVarMF(output(),FGDPiPosEnd,"", NFGDPi,-NMAXTPCSEC,3);
166  AddVarVF(output(),FGDPiTimeIni,"", NFGDPi);
167  AddVarVF(output(),FGDPiTimeEnd,"", NFGDPi);
168  AddVarVF(output(),FGDPiDeltaTimeIniSelMu,"",NFGDPi);
169  AddVarVF(output(),FGDPiDeltaTimeEndSelMu,"",NFGDPi);
170 
171  // ---- IsoFGD electron and positron tracks -----
172  AddVarVF(output(),FGDElLength,"", NFGDEl);
173  AddVarVF(output(),FGDElPiPull,"", NFGDEl);
174  AddVarVF(output(),FGDElAvgTime,"", NFGDEl);
175  AddVarVI(output(),FGDElTId,"", NFGDEl);
176  AddVarVI(output(),FGDElIndex,"", NFGDEl);
177  AddVarVI(output(),FGDElParentTId,"", NFGDEl);
178  AddVarVI(output(),FGDElGParentTId,"", NFGDEl);
179  AddVarVI(output(),FGDElVId,"", NFGDEl);
180  AddVarVF(output(),FGDElTimeIni,"", NFGDEl);
181  AddVarVF(output(),FGDElTimeEnd,"", NFGDEl);
182  AddVarVF(output(),FGDElDeltaTimeIniSelMu,"",NFGDEl);
183  AddVarVF(output(),FGDElDeltaTimeEndSelMu,"",NFGDEl);
184  AddVarVF(output(),FGDElDistance,"", NFGDEl);
185  AddVarVF(output(),FGDElMuonangle,"", NFGDEl);
186  AddVarVF(output(),FGDElCosTheta,"", NFGDEl);
187  AddVarMF(output(),FGDElDir,"", NFGDEl,-NMAXFGDSEC,3);
188  AddVarMF(output(),FGDElPosStart,"", NFGDEl,-NMAXFGDSEC,3);
189  AddVarMF(output(),FGDElPosEnd,"", NFGDEl,-NMAXFGDSEC,3);
190 
191 
192  // ---- IsoFGD tracks -----
193  AddVarVF(output(),FGDSecLength,"", NFGDSec);
194  AddVarVF(output(),FGDSecPiPull,"", NFGDSec);
195  AddVarVF(output(),FGDSecAvgTime,"", NFGDSec);
196  AddVarVI(output(),FGDSecContained,"", NFGDSec);
197  AddVarVI(output(),FGDSecTId,"", NFGDSec);
198  AddVarVI(output(),FGDSecIndex,"", NFGDSec);
199  AddVarVI(output(),FGDSecParentTId,"", NFGDSec);
200  AddVarVI(output(),FGDSecGParentTId,"", NFGDSec);
201  AddVarVF(output(),FGDSecTimeIni,"", NFGDSec);
202  AddVarVF(output(),FGDSecTimeEnd,"", NFGDSec);
203  AddVarVF(output(),FGDSecDeltaTimeIniSelMu,"",NFGDSec);
204  AddVarVF(output(),FGDSecDeltaTimeEndSelMu,"",NFGDSec);
205  AddVarVF(output(),FGDSecCosTheta,"", NFGDSec);
206  AddVarMF(output(),FGDSecDir,"", NFGDSec,-NMAXFGDSEC,3);
207  AddVarMF(output(),FGDSecPosStart,"", NFGDSec,-NMAXFGDSEC,3);
208  AddVarMF(output(),FGDSecPosEnd,"", NFGDSec,-NMAXFGDSEC,3);
209 
210 
211  // ---- Michel Eletrons ----
212  AddVarVI(output(),MENHits,"", NME);
213  AddVarVF(output(),MERawCharge,"",NME);
214  AddVarVF(output(),MEMinTime,"", NME);
215  AddVarVF(output(),MEMaxTime,"", NME);
216 
217  // ---- TPC1 Tracks ----
218  AddVarVF(output(),TPC1TrackMom,"", NTPC1Track);
219  AddVarVF(output(),TPC1TrackCosTheta,"", NTPC1Track);
220  AddVarVF(output(),TPC1TrackPhi,"", NTPC1Track);
221  AddVarVI(output(),TPC1TrackVId,"", NTPC1Track);
222  AddVarVI(output(),TPC1TrackTId,"", NTPC1Track);
223  AddVarVI(output(),TPC1TrackParentTId,"", NTPC1Track);
224  AddVarVI(output(),TPC1TrackGParentTId,"",NTPC1Track);
225  AddVarMF(output(),TPC1TrackPosStart,"", NTPC1Track,-NMAXTPC1,3);
226  AddVarMF(output(),TPC1TrackPosEnd,"", NTPC1Track,-NMAXTPC1,3);
227 
228  // --- Info to understand Pion SI -----
229  if (_addPionSIinfo){
230  AddVarVI(output(),IntType, "", NInts);
231  AddVarVI(output(),PionType, "", NPions);
232  AddVarVF(output(),PionMom, "", NPions);
233  }
234 
235  //--- true pion variables -------
236  AddVarF( output(), truepi_mom, "true pion momentum");
237  AddVarF( output(), truepi_costheta, "true pion cos(theta)");
238  AddVar3VF(output(), truepi_dir, "true pion direction");
239 }
240 
241 //********************************************************************
242 void numuCCMultiPiAnalysis::DefineTruthTree(){
243 //********************************************************************
244 
245  // Variables from the numuCCAnalysis analysis
246  _numuCCAnalysis->DefineTruthTree();
247 
248  //--- true pion variables -------
249  AddVarF( output(), truepi_mom, "true pion momentum");
250  AddVarF( output(), truepi_costheta, "true pion cos(theta)");
251  AddVar3VF(output(), truepi_dir, "true pion direction");
252 
253 }
254 
255 //********************************************************************
257 //********************************************************************
258 
259  // Variables from the numuCCAnalysis analysis (including the ones in baseTrackerAnalysis by default, otherwise addBase should be false)
260  if (addBase) _numuCCAnalysis->FillMicroTrees(addBase);
261 
262  if (mybox().HMNtrack ) {
263  if( mybox().HMNtrack->TrueObject ){
264  output().FillVar(MuonIndex,mybox().HMNtrack->TrueObject->ID);
265  if( mybox().HMNtrack->GetTrueParticle()->TrueVertex )
266  output().FillVar(MuonVertexId,static_cast<AnaTrueVertex*>(mybox().HMNtrack->GetTrueParticle()->TrueVertex)->RooVtxIndex);
267  }
268  }
269 
270  // --- Fill here more variables for the CCMultiPi analysis -----
271  // Selected negative pions
272  for( Int_t i = 0; i < mybox().nNegativePionTPCtracks; i++ ){
273  AnaTrackB *track = mybox().NegativePionTPCtracks[i];
274  Float_t ellklh = (anaUtils::GetPIDLikelihood(*track,0)+anaUtils::GetPIDLikelihood(*track,3))/(1.-anaUtils::GetPIDLikelihood(*track,2));
275  output().FillVectorVar(NegPionMom, track->Momentum);
276  output().FillVectorVar(NegPionPidLik, anaUtils::GetPIDLikelihood(*track,3));
277  output().FillVectorVar(NegPionPidLik, ellklh);
278  if( track->TrueObject ){
279  output().FillVectorVar(NegPionTId, track->GetTrueParticle()->PDG);
280  output().FillVectorVar(NegPionIndex,track->GetTrueParticle()->ID);
281  output().FillVectorVar(NegPionParentTId, track->GetTrueParticle()->ParentPDG);
282  output().FillVectorVar(NegPionGParentTId,track->GetTrueParticle()->GParentPDG);
283  if( track->GetTrueParticle()->TrueVertex )
284  output().FillVectorVar(NegPionVId,static_cast<AnaTrueVertex*>(track->GetTrueParticle()->TrueVertex)->RooVtxIndex);
285  }
286  output().FillMatrixVarFromArray(NegPionPosStart, track->PositionStart, 3);
287  output().FillMatrixVarFromArray(NegPionPosEnd, track->PositionEnd,3);
288  output().FillMatrixVarFromArray(NegPionDir, track->DirectionStart,3);
289  output().IncrementCounter(NNegPion);
290  }
291 
292  // Selected positive pions
293  for( Int_t i = 0; i <mybox().nPositivePionTPCtracks; i++ ){
294  AnaTrackB *track = mybox().PositivePionTPCtracks[i];
295  Float_t ellklh = (anaUtils::GetPIDLikelihood(*track,0)+anaUtils::GetPIDLikelihood(*track,3))/(1.-anaUtils::GetPIDLikelihood(*track,2));
296  // output().FillVectorVar(PosPionMom, track->Momentum); Filled in FillToyVarsInMicroTree
297  output().FillVectorVar(PosPionPidLik, anaUtils::GetPIDLikelihood(*track,3));
298  output().FillVectorVar(PosPionPidLik, ellklh);
299 
300  if( track->TrueObject ){
301  output().FillVectorVar(PosPionTId, track->GetTrueParticle()->PDG);
302  output().FillVectorVar(PosPionIndex,track->GetTrueParticle()->ID);
303  output().FillVectorVar(PosPionParentTId, track->GetTrueParticle()->ParentPDG);
304  output().FillVectorVar(PosPionGParentTId,track->GetTrueParticle()->GParentPDG);
305  if( track->GetTrueParticle()->TrueVertex ) {
306  AnaTrueVertex *vtx = static_cast<AnaTrueVertex*>(track->GetTrueParticle()->TrueVertex);
307  output().FillVectorVar(PosPionVId,vtx->RooVtxIndex);
308  if (vtx->PionMom > 0) {
309  // variables for primary pion were filled previously by oaAnalysisTreeConverter
310  output().FillVar(truepi_mom, vtx->PionMom);
311  output().FillVar(truepi_costheta, (Float_t)cos(anaUtils::ArrayToTVector3(vtx->PionDir).Angle(anaUtils::ArrayToTVector3(vtx->NuDir))));
312  output().FillVectorVarFromArray(truepi_dir, vtx->PionDir, 3);
313  } else if (vtx->NPrimaryParticles[ParticleId::kPiPos] > 0) {
314  // variables not filled previously, look for pion in AnaTrueVertex
315  AnaTrueParticleB* trk = NULL;
316  for (int it=0; it<vtx->nTrueParticles; it++) {
317  trk = vtx->TrueParticles[it];
318  if (!trk) continue;
319  if (trk->PDG == 211) {
320  output().FillVar(truepi_mom, trk->Momentum);
321  output().FillVar(truepi_costheta, (Float_t)cos(anaUtils::ArrayToTVector3(trk->Direction).Angle(anaUtils::ArrayToTVector3(vtx->NuDir))));
322  output().FillVectorVarFromArray(truepi_dir, trk->Direction, 3);
323  break;
324  }
325  }
326  }
327  }
328 
329  }
330 
331  output().FillMatrixVarFromArray(PosPionPosStart, track->PositionStart, 3);
332  output().FillMatrixVarFromArray(PosPionPosEnd, track->PositionEnd,3);
333  output().FillMatrixVarFromArray(PosPionDir, track->DirectionStart,3); // Use PosPionTheta to access the angle, it is fille in FillToyVarsInMicroTree
334  output().IncrementCounter(NPosPion);
335  }
336 
337  // Selected pi0 electron tracks
338  for( Int_t i = 0; i < mybox().nElPi0TPCtracks; i++ ) {
339  AnaTrackB *track = mybox().ElPi0TPCtracks[i];
340  output().FillVectorVar(Pi0ElMom, track->Momentum);
341  output().FillVectorVar(Pi0ElPull, anaUtils::GetPIDLikelihood(*track,1));
342  if( track->GetTrueParticle() ){
343  output().FillVectorVar(Pi0ElTId, track->GetTrueParticle()->PDG);
344  output().FillVectorVar(Pi0ElIndex, track->GetTrueParticle()->ID);
345  output().FillVectorVar(Pi0ElParentTId, track->GetTrueParticle()->ParentPDG);
346  output().FillVectorVar(Pi0ElGParentTId,track->GetTrueParticle()->GParentPDG);
347  if( track->GetTrueParticle()->TrueVertex )
348  output().FillVectorVar(Pi0ElVId,static_cast<AnaTrueVertex*>(track->GetTrueParticle()->TrueVertex)->RooVtxIndex);
349  }
350 
351  output().FillMatrixVarFromArray(Pi0ElPosStart, track->PositionStart, 3);
352  output().FillMatrixVarFromArray(Pi0ElPosEnd, track->PositionEnd, 3);
353  output().FillMatrixVarFromArray(Pi0ElDir, track->DirectionStart,3);
354  output().IncrementCounter(NPi0El);
355  }
356 
357  // Selected pi0 positron tracks
358  for( Int_t i = 0; i < mybox().nPosPi0TPCtracks; i++ ) {
359  AnaTrackB *track = mybox().PosPi0TPCtracks[i];
360  output().FillVectorVar(Pi0PosMom, track->Momentum);
361  output().FillVectorVar(Pi0PosPull, anaUtils::GetPIDLikelihood(*track,1));
362  if( track->GetTrueParticle() ){
363  output().FillVectorVar(Pi0PosTId, track->GetTrueParticle()->PDG);
364  output().FillVectorVar(Pi0PosIndex, track->GetTrueParticle()->ID);
365  output().FillVectorVar(Pi0PosParentTId, track->GetTrueParticle()->ParentPDG);
366  output().FillVectorVar(Pi0PosGParentTId,track->GetTrueParticle()->GParentPDG);
367  if( track->GetTrueParticle()->TrueVertex )
368  output().FillVectorVar(Pi0PosVId,static_cast<AnaTrueVertex*>(track->GetTrueParticle()->TrueVertex)->RooVtxIndex);
369  }
370 
371  output().FillMatrixVarFromArray(Pi0PosPosStart, track->PositionStart, 3);
372  output().FillMatrixVarFromArray(Pi0PosPosEnd, track->PositionEnd, 3);
373  output().FillMatrixVarFromArray(Pi0PosDir, track->DirectionStart,3);
374  output().IncrementCounter(NPi0Pos);
375  }
376 
377 
378  // All TPC secondary tracks
379  for( Int_t i = 0; i < mybox().nPositiveTPCtracks; i++ ) {
380  AnaTrackB *track = mybox().PositiveTPCtracks[i];
381 
382  if( mybox().HMNtrack == track ) continue; // This is the muon
383 
384  output().FillVectorVar(TPCSecMom, track->Momentum);
385  output().FillVectorVar(TPCSecPiPidLik, anaUtils::GetPIDLikelihood(*track,3));
386  output().FillVectorVar(TPCSecMuPidLik, anaUtils::GetPIDLikelihood(*track,0));
387  output().FillVectorVar(TPCSecElPidLik, anaUtils::GetPIDLikelihood(*track,1));
388  output().FillVectorVar(TPCSecPrPidLik, anaUtils::GetPIDLikelihood(*track,2));
389  output().FillMatrixVarFromArray(TPCSecPosStart, track->PositionStart,3);
390  output().FillMatrixVarFromArray(TPCSecPosEnd, track->PositionEnd,3);
391  output().FillMatrixVarFromArray(TPCSecDir, track->DirectionStart,3);
392  output().FillVectorVar(TPCSecQ,1);
393  if( track->GetTrueParticle() ){
394  output().FillVectorVar(TPCSecTId, track->GetTrueParticle()->PDG);
395  output().FillVectorVar(TPCSecIndex, track->GetTrueParticle()->ID);
396  output().FillVectorVar(TPCSecParentTId, track->GetTrueParticle()->ParentPDG);
397  output().FillVectorVar(TPCSecGParentTId,track->GetTrueParticle()->GParentPDG);
398  }
399 
400  output().IncrementCounter(NTPCSec);
401  }
402 
403 
404  for( Int_t i = 0; i < mybox().nNegativeTPCtracks; i++ ) {
405  AnaTrackB *track = mybox().NegativeTPCtracks[i];
406  if( mybox().HMNtrack == track ) continue; // This is the muon
407 
408  output().FillVectorVar(TPCSecMom, track->Momentum);
409  output().FillVectorVar(TPCSecPiPidLik, anaUtils::GetPIDLikelihood(*track,3));
410  output().FillVectorVar(TPCSecMuPidLik, anaUtils::GetPIDLikelihood(*track,0));
411  output().FillVectorVar(TPCSecElPidLik, anaUtils::GetPIDLikelihood(*track,1));
412  output().FillVectorVar(TPCSecPrPidLik, anaUtils::GetPIDLikelihood(*track,2));
413  output().FillMatrixVarFromArray(TPCSecPosStart, track->PositionStart,3);
414  output().FillMatrixVarFromArray(TPCSecPosEnd, track->PositionEnd,3);
415  output().FillMatrixVarFromArray(TPCSecDir, track->DirectionStart,3);
416  output().FillVectorVar(TPCSecQ,-1);
417  if( track->GetTrueParticle() ){
418  output().FillVectorVar(TPCSecTId, track->GetTrueParticle()->PDG);
419  output().FillVectorVar(TPCSecIndex, track->GetTrueParticle()->ID);
420  output().FillVectorVar(TPCSecParentTId, track->GetTrueParticle()->ParentPDG);
421  output().FillVectorVar(TPCSecGParentTId,track->GetTrueParticle()->GParentPDG);
422  }
423  output().IncrementCounter(NTPCSec);
424  }
425 
426  // isoFGD pion candidates
427  for (Int_t i=0;i < mybox().nIsoFGDPiontracks;i++){
428  AnaTrackB* track = mybox().IsoFGDPiontracks[i];
429  AnaFGDParticle *fgdTrack = static_cast<AnaFGDParticle*>(track->FGDSegments[0]);
430  if( !fgdTrack ) continue;
431  ///checking times
432  Float_t timeinipi = fgdTrack->PositionStart[3];
433  Float_t timeendpi = fgdTrack->PositionEnd[3];
434 
435  output().FillVectorVar(FGDPiPiPull, fgdTrack->Pullpi);
436  output().FillVectorVar(FGDPiAvgTime, fgdTrack->AvgTime);
437  // Direction of the segment
438  output().FillVectorVar(FGDPiCosTheta,(Float_t)(anaUtils::ArrayToTVector3(fgdTrack->DirectionStart).CosTheta()));
439  //output().FillVectorVar(FGDPiLength,fgdTrack->Length);
440  output().FillVectorVar(FGDPiLength, fgdTrack->X);
441  output().FillVectorVar(FGDPiTimeIni, timeinipi);
442  output().FillVectorVar(FGDPiTimeEnd, timeendpi);
443 
444  output().FillMatrixVarFromArray(FGDPiDir, fgdTrack->DirectionStart,3);
445  output().FillMatrixVarFromArray(FGDPiPosStart,fgdTrack->PositionStart, 3);
446  output().FillMatrixVarFromArray(FGDPiPosEnd, fgdTrack->PositionEnd, 3);
447  if( track->GetTrueParticle() ){
448  output().FillVectorVar(FGDPiTId, track->GetTrueParticle()->PDG);
449  output().FillVectorVar(FGDPiIndex, track->GetTrueParticle()->ID);
450  output().FillVectorVar(FGDPiParentTId, track->GetTrueParticle()->ParentPDG);
451  output().FillVectorVar(FGDPiGParentTId,track->GetTrueParticle()->GParentPDG);
452  if( track->GetTrueParticle()->TrueVertex )
453  output().FillVectorVar(FGDPiVId,static_cast<AnaTrueVertex*>(track->GetTrueParticle()->TrueVertex)->RooVtxIndex);
454  }
455  if( mybox().HMNtrack ) {
456  Float_t deltainimuinipi = TMath::Abs(timeinipi-mybox().HMNtrack->PositionStart[3]);
457  Float_t deltaendmuinipi = TMath::Abs(timeendpi-mybox().HMNtrack->PositionStart[3]);
458  output().FillVectorVar(FGDPiDeltaTimeIniSelMu,deltainimuinipi);
459  output().FillVectorVar(FGDPiDeltaTimeEndSelMu,deltaendmuinipi);
460  // Minimum distance to the muon vertex
461  Float_t dist1 = (anaUtils::ArrayToTVector3(fgdTrack->PositionStart) - anaUtils::ArrayToTVector3(mybox().HMNtrack->PositionStart)).Mag();
462  Float_t dist2 = (anaUtils::ArrayToTVector3(fgdTrack->PositionEnd) - anaUtils::ArrayToTVector3(mybox().HMNtrack->PositionStart)).Mag();
463  output().FillVectorVar(FGDPiDistance,TMath::Min(dist1,dist2));
464  }
465  output().IncrementCounter(NFGDPi);
466  }
467 
468  // isoFGD electron and positron candidates
469  for (Int_t i=0;i < mybox().nIsoFGDElPi0tracks;i++){
470  AnaTrackB* track = mybox().IsoFGDElPi0tracks[i];
471  AnaFGDParticle *fgdTrack = static_cast<AnaFGDParticle*>(track->FGDSegments[0]);
472  if( !fgdTrack ) continue;
473  Float_t timeiniEl = fgdTrack->PositionStart[3];
474  Float_t timeendEl = fgdTrack->PositionEnd[3];
475  output().FillVectorVar(FGDElCosTheta,(Float_t)(anaUtils::ArrayToTVector3(fgdTrack->DirectionStart).CosTheta()));
476  output().FillVectorVar(FGDElPiPull,fgdTrack->Pullpi);
477  output().FillVectorVar(FGDElAvgTime,fgdTrack->AvgTime);
478  //output().FillVectorVar(FGDElLength,fgdTrack->Length);
479  output().FillVectorVar(FGDElLength,fgdTrack->X);
480  output().FillVectorVar(FGDElTimeIni,timeiniEl);
481  output().FillVectorVar(FGDElTimeEnd,timeendEl);
482  // Minimum distance to the muon vertex
483  if( mybox().HMNtrack ) {
484  Float_t deltainimuiniEl = TMath::Abs(timeiniEl-mybox().HMNtrack->PositionStart[3]);
485  Float_t deltaendmuiniEl = TMath::Abs(timeendEl-mybox().HMNtrack->PositionStart[3]);
486  Float_t dist1 = (anaUtils::ArrayToTVector3(fgdTrack->PositionStart) - anaUtils::ArrayToTVector3(mybox().HMNtrack->PositionStart)).Mag();
487  Float_t dist2 = (anaUtils::ArrayToTVector3(fgdTrack->PositionEnd) - anaUtils::ArrayToTVector3(mybox().HMNtrack->PositionStart)).Mag();
488  Float_t prodEl1 = anaUtils::ArrayToTVector3(fgdTrack->DirectionStart)*anaUtils::ArrayToTVector3(mybox().HMNtrack->DirectionStart);
489 
490  output().FillVectorVar(FGDElDeltaTimeIniSelMu,deltainimuiniEl);
491  output().FillVectorVar(FGDElDeltaTimeEndSelMu,deltaendmuiniEl);
492  output().FillVectorVar(FGDElDistance,TMath::Min(dist1,dist2));
493  output().FillVectorVar(FGDElMuonangle,prodEl1);
494 
495  }
496  // Direction and position of the segment
497  output().FillMatrixVarFromArray(FGDElDir, fgdTrack->DirectionStart,3);
498  output().FillMatrixVarFromArray(FGDElPosStart,fgdTrack->PositionStart, 3);
499  output().FillMatrixVarFromArray(FGDElPosEnd, fgdTrack->PositionEnd, 3);
500 
501  if( track->GetTrueParticle() ){
502  output().FillVectorVar(FGDElTId,track->GetTrueParticle()->PDG);
503  output().FillVectorVar(FGDElIndex,track->GetTrueParticle()->ID);
504  output().FillVectorVar(FGDElParentTId,track->GetTrueParticle()->ParentPDG);
505  output().FillVectorVar(FGDElGParentTId,track->GetTrueParticle()->GParentPDG);
506  if( track->GetTrueParticle()->TrueVertex )
507  output().FillVectorVar(FGDElVId,static_cast<AnaTrueVertex*>(track->GetTrueParticle()->TrueVertex)->RooVtxIndex);
508  }
509  output().IncrementCounter(NFGDEl);
510  }
511 
512  // All FGD tracks.
513  AnaRecObjectC** allFGDParticles = NULL;
514  int nFGD=0;
515  if (_fgdID == SubDetId::kFGD1){
516  nFGD = _event->EventBoxes[EventBoxId::kEventBoxTracker]->nRecObjectsInGroup[EventBoxTracker::kTracksWithFGD1AndNoTPC];
517  allFGDParticles = _event->EventBoxes[EventBoxId::kEventBoxTracker]->RecObjectsInGroup[EventBoxTracker::kTracksWithFGD1AndNoTPC];
518  }
519  else if (_fgdID == SubDetId::kFGD2){
520  nFGD = _event->EventBoxes[EventBoxId::kEventBoxTracker]->nRecObjectsInGroup[EventBoxTracker::kTracksWithFGD2AndNoTPC];
521  allFGDParticles = _event->EventBoxes[EventBoxId::kEventBoxTracker]->RecObjectsInGroup[EventBoxTracker::kTracksWithFGD2AndNoTPC];
522  }
523  for (Int_t i=0;i<nFGD;i++){
524  AnaTrackB* track = static_cast<AnaTrackB*>(allFGDParticles[i]);
525  AnaFGDParticle *fgdTrack = static_cast<AnaFGDParticle*>(track->FGDSegments[0]);
526  if( !fgdTrack ) continue;
527  ///checking times
528  Float_t timeini = fgdTrack->PositionStart[3];
529  Float_t timeend = fgdTrack->PositionEnd[3];
530  output().FillVectorVar(FGDSecTimeIni,timeini);
531  output().FillVectorVar(FGDSecTimeEnd,timeend);
532 
533  if( track->GetTrueParticle() ){
534  output().FillVectorVar(FGDSecTId,track->GetTrueParticle()->PDG);
535  output().FillVectorVar(FGDSecIndex,track->GetTrueParticle()->ID);
536  output().FillVectorVar(FGDSecParentTId,track->GetTrueParticle()->ParentPDG);
537  output().FillVectorVar(FGDSecGParentTId,track->GetTrueParticle()->GParentPDG);
538  }
539 
540  if( mybox().HMNtrack ) {
541  Float_t deltainimuini = TMath::Abs(timeini-mybox().HMNtrack->PositionStart[3]);
542  Float_t deltaendmuini = TMath::Abs(timeend-mybox().HMNtrack->PositionStart[3]);
543  output().FillVectorVar(FGDSecDeltaTimeIniSelMu,deltainimuini);
544  output().FillVectorVar(FGDSecDeltaTimeEndSelMu,deltaendmuini);
545  }
546 
547  // Direction of the segment
548  output().FillVectorVar(FGDSecCosTheta,(Float_t)(anaUtils::ArrayToTVector3(fgdTrack->DirectionStart).CosTheta()));
549  output().FillMatrixVarFromArray(FGDSecDir, fgdTrack->DirectionStart,3);
550  output().FillMatrixVarFromArray(FGDSecPosStart,fgdTrack->PositionStart, 3);
551  output().FillMatrixVarFromArray(FGDSecPosEnd, fgdTrack->PositionEnd, 3);
552  output().FillVectorVar(FGDSecContained, fgdTrack->Containment);
553  output().FillVectorVar(FGDSecPiPull, fgdTrack->Pullpi);
554  output().FillVectorVar(FGDSecAvgTime, fgdTrack->AvgTime);
555  output().FillVectorVar(FGDSecLength, fgdTrack->X);
556  //output().FillVectorVar(FGDSecLength, fgdTrack->Length);
557  output().IncrementCounter(NFGDSec);
558 
559  }
560 
561  // Retrieve the EventBox such that we can get the number of michel electrons
562  EventBoxTracker* EventBox = static_cast<EventBoxTracker*>(_event->EventBoxes[EventBoxId::kEventBoxTracker]);
563  SubDetId::SubDetEnum det = static_cast<SubDetId::SubDetEnum>(mybox().DetectorFV);
564 
565  // Fill ME variables.
566  for (Int_t i=0;i < EventBox->nFGDMichelElectrons[det] ;i++){
567  AnaFgdTimeBin* me = static_cast<AnaFgdTimeBin*>(EventBox->FGDMichelElectrons[det][i]);
568  if( me->NHits[0] != 0 ) {
569  output().FillVectorVar(MENHits,(Int_t)me->NHits[0]);
570  output().FillVectorVar(MERawCharge,me->RawChargeSum[0]);
571  }
572  else {
573  output().FillVectorVar(MENHits,(Int_t)me->NHits[1]);
574  output().FillVectorVar(MERawCharge,me->RawChargeSum[1]);
575  }
576  output().FillVectorVar(MEMinTime,me->MinTime);
577  output().FillVectorVar(MEMaxTime,me->MaxTime);
578  output().IncrementCounter(NME);
579  }
580 
581  // Fill TPC1 track variables
582  SubDetId::SubDetEnum tpc = SubDetId::kTPC1;
583  if (box().DetectorFV == SubDetId::kFGD1) tpc = SubDetId::kTPC2;
584 
585  AnaTrackB** TPCtracks;
586  anaUtils::CreateArray(TPCtracks, NMAXPARTICLES);
587  Int_t nTPCtracks = FindTPCTracks(mybox(), tpc, TPCtracks);
588 
589  for( Int_t i = 0; i < nTPCtracks; i++ ) {
590  AnaTrackB *track = TPCtracks[i];
591  if( !track ) continue;
592  Float_t phi=TMath::ATan2(track->DirectionStart[1],track->DirectionStart[0]);
593  output().FillVectorVar(TPC1TrackPhi,phi );
594  if( track->GetTrueParticle() ){
595  output().FillVectorVar(TPC1TrackTId,track->GetTrueParticle()->PDG);
596  output().FillVectorVar(TPC1TrackParentTId,track->GetTrueParticle()->ParentPDG);
597  output().FillVectorVar(TPC1TrackGParentTId,track->GetTrueParticle()->GParentPDG);
598  if( track->GetTrueParticle()->TrueVertex )
599  output().FillVectorVar(TPC1TrackVId,static_cast<AnaTrueVertex*>(track->GetTrueParticle()->TrueVertex)->RooVtxIndex);
600  }
601  output().FillMatrixVarFromArray(TPC1TrackPosStart,track->PositionStart,3);
602  output().FillMatrixVarFromArray(TPC1TrackPosEnd, track->PositionEnd, 3);
603  output().FillVectorVar(TPC1TrackMom, track->Momentum);
604  output().IncrementCounter(NTPC1Track);
605  }
606  delete TPCtracks;
607 
608  // --- Info to understand Pion SI -----
609  if (_addPionSIinfo){
610  PionInteractionSystematic* pionSI = _pionSIManager.ComputePionWeightInfo(GetEvent(), *sel().GetSelection("kTrackerNumuCCMultiPi"), 0);
611 
612  for(int ii = 0; ii < pionSI->nInteractions; ii++){
613 
614  int intType = pionSI->typeInteraction[ii];
615  int mech;
616  if (intType%10 == 0) mech = 0;
617  else if (intType%10 == 1) mech = 1;
618  else if (intType%10 == 4) mech = 2;
619  else mech=-1;
620  output().FillVectorVar(IntType,mech);
621  output().IncrementCounter(NInts);
622  }
623  for(int ns = 0; ns < pionSI->nPions; ns++){
624  output().FillVectorVar(PionType,pionSI->pionType[ns]);
625  output().FillVectorVar(PionMom,pionSI->initMom[ns]);
626  output().IncrementCounter(NPions);
627  }
628  }
629 }
630 
631 //*********************************************************************
632 Int_t numuCCMultiPiAnalysis::FindTPCTracks(const ToyBoxB& boxB, SubDetId::SubDetEnum det, AnaTrackB** TPCtracks ){
633 //*********************************************************************
634 
635  // Get tracks in a specific TPC
636 
637  const ToyBoxTracker& box = *static_cast<const ToyBoxTracker*>(&boxB);
638 
639  Int_t nTPCtracks = 0;
640 
641  for(int i = 0; i < box.nPositiveTPCtracks; i++ ) {
642  AnaTrackB *ptrack = box.PositiveTPCtracks[i];
643  if( SubDetId::GetDetectorUsed(ptrack->Detector, det) ){
644  TPCtracks[nTPCtracks++] = ptrack;
645  }
646  }
647 
648  for(int i = 0; i < box.nNegativeTPCtracks; i++ ) {
649  AnaTrackB *ptrack = box.NegativeTPCtracks[i];
650  if( SubDetId::GetDetectorUsed(ptrack->Detector, det) ){
651  TPCtracks[nTPCtracks++] = ptrack;
652  }
653  }
654 
655  return nTPCtracks;
656 }
657 
658 //********************************************************************
659 void numuCCMultiPiAnalysis::FillToyVarsInMicroTrees(bool addBase){
660 //********************************************************************
661 
662  // Variables from the numuCCAnalysis analysis (including the ones in baseTrackerAnalysis by default, otherwise addBase should be false)
663  if (addBase) _numuCCAnalysis->FillToyVarsInMicroTrees(addBase);
664 
665  // Fill here Variables specific for the numuCCMultiPi analysis - pion momentum and angle for CC-1pi analysis
666  for( Int_t i = 0; i <mybox().nPositivePionTPCtracks; i++ ){
667  AnaTrackB *track = mybox().PositivePionTPCtracks[i];
668  output().FillToyVectorVar(PosPionMom, track->Momentum, i);
669  output().FillToyVectorVar(PosPionTheta, (Float_t)acos(track->DirectionStart[2]), i);
670  }
671 
672  // Fill whether it is signal or bkg
673  // Filled also in numuCCAnalysis, overwritten here
674  if(box().MainTrack && box().MainTrack->TrueObject) {
676  if (vtx) {
677  int ts = 0; // BKG
678  // in FGD1 FV
679  if (anaUtils::GetTopology(*vtx, SubDetId::kFGD1) == 0) ts = 10;
680  else if (anaUtils::GetTopology(*vtx, SubDetId::kFGD1) == 1) ts = 11;
681  else if (anaUtils::GetTopology(*vtx, SubDetId::kFGD1) == 2) ts = 12;
682  // in FGD2 FV
683  else if (anaUtils::GetTopology(*vtx, SubDetId::kFGD2) == 0) ts = 20;
684  else if (anaUtils::GetTopology(*vtx, SubDetId::kFGD2) == 1) ts = 21;
685  else if (anaUtils::GetTopology(*vtx, SubDetId::kFGD2) == 2) ts = 22;
686  output().FillToyVar(true_signal, ts);
687  }
688  }
689 }
690 
691 //********************************************************************
692 bool numuCCMultiPiAnalysis::CheckFillTruthTree(const AnaTrueVertex& vtx){
693 //********************************************************************
694 
695  // GetReactionCC already takes into account the outFV and also
696  // the NuWro reaction code for 2p2h in prod5 (that is 70)
697  bool numuCCinFV = (anaUtils::GetReactionCC(vtx, _fgdID) == 1);
698 
699  // Since our topology definition doesn't consider the reaction code
700  // and since a muon pair can be created in the FSI (likely in DIS)
701  // in principle we might have a non-CC vertex categorized as CCother
702  // (nevertheless I didn't find any.)
703  int topo = anaUtils::GetTopology(vtx, _fgdID);
704  bool topoCCinFV = (topo == 0 || topo == 1 || topo == 2);
705 
706  return (numuCCinFV || topoCCinFV);
707 }
708 
709 //********************************************************************
710 void numuCCMultiPiAnalysis::FillTruthTree(const AnaTrueVertex& vtx){
711 //********************************************************************
712 
713  // Variables from the numuCCAnalysis analysis
714  _numuCCAnalysis->FillTruthTree(vtx);
715 
716  // Variables for true pion
717  if (vtx.PionMom > 0) {
718  // variables for primary pion were filled previously by oaAnalysisTreeConverter
719  if (DEBUG) std::cout << "INFO: Pion info found: vtx.PionMom = " << vtx.PionMom << std::endl;
720  output().FillVar(truepi_mom, vtx.PionMom);
721  output().FillVar(truepi_costheta, (Float_t)cos(anaUtils::ArrayToTVector3(vtx.PionDir).Angle(anaUtils::ArrayToTVector3(vtx.NuDir))));
722  output().FillVectorVarFromArray(truepi_dir, vtx.PionDir, 3);
723  } else if (vtx.NPrimaryParticles[ParticleId::kPiPos] > 0) {
724  // variables not filled previously, look for pion in AnaTrueVertex
725  AnaTrueParticleB* trk = NULL;
726  for (int it=0; it<vtx.nTrueParticles; it++) {
727  trk = vtx.TrueParticles[it];
728  if (!trk) continue;
729  if (trk->PDG == 211) {
730  if (DEBUG) std::cout << "INFO: No pion info (AnaTrueVertex::PionMom), but found pion (AnaTrueVertexB::TrueParticles) with trk->Momentum = " << trk->Momentum << std::endl;
731  //if (DEBUG) std::cout << " vtx.TruthVertexID = " << vtx.TruthVertexID << ", trk.ID = " << trk->ID << std::endl; // debugging with Enrico
732  output().FillVar(truepi_mom, trk->Momentum);
733  output().FillVar(truepi_costheta, (Float_t)cos(anaUtils::ArrayToTVector3(trk->Direction).Angle(anaUtils::ArrayToTVector3(vtx.NuDir))));
734  output().FillVectorVarFromArray(truepi_dir, trk->Direction, 3);
735  break;
736  }
737  }
738  }
739 
740  // Fill whether it is signal or bkg
741  // Filled also in numuCCAnalysis, overwritten here
742  int ts = 0; // BKG
743  // in FGD1 FV
744  if (anaUtils::GetTopology(vtx, SubDetId::kFGD1) == 0) ts = 10;
745  else if (anaUtils::GetTopology(vtx, SubDetId::kFGD1) == 1) ts = 11;
746  else if (anaUtils::GetTopology(vtx, SubDetId::kFGD1) == 2) ts = 12;
747  // in FGD2 FV
748  else if (anaUtils::GetTopology(vtx, SubDetId::kFGD2) == 0) ts = 20;
749  else if (anaUtils::GetTopology(vtx, SubDetId::kFGD2) == 1) ts = 21;
750  else if (anaUtils::GetTopology(vtx, SubDetId::kFGD2) == 2) ts = 22;
751  output().FillVar(true_signal, ts);
752 }
753 
AnaTrueVertexB * TrueVertex
Pointer to the AnaTrueVertexB of the interaction that created this AnaTrueParticleB.
Float_t PositionStart[4]
The reconstructed start position of the particle.
unsigned long Detector
void SetMinAccumCutLevelToSave(Int_t level)
Set the minimum accumulated cut level to save an event into the micro-tree.
int GetParameterI(std::string)
Get parameter. Value is returned as integer.
Definition: Parameters.cxx:217
int nTrueParticles
How many true particles are associated with this vertex.
Int_t RooVtxIndex
The index of the associated RooTrackerVtx vertex from its position in the TClonesArray.
Definition: DataClasses.hxx:75
void AddPackage(const std::string &name, const std::string &version)
Add a package.
void FillVectorVar(Int_t index, Float_t var, Int_t indx=-1)
Fill a vector variable.
void FillToyVectorVar(Int_t index, Int_t var, Int_t comp)
Fill a vector analysis variable.
Int_t GParentPDG
The PDG code of this particle&#39;s grandparent, or 0 if there is no grandparent.
AnaTrackB * MainTrack
For storing the Main Track (The lepton candidate in geranal: HMN or HMP track)
Float_t Pullpi
Pion pull, according to FGD information.
AnaTrueObjectC * TrueObject
The link to the true oject that most likely generated this reconstructed object.
static bool GetDetectorUsed(unsigned long BitField, SubDetId::SubDetEnum det)
Method to see if a certain subdetector or subdetector system is used.
Definition: SubDetId.cxx:40
Float_t Momentum
The initial momentum of the true particle.
AnaTrueParticleB ** TrueParticles
The true particles associated with this vertex.
Float_t AvgTime
Average Time for the iso FGD hits.
void FillMatrixVarFromArray(Int_t index, const Double_t var[], Int_t indx1, UInt_t size)
Fill a matrix variable from array.
Int_t GetTopology(const AnaTrueVertex &trueVertex, const SubDetId::SubDetEnum det=SubDetId::kFGD1, bool IsAntinu=false)
Classify reaction topologies.
Int_t ID
The ID of the trueObj, which corresponds to the ID of the TTruthParticle that created it...
std::string GetSoftwareVersionFromPath(const std::string &path)
Get The software version from the path of the package.
Float_t GetPIDLikelihood(const AnaTrackB &track, Int_t hypo, bool prod5Cut=0)
Definition: PIDUtils.cxx:180
Int_t nRecObjectsInGroup[NMAXRECOBJECTGROUPS]
----—— RecObjects and TrueRecObjects used in the selection and systematics ------------—— ...
Float_t Momentum
The reconstructed momentum of the particle, at the start position.
Representation of a true Monte Carlo vertex.
Definition: DataClasses.hxx:50
virtual const ToyBoxTracker & box(Int_t isel=-1) const
Returns the ToyBoxTracker.
AnaEventC * _event
The current event.
Representation of a true Monte Carlo trajectory/particle.
SubDetEnum
Enumeration of all detector systems and subdetectors.
Definition: SubDetId.hxx:25
Int_t PDG
The PDG code of this particle.
Int_t ParentPDG
The PDG code of this particle&#39;s immediate parent, or 0 if there is no parent.
AnaFgdTimeBinB ** FGDMichelElectrons[2]
----------— Michel Electron candidates -------------------------------—
AnaTrackB ** NegativeTPCtracks
For storing all negative tracks in the event with TPC information.
AnaEvent & GetEvent()
Get a casted AnaEventC to AnaEvent.
Representation of a global track.
void FillToyVar(Int_t index, Int_t var)
Fill a single analysis variable.
void FillMicroTrees(bool addBase=false)
void FillVar(Int_t index, Float_t var)
Fill a single variable.
Float_t DirectionStart[3]
The reconstructed start direction of the particle.
void AddSelection(const std::string &name, const std::string &title, SelectionBase *sel, Int_t presel=-1)
Add a user selection to the selection manager.
Float_t PionDir[3]
The direction of the primary outgoing pions listed first (likely the interacted one).
Int_t Containment
Containment flag required for proper PID analysis.
bool Initialize()
[AnalysisAlgorithm_mandatory]
AnaTrackB ** PositiveTPCtracks
For storing all positive tracks in the event with TPC information.
void UseAnalysis(AnalysisAlgorithm *ana)
Used a given analysis.
Float_t NuDir[3]
The true (unit) direction of the incoming neutrino.
Definition: DataClasses.hxx:82
AnaTrueParticleB * GetTrueParticle() const
Return a casted version of the AnaTrueObject associated.
Float_t Direction[3]
The initial direction of the true particle.
void FillVectorVarFromArray(Int_t index, const Double_t var[], UInt_t size)
Fill a vector variable from array.
AnaFGDParticleB * FGDSegments[NMAXFGDS]
The FGD segments that contributed to this global track.
Float_t PionMom
The momentum of the primary outgoing pions listed first (likely the interacted one).
Int_t NPrimaryParticles[Int_t(ParticleId::kLast)+1]
Array to count the outgoing primary particles of each type (.
Float_t PositionEnd[4]
The reconstructed end position of the particle.