ATLAS Offline Software
Loading...
Searching...
No Matches
JetConstituentModifierBase.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
3*/
4
5// Source file for the JetConstituentModifierBase.h
6// // Michael Nelson, CERN & University of Oxford
7
10#include "xAODPFlow/PFO.h"
13
15#ifndef XAOD_STANDALONE
16 declareInterface<IJetConstituentModifier>(this);
17#endif
18 declareProperty("InputType", m_inputType);
19 declareProperty("ApplyToChargedPFO", m_applyToChargedPFO);
20 declareProperty("ApplyToNeutralPFO", m_applyToNeutralPFO);
21}
22
24{
25 // Test that we are operating on the type of object that
26 // we will be writing out.
27 // By implication, any supporting containers should not
28 // be the ones passed to this method...
29 if(!cont->empty() && cont->front()->type() != m_inputType) {
30 ATH_MSG_ERROR("Object type mismatch! This tool expects " << m_inputType
31 << ", but received " << cont->front()->type());
32 return StatusCode::FAILURE;
33 }
34
36
37 return StatusCode::SUCCESS;
38}
39
40
42{
43 switch(m_inputType) {
44 // The main (only?) application is origin-correcting LC topoclusters
45 // By convention we leave the raw p4 unmodified
47 {
48 xAOD::CaloCluster* clus = static_cast<xAOD::CaloCluster*>(obj);
49 clus->setCalEta(eta);
50 clus->setCalPhi(phi);
51 }
52 break;
53 default:
54 // Should not get here, because type-checking should happen in process()
55 ATH_MSG_ERROR("No specialisation for object type " << m_inputType);
56 return StatusCode::FAILURE;
57 }
58 return StatusCode::SUCCESS;
59}
60
62 const SG::AuxElement::Accessor<float>* weightAcc) const
63{
64 switch(m_inputType) {
66 {
67 xAOD::CaloCluster* clus = static_cast<xAOD::CaloCluster*>(obj);
68 // Clusters get pt via the energy
69 // This currently leaves the mass unaltered.
70 if(weightAcc) (*weightAcc)(*clus) = clus->calE() > 0. ? e / clus->calE() : 0.;
71 clus->setCalE(e);
72 }
73 break;
75 {
76 xAOD::PFO* pfo = static_cast<xAOD::PFO*>(obj);
77 if( (m_applyToChargedPFO && pfo->isCharged()) ||
78 (m_applyToNeutralPFO && !pfo->isCharged()) ) {
79 if(weightAcc) (*weightAcc)(*pfo) = pfo->pt() > 0. ? pt / pfo->pt() : 0.;
80 // KTJ: Temporary fix
81 // Defeats the purpose, but we need to use this to reset the 4-vec cache
82 pfo->setP4(pt, pfo->eta(), pfo->phi());
83 }
84 }
85 break;
87 {
88 xAOD::FlowElement* pfo = static_cast<xAOD::FlowElement*>(obj);
89 if( (m_applyToChargedPFO && pfo->isCharged()) ||
90 (m_applyToNeutralPFO && !pfo->isCharged()) ) {
91 if(weightAcc) (*weightAcc)(*pfo) = pfo->pt() > 0. ? pt / pfo->pt() : 0.;
92 pfo->setP4(pt, pfo->eta(), pfo->phi(), 0.);
93 }
94 }
95 break;
97 {
98 xAOD::TrackCaloCluster* tcc = static_cast<xAOD::TrackCaloCluster*>(obj);
99 if( tcc->taste() != 0) {
100 if(weightAcc) (*weightAcc)(*tcc) = tcc->pt() > 0. ? pt / tcc->pt() : 0.;
101 tcc->setParameters(pt, tcc->eta(), tcc->phi(), tcc->m(), xAOD::TrackCaloCluster::Taste(tcc->taste()), tcc->trackParticleLink(), tcc->caloClusterLinks());
102 }
103 }
104 break;
105 default:
106 // Should not get here, because type-checking should happen in process()
107 ATH_MSG_ERROR("No specialisation for object type " << m_inputType);
108 return StatusCode::FAILURE;
109 }
110 return StatusCode::SUCCESS;
111}
112
114 const SG::AuxElement::Accessor<float>* weightAcc) const {
115 switch(m_inputType) {
117 {
118 xAOD::CaloCluster* clus = static_cast<xAOD::CaloCluster*>(obj);
119 // This currently leaves the mass unaltered
120 if(weightAcc) (*weightAcc)(*clus) = clus->calE() > 0. ? p4.e() / clus->calE() : 0.;
121 clus->setCalE(p4.e());
122 clus->setCalEta(p4.eta());
123 clus->setCalPhi(p4.phi());
124 }
125 break;
127 {
128 xAOD::PFO* pfo = static_cast<xAOD::PFO*>(obj);
129 // The PFO setter defaults to m=0
130 if( (m_applyToChargedPFO && pfo->isCharged()) ||
131 (m_applyToNeutralPFO && !pfo->isCharged()) ) {
132 if(weightAcc) (*weightAcc)(*pfo) = pfo->pt() > 0. ? p4.pt() / pfo->pt() : 0.;
133 pfo->setP4(p4.pt(),p4.eta(),p4.phi(),p4.mass());
134 }
135 }
136 break;
138 {
139 xAOD::FlowElement* pfo = static_cast<xAOD::FlowElement*>(obj);
140 if( (m_applyToChargedPFO && pfo->isCharged()) ||
141 (m_applyToNeutralPFO && !pfo->isCharged()) ) {
142 if(weightAcc) (*weightAcc)(*pfo) = pfo->pt() > 0. ? p4.pt() / pfo->pt() : 0.;
143 pfo->setP4(p4.pt(),p4.eta(),p4.phi(),p4.mass());
144 }
145 }
146 break;
148 {
149 xAOD::TrackCaloCluster* tcc = static_cast<xAOD::TrackCaloCluster*>(obj);
150 if( tcc->taste() != 0) {
151 if(weightAcc) (*weightAcc)(*tcc) = tcc->pt() > 0. ? p4.pt() / tcc->pt() : 0.;
152 tcc->setParameters(p4.pt(), p4.eta(), p4.phi(), p4.mass(), xAOD::TrackCaloCluster::Taste(tcc->taste()), tcc->trackParticleLink(), tcc->caloClusterLinks());
153 }
154 break;
155 }
156
157 default:
158 // Should not get here, because type-checking should happen in process()
159 ATH_MSG_ERROR("No specialisation for object type " << m_inputType);
160 return StatusCode::FAILURE;
161 }
162 return StatusCode::SUCCESS;
163}
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
const T * front() const
Access the first element in the collection as an rvalue.
bool empty() const noexcept
Returns true if the collection is empty.
JetConstituentModifierBase(const std::string &name)
StatusCode setEtaPhi(xAOD::IParticle *obj, float eta, float phi) const
StatusCode setP4(xAOD::IParticle *obj, const xAOD::JetFourMom_t &p4, const SG::AuxElement::Accessor< float > *weightAcc=nullptr) const
StatusCode setEnergyPt(xAOD::IParticle *obj, float e, float pt, const SG::AuxElement::Accessor< float > *weightAcc=nullptr) const
virtual StatusCode process_impl(xAOD::IParticleContainer *) const
StatusCode process(xAOD::IParticleContainer *cont) const override final
SG::Accessor< T, ALLOC > Accessor
Definition AuxElement.h:572
AsgTool(const std::string &name)
Constructor specifying the tool instance's name.
Definition AsgTool.cxx:58
void setCalPhi(flt_t)
Set for signal state CALIBRATED.
void setCalEta(flt_t)
Set for signal state CALIBRATED.
flt_t calE() const
Geet Energy in signal state CALIBRATED.
void setCalE(flt_t)
Set Energy for signal state CALIBRATED.
Class providing the definition of the 4-vector interface.
bool isCharged() const
is a charged PFO
Definition PFO_v1.cxx:251
virtual int taste() const
The taste of the particle.
Taste
Type of TrackCaloCluster - Charged - Neutral - Combined.
@ ParticleFlow
The object is a particle-flow object.
Definition ObjectType.h:41
@ FlowElement
The object is a track-calo-cluster.
Definition ObjectType.h:52
@ CaloCluster
The object is a calorimeter cluster.
Definition ObjectType.h:39
@ TrackCaloCluster
The object is a track-calo-cluster.
Definition ObjectType.h:51
PFO_v1 PFO
Definition of the current "pfo version".
Definition PFO.h:17
CaloCluster_v1 CaloCluster
Define the latest version of the calorimeter cluster class.
FlowElement_v1 FlowElement
Definition of the current "pfo version".
Definition FlowElement.h:16
TrackCaloCluster_v1 TrackCaloCluster
Reference the current persistent version:
DataVector< IParticle > IParticleContainer
Simple convenience declaration of IParticleContainer.
ROOT::Math::LorentzVector< ROOT::Math::PtEtaPhiM4D< double > > JetFourMom_t
Base 4 Momentum type for Jet.
Definition JetTypes.h:17