|
ATLAS Offline Software
|
Go to the documentation of this file.
25 #include "Identifier/Identifier.h"
41 #include "GaudiKernel/SmartDataPtr.h"
42 #include "GaudiKernel/EventContext.h"
43 #include "GaudiKernel/ThreadLocalContext.h"
55 #include "CLHEP/Random/RandomEngine.h"
56 #include "CLHEP/Random/RandGaussZiggurat.h"
64 const std::string&
name,
124 return StatusCode::FAILURE;
178 return StatusCode::SUCCESS;
188 return StatusCode::SUCCESS;
206 TimedHitCollList hitCollList;
209 bSubEvents, eSubEvents).isSuccess()) &&
210 hitCollList.empty()) {
212 return StatusCode::FAILURE;
214 ATH_MSG_VERBOSE(hitCollList.size() <<
" TRTUncompressedHitCollection with key " <<
221 for( ; iColl != endColl; ++iColl){
224 ATH_MSG_DEBUG(
"TRTUncompressedHitCollection found with " << hitCollPtr->
size() <<
227 <<
" index: " << timeIndex.
index()
228 <<
" type: " << timeIndex.
type());
233 return StatusCode::SUCCESS;
250 ATH_MSG_ERROR (
"Folder holder TRT digitization version exists in condDB, but tag is faulty" );
251 return StatusCode::FAILURE;
253 ATH_MSG_DEBUG (
"Using Digitization version as defined in conditions tag" );
289 noiseThreshRndmEngine,
290 noiseElecResetRndmEngine,
318 pTRTsimdrifttimetool,
330 return StatusCode::SUCCESS;
336 std::set<int>& sim_hitids, std::set<Identifier>& simhitsIdentifiers,
337 CLHEP::HepRandomEngine *rndmEngine,
338 CLHEP::HepRandomEngine *strawRndmEngine,
339 CLHEP::HepRandomEngine *elecProcRndmEngine,
340 CLHEP::HepRandomEngine *elecNoiseRndmEngine,
341 CLHEP::HepRandomEngine *paiRndmEngine) {
354 if (fieldCondObj ==
nullptr) {
356 return StatusCode::FAILURE;
358 fieldCondObj->getInitializedCache (fieldCache);
364 ATH_CHECK(simDataMap.
record(std::make_unique<InDetSimDataCollection>() ));
367 if (not simDataMap.
isValid()) {
369 return StatusCode::FAILURE;
380 std::vector<InDetSimData::Deposit> depositVector(100);
386 int hitID((*i)->GetHitID());
393 sim_hitids.insert(hitID);
396 if ( hitID & 0xc0000000 ) {
397 ATH_MSG_ERROR (
"Hit ID not Valid (" << MSG::hex << hitID <<
")" << MSG::dec );
406 if ( !identifierOK ) {
407 ATH_MSG_ERROR (
"Ignoring simhits with suspicious identifier (1)" );
412 simhitsIdentifiers.insert(idStraw);
416 depositVector.clear();
421 (*hit_iter)->GetEnergyDeposit() );
425 ATH_MSG_VERBOSE (
"Deposit: trackID " << deposit.first <<
" energyDeposit " << deposit.second );
426 depositVector.emplace_back(std::move(deposit));
430 const double bunchCrossingTime(
hitTime(theHit) -
static_cast<double>(theHit->GetGlobalTime()));
433 if ( !depositVector.empty() &&
436 simDataMap->try_emplace(idStraw, std::move(depositVector));
453 bool emulateArFlag =
m_sumTool->getStatusHT(idStraw, ctx) == 6;
454 bool emulateKrFlag =
m_sumTool->getStatusHT(idStraw, ctx) == 7;
455 const int statusHT =
m_sumTool->getStatusHT(idStraw, ctx);
482 return StatusCode::SUCCESS;
490 CLHEP::HepRandomEngine *elecNoiseRndmEngine =
getRandomEngine(
"TRT_ElectronicsNoise", ctx);
491 CLHEP::HepRandomEngine *noiseRndmEngine =
getRandomEngine(
"TRT_NoiseDigitPool", ctx);
492 CLHEP::HepRandomEngine *strawRndmEngine =
getRandomEngine(
"TRT_ProcessStraw", ctx);
493 CLHEP::HepRandomEngine *elecProcRndmEngine =
getRandomEngine(
"TRT_ThresholdFluctuations", ctx);
494 CLHEP::HepRandomEngine *paiRndmEngine =
getRandomEngine(
"TRT_PAI", ctx);
499 return StatusCode::FAILURE;
505 ATH_MSG_DEBUG (
"TRTDigitizationTool::processAllSubEvents()" );
513 return StatusCode::FAILURE;
526 if (!hitCollection.
isValid()) {
527 ATH_MSG_ERROR(
"Could not get TRTUncompressedHitCollection container " << hitCollection.
name() <<
" from store " << hitCollection.
store());
528 return StatusCode::FAILURE;
536 ATH_MSG_DEBUG(
"TRTUncompressedHitCollection found with " << hitCollection->
size() <<
" hits");
539 TimedHitCollList hitCollList;
540 unsigned int numberOfSimHits(0);
541 if ( !(
m_mergeSvc->retrieveSubEvtsData(
m_dataObjectName, hitCollList, numberOfSimHits).isSuccess()) && hitCollList.empty() ) {
543 return StatusCode::FAILURE;
549 thpctrt.
reserve(numberOfSimHits);
556 while ( iColl != endColl ) {
562 thpctrt.
insert(iColl->first, p_collection);
563 ATH_MSG_DEBUG (
"TRTUncompressedHitCollection found with " << p_collection->
size() <<
" hits" );
569 std::set<int> sim_hitids;
570 std::set<Identifier> simhitsIdentifiers;
573 ATH_CHECK(this->
processStraws(ctx, thpctrt, sim_hitids, simhitsIdentifiers, rndmEngine, strawRndmEngine, elecProcRndmEngine, elecNoiseRndmEngine,paiRndmEngine));
579 const int numberOfDigitsBeforeNoise(
m_vDigits.size());
599 return StatusCode::FAILURE;
605 return StatusCode::SUCCESS;
609 const EventContext& ctx)
const
613 rngWrapper->
setSeed( rngName, ctx );
619 const EventContext& ctx)
const
622 rngWrapper->
setSeed(
streamName, ctx.slot(), randomSeedOffset, ctx.eventID().run_number() );
631 ATH_MSG_DEBUG(
"mergeEvent: there are " << ii->first <<
" events in bunch xing " << ii->second );
637 CLHEP::HepRandomEngine *elecNoiseRndmEngine =
getRandomEngine(
"TRT_ElectronicsNoise", ctx);
638 CLHEP::HepRandomEngine *noiseRndmEngine =
getRandomEngine(
"TRT_NoiseDigitPool", ctx);
639 CLHEP::HepRandomEngine *strawRndmEngine =
getRandomEngine(
"TRT_ProcessStraw", ctx);
640 CLHEP::HepRandomEngine *elecProcRndmEngine =
getRandomEngine(
"TRT_ThresholdFluctuations", ctx);
641 CLHEP::HepRandomEngine *paiRndmEngine =
getRandomEngine(
"TRT_PAI", ctx);
646 return StatusCode::FAILURE;
659 return StatusCode::FAILURE;
665 std::set<int> sim_hitids;
666 std::set<Identifier> simhitsIdentifiers;
670 ATH_CHECK(this->
processStraws(ctx, *
m_thpctrt, sim_hitids, simhitsIdentifiers, rndmEngine, strawRndmEngine, elecProcRndmEngine, elecNoiseRndmEngine,paiRndmEngine));
679 const unsigned int numberOfDigitsBeforeNoise(
m_vDigits.size());
699 return StatusCode::FAILURE;
705 return StatusCode::SUCCESS;
712 std::vector<TRTDigit>::const_iterator TRTDigitIter(
m_vDigits.begin());
713 std::vector<TRTDigit>::const_iterator endOfTRTDigits(
m_vDigits.end());
722 while (TRTDigitIter != endOfTRTDigits) {
723 ATH_MSG_DEBUG (
"Digit ID " << TRTDigitIter->GetStrawID() <<
" Digit " << TRTDigitIter->GetDigit() );
726 bool identifierOK(
false);
727 idStraw =
getIdentifier(TRTDigitIter->GetStrawID(), IdHash, layer_id, identifierOK);
729 ATH_MSG_ERROR (
"Ignoring simhits with suspicious identifier (2)" );
742 if (IdHash != IdHashOld) {
744 ATH_MSG_DEBUG (
"New TRT RDO Collection created with IdHash " <<
static_cast<int>(IdHash) );
751 return StatusCode::FAILURE;
762 ATH_MSG_FATAL (
"Failed to create the TRT_RDO_Collection before trying to add an RDO to it! IdHash = " <<
static_cast<int>(IdHash) );
764 return StatusCode::FAILURE;
770 return StatusCode::SUCCESS;
778 bool & statusok )
const
784 const int mask(0x0000001F);
785 const int word_shift(5);
786 int trtID, ringID, moduleID, layerID, strawID;
787 int wheelID, planeID, sectorID;
792 if ( !(hitID & 0x00200000) ) {
793 strawID = hitID &
mask;
794 hitID >>= word_shift;
795 layerID = hitID &
mask;
796 hitID >>= word_shift;
797 moduleID = hitID &
mask;
798 hitID >>= word_shift;
799 ringID = hitID &
mask;
800 trtID = hitID >> word_shift;
803 if ( barrelElement ) {
805 IdLayer = barrelElement->
identify();
808 ATH_MSG_ERROR (
"Could not find detector element for barrel identifier with "
809 <<
"(ipos,iring,imod,ilayer,istraw) = ("
810 << trtID <<
", " << ringID <<
", " << moduleID <<
", "
811 << layerID <<
", " << strawID <<
")" );
815 strawID = hitID &
mask;
816 hitID >>= word_shift;
817 planeID = hitID &
mask;
818 hitID >>= word_shift;
819 sectorID = hitID &
mask;
820 hitID >>= word_shift;
821 wheelID = hitID &
mask;
822 trtID = hitID >> word_shift;
825 if (trtID == 3) { trtID = 0; }
830 if ( endcapElement ) {
832 IdLayer = endcapElement->
identify();
835 ATH_MSG_ERROR (
"Could not find detector element for endcap identifier with "
836 <<
"(ipos,iwheel,isector,iplane,istraw) = ("
837 << trtID <<
", " << wheelID <<
", " << sectorID <<
", "
838 << planeID <<
", " << strawID <<
")" );
839 ATH_MSG_ERROR (
"If this happens very rarely, don't be alarmed (it is a Geant4 'feature')" );
840 ATH_MSG_ERROR (
"If it happens a lot, you probably have misconfigured geometry in the sim. job." );
858 return StatusCode::SUCCESS;
866 int dig_vers_from_condDB = (**digvers)[
"TRT_Dig_Vers"].data<
int>();
868 if (dig_vers_from_condDB!=0) {
871 ATH_MSG_INFO (
"Retrieved TRT_Settings from CondDB with TRT digitization version: digversion = " <<
872 dig_vers_from_condDB );
874 ATH_MSG_WARNING (
"Unknown TRT digitization version: digversion = " << dig_vers_from_condDB <<
875 " read from CondDB. Overriding to use default from Det Desc tag: " <<
880 ATH_MSG_WARNING (
"TRT digitization version: digversion = " << dig_vers_from_condDB <<
881 " read from CondDB. Overriding to use default from Det Desc tag: " <<
885 return StatusCode::SUCCESS;
894 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)
size_type straw_layer_hash_max(void) const
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 empty() const
Test if the key is blank.
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 DigSettingsFromCondDB(int m_dig_vers_from_condDB)
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
#define ATH_MSG_WARNING(x)
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...
std::pair< HepMcParticleLink, float > Deposit
Define macros for attributes used to control the static checker.
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