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;