ATLAS Offline Software
Loading...
Searching...
No Matches
LArMinBiasAlg.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
5#include "LArMinBiasAlg.h"
6
11
12#include "LArSimEvent/LArHit.h"
14#include "TTree.h"
15#include "GaudiKernel/ITHistSvc.h"
16#include "CaloDetDescr/CaloDetDescrElement.h"
17
18 //Constructor
19 LArMinBiasAlg:: LArMinBiasAlg(const std::string& name, ISvcLocator* pSvcLocator):
20 AthAlgorithm(name,pSvcLocator)
21 {
22 }
23
24 //__________________________________________________________________________
25 //Destructor
27 //__________________________________________________________________________
29 {
30
31 ATH_MSG_INFO ( " LArMinBiasAlg initialize() " );
32
33 ATH_CHECK( m_thistSvc.retrieve() );
34
35
36 m_tree = new TTree("m_tree","Offset ntuple");
37 m_tree->Branch("ncell",&m_nsymcell,"ncell/I");
38 m_tree->Branch("nevt_total",&m_nevt_total,"nevt_total/I");
39 m_tree->Branch("identifier",m_identifier,"identifier[ncell]/I");
40 m_tree->Branch("region",m_region,"region[ncell]/I");
41 m_tree->Branch("ieta",m_ieta,"ieta[ncell]/I");
42 m_tree->Branch("layer",m_layer,"layer[ncell]/I");
43 m_tree->Branch("region",m_region,"region[ncell]/I");
44 m_tree->Branch("ieta",m_ieta,"ieta[ncell]/I");
45 m_tree->Branch("eta",m_eta,"eta[ncell]/F");
46 m_tree->Branch("phi",m_phi,"phi[ncell]/F");
47 m_tree->Branch("nevt",m_nevt,"nevt[ncell]/D");
48 m_tree->Branch("average",m_average,"average[ncell]/D");
49 m_tree->Branch("rms",m_rms,"rms[ncell]/D");
50 m_tree->Branch("reference",m_offset,"offset[ncell]/D");
51
52 if( m_thistSvc->regTree("/file1/offset",m_tree).isFailure()) {
53 ATH_MSG_WARNING(" cannot register ntuple " );
54 return StatusCode::SUCCESS;
55 }
56
57 const CaloIdManager* mgr = nullptr;
58 ATH_CHECK( detStore()->retrieve( mgr ) );
59 if(m_isSC) {
60 m_calo_id = (const CaloCell_Base_ID*)mgr->getCaloCell_SuperCell_ID();
61 } else {
62 m_calo_id = (const CaloCell_Base_ID*)mgr->getCaloCell_ID();
63 }
64
65 ATH_CHECK(m_mcSymKey.initialize());
66
67 ATH_CHECK(m_cablingKey.initialize());
68
69 ATH_CHECK(m_caloMgrKey.initialize());
70
71 ATH_CHECK(m_caloSCMgrKey.initialize(m_isSC));
72
73 ATH_CHECK(m_eventInfoKey.initialize());
74
75 ATH_CHECK(m_larHitKeys.assign(m_inputKeys.value()));
76 ATH_CHECK(m_larHitKeys.initialize(!m_inputKeys.empty() ));
77
78 if(m_isSC) ATH_CHECK( m_scidtool.retrieve() );
79
80 m_n1=0;
81 m_n2=0;
82
84
85 return StatusCode::SUCCESS;
86
87 }
88 //__________________________________________________________________________
90 {
91 ATH_MSG_INFO("number of events in the two samples " << m_n1 << " " << m_n2);
92 this->fillNtuple();
93 ATH_MSG_INFO(" stop after fill ntuple");
94 return StatusCode::SUCCESS;
95 }
96
97 //__________________________________________________________________________
98 StatusCode LArMinBiasAlg::execute(const EventContext& ctx)
99 {
100 //.............................................
101
102 ATH_MSG_DEBUG(" LArMinBiasAlg execute()");
103
104
105 if (m_first) {
106
107 const CaloDetDescrManager_Base *cMgr=nullptr;
108 if(m_isSC){
110 ATH_CHECK(caloMgrHandle.isValid());
111 cMgr=(const CaloDetDescrManager_Base *)(*caloMgrHandle);
112 } else {
114 ATH_CHECK(caloMgrHandle.isValid());
115 cMgr=(const CaloDetDescrManager_Base *)(*caloMgrHandle);
116 }
117
120 const LArOnOffIdMapping* cabling{*cablingHdl};
121 if(!cabling) {
122 ATH_MSG_ERROR( "Do not have cabling mapping from key " << m_cablingKey.key() );
123 return StatusCode::FAILURE;
124 }
125
126 m_ncell = m_calo_id->calo_cell_hash_max();
127 ATH_MSG_DEBUG("Hash max: "<<m_ncell);
128
129 ATH_MSG_INFO(" --- first event " << m_ncell);
130 m_symCellIndex.resize(m_ncell,-1);
131 std::vector<int> doneCell;
132 doneCell.resize(m_ncell,-1);
133
134 //m_readCell.resize(m_ncell,0);
135
136 m_eCell.resize(m_ncell,0.);
137
138 m_CellList.reserve(MAX_SYM_CELLS);
139 int nsym=0;
140 // loop over cells
141 // and find symmetry cells
142 for (unsigned int i=0;i<((unsigned int)(m_ncell));i++) {
143 IdentifierHash idHash=i;
144 Identifier id=m_calo_id->cell_id(idHash);
145 if (m_calo_id->is_tile(id)) continue;
146 // convert cell id to symmetric identifier
147 HWIdentifier hwid2 = mcsym->ZPhiSymOfl(id);
148 Identifier id2 = cabling->cnvToIdentifier(hwid2);
149 int i2 = (int) (m_calo_id->calo_cell_hash(id2));
150 if(i2>=m_ncell) {
151 ATH_MSG_WARNING("problem: i2: "<<i2<<" for id: "<<m_calo_id->print_to_string(id)<<" symmetrized: "<<m_calo_id->print_to_string(id2));
152 }
153 // we have already processed this hash => just need to associate cell i to the same symmetric cell
154 if (doneCell[i2]>=0) {
155 m_symCellIndex[i]=doneCell[i2];
156 ATH_MSG_DEBUG("Adding cell "<<id.get_identifier32().get_compact()<<" to a symmetrized cell "<<id2.get_identifier32().get_compact());
157 }
158 // we have not already processed this hash, add an entry for this new symmetric cell
159 else {
160 ATH_MSG_DEBUG("New symmetrized cell "<<id2.get_identifier32().get_compact());
161 doneCell[i2]=nsym;
162 m_symCellIndex[i] = nsym;
163 CellInfo cell;
164 const CaloDetDescrElement* calodde = cMgr->get_element(id);
165 cell.eta = calodde->eta();
166 cell.phi = calodde->phi();
167 cell.region = m_calo_id->region(id);
168 cell.ieta = m_calo_id->eta(id);
169 cell.layer = m_calo_id->calo_sample(id);
170 cell.region = m_calo_id->region(id);
171 cell.ieta = m_calo_id->eta(id);
172 //cell.identifier = id2.get_identifier32().get_compact();
173 cell.identifier = id2;
174 cell.average=0.;
175 cell.offset=0.;
176 cell.rms=0.;
177 cell.nevt=0.;
178 m_CellList.push_back(cell);
179 nsym++;
180 }
181 }
182 ATH_MSG_INFO(" --- number of symmetric cells found " << nsym << " " << m_CellList.size());
183 if (nsym>=MAX_SYM_CELLS) ATH_MSG_ERROR(" More than "<<MAX_SYM_CELLS<<" number of symmetric cells... Fix array size for ntuple writing !!!! ");
184 m_nsymcell=nsym;
185 m_first=false;
186 }
187
189 if (!eventInfo.isValid()) {
190 ATH_MSG_ERROR ("Could not retrieve EventInfo");
191 return StatusCode::FAILURE;
192 }
193 int channelNumber = eventInfo->mcChannelNumber();
194
195 m_nevt_total++;
196
197 double weight=1.;
198
199// Dataset ID for lowPt MinBias
200 if (channelNumber==m_datasetID_lowPt) {
201 weight = m_weight_lowPt;
202 m_n1+=1;
203 }
204// Dataset ID for highPt MinBias
205 else if (channelNumber==m_datasetID_highPt) {
206 weight = m_weight_highPt;
207 m_n2+=1;
208 }
209 else {
210 ATH_MSG_WARNING(" Neither low nor high Pt MinBias sample " << channelNumber << " set weight to 1.0 ");
211 weight=1.;
212 }
213
214
215 if ((m_nevt_total%100)==1) ATH_MSG_INFO(" ---- process event number " << m_nevt_total << " " << channelNumber << " weight " << weight);
216
217 for (int i=0;i<m_ncell;i++) m_eCell[i]=0.;
218
219 auto hitVectorHandles = m_larHitKeys.makeHandles(ctx);
220 for (auto & inputHits : hitVectorHandles) {
221 if (!inputHits.isValid()) {
222 ATH_MSG_ERROR("BAD HANDLE"); //FIXME improve error here
223 //return StatusCode::FAILURE;
224 continue;
225 }
226
227 for (const LArHit* hit : *inputHits)
228 {
229 Identifier hitCellID=hit->cellID();
230 double energy = hit->energy();
231 double time =hit->time();
232 Identifier cellID;
233 if(m_isSC){
234 cellID=m_scidtool->offlineToSuperCellID(hitCellID);
235 } else {
236 cellID=hitCellID;
237 }
238 int index = (int) (m_calo_id->calo_cell_hash(cellID));
239
240 if (index < m_ncell && index>=0 && std::fabs(time)<25.) {
241 m_eCell[index] += energy;
242 }
243
244 } // loop over hits in container
245 } // loop over containers
246
247 for (int i=0;i<m_ncell;i++) {
248 addCell(i,m_eCell[i],0.,weight);
249 }
250
251
252 return StatusCode::SUCCESS;
253 }
254
255 void LArMinBiasAlg::addCell(int index, double energy, double eshift, double weight)
256 {
257 if (index < m_ncell && index>=0) {
258 int index2= m_symCellIndex[index];
259 if (index2<0) return;
260 if (index2 >= ((int)(m_CellList.size())) ) {
261 ATH_MSG_INFO(" LArMinBiasAlg::addCell: for " << index << ", " << index2 << " is out-of bounds for list of size " << m_CellList.size());
262 return;
263 }
264 double oldN = m_CellList[index2].nevt;
265 double oldAverage = m_CellList[index2].average;
266 double oldRMS = m_CellList[index2].rms;
267 double oldAverage2 = m_CellList[index2].offset;
268
269 double frac = oldN/(weight+oldN);
270 double Anew = weight+oldN;
271 double newAverage = frac*oldAverage + weight*energy/Anew;
272 double deltaE = energy-newAverage;
273 double newRMS = frac*(oldRMS + (newAverage-oldAverage)*(newAverage-oldAverage)) + weight*deltaE*deltaE/Anew;
274
275 double newAverage2 = frac*oldAverage2 + weight*eshift/Anew;
276
277 m_CellList[index2].nevt = Anew;
278 m_CellList[index2].average = newAverage;
279 m_CellList[index2].rms = newRMS;
280 m_CellList[index2].offset = newAverage2;
281
282 }
283 }
284
286 {
287
288 ATH_MSG_INFO(" in fillNtuple " << m_nsymcell);
289 for (int i=0;i<m_nsymcell;i++) {
290 m_identifier[i] = m_CellList[i].identifier.get_identifier32().get_compact();
291 m_layer[i] = m_CellList[i].layer;
292 m_region[i] = m_CellList[i].region;
293 m_ieta[i] = m_CellList[i].ieta;
294 m_eta[i] = m_CellList[i].eta;
295 m_phi[i] = m_CellList[i].phi;
296 m_nevt[i] = m_CellList[i].nevt;
297 m_offset[i] = (float) (m_CellList[i].offset);
298 m_average[i] = (float) (m_CellList[i].average);
299 m_rms[i] = (float) (std::sqrt(m_CellList[i].rms));
300 }
301 m_tree->Fill();
302 ATH_MSG_INFO(" after tree fill ");
303
304 for (int i=0;i<m_nsymcell;i++) {
305 m_CellList[i].nevt=0;
306 m_CellList[i].offset=0.;
307 m_CellList[i].average=0;
308 m_CellList[i].rms=0;
309 }
310 ATH_MSG_INFO(" end of fillNtuple ");
311
312 }
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
Helper class for offline supercell identifiers.
#define MAX_SYM_CELLS
AthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor.
const ServiceHandle< StoreGateSvc > & detStore() const
Helper base class for offline cell identifiers.
This class groups all DetDescr information related to a CaloCell.
const CaloDetDescrElement * get_element(const Identifier &cellId) const
get element by its identifier
This class initializes the Calo (LAr and Tile) offline identifiers.
value_type get_compact() const
Get the compact id.
This is a "hash" representation of an Identifier.
Identifier32 get_identifier32() const
Get the 32-bit version Identifier, will be invalid if >32 bits needed.
Class to store hit energy and time in LAr cell from G4 simulation.
Definition LArHit.h:25
std::vector< CellInfo > m_CellList
double m_average[MAX_SYM_CELLS]
virtual StatusCode initialize() override
Gaudi::Property< int > m_datasetID_lowPt
SG::ReadHandleKey< xAOD::EventInfo > m_eventInfoKey
double m_rms[MAX_SYM_CELLS]
SG::ReadHandleKeyArray< LArHitContainer > m_larHitKeys
SG::ReadCondHandleKey< LArOnOffIdMapping > m_cablingKey
double m_offset[MAX_SYM_CELLS]
int m_region[MAX_SYM_CELLS]
std::vector< int > m_symCellIndex
double m_nevt[MAX_SYM_CELLS]
Gaudi::Property< double > m_weight_lowPt
Gaudi::Property< int > m_datasetID_highPt
int m_layer[MAX_SYM_CELLS]
SG::ReadCondHandleKey< CaloDetDescrManager > m_caloMgrKey
ToolHandle< ICaloSuperCellIDTool > m_scidtool
StringArrayProperty m_inputKeys
SG::ReadCondHandleKey< LArMCSym > m_mcSymKey
std::vector< double > m_eCell
float m_eta[MAX_SYM_CELLS]
virtual StatusCode stop() override
virtual StatusCode execute(const EventContext &ctx) override
Execute method.
BooleanProperty m_isSC
const CaloCell_Base_ID * m_calo_id
LArMinBiasAlg(const std::string &name, ISvcLocator *pSvcLocator)
Standard Athena-Algorithm Constructor.
Gaudi::Property< double > m_weight_highPt
~LArMinBiasAlg()
Default Destructor.
float m_phi[MAX_SYM_CELLS]
ServiceHandle< ITHistSvc > m_thistSvc
SG::ReadCondHandleKey< CaloSuperCellDetDescrManager > m_caloSCMgrKey
void addCell(int index, double e1, double e2, double wt=1.)
int m_ieta[MAX_SYM_CELLS]
int m_identifier[MAX_SYM_CELLS]
virtual bool isValid() override final
Can the handle be successfully dereferenced?
Definition index.py:1