ATLAS Offline Software
Loading...
Searching...
No Matches
LArRawChannelSimpleBuilder.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
3*/
4
7#include "CLHEP/Units/SystemOfUnits.h"
14#include "GaudiKernel/ThreadLocalContext.h"
15
17
18#include <cmath>
19
20using CLHEP::nanosecond;
21using CLHEP::ns;
22using CLHEP::MeV;
23
24LArRawChannelSimpleBuilder::LArRawChannelSimpleBuilder (const std::string& name, ISvcLocator* pSvcLocator):
25 AthReentrantAlgorithm(name, pSvcLocator),
26 m_emId(nullptr),
27 m_fcalId(nullptr),
28 m_hecId(nullptr),
29 m_onlineHelper(nullptr),
30 m_peakParabolaTool("LArParabolaPeakTool"),
31 m_iPedestal(0)// jobO ?
32{
33 //m_useIntercept={false,false,false,false};
34 declareProperty("maxSamp",m_imaxSamp=8);
35 declareProperty("RecoMode",m_mode="CUBIC");
36 declareProperty("CubicRecoTimeModeFCAL",m_FCALmodeTime="LINEAR");
37 declareProperty("CubicAdcCut",m_cubicAdcCut=15.0);
38 declareProperty("PedestalSample",m_iPedestal=0);
39 declareProperty("UsePedestalDB",m_usePedestalDB=false);
40 declareProperty("UseRampDB",m_useRampDB=false);
41 declareProperty("AverageSamplesEM",m_averageSamplesEM=5);
42 declareProperty("AverageSamplesHEC",m_averageSamplesHEC=5);
43 declareProperty("AverageSamplesFCAL",m_averageSamplesFCAL=3);
44 declareProperty("AverageScaleEM",m_averageScaleEM=2.6);
45 declareProperty("AverageScaleHEC",m_averageScaleHEC=2.6);
46 declareProperty("AverageScaleFCAL",m_averageScaleFCAL=1.8);
47
48 // m_peakParabolaTool = NULL ; // FIXME RS use empty ToolHandle - python
49
50 m_ADCtoMeVFCAL[0] = 87.0 * MeV; // FCAL1 High gain
51 m_ADCtoMeVFCAL[1] = 117.0 * MeV; // FCAL2 High gain
52 m_ADCtoMeVFCAL[2] = 193.0 * MeV; // FCAL3 High gain
53 m_ADCtoMeVHEC[0] = 136.0 / 9.8 * MeV; // HEC 1 Medium gain from Monika. Need / 9.8 ??
54 m_ADCtoMeVHEC[1] = 136.0 / 9.8 * MeV; // HEC 2 Medium gain from Monika. Need / 9.8 ??
55 // m_ADCtoMeVEMECInner[0] = 25.22 * MeV; // EMEC High gain from Pascal, approximate
56 // m_ADCtoMeVEMECInner[1] = 19.4 * MeV; // EMEC High gain from Pascal, approximate
57 m_ADCtoMeVEMECInner[0] = 20.0 * MeV; // EMEC IW s=1 High gain : fixed 18/8/2004 RMcP
58 m_ADCtoMeVEMECInner[1] = 20.0 * MeV; // EMEC IW s=2 High gain : fixed 18/8/2004 RMcP
59 m_ADCtoMeVEMECOuter[0] = 16.0 * MeV; // EMEC OW pre, s=0
60 m_ADCtoMeVEMECOuter[1] = 16.0 * MeV; // EMEC OW s=1 High gain from Monika, approximate
61 m_ADCtoMeVEMECOuter[2] = 16.0 * MeV; // EMEC OW s=2 High gain from Monika, approximate
62 m_ADCtoMeVEMECOuter[3] = 16.0 * MeV; // EMEC OW s=3 High gain from Monika, approximate
63 m_ADCtoMeVEMB[0] = 7.0 * MeV; // EMB pre, s=0 High gain from Isabelle, approximate
64 m_ADCtoMeVEMB[1] = 2.5 * MeV; // EMB s=1 High gain from Isabelle, approximate
65 m_ADCtoMeVEMB[2] = 18.0 * MeV; // EMB s=2 High gain from Isabelle, approximate
66 m_ADCtoMeVEMB[3] = 9.0 * MeV; // EMB s=3 High gain from Isabelle, approximate
67
68
69}
70
72{
73 ATH_MSG_DEBUG( "In Initialize." );
74
75 ATH_CHECK( m_adc2mevKey.initialize (m_useRampDB) );
76
77 if ( m_mode == "PARABOLA"){
78 if (m_peakParabolaTool.retrieve().isFailure())
79 {
80 ATH_MSG_ERROR( "Can't get LArParabolaPeakRecoTool" );
81 return StatusCode::SUCCESS;
82 }
83 ATH_MSG_DEBUG( "LArParabolaPeakRecoTool retrieved with success!" );
84 }
85
86 const CaloCell_ID* idHelper = nullptr;
87 ATH_CHECK( detStore()->retrieve (idHelper, "CaloCell_ID") );
88 m_emId=idHelper->em_idHelper();
89 m_fcalId=idHelper->fcal_idHelper();
90 m_hecId=idHelper->hec_idHelper();
91
92 ATH_CHECK(m_cablingKey.initialize());
93
94 ATH_CHECK( detStore()->retrieve(m_onlineHelper, "LArOnlineID") );
95
96
97 ATH_CHECK( m_DataLocation.initialize() );
98 ATH_CHECK( m_ChannelContainerName.initialize() );
99 return StatusCode::SUCCESS;
100}
101
102
103
104StatusCode LArRawChannelSimpleBuilder::execute (const EventContext& ctx) const
105{
106 ATH_MSG_DEBUG( "In execute" );
107
108 //Retrieve Digit Container
109 ATH_MSG_DEBUG( "About to retrieve LArDigitContainer with key " << m_DataLocation );
111 ATH_MSG_DEBUG( "1) LArDigitContainer container size = " << digitContainer->size() );
112
113 ATH_MSG_DEBUG( "2) LArDigitContainer container size = " << digitContainer->size() );
114 if( digitContainer->empty() ) {
115 ATH_MSG_INFO( "Empty LArDigitContainer container." );
116 return StatusCode::SUCCESS;
117 }
118
119 auto larRawChannelContainer = std::make_unique<LArRawChannelContainer>();
120
121 //Pointer to conditions data objects
122 const ILArPedestal* larPedestal=nullptr;
123 if (m_usePedestalDB) {
124 if (detStore()->retrieve(larPedestal).isFailure()) {
125 larPedestal=nullptr;
126 ATH_MSG_DEBUG( "No pedestal found in database. Use default values." );
127 }
128 }
129
131 const LArOnOffIdMapping* cabling{*cablingHdl};
132 if(!cabling) {
133 ATH_MSG_ERROR("Do not have mapping object " << m_cablingKey.key() );
134 return StatusCode::FAILURE;
135 }
136
137 const LArADC2MeV* adc2mev = nullptr;
138 if (m_useRampDB) {
140 adc2mev = *adc2mevH;
141 }
142
143 //loop twice over the digits. In the first pass the best window is
144 //found for the averaged signal. In the second pass the full raw
145 //channel is created and the averaging in the window found in the
146 //first path is used in case the cubic fit fails or the max ADC is
147 //below threshold
148
149 int nMinEM(0),nMinHEC(0),nMinFCAL(0);
150 std::vector<float> fSumEM,fSumHEC,fSumFCAL;
151 std::vector<float> *pSum = nullptr;
152
153 fSumEM.resize(0);
154 fSumHEC.resize(0);
155 fSumFCAL.resize(0);
156
157 for(int iloop=0;iloop<2;iloop++) {
158
159 //Now all data is available, start loop over Digit Container
160 ATH_MSG_DEBUG( "Loop over Digit Container " );
161
162 for (const LArDigit* digit : *digitContainer) {
163
164 //Get data from LArDigit
165 const std::vector<short>& samples = digit->samples();
166 unsigned int nSamples = samples.size();
167 const HWIdentifier chid = digit->channelID();
168 const CaloGain::CaloGain gain = digit->gain();
169
170
171 float thePedestal=-1;
172 if (larPedestal) {
173 float DBpedestal =larPedestal->pedestal(chid,gain);
174 if (DBpedestal <= (1.+LArElecCalib::ERRORCODE))
175 thePedestal=DBpedestal;
176 }
177 if (thePedestal<0) {
178 thePedestal = (float)samples[m_iPedestal];
179 ATH_MSG_DEBUG( "No pedestal found for this cell. Use default value " << thePedestal );
180 }
181 //>>>> PL June 20, 2004: subtract pedestal first, assume first sample ->JO?
182 std::vector<float> mySamples;
183 mySamples.resize(samples.size());
184 // FIXME!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! only for 5 leading noise samples!
185
186 // log << MSG::INFO
187 // << "pedestal " << thePedestal << endmsg;
188 for ( unsigned int i=0; i<samples.size(); i++ )
189 {
190 mySamples[i] = ((float)samples[i]) - thePedestal;
191 }
192 //<<<<
193
194 float GainFactor;
195 if( gain == CaloGain::LARLOWGAIN ) {
196 GainFactor = 9.8*9.8;
197 } else if (gain == CaloGain::LARMEDIUMGAIN ) {
198 GainFactor = 9.8;
199 } else if (gain == CaloGain::LARHIGHGAIN ) {
200 GainFactor = 1.0;
201 } else {
202 GainFactor = 1.0;
203 ATH_MSG_ERROR( "Channel " << chid << "unknown gain: " << gain );
204 }
205
206 // Get hardware identifier for later use.
207 HWIdentifier FebID = m_onlineHelper->feb_Id(chid);
208 unsigned int channel = m_onlineHelper->channel(chid);
209 ATH_MSG_DEBUG( std::hex << " FebID / chid / channel = " << FebID << " / " << chid << " / " << channel );
210
211 // And note if this is an FCAL channel with fast pulses (cubic fails)
212 // EM and HEC are also tested to adjust the signal range for averaging
213 bool isFCAL = false;
214 bool isEM = false;
215 bool isHEC = false;
216 int nMin = 0;
217 unsigned int nAverage = 1;
218 float myScale = 1;
219 try {
220 const Identifier id = cabling->cnvToIdentifier(chid);
221 if (m_fcalId->is_lar_fcal(id)) {
222 isFCAL = true;
223 nMin = nMinFCAL;
224 pSum = &fSumFCAL;
225 nAverage = m_averageSamplesFCAL;
226 myScale = m_averageScaleFCAL;
227 }
228 else if (m_emId->is_lar_em(id)) {
229 isEM = true;
230 nMin = nMinEM;
231 pSum = &fSumEM;
232 nAverage = m_averageSamplesEM;
233 myScale = m_averageScaleEM;
234 }
235 else if (m_hecId->is_lar_hec(id)) {
236 isHEC = true;
237 nMin = nMinHEC;
238 pSum = &fSumHEC;
239 nAverage = m_averageSamplesHEC;
240 myScale = m_averageScaleHEC;
241 }
242 }
243 //catch( LArOnlID_Exception & except)
244 catch (LArID_Exception & execpt) {
245 ATH_MSG_DEBUG (" is disconnected.");
246 // The question now being: do we want to skip this channel???
247 // Probably yes, so do so. RMcP 9 June 2006
248 continue;
249 }
250 // In the unrealistic case, that pSum is still not defined
251 if(!pSum) continue;
252
253 // Find peak time sample and scaled average for selected sample range
254 // (i.e. poor man's digital filter)
255
256 // sanity checks
257 if ( nAverage > nSamples ) {
258 ATH_MSG_WARNING( " Number of samples to average ("
259 << nAverage << ") is larger than total number of samples ("
260 << nSamples << ")! adjusting nAverage ... " );
261 nAverage = nSamples;
262 }
263
264
265 if ( iloop == 0 ) {
266
267 if ( pSum->empty())
268// pSum->resize(nSamples-nAverage+1,0);
269 pSum->resize(nSamples,0);
270
271 for( unsigned i=0;i<nSamples-nAverage+1;i++ ) {
272 for( unsigned j=0;j<nAverage;j++ ) {
273 (*pSum)[i] += mySamples[i+j];
274 }
275 }
276 }
277 else {
278 float maxADCPeak = 0.;
279 unsigned int iPeakSamp = 0;
280 float averagedADC = 0;
281 for( unsigned i=0;i<nSamples;i++ ) {
282 if ( maxADCPeak < mySamples[i] )
283 {
284 maxADCPeak = mySamples[i];
285 iPeakSamp = i;
286 }
287 if ( (int)i >= nMin && i < nMin+nAverage )
288 averagedADC += mySamples[i];
289 }
290 averagedADC /= myScale;
291
292 bool CubicFailed = false;
293 float ADCPeak=0.;
294 float time=0;
295
296
297 // maximum amplitude/variable time slice method
298 if( m_mode == "MAX" )
299 {
300 ADCPeak = maxADCPeak;
301 time = ((float)iPeakSamp) * 25.0 * nanosecond;
302 }
303
304
305 // other choices are different for FCAL and others
306 else {
307
308 // first, deal with FCAL: only one reconstruction is available
309 if(isFCAL && m_mode == "CUBIC" &&
310 ! ( CubicFailed = maxADCPeak <= m_cubicAdcCut ) ) {
311
312 ATH_MSG_DEBUG( " Special reconstruction for FCAL." );
313
314 unsigned int it0;
315
316 const float invT[3][3]
317 = { { 1, 0, 0 },
318 { -1.5, 2, -0.5 },
319 { 0.5, -1, 0.5 } };
320
321 // peak slice very early
322 if ( iPeakSamp <= 1 ) {
323 it0 = 1;
324 } else if ( iPeakSamp >= nSamples - 1 ) { // peak is late
325 it0 = nSamples - 3;
326 } else { // peak in safe region
327 it0 = iPeakSamp - 1;
328 }
329
330 // Quadratic interpolation using
331 // 3 samples to be used start at 0 <= t0 <= nsamples-3
332 float A[3] = {0, 0, 0};
333 float dtmax = 0.0;
334 // S = TA -> A = inv(T)S
335 for (int ia = 0; ia < 3; ia++)
336 for (int it = 0; it < 3; it++)
337 A[ia] += invT[ia][it] * mySamples[it0+it];
338
339 // fit parameters
340 if ( not ( CubicFailed = ( A[2] == 0 ) ) ) {
341 dtmax = -1.0 * A[1] / 2.0 / A[2];
342 if ( ! ( CubicFailed = ( dtmax < 0 || dtmax > 2 ) ) ) {
343 //time = (float(it0) + dtmax) * 25.0 * nanosecond; // nsec
344 time=dtmax*25.0*ns;
345 for(int ia = 0; ia < 3; ia++)
346 ADCPeak += A[ia] * pow(dtmax, ia);
347 }
348 }
349
350 // Now use jobOptions to pick time and height of FCAL pulses
351 if( m_FCALmodeTime == "LINEAR" ) {
352 float weightSum = 0.;
353 float timeSum = 0.;
354 for( int it=0; it<3; it++) {
355 timeSum += float(mySamples[it0+it]) * float(it);
356 weightSum += float(mySamples[it0+it]);
357 }
358 time = (float(it0) + timeSum / weightSum) * 25.0 * nanosecond;
359 // ADCPeak = mySamples[iPeakSamp];
360 ADCPeak = mySamples[m_imaxSamp];
361 CubicFailed = false;
362 }
363
364 // then, deal with non-FCAL
365 } else if(not isFCAL || m_mode != "CUBIC" ) {
366
367 // bias-corrected parabola extrapolation for selected channels
368 if ( m_mode == "PARABOLA" &&
369 ! ( CubicFailed = maxADCPeak <= m_cubicAdcCut ) ) {
370 if( m_peakParabolaTool) {
371 int layer = 0;
372 try {
373 const Identifier id = cabling->cnvToIdentifier(chid);
374 ATH_MSG_DEBUG( std::hex << " id = " << id );
375 if (m_emId->is_em_barrel(id)) {
376 layer= m_emId->sampling(id);
377 }
378 }
379 catch (LArID_Exception & execpt){
380 ATH_MSG_DEBUG( std::hex
381 << " Cannot get offline identifier from online ID = " << chid );
382 }
383
384 std::vector<float> peak =m_peakParabolaTool->peak(samples,layer,thePedestal);
385 if(peak.size() >1){
386 ADCPeak = peak[0]-thePedestal;
387 if (peak.size()==2)time = peak[1];
388 else time = peak[2];
389 }else{
390 ATH_MSG_DEBUG( "No pic is computed from Parabola. Use scaled average of selected samples" );
391 ADCPeak = averagedADC;
392 time = -99.;
393 }
394 }else{
395 ATH_MSG_FATAL( "No parabola tool available ! Choose another mode" );
396 }
397 }
398
399 // cubic extrapolation for selected channels
400 else if ( m_mode == "CUBIC" &&
401 ! ( CubicFailed = maxADCPeak <= m_cubicAdcCut ) ) {
402
403 unsigned int it0;
404 const float invT[4][4]
405 = { { 1, 0, 0, 0},
406 { -1.83333, 3, -1.5, 0.333333},
407 { 1, -2.5, 2, -0.5},
408 {-0.166666, 0.5, -0.5, 0.166666} };
409
410 // peak slice very early
411 if ( iPeakSamp <= 1 ) {
412 it0 = m_iPedestal + 1;
413 } else if ( iPeakSamp >= nSamples - 2 ) { // peak is late
414 it0 = nSamples - 4;
415 } else { // peak in safe region
416 it0 = ( mySamples[iPeakSamp-2] > mySamples[iPeakSamp+2] )
417 ? iPeakSamp - 2
418 : iPeakSamp - 1;
419 }
420
421 // 4 samples to be used start at 0 <= t0 <= nsamples-4
422 float A[4] = {0, 0, 0, 0};
423 float dtmax = 0.0;
424 float disc;
425 // S = TA -> A = inv(T)S
426 for (int ia = 0; ia < 4; ia++)
427 for (int it = 0; it < 4; it++)
428 A[ia] += invT[ia][it] * mySamples[it0+it];
429
430 // fit parameters
431 disc = A[2]*A[2] - 3*A[1]*A[3];
432 if ( ! ( CubicFailed = ( disc < 0 || A[3] == 0 ) ) ) {
433 dtmax = (-A[2]-std::sqrt(disc))/(A[3]*3);
434 if ( ! ( CubicFailed = ( dtmax < 0 || dtmax > 3 ) ) ) {
435 time = (float(it0) + dtmax) * 25.0 * nanosecond; // nsec
436 for(int ia = 0; ia < 4; ia++)
437 ADCPeak += A[ia] * pow(dtmax, ia);
438 }
439 }
440 }
441 }
442 }
443
444 // fixed time slice or insufficient signal for cubic fit : use scaled average of selected samples
445 if(m_mode == "FIXED" || CubicFailed ) {
446 ADCPeak = averagedADC;
447 time = -99. ;
448 }
449
450 ATH_MSG_DEBUG( "Flag: "
451 << CubicFailed
452 << " Detector: "
453 << (isEM?"EM":(isHEC?"HEC":(isFCAL?"FCAL":"none")))
454 << " Mode: "
455 << m_mode
456 << " Signal: "
457 << ADCPeak
458 << " Peak: "
459 << maxADCPeak
460 << " PeakSample: "
461 << iPeakSamp
462 );
463
464 float energy=-9999;
465 if (m_useRampDB) {
466 float ADCPeakPower=ADCPeak;
467 //ADC2MeV (a.k.a. Ramp)
468 LArVectorProxy ramp = adc2mev->ADC2MEV(chid,gain);
469 //Check ramp coefficents
470 if (ramp.size()>1 && ramp[1]<500 && ramp[1]>0) {
471 energy=0;
472 for (unsigned i=1;i<ramp.size();i++)
473 {energy+=ramp[i]*ADCPeakPower; //pow(ADCPeak,i);
474 //std::cout << "Step "<< i <<":" << ramp[i] << " * " << pow(ADCPeak,i) << "Sum=" << energy << std::endl;
475 ADCPeakPower*=ADCPeak;
476 }
477 }
478 }
479 if (energy==-9999) {
480 ATH_MSG_DEBUG( "No Ramp found for this cell. Use default values" );
481 //Apply default values
482 // Now must get subdetector ID and feed in here ...
483 float ADCtoMeV = 10.0;
484
485 // HWIdentifier FebID = m_onlineHelper->feb_Id(chid);
486 // unsigned int channel = m_onlineHelper->channel(chid);
487 // MSG::hex(log) << MSG::DEBUG
488 // << " FebID / chid / channel = " << FebID << " / " << chid << " / " << channel << endmsg;
489
490 try {
491 const Identifier id = cabling->cnvToIdentifier(chid);
492
493 ATH_MSG_DEBUG( std::hex << " id = " << id );
494
495 if (m_emId->is_em_barrel(id)) {
496 const int layer= m_emId->sampling(id);
497 const int eta=m_emId->eta(id);
498 ADCtoMeV = m_ADCtoMeVEMB[layer];
499 if (layer==2 && eta<32)
500 ADCtoMeV=ADCtoMeV*(12./18.); //Correct for lead thickness
501 ATH_MSG_DEBUG( " in EMB s="<< layer <<", using ADCtoMeV = " << ADCtoMeV );
502 } else if (m_emId->is_em_endcap_inner(id)) {
503 // m_emId->sampling(id);
504 ADCtoMeV = m_ADCtoMeVEMECInner[m_emId->sampling(id)-1];
505 ATH_MSG_DEBUG( " in EMEC inner s="<<m_emId->sampling(id)<<", using ADCtoMeV = " << ADCtoMeV );
506 } else if (m_emId->is_em_endcap_outer(id)) {
507 // m_emId->sampling(id);
508 // ADCtoMeV = m_ADCtoMeVEMECOuter[m_emId->sampling(id)-1];
509 ADCtoMeV = m_ADCtoMeVEMECOuter[m_emId->sampling(id)];
510 ATH_MSG_DEBUG( " in EMEC outer s="<<m_emId->sampling(id)<<", using ADCtoMeV = " << ADCtoMeV );
511 } else if (m_fcalId->is_lar_fcal(id)) {
512 // m_fcalId->module(chid);
513 ADCtoMeV = m_ADCtoMeVFCAL[m_fcalId->module(id)-1];
514 ATH_MSG_DEBUG( " in FCAL m=" << m_fcalId->module(id)<<", using ADCtoMeV = " << ADCtoMeV );
515 } else if (m_hecId->is_lar_hec(id)) {
516 // m_layer[m_cellIndex]=m_hecId->sampling(id);
517 ADCtoMeV = m_ADCtoMeVHEC[0];
518 ATH_MSG_DEBUG( " in HEC s="<<m_hecId->sampling(id)<<", using ADCtoMeV = " << ADCtoMeV );
519 }
520 }
521 //catch( LArOnlID_Exception & except)
522 catch (LArID_Exception & execpt)
523 {
524 ATH_MSG_DEBUG( " is disconnected. Set ADCtoMeV to 1" );
525 ADCtoMeV=1;
526 }
527 energy = ADCPeak * ADCtoMeV * GainFactor;
528 }
529 uint16_t iquality=0;
530 uint16_t iprovenance=0;
531
532 time*=1000; //Convert to picoseconds
533 //Make LArRawChannel Object with new data
534 LArRawChannel larRawChannel(chid,(int)energy,(int)time,iquality,iprovenance, gain);
535 larRawChannelContainer->add(larRawChannel); //Add to container
536 }
537 }// End loop over LArDigits
538 if ( iloop == 0 ) {
539 // select the best windows for the event
540 unsigned int i;
541 float tmpSum = 0;
542
543 if ( !fSumEM.empty() ) {
544 for(i=0;i<fSumEM.size();i++) {
545 if (i == 0 || fSumEM[i] > tmpSum ) {
546 nMinEM = i;
547 tmpSum = fSumEM[i];
548 }
549 }
550 ATH_MSG_DEBUG( "Found best EM window starting at sample <" << nMinEM << ">" );
551 }
552
553 for(i=0;i<fSumHEC.size();i++) {
554 if (i == 0 || fSumHEC[i] > tmpSum ) {
555 nMinHEC = i;
556 tmpSum = fSumHEC[i];
557 }
558 }
559 if ( !fSumHEC.empty() ) {
560 ATH_MSG_DEBUG( "Found best HEC window starting at sample <" << nMinHEC << ">" );
561 }
562
563 for(i=0;i<fSumFCAL.size();i++) {
564 if (i == 0 || fSumFCAL[i] > tmpSum ) {
565 nMinFCAL = i;
566 tmpSum = fSumFCAL[i];
567 }
568 }
569 if ( !fSumFCAL.empty() ) {
570 ATH_MSG_DEBUG( "Found best FCAL window starting at sample <" << nMinFCAL << ">" );
571 }
572
573 }
574 }// End of double loop over Digit containers
575
576 ATH_MSG_DEBUG( "Finished loop over Digit Container " );
577
578 // Put this LArRawChannel container in the transient store
579 ATH_CHECK( SG::makeHandle (m_ChannelContainerName, ctx).record (std::move (larRawChannelContainer)) );
580
581 return StatusCode::SUCCESS;
582}
583
585{//Error and Warning Summary for this job:
586
587 ATH_MSG_INFO( "LArRawChannelSimpleBuilder finished." );
588
589 return StatusCode::SUCCESS;
590}
Scalar eta() const
pseudorapidity method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_FATAL(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
Handle class for reading from StoreGate.
Handle class for recording to StoreGate.
constexpr int pow(int base, int exp) noexcept
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
const ServiceHandle< StoreGateSvc > & detStore() const
An algorithm that can be simultaneously executed in multiple threads.
Helper class for offline cell identifiers.
Definition CaloCell_ID.h:34
const LArFCAL_ID * fcal_idHelper() const
access to FCAL idHelper
Definition CaloCell_ID.h:75
const LArEM_ID * em_idHelper() const
access to EM idHelper
Definition CaloCell_ID.h:63
const LArHEC_ID * hec_idHelper() const
access to HEC idHelper
Definition CaloCell_ID.h:69
virtual float pedestal(const HWIdentifier &id, int gain) const =0
const LArVectorProxy ADC2MEV(const HWIdentifier &id, int gain) const
Definition LArADC2MeV.h:32
Liquid Argon digit base class.
Definition LArDigit.h:25
Exception class for LAr Identifiers.
SG::ReadHandleKey< LArDigitContainer > m_DataLocation
ToolHandle< LArParabolaPeakRecoTool > m_peakParabolaTool
SG::ReadCondHandleKey< LArADC2MeV > m_adc2mevKey
SG::ReadCondHandleKey< LArOnOffIdMapping > m_cablingKey
virtual StatusCode initialize() override
SG::WriteHandleKey< LArRawChannelContainer > m_ChannelContainerName
LArRawChannelSimpleBuilder(const std::string &name, ISvcLocator *pSvcLocator)
virtual StatusCode execute(const EventContext &ctx) const override
virtual StatusCode finalize() override
Liquid Argon ROD output object base class.
Proxy for accessing a range of float values like a vector.
@ LARMEDIUMGAIN
Definition CaloGain.h:18
@ LARLOWGAIN
Definition CaloGain.h:18
@ LARHIGHGAIN
Definition CaloGain.h:18
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
hold the test vectors and ease the comparison