Hall-D Software  alpha
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DReaction.cc
Go to the documentation of this file.
1 #include "ANALYSIS/DReaction.h"
3 #include "ANALYSIS/DCutActions.h"
4 
5 namespace DAnalysis
6 {
7 
8 /************************************************************** DREACTION FUNCTIONS ***************************************************************/
9 
11 {
12  //DO NOT DELETE REACTION STEPS: MIGHT BE SHARED BETWEEN DIFFERENT DREACTIONS
13  for(const auto& locAction : dAnalysisActions)
14  delete locAction;
15 }
16 
17 vector<Particle_t> DReaction::Get_FinalPIDs(int locStepIndex, bool locIncludeMissingFlag, bool locIncludeDecayingFlag, Charge_t locCharge, bool locIncludeDuplicatesFlag) const
18 {
19  vector<Particle_t> locFinalPIDs;
20  for(size_t locLoopStepIndex = 0; locLoopStepIndex < dReactionSteps.size(); ++locLoopStepIndex)
21  {
22  if((locStepIndex != -1) && (int(locLoopStepIndex) != locStepIndex))
23  continue;
24 
25  auto locStep = dReactionSteps[locLoopStepIndex];
26  for(size_t locPIDIndex = 0; locPIDIndex < locStep->Get_NumFinalPIDs(); ++locPIDIndex)
27  {
28  if(!locIncludeDecayingFlag && (DAnalysis::Get_DecayStepIndex(this, locLoopStepIndex, locPIDIndex) >= 0))
29  continue;
30  if(!locIncludeMissingFlag && (int(locPIDIndex) == locStep->Get_MissingParticleIndex()))
31  continue;
32  Particle_t locPID = locStep->Get_FinalPID(locPIDIndex);
33  if(Is_CorrectCharge(locPID, locCharge))
34  locFinalPIDs.push_back(locPID);
35  }
36  }
37 
38  if(!locIncludeDuplicatesFlag)
39  {
40  std::sort(locFinalPIDs.begin(), locFinalPIDs.end()); //must sort first or else std::unique won't do what we want!
41  locFinalPIDs.erase(std::unique(locFinalPIDs.begin(), locFinalPIDs.end()), locFinalPIDs.end());
42  }
43  return locFinalPIDs;
44 }
45 
46 vector<Particle_t> DReaction::Get_MissingPIDs(int locStepIndex, Charge_t locCharge, bool locIncludeDuplicatesFlag) const
47 {
48  vector<Particle_t> locFinalPIDs;
49  for(size_t locLoopStepIndex = 0; locLoopStepIndex < dReactionSteps.size(); ++locLoopStepIndex)
50  {
51  if((locStepIndex != -1) && (int(locLoopStepIndex) != locStepIndex))
52  continue;
53 
54  auto locStep = dReactionSteps[locLoopStepIndex];
55  for(size_t locPIDIndex = 0; locPIDIndex < locStep->Get_NumFinalPIDs(); ++locPIDIndex)
56  {
57  if(int(locPIDIndex) != locStep->Get_MissingParticleIndex())
58  continue;
59  Particle_t locPID = locStep->Get_FinalPID(locPIDIndex);
60  if(Is_CorrectCharge(locPID, locCharge))
61  locFinalPIDs.push_back(locPID);
62  }
63  }
64 
65  if(!locIncludeDuplicatesFlag)
66  {
67  std::sort(locFinalPIDs.begin(), locFinalPIDs.end()); //must sort first or else std::unique won't do what we want!
68  locFinalPIDs.erase(std::unique(locFinalPIDs.begin(), locFinalPIDs.end()), locFinalPIDs.end());
69  }
70  return locFinalPIDs;
71 }
72 
73 void DReaction::Set_MaxPhotonRFDeltaT(double locMaxPhotonRFDeltaT)
74 {
75  cout << "WARNING: USING DReaction::Set_MaxPhotonRFDeltaT() IS DEPRECATED. PLEASE SWITCH TO Set_NumPlusMinusRFBunches()." << endl;
76  dMaxPhotonRFDeltaT = pair<bool, double>(true, locMaxPhotonRFDeltaT);
77 }
78 
80 {
81  cout << "WARNING: USING DReaction::Add_ComboPreSelectionAction() IS DEPRECATED. PLEASE SWITCH TO Add_AnalysisAction()." << endl;
82  Add_AnalysisAction(locAction);
83 }
84 
85 void DReaction::Set_InvariantMassCut(Particle_t locStepInitialPID, double locMinInvariantMass, double locMaxInvariantMass)
86 {
87  cout << "WARNING: USING DReaction::Set_InvariantMassCut() IS DEPRECATED. PLEASE SWITCH TO Add_AnalysisAction()." << endl;
88  Add_AnalysisAction(new DCutAction_InvariantMass(this, locStepInitialPID, false, locMinInvariantMass, locMaxInvariantMass));
89 }
90 
91 /************************************************************** NAMESPACE-SCOPE FUNCTIONS ***************************************************************/
92 
93 pair<int, int> Get_InitialParticleDecayFromIndices(const DReaction* locReaction, int locStepIndex)
94 {
95  //check to see how many initial-state particles with this PID type there are before now
96  Particle_t locDecayingPID = locReaction->Get_ReactionStep(locStepIndex)->Get_InitialPID();
97 
98  auto locSteps = locReaction->Get_ReactionSteps();
99  auto locPIDCounter = [=](const DReactionStep* locStep) -> bool {return (locStep->Get_InitialPID() == locDecayingPID);};
100  size_t locPreviousPIDCount = std::count_if(locSteps.begin(), locSteps.begin() + locStepIndex, locPIDCounter);
101 
102  //now, search through final-state PIDs until finding the (locPreviousPIDCount + 1)'th instance of this PID
103  size_t locSearchPIDCount = 0;
104  for(int loc_i = 0; loc_i < locStepIndex; ++loc_i)
105  {
106  auto locFinalPIDs = locSteps[loc_i]->Get_FinalPIDs(false); //exclude missing
107 
108  auto locPIDCounter = [&](Particle_t locPID) -> bool
109  {return (locPID != locDecayingPID) ? false : (++locSearchPIDCount > locPreviousPIDCount);};
110 
111  auto locIterator = std::find_if(locFinalPIDs.begin(), locFinalPIDs.end(), locPIDCounter);
112  if(locIterator != locFinalPIDs.end())
113  return pair<int, int>(loc_i, std::distance(locFinalPIDs.begin(), locIterator));
114  }
115  return std::make_pair(-1, -1);
116 }
117 
118 size_t Get_ParticleInstanceIndex(const DReactionStep* locStep, size_t locParticleIndex)
119 {
120  auto locFinalPIDs = locStep->Get_FinalPIDs();
121  auto locPID = locFinalPIDs[locParticleIndex];
122  size_t locInstanceIndex = 0;
123 
124  //see how many of same PID came before the particle index
125  for(size_t loc_i = 0; loc_i < locParticleIndex; ++loc_i)
126  {
127  if(locStep->Get_MissingParticleIndex() == int(loc_i))
128  continue;
129  if(locFinalPIDs[loc_i] == locPID)
130  ++locInstanceIndex;
131  }
132  return locInstanceIndex;
133 }
134 
135 int Get_DecayStepIndex(const DReaction* locReaction, size_t locStepIndex, size_t locParticleIndex)
136 {
137  //check if the input particle decays later in the reaction
138  auto locSteps = locReaction->Get_ReactionSteps();
139  auto locDecayingPID = locSteps[locStepIndex]->Get_FinalPID(locParticleIndex);
140  if(locSteps[locStepIndex]->Get_MissingParticleIndex() == int(locParticleIndex))
141  return -1; //missing, does not decay
142 
143  //check to see how many final state particles with this pid type there are before now
144  size_t locPreviousPIDCount = 0;
145  for(size_t loc_i = 0; loc_i <= locStepIndex; ++loc_i)
146  {
147  auto locStep = locSteps[loc_i];
148  auto locFinalPIDs = locStep->Get_FinalPIDs(false); //exclude missing
149  auto locEndIterator = (loc_i == locStepIndex) ? locFinalPIDs.begin() + locParticleIndex : locFinalPIDs.end();
150  locPreviousPIDCount += std::count(locFinalPIDs.begin(), locEndIterator, locDecayingPID);
151  }
152 
153  //now, find the (locPreviousPIDCount + 1)'th time where this pid is a decay parent
154  size_t locStepPIDCount = 0;
155  auto StepCounter = [&](const DReactionStep* locStep) -> bool
156  {return (locStep->Get_InitialPID() != locDecayingPID) ? false : (++locStepPIDCount > locPreviousPIDCount);};
157 
158  auto locIterator = std::find_if(std::next(locSteps.begin()), locSteps.end(), StepCounter);
159  return (locIterator == locSteps.end()) ? -1 : std::distance(locSteps.begin(), locIterator);
160 }
161 
162 vector<Particle_t> Get_ChainPIDs(const DReaction* locReaction, size_t locStepIndex, int locUpToStepIndex, vector<Particle_t> locUpThroughPIDs, bool locExpandDecayingFlag, bool locExcludeMissingFlag)
163 {
164  //if locKinFitResultsFlag = true: don't expand decaying particles (through decay chain) that were included in the kinfit (still expand resonances)
165  vector<Particle_t> locChainPIDs;
166  auto locPIDs = locReaction->Get_ReactionStep(locStepIndex)->Get_FinalPIDs(!locExcludeMissingFlag);
167  for(size_t loc_j = 0; loc_j < locPIDs.size(); ++loc_j)
168  {
169  Particle_t locPID = locPIDs[loc_j];
170  if(!locUpThroughPIDs.empty() && (int(locStepIndex) == locUpToStepIndex))
171  {
172  auto locIterator = std::find(locUpThroughPIDs.begin(), locUpThroughPIDs.end(), locPID);
173  if(locIterator != locUpThroughPIDs.end())
174  locUpThroughPIDs.erase(locIterator); //found, include it
175  else
176  continue; //skip it: don't want to include it
177  }
178 
179  //see if decaying, and if so where, if decay expansion is requested (or mass isn't fixed)
180  int locDecayingStepIndex = (!IsFixedMass(locPID) || locExpandDecayingFlag) ? Get_DecayStepIndex(locReaction, locStepIndex, loc_j) : -1;
181  if(locDecayingStepIndex == -1)
182  locChainPIDs.push_back(locPID);
183  else
184  {
185  auto locDecayPIDs = Get_ChainPIDs(locReaction, locDecayingStepIndex, locUpToStepIndex, locUpThroughPIDs, locExpandDecayingFlag, locExcludeMissingFlag);
186  locChainPIDs.insert(locChainPIDs.end(), locDecayPIDs.begin(), locDecayPIDs.end());
187  }
188  }
189  return locChainPIDs;
190 }
191 
192 vector<size_t> Get_DefinedParticleStepIndex(const DReaction* locReaction)
193 {
194  //-1 if none, -2 if more than 1 //defined: missing or open-ended-decaying
195  vector<size_t> locDefinedParticleStepIndices;
196  for(size_t loc_i = 0; loc_i < locReaction->Get_NumReactionSteps(); ++loc_i)
197  {
198  auto locReactionStep = locReaction->Get_ReactionStep(loc_i);
199 
200  //check for open-ended-decaying particle
201  if((loc_i == 0) && (locReactionStep->Get_TargetPID() == Unknown))
202  {
203  locDefinedParticleStepIndices.push_back(loc_i);
204  continue;
205  }
206 
207  //check for missing particle
208  if(locReactionStep->Get_IsInclusiveFlag() || (locReactionStep->Get_MissingPID() != Unknown))
209  {
210  locDefinedParticleStepIndices.push_back(loc_i);
211  continue;
212  }
213  }
214 
215  return locDefinedParticleStepIndices;
216 }
217 
218 vector<const DReaction*> Get_Reactions(JEventLoop* locEventLoop)
219 {
220  // Get DReactions:
221  // Get list of factories and find all the ones producing
222  // DReaction objects. (A simpler way to do this would be to
223  // just use locEventLoop->Get(...), but then only one plugin could
224  // be used at a time.)
225  vector<JFactory_base*> locFactories = locEventLoop->GetFactories();
226  vector<const DReaction*> locReactions;
227  for(size_t loc_i = 0; loc_i < locFactories.size(); ++loc_i)
228  {
229  JFactory<DReaction>* locFactory = dynamic_cast<JFactory<DReaction>*>(locFactories[loc_i]);
230  if(locFactory == nullptr)
231  continue;
232  if(string(locFactory->Tag()) == "Thrown")
233  continue;
234 
235  // Found a factory producing DReactions. The reaction objects are
236  // produced at the init stage and are persistent through all event
237  // processing so we can grab the list here and append it to our
238  // overall list.
239  vector<const DReaction*> locReactionsSubset;
240  locFactory->Get(locReactionsSubset);
241  locReactions.insert(locReactions.end(), locReactionsSubset.begin(), locReactionsSubset.end());
242  }
243  return locReactions;
244 }
245 
246 } //end namespace DAnalysis
pair< int, int > Get_InitialParticleDecayFromIndices(const DReaction *locReaction, int locStepIndex)
Definition: DReaction.cc:93
vector< size_t > Get_DefinedParticleStepIndex(const DReaction *locReaction)
Definition: DReaction.cc:192
pair< bool, double > dMaxPhotonRFDeltaT
Definition: DReaction.h:132
void Add_ComboPreSelectionAction(DAnalysisAction *locAction)
Definition: DReaction.cc:79
vector< const DReaction * > Get_Reactions(JEventLoop *locEventLoop)
Definition: DReaction.cc:218
void Set_MaxPhotonRFDeltaT(double locMaxPhotonRFDeltaT)
Definition: DReaction.cc:73
Charge_t
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
vector< Particle_t > Get_FinalPIDs(int locStepIndex=-1, bool locIncludeMissingFlag=true, bool locIncludeDecayingFlag=true, Charge_t locCharge=d_AllCharges, bool locIncludeDuplicatesFlag=true) const
Definition: DReaction.cc:17
Particle_t Get_InitialPID(void) const
Definition: DReactionStep.h:81
vector< const DReactionStep * > dReactionSteps
Definition: DReaction.h:125
void Set_InvariantMassCut(Particle_t locStepInitialPID, double locMinInvariantMass, double locMaxInvariantMass)
Definition: DReaction.cc:85
static unsigned short int IsFixedMass(Particle_t p)
Definition: particleType.h:743
int Get_MissingParticleIndex(void) const
Definition: DReactionStep.h:93
static int Is_CorrectCharge(Particle_t locPID, Charge_t locCharge)
vector< Particle_t > Get_MissingPIDs(int locStepIndex=-1, Charge_t locCharge=d_AllCharges, bool locIncludeDuplicatesFlag=true) const
Definition: DReaction.cc:46
size_t Get_ParticleInstanceIndex(const DReactionStep *locStep, size_t locParticleIndex)
Definition: DReaction.cc:118
vector< Particle_t > Get_FinalPIDs(bool locIncludeMissingFlag=true, Charge_t locCharge=d_AllCharges, bool locIncludeDuplicatesFlag=true) const
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
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
virtual ~DReaction(void)
Definition: DReaction.cc:10
size_t Get_NumReactionSteps(void) const
Definition: DReaction.h:83
Particle_t
Definition: particleType.h:12