ATLAS Offline Software
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 
5 #include "HIClusterSubtraction.h"
11 #include "xAODTracking/Vertex.h"
15 
16 #include "StoreGate/ReadHandle.h"
17 #include "StoreGate/WriteHandle.h"
19 
20 //**********************************************************************
21 
22 HIClusterSubtraction::HIClusterSubtraction(const std::string& name) : asg::AsgTool(name)//,
23 {
24 }
25 
26 //**********************************************************************
27 
29 {
30  //Keys initialization
31  ATH_CHECK( m_eventShapeKey.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
98  SG::WriteHandle<xAOD::CaloClusterContainer> writeHandleDeepCopyClusters ( m_outClusterKey );
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) {
139  xAOD::CaloCluster* newClu=new xAOD::CaloCluster();
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 }
DataVector::reserve
void reserve(size_type n)
Attempt to preallocate enough memory for a specified number of elements.
xAOD::CaloCluster_v1::CENTER_MAG
@ CENTER_MAG
Cluster Centroid ( )
Definition: CaloCluster_v1.h:135
HIClusterSubtraction::m_inClusterKey
SG::ReadHandleKey< xAOD::CaloClusterContainer > m_inClusterKey
Name of input cluster container.
Definition: HIClusterSubtraction.h:54
HIEventShapeMapTool.h
xAOD::Vertex_v1::x
float x() const
Returns the x position.
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
HIClusterSubtraction::m_originCorrection
Gaudi::Property< bool > m_originCorrection
Definition: HIClusterSubtraction.h:72
HIClusterSubtraction::HIClusterSubtraction
HIClusterSubtraction(const std::string &name)
Definition: HIClusterSubtraction.cxx:22
HIClusterSubtraction::m_vertexContainer
SG::ReadHandleKey< xAOD::VertexContainer > m_vertexContainer
|brief Name of Vertex Container for origin correction
Definition: HIClusterSubtraction.h:60
SG::ReadHandle::cptr
const_pointer_type cptr()
Dereference the pointer.
HIJetRec::subtractedOriginCorrectedClusterState
constexpr xAOD::CaloCluster::State subtractedOriginCorrectedClusterState()
Definition: HIJetRecDefs.h:27
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
InDetAccessor::phi0
@ phi0
Definition: InDetAccessor.h:33
asg
Definition: DataHandleTestTool.h:28
HIClusterSubtraction::m_setMoments
Gaudi::Property< bool > m_setMoments
Definition: HIClusterSubtraction.h:69
SG::ConstAccessor< float >
drawFromPickle.cos
cos
Definition: drawFromPickle.py:36
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
CaloClusterAuxContainer.h
HIClusterSubtraction::m_outClusterKey
SG::WriteHandleKey< xAOD::CaloClusterContainer > m_outClusterKey
|brief New writeHandleKey to store the shallow copy used for new CaloClusterTreatment
Definition: HIClusterSubtraction.h:56
xAOD::CaloCluster
CaloCluster_v1 CaloCluster
Define the latest version of the calorimeter cluster class.
Definition: Event/xAOD/xAODCaloEvent/xAODCaloEvent/CaloCluster.h:19
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
HIClusterSubtraction::execute
virtual int execute() const
Method to be called for each event.
Definition: HIClusterSubtraction.cxx:83
xAOD::IParticle::FourMom_t
TLorentzVector FourMom_t
Definition of the 4-momentum type.
Definition: Event/xAOD/xAODBase/xAODBase/IParticle.h:68
HIClusterSubtraction.h
xAOD::HIEventShape_v2
Interface class for the HI reconstruction EDM.
Definition: HIEventShape_v2.h:31
WriteHandle.h
Handle class for recording to StoreGate.
xAOD::CaloClusterContainer
CaloClusterContainer_v1 CaloClusterContainer
Define the latest version of the calorimeter cluster container.
Definition: Event/xAOD/xAODCaloEvent/xAODCaloEvent/CaloClusterContainer.h:17
xAOD::CaloCluster_v1
Description of a calorimeter cluster.
Definition: CaloCluster_v1.h:59
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
HIJetRec::subtractedClusterState
constexpr xAOD::CaloCluster::State subtractedClusterState()
Definition: HIJetRecDefs.h:26
HIClusterSubtraction::m_eventShapeMapTool
ToolHandle< IHIEventShapeMapTool > m_eventShapeMapTool
Definition: HIClusterSubtraction.h:65
DataModel_detail::iterator
(Non-const) Iterator class for DataVector/DataList.
Definition: DVLIterator.h:184
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
SG::ReadHandle::get
const_pointer_type get() const
Dereference the pointer, but don't cache anything.
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
HIEventShapeContainer.h
xAOD::VxType::PriVtx
@ PriVtx
Primary vertex.
Definition: TrackingPrimitives.h:571
HIClusterSubtraction::m_clusterCorrectionTools
ToolHandleArray< CaloClusterCollectionProcessor > m_clusterCorrectionTools
Definition: HIClusterSubtraction.h:66
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
CHECK
#define CHECK(...)
Evaluate an expression and check for errors.
Definition: Control/AthenaKernel/AthenaKernel/errorcheck.h:422
xAOD::Vertex_v1::z
float z() const
Returns the z position.
SG::VarHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:103
DataVector
Derived DataVector<T>.
Definition: DataVector.h:581
Vertex.h
HIClusterSubtraction::m_subtractorTool
ToolHandle< IHISubtractorTool > m_subtractorTool
Definition: HIClusterSubtraction.h:63
xAOD::CaloClusterAuxContainer_v2
Auxiliary container for calorimeter cluster containers.
Definition: CaloClusterAuxContainer_v2.h:30
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:192
xAOD::CaloClusterAuxContainer
CaloClusterAuxContainer_v2 CaloClusterAuxContainer
Define the latest version of the calorimeter cluster auxiliary container.
Definition: CaloClusterAuxContainer.h:16
AtlCoolConsole.tool
tool
Definition: AtlCoolConsole.py:453
HIEventShapeIndex
Definition: HIEventShapeIndex.h:17
DataVector::push_back
value_type push_back(value_type pElem)
Add an element to the end of the collection.
ParticleGun_SamplingFraction.radius
radius
Definition: ParticleGun_SamplingFraction.py:96
CaloClusterStoreHelper.h
DataVector::end
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
SG::WriteHandle
Definition: StoreGate/StoreGate/WriteHandle.h:76
VertexContainer.h
DiTauMassTools::MaxHistStrategyV2::e
e
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:26
HIClusterSubtraction::doOriginCorrection
bool doOriginCorrection(xAOD::CaloCluster *cl, const xAOD::Vertex *origin, xAOD::IParticle::FourMom_t &p4_cl) const
Definition: HIClusterSubtraction.cxx:46
xAOD::Vertex_v1
Class describing a Vertex.
Definition: Vertex_v1.h:42
SG::WriteHandle::record
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
xAOD::Vertex_v1::y
float y() const
Returns the y position.
CaloClusterContainer.h
HIClusterSubtraction::m_eventShapeKey
SG::ReadHandleKey< xAOD::HIEventShapeContainer > m_eventShapeKey
Name of HIEventShapeContainer defining background.
Definition: HIClusterSubtraction.h:58
SG::ConstAccessor::isAvailable
bool isAvailable(const ELT &e) const
Test to see if this variable exists in the store.
IParticleHelpers.h
HIJetRecDefs.h
ConstAccessor.h
Helper class to provide constant type-safe access to aux data.
drawFromPickle.sin
sin
Definition: drawFromPickle.py:36
ReadHandle.h
Handle class for reading from StoreGate.
HIClusterSubtraction::initialize
virtual StatusCode initialize()
Dummy implementation of the initialisation function.
Definition: HIClusterSubtraction.cxx:28
dq_make_web_display.cl
cl
print [x.__class__ for x in toList(dqregion.getSubRegions()) ]
Definition: dq_make_web_display.py:26
mag
Scalar mag() const
mag method
Definition: AmgMatrixBasePlugin.h:25
HIJetRec::setClusterP4
void setClusterP4(const xAOD::CaloCluster::FourMom_t &p, xAOD::CaloCluster *cl, xAOD::CaloCluster::State s)
Definition: HIJetRecDefs.h:36
DataVector::begin
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
HIClusterSubtraction::m_modulatorTool
ToolHandle< IHIUEModulatorTool > m_modulatorTool
Definition: HIClusterSubtraction.h:64