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

#include <CscDigitizationTool.h>

Inheritance diagram for CscDigitizationTool:

Public Member Functions

 CscDigitizationTool (const std::string &type, const std::string &name, const IInterface *pIID)
 ~CscDigitizationTool ()=default
virtual StatusCode initialize () override final
virtual StatusCode mergeEvent (const EventContext &ctx) override final
 called at the end of the subevts loop. Not (necessarily) able to access subEvents
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
virtual StatusCode prepareEvent (const EventContext &ctx, unsigned int) override final
 return false if not interested in certain xing times (in ns) implemented by default in PileUpToolBase as FirstXing<=bunchXing<=LastXing
virtual StatusCode processAllSubEvents (const EventContext &ctx) override final
 alternative interface which uses the PileUpMergeSvc to obtain all the required SubEvents.

Private Types

typedef std::vector< CscSimData::Depositdeposits
typedef std::map< IdentifierHash, std::pair< double, double > > csc_map
typedef std::map< IdentifierHash, std::vector< float > > csc_newmap
using Collections_t = std::vector<std::unique_ptr<CscDigitCollection> >

Private Member Functions

StatusCode FillCollectionWithNewDigitEDM (csc_newmap &data_SampleMap, std::map< IdentifierHash, deposits > &myDeposits, bool phaseToSet, Collections_t &collections, CscSimDataCollection *cscSimData)
StatusCode FillCollectionWithOldDigitEDM (csc_map &data_map, std::map< IdentifierHash, deposits > &myDeposits, Collections_t &collections, CscSimDataCollection *cscSimData)
StatusCode CoreDigitization (Collections_t &collections, CscSimDataCollection *cscSimData, CLHEP::HepRandomEngine *rndmEngine, const EventContext &ctx)
StatusCode getNextEvent (const EventContext &ctx)

Private Attributes

ToolHandle< ICscCalibToolm_pcalib {this, "cscCalibTool", "CscCalibTool", "CSC calibration tool"}
BooleanProperty m_onlyUseContainerName {this, "OnlyUseContainerName", true, "Don't use the ReadHandleKey directly. Just extract the container name from it."}
SG::ReadHandleKey< CSCSimHitCollectionm_hitsContainerKey {this, "InputObjectName", "CSC_Hits", "name of the input objects"}
std::string m_inputObjectName {""}
SG::WriteHandleKey< CscSimDataCollectionm_cscSimDataCollectionWriteHandleKey {this,"CSCSimDataCollectionOutputName","CSC_SDO","WriteHandleKey for Output CscSimDataCollection"}
SG::WriteHandleKey< CscDigitContainerm_cscDigitContainerKey {this,"OutputObjectName","CSC_DIGITS","CSC digit container object"}
std::unique_ptr< CSC_Digitizerm_cscDigitizer {nullptr}
ServiceHandle< Muon::IMuonIdHelperSvcm_idHelperSvc {this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"}
Gaudi::Property< double > m_pedestal {this, "pedestal",0.0, ""}
Gaudi::Property< bool > m_maskBadChannel {this, "maskBadChannels", true, ""}
Gaudi::Property< double > m_amplification {this, "amplification", 0.58e5, ""}
TimedHitCollection< CSCSimHit > * m_thpcCSC {nullptr}
std::list< CSCSimHitCollection * > m_cscHitCollList
Gaudi::Property< bool > m_includePileUpTruth {this, "IncludePileUpTruth", true, "Include pile-up truth info"}
Gaudi::Property< double > m_timeWindowLowerOffset {this, "WindowLowerOffset", -25., ""}
Gaudi::Property< double > m_timeWindowUpperOffset {this, "WindowUpperOffset", +25., ""}
Gaudi::Property< bool > m_isPileUp {this, "isPileUp", false, ""}
Gaudi::Property< bool > m_newDigitEDM {this, "NewDigitEDM", true, ""}
Gaudi::Property< double > m_driftVelocity {this, "DriftVelocity", 60, ""}
Gaudi::Property< double > m_electronEnergy {this, "ElectronEnergy", 66, ""}
Gaudi::Property< bool > m_NInterFixed {this, "NInterFixed", false, ""}
ServiceHandle< PileUpMergeSvcm_mergeSvc {this, "PileUpMergeSvc", "PileUpMergeSvc", ""}
ServiceHandle< IAthRNGSvcm_rndmSvc {this, "RndmSvc", "AthRNGSvc", ""}

structors and AlgTool implementation

virtual bool toProcess (int bunchXing) const override
 the method this base class helps implementing
virtual bool filterPassed () const override
 dummy implementation of passing filter
virtual void resetFilter () override
 dummy implementation of filter reset
Gaudi::Property< int > m_firstXing
Gaudi::Property< int > m_lastXing
Gaudi::Property< int > m_vetoPileUpTruthLinks
bool m_filterPassed {true}

Detailed Description

Definition at line 39 of file CscDigitizationTool.h.

Member Typedef Documentation

◆ Collections_t

using CscDigitizationTool::Collections_t = std::vector<std::unique_ptr<CscDigitCollection> >
private

Definition at line 75 of file CscDigitizationTool.h.

◆ csc_map

typedef std::map<IdentifierHash,std::pair<double,double> > CscDigitizationTool::csc_map
private

Definition at line 42 of file CscDigitizationTool.h.

◆ csc_newmap

typedef std::map<IdentifierHash,std::vector<float> > CscDigitizationTool::csc_newmap
private

Definition at line 43 of file CscDigitizationTool.h.

◆ deposits

typedef std::vector<CscSimData::Deposit> CscDigitizationTool::deposits
private

Definition at line 41 of file CscDigitizationTool.h.

Constructor & Destructor Documentation

◆ CscDigitizationTool()

CscDigitizationTool::CscDigitizationTool ( const std::string & type,
const std::string & name,
const IInterface * pIID )

Definition at line 17 of file CscDigitizationTool.cxx.

17 :
18 PileUpToolBase(type, name, pIID) {
19}
PileUpToolBase(const std::string &type, const std::string &name, const IInterface *parent)

◆ ~CscDigitizationTool()

CscDigitizationTool::~CscDigitizationTool ( )
default

Member Function Documentation

◆ CoreDigitization()

StatusCode CscDigitizationTool::CoreDigitization ( Collections_t & collections,
CscSimDataCollection * cscSimData,
CLHEP::HepRandomEngine * rndmEngine,
const EventContext & ctx )
private

Definition at line 139 of file CscDigitizationTool.cxx.

139 {
140
141 std::map <IdentifierHash,deposits> myDeposits;
142 csc_map data_map;
143 csc_newmap data_SampleMap, data_SampleMapOddPhase;
144
146
147 // Perform null check on m_thpcCSC
148 if(!m_thpcCSC) {
149 ATH_MSG_ERROR ( "m_thpcCSC is null" );
150 return StatusCode::FAILURE;
151 }
152
153 // get the iterator pairs for this DetEl
154 while( m_thpcCSC->nextDetectorElement(i, e) ) {
155
156 // Loop over the hits:
157 while (i != e) {
158
159 TimedHitPtr<CSCSimHit> phit(*i++);
160 const CSCSimHit& hit(*phit);
161
162
163 ATH_MSG_DEBUG(hit.print());
164
165
166
167 double globalHitTime(hitTime(phit));
168 double bunchTime(globalHitTime - hit.globalTime());
169
170 // Hit time is the G4 hit time plus the drift time.
171 // Gloabl time add the bnch crossing time to the hit time.
172 ATH_MSG_DEBUG ( "bunch time (ns) " << bunchTime << "globalHitTime (ns) " << globalHitTime << " hit Time (ns) " << hitTime(phit) );
173 m_cscDigitizer->set(bunchTime);
174
175 std::vector<IdentifierHash> hashVec;
177 ? m_cscDigitizer->digitize_hit(&hit, hashVec, data_SampleMap, data_SampleMapOddPhase, rndmEngine)
178 : m_cscDigitizer->digitize_hit(&hit, hashVec, data_map, rndmEngine);
179
180 if (status.isFailure()) {
181 ATH_MSG_ERROR ( "CSC Digitizer Failed to digitize a hit!" );
182 return status;
183 }
184
185 std::vector<IdentifierHash>::const_iterator vecBeg = hashVec.begin();
186 std::vector<IdentifierHash>::const_iterator vecEnd = hashVec.end();
187 // Fetch the energy deposit.
188 const double energy = hit.energyDeposit();
189 // Determine where hit crosses the wire plane (x=0).
190 float ypos = -99999.9;
191 float zpos = ypos;
192 double xi = hit.getHitStart().x();
193 double yi = hit.getHitStart().y();
194 double zi = hit.getHitStart().z();
195 double xf = hit.getHitEnd().x();
196 double yf = hit.getHitEnd().y();
197 double zf = hit.getHitEnd().z();
198 double dx = xf - xi;
199 double dy = yf - yi;
200 double dz = zf - zi;
201 if ( dx>0.0 && xi<=0.0 && xf>=0.0 ) {
202 double f = -xi/dx;
203 ypos = yi + f*dy;
204 zpos = zi + f*dz;
205 }
206
208 hashVec.clear();
209 continue;
210 }
211 const HepMcParticleLink trackLink = HepMcParticleLink::getRedirectedLink(phit->particleLink(), phit.eventId(), ctx); // This link should now correctly resolve to the TruthEvent McEventCollection in the main StoreGateSvc.
212 const auto cscd = CscMcData(energy, ypos, zpos);
213 for (; vecBeg != vecEnd; ++vecBeg) {
214 myDeposits[(*vecBeg)].emplace_back(trackLink,cscd);
215 }
216 hashVec.clear();
217 }
218 }
219
220 // reset the pointer.
221 delete m_thpcCSC;
222 m_thpcCSC=nullptr;
223
224 // now loop over the digit map
225 // build the digits
226 // build the digit collections and record them
227
228 if (m_newDigitEDM) {
229 double flat = CLHEP::RandFlat::shoot(rndmEngine, 0.0,1.0); // for other particles
230 bool phaseToSet = flat<0.5;
231 if (phaseToSet)
232 return FillCollectionWithNewDigitEDM(data_SampleMapOddPhase, myDeposits, phaseToSet, collections, cscSimData);
233 else
234 return FillCollectionWithNewDigitEDM(data_SampleMap, myDeposits, phaseToSet, collections, cscSimData);
235 } else
236 return FillCollectionWithOldDigitEDM(data_map, myDeposits, collections, cscSimData);
237
238}
float hitTime(const AFP_SIDSimHit &hit)
#define ATH_MSG_ERROR(x)
#define ATH_MSG_DEBUG(x)
std::map< IdentifierHash, std::vector< float > > csc_newmap
TimedHitCollection< CSCSimHit > * m_thpcCSC
StatusCode FillCollectionWithNewDigitEDM(csc_newmap &data_SampleMap, std::map< IdentifierHash, deposits > &myDeposits, bool phaseToSet, Collections_t &collections, CscSimDataCollection *cscSimData)
StatusCode FillCollectionWithOldDigitEDM(csc_map &data_map, std::map< IdentifierHash, deposits > &myDeposits, Collections_t &collections, CscSimDataCollection *cscSimData)
std::map< IdentifierHash, std::pair< double, double > > csc_map
Gaudi::Property< bool > m_includePileUpTruth
Gaudi::Property< bool > m_newDigitEDM
std::unique_ptr< CSC_Digitizer > m_cscDigitizer
Gaudi::Property< int > m_vetoPileUpTruthLinks
TimedVector::const_iterator const_iterator
::StatusCode StatusCode
StatusCode definition for legacy code.
bool ignoreTruthLink(const T &p, bool vetoPileUp)
Helper function for SDO creation in PileUpTools.
status
Definition merge.py:16

◆ FillCollectionWithNewDigitEDM()

StatusCode CscDigitizationTool::FillCollectionWithNewDigitEDM ( csc_newmap & data_SampleMap,
std::map< IdentifierHash, deposits > & myDeposits,
bool phaseToSet,
Collections_t & collections,
CscSimDataCollection * cscSimData )
private

mask this readout channel if it is a dead channel or a hot channel

Definition at line 241 of file CscDigitizationTool.cxx.

245 {
246
247 CscDigitCollection * collection = nullptr;
248
249 IdContext context = m_idHelperSvc->cscIdHelper().channel_context();
250 IdContext cscContext = m_idHelperSvc->cscIdHelper().module_context();
251
252 Identifier prevId;
253
254 csc_newmap::const_iterator cscMap = data_SampleMap.begin();
255 csc_newmap::const_iterator cscMapEnd = data_SampleMap.end();
256
257 for (; cscMap != cscMapEnd; ++cscMap) {
258 Identifier digitId;
259 IdentifierHash hashId = (*cscMap).first;
260 if (m_idHelperSvc->cscIdHelper().get_id( hashId, digitId, &context ) ) {
261 ATH_MSG_ERROR ( "cannot get CSC channel identifier from hash " << hashId );
262 return StatusCode::FAILURE;
263 }
264
265 Identifier elementId = m_idHelperSvc->cscIdHelper().parentID(digitId);
266 IdentifierHash coll_hash;
267 if (m_idHelperSvc->cscIdHelper().get_hash(elementId, coll_hash, &cscContext)) {
268 ATH_MSG_ERROR ( "Unable to get CSC hash id from CSC Digit collection "
269 << "context begin_index = " << cscContext.begin_index()
270 << " context end_index = " << cscContext.end_index()
271 << " the identifier is " );
272 elementId.show();
273 }
274
275
276 // get the charge
277 double stripCharge = 0.0;
278 double driftTime = 0.0;
279 const std::vector<float> samples = (*cscMap).second;
280
281 unsigned int samplingPhase =0;
282 double samplingTime = m_pcalib->getSamplingTime();
283 m_pcalib->findCharge(samplingTime, samplingPhase, samples, stripCharge, driftTime);
284 driftTime += m_pcalib->getLatency();
285
287 if ( !m_pcalib->isGood( hashId ) && m_maskBadChannel ) {
288 stripCharge = 0.0;
290 }
291
292 int zsec = m_idHelperSvc->cscIdHelper().stationEta(digitId);
293 int phisec = m_idHelperSvc->cscIdHelper().stationPhi(digitId);
294 int istation = m_idHelperSvc->cscIdHelper().stationName(digitId) - 49;
295
296 int wlay = m_idHelperSvc->cscIdHelper().wireLayer(digitId);
297 int measphi = m_idHelperSvc->cscIdHelper().measuresPhi(digitId);
298 int istrip = m_idHelperSvc->cscIdHelper().strip(digitId);
299
300 int sector = zsec*(2*phisec-istation+1);
301
302 auto depositsForHash = myDeposits.find(hashId);
303 if (depositsForHash != myDeposits.end() && !depositsForHash->second.empty()) {
304 depositsForHash->second[0].second.setCharge(stripCharge);
305 cscSimData->insert ( std::make_pair(digitId, CscSimData(depositsForHash->second,0)) );
306 }
307
308 // fill the digit collections in StoreGate
309 // Now, we pass driftTime as well as stripCharge.
310 // SimHIT time should be added to distinguish prompt muons from secondary.... 11/19/2009 WP
311 ATH_MSG_DEBUG ( "NEWDigit sec:measphi:wlay:istr:chg:t(w/latency) "
312 << m_idHelperSvc->cscIdHelper().show_to_string(digitId,&context)
313 << " hash:eleId = " << hashId << " " << elementId << " " << prevId << " "
314 << sector << " " << measphi << " " << wlay << " " << istrip << " "
315 << int(stripCharge+1) << " " << float(driftTime)
316 << " phase=" << phaseToSet
317 << " samps: " << samples[0] << " " << samples[1] << " "
318 << samples[2] << " " << samples[3]
319 );
320
321 if (prevId != elementId) {
322 if (coll_hash >= collections.size()) {
323 collections.resize (coll_hash+1);
324 }
325 collection = collections[coll_hash].get();
326 if (nullptr == collection) {
327 collections[coll_hash] = std::make_unique<CscDigitCollection>(elementId,coll_hash);
328 collection = collections[coll_hash].get();
329 }
330 if (phaseToSet) collection->set_samplingPhase();
331 collection->push_back (std::make_unique<CscDigit>(digitId, samples));
332
333 prevId = elementId;
334 } else {
335 // According to coverity, collection could still be null here.
336 if (!collection) {
337 ATH_MSG_ERROR("Trying to use NULL CscDigitCollection");
338 return StatusCode::FAILURE;
339 }
340
341 if (phaseToSet) collection->set_samplingPhase();
342 collection->push_back (std::make_unique<CscDigit>(digitId, samples));
343 }
344 }
345 return StatusCode::SUCCESS;
346}
Gaudi::Property< double > m_timeWindowUpperOffset
ToolHandle< ICscCalibTool > m_pcalib
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
Gaudi::Property< bool > m_maskBadChannel
const T * get(size_type n) const
Access an element, as an rvalue.
value_type push_back(value_type pElem)
Add an element to the end of the collection.
size_type begin_index() const
Definition IdContext.h:45
size_type end_index() const
Definition IdContext.h:46
void show() const
Print out in hex form.
@ driftTime
Definition HitInfo.h:43

◆ FillCollectionWithOldDigitEDM()

StatusCode CscDigitizationTool::FillCollectionWithOldDigitEDM ( csc_map & data_map,
std::map< IdentifierHash, deposits > & myDeposits,
Collections_t & collections,
CscSimDataCollection * cscSimData )
private

mask this readout channel if it is a dead channel or a hot channel

Definition at line 349 of file CscDigitizationTool.cxx.

350 {
351
352 CscDigitCollection * collection = nullptr;
353 IdContext context = m_idHelperSvc->cscIdHelper().channel_context();
354 IdContext cscContext = m_idHelperSvc->cscIdHelper().module_context();
355
356 Identifier prevId;
357 csc_map::const_iterator cscMap = data_map.begin();
358 csc_map::const_iterator cscMapEnd = data_map.end();
359 for (; cscMap != cscMapEnd; ++cscMap) {
360 Identifier digitId;
361 IdentifierHash hashId = (*cscMap).first;
362 if (m_idHelperSvc->cscIdHelper().get_id( hashId, digitId, &context ) ) {
363 ATH_MSG_ERROR ( "cannot get CSC channel identifier from hash " << hashId );
364 return StatusCode::FAILURE;
365 }
366
367 // get the charge
368 double stripCharge = 0.0;
369 stripCharge = ((*cscMap).second).second + m_pedestal; // + m_noiseLevel*gaus;
370 double driftTime =((*cscMap).second).first; // SimHIT time is added yet 12/03/2009
371
373 if ( !m_pcalib->isGood( hashId ) && m_maskBadChannel ) {
374 stripCharge = 0.0;
376 }
377
378 ATH_MSG_VERBOSE ( "CSC Digit Id = " << m_idHelperSvc->cscIdHelper().show_to_string(digitId,&context)
379 << " hash = " << hashId
380 << " charge = " << int (stripCharge+1) );
381
382 int zsec = m_idHelperSvc->cscIdHelper().stationEta(digitId);
383 int phisec = m_idHelperSvc->cscIdHelper().stationPhi(digitId);
384 int istation = m_idHelperSvc->cscIdHelper().stationName(digitId) - 49;
385
386 int wlay = m_idHelperSvc->cscIdHelper().wireLayer(digitId);
387 int measphi = m_idHelperSvc->cscIdHelper().measuresPhi(digitId);
388 int istrip = m_idHelperSvc->cscIdHelper().strip(digitId);
389
390 int sector = zsec*(2*phisec-istation+1);
391
392 auto depositsForHash = myDeposits.find(hashId);
393 if (depositsForHash != myDeposits.end() && !depositsForHash->second.empty()) {
394 depositsForHash->second[0].second.setCharge(stripCharge);
395 cscSimData->insert ( std::make_pair(digitId, CscSimData(depositsForHash->second,0)) );
396 }
397
398 // fill the digit collections in StoreGate
399 // Now, we pass driftTime as well as stripCharge.
400 // SimHIT time should be added to distinguish prompt muons from secondary.... 11/19/2009 WP
401 auto newDigit = std::make_unique<CscDigit>(digitId, int(stripCharge+1), float(driftTime) );
402 Identifier elementId = m_idHelperSvc->cscIdHelper().parentID(digitId);
403
404 ATH_MSG_DEBUG ( "CSC Digit sector:measphi:wlay:istrip:charge "
405 << sector << " "
406 << measphi << " " << wlay << " " << istrip
407 << " " << int(stripCharge+1) << " " << float(driftTime) << " " << (newDigit->sampleCharges()).size());
408
409
410 IdentifierHash coll_hash;
411 if (m_idHelperSvc->cscIdHelper().get_hash(elementId, coll_hash, &cscContext)) {
412 ATH_MSG_ERROR ( "Unable to get CSC hash id from CSC Digit collection "
413 << "context begin_index = " << cscContext.begin_index()
414 << " context end_index = " << cscContext.end_index()
415 << " the identifier is " );
416 elementId.show();
417 }
418
419 if (prevId != elementId) {
420 if (coll_hash >= collections.size()) {
421 collections.resize (coll_hash+1);
422 }
423 collection = collections[coll_hash].get();
424 if (nullptr == collection) {
425 collections[coll_hash] = std::make_unique<CscDigitCollection>(elementId,coll_hash);
426 collection = collections[coll_hash].get();
427 }
428 collection->push_back(std::move(newDigit));
429 prevId = elementId;
430 } else {
431 // According to coverity, collection could still be null here.
432 if (collection) {
433 collection->push_back(std::move(newDigit));
434 } else {
435 ATH_MSG_ERROR("Trying to push back NULL CscDigitCollection");
436 return StatusCode::FAILURE;
437 }
438 }
439 }
440 return StatusCode::SUCCESS;
441}
#define ATH_MSG_VERBOSE(x)
Gaudi::Property< double > m_pedestal

◆ filterPassed()

virtual bool PileUpToolBase::filterPassed ( ) const
inlineoverridevirtualinherited

dummy implementation of passing filter

Definition at line 49 of file PileUpToolBase.h.

49{ return m_filterPassed; }

◆ getNextEvent()

StatusCode CscDigitizationTool::getNextEvent ( const EventContext & ctx)
private

Definition at line 445 of file CscDigitizationTool.cxx.

446{
447
448 // get the container(s)
450
451 // In case of single hits container just load the collection using read handles
453 SG::ReadHandle<CSCSimHitCollection> hitCollection(m_hitsContainerKey, ctx);
454 if (!hitCollection.isValid()) {
455 ATH_MSG_ERROR("Could not get CSCSimHitCollection container " << hitCollection.name() << " from store " << hitCollection.store());
456 return StatusCode::FAILURE;
457 }
458
459 // create a new hits collection
460 m_thpcCSC = new TimedHitCollection<CSCSimHit>{1};
461 m_thpcCSC->insert(0, hitCollection.cptr());
462 ATH_MSG_DEBUG("CSCSimHitCollection found with " << hitCollection->size() << " hits");
463
464 return StatusCode::SUCCESS;
465 }
466
467 //this is a list<pair<time_t, DataLink<CSCSimHitCollection> > >
468 TimedHitCollList hitCollList;
469
470 if (!(m_mergeSvc->retrieveSubEvtsData(m_inputObjectName, hitCollList).isSuccess()) ) {
471 ATH_MSG_ERROR ( "Could not fill TimedHitCollList" );
472 return StatusCode::FAILURE;
473 }
474 if (hitCollList.empty()) {
475 ATH_MSG_ERROR ( "TimedHitCollList has size 0" );
476 return StatusCode::FAILURE;
477 } else {
478 ATH_MSG_DEBUG ( hitCollList.size()
479 << " CSCSimHitCollections with key " << m_inputObjectName
480 << " found" );
481 }
482
483 // create a new hits collection
484 m_thpcCSC = new TimedHitCollection<CSCSimHit>();
485
486 //now merge all collections into one
487 TimedHitCollList::iterator iColl(hitCollList.begin());
488 TimedHitCollList::iterator endColl(hitCollList.end());
489 while (iColl != endColl) {
490 const CSCSimHitCollection* p_collection(iColl->second);
491 m_thpcCSC->insert(iColl->first, p_collection);
492 ATH_MSG_DEBUG ( "CSCSimHitCollection found with "
493 << p_collection->size() << " hits" ); // loop on the hit collections
494 ++iColl;
495 }
496 return StatusCode::SUCCESS;
497}
AtlasHitsVector< CSCSimHit > CSCSimHitCollection
ServiceHandle< PileUpMergeSvc > m_mergeSvc
SG::ReadHandleKey< CSCSimHitCollection > m_hitsContainerKey
BooleanProperty m_onlyUseContainerName
std::list< value_t > type
type of the collection of timed data object

◆ initialize()

StatusCode CscDigitizationTool::initialize ( )
finaloverridevirtual

CSC calibratin tool for the Condtiions Data base access

Reimplemented from PileUpToolBase.

Definition at line 21 of file CscDigitizationTool.cxx.

21 {
22
23 ATH_MSG_DEBUG ( "Initialized Properties :" );
24 ATH_MSG_DEBUG ( " InputObjectName " << m_inputObjectName );
25 ATH_MSG_DEBUG ( " WindowLowerOffset " << m_timeWindowLowerOffset );
26 ATH_MSG_DEBUG ( " WindowUpperOffset " << m_timeWindowUpperOffset );
27 ATH_MSG_DEBUG ( " PileUp On? " << m_isPileUp );
28 ATH_MSG_DEBUG ( " maskBadChannels? " << m_maskBadChannel );
29 ATH_MSG_DEBUG ( " amplification(gain) " << m_amplification );
30 ATH_MSG_DEBUG ( " Use NewDigitEDM? " << m_newDigitEDM );
31 ATH_MSG_DEBUG ( " Drift Velocity Set? " << m_driftVelocity );
32 ATH_MSG_DEBUG ( " NInteraction per layer from poisson not from energyLoss? " << m_NInterFixed );
33 ATH_MSG_DEBUG ( " IncludePileUpTruth " << m_includePileUpTruth );
34 ATH_MSG_DEBUG ( " VetoPileUpTruthLinks " << m_vetoPileUpTruthLinks );
35
36 ATH_MSG_DEBUG ( " RndmSvc " << m_rndmSvc.typeAndName() );
37 ATH_MSG_DEBUG ( " cscCalibTool " << m_pcalib.typeAndName() );
38 ATH_MSG_DEBUG ( " CscSimDataCollection key " << m_cscSimDataCollectionWriteHandleKey.key());
39 ATH_MSG_DEBUG ( " CscDigitContainer key " << m_cscDigitContainerKey.key());
40
41 // initialize transient detector store and MuonDetDescrManager
42 const MuonGM::MuonDetectorManager* muDetMgr=nullptr;
43 ATH_CHECK(detStore()->retrieve(muDetMgr));
44 ATH_MSG_DEBUG ( "MuonDetectorManager retrieved from StoreGate.");
45
47 ATH_CHECK(m_mergeSvc.retrieve());
48 }
49
50 //random number initialization
51 ATH_CHECK(m_rndmSvc.retrieve());
52
54 ATH_CHECK(m_pcalib.retrieve());
55
56 //initialize the CSC digitizer
57 m_cscDigitizer = std::make_unique<CSC_Digitizer>(CscHitIdHelper::GetHelper(), muDetMgr, &*(m_pcalib));
58 m_cscDigitizer->setAmplification(m_amplification);
59 m_cscDigitizer->setDebug ( msgLvl(MSG::DEBUG) );
60 m_cscDigitizer->setDriftVelocity(m_driftVelocity);
61 m_cscDigitizer->setElectronEnergy (m_electronEnergy);
62 if (m_NInterFixed) {
63 m_cscDigitizer->setNInterFixed();
64 }
66 ATH_CHECK(m_cscDigitizer->initialize());
67
68 ATH_CHECK(m_idHelperSvc.retrieve());
69
70 // check the input object name
71 if (m_hitsContainerKey.key().empty()) {
72 ATH_MSG_FATAL("Property InputObjectName not set !");
73 return StatusCode::FAILURE;
74 }
76 ATH_MSG_DEBUG("Input objects in container : '" << m_inputObjectName << "'");
77
78 // Initialize ReadHandleKey
79 ATH_CHECK(m_hitsContainerKey.initialize(true));
80
81 // +++ Initialize WriteHandleKey
84
85 return StatusCode::SUCCESS;
86
87}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_FATAL(x)
SG::WriteHandleKey< CscDigitContainer > m_cscDigitContainerKey
Gaudi::Property< bool > m_isPileUp
ServiceHandle< IAthRNGSvc > m_rndmSvc
Gaudi::Property< double > m_driftVelocity
Gaudi::Property< bool > m_NInterFixed
SG::WriteHandleKey< CscSimDataCollection > m_cscSimDataCollectionWriteHandleKey
Gaudi::Property< double > m_timeWindowLowerOffset
Gaudi::Property< double > m_electronEnergy
Gaudi::Property< double > m_amplification
static const CscHitIdHelper * GetHelper()
retrieve(aClass, aKey=None)
Definition PyKernel.py:110

◆ mergeEvent()

StatusCode CscDigitizationTool::mergeEvent ( const EventContext & ctx)
finaloverridevirtual

called at the end of the subevts loop. Not (necessarily) able to access subEvents

Definition at line 545 of file CscDigitizationTool.cxx.

545 {
546
547 ATH_MSG_DEBUG ( "in mergeEvent()" );
548
549 //create and record CscDigitContainer in SG
550 SG::WriteHandle<CscDigitContainer> cscDigits(m_cscDigitContainerKey, ctx);
551 ATH_CHECK(cscDigits.record(std::make_unique<CscDigitContainer>(m_idHelperSvc->cscIdHelper().module_hash_max())));
552 ATH_MSG_DEBUG("recorded CscDigitContainer with name "<<cscDigits.key());
553
554 // create and record the SDO container in StoreGate
555 SG::WriteHandle<CscSimDataCollection> cscSimData(m_cscSimDataCollectionWriteHandleKey, ctx);
556 ATH_CHECK(cscSimData.record(std::make_unique<CscSimDataCollection>()));
557
558 ATHRNG::RNGWrapper* rngWrapper = m_rndmSvc->getEngine(this);
559 rngWrapper->setSeed( name(), ctx );
560
561 Collections_t collections;
562 ATH_CHECK(CoreDigitization(collections,cscSimData.ptr(), rngWrapper->getEngine(ctx), ctx));
563 for (size_t coll_hash = 0; coll_hash < collections.size(); ++coll_hash) {
564 if (collections[coll_hash]) {
565 ATH_CHECK( cscDigits->addCollection (collections[coll_hash].release(), coll_hash) );
566 }
567 }
568
569 // remove cloned one in processBunchXing......
570 std::list<CSCSimHitCollection*>::iterator cscHitColl = m_cscHitCollList.begin();
571 std::list<CSCSimHitCollection*>::iterator cscHitCollEnd = m_cscHitCollList.end();
572 while(cscHitColl!=cscHitCollEnd)
573 {
574 delete (*cscHitColl);
575 ++cscHitColl;
576 }
577 m_cscHitCollList.clear();
578
579 return StatusCode::SUCCESS;
580}
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
std::vector< std::unique_ptr< CscDigitCollection > > Collections_t
std::list< CSCSimHitCollection * > m_cscHitCollList
StatusCode CoreDigitization(Collections_t &collections, CscSimDataCollection *cscSimData, CLHEP::HepRandomEngine *rndmEngine, const EventContext &ctx)

◆ prepareEvent()

StatusCode CscDigitizationTool::prepareEvent ( const EventContext & ctx,
unsigned int  )
finaloverridevirtual

return false if not interested in certain xing times (in ns) implemented by default in PileUpToolBase as FirstXing<=bunchXing<=LastXing

Definition at line 90 of file CscDigitizationTool.cxx.

90 {
91
92 if (nullptr == m_thpcCSC)
93 m_thpcCSC = new TimedHitCollection<CSCSimHit>();
94
95 m_cscHitCollList.clear();
96
97 return StatusCode::SUCCESS;
98}

◆ processAllSubEvents()

StatusCode CscDigitizationTool::processAllSubEvents ( const EventContext & ctx)
finaloverridevirtual

alternative interface which uses the PileUpMergeSvc to obtain all the required SubEvents.

Reimplemented from PileUpToolBase.

Definition at line 101 of file CscDigitizationTool.cxx.

101 {
102
103 ATH_MSG_DEBUG ( "in processAllSubEvents()" );
104
105 //create and record CscDigitContainer in SG
106 SG::WriteHandle<CscDigitContainer> cscDigits(m_cscDigitContainerKey, ctx);
107 ATH_CHECK(cscDigits.record(std::make_unique<CscDigitContainer>(m_idHelperSvc->cscIdHelper().module_hash_max())));
108 ATH_MSG_DEBUG("recorded CscDigitContainer with name "<<cscDigits.key());
109
110 if (m_isPileUp) return StatusCode::SUCCESS;
111
112 // create and record the SDO container in StoreGate
113 SG::WriteHandle<CscSimDataCollection> cscSimData(m_cscSimDataCollectionWriteHandleKey, ctx);
114 ATH_CHECK(cscSimData.record(std::make_unique<CscSimDataCollection>()));
115
116 //merging of the hit collection in getNextEvent method
117 if (nullptr == m_thpcCSC ) {
119 if (StatusCode::FAILURE == sc) {
120 ATH_MSG_INFO ( "There are no CSC hits in this event" );
121 return sc; // there are no hits in this event
122 }
123 }
124
125 ATHRNG::RNGWrapper* rngWrapper = m_rndmSvc->getEngine(this);
126 rngWrapper->setSeed( name(), ctx );
127
128 Collections_t collections;
129 ATH_CHECK( CoreDigitization(collections,cscSimData.ptr(), rngWrapper->getEngine(ctx), ctx) );
130 for (size_t coll_hash = 0; coll_hash < collections.size(); ++coll_hash) {
131 if (collections[coll_hash]) {
132 ATH_CHECK( cscDigits->addCollection (collections[coll_hash].release(), coll_hash) );
133 }
134 }
135
136 return StatusCode::SUCCESS;
137}
#define ATH_MSG_INFO(x)
static Double_t sc
StatusCode getNextEvent(const EventContext &ctx)

◆ processBunchXing()

StatusCode CscDigitizationTool::processBunchXing ( int bunchXing,
SubEventIterator bSubEvents,
SubEventIterator eSubEvents )
finaloverridevirtual

called for each active bunch-crossing to process current subEvents. bunchXing is in ns

Reimplemented from PileUpToolBase.

Definition at line 502 of file CscDigitizationTool.cxx.

505{
506 ATH_MSG_DEBUG("CscDigitizationTool::processBunchXing() " << bunchXing);
507
509 TimedHitCollList hitCollList;
510
511 if (!(m_mergeSvc->retrieveSubSetEvtData(m_inputObjectName, hitCollList, bunchXing,
512 bSubEvents, eSubEvents).isSuccess()) &&
513 hitCollList.empty()) {
514 ATH_MSG_ERROR("Could not fill TimedHitCollList");
515 return StatusCode::FAILURE;
516 } else {
517 ATH_MSG_VERBOSE(hitCollList.size() << " CSCSimHitCollection with key " <<
518 m_inputObjectName << " found");
519 }
520
521 TimedHitCollList::iterator iColl(hitCollList.begin());
522 TimedHitCollList::iterator endColl(hitCollList.end());
523
524 // Iterating over the list of collections
525 for( ; iColl != endColl; ++iColl){
526
527 CSCSimHitCollection *hitCollPtr = new CSCSimHitCollection(*iColl->second);
528 PileUpTimeEventIndex timeIndex(iColl->first);
529
530 ATH_MSG_DEBUG("CSCSimHitCollection found with " << hitCollPtr->size() <<
531 " hits");
532 ATH_MSG_VERBOSE("time index info. time: " << timeIndex.time()
533 << " index: " << timeIndex.index()
534 << " type: " << timeIndex.type());
535
536 m_thpcCSC->insert(timeIndex, hitCollPtr);
537 m_cscHitCollList.push_back(hitCollPtr);
538
539 }
540
541 return StatusCode::SUCCESS;
542}
size_type size() const

◆ resetFilter()

virtual void PileUpToolBase::resetFilter ( )
inlineoverridevirtualinherited

dummy implementation of filter reset

Reimplemented in MergeTruthJetsTool.

Definition at line 51 of file PileUpToolBase.h.

51{ m_filterPassed=true; }

◆ toProcess()

virtual bool PileUpToolBase::toProcess ( int bunchXing) const
inlineoverridevirtualinherited

the method this base class helps implementing

Reimplemented in MergeHijingParsTool, and MergeTrackRecordCollTool.

Definition at line 32 of file PileUpToolBase.h.

32 {
33 //closed interval [m_firstXing,m_lastXing]
34 return !((m_firstXing > bunchXing) || (bunchXing > m_lastXing));
35 }
Gaudi::Property< int > m_firstXing
Gaudi::Property< int > m_lastXing

Member Data Documentation

◆ m_amplification

Gaudi::Property<double> CscDigitizationTool::m_amplification {this, "amplification", 0.58e5, ""}
private

Definition at line 103 of file CscDigitizationTool.h.

103{this, "amplification", 0.58e5, ""};

◆ m_cscDigitContainerKey

SG::WriteHandleKey<CscDigitContainer> CscDigitizationTool::m_cscDigitContainerKey {this,"OutputObjectName","CSC_DIGITS","CSC digit container object"}
private

Definition at line 95 of file CscDigitizationTool.h.

95{this,"OutputObjectName","CSC_DIGITS","CSC digit container object"};

◆ m_cscDigitizer

std::unique_ptr<CSC_Digitizer> CscDigitizationTool::m_cscDigitizer {nullptr}
private

Definition at line 97 of file CscDigitizationTool.h.

97{nullptr};

◆ m_cscHitCollList

std::list<CSCSimHitCollection*> CscDigitizationTool::m_cscHitCollList
private

Definition at line 107 of file CscDigitizationTool.h.

◆ m_cscSimDataCollectionWriteHandleKey

SG::WriteHandleKey<CscSimDataCollection> CscDigitizationTool::m_cscSimDataCollectionWriteHandleKey {this,"CSCSimDataCollectionOutputName","CSC_SDO","WriteHandleKey for Output CscSimDataCollection"}
private

Definition at line 94 of file CscDigitizationTool.h.

94{this,"CSCSimDataCollectionOutputName","CSC_SDO","WriteHandleKey for Output CscSimDataCollection"};

◆ m_driftVelocity

Gaudi::Property<double> CscDigitizationTool::m_driftVelocity {this, "DriftVelocity", 60, ""}
private

Definition at line 115 of file CscDigitizationTool.h.

115{this, "DriftVelocity", 60, ""}; // 60 / (1e-6 * 1e9); // 6 cm/microsecond -> mm/ns // 0.06

◆ m_electronEnergy

Gaudi::Property<double> CscDigitizationTool::m_electronEnergy {this, "ElectronEnergy", 66, ""}
private

Definition at line 116 of file CscDigitizationTool.h.

116{this, "ElectronEnergy", 66, ""}; // eV

◆ m_filterPassed

bool PileUpToolBase::m_filterPassed {true}
protectedinherited

Definition at line 60 of file PileUpToolBase.h.

60{true};

◆ m_firstXing

Gaudi::Property<int> PileUpToolBase::m_firstXing
protectedinherited
Initial value:
{this, "FirstXing", -999,
"First bunch-crossing in which det is live"}

Definition at line 54 of file PileUpToolBase.h.

54 {this, "FirstXing", -999,
55 "First bunch-crossing in which det is live"};

◆ m_hitsContainerKey

SG::ReadHandleKey<CSCSimHitCollection> CscDigitizationTool::m_hitsContainerKey {this, "InputObjectName", "CSC_Hits", "name of the input objects"}
private

Definition at line 92 of file CscDigitizationTool.h.

92{this, "InputObjectName", "CSC_Hits", "name of the input objects"}; // name of the input objects

◆ m_idHelperSvc

ServiceHandle<Muon::IMuonIdHelperSvc> CscDigitizationTool::m_idHelperSvc {this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"}
private

Definition at line 99 of file CscDigitizationTool.h.

99{this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"};

◆ m_includePileUpTruth

Gaudi::Property<bool> CscDigitizationTool::m_includePileUpTruth {this, "IncludePileUpTruth", true, "Include pile-up truth info"}
private

Definition at line 109 of file CscDigitizationTool.h.

109{this, "IncludePileUpTruth", true, "Include pile-up truth info"};

◆ m_inputObjectName

std::string CscDigitizationTool::m_inputObjectName {""}
private

Definition at line 93 of file CscDigitizationTool.h.

93{""};

◆ m_isPileUp

Gaudi::Property<bool> CscDigitizationTool::m_isPileUp {this, "isPileUp", false, ""}
private

Definition at line 113 of file CscDigitizationTool.h.

113{this, "isPileUp", false, ""};

◆ m_lastXing

Gaudi::Property<int> PileUpToolBase::m_lastXing
protectedinherited
Initial value:
{this, "LastXing", 999,
"Last bunch-crossing in which det is live"}

Definition at line 56 of file PileUpToolBase.h.

56 {this, "LastXing", 999,
57 "Last bunch-crossing in which det is live"};

◆ m_maskBadChannel

Gaudi::Property<bool> CscDigitizationTool::m_maskBadChannel {this, "maskBadChannels", true, ""}
private

Definition at line 102 of file CscDigitizationTool.h.

102{this, "maskBadChannels", true, ""};

◆ m_mergeSvc

ServiceHandle<PileUpMergeSvc> CscDigitizationTool::m_mergeSvc {this, "PileUpMergeSvc", "PileUpMergeSvc", ""}
private

Definition at line 119 of file CscDigitizationTool.h.

119{this, "PileUpMergeSvc", "PileUpMergeSvc", ""}; // Pile up service

◆ m_newDigitEDM

Gaudi::Property<bool> CscDigitizationTool::m_newDigitEDM {this, "NewDigitEDM", true, ""}
private

Definition at line 114 of file CscDigitizationTool.h.

114{this, "NewDigitEDM", true, ""};

◆ m_NInterFixed

Gaudi::Property<bool> CscDigitizationTool::m_NInterFixed {this, "NInterFixed", false, ""}
private

Definition at line 117 of file CscDigitizationTool.h.

117{this, "NInterFixed", false, ""};

◆ m_onlyUseContainerName

BooleanProperty CscDigitizationTool::m_onlyUseContainerName {this, "OnlyUseContainerName", true, "Don't use the ReadHandleKey directly. Just extract the container name from it."}
private

Definition at line 91 of file CscDigitizationTool.h.

91{this, "OnlyUseContainerName", true, "Don't use the ReadHandleKey directly. Just extract the container name from it."};

◆ m_pcalib

ToolHandle<ICscCalibTool> CscDigitizationTool::m_pcalib {this, "cscCalibTool", "CscCalibTool", "CSC calibration tool"}
private

Definition at line 89 of file CscDigitizationTool.h.

89{this, "cscCalibTool", "CscCalibTool", "CSC calibration tool"};

◆ m_pedestal

Gaudi::Property<double> CscDigitizationTool::m_pedestal {this, "pedestal",0.0, ""}
private

Definition at line 101 of file CscDigitizationTool.h.

101{this, "pedestal",0.0, ""};

◆ m_rndmSvc

ServiceHandle<IAthRNGSvc> CscDigitizationTool::m_rndmSvc {this, "RndmSvc", "AthRNGSvc", ""}
private

Definition at line 121 of file CscDigitizationTool.h.

121{this, "RndmSvc", "AthRNGSvc", ""}; // Random number service

◆ m_thpcCSC

TimedHitCollection<CSCSimHit>* CscDigitizationTool::m_thpcCSC {nullptr}
private

Definition at line 106 of file CscDigitizationTool.h.

106{nullptr}; // the hits

◆ m_timeWindowLowerOffset

Gaudi::Property<double> CscDigitizationTool::m_timeWindowLowerOffset {this, "WindowLowerOffset", -25., ""}
private

Definition at line 111 of file CscDigitizationTool.h.

111{this, "WindowLowerOffset", -25., ""};

◆ m_timeWindowUpperOffset

Gaudi::Property<double> CscDigitizationTool::m_timeWindowUpperOffset {this, "WindowUpperOffset", +25., ""}
private

Definition at line 112 of file CscDigitizationTool.h.

112{this, "WindowUpperOffset", +25., ""};

◆ m_vetoPileUpTruthLinks

Gaudi::Property<int> PileUpToolBase::m_vetoPileUpTruthLinks
protectedinherited
Initial value:
{this, "VetoPileUpTruthLinks", true,
"Ignore links to suppressed pile-up truth"}

Definition at line 58 of file PileUpToolBase.h.

58 {this, "VetoPileUpTruthLinks", true,
59 "Ignore links to suppressed pile-up truth"};

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