ATLAS Offline Software
HIClusterMaker.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #include "HIClusterMaker.h"
8 #include "CaloEvent/CaloCell.h"
12 #include "CxxUtils/prefetch.h"
13 #include <cmath>
14 #include <TVector2.h>
15 
16 #include "StoreGate/ReadHandle.h"
17 #include "StoreGate/WriteHandle.h"
18 
19 HIClusterMaker::HIClusterMaker(const std::string& name, ISvcLocator* pSvcLocator)
20  : AthReentrantAlgorithm(name,pSvcLocator)
21 {
22 }
23 
25 {
26  //First we initialize keys - after initialization they are frozen
27  ATH_CHECK( m_towerContainerKey.initialize() );
30 
31  return StatusCode::SUCCESS;
32 }
33 
34 StatusCode HIClusterMaker::execute(const EventContext &ctx) const
35 {
36 
37  //retrieve the tower container from store
38  const INavigable4MomentumCollection* navInColl = 0;
40  navInColl = readHandleTower.cptr();
41 
42  const CaloCellContainer * cellColl ;
44  cellColl = readHandleCell.cptr();
45 
46  //make the container
47  //Tricky migration: here we don't have to migrate our methods but what we use from CaloClusterStoreHelper
48  SG::WriteHandle<xAOD::CaloClusterContainer> writeHandleContainer ( m_outputKey, ctx );
50 
51  //loop on towers
52  for(const auto *towerItr : *navInColl)
53  {
54  //initialize variables
55  float E_cl=0;
56  float eta_cl=0;
57  float phi_cl=0;
58  float time_cl=0;
59  float E2_cl=0;
60  uint32_t samplingPattern=0;
61 
62  //navigate back to cells
63  //Default is to sort the cells by either pointer values leading to irreproducible output
64  //CaloCellIDFcn ensures cells are ordered by their IDs
66  towerItr->fillToken(cellToken,double(1.));
67 
68  // Make the cluster:
69  std::unique_ptr<xAOD::CaloCluster> cl(CaloClusterStoreHelper::makeCluster(cellColl));
70 
71  if ( cellToken.size() == 0 ) continue;
72  for(NavigationToken<CaloCell,double,CaloCellIDFcn>::const_iterator cellItr = cellToken.begin(); cellItr != cellToken.end(); ++cellItr )
73  {
74  //Bad cell policy - to be kept
75  //if(m_bad_cell_tool->SkipCell(*cellItr))
76  //{
77  //if(m_skipBadCells && (*cellItr)->badcell()) continue;
78  //}
79 
80  double geoWeight = cellToken.getParameter(*cellItr);
81  double cell_E_w=(*cellItr)->energy()*geoWeight;
82 
83  IdentifierHash hashid =(*cellItr)->caloDDE()->calo_hash();
84  size_t iCell=cellColl->findIndex(hashid);
85  cl->addCell(iCell,geoWeight);
86 
87  E_cl+=cell_E_w;
88  eta_cl+=cell_E_w*(*cellItr)->eta();
89  phi_cl+=cell_E_w*(*cellItr)->phi();
90  E2_cl+=cell_E_w*cell_E_w;
91  time_cl+=cell_E_w*cell_E_w*(*cellItr)->time();
92 
93  unsigned int sample = (CaloSampling::CaloSample) (*cellItr)->caloDDE()->getSampling();
94  samplingPattern |= (0x1U<<sample);
95  }//end cell loop
96 
97  float eta0=towerItr->eta();
98  float phi0=towerItr->phi();
99 
100  if(E_cl < m_EminMoment)
101  {
102  eta_cl=eta0;
103  phi_cl=phi0;
104  }
105  else
106  {
107  eta_cl/=E_cl;
108  phi_cl/=E_cl;
109  }
110  //phi moment does not respect wrap-around
111  phi_cl=TVector2::Phi_mpi_pi(phi_cl);
112  if(!HIJetRec::inTowerBoundary(eta0,phi0,eta_cl,phi_cl))
113  {
114  eta_cl=eta0;
115  phi_cl=phi0;
116  }
117 
118  if(E2_cl < 1e-8) time_cl=0.;
119  else time_cl/=E2_cl;
120 
121  //set initial tower position
122  cl->setEta0(eta0);
123  cl->setPhi0(phi0);
124 
125  //set initial kinematics to be the same for all signal states
126  //update upstream
127  cl->setRawE(E_cl);
128  cl->setRawEta(eta_cl);
129  cl->setRawPhi(phi_cl);
130  cl->setRawM(0);
131 
132  cl->setAltE(E_cl);
133  cl->setAltEta(eta_cl);
134  cl->setAltPhi(phi_cl);
135  cl->setAltM(0);
136 
137  cl->setCalE(E_cl);
138  cl->setCalEta(eta_cl);
139  cl->setCalPhi(phi_cl);
140  cl->setCalM(0);
141 
142  //extra info
143  cl->setTime(time_cl);
144  cl->setSamplingPattern(samplingPattern);
145 
146  ATH_MSG_VERBOSE( std::setw(20) << "PUSHING CLUSTER"
147  << std::setw(15) << cl->e()
148  << std::setw(15) << cl->eta()
149  << std::setw(15) << cl->phi() );
150 
151  writeHandleContainer->push_back(std::move(cl));
152  }//end tower loop
153  return StatusCode::SUCCESS;
154 }
155 
157 {
158  return StatusCode::SUCCESS;
159 }
160 
161 
163 {
164  ATH_MSG_INFO("Dumping PseudoJets");
165  for(xAOD::CaloClusterContainer::iterator clusCollIter= clusColl->begin();
166  clusCollIter!= clusColl->end(); ++clusCollIter)
167  {
168  xAOD::CaloCluster* cl = (*clusCollIter);
169 
170  float E_cl=0;
171  float eta_cl=0;
172  float phi_cl=0;
173 
174  CaloClusterCellLink* cellLinks=cl->getOwnCellLinks();
175 
176  if (!cellLinks)
177  {
178  ATH_MSG_ERROR("Can't get valid links to CaloCells (CaloClusterCellLink)!");
179  return StatusCode::FAILURE;
180  }
181 
182  unsigned int ncells=0;
183  float sumw=0;
184  // CaloClusterCellLink::iterator cellIterEnd=cellLinks->end();
185  // for(CaloClusterCellLink::iterator cellIter=cellLinks->end();
186  // cellIter != cellIterEnd; cellIter++, ncells++ )
187  // {
188  xAOD::CaloCluster::cell_iterator cellIterEnd = cl->cell_end();
189  for(xAOD::CaloCluster::cell_iterator cellIter= cl->cell_begin(); cellIter != cellIterEnd; ++cellIter )
190  {
191  CxxUtils::prefetchNext (cellIter, cellIterEnd);
192  const CaloCell* pCell=(*cellIter);
193  //double geoWeight =cellIter.weight(); //weird synatx, "." on iterator
194  double cell_E_w=pCell->energy();//*geoWeight;
195 
196  E_cl+=cell_E_w;
197  eta_cl+=cell_E_w*pCell->eta();
198  phi_cl+=cell_E_w*pCell->phi();
199  //sumw+=geoWeight;
200  }
201  if(E_cl!=0.)
202  {
203  eta_cl/=E_cl;
204  phi_cl/=E_cl;
205  }
206 
207  ATH_MSG_INFO( std::setw(10) << "DUMPING CLUSTER"
208  << std::setw(15) << cl->e()
209  << std::setw(15) << cl->eta()
210  << std::setw(15) << cl->phi()
211  << std::setw(15) << E_cl
212  << std::setw(15) << eta_cl
213  << std::setw(15) << phi_cl
214  << std::setw(15) << ncells
215  << std::setw(15) << sumw );
216  }
217  return StatusCode::SUCCESS;
218 }
CaloClusterStoreHelper::makeCluster
static std::unique_ptr< xAOD::CaloCluster > makeCluster(const CaloCellContainer *cellCont)
Creates a valid CaloCluster with a private Aux-Store and CellLink container.
Definition: CaloClusterStoreHelper.cxx:13
HIClusterMaker::dumpClusters
StatusCode dumpClusters(xAOD::CaloClusterContainer *clusColl)
Definition: HIClusterMaker.cxx:162
AllowedVariables::e
e
Definition: AsgElectronSelectorTool.cxx:37
HIClusterMaker::finalize
virtual StatusCode finalize()
Definition: HIClusterMaker.cxx:156
CaloCell::phi
virtual double phi() const override final
get phi (through CaloDetDescrElement)
Definition: CaloCell.h:359
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
CaloClusterStoreHelper::AddContainerWriteHandle
static StatusCode AddContainerWriteHandle(SG::WriteHandle< xAOD::CaloClusterContainer > &clusColl)
Creates a new xAOD::CaloClusterContainer in the given WriteHandle + CaloClusterAuxContainer and recor...
Definition: CaloClusterStoreHelper.cxx:53
SG::ReadHandle::cptr
const_pointer_type cptr()
Dereference the pointer.
xAOD::uint32_t
setEventNumber uint32_t
Definition: EventInfo_v1.cxx:127
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
HIClusterMaker::m_towerContainerKey
SG::ReadHandleKey< INavigable4MomentumCollection > m_towerContainerKey
Name of input CaloTowerContainer, e.g CmbTower.
Definition: HIClusterMaker.h:52
InDetAccessor::phi0
@ phi0
Definition: InDetAccessor.h:33
NavigationToken.h
HIJetRec::inTowerBoundary
bool inTowerBoundary(float eta0, float phi0, float eta, float phi)
Definition: HIJetRecDefs.h:29
CaloCell.h
HIClusterMaker::initialize
virtual StatusCode initialize()
Definition: HIClusterMaker.cxx:24
HIClusterMaker.h
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
plotBeamSpotVxVal.sumw
int sumw
Definition: plotBeamSpotVxVal.py:236
Phi_mpi_pi
__HOSTDEV__ double Phi_mpi_pi(double)
Definition: GeoRegion.cxx:7
HIClusterMaker::m_outputKey
SG::WriteHandleKey< xAOD::CaloClusterContainer > m_outputKey
Name of output CaloClusterContainer, e.g. HIClusters.
Definition: HIClusterMaker.h:56
CaloCell::energy
double energy() const
get energy (data member)
Definition: CaloCell.h:311
AthReentrantAlgorithm
An algorithm that can be simultaneously executed in multiple threads.
Definition: AthReentrantAlgorithm.h:83
HIClusterMaker::m_cellContainerKey
SG::ReadHandleKey< CaloCellContainer > m_cellContainerKey
Name of input CaloCellContainer, e.g. AllCalo.
Definition: HIClusterMaker.h:54
WriteHandle.h
Handle class for recording to StoreGate.
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
FullCPAlgorithmsTest_eljob.sample
sample
Definition: FullCPAlgorithmsTest_eljob.py:116
DataModel_detail::iterator
(Non-const) Iterator class for DataVector/DataList.
Definition: DVLIterator.h:184
CaloSampling::CaloSample
CaloSample
Definition: Calorimeter/CaloGeoHelpers/CaloGeoHelpers/CaloSampling.h:22
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
INavigable4MomentumCollection.h
HIClusterMaker::HIClusterMaker
HIClusterMaker(const std::string &name, ISvcLocator *pSvcLocator)
Definition: HIClusterMaker.cxx:19
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
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
CxxUtils::prefetchNext
void prefetchNext(Iter iter, Iter endIter)
Prefetch next object in sequence.
Definition: prefetch.h:130
NavigationToken::begin
const_iterator begin() const
Definition: NavigationToken.h:229
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:221
NavigationToken
Definition: NavigationToken.h:50
DataVector::push_back
value_type push_back(value_type pElem)
Add an element to the end of the collection.
CaloCellContainer.h
CaloCellContainer
Container class for CaloCell.
Definition: CaloCellContainer.h:55
CaloClusterStoreHelper.h
NavigationToken::end
const_iterator end() const
Definition: NavigationToken.h:230
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
NavigationToken::NavigationTokenIterator
Definition: NavigationToken.h:72
HIClusterMaker::m_EminMoment
Gaudi::Property< float > m_EminMoment
For clusters w/ E less than this, set their eta/phi to tower eta/phi.
Definition: HIClusterMaker.h:58
CaloCell
Data object for each calorimeter readout cell.
Definition: CaloCell.h:57
CaloCellContainer::findIndex
int findIndex(const IdentifierHash theHash) const
Return index of the cell with a given hash.
Definition: CaloCellContainer.cxx:363
HIJetRecDefs.h
NavigationToken::getParameter
CHILDPAR getParameter(const_child_ptr data) const
ReadHandle.h
Handle class for reading from StoreGate.
IdentifierHash
This is a "hash" representation of an Identifier. This encodes a 32 bit index which can be used to lo...
Definition: IdentifierHash.h:25
dq_make_web_display.cl
cl
print [x.__class__ for x in toList(dqregion.getSubRegions()) ]
Definition: dq_make_web_display.py:26
NavigationToken::size
unsigned int size()
Definition: NavigationToken.h:231
HIClusterMaker::execute
virtual StatusCode execute(const EventContext &ctx) const
Definition: HIClusterMaker.cxx:34
CaloCell::eta
virtual double eta() const override final
get eta (through CaloDetDescrElement)
Definition: CaloCell.h:366
prefetch.h
Functions to prefetch blocks of memory.
DataVector::begin
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.