11 m_mcName(
"TruthEvents"),
16 declareInterface<DerivationFramework::HadronOriginClassifier>(
this);
154 return StatusCode::SUCCESS;
169 std::map<const xAOD::TruthParticle*, int> mainHadronMap;
170 std::map<const xAOD::TruthParticle*, HF_id> partonsOrigin;
171 std::map<const xAOD::TruthParticle*, const xAOD::TruthParticle*> hadronsPartons;
172 std::map<const xAOD::TruthParticle*, HF_id> hadronsOrigin;
180 std::vector<const xAOD::TruthParticle*> matched_partons;
181 std::vector<const xAOD::TruthParticle*> matched_hadrons;
185 while (matched_partons.size()<partonsOrigin.size() && matched_hadrons.size()<mainHadronMap.size()){
202 if(
std::find(matched_partons.begin(), matched_partons.end(), (*itr).first) != matched_partons.end())
continue;
207 if ((*itr).first->pt()>0.)
208 v.SetPtEtaPhi((*itr).first->pt(),(*itr).first->eta(),(*itr).first->phi());
210 v.SetXYZ(0.,0.,(*itr).first->pz());
218 if(
std::find(matched_hadrons.begin(), matched_hadrons.end(), (*it).first) != matched_hadrons.end())
continue;
222 if((*it).second != abs((*itr).first->pdgId()) )
continue;
226 vtmp.SetPtEtaPhi((*it).first->pt(),(*it).first->eta(),(*it).first->phi());
231 if(vtmp.DeltaR(
v) < dR){
234 parton = (*itr).first;
243 matched_partons.push_back(parton);
244 matched_hadrons.push_back(
hadron);
246 hadronsPartons[
hadron ] = parton;
261 if(hadronsPartons.find(
hadron)!=hadronsPartons.end()){
262 hadronsOrigin[
hadron] = partonsOrigin[ hadronsPartons[
hadron] ];
268 return hadronsOrigin;
284 std::set<const xAOD::TruthParticle*> usedHadron;
286 for (
const auto* truthevent : *xTruthEventContainer ) {
290 for(
unsigned int i = 0;
i < truthevent->nTruthParticles();
i++){
302 bool isbquark =
false;
303 bool iscquark =
false;
304 bool isHFhadron =
false;
308 int pdgid = abs(
part->pdgId());
313 else if(pdgid == 4 ){
402 if(usedHadron.insert(
part).second) {
421 for(
unsigned int i=0;
i<
part->nParents(); ++
i){
425 if( 4 == mothertype || 5 == mothertype ){
439 for(
unsigned int i=0;
i<
part->nParents(); ++
i){
461 usedHadron.insert(ihad);
466 int parent_flav,child_flav;
475 for(
unsigned int j=0; j<ihad->
nChildren(); ++j){
487 if(child_flav!=4 && child_flav!=5)
continue;
489 if(child_flav!=parent_flav)
continue;
496 if(isFinal && !decayed){
500 for(
unsigned int j=0; j<ihad->
nChildren(); ++j){
515 double eta = fabs(
part->eta());
549 if(!
part || !
part->nParents())
return false;
553 for(
unsigned int i=0;
i<
part->nParents(); ++
i){
563 if( abs(
parent->pdgId() ) == 6 )
return true;
591 if(!
part || !
part->nParents())
return false;
595 for(
unsigned int i=0;
i<
part->nParents(); ++
i){
617 if(!
part->nParents())
return false;
619 for(
unsigned int i=0;
i<
part->nParents(); ++
i){
638 if(!
part->nParents())
return false;
640 for(
unsigned int i=0;
i<
part->nParents(); ++
i){
644 if(abs(
part->pdgId())==4){
660 if(!
part->nParents())
return false;
662 for(
unsigned int i=0;
i<
part->nParents(); ++
i){
680 if(!
part->nParents())
return false;
682 for(
unsigned int i=0;
i<
part->nParents(); ++
i){
685 if( abs(
parent->pdgId())<6 ) {
714 if(!
part->nParents())
return false;
718 for(
unsigned int i=0;
i<
part->nParents(); ++
i){
744 if(!
part->nParents())
return false;
748 for(
unsigned int i=0;
i<
part->nParents(); ++
i){
758 if( abs(
parent->pdgId())<6 ) {
798 if(!
part->nParents())
return false;
800 for(
unsigned int i=0;
i<
part->nParents(); ++
i){
824 if(!
part->hasProdVtx())
return false;
843 if(!
part->nParents())
return false;
848 init_part.insert(
part);
852 for(
unsigned int i=0;
i<
part->nParents(); ++
i){
859 if( init_part.find(
parent) != init_part.end() )
return true;
881 for(
unsigned int i=0;
i<
part->nParents(); ++
i){