10 #include "JANA/JObject.h"
11 #include "JANA/JEventLoop.h"
27 class DSourceComboInfo;
34 using DSourceComboUse = tuple<Particle_t, signed char, const DSourceComboInfo*, bool, Particle_t>;
69 DSourceComboInfo(
const vector<pair<Particle_t, unsigned char>>& locNumParticles,
const vector<pair<DSourceComboUse, unsigned char>>& locFurtherDecays = {});
75 vector<pair<Particle_t, unsigned char>> Get_NumParticles(
bool locEntireChainFlag =
false)
const;
76 vector<pair<DSourceComboUse, unsigned char>>
Get_FurtherDecays(
void)
const{
return dFurtherDecays;}
100 if((std::get<2>(lhs) ==
nullptr) || (std::get<2>(rhs) ==
nullptr))
102 if(std::get<2>(lhs) != std::get<2>(rhs))
103 return (std::get<2>(lhs) ==
nullptr);
104 if(std::get<3>(lhs) != std::get<3>(rhs))
105 return (std::get<3>(lhs) < std::get<3>(rhs));
106 if(std::get<4>(lhs) != std::get<4>(rhs))
107 return (std::get<4>(lhs) < std::get<4>(rhs));
109 if(std::get<0>(lhs) == std::get<0>(rhs))
111 if(std::get<1>(lhs) == std::get<1>(rhs))
114 return std::get<1>(lhs) > std::get<1>(rhs);
117 return std::get<0>(lhs) > std::get<0>(rhs);
123 if(locChargeContent_LHS != locChargeContent_RHS)
124 return locChargeContent_LHS > locChargeContent_RHS;
126 if(std::get<3>(lhs) != std::get<3>(rhs))
127 return (std::get<3>(lhs) < std::get<3>(rhs));
128 if(std::get<4>(lhs) != std::get<4>(rhs))
129 return (std::get<4>(lhs) < std::get<4>(rhs));
132 if(std::get<0>(lhs) == std::get<0>(rhs))
134 if(std::get<1>(lhs) == std::get<1>(rhs))
135 return *std::get<2>(rhs) < *std::get<2>(lhs);
137 return std::get<1>(lhs) > std::get<1>(rhs);
140 return std::get<0>(lhs) > std::get<0>(rhs);
146 bool operator()(
const pair<Particle_t, unsigned char>& lhs,
const pair<Particle_t, unsigned char>& rhs)
const{
return lhs.first < rhs.first;}
153 bool operator()(
const pair<DSourceComboUse, unsigned char>& lhs,
const pair<DSourceComboUse, unsigned char>& rhs)
const{
return DAnalysis::operator<(lhs.first, rhs.first);}
170 void Set_Members(
const vector<pair<Particle_t, const JObject*>>& locSourceParticles,
const DSourceCombosByUse_Small& locFurtherDecayCombos,
bool locIsZIndependent =
false);
195 bool dIsComboingZIndependent =
false;
211 std::sort(locParticles.begin(), locParticles.end());
212 auto locUniqueIterator = std::unique(locParticles.begin(), locParticles.end());
213 return (locUniqueIterator != locParticles.end());
219 inline DSourceComboInfo::DSourceComboInfo(
const vector<pair<Particle_t, unsigned char>>& locNumParticles,
const vector<pair<DSourceComboUse, unsigned char>>& locFurtherDecays) :
220 dNumParticles(locNumParticles), dFurtherDecays(locFurtherDecays)
241 if(locMismachIterators.first->first == locMismachIterators.second->first)
242 return locMismachIterators.first->second < locMismachIterators.second->second;
244 return locMismachIterators.first->first < locMismachIterators.second->first;
252 vector<pair<Particle_t, unsigned char>> locToReturnNumParticles =
dNumParticles;
255 const auto& locDecayComboInfo = std::get<2>(locDecayPair.first);
256 auto locNumDecayParticles = locDecayComboInfo->Get_NumParticles(
true);
258 for(
const auto& locParticlePair : locNumDecayParticles)
261 auto locIteratorPair = std::equal_range(locToReturnNumParticles.begin(), locToReturnNumParticles.end(), locParticlePair.first,
DCompare_ParticlePairPIDs());
262 if(locIteratorPair.first != locIteratorPair.second)
263 (*locIteratorPair.first).second += locParticlePair.second;
265 locToReturnNumParticles.insert(locIteratorPair.first, locParticlePair);
269 return locToReturnNumParticles;
273 dSourceParticles(locSourceParticles), dFurtherDecayCombos(locFurtherDecayCombos), dIsComboingZIndependent(locIsZIndependent) {}
292 vector<pair<Particle_t, const JObject*>> locToReturnParticles =
dSourceParticles;
294 auto Charge_Checker = [&locCharge](
const pair<Particle_t, const JObject*>& locPair) ->
bool {
return !
Is_CorrectCharge(locPair.first, locCharge);};
295 locToReturnParticles.erase(std::remove_if(locToReturnParticles.begin(), locToReturnParticles.end(), Charge_Checker), locToReturnParticles.end());
298 return locToReturnParticles;
302 const auto& locDecayVector = locDecayPair.second;
303 for(
const auto& locDecayCombo : locDecayVector)
305 auto locDecayParticles = locDecayCombo->Get_SourceParticles(
true, locCharge);
306 locToReturnParticles.insert(locToReturnParticles.end(), locDecayParticles.begin(), locDecayParticles.end());
310 return locToReturnParticles;
318 if(locComboInfo ==
nullptr)
322 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
323 cout <<
"Particles: ";
324 for(
auto& locParticlePair : locNumParticles)
325 cout << int(locParticlePair.second) <<
" " <<
ParticleType(locParticlePair.first) <<
", ";
329 for(
auto& locDecayPair : locFurtherDecays)
331 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
332 cout << int(locDecayPair.second) <<
" of ";
340 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
341 cout <<
"Use (decay pid, z-bin, combo info, has-missing-decay-product, mass-cut-pid-to-exclude): ";
342 cout << ParticleType(std::get<0>(locComboUse)) <<
", " << int(std::get<1>(locComboUse)) <<
", " << std::get<2>(locComboUse) <<
", " << std::get<3>(locComboUse) <<
", " << std::get<4>(locComboUse) <<
":" << endl;
348 if(locCombo ==
nullptr)
351 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
354 for(
auto& locParticlePair : locSourceParticles)
355 cout <<
ParticleType(locParticlePair.first) <<
" " << locParticlePair.second <<
", ";
359 for(
auto& locDecayPair : locFurtherDecayCombos)
361 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
362 cout << locDecayPair.second.size() <<
" of ";
364 for(
auto& locCombo : locDecayPair.second)
372 vector<const JObject*> locOutputParticles;
373 for(
const auto& locParticlePair : locSourceParticles)
375 if((locPID ==
Unknown) || (locParticlePair.first == locPID))
376 locOutputParticles.push_back(locParticlePair.second);
378 return locOutputParticles;
381 inline vector<const JObject*>
Get_SourceParticles(
const vector<pair<Particle_t, const JObject*>>& locSourceParticles,
int locCharge)
384 vector<const JObject*> locOutputParticles;
385 for(
const auto& locParticlePair : locSourceParticles)
388 if((locParticleCharge == locCharge) && (locParticleCharge == 0))
389 locOutputParticles.push_back(locParticlePair.second);
390 else if(locParticleCharge*locCharge != 0)
391 locOutputParticles.push_back(locParticlePair.second);
393 return locOutputParticles;
400 for(
const auto& locDecayPair : locFurtherDecayCombos)
402 auto locDecayPID = std::get<0>(locDecayPair.first);
405 for(
const auto& locDecayCombo : locDecayPair.second)
408 locSourceParticles.insert(locSourceParticles.end(), locDecayParticles.begin(), locDecayParticles.end());
412 return locSourceParticles;
417 vector<const DSourceCombo*> locVertexCombos = {locSourceCombo};
420 auto locDecayPID = std::get<0>(locDecayPair.first);
423 for(
const auto& locDecayCombo : locDecayPair.second)
426 locVertexCombos.insert(locVertexCombos.end(), locDecayVertexCombos.begin(), locDecayVertexCombos.end());
429 return locVertexCombos;
435 vector<pair<DSourceComboUse, vector<const DSourceCombo*>>> locVertexCombosByUse;
438 auto locDecayPID = std::get<0>(locDecayPair.first);
441 locVertexCombosByUse.emplace_back(locDecayPair);
442 for(
const auto& locDecayCombo : locDecayPair.second)
445 locVertexCombosByUse.insert(locVertexCombosByUse.end(), locDecayVertexCombosByUse.begin(), locDecayVertexCombosByUse.end());
448 return locVertexCombosByUse;
454 auto Charge_Search = [&locCharge](
const pair<Particle_t, unsigned char>& locPair) ->
bool
457 if(!std::any_of(locNumParticles.begin(), locNumParticles.end(), Charge_Search))
461 if(!std::any_of(locNumParticles.begin(), locNumParticles.end(), Charge_Search))
479 auto locDecayPID = std::get<0>(locDecayPair.first);
484 for(
const auto& locDecayParticlePair : locDecayNumParticles)
486 bool locFoundFlag =
false;
487 for(
auto& locParticlePairSoFar : locNumParticles)
489 if(locDecayParticlePair.first != locParticlePairSoFar.first)
491 locParticlePairSoFar.second += locDecayParticlePair.second;
496 locNumParticles.push_back(locDecayParticlePair);
500 return locNumParticles;
513 auto Find_MassiveNeutrals = [](
const pair<Particle_t, unsigned char>& locPair) ->
bool
518 return std::any_of(locNumParticles.begin(), locNumParticles.end(), Find_MassiveNeutrals);
526 auto Find_MassiveNeutrals = [](
const pair<Particle_t, unsigned char>& locPair) ->
bool
531 return std::any_of(locNumParticles.begin(), locNumParticles.end(), Find_MassiveNeutrals);
536 auto ParticleFinder = [&locPID, &locInstance, &locPIDCountSoFar](pair<Particle_t, const JObject*>& locPair) ->
bool
537 {
return ((locPair.first != locPID) ?
false : ((++locPIDCountSoFar == locInstance) ?
true :
false));};
540 auto locIterator = std::find_if(locParticles.begin(), locParticles.end(), ParticleFinder);
541 if(locIterator != locParticles.end())
542 return locIterator->second;
546 if(std::get<0>(locDecayPair.first) !=
Unknown)
548 for(
const auto& locDecayCombo : locDecayPair.second)
551 if(locParticle !=
nullptr)
564 if(locParticles_lhs.size() != locParticles_rhs.size())
566 if(!std::is_permutation(locParticles_lhs.begin(), locParticles_lhs.end(), locParticles_rhs.begin()))
571 if(locDecayCombos_lhs.size() != locDecayCombos_rhs.size())
574 for(
auto& locDecayPair : locDecayCombos_lhs)
577 if(locIteratorPair.first == locIteratorPair.second)
580 auto& locDecayCombos_lhs = locDecayPair.second;
581 auto& locDecayCombos_rhs = (*locIteratorPair.first).second;
582 if(locDecayCombos_lhs.size() != locDecayCombos_rhs.size())
584 if(!std::is_permutation(locDecayCombos_lhs.begin(), locDecayCombos_lhs.end(), locDecayCombos_rhs.begin(),
Check_AreDuplicateCombos))
592 #endif // DSourceCombo_h
DSourceCombosByUse_Small dFurtherDecayCombos
vector< pair< DSourceComboUse, vector< const DSourceCombo * > > > Get_SourceCombosAndUses_ThisVertex(const DSourceCombo *locSourceCombo)
vector< pair< DSourceComboUse, unsigned char > > dFurtherDecays
Charge_t Get_ChargeContent_ThisVertex(const DSourceComboInfo *locSourceComboInfo)
bool Get_HasPhotons(const DSourceComboInfo *locComboInfo)
bool operator()(const DSourceCombo *locCombo) const
bool operator<(const DSourceComboUse &lhs, const DSourceComboUse &rhs)
bool operator()(const pair< DSourceComboUse, unsigned char > &lhs, const pair< DSourceComboUse, unsigned char > &rhs) const
bool Check_AreDuplicateCombos(const DSourceCombo *lhs, const DSourceCombo *rhs)
DSourceCombo(void)=default
bool operator()(const pair< Particle_t, unsigned char > &lhs, Particle_t rhs) const
void Print_SourceComboInfo(const DSourceComboInfo *locComboInfo, unsigned char locNumTabs=0)
vector< pair< Particle_t, const JObject * > > dSourceParticles
vector< pair< DSourceComboUse, vector< const DSourceCombo * >>> DSourceCombosByUse_Small
bool Get_HasMassiveNeutrals(const DSourceComboInfo *locComboInfo)
static signed char Get_VertexZIndex_OutOfRange(void)
static unsigned short int IsDetachedVertex(Particle_t p)
static char * ParticleType(Particle_t p)
static signed char Get_VertexZIndex_Unknown(void)
vector< pair< Particle_t, unsigned char > > Get_NumParticles(bool locEntireChainFlag=false) const
static int ParticleCharge(Particle_t p)
bool dIsComboingZIndependent
static signed char Get_VertexZIndex_ZIndependent(void)
tuple< Particle_t, signed char, const DSourceComboInfo *, bool, Particle_t > DSourceComboUse
bool operator()(Particle_t lhs, const pair< Particle_t, unsigned char > &rhs) const
vector< pair< Particle_t, const JObject * > > Get_SourceParticles(bool locEntireChainFlag=false, Charge_t locCharge=d_AllCharges) const
Charge_t Get_ChargeContent(const DSourceComboInfo *locSourceComboInfo)
bool operator()(const pair< Particle_t, unsigned char > &lhs, const pair< Particle_t, unsigned char > &rhs) const
bool Get_IsComboingZIndependent(void) const
void Set_Members(const vector< pair< Particle_t, const JObject * >> &locSourceParticles, const DSourceCombosByUse_Small &locFurtherDecayCombos, bool locIsZIndependent=false)
const JObject * Get_SourceParticle_ThisStep(const DSourceCombo *locSourceCombo, Particle_t locPID, size_t locInstance, size_t &locPIDCountSoFar)
vector< const JObject * > Get_SourceParticles(const vector< pair< Particle_t, const JObject * >> &locSourceParticles, Particle_t locPID=Unknown)
vector< pair< DSourceComboUse, unsigned char > > Get_FurtherDecays(void) const
static int Is_CorrectCharge(Particle_t locPID, Charge_t locCharge)
bool operator()(const pair< DSourceComboUse, vector< const DSourceCombo * >> &lhs, DSourceComboUse rhs) const
static double ParticleMass(Particle_t p)
bool operator()(const pair< DSourceComboUse, vector< const DSourceCombo * >> &lhs, const pair< DSourceComboUse, vector< const DSourceCombo * >> &rhs) const
void Print_SourceComboUse(const DSourceComboUse &locComboUse, unsigned char locNumTabs=0, bool locIgnoreTabs=false)
vector< pair< Particle_t, unsigned char > > Get_NumParticles_ThisVertex(const DSourceComboInfo *locSourceComboInfo)
vector< const DSourceCombo * > Get_SourceCombos_ThisVertex(const DSourceCombo *locSourceCombo)
bool operator()(const pair< DSourceComboUse, unsigned char > &lhs, DSourceComboUse rhs) const
vector< pair< Particle_t, const JObject * > > Get_SourceParticles_ThisVertex(const DSourceCombo *locSourceCombo, Charge_t locCharge=d_AllCharges)
DSourceCombosByUse_Small Get_FurtherDecayCombos(void) const
vector< pair< Particle_t, unsigned char > > dNumParticles
bool operator()(DSourceComboUse lhs, const pair< DSourceComboUse, vector< const DSourceCombo * >> &rhs) const
bool operator()(DSourceComboUse lhs, const pair< DSourceComboUse, unsigned char > &rhs) const
bool operator<(const DSourceComboInfo &rhs) const
void Print_SourceCombo(const DSourceCombo *locCombo, unsigned char locNumTabs=0)