14 Sample(
int low,
int high, GEN_id gen) :
15 low(low), high(high), gen(gen) {}
18 Sample(
int id, GEN_id gen) :
19 Sample(
id,
id, gen) {}
23 GEN_id gen{GEN_id::Pythia6};
44 static const std::vector<Sample> samples = {
108 {504330, 504332,
GEN_id::Pythia8}, {504334, 504336,
GEN_id::Pythia8}, {504338,
GEN_id::Pythia8}, {504342, 504344,
GEN_id::Pythia8}, {504346,
GEN_id::Pythia8},
337 for (
const auto& s : samples) {
340 return StatusCode::SUCCESS;
357 return StatusCode::SUCCESS;
369 std::map<const xAOD::TruthParticle*, int> mainHadronMap;
370 std::map<const xAOD::TruthParticle*, HF_id> partonsOrigin;
371 std::map<const xAOD::TruthParticle*, const xAOD::TruthParticle*> hadronsPartons;
372 std::map<const xAOD::TruthParticle*, HF_id> hadronsOrigin;
376 std::vector<const xAOD::TruthParticle*> matched_partons;
377 std::vector<const xAOD::TruthParticle*> matched_hadrons;
379 while (matched_partons.size()<partonsOrigin.size() && matched_hadrons.size()<mainHadronMap.size()){
386 for(std::map<const xAOD::TruthParticle*, HF_id>::iterator itr = partonsOrigin.begin(); itr!=partonsOrigin.end(); ++itr){
388 if(std::find(matched_partons.begin(), matched_partons.end(), (*itr).first) != matched_partons.end())
continue;
391 if ((*itr).first->pt()>0.)
392 v.SetPtEtaPhi((*itr).first->pt(),(*itr).first->eta(),(*itr).first->phi());
394 v.SetXYZ(0.,0.,(*itr).first->pz());
396 for(std::map<const xAOD::TruthParticle*, int>::iterator it = mainHadronMap.begin(); it!=mainHadronMap.end(); ++it){
398 if(std::find(matched_hadrons.begin(), matched_hadrons.end(), (*it).first) != matched_hadrons.end())
continue;
400 if((*it).second != (*itr).first->absPdgId())
continue;
402 vtmp.SetPtEtaPhi((*it).first->pt(),(*it).first->eta(),(*it).first->phi());
405 if(vtmp.DeltaR(v) < dR){
408 parton = (*itr).first;
413 matched_partons.push_back(parton);
414 matched_hadrons.push_back(
hadron);
415 hadronsPartons[
hadron ] = parton;
419 for(std::map<const xAOD::TruthParticle*, int>::iterator it = mainHadronMap.begin(); it!=mainHadronMap.end(); ++it){
425 if(hadronsPartons.find(
hadron)!=hadronsPartons.end()){
426 hadronsOrigin[
hadron] = partonsOrigin[ hadronsPartons[
hadron] ];
431 return hadronsOrigin;
438 if (!xTruthEventContainer.
isValid()) {
443 std::set<const xAOD::TruthParticle*> usedHadron;
444 for (
const auto* truthevent : *xTruthEventContainer ) {
446 for(
unsigned int i = 0; i < truthevent->nTruthParticles(); i++){
453 bool isbquark =
false;
454 bool iscquark =
false;
455 bool isHFhadron =
false;
457 int pdgid = part->absPdgId();
482 partonsOrigin[ part ] =
b_FSR;
485 partonsOrigin[ part ] =
b_FSR;
488 partonsOrigin[ part ] =
b_FSR;
491 partonsOrigin[ part ] =
b_MPI;
494 partonsOrigin[ part ] =
b_MPI;
497 partonsOrigin[ part ] =
b_MPI;
510 partonsOrigin[ part ] =
c_FSR;
513 partonsOrigin[ part ] =
c_FSR;
516 partonsOrigin[ part ] =
c_FSR;
519 partonsOrigin[ part ] =
c_MPI;
522 partonsOrigin[ part ] =
c_MPI;
525 partonsOrigin[ part ] =
c_MPI;
532 if(usedHadron.insert(part).second) {
547 if (!checked) checked = std::make_shared<std::set<const xAOD::TruthParticle*>>();
548 checked ->insert(part);
550 for(
unsigned int i=0; i<part->nParents(); ++i){
552 if(!parent)
continue;
553 if(checked->count(parent))
continue;
554 checked->insert(parent);
570 usedHadron.insert(ihad);
573 int parent_flav,child_flav;
578 for(
unsigned int j=0; j<ihad->
nChildren(); ++j){
588 if(child_flav!=4 && child_flav!=5)
continue;
590 if(child_flav!=parent_flav)
continue;
596 if(isFinal && !decayed){
598 for(
unsigned int j=0; j<ihad->
nChildren(); ++j){
625 if(!part || !part->nParents())
return false;
627 for(
unsigned int i=0; i<part->nParents(); ++i){
630 if(!parent)
continue;
650 if(!part || !part->nParents())
return false;
652 for(
unsigned int i=0; i<part->nParents(); ++i){
655 if(!parent)
continue;
666 if(!part->nParents())
return false;
667 for(
unsigned int i=0; i<part->nParents(); ++i){
669 if(!parent)
continue;
681 if(!part->nParents())
return false;
682 for(
unsigned int i=0; i<part->nParents(); ++i){
684 if(!parent)
continue;
688 if(part->pdgId()==-(parent->pdgId())/6){
700 if(!part->nParents())
return false;
701 for(
unsigned int i=0; i<part->nParents(); ++i){
703 if(!parent)
continue;
712 if(!part->nParents())
return false;
713 for(
unsigned int i=0; i<part->nParents(); ++i){
715 if(!parent)
continue;
738 if(!part->nParents())
return false;
740 for(
unsigned int i=0; i<part->nParents(); ++i){
745 if(!parent)
continue;
759 if(!part->nParents())
return false;
761 for(
unsigned int i=0; i<part->nParents(); ++i){
764 if(!parent)
continue;
789 if(!part->nParents())
return false;
790 for(
unsigned int i=0; i<part->nParents(); ++i){
792 if(!parent)
continue;
804 if(!part->hasProdVtx())
return false;
818 if(!part->nParents())
return part;
819 if (!checked) checked = std::make_shared<std::set<const xAOD::TruthParticle*>>();
821 for(
unsigned int i=0; i<part->nParents(); ++i){
824 if(!parent)
continue;
825 if(checked->count(parent))
continue;
826 checked->insert(parent);
832 if( part->pdgId() == parent->pdgId() ){
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x,...)
#define ATH_MSG_INFO(x,...)
ATLAS-specific HepMC functions.
Handle class for reading from StoreGate.
void buildPartonsHadronsMaps(const EventContext &ctx, std::map< const xAOD::TruthParticle *, int > &mainHadronMap, std::map< const xAOD::TruthParticle *, HF_id > &partonsOrigin) const
static bool isDirectlyMPIPythia6(const xAOD::TruthParticle *part)
Gaudi::Property< int > m_DSID
bool isDirectlyFromQuarkTop(const xAOD::TruthParticle *part) const
static bool isDirectlyFromTop(const xAOD::TruthParticle *part)
virtual StatusCode initialize() override
HadronOriginClassifier(const std::string &t, const std::string &n, const IInterface *p)
bool isFromGluonQuark(const xAOD::TruthParticle *part) const
bool isCHadronFromB(const xAOD::TruthParticle *part, std::shared_ptr< std::set< const xAOD::TruthParticle * > > checked=nullptr) const
bool isFromQuarkTop(const xAOD::TruthParticle *part) const
const xAOD::TruthParticle * findInitial(const xAOD::TruthParticle *part, std::shared_ptr< std::set< const xAOD::TruthParticle * > > checked=nullptr) const
bool isDirectlyMPIPythia8(const xAOD::TruthParticle *part) const
virtual ~HadronOriginClassifier()
bool isFromTop(const xAOD::TruthParticle *part) const
bool isDirectlyFSRPythia8(const xAOD::TruthParticle *part) const
static bool isDirectlyFromGluonQuark(const xAOD::TruthParticle *part)
bool isFromQuarkTopPythia8(const xAOD::TruthParticle *part) const
std::map< const xAOD::TruthParticle *, HF_id > GetOriginMap(const EventContext &ctx) const
bool isDirectlyFromWTop(const xAOD::TruthParticle *part) const
SG::ReadHandleKey< xAOD::TruthParticleContainer > m_truthParticlesKey
bool isDirectlyFSR(const xAOD::TruthParticle *part) const
SG::ReadHandleKey< xAOD::TruthEventContainer > m_mcName
bool isDirectlyFSRPythia6(const xAOD::TruthParticle *part) const
SG::ReadHandleKey< xAOD::TruthVertexContainer > m_truthVerticesKey
bool isFromWTop(const xAOD::TruthParticle *part) const
void fillHadronMap(std::set< const xAOD::TruthParticle * > &usedHadron, std::map< const xAOD::TruthParticle *, int > &mainHadronMap, const xAOD::TruthParticle *mainhad, const xAOD::TruthParticle *ihad, bool decayed=false) const
bool isDirectlyFromQuarkTopPythia8(const xAOD::TruthParticle *part) const
static bool isDirectlyMPISherpa(const xAOD::TruthParticle *part)
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const TruthParticle_v1 * child(size_t i) const
Retrieve the i-th mother (TruthParticle) of this TruthParticle.
size_t nChildren() const
Number of children of this particle.
bool is_simulation_particle(const T &p)
Method to establish if a particle was created during the simulation (based on the status value).
bool isConditionC(const T &p)
Match positive statuses 31-39, the Pythia range for subsequent-subprocess particles: 31: incoming par...
bool isCharmHadron(const T &p)
bool isBottom(const T &p)
bool isPhoton(const T &p)
bool isBottomHadron(const T &p)
int leadingQuark(const T &p)
bool isPhysical(const T &p)
Identify if the particle is physical, i.e. is stable or decayed.
TruthVertex_v1 TruthVertex
Typedef to implementation.
TruthParticle_v1 TruthParticle
Typedef to implementation.