source: trunk/examples/extended/medical/fanoCavity/src/PhysicsList.cc @ 1161

Last change on this file since 1161 was 807, checked in by garnier, 16 years ago

update

File size: 8.2 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// $Id: PhysicsList.cc,v 1.9 2007/10/02 14:42:51 maire Exp $
28// GEANT4 tag $Name:  $
29//
30
31//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
32//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
33
34#include "PhysicsList.hh"
35#include "PhysicsListMessenger.hh"
36#include "DetectorConstruction.hh"
37
38#include "G4ParticleDefinition.hh"
39#include "G4ParticleTypes.hh"
40#include "G4ParticleTable.hh"
41
42#include "G4ProcessManager.hh"
43#include "G4LossTableManager.hh"
44
45//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
46
47PhysicsList::PhysicsList(DetectorConstruction* det)
48: G4VUserPhysicsList(), detector(det)
49{
50  defaultCutValue = 10.*km;
51  singleScattering = false;
52  registerBrem = false;
53  pMessenger = new PhysicsListMessenger(this);
54  SetVerboseLevel(1);
55 
56  G4LossTableManager::Instance(); 
57}
58
59//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
60
61PhysicsList::~PhysicsList()
62{ delete pMessenger; }
63
64//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
65
66void PhysicsList::ConstructParticle()
67{
68  G4Geantino::GeantinoDefinition();
69  G4Gamma::GammaDefinition();
70
71  G4Electron::ElectronDefinition();
72  G4Positron::PositronDefinition();
73
74  G4Proton::ProtonDefinition();
75}
76
77//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
78
79void PhysicsList::ConstructProcess()
80{
81  AddTransportation();
82  ConstructEM();
83  AddStepMax();
84}
85
86//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
87
88#include "G4ComptonScattering.hh"
89#include "MyKleinNishinaCompton.hh"
90#include "G4GammaConversion.hh"
91#include "G4PhotoElectricEffect.hh"
92
93#include "G4MultipleScattering.hh"
94#include "G4CoulombScattering.hh"
95
96#include "G4eIonisation.hh"
97#include "MyMollerBhabhaModel.hh"
98#include "G4eBremsstrahlung.hh"
99#include "G4eplusAnnihilation.hh"
100
101#include "G4hIonisation.hh"
102
103#include "G4EmProcessOptions.hh"
104#include "G4MscStepLimitType.hh"
105
106//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
107
108
109void PhysicsList::ConstructEM()
110{
111  theParticleIterator->reset();
112  while( (*theParticleIterator)() ){
113    G4ParticleDefinition* particle = theParticleIterator->value();
114    G4ProcessManager* pmanager = particle->GetProcessManager();
115    G4String particleName = particle->GetParticleName();
116    G4int iAlong = 0, iPost = 0; 
117     
118    if (particleName == "gamma") {
119   
120      G4ComptonScattering* compton = new G4ComptonScattering();
121      compton->SetModel(comptonModel = new MyKleinNishinaCompton(detector));
122      comptonModel->SetCSFactor(1000.);
123       
124      pmanager->AddDiscreteProcess(compton);               
125      pmanager->AddDiscreteProcess(new G4PhotoElectricEffect);
126      pmanager->AddDiscreteProcess(new G4GammaConversion);
127     
128    } else if (particleName == "e-") {
129
130      if (singleScattering)
131        pmanager->AddProcess(new G4CoulombScattering,  -1, -1,       ++iPost);
132        else   
133        pmanager->AddProcess(new G4MultipleScattering, -1, ++iAlong, ++iPost);
134     
135      G4eIonisation* eIoni = new G4eIonisation();
136      eIoni->SetEmModel(new MyMollerBhabhaModel);             
137      pmanager->AddProcess(eIoni,                      -1, ++iAlong, ++iPost);
138     
139      if (registerBrem)
140        pmanager->AddProcess(new G4eBremsstrahlung,    -1, ++iAlong, ++iPost);     
141       
142    } else if (particleName == "e+") {
143   
144      if (singleScattering)
145        pmanager->AddProcess(new G4CoulombScattering,  -1, -1,       ++iPost);
146        else   
147        pmanager->AddProcess(new G4MultipleScattering, -1, ++iAlong, ++iPost);
148     
149      G4eIonisation* pIoni = new G4eIonisation();
150      pIoni->SetEmModel(new MyMollerBhabhaModel);                   
151      pmanager->AddProcess(pIoni,                      -1, ++iAlong, ++iPost);
152     
153      if (registerBrem) {
154        pmanager->AddProcess(new G4eBremsstrahlung,    -1, ++iAlong, ++iPost);
155        pmanager->AddProcess(new G4eplusAnnihilation,   0, -1,       ++iPost);
156      }
157     
158    } else if (particleName == "proton") {
159   
160      if (singleScattering)
161        pmanager->AddProcess(new G4CoulombScattering,  -1, -1,       ++iPost);
162        else   
163        pmanager->AddProcess(new G4MultipleScattering, -1, ++iAlong, ++iPost);
164       
165      pmanager->AddProcess(new G4hIonisation,          -1, ++iAlong, ++iPost);
166    }
167  }
168 
169  // Em options
170  //
171  G4EmProcessOptions emOptions;
172 
173  //multiple scattering
174  //
175  emOptions.SetMscStepLimitation(fUseDistanceToBoundary);
176  emOptions.SetSkin(2.);
177 
178  //physics tables
179  //
180  emOptions.SetMinEnergy(100*eV);   
181  emOptions.SetMaxEnergy(10*GeV); 
182  emOptions.SetDEDXBinning(800); 
183  emOptions.SetLambdaBinning(800);
184 
185  //energy loss
186  // 
187  emOptions.SetStepFunction(0.2, 10*um);
188  emOptions.SetLinearLossLimit(1.e-6);
189         
190  //build CSDA range
191  //
192  emOptions.SetBuildCSDARange(true);
193  emOptions.SetMaxEnergyForCSDARange(10*GeV); 
194  emOptions.SetDEDXBinningForCSDARange(800);   
195}
196
197//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
198
199#include "StepMax.hh"
200
201void PhysicsList::AddStepMax()
202{
203  // Step limitation seen as a process
204  StepMax* stepMaxProcess = new StepMax();
205
206  theParticleIterator->reset();
207  while ((*theParticleIterator)()){
208      G4ParticleDefinition* particle = theParticleIterator->value();
209      G4ProcessManager* pmanager = particle->GetProcessManager();
210
211      if (stepMaxProcess->IsApplicable(*particle))
212        {
213          pmanager ->AddDiscreteProcess(stepMaxProcess);
214        }
215  }
216}
217
218//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
219
220#include "G4UnitsTable.hh"
221
222void PhysicsList::SetCuts()
223{
224  if (verboseLevel >0){
225    G4cout << "PhysicsList::SetCuts:";
226    G4cout << "CutLength : " << G4BestUnit(defaultCutValue,"Length") << G4endl;
227  }
228     
229  // set cut values for gamma at first and for e- second and next for e+,
230  // because some processes for e+/e- need cut values for gamma
231  SetCutValue(defaultCutValue, "gamma");
232  SetCutValue(defaultCutValue, "e-");
233  SetCutValue(defaultCutValue, "e+");
234}
235
236//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
237
238void PhysicsList::SetComptonCSfactor(G4double factor)
239{
240  if (comptonModel) comptonModel->SetCSFactor(factor);
241}
242
243//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
244
245void PhysicsList::SingleCoulombScattering(G4bool flag)
246{
247  singleScattering = flag;
248}
249
250//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
251
252void PhysicsList::RegisterBrem(G4bool flag)
253{
254  registerBrem = flag;
255}
256
257//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
258
259
260
261
Note: See TracBrowser for help on using the repository browser.