ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4MuIonisation.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4MuIonisation.cc
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 // GEANT4 Class file
30 //
31 //
32 // File name: G4MuIonisation
33 //
34 // Author: Laszlo Urban
35 //
36 // Creation date: 30.09.1997
37 //
38 // Modifications:
39 //
40 // 08-04-98 remove 'tracking cut' of the ionizing particle (mma)
41 // 26-10-98 new stuff from R.Kokoulin + cleanup , L.Urban
42 // 10-02-00 modifications , new e.m. structure, L.Urban
43 // 23-03-01 R.Kokoulin's correction is commented out, L.Urban
44 // 29-05-01 V.Ivanchenko minor changes to provide ANSI -wall compilation
45 // 10-08-01 new methods Store/Retrieve PhysicsTable (mma)
46 // 28-08-01 new function ComputeRestrictedMeandEdx() + 'cleanup' (mma)
47 // 17-09-01 migration of Materials to pure STL (mma)
48 // 26-09-01 completion of RetrievePhysicsTable (mma)
49 // 29-10-01 all static functions no more inlined (mma)
50 // 07-11-01 correction(Tmax+xsection computation) L.Urban
51 // 08-11-01 particleMass becomes a local variable (mma)
52 // 10-05-02 V.Ivanchenko update to new design
53 // 04-12-02 V.Ivanchenko the low energy limit for Kokoulin model to 10 GeV
54 // 23-12-02 Change interface in order to move to cut per region (V.Ivanchenko)
55 // 26-12-02 Secondary production moved to derived classes (V.Ivanchenko)
56 // 13-02-03 SubCutoff regime is assigned to a region (V.Ivanchenko)
57 // 23-05-03 Define default integral + BohrFluctuations (V.Ivanchenko)
58 // 03-06-03 Add SetIntegral method to choose fluctuation model (V.Ivanchenko)
59 // 03-06-03 Fix initialisation problem for STD ionisation (V.Ivanchenko)
60 // 04-08-03 Set integral=false to be default (V.Ivanchenko)
61 // 08-08-03 STD substitute standard (V.Ivanchenko)
62 // 12-11-03 G4EnergyLossSTD -> G4EnergyLossProcess (V.Ivanchenko)
63 // 10-02-04 Calculation of radiative corrections using R.Kokoulin model (V.I.)
64 // 27-05-04 Set integral to be a default regime (V.Ivanchenko)
65 // 17-08-04 Utilise mu+ tables for mu- (V.Ivanchenko)
66 // 08-11-04 Migration to new interface of Store/Retrieve tables (V.Ivantchenko)
67 // 08-04-05 Major optimisation of internal interfaces (V.Ivantchenko)
68 // 12-08-05 SetStepLimits(0.2, 0.1*mm) (mma)
69 // 02-09-05 SetStepLimits(0.2, 1*mm) (V.Ivantchenko)
70 // 12-08-05 SetStepLimits(0.2, 0.1*mm) + integral off (V.Ivantchenko)
71 // 10-01-06 SetStepLimits -> SetStepFunction (V.Ivantchenko)
72 //
73 // -------------------------------------------------------------------
74 //
75 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
76 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
77 
78 #include "G4MuIonisation.hh"
79 #include "G4PhysicalConstants.hh"
80 #include "G4SystemOfUnits.hh"
81 #include "G4Electron.hh"
82 #include "G4MuonPlus.hh"
83 #include "G4MuonMinus.hh"
84 #include "G4BraggModel.hh"
85 #include "G4BetheBlochModel.hh"
86 #include "G4MuBetheBlochModel.hh"
88 #include "G4IonFluctuations.hh"
89 #include "G4BohrFluctuations.hh"
90 #include "G4UnitsTable.hh"
91 #include "G4ICRU73QOModel.hh"
92 #include "G4EmParameters.hh"
93 
94 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
95 
96 using namespace std;
97 
99  : G4VEnergyLossProcess(name),
100  theParticle(nullptr),
101  theBaseParticle(nullptr),
102  isInitialised(false)
103 {
104  mass = ratio = 0;
107 }
108 
109 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
110 
112 {
113  return (p.GetPDGCharge() != 0.0 && p.GetPDGMass() > 10.0*MeV);
114 }
115 
116 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
117 
119  const G4Material*,
120  G4double cut)
121 {
122  G4double x = 0.5*cut/electron_mass_c2;
123  G4double gam = x*ratio + std::sqrt((1. + x)*(1. + x*ratio*ratio));
124  return mass*(gam - 1.0);
125 }
126 
127 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
128 
130  const G4ParticleDefinition* bpart)
131 {
132  if(!isInitialised) {
133 
134  theParticle = part;
135  theBaseParticle = bpart;
136 
139 
141  G4double elow = 0.2*MeV;
142  G4double emax = param->MaxKinEnergy();
143  G4double ehigh = std::min(1*GeV, emax);
144 
145  // Bragg peak model
146  if (!EmModel(0)) {
147  if(q > 0.0) { SetEmModel(new G4BraggModel()); }
148  else { SetEmModel(new G4ICRU73QOModel()); }
149  }
150  EmModel(0)->SetLowEnergyLimit(param->MinKinEnergy());
151  EmModel(0)->SetHighEnergyLimit(elow);
152  AddEmModel(1, EmModel(0), new G4IonFluctuations());
153 
154  // high energy fluctuation model
156 
157  // moderate energy model
158  if (!EmModel(1)) { SetEmModel(new G4BetheBlochModel()); }
159  EmModel(1)->SetLowEnergyLimit(elow);
160  EmModel(1)->SetHighEnergyLimit(ehigh);
161  AddEmModel(2, EmModel(1), FluctModel());
162 
163  // high energy model
164  if(ehigh < emax) {
165  if (!EmModel(2)) { SetEmModel(new G4MuBetheBlochModel()); }
166  EmModel(2)->SetLowEnergyLimit(ehigh);
167  EmModel(2)->SetHighEnergyLimit(emax);
168  AddEmModel(3, EmModel(2), FluctModel());
169  }
171  isInitialised = true;
172  }
173 }
174 
175 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
176 
178 {}
179 
180 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
181 
182 void G4MuIonisation::ProcessDescription(std::ostream& out) const
183 {
184  out << " Muon ionisation";
186 }
187 
188 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....