#include <G4OpticalPhysics.hh>
Inheritance diagram for G4OpticalPhysics:
Definition at line 69 of file G4OpticalPhysics.hh.
Definition at line 53 of file G4OpticalPhysics.cc.
References kNoProcess, and G4VPhysicsConstructor::verboseLevel.
00054 : G4VPhysicsConstructor(name), 00055 00056 wasActivated(false), 00057 00058 fScintillationProcess(NULL), 00059 fCerenkovProcess(NULL), 00060 fOpWLSProcess(NULL), 00061 fOpAbsorptionProcess(NULL), 00062 fOpRayleighScatteringProcess(NULL), 00063 fOpMieHGScatteringProcess(NULL), 00064 fOpBoundaryProcess(NULL), 00065 fMaxNumPhotons(100), 00066 fMaxBetaChange(10.0), 00067 fYieldFactor(1.), 00068 fExcitationRatio(0.0), 00069 fProfile("delta"), 00070 fFiniteRiseTime(false), 00071 fScintillationByParticleType(false) 00072 { 00073 verboseLevel = verbose; 00074 fMessenger = new G4OpticalPhysicsMessenger(this); 00075 00076 for ( G4int i=0; i<kNoProcess; i++ ) { 00077 fProcesses.push_back(NULL); 00078 fProcessUse.push_back(true); 00079 fProcessVerbose.push_back(verbose); 00080 fProcessTrackSecondariesFirst.push_back(true); 00081 } 00082 }
G4OpticalPhysics::~G4OpticalPhysics | ( | ) | [virtual] |
Definition at line 86 of file G4OpticalPhysics.cc.
00087 { 00088 delete fMessenger; 00089 00090 if (wasActivated) { 00091 00092 if (fScintillationProcess) delete fScintillationProcess; 00093 if (fCerenkovProcess) delete fCerenkovProcess; 00094 if (fOpWLSProcess) delete fOpWLSProcess; 00095 00096 if (fOpAbsorptionProcess) delete fOpAbsorptionProcess; 00097 if (fOpRayleighScatteringProcess) delete fOpRayleighScatteringProcess; 00098 if (fOpMieHGScatteringProcess) delete fOpMieHGScatteringProcess; 00099 if (fOpBoundaryProcess) delete fOpBoundaryProcess; 00100 00101 } 00102 }
void G4OpticalPhysics::AddScintillationSaturation | ( | G4EmSaturation * | ) |
Definition at line 302 of file G4OpticalPhysics.cc.
References G4Scintillation::AddSaturation().
00303 { 00305 00306 if(fScintillationProcess) 00307 fScintillationProcess->AddSaturation(saturation); 00308 }
void G4OpticalPhysics::Configure | ( | G4OpticalProcessIndex | , | |
G4bool | ||||
) |
Definition at line 339 of file G4OpticalPhysics.cc.
00340 { 00341 // Configure the physics constructor to use/not use a selected process. 00342 // This method can only be called in PreInit> phase (before execution of 00343 // ConstructProcess). The process is not added to particle's process manager 00344 // and so it cannot be re-activated later in Idle> phase with the command 00345 // /process/activate. 00346 00347 if ( index >= kNoProcess ) return; 00348 if ( fProcessUse[index] == isUse ) return; 00349 fProcessUse[index] = isUse; 00350 }
void G4OpticalPhysics::ConstructParticle | ( | ) | [protected, virtual] |
Implements G4VPhysicsConstructor.
Definition at line 140 of file G4OpticalPhysics.cc.
References G4OpticalPhoton::OpticalPhotonDefinition().
00141 { 00143 00144 // optical photon 00145 G4OpticalPhoton::OpticalPhotonDefinition(); 00146 }
void G4OpticalPhysics::ConstructProcess | ( | ) | [protected, virtual] |
Implements G4VPhysicsConstructor.
Definition at line 153 of file G4OpticalPhysics.cc.
References G4ProcessManager::AddDiscreteProcess(), G4ProcessManager::AddProcess(), G4Scintillation::AddSaturation(), G4LossTableManager::EmSaturation(), FatalException, G4cout, G4Exception(), G4ParticleDefinition::GetParticleName(), G4ParticleDefinition::GetProcessManager(), idxAtRest, idxPostStep, G4LossTableManager::Instance(), G4Scintillation::IsApplicable(), G4Cerenkov::IsApplicable(), kAbsorption, kBoundary, kCerenkov, kMieHG, kRayleigh, kScintillation, kWLS, G4VPhysicsConstructor::namePhysics, G4OpticalPhoton::OpticalPhoton(), G4ParticleTableIterator< K, V >::reset(), G4Scintillation::SetFiniteRiseTime(), G4Cerenkov::SetMaxBetaChangePerStep(), G4Cerenkov::SetMaxNumPhotonsPerStep(), G4ProcessManager::SetProcessOrdering(), G4ProcessManager::SetProcessOrderingToLast(), G4Scintillation::SetScintillationByParticleType(), G4Scintillation::SetScintillationExcitationRatio(), G4Scintillation::SetScintillationYieldFactor(), SetTrackSecondariesFirst(), G4VPhysicsConstructor::SetVerboseLevel(), G4VPhysicsConstructor::theParticleIterator, G4OpWLS::UseTimeProfile(), G4ParticleTableIterator< K, V >::value(), and G4VPhysicsConstructor::verboseLevel.
00154 { 00155 // Construct optical processes. 00156 00157 if (wasActivated) return; 00158 00159 if(verboseLevel>0) 00160 G4cout <<"G4OpticalPhysics:: Add Optical Physics Processes"<< G4endl; 00161 00162 // Add Optical Processes 00163 00164 fProcesses[kAbsorption] = fOpAbsorptionProcess = new G4OpAbsorption(); 00165 fProcesses[kRayleigh] = fOpRayleighScatteringProcess = new G4OpRayleigh(); 00166 fProcesses[kMieHG] = fOpMieHGScatteringProcess = new G4OpMieHG(); 00167 00168 fProcesses[kBoundary] = fOpBoundaryProcess = new G4OpBoundaryProcess(); 00169 00170 fProcesses[kWLS] = fOpWLSProcess = new G4OpWLS(); 00171 fOpWLSProcess->UseTimeProfile(fProfile); 00172 00173 G4ProcessManager * pManager = 0; 00174 pManager = G4OpticalPhoton::OpticalPhoton()->GetProcessManager(); 00175 00176 if (!pManager) { 00177 std::ostringstream o; 00178 o << "Optical Photon without a Process Manager"; 00179 G4Exception("G4OpticalPhysics::ConstructProcess()","", 00180 FatalException,o.str().c_str()); 00181 return; 00182 } 00183 00184 for ( G4int i=kAbsorption; i<=kWLS; i++ ) { 00185 if ( fProcessUse[i] ) { 00186 pManager->AddDiscreteProcess(fProcesses[i]); 00187 } 00188 } 00189 00190 fProcesses[kScintillation] = fScintillationProcess = new G4Scintillation(); 00191 fScintillationProcess->SetScintillationYieldFactor(fYieldFactor); 00192 fScintillationProcess->SetScintillationExcitationRatio(fExcitationRatio); 00193 fScintillationProcess->SetFiniteRiseTime(fFiniteRiseTime); 00194 fScintillationProcess->SetScintillationByParticleType(fScintillationByParticleType); 00195 fScintillationProcess-> 00196 SetTrackSecondariesFirst(fProcessTrackSecondariesFirst[kScintillation]); 00197 00198 // Use Birks Correction in the Scintillation process 00199 00200 G4EmSaturation* emSaturation = G4LossTableManager::Instance()->EmSaturation(); 00201 fScintillationProcess->AddSaturation(emSaturation); 00202 00203 fProcesses[kCerenkov] = fCerenkovProcess = new G4Cerenkov(); 00204 fCerenkovProcess->SetMaxNumPhotonsPerStep(fMaxNumPhotons); 00205 fCerenkovProcess->SetMaxBetaChangePerStep(fMaxBetaChange); 00206 fCerenkovProcess-> 00207 SetTrackSecondariesFirst(fProcessTrackSecondariesFirst[kCerenkov]); 00208 00209 theParticleIterator->reset(); 00210 00211 while( (*theParticleIterator)() ){ 00212 00213 G4ParticleDefinition* particle = theParticleIterator->value(); 00214 G4String particleName = particle->GetParticleName(); 00215 00216 pManager = particle->GetProcessManager(); 00217 if (!pManager) { 00218 std::ostringstream o; 00219 o << "Particle " << particleName << "without a Process Manager"; 00220 G4Exception("G4OpticalPhysics::ConstructProcess()","", 00221 FatalException,o.str().c_str()); 00222 return; // else coverity complains for pManager use below 00223 } 00224 00225 if( fCerenkovProcess->IsApplicable(*particle) && 00226 fProcessUse[kCerenkov] ) { 00227 pManager->AddProcess(fCerenkovProcess); 00228 pManager->SetProcessOrdering(fCerenkovProcess,idxPostStep); 00229 } 00230 if( fScintillationProcess->IsApplicable(*particle) && 00231 fProcessUse[kScintillation] ){ 00232 pManager->AddProcess(fScintillationProcess); 00233 pManager->SetProcessOrderingToLast(fScintillationProcess,idxAtRest); 00234 pManager->SetProcessOrderingToLast(fScintillationProcess,idxPostStep); 00235 } 00236 00237 } 00238 00239 // Add verbose 00240 for ( G4int i=0; i<kNoProcess; i++ ) { 00241 fProcesses[i]->SetVerboseLevel(fProcessVerbose[i]); 00242 } 00243 00244 if (verboseLevel > 1) PrintStatistics(); 00245 if (verboseLevel > 0) 00246 G4cout << "### " << namePhysics << " physics constructed." << G4endl; 00247 00248 wasActivated = true; 00249 00250 }
virtual G4Cerenkov* G4OpticalPhysics::GetCerenkovProcess | ( | ) | [inline, virtual] |
virtual G4OpAbsorption* G4OpticalPhysics::GetOpAbsorptionProcess | ( | ) | [inline, virtual] |
virtual G4OpBoundaryProcess* G4OpticalPhysics::GetOpBoundaryProcess | ( | ) | [inline, virtual] |
virtual G4OpMieHG* G4OpticalPhysics::GetOpMieHGProcess | ( | ) | [inline, virtual] |
virtual G4OpRayleigh* G4OpticalPhysics::GetOpRayleighProcess | ( | ) | [inline, virtual] |
virtual G4OpWLS* G4OpticalPhysics::GetOpWLSProcess | ( | ) | [inline, virtual] |
virtual G4Scintillation* G4OpticalPhysics::GetScintillationProcess | ( | ) | [inline, virtual] |
void G4OpticalPhysics::SetFiniteRiseTime | ( | G4bool | ) |
Definition at line 332 of file G4OpticalPhysics.cc.
References G4Scintillation::SetFiniteRiseTime().
Referenced by G4OpticalPhysicsMessenger::SetNewValue().
00333 { 00334 fFiniteRiseTime = finiteRiseTime; 00335 if(fScintillationProcess) 00336 fScintillationProcess->SetFiniteRiseTime(finiteRiseTime); 00337 }
void G4OpticalPhysics::SetMaxBetaChangePerStep | ( | G4double | ) |
Definition at line 282 of file G4OpticalPhysics.cc.
References G4Cerenkov::SetMaxBetaChangePerStep().
Referenced by G4OpticalPhysicsMessenger::SetNewValue().
00283 { 00285 00286 fMaxBetaChange = maxBetaChange; 00287 00288 if(fCerenkovProcess) 00289 fCerenkovProcess->SetMaxBetaChangePerStep(maxBetaChange); 00290 }
void G4OpticalPhysics::SetMaxNumPhotonsPerStep | ( | G4int | ) |
Definition at line 272 of file G4OpticalPhysics.cc.
References G4Cerenkov::SetMaxNumPhotonsPerStep().
Referenced by G4OpticalPhysicsMessenger::SetNewValue().
00273 { 00275 00276 fMaxNumPhotons = maxNumPhotons; 00277 00278 if(fCerenkovProcess) 00279 fCerenkovProcess->SetMaxNumPhotonsPerStep(maxNumPhotons); 00280 }
Definition at line 352 of file G4OpticalPhysics.cc.
00354 { 00355 // Set new verbose level to a selected process 00356 00357 if ( index >= kNoProcess ) return; 00358 if ( fProcessVerbose[index] == inputVerboseLevel ) return; 00359 00360 fProcessVerbose[index] = inputVerboseLevel; 00361 00362 if ( fProcesses[index] ) fProcesses[index]->SetVerboseLevel(inputVerboseLevel); 00363 }
void G4OpticalPhysics::SetScintillationByParticleType | ( | G4bool | ) |
Definition at line 310 of file G4OpticalPhysics.cc.
References G4Scintillation::SetScintillationByParticleType().
Referenced by G4OpticalPhysicsMessenger::SetNewValue().
00311 { 00312 fScintillationByParticleType = scintillationByParticleType; 00313 00314 if (fScintillationProcess) 00315 fScintillationProcess->SetScintillationByParticleType(scintillationByParticleType); 00316 }
void G4OpticalPhysics::SetScintillationExcitationRatio | ( | G4double | ) |
Definition at line 262 of file G4OpticalPhysics.cc.
References G4Scintillation::SetScintillationExcitationRatio().
00263 { 00265 00266 fExcitationRatio = excitationRatio; 00267 00268 if(fScintillationProcess) 00269 fScintillationProcess->SetScintillationExcitationRatio(excitationRatio); 00270 }
void G4OpticalPhysics::SetScintillationYieldFactor | ( | G4double | ) |
Definition at line 252 of file G4OpticalPhysics.cc.
References G4Scintillation::SetScintillationYieldFactor().
Referenced by G4OpticalPhysicsMessenger::SetNewValue().
00253 { 00255 00256 fYieldFactor = yieldFactor; 00257 00258 if(fScintillationProcess) 00259 fScintillationProcess->SetScintillationYieldFactor(yieldFactor); 00260 }
void G4OpticalPhysics::SetTrackSecondariesFirst | ( | G4OpticalProcessIndex | , | |
G4bool | ||||
) |
Definition at line 318 of file G4OpticalPhysics.cc.
References kCerenkov, kScintillation, G4Scintillation::SetTrackSecondariesFirst(), and G4Cerenkov::SetTrackSecondariesFirst().
Referenced by ConstructProcess(), and G4OpticalPhysicsMessenger::SetNewValue().
00320 { 00321 if ( index >= kNoProcess ) return; 00322 if ( fProcessTrackSecondariesFirst[index] == trackSecondariesFirst ) return; 00323 fProcessTrackSecondariesFirst[index] = trackSecondariesFirst; 00324 00325 if(fCerenkovProcess && index == kCerenkov ) 00326 fCerenkovProcess->SetTrackSecondariesFirst(trackSecondariesFirst); 00327 00328 if(fScintillationProcess && index == kScintillation) 00329 fScintillationProcess->SetTrackSecondariesFirst(trackSecondariesFirst); 00330 }
void G4OpticalPhysics::SetWLSTimeProfile | ( | G4String | ) |
Definition at line 292 of file G4OpticalPhysics.cc.
References G4OpWLS::UseTimeProfile().
Referenced by G4OpticalPhysicsMessenger::SetNewValue().
00293 { 00295 00296 fProfile = profile; 00297 00298 if(fOpWLSProcess) 00299 fOpWLSProcess->UseTimeProfile(fProfile); 00300 }