HighLAND
nueCCSelection.hxx
1 #ifndef nueCCSelection_h
2 #define nueCCSelection_h
3 
4 #include "SelectionBase.hxx"
5 #include "Parameters.hxx"
6 #include "ToyBoxTracker.hxx"
7 #include "EventBoxId.hxx"
8 #include "SystId.hxx"
9 #include "SubDetId.hxx"
10 
12  public:
13  nueCCSelection(bool forceBreak=true);
14  virtual ~nueCCSelection(){}
15 
16  //---- These are mandatory functions
17  void DefineSteps();
18  void DefineDetectorFV();
19  inline ToyBoxB* MakeToyBox();
20  void InitializeEvent(AnaEventC& event);
21  bool FillEventSummary(AnaEventC& event, Int_t allCutsPassed[]);
22 
23  SampleId::SampleEnum GetSampleEnum(){return SampleId::kFGD1NuECC;}
24 
25  bool CheckRedoSelection(const AnaEventC& eventC, const ToyBoxB& PreviousToyBox, Int_t& redoFromStep);
26  bool IsRelevantRecObjectForSystematic(const AnaEventC& event, AnaRecObjectC* track, SystId_h systId, Int_t branch) const;
27  bool IsRelevantTrueObjectForSystematic(const AnaEventC& event, AnaTrueObjectC* trueTrack, SystId_h systId, Int_t branch) const;
28  bool IsRelevantRecObjectForSystematicInToy(const AnaEventC&, const ToyBoxB&, AnaRecObjectC*, SystId_h systId, Int_t branch=0) const;
29  bool IsRelevantTrueObjectForSystematicInToy(const AnaEventC&, const ToyBoxB&, AnaTrueObjectC*, SystId_h systId, Int_t branch=0) const;
30  bool IsRelevantSystematic(const AnaEventC& event, const ToyBoxB& box, SystId_h systId, Int_t branch) const;
31 
32 protected:
33  Int_t _FindLeadingTracksStepIndex;
34  Int_t _TotalMultiplicityCutIndex;
35  Int_t _ElecPIDCutIndex;
36  Int_t _ElecPIDStepIndex;
37 
38  // Varaibles needed from datacard
39  //Float_t _pullel_accept_min;
40  //Float_t _pullel_accept_max;
41  //Float_t _pullel_accept_tight_min;
42  //Float_t _pullel_accept_tight_max;
43  Float_t _Ethreshold;
44  //Float_t _minMom_ecal;
45  //Float_t _protonregion_low;
46 };
47 
48 /// This class stores the objects used by the package.
49 /// E.g. Selected tracks, vertex, veto track etc...
50 class ToyBoxNueCC: public ToyBoxTracker{
51 
52 public:
53  ToyBoxNueCC(){
54  VetoTrack = NULL;
55  ECalVetoTrack = NULL;
56  ECalNCVetoTrack = NULL;
57  SecondMostEnergeticTPCTrack = NULL;
58  SecondMostEnergeticFGDTPCTrack = NULL;
59  PairTrack = NULL;
60 
61  P0DVetoP0DTracks = 0;
62  P0DVetoFGD1Tracks = 0;
63  P0DVetoP0DEcalTracks = 0;
64  TPCVetoP0DNearTracks = 0;
65  TPCVetoNearTracks = 0;
66  TPCVetoFarTracks = 0;
67  FGD2ShowerNFGD2TPC3Tracks = 0;
68  FGD2ShowerNFGD1TPC2Tracks = 0;
69  NOOFVTracks = 0;
70  }
71 
72  virtual ~ToyBoxNueCC(){}
73 
74  void Reset(){
75  VetoTrack = NULL;
76  ECalVetoTrack = NULL;
77  ECalNCVetoTrack = NULL;
78  SecondMostEnergeticTPCTrack = NULL;
79  SecondMostEnergeticFGDTPCTrack = NULL;
80  PairTrack = NULL;
81 
82  P0DVetoP0DTracks = 0;
83  P0DVetoFGD1Tracks = 0;
84  P0DVetoP0DEcalTracks = 0;
85  TPCVetoP0DNearTracks = 0;
86  TPCVetoNearTracks = 0;
87  TPCVetoFarTracks = 0;
88  FGD2ShowerNFGD2TPC3Tracks = 0;
89  FGD2ShowerNFGD1TPC2Tracks = 0;
90  NOOFVTracks = 0;
91  }
92 
93  /// The TPC veto track
95 
96  /// The most-upstream track containing ECal information.
98  AnaTrackB* ECalNCVetoTrack;
99 
100  /// The second most energetic TPC track
102 
103  /// The second most energetic TPC track in the same FGD as the main track
105 
106  /// The particle that isn't HMTrackSelected that forms the e+e- pair with the lowest invariant mass.
108 
109  /// The number of tracks that start in the P0D. Used in the P0D veto cut.
111 
112  /// The number of tracks that start in FGD1. Used in the P0D veto cut.
114 
115  /// Number of P0DEcal tracks. Used in the P0D veto cut
117 
118  /// Updated TPC veto
120  Int_t TPCVetoFarTracks;
121  Int_t TPCVetoP0DNearTracks;
122 
123  /// FGD2 shower
125  Int_t FGD2ShowerNFGD1TPC2Tracks;
126 
127  /// OOFV tracks
128  Int_t NOOFVTracks;
129 };
130 
132 
134 public:
135  using StepBase::Apply;
136  bool Apply(AnaEventC& event, ToyBoxB& boxB) const;
138 };
139 
141 public:
143  };
144  using StepBase::Apply;
145  bool Apply(AnaEventC& event, ToyBoxB& boxB) const;
147 };
148 
149 class FillVertex: public StepBase{
150 public:
151  using StepBase::Apply;
152  bool Apply(AnaEventC& event, ToyBoxB& boxB) const;
153  StepBase* MakeClone(){return new FillVertex();}
154 };
155 
157 public:
158  using StepBase::Apply;
159  bool Apply(AnaEventC& event, ToyBoxB& boxB) const;
161 };
162 
164 public:
165  using StepBase::Apply;
166  bool Apply(AnaEventC& event, ToyBoxB& boxB) const;
168 };
169 
170 class MultiplicityCut: public StepBase{
171 public:
172  using StepBase::Apply;
173  bool Apply(AnaEventC& event, ToyBoxB& boxB) const;
175 };
176 
177 class TrackQualityCut: public StepBase{
178 public:
179  TrackQualityCut(){
180  _num_tpc_nodes = ND::params().GetParameterI("psycheSelections.nueCCAnalysis.Cuts.Quality.MinTPCNodes");
181  _num_tpc_nodes_ecal = ND::params().GetParameterI("psycheSelections.nueCCAnalysis.Cuts.Quality.MinTPCNodesEcal");
182  };
183  using StepBase::Apply;
184  bool Apply(AnaEventC& event, ToyBoxB& boxB) const;
186 protected:
187  Int_t _num_tpc_nodes;
188  Int_t _num_tpc_nodes_ecal;
189 };
190 
192 public:
193  using StepBase::Apply;
194  bool Apply(AnaEventC& event, ToyBoxB& boxB) const;
196 };
197 
199 public:
201  /// Loose e-pull cut all events must pass, regardless of TPC path
202  _pullel_accept_min = (Float_t)ND::params().GetParameterD("psycheSelections.nueCCAnalysis.Cuts.PID.PullElecMin");
203  _pullel_accept_max = (Float_t)ND::params().GetParameterD("psycheSelections.nueCCAnalysis.Cuts.PID.PullElecMax");
204  /// Tight electron pull applied only to the events not going in the Ecal
205  _pullel_accept_tight_min = (Float_t)ND::params().GetParameterD("psycheSelections.nueCCAnalysis.Cuts.PID.PullElecTightMin");
206  _pullel_accept_tight_max = (Float_t)ND::params().GetParameterD("psycheSelections.nueCCAnalysis.Cuts.PID.PullElecTightMax");
207 
208  _minMom_ecal = (Float_t)ND::params().GetParameterD("psycheSelections.nueCCAnalysis.Cuts.EcalThreshold");
209  };
210  using StepBase::Apply;
211  bool Apply(AnaEventC& event, ToyBoxB& boxB) const;
213 protected:
214  Float_t _minMom_ecal;
215  Float_t _pullel_accept_min;
216  Float_t _pullel_accept_max;
217  Float_t _pullel_accept_tight_min;
218  Float_t _pullel_accept_tight_max;
219 };
220 
221 class TPCMuonPullCut: public StepBase{
222 public:
223  TPCMuonPullCut(){
224  _pullmu_reject_min = (Float_t)ND::params().GetParameterD("psycheSelections.nueCCAnalysis.Cuts.PID.PullMuonMin");
225  _pullmu_reject_max = (Float_t)ND::params().GetParameterD("psycheSelections.nueCCAnalysis.Cuts.PID.PullMuonMax");
226 
227  _minMom_ecal = (Float_t)ND::params().GetParameterD("psycheSelections.nueCCAnalysis.Cuts.EcalThreshold");
228  };
229  using StepBase::Apply;
230  bool Apply(AnaEventC& event, ToyBoxB& boxB) const;
232 protected:
233  Float_t _minMom_ecal;
234  Float_t _pullmu_reject_min;
235  Float_t _pullmu_reject_max;
236 };
237 
238 class TPCPionPullCut: public StepBase{
239 public:
240  TPCPionPullCut(){
241  _pullpi_reject_min = (Float_t)ND::params().GetParameterD("psycheSelections.nueCCAnalysis.Cuts.PID.PullPionMin");
242  _pullpi_reject_max = (Float_t)ND::params().GetParameterD("psycheSelections.nueCCAnalysis.Cuts.PID.PullPionMax");
243  _num_tpc_nodes = ND::params().GetParameterI("psycheSelections.nueCCAnalysis.Cuts.Quality.MinTPCNodes");
244  _minMom_ecal = (Float_t)ND::params().GetParameterD("psycheSelections.nueCCAnalysis.Cuts.EcalThreshold");
245  };
246  using StepBase::Apply;
247  bool Apply(AnaEventC& event, ToyBoxB& boxB) const;
249 protected:
250  Float_t _minMom_ecal;
251  Float_t _pullpi_reject_min;
252  Float_t _pullpi_reject_max;
253  Int_t _num_tpc_nodes;
254 };
255 
256 class EcalEMEnergyCut: public StepBase{
257 public:
258  EcalEMEnergyCut(){
259  _Ethreshold = (Float_t)ND::params().GetParameterD("psycheSelections.nueCCAnalysis.Cuts.PID.EThreshold");
260  _Emin_ecal = (Float_t)ND::params().GetParameterD("psycheSelections.nueCCAnalysis.Cuts.PID.EcalEMin");
261  _EoverP = (Float_t)ND::params().GetParameterD("psycheSelections.nueCCAnalysis.Cuts.PID.EoverP");
262  };
263  using StepBase::Apply;
264  bool Apply(AnaEventC& event, ToyBoxB& boxB) const;
266 protected:
267  Float_t _Ethreshold;
268  Float_t _Emin_ecal;
269  Float_t _EoverP;
270 };
271 
272 class EcalMIPEMPIDCut: public StepBase{
273 public:
274  EcalMIPEMPIDCut(){
275  _Ethreshold = (Float_t)ND::params().GetParameterD("psycheSelections.nueCCAnalysis.Cuts.PID.EThreshold");
276  _ecal_mipem_min = (Float_t)ND::params().GetParameterD("psycheSelections.nueCCAnalysis.Cuts.PID.EcalMipEmMin");
277  };
278  using StepBase::Apply;
279  bool Apply(AnaEventC& event, ToyBoxB& boxB) const;
281 protected:
282  Float_t _Ethreshold;
283  Float_t _ecal_mipem_min;
284 };
285 
286 class SecondTPCPIDCut: public StepBase{
287 public:
288  SecondTPCPIDCut(){
289  _pullmu_reject_min = (Float_t)ND::params().GetParameterD("psycheSelections.nueCCAnalysis.Cuts.PID2.PullMuonMin");
290  _pullmu_reject_max = (Float_t)ND::params().GetParameterD("psycheSelections.nueCCAnalysis.Cuts.PID2.PullMuonMax");
291  };
292  using StepBase::Apply;
293  bool Apply(AnaEventC& event, ToyBoxB& boxB) const;
295 protected:
296  Float_t _pullmu_reject_min;
297  Float_t _pullmu_reject_max;
298 };
299 
301 public:
303  _vertex_activity = (Float_t)ND::params().GetParameterD("psycheSelections.nueCCAnalysis.Cuts.GammaIso.VertexActivity");
304  };
305  using StepBase::Apply;
306  bool Apply(AnaEventC& event, ToyBoxB& boxB) const;
308 protected:
309  Float_t _vertex_activity;
310 };
311 
312 class TPCVetoCut: public StepBase{
313 public:
314  TPCVetoCut(){
315  _delta_z_min = (Float_t)ND::params().GetParameterD("psycheSelections.nueCCAnalysis.Cuts.TPCVeto.DeltaZMin.FGD1");
316  };
317  using StepBase::Apply;
318  bool Apply(AnaEventC& event, ToyBoxB& boxB) const;
319  StepBase* MakeClone(){return new TPCVetoCut();}
320 protected:
321  Float_t _delta_z_min;
322 };
323 
324 class GammaIsoVetoCut: public StepBase{
325 public:
326  using StepBase::Apply;
327  bool Apply(AnaEventC& event, ToyBoxB& boxB) const;
329 };
330 
331 class FindPairsAction: public StepBase{
332 public:
333  FindPairsAction(){
334  _delta_pos_max = (Float_t)ND::params().GetParameterD("psycheSelections.nueCCAnalysis.Cuts.PairFinder.DeltaPosMax");
335  _pullel_min = (Float_t)ND::params().GetParameterD("psycheSelections.nueCCAnalysis.Cuts.PairFinder.PullElecMin");
336  _pullel_max = (Float_t)ND::params().GetParameterD("psycheSelections.nueCCAnalysis.Cuts.PairFinder.PullElecMax");
337  };
338  using StepBase::Apply;
339  bool Apply(AnaEventC& event, ToyBoxB& boxB) const;
341 protected:
342  Float_t _delta_pos_max;
343  Float_t _pullel_min;
344  Float_t _pullel_max;
345 };
346 
347 class PairCut: public StepBase{
348 public:
349  PairCut(){
350  _inv_mass_min = (Float_t)ND::params().GetParameterD("psycheSelections.nueCCAnalysis.Cuts.PairFinder.InvMassMin");
351  };
352  using StepBase::Apply;
353  bool Apply(AnaEventC& event, ToyBoxB& boxB) const;
354  StepBase* MakeClone(){return new PairCut();}
355 protected:
356  Float_t _inv_mass_min;
357 };
358 
359 class P0DVetoCut: public StepBase{
360 public:
361  using StepBase::Apply;
362  bool Apply(AnaEventC& event, ToyBoxB& boxB) const;
363  StepBase* MakeClone(){return new P0DVetoCut();}
364 };
365 
367 public:
369  _min_mom = (Float_t)ND::params().GetParameterD("psycheSelections.nueCCAnalysis.Cuts.HiMom.MinMom");
370  };
371  using StepBase::Apply;
372  bool Apply(AnaEventC& event, ToyBoxB& boxB) const;
374 protected:
375  Float_t _min_mom;
376 };
377 
378 class ECalVetoCut: public StepBase{
379 public:
380  ECalVetoCut(){
381  _delta_z_min = (Float_t)ND::params().GetParameterD("psycheSelections.nueCCAnalysis.Cuts.ECalVeto.DeltaZMin");
382  };
383  using StepBase::Apply;
384  bool Apply(AnaEventC& event, ToyBoxB& boxB) const;
385  StepBase* MakeClone(){return new ECalVetoCut();}
386 protected:
387  Float_t _delta_z_min;
388 };
389 
390 class ToFCut: public StepBase{
391 public:
392  ToFCut(){
393  _fgdecaltof = (Float_t)ND::params().GetParameterD("psycheSelections.nueCCAnalysis.Cuts.ToF.FGDEcal");
394  };
395  using StepBase::Apply;
396  bool Apply(AnaEventC& event, ToyBoxB& boxB) const;
397  StepBase* MakeClone(){return new ToFCut();}
398 protected:
399  Float_t _fgdecaltof;
400 };
401 
403  public:
404  using StepBase::Apply;
405  bool Apply(AnaEventC& event, ToyBoxB& box) const;
407 };
408 
410 public:
411  using StepBase::Apply;
412  bool Apply(AnaEventC& event, ToyBoxB& boxB) const;
414 };
415 
416 #endif
StepBase * MakeClone()
MANDATORY FUNCTIONS !!!
StepBase * MakeClone()
MANDATORY FUNCTIONS !!!
bool IsRelevantRecObjectForSystematic(const AnaEventC &event, AnaRecObjectC *track, SystId_h systId, Int_t branch) const
Is this track relevant for a given systematic (prior to selection, call when initializing the event...
void DefineDetectorFV()
Define the detector Fiducial Volume in which this selection is applied.
void Reset()
This method should be implemented by the derived class. If so it does nothing here.
int GetParameterI(std::string)
Get parameter. Value is returned as integer.
Definition: Parameters.cxx:217
StepBase * MakeClone()
MANDATORY FUNCTIONS !!!
StepBase * MakeClone()
MANDATORY FUNCTIONS !!!
Int_t FGD2ShowerNFGD2TPC3Tracks
FGD2 shower.
Int_t P0DVetoP0DEcalTracks
Number of P0DEcal tracks. Used in the P0D veto cut.
StepBase * MakeClone()
MANDATORY FUNCTIONS !!!
AnaTrackB * ECalVetoTrack
The most-upstream track containing ECal information.
StepBase * MakeClone()
MANDATORY FUNCTIONS !!!
StepBase * MakeClone()
MANDATORY FUNCTIONS !!!
Int_t TPCVetoNearTracks
Updated TPC veto.
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) ...
bool IsRelevantSystematic(const AnaEventC &event, const ToyBoxB &box, SystId_h systId, Int_t branch) const
Is this systematic relevant for this selection.
StepBase * MakeClone()
MANDATORY FUNCTIONS !!!
Int_t P0DVetoFGD1Tracks
The number of tracks that start in FGD1. Used in the P0D veto cut.
StepBase * MakeClone()
MANDATORY FUNCTIONS !!!
StepBase * MakeClone()
MANDATORY FUNCTIONS !!!
StepBase * MakeClone()
MANDATORY FUNCTIONS !!!
StepBase * MakeClone()
MANDATORY FUNCTIONS !!!
void InitializeEvent(AnaEventC &event)
Fill the EventBox with the objects needed by this selection.
StepBase * MakeClone()
MANDATORY FUNCTIONS !!!
virtual bool Apply(AnaEventC &event, ToyBoxB &box) const
Definition: StepBase.hxx:46
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) ...
AnaTrackB * VetoTrack
The TPC veto track.
StepBase * MakeClone()
MANDATORY FUNCTIONS !!!
Representation of a global track.
Int_t NOOFVTracks
OOFV tracks.
bool Apply(AnaEventC &event, bool &redo)
Apply all steps in the selection.
AnaTrackB * SecondMostEnergeticFGDTPCTrack
The second most energetic TPC track in the same FGD as the main track.
double GetParameterD(std::string)
Get parameter. Value is returned as double.
Definition: Parameters.cxx:229
AnaTrackB * SecondMostEnergeticTPCTrack
The second most energetic TPC track.
ToyBoxB * MakeToyBox()
Create the appropriate type of box.
StepBase * MakeClone()
MANDATORY FUNCTIONS !!!
bool IsRelevantTrueObjectForSystematic(const AnaEventC &event, AnaTrueObjectC *trueTrack, SystId_h systId, Int_t branch) const
Is this true track relevant for a given systematic (prior to selection, call when initializing the ev...
StepBase * MakeClone()
MANDATORY FUNCTIONS !!!
StepBase * MakeClone()
MANDATORY FUNCTIONS !!!
bool CheckRedoSelection(const AnaEventC &eventC, const ToyBoxB &PreviousToyBox, Int_t &redoFromStep)
AnaTrackB * PairTrack
The particle that isn't HMTrackSelected that forms the e+e- pair with the lowest invariant mass...
StepBase * MakeClone()
MANDATORY FUNCTIONS !!!
void DefineSteps()
Define all steps in the selection.
StepBase * MakeClone()
MANDATORY FUNCTIONS !!!
StepBase * MakeClone()
MANDATORY FUNCTIONS !!!
StepBase * MakeClone()
MANDATORY FUNCTIONS !!!
ToyBoxB ** PreviousToyBox
Array of pointers to the PreviousToyBox (for each event)
Int_t P0DVetoP0DTracks
The number of tracks that start in the P0D. Used in the P0D veto cut.
StepBase * MakeClone()
MANDATORY FUNCTIONS !!!
StepBase * MakeClone()
MANDATORY FUNCTIONS !!!
StepBase * MakeClone()
MANDATORY FUNCTIONS !!!
StepBase * MakeClone()
MANDATORY FUNCTIONS !!!