17 vector<Particle_t>
DReaction::Get_FinalPIDs(
int locStepIndex,
bool locIncludeMissingFlag,
bool locIncludeDecayingFlag,
Charge_t locCharge,
bool locIncludeDuplicatesFlag)
const
19 vector<Particle_t> locFinalPIDs;
20 for(
size_t locLoopStepIndex = 0; locLoopStepIndex <
dReactionSteps.size(); ++locLoopStepIndex)
22 if((locStepIndex != -1) && (int(locLoopStepIndex) != locStepIndex))
26 for(
size_t locPIDIndex = 0; locPIDIndex < locStep->Get_NumFinalPIDs(); ++locPIDIndex)
30 if(!locIncludeMissingFlag && (
int(locPIDIndex) == locStep->Get_MissingParticleIndex()))
32 Particle_t locPID = locStep->Get_FinalPID(locPIDIndex);
34 locFinalPIDs.push_back(locPID);
38 if(!locIncludeDuplicatesFlag)
40 std::sort(locFinalPIDs.begin(), locFinalPIDs.end());
41 locFinalPIDs.erase(std::unique(locFinalPIDs.begin(), locFinalPIDs.end()), locFinalPIDs.end());
48 vector<Particle_t> locFinalPIDs;
49 for(
size_t locLoopStepIndex = 0; locLoopStepIndex <
dReactionSteps.size(); ++locLoopStepIndex)
51 if((locStepIndex != -1) && (int(locLoopStepIndex) != locStepIndex))
55 for(
size_t locPIDIndex = 0; locPIDIndex < locStep->Get_NumFinalPIDs(); ++locPIDIndex)
57 if(
int(locPIDIndex) != locStep->Get_MissingParticleIndex())
59 Particle_t locPID = locStep->Get_FinalPID(locPIDIndex);
61 locFinalPIDs.push_back(locPID);
65 if(!locIncludeDuplicatesFlag)
67 std::sort(locFinalPIDs.begin(), locFinalPIDs.end());
68 locFinalPIDs.erase(std::unique(locFinalPIDs.begin(), locFinalPIDs.end()), locFinalPIDs.end());
75 cout <<
"WARNING: USING DReaction::Set_MaxPhotonRFDeltaT() IS DEPRECATED. PLEASE SWITCH TO Set_NumPlusMinusRFBunches()." << endl;
81 cout <<
"WARNING: USING DReaction::Add_ComboPreSelectionAction() IS DEPRECATED. PLEASE SWITCH TO Add_AnalysisAction()." << endl;
87 cout <<
"WARNING: USING DReaction::Set_InvariantMassCut() IS DEPRECATED. PLEASE SWITCH TO Add_AnalysisAction()." << endl;
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);
103 size_t locSearchPIDCount = 0;
104 for(
int loc_i = 0; loc_i < locStepIndex; ++loc_i)
106 auto locFinalPIDs = locSteps[loc_i]->Get_FinalPIDs(
false);
108 auto locPIDCounter = [&](
Particle_t locPID) ->
bool
109 {
return (locPID != locDecayingPID) ?
false : (++locSearchPIDCount > locPreviousPIDCount);};
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));
115 return std::make_pair(-1, -1);
121 auto locPID = locFinalPIDs[locParticleIndex];
122 size_t locInstanceIndex = 0;
125 for(
size_t loc_i = 0; loc_i < locParticleIndex; ++loc_i)
129 if(locFinalPIDs[loc_i] == locPID)
132 return locInstanceIndex;
139 auto locDecayingPID = locSteps[locStepIndex]->Get_FinalPID(locParticleIndex);
140 if(locSteps[locStepIndex]->Get_MissingParticleIndex() ==
int(locParticleIndex))
144 size_t locPreviousPIDCount = 0;
145 for(
size_t loc_i = 0; loc_i <= locStepIndex; ++loc_i)
147 auto locStep = locSteps[loc_i];
148 auto locFinalPIDs = locStep->Get_FinalPIDs(
false);
149 auto locEndIterator = (loc_i == locStepIndex) ? locFinalPIDs.begin() + locParticleIndex : locFinalPIDs.end();
150 locPreviousPIDCount += std::count(locFinalPIDs.begin(), locEndIterator, locDecayingPID);
154 size_t locStepPIDCount = 0;
156 {
return (locStep->Get_InitialPID() != locDecayingPID) ?
false : (++locStepPIDCount > locPreviousPIDCount);};
158 auto locIterator = std::find_if(std::next(locSteps.begin()), locSteps.end(), StepCounter);
159 return (locIterator == locSteps.end()) ? -1 : std::distance(locSteps.begin(), locIterator);
162 vector<Particle_t>
Get_ChainPIDs(
const DReaction* locReaction,
size_t locStepIndex,
int locUpToStepIndex, vector<Particle_t> locUpThroughPIDs,
bool locExpandDecayingFlag,
bool locExcludeMissingFlag)
165 vector<Particle_t> locChainPIDs;
167 for(
size_t loc_j = 0; loc_j < locPIDs.size(); ++loc_j)
170 if(!locUpThroughPIDs.empty() && (int(locStepIndex) == locUpToStepIndex))
172 auto locIterator = std::find(locUpThroughPIDs.begin(), locUpThroughPIDs.end(), locPID);
173 if(locIterator != locUpThroughPIDs.end())
174 locUpThroughPIDs.erase(locIterator);
181 if(locDecayingStepIndex == -1)
182 locChainPIDs.push_back(locPID);
185 auto locDecayPIDs =
Get_ChainPIDs(locReaction, locDecayingStepIndex, locUpToStepIndex, locUpThroughPIDs, locExpandDecayingFlag, locExcludeMissingFlag);
186 locChainPIDs.insert(locChainPIDs.end(), locDecayPIDs.begin(), locDecayPIDs.end());
195 vector<size_t> locDefinedParticleStepIndices;
201 if((loc_i == 0) && (locReactionStep->Get_TargetPID() ==
Unknown))
203 locDefinedParticleStepIndices.push_back(loc_i);
208 if(locReactionStep->Get_IsInclusiveFlag() || (locReactionStep->Get_MissingPID() !=
Unknown))
210 locDefinedParticleStepIndices.push_back(loc_i);
215 return locDefinedParticleStepIndices;
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)
229 JFactory<DReaction>* locFactory =
dynamic_cast<JFactory<DReaction>*
>(locFactories[loc_i]);
230 if(locFactory ==
nullptr)
232 if(
string(locFactory->Tag()) ==
"Thrown")
239 vector<const DReaction*> locReactionsSubset;
240 locFactory->Get(locReactionsSubset);
241 locReactions.insert(locReactions.end(), locReactionsSubset.begin(), locReactionsSubset.end());
pair< int, int > Get_InitialParticleDecayFromIndices(const DReaction *locReaction, int locStepIndex)
vector< size_t > Get_DefinedParticleStepIndex(const DReaction *locReaction)
pair< bool, double > dMaxPhotonRFDeltaT
void Add_ComboPreSelectionAction(DAnalysisAction *locAction)
vector< const DReaction * > Get_Reactions(JEventLoop *locEventLoop)
void Set_MaxPhotonRFDeltaT(double locMaxPhotonRFDeltaT)
vector< Particle_t > Get_ChainPIDs(const DReaction *locReaction, size_t locStepIndex, int locUpToStepIndex, vector< Particle_t > locUpThroughPIDs, bool locExpandDecayingFlag, bool locExcludeMissingFlag)
vector< Particle_t > Get_FinalPIDs(int locStepIndex=-1, bool locIncludeMissingFlag=true, bool locIncludeDecayingFlag=true, Charge_t locCharge=d_AllCharges, bool locIncludeDuplicatesFlag=true) const
Particle_t Get_InitialPID(void) const
vector< const DReactionStep * > dReactionSteps
void Set_InvariantMassCut(Particle_t locStepInitialPID, double locMinInvariantMass, double locMaxInvariantMass)
static unsigned short int IsFixedMass(Particle_t p)
int Get_MissingParticleIndex(void) const
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
size_t Get_ParticleInstanceIndex(const DReactionStep *locStep, size_t locParticleIndex)
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
int Get_DecayStepIndex(const DReaction *locReaction, size_t locStepIndex, size_t locParticleIndex)
void Add_AnalysisAction(DAnalysisAction *locAnalysisAction)
vector< const DReactionStep * > Get_ReactionSteps(void) const
vector< DAnalysisAction * > dAnalysisActions
size_t Get_NumReactionSteps(void) const