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.1.p2)


  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 90583 2015-06-04 11:16:41Z 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(0),
 80     fParticle(nullptr)                         <<  81     fParticle(0)
 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 = 0;
 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 }                                                  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 > 0) {
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 > 0) {
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 > 0) {
140       G4cout << "G4PAIModel is defined for " <    140       G4cout << "G4PAIModel is defined for " << numRegions << " regions "   
141        << "; number of materials " << numOfMat << 141        << G4endl;
                                                   >> 142       G4cout << "           total number of materials " << numOfMat << G4endl;
142     }                                             143     } 
143     for(std::size_t iReg = 0; iReg<numRegions; << 144     for(size_t iReg = 0; iReg<numRegions; ++iReg) {
144       const G4Region* curReg = fPAIRegionVecto    145       const G4Region* curReg = fPAIRegionVector[iReg];
145       G4Region* reg = const_cast<G4Region*>(cu    146       G4Region* reg = const_cast<G4Region*>(curReg);
146                                                   147 
147       for(std::size_t jMat = 0; jMat<numOfMat; << 148       for(size_t jMat = 0; jMat<numOfMat; ++jMat) {
148   G4Material* mat = (*theMaterialTable)[jMat];    149   G4Material* mat = (*theMaterialTable)[jMat];
149   const G4MaterialCutsCouple* cutCouple = reg-    150   const G4MaterialCutsCouple* cutCouple = reg->FindCouple(mat);
150   std::size_t n = fMaterialCutsCoupleVector.si << 151   size_t n = fMaterialCutsCoupleVector.size();
151   if(nullptr != cutCouple) {                   << 152   /*
152     if(fVerbose > 1) {                         << 153   G4cout << "Region: " << reg->GetName() << "  " << reg
                                                   >> 154          << " Couple " << cutCouple 
                                                   >> 155          << " PAI defined for " << n << " couples"
                                                   >> 156          << " jMat= " << jMat << "  " << mat->GetName()
                                                   >> 157          << G4endl;
                                                   >> 158   */
                                                   >> 159   if(cutCouple) {
                                                   >> 160     if(fVerbose > 0) {
153       G4cout << "Region <" << curReg->GetName(    161       G4cout << "Region <" << curReg->GetName() << ">  mat <" 
154        << mat->GetName() << ">  CoupleIndex= "    162        << mat->GetName() << ">  CoupleIndex= " 
155        << cutCouple->GetIndex()                   163        << cutCouple->GetIndex()
156        << "  " << p->GetParticleName()            164        << "  " << p->GetParticleName()
157        << " cutsize= " << cuts.size() << G4end    165        << " cutsize= " << cuts.size() << G4endl;
158     }                                             166     }
159     // check if this couple is not already ini    167     // check if this couple is not already initialized
160     G4bool isnew = true;                          168     G4bool isnew = true;
161     if(0 < n) {                                   169     if(0 < n) {
162       for(std::size_t i=0; i<n; ++i) {         << 170       for(size_t i=0; i<n; ++i) {
163         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 << 
197           const G4MaterialCutsCouple*)         << 
198 {                                              << 
199   return fLowestTcut;                          << 
200 }                                              << 
201                                                << 
202 ////////////////////////////////////////////// << 
203                                                << 
204 G4double G4PAIModel::ComputeDEDXPerVolume(cons    204 G4double G4PAIModel::ComputeDEDXPerVolume(const G4Material*,
205             const G4ParticleDefinition* p,        205             const G4ParticleDefinition* p,
206             G4double kineticEnergy,               206             G4double kineticEnergy,
207             G4double cutEnergy)                   207             G4double cutEnergy)
208 {                                                 208 {  
                                                   >> 209   //G4cout << "===1=== " << CurrentCouple() 
                                                   >> 210   //   << "  idx= " << CurrentCouple()->GetIndex()
                                                   >> 211   //   << "   " <<  fMaterialCutsCoupleVector[0]
                                                   >> 212   //   << G4endl; 
209   G4int coupleIndex = FindCoupleIndex(CurrentC    213   G4int coupleIndex = FindCoupleIndex(CurrentCouple());
                                                   >> 214   //G4cout << "===2=== " << coupleIndex << G4endl;
210   if(0 > coupleIndex) { return 0.0; }             215   if(0 > coupleIndex) { return 0.0; }
211                                                   216 
212   G4double cut = std::min(MaxSecondaryEnergy(p    217   G4double cut = std::min(MaxSecondaryEnergy(p, kineticEnergy), cutEnergy);
                                                   >> 218 
213   G4double scaledTkin = kineticEnergy*fRatio;     219   G4double scaledTkin = kineticEnergy*fRatio;
214   G4double dedx = fChargeSquare*fModelData->DE << 220  
215   return dedx;                                 << 221   return fChargeSquare*fModelData->DEDXPerVolume(coupleIndex, scaledTkin, 
                                                   >> 222              cut);
216 }                                                 223 }
217                                                   224 
218 //////////////////////////////////////////////    225 /////////////////////////////////////////////////////////////////////////
219                                                   226 
220 G4double G4PAIModel::CrossSectionPerVolume( co    227 G4double G4PAIModel::CrossSectionPerVolume( const G4Material*,
221               const G4ParticleDefinition* p,      228               const G4ParticleDefinition* p,
222               G4double kineticEnergy,             229               G4double kineticEnergy,
223               G4double cutEnergy,                 230               G4double cutEnergy,
224               G4double maxEnergy  )               231               G4double maxEnergy  ) 
225 {                                                 232 {
                                                   >> 233   //G4cout << "===3=== " << CurrentCouple() 
                                                   >> 234   //   << "  idx= " << CurrentCouple()->GetIndex()
                                                   >> 235   //   << "   " <<  fMaterialCutsCoupleVector[0]
                                                   >> 236   //   << G4endl; 
226   G4int coupleIndex = FindCoupleIndex(CurrentC    237   G4int coupleIndex = FindCoupleIndex(CurrentCouple());
                                                   >> 238   //G4cout << "===4=== " << coupleIndex << G4endl;
227   if(0 > coupleIndex) { return 0.0; }             239   if(0 > coupleIndex) { return 0.0; }
228                                                   240 
229   G4double tmax = std::min(MaxSecondaryEnergy(    241   G4double tmax = std::min(MaxSecondaryEnergy(p, kineticEnergy), maxEnergy);
230   if(tmax <= cutEnergy) { return 0.0; }           242   if(tmax <= cutEnergy) { return 0.0; }
231                                                   243 
232   G4double scaledTkin = kineticEnergy*fRatio;     244   G4double scaledTkin = kineticEnergy*fRatio;
233   G4double xs = fChargeSquare*fModelData->Cros << 245 
234                                           scal << 246   return fChargeSquare*fModelData->CrossSectionPerVolume(coupleIndex, 
235   return xs;                                   << 247                scaledTkin, 
                                                   >> 248                cutEnergy, 
                                                   >> 249                tmax);
236 }                                                 250 }
237                                                   251 
238 //////////////////////////////////////////////    252 ///////////////////////////////////////////////////////////////////////////
239 //                                                253 //
240 // It is analog of PostStepDoIt in terms of se    254 // It is analog of PostStepDoIt in terms of secondary electron.
241 //                                                255 //
242                                                   256  
243 void G4PAIModel::SampleSecondaries(std::vector    257 void G4PAIModel::SampleSecondaries(std::vector<G4DynamicParticle*>* vdp,
244            const G4MaterialCutsCouple* matCC,     258            const G4MaterialCutsCouple* matCC,
245            const G4DynamicParticle* dp,           259            const G4DynamicParticle* dp,
246            G4double tmin,                         260            G4double tmin,
247            G4double maxEnergy)                    261            G4double maxEnergy)
248 {                                                 262 {
249   G4int coupleIndex = FindCoupleIndex(matCC);     263   G4int coupleIndex = FindCoupleIndex(matCC);
250                                                   264 
251   //G4cout << "G4PAIModel::SampleSecondaries:     265   //G4cout << "G4PAIModel::SampleSecondaries: coupleIndex= "<<coupleIndex<<G4endl;
252   if(0 > coupleIndex) { return; }                 266   if(0 > coupleIndex) { return; }
253                                                   267 
254   SetParticle(dp->GetDefinition());               268   SetParticle(dp->GetDefinition());
255   G4double kineticEnergy = dp->GetKineticEnerg    269   G4double kineticEnergy = dp->GetKineticEnergy();
256                                                   270 
257   G4double tmax = MaxSecondaryEnergy(fParticle    271   G4double tmax = MaxSecondaryEnergy(fParticle, kineticEnergy);
258   if(maxEnergy < tmax) { tmax = maxEnergy; }      272   if(maxEnergy < tmax) { tmax = maxEnergy; }
259   if(tmin >= tmax) { return; }                    273   if(tmin >= tmax) { return; }
260                                                   274 
261   G4ThreeVector direction= dp->GetMomentumDire    275   G4ThreeVector direction= dp->GetMomentumDirection();
262   G4double scaledTkin    = kineticEnergy*fRati    276   G4double scaledTkin    = kineticEnergy*fRatio;
263   G4double totalEnergy   = kineticEnergy + fMa    277   G4double totalEnergy   = kineticEnergy + fMass;
264   G4double totalMomentum = sqrt(kineticEnergy*    278   G4double totalMomentum = sqrt(kineticEnergy*(totalEnergy+fMass));
265                                                   279 
266   G4double deltaTkin =                            280   G4double deltaTkin = 
267     fModelData->SamplePostStepTransfer(coupleI    281     fModelData->SamplePostStepTransfer(coupleIndex, scaledTkin, tmin, tmax);
268                                                   282 
269   //G4cout<<"G4PAIModel::SampleSecondaries; de    283   //G4cout<<"G4PAIModel::SampleSecondaries; deltaKIn = "<<deltaTkin/keV
270   //  <<" keV "<< " Escaled(MeV)= " << scaledT    284   //  <<" keV "<< " Escaled(MeV)= " << scaledTkin << G4endl;
271                                                   285 
272   if( !(deltaTkin <= 0.) && !(deltaTkin > 0))     286   if( !(deltaTkin <= 0.) && !(deltaTkin > 0)) {
273     G4cout<<"G4PAIModel::SampleSecondaries; de    287     G4cout<<"G4PAIModel::SampleSecondaries; deltaKIn = "<<deltaTkin/keV
274     <<" keV "<< " Escaled(MeV)= " << scaledTki    288     <<" keV "<< " Escaled(MeV)= " << scaledTkin << G4endl;
275     return;                                       289     return;
276   }                                               290   }
277   if( deltaTkin <= 0.) { return; }                291   if( deltaTkin <= 0.) { return; }
278                                                   292 
279   if( deltaTkin > tmax) { deltaTkin = tmax; }     293   if( deltaTkin > tmax) { deltaTkin = tmax; }
280                                                   294 
281   const G4Element* anElement = SelectTargetAto << 295   const G4Element* anElement = SelectRandomAtom(matCC,fParticle,kineticEnergy);
282                                                << 296   G4int Z = G4lrint(anElement->GetZ());
283                                                << 
284   G4int Z = anElement->GetZasInt();            << 
285                                                   297  
286   auto deltaRay = new G4DynamicParticle(fElect << 298   G4DynamicParticle* deltaRay = new G4DynamicParticle(fElectron, 
287       GetAngularDistribution()->SampleDirectio    299       GetAngularDistribution()->SampleDirection(dp, deltaTkin,
288                   Z, matCC->GetMaterial()),       300                   Z, matCC->GetMaterial()),
289                   deltaTkin);                     301                   deltaTkin);
290                                                   302 
291   // primary change                               303   // primary change
292   kineticEnergy -= deltaTkin;                     304   kineticEnergy -= deltaTkin;
293   G4ThreeVector dir = totalMomentum*direction     305   G4ThreeVector dir = totalMomentum*direction - deltaRay->GetMomentum();
294   direction = dir.unit();                         306   direction = dir.unit();
295   fParticleChange->SetProposedKineticEnergy(ki    307   fParticleChange->SetProposedKineticEnergy(kineticEnergy);
296   fParticleChange->SetProposedMomentumDirectio    308   fParticleChange->SetProposedMomentumDirection(direction);
297                                                   309 
298   vdp->push_back(deltaRay);                       310   vdp->push_back(deltaRay);
299 }                                                 311 }
300                                                   312 
301 //////////////////////////////////////////////    313 ///////////////////////////////////////////////////////////////////////
302                                                   314 
303 G4double G4PAIModel::SampleFluctuations(const  << 315 G4double G4PAIModel::SampleFluctuations( const G4MaterialCutsCouple* matCC,
304                                         const  << 316                                          const G4DynamicParticle* aParticle,
305                                         const  << 317            G4double tmax, G4double step,
306           const G4double,                      << 318            G4double eloss)
307                                         const  << 
308           const G4double eloss)                << 
309 {                                                 319 {
310   G4int coupleIndex = FindCoupleIndex(matCC);     320   G4int coupleIndex = FindCoupleIndex(matCC);
311   if(0 > coupleIndex) { return eloss; }           321   if(0 > coupleIndex) { return eloss; }
312                                                   322 
313   SetParticle(aParticle->GetDefinition());        323   SetParticle(aParticle->GetDefinition());
314                                                   324 
315   /*                                              325   /*
316   G4cout << "G4PAIModel::SampleFluctuations st    326   G4cout << "G4PAIModel::SampleFluctuations step(mm)= "<< step/mm
317    << "  Eloss(keV)= " << eloss/keV  << " in "    327    << "  Eloss(keV)= " << eloss/keV  << " in " 
318    << matCC->Getmaterial()->GetName() << G4end    328    << matCC->Getmaterial()->GetName() << G4endl;
319   */                                              329   */
320                                                   330 
321   G4double Tkin       = aParticle->GetKineticE    331   G4double Tkin       = aParticle->GetKineticEnergy();
322   G4double scaledTkin = Tkin*fRatio;              332   G4double scaledTkin = Tkin*fRatio;
323                                                   333 
324   G4double loss = fModelData->SampleAlongStepT    334   G4double loss = fModelData->SampleAlongStepTransfer(coupleIndex, Tkin,
325                   scaledTkin, tcut,            << 335                   scaledTkin, tmax,
326                   step*fChargeSquare);            336                   step*fChargeSquare);
327                                                   337   
328   // G4cout<<"PAIModel AlongStepLoss = "<<loss    338   // G4cout<<"PAIModel AlongStepLoss = "<<loss/keV<<" keV, on step = "
329   //<<step/mm<<" mm"<<G4endl;                     339   //<<step/mm<<" mm"<<G4endl; 
330   return loss;                                    340   return loss;
331                                                   341 
332 }                                                 342 }
333                                                   343 
334 //////////////////////////////////////////////    344 //////////////////////////////////////////////////////////////////////
335 //                                                345 //
336 // Returns the statistical estimation of the e    346 // Returns the statistical estimation of the energy loss distribution variance
337 //                                                347 //
338                                                   348 
339                                                   349 
340 G4double G4PAIModel::Dispersion( const G4Mater    350 G4double G4PAIModel::Dispersion( const G4Material* material, 
341                                  const G4Dynam    351                                  const G4DynamicParticle* aParticle,
342          const G4double tcut,                  << 352                G4double tmax, 
343          const G4double tmax,                  << 353                      G4double step       )
344                const G4double step )           << 
345 {                                                 354 {
346   G4double particleMass  = aParticle->GetMass(    355   G4double particleMass  = aParticle->GetMass();
347   G4double electronDensity = material->GetElec    356   G4double electronDensity = material->GetElectronDensity();
348   G4double kineticEnergy = aParticle->GetKinet    357   G4double kineticEnergy = aParticle->GetKineticEnergy();
349   G4double q = aParticle->GetCharge()/eplus;      358   G4double q = aParticle->GetCharge()/eplus;
350   G4double etot = kineticEnergy + particleMass    359   G4double etot = kineticEnergy + particleMass;
351   G4double beta2 = kineticEnergy*(kineticEnerg    360   G4double beta2 = kineticEnergy*(kineticEnergy + 2.0*particleMass)/(etot*etot);
352   G4double siga  = (tmax/beta2 - 0.5*tcut) * t << 361   G4double siga  = (1.0/beta2 - 0.5) * twopi_mc2_rcl2 * tmax * step
353                  * electronDensity * q * q;       362                  * electronDensity * q * q;
354                                                   363 
355   return siga;                                    364   return siga;
356 }                                                 365 }
357                                                   366 
358 //////////////////////////////////////////////    367 /////////////////////////////////////////////////////////////////////
359                                                   368 
360 G4double G4PAIModel::MaxSecondaryEnergy( const    369 G4double G4PAIModel::MaxSecondaryEnergy( const G4ParticleDefinition* p,
361            G4double kinEnergy)                    370            G4double kinEnergy) 
362 {                                                 371 {
363   SetParticle(p);                                 372   SetParticle(p);
364   G4double tmax = kinEnergy;                      373   G4double tmax = kinEnergy;
365   if(p == fElectron) { tmax *= 0.5; }             374   if(p == fElectron) { tmax *= 0.5; }
366   else if(p != fPositron) {                       375   else if(p != fPositron) { 
367     G4double ratio= electron_mass_c2/fMass;       376     G4double ratio= electron_mass_c2/fMass;
368     G4double gamma= kinEnergy/fMass + 1.0;        377     G4double gamma= kinEnergy/fMass + 1.0;
369     tmax = 2.0*electron_mass_c2*(gamma*gamma -    378     tmax = 2.0*electron_mass_c2*(gamma*gamma - 1.) /
370                   (1. + 2.0*gamma*ratio + rati    379                   (1. + 2.0*gamma*ratio + ratio*ratio);
371   }                                               380   }
372   return tmax;                                    381   return tmax;
373 }                                                 382 }
374                                                   383 
375 //////////////////////////////////////////////    384 ///////////////////////////////////////////////////////////////
376                                                   385 
377 void G4PAIModel::DefineForRegion(const G4Regio    386 void G4PAIModel::DefineForRegion(const G4Region* r) 
378 {                                                 387 {
379   fPAIRegionVector.push_back(r);                  388   fPAIRegionVector.push_back(r);
380 }                                                 389 }
381                                                   390 
382 //////////////////////////////////////////////    391 ///////////////////////////////////////////////////////////////
383                                                   392 
384                                                   393