ATLAS Offline Software
Loading...
Searching...
No Matches
LArRawChannelSimpleBuilder Class Reference

CTB simplified LArRawChannelBuilder using hardcoded calib. constants. More...

#include <LArRawChannelSimpleBuilder.h>

Inheritance diagram for LArRawChannelSimpleBuilder:

Public Member Functions

 LArRawChannelSimpleBuilder (const std::string &name, ISvcLocator *pSvcLocator)
virtual StatusCode initialize () override
virtual StatusCode execute (const EventContext &ctx) const override
virtual StatusCode finalize () override
virtual StatusCode sysInitialize () override
 Override sysInitialize.
virtual bool isClonable () const override
 Specify if the algorithm is clonable.
virtual unsigned int cardinality () const override
 Cardinality (Maximum number of clones that can exist) special value 0 means that algorithm is reentrant.
virtual StatusCode sysExecute (const EventContext &ctx) override
 Execute an algorithm.
virtual const DataObjIDColl & extraOutputDeps () const override
 Return the list of extra output dependencies.
virtual bool filterPassed (const EventContext &ctx) const
virtual void setFilterPassed (bool state, const EventContext &ctx) const
ServiceHandle< StoreGateSvc > & evtStore ()
 The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
const ServiceHandle< StoreGateSvc > & detStore () const
 The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
virtual StatusCode sysStart () override
 Handle START transition.
virtual std::vector< Gaudi::DataHandle * > inputHandles () const override
 Return this algorithm's input handles.
virtual std::vector< Gaudi::DataHandle * > outputHandles () const override
 Return this algorithm's output handles.
Gaudi::Details::PropertyBase & declareProperty (Gaudi::Property< T, V, H > &t)
void updateVHKA (Gaudi::Details::PropertyBase &)
MsgStream & msg () const
bool msgLvl (const MSG::Level lvl) const

Protected Member Functions

void renounceArray (SG::VarHandleKeyArray &handlesArray)
 remove all handles from I/O resolution
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce (T &h)
void extraDeps_update_handler (Gaudi::Details::PropertyBase &ExtraDeps)
 Add StoreName to extra input/output deps as needed.

Private Types

typedef ServiceHandle< StoreGateSvcStoreGateSvc_t

Private Member Functions

Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
 specialization for handling Gaudi::Property<SG::VarHandleKey>

Private Attributes

SG::ReadCondHandleKey< LArOnOffIdMappingm_cablingKey {this, "OnOffMap", "LArOnOffIdMap", "SG key for mapping object"}
SG::ReadCondHandleKey< LArADC2MeVm_adc2mevKey { this, "ADC2MeVKey", "LArADC2MeV", "SG Key of the LArADC2MeV CDO" }
const LArEM_IDm_emId
const LArFCAL_IDm_fcalId
const LArHEC_IDm_hecId
const LArOnlineIDm_onlineHelper
ToolHandle< LArParabolaPeakRecoToolm_peakParabolaTool
SG::ReadHandleKey< LArDigitContainerm_DataLocation { this, "DataLocation", "FREE", "" }
SG::WriteHandleKey< LArRawChannelContainerm_ChannelContainerName { this, "LArRawChannelContainerName", "LArRawChannels", "" }
int m_imaxSamp
std::string m_mode
std::string m_FCALmodeTime
float m_cubicAdcCut
bool m_useRampDB
bool m_usePedestalDB
int m_averageSamplesEM
int m_averageSamplesHEC
int m_averageSamplesFCAL
float m_averageScaleEM
float m_averageScaleHEC
float m_averageScaleFCAL
float m_ADCtoMeVFCAL [3] {}
float m_ADCtoMeVHEC [2] {}
float m_ADCtoMeVEMECInner [2] {}
float m_ADCtoMeVEMECOuter [4] {}
float m_ADCtoMeVEMB [4] {}
unsigned int m_iPedestal
DataObjIDColl m_extendedExtraObjects
 Extra output dependency collection, extended by AthAlgorithmDHUpdate to add symlinks.
StoreGateSvc_t m_evtStore
 Pointer to StoreGate (event store by default)
StoreGateSvc_t m_detStore
 Pointer to StoreGate (detector store by default)
std::vector< SG::VarHandleKeyArray * > m_vhka
bool m_varHandleArraysDeclared

Detailed Description

CTB simplified LArRawChannelBuilder using hardcoded calib. constants.

Author
Walter Lampl
Rob McPherson
Sandrine Laplace

Definition at line 35 of file LArRawChannelSimpleBuilder.h.

Member Typedef Documentation

◆ StoreGateSvc_t

typedef ServiceHandle<StoreGateSvc> AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::StoreGateSvc_t
privateinherited

Definition at line 388 of file AthCommonDataStore.h.

Constructor & Destructor Documentation

◆ LArRawChannelSimpleBuilder()

LArRawChannelSimpleBuilder::LArRawChannelSimpleBuilder ( const std::string & name,
ISvcLocator * pSvcLocator )

Definition at line 24 of file LArRawChannelSimpleBuilder.cxx.

24 :
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}
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
ToolHandle< LArParabolaPeakRecoTool > m_peakParabolaTool

Member Function Documentation

◆ cardinality()

unsigned int AthCommonReentrantAlgorithm< Gaudi::Algorithm >::cardinality ( ) const
overridevirtualinherited

Cardinality (Maximum number of clones that can exist) special value 0 means that algorithm is reentrant.

Override this to return 0 for reentrant algorithms.

Definition at line 75 of file AthCommonReentrantAlgorithm.cxx.

64{
65 return 0;
66}

◆ declareGaudiProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::declareGaudiProperty ( Gaudi::Property< T, V, H > & hndl,
const SG::VarHandleKeyType &  )
inlineprivateinherited

specialization for handling Gaudi::Property<SG::VarHandleKey>

Definition at line 156 of file AthCommonDataStore.h.

158 {
160 hndl.value(),
161 hndl.documentation());
162
163 }

◆ declareProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::declareProperty ( Gaudi::Property< T, V, H > & t)
inlineinherited

Definition at line 145 of file AthCommonDataStore.h.

145 {
146 typedef typename SG::HandleClassifier<T>::type htype;
148 }
Gaudi::Details::PropertyBase & declareGaudiProperty(Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
specialization for handling Gaudi::Property<SG::VarHandleKey>

◆ detStore()

const ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::detStore ( ) const
inlineinherited

The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 95 of file AthCommonDataStore.h.

◆ evtStore()

ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::evtStore ( )
inlineinherited

The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 85 of file AthCommonDataStore.h.

◆ execute()

StatusCode LArRawChannelSimpleBuilder::execute ( const EventContext & ctx) const
overridevirtual

Definition at line 104 of file LArRawChannelSimpleBuilder.cxx.

105{
106 ATH_MSG_DEBUG( "In execute" );
107
108 //Retrieve Digit Container
109 ATH_MSG_DEBUG( "About to retrieve LArDigitContainer with key " << m_DataLocation );
110 SG::ReadHandle<LArDigitContainer> digitContainer (m_DataLocation, ctx);
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
130 SG::ReadCondHandle<LArOnOffIdMapping> cablingHdl{m_cablingKey, ctx};
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) {
139 SG::ReadCondHandle<LArADC2MeV> adc2mevH (m_adc2mevKey, ctx);
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}
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)
constexpr int pow(int base, int exp) noexcept
const ServiceHandle< StoreGateSvc > & detStore() const
virtual float pedestal(const HWIdentifier &id, int gain) const =0
const LArVectorProxy ADC2MEV(const HWIdentifier &id, int gain) const
Definition LArADC2MeV.h:32
SG::ReadHandleKey< LArDigitContainer > m_DataLocation
SG::ReadCondHandleKey< LArADC2MeV > m_adc2mevKey
SG::ReadCondHandleKey< LArOnOffIdMapping > m_cablingKey
SG::WriteHandleKey< LArRawChannelContainer > m_ChannelContainerName
@ LARMEDIUMGAIN
Definition CaloGain.h:18
@ LARLOWGAIN
Definition CaloGain.h:18
@ LARHIGHGAIN
Definition CaloGain.h:18
time(flags, cells_name, *args, **kw)
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
@ layer
Definition HitInfo.h:79
retrieve(aClass, aKey=None)
Definition PyKernel.py:110
bool isFCAL(const xAOD::CaloCluster *cluster)
return true if the cluster (or the majority of its energy) is in the FCAL0
setWord1 uint16_t

◆ extraDeps_update_handler()

void AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::extraDeps_update_handler ( Gaudi::Details::PropertyBase & ExtraDeps)
protectedinherited

Add StoreName to extra input/output deps as needed.

use the logic of the VarHandleKey to parse the DataObjID keys supplied via the ExtraInputs and ExtraOuputs Properties to add the StoreName if it's not explicitly given

◆ extraOutputDeps()

const DataObjIDColl & AthCommonReentrantAlgorithm< Gaudi::Algorithm >::extraOutputDeps ( ) const
overridevirtualinherited

Return the list of extra output dependencies.

This list is extended to include symlinks implied by inheritance relations.

Definition at line 94 of file AthCommonReentrantAlgorithm.cxx.

90{
91 // If we didn't find any symlinks to add, just return the collection
92 // from the base class. Otherwise, return the extended collection.
93 if (!m_extendedExtraObjects.empty()) {
95 }
97}
An algorithm that can be simultaneously executed in multiple threads.

◆ filterPassed()

virtual bool AthCommonReentrantAlgorithm< Gaudi::Algorithm >::filterPassed ( const EventContext & ctx) const
inlinevirtualinherited

Definition at line 96 of file AthCommonReentrantAlgorithm.h.

96 {
97 return execState( ctx ).filterPassed();
98 }
virtual bool filterPassed(const EventContext &ctx) const

◆ finalize()

StatusCode LArRawChannelSimpleBuilder::finalize ( )
overridevirtual

Definition at line 584 of file LArRawChannelSimpleBuilder.cxx.

585{//Error and Warning Summary for this job:
586
587 ATH_MSG_INFO( "LArRawChannelSimpleBuilder finished." );
588
589 return StatusCode::SUCCESS;
590}

◆ initialize()

StatusCode LArRawChannelSimpleBuilder::initialize ( )
overridevirtual

Definition at line 71 of file LArRawChannelSimpleBuilder.cxx.

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}
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

◆ inputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::inputHandles ( ) const
overridevirtualinherited

Return this algorithm's input handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ isClonable()

◆ msg()

MsgStream & AthCommonMsg< Gaudi::Algorithm >::msg ( ) const
inlineinherited

Definition at line 24 of file AthCommonMsg.h.

24 {
25 return this->msgStream();
26 }

◆ msgLvl()

bool AthCommonMsg< Gaudi::Algorithm >::msgLvl ( const MSG::Level lvl) const
inlineinherited

Definition at line 30 of file AthCommonMsg.h.

30 {
31 return this->msgLevel(lvl);
32 }

◆ outputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::outputHandles ( ) const
overridevirtualinherited

Return this algorithm's output handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ renounce()

std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::renounce ( T & h)
inlineprotectedinherited

Definition at line 380 of file AthCommonDataStore.h.

381 {
382 h.renounce();
384 }
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce(T &h)

◆ renounceArray()

void AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::renounceArray ( SG::VarHandleKeyArray & handlesArray)
inlineprotectedinherited

remove all handles from I/O resolution

Definition at line 364 of file AthCommonDataStore.h.

364 {
366 }

◆ setFilterPassed()

virtual void AthCommonReentrantAlgorithm< Gaudi::Algorithm >::setFilterPassed ( bool state,
const EventContext & ctx ) const
inlinevirtualinherited

Definition at line 100 of file AthCommonReentrantAlgorithm.h.

100 {
102 }
virtual void setFilterPassed(bool state, const EventContext &ctx) const

◆ sysExecute()

StatusCode AthCommonReentrantAlgorithm< Gaudi::Algorithm >::sysExecute ( const EventContext & ctx)
overridevirtualinherited

Execute an algorithm.

We override this in order to work around an issue with the Algorithm base class storing the event context in a member variable that can cause crashes in MT jobs.

Definition at line 85 of file AthCommonReentrantAlgorithm.cxx.

77{
78 return BaseAlg::sysExecute (ctx);
79}

◆ sysInitialize()

StatusCode AthCommonReentrantAlgorithm< Gaudi::Algorithm >::sysInitialize ( )
overridevirtualinherited

Override sysInitialize.

Override sysInitialize from the base class.

Loop through all output handles, and if they're WriteCondHandles, automatically register them and this Algorithm with the CondSvc

Scan through all outputHandles, and if they're WriteCondHandles, register them with the CondSvc

Reimplemented from AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >.

Reimplemented in HypoBase, and InputMakerBase.

Definition at line 61 of file AthCommonReentrantAlgorithm.cxx.

107 {
109
110 if (sc.isFailure()) {
111 return sc;
112 }
113
114 ServiceHandle<ICondSvc> cs("CondSvc",name());
115 for (auto h : outputHandles()) {
116 if (h->isCondition() && h->mode() == Gaudi::DataHandle::Writer) {
117 // do this inside the loop so we don't create the CondSvc until needed
118 if ( cs.retrieve().isFailure() ) {
119 ATH_MSG_WARNING("no CondSvc found: won't autoreg WriteCondHandles");
120 return StatusCode::SUCCESS;
121 }
122 if (cs->regHandle(this,*h).isFailure()) {
124 ATH_MSG_ERROR("unable to register WriteCondHandle " << h->fullKey()
125 << " with CondSvc");
126 }
127 }
128 }
129 return sc;
130}
virtual std::vector< Gaudi::DataHandle * > outputHandles() const override

◆ sysStart()

virtual StatusCode AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::sysStart ( )
overridevirtualinherited

Handle START transition.

We override this in order to make sure that conditions handle keys can cache a pointer to the conditions container.

◆ updateVHKA()

void AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::updateVHKA ( Gaudi::Details::PropertyBase & )
inlineinherited

Definition at line 308 of file AthCommonDataStore.h.

308 {
309 // debug() << "updateVHKA for property " << p.name() << " " << p.toString()
310 // << " size: " << m_vhka.size() << endmsg;
311 for (auto &a : m_vhka) {
313 for (auto k : keys) {
314 k->setOwner(this);
315 }
316 }
317 }

Member Data Documentation

◆ m_adc2mevKey

SG::ReadCondHandleKey<LArADC2MeV> LArRawChannelSimpleBuilder::m_adc2mevKey { this, "ADC2MeVKey", "LArADC2MeV", "SG Key of the LArADC2MeV CDO" }
private

Definition at line 49 of file LArRawChannelSimpleBuilder.h.

50{ this, "ADC2MeVKey", "LArADC2MeV", "SG Key of the LArADC2MeV CDO" };

◆ m_ADCtoMeVEMB

float LArRawChannelSimpleBuilder::m_ADCtoMeVEMB[4] {}
private

Definition at line 75 of file LArRawChannelSimpleBuilder.h.

75{};

◆ m_ADCtoMeVEMECInner

float LArRawChannelSimpleBuilder::m_ADCtoMeVEMECInner[2] {}
private

Definition at line 73 of file LArRawChannelSimpleBuilder.h.

73{};

◆ m_ADCtoMeVEMECOuter

float LArRawChannelSimpleBuilder::m_ADCtoMeVEMECOuter[4] {}
private

Definition at line 74 of file LArRawChannelSimpleBuilder.h.

74{};

◆ m_ADCtoMeVFCAL

float LArRawChannelSimpleBuilder::m_ADCtoMeVFCAL[3] {}
private

Definition at line 71 of file LArRawChannelSimpleBuilder.h.

71{};

◆ m_ADCtoMeVHEC

float LArRawChannelSimpleBuilder::m_ADCtoMeVHEC[2] {}
private

Definition at line 72 of file LArRawChannelSimpleBuilder.h.

72{};

◆ m_averageSamplesEM

int LArRawChannelSimpleBuilder::m_averageSamplesEM
private

Definition at line 68 of file LArRawChannelSimpleBuilder.h.

◆ m_averageSamplesFCAL

int LArRawChannelSimpleBuilder::m_averageSamplesFCAL
private

Definition at line 68 of file LArRawChannelSimpleBuilder.h.

◆ m_averageSamplesHEC

int LArRawChannelSimpleBuilder::m_averageSamplesHEC
private

Definition at line 68 of file LArRawChannelSimpleBuilder.h.

◆ m_averageScaleEM

float LArRawChannelSimpleBuilder::m_averageScaleEM
private

Definition at line 69 of file LArRawChannelSimpleBuilder.h.

◆ m_averageScaleFCAL

float LArRawChannelSimpleBuilder::m_averageScaleFCAL
private

Definition at line 69 of file LArRawChannelSimpleBuilder.h.

◆ m_averageScaleHEC

float LArRawChannelSimpleBuilder::m_averageScaleHEC
private

Definition at line 69 of file LArRawChannelSimpleBuilder.h.

◆ m_cablingKey

SG::ReadCondHandleKey<LArOnOffIdMapping> LArRawChannelSimpleBuilder::m_cablingKey {this, "OnOffMap", "LArOnOffIdMap", "SG key for mapping object"}
private

Definition at line 48 of file LArRawChannelSimpleBuilder.h.

48{this, "OnOffMap", "LArOnOffIdMap", "SG key for mapping object"};

◆ m_ChannelContainerName

SG::WriteHandleKey<LArRawChannelContainer> LArRawChannelSimpleBuilder::m_ChannelContainerName { this, "LArRawChannelContainerName", "LArRawChannels", "" }
private

Definition at line 61 of file LArRawChannelSimpleBuilder.h.

62{ this, "LArRawChannelContainerName", "LArRawChannels", "" };

◆ m_cubicAdcCut

float LArRawChannelSimpleBuilder::m_cubicAdcCut
private

Definition at line 66 of file LArRawChannelSimpleBuilder.h.

◆ m_DataLocation

SG::ReadHandleKey<LArDigitContainer> LArRawChannelSimpleBuilder::m_DataLocation { this, "DataLocation", "FREE", "" }
private

Definition at line 59 of file LArRawChannelSimpleBuilder.h.

60{ this, "DataLocation", "FREE", "" };

◆ m_detStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_detStore
privateinherited

Pointer to StoreGate (detector store by default)

Definition at line 393 of file AthCommonDataStore.h.

◆ m_emId

const LArEM_ID* LArRawChannelSimpleBuilder::m_emId
private

Definition at line 51 of file LArRawChannelSimpleBuilder.h.

◆ m_evtStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_evtStore
privateinherited

Pointer to StoreGate (event store by default)

Definition at line 390 of file AthCommonDataStore.h.

◆ m_extendedExtraObjects

DataObjIDColl AthCommonReentrantAlgorithm< Gaudi::Algorithm >::m_extendedExtraObjects
privateinherited

Extra output dependency collection, extended by AthAlgorithmDHUpdate to add symlinks.

Empty if no symlinks were found.

Definition at line 114 of file AthCommonReentrantAlgorithm.h.

◆ m_fcalId

const LArFCAL_ID* LArRawChannelSimpleBuilder::m_fcalId
private

Definition at line 52 of file LArRawChannelSimpleBuilder.h.

◆ m_FCALmodeTime

std::string LArRawChannelSimpleBuilder::m_FCALmodeTime
private

Definition at line 65 of file LArRawChannelSimpleBuilder.h.

◆ m_hecId

const LArHEC_ID* LArRawChannelSimpleBuilder::m_hecId
private

Definition at line 53 of file LArRawChannelSimpleBuilder.h.

◆ m_imaxSamp

int LArRawChannelSimpleBuilder::m_imaxSamp
private

Definition at line 63 of file LArRawChannelSimpleBuilder.h.

◆ m_iPedestal

unsigned int LArRawChannelSimpleBuilder::m_iPedestal
private

Definition at line 77 of file LArRawChannelSimpleBuilder.h.

◆ m_mode

std::string LArRawChannelSimpleBuilder::m_mode
private

Definition at line 64 of file LArRawChannelSimpleBuilder.h.

◆ m_onlineHelper

const LArOnlineID* LArRawChannelSimpleBuilder::m_onlineHelper
private

Definition at line 54 of file LArRawChannelSimpleBuilder.h.

◆ m_peakParabolaTool

ToolHandle<LArParabolaPeakRecoTool> LArRawChannelSimpleBuilder::m_peakParabolaTool
private

Definition at line 56 of file LArRawChannelSimpleBuilder.h.

◆ m_usePedestalDB

bool LArRawChannelSimpleBuilder::m_usePedestalDB
private

Definition at line 67 of file LArRawChannelSimpleBuilder.h.

◆ m_useRampDB

bool LArRawChannelSimpleBuilder::m_useRampDB
private

Definition at line 67 of file LArRawChannelSimpleBuilder.h.

◆ m_varHandleArraysDeclared

bool AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_varHandleArraysDeclared
privateinherited

Definition at line 399 of file AthCommonDataStore.h.

◆ m_vhka

std::vector<SG::VarHandleKeyArray*> AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_vhka
privateinherited

Definition at line 398 of file AthCommonDataStore.h.


The documentation for this class was generated from the following files: