Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/electromagnetic/standard/src/G4eCoulombScatteringModel.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/standard/src/G4eCoulombScatteringModel.cc (Version 11.3.0) and /processes/electromagnetic/standard/src/G4eCoulombScatteringModel.cc (Version 7.1)


  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:     G4eCoulombScatteringModel       
 33 //                                                
 34 // Author:        Vladimir Ivanchenko             
 35 //                                                
 36 // Creation date: 22.08.2005                      
 37 //                                                
 38 // Modifications: V.Ivanchenko                    
 39 //                                                
 40 //                                                
 41 //                                                
 42 // Class Description:                             
 43 //                                                
 44 // -------------------------------------------    
 45 //                                                
 46 //....oooOO0OOooo........oooOO0OOooo........oo    
 47 //....oooOO0OOooo........oooOO0OOooo........oo    
 48                                                   
 49 #include "G4eCoulombScatteringModel.hh"           
 50 #include "G4PhysicalConstants.hh"                 
 51 #include "G4SystemOfUnits.hh"                     
 52 #include "Randomize.hh"                           
 53 #include "G4DataVector.hh"                        
 54 #include "G4ElementTable.hh"                      
 55 #include "G4ParticleChangeForGamma.hh"            
 56 #include "G4Proton.hh"                            
 57 #include "G4ParticleTable.hh"                     
 58 #include "G4IonTable.hh"                          
 59 #include "G4ProductionCutsTable.hh"               
 60 #include "G4NucleiProperties.hh"                  
 61 #include "G4Pow.hh"                               
 62 #include "G4NistManager.hh"                       
 63                                                   
 64 //....oooOO0OOooo........oooOO0OOooo........oo    
 65                                                   
 66 using namespace std;                              
 67                                                   
 68 G4eCoulombScatteringModel::G4eCoulombScatterin    
 69   : G4VEmModel("eCoulombScattering"), isCombin    
 70 {                                                 
 71   fNistManager = G4NistManager::Instance();       
 72   theIonTable  = G4ParticleTable::GetParticleT    
 73   theProton    = G4Proton::Proton();              
 74                                                   
 75   wokvi = new G4WentzelOKandVIxSection(isCombi    
 76                                                   
 77   mass = CLHEP::proton_mass_c2;                   
 78 }                                                 
 79                                                   
 80 //....oooOO0OOooo........oooOO0OOooo........oo    
 81                                                   
 82 G4eCoulombScatteringModel::~G4eCoulombScatteri    
 83 {                                                 
 84   delete wokvi;                                   
 85 }                                                 
 86                                                   
 87 //....oooOO0OOooo........oooOO0OOooo........oo    
 88                                                   
 89 void G4eCoulombScatteringModel::Initialise(con    
 90              const G4DataVector& cuts)            
 91 {                                                 
 92   SetupParticle(part);                            
 93   currentCouple = nullptr;                        
 94                                                   
 95   G4double tet = PolarAngleLimit();               
 96                                                   
 97   // defined theta limit between single and mu    
 98   if(isCombined) {                                
 99     if(tet >= CLHEP::pi) { cosThetaMin = -1.0;    
100     else if(tet > 0.0) { cosThetaMin = std::co    
101                                                   
102     // single scattering without multiple         
103   } else if(tet > 0.0) {                          
104     cosThetaMin = std::cos(std::min(tet, CLHEP    
105   }                                               
106                                                   
107   wokvi->Initialise(part, cosThetaMin);           
108   pCuts = &cuts;                                  
109   /*                                              
110   G4cout << "G4eCoulombScatteringModel::Initia    
111      << part->GetParticleName() << " 1-cos(Tet    
112      << " 1-cos(TetMax)= " << 1. - cosThetaMax    
113   G4cout << "cut[0]= " << (*pCuts)[0] << G4end    
114   */                                              
115   if(nullptr == fParticleChange) {                
116     fParticleChange = GetParticleChangeForGamm    
117   }                                               
118   if(IsMaster() && mass < GeV && part->GetPart    
119     InitialiseElementSelectors(part, cuts);       
120   }                                               
121 }                                                 
122                                                   
123 //....oooOO0OOooo........oooOO0OOooo........oo    
124                                                   
125 void G4eCoulombScatteringModel::InitialiseLoca    
126             G4VEmModel* masterModel)              
127 {                                                 
128   SetElementSelectors(masterModel->GetElementS    
129 }                                                 
130                                                   
131 //....oooOO0OOooo........oooOO0OOooo........oo    
132                                                   
133 G4double                                          
134 G4eCoulombScatteringModel::MinPrimaryEnergy(co    
135               const G4ParticleDefinition* part    
136               G4double)                           
137 {                                                 
138   SetupParticle(part);                            
139                                                   
140   // define cut using cuts for proton             
141   G4double cut =                                  
142     std::max(recoilThreshold, (*pCuts)[Current    
143                                                   
144   // find out lightest element                    
145   const G4ElementVector* theElementVector = ma    
146   std::size_t nelm = material->GetNumberOfElem    
147                                                   
148   // select lightest element                      
149   G4int Z = 300;                                  
150   for (std::size_t j=0; j<nelm; ++j) {            
151     Z = std::min(Z,(*theElementVector)[j]->Get    
152   }                                               
153   G4int A = G4lrint(fNistManager->GetAtomicMas    
154   G4double targetMass = G4NucleiProperties::Ge    
155   G4double t = std::max(cut, 0.5*(cut + sqrt(2    
156                                                   
157   return t;                                       
158 }                                                 
159                                                   
160 //....oooOO0OOooo........oooOO0OOooo........oo    
161                                                   
162 G4double G4eCoulombScatteringModel::ComputeCro    
163                 const G4ParticleDefinition* p,    
164     G4double kinEnergy,                           
165     G4double Z, G4double,                         
166     G4double cutEnergy, G4double)                 
167 {                                                 
168   /*                                              
169   G4cout << "### G4eCoulombScatteringModel::Co    
170    << p->GetParticleName()<<" Z= "<<Z<<" e(MeV    
171    << G4endl;                                     
172   */                                              
173   G4double cross = 0.0;                           
174   elecRatio = 0.0;                                
175   if(p != particle) { SetupParticle(p); }         
176                                                   
177   // cross section is set to zero to avoid pro    
178   if(kinEnergy <= 0.0) { return cross; }          
179   DefineMaterial(CurrentCouple());                
180   G4double costmin = wokvi->SetupKinematic(kin    
181                                                   
182   //G4cout << "cosThetaMax= "<<cosThetaMax<<"     
183                                                   
184   if(cosThetaMax < costmin) {                     
185     G4int iz = G4lrint(Z);                        
186     G4double cut = (0.0 < fixedCut) ? fixedCut    
187     costmin = wokvi->SetupTarget(iz, cut);        
188     //G4cout << "SetupTarget: Z= " << iz << "     
189     //     << costmin << G4endl;                  
190     G4double costmax = (1 == iz && particle ==    
191       ? 0.0 : cosThetaMax;                        
192     if(costmin > costmax) {                       
193       cross = wokvi->ComputeNuclearCrossSectio    
194         + wokvi->ComputeElectronCrossSection(c    
195     }                                             
196     /*                                            
197     if(p->GetParticleName() == "e-")              
198     G4cout << "Z= " << Z << " e(MeV)= " << kin    
199      << " cross(b)= " << cross/barn << " 1-cos    
200      << " 1-costmax= " << 1-costmax               
201      << " 1-cosThetaMax= " << 1-cosThetaMax       
202      << "  " << currentMaterial->GetName()        
203      << G4endl;                                   
204     */                                            
205   }                                               
206   //G4cout << "====== cross= " << cross << G4e    
207   return cross;                                   
208 }                                                 
209                                                   
210 //....oooOO0OOooo........oooOO0OOooo........oo    
211                                                   
212 void G4eCoulombScatteringModel::SampleSecondar    
213                 std::vector<G4DynamicParticle*    
214     const G4MaterialCutsCouple* couple,           
215     const G4DynamicParticle* dp,                  
216     G4double cutEnergy,                           
217     G4double)                                     
218 {                                                 
219   G4double kinEnergy = dp->GetKineticEnergy();    
220   SetupParticle(dp->GetDefinition());             
221   DefineMaterial(couple);                         
222   /*                                              
223   G4cout << "G4eCoulombScatteringModel::Sample    
224      << kinEnergy << "  " << particle->GetPart    
225      << " cut= " << cutEnergy<< G4endl;           
226   */                                              
227   // Choose nucleus                               
228   G4double cut = (0.0 < fixedCut) ? fixedCut :    
229                                                   
230   wokvi->SetupKinematic(kinEnergy, currentMate    
231                                                   
232   const G4Element* currentElement = SelectTarg    
233                                        dp->Get    
234   G4int iz = currentElement->GetZasInt();         
235                                                   
236   G4double costmin = wokvi->SetupTarget(iz, cu    
237   G4double costmax = (1 == iz && particle == t    
238     ? 0.0 :  cosThetaMax;                         
239   if(costmin <= costmax) { return; }              
240                                                   
241   G4double cross = wokvi->ComputeNuclearCrossS    
242   G4double ecross = wokvi->ComputeElectronCros    
243   G4double ratio = ecross/(cross + ecross);       
244                                                   
245   G4int ia = SelectIsotopeNumber(currentElemen    
246   G4double targetMass = G4NucleiProperties::Ge    
247   wokvi->SetTargetMass(targetMass);               
248                                                   
249   G4ThreeVector newDirection =                    
250     wokvi->SampleSingleScattering(costmin, cos    
251   G4double cost = newDirection.z();               
252     /*                                            
253       G4cout << "SampleSec: e(MeV)= " << kinEn    
254              << " 1-costmin= " << 1-costmin       
255              << " 1-costmax= " << 1-costmax       
256              << " 1-cost= " << 1-cost             
257              << " ratio= " << ratio               
258              << G4endl;                           
259     */                                            
260   G4ThreeVector direction = dp->GetMomentumDir    
261   newDirection.rotateUz(direction);               
262                                                   
263   fParticleChange->ProposeMomentumDirection(ne    
264                                                   
265   // recoil sampling assuming a small recoil      
266   // and first order correction to primary 4-m    
267   G4double mom2 = wokvi->GetMomentumSquare();     
268   G4double trec = mom2*(1.0 - cost)               
269     /(targetMass + (mass + kinEnergy)*(1.0 - c    
270                                                   
271   // the check likely not needed                  
272   trec = std::min(trec, kinEnergy);               
273   G4double finalT = kinEnergy - trec;             
274   G4double edep = 0.0;                            
275     /*                                            
276     G4cout<<"G4eCoulombScatteringModel: finalT    
277     <<trec << " Z= " << iz << " A= " << ia        
278     << " tcut(keV)= " << (*pCuts)[currentMater    
279     */                                            
280   G4double tcut = recoilThreshold;                
281   if(pCuts) { tcut= std::max(tcut,(*pCuts)[cur    
282                                                   
283   if(trec > tcut) {                               
284     G4ParticleDefinition* ion = theIonTable->G    
285     G4ThreeVector dir = (direction*sqrt(mom2)     
286        newDirection*sqrt(finalT*(2*mass + fina    
287     auto newdp = new G4DynamicParticle(ion, di    
288     fvect->push_back(newdp);                      
289   } else {                                        
290     edep = trec;                                  
291     fParticleChange->ProposeNonIonizingEnergyD    
292   }                                               
293                                                   
294     // finelize primary energy and energy bala    
295     // this threshold may be applied only beca    
296     // e+e- msc model is applied                  
297   if(finalT < 0.0) {                              
298     edep += finalT;                               
299     finalT = 0.0;                                 
300   }                                               
301   edep = std::max(edep, 0.0);                     
302   fParticleChange->SetProposedKineticEnergy(fi    
303   fParticleChange->ProposeLocalEnergyDeposit(e    
304 }                                                 
305                                                   
306 //....oooOO0OOooo........oooOO0OOooo........oo    
307