1 #ifndef DSourceComboer_h
2 #define DSourceComboer_h
8 #include <unordered_map>
9 #include <unordered_set>
16 #include "JANA/JObject.h"
17 #include "JANA/JEventLoop.h"
102 void Reset_NewEvent(JEventLoop* locEventLoop);
113 const DSourceCombo* Get_StepSourceCombo(
const DReaction* locReaction,
size_t locDesiredStepIndex,
const DSourceCombo* locVertexPrimaryCombo,
size_t locVertexPrimaryStepIndex = 0)
const;
116 pair<DSourceComboUse, size_t> Get_StepSourceComboUse(
const DReaction* locReaction,
size_t locDesiredStepIndex,
DSourceComboUse locVertexPrimaryComboUse,
size_t locVertexPrimaryStepIndex)
const;
124 void Print_NumCombosByUse(
void);
131 void Define_DefaultCuts(
void);
132 void Get_CommandLineCuts_dEdx(
void);
133 void Get_CommandLineCuts_EOverP(
void);
134 void Create_CutFunctions(
void);
135 void Setup_NeutralShowers(JEventLoop* locEventLoop);
136 void Recycle_Vectors(
void);
139 bool Check_Reactions(vector<const DReaction*>& locReactions);
140 bool Check_NumParticles(
const DReaction* locReaction);
141 bool Check_Skims(
const DReaction* locReaction)
const;
147 void Fill_CutHistograms(
void);
148 void Fill_SurvivalHistograms(
void);
153 DSourceComboUse Build_NewZDependentUse(
const DReaction* locReaction,
size_t locStepIndex,
signed char locVertexZBin,
const DSourceComboUse& locOrigUse,
const unordered_map<size_t, DSourceComboUse>& locCreatedUseMap);
158 map<Particle_t, unsigned char> Build_ParticleMap(
const DReaction* locReaction,
size_t locStepIndex,
Charge_t locCharge)
const;
159 pair<bool, map<DSourceComboUse, unsigned char>> Get_FinalStateDecayingComboUses(
const DReaction* locReaction,
size_t locStepIndex,
const map<size_t, DSourceComboUse>& locStepComboUseMap)
const;
160 DSourceComboUse Make_ComboUse(
Particle_t locInitPID,
const map<Particle_t, unsigned char>& locNumParticles,
const map<DSourceComboUse, unsigned char>& locFurtherDecays,
bool locMissingDecayProductFlag,
Particle_t locTargetToInclude);
161 const DSourceComboInfo* MakeOrGet_SourceComboInfo(
const vector<pair<Particle_t, unsigned char>>& locNumParticles,
const vector<pair<DSourceComboUse, unsigned char>>& locFurtherDecays,
unsigned char locNumTabs);
162 const DSourceComboInfo* GetOrMake_SourceComboInfo(
const vector<pair<Particle_t, unsigned char>>& locNumParticles,
const vector<pair<DSourceComboUse, unsigned char>>& locFurtherDecays,
unsigned char locNumTabs);
170 void Create_SourceCombos(
const DSourceComboUse& locComboUseToCreate, ComboingStage_t locComboingStage,
const DSourceCombo* locChargedCombo_Presiding,
unsigned char locNumTabs);
171 void Create_SourceCombos_Unknown(
const DSourceComboUse& locComboUseToCreate, ComboingStage_t locComboingStage,
const DSourceCombo* locChargedCombo_Presiding,
unsigned char locNumTabs);
175 void Combo_Vertically_AllDecays(
const DSourceComboUse& locComboUseToCreate, ComboingStage_t locComboingStage,
const DSourceCombo* locChargedCombo_Presiding,
unsigned char locNumTabs);
177 void Combo_Vertically_AllParticles(
const DSourceComboUse& locComboUseToCreate, ComboingStage_t locComboingStage,
unsigned char locNumTabs);
178 void Combo_Vertically_NParticles(
const DSourceComboUse& locComboUseToCreate,
const DSourceComboUse& locNMinus1ComboUse, ComboingStage_t locComboingStage,
unsigned char locNumTabs);
181 void Combo_Horizontally_All(
const DSourceComboUse& locComboUseToCreate, ComboingStage_t locComboingStage,
const DSourceCombo* locChargedCombo_Presiding,
unsigned char locNumTabs);
182 void Combo_Horizontally_AddDecay(
const DSourceComboUse& locComboUseToCreate,
const DSourceComboUse& locComboUseAllBut1,
const DSourceComboUse& locComboUseToAdd, ComboingStage_t locComboingStage,
const DSourceCombo* locChargedCombo_Presiding,
bool locExpandAllBut1Flag,
unsigned char locNumTabs);
183 void Combo_Horizontally_AddParticles(
const DSourceComboUse& locComboUseToCreate,
const DSourceComboUse& locComboUseAllBut1,
const pair<Particle_t, unsigned char>& locParticlePairToAdd, ComboingStage_t locComboingStage,
const DSourceCombo* locChargedCombo_Presiding,
bool locExpandAllBut1Flag,
unsigned char locNumTabs);
186 void Create_Combo_OneParticle(
const DSourceComboUse& locComboUseToCreate, ComboingStage_t locComboingStage,
unsigned char locNumTabs);
187 void Create_Combo_OneDecay(
const DSourceComboUse& locComboUseToCreate, ComboingStage_t locComboingStage,
const DSourceCombo* locChargedCombo_Presiding,
unsigned char locNumTabs);
188 void Combo_Horizontally_AddCombo(
const DSourceComboUse& locComboUseToCreate,
const DSourceComboUse& locAllBut1ComboUse,
const DSourceComboUse& locSourceComboUseToAdd, ComboingStage_t locComboingStage,
const DSourceCombo* locChargedCombo_Presiding,
bool locExpandAllBut1Flag,
unsigned char locNumTabs);
192 void Build_ParticleIndices(
Particle_t locPID,
const vector<int>& locBeamBunches,
const vector<const JObject*>& locParticles,
signed char locVertexZBin);
193 void Build_ComboIndices(
const DSourceComboUse& locSourceComboUse,
const vector<int>& locBeamBunches,
const vector<const DSourceCombo*>& locCombos, ComboingStage_t locComboingStage);
194 size_t Get_ResumeAtIndex_Particles(
Particle_t locPID,
const JObject* locPreviousObject, vector<int> locBeamBunches,
signed char locVertexZBin)
const;
195 size_t Get_ResumeAtIndex_Combos(
const DSourceComboUse& locSourceComboUse,
const DSourceCombo* locPreviousCombo,
const vector<int>& locBeamBunches, ComboingStage_t locComboingStage)
const;
198 const vector<const DSourceCombo*>& Get_CombosForComboing(
const DSourceComboUse& locComboUse, ComboingStage_t locComboingStage,
const vector<int>& locBeamBunches,
const DSourceCombo* locChargedCombo_PresidingPrevious);
199 const vector<const DSourceCombo*>& Get_CombosByBeamBunch(
const DSourceComboUse& locComboUse,
DCombosByBeamBunch& locCombosByBunch,
const vector<int>& locBeamBunches, ComboingStage_t locComboingStage);
202 void Register_ValidRFBunches(
const DSourceComboUse& locSourceComboUse,
const DSourceCombo* locSourceCombo,
const vector<int>& locRFBunches, ComboingStage_t locComboingStage,
const DSourceCombo* locChargedCombo_Presiding);
203 void Build_ComboResumeIndices(
const DSourceComboUse& locSourceComboUse, ComboingStage_t locComboingStage,
const DSourceCombo* locChargedCombo_Presiding);
206 const vector<const JObject*>& Get_ParticlesForComboing(
Particle_t locPID, ComboingStage_t locComboingStage,
const vector<int>& locBeamBunches = {},
signed char locVertexZBin = 0);
207 const vector<const JObject*>& Get_ShowersByBeamBunch(
const vector<int>& locBeamBunches,
DPhotonShowersByBeamBunch& locShowersByBunch,
signed char locVertexZBin);
208 shared_ptr<const DKinematicData> Create_KinematicData(
const DNeutralShower* locNeutralShower,
const DVector3& locVertex)
const;
209 bool Get_IsComboingZIndependent(
const JObject* locObject,
Particle_t locPID)
const;
216 const DSourceCombo* Get_NextChargedCombo(
const DSourceCombo* locChargedCombo_Presiding,
const DSourceComboUse& locNextComboUse, ComboingStage_t locComboingStage,
bool locGetPresidingFlag,
size_t locInstance)
const;
217 bool Get_ExpandAllBut1Flag(ComboingStage_t locComboingStage,
const DSourceComboUse& locAllBut1ComboUse,
Charge_t locToAddChargeContent);
220 void Check_ForDuplicates(
const vector<const DSourceCombo*>& locCombos)
const;
225 vector<const DSourceCombo*>* Get_SourceComboVectorResource(
void);
230 uint64_t dEventNumber = 0;
231 string dShowerSelectionTag =
"PreSelect";
233 bool dPrintCutFlag =
false;
239 pair<bool, size_t> dNumPlusMinusRFBunches = std::make_pair(
false, 0);
273 size_t dMaxNumNeutrals = 20;
280 size_t dInitialComboVectorCapacity = 100;
319 map<Particle_t, map<DetectorSystem_t, pair<TF1*, TF1*>>>
ddEdxCutMap;
320 map<Particle_t, map<DetectorSystem_t, vector<pair<double, double>>>>
ddEdxValueMap;
336 auto locCombo = dResourcePool_SourceCombo.Get_Resource();
337 dCreatedCombos.push_back(locCombo);
341 inline void DSourceComboer::Recycle_Vectors(
void)
343 for(
auto& locComboVector : dCreatedComboVectors)
345 vector<const DSourceCombo*> locTempCombo;
346 locTempCombo.reserve(dInitialComboVectorCapacity);
347 locTempCombo.swap(*locComboVector);
348 dResourcePool_SourceComboVector.Recycle(locComboVector);
350 decltype(dCreatedComboVectors)().swap(dCreatedComboVectors);
353 inline vector<const DSourceCombo*>* DSourceComboer::Get_SourceComboVectorResource(
void)
355 auto locComboVector = dResourcePool_SourceComboVector.Get_Resource();
356 locComboVector->clear();
357 locComboVector->reserve(dInitialComboVectorCapacity);
358 dCreatedComboVectors.push_back(locComboVector);
359 return locComboVector;
362 inline bool DSourceComboer::Check_Skims(
const DReaction* locReaction)
const
364 if(dESSkimData ==
nullptr)
368 vector<string> locReactionSkimVector;
369 SplitString(locReactionSkimString, locReactionSkimVector,
",");
370 for(
size_t loc_j = 0; loc_j < locReactionSkimVector.size(); ++loc_j)
372 if(!dESSkimData->Get_IsEventSkim(locReactionSkimVector[loc_j]))
381 auto locIterator = dZDependentUseToIndependentMap.find(locZDependentUse);
382 if(locIterator != dZDependentUseToIndependentMap.end())
383 return locIterator->second;
385 auto locZIndependentComboInfo = Get_ZIndependentComboInfo(std::get<2>(locZDependentUse));
386 DSourceComboUse locZIndependentUse(std::get<0>(locZDependentUse), DSourceComboInfo::Get_VertexZIndex_ZIndependent(), locZIndependentComboInfo, std::get<3>(locZDependentUse), std::get<4>(locZDependentUse));
387 dZDependentUseToIndependentMap.emplace(locZDependentUse, locZIndependentUse);
388 return locZIndependentUse;
393 vector<pair<DSourceComboUse, unsigned char>> locFurtherDecays_ZIndependent;
395 locFurtherDecays_ZIndependent.emplace_back(Get_ZIndependentUse(locDecayPair.first), locDecayPair.second);
397 return GetOrMake_SourceComboInfo(locZDependentComboInfo->
Get_NumParticles(), locFurtherDecays_ZIndependent, 0);
400 inline void DSourceComboer::Build_ParticleIndices(
Particle_t locPID,
const vector<int>& locBeamBunches,
const vector<const JObject*>& locParticles,
signed char locVertexZBin)
402 for(
size_t loc_i = 0; loc_i < locParticles.size(); ++loc_i)
404 if(dDebugLevel >= 20)
406 cout <<
"build resume indices: vector address, locPID, particle, zbin, index, bunches: " << &locParticles <<
", " << locPID <<
", " << locParticles[loc_i] <<
", " << int(locVertexZBin) <<
", " << loc_i <<
", ";
407 for(
auto& locBunch : locBeamBunches)
408 cout << locBunch <<
", ";
411 dResumeSearchAfterIndices_Particles.emplace(std::make_tuple(locParticles[loc_i], locPID, locBeamBunches, locVertexZBin), loc_i);
415 inline void DSourceComboer::Build_ComboIndices(
const DSourceComboUse& locSourceComboUse,
const vector<int>& locBeamBunches,
const vector<const DSourceCombo*>& locCombos,
ComboingStage_t locComboingStage)
417 for(
size_t loc_i = 0; loc_i < locCombos.size(); ++loc_i)
419 if(dDebugLevel >= 20)
421 cout <<
"build resume indices: vector address, combo, decay pid, zbin, index, bunches: " << &locCombos <<
", " << locCombos[loc_i] <<
", " << std::get<0>(locSourceComboUse) <<
", " <<
int(std::get<1>(locSourceComboUse)) <<
", " << loc_i <<
", ";
422 for(
auto& locBunch : locBeamBunches)
423 cout << locBunch <<
", ";
426 dResumeSearchAfterIndices_Combos[std::make_pair(locCombos[loc_i], locSourceComboUse)].emplace(locBeamBunches, loc_i);
430 inline size_t DSourceComboer::Get_ResumeAtIndex_Particles(
Particle_t locPID,
const JObject* locPreviousObject, vector<int> locBeamBunches,
signed char locVertexZBin)
const
437 auto locParticleTuple = std::make_tuple(locPreviousObject, locPID, locBeamBunches, locVertexZBin);
438 if(dDebugLevel >= 20)
440 cout <<
"object, pid, zbin, bunches, find result, saved index: " << locPreviousObject <<
", " << locPID <<
", " << int(locVertexZBin) <<
", ";
441 for(
auto& locBunch : locBeamBunches)
442 cout << locBunch <<
", ";
443 cout << (dResumeSearchAfterIndices_Particles.find(locParticleTuple) != dResumeSearchAfterIndices_Particles.end()) <<
", " << dResumeSearchAfterIndices_Particles.find(locParticleTuple)->second + 1 << endl;
445 return dResumeSearchAfterIndices_Particles.find(locParticleTuple)->second + 1;
455 auto locSearchPair = std::make_pair(locPreviousCombo, locSourceComboUse);
456 auto& locBunchIndexMap = dResumeSearchAfterIndices_Combos.find(locSearchPair)->second;
457 auto locSavedIndex = locBunchIndexMap.find(locBeamBunches)->second;
458 if(dDebugLevel >= 20)
460 cout <<
"Get_ResumeAtIndex_Combos: previous combo, bunches, saved index" <<
", " << locPreviousCombo <<
", ";
461 for(
auto& locBunch : locBeamBunches)
462 cout << locBunch <<
", ";
463 cout << locSavedIndex << endl;
465 return locSavedIndex + 1;
468 inline bool DSourceComboer::Get_IsComboingZIndependent(
const JObject* locObject,
Particle_t locPID)
const
481 auto locNeutralShower =
static_cast<const DNeutralShower*
>(locObject);
482 return (locNeutralShower->dDetectorSystem ==
SYS_FCAL);
492 if((locComboingStage == d_ChargedStage) || (locChargeContent_SearchForUse ==
d_Charged))
493 return dSourceCombosByUse_Charged;
494 else if(locChargeContent_SearchForUse ==
d_Neutral)
495 return dMixedCombosByUseByChargedCombo[
nullptr];
496 return dMixedCombosByUseByChargedCombo[locChargedCombo];
505 if(locChargeContent_SearchForUse ==
d_Neutral)
506 return dSourceCombosByBeamBunchByUse[
nullptr];
507 return dSourceCombosByBeamBunchByUse[locChargedCombo];
512 ddEdxValueMap[locPID][locSystem].emplace_back(locP, locdEdx);
513 if(ddEdxCutMap[locPID].find(locSystem) == ddEdxCutMap[locPID].end())
516 auto locCutPair = ddEdxCutMap[locPID][locSystem];
518 return ((locdEdx >= locCutPair.first->Eval(locP)) && (locdEdx <= locCutPair.second->Eval(locP)));
523 dEOverPValueMap[locPID][locSystem].emplace_back(locP, locEOverP);
524 if(dEOverPCutMap[locPID].find(locSystem) == dEOverPCutMap[locPID].end())
527 auto locCutFunc = dEOverPCutMap[locPID][locSystem];
528 return (
IsLepton(locPID) == (locEOverP >= locCutFunc->Eval(locP)));
531 inline DSourceComboer::~DSourceComboer(
void)
534 Fill_SurvivalHistograms();
537 Print_NumCombosByUse();
539 cout <<
"FINAL Num combos by use (charged):" << endl;
540 for(
const auto& locNumCombosByUsePair : dNumMixedCombosMap_Charged)
542 cout << locNumCombosByUsePair.second <<
" of ";
545 cout <<
"FINAL Num combos by use (neutral/mixed):" << endl;
546 for(
const auto& locNumCombosByUsePair : dNumMixedCombosMap_Mixed)
548 cout << locNumCombosByUsePair.second <<
" of ";
553 for(
auto locComboInfo : dSourceComboInfos)
555 delete dSourceComboVertexer;
556 delete dSourceComboP4Handler;
557 delete dSourceComboTimeHandler;
558 delete dParticleComboCreator;
566 #endif // DSourceComboer_h
DSourceCombosByUse_Large dSourceCombosByUse_Charged
set< const DSourceComboInfo *, DCompare_SourceComboInfos > dSourceComboInfoSet
string Get_EventStoreSkims(void) const
map< tuple< const JObject *, Particle_t, vector< int >, signed char >, size_t > dResumeSearchAfterIndices_Particles
DSourceComboP4Handler * dSourceComboP4Handler
map< vector< int >, vector< const DSourceCombo * >> DCombosByBeamBunch
unordered_map< const DReaction *, map< size_t, DSourceComboUse > > dSourceComboUseReactionStepMap
DSourceComboUse Get_SourceComboUse(const DReactionStepVertexInfo *locStepVertexInfo) const
map< vector< int >, vector< const JObject * >> DPhotonShowersByBeamBunch
map< Particle_t, map< DetectorSystem_t, vector< double > > > dEOverPCuts_TF1Params
map< Particle_t, map< DetectorSystem_t, TH2 * > > dHistMap_dEdx
map< const DReaction *, TH1 * > dNumCombosSurvivedStageMap
unordered_set< const DSourceComboInfo * > dComboInfosWithPhotons
const DReactionStepVertexInfo * Get_StepVertexInfo(size_t locStepIndex) const
vector< DSourceCombo * > dCreatedCombos
unordered_set< const DSourceComboInfo * > dComboInfosWithMassiveNeutrals
map< pair< const DSourceCombo *, signed char >, vector< int > > dValidRFBunches_ByCombo
map< pair< const DReactionVertexInfo *, vector< signed char > >, DSourceComboUse > dSourceComboUseVertexZMap
unordered_map< const DReaction *, size_t > dRFBunchCutsByReaction
unordered_map< const DSourceCombo *, DSourceCombosByBeamBunchByUse > dSourceCombosByBeamBunchByUse
std::underlying_type< DConstructionStage >::type DConstructionStageType
map< bool, vector< const JObject * > > dTracksByCharge
map< Particle_t, map< DetectorSystem_t, vector< pair< double, double > > > > dEOverPValueMap
map< Particle_t, map< DetectorSystem_t, pair< TF1 *, TF1 * > > > ddEdxCutMap
unordered_map< const DReactionVertexInfo *, size_t > dMaxRFBunchCuts
vector< pair< Particle_t, unsigned char > > Get_NumParticles(bool locEntireChainFlag=false) const
static int ParticleCharge(Particle_t p)
map< pair< const DSourceCombo *, const DReactionStepVertexInfo * >, const DSourceCombo * > dVertexPrimaryComboMap
DSourceComboTimeHandler * dSourceComboTimeHandler
DResourcePool< DSourceCombo > dResourcePool_SourceCombo
unordered_map< const DSourceComboInfo *, Charge_t > dComboInfoChargeContent
tuple< Particle_t, signed char, const DSourceComboInfo *, bool, Particle_t > DSourceComboUse
map< pair< const DReactionStepVertexInfo *, DSourceComboUse >, size_t > dSourceComboInfoStepMap
DParticleComboCreator * Get_ParticleComboCreator(void) const
vector< vector< const DSourceCombo * > * > dCreatedComboVectors
map< DSourceComboUse, vector< const DSourceCombo * > * > DSourceCombosByUse_Large
DParticleComboCreator * dParticleComboCreator
Charge_t Get_ChargeContent(const DSourceComboInfo *locSourceComboInfo) const
DSourceComboUse Get_PrimaryComboUse(const DReactionVertexInfo *locReactionVertexInfo) const
map< const DReaction *, TH1 * > dNumEventsSurvivedStageMap
bool Get_HasPhotons(const DSourceComboInfo *locSourceComboInfo) const
vector< const DSourceComboInfo * > dSourceComboInfos
DSourceComboUse Get_SourceComboUse(const DReaction *locReaction, size_t locStepIndex) const
map< DSourceComboUse, size_t > dNumMixedCombosMap_Charged
void SplitString(string str, vector< T > &vec, const string &delim=" ")
map< Particle_t, vector< const JObject * > > dTracksByPID
unordered_map< const DSourceCombo *, DSourceCombosByUse_Large > dMixedCombosByUseByChargedCombo
map< Particle_t, map< DetectorSystem_t, vector< pair< double, double > > > > ddEdxValueMap
static int IsLepton(Particle_t p)
map< DSourceComboUse, DSourceComboUse > dZDependentUseToIndependentMap
map< DSourceComboUse, DCombosByBeamBunch > DSourceCombosByBeamBunchByUse
vector< pair< DSourceComboUse, unsigned char > > Get_FurtherDecays(void) const
unordered_map< const DReactionStepVertexInfo *, DSourceComboUse > dSourceComboUseReactionMap
static double ParticleMass(Particle_t p)
map< vector< const JObject * >, const DSourceCombo * > dNPhotonsToComboMap
map< Particle_t, map< DetectorSystem_t, TH2 * > > dHistMap_EOverP
void Print_SourceComboUse(const DSourceComboUse &locComboUse, unsigned char locNumTabs=0, bool locIgnoreTabs=false)
DResourcePool< vector< const DSourceCombo * > > dResourcePool_SourceComboVector
map< DSourceComboUse, size_t > dNumMixedCombosMap_Mixed
unordered_map< signed char, DPhotonShowersByBeamBunch > dShowersByBeamBunchByZBin
map< const DReaction *, map< DConstructionStage, size_t > > dNumCombosSurvivedStageTracker
map< Particle_t, map< DetectorSystem_t, string > > dEOverPCuts_TF1FunctionStrings
map< Particle_t, map< DetectorSystem_t, pair< string, string > > > ddEdxCuts_TF1FunctionStrings
map< Particle_t, map< DetectorSystem_t, TF1 * > > dEOverPCutMap
map< Particle_t, map< DetectorSystem_t, pair< vector< double >, vector< double > > > > ddEdxCuts_TF1Params
bool operator()(const DSourceComboInfo *lhs, const DSourceComboInfo *rhs) const
bool Get_HasMassiveNeutrals(const DSourceComboInfo *locSourceComboInfo) const
map< const DReaction *, TH2 * > dNumCombosSurvivedStage2DMap
DSourceComboVertexer * dSourceComboVertexer
map< pair< const DSourceCombo *, DSourceComboUse >, map< vector< int >, size_t > > dResumeSearchAfterIndices_Combos
unordered_map< const DReaction *, vector< const DParticleCombo * >> DCombosByReaction