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