43 else if(locPID ==
Eta)
45 else if(locPID ==
omega)
55 else if(locPID ==
Jpsi)
69 else if(locPID ==
Xi0)
95 bool locSaveUnusedHypotheses =
false;
99 while(locRemainingFlagString !=
"")
101 auto locUnderscoreIndex = locRemainingFlagString.find(
"_");
102 auto locThisFlagString = (locUnderscoreIndex != string::npos) ? locRemainingFlagString.substr(0, locUnderscoreIndex) : locRemainingFlagString;
105 auto locFlagTypeChar = locThisFlagString[0];
108 istringstream locIStream(locThisFlagString.substr(1));
110 locIStream >> locFlagArg;
111 if(locIStream.fail())
113 cout <<
"BUILDING DREACTION, FLAG " << locThisFlagString <<
" NOT RECOGNIZED." << endl;
114 if(locUnderscoreIndex == string::npos)
119 switch(locFlagTypeChar)
134 locSaveUnusedHypotheses = (locFlagArg == 0) ?
false :
true;
139 if(locStep->Get_InitialPID() !=
Particle_t(locFlagArg))
141 (
const_cast<DReactionStep*
>(locStep))->Set_KinFitConstrainInitMassFlag(
false);
145 cout <<
"BUILDING DREACTION, FLAG " << locThisFlagString <<
" NOT RECOGNIZED." << endl;
149 if(locUnderscoreIndex == string::npos)
151 locRemainingFlagString = locRemainingFlagString.substr(locUnderscoreIndex + 1);
174 for(
auto locReaction : locReactions)
176 auto locKinFitType = locReaction->Get_KinFitType();
177 auto locKinFitPerformedFlag = (locKinFitType !=
d_NoFit);
186 if(!locKinFitPerformedFlag)
190 _data.push_back(locReaction);
204 if(locKinFitPerformedFlag)
211 _data.push_back(locReaction);
221 auto locInclusiveFlag = (std::get<4>(locStepTuple) == DReactionStep::Get_ParticleIndex_Inclusive());
222 auto locBeamMissingFlag = (std::get<4>(locStepTuple) == DReactionStep::Get_ParticleIndex_Initial());
225 if(std::get<1>(locStepTuple) ==
Unknown)
226 return (
new DReactionStep(std::get<0>(locStepTuple), std::get<2>(locStepTuple), std::get<3>(locStepTuple), locInclusiveFlag));
228 return (
new DReactionStep(std::get<0>(locStepTuple), std::get<1>(locStepTuple), std::get<2>(locStepTuple), std::get<3>(locStepTuple), locInclusiveFlag, locBeamMissingFlag));
234 for(
auto& locFinalPID : locCurrentStep->
Get_FinalPIDs(
false))
236 auto Find_DecayStep = [&locFinalPID](
const DReactionStepTuple& locDecayStepTuple) ->
bool{
return (std::get<0>(locDecayStepTuple) == locFinalPID);};
237 auto locStepTupleIterator = std::find_if(locDecayStepTuples.begin(), locDecayStepTuples.end(), Find_DecayStep);
241 if(locStepTupleIterator == locDecayStepTuples.end())
246 locDecayStepTuples.erase(locStepTupleIterator);
248 if(locDecayStep ==
nullptr)
253 Create_Steps(locReaction, locDecayStep, locDecayStepTuples);
260 vector<DReaction*> locReactions;
261 for(
auto& locReactionPair : locInputStrings)
263 auto& locNameString = std::get<0>(locReactionPair.second);
264 auto& locFirstStepString = std::get<1>(locReactionPair.second);
265 auto& locFlagString = std::get<2>(locReactionPair.second);
267 cout <<
"name string, first step string, flag string, #decay strings: " << locNameString <<
", " << locFirstStepString <<
", " << locFlagString <<
", " << std::get<3>(locReactionPair.second).
size() << endl;
272 cout <<
"BUILDING DREACTIONS, INVALID PID STRING: " << locFirstStepString << endl;
281 auto locReactionName = (locNameString !=
"") ? locNameString :
Create_StepNameString(locFirstStepTuple,
true);
284 vector<DReactionStepTuple> locDecayStepTuples;
285 for(
auto& locDecayStepString : std::get<3>(locReactionPair.second))
290 cout <<
"BUILDING DREACTIONS, INVALID DECAY PID STRING: " << locDecayStepString << endl;
293 locDecayStepTuples.push_back(locDecayStepTuple);
296 if(locNameString ==
"")
300 if((locNameString ==
"") && (locFlagString !=
""))
301 locReactionName +=
string(
"__") + locFlagString;
304 cout <<
"ReactionFilter: reaction name: " << locReactionName << endl;
307 auto locReaction =
new DReaction(locReactionName);
309 locReaction->Add_ReactionStep(locPrimaryStep);
312 Create_Steps(locReaction, locPrimaryStep, locDecayStepTuples);
318 cout <<
"ReactionFilter: Reaction: " << locReactionName << endl;
321 locReactions.push_back(locReaction);
335 size_t locNumInclusiveSteps = 0;
338 if(locReactionStep->Get_IsInclusiveFlag())
339 ++locNumInclusiveSteps;
343 set<Particle_t> locDecayPIDsUsed;
349 if(locP4Fit && locUseKinFitResultsFlag && locReactionStep->Get_KinFitConstrainInitMassFlag())
353 if(locDecayPIDsUsed.find(locDecayPID) != locDecayPIDsUsed.end())
359 locDecayPIDsUsed.insert(locDecayPID);
366 set<Particle_t> locMissingDecayPIDsUsed;
367 for(
size_t loc_j = 0; loc_j < locReactionStep->Get_NumFinalPIDs(); ++loc_j)
371 if(locMissingDecayPIDsUsed.find(locPID) != locMissingDecayPIDsUsed.end())
375 if(
int(loc_j) == locReactionStep->Get_MissingParticleIndex())
377 if((locNumMissingParticles > 1) || (locNumInclusiveSteps > 0))
379 if(locUseKinFitResultsFlag && locP4Fit)
387 if(locDecayStepIndex <= 0)
393 if((locNumMissingParticles - locMissingDecayProducts.size()) > 0)
397 size_t locNumInclusiveDecayProductSteps = 0;
398 for(
auto& locParticlePair : locMissingDecayProducts)
400 if(locParticlePair.second == DReactionStep::Get_ParticleIndex_Inclusive())
401 ++locNumInclusiveDecayProductSteps;
404 if((locNumInclusiveSteps - locNumInclusiveDecayProductSteps) > 0)
411 auto locFinalPIDs = locReactionStep->Get_FinalPIDs();
412 locFinalPIDs.erase(locFinalPIDs.begin() + loc_j);
413 deque<Particle_t> locMissingMassOffOfPIDs(locFinalPIDs.begin(), locFinalPIDs.end());
416 locMissingDecayPIDsUsed.insert(locPID);
421 if((locNumMissingParticles == 0) && (locNumInclusiveSteps == 0) && (!locUseKinFitResultsFlag || !locP4Fit))
432 for(
auto locPID : locFinalPIDs)
436 for(
auto& locSystemPair : locTimeCuts)
443 pair<float, float> locCutPair;
448 int locNumBins = int((locCutPair.second - locCutPair.first)*1000.0 + 0.001);
463 pair<TF1*, TF1*> locFuncPair;
466 auto locCutPair = std::make_pair(locFuncPair.first->Eval(12.0), locFuncPair.second->Eval(12.0));
469 int locNumBins = int((locCutPair.second - locCutPair.first)*1000.0 + 0.001);
476 ostringstream locActionUniqueNameStream;
477 if((locPID ==
Unknown) && (locMissingMassOffOfStepIndex == 0))
478 locActionUniqueNameStream << locBaseUniqueName;
479 else if(locMissingMassOffOfStepIndex == 0)
480 locActionUniqueNameStream <<
ParticleType(locPID) <<
"_" << locBaseUniqueName;
482 locActionUniqueNameStream <<
"Step" << locMissingMassOffOfStepIndex <<
"_" << locBaseUniqueName;
484 locActionUniqueNameStream <<
ParticleType(locPID) <<
"_Step" << locMissingMassOffOfStepIndex <<
"_" << locBaseUniqueName;
488 cout <<
"create miss mass squared action: off step index, kinfit flag, off pids: " << locMissingMassOffOfStepIndex <<
", " << locUseKinFitResultsFlag;
489 for(
auto& locPID : locMissingMassOffOfPIDs)
490 cout <<
", " << locPID;
501 if(locString[0] ==
'm')
503 locIsMissingFlag =
true;
504 locString = locString.substr(1);
507 locIsMissingFlag =
false;
509 istringstream locIStream(locString);
511 locIStream >> locPIDInt;
512 if(locIStream.fail())
521 string locNameString =
"";
522 auto locFirstStepTargetPID = locFirstStepFlag ? std::get<1>(locStepTuple) :
Unknown;
523 if(!locFirstStepFlag)
525 locNameString =
ShortName(std::get<0>(locStepTuple));
526 auto locSecondPID = std::get<1>(locStepTuple);
528 locNameString +=
ShortName(locSecondPID);
529 locNameString +=
"_";
531 for(
auto& locFinalPID : std::get<2>(locStepTuple))
533 if(locFinalPID == locFirstStepTargetPID)
537 auto locMissFinalPID = std::get<3>(locStepTuple);
541 if(std::get<4>(locStepTuple) == DReactionStep::Get_ParticleIndex_Inclusive())
542 locNameString +=
"inc";
543 return locNameString;
550 map<size_t, tuple<string, string, string, vector<string>>> locInputStrings;
551 map<string, string> locParameterMap;
552 gPARMS->GetParameters(locParameterMap,
"Reaction");
553 for(
auto locParamPair : locParameterMap)
556 cout <<
"param pair: " << locParamPair.first <<
", " << locParamPair.second << endl;
559 auto locColonIndex = locParamPair.first.find(
':');
560 auto locPreColonName = locParamPair.first.substr(0, locColonIndex);
562 cout <<
"colon index, pre-colon name: " << locColonIndex <<
", " << locPreColonName << endl;
564 istringstream locIStream(locPreColonName);
565 size_t locReactionNumber;
566 locIStream >> locReactionNumber;
567 if(locIStream.fail())
570 cout <<
"reaction #: " << locReactionNumber << endl;
574 string locFullParamName =
string(
"Reaction") + locParamPair.first;
575 gPARMS->SetDefaultParameter(locFullParamName, locKeyValue);
578 if(locColonIndex == string::npos)
579 std::get<1>(locInputStrings[locReactionNumber]) = locKeyValue;
582 auto locPostColonName = locParamPair.first.substr(locColonIndex + 1);
583 if(locPostColonName.substr(0, 4) ==
"Name")
584 std::get<0>(locInputStrings[locReactionNumber]) = locKeyValue;
585 else if(locPostColonName.substr(0, 5) ==
"Flags")
586 std::get<2>(locInputStrings[locReactionNumber]) = locKeyValue;
588 std::get<3>(locInputStrings[locReactionNumber]).push_back(locKeyValue);
593 cout <<
"reaction #, tuple strings: " << locReactionNumber <<
", " << std::get<0>(locInputStrings[locReactionNumber]) <<
", " << std::get<1>(locInputStrings[locReactionNumber]) <<
", " << std::get<2>(locInputStrings[locReactionNumber]);
594 for(
auto& locTempString : std::get<3>(locInputStrings[locReactionNumber]))
595 cout <<
", " << locTempString;
600 return locInputStrings;
606 locStepTuple = std::make_tuple(
Unknown,
Unknown, vector<Particle_t>{},
Unknown, DReactionStep::Get_ParticleIndex_None());
609 auto locStateSeparationIndex = locStepString.find(
"__");
610 if(locStateSeparationIndex == string::npos)
615 auto locInitStateString = locStepString.substr(0, locStateSeparationIndex);
616 auto locUnderscoreIndex = locInitStateString.find(
"_");
617 auto locInitParticleString = (locUnderscoreIndex != string::npos) ? locInitStateString.substr(0, locUnderscoreIndex) : locInitStateString;
620 bool locIsMissingFlag;
623 std::get<0>(locStepTuple) = locPID;
625 std::get<4>(locStepTuple) = DReactionStep::Get_ParticleIndex_Initial();
627 if(locUnderscoreIndex != string::npos)
629 locInitStateString = locInitStateString.substr(locUnderscoreIndex + 1);
632 std::get<1>(locStepTuple) = locPID;
634 std::get<4>(locStepTuple) = DReactionStep::Get_ParticleIndex_SecondBeam();
638 string locRemainingStepString = locStepString.substr(locStateSeparationIndex + 2);
641 auto locUnderscoreIndex = locRemainingStepString.find(
"_");
642 auto locParticleString = (locUnderscoreIndex != string::npos) ? locRemainingStepString.substr(0, locUnderscoreIndex) : locRemainingStepString;
644 cout <<
"remaining string, underscore index, particle string: " << locRemainingStepString <<
", " << locUnderscoreIndex <<
", " << locParticleString << endl;
647 bool locIsMissingFlag =
false;
650 cout <<
"BUILDING DREACTION, STEP PID STRING " << locStepString <<
" NOT RECOGNIZED." << endl;
656 std::get<3>(locStepTuple) = locPID;
658 std::get<4>(locStepTuple) = DReactionStep::Get_ParticleIndex_Inclusive();
661 std::get<2>(locStepTuple).push_back(locPID);
663 if(locUnderscoreIndex == string::npos)
665 locRemainingStepString = locRemainingStepString.substr(locUnderscoreIndex + 1);
668 if(std::get<3>(locStepTuple) !=
Unknown)
669 std::get<4>(locStepTuple) = std::get<2>(locStepTuple).size();
673 cout <<
"step tuple: init pid, 2nd init pid, #final pids, missing pid, missing index: " << std::get<0>(locStepTuple) <<
", " << std::get<1>(locStepTuple);
674 cout <<
", " << std::get<2>(locStepTuple).
size() <<
", " << std::get<3>(locStepTuple) <<
", " << std::get<4>(locStepTuple) << endl;
void Add_ReactionStep(const DReactionStep *locReactionStep)
bool Get_InvariantMassCuts(Particle_t locPID, pair< float, float > &locMinMaxCuts_GeV) const
void Set_MaxExtraGoodTracks(size_t locMaxExtraGoodTracks)
void Enable_TTreeOutput(string locTTreeOutputFileName, bool locSaveUnusedFlag=false)
DKinFitType Get_KinFitType(void) const
bool Get_MissingMassSquaredCuts(Particle_t locPID, pair< TF1 *, TF1 * > &locMinMaxCuts_GeVSq) const
void Set_MaxExtraShowers(size_t locMaxExtraShowers)
bool Get_KinFitConstrainInitMassFlag(void) const
void Create_MissingMassSquaredHistogram(DReaction *locReaction, Particle_t locPID, bool locUseKinFitResultsFlag, string locBaseUniqueName, int locMissingMassOffOfStepIndex, const deque< Particle_t > &locMissingMassOffOfPIDs)
DSourceComboTimeHandler * dSourceComboTimeHandler
void Set_NumPlusMinusRFBunches(size_t locNumPlusMinusRFBunches)
static char * ParticleType(Particle_t p)
DSourceComboP4Handler * dSourceComboP4Handler
void Add_PostKinfitTimingCuts(DReaction *locReaction)
map< size_t, tuple< string, string, string, vector< string > > > Parse_Input(void)
bool Check_IfMissingDecayProduct(const DReaction *locReaction, size_t locStepIndex)
vector< Particle_t > Get_FinalPIDs(int locStepIndex=-1, bool locIncludeMissingFlag=true, bool locIncludeDecayingFlag=true, Charge_t locCharge=d_AllCharges, bool locIncludeDuplicatesFlag=true) const
void Set_KinFitType(DKinFitType locKinFitType)
vector< pair< int, int > > Get_MissingDecayProductIndices(const DReaction *locReaction, size_t locStepIndex)
void Create_InvariantMassHistogram(DReaction *locReaction, Particle_t locPID, bool locUseKinFitResultsFlag, string locBaseUniqueName)
void Set_Flags(DReaction *locReaction, string locRemainingFlagString)
Particle_t Get_InitialPID(void) const
DReactionStep * Create_ReactionStep(const DReactionStepTuple &locStepTuple)
string Create_StepNameString(const DReactionStepTuple &locStepTuple, bool locFirstStepFlag)
map< DetectorSystem_t, TF1 * > Get_TimeCuts(Particle_t locPID) const
void Add_MassHistograms(DReaction *locReaction, bool locUseKinFitResultsFlag, string locBaseUniqueName="")
string Get_ReactionName(void) const
Particle_t Get_FinalPID(size_t locIndex) const
bool Convert_StringToPID(string locString, Particle_t &locPID, bool &locIsMissingFlag)
vector< DReaction * > Create_Reactions(const map< size_t, tuple< string, string, string, vector< string >>> &locInputStrings)
bool Parse_StepPIDString(string locStepString, DReactionStepTuple &locStepTuple)
vector< Particle_t > Get_MissingPIDs(int locStepIndex=-1, Charge_t locCharge=d_AllCharges, bool locIncludeDuplicatesFlag=true) const
jerror_t evnt(JEventLoop *locEventLoop, uint64_t locEventNumber)
static char * ShortName(Particle_t locPID)
vector< Particle_t > Get_FinalPIDs(bool locIncludeMissingFlag=true, Charge_t locCharge=d_AllCharges, bool locIncludeDuplicatesFlag=true) const
void Create_Steps(DReaction *locReaction, DReactionStep *locCurrentStep, vector< DReactionStepTuple > &locDecayStepTuples)
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
tuple< Particle_t, Particle_t, vector< Particle_t >, Particle_t, int > DReactionStepTuple
size_t Get_NumReactionSteps(void) const
DReactionStep * Create_DefaultDecayStep(Particle_t locPID)
void Print_Reaction(const DReaction *locReaction)