ATLAS Offline Software
Loading...
Searching...
No Matches
TileTOFTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3*/
4
6
8
9#include "TileTOFTool.h"
11#include "TileEvent/TileCell.h"
13
14#include <cmath>
15#include "TFile.h"
16#include "TTree.h"
17#include "TF1.h"
18
20
21TileTOFTool::TileTOFTool(const std::string& type, const std::string& name, const IInterface* pParent )
22 : AthAlgTool( type, name, pParent ),
23 m_tileID(nullptr),
24 m_LBA_LBC(),
25 m_LBA_EBA(),
26 m_LBC_EBC(),
27 m_Nlbc(),
28 m_Neba(),
29 m_Nebc(),
30 m_LA_EA(0),
31 m_LA_LC(0),
32 m_LA_EC(0)
33{
34 declareInterface<ITileCalibTool>( this );
35
36 m_timeCor = new float[4][64]();
37 m_tcor = new float[4][32][32]();
38 m_nPair = new int[4][32][32]();
39}
40
42
43 delete[] m_timeCor;
44 delete[] m_tcor;
45 delete[] m_nPair;
46
47}
48
50
52{
53 ATH_MSG_INFO ( "initialize()" );
54
55 ATH_CHECK( m_caloCellContainerKey.initialize() );
56
57 return StatusCode::SUCCESS;
58}
59
60StatusCode TileTOFTool::initNtuple(int runNumber, int runType, TFile * rootFile )
61{
62 ATH_MSG_INFO ( "initializeNtuple(" << runNumber << "," << runType << "," << rootFile << ")" );
63 return StatusCode::SUCCESS;
64}
65
67{
68 ATH_MSG_INFO ( "execute()" );
69
71 ATH_CHECK( cellCONT.isValid() );
72 ATH_MSG_DEBUG ( "Cell container found" );
73
74 CaloCellContainer::const_iterator iCell = cellCONT->begin();
75 CaloCellContainer::const_iterator lastCell = cellCONT->end();
76
77 ATH_CHECK( detStore()->retrieve(m_tileID) );
78
79 int n = 0;
80 double x[20] = {0};
81 double y[20] = {0};
82 double z[20] = {0};
83 double t[20] = {0};
84 int part[20] = {0};
85 int mod[20] = {0};
86
87 int section;
88 int side;
89
90 for( ; iCell != lastCell; ++iCell) // loop over Calo cells
91 {
92 const CaloCell* cell_ptr = *iCell; // pointer to cell object
93
94 if ( m_tileID->is_tile(cell_ptr->ID()) )
95 {
96 const TileCell* tile_cell = dynamic_cast<const TileCell*> (cell_ptr);
97
98 if ((tile_cell!=nullptr)&&((tile_cell->ene1())>150.)&&((tile_cell->ene2())>150.)&&((tile_cell->energy())<5000.)&&(fabs(tile_cell->timeDiff())<3.5)&&(fabs(tile_cell->time())>0.00000001)) // cut to select TileCal cells crossed by muons
99 {
100 Identifier id = tile_cell->ID();
101
102 x[n] = tile_cell->x();
103 y[n] = tile_cell->y();
104 z[n] = tile_cell->z();
105 t[n] = tile_cell->time();
106 mod[n] = m_tileID->module(id);
107
108 section = m_tileID->section(id);
109 side = m_tileID->side(id);
110
111 if((section == 2 || section ==3) && side == 1){part[n] = 0;} //EBA
112 else if(section == 1 && side == 1){part[n] = 1;} //LBA
113 else if(section == 1 && side == -1){part[n] = 2;} //LBC
114 else if((section == 2 || section ==3) && side == -1){part[n] = 3;} //EBC
115 n++;
116 if(n==9){break;} // events with air showers not considered
117 }
118 }
119 }
120
121// calculate a matrix for each partition with the time offset of each module at the bottom side of TileCal wrt each module at the bottom
122
123//function to calculate difference between measured time and expected TOF of the muon
124#define TIMECOR(MOD_REF1, MOD_REF2, PART_REF1, PART_REF2, COUNT, TCOR) \
125 do { \
126 if (mod[i]==MOD_REF1 && mod[j]==MOD_REF2 && \
127 part[i]==PART_REF1 && part[j]==PART_REF2) { \
128 float TOF = sqrt(((x[j]-x[i])*(x[j]-x[i]))+((y[j]-y[i])*(y[j]-y[i]))+((z[j]-z[i])*(z[j]-z[i])))/299.792; \
129 float tc = t[j]-t[i]-TOF; \
130 ++COUNT; \
131 TCOR += tc; \
132 } \
133 } while(0)
134
135
136 if(n<9){
137 for(int i=0; i<n; i++) {
138 for(int j=0; j<n; j++) {
139 for(int s=0; s<4; s++) {
140 for(int k=0; k<32; k++) {
141 for(int l=0; l<32; l++) {
142 TIMECOR(k,l+32,s,s, m_nPair[s][k][l], m_tcor[s][k][l]);
143 }
144 }
145 }
146
147 for(int s=0; s<4; s++){
148 TIMECOR(15,s+46,1,0, m_Neba[s], m_LBA_EBA[s]);
149 TIMECOR(15,s+46,1,2, m_Nlbc[s], m_LBA_LBC[s]);
150 TIMECOR(15,s+46,2,3, m_Nebc[s], m_LBC_EBC[s]);
151 }
152 }
153 }
154 }
155
156 return StatusCode::SUCCESS;
157}
158
160{
161 ATH_MSG_INFO ( "finalizeCalculations()" );
162
163// finalize calculation of the matrix
164
165 for(int s=0; s<4; s++) {
166 for(int k=0; k<32; k++) {
167 for(int l=0; l<32; l++) {
168 if(m_nPair[s][k][l]!=0) {
169 m_tcor[s][k][l] = m_tcor[s][k][l]/m_nPair[s][k][l];
170 }
171 }
172 }}
173
174
175// Offsets between different partitions
176
177 int p0 = 0, p2 = 0, p3 = 0;
178 m_LA_EA = 0.;
179 m_LA_LC = 0.;
180 m_LA_EC = 0.;
181
182 for(int s=0; s<4; s++){
183 if(m_Neba[s]!=0) {
184 m_LBA_EBA[s] = m_LBA_EBA[s]/m_Neba[s];
185 if(m_nPair[0][15][s+14]>5) {
186 m_LA_EA = m_LA_EA + m_tcor[0][15][s+14] - m_LBA_EBA[s];
187 p0++;
188 }
189 }
190
191 if(m_Nlbc[s]!=0) {
192 m_LBA_LBC[s] = m_LBA_LBC[s]/m_Nlbc[s];
193 if(m_nPair[2][15][s+14]>5) {
194 m_LA_LC = m_LA_LC + m_tcor[2][15][s+14] - m_LBA_LBC[s];
195 p2++;
196 }
197 }
198
199 if(m_Nebc[s]!=0) {
200 m_LBC_EBC[s] = m_LBC_EBC[s]/m_Nlbc[s];
201 if(m_nPair[2][15][s+14]>5) {
202 m_LA_EC = m_LA_EC + m_LA_LC + m_tcor[3][15][s+14] - m_LBC_EBC[s];
203 p3++;
204 }
205 }
206 }
207
208 if(p0 != 0){m_LA_EA = m_LA_EA/p0; }
209 if(p2 != 0){m_LA_LC = m_LA_LC/p2; }
210 if(p3 != 0){m_LA_EC = m_LA_EC/p3; }
211
212// Calculation of time offsets wrt module 16 of each partition
213
214 int n2[4][64] = {{0}};
215 memset( m_timeCor, 0, 2 * sizeof(*m_timeCor) );
216
217 for(int s=0; s<4; s++){
218
219 m_timeCor[s][15] = 0.; n2[s][15] = 1;
220
221 for(int k=12; k<20; k++) {
222 if(m_nPair[s][15][k]>5) {
223 m_timeCor[s][k+32] = -m_tcor[s][15][k];
224 n2[s][k+32]=1;
225 }
226 }
227
228// Path to calculate all time offsets for modules in region x > 0
229
230 for(int k=12; k<15; k++) {
231 for(int l=16; l<20; l++) {
232 if(m_nPair[s][k][l]>5) {
233 m_timeCor[s][k] += m_timeCor[s][l+32] + m_tcor[s][k][l];
234 n2[s][k]++;
235 }
236 }
237 if(n2[s][k]>0)
238 m_timeCor[s][k] /= n2[s][k];
239 }
240
241 for(int k=12; k<16; k++) {
242 for(int l=20; l<24; l++) {
243 if(m_nPair[s][k][l]>5) {
244 m_timeCor[s][l+32] += m_timeCor[s][k] - m_tcor[s][k][l];
245 n2[s][l+32]++;
246 }
247 }
248 }
249 for(int k=52; k<56; k++) {
250 if(n2[s][k]>0) {
251 m_timeCor[s][k] /= n2[s][k];
252 }
253 }
254
255 for(int k=8; k<12; k++) {
256 for(int l=20; l<24; l++) {
257 if(m_nPair[s][k][l]>5) {
258 m_timeCor[s][k] += m_timeCor[s][l+32] + m_tcor[s][k][l];
259 n2[s][k]++;
260 }
261 }
262 if(n2[s][k]>0)
263 m_timeCor[s][k] /= n2[s][k];
264 }
265
266 for(int k=8; k<12; k++) {
267 for(int l=24; l<28; l++) {
268 if(m_nPair[s][k][l]>5) {
269 m_timeCor[s][l+32] += m_timeCor[s][k] - m_tcor[s][k][l];
270 n2[s][l+32]++;
271 }
272 }
273 }
274 for(int k=56; k<60; k++) {
275 if(n2[s][k]>0) {
276 m_timeCor[s][k] /=n2[s][k];
277 }
278 }
279
280 for(int k=0; k<8; k++) {
281 for(int l=24; l<28; l++) {
282 if(m_nPair[s][k][l]>5) {
283 m_timeCor[s][k] += m_timeCor[s][l+32] + m_tcor[s][k][l];
284 n2[s][k]++;
285 }
286 }
287 if (n2[s][k]>0)
288 m_timeCor[s][k] /= n2[s][k];
289 }
290
291 for(int k=4; k<8; k++) {
292 for(int l=28; l<32; l++) {
293 if(m_nPair[s][k][l]>5) {
294 m_timeCor[s][l+32] += m_timeCor[s][k] - m_tcor[s][k][l];
295 n2[s][l+32]++;
296 }
297 }
298 }
299 for(int k=60; k<64; k++) {
300 if(n2[s][k]>0)
301 m_timeCor[s][k] /= n2[s][k];
302 }
303
304// Path to calculate all time offsets for modules in region x < 0
305
306 for(int k=16; k<20; k++) {
307 for(int l=12; l<16; l++) {
308 if(m_nPair[s][k][l]>5) {
309 m_timeCor[s][k] += m_timeCor[s][l+32] + m_tcor[s][k][l];
310 n2[s][k]++;
311 }
312 }
313 if(n2[s][k]>0)
314 m_timeCor[s][k] /= n2[s][k];
315 }
316
317 for(int k=16; k<20; k++) {
318 for(int l=8; l<12; l++) {
319 if(m_nPair[s][k][l]>5) {
320 m_timeCor[s][l+32] += m_timeCor[s][k] - m_tcor[s][k][l];
321 n2[s][l+32]++;
322 }
323 }
324 }
325 for(int k=40; k<44; k++) {
326 if(n2[s][k]>0)
327 m_timeCor[s][k] /= n2[s][k];
328 }
329
330 for(int k=20; k<24; k++){
331 for(int l=8; l<12; l++) {
332 if(m_nPair[s][k][l]>5) {
333 m_timeCor[s][k] += m_timeCor[s][l+32] + m_tcor[s][k][l];
334 n2[s][k]++;
335 }
336 }
337 if(n2[s][k]>0)
338 m_timeCor[s][k] /= n2[s][k];
339 }
340
341 for(int k=20; k<24; k++) {
342 for(int l=4; l<8; l++) {
343 if(m_nPair[s][k][l]>5) {
344 m_timeCor[s][l+32] += m_timeCor[s][k] - m_tcor[s][k][l];
345 n2[s][l+32]++;
346 }
347 }
348 }
349 for(int k=36; k<40; k++) {
350 if(n2[s][k]>0) {
351 m_timeCor[s][k] /= n2[s][k];
352 }
353 }
354
355 for(int k=24; k<32; k++) {
356 for(int l=4; l<8; l++) {
357 if(m_nPair[s][k][l]>5) {
358 m_timeCor[s][k] += m_timeCor[s][l+32] + m_tcor[s][k][l];
359 n2[s][k]++;
360 }
361 }
362 if(n2[s][k]>0)
363 m_timeCor[s][k] /= n2[s][k];
364 }
365
366 for(int k=24; k<28; k++) {
367 for(int l=0; l<4; l++) {
368 if(m_nPair[s][k][l]>5) {
369 m_timeCor[s][l+32] += m_timeCor[s][k] - m_tcor[s][k][l];
370 n2[s][l+32]++;
371 }
372 }
373 }
374 for(int k=32; k<36; k++) {
375 if(n2[s][k]>0)
376 m_timeCor[s][k] /= n2[s][k];
377 }
378
379 for(int l=0; l<64; l++) {
380 ATH_MSG_INFO ( "Partition: " << s << " Module: " << l+1 << " TimeCor: " << m_timeCor[s][l] << " n: " << n2[s][l] );
381 }
382 } //end of loop over different partitions
383
384 return StatusCode::SUCCESS;
385}
386
387StatusCode TileTOFTool::writeNtuple(int runNumber, int runType, TFile * rootFile)
388{
389 ATH_MSG_INFO ( "writeNtuple(" << runNumber << "," << runType << "," << rootFile << ")" );
390
391 TTree *t = new TTree("TOF", "TOF");
392 t->Branch("Time_Offset", m_timeCor, "Time_Offset[4][64]/F");
393 t->Branch("eba16_lba16", &m_LA_EA, "eba16_lba16/F");
394 t->Branch("lbc16_lba16", &m_LA_LC, "lbc16_lba16/F");
395 t->Branch("ebc16_lba16", &m_LA_EC, "ebc16_lba16/F");
396 t->Fill();
397 t->Write();
398
399 return StatusCode::SUCCESS;
400}
401
403{
404 ATH_MSG_INFO ( "finalize()" );
405 return StatusCode::SUCCESS;
406}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_INFO(x)
#define ATH_MSG_DEBUG(x)
Handle class for reading from StoreGate.
void section(const std::string &sec)
#define TIMECOR(MOD_REF1, MOD_REF2, PART_REF1, PART_REF2, COUNT, TCOR)
#define y
#define x
#define z
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
const ServiceHandle< StoreGateSvc > & detStore() const
Data object for each calorimeter readout cell.
Definition CaloCell.h:57
float time() const
get time (data member)
Definition CaloCell.h:368
double energy() const
get energy (data member)
Definition CaloCell.h:327
float y() const
get y (through CaloDetDescrElement)
Definition CaloCell.h:436
float z() const
get z (through CaloDetDescrElement)
Definition CaloCell.h:443
float x() const
get x (through CaloDetDescrElement)
Definition CaloCell.h:429
Identifier ID() const
get ID (from cached data member) non-virtual and inline for fast access
Definition CaloCell.h:295
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838
virtual bool isValid() override final
Can the handle be successfully dereferenced?
float ene1(void) const
get energy of first PMT
Definition TileCell.h:187
float timeDiff(void) const
get time diff for two PMTs (data member)
Definition TileCell.h:184
float ene2(void) const
get energy of second PMT
Definition TileCell.h:189
const TileID * m_tileID
Definition TileTOFTool.h:36
virtual StatusCode execute()
virtual StatusCode writeNtuple(int runNumber, int runType, TFile *rootfile)
virtual ~TileTOFTool()
SG::ReadHandleKey< CaloCellContainer > m_caloCellContainerKey
Definition TileTOFTool.h:40
int m_Nlbc[4]
Definition TileTOFTool.h:50
float m_LA_EC
Definition TileTOFTool.h:56
float(* m_tcor)[32][32]
Definition TileTOFTool.h:58
int m_Nebc[4]
Definition TileTOFTool.h:52
float m_LBA_LBC[4]
Definition TileTOFTool.h:47
virtual StatusCode initialize()
virtual StatusCode initNtuple(int runNumber, int runType, TFile *rootfile)
float m_LBC_EBC[4]
Definition TileTOFTool.h:49
TileTOFTool(const std::string &type, const std::string &name, const IInterface *pParent)
virtual StatusCode finalizeCalculations()
float m_LBA_EBA[4]
Definition TileTOFTool.h:48
int(* m_nPair)[32][32]
Definition TileTOFTool.h:59
float m_LA_LC
Definition TileTOFTool.h:55
virtual StatusCode finalize()
float(* m_timeCor)[64]
Definition TileTOFTool.h:45
float m_LA_EA
Definition TileTOFTool.h:54
int m_Neba[4]
Definition TileTOFTool.h:51