1 #ifndef _DReactionStep_
2 #define _DReactionStep_
26 template <
class InputIterator,
class T>
27 T accumulate (InputIterator first, InputIterator last, T init)
35 template <
class InputIterator,
class T,
class BinaryOperation>
36 T accumulate (InputIterator first, InputIterator last, T init, BinaryOperation binary_op)
39 binary_op(init,*first);
59 bool locInclusiveFlag =
false,
bool locBeamMissingFlag =
false);
62 bool locInclusiveFlag =
false,
bool locFirstBeamMissingFlag =
false,
bool locSecondBeamMissingFlag =
false);
75 void Set_InitialParticleID(
Particle_t locPID,
bool locIsMissingFlag =
false);
77 void Add_FinalParticleID(
Particle_t locPID,
bool locIsMissingFlag =
false);
88 Particle_t Get_PID(
int locParticlceIndex)
const;
90 vector<Particle_t> Get_FinalPIDs(
bool locIncludeMissingFlag =
true,
Charge_t locCharge =
d_AllCharges,
bool locIncludeDuplicatesFlag =
true)
const;
94 bool Get_IsInclusiveFlag(
void)
const{
return (dReactionStepInfo->dMissingParticleIndex == DReactionStep::Get_ParticleIndex_Inclusive());}
95 bool Get_IsBeamMissingFlag(
void)
const{
return (dReactionStepInfo->dMissingParticleIndex == DReactionStep::Get_ParticleIndex_Initial());}
96 bool Get_IsSecondBeamMissingFlag(
void)
const{
return (dReactionStepInfo->dMissingParticleIndex == DReactionStep::Get_ParticleIndex_SecondBeam());}
108 int Prepare_InfoArguments(vector<Particle_t>& locFinalPIDs,
Particle_t locMissingFinalPID,
bool locInclusiveFlag,
bool locBeamMissingFlag,
bool locSecondBeamMissingFlag)
const;
109 static void Check_IsResonance(
Particle_t locPID);
116 int locMissingParticleIndex = -1);
127 int dMissingParticleIndex = DReactionStep::Get_ParticleIndex_None();
128 bool dKinFitConstrainInitMassFlag =
true;
147 inline DReactionStep::DReactionStep(
Particle_t locScatteringPID,
Particle_t locTargetPID, vector<Particle_t> locNonMissingFinalPIDs,
Particle_t locMissingFinalPID,
148 bool locInclusiveFlag,
bool locBeamMissingFlag)
151 int locMissingParticleIndex = Prepare_InfoArguments(locNonMissingFinalPIDs, locMissingFinalPID, locInclusiveFlag, locBeamMissingFlag,
false);
152 dReactionStepInfo = std::make_shared<DReactionStepInfo>(locScatteringPID,
Unknown, locTargetPID, locNonMissingFinalPIDs, locMissingParticleIndex);
156 inline DReactionStep::DReactionStep(pair<Particle_t, Particle_t> locBeamPIDs, vector<Particle_t> locNonMissingFinalPIDs,
Particle_t locMissingFinalPID,
157 bool locInclusiveFlag,
bool locFirstBeamMissingFlag,
bool locSecondBeamMissingFlag)
160 int locMissingParticleIndex = Prepare_InfoArguments(locNonMissingFinalPIDs, locMissingFinalPID, locInclusiveFlag, locFirstBeamMissingFlag, locSecondBeamMissingFlag);
161 dReactionStepInfo = std::make_shared<DReactionStepInfo>(locBeamPIDs.first, locBeamPIDs.second,
Unknown, locNonMissingFinalPIDs, locMissingParticleIndex);
165 inline DReactionStep::DReactionStep(
Particle_t locDecayingPID, vector<Particle_t> locNonMissingFinalPIDs,
Particle_t locMissingFinalPID,
bool locInclusiveFlag)
168 int locMissingParticleIndex = Prepare_InfoArguments(locNonMissingFinalPIDs, locMissingFinalPID, locInclusiveFlag,
false,
false);
169 dReactionStepInfo = std::make_shared<DReactionStepInfo>(locDecayingPID,
Unknown,
Unknown, locNonMissingFinalPIDs, locMissingParticleIndex);
173 inline DReactionStep::DReactionStep(
void) : dReactionStepInfo(std::make_shared<
DReactionStepInfo>())
193 vector<Particle_t> locFinalPIDs,
int locMissingParticleIndex) :
194 dInitialPID(locInitialPID), dSecondBeamPID(locSecondBeamPID), dTargetPID(locTargetPID), dFinalPIDs(locFinalPIDs),
195 dMissingParticleIndex(locMissingParticleIndex)
227 cout <<
"ERROR: CANNOT SET RESONANCE PID. ABORTING." << endl;
247 if(locParticlceIndex >= 0)
250 switch (locParticlceIndex)
263 auto locFinalPIDs = locStep->
Get_FinalPIDs(locIncludeMissingFlag);
264 auto locComparator = [&locInputPID](
size_t locTotal,
Particle_t locPID) ->
size_t {
return ((locPID == locInputPID) ? locTotal + 1 : locTotal);};
265 return std::accumulate(locFinalPIDs.begin(), locFinalPIDs.end(), size_t(0), locComparator);
272 return std::accumulate(locNames.begin(), locNames.end(),
string(
""));
275 auto locRetriever = [](
const string& locTotal,
const string& locString) ->
string {
return locTotal +
string(
"_") + locString;};
276 return std::accumulate(std::next(locNames.begin()), locNames.end(), locNames.front(), locRetriever);
283 locStepName += locTLatexFlag ?
"#rightarrow" :
"__";
298 auto Instance_Finder = [locInputPID, locInstance, &locCount](
Particle_t locPID) ->
bool
299 {
return (locPID != locInputPID) ?
false : (++locCount == locInstance) ?
true :
false;};
300 auto locIterator = std::find_if(locFinalPIDs.begin(), locFinalPIDs.end(), Instance_Finder);
327 if(!locRightSubsetOfLeftFlag)
336 std::sort(locPIDS_lhs.begin(), locPIDS_lhs.end());
337 std::sort(locPIDS_rhs.begin(), locPIDS_rhs.end());
338 if(locRightSubsetOfLeftFlag)
340 decltype(locPIDS_lhs) locPIDDifference{};
341 locPIDDifference.reserve(locPIDS_rhs.size());
342 std::set_difference(locPIDS_rhs.begin(), locPIDS_rhs.end(), locPIDS_lhs.begin(), locPIDS_lhs.end(), std::back_inserter(locPIDDifference));
343 return locPIDDifference.empty();
345 if(locPIDS_lhs.size() != locPIDS_rhs.size())
348 return std::is_permutation(locPIDS_lhs.begin(), locPIDS_lhs.end(), locPIDS_rhs.begin());
353 #endif // _DReactionStep_
int dMissingParticleIndex
DReactionStepInfo(void)=default
int Get_ParticleIndex(const DReactionStep *locStep, Particle_t locInputPID, size_t locInstance)
static constexpr int Get_ParticleIndex_Initial(void)
bool operator<(const DSourceComboUse &lhs, const DSourceComboUse &rhs)
bool Check_ChannelEquality(const DReaction *lhs, const DReaction *rhs, bool locSameOrderFlag=true, bool locRightSubsetOfLeftFlag=false)
bool Get_KinFitConstrainInitMassFlag(void) const
bool operator<(const DReactionStepInfo &locInfo) const
bool Are_ParticlesIdentical(const DReactionStep *locStep1, const DReactionStep *locStep2, bool locExceptMissingUnknownInInputFlag)
static unsigned short int IsResonance(Particle_t p)
void Set_KinFitConstrainInitMassFlag(bool locFlag)
Particle_t Get_TargetPID(void) const
string Get_StepName(const DReactionStep *locStep, bool locIncludeMissingFlag, bool locTLatexFlag)
bool Get_HasMissingParticle_FinalState(const DReactionStep *locStep)
vector< string > Get_FinalParticleNames(const DReactionStep *locStep, bool locIncludeMissingFlag, bool locTLatexFlag)
DReactionStep & operator=(const DReactionStep &locSourceData)
Particle_t Get_SecondBeamPID(void) const
void Print_ReactionStep(const DReactionStep *locReactionStep)
Particle_t Get_InitialPID(void) const
Particle_t Get_PID(int locParticlceIndex) const
shared_ptr< DReactionStepInfo > dReactionStepInfo
Particle_t Get_FinalPID(size_t locIndex) const
static constexpr int Get_ParticleIndex_Inclusive(void)
static constexpr int Get_ParticleIndex_None(void)
string Get_FinalParticlesName(const DReactionStep *locStep, bool locIncludeMissingFlag, bool locTLatexFlag)
int Get_MissingParticleIndex(void) const
bool operator<(const DReactionStep &locStep) const
static constexpr int Get_ParticleIndex_Target(void)
vector< Particle_t > dFinalPIDs
static void Check_IsResonance(Particle_t locPID)
size_t Get_NumFinalPIDs(void) const
void Set_InitialParticleID(Particle_t locPID, bool locIsMissingFlag=false)
vector< Particle_t > Get_FinalPIDs(bool locIncludeMissingFlag=true, Charge_t locCharge=d_AllCharges, bool locIncludeDuplicatesFlag=true) const
Particle_t dSecondBeamPID
static constexpr int Get_ParticleIndex_SecondBeam(void)
bool Get_IsInclusiveFlag(void) const
bool Get_IsSecondBeamMissingFlag(void) const
string Get_InitialParticlesName(const DReactionStep *locStep, bool locTLatexFlag)
bool Get_IsBeamMissingFlag(void) const
void Set_TargetParticleID(Particle_t locPID)
Particle_t Get_MissingPID(void) const