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;
430 const EventContext& ctx = Gaudi::Hive::currentContext();
432 if (!xTruthEventContainer.
isValid()) {
437 std::set<const xAOD::TruthParticle*> usedHadron;
438 for (
const auto* truthevent : *xTruthEventContainer ) {
440 for(
unsigned int i = 0; i < truthevent->nTruthParticles(); i++){
447 bool isbquark =
false;
448 bool iscquark =
false;
449 bool isHFhadron =
false;
451 int pdgid = part->absPdgId();
476 partonsOrigin[ part ] =
b_FSR;
479 partonsOrigin[ part ] =
b_FSR;
482 partonsOrigin[ part ] =
b_FSR;
485 partonsOrigin[ part ] =
b_MPI;
488 partonsOrigin[ part ] =
b_MPI;
491 partonsOrigin[ part ] =
b_MPI;
504 partonsOrigin[ part ] =
c_FSR;
507 partonsOrigin[ part ] =
c_FSR;
510 partonsOrigin[ part ] =
c_FSR;
513 partonsOrigin[ part ] =
c_MPI;
516 partonsOrigin[ part ] =
c_MPI;
519 partonsOrigin[ part ] =
c_MPI;
526 if(usedHadron.insert(part).second) {
541 if (!checked) checked = std::make_shared<std::set<const xAOD::TruthParticle*>>();
542 checked ->insert(part);
544 for(
unsigned int i=0; i<part->nParents(); ++i){
546 if(!parent)
continue;
547 if(checked->count(parent))
continue;
548 checked->insert(parent);
564 usedHadron.insert(ihad);
567 int parent_flav,child_flav;
572 for(
unsigned int j=0; j<ihad->
nChildren(); ++j){
582 if(child_flav!=4 && child_flav!=5)
continue;
584 if(child_flav!=parent_flav)
continue;
590 if(isFinal && !decayed){
592 for(
unsigned int j=0; j<ihad->
nChildren(); ++j){
619 if(!part || !part->nParents())
return false;
621 for(
unsigned int i=0; i<part->nParents(); ++i){
624 if(!parent)
continue;
644 if(!part || !part->nParents())
return false;
646 for(
unsigned int i=0; i<part->nParents(); ++i){
649 if(!parent)
continue;
660 if(!part->nParents())
return false;
661 for(
unsigned int i=0; i<part->nParents(); ++i){
663 if(!parent)
continue;
675 if(!part->nParents())
return false;
676 for(
unsigned int i=0; i<part->nParents(); ++i){
678 if(!parent)
continue;
682 if(part->pdgId()==-(parent->pdgId())/6){
694 if(!part->nParents())
return false;
695 for(
unsigned int i=0; i<part->nParents(); ++i){
697 if(!parent)
continue;
706 if(!part->nParents())
return false;
707 for(
unsigned int i=0; i<part->nParents(); ++i){
709 if(!parent)
continue;
732 if(!part->nParents())
return false;
734 for(
unsigned int i=0; i<part->nParents(); ++i){
739 if(!parent)
continue;
753 if(!part->nParents())
return false;
755 for(
unsigned int i=0; i<part->nParents(); ++i){
758 if(!parent)
continue;
783 if(!part->nParents())
return false;
784 for(
unsigned int i=0; i<part->nParents(); ++i){
786 if(!parent)
continue;
798 if(!part->hasProdVtx())
return false;
812 if(!part->nParents())
return part;
813 if (!checked) checked = std::make_shared<std::set<const xAOD::TruthParticle*>>();
815 for(
unsigned int i=0; i<part->nParents(); ++i){
818 if(!parent)
continue;
819 if(checked->count(parent))
continue;
820 checked->insert(parent);
826 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.
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
std::map< const xAOD::TruthParticle *, HF_id > GetOriginMap() 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
bool isDirectlyFromWTop(const xAOD::TruthParticle *part) const
void buildPartonsHadronsMaps(std::map< const xAOD::TruthParticle *, int > &mainHadronMap, std::map< const xAOD::TruthParticle *, HF_id > &partonsOrigin) 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.