ATLAS Offline Software
Loading...
Searching...
No Matches
TileLaserDefaultCalibTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
5// Tile includes
11
12
13#include "GaudiKernel/MsgStream.h"
14#include "GaudiKernel/Service.h"
15#include "GaudiKernel/IToolSvc.h"
16#include "GaudiKernel/TypeNameString.h"
17#include "GaudiKernel/ThreadLocalContext.h"
18
21
22
23#include "TFile.h"
24#include "TTree.h"
25#include <cmath>
26#include <iostream>
27#include <mutex>
28
29/****************************************************/
30/* TileLaserDefaultCalibTool.cxx June 2017 */
31/* */
32/* Henric Wilkens, following work from Seb Viret and
33 Vincent Giangiobbe
34
35 Giulia Di Gregorio, following work from Henric
36 */
37/****************************************************/
38
39TileLaserDefaultCalibTool::TileLaserDefaultCalibTool(const std::string& type, const std::string& name,const IInterface* pParent):
40 AthAlgTool(type, name, pParent),
41 m_pisaMethod2(false),
42 m_isLaserCalib(false),
43 m_tileHWID(nullptr),
44 m_cabling(nullptr),
45 m_toolRunNo(0),
47 m_las_filter(0),
49 m_hrate(0),
50 m_flow(0),
51 m_head_temp(0),
52 m_las_time(0),
53 m_PMT(),
54 m_PMT_S(),
55 m_diode(),
56 m_diode_S(),
65 m_LASERII(0),
66 m_evtNr(0)
67{
68 declareInterface<ITileCalibTool>( this );
69 declareProperty("toolNtuple", m_toolNtuple="h3000");
70 declareProperty("pisaMethod2", m_pisaMethod2=true);
71 declareProperty("TileDQstatus", m_dqStatusKey = "TileDQstatus");
72
73 //creating multi-dim arrays on the heap and initialize all elements to zeros
78
81
82 m_PMT_LASERII = new float[NPMTS][NGAINS]();
83 m_PMT_S_LASERII = new float[NPMTS][NGAINS]();
85
86 m_diode_LASERII = new float[NDIODES][NGAINS]();
87 m_diode_S_LASERII = new float[NDIODES][NGAINS]();
89
91
92 m_diode_Ped_LASERII = new float[NDIODES+1][NGAINS]();
93 m_diode_Ped_S_LASERII = new float[NDIODES+1][NGAINS]();
94 m_diode_Alpha_LASERII = new float[NDIODES+1][NGAINS]();
95 m_diode_Alpha_S_LASERII = new float[NDIODES+1][NGAINS]();
96 m_diode_Led_LASERII = new float[NDIODES+1][NGAINS]();
97 m_diode_Led_S_LASERII = new float[NDIODES+1][NGAINS]();
98 m_PMT_Ped_LASERII = new float[NPMTS][NGAINS]();
99 m_PMT_Ped_S_LASERII = new float[NPMTS][NGAINS]();
100
110
111 m_meantime = new float[NPARTITIONS][NGAINS]();
112 m_time = new float[NPARTITIONS][NDRAWERS][NCHANNELS][NGAINS]();
113 m_time_S = new float[NPARTITIONS][NDRAWERS][NCHANNELS][NGAINS]();
114
115 m_mean = new float[NPARTITIONS][NDRAWERS][NCHANNELS][NGAINS]();
116 m_mean_S = new float[NPARTITIONS][NDRAWERS][NCHANNELS][NGAINS]();
120 m_kappa = new float[NPARTITIONS][NDRAWERS][NFIBERS][NGAINS]();
123 m_status = new short[NPARTITIONS][NDRAWERS][NCHANNELS][NGAINS]();
124 m_HV = new float[NPARTITIONS][NDRAWERS][NCHANNELS]();
125 m_HVSet = new float[NPARTITIONS][NDRAWERS][NCHANNELS]();
126
132
135 m_diode_ratio_low = new float[NDIODES][NDIODES]();
136 m_diode_ratio_high = new float[NDIODES][NDIODES]();
137
140
141
142} // TileLaserDefaultCalibTool::TileLaserDefaultCalibTool
143
145{
146 delete[] m_ratio_LASERII;
147 delete[] m_ratio_S_LASERII;
148 delete[] m_ratio_LASERII_good;
149 delete[] m_ratio_S_LASERII_good;
150 delete[] m_rs_ratio_LASERII;
152 delete[] m_PMT_LASERII;
153 delete[] m_PMT_S_LASERII;
155 delete[] m_diode_LASERII;
156 delete[] m_diode_S_LASERII;
159 delete[] m_diode_Ped_LASERII;
160 delete[] m_diode_Ped_S_LASERII;
161 delete[] m_diode_Alpha_LASERII;
163 delete[] m_diode_Led_LASERII;
164 delete[] m_diode_Led_S_LASERII;
165 delete[] m_PMT_Ped_LASERII;
166 delete[] m_PMT_Ped_S_LASERII;
167 delete[] m_ratio;
168 delete[] m_ratio_S;
169 delete[] m_ratio_good;
170 delete[] m_ratio_good_S;
171 delete[] m_pmt_ratios;
172 delete[] m_pmt_S_ratios;
173 delete[] m_rs_ratio;
174 delete[] m_rs_ratio_good;
175 delete[] m_rs_pmt_ratios;
176 delete[] m_meantime;
177 delete[] m_time;
178 delete[] m_time_S;
179 delete[] m_mean;
180 delete[] m_mean_S;
181 delete[] m_raw_mean;
182 delete[] m_raw_mean_S;
183 delete[] m_entries;
184 delete[] m_kappa;
185 delete[] m_mean_slice;
186 delete[] m_variance_slice;
187 delete[] m_status;
188 delete[] m_HV;
189 delete[] m_HVSet;
190 delete[] m_rs_meantime;
191 delete[] m_rs_time;
192 delete[] m_rs_signal;
193 delete[] m_rs_raw_signal;
194 delete[] m_rs_reducedKappa;
195 delete[] m_rs_diode_ratio_low;
196 delete[] m_rs_diode_ratio_high;
197 delete[] m_diode_ratio_low;
198 delete[] m_diode_ratio_high;
201
202}
203
204
206 // Reset local parameters and load necessary service
207 ATH_MSG_DEBUG ( "initialize() TileLaserDefaultCalibTool" );
208 m_evtNr = 0;
209 m_toolRunNo = 0;
210 m_ADC_problem = 0;
211 m_las_filter = 0;
212 m_las_requ_amp = 0;
213 m_hrate = 0;
214 m_flow = 0;
215 m_head_temp = 0;
216 m_las_time = 0;
217 m_PMT1_ADC_prev = 0;
218 m_PMT2_ADC_prev = 0;
219
220
221 // Loop over monitoring pmts laserii
222
223 for ( int diodei=0; diodei<NDIODES; diodei++ ) {
224 for ( int diodej=0; diodej<NDIODES; diodej++ ) {
225 m_rs_diode_ratio_low[diodei][diodej]= new RunningStat();
226 m_rs_diode_ratio_high [diodei][diodej]=new RunningStat();
227 m_diode_ratio_low [diodei][diodej]=0;
228 m_diode_ratio_high [diodei][diodej]=0;
229 m_diode_ratio_sigma_low [diodei][diodej]=0;
230 m_diode_ratio_sigma_high [diodei][diodej]=0;
231 }
232 }
233
234
235 for ( int diode=0; diode<NDIODES; ++diode ) {
236 for ( int gain=0; gain<NGAINS; gain++ ) {
237 m_diode_LASERII[diode][gain] = 0; // diode signal values
238 m_diode_S_LASERII[diode][gain] = 0;// Sigma of signal values
239 m_entries_diode_LASERII[diode][gain] = 0;
240 m_rs_diode_signal_LASERII[diode][gain] = new RunningStat();
241 }
242 }
243
244 for ( int diode=0; diode<NDIODES+1; ++diode ) {
245 for ( int gain=0; gain<NGAINS; gain++ ) {
246
247 m_diode_Ped_LASERII[diode][gain] = 0; // Corresponding pedestal values
248 m_diode_Ped_S_LASERII[diode][gain] = 0;// Sigma of pedestal values
249 m_diode_Alpha_LASERII[diode][gain] = 0; // Corresponding Alpha values
250 m_diode_Alpha_S_LASERII[diode][gain] = 0;// Sigma of Alpha values
251 m_diode_Led_LASERII[diode][gain] = 0; // Corresponding LED values
252 m_diode_Led_S_LASERII[diode][gain] = 0;// Sigma of LED values
253
254 }
255 }
256
257 for(int pmt=0;pmt<NPMTS;++pmt){
258 for ( int gain=0; gain<NGAINS; gain++ ) {
259 m_PMT_LASERII[pmt][gain] = 0;
260 m_PMT_S_LASERII[pmt][gain] = 0;
261 m_PMT_Ped_LASERII[pmt][gain] = 0; // Corresponding pedestal values
262 m_PMT_Ped_S_LASERII[pmt][gain] = 0;// Sigma of pedestal values
263
264 m_rs_PMT_signal_LASERII[pmt][gain] = new RunningStat();
265 }
266 // LASERI
267 m_PMT[pmt] = 0;
268 m_PMT_S[pmt] = 0;
269 m_rs_PMT_signal[pmt] = new RunningStat();
270 } // FOR
271
272 // LASERI
273 for(int d=0; d<NDIODES_LASER1; ++d){
274 m_diode[d] = 0;
275 m_diode_S[d] = 0;
276 m_diode_Ped[d] = 0;
277 m_diode_Alpha[d] = 0;
278 m_diode_SPed[d] = 0;
279 m_diode_SAlpha[d]= 0;
281 } // FOR
282
283 for ( int part=0; part<NPARTITIONS; ++part ) {
284 for ( int gain=0; gain<NGAINS; ++gain ) {
285 m_rs_meantime[part][gain] = new RunningStat();
286 m_meantime[part][gain] = 0.;
287 }
288
289 for ( int drawer=0; drawer<NDRAWERS; ++drawer ) {
290 for ( int gain=0; gain<NGAINS; ++gain ) {
291 for (int fiber=0; fiber<NFIBERS; ++fiber){
292 m_kappa[part][drawer][fiber][gain] = 0;
293 for (int pmt1=0; pmt1<NCOUPLES-1; ++pmt1){
294 for (int pmt2=pmt1+1; pmt2<NCOUPLES; ++pmt2){
295 m_rs_reducedKappa[part][drawer][pmt1][pmt2][gain][fiber] = new RunningStat();
296 }
297 }
298 }
299
300 for ( int channel=0; channel<NCHANNELS; ++channel ) {
301 m_rs_time[part][drawer][channel][gain] = new RunningStat();
302 m_rs_signal[part][drawer][channel][gain] = new RunningStat();
303 m_rs_raw_signal[part][drawer][channel][gain] = new RunningStat();
304
305 m_time[part][drawer][channel][gain] = 0;
306 m_time_S[part][drawer][channel][gain] = 0;
307
308 m_mean[part][drawer][channel][gain] = 0;
309 m_mean_S[part][drawer][channel][gain] = 0;
310 m_raw_mean[part][drawer][channel][gain] = 0;
311 m_raw_mean_S[part][drawer][channel][gain] = 0;
312
313 for ( int iSlice=0; iSlice<NSLICES; ++iSlice ) {
314 m_mean_slice[part][drawer][channel][iSlice][gain] = 0;
315 m_variance_slice[part][drawer][channel][iSlice][gain] = 0;
316 } // FOR
317
318 // LASERII
319 for(int diode=0; diode<NDIODES; ++diode){
320 for (int diode_gain=0; diode_gain<NGAINS; diode_gain++) {
321 m_rs_ratio_LASERII[diode][diode_gain][part][drawer][channel][gain] = new RunningStat();
322 m_rs_ratio_LASERII_good[diode][diode_gain][part][drawer][channel][gain] = new RunningStat();
323 }
324 } // FOR
325
326 m_rs_pmt_ratios[part][drawer][channel][gain] = new RunningStat();
327 m_pmt_ratios[part][drawer][channel][gain] = 0;
328 m_pmt_S_ratios[part][drawer][channel][gain] = 0;
329
330 // LASERI
331 for(int d=0; d<NDIODES_LASER1; ++d){
332 m_rs_ratio[d][part][drawer][channel][gain] = new RunningStat();
333 m_ratio[d][part][drawer][channel][gain] = 0;
334 m_ratio_S[d][part][drawer][channel][gain] = 0;
335 m_rs_ratio_good[d][part][drawer][channel][gain] = new RunningStat();
336 m_ratio_good[d][part][drawer][channel][gain] = 0;
337 m_ratio_good_S[d][part][drawer][channel][gain] = 0;
338 } // FOR
339
340 m_entries[part][drawer][channel][gain] = 0;
341
342 m_HV[part][drawer][channel] = 0.;
343 m_HVSet[part][drawer][channel] = 0.;
344
345 } // channel loop
346 } // gain loop
347 } // drawer loop
348 } // partition loop
349
350 ATH_CHECK( detStore()->retrieve(m_tileHWID) );
351 ATH_CHECK( m_tileToolEmscale.retrieve() );
352 ATH_CHECK( m_tileBadChanTool.retrieve() );
353
354 ATH_CHECK( m_rawChannelContainerKey.initialize() );
355 ATH_CHECK( m_laserContainerKey.initialize() );
356
357 ATH_CHECK( m_tileDCS.retrieve() );
358
359 ATH_CHECK( m_dqStatusKey.initialize() );
360
361 return StatusCode::SUCCESS;
362}
363
364
365StatusCode TileLaserDefaultCalibTool::initNtuple(int runNumber, int runType, TFile * rootFile){
366 ATH_MSG_INFO ( "initialize(" << runNumber << "," << runType << "," << rootFile << ")" );
367 return StatusCode::SUCCESS;
368} // INITNTUPLE
369
370
372 const EventContext& ctx = Gaudi::Hive::currentContext();
373 const TileDQstatus* dqStatus = SG::makeHandle (m_dqStatusKey, ctx).get();
374
375 const char* text[NGAINS] = {"LG DIODE ","HG DIODE "};
376 ++m_evtNr; // Increment event number
377 ATH_MSG_DEBUG ( "Event counter: " << m_evtNr );
378
379 // Store laser object and rawchannel information into maps
380 ATH_MSG_DEBUG ( "execute() TileLaserDefaultCalibTool" );
381
384
385 ATH_CHECK( rawCnt.isValid() );
386 ATH_CHECK( laserObj.isValid() );
387
388
389 m_LASERII = laserObj->isLASERII();
390
391 if(m_LASERII) ATH_MSG_DEBUG ( "LaserII version is " << laserObj->getVersion() << " DAQ Type = " << laserObj->getDaqType() );
392 else ATH_MSG_DEBUG ( "LaserI version is " << laserObj->getVersion() << " DAQ Type = " << laserObj->getDaqType() );
393
394 const uint32_t *cispar = dqStatus->cispar();
395
396 m_las_time = static_cast<double>(cispar[10])+static_cast<double>(cispar[11])/1000000;
397
398 // Retrieve laser information
399 if(laserObj->getDiodeCurrOrd() == 0 || laserObj->getFiltNumber() == 0 || laserObj->getQDCTimeout()){
400 ATH_MSG_ERROR ( "No filter number or diode current: wheel moving or QDC timeout" );
401 return StatusCode::SUCCESS; // This is expected for some events
402 } // IF
403
404 float normalization[NDIODES][NGAINS];
405 //coverity[STACK_USE]
406 float pmt_values[NPARTITIONS][NDRAWERS][NCHANNELS][NGAINS];
407 for (int part=0; part<NPARTITIONS; part++){
408 for (int draw=0; draw<NDRAWERS; draw++){
409 for (int chan=0; chan<NCHANNELS; chan++){
410 for (int gain=0; gain<NGAINS; gain++) {
411 pmt_values[part][draw][chan][gain]=0.;
412 }
413 }
414 }
415 }
416
417 static std::once_flag flag; // Do only once
418 std::call_once(flag, [&]() {
419 for ( int part=0; part<NPARTITIONS; ++part ) {
420 int ros = part+1;
421 for ( int drawer=0; drawer<NDRAWERS; ++drawer ) {
422 unsigned int drawerIdx = TileCalibUtils::getDrawerIdx(ros,drawer);
423 for ( int channel=0; channel<NCHANNELS; ++channel ) {
424 if ( dqStatus->isChEmpty(ros,drawer,channel) ) { // Check whether channel is connected
425 continue;
426 }
427 for ( int gain=0; gain<NGAINS; ++gain ) {
428 short status = m_tileBadChanTool->encodeStatus(m_tileBadChanTool->getAdcStatus(drawerIdx, channel, gain)) ;
429 /* --- Status of the channel in DB
430
431 0 = isGood()
432 1 = isNoisy() : Large HF noise; Correlated noise; Large LF noise;
433 0x2 = isAffected() : ?
434 0x4 = isBad() : ADC masked (unspecified); ADC dead; Very large HF noise; No data;
435 Wrong DSP configuration; Severe stuck bit; Severe data corruption;
436 Channel masked (unspecified); No PMT connected;No HV; Wrong HV;
437 0x8 = Unknown ?!
438
439 0x10 = bad ADC, masked on the fly
440
441 Later we will add the transiant quality flags ---- */
442 if (status)
443 m_status[part][drawer][channel][gain] = 1 << (status-1);
444 }
445 }
446 }
447 }
448 });
449
450 if ( m_LASERII ) { // LASERII
451 // We need to have pedestals
452
453 if ( ! (m_have_pedestals && m_have_alpha && m_have_led ) ) {
454 ATH_MSG_DEBUG ( "Calib type " << laserObj->getCalibType() << m_have_pedestals << m_have_alpha <<m_have_led<<m_have_linearity<<m_have_laser);
455 switch ( laserObj->getCalibType() ) {
456
458 if ( laserObj->isSet(0, 0, TileLaserObject::calibType::Pedestal0) ) { // Pedestal are set
459 for ( int diode=0; diode<NDIODES; ++diode ) {
460 for ( int gain=0; gain<NGAINS; gain++ ) {
461 m_diode_Ped_LASERII[diode][gain] = laserObj->getMean(diode, gain, TileLaserObject::calibType::Pedestal0);
462 m_diode_Ped_S_LASERII[diode][gain] = laserObj->getSigma(diode, gain, TileLaserObject::calibType::Pedestal0);
463 }
464 }
465
466 // PMT0 is in position 10
467 for ( int gain=0; gain<NGAINS; gain++ ) {
468 m_PMT_Ped_LASERII[0][gain] = laserObj->getMean(10, gain, TileLaserObject::calibType::Pedestal0);
469 m_PMT_Ped_S_LASERII[0][gain] = laserObj->getSigma(10, gain, TileLaserObject::calibType::Pedestal0);
470 }
471
472 // PMT1 is in position 14
473 for ( int gain=0; gain<NGAINS; gain++ ) {
474 m_PMT_Ped_LASERII[1][gain] = laserObj->getMean(14, gain, TileLaserObject::calibType::Pedestal0);
475 m_PMT_Ped_S_LASERII[1][gain] = laserObj->getSigma(14, gain, TileLaserObject::calibType::Pedestal0);
476 }
477
478 // PHOCAL is in position 13
479 for ( int gain=0; gain<NGAINS; gain++ ) {
480 m_diode_Ped_LASERII[NDIODES][gain] = laserObj->getMean(13, gain, TileLaserObject::calibType::Pedestal0);
481 m_diode_Ped_S_LASERII[NDIODES][gain] = laserObj->getSigma(13, gain, TileLaserObject::calibType::Pedestal0);
482 }
484 }
485 break;
486
488 break;
489
491 if ( laserObj->isSet(0, 0, TileLaserObject::calibType::Alpha) ) { // Alpha are set
492 for ( int diode=0; diode<NDIODES; ++diode ) {
493 for ( int gain=0; gain<NGAINS; gain++ ) {
494 m_diode_Alpha_LASERII[diode][gain] = laserObj->getMean(diode, gain, TileLaserObject::calibType::Alpha);
495 m_diode_Alpha_S_LASERII[diode][gain] = laserObj->getSigma(diode, gain, TileLaserObject::calibType::Alpha);
496 }
497 }
498 // PHOCAL
499 for ( int gain=0; gain<NGAINS; gain++ ) {
500 m_diode_Alpha_LASERII[NDIODES][gain] = laserObj->getMean(13, gain, TileLaserObject::calibType::Alpha);
501 m_diode_Alpha_S_LASERII[NDIODES][gain] = laserObj->getSigma(13, gain, TileLaserObject::calibType::Alpha);
502 }
503 m_have_alpha = 1;
504 }
505 break;
506
508 if ( laserObj->isSet(0, 0, TileLaserObject::calibType::LED) ) { // LED are set
509 for ( int diode=0; diode<NDIODES; ++diode ) {
510 for ( int gain=0; gain<NGAINS; gain++ ) {
511 m_diode_Led_LASERII[diode][gain] = laserObj->getMean(diode, gain, TileLaserObject::calibType::LED);
512 m_diode_Led_S_LASERII[diode][gain] = laserObj->getSigma(diode, gain, TileLaserObject::calibType::LED);
513 }
514 //PHOCAL
515 for ( int gain=0; gain<NGAINS; gain++ ) {
516 m_diode_Led_LASERII[NDIODES][gain] = laserObj->getMean(13, gain, TileLaserObject::calibType::LED);
517 m_diode_Led_S_LASERII[NDIODES][gain] = laserObj->getSigma(13, gain, TileLaserObject::calibType::LED);
518 }
519 }
520 m_have_led = 1;
521 }
522 break;
523
524 default:
525 ATH_MSG_ERROR ("Got an invalid calibration type from LaserObject" );
526 return StatusCode::SUCCESS; // We can't do anything yet
527 break;
528 }
529 }
530
531 if (! m_have_pedestals) return StatusCode::SUCCESS; // We can't do anything yet
532
533 // Now we have pedestals, start accumulating the Diode responses
534 for ( int diode=0; diode<NDIODES; ++diode ) {
535 for ( int gain=0; gain<NGAINS; gain++ ) {
536 ATH_MSG_DEBUG ( text[gain] << diode << " PED= "
537 << m_diode_Ped_LASERII[diode][gain] << "+/-" << m_diode_Ped_S_LASERII[diode][gain]
538 << " ( " << laserObj->isSet(diode, gain, 0) << " ) "
539 );
540
541 m_rs_diode_signal_LASERII[diode][gain]->Push( laserObj->getDiodeADC(diode,gain) -
542 m_diode_Ped_LASERII[diode][gain]);
543 normalization[diode][gain] = ((float)laserObj->getDiodeADC(diode,gain)-m_diode_Ped_LASERII[diode][gain]);
544 ATH_MSG_DEBUG ( text[gain] << diode << " Signal=" << normalization[diode][gain] << " " << m_rs_diode_signal_LASERII[diode][gain]->Mean() << " " << laserObj->getDiodeADC(diode,gain) << " Ped="<< m_diode_Ped_LASERII[diode][gain] );
545 }
546 }
547 for ( int gain=0; gain<NGAINS; ++gain ) {
548 for ( int diodei=0; diodei<NDIODES; diodei++ ) {
549 for ( int diodej=0; diodej<NDIODES; diodej++ ) {
550 if (diodej>=diodei){
551 if (gain==0){m_rs_diode_ratio_low[diodei][diodej]->Push(normalization[diodei][gain]/normalization[diodej][gain]);}
552 if (gain==1){m_rs_diode_ratio_high[diodei][diodej]->Push(normalization[diodei][gain]/normalization[diodej][gain]);}
553 }
554 }
555 }
556 }
557 // And also the PMT responses
558 for (int pmt=0; pmt<NPMTS; pmt++ ) {
559 for ( int gain=0; gain<NGAINS; gain++ ) {
560 m_rs_PMT_signal_LASERII[pmt][gain]->Push(laserObj->getPMADC(pmt,gain)-m_PMT_Ped_LASERII[pmt][gain]);
561 }
562 }
563
564 } else { // laserI
565
566 for(int d=0; d<NDIODES_LASER1; ++d){
567 m_rs_diode_signal[d]->Push(laserObj->getDiodeADC(d,0)-laserObj->getDiodePedestal(d,0));
568 }
569
570 for(int pmt=0; pmt<NPMTS; pmt++){
571 m_rs_PMT_signal[pmt]->Push(laserObj->getPMADC(pmt,0)-laserObj->getPMPedestal(pmt,0));
572 }
573
574 // Check that adc information has been sent
575 if(laserObj->getPMADC(0,0) == m_PMT1_ADC_prev &&
576 laserObj->getPMADC(1,0) == m_PMT2_ADC_prev ){
577 m_ADC_problem = 1;
578 ATH_MSG_WARNING ( "There is perhaps an ADC problem with this event" );
579 } // IF
580
581 m_PMT1_ADC_prev = laserObj->getPMADC(0,0); // LG
582 m_PMT2_ADC_prev = laserObj->getPMADC(1,0); // LG
583
584 for(int d=0; d<NDIODES_LASER1; ++d){
585 m_diode_Ped[d] = laserObj->getDiodePedestal(d,0);
586 m_diode_SPed[d] = laserObj->getDiodeSigmaPedestal(d,0);
587 m_diode_Alpha[d] = laserObj->getAlpha(d,0);
588 m_diode_SAlpha[d] = laserObj->getSigmaAlpha(d,0);
589 }
590
591 }
592
593 // Next parameters are constants, don't need to update them more than once
594 if(m_las_filter == 0){
595 m_las_filter = laserObj->getFiltNumber();
596 m_hrate = laserObj->getHumidity();
597 m_flow = laserObj->getGasFlux();
598 m_head_temp = laserObj->getPumpDiodeTemp();
599 m_las_requ_amp = laserObj->getDiodeCurrOrd();
600 } // IF
601
602 double Q1Q2[NCOUPLES-1][NCOUPLES];
603 for (int pmt1=0; pmt1<NCOUPLES-1; ++pmt1){
604 for (int pmt2=0; pmt2<NCOUPLES; ++pmt2){
605 Q1Q2[pmt1][pmt2]=0.;
606 }
607 }
608 //int currentDrawer=0;
609
610 RunningStat* avg_time[NPARTITIONS][NGAINS];
611 for(int part=0; part<NPARTITIONS; part++){
612 for(int gain=0;gain<NGAINS;++gain){
613 avg_time[part][gain] = new RunningStat();
614 }
615 }
616 /*
617 Iterator over rawchannelcontainer
618 */
619 TileRawChannelUnit::UNIT RChUnit = rawCnt->get_unit();
621 TileRawChannelContainer::const_iterator itCollEnd = rawCnt->end();
622
623 for ( itColl=rawCnt->begin(); itColl != itCollEnd; ++itColl ) { // Loop over tilerawchannelcollections to get avg time per partition
624 HWIdentifier drawer_id = m_tileHWID->drawer_id((*itColl)->identify());
625 int part = m_tileHWID->ros(drawer_id)-1; // LBA=0 LBC=1 EBA=2 EBC=3
626 // Loop over tilerawchannels in collection
627 for ( TileRawChannelCollection::const_iterator it = (*itColl)->begin(); it != (*itColl)->end(); ++it ) {
628 HWIdentifier hwid=(*it)->adc_HWID();
629 int gain = m_tileHWID->adc(hwid); // low=0 high=1
630 float ofctime = (*it)->time();
631 if(ofctime!=0.0 and std::abs(ofctime-15.0)<30.)
632 avg_time[part][gain]->Push(ofctime);
633 }
634 } // Now we have the average time per partition for this event
635
636 for ( itColl=rawCnt->begin(); itColl != itCollEnd; ++itColl ) { // Loop over tilerawchannelcollections
637 HWIdentifier drawer_id = m_tileHWID->drawer_id((*itColl)->identify());
638 int ros = m_tileHWID->ros(drawer_id); // LBA=0 LBC=1 EBA=2 EBC=3
639 int part = ros-1;
640 int drawer = m_tileHWID->drawer(drawer_id); // 0 to 63
641 unsigned int drawerIdx = TileCalibUtils::getDrawerIdx(ros,drawer);
642
643 // Loop over tilerawchannels in collection
644 for ( TileRawChannelCollection::const_iterator it = (*itColl)->begin(); it != (*itColl)->end(); ++it ) {
645 // Get adchash
646 HWIdentifier hwid = (*it)->adc_HWID();
647 int chan = m_tileHWID->channel(hwid); // 0 to 47 channel
648 int gain = m_tileHWID->adc(hwid); // low=0 high=1
649 float amp = (*it)->amplitude();
650 float ofctime = (*it)->time();
651 float ped = (*it)->pedestal();
652 bool is_good = true;
653
654 if(ofctime!=0.0) ofctime -= avg_time[part][gain]->Mean();
655
656 if ( dqStatus->isChEmpty(ros,drawer,chan) ) { // Check whether channel is connected
657 m_status[part][drawer][chan][0] = -1;
658 m_status[part][drawer][chan][1] = -1;
659 continue; // Nothing to be seen here
660 }
661
662 if ( !dqStatus->isAdcDQgood(ros,drawer,chan,gain) ) { // Masked on the fly
663 m_status[part][drawer][chan][gain] |= 0x10;
664 is_good = false;
665 }
666
667 int problem = int(ped + 500.)/10000;
668
669 switch (problem) {
670 case 1: // Underflow
671 m_status[part][drawer][chan][gain] |= 0x100;
672 is_good = false;
673 break;
674 case 2: // Overflow
675 m_status[part][drawer][chan][gain] |= 0x200;
676 is_good = false;
677 break;
678 case 3: // Under and Overflow
679 m_status[part][drawer][chan][gain] |= 0x400;
680 is_good = false;
681 break;
682 case 4: // Constant signal
683 m_status[part][drawer][chan][gain] |= 0x800;
684 is_good = false;
685 break;
686 case 8: // Underflow in all channels
687 m_status[part][drawer][chan][gain] |= 0x1000;
688 is_good = false;
689 break;
690 case 9: // Overflow in all channels
691 m_status[part][drawer][chan][gain] |= 0x2000;
692 is_good = false;
693 break;
694 }
695
696 float ampInPicoCoulombs = m_tileToolEmscale->channelCalib(drawerIdx, chan, gain, amp, RChUnit, TileRawChannelUnit::PicoCoulombs);
697
698 m_rs_time[part][drawer][chan][gain]->Push(ofctime);
699 m_rs_signal[part][drawer][chan][gain]->Push(ampInPicoCoulombs);
700 m_rs_raw_signal[part][drawer][chan][gain]->Push(amp);
701
702 if ( m_LASERII ) {
703 for(int diode=0; diode<NDIODES; ++diode){
704 for ( int diode_gain=0; diode_gain<NGAINS; diode_gain++ ) { // MONITORING DIODES
705 if ( normalization[diode][diode_gain]!=0. ){
706 if (is_good) m_rs_ratio_LASERII_good[diode][diode_gain][part][drawer][chan][gain]->Push( ampInPicoCoulombs/normalization[diode][diode_gain] );
707 m_rs_ratio_LASERII[diode][diode_gain][part][drawer][chan][gain]->Push( ampInPicoCoulombs/normalization[diode][diode_gain] );
708 }
709 } // Diode Gains
710 } // Diodes
711 if (is_good) m_entries[part][drawer][chan][gain]++;
712 } else {
713 for(int i=0; i<NDIODES_LASER1; ++i){
714 if((laserObj->getDiodeADC(i,0)-laserObj->getDiodePedestal(i,0)) != 0) {
715 if (is_good) m_rs_ratio_good[i][part][drawer][chan][gain]->Push(ampInPicoCoulombs/(laserObj->getDiodeADC(i,0)-laserObj->getDiodePedestal(i,0)));
716 m_rs_ratio[i][part][drawer][chan][gain]->Push(ampInPicoCoulombs/(laserObj->getDiodeADC(i,0)-laserObj->getDiodePedestal(i,0)));
717 }
718 } // FOR
719 if (is_good) m_entries[part][drawer][chan][gain]++;
720 } // ELSE
721
722 if ((is_good) && (!(m_status[part][drawer][chan][gain]&0x4)) )
723 pmt_values[part][drawer][chan][gain]=ampInPicoCoulombs;
724 else
725 pmt_values[part][drawer][chan][gain]=0.;
726
727 } // End of the loop over the TileRawChannelCollection
728 } // End of the loop over the TileRawChannelContainer
729
730 int chan1;
731 int chan2;
732 for (int part=0; part<NPARTITIONS; part++){
733 for (int drawer=0; drawer<NDRAWERS; ++drawer){
734 for(int pmt1=0; pmt1<NCOUPLES-1; ++pmt1){
735 for (int pmt2=0; pmt2<NCOUPLES; ++pmt2){
736 Q1Q2[pmt1][pmt2]=0.;
737 }
738 }
739 //We compute <q1.q2> for odd PMTs
740 for (int gain=0; gain<NGAINS; ++gain){
741 for (int pmt1=0; pmt1<NCOUPLES-1; ++pmt1){
742 chan1 = int(getCoupleOfPMT(part, pmt1).second);
743 if (chan1==-1) continue;
744
745 for (int pmt2=pmt1+1; pmt2<NCOUPLES; ++pmt2){
746 chan2 = int(getCoupleOfPMT(part, pmt2).second);
747 if (chan2==-1) continue;
748
749 Q1Q2[pmt1][pmt2]= pmt_values[part][drawer][chan1][gain]*pmt_values[part][drawer][chan2][gain];
750 if (Q1Q2[pmt1][pmt2]>0.){
751 m_rs_reducedKappa[part][drawer][pmt1][pmt2][gain][1]->Push(Q1Q2[pmt1][pmt2]);
752 }//IF
753 }//pmt2
754 }//pmt1
755
756 //We compute <q1.q2> for even PMTs
757 for (int pmt1=0; pmt1<NCOUPLES-1; ++pmt1){
758 chan1 = int(getCoupleOfPMT(part, pmt1).first);
759 if (chan1==-1) continue;
760 for (int pmt2=pmt1+1; pmt2<NCOUPLES; ++pmt2){
761 chan2=int(getCoupleOfPMT(part, pmt2).first);
762 if (chan2==-1)
763 continue;
764 Q1Q2[pmt1][pmt2]= pmt_values[part][drawer][chan1][gain]*pmt_values[part][drawer][chan2][gain];
765 if (Q1Q2[pmt1][pmt2]>0.){
766 m_rs_reducedKappa[part][drawer][pmt1][pmt2][gain][0]->Push(Q1Q2[pmt1][pmt2]);
767 }//IF
768 }//pmt2
769 }//pmt1
770
771
772 }//gain
773 }//drawer
774 }//part
775
776
777 for(int part=0; part<NPARTITIONS; part++){
778 for(int drawer=0; drawer<NDRAWERS; ++drawer){
779 for (int chan=0; chan<NCHANNELS; ++chan){
780 for(int gain=0;gain<NGAINS;++gain){
781 int chanref = 0;
782 if(part<2){
783 chanref = 24 + chan%2;
784 }
785 else{
786 switch (chan) {
787 case 31:
788 case 39:
789 case 41:
790 chanref = 38;
791 break;
792 case 32:
793 case 36:
794 case 40:
795 chanref = 37;
796 break;
797 default:
798 chanref = 38 - chan%2;
799 }
800 }
801 if(pmt_values[part][drawer][chanref][gain]>0.001){
802 m_rs_pmt_ratios[part][drawer][chan][gain]->Push(pmt_values[part][drawer][chan][gain]/pmt_values[part][drawer][chanref][gain]);
803 }
804
805 }
806 }
807 }
808 }
809
810 for (int part=0; part<NPARTITIONS; part++){
811 for(int gain=0;gain<NGAINS;++gain){
812 m_rs_meantime[part][gain]->Push(avg_time[part][gain]->Mean());
813 delete(avg_time[part][gain]);
814 } // FOR
815 } // FOR
816
817 return StatusCode::SUCCESS;
818} // EXECUTE
819
820
822 // COMPUTE CALIBRATION COEFFICIENT AT THE END OF THE EVENT LOOP
823 ATH_MSG_INFO ( "finalizeCalculations()" );
824
825 // Loop over monitors
826 if ( m_LASERII ) { // LASERII
827
828 for ( int diodei=0; diodei<NDIODES; diodei++ ) {
829 for ( int diodej=0; diodej<NDIODES; diodej++ ) {
830 if (diodej>=diodei){
831 m_diode_ratio_low[diodei][diodej]=m_rs_diode_ratio_low[diodei][diodej]->Mean();
832 m_diode_ratio_high[diodei][diodej]=m_rs_diode_ratio_high[diodei][diodej]->Mean();
833 m_diode_ratio_sigma_low[diodei][diodej]=m_rs_diode_ratio_low[diodei][diodej]->StandardDeviation();
834 m_diode_ratio_sigma_high[diodei][diodej]=m_rs_diode_ratio_high[diodei][diodej]->StandardDeviation();}
835 }
836 }
837
838 for(int pmt=0; pmt<NPMTS; pmt++){
839 for ( int gain=0; gain<NGAINS; ++gain ) {
840 m_PMT_LASERII[pmt][gain] = m_rs_PMT_signal_LASERII[pmt][gain]->Mean();
841 m_PMT_S_LASERII[pmt][gain] = m_rs_PMT_signal_LASERII[pmt][gain]->StandardDeviation();
842 }
843 }
844 for(int d=0; d<NDIODES; ++d){
845 for ( int gain=0; gain<NGAINS; ++gain ) {
846 m_diode_LASERII[d][gain] = m_rs_diode_signal_LASERII[d][gain]->Mean();
847 m_diode_S_LASERII[d][gain] = m_rs_diode_signal_LASERII[d][gain]->StandardDeviation();
848 m_entries_diode_LASERII[d][gain] = m_rs_diode_signal_LASERII[d][gain]->NumDataValues();
849 }
850 }
851 } else { // LASERI
852 for(int pmt=0; pmt<NPMTS; pmt++){
853 m_PMT[pmt] = m_rs_PMT_signal[pmt]->Mean();
854 m_PMT_S[pmt] = m_rs_PMT_signal[pmt]->StandardDeviation();
855 } // FOR
856
857 for(int d=0; d<NDIODES_LASER1; ++d){
858 m_diode[d] = m_rs_diode_signal[d]->Mean();
859 m_diode_S[d] = m_rs_diode_signal[d]->StandardDeviation();
860 } // FOR
861 }
862
863 // Loop over barrels, modules and gains
864 for ( int partition=0; partition<NPARTITIONS; partition++ ) {
865 for ( int gain=0; gain<NGAINS; ++gain ) {
866 m_meantime[partition][gain] = m_rs_meantime[partition][gain]->Mean();
867 }
868
869 for ( int drawer=0; drawer<NDRAWERS; ++drawer ) {
870 for ( int gain=0; gain<NGAINS; ++gain ) {
871 /* Compute the average kappa correction factor for all event and odd pmts
872 Kappa is by definition: cov(q1,q2)/<q1>*<q2> average on all couples of
873 pmts q1, q2 receiving light from the same clear fiber (only 2 independent
874 kappa for each module) */
875 int nCouplesEven=0, nCouplesOdd=0;
876
877 int chan1;
878 int chan2;
879 double q1;
880 double q2;
881
882 //We evaluate kappa value for odd PMTs
883 for (int pmt1=0; pmt1<NCOUPLES-1; ++pmt1){
884 for (int pmt2=pmt1+1; pmt2<NCOUPLES; ++pmt2){
885 chan1 = getCoupleOfPMT(partition, pmt1).second;
886 chan2 = getCoupleOfPMT(partition, pmt2).second;
887 q1 = m_rs_signal[partition][drawer][chan1][gain]->Mean();
888 q2 = m_rs_signal[partition][drawer][chan2][gain]->Mean();
889
890 if (q1*q2<=0){
891 continue;
892 }
893 if (m_rs_reducedKappa[partition][drawer][pmt1][pmt2][gain][1]->Mean() < q1*q2){
894 continue;
895 }
896 if ((m_rs_reducedKappa[partition][drawer][pmt1][pmt2][gain][1]->Mean()/(q1*q2)-1) > 0.01 ){
897 continue;
898 }
899 m_kappa[partition][drawer][1][gain] += (m_rs_reducedKappa[partition][drawer][pmt1][pmt2][gain][1]->Mean()/(q1*q2)-1);
900 if ( m_kappa[partition][drawer][1][gain]<0.){
901 ATH_MSG_DEBUG ( "Negative kappa value: " << m_kappa[partition][drawer][1][gain] );
902 }
903 nCouplesOdd++;
904 }// pmt2
905 }// pmt1
906
907 //We evaluate kappa value for even PMTs
908 for (int pmt1=0; pmt1<NCOUPLES-1; ++pmt1){
909 for (int pmt2=pmt1+1; pmt2<NCOUPLES; ++pmt2){
910 chan1 = getCoupleOfPMT(partition, pmt2).first;
911 chan2 = getCoupleOfPMT(partition, pmt1).first;
912 q1 = m_rs_signal[partition][drawer][chan1][gain]->Mean();
913 q2 = m_rs_signal[partition][drawer][chan2][gain]->Mean();
914
915 if (q1*q2<=0){
916 continue;
917 }
918 if (m_rs_reducedKappa[partition][drawer][pmt1][pmt2][gain][0]->Mean()<q1*q2){
919 continue;
920 }
921 if ((m_rs_reducedKappa[partition][drawer][pmt1][pmt2][gain][0]->Mean()/(q1*q2)-1) >0.01){
922 continue;
923 }
924 m_kappa[partition][drawer][0][gain] += (m_rs_reducedKappa[partition][drawer][pmt1][pmt2][gain][0]->Mean()/(q1*q2)-1);
925 nCouplesEven++;
926 if (m_kappa[partition][drawer][0][gain]<0.){
927 ATH_MSG_DEBUG ( "Negative kappa value: " << m_kappa[partition][drawer][0][gain] );
928 }// if
929 }// pmt2
930 }// pmt1
931
932 if ( nCouplesEven!=0 ){
933 m_kappa[partition][drawer][0][gain] = m_kappa[partition][drawer][0][gain]/nCouplesEven;
934 if (m_kappa[partition][drawer][0][gain]>0.01){
935 ATH_MSG_DEBUG ( "Too big kappa value: " << m_kappa[partition][drawer][0][gain] << " " << nCouplesEven);
936 }
937 }
938 if ( nCouplesOdd!=0 ){
939 m_kappa[partition][drawer][1][gain] = m_kappa[partition][drawer][1][gain]/nCouplesOdd;
940 if ( m_kappa[partition][drawer][1][gain]>0.01){
941 ATH_MSG_DEBUG ( "Too big kappa value: " << m_kappa[partition][drawer][1][gain] << " " << nCouplesOdd );
942 }
943 }
944
945 for(int channel=0; channel<NCHANNELS; ++channel){
946 m_time[partition][drawer][channel][gain] = m_rs_time[partition][drawer][channel][gain]->Mean();
947 m_time_S[partition][drawer][channel][gain] = m_rs_time[partition][drawer][channel][gain]->StandardDeviation();
948 m_mean[partition][drawer][channel][gain] = m_rs_signal[partition][drawer][channel][gain]->Mean();
949 m_mean_S[partition][drawer][channel][gain] = m_rs_signal[partition][drawer][channel][gain]->StandardDeviation();
950 m_raw_mean[partition][drawer][channel][gain] = m_rs_raw_signal[partition][drawer][channel][gain]->Mean();
951 m_raw_mean_S[partition][drawer][channel][gain] = m_rs_raw_signal[partition][drawer][channel][gain]->StandardDeviation();
952
953 //-- V.Giangiobbe : save the average charge and variance in slices of m_eventsPerSlice=1000
954 if(m_pisaMethod2){
955 int nSlices = std::min(NSLICES,m_rs_signal[partition][drawer][channel][gain]->GetNSlices());
956 for(int iSlice=0; iSlice<nSlices; ++iSlice){
957 m_mean_slice[partition][drawer][channel][iSlice][gain] = m_rs_signal[partition][drawer][channel][gain]->Mean(iSlice);
958 m_variance_slice[partition][drawer][channel][iSlice][gain] = m_rs_signal[partition][drawer][channel][gain]->Variance(iSlice);
959 } // FOR
960 } // IF
961
962 if (m_LASERII) { // Laser II
963
964 for ( int diode=0; diode<NDIODES; diode++ ) {
965 for ( int diode_gain=0; diode_gain<NGAINS; diode_gain++) {
966 m_ratio_LASERII[diode][diode_gain][partition][drawer][channel][gain] = m_rs_ratio_LASERII[diode][diode_gain][partition][drawer][channel][gain]->Mean();
967 m_ratio_S_LASERII[diode][diode_gain][partition][drawer][channel][gain] = m_rs_ratio_LASERII[diode][diode_gain][partition][drawer][channel][gain]->StandardDeviation();
968 m_ratio_LASERII_good[diode][diode_gain][partition][drawer][channel][gain] = m_rs_ratio_LASERII_good[diode][diode_gain][partition][drawer][channel][gain]->Mean();
969 m_ratio_S_LASERII_good[diode][diode_gain][partition][drawer][channel][gain] = m_rs_ratio_LASERII_good[diode][diode_gain][partition][drawer][channel][gain]->StandardDeviation();
970 } // FOR
971 }
972 m_pmt_ratios[partition][drawer][channel][gain] = m_rs_pmt_ratios[partition][drawer][channel][gain]->Mean();
973 if (std::abs(m_rs_pmt_ratios[partition][drawer][channel][gain]->Mean())>100000.) {
974 ATH_MSG_DEBUG( "too big value for " << partition << " " << drawer << " " << channel << " " << gain << " "
975 << m_rs_pmt_ratios[partition][drawer][channel][gain]->NumDataValues() << "status" << m_status[partition][drawer][channel][gain] );
976 }
977 m_pmt_S_ratios[partition][drawer][channel][gain] = m_rs_pmt_ratios[partition][drawer][channel][gain]->StandardDeviation();
978
979 } else { // Laser I
980
981 for(int d=0; d<NDIODES_LASER1; ++d){
982 m_ratio[d][partition][drawer][channel][gain] = m_rs_ratio[d][partition][drawer][channel][gain]->Mean();
983 m_ratio_S[d][partition][drawer][channel][gain] = m_rs_ratio[d][partition][drawer][channel][gain]->StandardDeviation();
984 m_ratio_good[d][partition][drawer][channel][gain] = m_rs_ratio_good[d][partition][drawer][channel][gain]->Mean();
985 m_ratio_good_S[d][partition][drawer][channel][gain] = m_rs_ratio_good[d][partition][drawer][channel][gain]->StandardDeviation();
986 } // Laser 1 diodes
987
988 }
989
990 } // Channels
991 } // Gain
992 } // Drawer
993 } // Partition
994
995
997 // Store high voltage
998 for(int part=0; part<NPARTITIONS; ++part){
999 int ros = part+1;
1000 for(int drawer=0; drawer<NDRAWERS; ++drawer){
1001 for(int channel=0; channel<NCHANNELS; ++channel){
1002 m_HV[part][drawer][channel] = m_tileDCS->getChannelHV(ros, drawer, channel);
1003 m_HVSet[part][drawer][channel] = m_tileDCS->getChannelHVSet(ros, drawer, channel);
1004 } // channel
1005 } // drawers
1006 } // partitions
1007
1008 // remove all RunningStat objects from memory
1009
1010for ( int diodei=0; diodei<NDIODES; diodei++ ) {
1011 for ( int diodej=0; diodej<NDIODES; diodej++ ) {
1012 delete m_rs_diode_ratio_low[diodei][diodej];
1013 delete m_rs_diode_ratio_high [diodei][diodej];
1014 }
1015 }
1016
1017 for ( int diode=0; diode<NDIODES; ++diode ) {
1018 for ( int gain=0; gain<NGAINS; gain++ ) {
1019 delete m_rs_diode_signal_LASERII[diode][gain];
1020 }
1021 }
1022
1023 for(int pmt=0;pmt<NPMTS;++pmt){
1024 for ( int gain=0; gain<NGAINS; gain++ ) {
1025 delete m_rs_PMT_signal_LASERII[pmt][gain];
1026 }
1027 delete m_rs_PMT_signal[pmt];
1028 }
1029
1030 for(int d=0; d<NDIODES_LASER1; ++d){
1031 delete m_rs_diode_signal[d];
1032 }
1033
1034 for ( int part=0; part<NPARTITIONS; ++part ) {
1035 for ( int gain=0; gain<NGAINS; ++gain ) {
1036 delete m_rs_meantime[part][gain];
1037 }
1038
1039 for ( int drawer=0; drawer<NDRAWERS; ++drawer ) {
1040 for ( int gain=0; gain<NGAINS; ++gain ) {
1041 for (int fiber=0; fiber<NFIBERS; ++fiber){
1042 for (int pmt1=0; pmt1<NCOUPLES-1; ++pmt1){
1043 for (int pmt2=pmt1+1; pmt2<NCOUPLES; ++pmt2){
1044 delete m_rs_reducedKappa[part][drawer][pmt1][pmt2][gain][fiber];
1045 }
1046 }
1047 }
1048
1049 for ( int channel=0; channel<NCHANNELS; ++channel ) {
1050 delete m_rs_time[part][drawer][channel][gain];
1051 delete m_rs_signal[part][drawer][channel][gain];
1052 delete m_rs_raw_signal[part][drawer][channel][gain];
1053
1054 for(int diode=0; diode<NDIODES; ++diode){
1055 for (int diode_gain=0; diode_gain<NGAINS; diode_gain++) {
1056 delete m_rs_ratio_LASERII[diode][diode_gain][part][drawer][channel][gain];
1057 delete m_rs_ratio_LASERII_good[diode][diode_gain][part][drawer][channel][gain];
1058 }
1059 }
1060
1061 delete m_rs_pmt_ratios[part][drawer][channel][gain];
1062
1063 for(int d=0; d<NDIODES_LASER1; ++d){
1064 delete m_rs_ratio[d][part][drawer][channel][gain];
1065 delete m_rs_ratio_good[d][part][drawer][channel][gain];
1066 }
1067
1068 } // channel loop
1069 } // gain loop
1070 } // drawer loop
1071 } // partition loop
1072
1073 return StatusCode::SUCCESS;
1074} // FINALIZECALCULATIONS
1075
1076
1077StatusCode TileLaserDefaultCalibTool::writeNtuple(int runNumber, int runType, TFile * rootFile){
1078 // CALLED FROM LASERCALIBALG TO STORE CALIBRATION COEFFICIENTS
1079 // STORES NTUPLE AS ROOT FILE
1080 ATH_MSG_INFO ( "finalize(" << runNumber << "," << runType << "," << rootFile << ")" );
1081
1082 // CREATE OUTPUT TREE
1083 m_toolRunNo = runNumber;
1084
1085 TTree *t = new TTree(m_toolNtuple.c_str(), "TileLaserCalib-Ntuple");
1086 t->Branch("RunNumber",&m_toolRunNo, "runNo/I");
1087 t->Branch("ADC_status",&m_ADC_problem, "ADC/I");
1088 t->Branch("WheelPos",&m_las_filter, "wheelpos/I");
1089 t->Branch("RequestedAmp",&m_las_requ_amp, "requamp/F");
1090 t->Branch("TimeRun",&m_las_time, "timeofrun/F");
1091 t->Branch("MeanTime",m_meantime,"meantime[4][2]/F");
1092 t->Branch("Time",*m_time,"time[4][64][48][2]/F");
1093 t->Branch("Sigma_Time",*m_time_S,"time_s[4][64][48][2]/F");
1094 t->Branch("Signal",*m_mean,"signal[4][64][48][2]/F");
1095 t->Branch("Sigma_Signal",*m_mean_S,"signal_s[4][64][48][2]/F");
1096 t->Branch("Raw_Signal",*m_raw_mean,"rawsignal[4][64][48][2]/F");
1097 t->Branch("Raw_Sigma_Signal",*m_raw_mean_S,"rawsignal_s[4][64][48][2]/F");
1098 t->Branch("LaserEntries",*m_entries,"LASER_entries[4][64][48][2]/I");
1099 t->Branch("Kappa",*m_kappa,"Kappa[4][64][2][2]/F");
1100 t->Branch("Status",*m_status,"Status[4][64][48][2]/S");
1101 t->Branch("HV",*m_HV,"HV[4][64][48]/F");
1102 t->Branch("HVSet",*m_HVSet,"HVSet[4][64][48]/F");
1103
1104 if(m_LASERII){
1105 /* Laser II */
1106 t->Branch("PMT_Signal",*m_PMT_LASERII, "PMT[2][2]/F");
1107 t->Branch("PMT_Sigma_Signal",*m_PMT_S_LASERII, "PMT_s[2][2]/F");
1108
1109 t->Branch("PMT_Ped",*m_PMT_Ped_LASERII, "PMT_Ped[2][2]/F");
1110 t->Branch("PMT_Sigma_Ped",*m_PMT_Ped_S_LASERII, "PMT_sPed[2][2]/F");
1111
1112 t->Branch("Diode_Signal",*m_diode_LASERII, "diode[10][2]/F");
1113 t->Branch("Diode_Sigma_Signal",*m_diode_S_LASERII, "diode_s[10][2]/F");
1114 t->Branch("Diode_Entries", *m_entries_diode_LASERII, "diode_entries[10][2]/I");
1115
1116 t->Branch("Diode_Ped",*m_diode_Ped_LASERII,"diode_Ped[11][2]/F");
1117 t->Branch("Diode_Sigma_Ped",*m_diode_Ped_S_LASERII,"diode_sPed[11][2]/F");
1118
1119 t->Branch("Diode_Alpha",*m_diode_Alpha_LASERII,"diode_Alpha[11][2]/F");
1120 t->Branch("Diode_Sigma_Alpha",*m_diode_Alpha_S_LASERII,"diode_sAlpha[11][2]/F");
1121
1122 t->Branch("Diode_Led",*m_diode_Led_LASERII,"diode_Led[11][2]/F");
1123 t->Branch("Diode_Sigma_Led",*m_diode_Led_S_LASERII,"diode_sLed[11][2]/F");
1124
1125 t->Branch("Ratio",*m_ratio_LASERII,"signal_cor[10][2][4][64][48][2]/F");
1126 t->Branch("Sigma_Ratio",*m_ratio_S_LASERII,"signal_cor_s[10][2][4][64][48][2]/F");
1127 t->Branch("Ratio_good",*m_ratio_LASERII_good,"signal_cor_good[10][2][4][64][48][2]/F");
1128 t->Branch("Sigma_Ratio_good",*m_ratio_S_LASERII_good,"signal_cor_good_s[10][2][4][64][48][2]/F");
1129 t->Branch("Pmt_Ratio", *m_pmt_ratios, "pmt_ratio[4][64][48][2]/F");
1130 t->Branch("Sigma_Pmt_Ratio", *m_pmt_S_ratios, "pmt_ratio_s[4][64][48][2]/F");
1131
1132 t->Branch("Diode_ratio_Low_Gain",*m_diode_ratio_low, "diode_ratio_low[10][10]/F");
1133 t->Branch("Diode_ratio_High_Gain",*m_diode_ratio_high, "diode_ratio_high[10][10]/F");
1134 t->Branch("Diode_ratio_Sigma_Low_Gain",*m_diode_ratio_sigma_low, "diode_ratio_sigma_low[10][10]/F");
1135 t->Branch("Diode_ratio_Sigma_High_Gain",*m_diode_ratio_sigma_high, "diode_ratio_sigma_high[10][10]/F");
1136
1137
1138 } else {
1139 /* Laser I */
1140 t->Branch("Humidity",&m_hrate,"humid/F");
1141 t->Branch("AirFlow",&m_flow,"flow/F");
1142 t->Branch("HeadTemp",&m_head_temp,"htemp/F");
1143
1144 t->Branch("PMT1_Signal",&m_PMT[0], "PMT_1/F");
1145 t->Branch("PMT2_Signal",&m_PMT[1], "PMT_2/F");
1146 t->Branch("PMT_Sigma_Signal",m_PMT_S, "PMT_s[2]/F");
1147 t->Branch("Diode_Signal",m_diode, "diode[4]/F");
1148 t->Branch("Diode_Sigma_Signal",m_diode_S, "diode_s[4]/F");
1149 t->Branch("Diode_Ped",m_diode_Ped, "diode_Ped[4]/F");
1150 t->Branch("Diode_Sigma_Ped",m_diode_SPed, "diode_sPed[4]/F");
1151 t->Branch("Diode_Alpha",m_diode_Alpha, "diode_Alpha[4]/F");
1152 t->Branch("Diode_Sigma_Alpha",m_diode_SAlpha, "diode_sAlpha[4]/F");
1153
1154 t->Branch("Ratio",*m_ratio,"signal_cor[4][4][64][48][2]/F");
1155 t->Branch("Sigma_Ratio",*m_ratio_S,"signal_cor_s[4][4][64][48][2]/F");
1156 t->Branch("Ratio",*m_ratio_good,"signal_cor_good[4][4][64][48][2]/F");
1157 t->Branch("Sigma_Ratio",*m_ratio_good_S,"signal_cor_good_s[4][4][64][48][2]/F");
1158 } // ELSE
1159
1160 if(m_pisaMethod2){
1161 t->Branch("MeanSlice",*m_mean_slice,"MeanSlice[4][64][48][100][2]/F");
1162 t->Branch("VarianceSlice",*m_variance_slice,"VarianceSlice[4][64][48][100][2]/F");
1163 } // IF
1164
1165 if (!m_stuckBitsProbs.empty()) {
1166 if (m_stuckBitsProbs.retrieve().isFailure()) {
1167 ATH_MSG_WARNING("Impossible to get ITileStuckBitsProbsTool and stuck bits probabilities!");
1168 } else {
1169 m_stuckBitsProbs->saveStuckBitsProbabilities(t);
1170 }
1171 }
1172
1173 // Fill values for this run
1174 t->Fill();
1175
1176 return StatusCode::SUCCESS;
1177} // Write ntuple
1178
1179
1181 ATH_MSG_INFO ( "finalize()" );
1182 return StatusCode::SUCCESS;
1183} // FInalize
1184
1185
1186std::pair<unsigned int, unsigned int> TileLaserDefaultCalibTool::getCoupleOfPMT(int part, int couple){
1187 std::pair<unsigned int, unsigned int> coupleOfPMTs;
1188
1189 int chanLBOdd[NCOUPLES] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 33, 35, 37, 39, 41, 45, 47};
1190 int chanLBEven[NCOUPLES] = {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 34, 36, 38, 40, 42, 44, 46};
1191
1192 int chanEBOdd[NCOUPLES] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 21, 23, 32, 35, 36, 37, 40, -1, -1, -1, -1, -1, -1};
1193 int chanEBEven[NCOUPLES] = {0, 2, 4, 6, 8, 10, 12, 14, 16, 20, 22, 30, 31, 38, 39, 41, -1, -1, -1, -1, -1, -1};
1194
1195 if (part<2){ //----LB
1196 coupleOfPMTs.first = chanLBEven[couple];
1197 coupleOfPMTs.second = chanLBOdd[couple];
1198 } else { //----EB
1199 coupleOfPMTs.first = chanEBEven[couple];
1200 coupleOfPMTs.second = chanEBOdd[couple];
1201 }
1202
1203 return coupleOfPMTs;
1204}
#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)
Handle class for reading from StoreGate.
#define NDIODES
#define NCOUPLES
#define NGAINS
#define NFIBERS
#define NCHANNELS
#define NSLICES
#define NPARTITIONS
#define NDRAWERS
#define NPMTS
#define NDIODES_LASER1
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
const ServiceHandle< StoreGateSvc > & detStore() const
DataModel_detail::const_iterator< DataVector > const_iterator
Standard const_iterator.
Definition DataVector.h:838
virtual bool isValid() override final
Can the handle be successfully dereferenced?
static const TileCablingService * getInstance()
get pointer to service instance
static unsigned int getDrawerIdx(unsigned int ros, unsigned int drawer)
Returns a drawer hash.
Class that holds Data Quality fragment information and provides functions to extract the data quality...
bool isAdcDQgood(int partition, int drawer, int ch, int gain) const
returns status of single ADC returns False if there are any errors
static int isChEmpty(int partition, int drawer, int ch)
True if channel is not fully implemented.
const uint32_t * cispar() const
CIS parameters.
RunningStat *(* m_rs_ratio_LASERII_good)[NGAINS][NPARTITIONS][NDRAWERS][NCHANNELS][NGAINS]
virtual StatusCode initNtuple(int runNumber, int runType, TFile *rootfile) override
ToolHandle< ITileStuckBitsProbsTool > m_stuckBitsProbs
float(* m_ratio_LASERII_good)[NGAINS][NPARTITIONS][NDRAWERS][NCHANNELS][NGAINS]
RunningStat *(* m_rs_PMT_signal_LASERII)[NGAINS]
RunningStat *(* m_rs_diode_ratio_high)[NDIODES]
ToolHandle< ITileDCSTool > m_tileDCS
float(* m_ratio)[NPARTITIONS][NDRAWERS][NCHANNELS][NGAINS]
RunningStat *(* m_rs_ratio_LASERII)[NGAINS][NPARTITIONS][NDRAWERS][NCHANNELS][NGAINS]
int(* m_entries)[NDRAWERS][NCHANNELS][NGAINS]
float(* m_mean_slice)[NDRAWERS][NCHANNELS][NSLICES][NGAINS]
RunningStat *(* m_rs_signal)[NDRAWERS][NCHANNELS][NGAINS]
float(* m_ratio_S_LASERII_good)[NGAINS][NPARTITIONS][NDRAWERS][NCHANNELS][NGAINS]
SG::ReadHandleKey< TileDQstatus > m_dqStatusKey
RunningStat *(* m_rs_meantime)[NGAINS]
RunningStat *(* m_rs_diode_ratio_low)[NDIODES]
float(* m_ratio_good_S)[NPARTITIONS][NDRAWERS][NCHANNELS][NGAINS]
virtual StatusCode initialize() override
float(* m_raw_mean)[NDRAWERS][NCHANNELS][NGAINS]
RunningStat *(* m_rs_ratio)[NPARTITIONS][NDRAWERS][NCHANNELS][NGAINS]
float(* m_time_S)[NDRAWERS][NCHANNELS][NGAINS]
const TileCablingService * m_cabling
ToolHandle< ITileBadChanTool > m_tileBadChanTool
RunningStat *(* m_rs_pmt_ratios)[NDRAWERS][NCHANNELS][NGAINS]
RunningStat * m_rs_diode_signal[NDIODES_LASER1]
float(* m_ratio_LASERII)[NGAINS][NPARTITIONS][NDRAWERS][NCHANNELS][NGAINS]
float(* m_mean)[NDRAWERS][NCHANNELS][NGAINS]
ToolHandle< TileCondToolEmscale > m_tileToolEmscale
float(* m_HV)[NDRAWERS][NCHANNELS]
RunningStat *(* m_rs_reducedKappa)[NDRAWERS][NCOUPLES-1][NCOUPLES][NGAINS][NFIBERS]
static std::pair< unsigned int, unsigned int > getCoupleOfPMT(int ros, int couple)
float(* m_pmt_S_ratios)[NDRAWERS][NCHANNELS][NGAINS]
float(* m_variance_slice)[NDRAWERS][NCHANNELS][NSLICES][NGAINS]
float(* m_raw_mean_S)[NDRAWERS][NCHANNELS][NGAINS]
virtual StatusCode finalize() override
virtual StatusCode writeNtuple(int runNumber, int runType, TFile *rootfile) override
float(* m_kappa)[NDRAWERS][NFIBERS][NGAINS]
RunningStat *(* m_rs_diode_signal_LASERII)[NGAINS]
float(* m_pmt_ratios)[NDRAWERS][NCHANNELS][NGAINS]
virtual StatusCode execute() override
short(* m_status)[NDRAWERS][NCHANNELS][NGAINS]
TileLaserDefaultCalibTool(const std::string &type, const std::string &name, const IInterface *pParent)
RunningStat *(* m_rs_ratio_good)[NPARTITIONS][NDRAWERS][NCHANNELS][NGAINS]
RunningStat *(* m_rs_time)[NDRAWERS][NCHANNELS][NGAINS]
float(* m_ratio_S_LASERII)[NGAINS][NPARTITIONS][NDRAWERS][NCHANNELS][NGAINS]
float(* m_mean_S)[NDRAWERS][NCHANNELS][NGAINS]
float(* m_ratio_S)[NPARTITIONS][NDRAWERS][NCHANNELS][NGAINS]
float(* m_HVSet)[NDRAWERS][NCHANNELS]
SG::ReadHandleKey< TileLaserObject > m_laserContainerKey
RunningStat *(* m_rs_raw_signal)[NDRAWERS][NCHANNELS][NGAINS]
virtual StatusCode finalizeCalculations() override
SG::ReadHandleKey< TileRawChannelContainer > m_rawChannelContainerKey
float(* m_ratio_good)[NPARTITIONS][NDRAWERS][NCHANNELS][NGAINS]
float(* m_time)[NDRAWERS][NCHANNELS][NGAINS]
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())