14 Sample(
int low,
int high, GEN_id
gen) :
15 low(low), high(high),
gen(
gen) {}
18 Sample(
int id, GEN_id
gen) :
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()){
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());
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;
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();
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){
547 if(checked->count(
parent))
continue;
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){
644 if(!
part || !
part->nParents())
return false;
646 for(
unsigned int i=0;
i<
part->nParents(); ++
i){
660 if(!
part->nParents())
return false;
661 for(
unsigned int i=0;
i<
part->nParents(); ++
i){
675 if(!
part->nParents())
return false;
676 for(
unsigned int i=0;
i<
part->nParents(); ++
i){
694 if(!
part->nParents())
return false;
695 for(
unsigned int i=0;
i<
part->nParents(); ++
i){
706 if(!
part->nParents())
return false;
707 for(
unsigned int i=0;
i<
part->nParents(); ++
i){
710 if(
parent->absPdgId()<MC::TQUARK ) {
732 if(!
part->nParents())
return false;
734 for(
unsigned int i=0;
i<
part->nParents(); ++
i){
753 if(!
part->nParents())
return false;
755 for(
unsigned int i=0;
i<
part->nParents(); ++
i){
760 if(
parent->absPdgId()<MC::TQUARK ) {
783 if(!
part->nParents())
return false;
784 for(
unsigned int i=0;
i<
part->nParents(); ++
i){
798 if(!
part->hasProdVtx())
return false;
813 if (!checked) checked = std::make_shared<std::set<const xAOD::TruthParticle*>>();
815 for(
unsigned int i=0;
i<
part->nParents(); ++
i){
819 if(checked->count(
parent))
continue;