Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/electromagnetic/utils/src/G4EmSaturation.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /processes/electromagnetic/utils/src/G4EmSaturation.cc (Version 11.3.0) and /processes/electromagnetic/utils/src/G4EmSaturation.cc (Version 3.0)


  1 //                                                  1 
  2 // *******************************************    
  3 // * License and Disclaimer                       
  4 // *                                              
  5 // * The  Geant4 software  is  copyright of th    
  6 // * the Geant4 Collaboration.  It is provided    
  7 // * conditions of the Geant4 Software License    
  8 // * LICENSE and available at  http://cern.ch/    
  9 // * include a list of copyright holders.         
 10 // *                                              
 11 // * Neither the authors of this software syst    
 12 // * institutes,nor the agencies providing fin    
 13 // * work  make  any representation or  warran    
 14 // * regarding  this  software system or assum    
 15 // * use.  Please see the license in the file     
 16 // * for the full disclaimer and the limitatio    
 17 // *                                              
 18 // * This  code  implementation is the result     
 19 // * technical work of the GEANT4 collaboratio    
 20 // * By using,  copying,  modifying or  distri    
 21 // * any work based  on the software)  you  ag    
 22 // * use  in  resulting  scientific  publicati    
 23 // * acceptance of all terms of the Geant4 Sof    
 24 // *******************************************    
 25 //                                                
 26 //                                                
 27 // -------------------------------------------    
 28 //                                                
 29 // GEANT4 Class file                              
 30 //                                                
 31 //                                                
 32 // File name:     G4EmSaturation                  
 33 //                                                
 34 // Author:        Vladimir Ivanchenko             
 35 //                                                
 36 // Creation date: 18.02.2008                      
 37 //                                                
 38 // Modifications:                                 
 39 //                                                
 40 // -------------------------------------------    
 41                                                   
 42 //....oooOO0OOooo........oooOO0OOooo........oo    
 43 //....oooOO0OOooo........oooOO0OOooo........oo    
 44                                                   
 45 #include "G4EmSaturation.hh"                      
 46 #include "G4PhysicalConstants.hh"                 
 47 #include "G4SystemOfUnits.hh"                     
 48 #include "G4LossTableManager.hh"                  
 49 #include "G4NistManager.hh"                       
 50 #include "G4Material.hh"                          
 51 #include "G4MaterialCutsCouple.hh"                
 52 #include "G4ParticleTable.hh"                     
 53                                                   
 54 //....oooOO0OOooo........oooOO0OOooo........oo    
 55                                                   
 56 std::size_t G4EmSaturation::nMaterials = 0;       
 57 std::vector<G4double> G4EmSaturation::massFact    
 58 std::vector<G4double> G4EmSaturation::effCharg    
 59 std::vector<G4double> G4EmSaturation::g4MatDat    
 60 std::vector<G4String> G4EmSaturation::g4MatNam    
 61                                                   
 62 G4EmSaturation::G4EmSaturation(G4int verb)        
 63 {                                                 
 64   verbose = verb;                                 
 65   nWarnings = nG4Birks = 0;                       
 66                                                   
 67   electron = nullptr;                             
 68   proton   = nullptr;                             
 69   nist     = G4NistManager::Instance();           
 70   InitialiseG4Saturation();                       
 71 }                                                 
 72                                                   
 73 //....oooOO0OOooo........oooOO0OOooo........oo    
 74                                                   
 75 G4EmSaturation::~G4EmSaturation() = default;      
 76                                                   
 77 //....oooOO0OOooo........oooOO0OOooo........oo    
 78                                                   
 79 G4double G4EmSaturation::VisibleEnergyDepositi    
 80                                       const G4    
 81                                       const G4    
 82                                       G4double    
 83                                       G4double    
 84                                       G4double    
 85 {                                                 
 86   // no energy deposition                         
 87   if(edep <= 0.0) { return 0.0; }                 
 88                                                   
 89   // zero step length may happens only if step    
 90   // is applied, in that case saturation shoul    
 91   if(length <= 0.0) { return edep; }              
 92                                                   
 93   G4double evis = edep;                           
 94   G4double bfactor = couple->GetMaterial()->Ge    
 95                                                   
 96   if(bfactor > 0.0) {                             
 97                                                   
 98     // atomic relaxations for gamma incident      
 99     if(22 ==  p->GetPDGEncoding()) {              
100       //G4cout << "%% gamma edep= " << edep/ke    
101       evis /= (1.0 + bfactor*edep/                
102         G4LossTableManager::Instance()->GetRan    
103                                                   
104       // energy loss                              
105     } else {                                      
106                                                   
107       // protections                              
108       G4double nloss = std::max(niel, 0.0);       
109       G4double eloss = edep - nloss;              
110                                                   
111       // neutrons and neutral hadrons             
112       if(0.0 == p->GetPDGCharge() || eloss < 0    
113         nloss = edep;                             
114         eloss = 0.0;                              
115       } else {                                    
116                                                   
117   // continues energy loss                        
118   eloss /= (1.0 + bfactor*eloss/length);          
119       }                                           
120       // non-ionizing energy loss                 
121       if(nloss > 0.0) {                           
122         std::size_t idx = couple->GetMaterial(    
123         G4double escaled = nloss*massFactors[i    
124   /*                                              
125         G4cout << "%% p edep= " << nloss/keV <    
126                << escaled << " MeV  in " << co    
127                << "  " << p->GetParticleName()    
128                << G4endl;                         
129   G4cout << proton->GetParticleName() << G4end    
130   */                                              
131         G4double range = G4LossTableManager::I    
132           ->GetRange(proton,escaled,couple)/ef    
133         nloss /= (1.0 + bfactor*nloss/range);     
134       }                                           
135       evis = eloss + nloss;                       
136     }                                             
137   }                                               
138   return evis;                                    
139 }                                                 
140                                                   
141 //....oooOO0OOooo........oooOO0OOooo........oo    
142                                                   
143 void G4EmSaturation::InitialiseG4Saturation()     
144 {                                                 
145   if(nMaterials == G4Material::GetNumberOfMate    
146   nMaterials = G4Material::GetNumberOfMaterial    
147   massFactors.resize(nMaterials, 1.0);            
148   effCharges.resize(nMaterials, 1.0);             
149                                                   
150   if(0 == nG4Birks) {  InitialiseG4materials()    
151                                                   
152   for(std::size_t i=0; i<nMaterials; ++i) {       
153     InitialiseBirksCoefficient((*G4Material::G    
154   }                                               
155   if(verbose > 0) { DumpBirksCoefficients(); }    
156 }                                                 
157                                                   
158 //....oooOO0OOooo........oooOO0OOooo........oo    
159                                                   
160 G4double G4EmSaturation::FindG4BirksCoefficien    
161 {                                                 
162   if(0 == nG4Birks) {  InitialiseG4materials()    
163                                                   
164   G4String name = mat->GetName();                 
165   // is this material in the vector?              
166                                                   
167   for(G4int j=0; j<nG4Birks; ++j) {               
168     if(name == g4MatNames[j]) {                   
169       if(verbose > 0)                             
170         G4cout << "### G4EmSaturation::FindG4B    
171                << name << " is " << g4MatData[    
172                << G4endl;                         
173       return g4MatData[j];                        
174     }                                             
175   }                                               
176   return 0.0;                                     
177 }                                                 
178                                                   
179 //....oooOO0OOooo........oooOO0OOooo........oo    
180                                                   
181 void G4EmSaturation::InitialiseBirksCoefficien    
182 {                                                 
183   // electron and proton should exist in any c    
184   if(nullptr == electron) {                       
185     electron = G4ParticleTable::GetParticleTab    
186     proton = G4ParticleTable::GetParticleTable    
187     if(nullptr == electron) {                     
188       G4Exception("G4EmSaturation::InitialiseB    
189       FatalException, "electron should exist")    
190     }                                             
191   }                                               
192                                                   
193   G4double curBirks = mat->GetIonisation()->Ge    
194                                                   
195   G4String name = mat->GetName();                 
196                                                   
197   // material has no Birks coeffitient defined    
198   // seach in the Geant4 list                     
199   if(curBirks == 0.0) {                           
200     for(G4int j=0; j<nG4Birks; ++j) {             
201       if(name == g4MatNames[j]) {                 
202         mat->GetIonisation()->SetBirksConstant    
203         curBirks = g4MatData[j];                  
204         break;                                    
205       }                                           
206     }                                             
207   }                                               
208                                                   
209   if(curBirks == 0.0) { return; }                 
210                                                   
211   // compute mean mass ratio                      
212   G4double curRatio = 0.0;                        
213   G4double curChargeSq = 0.0;                     
214   G4double norm = 0.0;                            
215   const G4ElementVector* theElementVector = ma    
216   const G4double* theAtomNumDensityVector = ma    
217   std::size_t nelm = mat->GetNumberOfElements(    
218   for (std::size_t i=0; i<nelm; ++i) {            
219     const G4Element* elm = (*theElementVector)    
220     G4int Z = elm->GetZasInt();                   
221     G4double w = theAtomNumDensityVector[i];      
222     curRatio += w/nist->GetAtomicMassAmu(Z);      
223     curChargeSq += (Z*Z)*w;                       
224     norm += w;                                    
225   }                                               
226   if ( norm > 0.0) { norm = 1.0/norm; }           
227   curRatio *= (CLHEP::proton_mass_c2*norm);       
228   curChargeSq *= norm;                            
229                                                   
230   // store results                                
231   std::size_t idx = mat->GetIndex();              
232   massFactors[idx] = curRatio;                    
233   effCharges[idx] = curChargeSq;                  
234 }                                                 
235                                                   
236 //....oooOO0OOooo........oooOO0OOooo........oo    
237                                                   
238 void G4EmSaturation::DumpBirksCoefficients()      
239 {                                                 
240   G4cout << "### Birks coefficients used in ru    
241   const G4MaterialTable* mtable = G4Material::    
242   for(std::size_t i=0; i<nMaterials; ++i) {       
243     const G4Material* mat = (*mtable)[i];         
244     G4double br = mat->GetIonisation()->GetBir    
245     if(br > 0.0) {                                
246       G4cout << "   " << mat->GetName() << "      
247        << br*MeV/mm << " mm/MeV" << "     "       
248        << br*mat->GetDensity()*MeV*cm2/g          
249        << " g/cm^2/MeV  massFactor=  " << mass    
250        << " effCharge= " << effCharges[i] << G    
251     }                                             
252   }                                               
253 }                                                 
254                                                   
255 //....oooOO0OOooo........oooOO0OOooo........oo    
256                                                   
257 void G4EmSaturation::DumpG4BirksCoefficients()    
258 {                                                 
259   if(nG4Birks > 0) {                              
260     G4cout << "### Birks coefficients for Gean    
261     for(G4int i=0; i<nG4Birks; ++i) {             
262       G4cout << "   " << g4MatNames[i] << "       
263              << g4MatData[i]*MeV/mm << " mm/Me    
264     }                                             
265   }                                               
266 }                                                 
267                                                   
268 //....oooOO0OOooo........oooOO0OOooo........oo    
269                                                   
270 void G4EmSaturation::InitialiseG4materials()      
271 {                                                 
272   nG4Birks = 4;                                   
273   g4MatData.reserve(nG4Birks);                    
274                                                   
275   // M.Hirschberg et al., IEEE Trans. Nuc. Sci    
276   // SCSN-38 kB = 0.00842 g/cm^2/MeV; rho = 1.    
277   g4MatNames.push_back("G4_POLYSTYRENE");         
278   g4MatData.push_back(0.07943*mm/MeV);            
279                                                   
280   // C.Fabjan (private communication)             
281   // kB = 0.006 g/cm^2/MeV; rho = 7.13 g/cm^3     
282   g4MatNames.push_back("G4_BGO");                 
283   g4MatData.push_back(0.008415*mm/MeV);           
284                                                   
285   // A.Ribon analysis of publications             
286   // Scallettar et al., Phys. Rev. A25 (1982)     
287   // NIM A 523 (2004) 275.                        
288   // kB = 0.022 g/cm^2/MeV; rho = 1.396 g/cm^3    
289   // ATLAS Efield = 10 kV/cm provide the stron    
290   // kB = 0.1576*mm/MeV                           
291   // A. Kiryunin and P.Strizenec "Geant4 hadro    
292   // working group meeting " kB = 0.041/9.13 g    
293   g4MatNames.push_back("G4_lAr");                 
294   g4MatData.push_back(0.032*mm/MeV);              
295                                                   
296   //G4_BARIUM_FLUORIDE                            
297   //G4_CESIUM_IODIDE                              
298   //G4_GEL_PHOTO_EMULSION                         
299   //G4_PHOTO_EMULSION                             
300   //G4_PLASTIC_SC_VINYLTOLUENE                    
301   //G4_SODIUM_IODIDE                              
302   //G4_STILBENE                                   
303   //G4_lAr                                        
304                                                   
305   //G4_PbWO4 - CMS value                          
306   g4MatNames.push_back("G4_PbWO4");               
307   g4MatData.push_back(0.0333333*mm/MeV);          
308                                                   
309   //G4_Lucite                                     
310                                                   
311 }                                                 
312                                                   
313 //....oooOO0OOooo........oooOO0OOooo........oo    
314