HighLAND
numuCC4piMultiPiFGD2Selection.cxx
1 #include "numuCC4piMultiPiFGD2Selection.hxx"
2 #include "baseSelection.hxx"
3 #include "SystematicTuning.hxx"
4 #include "CutUtils.hxx"
5 #include "EventBoxUtils.hxx"
6 #include "Parameters.hxx"
7 #include "SubDetId.hxx"
8 #include "SystId.hxx"
9 #include "SystematicUtils.hxx"
10 
11 //********************************************************************
12 numuCC4piMultiPiFGD2Selection::numuCC4piMultiPiFGD2Selection(bool forceBreak): SelectionBase(forceBreak,EventBoxId::kEventBoxTracker) {
13  //********************************************************************
14 
15  // Initialize systematic tuning parameters
16  systTuning::Initialize();
17 }
18 
19 //********************************************************************
21  //********************************************************************
22 
23  AddStep(StepBase::kCut, "event quality", new EventQualityCut(), true); //if passed accum_level=1
24  AddStep(StepBase::kCut, "> 0 tracks ", new numuCC4piFGD2::TotalMultiplicityCut(), true); //if passed accum_level=2
25  AddStep(StepBase::kAction, "Sort TPC tracks", new numuCC4piFGD2::SortTracksAction());
26  AddStep(StepBase::kCut, "quality+fiducial", new numuCC4piFGD2::TrackGQandFVCut(), true); //if passed accum_level=3
27  AddStep(StepBase::kAction, "veto Action", new numuCC4piFGD2::VetoAction());
28  AddStep(StepBase::kAction, "muon PID Action", new numuCC4piFGD2::PIDAction());
29  AddStep(StepBase::kAction, "find vertex", new numuCC4pi::FindVertexAction());
30  AddStep(StepBase::kAction, "fill summary", new FillSummaryAction_numuCC4piMultiPiFGD2());
31  AddStep(StepBase::kAction, "find_pions", new numuCC4piMultiPi::FindPionsAction());
32  AddStep(StepBase::kAction, "find ECal photons", new numuCC4piMultiPi::FindEcalPhotonsAction());
33 
34  AddSplit(4);
35 
36  AddStep(0, StepBase::kCut, "Fwd Quality Cut", new numuCC4pi::Fwd_Quality()); //if passed accum_level=4
37  AddStep(0, StepBase::kCut, "Fwd Veto Cut", new numuCC4pi::Fwd_Veto()); //if passed accum_level=5
38  AddStep(0, StepBase::kCut, "Fwd PID Cut", new numuCC4pi::Fwd_PID()); //if passed accum_level=6
39  AddStep(0, StepBase::kCut, "Fwd 4piMultiPi Cut", new numuCC4pi::Fwd()); //if passed accum_level=7
40 
41  AddSplit(3,0);
42  AddStep(0,0, StepBase::kCut, "Fwd CC-0pi", new numuCC4piMultiPi::NoPionCut());
43  AddStep(0,0, StepBase::kCut, "Fwd ECal Pi0 veto", new numuCC4piMultiPi::EcalPi0VetoCut());
44 
45  AddStep(0,1, StepBase::kCut, "Fwd CC-1pi", new numuCC4piMultiPi::OnePionCut());
46  AddStep(0,1, StepBase::kCut, "Fwd ECal Pi0 veto", new numuCC4piMultiPi::EcalPi0VetoCut());
47 
48  AddStep(0,2, StepBase::kCut, "Fwd CC-Other", new numuCC4piMultiPi::OthersCut());
49 
50  AddStep(1, StepBase::kCut, "Bwd Quality Cut", new numuCC4pi::Bwd_Quality());
51  AddStep(1, StepBase::kCut, "Bwd Veto Cut", new numuCC4pi::Bwd_Veto());
52  AddStep(1, StepBase::kCut, "Bwd PID Cut", new numuCC4pi::Bwd_PID());
53  AddStep(1, StepBase::kCut, "Bwd 4piMultiPi Cut", new numuCC4pi::Bwd());
54 
55  AddSplit(3,1);
56  AddStep(1,0, StepBase::kCut, "Bwd CC-0pi", new numuCC4piMultiPi::NoPionCut());
57  AddStep(1,0, StepBase::kCut, "Bwd ECal Pi0 veto", new numuCC4piMultiPi::EcalPi0VetoCut());
58 
59  AddStep(1,1, StepBase::kCut, "Bwd CC-1pi", new numuCC4piMultiPi::OnePionCut());
60  AddStep(1,1, StepBase::kCut, "Bwd ECal Pi0 veto", new numuCC4piMultiPi::EcalPi0VetoCut());
61 
62  AddStep(1,2, StepBase::kCut, "Bwd CC-Other", new numuCC4piMultiPi::OthersCut());
63 
64  AddStep(2, StepBase::kCut, "HAFwd Quality Cut", new numuCC4pi::HAFwd_Quality());
65  AddStep(2, StepBase::kCut, "HAFwd Veto Cut", new numuCC4pi::HAFwd_Veto());
66  AddStep(2, StepBase::kCut, "HAFwd PID Cut", new numuCC4pi::HAFwd_PID());
67  AddStep(2, StepBase::kCut, "HAFwd 4piMultiPi Cut", new numuCC4pi::HAFwd());
68 
69  AddSplit(3,2);
70  AddStep(2,0, StepBase::kCut, "HAFwd CC-0pi", new numuCC4piMultiPi::NoPionCut());
71  AddStep(2,0, StepBase::kCut, "HAFwd ECal Pi0 veto", new numuCC4piMultiPi::EcalPi0VetoCut());
72 
73  AddStep(2,1, StepBase::kCut, "HAFwd CC-1pi", new numuCC4piMultiPi::OnePionCut());
74  AddStep(2,1, StepBase::kCut, "HAFwd ECal Pi0 veto", new numuCC4piMultiPi::EcalPi0VetoCut());
75 
76  AddStep(2,2, StepBase::kCut, "HAFwd CC-Other", new numuCC4piMultiPi::OthersCut());
77 
78  AddStep(3, StepBase::kCut, "HABwd Quality Cut", new numuCC4pi::HABwd_Quality());
79  AddStep(3, StepBase::kCut, "HABwd Veto Cut", new numuCC4pi::HABwd_Veto());
80  AddStep(3, StepBase::kCut, "HABwd PID Cut", new numuCC4pi::HABwd_PID());
81  AddStep(3, StepBase::kCut, "HABwd 4piMultiPi Cut", new numuCC4pi::HABwd());
82 
83  AddSplit(3,3);
84  AddStep(3,0, StepBase::kCut, "HABwd CC-0pi", new numuCC4piMultiPi::NoPionCut());
85  AddStep(3,0, StepBase::kCut, "HABwd ECal Pi0 veto", new numuCC4piMultiPi::EcalPi0VetoCut());
86 
87  AddStep(3,1, StepBase::kCut, "HABwd CC-1pi", new numuCC4piMultiPi::OnePionCut());
88  AddStep(3,1, StepBase::kCut, "HABwd ECal Pi0 veto", new numuCC4piMultiPi::EcalPi0VetoCut());
89 
90  AddStep(3,2, StepBase::kCut, "HABwd CC-Other", new numuCC4piMultiPi::OthersCut());
91 
92  SetBranchAlias(0, "Fwd CC0pi", 0, 0);
93  SetBranchAlias(1, "Fwd CC1pi", 0, 1);
94  SetBranchAlias(2, "Fwd CCOther", 0, 2);
95 
96  SetBranchAlias(3, "Bwd CC0pi", 1,0);
97  SetBranchAlias(4, "Bwd CC1pi", 1,1);
98  SetBranchAlias(5, "Bwd CCOther", 1,2);
99 
100  SetBranchAlias(6, "HAFwd CC0pi", 2,0);
101  SetBranchAlias(7, "HAFwd CC1pi", 2,1);
102  SetBranchAlias(8, "HAFwd CCOther", 2,2);
103 
104  SetBranchAlias(9, "HABwd CC0pi", 3,0);
105  SetBranchAlias(10, "HABwd CC1pi", 3,1);
106  SetBranchAlias(11, "HABwd CCOther", 3,2);
107 
108  SetPreSelectionAccumLevel(2);
109 
110 }
111 
112 //********************************************************************
114  //********************************************************************
115 
116  // Change FV definition to take all thickness
117  // Note! this will affect all downstream stuff
118  FVDef::FVdefminFGD2[2] = 0;
119  FVDef::FVdefmaxFGD2[2] = 0;
120 
121  // The detector in which the selection is applied
122  SetDetectorFV(SubDetId::kFGD2);
123 
124 }
125 
126 
127 //**************************************************
129 //**************************************************
130 
131  AnaEventB& event = *static_cast<AnaEventB*>(&eventBB);
132 
133  // Create the appropriate EventBox if it does not exist yet
134  if (!event.EventBoxes[EventBoxId::kEventBoxTracker]) event.EventBoxes[EventBoxId::kEventBoxTracker] = new EventBoxTracker();
135 
136  boxUtils::FillTracksWithTPC(event, static_cast<SubDetId::SubDetEnum>(GetDetectorFV()));
137  boxUtils::FillTracksWithFGD(event, static_cast<SubDetId::SubDetEnum>(GetDetectorFV()));
138  boxUtils::FillTracksWithECal(event);
139 
140  boxUtils::FillTrajsChargedInTPC(event);
141  boxUtils::FillTrajsChargedInFGDAndNoTPC(event, static_cast<SubDetId::SubDetEnum>(GetDetectorFV()));
142  boxUtils::FillTrajsChargedHATracker(event, static_cast<SubDetId::SubDetEnum>(GetDetectorFV()));
143  boxUtils::FillTrajsInECal(event);
144 
145 }
146 
147 //********************************************************************
148 bool numuCC4piMultiPiFGD2Selection::FillEventSummary(AnaEventC& event, Int_t allCutsPassed[]){
149  //********************************************************************
150 
151  if(allCutsPassed[0]) static_cast<AnaEventSummaryB*>(event.Summary)->EventSample = SampleId::kFGD2NuMuCC0Pi;
152  if(allCutsPassed[1]) static_cast<AnaEventSummaryB*>(event.Summary)->EventSample = SampleId::kFGD2NuMuCC1Pi;
153  if(allCutsPassed[2]) static_cast<AnaEventSummaryB*>(event.Summary)->EventSample = SampleId::kFGD2NuMuCCOther;
154 
155  if(allCutsPassed[3]) static_cast<AnaEventSummaryB*>(event.Summary)->EventSample = SampleId::kFGD2NuMuCC0Pi;
156  if(allCutsPassed[4]) static_cast<AnaEventSummaryB*>(event.Summary)->EventSample = SampleId::kFGD2NuMuCC1Pi;
157  if(allCutsPassed[5]) static_cast<AnaEventSummaryB*>(event.Summary)->EventSample = SampleId::kFGD2NuMuCCOther;
158 
159  if(allCutsPassed[6]) static_cast<AnaEventSummaryB*>(event.Summary)->EventSample = SampleId::kFGD2NuMuCC0Pi;
160  if(allCutsPassed[7]) static_cast<AnaEventSummaryB*>(event.Summary)->EventSample = SampleId::kFGD2NuMuCC1Pi;
161  if(allCutsPassed[8]) static_cast<AnaEventSummaryB*>(event.Summary)->EventSample = SampleId::kFGD2NuMuCCOther;
162 
163  if(allCutsPassed[9]) static_cast<AnaEventSummaryB*>(event.Summary)->EventSample = SampleId::kFGD2NuMuCC0Pi;
164  if(allCutsPassed[10]) static_cast<AnaEventSummaryB*>(event.Summary)->EventSample = SampleId::kFGD2NuMuCC1Pi;
165  if(allCutsPassed[11]) static_cast<AnaEventSummaryB*>(event.Summary)->EventSample = SampleId::kFGD2NuMuCCOther;
166 
167  return (static_cast<AnaEventSummaryB*>(event.Summary)->EventSample != SampleId::kUnassigned);
168 }
169 
170 //********************************************************************
172  //********************************************************************
173 
174  // Cast the ToyBox to the appropriate type
175  ToyBoxCC4piMultiPi* cc4piMultiPibox = static_cast<ToyBoxCC4piMultiPi*>(&boxB);
176 
177  if(!cc4piMultiPibox->MainTrack) return 1;
178 
179  static_cast<AnaEventSummaryB*>(event.Summary)->LeptonCandidate[SampleId::kFGD2NuMuCC0Pi] = cc4piMultiPibox->MainTrack;
180  static_cast<AnaEventSummaryB*>(event.Summary)->LeptonCandidate[SampleId::kFGD2NuMuCC1Pi] = cc4piMultiPibox->MainTrack;
181  static_cast<AnaEventSummaryB*>(event.Summary)->LeptonCandidate[SampleId::kFGD2NuMuCCOther] = cc4piMultiPibox->MainTrack;
182 
183  anaUtils::CopyArray( cc4piMultiPibox->MainTrack->PositionStart, static_cast<AnaEventSummaryB*>(event.Summary)->VertexPosition[SampleId::kFGD2NuMuCC0Pi], 4);
184  anaUtils::CopyArray( cc4piMultiPibox->MainTrack->PositionStart, static_cast<AnaEventSummaryB*>(event.Summary)->VertexPosition[SampleId::kFGD2NuMuCC1Pi], 4);
185  anaUtils::CopyArray( cc4piMultiPibox->MainTrack->PositionStart, static_cast<AnaEventSummaryB*>(event.Summary)->VertexPosition[SampleId::kFGD2NuMuCCOther], 4);
186 
187  if(cc4piMultiPibox->MainTrack->GetTrueParticle()) static_cast<AnaEventSummaryB*>(event.Summary)->TrueVertex[SampleId::kFGD2NuMuCC0Pi] = cc4piMultiPibox->MainTrack->GetTrueParticle()->TrueVertex;
188  if(cc4piMultiPibox->MainTrack->GetTrueParticle()) static_cast<AnaEventSummaryB*>(event.Summary)->TrueVertex[SampleId::kFGD2NuMuCC1Pi] = cc4piMultiPibox->MainTrack->GetTrueParticle()->TrueVertex;
189  if(cc4piMultiPibox->MainTrack->GetTrueParticle()) static_cast<AnaEventSummaryB*>(event.Summary)->TrueVertex[SampleId::kFGD2NuMuCCOther] = cc4piMultiPibox->MainTrack->GetTrueParticle()->TrueVertex;
190 
191  return true;
192 }
193 
194 //**************************************************
195 bool numuCC4piMultiPiFGD2Selection::IsRelevantSystematic(const AnaEventC& event, const ToyBoxB& box, SystId_h systId, Int_t branch) const{
196  //**************************************************
197 
198  (void)event;
199  (void)branch;
200  (void)box;
201  (void)systId;
202 
203  return true;
204 
205 }
206 
207 //**************************************************
208 bool numuCC4piMultiPiFGD2Selection::IsRelevantRecObjectForSystematic(const AnaEventC& event, AnaRecObjectC* recObj, SystId_h systId, Int_t branch) const{
209  //**************************************************
210 
211  (void)event;
212  (void)branch;
213  (void)systId;
214 
215  AnaTrackB* track = static_cast<AnaTrackB*>(recObj);
216 
217  if (!track) return false;
218  if (!track->TrueObject) return false;
219 
220  return true;
221 
222 }
223 
224 //**************************************************
225 bool numuCC4piMultiPiFGD2Selection::IsRelevantTrueObjectForSystematic(const AnaEventC& event, AnaTrueObjectC* trueObj, SystId_h systId, Int_t branch) const{
226  //**************************************************
227 
228  (void)event;
229  (void)branch;
230  (void)systId;
231 
232  AnaTrueParticleB* trueTrack = static_cast<AnaTrueParticleB*>(trueObj);
233 
234  if (!trueTrack) return false;
235 
236  return true;
237 
238 }
239 
240 //**************************************************
241 bool numuCC4piMultiPiFGD2Selection::IsRelevantRecObjectForSystematicInToy(const AnaEventC& event, const ToyBoxB& boxB, AnaRecObjectC* recObj, SystId_h systId, Int_t branch) const{
242 //**************************************************
243 
244  (void)event;
245  (void)branch;
246 
247  const ToyBoxCC4piMultiPi& cc4piMultiPibox = *static_cast<const ToyBoxCC4piMultiPi*>(&boxB);
248 
249  AnaTrackB* track = static_cast<AnaTrackB*>(recObj);
250 
251  if(systId == SystId::kTpcClusterEff){
252  if (track->nTPCSegments > 0) {
254  if (tpcTrack) {
255  if (tpcTrack->NNodes > 16 && tpcTrack->NNodes < 19) return true;
256  }
257  }
258  return false;
259  }
260  if(systId == SystId::kChargeIDEff){
261  if (track == cc4piMultiPibox.MainTrack) return true;
262  return false;
263  }
264  if(systId == SystId::kTpcFgdMatchEff){
265  if (track == cc4piMultiPibox.MainTrack) return true;
266  return false;
267  }
268  if(systId == SystId::kECalPID){
269  if (track == cc4piMultiPibox.MainTrack) {
270  if (branch==2 || branch==3) return true;
271  else if (branch==0 || branch==4 || branch==5) {
272  if ( anaUtils::TrackUsesDet(*track,SubDetId::kTECAL) ) return true;
273  if ( anaUtils::InFiducialVolume(SubDetId::kDSECAL, track->PositionEnd, numuCC4pi_utils::_FVdefminDsECal, numuCC4pi_utils::_FVdefmaxDsECal) ) return true;
274  }
275  }
276  return false;
277  }
278 
279  return true;
280 
281 }
282 
283 //**************************************************
284 bool numuCC4piMultiPiFGD2Selection::IsRelevantTrueObjectForSystematicInToy(const AnaEventC& event, const ToyBoxB& boxB, AnaTrueObjectC* trueObj, SystId_h systId, Int_t branch) const{
285 //**************************************************
286 
287  (void)event;
288  (void)branch;
289 
290  const ToyBoxCC4piMultiPi& cc4piMultiPibox = *static_cast<const ToyBoxCC4piMultiPi*>(&boxB);
291 
292  AnaTrueParticleB* trueTrack = static_cast<AnaTrueParticleB*>(trueObj);
293 
294  if ( !cc4piMultiPibox.MainTrack->GetTrueParticle() ) return false;
295 
296  if(systId == SystId::kTpcTrackEff){
297  if (trueTrack->PDG == 13 && cc4piMultiPibox.MainTrack->GetTrueParticle()->PDG!=13) return true;
298  if (branch!=2 && branch!=3) { if (trueTrack->ID == cc4piMultiPibox.MainTrack->GetTrueParticle()->ID) return true; }
299  return false;
300  }
301  if(systId == SystId::kECalTrackEff){
302  if (trueTrack->PDG == 13 && cc4piMultiPibox.MainTrack->GetTrueParticle()->PDG!=13) return true;
303  if (branch==2 || branch==3) { if (trueTrack->ID == cc4piMultiPibox.MainTrack->GetTrueParticle()->ID) return true; }
304  return false;
305  }
306  if(systId == SystId::kTpcP0dMatchEff){
307  if (branch==1) { if (trueTrack->ID == cc4piMultiPibox.MainTrack->GetTrueParticle()->ID) return true; }
308  return false;
309  }
310  if(systId == SystId::kTpcECalMatchEff){
311  if (branch>-1 && branch<6) { if (trueTrack->ID == cc4piMultiPibox.MainTrack->GetTrueParticle()->ID) return true; }
312  return false;
313  }
314  if(systId == SystId::kFgdECalMatchEff){
315  if (branch==2 || branch==3) { if (trueTrack->ID == cc4piMultiPibox.MainTrack->GetTrueParticle()->ID) return true; }
316  return false;
317  }
318  if(systId == SystId::kFgdECalSmrdMatchEff){
319  if (branch==2 || branch==3) { if (trueTrack->ID == cc4piMultiPibox.MainTrack->GetTrueParticle()->ID) return true; }
320  return false;
321  }
322  if(systId == SystId::kSIPion){
323  // If this trueTrack is associated to the MainTrack
324  if (trueTrack->ID == cc4piMultiPibox.MainTrack->GetTrueParticle()->ID){
325  if (abs(cc4piMultiPibox.MainTrack->GetTrueParticle()->PDG) == 211) return true;
326  if (abs(cc4piMultiPibox.MainTrack->GetTrueParticle()->ParentPDG) == 211) return true;
327  if (abs(cc4piMultiPibox.MainTrack->GetTrueParticle()->GParentPDG) == 211) return true;
328  return false;
329  }
330  // If this trueTrack is NOT associated to the MainTrack, consider the posibility of this trueTrack to become the MainTrack and be identified as muon
331  // For the moment assume a negative pion may become the MainTrack if its momentum its above 90% of the current MainTrack momentum.
332  // Ideally we should check that this true pion is not associated to any reconstructed track, but this is not possible now without looping.
333  // Multiply by the charge of the MainTrack such that it can be use for antiNumu selection
334  if (trueTrack->PDG == 211*((Int_t)cc4piMultiPibox.MainTrack->Charge) && trueTrack->Momentum > 0.9*cc4piMultiPibox.MainTrack->Momentum) return true;
335  return false;
336  }
337  if(systId == SystId::kSIProton){
338  // If this trueTrack is associated to the MainTrack
339  if (trueTrack->ID == cc4piMultiPibox.MainTrack->GetTrueParticle()->ID){
340  if (cc4piMultiPibox.MainTrack->GetTrueParticle()->PDG == 2212) return true;
341  if (cc4piMultiPibox.MainTrack->GetTrueParticle()->ParentPDG == 2212) return true;
342  if (cc4piMultiPibox.MainTrack->GetTrueParticle()->GParentPDG == 2212) return true;
343  return false;
344  }
345  // If this trueTrack is NOT associated to the MainTrack, consider the posibility of this trueTrack to become the MainTrack
346  if (trueTrack->PDG == 2212 && trueTrack->Momentum > 0.9*cc4piMultiPibox.MainTrack->Momentum) return true;
347  return false;
348  }
349 
350  return true;
351 
352 }
353 
354 //********************************************************************
355 bool numuCC4piMultiPiFGD2Selection::CheckRedoSelection(const AnaEventC& eventC, const ToyBoxB& PreviousToyBoxB, Int_t& redoFromStep){
356  //********************************************************************
357 
358  (void)eventC;
359  (void)PreviousToyBoxB;
360  (void)redoFromStep;
361 
362  return true;
363 
364 }
365 
AnaTrueVertexB * TrueVertex
Pointer to the AnaTrueVertexB of the interaction that created this AnaTrueParticleB.
void DefineSteps()
Define all steps in the selection.
bool IsRelevantTrueObjectForSystematicInToy(const AnaEventC &, const ToyBoxB &, AnaTrueObjectC *, SystId_h systId, Int_t branch=0) const
Is this true track relevant for a given systematic (after selection, called for each toy) ...
Float_t PositionStart[4]
The reconstructed start position of the particle.
bool IsRelevantRecObjectForSystematic(const AnaEventC &event, AnaRecObjectC *recObj, SystId_h systId, Int_t branch) const
Is this track relevant for a given systematic (prior to selection, call when initializing the event...
bool IsRelevantTrueObjectForSystematic(const AnaEventC &event, AnaTrueObjectC *trueObj, SystId_h systId, Int_t branch) const
Is this true track relevant for a given systematic (prior to selection, call when initializing the ev...
Int_t NNodes
The number of nodes in the reconstructed object.
Int_t GParentPDG
The PDG code of this particle&#39;s grandparent, or 0 if there is no grandparent.
bool IsRelevantRecObjectForSystematicInToy(const AnaEventC &, const ToyBoxB &, AnaRecObjectC *, SystId_h systId, Int_t branch=0) const
Is this track relevant for a given systematic (after selection, called for each toy) ...
AnaTrueObjectC * TrueObject
The link to the true oject that most likely generated this reconstructed object.
Float_t Momentum
The initial momentum of the true particle.
bool TrackUsesDet(const AnaTrackB &track, SubDetId::SubDetEnum det)
Float_t Charge
The reconstructed charge of the particle.
Int_t ID
The ID of the trueObj, which corresponds to the ID of the TTruthParticle that created it...
bool IsRelevantSystematic(const AnaEventC &event, const ToyBoxB &box, SystId_h systId, Int_t branch) const
Is this systematic relevant for this selection.
void DefineDetectorFV()
Define the detector Fiducial Volume in which this selection is applied.
Float_t Momentum
The reconstructed momentum of the particle, at the start position.
int nTPCSegments
How many TPC tracks are associated with this track.
Representation of a true Monte Carlo trajectory/particle.
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.
void InitializeEvent(AnaEventC &event)
Fill the EventBox with the objects needed by this selection.
Representation of a global track.
Representation of a TPC segment of a global track.
AnaTrackB * MainTrack
For storing tracks information in the bunch.
AnaEventSummaryC * Summary
A summary of the event with high level quantities.
bool CheckRedoSelection(const AnaEventC &event, const ToyBoxB &PreviousToyBox, Int_t &redoFromStep)
bool Apply(AnaEventC &event, ToyBoxB &box) const
AnaParticleB * GetSegmentWithMostNodesInClosestTpc(const AnaTrackB &track)
Combined function to address NuMu selection needs as efficiently as possible - gets the TPC segment w...
AnaTrueParticleB * GetTrueParticle() const
Return a casted version of the AnaTrueObject associated.
bool InFiducialVolume(SubDetId::SubDetEnum det, const Float_t *pos, const Float_t *FVdefmin, const Float_t *FVdefmax)
A cut on event quality. Requires good beam and ND280 data quality flags.
Float_t PositionEnd[4]
The reconstructed end position of the particle.