Hall-D Software  alpha
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DReactionStepVertexInfo.h
Go to the documentation of this file.
1 #ifndef DReactionStepVertexInfo_h
2 #define DReactionStepVertexInfo_h
3 
4 #include <set>
5 #include <map>
6 #include <iostream>
7 #include <vector>
8 #include <algorithm>
9 
10 #include "particleType.h"
11 #include "ANALYSIS/DReaction.h"
12 
13 using namespace std;
14 
15 //reaction-based vertex info
16 namespace DAnalysis
17 {
18 
20 {
24 };
25 
27 {
28  public:
29 
30  //CONSTRUCTORS
32  void Set_Members(const DReaction* locReaction, size_t locStartStepIndex);
33  void Reset(void);
34 
35  //ADDING STEPS & PARTICLES
36  void Add_ReactionStep(size_t locStepIndex);
37  void Set_ParticleIndices(bool locFitFlag, const vector<pair<int, int>>& locFullConstrainParticles, const vector<pair<int, int>>& locDecayingParticles,
38  const vector<pair<int, int>>& locOnlyConstrainTimeParticles, const vector<pair<int, int>>& locNoConstrainParticles);
39 
40  //REGISTER DECAY VERTICES
41  void Register_DecayingNoConstrainUseVertex(bool locFitFlag, const pair<int, int>& locDecayingNoConstrainPair, const DReactionStepVertexInfo* locVertexInfo);
42  void Register_DecayingParticleConstraints(bool locFitFlag, const vector<pair<int, int>>& locNoConstrainDecayingParticles,
43  const map<pair<int, int>, const DReactionStepVertexInfo*>& locFullConstrainDecayingParticles);
44  void Set_DanglingVertexFlag(bool locIsDanglingVertexFlag){dIsDanglingVertexFlag = locIsDanglingVertexFlag;}
45  void Set_FittableVertexFlag(bool locIsFittableVertexFlag){dIsFittableVertexFlag = locIsFittableVertexFlag;}
46  void Set_IsInclusiveVertexFlag(bool locIsInclusiveVertexFlag){dIsInclusiveVertexFlag = locIsInclusiveVertexFlag;}
47 
48  //GET REACTION INFO
49  const DReaction* Get_Reaction(void) const{return dReaction;}
50  vector<size_t> Get_StepIndices(void) const{return dReactionStepIndices;}
51  bool Get_ProductionVertexFlag(void) const{return dIsProductionVertexFlag;}
52  bool Get_DanglingVertexFlag(void) const{return dIsDanglingVertexFlag;}
53  bool Get_FittableVertexFlag(void) const{return dIsFittableVertexFlag;}
54  bool Get_IsInclusiveVertexFlag(void) const{return dIsInclusiveVertexFlag;}
55 
56  //GET PARTICLES
57  vector<pair<int, int>> Get_FullConstrainParticles(bool locFitFlag, DReactionState_t locState = d_EitherState, Charge_t locCharge = d_AllCharges, bool locIncludeDecayingFlag = true) const;
58  vector<pair<int, int>> Get_DecayingParticles(DReactionState_t locState = d_EitherState, Charge_t locCharge = d_AllCharges) const;
59  vector<pair<int, int>> Get_OnlyConstrainTimeParticles(void) const{return dOnlyConstrainTimeParticles;}
60  vector<pair<int, int>> Get_NoConstrainParticles(bool locFitFlag, DReactionState_t locState = d_EitherState, Charge_t locCharge = d_AllCharges,
61  bool locIncludeDecayingFlag = true, bool locIncludeMissingFlag = true, bool locIncludeTargetFlag = true) const;
62  vector<pair<int, int>> Get_MissingParticles(DReactionState_t locState = d_EitherState, Charge_t locCharge = d_AllCharges) const;
63 
64  //sorted decaying
65  map<pair<int, int>, const DReactionStepVertexInfo*> Get_DecayingParticles_NoConstrain(bool locFitFlag) const{return dDecayingParticles_NoConstrain.find(locFitFlag)->second;}
66  map<pair<int, int>, const DReactionStepVertexInfo*> Get_DecayingParticles_FullConstrain(bool locFitFlag) const{return dDecayingParticles_FullConstrain.find(locFitFlag)->second;}
67 
68  //independent of state
69  vector<pair<int, int>> Get_Particles(DReactionState_t locState = d_EitherState, Charge_t locCharge = d_AllCharges,
70  bool locIncludeDecayingFlag = true, bool locIncludeMissingFlag = true, bool locIncludeTargetFlag = true) const;
71 
72  //parent vertex info
73  void Set_ParentVertexInfo(const DReactionStepVertexInfo* locStepVertexInfo){dParentVertexInfo = locStepVertexInfo;}
74  const DReactionStepVertexInfo* Get_ParentVertexInfo(void) const{return dParentVertexInfo;}
75 
76  private:
77 
78  //MAP BOOL: KinFitFlag: true for kinfit particle information, false for reconstruction particle information
79  //The difference:
80  //For the production vertex, if the beamline is not used in the fit (due to errors = 0), and there's only one charged track:
81  //The vertex is reconstructable, but it's not fittable
82 
83  //PRIVATE METHODS
84  vector<pair<int, int>> Filter_Particles(vector<pair<int, int>> locParticles, DReactionState_t locState, Charge_t locCharge,
85  bool locIncludeDecayingFlag = true, bool locIncludeMissingFlag = true, bool locIncludeTargetFlag = true) const;
86 
87  //REACTION SUMMARY INFO
88  const DReaction* dReaction = nullptr; //only the first reaction is stored, though there may be several represented by this object (identical channel content)
89  vector<size_t> dReactionStepIndices; //in order from smallest to largest
90  bool dIsProductionVertexFlag = false;
91  bool dIsInclusiveVertexFlag = false;
92 
93  //PARTICLE INFO //sorted!
94  //pair: step, particle indices (including all: beam, target, decaying, detected, and missing)
95  map<bool, vector<pair<int, int>>> dFullConstrainParticles; //detected charged tracks & beam, decaying when registered
96  vector<pair<int, int>> dOnlyConstrainTimeParticles; //detected photons
97  map<bool, vector<pair<int, int>>> dNoConstrainParticles; //missing, massive neutrals, decaying when registered, target
98 
99  //DECAY INFO
100  //Note, decaying particles that decay in-place at this vertex (e.g. pi0) will only appear once: with their "final-state" indices
101  //If the decaying particle has a detached vertex, then the indices reported here are the ones where it appears for the vertex (initial/final state)
102  vector<pair<int, int>> dDecayingParticles; //all, whether used to constrain or not
103  map<bool, map<pair<int, int>, const DReactionStepVertexInfo*>> dDecayingParticles_NoConstrain; //vertex-info: where it is used to constrain (nullptr if not)
104  map<bool, map<pair<int, int>, const DReactionStepVertexInfo*>> dDecayingParticles_FullConstrain; //vertex-info: where it was defined
105 
106  //DANGLING
107  //is it dangling? dangling = vertex indeterminable, even if not fitting & with all particle information
108  //if is true, then vertex parent is either:
109  //in dDecayingParticles_NoConstrain if it's not empty (at most one will have non-null info), or is center of target
110  bool dIsDanglingVertexFlag = false;
111  bool dIsFittableVertexFlag = true;
112  const DReactionStepVertexInfo* dParentVertexInfo = nullptr; //null if production vertex
113 };
114 
115 /****************************************************** NAMESPACE-SCOPE NON-INLINE FUNCTION DECLARATIONS *******************************************************/
116 
117 string Build_VertexConstraintString(const DReactionStepVertexInfo* locVertexInfo, bool locSpacetimeFitFlag);
119 
120 /************************************************************** CONSTRUCTORS & OPERATORS ***************************************************************/
121 
122 inline DReactionStepVertexInfo::DReactionStepVertexInfo(void)
123 {
124  dFullConstrainParticles.emplace(true, vector<pair<int, int>>{});
125  dFullConstrainParticles.emplace(false, vector<pair<int, int>>{});
126  dNoConstrainParticles.emplace(true, vector<pair<int, int>>{});
127  dNoConstrainParticles.emplace(false, vector<pair<int, int>>{});
128 
129  dDecayingParticles_NoConstrain.emplace(true, map<pair<int, int>, const DReactionStepVertexInfo*>{});
130  dDecayingParticles_NoConstrain.emplace(false, map<pair<int, int>, const DReactionStepVertexInfo*>{});
131  dDecayingParticles_FullConstrain.emplace(true, map<pair<int, int>, const DReactionStepVertexInfo*>{});
132  dDecayingParticles_FullConstrain.emplace(false, map<pair<int, int>, const DReactionStepVertexInfo*>{});
133 }
134 
135 inline void DReactionStepVertexInfo::Set_Members(const DReaction* locReaction, size_t locStartStepIndex)
136 {
137  dReaction = locReaction;
138  dReactionStepIndices = {locStartStepIndex};
139  dIsProductionVertexFlag = ((locStartStepIndex == 0) && DAnalysis::Get_IsFirstStepBeam(locReaction));
140 }
141 
142 inline void DReactionStepVertexInfo::Reset(void)
143 {
144  //REACTION SUMMARY INFO
145  dReaction = nullptr;
146  dReactionStepIndices.clear();
147  dIsProductionVertexFlag = false;
148  dIsInclusiveVertexFlag = false;
149 
150  //PARTICLE INFO
151  dFullConstrainParticles.clear();
152  dOnlyConstrainTimeParticles.clear();
153  dNoConstrainParticles.clear();
154 
155  //DECAY INFO
156  dDecayingParticles.clear();
157  dDecayingParticles_NoConstrain.clear();
158  dDecayingParticles_FullConstrain.clear();
159 
160  //EMPLACE
161  dFullConstrainParticles.emplace(true, vector<pair<int, int>>{});
162  dFullConstrainParticles.emplace(false, vector<pair<int, int>>{});
163  dNoConstrainParticles.emplace(true, vector<pair<int, int>>{});
164  dNoConstrainParticles.emplace(false, vector<pair<int, int>>{});
165 
166  dDecayingParticles_NoConstrain.emplace(true, map<pair<int, int>, const DReactionStepVertexInfo*>{});
167  dDecayingParticles_NoConstrain.emplace(false, map<pair<int, int>, const DReactionStepVertexInfo*>{});
168  dDecayingParticles_FullConstrain.emplace(true, map<pair<int, int>, const DReactionStepVertexInfo*>{});
169  dDecayingParticles_FullConstrain.emplace(false, map<pair<int, int>, const DReactionStepVertexInfo*>{});
170 
171  //FLAGS
172  dIsDanglingVertexFlag = false;
173  dIsFittableVertexFlag = true;
174  dParentVertexInfo = nullptr;
175 }
176 
177 /************************************************************** INLINE FUNCTIONS ***************************************************************/
178 
179 inline void DReactionStepVertexInfo::Add_ReactionStep(size_t locStepIndex)
180 {
181  dReactionStepIndices.push_back(locStepIndex);
182  std::sort(dReactionStepIndices.begin(), dReactionStepIndices.end()); //just in case
183 }
184 
185 inline void DReactionStepVertexInfo::Register_DecayingNoConstrainUseVertex(bool locFitFlag, const pair<int, int>& locDecayingNoConstrainPair, const DReactionStepVertexInfo* locVertexInfo)
186 {
187  dDecayingParticles_NoConstrain[locFitFlag][locDecayingNoConstrainPair] = locVertexInfo;
188 }
189 
190 inline vector<pair<int, int>> DReactionStepVertexInfo::Get_FullConstrainParticles(bool locFitFlag, DReactionState_t locState, Charge_t locCharge, bool locIncludeDecayingFlag) const
191 {
192  return Filter_Particles(dFullConstrainParticles.find(locFitFlag)->second, locState, locCharge, locIncludeDecayingFlag);
193 }
194 
195 inline vector<pair<int, int>> DReactionStepVertexInfo::Get_DecayingParticles(DReactionState_t locState, Charge_t locCharge) const
196 {
197  return Filter_Particles(dDecayingParticles, locState, locCharge);
198 }
199 
200 inline vector<pair<int, int>> DReactionStepVertexInfo::Get_NoConstrainParticles(bool locFitFlag, DReactionState_t locState, Charge_t locCharge,
201  bool locIncludeDecayingFlag, bool locIncludeMissingFlag, bool locIncludeTargetFlag) const
202 {
203  return Filter_Particles(dNoConstrainParticles.find(locFitFlag)->second, locState, locCharge, locIncludeDecayingFlag, locIncludeMissingFlag, locIncludeTargetFlag);
204 }
205 
206 inline vector<pair<int, int>> DReactionStepVertexInfo::Get_MissingParticles(DReactionState_t locState, Charge_t locCharge) const
207 {
208  vector<pair<int, int>> locParticles = Filter_Particles(dNoConstrainParticles.find(false)->second, locState, locCharge, false, true, false);
209 
210  auto Check_NotMissing = [&](const pair<int, int>& locIndices) -> bool
211  {return (locIndices.second != dReaction->Get_ReactionStep(locIndices.first)->Get_MissingParticleIndex());};
212 
213  locParticles.erase(std::remove_if(locParticles.begin(), locParticles.end(), Check_NotMissing), locParticles.end());
214  return locParticles;
215 }
216 
217 inline vector<pair<int, int>> DReactionStepVertexInfo::Get_Particles(DReactionState_t locState, Charge_t locCharge, bool locIncludeDecayingFlag, bool locIncludeMissingFlag, bool locIncludeTargetFlag) const
218 {
219  //ASSUMES Object has been fully created before calling
220  vector<pair<int, int>> locParticles = dFullConstrainParticles.find(true)->second;
221  locParticles.insert(locParticles.end(), dOnlyConstrainTimeParticles.begin(), dOnlyConstrainTimeParticles.end());
222  locParticles.insert(locParticles.end(), dNoConstrainParticles.find(true)->second.begin(), dNoConstrainParticles.find(true)->second.end());
223  std::sort(locParticles.begin(), locParticles.end());
224  return Filter_Particles(locParticles, locState, locCharge, locIncludeDecayingFlag, locIncludeMissingFlag, locIncludeTargetFlag);
225 }
226 
227 } //end DAnalysis namespace
228 
229 #endif // DReactionStepVertexInfo_h
bool Get_IsFirstStepBeam(const DReaction *locReaction)
Definition: DReaction.h:178
map< bool, vector< pair< int, int > > > dFullConstrainParticles
void Print_ReactionStepVertexInfo(const DReactionStepVertexInfo *locStepInfo)
string Build_VertexConstraintString(const DReactionStepVertexInfo *locVertexInfo, bool locSpacetimeFitFlag)
void Set_FittableVertexFlag(bool locIsFittableVertexFlag)
map< pair< int, int >, const DReactionStepVertexInfo * > Get_DecayingParticles_FullConstrain(bool locFitFlag) const
void Set_ParentVertexInfo(const DReactionStepVertexInfo *locStepVertexInfo)
map< bool, vector< pair< int, int > > > dNoConstrainParticles
vector< pair< int, int > > dDecayingParticles
Charge_t
void Set_IsInclusiveVertexFlag(bool locIsInclusiveVertexFlag)
const DReactionStepVertexInfo * Get_ParentVertexInfo(void) const
map< bool, map< pair< int, int >, const DReactionStepVertexInfo * > > dDecayingParticles_NoConstrain
const DReaction * Get_Reaction(void) const
map< bool, map< pair< int, int >, const DReactionStepVertexInfo * > > dDecayingParticles_FullConstrain
void Set_DanglingVertexFlag(bool locIsDanglingVertexFlag)
vector< pair< int, int > > Get_FullConstrainParticles(const DReactionVertexInfo *locReactionVertexInfo, bool locFitFlag, DReactionState_t locState=d_EitherState, Charge_t locCharge=d_AllCharges, bool locIncludeDecayingFlag=true)
vector< pair< int, int > > Get_OnlyConstrainTimeParticles(void) const
map< pair< int, int >, const DReactionStepVertexInfo * > Get_DecayingParticles_NoConstrain(bool locFitFlag) const
vector< size_t > Get_StepIndices(void) const
vector< pair< int, int > > dOnlyConstrainTimeParticles