ATLAS Offline Software
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"
11 #include "StoreGate/ReadHandle.h"
13 #include "StoreGate/WriteHandle.h"
14 #include "GaudiKernel/ThreadLocalContext.h"
15 
17 
18 #include <cmath>
19 
20 using CLHEP::nanosecond;
21 using CLHEP::ns;
22 using CLHEP::MeV;
23 
24 LArRawChannelSimpleBuilder::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 
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 
93 
94  ATH_CHECK( detStore()->retrieve(m_onlineHelper, "LArOnlineID") );
95 
96 
99  return StatusCode::SUCCESS;
100 }
101 
102 
103 
104 StatusCode 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 }
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
LArRawChannelSimpleBuilder::m_ChannelContainerName
SG::WriteHandleKey< LArRawChannelContainer > m_ChannelContainerName
Definition: LArRawChannelSimpleBuilder.h:62
ILArPedestal::pedestal
virtual float pedestal(const HWIdentifier &id, int gain) const =0
LArADC2MeV::ADC2MEV
const LArVectorProxy ADC2MEV(const HWIdentifier &id, int gain) const
Definition: LArADC2MeV.h:32
LArRawChannelSimpleBuilder::m_cubicAdcCut
float m_cubicAdcCut
Definition: LArRawChannelSimpleBuilder.h:66
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
plotting.yearwise_efficiency.channel
channel
Definition: yearwise_efficiency.py:28
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
python.SystemOfUnits.nanosecond
int nanosecond
Definition: SystemOfUnits.py:119
CaloCell_ID::em_idHelper
const LArEM_ID * em_idHelper() const
access to EM idHelper
Definition: CaloCell_ID.h:63
AtlasDetectorID::is_lar_fcal
bool is_lar_fcal(Identifier id) const
Definition: AtlasDetectorID.h:839
LArRawChannelSimpleBuilder::m_averageScaleEM
float m_averageScaleEM
Definition: LArRawChannelSimpleBuilder.h:69
LArEM_Base_ID::is_em_endcap_outer
bool is_em_endcap_outer(const Identifier id) const
test if the id belongs to the EM Endcap outer wheel
eta
Scalar eta() const
pseudorapidity method
Definition: AmgMatrixBasePlugin.h:79
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
ILArPedestal
Definition: ILArPedestal.h:12
LArRawChannelSimpleBuilder::m_peakParabolaTool
ToolHandle< LArParabolaPeakRecoTool > m_peakParabolaTool
Definition: LArRawChannelSimpleBuilder.h:56
conifer::pow
constexpr int pow(int x)
Definition: conifer.h:20
LArOnlID_Exception.h
CaloCondBlobAlgs_fillNoiseFromASCII.gain
gain
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:110
python.SystemOfUnits.MeV
int MeV
Definition: SystemOfUnits.py:154
ReadCellNoiseFromCool.cabling
cabling
Definition: ReadCellNoiseFromCool.py:154
skel.it
it
Definition: skel.GENtoEVGEN.py:423
LArRawChannelSimpleBuilder::m_adc2mevKey
SG::ReadCondHandleKey< LArADC2MeV > m_adc2mevKey
Definition: LArRawChannelSimpleBuilder.h:50
LArFCAL_Base_ID::module
int module(const Identifier id) const
module [1,3]
LArRawChannelSimpleBuilder::m_ADCtoMeVFCAL
float m_ADCtoMeVFCAL[3]
Definition: LArRawChannelSimpleBuilder.h:71
LArRawChannelSimpleBuilder::m_ADCtoMeVEMB
float m_ADCtoMeVEMB[4]
Definition: LArRawChannelSimpleBuilder.h:75
LArEM_Base_ID::sampling
int sampling(const Identifier id) const
return sampling according to :
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
checkRpcDigits.digit
digit
Definition: checkRpcDigits.py:186
HWIdentifier
Definition: HWIdentifier.h:13
LArRawChannelSimpleBuilder::m_ADCtoMeVHEC
float m_ADCtoMeVHEC[2]
Definition: LArRawChannelSimpleBuilder.h:72
ReadCondHandle.h
LArEM_Base_ID::eta
int eta(const Identifier id) const
return eta according to :
LArRawChannelSimpleBuilder::initialize
virtual StatusCode initialize() override
Definition: LArRawChannelSimpleBuilder.cxx:71
CaloCell_ID.h
CaloCell_ID::hec_idHelper
const LArHEC_ID * hec_idHelper() const
access to HEC idHelper
Definition: CaloCell_ID.h:69
AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::detStore
const ServiceHandle< StoreGateSvc > & detStore() const
The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:95
LArRawChannelSimpleBuilder::m_cablingKey
SG::ReadCondHandleKey< LArOnOffIdMapping > m_cablingKey
Definition: LArRawChannelSimpleBuilder.h:48
AthReentrantAlgorithm
An algorithm that can be simultaneously executed in multiple threads.
Definition: AthReentrantAlgorithm.h:83
dqt_zlumi_alleff_HIST.A
A
Definition: dqt_zlumi_alleff_HIST.py:110
LArRawChannelSimpleBuilder::m_usePedestalDB
bool m_usePedestalDB
Definition: LArRawChannelSimpleBuilder.h:67
SG::makeHandle
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
Definition: ReadCondHandle.h:270
LArRawChannelSimpleBuilder::m_ADCtoMeVEMECOuter
float m_ADCtoMeVEMECOuter[4]
Definition: LArRawChannelSimpleBuilder.h:74
LArRawChannelSimpleBuilder::m_imaxSamp
int m_imaxSamp
Definition: LArRawChannelSimpleBuilder.h:63
WriteHandle.h
Handle class for recording to StoreGate.
LArOnlineID_Base::channel
int channel(const HWIdentifier id) const
Return the channel number of a hardware cell identifier channel = [0,127] in all FEB.
Definition: LArOnlineID_Base.cxx:1967
LArRawChannelSimpleBuilder::m_iPedestal
unsigned int m_iPedestal
Definition: LArRawChannelSimpleBuilder.h:77
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
ParticleGun_FastCalo_ChargeFlip_Config.energy
energy
Definition: ParticleGun_FastCalo_ChargeFlip_Config.py:78
xAOD::uint16_t
setWord1 uint16_t
Definition: eFexEMRoI_v1.cxx:88
LArRawChannelSimpleBuilder::m_useRampDB
bool m_useRampDB
Definition: LArRawChannelSimpleBuilder.h:67
LArDigit
Liquid Argon digit base class.
Definition: LArDigit.h:25
lumiFormat.i
int i
Definition: lumiFormat.py:92
LArRawChannel
Liquid Argon ROD output object base class.
Definition: LArRawChannel.h:40
Identifier
Definition: DetectorDescription/Identifier/Identifier/Identifier.h:32
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
01SubmitToGrid.samples
samples
Definition: 01SubmitToGrid.py:58
LArRawChannelSimpleBuilder::m_averageSamplesEM
int m_averageSamplesEM
Definition: LArRawChannelSimpleBuilder.h:68
TRT::Hit::layer
@ layer
Definition: HitInfo.h:79
LArRawChannelSimpleBuilder::m_hecId
const LArHEC_ID * m_hecId
Definition: LArRawChannelSimpleBuilder.h:53
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
AtlasDetectorID::is_lar_hec
bool is_lar_hec(Identifier id) const
Definition: AtlasDetectorID.h:829
LArRawChannelSimpleBuilder::m_fcalId
const LArFCAL_ID * m_fcalId
Definition: LArRawChannelSimpleBuilder.h:52
CaloCell_ID
Helper class for offline cell identifiers.
Definition: CaloCell_ID.h:34
LArRawChannelSimpleBuilder::m_averageSamplesFCAL
int m_averageSamplesFCAL
Definition: LArRawChannelSimpleBuilder.h:68
SG::VarHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:103
LArRawChannelSimpleBuilder::m_ADCtoMeVEMECInner
float m_ADCtoMeVEMECInner[2]
Definition: LArRawChannelSimpleBuilder.h:73
LArOnlineID_Base::feb_Id
HWIdentifier feb_Id(int barrel_ec, int pos_neg, int feedthrough, int slot) const
Create feb_Id from fields.
Definition: LArOnlineID_Base.cxx:1483
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
xAOD::EgammaHelpers::isFCAL
bool isFCAL(const xAOD::CaloCluster *cluster)
return true if the cluster (or the majority of its energy) is in the FCAL0
Definition: EgammaxAODHelpers.cxx:46
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
CaloGain::LARHIGHGAIN
@ LARHIGHGAIN
Definition: CaloGain.h:18
LArDigitContainer.h
LArRawChannelSimpleBuilder::m_emId
const LArEM_ID * m_emId
Definition: LArRawChannelSimpleBuilder.h:51
LArRawChannelSimpleBuilder::LArRawChannelSimpleBuilder
LArRawChannelSimpleBuilder(const std::string &name, ISvcLocator *pSvcLocator)
Definition: LArRawChannelSimpleBuilder.cxx:24
LArEM_Base_ID::is_em_endcap_inner
bool is_em_endcap_inner(const Identifier id) const
test if the id belongs to the EM Endcap inner wheel
CaloGain::CaloGain
CaloGain
Definition: CaloGain.h:11
LArRawChannelSimpleBuilder::m_mode
std::string m_mode
Definition: LArRawChannelSimpleBuilder.h:64
LArADC2MeV
Definition: LArADC2MeV.h:21
CaloGain::LARMEDIUMGAIN
@ LARMEDIUMGAIN
Definition: CaloGain.h:18
CaloSwCorrections.time
def time(flags, cells_name, *args, **kw)
Definition: CaloSwCorrections.py:242
LArEM_Base_ID::is_em_barrel
bool is_em_barrel(const Identifier id) const
test if the id belongs to the EM barrel
ILArPedestal.h
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
LArHEC_Base_ID::sampling
int sampling(const Identifier id) const
return sampling [0,3] (only 0 for supercells)
LArRawChannelSimpleBuilder::m_averageSamplesHEC
int m_averageSamplesHEC
Definition: LArRawChannelSimpleBuilder.h:68
LArRawChannelSimpleBuilder::m_FCALmodeTime
std::string m_FCALmodeTime
Definition: LArRawChannelSimpleBuilder.h:65
LArRawChannelSimpleBuilder.h
python.SystemOfUnits.ns
int ns
Definition: SystemOfUnits.py:130
LArElecCalib::ERRORCODE
@ ERRORCODE
Definition: LArCalibErrorCode.h:17
LArRawChannelSimpleBuilder::m_onlineHelper
const LArOnlineID * m_onlineHelper
Definition: LArRawChannelSimpleBuilder.h:54
LArDigits2NtupleDumper.nSamples
nSamples
Definition: LArDigits2NtupleDumper.py:70
LArRawChannelSimpleBuilder::execute
virtual StatusCode execute(const EventContext &ctx) const override
Definition: LArRawChannelSimpleBuilder.cxx:104
ReadHandle.h
Handle class for reading from StoreGate.
CaloGain::LARLOWGAIN
@ LARLOWGAIN
Definition: CaloGain.h:18
LArRawChannelSimpleBuilder::m_averageScaleFCAL
float m_averageScaleFCAL
Definition: LArRawChannelSimpleBuilder.h:69
LArRawChannelSimpleBuilder::finalize
virtual StatusCode finalize() override
Definition: LArRawChannelSimpleBuilder.cxx:584
LArRawChannelSimpleBuilder::m_averageScaleHEC
float m_averageScaleHEC
Definition: LArRawChannelSimpleBuilder.h:69
AtlasDetectorID::is_lar_em
bool is_lar_em(Identifier id) const
Definition: AtlasDetectorID.h:818
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
readCCLHist.float
float
Definition: readCCLHist.py:83
LArRawChannelSimpleBuilder::m_DataLocation
SG::ReadHandleKey< LArDigitContainer > m_DataLocation
Definition: LArRawChannelSimpleBuilder.h:60
LArID_Exception
Exception class for LAr Identifiers.
Definition: LArID_Exception.h:20
DataVector::empty
bool empty() const noexcept
Returns true if the collection is empty.
CaloCell_ID::fcal_idHelper
const LArFCAL_ID * fcal_idHelper() const
access to FCAL idHelper
Definition: CaloCell_ID.h:75
LArOnlineID.h
LArVectorProxy
Proxy for accessing a range of float values like a vector.
Definition: LArVectorProxy.h:38
LArOnOffIdMapping
Definition: LArOnOffIdMapping.h:20