Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4OpticalParameters.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26// -------------------------------------------------------------------
27//
28// GEANT4 Class file
29//
30// File name: G4OpticalParameters
31//
32// Author: Daren Sawkey based on G4EmParameters
33//
34// Creation date: 14.07.2020
35//
36// Modifications:
37//
38// -------------------------------------------------------------------
39//
40//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
41//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
42
46#include "G4UnitsTable.hh"
47#include "G4SystemOfUnits.hh"
48#include "G4ApplicationState.hh"
49#include "G4StateManager.hh"
50
51G4OpticalParameters* G4OpticalParameters::theInstance = nullptr;
52
53#ifdef G4MULTITHREADED
54G4Mutex G4OpticalParameters::opticalParametersMutex = G4MUTEX_INITIALIZER;
55#endif
56
57//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
58
60{
61 if(nullptr == theInstance)
62 {
63#ifdef G4MULTITHREADED
64 G4MUTEXLOCK(&opticalParametersMutex);
65 if(nullptr == theInstance)
66 {
67#endif
68 static G4OpticalParameters manager;
69 theInstance = &manager;
70#ifdef G4MULTITHREADED
71 }
72 G4MUTEXUNLOCK(&opticalParametersMutex);
73#endif
74 }
75 return theInstance;
76}
77
78//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
79
81
82//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
83
84G4OpticalParameters::G4OpticalParameters()
85{
86 theMessenger = new G4OpticalParametersMessenger(this);
87 Initialise();
88
89 fStateManager = G4StateManager::GetStateManager();
90}
91
93{
94 if(!IsLocked())
95 {
96 Initialise();
97 }
98}
99
100void G4OpticalParameters::Initialise()
101{
102 verboseLevel = 0;
103
104 cerenkovStackPhotons = true;
105 cerenkovTrackSecondariesFirst = true;
106 cerenkovVerboseLevel = 0;
107 cerenkovMaxPhotons = 100;
108 cerenkovMaxBetaChange = 10.;
109
110 scintByParticleType = false;
111 scintTrackInfo = false;
112 scintStackPhotons = true;
113 scintFiniteRiseTime = false;
114 scintTrackSecondariesFirst = true;
115 scintVerboseLevel = 0;
116
117 wlsTimeProfileName = "delta";
118 wlsVerboseLevel = 0;
119
120 wls2TimeProfileName = "delta";
121 wls2VerboseLevel = 0;
122
123 absorptionVerboseLevel = 0;
124
125 rayleighVerboseLevel = 0;
126
127 mieVerboseLevel = 0;
128
129 boundaryInvokeSD = false;
130 boundaryVerboseLevel = 0;
131
132 processActivation["OpRayleigh"] = true;
133 processActivation["OpBoundary"] = true;
134 processActivation["OpMieHG"] = true;
135 processActivation["OpAbsorption"] = true;
136 processActivation["OpWLS"] = true;
137 processActivation["OpWLS2"] = true;
138 processActivation["Cerenkov"] = true;
139 processActivation["Scintillation"] = true;
140}
141
143{
144 if(IsLocked())
145 {
146 return;
147 }
148 verboseLevel = val;
149 SetCerenkovVerboseLevel(verboseLevel);
150 SetScintVerboseLevel(verboseLevel);
151 SetRayleighVerboseLevel(verboseLevel);
152 SetAbsorptionVerboseLevel(verboseLevel);
153 SetMieVerboseLevel(verboseLevel);
154 SetBoundaryVerboseLevel(verboseLevel);
155 SetWLSVerboseLevel(verboseLevel);
156 SetWLS2VerboseLevel(verboseLevel);
157}
158
159G4int G4OpticalParameters::GetVerboseLevel() const { return verboseLevel; }
160
162 G4bool val)
163{
164 // Configure the physics constructor to use/not use a selected process.
165 // This method can only be called in PreInit> phase (before execution of
166 // ConstructProcess). The process is not added to particle's process manager
167 // and so it cannot be re-activated later in Idle> phase with the command
168 // /process/activate.
169
170 if(IsLocked())
171 {
172 return;
173 }
174 if(processActivation[process] == val)
175 return;
176
177 // processActivation keys defined at initialisation
178 if(processActivation.find(process) != processActivation.end())
179 {
180 processActivation[process] = val;
181 }
182 else
183 {
185 ed << "Process name " << process << " out of bounds.";
186 G4Exception("G4OpticalParameters::SetProcessActivation()", "Optical013",
187 FatalException, ed);
188 }
189}
190
192{
193 return processActivation.find(process)->second;
194}
195
197{
198 if(IsLocked())
199 {
200 return;
201 }
202 cerenkovStackPhotons = val;
203}
204
206{
207 return cerenkovStackPhotons;
208}
209
211{
212 if(IsLocked())
213 {
214 return;
215 }
216 cerenkovVerboseLevel = val;
217}
218
220{
221 return cerenkovVerboseLevel;
222}
223
225{
226 if(IsLocked())
227 {
228 return;
229 }
230 cerenkovMaxPhotons = val;
231}
232
234{
235 return cerenkovMaxPhotons;
236}
237
239{
240 if(IsLocked())
241 {
242 return;
243 }
244 cerenkovMaxBetaChange = val;
245}
246
248{
249 return cerenkovMaxBetaChange;
250}
251
253{
254 if(IsLocked())
255 {
256 return;
257 }
258 cerenkovTrackSecondariesFirst = val;
259}
260
262{
263 return cerenkovTrackSecondariesFirst;
264}
265
267{
268 if(IsLocked())
269 {
270 return;
271 }
272 scintByParticleType = val;
273}
274
276{
277 return scintByParticleType;
278}
279
281{
282 if(IsLocked())
283 {
284 return;
285 }
286 scintTrackInfo = val;
287}
288
289G4bool G4OpticalParameters::GetScintTrackInfo() const { return scintTrackInfo; }
290
292{
293 if(IsLocked())
294 {
295 return;
296 }
297 scintTrackSecondariesFirst = val;
298}
299
301{
302 return scintTrackSecondariesFirst;
303}
304
306{
307 if(IsLocked())
308 {
309 return;
310 }
311 scintFiniteRiseTime = val;
312}
313
315{
316 return scintFiniteRiseTime;
317}
318
320{
321 if(IsLocked())
322 {
323 return;
324 }
325 scintStackPhotons = val;
326}
327
329{
330 return scintStackPhotons;
331}
332
334{
335 if(IsLocked())
336 {
337 return;
338 }
339 scintVerboseLevel = val;
340}
341
343{
344 return scintVerboseLevel;
345}
346
348{
349 if(IsLocked())
350 {
351 return;
352 }
353 wlsTimeProfileName = val;
354}
355
357{
358 return wlsTimeProfileName;
359}
360
362{
363 if(IsLocked())
364 {
365 return;
366 }
367 wlsVerboseLevel = val;
368}
369
371{
372 return wlsVerboseLevel;
373}
374
376{
377 if(IsLocked())
378 {
379 return;
380 }
381 wls2TimeProfileName = val;
382}
383
385{
386 return wls2TimeProfileName;
387}
388
390{
391 if(IsLocked())
392 {
393 return;
394 }
395 wls2VerboseLevel = val;
396}
397
399{
400 return wls2VerboseLevel;
401}
402
404{
405 if(IsLocked())
406 {
407 return;
408 }
409 boundaryVerboseLevel = val;
410}
411
413{
414 return boundaryVerboseLevel;
415}
416
418{
419 if(IsLocked())
420 {
421 return;
422 }
423 boundaryInvokeSD = val;
424}
425
427{
428 return boundaryInvokeSD;
429}
430
432{
433 if(IsLocked())
434 {
435 return;
436 }
437 absorptionVerboseLevel = val;
438}
439
441{
442 return absorptionVerboseLevel;
443}
444
446{
447 if(IsLocked())
448 {
449 return;
450 }
451 rayleighVerboseLevel = val;
452}
453
455{
456 return rayleighVerboseLevel;
457}
458
460{
461 if(IsLocked())
462 {
463 return;
464 }
465 mieVerboseLevel = val;
466}
467
469{
470 return mieVerboseLevel;
471}
472
473void G4OpticalParameters::PrintWarning(G4ExceptionDescription& ed) const
474{
475 G4Exception("G4EmParameters", "Optical0020", JustWarning, ed);
476}
477
478void G4OpticalParameters::StreamInfo(std::ostream& os) const
479{
480 G4long prec = os.precision(5);
481 os
482 << "======================================================================="
483 << "\n";
484 os
485 << "====== Optical Physics Parameters ========"
486 << "\n";
487 os
488 << "======================================================================="
489 << "\n";
490
491 os << " Cerenkov process active: "
492 << GetProcessActivation("Cerenkov") << "\n";
493 os << " Cerenkov maximum photons per step: " << cerenkovMaxPhotons
494 << "\n";
495 os << " Cerenkov maximum beta change per step: " << cerenkovMaxBetaChange
496 << " %\n";
497 os << " Cerenkov stack photons: " << cerenkovStackPhotons
498 << "\n";
499 os << " Cerenkov track secondaries first: "
500 << cerenkovTrackSecondariesFirst << "\n";
501 os << " Scintillation process active: "
502 << GetProcessActivation("Scintillation") << "\n";
503 os << " Scintillation finite rise time: " << scintFiniteRiseTime
504 << "\n";
505 os << " Scintillation by particle type: " << scintByParticleType
506 << "\n";
507 os << " Scintillation record track info: " << scintTrackInfo << "\n";
508 os << " Scintillation stack photons: " << scintStackPhotons << "\n";
509 os << " Scintillation track secondaries first: " << scintTrackSecondariesFirst
510 << "\n";
511 os << " WLS process active: "
512 << GetProcessActivation("OpWLS") << "\n";
513 os << " WLS time profile name: " << wlsTimeProfileName
514 << "\n";
515 os << " WLS2 process active: "
516 << GetProcessActivation("OpWLS2") << "\n";
517 os << " WLS2 time profile name: " << wls2TimeProfileName
518 << "\n";
519 os << " Boundary process active: "
520 << GetProcessActivation("OpBoundary") << "\n";
521 os << " Boundary invoke sensitive detector: " << boundaryInvokeSD << "\n";
522 os << " Rayleigh process active: "
523 << GetProcessActivation("OpRayleigh") << "\n";
524 os << " MieHG process active: "
525 << GetProcessActivation("OpMieHG") << "\n";
526 os << " Absorption process active: "
527 << GetProcessActivation("OpAbsorption") << "\n";
528 os
529 << "======================================================================="
530 << "\n";
531 os.precision(prec);
532}
533
535{
536#ifdef G4MULTITHREADED
537 G4MUTEXLOCK(&opticalParametersMutex);
538#endif
540#ifdef G4MULTITHREADED
541 G4MUTEXUNLOCK(&opticalParametersMutex);
542#endif
543}
544
545std::ostream& operator<<(std::ostream& os, const G4OpticalParameters& par)
546{
547 par.StreamInfo(os);
548 return os;
549}
550
551G4bool G4OpticalParameters::IsLocked() const
552{
553 return (!G4Threading::IsMasterThread() ||
554 (fStateManager->GetCurrentState() != G4State_PreInit &&
555 fStateManager->GetCurrentState() != G4State_Init &&
556 fStateManager->GetCurrentState() != G4State_Idle));
557}
@ G4State_Init
@ G4State_Idle
@ G4State_PreInit
@ JustWarning
@ FatalException
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.cc:59
std::ostringstream G4ExceptionDescription
Definition: G4Exception.hh:40
std::ostream & operator<<(std::ostream &os, const G4OpticalParameters &par)
#define G4MUTEX_INITIALIZER
Definition: G4Threading.hh:85
#define G4MUTEXLOCK(mutex)
Definition: G4Threading.hh:251
#define G4MUTEXUNLOCK(mutex)
Definition: G4Threading.hh:254
std::mutex G4Mutex
Definition: G4Threading.hh:81
double G4double
Definition: G4Types.hh:83
long G4long
Definition: G4Types.hh:87
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
G4GLOB_DLL std::ostream G4cout
G4bool GetBoundaryInvokeSD() const
void SetScintByParticleType(G4bool)
void SetCerenkovMaxBetaChange(G4double)
void SetRayleighVerboseLevel(G4int)
void SetCerenkovMaxPhotonsPerStep(G4int)
void SetBoundaryInvokeSD(G4bool)
void SetBoundaryVerboseLevel(G4int)
G4int GetCerenkovVerboseLevel() const
void SetScintTrackSecondariesFirst(G4bool)
G4int GetScintVerboseLevel() const
void StreamInfo(std::ostream &os) const
G4int GetAbsorptionVerboseLevel() const
void SetScintStackPhotons(G4bool)
G4bool GetScintStackPhotons() const
G4int GetBoundaryVerboseLevel() const
G4int GetRayleighVerboseLevel() const
G4int GetWLS2VerboseLevel() const
G4String GetWLS2TimeProfile() const
G4int GetMieVerboseLevel() const
void SetWLS2TimeProfile(const G4String &)
G4int GetCerenkovMaxPhotonsPerStep() const
static G4OpticalParameters * Instance()
G4double GetCerenkovMaxBetaChange() const
void SetAbsorptionVerboseLevel(G4int)
G4bool GetProcessActivation(const G4String &) const
void SetCerenkovStackPhotons(G4bool)
void SetCerenkovTrackSecondariesFirst(G4bool)
void SetScintFiniteRiseTime(G4bool)
G4String GetWLSTimeProfile() const
G4bool GetScintByParticleType() const
void SetWLSTimeProfile(const G4String &)
G4bool GetScintFiniteRiseTime() const
void SetCerenkovVerboseLevel(G4int)
G4bool GetScintTrackInfo() const
G4bool GetCerenkovTrackSecondariesFirst() const
G4int GetWLSVerboseLevel() const
void SetProcessActivation(const G4String &, G4bool)
G4bool GetScintTrackSecondariesFirst() const
G4bool GetCerenkovStackPhotons() const
const G4ApplicationState & GetCurrentState() const
static G4StateManager * GetStateManager()
G4bool IsMasterThread()
Definition: G4Threading.cc:124