HighLAND
numuBkgInAntiNuModeCCMultiPiFGD2Selection.cxx
1 #include "numuBkgInAntiNuModeCCMultiPiFGD2Selection.hxx"
2 #include "antiNumuCCMultiPiFGD2Selection.hxx"
3 #include "baseSelection.hxx"
4 #include "CutUtils.hxx"
5 #include "EventBoxUtils.hxx"
6 #include "Parameters.hxx"
7 #include "SubDetId.hxx"
8 #include "SystId.hxx"
9 #include "VersioningUtils.hxx"
10 #include "SystematicUtils.hxx"
11 
12 
13 //*******************************************************************************
14 numuBkgInAntiNuModeCCMultiPiFGD2Selection::numuBkgInAntiNuModeCCMultiPiFGD2Selection(bool forceBreak): SelectionBase(forceBreak,EventBoxId::kEventBoxTracker){
15 //*******************************************************************************
16 
17  // initialize selections being used
18  _numuCCMultiPiFGD2Selection.Initialize();
19  _numuBkgInAntiNuModeCCFGD2Selection.Initialize();
20  _numuBkgInAntiNuModeCCMultiPiSelection.Initialize();
21 }
22 
23 //*******************************************************************************
25 //*******************************************************************************
26 
27  // Copy all steps from the numuBkgInAntiNuModeCCFGD2Selection
28  CopySteps(_numuBkgInAntiNuModeCCFGD2Selection);
29 
30  //Additional actions for the multi-pi selection.
31  AddStep(StepBase::kAction, "fill_summary numuBkgMultiPiFGD2", new FillSummaryAction_numuBkgMultiPiFGD2());
32  AddStep(StepBase::kAction, "find_pions", new FindPionsAction());
33 
34  //Add a split to the trunk with 3 branches.
35  AddSplit(3);
36 
37  //First branch is for CC-0pi
38  AddStep(0, StepBase::kCut, "CC-0pi", new NoPionCut());
39 
40  //Second branch is for CC-1pi
41  AddStep(1, StepBase::kCut, "CC-1pi", new OnePionCut());
42 
43  //Third branch is for CC-Other
44  AddStep(2, StepBase::kCut, "CC-Other", new OthersCut());
45 
46  // Set the branch aliases to the three branches
47  SetBranchAlias(0,"CC-0pi",0);
48  SetBranchAlias(1,"CC-1pi",1);
49  SetBranchAlias(2,"CC-Other",2);
50 
51  // By default the preselection correspond to cuts 0-2
52  SetPreSelectionAccumLevel(2);
53 }
54 
55 //*******************************************************************************
57 //*******************************************************************************
58 
59  // The detector in which the selection is applied
60  SetDetectorFV(SubDetId::kFGD2);
61 
62  _numuCCMultiPiFGD2Selection.SetDetectorFV(SubDetId::kFGD2);
63  _numuBkgInAntiNuModeCCFGD2Selection.SetDetectorFV(SubDetId::kFGD2);
64  _numuBkgInAntiNuModeCCMultiPiSelection.SetDetectorFV(SubDetId::kFGD2);
65 }
66 
67 //********************************************************************
68 bool numuBkgInAntiNuModeCCMultiPiFGD2Selection::FillEventSummary(AnaEventC& event, Int_t allCutsPassed[]){
69 //********************************************************************
70 
71  //CC0pi
72  if(allCutsPassed[0]){
73  static_cast<AnaEventSummaryB*>(event.Summary)->EventSample = SampleId::kFGD2NuMuBkgInAntiNuModeCC0Pi;
74  }
75  //CC1pi
76  else if (allCutsPassed[1]){
77  static_cast<AnaEventSummaryB*>(event.Summary)->EventSample = SampleId::kFGD2NuMuBkgInAntiNuModeCC1Pi;
78  }
79  //CCOther
80  else if (allCutsPassed[2]){
81  static_cast<AnaEventSummaryB*>(event.Summary)->EventSample = SampleId::kFGD2NuMuBkgInAntiNuModeCCOther;
82  }
83 
84  // otherwise kUnassigned is used from the EventSummary constructor
85  return (static_cast<AnaEventSummaryB*>(event.Summary)->EventSample != SampleId::kUnassigned);
86 }
87 
88 
89 //*********************************************************************
91 //*********************************************************************
92 
93  // Cast the ToyBox to the appropriate type
94  ToyBoxTracker& box = *static_cast<ToyBoxTracker*>(&boxB);
95 
96  if(!box.HMNtrack) return 1;
97 
98  static_cast<AnaEventSummaryB*>(event.Summary)->LeptonCandidate[SampleId::kFGD2NuMuBkgInAntiNuModeCC0Pi] = box.HMNtrack;
99  static_cast<AnaEventSummaryB*>(event.Summary)->LeptonCandidate[SampleId::kFGD2NuMuBkgInAntiNuModeCC1Pi] = box.HMNtrack;
100  static_cast<AnaEventSummaryB*>(event.Summary)->LeptonCandidate[SampleId::kFGD2NuMuBkgInAntiNuModeCCOther] = box.HMNtrack;
101 
102  for(int i = 0; i < 4; ++i){
103  static_cast<AnaEventSummaryB*>(event.Summary)->VertexPosition[SampleId::kFGD2NuMuBkgInAntiNuModeCC0Pi][i] = box.HMNtrack->PositionStart[i];
104  static_cast<AnaEventSummaryB*>(event.Summary)->VertexPosition[SampleId::kFGD2NuMuBkgInAntiNuModeCC1Pi][i] = box.HMNtrack->PositionStart[i];
105  static_cast<AnaEventSummaryB*>(event.Summary)->VertexPosition[SampleId::kFGD2NuMuBkgInAntiNuModeCCOther][i] = box.HMNtrack->PositionStart[i];
106  }
107  if(box.HMNtrack->GetTrueParticle()){
108  static_cast<AnaEventSummaryB*>(event.Summary)->TrueVertex[SampleId::kFGD2NuMuBkgInAntiNuModeCC0Pi] = box.HMNtrack->GetTrueParticle()->TrueVertex;
109  static_cast<AnaEventSummaryB*>(event.Summary)->TrueVertex[SampleId::kFGD2NuMuBkgInAntiNuModeCC1Pi] = box.HMNtrack->GetTrueParticle()->TrueVertex;
110  static_cast<AnaEventSummaryB*>(event.Summary)->TrueVertex[SampleId::kFGD2NuMuBkgInAntiNuModeCCOther] = box.HMNtrack->GetTrueParticle()->TrueVertex;
111  }
112  return 1;
113 }
114 
115 //**************************************************
116 bool numuBkgInAntiNuModeCCMultiPiFGD2Selection::IsRelevantRecObjectForSystematic(const AnaEventC& event, AnaRecObjectC* track, SystId_h systId, Int_t branch) const{
117 //**************************************************
118 
119  return _numuCCMultiPiFGD2Selection.IsRelevantRecObjectForSystematic(event,track,systId,branch);
120 }
121 
122 //**************************************************
123 bool numuBkgInAntiNuModeCCMultiPiFGD2Selection::IsRelevantTrueObjectForSystematic(const AnaEventC& event, AnaTrueObjectC* trueTrack, SystId_h systId, Int_t branch) const{
124 //**************************************************
125 
126  return _numuCCMultiPiFGD2Selection.IsRelevantTrueObjectForSystematic(event,trueTrack,systId,branch);
127 }
128 
129 //**************************************************
130 bool numuBkgInAntiNuModeCCMultiPiFGD2Selection::IsRelevantSystematic(const AnaEventC& event, const ToyBoxB& box, SystId_h systId, Int_t branch) const{
131 //**************************************************
132 
133  return _numuBkgInAntiNuModeCCMultiPiSelection.IsRelevantSystematic(event,box,systId,branch);
134 }
135 
136 //**************************************************
138 //**************************************************
139 
140  _numuCCMultiPiFGD2Selection.InitializeEvent(event);
141 }
142 
143 //********************************************************************
144 bool numuBkgInAntiNuModeCCMultiPiFGD2Selection::CheckRedoSelection(const AnaEventC& event, const ToyBoxB& PreviousToyBox, Int_t& redoFromStep){
145 //********************************************************************
146 
147  return _numuCCMultiPiFGD2Selection.CheckRedoSelection(event, PreviousToyBox, redoFromStep);
148 }
AnaTrueVertexB * TrueVertex
Pointer to the AnaTrueVertexB of the interaction that created this AnaTrueParticleB.
bool CheckRedoSelection(const AnaEventC &event, const ToyBoxB &PreviousToyBox, Int_t &redoFromStep)
Float_t PositionStart[4]
The reconstructed start position of the particle.
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...
void DefineDetectorFV()
Define the detector Fiducial Volume in which this selection is applied.
bool IsRelevantSystematic(const AnaEventC &event, const ToyBoxB &box, SystId_h systId, Int_t branch) const
Is this systematic relevant for this selection.
AnaTrackB * HMNtrack
For storing the highest momentum negative track.
void InitializeEvent(AnaEventC &event)
Fill the EventBox with the objects needed by this selection.
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...
AnaEventSummaryC * Summary
A summary of the event with high level quantities.
AnaTrueParticleB * GetTrueParticle() const
Return a casted version of the AnaTrueObject associated.
void Initialize()
Initialize this selection: defines the steps and the detectorFV.