 |
ATLAS Offline Software
|
Go to the documentation of this file.
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,
112 return StatusCode::FAILURE;
166 return StatusCode::SUCCESS;
176 return StatusCode::SUCCESS;
194 TimedHitCollList hitCollList;
197 bSubEvents, eSubEvents).isSuccess()) &&
198 hitCollList.empty()) {
200 return StatusCode::FAILURE;
202 ATH_MSG_VERBOSE(hitCollList.size() <<
" TRTUncompressedHitCollection with key " <<
209 for( ; iColl != endColl; ++iColl){
212 ATH_MSG_DEBUG(
"TRTUncompressedHitCollection found with " << hitCollPtr->
size() <<
215 <<
" index: " << timeIndex.
index()
216 <<
" type: " << timeIndex.
type());
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;
333 fieldCondObj->getInitializedCache (fieldCache);
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();
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);
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
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;
778 if ( barrelElement ) {
780 IdLayer = barrelElement->
identify();
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; }
805 if ( endcapElement ) {
807 IdLayer = endcapElement->
identify();
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." );
833 return StatusCode::SUCCESS;
841 return CLHEP::RandGaussZiggurat::shoot(rndmEngine, 5.48, 8.91);
def retrieve(aClass, aKey=None)
JetConstituentVector::iterator iterator
double pileUpSDOsMinEkin() const
Get minimum Ekin for pileup track to enter MC-truth.
void setSeed(const std::string &algName, const EventContext &ctx)
Set the random seed using a string (e.g.
bool getT0FromData() const
bool doCosmicTimingPit() const
Cosmics timing corresponding to pit setup?
unsigned GetDigit() const
Get digit.
void setIdentifier(Identifier id)
const_pointer_type cptr()
Dereference the pointer.
bool useMagneticFieldMap() const
const std::string & name() const
Return the StoreGate ID for the referenced object.
const TRT_BarrelElement * getBarrelElement(unsigned int positive, unsigned int moduleIndex, unsigned int phiIndex, unsigned int strawLayerIndex) const
Access Barrel Elements:---------------—(Fast)-------------------------—.
static void sortDigits(std::vector< TRTDigit > &digitVect)
void appendCrossTalkNoiseToProperDigits(std::vector< TRTDigit > &digitVect, const std::set< Identifier > &simhitsIdentifiers, const ServiceHandle< ITRT_StrawNeighbourSvc > &m_TRTStrawNeighbourSvc, CLHEP::HepRandomEngine *noiseRndmEngine)
This is an Identifier helper class for the TRT subdetector. This class is a factory for creating comp...
void printFlagsForOverrideableParameters(const std::string &front="") const
Print TRT digitization settings overrideable parameters.
void addPropertiesForOverrideableParameters(Algorithm *alg)
Add properties for overrideable parameters.
bool noiseInUnhitStraws() const
Query whether simulation of noise in unhit straws.
index_type index() const
the index of the component event in PileUpEventInfo
#define ATH_MSG_VERBOSE(x)
const std::string & key() const
Return the StoreGate ID for the referenced object.
bool ignoreTruthLink(const T &p, bool vetoPileUp)
Helper function for SDO creation in PileUpTools.
bool nextDetectorElement(const_iterator &b, const_iterator &e)
sets an iterator range with the hits of current detector element returns a bool when done
std::list< value_t > type
type of the collection of timed data object
virtual IdentifierHash identifyHash() const override final
"Fake" straw map until "real" map is known.
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
Simulate TRT Electronics Noise For description of metod, see Thomas Kittelmanns PhD thesis chapters ...
InDetRawDataCollection< TRT_RDORawData > TRT_RDO_Collection
void appendPureNoiseToProperDigits(std::vector< TRTDigit > &digitVect, const std::set< int > &sim_hitids, CLHEP::HepRandomEngine *noiseRndmEngine)
Append noise digits to list of digits from proper hits.
void insert(const PileUpTimeEventIndex &timeEventIndex, const AtlasHitsVector< HIT > *inputCollection)
void reserve(unsigned int numberOfHits)
reserve a timed vector numberOfHits in size.
::StatusCode StatusCode
StatusCode definition for legacy code.
std::string store() const
Return the name of the store holding the object we are proxying.
Simulation of noise hits in the TRT.
const Version & getVersion() const
Get version information.
int majorNum() const
Major version number.
virtual Identifier identify() const override final
identifier of this detector element:
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
virtual IdentifierHash identifyHash() const override final
identifier hash
bool noiseInSimhits() const
Query whether simulation of noise in hit straws.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
TRT Digitization: Processing of a TRT Straws.
void ProcessStraw(MagField::AtlasFieldCache &fieldCache, hitCollConstIter i, hitCollConstIter e, TRTDigit &outdigit, bool &m_alreadyPrintedPDGcodeWarning, double m_cosmicEventPhase, int strawGasType, bool emulationArflag, bool emulationKrflag, CLHEP::HepRandomEngine *rndmEngine, CLHEP::HepRandomEngine *elecProcRndmEngine, CLHEP::HepRandomEngine *elecNoiseRndmEngine, CLHEP::HepRandomEngine *paiRndmEngine)
Process this straw all the way from Geant4 hit to output digit.
const TRT_EndcapElement * getEndcapElement(unsigned int positive, unsigned int wheelIndex, unsigned int strawLayerIndex, unsigned int phiIndex) const
Access Endcap Elements:---------------—(Fast)--------------------------—.
std::string print_to_string(Identifier id, const IdContext *context=0) const
or provide the printout in string form
virtual bool isValid() override final
Can the handle be successfully dereferenced?
A wrapper class for event-slot-local random engines.
time_type time() const
bunch xing time in ns
value_type push_back(value_type pElem)
Add an element to the end of the collection.
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.
StatusCode initialize(bool used=true)
CLHEP::HepRandomEngine * getEngine(const EventContext &ctx) const
Retrieve the random engine corresponding to the provided EventContext.
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
unsigned int storeSDO() const
double timeInterval() const
Get time interval covered by each digit.
Local cache for magnetic field (based on MagFieldServices/AtlasFieldSvcTLS.h)
void print(const std::string &front="") const
Printing of TRT digitization settings.
void initialize(const InDetDD::TRT_DetectorManager *detmgr)
Initialize: fill defaults and overwrite by user values where appropriate.
int StrawGasType(int statusHT, int useGasMix, MsgStream *log)
float hitTime(const AFP_SIDSimHit &hit)
Class containing parameters and settings used by TRT digitization.
This is a "hash" representation of an Identifier. This encodes a 32 bit index which can be used to lo...
size_type straw_layer_hash_max() const
std::pair< HepMcParticleLink, float > Deposit
bool doCrosstalk() const
Switch on crosstalk noise based on Cosmic 08 measurements.
a struct encapsulating the identifier of a pile-up event
float distance(const Amg::Vector3D &p1, const Amg::Vector3D &p2)
calculates the distance between two point in 3D space
PileUpType type() const
the pileup type - minbias, cavern, beam halo, signal?
float strawAverageNoiseLevel() const
Get average noise level in straw.
Identifier straw_id(int barrel_ec, int phi_module, int layer_or_wheel, int straw_layer, int straw) const
Three ways of getting id for a single straw:
void initialize(CLHEP::HepRandomEngine *rndmEngine)
AtlasHitsVector< TRTUncompressedHit > TRTUncompressedHitCollection