21 #include "fastjet/PseudoJet.hh" 
   22 #include "fastjet/ClusterSequence.hh" 
   49     ATH_CHECK(m_dressParticlesKey.initialize());
 
   51     ATH_CHECK(m_decorator_ptKey.initialize());
 
   52     ATH_CHECK(m_decorator_etaKey.initialize());
 
   53     ATH_CHECK(m_decorator_phiKey.initialize());
 
   54     ATH_CHECK(m_decorator_pt_visKey.initialize());
 
   55     ATH_CHECK(m_decorator_eta_visKey.initialize());
 
   56     ATH_CHECK(m_decorator_phi_visKey.initialize());
 
   57     ATH_CHECK(m_decorator_m_visKey.initialize());
 
   58     ATH_CHECK(m_decorator_nphotonKey.initialize());
 
   63     if (m_listOfPIDs.size() > 1) {
 
   64       if (
std::find(m_listOfPIDs.begin(), m_listOfPIDs.end(), MC::TAU) != m_listOfPIDs.end()) {
 
   65         ATH_MSG_ERROR(
"Truth taus must be dressed separately from other truth particles");
 
   66         return StatusCode::FAILURE;
 
   70     return StatusCode::SUCCESS;
 
   80     if (!truthParticles.
isValid()) {
 
   81         ATH_MSG_ERROR(
"Couldn't retrieve TruthParticle collection with name " << m_particlesKey);
 
   82         return StatusCode::FAILURE;
 
   86     if (!dressTruthParticles.
isValid()) {
 
   87         ATH_MSG_ERROR(
"Couldn't retrieve TruthParticle collection with name " << m_dressParticlesKey);
 
   88         return StatusCode::FAILURE;
 
  105     if (m_decoratePhotons){
 
  106       for (
const auto * 
particle : *truthParticles){
 
  120     std::vector<const xAOD::TruthParticle*> listOfParticlesToDress;
 
  121     std::vector<xAOD::TruthParticle::FourMom_t> listOfDressedP4;
 
  122     std::vector<xAOD::TruthParticle::FourMom_t> listOfBareP4;
 
  124     if (m_listOfPIDs.size()==1 && std::abs(m_listOfPIDs[0])==MC::TAU) {
 
  126       for (
auto *pItr : *dressTruthParticles) {
 
  127         if (!pItr->isTau()) {
 
  129           return StatusCode::FAILURE;
 
  132           ATH_MSG_ERROR(
"Visible momentum not available for truth taus, cannot perform dressing!");
 
  133           return StatusCode::FAILURE;
 
  136         listOfParticlesToDress.push_back(pItr);
 
  140         bare_part.SetPtEtaPhiM(pt_visAcc(*pItr), eta_visAcc(*pItr), phi_visAcc(*pItr), mvisAcc(*pItr));
 
  141         listOfDressedP4.push_back(bare_part);
 
  145         listOfBareP4 = listOfDressedP4;
 
  154       for (
const auto* 
part : listOfParticlesToDress) {
 
  155         listOfDressedP4.push_back(
part->p4());
 
  159     std::vector<int> dressedParticlesNPhot(listOfParticlesToDress.size(), 0);
 
  162     std::vector<const xAOD::TruthParticle*>  photonsFSRList;
 
  163     std::vector<int> photonPID{22};
 
  165                                                                 photonPID, m_usePhotonsFromHadrons);
 
  167       ATH_MSG_WARNING(
"Cannot construct the list of final state particles "<<m_truthClassKey.fullKey());
 
  173       for (
const auto* phot : photonsFSRList) {
 
  174         double dRmin = m_coneSize;
 
  177         for (
size_t i = 0; 
i < listOfParticlesToDress.size(); ++
i) {
 
  178           if (!m_useLeptonsFromHadrons) {
 
  179             if (!acc_origin.isAvailable(*listOfParticlesToDress[
i])) {
 
  180               ATH_MSG_WARNING(
"MCTruthClassifier "<<m_truthClassKey.fullKey() <<
" not available, cannot apply notFromHadron veto!");
 
  182             unsigned int result = acc_origin(*listOfParticlesToDress[
i]);
 
  187           if (listOfParticlesToDress[
i]->
isTau()) {
 
  188             bare_part = listOfBareP4[
i];
 
  191             bare_part = listOfParticlesToDress[
i]->p4();
 
  194           double dR = bare_part.DeltaR(phot->p4());
 
  202           listOfDressedP4[
idx] += phot->p4();
 
  203           dressedParticlesNPhot[
idx]++;
 
  204           if (m_decoratePhotons){
 
  211       for (
size_t i = 0; 
i < listOfParticlesToDress.size(); ++
i) {
 
  216           decorator_pt_vis(*
part)      = dressedVec.Pt();
 
  217           decorator_eta_vis(*
part)     = dressedVec.Eta();
 
  218           decorator_phi_vis(*
part)     = dressedVec.Phi();
 
  219           decorator_m_vis(*
part)       = dressedVec.M();
 
  222           decorator_e(*
part)       = dressedVec.E();
 
  223           decorator_pt(*
part)      = dressedVec.Pt();
 
  224           decorator_eta(*
part)     = dressedVec.Eta();
 
  225           decorator_phi(*
part)     = dressedVec.Phi();
 
  227         decorator_nphoton(*
part) = dressedParticlesNPhot[
i];
 
  233       std::vector<fastjet::PseudoJet> sorted_jets;
 
  234       std::vector<fastjet::PseudoJet> fj_particles;
 
  235       for (
const auto* 
part : listOfParticlesToDress) {
 
  238           fj_particles.emplace_back(tauvis.Px(), tauvis.Py(), tauvis.Pz(), tauvis.E());
 
  246       for (
const auto* 
part : photonsFSRList) {
 
  253       const fastjet::JetDefinition jet_def(
alg, m_coneSize);
 
  255       sorted_jets = sorted_by_pt(cseq.inclusive_jets(0));
 
  257       std::vector<int> photon_uniqueIDs(50);
 
  258       photon_uniqueIDs.clear();
 
  259       for (
const auto* 
part : listOfParticlesToDress) {
 
  262         auto pjItr=sorted_jets.begin();
 
  263         while(!
found && pjItr!=sorted_jets.end()) {
 
  264           std::vector<fastjet::PseudoJet> constituents = pjItr->constituents();
 
  265           for(
const auto& constit : constituents) {
 
  272                 decorator_pt_vis(*
part)      = pjItr->pt();
 
  273                 decorator_eta_vis(*
part)     = pjItr->pseudorapidity();
 
  274                 decorator_phi_vis(*
part)     = pjItr->phi_std(); 
 
  275                 decorator_m_vis(*
part)       = pjItr->m();
 
  278                 decorator_e(*
part)       = pjItr->e();
 
  279                 decorator_pt(*
part)      = pjItr->pt();
 
  280                 decorator_eta(*
part)     = pjItr->pseudorapidity();
 
  281                 decorator_phi(*
part)     = pjItr->phi_std(); 
 
  288             for(
const auto& constit : constituents) {
 
  289               photon_uniqueIDs.push_back(constit.user_index());
 
  296             decorator_pt_vis(*
part)      = 0.;
 
  297             decorator_eta_vis(*
part)     = 0.;
 
  298             decorator_phi_vis(*
part)     = 0.;
 
  299             decorator_m_vis(*
part)       = 0.;
 
  302             decorator_e(*
part)       = 0;
 
  303             decorator_pt(*
part)      = 0;
 
  304             decorator_eta(*
part)     = 0;
 
  305             decorator_phi(*
part)     = 0;
 
  311       if (m_decoratePhotons){
 
  313         for (
const auto* phot : photonsFSRList ) {
 
  322     return StatusCode::SUCCESS;