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  ATH_CHECK( readHandleTower.isValid() );
41  navInColl = readHandleTower.cptr();
42 
43  const CaloCellContainer * cellColl ;
45  ATH_CHECK( readHandleCell.isValid() );
46  cellColl = readHandleCell.cptr();
47 
48  //make the container
49  //Tricky migration: here we don't have to migrate our methods but what we use from CaloClusterStoreHelper
50  SG::WriteHandle<xAOD::CaloClusterContainer> writeHandleContainer ( m_outputKey, ctx );
52 
53  //loop on towers
54  for(const auto *towerItr : *navInColl)
55  {
56  //initialize variables
57  float E_cl=0;
58  float eta_cl=0;
59  float phi_cl=0;
60  float time_cl=0;
61  float E2_cl=0;
62  uint32_t samplingPattern=0;
63 
64  //navigate back to cells
65  //Default is to sort the cells by either pointer values leading to irreproducible output
66  //CaloCellIDFcn ensures cells are ordered by their IDs
68  towerItr->fillToken(cellToken,double(1.));
69 
70  // Make the cluster:
71  std::unique_ptr<xAOD::CaloCluster> cl(CaloClusterStoreHelper::makeCluster(cellColl));
72 
73  if ( cellToken.size() == 0 ) continue;
74  for(NavigationToken<CaloCell,double,CaloCellIDFcn>::const_iterator cellItr = cellToken.begin(); cellItr != cellToken.end(); ++cellItr )
75  {
76  //Bad cell policy - to be kept
77  //if(m_bad_cell_tool->SkipCell(*cellItr))
78  //{
79  //if(m_skipBadCells && (*cellItr)->badcell()) continue;
80  //}
81 
82  double geoWeight = cellToken.getParameter(*cellItr);
83  double cell_E_w=(*cellItr)->energy()*geoWeight;
84 
85  IdentifierHash hashid =(*cellItr)->caloDDE()->calo_hash();
86  size_t iCell=cellColl->findIndex(hashid);
87  cl->addCell(iCell,geoWeight);
88 
89  E_cl+=cell_E_w;
90  eta_cl+=cell_E_w*(*cellItr)->eta();
91  phi_cl+=cell_E_w*(*cellItr)->phi();
92  E2_cl+=cell_E_w*cell_E_w;
93  time_cl+=cell_E_w*cell_E_w*(*cellItr)->time();
94 
95  unsigned int sample = (CaloSampling::CaloSample) (*cellItr)->caloDDE()->getSampling();
96  samplingPattern |= (0x1U<<sample);
97  }//end cell loop
98 
99  float eta0=towerItr->eta();
100  float phi0=towerItr->phi();
101 
102  if(E_cl < m_EminMoment)
103  {
104  eta_cl=eta0;
105  phi_cl=phi0;
106  }
107  else
108  {
109  eta_cl/=E_cl;
110  phi_cl/=E_cl;
111  }
112  //phi moment does not respect wrap-around
113  phi_cl=TVector2::Phi_mpi_pi(phi_cl);
114  if(!HIJetRec::inTowerBoundary(eta0,phi0,eta_cl,phi_cl))
115  {
116  eta_cl=eta0;
117  phi_cl=phi0;
118  }
119 
120  if(E2_cl < 1e-8) time_cl=0.;
121  else time_cl/=E2_cl;
122 
123  //set initial tower position
124  cl->setEta0(eta0);
125  cl->setPhi0(phi0);
126 
127  //set initial kinematics to be the same for all signal states
128  //update upstream
129  cl->setRawE(E_cl);
130  cl->setRawEta(eta_cl);
131  cl->setRawPhi(phi_cl);
132  cl->setRawM(0);
133 
134  cl->setAltE(E_cl);
135  cl->setAltEta(eta_cl);
136  cl->setAltPhi(phi_cl);
137  cl->setAltM(0);
138 
139  cl->setCalE(E_cl);
140  cl->setCalEta(eta_cl);
141  cl->setCalPhi(phi_cl);
142  cl->setCalM(0);
143 
144  //extra info
145  cl->setTime(time_cl);
146  cl->setSamplingPattern(samplingPattern);
147 
148  ATH_MSG_VERBOSE( std::setw(20) << "PUSHING CLUSTER"
149  << std::setw(15) << cl->e()
150  << std::setw(15) << cl->eta()
151  << std::setw(15) << cl->phi() );
152 
153  writeHandleContainer->push_back(std::move(cl));
154  }//end tower loop
155  return StatusCode::SUCCESS;
156 }
157 
159 {
160  return StatusCode::SUCCESS;
161 }
162 
163 
165 {
166  ATH_MSG_INFO("Dumping PseudoJets");
167  for(xAOD::CaloClusterContainer::iterator clusCollIter= clusColl->begin();
168  clusCollIter!= clusColl->end(); ++clusCollIter)
169  {
170  xAOD::CaloCluster* cl = (*clusCollIter);
171 
172  float E_cl=0;
173  float eta_cl=0;
174  float phi_cl=0;
175 
176  CaloClusterCellLink* cellLinks=cl->getOwnCellLinks();
177 
178  if (!cellLinks)
179  {
180  ATH_MSG_ERROR("Can't get valid links to CaloCells (CaloClusterCellLink)!");
181  return StatusCode::FAILURE;
182  }
183 
184  unsigned int ncells=0;
185  float sumw=0;
186  // CaloClusterCellLink::iterator cellIterEnd=cellLinks->end();
187  // for(CaloClusterCellLink::iterator cellIter=cellLinks->end();
188  // cellIter != cellIterEnd; cellIter++, ncells++ )
189  // {
190  xAOD::CaloCluster::cell_iterator cellIterEnd = cl->cell_end();
191  for(xAOD::CaloCluster::cell_iterator cellIter= cl->cell_begin(); cellIter != cellIterEnd; ++cellIter )
192  {
193  CxxUtils::prefetchNext (cellIter, cellIterEnd);
194  const CaloCell* pCell=(*cellIter);
195  //double geoWeight =cellIter.weight(); //weird synatx, "." on iterator
196  double cell_E_w=pCell->energy();//*geoWeight;
197 
198  E_cl+=cell_E_w;
199  eta_cl+=cell_E_w*pCell->eta();
200  phi_cl+=cell_E_w*pCell->phi();
201  //sumw+=geoWeight;
202  }
203  if(E_cl!=0.)
204  {
205  eta_cl/=E_cl;
206  phi_cl/=E_cl;
207  }
208 
209  ATH_MSG_INFO( std::setw(10) << "DUMPING CLUSTER"
210  << std::setw(15) << cl->e()
211  << std::setw(15) << cl->eta()
212  << std::setw(15) << cl->phi()
213  << std::setw(15) << E_cl
214  << std::setw(15) << eta_cl
215  << std::setw(15) << phi_cl
216  << std::setw(15) << ncells
217  << std::setw(15) << sumw );
218  }
219  return StatusCode::SUCCESS;
220 }
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:164
AllowedVariables::e
e
Definition: AsgElectronSelectorTool.cxx:37
HIClusterMaker::finalize
virtual StatusCode finalize()
Definition: HIClusterMaker.cxx:158
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:113
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:794
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
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:228
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.