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 10.4.p1)


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