74 return StatusCode::FAILURE;
82 ATH_MSG_DEBUG (
"1) LArDigitContainer container size = " << digitContainer->
size() );
84 ATH_MSG_DEBUG (
"2) LArDigitContainer container size = " << digitContainer->
size() );
85 if( digitContainer->
size() < 1 ) {
87 return StatusCode::SUCCESS;
93 larRawChannelContainer->reserve(digitContainer->
size());
99 for (
const LArDigit* digit : *digitContainer) {
102 const std::vector<short>& samples = digit->samples();
103 unsigned int nSamples = samples.size();
108 std::vector<float> mySamples;
109 mySamples.resize(samples.size());
114 for (
unsigned int i=0; i<samples.size(); i++ )
116 mySamples[i] = ((float)samples[i]) - thePedestal;
122 GainFactor = 9.8*9.8;
129 ATH_MSG_ERROR (
"Channel " << chid <<
"unknown gain: " << gain );
133 float maxADCPeak = 0.;
134 unsigned int iPeakSamp = 0;
135 for(
unsigned i=0;i<nSamples;i++ ) {
136 if ( maxADCPeak < mySamples[i] )
138 maxADCPeak = mySamples[i];
143 bool CubicFailed =
false;
150 ADCPeak = maxADCPeak;
151 time = ((float)iPeakSamp+0.5) * 25.0 * nanosecond;
155 else if (
m_mode ==
"CUBIC" &&
160 const float invT[4][4]
162 { -1.83333, 3, -1.5, 0.333333},
164 {-0.166666, 0.5, -0.5, 0.166666} };
167 if ( iPeakSamp <= 1 )
172 else if ( iPeakSamp >= nSamples - 2 )
179 it0 = ( mySamples[iPeakSamp-2] > mySamples[iPeakSamp+2] )
185 float A[4] = {0, 0, 0, 0};
189 for (
int ia = 0; ia < 4; ia++)
190 for (
int it = 0; it < 4; it++)
191 A[ia] += invT[ia][it] * mySamples[it0+it];
194 disc =
A[2]*
A[2] - 3*
A[1]*
A[3];
195 if ( ! ( CubicFailed = ( disc < 0 ||
A[3] == 0 ) ) )
197 dtmax = (-
A[2]-sqrt(disc))/(3*
A[3]);
198 if ( ! ( CubicFailed = ( dtmax < 0 || dtmax > 3 ) ) )
200 time = (float(it0) + dtmax) * 25.0 * nanosecond;
201 for(
int ia = 0; ia < 4; ia++)
202 ADCPeak +=
A[ia] *
pow(dtmax, ia);
218 if(
m_mode ==
"FIXED" || CubicFailed )
221 time = (float(
m_imaxSamp)+0.5) * 25.0 * nanosecond;
226 float ADCtoMeV = 10.0;
227 const Identifier id = cabling->cnvToIdentifier(chid);
228 if (
m_emId->is_em_barrel(
id)) {
232 }
else if (
m_emId->is_em_endcap_inner(
id)) {
233 int samp =
m_emId->sampling(
id);
236 ATH_MSG_DEBUG (
" in EMEC inner s="<<
m_emId->sampling(
id)<<
", using ADCtoMeV = " << ADCtoMeV );
238 }
else if (
m_emId->is_em_endcap_outer(
id)) {
239 int samp =
m_emId->sampling(
id);
242 ATH_MSG_DEBUG (
" in EMEC outer s="<<
m_emId->sampling(
id)<<
", using ADCtoMeV = " << ADCtoMeV );
244 }
else if (
m_fcalId->is_lar_fcal(
id)) {
250 }
else if (
m_hecId->is_lar_hec(
id)) {
256 float Energy = ADCPeak * ADCtoMeV * GainFactor;
258 uint16_t provenance=0x2000;
262 larRawChannelContainer->
add(larRawChannel);
270 ATH_MSG_DEBUG (
"sorted RawChannelContainer, now lock it " );
274 return StatusCode::SUCCESS;