21 #include "fastjet/PseudoJet.hh"
22 #include "fastjet/ClusterSequence.hh"
54 ATH_MSG_ERROR(
"Truth taus must be dressed separately from other truth particles");
55 return StatusCode::FAILURE;
59 return StatusCode::SUCCESS;
69 if (!truthParticles.
isValid()) {
70 ATH_MSG_ERROR(
"Couldn't retrieve TruthParticle collection with name " << m_particlesKey);
71 return StatusCode::FAILURE;
75 if (!dressTruthParticles.
isValid()) {
76 ATH_MSG_ERROR(
"Couldn't retrieve TruthParticle collection with name " << m_dressParticlesKey);
77 return StatusCode::FAILURE;
94 if (m_decoratePhotons){
95 for (
const auto *
particle : *truthParticles){
109 std::vector<const xAOD::TruthParticle*> listOfParticlesToDress;
110 std::vector<xAOD::TruthParticle::FourMom_t> listOfDressedP4;
111 std::vector<xAOD::TruthParticle::FourMom_t> listOfBareP4;
113 if (m_listOfPIDs.size()==1 && std::abs(m_listOfPIDs[0])==MC::TAU) {
115 for (
auto *pItr : *dressTruthParticles) {
116 if (!pItr->isTau()) {
118 return StatusCode::FAILURE;
121 ATH_MSG_ERROR(
"Visible momentum not available for truth taus, cannot perform dressing!");
122 return StatusCode::FAILURE;
125 listOfParticlesToDress.push_back(pItr);
129 bare_part.SetPtEtaPhiM(pt_visAcc(*pItr), eta_visAcc(*pItr), phi_visAcc(*pItr), mvisAcc(*pItr));
130 listOfDressedP4.push_back(bare_part);
134 listOfBareP4 = listOfDressedP4;
143 for (
const auto*
part : listOfParticlesToDress) {
144 listOfDressedP4.push_back(
part->p4());
148 std::vector<int> dressedParticlesNPhot(listOfParticlesToDress.size(), 0);
151 std::vector<const xAOD::TruthParticle*> photonsFSRList;
152 std::vector<int> photonPID{22};
154 photonPID, m_usePhotonsFromHadrons);
156 ATH_MSG_WARNING(
"Cannot construct the list of final state particles "<<m_truthClassKey.fullKey());
162 for (
const auto* phot : photonsFSRList) {
163 double dRmin = m_coneSize;
166 for (
size_t i = 0;
i < listOfParticlesToDress.size(); ++
i) {
167 if (!m_useLeptonsFromHadrons) {
168 if (!acc_origin.isAvailable(*listOfParticlesToDress[
i])) {
169 ATH_MSG_WARNING(
"MCTruthClassifier "<<m_truthClassKey.fullKey() <<
" not available, cannot apply notFromHadron veto!");
171 unsigned int result = acc_origin(*listOfParticlesToDress[
i]);
176 if (listOfParticlesToDress[
i]->
isTau()) {
177 bare_part = listOfBareP4[
i];
180 bare_part = listOfParticlesToDress[
i]->p4();
183 double dR = bare_part.DeltaR(phot->p4());
191 listOfDressedP4[
idx] += phot->p4();
192 dressedParticlesNPhot[
idx]++;
193 if (m_decoratePhotons){
200 for (
size_t i = 0;
i < listOfParticlesToDress.size(); ++
i) {
205 decorator_pt_vis(*
part) = dressedVec.Pt();
206 decorator_eta_vis(*
part) = dressedVec.Eta();
207 decorator_phi_vis(*
part) = dressedVec.Phi();
208 decorator_m_vis(*
part) = dressedVec.M();
211 decorator_e(*
part) = dressedVec.E();
212 decorator_pt(*
part) = dressedVec.Pt();
213 decorator_eta(*
part) = dressedVec.Eta();
214 decorator_phi(*
part) = dressedVec.Phi();
216 decorator_nphoton(*
part) = dressedParticlesNPhot[
i];
222 std::vector<fastjet::PseudoJet> sorted_jets;
223 std::vector<fastjet::PseudoJet> fj_particles;
224 for (
const auto*
part : listOfParticlesToDress) {
227 fj_particles.emplace_back(tauvis.Px(), tauvis.Py(), tauvis.Pz(), tauvis.E());
235 for (
const auto*
part : photonsFSRList) {
242 const fastjet::JetDefinition jet_def(
alg, m_coneSize);
244 sorted_jets = sorted_by_pt(cseq.inclusive_jets(0));
246 std::vector<int> photon_uniqueIDs(50);
247 photon_uniqueIDs.clear();
248 for (
const auto*
part : listOfParticlesToDress) {
251 auto pjItr=sorted_jets.begin();
252 while(!
found && pjItr!=sorted_jets.end()) {
253 std::vector<fastjet::PseudoJet> constituents = pjItr->constituents();
254 for(
const auto& constit : constituents) {
261 decorator_pt_vis(*
part) = pjItr->pt();
262 decorator_eta_vis(*
part) = pjItr->pseudorapidity();
263 decorator_phi_vis(*
part) = pjItr->phi_std();
264 decorator_m_vis(*
part) = pjItr->m();
267 decorator_e(*
part) = pjItr->e();
268 decorator_pt(*
part) = pjItr->pt();
269 decorator_eta(*
part) = pjItr->pseudorapidity();
270 decorator_phi(*
part) = pjItr->phi_std();
277 for(
const auto& constit : constituents) {
278 photon_uniqueIDs.push_back(constit.user_index());
285 decorator_pt_vis(*
part) = 0.;
286 decorator_eta_vis(*
part) = 0.;
287 decorator_phi_vis(*
part) = 0.;
288 decorator_m_vis(*
part) = 0.;
291 decorator_e(*
part) = 0;
292 decorator_pt(*
part) = 0;
293 decorator_eta(*
part) = 0;
294 decorator_phi(*
part) = 0;
300 if (m_decoratePhotons){
302 for (
const auto* phot : photonsFSRList ) {
311 return StatusCode::SUCCESS;