25#include "Identifier/Identifier.h"
40#include "GaudiKernel/EventContext.h"
41#include "GaudiKernel/ThreadLocalContext.h"
48#include "CLHEP/Random/RandomEngine.h"
49#include "CLHEP/Random/RandGaussZiggurat.h"
54 const std::string& name,
55 const IInterface* parent)
59 m_settings->addPropertiesForOverrideableParameters(
static_cast<AlgTool*
>(
this));
91 m_settings->printFlagsForOverrideableParameters(
"TRTDigSettings Overrideables : ");
112 return StatusCode::FAILURE;
150 const double intervalBetweenCrossings(
m_settings->timeInterval() / 3.);
157 ATH_MSG_ERROR (
"storeSDO is out of range:"<<
m_settings->storeSDO()<<
"allowed values are: 0,1,2. Setting storeSDO = 2 " );
166 return StatusCode::SUCCESS;
176 return StatusCode::SUCCESS;
184 m_seen.emplace_back(std::distance(bSubEvents,eSubEvents), bunchXing);
194 TimedHitCollList hitCollList;
197 bSubEvents, eSubEvents).isSuccess()) &&
198 hitCollList.empty()) {
200 return StatusCode::FAILURE;
202 ATH_MSG_VERBOSE(hitCollList.size() <<
" TRTUncompressedHitCollection with key " <<
206 TimedHitCollList::iterator iColl(hitCollList.begin());
207 TimedHitCollList::iterator endColl(hitCollList.end());
209 for( ; iColl != endColl; ++iColl){
212 ATH_MSG_DEBUG(
"TRTUncompressedHitCollection found with " << hitCollPtr->
size() <<
215 <<
" index: " << timeIndex.
index()
216 <<
" type: " << timeIndex.
type());
217 m_thpctrt->insert(timeIndex, hitCollPtr);
221 return StatusCode::SUCCESS;
264 noiseThreshRndmEngine,
265 noiseElecResetRndmEngine,
293 pTRTsimdrifttimetool,
305 return StatusCode::SUCCESS;
311 std::set<int>& sim_hitids, std::set<Identifier>& simhitsIdentifiers,
312 CLHEP::HepRandomEngine *rndmEngine,
313 CLHEP::HepRandomEngine *strawRndmEngine,
314 CLHEP::HepRandomEngine *elecProcRndmEngine,
315 CLHEP::HepRandomEngine *elecNoiseRndmEngine,
316 CLHEP::HepRandomEngine *paiRndmEngine) {
329 if (fieldCondObj ==
nullptr) {
331 return StatusCode::FAILURE;
339 ATH_CHECK(simDataMap.
record(std::make_unique<InDetSimDataCollection>() ));
342 if (not simDataMap.
isValid()) {
344 return StatusCode::FAILURE;
355 std::vector<InDetSimData::Deposit> depositVector(100);
361 int hitID((*i)->GetHitID());
368 sim_hitids.insert(hitID);
371 if ( hitID & 0xc0000000 ) {
372 ATH_MSG_ERROR (
"Hit ID not Valid (" << MSG::hex << hitID <<
")" << MSG::dec );
381 if ( !identifierOK ) {
382 ATH_MSG_ERROR (
"Ignoring simhits with suspicious identifier (1)" );
387 simhitsIdentifiers.insert(idStraw);
391 depositVector.clear();
392 depositVector.reserve(std::distance(i,e));
396 (*hit_iter)->GetEnergyDeposit() );
400 ATH_MSG_VERBOSE (
"Deposit: trackID " << deposit.first <<
" energyDeposit " << deposit.second );
401 depositVector.emplace_back(std::move(deposit));
405 const double bunchCrossingTime(
hitTime(theHit) -
static_cast<double>(theHit->GetGlobalTime()));
408 if ( !depositVector.empty() &&
411 simDataMap->try_emplace(idStraw, std::move(depositVector));
428 bool emulateArFlag =
m_sumTool->getStatusHT(idStraw, ctx) == 6;
429 bool emulateKrFlag =
m_sumTool->getStatusHT(idStraw, ctx) == 7;
430 const int statusHT =
m_sumTool->getStatusHT(idStraw, ctx);
457 return StatusCode::SUCCESS;
465 CLHEP::HepRandomEngine *elecNoiseRndmEngine =
getRandomEngine(
"TRT_ElectronicsNoise", ctx);
466 CLHEP::HepRandomEngine *noiseRndmEngine =
getRandomEngine(
"TRT_NoiseDigitPool", ctx);
467 CLHEP::HepRandomEngine *strawRndmEngine =
getRandomEngine(
"TRT_ProcessStraw", ctx);
468 CLHEP::HepRandomEngine *elecProcRndmEngine =
getRandomEngine(
"TRT_ThresholdFluctuations", ctx);
469 CLHEP::HepRandomEngine *paiRndmEngine =
getRandomEngine(
"TRT_PAI", ctx);
474 return StatusCode::FAILURE;
480 ATH_MSG_DEBUG (
"TRTDigitizationTool::processAllSubEvents()" );
488 return StatusCode::FAILURE;
501 if (!hitCollection.
isValid()) {
502 ATH_MSG_ERROR(
"Could not get TRTUncompressedHitCollection container " << hitCollection.
name() <<
" from store " << hitCollection.
store());
503 return StatusCode::FAILURE;
511 ATH_MSG_DEBUG(
"TRTUncompressedHitCollection found with " << hitCollection->size() <<
" hits");
514 TimedHitCollList hitCollList;
515 unsigned int numberOfSimHits(0);
516 if ( !(
m_mergeSvc->retrieveSubEvtsData(
m_dataObjectName, hitCollList, numberOfSimHits).isSuccess()) && hitCollList.empty() ) {
518 return StatusCode::FAILURE;
524 thpctrt.
reserve(numberOfSimHits);
527 TimedHitCollList::iterator iColl(hitCollList.begin());
528 TimedHitCollList::iterator endColl(hitCollList.end() );
531 while ( iColl != endColl ) {
537 thpctrt.
insert(iColl->first, p_collection);
538 ATH_MSG_DEBUG (
"TRTUncompressedHitCollection found with " << p_collection->
size() <<
" hits" );
544 std::set<int> sim_hitids;
545 std::set<Identifier> simhitsIdentifiers;
548 ATH_CHECK(this->
processStraws(ctx, thpctrt, sim_hitids, simhitsIdentifiers, rndmEngine, strawRndmEngine, elecProcRndmEngine, elecNoiseRndmEngine,paiRndmEngine));
554 const int numberOfDigitsBeforeNoise(
m_vDigits.size());
574 return StatusCode::FAILURE;
580 return StatusCode::SUCCESS;
584 const EventContext& ctx)
const
587 std::string rngName = name()+streamName;
588 rngWrapper->
setSeed( rngName, ctx );
594 const EventContext& ctx)
const
597 rngWrapper->
setSeed( streamName, ctx.slot(), randomSeedOffset, ctx.eventID().run_number() );
606 ATH_MSG_DEBUG(
"mergeEvent: there are " << ii->first <<
" events in bunch xing " << ii->second );
612 CLHEP::HepRandomEngine *elecNoiseRndmEngine =
getRandomEngine(
"TRT_ElectronicsNoise", ctx);
613 CLHEP::HepRandomEngine *noiseRndmEngine =
getRandomEngine(
"TRT_NoiseDigitPool", ctx);
614 CLHEP::HepRandomEngine *strawRndmEngine =
getRandomEngine(
"TRT_ProcessStraw", ctx);
615 CLHEP::HepRandomEngine *elecProcRndmEngine =
getRandomEngine(
"TRT_ThresholdFluctuations", ctx);
616 CLHEP::HepRandomEngine *paiRndmEngine =
getRandomEngine(
"TRT_PAI", ctx);
621 return StatusCode::FAILURE;
634 return StatusCode::FAILURE;
640 std::set<int> sim_hitids;
641 std::set<Identifier> simhitsIdentifiers;
645 ATH_CHECK(this->
processStraws(ctx, *
m_thpctrt, sim_hitids, simhitsIdentifiers, rndmEngine, strawRndmEngine, elecProcRndmEngine, elecNoiseRndmEngine,paiRndmEngine));
654 const unsigned int numberOfDigitsBeforeNoise(
m_vDigits.size());
674 return StatusCode::FAILURE;
680 return StatusCode::SUCCESS;
687 std::vector<TRTDigit>::const_iterator TRTDigitIter(
m_vDigits.begin());
688 std::vector<TRTDigit>::const_iterator endOfTRTDigits(
m_vDigits.end());
697 while (TRTDigitIter != endOfTRTDigits) {
698 ATH_MSG_DEBUG (
"Digit ID " << TRTDigitIter->GetStrawID() <<
" Digit " << TRTDigitIter->GetDigit() );
701 bool identifierOK(
false);
702 idStraw =
getIdentifier(TRTDigitIter->GetStrawID(), IdHash, layer_id, identifierOK);
704 ATH_MSG_ERROR (
"Ignoring simhits with suspicious identifier (2)" );
717 if (IdHash != IdHashOld) {
719 ATH_MSG_DEBUG (
"New TRT RDO Collection created with IdHash " <<
static_cast<int>(IdHash) );
726 return StatusCode::FAILURE;
737 ATH_MSG_FATAL (
"Failed to create the TRT_RDO_Collection before trying to add an RDO to it! IdHash = " <<
static_cast<int>(IdHash) );
739 return StatusCode::FAILURE;
745 return StatusCode::SUCCESS;
753 bool & statusok )
const
759 const int mask(0x0000001F);
760 const int word_shift(5);
761 int trtID, ringID, moduleID, layerID, strawID;
762 int wheelID, planeID, sectorID;
767 if ( !(hitID & 0x00200000) ) {
768 strawID = hitID & mask;
769 hitID >>= word_shift;
770 layerID = hitID & mask;
771 hitID >>= word_shift;
772 moduleID = hitID & mask;
773 hitID >>= word_shift;
774 ringID = hitID & mask;
775 trtID = hitID >> word_shift;
777 barrelElement =
m_manager->getBarrelElement(trtID, ringID, moduleID, layerID);
778 if ( barrelElement ) {
780 IdLayer = barrelElement->
identify();
781 IdStraw =
m_trt_id->straw_id(IdLayer, strawID);
783 ATH_MSG_ERROR (
"Could not find detector element for barrel identifier with "
784 <<
"(ipos,iring,imod,ilayer,istraw) = ("
785 << trtID <<
", " << ringID <<
", " << moduleID <<
", "
786 << layerID <<
", " << strawID <<
")" );
790 strawID = hitID & mask;
791 hitID >>= word_shift;
792 planeID = hitID & mask;
793 hitID >>= word_shift;
794 sectorID = hitID & mask;
795 hitID >>= word_shift;
796 wheelID = hitID & mask;
797 trtID = hitID >> word_shift;
800 if (trtID == 3) { trtID = 0; }
803 endcapElement =
m_manager->getEndcapElement(trtID, wheelID, planeID, sectorID);
805 if ( endcapElement ) {
807 IdLayer = endcapElement->
identify();
808 IdStraw =
m_trt_id->straw_id(IdLayer, strawID);
810 ATH_MSG_ERROR (
"Could not find detector element for endcap identifier with "
811 <<
"(ipos,iwheel,isector,iplane,istraw) = ("
812 << trtID <<
", " << wheelID <<
", " << sectorID <<
", "
813 << planeID <<
", " << strawID <<
")" );
814 ATH_MSG_ERROR (
"If this happens very rarely, don't be alarmed (it is a Geant4 'feature')" );
815 ATH_MSG_ERROR (
"If it happens a lot, you probably have misconfigured geometry in the sim. job." );
828 m_settings->print(
"TRTDigSettings Settings : ");
833 return StatusCode::SUCCESS;
841 return CLHEP::RandGaussZiggurat::shoot(rndmEngine, 5.48, 8.91);
float hitTime(const AFP_SIDSimHit &hit)
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
AtlasHitsVector< TRTUncompressedHit > TRTUncompressedHitCollection
This is an Identifier helper class for the TRT subdetector.
InDetRawDataCollection< TRT_RDORawData > TRT_RDO_Collection
A wrapper class for event-slot-local random engines.
void setSeed(const std::string &algName, const EventContext &ctx)
Set the random seed using a string (e.g.
CLHEP::HepRandomEngine * getEngine(const EventContext &ctx) const
Retrieve the random engine corresponding to the provided EventContext.
void getInitializedCache(MagField::AtlasFieldCache &cache) const
get B field cache for evaluation as a function of 2-d or 3-d position.
value_type push_back(value_type pElem)
static HepMcParticleLink getRedirectedLink(const HepMcParticleLink &particleLink, uint32_t eventIndex, const EventContext &ctx)
Return a HepMcParticleLink pointing at the same particle, but in a different GenEvent.
This is a "hash" representation of an Identifier.
Extended TRT_BaseElement to describe a TRT readout element, this is a planar layer with n ( order of ...
virtual IdentifierHash identifyHash() const override final
identifier hash
virtual Identifier identify() const override final
identifier of this detector element:
Extended class of a TRT_BaseElement to describe a readout elment in the endcap.
virtual IdentifierHash identifyHash() const override final
void setIdentifier(Identifier id)
std::pair< HepMcParticleLink, float > Deposit
Local cache for magnetic field (based on MagFieldServices/AtlasFieldSvcTLS.h)
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.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
"Fake" straw map until "real" map is known.
Class containing parameters and settings used by TRT digitization.
unsigned GetDigit() const
Get digit.
Simulate TRT Electronics Noise For description of metod, see Thomas Kittelmanns PhD thesis chapters ...
Simulation of noise hits in the TRT.
static void sortDigits(std::vector< TRTDigit > &digitVect)
TRT Digitization: Processing of a TRT Straws.
void reserve(unsigned int numberOfHits)
reserve a timed vector numberOfHits in size.
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)
a smart pointer to a hit that also provides access to the extended timing info of the host event.
bool ignoreTruthLink(const T &p, bool vetoPileUp)
Helper function for SDO creation in PileUpTools.
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
int StrawGasType(int statusHT, int useGasMix, MsgStream *log)
std::list< value_t > type
type of the collection of timed data object
a struct encapsulating the identifier of a pile-up event
index_type index() const
the index of the component event in PileUpEventInfo
PileUpType type() const
the pileup type - minbias, cavern, beam halo, signal?
time_type time() const
bunch xing time in ns