ATLAS Offline Software
Loading...
Searching...
No Matches
ZDC_PileUpTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
5
9
13
18#include "CLHEP/Random/RandomEngine.h"
19#include "CLHEP/Random/RandFlat.h"
20#include "CLHEP/Random/RandGaussQ.h"
21#include "CLHEP/Random/RandPoissonQ.h"
22#include <algorithm>
23
25 const std::string& name,
26 const IInterface* parent) :
27 PileUpToolBase(type, name, parent)
28{
29}
30
32
33 ATH_MSG_DEBUG ( "ZDC_PileUpTool::initialize() called" );
34
35 const ZdcID* zdcId = nullptr;
36 if (detStore()->retrieve( zdcId ).isFailure() ) {
37 ATH_MSG_ERROR("execute: Could not retrieve ZdcID object from the detector store");
38 return StatusCode::FAILURE;
39 }
40 else {
41 ATH_MSG_DEBUG("execute: retrieved ZdcID");
42 }
43 m_ZdcID = zdcId;
44
45 ATH_CHECK(m_randomSvc.retrieve());
46 ATH_MSG_DEBUG ( "Retrieved RandomNumber Service" );
47
51
52 ATH_MSG_INFO("ZDC_PileUpTool configuration = " << m_configuration);
53
54 if(m_configuration == "PbPb2015"){
56 }else if(m_configuration == "LHCf2022"){
58 }else if(m_configuration == "PbPb2023"){
60 }
61
62 m_mergedFiberHitList = new ZDC_SimFiberHit_Collection("mergedFiberHitList");
63
64 return StatusCode::SUCCESS;
65}
66
68
69 m_Pedestal = 100;
70 m_numTimeBins = 7;
71 m_freqMHz = 80;
72 m_delayChannels = true;
73 m_LTQuadStepFilt = true;
74 m_doRPD = false;
75 m_doBRAN = false;
76 m_zdct0 = 28;
77 m_qsfRiseTime = 0.5;
78 m_qsfFallTime = 11;
79 m_qsfFilter = 15;
80}
81
83
84 m_Pedestal = 100;
85 m_numTimeBins = 24;
86 m_freqMHz = 320;
87 m_delayChannels = false;
88 m_LTQuadStepFilt = false;
89 m_doRPD = false;
90 m_doBRAN = false;
91 m_zdct0 = 28;
92 m_rpdt0 = 28;
93 m_zdcRiseTime = 1;
94 m_zdcFallTime = 5.5;
95 m_zdcAdcPerPhoton = 0.000498;
96}
97
99
100 m_Pedestal = 100;
101 m_numTimeBins = 24;
102 m_freqMHz = 320;
103 m_delayChannels = false;
104 m_LTQuadStepFilt = false;
105 m_doRPD = true;
106 m_doBRAN = true;
107 m_zdct0 = 31.2;
108 m_rpdt0 = 27.9;
109 m_zdcRiseTime = 1.1;
110 m_zdcFallTime = 4.5;
111 m_rpdRiseTime = 0.8;
112 m_rpdFallTime = 15;
113 m_zdcAdcPerPhoton = 0.000498;
114 m_rpdAdcPerPhoton = {5.25 , 1.7};
115}
116
117StatusCode ZDC_PileUpTool::processAllSubEvents(const EventContext& ctx){
118
119 ATH_MSG_DEBUG ( "ZDC_PileUpTool::processAllSubEvents()" );
120
121 ATHRNG::RNGWrapper* rngWrapper = m_randomSvc->getEngine(this, m_randomStreamName);
122 rngWrapper->setSeed( m_randomStreamName, ctx );
123 CLHEP::HepRandomEngine* rngEngine = rngWrapper->getEngine(ctx);
124
125 /******************************************
126 * retrieve the hit collection list (input)
127 ******************************************/
128
130 if (!hitCollection.isValid()) {
131 ATH_MSG_ERROR("Could not get ZDC_SimFiberHit_Collection container " << hitCollection.name() << " from store " << hitCollection.store());
132 return StatusCode::FAILURE;
133 }
134 ATH_MSG_DEBUG("ZDC_SimFiberHitHitCollection found with " << hitCollection->size() << " hits");
135
136 /******************************************
137 * Do light guide efficiency cuts on the ZDCs
138 ******************************************/
139 TimedHitCollection<ZDC_SimFiberHit> thpcZDC_Fiber = doZDClightGuideCuts(hitCollection.cptr());
140
141 /******************************************
142 * Create the output container
143 ******************************************/
144 std::unique_ptr<xAOD::ZdcModuleContainer> moduleContainer( new xAOD::ZdcModuleContainer());
145 std::unique_ptr<xAOD::ZdcModuleAuxContainer> moduleAuxContainer( new xAOD::ZdcModuleAuxContainer() );
146 moduleContainer->setStore( moduleAuxContainer.get() );
147
150 if(m_delayChannels){
153 }
154
155 /******************************************
156 * Create the waveforms
157 ******************************************/
158 fillContainer(thpcZDC_Fiber, rngEngine, moduleContainer.get());
159
160
161 /******************************************
162 * Create the zdcSums container
163 ******************************************/
164 std::unique_ptr<xAOD::ZdcModuleContainer> sumsContainer( new xAOD::ZdcModuleContainer());
165 std::unique_ptr<xAOD::ZdcModuleAuxContainer> sumsAuxContainer( new xAOD::ZdcModuleAuxContainer() );
166 sumsContainer->setStore( sumsAuxContainer.get() );
167
168 static const SG::Accessor<uint16_t> LucrodTriggerSideAmpAcc ("LucrodTriggerSideAmp");
169 for (int iside : {-1, 0, 1}){
170 xAOD::ZdcModule* new_sum = new xAOD::ZdcModule();
171 sumsContainer->push_back(xAOD::ZdcModuleContainer::unique_type(new_sum));
172 new_sum->setZdcSide(iside);
173 LucrodTriggerSideAmpAcc (*new_sum) = 42;
174 }
175
176 /******************************************
177 * Write the output
178 ******************************************/
179
180 //Print the module contents
181 ATH_MSG_DEBUG( ZdcModuleToString(*moduleContainer) );
182
183 auto moduleContainerH = SG::makeHandle( m_ZdcModuleContainerName, ctx );
184 ATH_CHECK( moduleContainerH.record (std::move(moduleContainer), std::move(moduleAuxContainer)) );
185
186 auto sumsContainerH = SG::makeHandle( m_ZdcSumsContainerName, ctx );
187 ATH_CHECK( sumsContainerH.record (std::move(sumsContainer), std::move(sumsAuxContainer)) );
188
189 return StatusCode::SUCCESS;
190}
191
192StatusCode ZDC_PileUpTool::prepareEvent(const EventContext& /*ctx*/,const unsigned int nInputEvents){
193
194 ATH_MSG_DEBUG ( "ZDC_PileUpTool::prepareEvent() called for " << nInputEvents << " input events" );
195
196 m_ZdcModuleContainer = std::make_unique<xAOD::ZdcModuleContainer>();
197 m_ZdcModuleAuxContainer = std::make_unique<xAOD::ZdcModuleAuxContainer>();
199
204
205 m_mergedFiberHitList->clear();
206
207 return StatusCode::SUCCESS;
208}
209
210
211StatusCode ZDC_PileUpTool::processBunchXing(int bunchXing,
212 SubEventIterator bSubEvents,
213 SubEventIterator eSubEvents){
214 ATH_MSG_DEBUG ( "ZDC_PileUpTool::processBunchXing() " << bunchXing );
215 SubEventIterator iEvt = bSubEvents;
216 for (; iEvt!=eSubEvents; ++iEvt) {
217 StoreGateSvc& seStore = *iEvt->ptr()->evtStore();
218 ATH_MSG_VERBOSE("SubEvt StoreGate " << seStore.name() << " :"
219 << " bunch crossing : " << bunchXing
220 << " time offset : " << iEvt->time()
221 << " event number : " << iEvt->ptr()->eventNumber()
222 << " run number : " << iEvt->ptr()->runNumber());
223
224 const ZDC_SimFiberHit_Collection* tmpColl = 0;
225
226 if (!seStore.retrieve(tmpColl, m_HitCollectionName).isSuccess()) {
227 ATH_MSG_ERROR ( "SubEvent ZDC_SimFiberHit_Collection not found in StoreGate " << seStore.name() );
228 return StatusCode::FAILURE;
229 }
230 ATH_MSG_DEBUG ( "ZDC_SimFiberHit_Collection found with " << tmpColl->size() << " hits" );
231
234
235 for (; it!=end; ++it) m_mergedFiberHitList->push_back(*it);
236 }
237
238 return StatusCode::SUCCESS;
239}
240
241
242StatusCode ZDC_PileUpTool::mergeEvent(const EventContext& ctx){
243
244 ATHRNG::RNGWrapper* rngWrapper = m_randomSvc->getEngine(this, m_randomStreamName);
245 rngWrapper->setSeed( m_randomStreamName, ctx );
246 CLHEP::HepRandomEngine* rngEngine = rngWrapper->getEngine(ctx);
248
250 ATH_CHECK( moduleContainerH.record (std::move(m_ZdcModuleContainer), std::move(m_ZdcModuleAuxContainer)) );
251
252 return StatusCode::SUCCESS;
253}
254
255void ZDC_PileUpTool::fillContainer(TimedHitCollection<ZDC_SimFiberHit>& thpczdc, CLHEP::HepRandomEngine* rndEngine, xAOD::ZdcModuleContainer *zdcModuleContainer){
258 while (thpc.nextDetectorElement(i, e)) for (it = i; it != e; ++it) {
259 createAndStoreWaveform(*(*it), rndEngine, zdcModuleContainer);
260 }
261 addEmptyWaveforms(zdcModuleContainer, rndEngine);
262}
263
264
265void ZDC_PileUpTool::fillContainer(const ZDC_SimFiberHit_Collection* ZDC_SimFiberHit_Collection, CLHEP::HepRandomEngine* rndEngine, xAOD::ZdcModuleContainer *zdcModuleContainer){
268
269 for (; it != itend; ++it) {
270 createAndStoreWaveform(*it, rndEngine, zdcModuleContainer);
271 }
272 addEmptyWaveforms(zdcModuleContainer, rndEngine);
273}
274
275void ZDC_PileUpTool::addEmptyWaveforms(xAOD::ZdcModuleContainer *zdcModuleContainer, CLHEP::HepRandomEngine* rndEngine){
276 //Initialize bools to keep track of what modules/channels we have seen
277 bool zdcFound[2][4] = {{}};
278 bool rpdFound[2][16] = {{}};
279 bool branFound[2] = {};
280 for(auto module : *zdcModuleContainer){
281 int iside = (module->zdcSide() == -1) ? 0 : 1;
282 int mod = module->zdcModule();
283 if(mod < 4){ //ZDC
284 zdcFound[iside][mod] = true;
285 ATH_MSG_DEBUG("ZDC_PileUpTool::addEmptyWaveforms Found ZDC side " << module->zdcSide() << " module " << mod);
286 }else if(mod == 4){ //RPD
287 rpdFound[iside][module->zdcChannel()] = true;
288 ATH_MSG_DEBUG("ZDC_PileUpTool::addEmptyWaveforms Found RPD side " << module->zdcSide() << " channel " << module->zdcChannel());
289 }else{//BRAN
290 branFound[iside] = true;
291 ATH_MSG_DEBUG("ZDC_PileUpTool::addEmptyWaveforms Found BRAN side " << module->zdcSide() );
292 }
293 }
294
295 for(int iside : {0,1}){
296 int side = (iside == 0) ? -1 : 1;
297 for(int mod = 0; mod < 4; mod++){
298 if(!zdcFound[iside][mod]){
299 ATH_MSG_DEBUG("ZDC_PileUpTool::addEmptyWaveforms Creating empty waveform for ZDC side " << side << " module " << mod);
300 createAndStoreWaveform(ZDC_SimFiberHit( m_ZdcID->channel_id(side, mod, ZdcIDType::SINGLECHANNEL, 0), 0, 0), rndEngine, zdcModuleContainer);
301 }
302 }
303 for(int channel = 0; channel < 16; channel++){
304 if(!rpdFound[iside][channel] && m_doRPD){
305 ATH_MSG_DEBUG("ZDC_PileUpTool::addEmptyWaveforms Creating empty waveform for RPD side " << side << " channel " << channel);
306 createAndStoreWaveform(ZDC_SimFiberHit( m_ZdcID->channel_id(side, 4, ZdcIDType::MULTICHANNEL, channel), 0, 0), rndEngine, zdcModuleContainer);
307 }
308 }
309 if(!branFound[iside] && m_doBRAN){
310 ATH_MSG_DEBUG("ZDC_PileUpTool::addEmptyWaveforms Creating empty waveform for BRAN side " << side );
311 createAndStoreWaveform(ZDC_SimFiberHit( m_ZdcID->channel_id(side, 5, ZdcIDType::SINGLECHANNEL, 0), 0, 0), rndEngine, zdcModuleContainer);
312 }
313 }
314}
315
317
318 ZDC_SimFiberHit* newHits[2][4] = {{nullptr}};
319 ZDC_SimFiberHit_Collection* newCollection = new ZDC_SimFiberHit_Collection("ZDC_SimFiberHit_Collection_Temp");
320
321 for(ZDC_SimFiberHit hit : *hitCollection){
322 Identifier id = hit.getID();
323 //Translate side from -1,1 to 0,1 to index ZDC hits
324 int side = (m_ZdcID->side( id ) < 0 ) ? 0 : 1;
325 int module = m_ZdcID->module( id );
326
327 //ZDCs are module 0-3, just insert this hit unmodified and move on
328 if(module > 3){
329 newCollection->Insert(hit);
330 continue;
331 }
332
333 //TODO: Implement a method to get the efficiency of this location to multiply hit.getNphotons() and hit.getEdep()
334 //based on the channel retrieved by m_ZdcID->channel( id ) and some efficiency map
335 float efficiency = 1.0; //For now we will just use 100% efficiency
336
337 if(!newHits[side][module]){
338 //The module hasn't been seen yet, create a new hit with values modified by the efficiency factor
339 //The ID is modified because we initially used channel to denote the position of the rods for these efficiency cuts
340 //Now that that's done, we make sure the type is SINGLECHANNEL and the channel is 0
341 newHits[side][module] = new ZDC_SimFiberHit(m_ZdcID->channel_id(m_ZdcID->side(id), module, ZdcIDType::SINGLECHANNEL, 0), efficiency * hit.getNPhotons(), efficiency * hit.getEdep());
342 }else{
343 //The module has been seen, add the photons and energy from this new hit to it
344 newHits[side][module]->Add( efficiency*hit.getNPhotons(), efficiency*hit.getEdep());
345 }
346 }//end loop over hits
347
348 for(int side : {0,1}){
349 for(int module = 0; module < 4; module++){
350 //Make sure the hit exists before attempting to insert it
351 //If it doesn't we will take care of this module in addEmptyWaveforms
352 if(newHits[side][module]){
353 newCollection->Insert(*(newHits[side][module]));
354 }
355 }
356 }
357
358 //Now insert one hit per detector in the new collection
359 TimedHitCollection<ZDC_SimFiberHit> newTimedCollection;
360 newTimedCollection.insert(0.0, newCollection);
361 //coverity[leaked_storage]
362 return newTimedCollection;
363}
364
365
366void ZDC_PileUpTool::createAndStoreWaveform(const ZDC_SimFiberHit &hit, CLHEP::HepRandomEngine* rndEngine, xAOD::ZdcModuleContainer *zdcModuleContainer){
367 Identifier id = hit.getID( );
368 int side = m_ZdcID->side(id);
369 int module = m_ZdcID->module(id);
370 int channel = m_ZdcID->channel(id);
371
372 if(module == 4 && !m_doRPD) return;
373 if(module == 5 && !m_doBRAN) return;
374
375 //Here we have to switch the type of the RPD from ACTIVE to MULTICHANNEL
376 //TODO: Either change the channel numbering in the geometry, or the analysis
377 if(module == 4) id = m_ZdcID->channel_id(side,module,ZdcIDType::MULTICHANNEL,channel);
378
379 //Create a new ZdcModule to store the waveforms
380 xAOD::ZdcModule* zdc = new xAOD::ZdcModule();
381 zdcModuleContainer->push_back(xAOD::ZdcModuleContainer::unique_type(zdc));
382 zdcModuleContainer->back()->setZdcId(id.get_identifier32().get_compact());
383 zdcModuleContainer->back()->setZdcSide(side);
384 zdcModuleContainer->back()->setZdcModule(module);
385 zdcModuleContainer->back()->setZdcType(m_ZdcID->type(id));
386 zdcModuleContainer->back()->setZdcChannel(channel);
387
388 ATH_MSG_DEBUG( "Digitizing Side " << side <<
389 " Module " << module <<
390 " Channel " << channel <<
391 ", whith " << hit.getNPhotons() << " photons" );
392
393 uint iSide = (side == -1) ? 0 : 1;
394 float amplitude = 0, t0 = 0;
395 bool doHighGain = true;
396 std::shared_ptr<ZDCWaveformBase> waveformPtr;
397 std::shared_ptr<ZDCWaveformSampler> wfSampler;
398
399 if(module < 4){//It's a ZDC channel
400 amplitude = CLHEP::RandPoissonQ::shoot(rndEngine, hit.getNPhotons())*m_zdcAdcPerPhoton;
401
402 if(m_LTQuadStepFilt){
403 waveformPtr = std::make_shared<ZDCWaveformLTLinStep>("zdc",m_qsfRiseTime,m_qsfFallTime,m_qsfFilter);
404 }else{
405 waveformPtr = std::make_shared<ZDCWaveformFermiExp>("zdc",m_zdcRiseTime,m_zdcFallTime);
406 }
407 wfSampler = std::make_shared<ZDCWaveformSampler>(m_freqMHz, 0, m_numTimeBins, 12, m_Pedestal, waveformPtr);
408 t0 = m_zdct0;
409
410 }else{ //It's an RPD channel
411 // ATH_MSG_INFO("Digitizing RPD " << side << ", channel " << channel << " with " << hit.getNPhotons() << " and " << m_rpdAdcPerPhoton[iSide] << " amplification");
412 amplitude = CLHEP::RandPoissonQ::shoot(rndEngine, hit.getNPhotons())*m_rpdAdcPerPhoton[iSide];
413 waveformPtr = std::make_shared<ZDCWaveformFermiExp>("rpd",m_rpdRiseTime,m_rpdFallTime);
414 wfSampler = std::make_shared<ZDCWaveformSampler>(m_freqMHz, 0, m_numTimeBins, 12, m_Pedestal, waveformPtr);
415 t0 = m_rpdt0;
416 doHighGain = false;
417 }
418
419 //Record the number of photons that lead to this waveform
420 SG::Accessor<unsigned int> nPhotonsAcc ("nPhotons");
421 nPhotonsAcc (*zdc) = hit.getNPhotons();
422
423 //Generate in time waveforms
424 zdc->setWaveform("g0data", generateWaveform(wfSampler, amplitude, t0));
425 if(doHighGain) zdc->setWaveform("g1data", generateWaveform(wfSampler, 10*amplitude, t0));
426
427 //Generate delayed waveforms
428 if(m_delayChannels){
429 float timeBinWidth = 1000.0/m_freqMHz;
430 zdc->setWaveform("g0d1data", generateWaveform(wfSampler, 10*amplitude, t0+timeBinWidth/2));
431 if(doHighGain) zdc->setWaveform("g1d1data", generateWaveform(std::move(wfSampler), 10*amplitude, t0+timeBinWidth/2));
432 }
433
434}
435
436std::vector<short unsigned int> ZDC_PileUpTool::generateWaveform(std::shared_ptr<ZDCWaveformSampler> wfSampler, float amplitude, float t0){
437 std::vector<unsigned int> wf = wfSampler->Generate(amplitude, t0);
438 std::vector<short unsigned int> retVal;
439 for(uint sample = 0; sample < wf.size(); sample++){
440 retVal.push_back(wf[sample]);
441 }
442 return retVal;
443}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_DEBUG(x)
Helper class to provide type-safe access to aux data.
std::vector< xAOD::EventInfo::SubEvent >::const_iterator SubEventIterator
Definition IPileUpTool.h:22
unsigned int uint
static Double_t t0
the preferred mechanism to access information from the different event stores in a pileup job.
ZDC_SimFiberHit_Collection::const_iterator ZDC_SimFiberHit_ConstIterator
@ SINGLECHANNEL
Definition ZdcID.h:21
@ MULTICHANNEL
Definition ZdcID.h:21
std::string ZdcModuleToString(const xAOD::ZdcModule &zm)
A wrapper class for event-slot-local random engines.
Definition RNGWrapper.h:56
void setSeed(const std::string &algName, const EventContext &ctx)
Set the random seed using a string (e.g.
Definition RNGWrapper.h:169
CLHEP::HepRandomEngine * getEngine(const EventContext &ctx) const
Retrieve the random engine corresponding to the provided EventContext.
Definition RNGWrapper.h:134
void Insert(const T &h)
const_iterator begin() const
size_type size() const
const_iterator end() const
const T * back() const
Access the last element in the collection as an rvalue.
value_type push_back(value_type pElem)
Add an element to the end of the collection.
std::unique_ptr< base_value_type > unique_type
Definition DataVector.h:829
PileUpToolBase(const std::string &type, const std::string &name, const IInterface *parent)
Helper class to provide type-safe access to aux data.
SG::Accessor< T, ALLOC > Accessor
Definition AuxElement.h:572
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
std::string store() const
Return the name of the store holding the object we are proxying.
const std::string & name() const
Return the StoreGate ID for the referenced object.
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
The Athena Transient Store API.
StatusCode retrieve(const T *&ptr) const
Retrieve the default object into a const T*.
bool nextDetectorElement(const_iterator &b, const_iterator &e)
sets an iterator range with the hits of current detector element returns a bool when done
TimedVector::const_iterator const_iterator
void insert(const PileUpTimeEventIndex &timeEventIndex, const AtlasHitsVector< HIT > *inputCollection)
Gaudi::Property< double > m_zdcRiseTime
Gaudi::Property< double > m_zdcFallTime
SG::ReadHandleKey< ZDC_SimFiberHit_Collection > m_SimFiberHitCollectionKey
std::vector< short unsigned int > generateWaveform(std::shared_ptr< ZDCWaveformSampler > wfSampler, float amplitude, float t0)
Gaudi::Property< double > m_freqMHz
virtual StatusCode prepareEvent(const EventContext &ctx, const unsigned int nInputEvents) override final
called before the subevts loop. Not (necessarily) able to access SubEvents
Gaudi::Property< double > m_rpdRiseTime
virtual StatusCode processBunchXing(int bunchXing, SubEventIterator bSubEvents, SubEventIterator eSubEvents) override final
called for each active bunch-crossing to process current SubEvents bunchXing is in ns
Gaudi::Property< double > m_rpdt0
Gaudi::Property< bool > m_LTQuadStepFilt
Gaudi::Property< double > m_qsfFallTime
void createAndStoreWaveform(const ZDC_SimFiberHit &hit, CLHEP::HepRandomEngine *, xAOD::ZdcModuleContainer *)
Gaudi::Property< int > m_numTimeBins
SG::WriteHandleKey< xAOD::ZdcModuleContainer > m_ZdcSumsContainerName
void addEmptyWaveforms(xAOD::ZdcModuleContainer *zdcModuleContainer, CLHEP::HepRandomEngine *rndEngine)
Gaudi::Property< std::string > m_randomStreamName
Gaudi::Property< bool > m_doRPD
virtual StatusCode initialize() override final
Gaudi::Property< bool > m_doBRAN
Gaudi::Property< double > m_rpdFallTime
SG::WriteHandleKey< xAOD::ZdcModuleContainer > m_ZdcModuleContainerName
std::unique_ptr< xAOD::ZdcModuleAuxContainer > m_ZdcModuleAuxContainer
Gaudi::Property< bool > m_delayChannels
const ZdcID * m_ZdcID
Gaudi::Property< double > m_qsfRiseTime
Gaudi::Property< std::string > m_HitCollectionName
Gaudi::Property< double > m_qsfFilter
Gaudi::Property< std::string > m_configuration
Gaudi::Property< double > m_zdct0
void fillContainer(TimedHitCollection< ZDC_SimFiberHit > &, CLHEP::HepRandomEngine *, xAOD::ZdcModuleContainer *)
TimedHitCollection< ZDC_SimFiberHit > doZDClightGuideCuts(const ZDC_SimFiberHit_Collection *hitCollection)
virtual StatusCode processAllSubEvents(const EventContext &ctx) override final
Gaudi::Property< float > m_zdcAdcPerPhoton
std::unique_ptr< xAOD::ZdcModuleContainer > m_ZdcModuleContainer
Gaudi::Property< std::vector< float > > m_rpdAdcPerPhoton
ServiceHandle< IAthRNGSvc > m_randomSvc
virtual StatusCode mergeEvent(const EventContext &ctx) override final
return false if not interested in certain xing times (in ns) implemented by default in PileUpToolBase...
Gaudi::Property< int > m_Pedestal
ZDC_SimFiberHit_Collection * m_mergedFiberHitList
ZDC_PileUpTool(const std::string &type, const std::string &name, const IInterface *parent)
int getNPhotons() const
void Add(int nphot, double edep)
Identifier getID() const
Definition ZdcID.h:25
void setWaveform(const std::string &, const std::vector< uint16_t > &)
void setZdcSide(int)
void efficiency(std::vector< double > &bins, std::vector< double > &values, const std::vector< std::string > &files, const std::string &histname, const std::string &tplotname, const std::string &label="")
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
ZdcModuleContainer_v1 ZdcModuleContainer
ZdcModule_v1 ZdcModule
Definition ZdcModule.h:15
ZdcModuleAuxContainer_v2 ZdcModuleAuxContainer