Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/decay/src/G4Decay.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/decay/src/G4Decay.cc (Version 11.3.0) and /processes/decay/src/G4Decay.cc (Version ReleaseNotes)


** Warning: Cannot open xref database.

  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 // -------------------------------------------    
 30 //      GEANT 4 class implementation file         
 31 //                                                
 32 //      History: first implementation, based o    
 33 //      2nd December 1995, G.Cosmo                
 34 //      7 July 1996 H.Kurashige                   
 35 // -------------------------------------------    
 36 //   remove  BuildPhysicsTable()  28 Nov. 1997    
 37 //   change  DBL_EPSIRON to DBL_MIN 14 Dec. 19    
 38 //   modified for new ParticleChange 12 Mar. 1    
 39 //   modified for "GoodForTrackingFlag" 19 Jun    
 40 //   rename thePhysicsTable to aPhyscisTable 2    
 41 //   modified IsApplicable in order to protect    
 42 //   to resonances    12 Dec. 1998   H.Kurashi    
 43 //   remove G4ParticleMomentum  6 Feb. 99 H.Ku    
 44 //   modified  IsApplicable to activate G4Deca    
 45 //   Add External Decayer         23 Feb. 2001    
 46 //   change LowestBinValue,HighestBinValue and    
 47 //                                                
 48                                                   
 49 #include "G4Decay.hh"                             
 50                                                   
 51 #include "G4PhysicalConstants.hh"                 
 52 #include "G4SystemOfUnits.hh"                     
 53 #include "G4DynamicParticle.hh"                   
 54 #include "G4DecayProducts.hh"                     
 55 #include "G4DecayTable.hh"                        
 56 #include "G4VDecayChannel.hh"                     
 57 #include "G4PhysicsLogVector.hh"                  
 58 #include "G4ParticleChangeForDecay.hh"            
 59 #include "G4VExtDecayer.hh"                       
 60                                                   
 61 // constructor                                    
 62 G4Decay::G4Decay(const G4String& processName)     
 63                                :G4VRestDiscret    
 64         verboseLevel(1),                          
 65                                 HighestValue(2    
 66         fRemainderLifeTime(-1.0),                 
 67                                 pExtDecayer(nu    
 68 {                                                 
 69   // set Process Sub Type                         
 70   SetProcessSubType(static_cast<int>(DECAY));     
 71                                                   
 72 #ifdef G4VERBOSE                                  
 73   if (GetVerboseLevel()>1) {                      
 74     G4cout << "G4Decay  constructor " << "  Na    
 75   }                                               
 76 #endif                                            
 77                                                   
 78   pParticleChange = &fParticleChangeForDecay;     
 79 }                                                 
 80                                                   
 81 G4Decay::~G4Decay()                               
 82 {                                                 
 83   if (pExtDecayer != nullptr) {                   
 84     delete pExtDecayer;                           
 85   }                                               
 86 }                                                 
 87                                                   
 88 G4bool G4Decay::IsApplicable(const G4ParticleD    
 89 {                                                 
 90    // check if the particle is stable?            
 91    if (aParticleType.GetPDGLifeTime() <0.0) {     
 92      return false;                                
 93    } else if (aParticleType.GetPDGMass() <= 0.    
 94      return false;                                
 95    } else {                                       
 96      return true;                                 
 97    }                                              
 98 }                                                 
 99                                                   
100 G4double G4Decay::GetMeanLifeTime(const G4Trac    
101                                   G4ForceCondi    
102 {                                                 
103    // returns the mean free path in GEANT4 int    
104    G4double meanlife;                             
105                                                   
106    // get particle                                
107    const G4DynamicParticle* aParticle = aTrack    
108    const G4ParticleDefinition* aParticleDef =     
109    G4double aLife = aParticleDef->GetPDGLifeTi    
110                                                   
111    // check if the particle is stable?            
112    if (aParticleDef->GetPDGStable()) {            
113     //1000000 times the life time of the unive    
114      meanlife = 1e24 * s;                         
115                                                   
116    } else {                                       
117      meanlife = aLife;                            
118    }                                              
119                                                   
120 #ifdef G4VERBOSE                                  
121    if (GetVerboseLevel()>1) {                     
122      G4cout << "mean life time: "<< meanlife/n    
123    }                                              
124 #endif                                            
125                                                   
126    return  meanlife;                              
127 }                                                 
128                                                   
129 G4double G4Decay::GetMeanFreePath(const G4Trac    
130 {                                                 
131    // get particle                                
132    const G4DynamicParticle* aParticle = aTrack    
133    const G4ParticleDefinition* aParticleDef =     
134    G4double aMass = aParticle->GetMass();         
135    G4double aLife = aParticleDef->GetPDGLifeTi    
136                                                   
137                                                   
138     // returns the mean free path in GEANT4 in    
139    G4double pathlength;                           
140    G4double aCtau = c_light * aLife;              
141                                                   
142    // check if the particle is stable?            
143    if (aParticleDef->GetPDGStable()) {            
144      pathlength = DBL_MAX;                        
145                                                   
146    //check if the particle has very short life    
147    } else if (aCtau < DBL_MIN) {                  
148      pathlength =  DBL_MIN;                       
149                                                   
150    } else {                                       
151     //calculate the mean free path                
152     // by using normalized kinetic energy (= E    
153      G4double   rKineticEnergy = aParticle->Ge    
154      if ( rKineticEnergy > HighestValue) {        
155        // gamma >>  1                             
156        pathlength = ( rKineticEnergy + 1.0)* a    
157      } else if ( rKineticEnergy < DBL_MIN ) {     
158        // too slow particle                       
159 #ifdef G4VERBOSE                                  
160        if (GetVerboseLevel()>1) {                 
161    G4cout << "G4Decay::GetMeanFreePath()   !!p    
162          G4cout << aParticleDef->GetParticleNa    
163    G4cout << "KineticEnergy:" << aParticle->Ge    
164        }                                          
165 #endif                                            
166        pathlength = DBL_MIN;                      
167      } else {                                     
168        // beta <1                                 
169        pathlength = (aParticle->GetTotalMoment    
170      }                                            
171    }                                              
172   return  pathlength;                             
173 }                                                 
174                                                   
175 void G4Decay::BuildPhysicsTable(const G4Partic    
176 {                                                 
177   return;                                         
178 }                                                 
179                                                   
180 G4VParticleChange* G4Decay::DecayIt(const G4Tr    
181 {                                                 
182   // The DecayIt() method returns by pointer a    
183   // Units are expressed in GEANT4 internal un    
184                                                   
185   //   Initialize ParticleChange                  
186   //     all members of G4VParticleChange are     
187   //     corresponding member in G4Track          
188   fParticleChangeForDecay.Initialize(aTrack);     
189                                                   
190   // get particle                                 
191   const G4DynamicParticle* aParticle = aTrack.    
192   const G4ParticleDefinition* aParticleDef = a    
193                                                   
194   // check if  the particle is stable             
195   if (aParticleDef->GetPDGStable()) return &fP    
196                                                   
197                                                   
198   //check if thePreAssignedDecayProducts exist    
199   const G4DecayProducts* o_products = (aPartic    
200   G4bool isPreAssigned = (o_products != nullpt    
201   G4DecayProducts* products = nullptr;            
202                                                   
203   // decay table                                  
204   G4DecayTable   *decaytable = aParticleDef->G    
205                                                   
206   // check if external decayer exists             
207   G4bool isExtDecayer = (decaytable == nullptr    
208                                                   
209   // Error due to NO Decay Table                  
210   if ( (decaytable == nullptr) && !isExtDecaye    
211     if (GetVerboseLevel()>0) {                    
212       G4cout <<  "G4Decay::DoIt  : decay table    
213       G4cout << aParticle->GetDefinition()->Ge    
214     }                                             
215     G4ExceptionDescription ed;                    
216     ed << "For " << aParticle->GetDefinition()    
217        << " decay probability exist but decay     
218        << "- the particle will be killed;\n"      
219        << "    isExtDecayer: " << isExtDecayer    
220        << "; isPreAssigned: " << isPreAssigned    
221     G4Exception( "G4Decay::DecayIt ",             
222                  "DECAY101",JustWarning, ed);     
223                                                   
224     fParticleChangeForDecay.SetNumberOfSeconda    
225     // Kill the parent particle                   
226     fParticleChangeForDecay.ProposeTrackStatus    
227     fParticleChangeForDecay.ProposeLocalEnergy    
228                                                   
229     ClearNumberOfInteractionLengthLeft();         
230     return &fParticleChangeForDecay ;             
231   }                                               
232                                                   
233   if (isPreAssigned) {                            
234     // copy decay products                        
235     products = new G4DecayProducts(*o_products    
236   } else if ( isExtDecayer ) {                    
237     // decay according to external decayer        
238     products = pExtDecayer->ImportDecayProduct    
239   } else {                                        
240     // Decay according to decay table.            
241     // Keep trying to choose a candidate decay    
242     // of the decaying particle is below the s    
243     // candidate daughter particles.              
244     // This is needed because the decay table     
245     // the assumption of nominal PDG masses, b    
246     // a dynamic masses well below its nominal    
247     // some of its decay channels can be below    
248     // Note that, for simplicity, we ignore he    
249     // one or more of the candidate daughter p    
250     // wide resonance. However, if this is the    
251     // accepted, then the masses of the resona    
252     // be sampled by taking into account their    
253     G4VDecayChannel* decaychannel = nullptr;      
254     G4double massParent = aParticle->GetMass()    
255     decaychannel = decaytable->SelectADecayCha    
256     if ( decaychannel == nullptr) {               
257       // decay channel not found                  
258      G4ExceptionDescription ed;                   
259       ed << "Can not determine decay channel f    
260    << aParticleDef->GetParticleName() << G4end    
261    << "  mass of dynamic particle: "              
262    << massParent/GeV << " (GEV)" << G4endl        
263    << "  dacay table has " << decaytable->entr    
264    << " entries" << G4endl;                       
265       G4double checkedmass=massParent;            
266       if (massParent < 0.) {                      
267   checkedmass=aParticleDef->GetPDGMass();         
268   ed << "Using PDG mass ("<<checkedmass/GeV       
269      << "(GeV)) in IsOKWithParentMass" << G4en    
270       }                                           
271       for (G4int ic =0;ic <decaytable->entries    
272   G4VDecayChannel * dc= decaytable->GetDecayCh    
273   ed << ic << ": BR " << dc->GetBR() << ", IsO    
274      << dc->IsOKWithParentMass(checkedmass)       
275      << ", --> ";                                 
276   G4int ndaughters=dc->GetNumberOfDaughters();    
277   for (G4int id=0;id<ndaughters;++id) {           
278     if (id>0) ed << " + ";   // seperator, exc    
279     ed << dc->GetDaughterName(id);                
280   }                                               
281   ed << G4endl;                                   
282       }                                           
283       G4Exception("G4Decay::DoIt", "DECAY003",    
284     } else {                                      
285       // execute DecayIt()                        
286 #ifdef G4VERBOSE                                  
287       G4int temp = decaychannel->GetVerboseLev    
288       if (GetVerboseLevel()>1) {                  
289   G4cout << "G4Decay::DoIt  : selected decay c    
290          << decaychannel <<G4endl;                
291   decaychannel->SetVerboseLevel(GetVerboseLeve    
292       }                                           
293 #endif                                            
294       products = decaychannel->DecayIt(aPartic    
295 #ifdef G4VERBOSE                                  
296       if (GetVerboseLevel()>1) {                  
297   decaychannel->SetVerboseLevel(temp);            
298       }                                           
299 #endif                                            
300 #ifdef G4VERBOSE                                  
301       if (GetVerboseLevel()>2) {                  
302   if (! products->IsChecked() ) products->Dump    
303       }                                           
304 #endif                                            
305     }                                             
306   }                                               
307                                                   
308   // get parent particle information .........    
309   G4double   ParentEnergy  = aParticle->GetTot    
310   G4double   ParentMass    = aParticle->GetMas    
311   if (ParentEnergy < ParentMass) {                
312     G4ExceptionDescription ed;                    
313     ed << "Total Energy is less than its mass     
314        << "\n Particle: " << aParticle->GetDef    
315        << "\n Energy:"    << ParentEnergy/MeV     
316        << "\n Mass:"      << ParentMass/MeV <<    
317     G4Exception( "G4Decay::DecayIt ",             
318                  "DECAY102",JustWarning, ed);     
319     ParentEnergy = ParentMass;                    
320   }                                               
321                                                   
322   G4ThreeVector ParentDirection(aParticle->Get    
323                                                   
324   //boost all decay products to laboratory fra    
325   G4double energyDeposit = 0.0;                   
326   G4double finalGlobalTime = aTrack.GetGlobalT    
327   G4double finalLocalTime = aTrack.GetLocalTim    
328   if (aTrack.GetTrackStatus() == fStopButAlive    
329     // AtRest case                                
330     finalGlobalTime += fRemainderLifeTime;        
331     finalLocalTime += fRemainderLifeTime;         
332     energyDeposit += aParticle->GetKineticEner    
333     if (isPreAssigned) products->Boost( Parent    
334   } else {                                        
335     // PostStep case                              
336     if (!isExtDecayer) products->Boost( Parent    
337   }                                               
338    // set polarization for daughter particles     
339    DaughterPolarization(aTrack, products);        
340                                                   
341                                                   
342   //add products in fParticleChangeForDecay       
343   G4int numberOfSecondaries = products->entrie    
344   fParticleChangeForDecay.SetNumberOfSecondari    
345 #ifdef G4VERBOSE                                  
346   if (GetVerboseLevel()>1) {                      
347     G4cout << "G4Decay::DoIt  : Decay vertex :    
348     G4cout << " Time: " << finalGlobalTime/ns     
349     G4cout << " X:" << (aTrack.GetPosition()).    
350     G4cout << " Y:" << (aTrack.GetPosition()).    
351     G4cout << " Z:" << (aTrack.GetPosition()).    
352     G4cout << G4endl;                             
353     G4cout << "G4Decay::DoIt  : decay products    
354     products->DumpInfo();                         
355   }                                               
356 #endif                                            
357   G4int index;                                    
358   G4ThreeVector currentPosition;                  
359   const G4TouchableHandle thand = aTrack.GetTo    
360   for (index=0; index < numberOfSecondaries; i    
361     // get current position of the track          
362     currentPosition = aTrack.GetPosition();       
363     // create a new track object                  
364     G4Track* secondary = new G4Track( products    
365               finalGlobalTime ,                   
366               currentPosition );                  
367     // switch on good for tracking flag           
368     secondary->SetGoodForTrackingFlag();          
369     secondary->SetTouchableHandle(thand);         
370     // add the secondary track in the List        
371     fParticleChangeForDecay.AddSecondary(secon    
372   }                                               
373   delete products;                                
374                                                   
375   // Kill the parent particle                     
376   fParticleChangeForDecay.ProposeTrackStatus(     
377   fParticleChangeForDecay.ProposeLocalEnergyDe    
378   fParticleChangeForDecay.ProposeLocalTime( fi    
379                                                   
380   // Clear NumberOfInteractionLengthLeft          
381   ClearNumberOfInteractionLengthLeft();           
382                                                   
383   return &fParticleChangeForDecay ;               
384 }                                                 
385                                                   
386 void G4Decay::DaughterPolarization(const G4Tra    
387 {                                                 
388   // empty implementation                         
389 }                                                 
390                                                   
391                                                   
392                                                   
393 void G4Decay::StartTracking(G4Track*)             
394 {                                                 
395   currentInteractionLength = -1.0;                
396   ResetNumberOfInteractionLengthLeft();           
397                                                   
398   fRemainderLifeTime = -1.0;                      
399 }                                                 
400                                                   
401 void G4Decay::EndTracking()                       
402 {                                                 
403   // Clear NumberOfInteractionLengthLeft          
404   ClearNumberOfInteractionLengthLeft();           
405                                                   
406   currentInteractionLength = -1.0;                
407 }                                                 
408                                                   
409                                                   
410 G4double G4Decay::PostStepGetPhysicalInteracti    
411                              const G4Track& tr    
412                              G4double   previo    
413                              G4ForceCondition*    
414                             )                     
415 {                                                 
416    // condition is set to "Not Forced"            
417   *condition = NotForced;                         
418                                                   
419    // pre-assigned Decay time                     
420   G4double pTime = track.GetDynamicParticle()-    
421   G4double aLife = track.GetDynamicParticle()-    
422                                                   
423   if (pTime < 0.) {                               
424     // normal case                                
425     if ( previousStepSize > 0.0){                 
426       // subtract NumberOfInteractionLengthLef    
427       SubtractNumberOfInteractionLengthLeft(pr    
428       if(theNumberOfInteractionLengthLeft<0.){    
429   theNumberOfInteractionLengthLeft=perMillion;    
430       }                                           
431       fRemainderLifeTime = theNumberOfInteract    
432     }                                             
433     // get mean free path                         
434     currentInteractionLength = GetMeanFreePath    
435                                                   
436 #ifdef G4VERBOSE                                  
437     if ((currentInteractionLength <=0.0) || (v    
438       G4cout << "G4Decay::PostStepGetPhysicalI    
439       track.GetDynamicParticle()->DumpInfo();     
440       G4cout << " in Material  " << track.GetM    
441       G4cout << "MeanFreePath = " << currentIn    
442     }                                             
443 #endif                                            
444                                                   
445     G4double value;                               
446     if (currentInteractionLength <DBL_MAX) {      
447       value = theNumberOfInteractionLengthLeft    
448       //fRemainderLifeTime = theNumberOfIntera    
449     } else {                                      
450       value = DBL_MAX;                            
451     }                                             
452                                                   
453     return value;                                 
454                                                   
455   } else {                                        
456     //pre-assigned Decay time case                
457     // reminder proper time                       
458     fRemainderLifeTime = pTime - track.GetProp    
459     if (fRemainderLifeTime <= 0.0) fRemainderL    
460                                                   
461     G4double  rvalue=0.0;                         
462     // use pre-assigned Decay time to determin    
463     if (aLife>0.0) {                              
464       // ordinary particle                        
465       rvalue = (fRemainderLifeTime/aLife)*GetM    
466     } else {                                      
467      // shortlived particle                       
468       rvalue = c_light * fRemainderLifeTime;      
469      // by using normalized kinetic energy (=     
470      G4double   aMass =  track.GetDynamicParti    
471      rvalue *= track.GetDynamicParticle()->Get    
472     }                                             
473     return rvalue;                                
474   }                                               
475 }                                                 
476                                                   
477 G4double G4Decay::AtRestGetPhysicalInteraction    
478                              const G4Track& tr    
479                              G4ForceCondition*    
480                             )                     
481 {                                                 
482      // condition is set to "Not Forced"          
483   *condition = NotForced;                         
484                                                   
485   G4double pTime = track.GetDynamicParticle()-    
486   if (pTime >= 0.) {                              
487     fRemainderLifeTime = pTime - track.GetProp    
488     if (fRemainderLifeTime <= 0.0) fRemainderL    
489   } else {                                        
490     fRemainderLifeTime =                          
491       theNumberOfInteractionLengthLeft * GetMe    
492   }                                               
493   return fRemainderLifeTime;                      
494 }                                                 
495                                                   
496                                                   
497 void G4Decay::SetExtDecayer(G4VExtDecayer* val    
498 {                                                 
499   pExtDecayer = val;                              
500                                                   
501   // set Process Sub Type                         
502   if ( pExtDecayer !=0 ) {                        
503     SetProcessSubType(static_cast<int>(DECAY_E    
504   }                                               
505 }                                                 
506                                                   
507 G4VParticleChange* G4Decay::PostStepDoIt(         
508            const G4Track& aTrack,                 
509            const G4Step&  aStep                   
510           )                                       
511 {                                                 
512   if ( (aTrack.GetTrackStatus() == fStopButAli    
513        (aTrack.GetTrackStatus() == fStopAndKil    
514     fParticleChangeForDecay.Initialize(aTrack)    
515     return &fParticleChangeForDecay;              
516   } else {                                        
517     return DecayIt(aTrack, aStep);                
518   }                                               
519 }                                                 
520                                                   
521 void G4Decay::ProcessDescription(std::ostream&    
522 {                                                 
523   outFile << GetProcessName() << ": Decay of p    
524     << "kinematics of daughters are dertermine    
525           << " or by PreAssignedDecayProducts\    
526 }                                                 
527