Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/electromagnetic/standard/src/G4PAIModel.cc

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

Diff markup

Differences between /processes/electromagnetic/standard/src/G4PAIModel.cc (Version 11.3.0) and /processes/electromagnetic/standard/src/G4PAIModel.cc (Version 11.0.p4)


  1 //                                                  1 //
  2 // *******************************************      2 // ********************************************************************
  3 // * License and Disclaimer                         3 // * License and Disclaimer                                           *
  4 // *                                                4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of th      5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided      6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License      7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/      8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.           9 // * include a list of copyright holders.                             *
 10 // *                                               10 // *                                                                  *
 11 // * Neither the authors of this software syst     11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing fin     12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warran     13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assum     14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file      15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitatio     16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                               17 // *                                                                  *
 18 // * This  code  implementation is the result      18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboratio     19 // * technical work of the GEANT4 collaboration.                      *
 20 // * By using,  copying,  modifying or  distri     20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  ag     21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publicati     22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Sof     23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // *******************************************     24 // ********************************************************************
 25 //                                                 25 //
 26 //                                                 26 //
 27 // -------------------------------------------     27 // -------------------------------------------------------------------
 28 //                                                 28 //
 29 // GEANT4 Class                                    29 // GEANT4 Class
 30 // File name:     G4PAIModel.cc                    30 // File name:     G4PAIModel.cc
 31 //                                                 31 //
 32 // Author: Vladimir.Grichine@cern.ch on base o     32 // Author: Vladimir.Grichine@cern.ch on base of V.Ivanchenko model interface
 33 //                                                 33 //
 34 // Creation date: 05.10.2003                       34 // Creation date: 05.10.2003
 35 //                                                 35 //
 36 // Modifications:                                  36 // Modifications:
 37 //                                                 37 //
 38 // 17.08.04 V.Grichine, bug fixed for Tkin<=0      38 // 17.08.04 V.Grichine, bug fixed for Tkin<=0 in SampleSecondary
 39 // 16.08.04 V.Grichine, bug fixed in massRatio     39 // 16.08.04 V.Grichine, bug fixed in massRatio for DEDX, CrossSection, 
 40 //          SampleSecondary                        40 //          SampleSecondary
 41 // 08.04.05 Major optimisation of internal int     41 // 08.04.05 Major optimisation of internal interfaces (V.Ivantchenko)
 42 // 26.07.09 Fixed logic to work with several m     42 // 26.07.09 Fixed logic to work with several materials (V.Ivantchenko)
 43 // 21.11.10 V. Grichine verbose flag for proto     43 // 21.11.10 V. Grichine verbose flag for protons and G4PAYySection to 
 44 //          check sandia table                     44 //          check sandia table 
 45 // 12.06.13 V. Grichine Bug fixed in SampleSec     45 // 12.06.13 V. Grichine Bug fixed in SampleSecondaries for scaled Tkin 
 46 //          (fMass -> proton_mass_c2)              46 //          (fMass -> proton_mass_c2)
 47 // 19.08.13 V.Ivanchenko extract data handling     47 // 19.08.13 V.Ivanchenko extract data handling to G4PAIModelData class 
 48 //          added sharing of internal data bet     48 //          added sharing of internal data between threads (MT migration)
 49 //                                                 49 //
 50                                                    50 
 51 #include "G4PAIModel.hh"                           51 #include "G4PAIModel.hh"
 52                                                    52 
 53 #include "G4SystemOfUnits.hh"                      53 #include "G4SystemOfUnits.hh"
 54 #include "G4PhysicalConstants.hh"                  54 #include "G4PhysicalConstants.hh"
 55 #include "G4Region.hh"                             55 #include "G4Region.hh"
 56 #include "G4MaterialCutsCouple.hh"                 56 #include "G4MaterialCutsCouple.hh"
 57 #include "G4MaterialTable.hh"                      57 #include "G4MaterialTable.hh"
 58 #include "G4RegionStore.hh"                        58 #include "G4RegionStore.hh"
 59                                                    59 
 60 #include "Randomize.hh"                            60 #include "Randomize.hh"
 61 #include "G4Electron.hh"                           61 #include "G4Electron.hh"
 62 #include "G4Positron.hh"                           62 #include "G4Positron.hh"
 63 #include "G4Poisson.hh"                            63 #include "G4Poisson.hh"
 64 #include "G4Step.hh"                               64 #include "G4Step.hh"
 65 #include "G4Material.hh"                           65 #include "G4Material.hh"
 66 #include "G4DynamicParticle.hh"                    66 #include "G4DynamicParticle.hh"
 67 #include "G4ParticleDefinition.hh"                 67 #include "G4ParticleDefinition.hh"
 68 #include "G4ParticleChangeForLoss.hh"              68 #include "G4ParticleChangeForLoss.hh"
 69 #include "G4PAIModelData.hh"                       69 #include "G4PAIModelData.hh"
 70 #include "G4DeltaAngle.hh"                         70 #include "G4DeltaAngle.hh"
 71                                                    71 
 72 //////////////////////////////////////////////     72 ////////////////////////////////////////////////////////////////////////
 73                                                    73 
 74 using namespace std;                               74 using namespace std;
 75                                                    75 
 76 G4PAIModel::G4PAIModel(const G4ParticleDefinit     76 G4PAIModel::G4PAIModel(const G4ParticleDefinition* p, const G4String& nam)
 77   : G4VEmModel(nam),G4VEmFluctuationModel(nam)     77   : G4VEmModel(nam),G4VEmFluctuationModel(nam),
 78     fVerbose(0),                                   78     fVerbose(0),
 79     fModelData(nullptr),                           79     fModelData(nullptr),
 80     fParticle(nullptr)                             80     fParticle(nullptr)
 81 {                                                  81 {  
 82   fElectron = G4Electron::Electron();              82   fElectron = G4Electron::Electron();
 83   fPositron = G4Positron::Positron();              83   fPositron = G4Positron::Positron();
 84                                                    84 
 85   fParticleChange = nullptr;                       85   fParticleChange = nullptr;
 86                                                    86 
 87   if(p) { SetParticle(p); }                        87   if(p) { SetParticle(p); }
 88   else  { SetParticle(fElectron); }                88   else  { SetParticle(fElectron); }
 89                                                    89 
 90   // default generator                             90   // default generator
 91   SetAngularDistribution(new G4DeltaAngle());      91   SetAngularDistribution(new G4DeltaAngle());
 92   fLowestTcut = 12.5*CLHEP::eV;                    92   fLowestTcut = 12.5*CLHEP::eV;
 93 }                                                  93 }
 94                                                    94 
 95 //////////////////////////////////////////////     95 ////////////////////////////////////////////////////////////////////////////
 96                                                    96 
 97 G4PAIModel::~G4PAIModel()                          97 G4PAIModel::~G4PAIModel()
 98 {                                                  98 {
 99   if(IsMaster()) { delete fModelData; }            99   if(IsMaster()) { delete fModelData; }
100 }                                                 100 }
101                                                   101 
102 //////////////////////////////////////////////    102 ////////////////////////////////////////////////////////////////////////////
103                                                   103 
104 void G4PAIModel::Initialise(const G4ParticleDe    104 void G4PAIModel::Initialise(const G4ParticleDefinition* p,
105           const G4DataVector& cuts)               105           const G4DataVector& cuts)
106 {                                                 106 {
107   if(fVerbose > 1) {                              107   if(fVerbose > 1) {
108     G4cout<<"G4PAIModel::Initialise for "<<p->    108     G4cout<<"G4PAIModel::Initialise for "<<p->GetParticleName()<<G4endl;
109   }                                               109   }
110   SetParticle(p);                                 110   SetParticle(p);
111   fParticleChange = GetParticleChangeForLoss()    111   fParticleChange = GetParticleChangeForLoss();
112                                                   112 
113   if(IsMaster()) {                                113   if(IsMaster()) { 
114                                                   114 
115     delete fModelData;                            115     delete fModelData;      
116     fMaterialCutsCoupleVector.clear();            116     fMaterialCutsCoupleVector.clear(); 
117     if(fVerbose > 1) {                            117     if(fVerbose > 1) {
118       G4cout << "G4PAIModel instantiates data     118       G4cout << "G4PAIModel instantiates data for  " << p->GetParticleName()
119        << G4endl;                                 119        << G4endl;
120     }                                             120     }  
121     G4double tmin = LowEnergyLimit()*fRatio;      121     G4double tmin = LowEnergyLimit()*fRatio;
122     G4double tmax = HighEnergyLimit()*fRatio;     122     G4double tmax = HighEnergyLimit()*fRatio;
123     fModelData = new G4PAIModelData(tmin, tmax    123     fModelData = new G4PAIModelData(tmin, tmax, fVerbose);
124                                                   124   
125     // Prepare initialization                     125     // Prepare initialization
126     const G4MaterialTable* theMaterialTable =     126     const G4MaterialTable* theMaterialTable = G4Material::GetMaterialTable();
127     std::size_t numOfMat   = G4Material::GetNu << 127     size_t numOfMat   = G4Material::GetNumberOfMaterials();
128     std::size_t numRegions = fPAIRegionVector. << 128     size_t numRegions = fPAIRegionVector.size();
129                                                   129 
130     // protect for unit tests                     130     // protect for unit tests
131     if(0 == numRegions) {                         131     if(0 == numRegions) {
132       G4Exception("G4PAIModel::Initialise()","    132       G4Exception("G4PAIModel::Initialise()","em0106",JustWarning,
133                   "no G4Regions are registered    133                   "no G4Regions are registered for the PAI model - World is used");
134       fPAIRegionVector.push_back(G4RegionStore    134       fPAIRegionVector.push_back(G4RegionStore::GetInstance()
135          ->GetRegion("DefaultRegionForTheWorld    135          ->GetRegion("DefaultRegionForTheWorld", false));
136       numRegions = 1;                             136       numRegions = 1;
137     }                                             137     }
138                                                   138 
139     if(fVerbose > 1) {                            139     if(fVerbose > 1) {
140       G4cout << "G4PAIModel is defined for " <    140       G4cout << "G4PAIModel is defined for " << numRegions << " regions "   
141        << "; number of materials " << numOfMat    141        << "; number of materials " << numOfMat << G4endl;
142     }                                             142     } 
143     for(std::size_t iReg = 0; iReg<numRegions; << 143     for(size_t iReg = 0; iReg<numRegions; ++iReg) {
144       const G4Region* curReg = fPAIRegionVecto    144       const G4Region* curReg = fPAIRegionVector[iReg];
145       G4Region* reg = const_cast<G4Region*>(cu    145       G4Region* reg = const_cast<G4Region*>(curReg);
146                                                   146 
147       for(std::size_t jMat = 0; jMat<numOfMat; << 147       for(size_t jMat = 0; jMat<numOfMat; ++jMat) {
148   G4Material* mat = (*theMaterialTable)[jMat];    148   G4Material* mat = (*theMaterialTable)[jMat];
149   const G4MaterialCutsCouple* cutCouple = reg-    149   const G4MaterialCutsCouple* cutCouple = reg->FindCouple(mat);
150   std::size_t n = fMaterialCutsCoupleVector.si << 150   size_t n = fMaterialCutsCoupleVector.size();
                                                   >> 151   /*
                                                   >> 152   G4cout << "Region: " << reg->GetName() << "  " << reg
                                                   >> 153          << " Couple " << cutCouple 
                                                   >> 154          << " PAI defined for " << n << " couples"
                                                   >> 155          << " jMat= " << jMat << "  " << mat->GetName()
                                                   >> 156          << G4endl;
                                                   >> 157   */
151   if(nullptr != cutCouple) {                      158   if(nullptr != cutCouple) {
152     if(fVerbose > 1) {                            159     if(fVerbose > 1) {
153       G4cout << "Region <" << curReg->GetName(    160       G4cout << "Region <" << curReg->GetName() << ">  mat <" 
154        << mat->GetName() << ">  CoupleIndex= "    161        << mat->GetName() << ">  CoupleIndex= " 
155        << cutCouple->GetIndex()                   162        << cutCouple->GetIndex()
156        << "  " << p->GetParticleName()            163        << "  " << p->GetParticleName()
157        << " cutsize= " << cuts.size() << G4end    164        << " cutsize= " << cuts.size() << G4endl;
158     }                                             165     }
159     // check if this couple is not already ini    166     // check if this couple is not already initialized
160     G4bool isnew = true;                          167     G4bool isnew = true;
161     if(0 < n) {                                   168     if(0 < n) {
162       for(std::size_t i=0; i<n; ++i) {         << 169       for(size_t i=0; i<n; ++i) {
163         G4cout << i << G4endl;                    170         G4cout << i << G4endl;
164         if(cutCouple == fMaterialCutsCoupleVec    171         if(cutCouple == fMaterialCutsCoupleVector[i]) {
165     isnew = false;                                172     isnew = false;
166     break;                                        173     break;
167         }                                         174         }
168       }                                           175       }
169     }                                             176     }
170     // initialise data banks                      177     // initialise data banks
171     // G4cout << "   isNew: " << isnew << "  "    178     // G4cout << "   isNew: " << isnew << "  " << cutCouple << G4endl;
172     if(isnew) {                                   179     if(isnew) { 
173       fMaterialCutsCoupleVector.push_back(cutC    180       fMaterialCutsCoupleVector.push_back(cutCouple); 
174       fModelData->Initialise(cutCouple, this);    181       fModelData->Initialise(cutCouple, this);
175     }                                             182     }
176   }                                               183   }
177       }                                           184       }
178     }                                             185     }
179     InitialiseElementSelectors(p, cuts);          186     InitialiseElementSelectors(p, cuts);
180   }                                               187   }
181 }                                                 188 }
182                                                   189 
183 //////////////////////////////////////////////    190 /////////////////////////////////////////////////////////////////////////
184                                                   191 
185 void G4PAIModel::InitialiseLocal(const G4Parti << 192 void G4PAIModel::InitialiseLocal(const G4ParticleDefinition* p, 
186          G4VEmModel* masterModel)                 193          G4VEmModel* masterModel)
187 {                                                 194 {
                                                   >> 195   SetParticle(p);
188   fModelData = static_cast<G4PAIModel*>(master    196   fModelData = static_cast<G4PAIModel*>(masterModel)->GetPAIModelData();
189   fMaterialCutsCoupleVector =                     197   fMaterialCutsCoupleVector = 
190     static_cast<G4PAIModel*>(masterModel)->Get    198     static_cast<G4PAIModel*>(masterModel)->GetVectorOfCouples();
191   SetElementSelectors(masterModel->GetElementS    199   SetElementSelectors(masterModel->GetElementSelectors());
192 }                                                 200 }
193                                                   201 
194 //////////////////////////////////////////////    202 //////////////////////////////////////////////////////////////////////////////
195                                                   203 
196 G4double G4PAIModel::MinEnergyCut(const G4Part    204 G4double G4PAIModel::MinEnergyCut(const G4ParticleDefinition*,
197           const G4MaterialCutsCouple*)            205           const G4MaterialCutsCouple*)
198 {                                                 206 {
199   return fLowestTcut;                             207   return fLowestTcut;
200 }                                                 208 }
201                                                   209 
202 //////////////////////////////////////////////    210 //////////////////////////////////////////////////////////////////////////////
203                                                   211 
204 G4double G4PAIModel::ComputeDEDXPerVolume(cons    212 G4double G4PAIModel::ComputeDEDXPerVolume(const G4Material*,
205             const G4ParticleDefinition* p,        213             const G4ParticleDefinition* p,
206             G4double kineticEnergy,               214             G4double kineticEnergy,
207             G4double cutEnergy)                   215             G4double cutEnergy)
208 {                                                 216 {  
                                                   >> 217   //G4cout << "===1=== " << CurrentCouple() 
                                                   >> 218   //   << "  idx= " << CurrentCouple()->GetIndex()
                                                   >> 219   //   << "   " <<  fMaterialCutsCoupleVector[0]
                                                   >> 220   //   << G4endl; 
209   G4int coupleIndex = FindCoupleIndex(CurrentC    221   G4int coupleIndex = FindCoupleIndex(CurrentCouple());
                                                   >> 222   //G4cout << "===2=== " << coupleIndex << G4endl;
210   if(0 > coupleIndex) { return 0.0; }             223   if(0 > coupleIndex) { return 0.0; }
211                                                   224 
212   G4double cut = std::min(MaxSecondaryEnergy(p    225   G4double cut = std::min(MaxSecondaryEnergy(p, kineticEnergy), cutEnergy);
                                                   >> 226 
213   G4double scaledTkin = kineticEnergy*fRatio;     227   G4double scaledTkin = kineticEnergy*fRatio;
214   G4double dedx = fChargeSquare*fModelData->DE << 228  
215   return dedx;                                 << 229   return fChargeSquare*fModelData->DEDXPerVolume(coupleIndex, scaledTkin, 
                                                   >> 230              cut);
216 }                                                 231 }
217                                                   232 
218 //////////////////////////////////////////////    233 /////////////////////////////////////////////////////////////////////////
219                                                   234 
220 G4double G4PAIModel::CrossSectionPerVolume( co    235 G4double G4PAIModel::CrossSectionPerVolume( const G4Material*,
221               const G4ParticleDefinition* p,      236               const G4ParticleDefinition* p,
222               G4double kineticEnergy,             237               G4double kineticEnergy,
223               G4double cutEnergy,                 238               G4double cutEnergy,
224               G4double maxEnergy  )               239               G4double maxEnergy  ) 
225 {                                                 240 {
                                                   >> 241   //G4cout << "===3=== " << CurrentCouple() 
                                                   >> 242   //   << "  idx= " << CurrentCouple()->GetIndex()
                                                   >> 243   //   << "   " <<  fMaterialCutsCoupleVector[0]
                                                   >> 244   //   << G4endl; 
226   G4int coupleIndex = FindCoupleIndex(CurrentC    245   G4int coupleIndex = FindCoupleIndex(CurrentCouple());
                                                   >> 246   //G4cout << "===4=== " << coupleIndex << G4endl;
227   if(0 > coupleIndex) { return 0.0; }             247   if(0 > coupleIndex) { return 0.0; }
228                                                   248 
229   G4double tmax = std::min(MaxSecondaryEnergy(    249   G4double tmax = std::min(MaxSecondaryEnergy(p, kineticEnergy), maxEnergy);
230   if(tmax <= cutEnergy) { return 0.0; }           250   if(tmax <= cutEnergy) { return 0.0; }
231                                                   251 
232   G4double scaledTkin = kineticEnergy*fRatio;     252   G4double scaledTkin = kineticEnergy*fRatio;
233   G4double xs = fChargeSquare*fModelData->Cros << 253 
234                                           scal << 254   return fChargeSquare*fModelData->CrossSectionPerVolume(coupleIndex, 
235   return xs;                                   << 255                scaledTkin, 
                                                   >> 256                cutEnergy, 
                                                   >> 257                tmax);
236 }                                                 258 }
237                                                   259 
238 //////////////////////////////////////////////    260 ///////////////////////////////////////////////////////////////////////////
239 //                                                261 //
240 // It is analog of PostStepDoIt in terms of se    262 // It is analog of PostStepDoIt in terms of secondary electron.
241 //                                                263 //
242                                                   264  
243 void G4PAIModel::SampleSecondaries(std::vector    265 void G4PAIModel::SampleSecondaries(std::vector<G4DynamicParticle*>* vdp,
244            const G4MaterialCutsCouple* matCC,     266            const G4MaterialCutsCouple* matCC,
245            const G4DynamicParticle* dp,           267            const G4DynamicParticle* dp,
246            G4double tmin,                         268            G4double tmin,
247            G4double maxEnergy)                    269            G4double maxEnergy)
248 {                                                 270 {
249   G4int coupleIndex = FindCoupleIndex(matCC);     271   G4int coupleIndex = FindCoupleIndex(matCC);
250                                                   272 
251   //G4cout << "G4PAIModel::SampleSecondaries:     273   //G4cout << "G4PAIModel::SampleSecondaries: coupleIndex= "<<coupleIndex<<G4endl;
252   if(0 > coupleIndex) { return; }                 274   if(0 > coupleIndex) { return; }
253                                                   275 
254   SetParticle(dp->GetDefinition());               276   SetParticle(dp->GetDefinition());
255   G4double kineticEnergy = dp->GetKineticEnerg    277   G4double kineticEnergy = dp->GetKineticEnergy();
256                                                   278 
257   G4double tmax = MaxSecondaryEnergy(fParticle    279   G4double tmax = MaxSecondaryEnergy(fParticle, kineticEnergy);
258   if(maxEnergy < tmax) { tmax = maxEnergy; }      280   if(maxEnergy < tmax) { tmax = maxEnergy; }
259   if(tmin >= tmax) { return; }                    281   if(tmin >= tmax) { return; }
260                                                   282 
261   G4ThreeVector direction= dp->GetMomentumDire    283   G4ThreeVector direction= dp->GetMomentumDirection();
262   G4double scaledTkin    = kineticEnergy*fRati    284   G4double scaledTkin    = kineticEnergy*fRatio;
263   G4double totalEnergy   = kineticEnergy + fMa    285   G4double totalEnergy   = kineticEnergy + fMass;
264   G4double totalMomentum = sqrt(kineticEnergy*    286   G4double totalMomentum = sqrt(kineticEnergy*(totalEnergy+fMass));
265                                                   287 
266   G4double deltaTkin =                            288   G4double deltaTkin = 
267     fModelData->SamplePostStepTransfer(coupleI    289     fModelData->SamplePostStepTransfer(coupleIndex, scaledTkin, tmin, tmax);
268                                                   290 
269   //G4cout<<"G4PAIModel::SampleSecondaries; de    291   //G4cout<<"G4PAIModel::SampleSecondaries; deltaKIn = "<<deltaTkin/keV
270   //  <<" keV "<< " Escaled(MeV)= " << scaledT    292   //  <<" keV "<< " Escaled(MeV)= " << scaledTkin << G4endl;
271                                                   293 
272   if( !(deltaTkin <= 0.) && !(deltaTkin > 0))     294   if( !(deltaTkin <= 0.) && !(deltaTkin > 0)) {
273     G4cout<<"G4PAIModel::SampleSecondaries; de    295     G4cout<<"G4PAIModel::SampleSecondaries; deltaKIn = "<<deltaTkin/keV
274     <<" keV "<< " Escaled(MeV)= " << scaledTki    296     <<" keV "<< " Escaled(MeV)= " << scaledTkin << G4endl;
275     return;                                       297     return;
276   }                                               298   }
277   if( deltaTkin <= 0.) { return; }                299   if( deltaTkin <= 0.) { return; }
278                                                   300 
279   if( deltaTkin > tmax) { deltaTkin = tmax; }     301   if( deltaTkin > tmax) { deltaTkin = tmax; }
280                                                   302 
281   const G4Element* anElement = SelectTargetAto    303   const G4Element* anElement = SelectTargetAtom(matCC, fParticle, kineticEnergy,
282                                                   304                                                 dp->GetLogKineticEnergy());
283                                                   305 
284   G4int Z = anElement->GetZasInt();            << 306   G4int Z = G4lrint(anElement->GetZ());
285                                                   307  
286   auto deltaRay = new G4DynamicParticle(fElect << 308   G4DynamicParticle* deltaRay = new G4DynamicParticle(fElectron, 
287       GetAngularDistribution()->SampleDirectio    309       GetAngularDistribution()->SampleDirection(dp, deltaTkin,
288                   Z, matCC->GetMaterial()),       310                   Z, matCC->GetMaterial()),
289                   deltaTkin);                     311                   deltaTkin);
290                                                   312 
291   // primary change                               313   // primary change
292   kineticEnergy -= deltaTkin;                     314   kineticEnergy -= deltaTkin;
293   G4ThreeVector dir = totalMomentum*direction     315   G4ThreeVector dir = totalMomentum*direction - deltaRay->GetMomentum();
294   direction = dir.unit();                         316   direction = dir.unit();
295   fParticleChange->SetProposedKineticEnergy(ki    317   fParticleChange->SetProposedKineticEnergy(kineticEnergy);
296   fParticleChange->SetProposedMomentumDirectio    318   fParticleChange->SetProposedMomentumDirection(direction);
297                                                   319 
298   vdp->push_back(deltaRay);                       320   vdp->push_back(deltaRay);
299 }                                                 321 }
300                                                   322 
301 //////////////////////////////////////////////    323 ///////////////////////////////////////////////////////////////////////
302                                                   324 
303 G4double G4PAIModel::SampleFluctuations(const     325 G4double G4PAIModel::SampleFluctuations(const G4MaterialCutsCouple* matCC,
304                                         const     326                                         const G4DynamicParticle* aParticle,
305                                         const     327                                         const G4double tcut,
306           const G4double,                         328           const G4double, 
307                                         const     329                                         const G4double step,
308           const G4double eloss)                   330           const G4double eloss)
309 {                                                 331 {
310   G4int coupleIndex = FindCoupleIndex(matCC);     332   G4int coupleIndex = FindCoupleIndex(matCC);
311   if(0 > coupleIndex) { return eloss; }           333   if(0 > coupleIndex) { return eloss; }
312                                                   334 
313   SetParticle(aParticle->GetDefinition());        335   SetParticle(aParticle->GetDefinition());
314                                                   336 
315   /*                                              337   /*
316   G4cout << "G4PAIModel::SampleFluctuations st    338   G4cout << "G4PAIModel::SampleFluctuations step(mm)= "<< step/mm
317    << "  Eloss(keV)= " << eloss/keV  << " in "    339    << "  Eloss(keV)= " << eloss/keV  << " in " 
318    << matCC->Getmaterial()->GetName() << G4end    340    << matCC->Getmaterial()->GetName() << G4endl;
319   */                                              341   */
320                                                   342 
321   G4double Tkin       = aParticle->GetKineticE    343   G4double Tkin       = aParticle->GetKineticEnergy();
322   G4double scaledTkin = Tkin*fRatio;              344   G4double scaledTkin = Tkin*fRatio;
323                                                   345 
324   G4double loss = fModelData->SampleAlongStepT    346   G4double loss = fModelData->SampleAlongStepTransfer(coupleIndex, Tkin,
325                   scaledTkin, tcut,               347                   scaledTkin, tcut,
326                   step*fChargeSquare);            348                   step*fChargeSquare);
327                                                   349   
328   // G4cout<<"PAIModel AlongStepLoss = "<<loss    350   // G4cout<<"PAIModel AlongStepLoss = "<<loss/keV<<" keV, on step = "
329   //<<step/mm<<" mm"<<G4endl;                     351   //<<step/mm<<" mm"<<G4endl; 
330   return loss;                                    352   return loss;
331                                                   353 
332 }                                                 354 }
333                                                   355 
334 //////////////////////////////////////////////    356 //////////////////////////////////////////////////////////////////////
335 //                                                357 //
336 // Returns the statistical estimation of the e    358 // Returns the statistical estimation of the energy loss distribution variance
337 //                                                359 //
338                                                   360 
339                                                   361 
340 G4double G4PAIModel::Dispersion( const G4Mater    362 G4double G4PAIModel::Dispersion( const G4Material* material, 
341                                  const G4Dynam    363                                  const G4DynamicParticle* aParticle,
342          const G4double tcut,                     364          const G4double tcut,
343          const G4double tmax,                     365          const G4double tmax,
344                const G4double step )              366                const G4double step )
345 {                                                 367 {
346   G4double particleMass  = aParticle->GetMass(    368   G4double particleMass  = aParticle->GetMass();
347   G4double electronDensity = material->GetElec    369   G4double electronDensity = material->GetElectronDensity();
348   G4double kineticEnergy = aParticle->GetKinet    370   G4double kineticEnergy = aParticle->GetKineticEnergy();
349   G4double q = aParticle->GetCharge()/eplus;      371   G4double q = aParticle->GetCharge()/eplus;
350   G4double etot = kineticEnergy + particleMass    372   G4double etot = kineticEnergy + particleMass;
351   G4double beta2 = kineticEnergy*(kineticEnerg    373   G4double beta2 = kineticEnergy*(kineticEnergy + 2.0*particleMass)/(etot*etot);
352   G4double siga  = (tmax/beta2 - 0.5*tcut) * t    374   G4double siga  = (tmax/beta2 - 0.5*tcut) * twopi_mc2_rcl2 * step
353                  * electronDensity * q * q;       375                  * electronDensity * q * q;
354                                                   376 
355   return siga;                                    377   return siga;
356 }                                                 378 }
357                                                   379 
358 //////////////////////////////////////////////    380 /////////////////////////////////////////////////////////////////////
359                                                   381 
360 G4double G4PAIModel::MaxSecondaryEnergy( const    382 G4double G4PAIModel::MaxSecondaryEnergy( const G4ParticleDefinition* p,
361            G4double kinEnergy)                    383            G4double kinEnergy) 
362 {                                                 384 {
363   SetParticle(p);                                 385   SetParticle(p);
364   G4double tmax = kinEnergy;                      386   G4double tmax = kinEnergy;
365   if(p == fElectron) { tmax *= 0.5; }             387   if(p == fElectron) { tmax *= 0.5; }
366   else if(p != fPositron) {                       388   else if(p != fPositron) { 
367     G4double ratio= electron_mass_c2/fMass;       389     G4double ratio= electron_mass_c2/fMass;
368     G4double gamma= kinEnergy/fMass + 1.0;        390     G4double gamma= kinEnergy/fMass + 1.0;
369     tmax = 2.0*electron_mass_c2*(gamma*gamma -    391     tmax = 2.0*electron_mass_c2*(gamma*gamma - 1.) /
370                   (1. + 2.0*gamma*ratio + rati    392                   (1. + 2.0*gamma*ratio + ratio*ratio);
371   }                                               393   }
372   return tmax;                                    394   return tmax;
373 }                                                 395 }
374                                                   396 
375 //////////////////////////////////////////////    397 ///////////////////////////////////////////////////////////////
376                                                   398 
377 void G4PAIModel::DefineForRegion(const G4Regio    399 void G4PAIModel::DefineForRegion(const G4Region* r) 
378 {                                                 400 {
379   fPAIRegionVector.push_back(r);                  401   fPAIRegionVector.push_back(r);
380 }                                                 402 }
381                                                   403 
382 //////////////////////////////////////////////    404 ///////////////////////////////////////////////////////////////
383                                                   405 
384                                                   406