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

#include <TRTSensitiveDetector.h>

Inheritance diagram for TRTSensitiveDetector:
Collaboration diagram for TRTSensitiveDetector:

Public Member Functions

 TRTSensitiveDetector (const std::string &name, const std::string &hitCollectionName, int setVerboseLevel=0)
 ~TRTSensitiveDetector ()
void Initialize (G4HCofThisEvent *) override final
G4bool ProcessHits (G4Step *, G4TouchableHistory *) override final
void DeleteObjects ()
 Called by TRTRunAction::EndOfRunAction ...
template<class... Args>
void AddHit (Args &&... args)
 Templated method to stuff a single hit into the sensitive detector class.

Private Member Functions

 FRIEND_TEST (TRTSensitiveDetectortest, ProcessHits)
 FRIEND_TEST (TRTSensitiveDetectortest, AddHit)
void InitializeHitProcessing ()

Private Attributes

int m_printMessages
 Configuration paremeters.
int m_hitsWithZeroEnergyDeposit
G4VProcess * m_phot
double m_energyThreshold
double m_probabilityThreshold
double m_energyDepositCorrection
double m_energyThresholdKr
double m_probabilityThresholdKr
double m_energyDepositCorrectionKr
double m_energyThresholdAr
double m_probabilityThresholdAr
double m_energyDepositCorrectionAr
double m_boundaryZ
int m_hitID
 Properties of current TRTUncompressedHit, set by TRTProcessingOfBarrelHits and TRTProcessingOfEndCapHits friend classes.
HepMcParticleLink m_partLink
int m_particleEncoding
double m_kineticEnergy
double m_energyDeposit
double m_energyDepositInKeV
double m_preStepX
double m_preStepY
double m_preStepZ
double m_postStepX
double m_postStepY
double m_postStepZ
double m_globalTime
std::string m_HitCollName
 Other member variables.
TRTUncompressedHitCollectionm_HitColl {nullptr}
AtlasG4EventUserInfom_g4UserEventInfo {nullptr}
const TRTParameters * m_pParameters
TRTProcessingOfBarrelHitsm_pProcessingOfBarrelHits
TRTProcessingOfEndCapHitsm_pProcessingOfEndCapHits
G4Material * m_pMaterialXe
G4Material * m_pMaterialKr
G4Material * m_pMaterialAr

Friends

class TRTProcessingOfBarrelHits
class TRTProcessingOfEndCapHits

Detailed Description

Definition at line 25 of file TRTSensitiveDetector.h.

Constructor & Destructor Documentation

◆ TRTSensitiveDetector()

TRTSensitiveDetector::TRTSensitiveDetector ( const std::string & name,
const std::string & hitCollectionName,
int setVerboseLevel = 0 )

Definition at line 42 of file TRTSensitiveDetector.cxx.

43 : G4VSensitiveDetector( name ),
44 //Variables properly set during InitializeHitProcessing() method
49 m_boundaryZ(0.0),
50 //End of variables properly set during InitializeHitProcessing() method
51 //Properties of current TRTUncompressedHit
54 m_preStepY(0.0), m_preStepZ(0.0), m_postStepX(0.0), m_postStepY(0.0),
55 m_postStepZ(0.0), m_globalTime(0.0),
56 //End of Properties of current TRTUncompressedHit
57 m_HitCollName( hitCollectionName ), m_pParameters(nullptr),
59 m_pMaterialXe(nullptr), m_pMaterialKr(nullptr), m_pMaterialAr(nullptr)
60{
61 m_pParameters = TRTParameters::GetPointer();
62
63 m_printMessages = m_pParameters->GetInteger("PrintMessages"); //FIXME not used - remove?
64 verboseLevel = setVerboseLevel;
65
67
68 m_pParameters = nullptr;
69}
std::string m_HitCollName
Other member variables.
int m_hitID
Properties of current TRTUncompressedHit, set by TRTProcessingOfBarrelHits and TRTProcessingOfEndCapH...
const TRTParameters * m_pParameters
TRTProcessingOfEndCapHits * m_pProcessingOfEndCapHits
int m_printMessages
Configuration paremeters.
TRTProcessingOfBarrelHits * m_pProcessingOfBarrelHits

◆ ~TRTSensitiveDetector()

TRTSensitiveDetector::~TRTSensitiveDetector ( )
inline

Definition at line 35 of file TRTSensitiveDetector.h.

35{ /* don't own any of the pointers... */ }

Member Function Documentation

◆ AddHit()

template<class... Args>
void TRTSensitiveDetector::AddHit ( Args &&... args)
inline

Templated method to stuff a single hit into the sensitive detector class.

This could get rather tricky, but the idea is to allow fast simulations to use the very same SD classes as the standard simulation.

Definition at line 46 of file TRTSensitiveDetector.h.

46{ m_HitColl->Emplace( args... ); }
TRTUncompressedHitCollection * m_HitColl

◆ DeleteObjects()

void TRTSensitiveDetector::DeleteObjects ( )

Called by TRTRunAction::EndOfRunAction ...

Definition at line 344 of file TRTSensitiveDetector.cxx.

345{
346 if(verboseLevel>4)
347 {
348 G4cout << GetName() << " DeleteObjects()" << G4endl;
349 }
350
353
354 if(verboseLevel>4)
355 {
356 G4cout << GetName() << " DeleteObjects() done" << G4endl;
357 }
358}

◆ FRIEND_TEST() [1/2]

TRTSensitiveDetector::FRIEND_TEST ( TRTSensitiveDetectortest ,
AddHit  )
private

◆ FRIEND_TEST() [2/2]

TRTSensitiveDetector::FRIEND_TEST ( TRTSensitiveDetectortest ,
ProcessHits  )
private

◆ Initialize()

void TRTSensitiveDetector::Initialize ( G4HCofThisEvent * )
finaloverride

Definition at line 169 of file TRTSensitiveDetector.cxx.

170{
171 if(verboseLevel>4)
172 {
173 G4cout << GetName() << " Initialize()" << G4endl;
174 }
175
176 // The following code etablishes a pointer to the "phot" process.
177 // This pointer is used in ProcessHits.
178 // For performance reasons we test directly on the pointer address rather
179 // than doing the string comparison for each hit in ProcessHits.
180
181 if(!m_phot) { // Only for the first event
182 const G4ProcessVector* pVec =
183 G4Gamma::Definition()->GetProcessManager()->GetProcessList();
184 for(size_t ip=0;ip<pVec->entries();ip++)
185 {
186 if((*pVec)[ip]->GetProcessName()=="phot")
187 {
188 m_phot = (*pVec)[ip];
189 break;
190 }
191 if((*pVec)[ip]->GetProcessName()=="GammaGeneralProc")
192 {
193 G4GammaGeneralProcess *genproc = static_cast<G4GammaGeneralProcess*>((*pVec)[ip]);
194 G4VEmProcess *proc = genproc->GetEmProcess("phot");
195 if (proc && proc->GetProcessName()=="phot")
196 {
197 m_phot = proc;
198 break;
199 }
200 }
201 }
202 }
203 if(!m_phot) {
204 G4cout << GetName() << "ERROR Did not find the photoelectic process!!!" << G4endl;
205 }
206
207 // nullptr checks are needed for unit tests because geant4 run is not initialized
208 // in real jobs, event manager, and event info are always set
209 if(auto* eventManager = G4EventManager::GetEventManager())
210 {
211 if(auto* eventInfo = static_cast<AtlasG4EventUserInfo*>(eventManager->GetUserInformation())) {
212 m_HitColl = eventInfo->GetHitCollectionMap()->Find<TRTUncompressedHitCollection>(m_HitCollName);
213 m_g4UserEventInfo = eventInfo;
214 }
215 }
216
217 if(verboseLevel>4)
218 {
219 G4cout << GetName() << " Initialize() done" << G4endl;
220 }
221}
AtlasHitsVector< TRTUncompressedHit > TRTUncompressedHitCollection
AtlasG4EventUserInfo * m_g4UserEventInfo

◆ InitializeHitProcessing()

void TRTSensitiveDetector::InitializeHitProcessing ( )
private

Definition at line 75 of file TRTSensitiveDetector.cxx.

76{
77 if(verboseLevel>4)
78 {
79 G4cout << GetName() << " InitializeHitProcessing()" << G4endl;
80 }
82 m_pParameters->GetInteger("HitsWithZeroEnergyDeposit");
83
84 m_phot = nullptr;
85
86 // Parameters describing flourecense in Xe gas mixture:
87 // Units of these numbers in management file are in keV; change to default units
88
89 m_energyThreshold = m_pParameters->GetDouble("EnergyThreshold" ) * CLHEP::keV;
90 m_energyThresholdKr = m_pParameters->GetDouble("EnergyThresholdKr") * CLHEP::keV;
91 m_energyThresholdAr = m_pParameters->GetDouble("EnergyThresholdAr") * CLHEP::keV;
92 m_probabilityThreshold = m_pParameters->GetDouble("ProbabilityThreshold" );
93 m_probabilityThresholdKr = m_pParameters->GetDouble("ProbabilityThresholdKr");
94 m_probabilityThresholdAr = m_pParameters->GetDouble("ProbabilityThresholdAr");
95 m_energyDepositCorrection = m_pParameters->GetDouble("EnergyDepositCorrection" ) * CLHEP::keV;
96 m_energyDepositCorrectionKr = m_pParameters->GetDouble("EnergyDepositCorrectionKr") * CLHEP::keV;
97 m_energyDepositCorrectionAr = m_pParameters->GetDouble("EnergyDepositCorrectionAr") * CLHEP::keV;
98 if(verboseLevel>9)
99 {
100 G4cout << GetName() << " Fluorescence parameters: EnergyThreshold "
101 << m_energyThreshold << G4endl;
102 G4cout << GetName() << " Fluorescence parameters: EnergyThresholdKr "
103 << m_energyThresholdKr << G4endl;
104 G4cout << GetName() << " Fluorescence parameters: EnergyThresholdAr "
105 << m_energyThresholdAr << G4endl;
106 G4cout << GetName() << " Fluorescence parameters: ProbabilityThreshold "
107 << m_probabilityThreshold << G4endl;
108 G4cout << GetName() << " Fluorescence parameters: ProbabilityThresholdKr "
109 << m_probabilityThresholdKr << G4endl;
110 G4cout << GetName() << " Fluorescence parameters: ProbabilityThresholdAr "
111 << m_probabilityThresholdAr << G4endl;
112 G4cout << GetName() << " Fluorescence parameters: EnergyDepositCorrection "
113 << m_energyDepositCorrection << G4endl;
114 G4cout << GetName() << " Fluorescence parameters: EnergyDepositCorrectionKr "
115 << m_energyDepositCorrectionKr << G4endl;
116 G4cout << GetName() << " Fluorescence parameters: EnergyDepositCorrectionAr "
117 << m_energyDepositCorrectionAr << G4endl;
118 }
119 m_boundaryZ = m_pParameters->GetDouble("LengthOfBarrelVolume") / 2.;
120
121 TRTParametersForBarrelHits* pParametersForBarrelHits = nullptr;
122 TRTParametersForEndCapHits* pParametersForEndCapHits = nullptr;
123
126
127 pParametersForBarrelHits =
128 new TRTParametersForBarrelHits(m_pProcessingOfBarrelHits);
129 pParametersForEndCapHits =
130 new TRTParametersForEndCapHits(m_pProcessingOfEndCapHits);
131
132 delete pParametersForBarrelHits;
133 delete pParametersForEndCapHits;
134
135 // Get nist material manager
136 G4NistManager* nist = G4NistManager::Instance();
137 m_pMaterialXe = nist->FindOrBuildMaterial("trt::XeCO2O2");
138 if (!m_pMaterialXe && verboseLevel>4)
139 {
140 G4cout << GetName() << " Could not find Xe material (Only OK if no TRT straws are filled with Xenon)" << G4endl;
141 }
142 m_pMaterialKr = nist->FindOrBuildMaterial("trt::KrCO2O2");
143 if (!m_pMaterialKr && verboseLevel>4)
144 {
145 G4cout << GetName() << " Could not find Kr material (Only OK if no TRT straws are filled with Krypton)" << G4endl;
146 }
147 m_pMaterialAr = nist->FindOrBuildMaterial("trt::ArCO2O2");
148 if (!m_pMaterialAr && verboseLevel>4)
149 {
150 G4cout << GetName() << " Could not find Ar material (Only OK if no TRT straws are filled with Argon)" << G4endl;
151 }
153 {
154 G4ExceptionDescription description;
155 description << "InitializeHitProcessing: Could not find Xe, Kr or Ar materials (Not OK!)";
156 G4Exception("TRTSensitiveDetector", "NoTRTGasesFound", FatalException, description);
157 }
158
159 if(verboseLevel>4)
160 {
161 G4cout << GetName() << " InitializeHitProcessing() done" << G4endl;
162 }
163}
friend class TRTProcessingOfEndCapHits
friend class TRTProcessingOfBarrelHits
std::string description
glabal timer - how long have I taken so far?
Definition hcg.cxx:91

◆ ProcessHits()

bool TRTSensitiveDetector::ProcessHits ( G4Step * pStep,
G4TouchableHistory *  )
finaloverride

Definition at line 227 of file TRTSensitiveDetector.cxx.

229{
230 m_energyDeposit = pStep->GetTotalEnergyDeposit();
231
232 G4Track* pTrack = pStep->GetTrack();
233 G4ParticleDefinition* pParticleDefinition = pTrack->GetDefinition();
234
235 // Skip particles which deposit no energy
237 {
238 if ( pParticleDefinition != G4Geantino::Definition() &&
239 pParticleDefinition != G4ChargedGeantino::Definition() )
240 {
241 return false;
242 }
243 }
244
245 // Skip electrons which originate from a photoelectric process.
246 // These electrons have very low energy and even the PAI model will
247 // give the wrong energy deposit.
248 // Instead we count for a photon which undergoes a "phot" reaction
249 // the full energy as deposited in the interaction point (see below)
250 if(pTrack->GetCreatorProcess()==m_phot)
251 {
252 return false;
253 }
254
255 // Get kinetic energy of depositing particle
256 m_kineticEnergy = pStep->GetPreStepPoint()->GetKineticEnergy();
257
258 // If we are dealing with a photon undergoing a "phot" reaction, count
259 // the photon kinetic energy as deposited energy in the point of
260 // the reaction
261
262 if ( pParticleDefinition==G4Gamma::GammaDefinition() &&
263 pStep->GetPostStepPoint()->GetProcessDefinedStep()==m_phot )
264 {
266 double current_energyThreshold = 1E+99;
267 double current_probabilityThreshold = 2.0;
268 double current_energyDepositCorrection = 0.0;
269 G4Material *pPreStepMaterial = pStep->GetPreStepPoint()->GetMaterial();
270 if (pPreStepMaterial == m_pMaterialXe)
271 {
272 current_energyThreshold = m_energyThreshold;
273 current_probabilityThreshold = m_probabilityThreshold;
274 current_energyDepositCorrection = m_energyDepositCorrection;
275 }
276 else if (pPreStepMaterial == m_pMaterialKr)
277 {
278 current_energyThreshold = m_energyThresholdKr;
279 current_probabilityThreshold = m_probabilityThresholdKr;
280 current_energyDepositCorrection = m_energyDepositCorrectionKr;
281 }
282 else if (pPreStepMaterial == m_pMaterialAr)
283 {
284 current_energyThreshold = m_energyThresholdAr;
285 current_probabilityThreshold = m_probabilityThresholdAr;
286 current_energyDepositCorrection = m_energyDepositCorrectionAr;
287 }
288 else
289 {
290 G4ExceptionDescription description;
291 description << "ProcessHits: Unknown prestep material";
292 G4Exception("TRTSensitiveDetector", "UnknownGasFound", FatalException, description);
293 return false; //The G4Exception call above should abort the job, but Coverity does not seem to pick this up.
294 }
295 // Correct for flourescence (a la Nevski):
296 // - For some percentage (15%) of photons with
297 // energy above threshold (4.9 keV) reduce deposited energy
298 // by correction (4.0 keV)
299 // (Different numbers for Ar and Kr)
300 if ( m_energyDeposit > current_energyThreshold &&
301 CLHEP::RandFlat::shoot() > current_probabilityThreshold )
302 {
303 m_energyDeposit -= current_energyDepositCorrection;
304 }
305 }
306
307
308 // Particle code of depositing particle
309 m_particleEncoding = pParticleDefinition->GetPDGEncoding();
310
311 bool trackerHit = false;
312
313 if ( std::fabs(pStep->GetPreStepPoint()->GetPosition().z()) < m_boundaryZ )
314 {
315 trackerHit = m_pProcessingOfBarrelHits->ProcessHit(pStep);
316 }
317 else
318 {
319 trackerHit = m_pProcessingOfEndCapHits->ProcessHit(pStep);
320 }
321
322 // TRTUncompressedHit appearently expects energyDeposit in keV.
323 // Convert:
325
326 // Create UncompressedHit
327
328 if (trackerHit)
329 {
330 // Build the hit straight onto the vector
332 (float) m_kineticEnergy, (float) m_energyDepositInKeV,
333 (float) m_preStepX, (float) m_preStepY, (float) m_preStepZ,
334 (float) m_postStepX, (float) m_postStepY, (float) m_postStepZ,
335 (float) m_globalTime );
336 }
337
338 return true;
339}
HepMcParticleLink m_partLink

◆ TRTProcessingOfBarrelHits

friend class TRTProcessingOfBarrelHits
friend

Definition at line 30 of file TRTSensitiveDetector.h.

◆ TRTProcessingOfEndCapHits

friend class TRTProcessingOfEndCapHits
friend

Definition at line 31 of file TRTSensitiveDetector.h.

Member Data Documentation

◆ m_boundaryZ

double TRTSensitiveDetector::m_boundaryZ
private

Definition at line 65 of file TRTSensitiveDetector.h.

◆ m_energyDeposit

double TRTSensitiveDetector::m_energyDeposit
private

Definition at line 73 of file TRTSensitiveDetector.h.

◆ m_energyDepositCorrection

double TRTSensitiveDetector::m_energyDepositCorrection
private

Definition at line 58 of file TRTSensitiveDetector.h.

◆ m_energyDepositCorrectionAr

double TRTSensitiveDetector::m_energyDepositCorrectionAr
private

Definition at line 64 of file TRTSensitiveDetector.h.

◆ m_energyDepositCorrectionKr

double TRTSensitiveDetector::m_energyDepositCorrectionKr
private

Definition at line 61 of file TRTSensitiveDetector.h.

◆ m_energyDepositInKeV

double TRTSensitiveDetector::m_energyDepositInKeV
private

Definition at line 74 of file TRTSensitiveDetector.h.

◆ m_energyThreshold

double TRTSensitiveDetector::m_energyThreshold
private

Definition at line 56 of file TRTSensitiveDetector.h.

◆ m_energyThresholdAr

double TRTSensitiveDetector::m_energyThresholdAr
private

Definition at line 62 of file TRTSensitiveDetector.h.

◆ m_energyThresholdKr

double TRTSensitiveDetector::m_energyThresholdKr
private

Definition at line 59 of file TRTSensitiveDetector.h.

◆ m_g4UserEventInfo

AtlasG4EventUserInfo* TRTSensitiveDetector::m_g4UserEventInfo {nullptr}
private

Definition at line 87 of file TRTSensitiveDetector.h.

87{nullptr};

◆ m_globalTime

double TRTSensitiveDetector::m_globalTime
private

Definition at line 81 of file TRTSensitiveDetector.h.

◆ m_HitColl

TRTUncompressedHitCollection* TRTSensitiveDetector::m_HitColl {nullptr}
private

Definition at line 86 of file TRTSensitiveDetector.h.

86{nullptr}; //pUncompressedHitCollection;

◆ m_HitCollName

std::string TRTSensitiveDetector::m_HitCollName
private

Other member variables.

Definition at line 85 of file TRTSensitiveDetector.h.

◆ m_hitID

int TRTSensitiveDetector::m_hitID
private

Properties of current TRTUncompressedHit, set by TRTProcessingOfBarrelHits and TRTProcessingOfEndCapHits friend classes.

Definition at line 69 of file TRTSensitiveDetector.h.

◆ m_hitsWithZeroEnergyDeposit

int TRTSensitiveDetector::m_hitsWithZeroEnergyDeposit
private

Definition at line 54 of file TRTSensitiveDetector.h.

◆ m_kineticEnergy

double TRTSensitiveDetector::m_kineticEnergy
private

Definition at line 72 of file TRTSensitiveDetector.h.

◆ m_particleEncoding

int TRTSensitiveDetector::m_particleEncoding
private

Definition at line 71 of file TRTSensitiveDetector.h.

◆ m_partLink

HepMcParticleLink TRTSensitiveDetector::m_partLink
private

Definition at line 70 of file TRTSensitiveDetector.h.

◆ m_phot

G4VProcess* TRTSensitiveDetector::m_phot
private

Definition at line 55 of file TRTSensitiveDetector.h.

◆ m_pMaterialAr

G4Material* TRTSensitiveDetector::m_pMaterialAr
private

Definition at line 97 of file TRTSensitiveDetector.h.

◆ m_pMaterialKr

G4Material* TRTSensitiveDetector::m_pMaterialKr
private

Definition at line 96 of file TRTSensitiveDetector.h.

◆ m_pMaterialXe

G4Material* TRTSensitiveDetector::m_pMaterialXe
private

Definition at line 95 of file TRTSensitiveDetector.h.

◆ m_postStepX

double TRTSensitiveDetector::m_postStepX
private

Definition at line 78 of file TRTSensitiveDetector.h.

◆ m_postStepY

double TRTSensitiveDetector::m_postStepY
private

Definition at line 79 of file TRTSensitiveDetector.h.

◆ m_postStepZ

double TRTSensitiveDetector::m_postStepZ
private

Definition at line 80 of file TRTSensitiveDetector.h.

◆ m_pParameters

const TRTParameters* TRTSensitiveDetector::m_pParameters
private

Definition at line 89 of file TRTSensitiveDetector.h.

◆ m_pProcessingOfBarrelHits

TRTProcessingOfBarrelHits* TRTSensitiveDetector::m_pProcessingOfBarrelHits
private

Definition at line 91 of file TRTSensitiveDetector.h.

◆ m_pProcessingOfEndCapHits

TRTProcessingOfEndCapHits* TRTSensitiveDetector::m_pProcessingOfEndCapHits
private

Definition at line 92 of file TRTSensitiveDetector.h.

◆ m_preStepX

double TRTSensitiveDetector::m_preStepX
private

Definition at line 75 of file TRTSensitiveDetector.h.

◆ m_preStepY

double TRTSensitiveDetector::m_preStepY
private

Definition at line 76 of file TRTSensitiveDetector.h.

◆ m_preStepZ

double TRTSensitiveDetector::m_preStepZ
private

Definition at line 77 of file TRTSensitiveDetector.h.

◆ m_printMessages

int TRTSensitiveDetector::m_printMessages
private

Configuration paremeters.

Definition at line 53 of file TRTSensitiveDetector.h.

◆ m_probabilityThreshold

double TRTSensitiveDetector::m_probabilityThreshold
private

Definition at line 57 of file TRTSensitiveDetector.h.

◆ m_probabilityThresholdAr

double TRTSensitiveDetector::m_probabilityThresholdAr
private

Definition at line 63 of file TRTSensitiveDetector.h.

◆ m_probabilityThresholdKr

double TRTSensitiveDetector::m_probabilityThresholdKr
private

Definition at line 60 of file TRTSensitiveDetector.h.


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