File indexing completed on 2024-04-06 11:56:27
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include "Alignment/LaserAlignmentSimulation/interface/LaserOpticalPhysicsList.h"
0010 #include "SimG4Core/PhysicsLists/interface/EmParticleList.h"
0011
0012 #include "G4ParticleTable.hh"
0013 #include "G4ProcessManager.hh"
0014
0015 #include "G4Cerenkov.hh"
0016 #include "G4OpAbsorption.hh"
0017 #include "G4OpBoundaryProcess.hh"
0018 #include "G4OpRayleigh.hh"
0019 #include "G4Scintillation.hh"
0020
0021 LaserOpticalPhysicsList::LaserOpticalPhysicsList(const G4String &name)
0022 : G4VPhysicsConstructor(name),
0023 wasActivated(false),
0024 theScintProcess(),
0025 theCerenkovProcess(),
0026 theAbsorptionProcess(),
0027 theRayleighScattering(),
0028 theBoundaryProcess(),
0029 theWLSProcess() {
0030 if (verboseLevel > 0)
0031 std::cout << "<LaserOpticalPhysicsList::LaserOpticalPhysicsList(...)> "
0032 "entering constructor ..."
0033 << std::endl;
0034 }
0035
0036 LaserOpticalPhysicsList::~LaserOpticalPhysicsList() {
0037 if (verboseLevel > 0) {
0038 std::cout << "<LaserOpticalPhysicsList::~LaserOpticalPhysicsList()> "
0039 "entering destructor ... "
0040 << std::endl;
0041 std::cout << " deleting the processes ... ";
0042 }
0043 if (theWLSProcess != nullptr) {
0044 delete theWLSProcess;
0045 }
0046 if (theBoundaryProcess != nullptr) {
0047 delete theBoundaryProcess;
0048 }
0049 if (theRayleighScattering != nullptr) {
0050 delete theRayleighScattering;
0051 }
0052 if (theAbsorptionProcess != nullptr) {
0053 delete theAbsorptionProcess;
0054 }
0055 if (theScintProcess != nullptr) {
0056 delete theScintProcess;
0057 }
0058 if (verboseLevel > 0)
0059 G4cout << " done " << G4endl;
0060 }
0061
0062 void LaserOpticalPhysicsList::ConstructParticle() {
0063 if (verboseLevel > 0)
0064 G4cout << "<LaserOpticalPhysicsList::ConstructParticle()>: constructing "
0065 "the optical photon ... "
0066 << G4endl;
0067
0068
0069 G4OpticalPhoton::OpticalPhotonDefinition();
0070 }
0071
0072 void LaserOpticalPhysicsList::ConstructProcess() {
0073 if (verboseLevel > 0)
0074 G4cout << "<LaserOpticalPhysicsList::ConstructProcess()>: constructing "
0075 "the physics ... "
0076 << G4endl;
0077
0078 theScintProcess = new G4Scintillation();
0079 theAbsorptionProcess = new G4OpAbsorption();
0080 theRayleighScattering = new G4OpRayleigh();
0081 theBoundaryProcess = new G4OpBoundaryProcess("OpBoundary");
0082 theWLSProcess = new G4OpWLS();
0083
0084
0085 theAbsorptionProcess->SetVerboseLevel(verboseLevel);
0086 theBoundaryProcess->SetVerboseLevel(verboseLevel);
0087
0088 G4ProcessManager *pManager = nullptr;
0089
0090 pManager = G4OpticalPhoton::OpticalPhoton()->GetProcessManager();
0091 pManager->AddDiscreteProcess(theAbsorptionProcess);
0092 pManager->AddDiscreteProcess(theRayleighScattering);
0093 pManager->AddDiscreteProcess(theBoundaryProcess);
0094 pManager->AddDiscreteProcess(theWLSProcess);
0095
0096 theScintProcess->SetTrackSecondariesFirst(true);
0097
0098 G4ParticleTable *table = G4ParticleTable::GetParticleTable();
0099 EmParticleList emList;
0100 for (const auto &particleName : emList.PartNames()) {
0101 G4ParticleDefinition *particle = table->FindParticle(particleName);
0102 pManager = particle->GetProcessManager();
0103 if (theScintProcess->IsApplicable(*particle)) {
0104 pManager->AddProcess(theScintProcess);
0105 pManager->SetProcessOrderingToLast(theScintProcess, idxAtRest);
0106 pManager->SetProcessOrderingToLast(theScintProcess, idxPostStep);
0107 }
0108 }
0109
0110 wasActivated = true;
0111 }