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},
161 for (
const auto&
s : samples) {
164 return StatusCode::SUCCESS;
181 return StatusCode::SUCCESS;
193 std::map<const xAOD::TruthParticle*, int> mainHadronMap;
194 std::map<const xAOD::TruthParticle*, HF_id> partonsOrigin;
195 std::map<const xAOD::TruthParticle*, const xAOD::TruthParticle*> hadronsPartons;
196 std::map<const xAOD::TruthParticle*, HF_id> hadronsOrigin;
200 std::vector<const xAOD::TruthParticle*> matched_partons;
201 std::vector<const xAOD::TruthParticle*> matched_hadrons;
203 while (matched_partons.size()<partonsOrigin.size() && matched_hadrons.size()<mainHadronMap.size()){
212 if(
std::find(matched_partons.begin(), matched_partons.end(), (*itr).first) != matched_partons.end())
continue;
215 if ((*itr).first->pt()>0.)
216 v.SetPtEtaPhi((*itr).first->pt(),(*itr).first->eta(),(*itr).first->phi());
218 v.SetXYZ(0.,0.,(*itr).first->pz());
222 if(
std::find(matched_hadrons.begin(), matched_hadrons.end(), (*it).first) != matched_hadrons.end())
continue;
224 if((*it).second != (*itr).first->absPdgId())
continue;
226 vtmp.SetPtEtaPhi((*it).first->pt(),(*it).first->eta(),(*it).first->phi());
229 if(vtmp.DeltaR(
v) < dR){
232 parton = (*itr).first;
237 matched_partons.push_back(parton);
238 matched_hadrons.push_back(
hadron);
239 hadronsPartons[
hadron ] = parton;
249 if(hadronsPartons.find(
hadron)!=hadronsPartons.end()){
250 hadronsOrigin[
hadron] = partonsOrigin[ hadronsPartons[
hadron] ];
255 return hadronsOrigin;
261 const EventContext& ctx = Gaudi::Hive::currentContext();
263 if (!xTruthEventContainer.
isValid()) {
268 std::set<const xAOD::TruthParticle*> usedHadron;
269 for (
const auto* truthevent : *xTruthEventContainer ) {
271 for(
unsigned int i = 0;
i < truthevent->nTruthParticles();
i++){
278 bool isbquark =
false;
279 bool iscquark =
false;
280 bool isHFhadron =
false;
282 int pdgid =
part->absPdgId();
357 if(usedHadron.insert(
part).second) {
372 if (!checked) checked = std::make_shared<std::set<const xAOD::TruthParticle*>>();
373 checked ->insert(
part);
375 for(
unsigned int i=0;
i<
part->nParents(); ++
i){
378 if(checked->count(
parent))
continue;
395 usedHadron.insert(ihad);
398 int parent_flav,child_flav;
403 for(
unsigned int j=0; j<ihad->
nChildren(); ++j){
413 if(child_flav!=4 && child_flav!=5)
continue;
415 if(child_flav!=parent_flav)
continue;
421 if(isFinal && !decayed){
423 for(
unsigned int j=0; j<ihad->
nChildren(); ++j){
450 if(!
part || !
part->nParents())
return false;
452 for(
unsigned int i=0;
i<
part->nParents(); ++
i){
475 if(!
part || !
part->nParents())
return false;
477 for(
unsigned int i=0;
i<
part->nParents(); ++
i){
491 if(!
part->nParents())
return false;
492 for(
unsigned int i=0;
i<
part->nParents(); ++
i){
506 if(!
part->nParents())
return false;
507 for(
unsigned int i=0;
i<
part->nParents(); ++
i){
525 if(!
part->nParents())
return false;
526 for(
unsigned int i=0;
i<
part->nParents(); ++
i){
537 if(!
part->nParents())
return false;
538 for(
unsigned int i=0;
i<
part->nParents(); ++
i){
541 if(
parent->absPdgId()<MC::TQUARK ) {
563 if(!
part->nParents())
return false;
565 for(
unsigned int i=0;
i<
part->nParents(); ++
i){
584 if(!
part->nParents())
return false;
586 for(
unsigned int i=0;
i<
part->nParents(); ++
i){
591 if(
parent->absPdgId()<MC::TQUARK ) {
614 if(!
part->nParents())
return false;
615 for(
unsigned int i=0;
i<
part->nParents(); ++
i){
629 if(!
part->hasProdVtx())
return false;
644 if (!checked) checked = std::make_shared<std::set<const xAOD::TruthParticle*>>();
646 for(
unsigned int i=0;
i<
part->nParents(); ++
i){
650 if(checked->count(
parent))
continue;