Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/electromagnetic/lowenergy/src/G4AtomicDeexcitation.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/lowenergy/src/G4AtomicDeexcitation.cc (Version 11.3.0) and /processes/electromagnetic/lowenergy/src/G4AtomicDeexcitation.cc (Version 2.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 // Authors: Elena Guardincerri (Elena.Guardinc    
 29 //          Alfonso Mantero (Alfonso.Mantero@g    
 30 //                                                
 31 // History:                                       
 32 // -----------                                    
 33 //                                                
 34 //  16 Sept 2001  First committed to cvs          
 35 //  12 Sep  2003  Bug in auger production fixe    
 36 //                                                
 37 // -------------------------------------------    
 38                                                   
 39 #include "G4AtomicDeexcitation.hh"                
 40 #include "Randomize.hh"                           
 41 #include "G4PhysicalConstants.hh"                 
 42 #include "G4SystemOfUnits.hh"                     
 43 #include "G4Gamma.hh"                             
 44 #include "G4Electron.hh"                          
 45 #include "G4AtomicTransitionManager.hh"           
 46 #include "G4FluoTransition.hh"                    
 47                                                   
 48 G4AtomicDeexcitation::G4AtomicDeexcitation():     
 49   minGammaEnergy(100.*eV),                        
 50   minElectronEnergy(100.*eV),                     
 51   fAuger(false)                                   
 52 {                                                 
 53                                                   
 54   G4cout << " ********************************    
 55   G4cout << " *                  W A R N I N G    
 56   G4cout << " ********************************    
 57   G4cout << " *                                   
 58   G4cout << " *  Class G4AtomicDeexcitation is    
 59   G4cout << " * discontinued and is going to b    
 60   G4cout << " *     release please migrate to     
 61   G4cout << " *                                   
 62   G4cout << " ********************************    
 63                                                   
 64   augerVacancyId=0;                               
 65   newShellId=0;                                   
 66 }                                                 
 67                                                   
 68 G4AtomicDeexcitation::~G4AtomicDeexcitation()     
 69 {}                                                
 70                                                   
 71 std::vector<G4DynamicParticle*>* G4AtomicDeexc    
 72 {                                                 
 73                                                   
 74   std::vector<G4DynamicParticle*>* vectorOfPar    
 75   vectorOfParticles = new std::vector<G4Dynami    
 76                                                   
 77   G4DynamicParticle* aParticle = nullptr;         
 78   G4int provShellId = 0;                          
 79   G4int counter = 0;                              
 80                                                   
 81   // The aim of this loop is to generate more     
 82   // from the same ionizing event                 
 83   do                                              
 84     {                                             
 85       if (counter == 0)                           
 86   // First call to GenerateParticles(...):        
 87   // givenShellId is given by the process         
 88   {                                               
 89     provShellId = SelectTypeOfTransition(Z, gi    
 90                                                   
 91     if  ( provShellId >0)                         
 92       {                                           
 93         aParticle = GenerateFluorescence(Z,giv    
 94       }                                           
 95     else if ( provShellId == -1)                  
 96       {                                           
 97         aParticle = GenerateAuger(Z, givenShel    
 98       }                                           
 99     else                                          
100       {                                           
101         G4Exception("G4AtomicDeexcitation::Con    
102       }                                           
103   }                                               
104       else                                        
105   // Following calls to GenerateParticles(...)    
106   // newShellId is given by GenerateFluorescen    
107   {                                               
108     provShellId = SelectTypeOfTransition(Z,new    
109     if  (provShellId >0)                          
110       {                                           
111         aParticle = GenerateFluorescence(Z,new    
112       }                                           
113     else if ( provShellId == -1)                  
114       {                                           
115         aParticle = GenerateAuger(Z, newShellI    
116       }                                           
117     else                                          
118       {                                           
119         G4Exception("G4AtomicDeexcitation::con    
120       }                                           
121   }                                               
122       counter++;                                  
123       if (aParticle != nullptr) {vectorOfParti    
124       else {provShellId = -2;}                    
125     }                                             
126                                                   
127   // Look this in a particular way: only one a    
128   while (provShellId > -2);                       
129                                                   
130   // debug                                        
131   // if (vectorOfParticles->size() > 0) {         
132   //   G4cout << " DEEXCITATION!" << G4endl;      
133   // }                                            
134                                                   
135   return vectorOfParticles;                       
136 }                                                 
137                                                   
138 G4int G4AtomicDeexcitation::SelectTypeOfTransi    
139 {                                                 
140   if (shellId <=0 )                               
141     {G4Exception("G4AtomicDeexcitation::Select    
142                                                   
143   //G4bool fluoTransitionFoundFlag = false;       
144                                                   
145   const G4AtomicTransitionManager*  transition    
146         G4AtomicTransitionManager::Instance();    
147   G4int provShellId = -1;                         
148   G4int shellNum = 0;                             
149   G4int maxNumOfShells = transitionManager->Nu    
150                                                   
151   const G4FluoTransition* refShell = transitio    
152                                                   
153   // This loop gives shellNum the value of the    
154   // in the vector storing the list of the she    
155   // a radiative transition                       
156   if ( shellId <= refShell->FinalShellId())       
157     {                                             
158       while (shellId != transitionManager->Rea    
159   {                                               
160     if(shellNum ==maxNumOfShells-1)               
161       {                                           
162         break;                                    
163       }                                           
164     shellNum++;                                   
165   }                                               
166       G4int transProb = 0; //AM change 29/6/07    
167                                                   
168       G4double partialProb = G4UniformRand();     
169       G4double partSum = 0;                       
170       const G4FluoTransition* aShell = transit    
171       G4int trSize = (G4int)(aShell->Transitio    
172                                                   
173       // Loop over the shells wich can provide    
174       // radiative transition towards shellId:    
175       // in every loop the partial sum of the     
176       // is calculated and compared with a ran    
177       // If the partial sum is greater, the sh    
178       // is chosen as the starting shell for a    
179       // and its identity is returned             
180       // Else, terminateded the loop, -1 is re    
181       while(transProb < trSize){                  
182                                                   
183    partSum += aShell->TransitionProbability(tr    
184                                                   
185    if(partialProb <= partSum)                     
186      {                                            
187        provShellId = aShell->OriginatingShellI    
188        //fluoTransitionFoundFlag = true;          
189                                                   
190        break;                                     
191      }                                            
192    transProb++;                                   
193       }                                           
194                                                   
195       // here provShellId is the right one or     
196       // if -1, the control is passed to the A    
197     }                                             
198   else                                            
199     provShellId = -1;                             
200                                                   
201   return provShellId;                             
202 }                                                 
203                                                   
204 G4DynamicParticle* G4AtomicDeexcitation::Gener    
205                     G4int shellId,                
206                     G4int provShellId )           
207 {                                                 
208   const G4AtomicTransitionManager*  transition    
209   //  G4int provenienceShell = provShellId;       
210                                                   
211   //isotropic angular distribution for the out    
212   G4double newcosTh = 1.-2.*G4UniformRand();      
213   G4double  newsinTh = std::sqrt(1.-newcosTh*n    
214   G4double newPhi = twopi*G4UniformRand();        
215                                                   
216   G4double xDir =  newsinTh*std::sin(newPhi);     
217   G4double yDir = newsinTh*std::cos(newPhi);      
218   G4double zDir = newcosTh;                       
219                                                   
220   G4ThreeVector newGammaDirection(xDir,yDir,zD    
221                                                   
222   G4int shellNum = 0;                             
223   G4int maxNumOfShells = transitionManager->Nu    
224                                                   
225   // find the index of the shell named shellId    
226   while (shellId != transitionManager->           
227    ReachableShell(Z,shellNum)->FinalShellId())    
228     {                                             
229       if(shellNum == maxNumOfShells-1)            
230   {                                               
231     break;                                        
232   }                                               
233       shellNum++;                                 
234     }                                             
235   // number of shell from wich an electron can    
236   G4int transitionSize = (G4int)transitionMana    
237     ReachableShell(Z,shellNum)->OriginatingShe    
238                                                   
239   G4int index = 0;                                
240                                                   
241   // find the index of the shell named provShe    
242   // storing the shells from which shellId can    
243   while (provShellId != transitionManager->       
244    ReachableShell(Z,shellNum)->OriginatingShel    
245     {                                             
246       if(index ==  transitionSize-1)              
247   {                                               
248     break;                                        
249   }                                               
250       index++;                                    
251     }                                             
252   // energy of the gamma leaving provShellId f    
253   G4double transitionEnergy = transitionManage    
254     ReachableShell(Z,shellNum)->TransitionEner    
255                                                   
256   // This is the shell where the new vacancy i    
257   // shell where the electron came from           
258   newShellId = transitionManager->                
259     ReachableShell(Z,shellNum)->OriginatingShe    
260                                                   
261   G4DynamicParticle* newPart = new G4DynamicPa    
262                  newGammaDirection,               
263                  transitionEnergy);               
264   return newPart;                                 
265 }                                                 
266                                                   
267 G4DynamicParticle* G4AtomicDeexcitation::Gener    
268 {                                                 
269   if(!fAuger) return 0;                           
270                                                   
271   const G4AtomicTransitionManager*  transition    
272         G4AtomicTransitionManager::Instance();    
273                                                   
274   if (shellId <=0 )                               
275     {G4Exception("G4AtomicDeexcitation::Genera    
276                                                   
277   // G4int provShellId = -1;                      
278   G4int maxNumOfShells = transitionManager->Nu    
279                                                   
280   const G4AugerTransition* refAugerTransition     
281         transitionManager->ReachableAugerShell    
282                                                   
283                                                   
284   // This loop gives to shellNum the value of     
285   // in the vector storing the list of the vac    
286   // that can originate a NON-radiative transi    
287   G4int shellNum = 0;                             
288                                                   
289   if ( shellId <= refAugerTransition->FinalShe    
290     //"FinalShellId" is final from the point o    
291     // being the Id of the shell in which ther    
292     {                                             
293       G4int pippo = transitionManager->Reachab    
294       if (shellId  != pippo ) {                   
295   do {                                            
296     shellNum++;                                   
297     if(shellNum == maxNumOfShells)                
298       {                                           
299                                                   
300         //G4Exception("G4AtomicDeexcitation: N    
301         return 0;                                 
302       }                                           
303   }                                               
304   while (shellId != (transitionManager->Reacha    
305       }                                           
306                                                   
307       G4int transitionLoopShellIndex = 0;         
308       G4double partSum = 0;                       
309       const G4AugerTransition* anAugerTransiti    
310             transitionManager->ReachableAugerS    
311                                                   
312       G4int transitionSize = (G4int)              
313             (anAugerTransition->TransitionOrig    
314       while (transitionLoopShellIndex < transi    
315                                                   
316         std::vector<G4int>::const_iterator pos    
317                anAugerTransition->TransitionOr    
318                                                   
319         G4int transitionLoopShellId = *(pos+tr    
320         G4int numberOfPossibleAuger = (G4int)     
321               (anAugerTransition->AugerTransit    
322         G4int augerIndex = 0;                     
323                                                   
324   if (augerIndex < numberOfPossibleAuger) {       
325     do                                            
326       {                                           
327         G4double thisProb = anAugerTransition-    
328                     transitionLoopShellId);       
329         partSum += thisProb;                      
330         augerIndex++;                             
331                                                   
332       } while (augerIndex < numberOfPossibleAu    
333     }                                             
334         transitionLoopShellIndex++;               
335       }                                           
336                                                   
337                                                   
338       // Now we have the entire probability of    
339       // located in shellNum (index of shellId    
340       G4double totalVacancyAugerProbability =     
341                                                   
342       //And now we start to select the right a    
343       G4int transitionRandomShellIndex = 0;       
344       G4int transitionRandomShellId = 1;          
345       G4int augerIndex = 0;                       
346       partSum = 0;                                
347       G4double partialProb = G4UniformRand();     
348       // G4int augerOriginatingShellId = 0;       
349                                                   
350       G4int numberOfPossibleAuger = 0;            
351                                                   
352       G4bool foundFlag = false;                   
353                                                   
354       while (transitionRandomShellIndex < tran    
355         std::vector<G4int>::const_iterator pos    
356                anAugerTransition->TransitionOr    
357                                                   
358         transitionRandomShellId = *(pos+transi    
359                                                   
360   augerIndex = 0;                                 
361   numberOfPossibleAuger = (G4int)(anAugerTrans    
362          AugerTransitionProbabilities(transiti    
363                                                   
364         while (augerIndex < numberOfPossibleAu    
365     G4double thisProb =anAugerTransition->Auge    
366                      transitionRandomShellId);    
367                                                   
368           partSum += thisProb;                    
369                                                   
370           if (partSum >= (partialProb*totalVac    
371       foundFlag = true;                           
372       break;                                      
373     }                                             
374           augerIndex++;                           
375         }                                         
376         if (partSum >= (partialProb*totalVacan    
377         transitionRandomShellIndex++;             
378       }                                           
379                                                   
380       // Now we have the index of the shell fr    
381       // and the id of the shell, from which t    
382       // If no Transition has been found, 0 is    
383                                                   
384       if (!foundFlag) {return 0;}                 
385                                                   
386       // Isotropic angular distribution for th    
387       G4double newcosTh = 1.-2.*G4UniformRand(    
388       G4double  newsinTh = std::sqrt(1.-newcos    
389       G4double newPhi = twopi*G4UniformRand();    
390                                                   
391       G4double xDir =  newsinTh*std::sin(newPh    
392       G4double yDir = newsinTh*std::cos(newPhi    
393       G4double zDir = newcosTh;                   
394                                                   
395       G4ThreeVector newElectronDirection(xDir,    
396                                                   
397       // energy of the auger electron emitted     
398                                                   
399       G4double transitionEnergy = anAugerTrans    
400       /*                                          
401   G4cout << "AUger TransitionId " << anAugerTr    
402   G4cout << "augerIndex: " << augerIndex << G4    
403   G4cout << "transitionShellId: " << transitio    
404       */                                          
405                                                   
406       // This is the shell where the new vacan    
407       // shell where the electron came from       
408       newShellId = transitionRandomShellId;       
409                                                   
410       G4DynamicParticle* newPart = new G4Dynam    
411                newElectronDirection,              
412                transitionEnergy);                 
413       return newPart;                             
414     }                                             
415   else                                            
416     {                                             
417       //G4Exception("G4AtomicDeexcitation: no     
418       return 0;                                   
419     }                                             
420 }                                                 
421                                                   
422 void G4AtomicDeexcitation::SetCutForSecondaryP    
423 {                                                 
424   minGammaEnergy = cut;                           
425 }                                                 
426                                                   
427 void G4AtomicDeexcitation::SetCutForAugerElect    
428 {                                                 
429   minElectronEnergy = cut;                        
430 }                                                 
431                                                   
432 void G4AtomicDeexcitation::ActivateAugerElectr    
433 {                                                 
434   fAuger = val;                                   
435 }                                                 
436                                                   
437                                                   
438                                                   
439                                                   
440                                                   
441                                                   
442                                                   
443