Hall-D Software  alpha
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DReaction.h
Go to the documentation of this file.
1 #ifndef _DReaction_
2 #define _DReaction_
3 
4 #include <vector>
5 #include <string>
6 #include <algorithm>
7 #include <iostream>
8 #include <set>
9 
10 #include "JANA/JObject.h"
11 #include "JANA/JEventLoop.h"
12 #include "JANA/JFactory.h"
13 #include "particleType.h"
14 #include "ANALYSIS/DReactionStep.h"
15 
16 using namespace std;
17 using namespace jana;
18 using namespace DAnalysis;
19 
20 namespace DAnalysis
21 {
22 
23 class DAnalysisAction;
24 
26 {
27  d_NoFit = 0,
28  d_P4Fit = 1, //also includes invariant mass constraints
31  d_P4AndVertexFit = 4, //also includes invariant mass constraints
32  d_P4AndSpacetimeFit = 5 //also includes invariant mass constraints
33 };
34 
35 class DReaction : public JObject
36 {
37  public:
38  JOBJECT_PUBLIC(DReaction);
39 
40  // CONSTRUCTOR: //User must specify a unique reaction name upon construction
41  DReaction(void) = delete;
42  DReaction(string locReactionName, vector<const DReactionStep*> locSteps = {}, DKinFitType locKinFitType = d_NoFit, string locTreeFileName = "");
43 
44  // DESTRUCTOR:
45  virtual ~DReaction(void);
46 
47  // SET OBJECT DATA:
48  void Add_ReactionStep(const DReactionStep* locReactionStep){dReactionSteps.push_back(locReactionStep);}
49  void Clear_ReactionSteps(void){dReactionSteps.clear();}
50  void Add_AnalysisAction(DAnalysisAction* locAnalysisAction){dAnalysisActions.push_back(locAnalysisAction);}
51 
52  // SET KINFIT CONTROL
53  void Set_KinFitType(DKinFitType locKinFitType){dKinFitType = locKinFitType;}
54  void Set_KinFitUpdateCovarianceMatricesFlag(bool locUpdateFlag){dKinFitUpdateCovarianceMatricesFlag = locUpdateFlag;}
55 
56  // SET PRE-DPARTICLECOMBO CUT VALUES //Command-line values will override these values
57  void Set_NumPlusMinusRFBunches(size_t locNumPlusMinusRFBunches){dNumPlusMinusRFBunches = locNumPlusMinusRFBunches;}
58  void Set_MaxExtraShowers(size_t locMaxExtraShowers){dMaxExtraShowers = pair<bool, size_t>(true, locMaxExtraShowers);}
59  void Set_MaxExtraGoodTracks(size_t locMaxExtraGoodTracks){dMaxExtraGoodTracks = pair<bool, size_t>(true, locMaxExtraGoodTracks);}
60 
61  //DEPRECATED FUNCTIONS
62  void Set_MaxPhotonRFDeltaT(double locMaxPhotonRFDeltaT);
63  void Set_InvariantMassCut(Particle_t locStepInitialPID, double locMinInvariantMass, double locMaxInvariantMass);
64  void Add_ComboPreSelectionAction(DAnalysisAction* locAction);
65  void Set_MinChargedPIDFOM(double locMinChargedPIDFOM){cout << "WARNING: DReaction::Set_MinChargedPIDFOM() IS CURRENTLY DEPRECATED AND DOES NOTHING." << endl;}
66  void Set_MinPhotonPIDFOM(double locMinPhotonPIDFOM){cout << "WARNING: DReaction::Set_MinPhotonPIDFOM() IS CURRENTLY DEPRECATED AND DOES NOTHING." << endl;}
67  void Set_MinProtonMomentum(double locMinProtonMomentum){cout << "WARNING: DReaction::Set_MinProtonMomentum() IS DEPRECATED AND DOES NOTHING." << endl;}
68  void Set_MaxNumBeamPhotonsInBunch(size_t locMaxNumBeamPhotonsInBunch){cout << "WARNING: DReaction::Set_MinProtonMomentum() IS DEPRECATED AND DOES NOTHING." << endl;}
69  void Set_AnyComboFlag(bool locAnyComboFlag){cout << "WARNING: DReaction::Set_AnyComboFlag() IS CURRENTLY DEPRECATED AND DOES NOTHING." << endl;}
70 
71  // SET EventStore SKIMS //comma-separated list expected
72  void Set_EventStoreSkims(string locEventStoreSkims){dEventStoreSkims = locEventStoreSkims;}
73 
74  // GET CONTROL INFO:
75  string Get_ReactionName(void) const{return dReactionName;}
76  bool Get_IsInclusiveFlag(void) const;
77 
78  // GET KINFIT CONTROL
79  DKinFitType Get_KinFitType(void) const{return dKinFitType;}
80  bool Get_KinFitUpdateCovarianceMatricesFlag(void) const{return dKinFitUpdateCovarianceMatricesFlag;}
81 
82  // GET REACTION STEPS:
83  size_t Get_NumReactionSteps(void) const{return dReactionSteps.size();}
84  const DReactionStep* Get_ReactionStep(size_t locStepIndex) const{return dReactionSteps.at(locStepIndex);}
85  vector<const DReactionStep*> Get_ReactionSteps(void) const{return dReactionSteps;}
86 
87  // GET PIDS //step index of -1: All steps
88  vector<Particle_t> Get_FinalPIDs(int locStepIndex = -1, bool locIncludeMissingFlag = true, bool locIncludeDecayingFlag = true,
89  Charge_t locCharge = d_AllCharges, bool locIncludeDuplicatesFlag = true) const;
90  vector<Particle_t> Get_MissingPIDs(int locStepIndex = -1, Charge_t locCharge = d_AllCharges, bool locIncludeDuplicatesFlag = true) const;
91 
92  // GET ANALYSIS ACTIONS:
93  size_t Get_NumAnalysisActions(void) const{return dAnalysisActions.size();}
94  vector<DAnalysisAction*> Get_AnalysisActions(void) const{return dAnalysisActions;}
95 
96  // GET PRE-DPARTICLECOMBO CUT VALUES //Command-line values will override these values
97  size_t Get_NumPlusMinusRFBunches(void) const{return dNumPlusMinusRFBunches;}
98  pair<bool, double> Get_MaxPhotonRFDeltaT(void) const{return dMaxPhotonRFDeltaT;} //DEPRECATED!!!
99  pair<bool, size_t> Get_MaxExtraShowers(void) const{return dMaxExtraShowers;}
100  pair<bool, size_t> Get_MaxExtraGoodTracks(void) const{return dMaxExtraGoodTracks;}
101 
102  // GET EventStore SKIMS //comma-separated list expected
103  string Get_EventStoreSkims(void) const{return dEventStoreSkims;}
104 
105  // ROOT OUTPUT:
106  void Enable_TTreeOutput(string locTTreeOutputFileName, bool locSaveUnusedFlag = false);
107  string Get_TTreeOutputFileName(void) const{return dTTreeOutputFileName;}
108  bool Get_SaveUnusedFlag(void) const{return dSaveUnusedFlag;}
109  bool Get_EnableTTreeOutputFlag(void) const{return dEnableTTreeOutputFlag;}
110 
111  private:
112  // PRIVATE METHODS:
113 
114  // CONTROL MEMBERS:
115  string dReactionName; //must be unique
116  DKinFitType dKinFitType = d_NoFit; //defined in ANALYSIS/DKinFitResults.h
117  bool dKinFitUpdateCovarianceMatricesFlag = false; //true to create new error matrices post-kinfit, false to keep the old ones
118 
119  // ROOT TTREE OUTPUT:
120  bool dEnableTTreeOutputFlag = false;
121  bool dSaveUnusedFlag = false;
122  string dTTreeOutputFileName = "";
123 
124  // REACTION AND ANALYSIS MEMBERS:
125  vector<const DReactionStep*> dReactionSteps;
126  vector<DAnalysisAction*> dAnalysisActions;
127 
128  // PRE-DPARTICLECOMBO CONTROL-CUT VALUES
129  //bool = true/false for cut enabled/disabled, double = cut value
130  //Command-line values (variable names are below in all-caps) will override these values
131  size_t dNumPlusMinusRFBunches = 99999; //COMBO:NUM_PLUSMINUS_RF_BUNCHES //e.g. if 0 then only center bunch, if 2 then +/- 2 bunches
132  pair<bool, double> dMaxPhotonRFDeltaT = make_pair(false, 0.0); //DEPRECATED!!!!
133  pair<bool, size_t> dMaxExtraShowers = make_pair(false, size_t(0)); //COMBO:MAX_EXTRA_SHOWERS
134  pair<bool, size_t> dMaxExtraGoodTracks = make_pair(false, size_t(0)); //COMBO:MAX_EXTRA_GOOD_TRACKS - "good" defined by PreSelect factory
135 
136  // EVENT STORE QUERY
137  string dEventStoreSkims = ""; // First is skim name (default = "all"), second is additional query (default = "")
138 };
139 
140 /****************************************************** NAMESPACE-SCOPE NON-INLINE FUNCTION DECLARATIONS *******************************************************/
141 
142 int Get_DecayStepIndex(const DReaction* locReaction, size_t locStepIndex, size_t locParticleIndex);
143 pair<int, int> Get_InitialParticleDecayFromIndices(const DReaction* locReaction, int locStepIndex);
144 vector<Particle_t> Get_ChainPIDs(const DReaction* locReaction, size_t locStepIndex, int locUpToStepIndex, vector<Particle_t> locUpThroughPIDs, bool locExpandDecayingFlag, bool locExcludeMissingFlag);
145 vector<size_t> Get_DefinedParticleStepIndex(const DReaction* locReaction);
146 vector<const DReaction*> Get_Reactions(JEventLoop* locEventLoop);
147 size_t Get_ParticleInstanceIndex(const DReactionStep* locStep, size_t locParticleIndex);
148 
149 /****************************************************** CONSTRUCTORS AND DESTRUCTORS *******************************************************/
150 
151 inline DReaction::DReaction(string locReactionName, vector<const DReactionStep*> locSteps, DKinFitType locKinFitType, string locTreeFileName) :
152 dReactionName(locReactionName), dKinFitType(locKinFitType), dKinFitUpdateCovarianceMatricesFlag(false), dEnableTTreeOutputFlag(locTreeFileName != ""),
153 dSaveUnusedFlag(false), dTTreeOutputFileName(locTreeFileName), dReactionSteps(locSteps) {}
154 
155 /************************************************************** DREACTION INLINE FUNCTIONS ***************************************************************/
156 
157 inline bool DReaction::Get_IsInclusiveFlag(void) const
158 {
159  auto locInclusiveSearcher = [](const DReactionStep* locStep) -> bool{return locStep->Get_IsInclusiveFlag();};
160  return (std::find_if(dReactionSteps.begin(), dReactionSteps.end(), locInclusiveSearcher) != dReactionSteps.end());
161 }
162 
163 inline void DReaction::Enable_TTreeOutput(string locTTreeOutputFileName, bool locSaveUnusedFlag)
164 {
165  dEnableTTreeOutputFlag = true;
166  dSaveUnusedFlag = locSaveUnusedFlag;
167  dTTreeOutputFileName = locTTreeOutputFileName;
168 }
169 
170 /****************************************************** NAMESPACE-SCOPE INLINE FUNCTIONS: MISC *******************************************************/
171 
172 inline void Print_Reaction(const DReaction* locReaction)
173 {
174  for(auto& locStep : locReaction->Get_ReactionSteps())
176 }
177 
178 inline bool Get_IsFirstStepBeam(const DReaction* locReaction)
179 {
180  //impossible for first step to be rescattering: makes no sense: if has target, treat as beam. else treat as decaying & don't care about production mechanism
181  auto locFirstStep = locReaction->Get_ReactionStep(0);
182  return ((locFirstStep->Get_TargetPID() != Unknown) || (locFirstStep->Get_SecondBeamPID() != Unknown));
183 }
184 
185 inline bool Check_ChannelEquality(const DReaction* lhs, const DReaction* rhs, bool locSameOrderFlag = true, bool locRightSubsetOfLeftFlag = false)
186 {
187  //assume for now that the steps have to be in the same order
188  auto locSteps_lhs = lhs->Get_ReactionSteps();
189  auto locSteps_rhs = rhs->Get_ReactionSteps();
190  if(locSteps_lhs.size() != locSteps_rhs.size())
191  return false;
192 
193  auto Equality_Checker = [&locSameOrderFlag, &locRightSubsetOfLeftFlag](const DReactionStep* lhs, const DReactionStep* rhs) -> bool
194  {return DAnalysis::Check_ChannelEquality(lhs, rhs, locSameOrderFlag, locRightSubsetOfLeftFlag);};
195  return std::equal(locSteps_lhs.begin(), locSteps_lhs.end(), locSteps_rhs.begin(), Equality_Checker);
196 }
197 
198 inline set<size_t> Get_NoConstrainMassSteps(const DReaction* locReaction)
199 {
200  set<size_t> locNoConstrainMassSteps;
201  for(size_t loc_i = 0; loc_i < locReaction->Get_NumReactionSteps(); ++loc_i)
202  {
203  if(!locReaction->Get_ReactionStep(loc_i)->Get_KinFitConstrainInitMassFlag())
204  locNoConstrainMassSteps.insert(loc_i);
205  }
206  return locNoConstrainMassSteps;
207 }
208 
209 /****************************************************** NAMESPACE-SCOPE INLINE FUNCTIONS: PIDS *******************************************************/
210 
211 inline vector<Particle_t> Get_ChainPIDs(const DReaction* locReaction, Particle_t locInitialPID, int locUpToStepIndex, vector<Particle_t> locUpThroughPIDs, bool locExpandDecayingFlag, bool locExcludeMissingFlag)
212 {
213  //if multiple decay steps have locInitialPID as the parent, only the first listed is used
214  auto locReactionSteps = locReaction->Get_ReactionSteps();
215  auto locPIDSearcher = [&locInitialPID](const DReactionStep* locStep) -> bool{return (locStep->Get_InitialPID() == locInitialPID);};
216  auto locStepIterator = std::find_if(locReactionSteps.begin(), locReactionSteps.end(), locPIDSearcher);
217  if(locStepIterator == locReactionSteps.end())
218  return {};
219 
220  size_t locStepIndex = std::distance(locReactionSteps.begin(), locStepIterator);
221  return Get_ChainPIDs(locReaction, locStepIndex, locUpToStepIndex, locUpThroughPIDs, locExpandDecayingFlag, locExcludeMissingFlag);
222 }
223 
224 inline vector<Particle_t> Get_ChainPIDs(const DReaction* locReaction, Particle_t locInitialPID, bool locExpandDecayingFlag, bool locExcludeMissingFlag)
225 {
226  //if multiple decay steps have locInitialPID as the parent, only the first listed is used
227  return Get_ChainPIDs(locReaction, locInitialPID, -1, vector<Particle_t>(), locExpandDecayingFlag, locExcludeMissingFlag);
228 }
229 
230 inline string Convert_PIDsToROOTName(const vector<Particle_t>& locPIDs)
231 {
232  auto locPIDTransformer = [](Particle_t locPID) -> string {return ParticleName_ROOT(locPID);};
233  vector<string> locParticleNames;
234  locParticleNames.reserve(locPIDs.size());
235  std::transform(locPIDs.begin(), locPIDs.end(), std::back_inserter(locParticleNames), locPIDTransformer);
236  return std::accumulate(locParticleNames.begin(), locParticleNames.end(), string(""));
237 }
238 
239 inline vector<pair<int, int>> Get_MissingDecayProductIndices(const DReaction* locReaction, size_t locStepIndex)
240 {
241  vector<pair<int, int>> locMissingDecayProductIndices;
242  auto locReactionStep = locReaction->Get_ReactionStep(locStepIndex);
243  if(locReactionStep->Get_IsInclusiveFlag())
244  locMissingDecayProductIndices.emplace_back(locStepIndex, DReactionStep::Get_ParticleIndex_Inclusive());
245  if(locReactionStep->Get_MissingPID() != Unknown)
246  locMissingDecayProductIndices.emplace_back(locStepIndex, locReactionStep->Get_MissingParticleIndex());
247 
248  for(size_t loc_i = 0; loc_i < locReactionStep->Get_NumFinalPIDs(); ++loc_i)
249  {
250  auto locDecayStepIndex = Get_DecayStepIndex(locReaction, locStepIndex, loc_i);
251  if(locDecayStepIndex <= 0)
252  continue;
253  auto locFurtherMissingDecayProducts = DAnalysis::Get_MissingDecayProductIndices(locReaction, locDecayStepIndex);
254  locMissingDecayProductIndices.insert(locMissingDecayProductIndices.end(), locFurtherMissingDecayProducts.begin(), locFurtherMissingDecayProducts.end());
255  }
256  return locMissingDecayProductIndices;
257 }
258 
259 inline bool Check_IfMissingDecayProduct(const DReaction* locReaction, size_t locStepIndex)
260 {
261  return (!DAnalysis::Get_MissingDecayProductIndices(locReaction, locStepIndex).empty());
262 }
263 
264 template <typename DType> inline map<DType, size_t> Convert_VectorToCountMap(const vector<DType>& locVector)
265 {
266  map<DType, size_t> locMap;
267  for(const auto& locObject : locVector)
268  {
269  auto locIterator = locMap.find(locObject);
270  if(locIterator != locMap.end())
271  ++(locIterator->second);
272  else
273  locMap.emplace(locObject, 1);
274  }
275  return locMap;
276 }
277 
278 } //end DAnalysis namespace
279 
280 #endif // _DReaction_
281 
string Get_TTreeOutputFileName(void) const
Definition: DReaction.h:107
bool Get_IsFirstStepBeam(const DReaction *locReaction)
Definition: DReaction.h:178
set< size_t > Get_NoConstrainMassSteps(const DReaction *locReaction)
Definition: DReaction.h:198
string Get_EventStoreSkims(void) const
Definition: DReaction.h:103
void Add_ReactionStep(const DReactionStep *locReactionStep)
Definition: DReaction.h:48
string dTTreeOutputFileName
Definition: DReaction.h:122
static char * ParticleName_ROOT(Particle_t p)
Definition: particleType.h:851
pair< int, int > Get_InitialParticleDecayFromIndices(const DReaction *locReaction, int locStepIndex)
Definition: DReaction.cc:93
void Set_MaxExtraGoodTracks(size_t locMaxExtraGoodTracks)
Definition: DReaction.h:59
vector< size_t > Get_DefinedParticleStepIndex(const DReaction *locReaction)
Definition: DReaction.cc:192
void Enable_TTreeOutput(string locTTreeOutputFileName, bool locSaveUnusedFlag=false)
Definition: DReaction.h:163
DKinFitType Get_KinFitType(void) const
Definition: DReaction.h:79
bool Check_ChannelEquality(const DReaction *lhs, const DReaction *rhs, bool locSameOrderFlag=true, bool locRightSubsetOfLeftFlag=false)
Definition: DReaction.h:185
void Set_MaxExtraShowers(size_t locMaxExtraShowers)
Definition: DReaction.h:58
bool Get_KinFitConstrainInitMassFlag(void) const
Definition: DReactionStep.h:97
string Convert_PIDsToROOTName(const vector< Particle_t > &locPIDs)
Definition: DReaction.h:230
vector< const DReaction * > Get_Reactions(JEventLoop *locEventLoop)
Definition: DReaction.cc:218
char string[256]
void Set_MinProtonMomentum(double locMinProtonMomentum)
Definition: DReaction.h:67
bool Get_EnableTTreeOutputFlag(void) const
Definition: DReaction.h:109
void Clear_ReactionSteps(void)
Definition: DReaction.h:49
bool Get_SaveUnusedFlag(void) const
Definition: DReaction.h:108
void Set_NumPlusMinusRFBunches(size_t locNumPlusMinusRFBunches)
Definition: DReaction.h:57
Charge_t
bool Check_IfMissingDecayProduct(const DReaction *locReaction, size_t locStepIndex)
Definition: DReaction.h:259
vector< Particle_t > Get_ChainPIDs(const DReaction *locReaction, size_t locStepIndex, int locUpToStepIndex, vector< Particle_t > locUpThroughPIDs, bool locExpandDecayingFlag, bool locExcludeMissingFlag)
Definition: DReaction.cc:162
void Set_KinFitType(DKinFitType locKinFitType)
Definition: DReaction.h:53
void Set_MinPhotonPIDFOM(double locMinPhotonPIDFOM)
Definition: DReaction.h:66
vector< pair< int, int > > Get_MissingDecayProductIndices(const DReaction *locReaction, size_t locStepIndex)
Definition: DReaction.h:239
size_t Get_NumAnalysisActions(void) const
Definition: DReaction.h:93
pair< bool, size_t > Get_MaxExtraShowers(void) const
Definition: DReaction.h:99
void Print_ReactionStep(const DReactionStep *locReactionStep)
void Set_EventStoreSkims(string locEventStoreSkims)
Definition: DReaction.h:72
vector< const DReactionStep * > dReactionSteps
Definition: DReaction.h:125
map< DType, size_t > Convert_VectorToCountMap(const vector< DType > &locVector)
Definition: DReaction.h:264
string Get_ReactionName(void) const
Definition: DReaction.h:75
pair< bool, size_t > Get_MaxExtraGoodTracks(void) const
Definition: DReaction.h:100
size_t Get_NumPlusMinusRFBunches(void) const
Definition: DReaction.h:97
void Set_KinFitUpdateCovarianceMatricesFlag(bool locUpdateFlag)
Definition: DReaction.h:54
static constexpr int Get_ParticleIndex_Inclusive(void)
void Set_MinChargedPIDFOM(double locMinChargedPIDFOM)
Definition: DReaction.h:65
void Set_AnyComboFlag(bool locAnyComboFlag)
Definition: DReaction.h:69
size_t Get_ParticleInstanceIndex(const DReactionStep *locStep, size_t locParticleIndex)
Definition: DReaction.cc:118
pair< bool, double > Get_MaxPhotonRFDeltaT(void) const
Definition: DReaction.h:98
void Set_MaxNumBeamPhotonsInBunch(size_t locMaxNumBeamPhotonsInBunch)
Definition: DReaction.h:68
bool Get_KinFitUpdateCovarianceMatricesFlag(void) const
Definition: DReaction.h:80
const DReactionStep * Get_ReactionStep(size_t locStepIndex) const
Definition: DReaction.h:84
int Get_DecayStepIndex(const DReaction *locReaction, size_t locStepIndex, size_t locParticleIndex)
Definition: DReaction.cc:135
bool Get_IsInclusiveFlag(void) const
Definition: DReaction.h:157
void Add_AnalysisAction(DAnalysisAction *locAnalysisAction)
Definition: DReaction.h:50
vector< const DReactionStep * > Get_ReactionSteps(void) const
Definition: DReaction.h:85
vector< DAnalysisAction * > dAnalysisActions
Definition: DReaction.h:126
size_t Get_NumReactionSteps(void) const
Definition: DReaction.h:83
void Print_Reaction(const DReaction *locReaction)
Definition: DReaction.h:172
vector< DAnalysisAction * > Get_AnalysisActions(void) const
Definition: DReaction.h:94
Particle_t
Definition: particleType.h:12