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};
42 static const std::vector<Sample> samples = {
105 {504330, 504332,
GEN_id::Pythia8}, {504334, 504336,
GEN_id::Pythia8}, {504338,
GEN_id::Pythia8}, {504342, 504344,
GEN_id::Pythia8}, {504346,
GEN_id::Pythia8},
330 for (
const auto& s : samples) {
333 return StatusCode::SUCCESS;
350 return StatusCode::SUCCESS;
362 std::map<const xAOD::TruthParticle*, int> mainHadronMap;
363 std::map<const xAOD::TruthParticle*, HF_id> partonsOrigin;
364 std::map<const xAOD::TruthParticle*, const xAOD::TruthParticle*> hadronsPartons;
365 std::map<const xAOD::TruthParticle*, HF_id> hadronsOrigin;
369 std::vector<const xAOD::TruthParticle*> matched_partons;
370 std::vector<const xAOD::TruthParticle*> matched_hadrons;
372 while (matched_partons.size()<partonsOrigin.size() && matched_hadrons.size()<mainHadronMap.size()){
379 for(std::map<const xAOD::TruthParticle*, HF_id>::iterator itr = partonsOrigin.begin(); itr!=partonsOrigin.end(); ++itr){
381 if(std::find(matched_partons.begin(), matched_partons.end(), (*itr).first) != matched_partons.end())
continue;
384 if ((*itr).first->pt()>0.)
385 v.SetPtEtaPhi((*itr).first->pt(),(*itr).first->eta(),(*itr).first->phi());
387 v.SetXYZ(0.,0.,(*itr).first->pz());
389 for(std::map<const xAOD::TruthParticle*, int>::iterator it = mainHadronMap.begin(); it!=mainHadronMap.end(); ++it){
391 if(std::find(matched_hadrons.begin(), matched_hadrons.end(), (*it).first) != matched_hadrons.end())
continue;
393 if((*it).second != (*itr).first->absPdgId())
continue;
395 vtmp.SetPtEtaPhi((*it).first->pt(),(*it).first->eta(),(*it).first->phi());
398 if(vtmp.DeltaR(v) < dR){
401 parton = (*itr).first;
406 matched_partons.push_back(parton);
407 matched_hadrons.push_back(
hadron);
408 hadronsPartons[
hadron ] = parton;
412 for(std::map<const xAOD::TruthParticle*, int>::iterator it = mainHadronMap.begin(); it!=mainHadronMap.end(); ++it){
418 if(hadronsPartons.find(
hadron)!=hadronsPartons.end()){
419 hadronsOrigin[
hadron] = partonsOrigin[ hadronsPartons[
hadron] ];
424 return hadronsOrigin;
431 if (!xTruthEventContainer.
isValid()) {
436 std::set<const xAOD::TruthParticle*> usedHadron;
437 for (
const auto* truthevent : *xTruthEventContainer ) {
439 for(
unsigned int i = 0; i < truthevent->nTruthParticles(); i++){
446 bool isbquark =
false;
447 bool iscquark =
false;
448 bool isHFhadron =
false;
450 int pdgid = part->absPdgId();
475 partonsOrigin[ part ] =
b_FSR;
478 partonsOrigin[ part ] =
b_FSR;
481 partonsOrigin[ part ] =
b_FSR;
484 partonsOrigin[ part ] =
b_MPI;
487 partonsOrigin[ part ] =
b_MPI;
490 partonsOrigin[ part ] =
b_MPI;
503 partonsOrigin[ part ] =
c_FSR;
506 partonsOrigin[ part ] =
c_FSR;
509 partonsOrigin[ part ] =
c_FSR;
512 partonsOrigin[ part ] =
c_MPI;
515 partonsOrigin[ part ] =
c_MPI;
518 partonsOrigin[ part ] =
c_MPI;
525 if(usedHadron.insert(part).second) {
540 if (!checked) checked = std::make_shared<std::set<const xAOD::TruthParticle*>>();
541 checked ->insert(part);
543 for(
unsigned int i=0; i<part->nParents(); ++i){
545 if(!parent)
continue;
546 if(checked->count(parent))
continue;
547 checked->insert(parent);
563 usedHadron.insert(ihad);
566 int parent_flav,child_flav;
571 for(
unsigned int j=0; j<ihad->
nChildren(); ++j){
581 if(child_flav!=4 && child_flav!=5)
continue;
583 if(child_flav!=parent_flav)
continue;
589 if(isFinal && !decayed){
591 for(
unsigned int j=0; j<ihad->
nChildren(); ++j){
618 if(!part || !part->nParents())
return false;
620 for(
unsigned int i=0; i<part->nParents(); ++i){
623 if(!parent)
continue;
643 if(!part || !part->nParents())
return false;
645 for(
unsigned int i=0; i<part->nParents(); ++i){
648 if(!parent)
continue;
659 if(!part->nParents())
return false;
660 for(
unsigned int i=0; i<part->nParents(); ++i){
662 if(!parent)
continue;
674 if(!part->nParents())
return false;
675 for(
unsigned int i=0; i<part->nParents(); ++i){
677 if(!parent)
continue;
681 if(part->pdgId()==-(parent->pdgId())/6){
693 if(!part->nParents())
return false;
694 for(
unsigned int i=0; i<part->nParents(); ++i){
696 if(!parent)
continue;
705 if(!part->nParents())
return false;
706 for(
unsigned int i=0; i<part->nParents(); ++i){
708 if(!parent)
continue;
731 if(!part->nParents())
return false;
733 for(
unsigned int i=0; i<part->nParents(); ++i){
738 if(!parent)
continue;
752 if(!part->nParents())
return false;
754 for(
unsigned int i=0; i<part->nParents(); ++i){
757 if(!parent)
continue;
782 if(!part->nParents())
return false;
783 for(
unsigned int i=0; i<part->nParents(); ++i){
785 if(!parent)
continue;
797 if(!part->hasProdVtx())
return false;
811 if(!part->nParents())
return part;
812 if (!checked) checked = std::make_shared<std::set<const xAOD::TruthParticle*>>();
814 for(
unsigned int i=0; i<part->nParents(); ++i){
817 if(!parent)
continue;
818 if(checked->count(parent))
continue;
819 checked->insert(parent);
825 if( part->pdgId() == parent->pdgId() ){
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(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
bool isDirectlyFSR(const xAOD::TruthParticle *part) const
SG::ReadHandleKey< xAOD::TruthEventContainer > m_mcName
bool isDirectlyFSRPythia6(const xAOD::TruthParticle *part) const
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 (or barcode) was created during the simulation (TODO update to be s...
bool isConditionC(const T &p)
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.