ATLAS Offline Software
Loading...
Searching...
No Matches
HIClusterSubtraction.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
11#include "xAODTracking/Vertex.h"
15
19
20//**********************************************************************
21
22HIClusterSubtraction::HIClusterSubtraction(const std::string& name) : asg::AsgTool(name)//,
23{
24}
25
26//**********************************************************************
27
29{
30 //Keys initialization
31 ATH_CHECK( m_eventShapeKey.initialize() );
32 ATH_CHECK( m_inClusterKey.initialize() );
33 ATH_CHECK( m_outClusterKey.initialize() );
34 //Vertex container needs to be initialized only if origin correction will take place
36
37 for (const auto& tool : m_clusterCorrectionTools)
38 {
39 StatusCode sc = tool.retrieve();
40 if (sc.isFailure()) ATH_MSG_ERROR("Failed to retrieve correction tool " << tool);
41 else ATH_MSG_DEBUG("Successfully retrieved correction tool " << tool);
42 }
43 return StatusCode::SUCCESS;
44}
45
47 //made boolean to return what was "missingMoment" in HIJetConstituentSubtractionTool
48 bool missingMoment = false;
49 float mag = 0;
50 static const SG::ConstAccessor<float> HIMagAcc("HIMag");
51 if(HIMagAcc.isAvailable(*cl)) mag=HIMagAcc(*cl);
52 else
53 {
54 double cm_mag=0;
55 if(cl->retrieveMoment (xAOD::CaloCluster::CENTER_MAG, cm_mag)) mag=cm_mag;
56 }
57 if(mag!=0.)
58 {
59 float eta0=cl->eta0();
60 float phi0=cl->phi0();
61 float radius=mag/std::cosh(eta0);
63 p4_pos.SetX(radius*std::cos(phi0)-origin->x());
64 p4_pos.SetY(radius*std::sin(phi0)-origin->y());
65 p4_pos.SetZ(radius*std::sinh(eta0)-origin->z());
66
67 double deta=p4_pos.Eta()-eta0;
68 double dphi=p4_pos.Phi()-phi0;
69 //adjust in case eta/phi are flipped in case of neg E clusters
70 //this method is agnostic wrt convention
71 if(p4_cl.Eta()*eta0 <0.) deta*=-1;
72
73 double eta_prime=p4_cl.Eta()+deta;
74 double phi_prime=p4_cl.Phi()+dphi;
75 double e_subtr=p4_cl.E();
76 p4_cl.SetPtEtaPhiE(e_subtr/std::cosh(eta_prime),eta_prime,phi_prime,e_subtr);
77 }
78 else missingMoment=true;
79
80 return missingMoment;
81}
82
84{
85 //const jet::cellset_t & badcells = badCellMap.cells() ;
86 //retrieve UE
87 const xAOD::HIEventShapeContainer* shape = 0;
89 shape = readHandleEvtShape.cptr();
90 const HIEventShapeIndex* es_index = m_eventShapeMapTool->getIndexFromShape( shape );
91 if(es_index == nullptr) ATH_MSG_FATAL("The HIEventShapeMapTool returned a null pointer. Binning scheme not coherent");
92 const xAOD::HIEventShape* eshape = nullptr;
93 CHECK(m_modulatorTool->getShape(eshape), 1);
94
95 //New implementation: make a deep copy of original HIClusters and apply subtraction to clusters in the new container
97 // Now a handle to write the deep Copy
99 // Preparing keys and container to perfrom the origin correction
100 const xAOD::Vertex* primVertex=nullptr;
101 const xAOD::VertexContainer* vertices=nullptr;
102 // Boolean to flag that at least a vertex is present in the vertex container
103 bool isOriginPossible = true;
104 // Finding the primary vertex in case origin correction has to be performed
106 {
107 // ReadHandle to retrieve the vertex container
108 SG::ReadHandle<xAOD::VertexContainer> readHandleVertexContainer ( m_vertexContainer );
109 vertices = readHandleVertexContainer.get();
110 for (const auto *vertice : *vertices)
111 {
112 if(vertice->vertexType() == xAOD::VxType::PriVtx)
113 {
114 primVertex=vertice;
115 break;
116 }
117 }
118 if(!primVertex && vertices->size() > 0)
119 {
120 ATH_MSG_WARNING("No primary vertices found, using first in container");
121 primVertex=vertices->at(0);
122 }
123 if(!primVertex && vertices->size() == 0)
124 {
125 ATH_MSG_WARNING("No primary vertices found, and vertex container empty. Abortin Origin correction for this event.");
126 isOriginPossible = false;
127 }
128 }
129 bool missingMoment=false;
130
131 const auto *originalCluster = readHandleClusters.cptr();
132 // Create the new container and its auxiliary store.
135 copyClusters->setStore(copyClustersAux);
136 copyClusters->reserve (originalCluster->size());
137
138 for (const xAOD::CaloCluster* oldCluster : *originalCluster) {
140 copyClusters->push_back (newClu);
141 *newClu=*oldCluster;
142 }
143
144 for(xAOD::CaloClusterContainer::iterator itr=copyClusters->begin(); itr!=copyClusters->end(); ++itr)
145 {
146 xAOD::CaloCluster* cl= *itr;
148 //Unsubtracted state record done by the subtractor tool functions.
149 if(m_setMoments)
150 {
151 //This flag is set to false for HIJetClustersSubtractorTool and true for HIJetCellSubtractorTool,
152 // but for the second we don't do origin correction. In principle the code is structured to do the same as the
153 //else for m_setMoments=true and HIJetClustersSubtractorTool, therefore we add the code for origin correction also here
154 m_subtractorTool->subtractWithMoments(cl, shape, es_index, m_modulatorTool, eshape);
155 if(isOriginPossible && m_originCorrection)
156 {
157 missingMoment = HIClusterSubtraction::doOriginCorrection( cl, primVertex, p4 );
159 }
160 }
161 else
162 {
163 m_subtractorTool->subtract(p4,cl,shape,es_index,m_modulatorTool,eshape);
165
166 if(isOriginPossible && m_originCorrection)
167 {
168 ATH_MSG_DEBUG("Applying origin correction"
169 << std::setw(12) << "Before:"
170 << std::setw(10) << std::setprecision(3) << p4.Pt()*1e-3
171 << std::setw(10) << std::setprecision(3) << p4.Eta()
172 << std::setw(10) << std::setprecision(3) << p4.Phi()
173 << std::setw(10) << std::setprecision(3) << p4.E()*1e-3
174 << std::setw(10) << std::setprecision(3) << p4.M()*1e-3);
175
176 missingMoment = HIClusterSubtraction::doOriginCorrection( cl, primVertex, p4 );
178
179 ATH_MSG_DEBUG("Applying origin correction"
180 << std::setw(12) << "After:"
181 << std::setw(10) << std::setprecision(3) << p4.Pt()*1e-3
182 << std::setw(10) << std::setprecision(3) << p4.Eta()
183 << std::setw(10) << std::setprecision(3) << p4.Phi()
184 << std::setw(10) << std::setprecision(3) << p4.E()*1e-3
185 << std::setw(10) << std::setprecision(3) << p4.M()*1e-3);
186 }
187 }
188 }//End of iterator over CaloClusterContainer
189
190 for(const auto & clusterCorrectionTool : m_clusterCorrectionTools)
191 {
192 ATH_MSG_DEBUG(" Applying correction = " << clusterCorrectionTool->name() );
193 CHECK(clusterCorrectionTool->execute(Gaudi::Hive::currentContext(), copyClusters), 1);
194 }//End loop over correction tools
195
196 if(missingMoment) ATH_MSG_WARNING("No origin correction applied, CENTERMAG missing");
197
198 // Make sure that memory is managed safely
199 std::unique_ptr<xAOD::CaloClusterContainer> outClusters(copyClusters);
200 std::unique_ptr<xAOD::CaloClusterAuxContainer> deepAux(copyClustersAux);
201
202 if(writeHandleDeepCopyClusters.record ( std::move(outClusters), std::move(deepAux)).isFailure() ){
203 ATH_MSG_ERROR("Unable to write DeepCopy Copy containers for subtracted clusters with key: " << m_outClusterKey.key());
204 return 1;
205 }
206 return 0;
207}
Scalar mag() const
mag method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_FATAL(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
Helper class to provide constant type-safe access to aux data.
#define CHECK(...)
Evaluate an expression and check for errors.
static Double_t sc
Handle class for reading from StoreGate.
Handle class for recording to StoreGate.
void reserve(size_type n)
Attempt to preallocate enough memory for a specified number of elements.
value_type push_back(value_type pElem)
Add an element to the end of the collection.
DataModel_detail::iterator< DataVector > iterator
Definition DataVector.h:842
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
Gaudi::Property< bool > m_setMoments
virtual StatusCode initialize()
Dummy implementation of the initialisation function.
ToolHandle< IHIUEModulatorTool > m_modulatorTool
ToolHandle< IHISubtractorTool > m_subtractorTool
HIClusterSubtraction(const std::string &name)
SG::WriteHandleKey< xAOD::CaloClusterContainer > m_outClusterKey
|brief New writeHandleKey to store the shallow copy used for new CaloClusterTreatment
virtual int execute() const
Method to be called for each event.
bool doOriginCorrection(xAOD::CaloCluster *cl, const xAOD::Vertex *origin, xAOD::IParticle::FourMom_t &p4_cl) const
ToolHandleArray< CaloClusterCollectionProcessor > m_clusterCorrectionTools
SG::ReadHandleKey< xAOD::CaloClusterContainer > m_inClusterKey
Name of input cluster container.
SG::ReadHandleKey< xAOD::HIEventShapeContainer > m_eventShapeKey
Name of HIEventShapeContainer defining background.
Gaudi::Property< bool > m_originCorrection
ToolHandle< IHIEventShapeMapTool > m_eventShapeMapTool
SG::ReadHandleKey< xAOD::VertexContainer > m_vertexContainer
|brief Name of Vertex Container for origin correction
Helper class to provide constant type-safe access to aux data.
bool isAvailable(const ELT &e) const
Test to see if this variable exists in the store.
const_pointer_type cptr()
Dereference the pointer.
const_pointer_type get() const
Dereference the pointer, but don't cache anything.
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
AsgTool(const std::string &name)
Constructor specifying the tool instance's name.
Definition AsgTool.cxx:58
@ CENTER_MAG
Cluster Centroid ( )
TLorentzVector FourMom_t
Definition of the 4-momentum type.
float z() const
Returns the z position.
float y() const
Returns the y position.
float x() const
Returns the x position.
constexpr xAOD::CaloCluster::State subtractedClusterState()
void setClusterP4(const xAOD::CaloCluster::FourMom_t &p, xAOD::CaloCluster *cl, xAOD::CaloCluster::State s)
constexpr xAOD::CaloCluster::State subtractedOriginCorrectedClusterState()
@ PriVtx
Primary vertex.
CaloCluster_v1 CaloCluster
Define the latest version of the calorimeter cluster class.
VertexContainer_v1 VertexContainer
Definition of the current "Vertex container version".
Vertex_v1 Vertex
Define the latest version of the vertex class.
HIEventShapeContainer_v2 HIEventShapeContainer
Define the latest version of the container.
CaloClusterContainer_v1 CaloClusterContainer
Define the latest version of the calorimeter cluster container.
CaloClusterAuxContainer_v2 CaloClusterAuxContainer
Define the latest version of the calorimeter cluster auxiliary container.
HIEventShape_v2 HIEventShape
Definition of the latest event info version.