111 ATH_MSG_DEBUG(
"1) LArDigitContainer container size = " << digitContainer->size() );
113 ATH_MSG_DEBUG(
"2) LArDigitContainer container size = " << digitContainer->size() );
114 if( digitContainer->empty() ) {
116 return StatusCode::SUCCESS;
119 auto larRawChannelContainer = std::make_unique<LArRawChannelContainer>();
124 if (
detStore()->retrieve(larPedestal).isFailure()) {
126 ATH_MSG_DEBUG(
"No pedestal found in database. Use default values." );
134 return StatusCode::FAILURE;
149 int nMinEM(0),nMinHEC(0),nMinFCAL(0);
150 std::vector<float> fSumEM,fSumHEC,fSumFCAL;
151 std::vector<float> *pSum =
nullptr;
157 for(
int iloop=0;iloop<2;iloop++) {
162 for (
const LArDigit* digit : *digitContainer) {
165 const std::vector<short>& samples = digit->samples();
166 unsigned int nSamples = samples.size();
171 float thePedestal=-1;
173 float DBpedestal =larPedestal->
pedestal(chid,gain);
175 thePedestal=DBpedestal;
179 ATH_MSG_DEBUG(
"No pedestal found for this cell. Use default value " << thePedestal );
182 std::vector<float> mySamples;
183 mySamples.resize(samples.size());
188 for (
unsigned int i=0; i<samples.size(); i++ )
190 mySamples[i] = ((float)samples[i]) - thePedestal;
196 GainFactor = 9.8*9.8;
203 ATH_MSG_ERROR(
"Channel " << chid <<
"unknown gain: " << gain );
209 ATH_MSG_DEBUG( std::hex <<
" FebID / chid / channel = " << FebID <<
" / " << chid <<
" / " << channel );
217 unsigned int nAverage = 1;
220 const Identifier id = cabling->cnvToIdentifier(chid);
228 else if (
m_emId->is_lar_em(
id)) {
235 else if (
m_hecId->is_lar_hec(
id)) {
257 if ( nAverage > nSamples ) {
259 << nAverage <<
") is larger than total number of samples ("
260 << nSamples <<
")! adjusting nAverage ... " );
269 pSum->resize(nSamples,0);
271 for(
unsigned i=0;i<nSamples-nAverage+1;i++ ) {
272 for(
unsigned j=0;j<nAverage;j++ ) {
273 (*pSum)[i] += mySamples[i+j];
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] )
284 maxADCPeak = mySamples[i];
287 if ( (
int)i >= nMin && i < nMin+nAverage )
288 averagedADC += mySamples[i];
290 averagedADC /= myScale;
292 bool CubicFailed =
false;
300 ADCPeak = maxADCPeak;
301 time = ((float)iPeakSamp) * 25.0 * nanosecond;
309 if(isFCAL &&
m_mode ==
"CUBIC" &&
316 const float invT[3][3]
322 if ( iPeakSamp <= 1 ) {
324 }
else if ( iPeakSamp >= nSamples - 1 ) {
332 float A[3] = {0, 0, 0};
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];
340 if ( not ( CubicFailed = (
A[2] == 0 ) ) ) {
341 dtmax = -1.0 *
A[1] / 2.0 /
A[2];
342 if ( ! ( CubicFailed = ( dtmax < 0 || dtmax > 2 ) ) ) {
345 for(
int ia = 0; ia < 3; ia++)
346 ADCPeak +=
A[ia] *
pow(dtmax, ia);
352 float weightSum = 0.;
354 for(
int it=0; it<3; it++) {
355 timeSum += float(mySamples[it0+it]) * float(it);
356 weightSum += float(mySamples[it0+it]);
358 time = (float(it0) + timeSum / weightSum) * 25.0 * nanosecond;
365 }
else if(not isFCAL ||
m_mode !=
"CUBIC" ) {
368 if (
m_mode ==
"PARABOLA" &&
373 const Identifier id = cabling->cnvToIdentifier(chid);
375 if (
m_emId->is_em_barrel(
id)) {
376 layer=
m_emId->sampling(
id);
381 <<
" Cannot get offline identifier from online ID = " << chid );
386 ADCPeak = peak[0]-thePedestal;
387 if (peak.size()==2)time = peak[1];
390 ATH_MSG_DEBUG(
"No pic is computed from Parabola. Use scaled average of selected samples" );
391 ADCPeak = averagedADC;
395 ATH_MSG_FATAL(
"No parabola tool available ! Choose another mode" );
400 else if (
m_mode ==
"CUBIC" &&
404 const float invT[4][4]
406 { -1.83333, 3, -1.5, 0.333333},
408 {-0.166666, 0.5, -0.5, 0.166666} };
411 if ( iPeakSamp <= 1 ) {
413 }
else if ( iPeakSamp >= nSamples - 2 ) {
416 it0 = ( mySamples[iPeakSamp-2] > mySamples[iPeakSamp+2] )
422 float A[4] = {0, 0, 0, 0};
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];
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;
436 for(
int ia = 0; ia < 4; ia++)
437 ADCPeak +=
A[ia] *
pow(dtmax, ia);
445 if(
m_mode ==
"FIXED" || CubicFailed ) {
446 ADCPeak = averagedADC;
453 << (isEM?
"EM":(isHEC?
"HEC":(isFCAL?
"FCAL":
"none")))
466 float ADCPeakPower=ADCPeak;
470 if (ramp.size()>1 && ramp[1]<500 && ramp[1]>0) {
472 for (
unsigned i=1;i<ramp.size();i++)
473 {energy+=ramp[i]*ADCPeakPower;
475 ADCPeakPower*=ADCPeak;
480 ATH_MSG_DEBUG(
"No Ramp found for this cell. Use default values" );
483 float ADCtoMeV = 10.0;
491 const Identifier id = cabling->cnvToIdentifier(chid);
495 if (
m_emId->is_em_barrel(
id)) {
496 const int layer=
m_emId->sampling(
id);
499 if (layer==2 &&
eta<32)
500 ADCtoMeV=ADCtoMeV*(12./18.);
501 ATH_MSG_DEBUG(
" in EMB s="<< layer <<
", using ADCtoMeV = " << ADCtoMeV );
502 }
else if (
m_emId->is_em_endcap_inner(
id)) {
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)) {
510 ATH_MSG_DEBUG(
" in EMEC outer s="<<
m_emId->sampling(
id)<<
", using ADCtoMeV = " << ADCtoMeV );
511 }
else if (
m_fcalId->is_lar_fcal(
id)) {
515 }
else if (
m_hecId->is_lar_hec(
id)) {
527 energy = ADCPeak * ADCtoMeV * GainFactor;
530 uint16_t iprovenance=0;
534 LArRawChannel larRawChannel(chid,(
int)energy,(
int)time,iquality,iprovenance, gain);
535 larRawChannelContainer->add(larRawChannel);
543 if ( !fSumEM.empty() ) {
544 for(i=0;i<fSumEM.size();i++) {
545 if (i == 0 || fSumEM[i] > tmpSum ) {
550 ATH_MSG_DEBUG(
"Found best EM window starting at sample <" << nMinEM <<
">" );
553 for(i=0;i<fSumHEC.size();i++) {
554 if (i == 0 || fSumHEC[i] > tmpSum ) {
559 if ( !fSumHEC.empty() ) {
560 ATH_MSG_DEBUG(
"Found best HEC window starting at sample <" << nMinHEC <<
">" );
563 for(i=0;i<fSumFCAL.size();i++) {
564 if (i == 0 || fSumFCAL[i] > tmpSum ) {
566 tmpSum = fSumFCAL[i];
569 if ( !fSumFCAL.empty() ) {
570 ATH_MSG_DEBUG(
"Found best FCAL window starting at sample <" << nMinFCAL <<
">" );
581 return StatusCode::SUCCESS;