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 1.1)


                                                   >>   1 // This code implementation is the intellectual property of
                                                   >>   2 // the GEANT4 collaboration.
  1 //                                                  3 //
  2 // ******************************************* <<   4 // By copying, distributing or modifying the Program (or any work
  3 // * License and Disclaimer                    <<   5 // based on the Program) you indicate your acceptance of this statement,
  4 // *                                           <<   6 // and all its terms.
  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 //                                                  7 //
                                                   >>   8 // $Id: G4Decay.cc,v 1.3.8.1.2.1 1999/12/08 17:34:12 gunter Exp $
                                                   >>   9 // GEANT4 tag $Name: geant4-01-01 $
 27 //                                                 10 //
 28 //                                                 11 // 
 29 // -------------------------------------------     12 // --------------------------------------------------------------
 30 //      GEANT 4 class implementation file          13 //      GEANT 4 class implementation file
 31 //                                                 14 //
                                                   >>  15 //      For information related to this code contact:
                                                   >>  16 //      CERN, CN Division, ASD group
 32 //      History: first implementation, based o     17 //      History: first implementation, based on object model of
 33 //      2nd December 1995, G.Cosmo                 18 //      2nd December 1995, G.Cosmo
 34 //      7 July 1996 H.Kurashige                    19 //      7 July 1996 H.Kurashige
 35 // -------------------------------------------     20 // ------------------------------------------------------------
 36 //   remove  BuildPhysicsTable()  28 Nov. 1997     21 //   remove  BuildPhysicsTable()  28 Nov. 1997  H.Kurashige
 37 //   change  DBL_EPSIRON to DBL_MIN 14 Dec. 19     22 //   change  DBL_EPSIRON to DBL_MIN 14 Dec. 1997  H.Kurashige
 38 //   modified for new ParticleChange 12 Mar. 1     23 //   modified for new ParticleChange 12 Mar. 1998  H.Kurashige
 39 //   modified for "GoodForTrackingFlag" 19 Jun     24 //   modified for "GoodForTrackingFlag" 19 June 1998  H.Kurashige
 40 //   rename thePhysicsTable to aPhyscisTable 2     25 //   rename thePhysicsTable to aPhyscisTable 2 Aug. 1998 H.Kurashige
 41 //   modified IsApplicable in order to protect     26 //   modified IsApplicable in order to protect the decay from registered 
 42 //   to resonances    12 Dec. 1998   H.Kurashi     27 //   to resonances    12 Dec. 1998   H.Kurashige 
 43 //   remove G4ParticleMomentum  6 Feb. 99 H.Ku     28 //   remove G4ParticleMomentum  6 Feb. 99 H.Kurashige
 44 //   modified  IsApplicable to activate G4Deca << 
 45 //   Add External Decayer         23 Feb. 2001 << 
 46 //   change LowestBinValue,HighestBinValue and << 
 47 //                                             << 
 48                                                    29 
 49 #include "G4Decay.hh"                              30 #include "G4Decay.hh"
 50                                                << 
 51 #include "G4PhysicalConstants.hh"              << 
 52 #include "G4SystemOfUnits.hh"                  << 
 53 #include "G4DynamicParticle.hh"                    31 #include "G4DynamicParticle.hh"
 54 #include "G4DecayProducts.hh"                      32 #include "G4DecayProducts.hh"
 55 #include "G4DecayTable.hh"                         33 #include "G4DecayTable.hh"
 56 #include "G4VDecayChannel.hh"                  << 
 57 #include "G4PhysicsLogVector.hh"                   34 #include "G4PhysicsLogVector.hh"
 58 #include "G4ParticleChangeForDecay.hh"             35 #include "G4ParticleChangeForDecay.hh"
 59 #include "G4VExtDecayer.hh"                    << 
 60                                                    36 
 61 // constructor                                     37 // constructor
 62 G4Decay::G4Decay(const G4String& processName)      38 G4Decay::G4Decay(const G4String& processName)
 63                                :G4VRestDiscret     39                                :G4VRestDiscreteProcess(processName, fDecay),
 64         verboseLevel(1),                       <<  40                                 HighestBinValue(10.0),
 65                                 HighestValue(2 <<  41                                 LowestBinValue(1.0e-3),
 66         fRemainderLifeTime(-1.0),              <<  42                                 TotBin(200),
 67                                 pExtDecayer(nu <<  43         verboseLevel(1)
 68 {                                                  44 {
 69   // set Process Sub Type                      << 
 70   SetProcessSubType(static_cast<int>(DECAY));  << 
 71                                                << 
 72 #ifdef G4VERBOSE                                   45 #ifdef G4VERBOSE
 73   if (GetVerboseLevel()>1) {                       46   if (GetVerboseLevel()>1) {
 74     G4cout << "G4Decay  constructor " << "  Na <<  47     G4cerr << "G4Decay  constructor " << "  Name:" << processName << G4endl;
 75   }                                                48   }
 76 #endif                                             49 #endif
 77                                                <<  50   aPhysicsTable = NULL;
 78   pParticleChange = &fParticleChangeForDecay;      51   pParticleChange = &fParticleChangeForDecay;
 79 }                                                  52 }
 80                                                    53 
 81 G4Decay::~G4Decay()                                54 G4Decay::~G4Decay()
 82 {                                                  55 {
 83   if (pExtDecayer != nullptr) {                <<  56   if (aPhysicsTable != NULL) {
 84     delete pExtDecayer;                        <<  57     aPhysicsTable->clearAndDestroy();
                                                   >>  58     delete aPhysicsTable;
 85   }                                                59   }
 86 }                                                  60 }
 87                                                    61 
 88 G4bool G4Decay::IsApplicable(const G4ParticleD     62 G4bool G4Decay::IsApplicable(const G4ParticleDefinition& aParticleType)
 89 {                                                  63 {
                                                   >>  64    // return false if resonances 
                                                   >>  65    if (aParticleType.IsShortLived()) return false;
                                                   >>  66 
 90    // check if the particle is stable?             67    // check if the particle is stable?
 91    if (aParticleType.GetPDGLifeTime() <0.0) {      68    if (aParticleType.GetPDGLifeTime() <0.0) {
 92      return false;                                 69      return false;
 93    } else if (aParticleType.GetPDGMass() <= 0.     70    } else if (aParticleType.GetPDGMass() <= 0.0*MeV) {
 94      return false;                                 71      return false;
 95    } else {                                        72    } else {
 96      return true;                                  73      return true; 
 97    }                                               74    }
 98 }                                                  75 }
 99                                                    76 
100 G4double G4Decay::GetMeanLifeTime(const G4Trac <<  77 G4double G4Decay::GetMeanLifeTime(const G4Track&    aTrack,
101                                   G4ForceCondi     78                                   G4ForceCondition*)
102 {                                                  79 {
                                                   >>  80    // get particle type 
                                                   >>  81    const G4DynamicParticle* aParticle = aTrack.GetDynamicParticle();
                                                   >>  82 
103    // returns the mean free path in GEANT4 int     83    // returns the mean free path in GEANT4 internal units
104    G4double meanlife;                              84    G4double meanlife;
105                                                <<  85    G4ParticleDefinition* aParticleDef = aParticle->GetDefinition();
106    // get particle                             << 
107    const G4DynamicParticle* aParticle = aTrack << 
108    const G4ParticleDefinition* aParticleDef =  << 
109    G4double aLife = aParticleDef->GetPDGLifeTi     86    G4double aLife = aParticleDef->GetPDGLifeTime();
110                                                    87 
                                                   >>  88 #ifdef G4VERBOSE
                                                   >>  89    if (GetVerboseLevel()>1) {
                                                   >>  90      G4cerr << "G4Decay::GetMeanLifeTime() "<< G4endl;
                                                   >>  91      G4cerr << "KineticEnergy:" << aParticle->GetKineticEnergy()/GeV <<"[GeV]";
                                                   >>  92      G4cerr << "Mass:" << aParticle->GetMass()/GeV <<"[GeV]"; 
                                                   >>  93      G4cerr << "Life time: "<< aLife/ns << "[ns]" << G4endl;
                                                   >>  94    }
                                                   >>  95 #endif
                                                   >>  96 
111    // check if the particle is stable?             97    // check if the particle is stable?
112    if (aParticleDef->GetPDGStable()) {             98    if (aParticleDef->GetPDGStable()) {
113     //1000000 times the life time of the unive <<  99      meanlife = DBL_MAX;
114      meanlife = 1e24 * s;                      << 
115                                                   100     
                                                   >> 101    } else if (aLife < 0.0) {
                                                   >> 102      meanlife = DBL_MAX;
                                                   >> 103       
116    } else {                                       104    } else {
117      meanlife = aLife;                            105      meanlife = aLife;
118    }                                              106    }
119                                                   107 
120 #ifdef G4VERBOSE                                  108 #ifdef G4VERBOSE
121    if (GetVerboseLevel()>1) {                     109    if (GetVerboseLevel()>1) {
122      G4cout << "mean life time: "<< meanlife/n << 110      G4cerr << "mean life time: "<< meanlife/ns << "[ns]" << G4endl;
123    }                                              111    }
124 #endif                                            112 #endif
125                                                   113 
126    return  meanlife;                              114    return  meanlife;
127 }                                                 115 }
128                                                   116 
129 G4double G4Decay::GetMeanFreePath(const G4Trac    117 G4double G4Decay::GetMeanFreePath(const G4Track& aTrack,G4double, G4ForceCondition*)
130 {                                                 118 {
                                                   >> 119    // constants 
                                                   >> 120    G4bool isOutRange ;
                                                   >> 121    
131    // get particle                                122    // get particle 
132    const G4DynamicParticle* aParticle = aTrack    123    const G4DynamicParticle* aParticle = aTrack.GetDynamicParticle();
133    const G4ParticleDefinition* aParticleDef =  << 
134    G4double aMass = aParticle->GetMass();      << 
135    G4double aLife = aParticleDef->GetPDGLifeTi << 
136                                                << 
137                                                   124 
138     // returns the mean free path in GEANT4 in << 125    // returns the mean free path in GEANT4 internal units
139    G4double pathlength;                           126    G4double pathlength;
140    G4double aCtau = c_light * aLife;           << 127    G4ParticleDefinition* aParticleDef = aParticle->GetDefinition();
                                                   >> 128    G4double aCtau = c_light * aParticleDef->GetPDGLifeTime();
                                                   >> 129    G4double aMass = aParticle->GetMass();
                                                   >> 130 
                                                   >> 131 #ifdef G4VERBOSE
                                                   >> 132    if (GetVerboseLevel()>1) {
                                                   >> 133      G4cerr << "G4Decay::GetMeanFreePath() "<< G4endl;
                                                   >> 134      G4cerr << "KineticEnergy:" << aParticle->GetKineticEnergy()/GeV <<"[GeV]";
                                                   >> 135      G4cerr << "Mass:" << aMass/GeV <<"[GeV]"; 
                                                   >> 136      G4cerr << "c*Tau:" << aCtau/m <<"[m]" <<G4endl; 
                                                   >> 137    }
                                                   >> 138 #endif
141                                                   139 
142    // check if the particle is stable?            140    // check if the particle is stable?
143    if (aParticleDef->GetPDGStable()) {            141    if (aParticleDef->GetPDGStable()) {
144      pathlength = DBL_MAX;                        142      pathlength = DBL_MAX;
145                                                   143 
                                                   >> 144    } else if (aCtau < 0.0) {
                                                   >> 145      pathlength =  DBL_MAX;
                                                   >> 146       
146    //check if the particle has very short life    147    //check if the particle has very short life time ?
147    } else if (aCtau < DBL_MIN) {                  148    } else if (aCtau < DBL_MIN) { 
148      pathlength =  DBL_MIN;                       149      pathlength =  DBL_MIN;
149                                                   150  
                                                   >> 151    //check if zero mass
                                                   >> 152    } else if (aMass <  DBL_MIN)  {
                                                   >> 153      pathlength =  DBL_MAX;
                                                   >> 154 #ifdef G4VERBOSE
                                                   >> 155      if (GetVerboseLevel()>1) {
                                                   >> 156        G4cerr << " Zero Mass particle " << G4endl;
                                                   >> 157      }
                                                   >> 158 #endif
150    } else {                                       159    } else {
151     //calculate the mean free path                160     //calculate the mean free path 
152     // by using normalized kinetic energy (= E    161     // by using normalized kinetic energy (= Ekin/mass)
153      G4double   rKineticEnergy = aParticle->Ge    162      G4double   rKineticEnergy = aParticle->GetKineticEnergy()/aMass; 
154      if ( rKineticEnergy > HighestValue) {     << 163      if ( rKineticEnergy > HighestBinValue) {
155        // gamma >>  1                          << 164        // beta >> 1
156        pathlength = ( rKineticEnergy + 1.0)* a    165        pathlength = ( rKineticEnergy + 1.0)* aCtau;
                                                   >> 166      } else if ( rKineticEnergy > LowestBinValue) {
                                                   >> 167        // check if aPhysicsTable exists
                                                   >> 168        if (aPhysicsTable == NULL) BuildPhysicsTable(*aParticleDef);
                                                   >> 169        // beta is in the range valid for PhysicsTable 
                                                   >> 170        pathlength = aCtau * 
                                                   >> 171    ((*aPhysicsTable)(0))-> GetValue(rKineticEnergy,isOutRange);
157      } else if ( rKineticEnergy < DBL_MIN ) {     172      } else if ( rKineticEnergy < DBL_MIN ) {
158        // too slow particle                       173        // too slow particle
159 #ifdef G4VERBOSE                                  174 #ifdef G4VERBOSE
160        if (GetVerboseLevel()>1) {                 175        if (GetVerboseLevel()>1) {
161    G4cout << "G4Decay::GetMeanFreePath()   !!p << 176    G4cerr << "G4Decay::GetMeanFreePath()   !!particle stops!!";
162          G4cout << aParticleDef->GetParticleNa << 177          G4cerr << aParticleDef->GetParticleName() << G4endl;
163    G4cout << "KineticEnergy:" << aParticle->Ge << 178    G4cerr << "KineticEnergy:" << aParticle->GetKineticEnergy()/GeV <<"[GeV]";
164        }                                          179        }
165 #endif                                            180 #endif
166        pathlength = DBL_MIN;                      181        pathlength = DBL_MIN;
167      } else {                                     182      } else {
168        // beta <1                              << 183        // beta << 1
169        pathlength = (aParticle->GetTotalMoment    184        pathlength = (aParticle->GetTotalMomentum())/aMass*aCtau ;
170      }                                            185      }
171    }                                              186    }
172   return  pathlength;                          << 187 #ifdef G4VERBOSE
                                                   >> 188    if (GetVerboseLevel()>1) {
                                                   >> 189      G4cerr << "mean free path: "<< pathlength/m << "[m]" << G4endl;
                                                   >> 190    }
                                                   >> 191 #endif
                                                   >> 192    return  pathlength;
173 }                                                 193 }
174                                                   194 
175 void G4Decay::BuildPhysicsTable(const G4Partic    195 void G4Decay::BuildPhysicsTable(const G4ParticleDefinition&)
176 {                                                 196 {
177   return;                                      << 197   // if aPhysicsTableis has already been created, do nothing
                                                   >> 198   if (aPhysicsTable != NULL) return;
                                                   >> 199 
                                                   >> 200   // create  aPhysicsTable
                                                   >> 201   if (GetVerboseLevel()>1) G4cerr <<" G4Decay::BuildPhysicsTable() "<< G4endl;
                                                   >> 202   aPhysicsTable = new G4PhysicsTable(1);
                                                   >> 203  
                                                   >> 204   //create physics vector 
                                                   >> 205   G4PhysicsLogVector* aVector = new G4PhysicsLogVector(
                                                   >> 206                    LowestBinValue,
                                                   >> 207                    HighestBinValue,
                                                   >> 208                    TotBin);
                                                   >> 209 
                                                   >> 210   G4double beta, gammainv;
                                                   >> 211   // fill physics Vector
                                                   >> 212   G4int i;
                                                   >> 213   for ( i = 0 ; i < TotBin ; i++ ) {
                                                   >> 214       gammainv = 1.0/(aVector->GetLowEdgeEnergy(i) + 1.0);
                                                   >> 215       beta  = sqrt((1.0 - gammainv)*(1.0 +gammainv)); 
                                                   >> 216       aVector->PutValue(i, beta/gammainv);
                                                   >> 217   }
                                                   >> 218   aPhysicsTable->insert(aVector);
178 }                                                 219 }
179                                                   220 
180 G4VParticleChange* G4Decay::DecayIt(const G4Tr    221 G4VParticleChange* G4Decay::DecayIt(const G4Track& aTrack, const G4Step& )
181 {                                                 222 {
182   // The DecayIt() method returns by pointer a    223   // The DecayIt() method returns by pointer a particle-change object.
183   // Units are expressed in GEANT4 internal un    224   // Units are expressed in GEANT4 internal units.
184                                                   225 
185   //   Initialize ParticleChange                  226   //   Initialize ParticleChange
186   //     all members of G4VParticleChange are     227   //     all members of G4VParticleChange are set to equal to 
187   //     corresponding member in G4Track          228   //     corresponding member in G4Track
188   fParticleChangeForDecay.Initialize(aTrack);     229   fParticleChangeForDecay.Initialize(aTrack);
189                                                   230 
190   // get particle                                 231   // get particle 
191   const G4DynamicParticle* aParticle = aTrack. << 232   G4DynamicParticle* aParticle = aTrack.GetDynamicParticle();
192   const G4ParticleDefinition* aParticleDef = a << 
193                                                << 
194   // check if  the particle is stable          << 
195   if (aParticleDef->GetPDGStable()) return &fP << 
196                                                << 
197                                                   233 
198   //check if thePreAssignedDecayProducts exist    234   //check if thePreAssignedDecayProducts exists
199   const G4DecayProducts* o_products = (aPartic << 235   G4DecayProducts* products = aParticle->GetPreAssignedDecayProducts();
200   G4bool isPreAssigned = (o_products != nullpt << 236   G4bool isPreAssigned = (products != NULL);   
201   G4DecayProducts* products = nullptr;         << 
202                                                   237 
203   // decay table                               << 238   if (!isPreAssigned) {
204   G4DecayTable   *decaytable = aParticleDef->G << 239     // decay acoording to decay table
                                                   >> 240     G4DecayTable   *decaytable = aParticle->GetDefinition()->GetDecayTable();
205                                                   241  
206   // check if external decayer exists          << 242     if (decaytable == NULL){
207   G4bool isExtDecayer = (decaytable == nullptr << 243 #ifdef G4VERBOSE
208                                                << 244       if (GetVerboseLevel()>0) {
209   // Error due to NO Decay Table               << 245   G4cerr <<  "G4Decay::DoIt  : decay table not defined  for";
210   if ( (decaytable == nullptr) && !isExtDecaye << 246         G4cerr << aParticle->GetDefinition()->GetParticleName()<< G4endl;
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       }                                           247       }
283       G4Exception("G4Decay::DoIt", "DECAY003", << 248 #endif
                                                   >> 249       fParticleChangeForDecay.SetNumberOfSecondaries(0);
                                                   >> 250       // Kill the parent particle
                                                   >> 251       fParticleChangeForDecay.SetStatusChange( fStopAndKill ) ;
                                                   >> 252       fParticleChangeForDecay.SetLocalEnergyDeposit(0.0); 
                                                   >> 253 
                                                   >> 254       ClearNumberOfInteractionLengthLeft();
                                                   >> 255       return &fParticleChangeForDecay ;
284     } else {                                      256     } else {
285       // execute DecayIt()                     << 257       // choose a decay channel
                                                   >> 258       G4VDecayChannel *decaychannel = decaytable->SelectADecayChannel();
                                                   >> 259       if (decaychannel == NULL){
                                                   >> 260   // decay channel not found
286 #ifdef G4VERBOSE                                  261 #ifdef G4VERBOSE
287       G4int temp = decaychannel->GetVerboseLev << 262   if (GetVerboseLevel()>0) {
288       if (GetVerboseLevel()>1) {               << 263     G4cerr <<  "G4Decay::DoIt  : can not determine decay channel " <<G4endl;
289   G4cout << "G4Decay::DoIt  : selected decay c << 264     decaytable ->DumpInfo();
290          << decaychannel <<G4endl;             << 265   }
291   decaychannel->SetVerboseLevel(GetVerboseLeve << 
292       }                                        << 
293 #endif                                            266 #endif
294       products = decaychannel->DecayIt(aPartic << 267       } else {
                                                   >> 268   G4int temp;
                                                   >> 269   // execute DecayIt() 
295 #ifdef G4VERBOSE                                  270 #ifdef G4VERBOSE
296       if (GetVerboseLevel()>1) {               << 271   if (GetVerboseLevel()>1) {
297   decaychannel->SetVerboseLevel(temp);         << 272     G4cerr << "G4Decay::DoIt  : selected decay channel  addr:" << decaychannel <<G4endl;
298       }                                        << 273     temp = decaychannel->GetVerboseLevel();
                                                   >> 274     decaychannel->SetVerboseLevel(GetVerboseLevel());
                                                   >> 275   }
299 #endif                                            276 #endif
                                                   >> 277   products = decaychannel->DecayIt(aParticle->GetMass());
300 #ifdef G4VERBOSE                                  278 #ifdef G4VERBOSE
301       if (GetVerboseLevel()>2) {               << 279         if (GetVerboseLevel()>1) {
302   if (! products->IsChecked() ) products->Dump << 280     decaychannel->SetVerboseLevel(temp);
303       }                                        << 281   }
304 #endif                                            282 #endif
                                                   >> 283 #ifdef G4VERBOSE
                                                   >> 284       // for debug
                                                   >> 285       //if (! products->IsChecked() ) products->DumpInfo();
                                                   >> 286 #endif
                                                   >> 287      } 
305     }                                             288     }
306   }                                               289   }
307                                                   290   
308   // get parent particle information .........    291   // get parent particle information ...................................
309   G4double   ParentEnergy  = aParticle->GetTot    292   G4double   ParentEnergy  = aParticle->GetTotalEnergy();
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    293   G4ThreeVector ParentDirection(aParticle->GetMomentumDirection());
323                                                   294 
324   //boost all decay products to laboratory fra    295   //boost all decay products to laboratory frame
325   G4double energyDeposit = 0.0;                   296   G4double energyDeposit = 0.0;
326   G4double finalGlobalTime = aTrack.GetGlobalT    297   G4double finalGlobalTime = aTrack.GetGlobalTime();
327   G4double finalLocalTime = aTrack.GetLocalTim << 
328   if (aTrack.GetTrackStatus() == fStopButAlive    298   if (aTrack.GetTrackStatus() == fStopButAlive ){
329     // AtRest case                                299     // AtRest case
330     finalGlobalTime += fRemainderLifeTime;        300     finalGlobalTime += fRemainderLifeTime;
331     finalLocalTime += fRemainderLifeTime;      << 
332     energyDeposit += aParticle->GetKineticEner    301     energyDeposit += aParticle->GetKineticEnergy();
333     if (isPreAssigned) products->Boost( Parent << 
334   } else {                                        302   } else {
335     // PostStep case                              303     // PostStep case
336     if (!isExtDecayer) products->Boost( Parent << 304     products->Boost( ParentEnergy, ParentDirection); 
337   }                                               305   }
338    // set polarization for daughter particles  << 
339    DaughterPolarization(aTrack, products);     << 
340                                                << 
341                                                   306 
342   //add products in fParticleChangeForDecay       307   //add products in fParticleChangeForDecay
343   G4int numberOfSecondaries = products->entrie    308   G4int numberOfSecondaries = products->entries();
344   fParticleChangeForDecay.SetNumberOfSecondari    309   fParticleChangeForDecay.SetNumberOfSecondaries(numberOfSecondaries);
345 #ifdef G4VERBOSE                                  310 #ifdef G4VERBOSE
346   if (GetVerboseLevel()>1) {                      311   if (GetVerboseLevel()>1) {
347     G4cout << "G4Decay::DoIt  : Decay vertex : << 312     G4cerr << "G4Decay::DoIt  : Decay vertex :";
348     G4cout << " Time: " << finalGlobalTime/ns  << 313     G4cerr << " Time: " << finalGlobalTime/ns << "[ns]";
349     G4cout << " X:" << (aTrack.GetPosition()). << 314     G4cerr << " X:" << (aTrack.GetPosition()).x() /cm << "[cm]";
350     G4cout << " Y:" << (aTrack.GetPosition()). << 315     G4cerr << " Y:" << (aTrack.GetPosition()).y() /cm << "[cm]";
351     G4cout << " Z:" << (aTrack.GetPosition()). << 316     G4cerr << " Z:" << (aTrack.GetPosition()).z() /cm << "[cm]";
352     G4cout << G4endl;                          << 317     G4cerr << G4endl;
353     G4cout << "G4Decay::DoIt  : decay products << 318     G4cerr << "G4Decay::DoIt  : decay products in Lab. Frame" << G4endl;
354     products->DumpInfo();                         319     products->DumpInfo();
355   }                                               320   }
356 #endif                                            321 #endif
357   G4int index;                                    322   G4int index;
358   G4ThreeVector currentPosition;                  323   G4ThreeVector currentPosition;
359   const G4TouchableHandle thand = aTrack.GetTo << 324   for (index=0; index < numberOfSecondaries; index++) 
360   for (index=0; index < numberOfSecondaries; i << 325   { 
361     // get current position of the track       << 326      // get current position of the track
362     currentPosition = aTrack.GetPosition();    << 327      currentPosition = aTrack.GetPosition();
363     // create a new track object               << 328      // create a new track object
364     G4Track* secondary = new G4Track( products << 329      G4Track* secondary = new G4Track( products->PopProducts(),
365               finalGlobalTime ,                   330               finalGlobalTime ,
366               currentPosition );                  331               currentPosition );
367     // switch on good for tracking flag        << 332      // switch on good for tracking flag 
368     secondary->SetGoodForTrackingFlag();       << 333      secondary->SetGoodForTrackingFlag();
369     secondary->SetTouchableHandle(thand);      << 334      // add the secondary track in the List
370     // add the secondary track in the List     << 335      fParticleChangeForDecay.AddSecondary(secondary);
371     fParticleChangeForDecay.AddSecondary(secon << 
372   }                                               336   }
373   delete products;                             << 337   if (!isPreAssigned) delete products;
374                                                << 338 
375   // Kill the parent particle                     339   // Kill the parent particle
376   fParticleChangeForDecay.ProposeTrackStatus(  << 340   fParticleChangeForDecay.SetStatusChange( fStopAndKill ) ;
377   fParticleChangeForDecay.ProposeLocalEnergyDe << 341   fParticleChangeForDecay.SetLocalEnergyDeposit(energyDeposit); 
378   fParticleChangeForDecay.ProposeLocalTime( fi << 342   fParticleChangeForDecay.SetTimeChange( finalGlobalTime );
379                                                << 343   // reset NumberOfInteractionLengthLeft
380   // Clear NumberOfInteractionLengthLeft       << 
381   ClearNumberOfInteractionLengthLeft();           344   ClearNumberOfInteractionLengthLeft();
382                                                << 345 
383   return &fParticleChangeForDecay ;               346   return &fParticleChangeForDecay ;
384 }                                                 347 } 
385                                                   348 
386 void G4Decay::DaughterPolarization(const G4Tra << 
387 {                                              << 
388   // empty implementation                      << 
389 }                                              << 
390                                                   349 
391                                                   350 
392                                                   351 
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                                                   352 
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                                                   353