source: trunk/source/physics_lists/builders/src/G4OpticalPhysics.cc @ 1340

Last change on this file since 1340 was 1340, checked in by garnier, 14 years ago

update ti head

File size: 9.3 KB
Line 
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//
29// ClassName:   G4OpticalPhysics
30//
31// Author:      P.Gumplinger 30.09.2009
32//
33// Modified:
34//
35//----------------------------------------------------------------------------
36//
37
38#include "G4OpticalPhysics.hh"
39
40#include "G4LossTableManager.hh"
41#include "G4EmSaturation.hh"
42
43//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
44G4OpticalPhysics::G4OpticalPhysics(G4int verbose) 
45  : G4VPhysicsConstructor("Optical")
46,
47    wasActivated(false),
48
49    fScintillationProcess(0),
50    fCerenkovProcess(0),
51    fOpWLSProcess(0),
52    fOpAbsorptionProcess(0),
53    fOpRayleighScatteringProcess(0),
54    fOpMieHGScatteringProcess(0),
55    fOpBoundaryProcess(0),
56    fMaxNumPhotons(100),
57    fMaxBetaChange(10.0),
58    fYieldFactor(1.),
59    fExcitationRatio(0.0),
60    fSurfaceModel(unified),
61    fProfile("delta"),
62    fTrackSecondariesFirst(true),
63    fScintillationByParticleType(false)
64{
65  verboseLevel = verbose;
66  fMessenger = new G4OpticalPhysicsMessenger(this);
67}
68
69G4OpticalPhysics::G4OpticalPhysics(G4int verbose, const G4String& name)
70  : G4VPhysicsConstructor(name),
71    wasActivated(false),
72
73    fScintillationProcess(0),
74    fCerenkovProcess(0),
75    fOpWLSProcess(0),
76    fOpAbsorptionProcess(0),
77    fOpRayleighScatteringProcess(0),
78    fOpMieHGScatteringProcess(0),
79    fOpBoundaryProcess(0),
80    fMaxNumPhotons(100),
81    fMaxBetaChange(10.0),
82    fYieldFactor(1.),
83    fExcitationRatio(0.0),
84    fSurfaceModel(unified),
85    fProfile("delta"),
86    fTrackSecondariesFirst(true),
87    fScintillationByParticleType(false)
88{
89  verboseLevel = verbose;
90  fMessenger = new G4OpticalPhysicsMessenger(this);
91}
92
93//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
94
95G4OpticalPhysics::~G4OpticalPhysics()
96{
97  delete fMessenger;
98
99  if (wasActivated) {
100
101     delete fScintillationProcess;
102     delete fCerenkovProcess;
103     delete fOpWLSProcess;
104
105     delete fOpAbsorptionProcess;
106     delete fOpRayleighScatteringProcess;
107     delete fOpMieHGScatteringProcess;
108     delete fOpBoundaryProcess;
109
110  }
111}
112
113//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
114
115#include "G4OpticalPhoton.hh"
116
117void G4OpticalPhysics::ConstructParticle()
118{
119/// Instantiate particles.
120
121  // optical photon
122  G4OpticalPhoton::OpticalPhotonDefinition();
123}
124
125//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
126
127#include "G4ParticleDefinition.hh"
128#include "G4ProcessManager.hh"
129
130void G4OpticalPhysics::ConstructProcess()
131{
132// Construct optical processes.
133
134  if (wasActivated) return;
135
136  if(verboseLevel>0)
137         G4cout <<"G4OpticalPhysics:: Add Optical Physics Processes"<< G4endl;
138
139  // Add Optical Processes
140
141  fOpAbsorptionProcess  = new G4OpAbsorption();
142  fOpRayleighScatteringProcess = new G4OpRayleigh();
143  fOpMieHGScatteringProcess = new G4OpMieHG();
144
145  fOpBoundaryProcess    = new G4OpBoundaryProcess();
146  fOpBoundaryProcess->SetModel(fSurfaceModel);
147
148  fOpWLSProcess         = new G4OpWLS();
149  fOpWLSProcess->UseTimeProfile(fProfile);
150
151  G4ProcessManager * pManager = 0;
152  pManager = G4OpticalPhoton::OpticalPhoton()->GetProcessManager();
153
154  if (!pManager) {
155     std::ostringstream o;
156     o << "Optical Photon without a Process Manager";
157     G4Exception("G4OpticalPhysics::ConstructProcess()","",
158                  FatalException,o.str().c_str());
159     return;
160  }
161
162  pManager->AddDiscreteProcess(fOpAbsorptionProcess);
163  pManager->AddDiscreteProcess(fOpRayleighScatteringProcess);
164  pManager->AddDiscreteProcess(fOpMieHGScatteringProcess);
165  pManager->AddDiscreteProcess(fOpBoundaryProcess);
166  pManager->AddDiscreteProcess(fOpWLSProcess);
167
168  fScintillationProcess       = new G4Scintillation();
169  fScintillationProcess->SetScintillationYieldFactor(fYieldFactor);
170  fScintillationProcess->SetScintillationExcitationRatio(fExcitationRatio);
171  fScintillationProcess->SetTrackSecondariesFirst(fTrackSecondariesFirst);
172  fScintillationProcess->SetScintillationByParticleType(fScintillationByParticleType);
173
174  // Use Birks Correction in the Scintillation process
175
176  G4EmSaturation* emSaturation = G4LossTableManager::Instance()->EmSaturation();
177  fScintillationProcess->AddSaturation(emSaturation);
178
179  fCerenkovProcess    = new G4Cerenkov();
180  fCerenkovProcess->SetMaxNumPhotonsPerStep(fMaxNumPhotons);
181  fCerenkovProcess->SetMaxBetaChangePerStep(fMaxBetaChange);
182  fCerenkovProcess->SetTrackSecondariesFirst(fTrackSecondariesFirst);
183
184  theParticleIterator->reset();
185
186  while( (*theParticleIterator)() ){
187
188    G4ParticleDefinition* particle = theParticleIterator->value();
189    G4String particleName = particle->GetParticleName();
190
191    pManager = particle->GetProcessManager();
192    if (!pManager) {
193       std::ostringstream o;
194       o << "Particle " << particleName << "without a Process Manager";
195       G4Exception("G4OpticalPhysics::ConstructProcess()","",
196                    FatalException,o.str().c_str());
197    }
198
199    if(fCerenkovProcess->IsApplicable(*particle)){
200      pManager->AddProcess(fCerenkovProcess);
201      pManager->SetProcessOrdering(fCerenkovProcess,idxPostStep);
202    }
203    if(fScintillationProcess->IsApplicable(*particle)){
204      pManager->AddProcess(fScintillationProcess);
205      pManager->SetProcessOrderingToLast(fScintillationProcess,idxAtRest);
206      pManager->SetProcessOrderingToLast(fScintillationProcess,idxPostStep);
207    }
208
209  }
210
211  wasActivated = true;
212
213}
214
215void G4OpticalPhysics::SetScintillationYieldFactor(G4double yieldFactor)
216{
217/// Set the scintillation yield factor
218
219  fYieldFactor = yieldFactor;
220
221  if(fScintillationProcess)
222    fScintillationProcess->SetScintillationYieldFactor(yieldFactor);
223}
224
225void G4OpticalPhysics::SetScintillationExcitationRatio(G4double excitationRatio)
226{
227/// Set the scintillation excitation ratio
228
229  fExcitationRatio = excitationRatio;
230
231  if(fScintillationProcess)
232    fScintillationProcess->SetScintillationExcitationRatio(excitationRatio);
233}
234
235void G4OpticalPhysics::SetMaxNumPhotonsPerStep(G4int maxNumPhotons)
236{
237/// Limit step to the specified maximum number of Cherenkov photons
238
239  fMaxNumPhotons = maxNumPhotons;
240
241  if(fCerenkovProcess)
242    fCerenkovProcess->SetMaxNumPhotonsPerStep(maxNumPhotons);
243}
244
245void G4OpticalPhysics::SetMaxBetaChangePerStep(G4double maxBetaChange)
246{
247/// Limit step to the specified maximum change of beta of the parent particle
248
249  fMaxBetaChange = maxBetaChange;
250
251  if(fCerenkovProcess)
252    fCerenkovProcess->SetMaxBetaChangePerStep(maxBetaChange);
253}
254
255void G4OpticalPhysics::SetOpticalSurfaceModel(G4OpticalSurfaceModel model)
256{
257/// Set optical surface model (glisur or unified)
258
259  fSurfaceModel = model;
260
261  if(fOpBoundaryProcess)
262    fOpBoundaryProcess->SetModel(model); 
263}
264
265void G4OpticalPhysics::SetWLSTimeProfile(G4String profile)
266{
267/// Set the WLS time profile (delta or exponential)
268
269  fProfile = profile;
270
271  if(fOpWLSProcess)
272    fOpWLSProcess->UseTimeProfile(fProfile);
273}
274
275void G4OpticalPhysics::AddScintillationSaturation(G4EmSaturation* saturation)
276{
277/// Adds Birks Saturation to the G4Scintillation Process
278
279  if(fScintillationProcess)
280    fScintillationProcess->AddSaturation(saturation);
281}
282
283void G4OpticalPhysics::SetScintillationByParticleType(G4bool scintillationByParticleType)
284{
285  fScintillationByParticleType = scintillationByParticleType;
286
287  if (fScintillationProcess)
288     fScintillationProcess->SetScintillationByParticleType(scintillationByParticleType);
289}
290
291void G4OpticalPhysics::SetTrackSecondariesFirst(G4bool trackSecondariesFirst)
292{
293  fTrackSecondariesFirst = trackSecondariesFirst;
294
295  if ( fCerenkovProcess )
296     fCerenkovProcess->SetTrackSecondariesFirst(trackSecondariesFirst);
297
298  if ( fScintillationProcess )
299     fScintillationProcess->SetTrackSecondariesFirst(trackSecondariesFirst);
300
301}
302
303//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
Note: See TracBrowser for help on using the repository browser.