Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/electromagnetic/muons/src/G4MuBremsstrahlungModel.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/muons/src/G4MuBremsstrahlungModel.cc (Version 11.3.0) and /processes/electromagnetic/muons/src/G4MuBremsstrahlungModel.cc (Version 9.1.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: G4MuBremsstrahlungModel.cc,v 1.24 2007/11/08 11:48:28 vnivanch Exp $
                                                   >>  27 // GEANT4 tag $Name: geant4-09-01-patch-01 $
 26 //                                                 28 //
 27 // -------------------------------------------     29 // -------------------------------------------------------------------
 28 //                                                 30 //
 29 // GEANT4 Class file                               31 // GEANT4 Class file
 30 //                                                 32 //
 31 //                                                 33 //
 32 // File name:     G4MuBremsstrahlungModel          34 // File name:     G4MuBremsstrahlungModel
 33 //                                                 35 //
 34 // Author:        Vladimir Ivanchenko on base      36 // Author:        Vladimir Ivanchenko on base of Laszlo Urban code
 35 //                                                 37 //
 36 // Creation date: 24.06.2002                       38 // Creation date: 24.06.2002
 37 //                                                 39 //
 38 // Modifications:                                  40 // Modifications:
 39 //                                                 41 //
 40 // 04-12-02 Change G4DynamicParticle construct     42 // 04-12-02 Change G4DynamicParticle constructor in PostStepDoIt (V.Ivanchenko)
 41 // 23-12-02 Change interface in order to move      43 // 23-12-02 Change interface in order to move to cut per region (V.Ivanchenko)
 42 // 24-01-03 Fix for compounds (V.Ivanchenko)       44 // 24-01-03 Fix for compounds (V.Ivanchenko)
 43 // 27-01-03 Make models region aware (V.Ivanch     45 // 27-01-03 Make models region aware (V.Ivanchenko)
 44 // 13-02-03 Add name (V.Ivanchenko)                46 // 13-02-03 Add name (V.Ivanchenko)
 45 // 10-02-04 Add lowestKinEnergy (V.Ivanchenko)     47 // 10-02-04 Add lowestKinEnergy (V.Ivanchenko)
 46 // 08-04-05 Major optimisation of internal int <<  48 // 08-04-05 Major optimisation of internal interfaces (V.Ivantchenko)
 47 // 03-08-05 Angular correlations according to  <<  49 // 03-08-05 Angular correlations according to PRM (V.Ivantchenko)
 48 // 13-02-06 add ComputeCrossSectionPerAtom (mm     50 // 13-02-06 add ComputeCrossSectionPerAtom (mma)
 49 // 21-03-06 Fix problem of initialisation in c     51 // 21-03-06 Fix problem of initialisation in case when cuts are not defined (VI)
 50 // 07-11-07 Improve sampling of final state (A     52 // 07-11-07 Improve sampling of final state (A.Bogdanov)
 51 // 28-02-08 Use precomputed Z^1/3 and Log(A) ( <<  53 //
 52 // 31-05-13 Use element selectors instead of l <<  54 
                                                   >>  55 //
                                                   >>  56 // Class Description:
                                                   >>  57 //
 53 //                                                 58 //
 54 // -------------------------------------------     59 // -------------------------------------------------------------------
 55 //                                                 60 //
 56 //....oooOO0OOooo........oooOO0OOooo........oo     61 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 57 //....oooOO0OOooo........oooOO0OOooo........oo     62 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 58                                                    63 
 59 #include "G4MuBremsstrahlungModel.hh"              64 #include "G4MuBremsstrahlungModel.hh"
 60 #include "G4PhysicalConstants.hh"              << 
 61 #include "G4SystemOfUnits.hh"                  << 
 62 #include "G4Gamma.hh"                              65 #include "G4Gamma.hh"
 63 #include "G4MuonMinus.hh"                          66 #include "G4MuonMinus.hh"
 64 #include "G4MuonPlus.hh"                           67 #include "G4MuonPlus.hh"
 65 #include "Randomize.hh"                            68 #include "Randomize.hh"
 66 #include "G4Material.hh"                           69 #include "G4Material.hh"
 67 #include "G4Element.hh"                            70 #include "G4Element.hh"
 68 #include "G4ElementVector.hh"                      71 #include "G4ElementVector.hh"
 69 #include "G4ProductionCutsTable.hh"                72 #include "G4ProductionCutsTable.hh"
 70 #include "G4ModifiedMephi.hh"                  << 
 71 #include "G4ParticleChangeForLoss.hh"              73 #include "G4ParticleChangeForLoss.hh"
 72 #include "G4Log.hh"                            << 
 73                                                    74 
 74 //....oooOO0OOooo........oooOO0OOooo........oo     75 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
                                                   >>  76 
                                                   >>  77 // static members
                                                   >>  78 //
                                                   >>  79 G4double G4MuBremsstrahlungModel::zdat[]={1., 4., 13., 29., 92.};
                                                   >>  80 G4double G4MuBremsstrahlungModel::adat[]={1.01, 9.01, 26.98, 63.55, 238.03};
                                                   >>  81 G4double G4MuBremsstrahlungModel::tdat[]={1.e3, 1.e4, 1.e5, 1.e6, 1.e7, 1.e8,
                                                   >>  82                                           1.e9, 1.e10};
                                                   >>  83 
 75 //....oooOO0OOooo........oooOO0OOooo........oo     84 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 76                                                    85 
 77 const G4double G4MuBremsstrahlungModel::xgi[]  <<  86 using namespace std;
 78   {0.03377,0.16940,0.38069,0.61931,0.83060,0.9 << 
 79 const G4double G4MuBremsstrahlungModel::wgi[]  << 
 80   {0.08566,0.18038,0.23396,0.23396,0.18038,0.0 << 
 81 G4double G4MuBremsstrahlungModel::fDN[] = {0.0 << 
 82                                                    87 
 83 G4MuBremsstrahlungModel::G4MuBremsstrahlungMod     88 G4MuBremsstrahlungModel::G4MuBremsstrahlungModel(const G4ParticleDefinition* p,
 84                                                    89                                                  const G4String& nam)
 85   : G4VEmModel(nam),                               90   : G4VEmModel(nam),
 86     sqrte(std::sqrt(G4Exp(1.))),               <<  91     particle(0),
 87     lowestKinEnergy(0.1*CLHEP::GeV),           <<  92     lowestKinEnergy(1.0*GeV),
 88     minThreshold(0.9*CLHEP::keV)               <<  93     minThreshold(1.0*keV),
                                                   >>  94     nzdat(5),
                                                   >>  95     ntdat(8),
                                                   >>  96     NBIN(1000),
                                                   >>  97     cutFixed(0.98*keV),
                                                   >>  98     ignoreCut(false),
                                                   >>  99     samplingTablesAreFilled(false)
 89 {                                                 100 {
 90   theGamma = G4Gamma::Gamma();                    101   theGamma = G4Gamma::Gamma();
 91   nist = G4NistManager::Instance();            << 102   if(p) SetParticle(p);
                                                   >> 103 }
 92                                                   104 
 93   SetAngularDistribution(new G4ModifiedMephi() << 105 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 94                                                   106 
 95   if (nullptr != p) { SetParticle(p); }        << 107 G4MuBremsstrahlungModel::~G4MuBremsstrahlungModel()
 96   if (0.0 == fDN[1]) {                         << 108 {
 97     for (G4int i=1; i<93; ++i) {               << 109   size_t n = partialSumSigma.size();
 98       G4double dn = 1.54*nist->GetA27(i);      << 110   if(n > 0) {
 99       fDN[i] = dn;                             << 111     for(size_t i=0; i<n; i++) {
100       if(1 < i) {                              << 112       delete partialSumSigma[i];
101   fDN[i] /= std::pow(dn, 1./G4double(i));      << 
102       }                                        << 
103     }                                             113     }
104   }                                               114   }
105 }                                                 115 }
106                                                   116 
107 //....oooOO0OOooo........oooOO0OOooo........oo    117 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
108                                                   118 
109 G4double G4MuBremsstrahlungModel::MinEnergyCut    119 G4double G4MuBremsstrahlungModel::MinEnergyCut(const G4ParticleDefinition*,
110                                                   120                                                const G4MaterialCutsCouple*)
111 {                                                 121 {
112   return minThreshold;                            122   return minThreshold;
113 }                                                 123 }
114                                                   124 
115 //....oooOO0OOooo........oooOO0OOooo........oo    125 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
116                                                   126 
117 G4double G4MuBremsstrahlungModel::MinPrimaryEn << 
118                                                << 
119                                                << 
120 {                                              << 
121   return std::max(lowestKinEnergy, cut);       << 
122 }                                              << 
123                                                << 
124 //....oooOO0OOooo........oooOO0OOooo........oo << 
125                                                << 
126 void G4MuBremsstrahlungModel::SetParticle(cons    127 void G4MuBremsstrahlungModel::SetParticle(const G4ParticleDefinition* p)
127 {                                                 128 {
128   if(nullptr == particle) {                    << 129   if(!particle) {
129     particle = p;                                 130     particle = p;
130     mass = particle->GetPDGMass();                131     mass = particle->GetPDGMass();
131     rmass = mass/CLHEP::electron_mass_c2 ;     << 
132     cc = CLHEP::classic_electr_radius/rmass ;  << 
133     coeff = 16.*CLHEP::fine_structure_const*cc << 
134   }                                               132   }
135 }                                                 133 }
136                                                   134 
137 //....oooOO0OOooo........oooOO0OOooo........oo    135 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
138                                                   136 
139 void G4MuBremsstrahlungModel::Initialise(const    137 void G4MuBremsstrahlungModel::Initialise(const G4ParticleDefinition* p,
140                                          const    138                                          const G4DataVector& cuts)
141 {                                                 139 {
142   SetParticle(p);                              << 140   if(p) SetParticle(p);
143   if(nullptr == fParticleChange) {             << 
144     fParticleChange = GetParticleChangeForLoss << 
145   }                                            << 
146   if(IsMaster() && p == particle && lowestKinE << 
147     InitialiseElementSelectors(p, cuts);       << 
148   }                                            << 
149 }                                              << 
150                                                   141 
151 //....oooOO0OOooo........oooOO0OOooo........oo << 142   highKinEnergy = HighEnergyLimit();
152                                                   143 
153 void G4MuBremsstrahlungModel::InitialiseLocal( << 144   G4double fixedEnergy = 0.5*highKinEnergy;
154                                                << 145 
155 {                                              << 146   const G4ProductionCutsTable* theCoupleTable=
156   if(p == particle && lowestKinEnergy < HighEn << 147         G4ProductionCutsTable::GetProductionCutsTable();
157     SetElementSelectors(masterModel->GetElemen << 148   if(theCoupleTable) {
                                                   >> 149     G4int numOfCouples = theCoupleTable->GetTableSize();
                                                   >> 150     
                                                   >> 151     G4int nn = partialSumSigma.size();
                                                   >> 152     G4int nc = cuts.size();
                                                   >> 153     if(nn > 0) {
                                                   >> 154       for (G4int ii=0; ii<nn; ii++){
                                                   >> 155   G4DataVector* a=partialSumSigma[ii];
                                                   >> 156   if ( a )  delete a;    
                                                   >> 157       } 
                                                   >> 158       partialSumSigma.clear();
                                                   >> 159     }
                                                   >> 160     if (numOfCouples>0) {
                                                   >> 161       for (G4int i=0; i<numOfCouples; i++) {
                                                   >> 162         G4double cute = DBL_MAX;
                                                   >> 163         if(i < nc) cute = cuts[i];
                                                   >> 164         if(cute < cutFixed || ignoreCut) cute = cutFixed;
                                                   >> 165         const G4MaterialCutsCouple* couple = 
                                                   >> 166     theCoupleTable->GetMaterialCutsCouple(i);
                                                   >> 167   const G4Material* material = couple->GetMaterial();
                                                   >> 168   G4DataVector* dv = ComputePartialSumSigma(material,fixedEnergy,cute);
                                                   >> 169   partialSumSigma.push_back(dv);
                                                   >> 170       }
                                                   >> 171     }
158   }                                               172   }
                                                   >> 173   if(!samplingTablesAreFilled) MakeSamplingTables();
                                                   >> 174   if(pParticleChange)
                                                   >> 175     fParticleChange = 
                                                   >> 176       reinterpret_cast<G4ParticleChangeForLoss*>(pParticleChange);
                                                   >> 177   else
                                                   >> 178     fParticleChange = new G4ParticleChangeForLoss();
159 }                                                 179 }
160                                                   180 
161 //....oooOO0OOooo........oooOO0OOooo........oo    181 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
162                                                   182 
163 G4double G4MuBremsstrahlungModel::ComputeDEDXP    183 G4double G4MuBremsstrahlungModel::ComputeDEDXPerVolume(
164                                                << 184                 const G4Material* material,
165                                                   185                                               const G4ParticleDefinition*,
166                                                   186                                                     G4double kineticEnergy,
167                                                   187                                                     G4double cutEnergy)
168 {                                                 188 {
169   G4double dedx = 0.0;                            189   G4double dedx = 0.0;
170   if (kineticEnergy <= lowestKinEnergy) { retu << 190   if (kineticEnergy <= lowestKinEnergy || ignoreCut) return dedx;
171                                                   191 
172   G4double cut = std::max(cutEnergy, minThresh << 192   G4double tmax = kineticEnergy;
173   cut = std::min(cut, kineticEnergy);          << 193   G4double cut  = min(cutEnergy,tmax);
                                                   >> 194   if(cut < cutFixed) cut = cutFixed;
174                                                   195 
175   const G4ElementVector* theElementVector = ma    196   const G4ElementVector* theElementVector = material->GetElementVector();
176   const G4double* theAtomicNumDensityVector =     197   const G4double* theAtomicNumDensityVector =
177     material->GetAtomicNumDensityVector();     << 198                                           material->GetAtomicNumDensityVector();
178                                                   199 
179   //  loop for elements in the material           200   //  loop for elements in the material
180   for (size_t i=0; i<material->GetNumberOfElem << 201   for (size_t i=0; i<material->GetNumberOfElements(); i++) {
181     G4double loss =                            << 202 
182       ComputMuBremLoss((*theElementVector)[i]- << 203     G4double Z = (*theElementVector)[i]->GetZ();
                                                   >> 204     G4double A = (*theElementVector)[i]->GetA()/(g/mole) ;
                                                   >> 205 
                                                   >> 206     G4double loss = ComputMuBremLoss(Z, A, kineticEnergy, cut);
                                                   >> 207 
183     dedx += loss*theAtomicNumDensityVector[i];    208     dedx += loss*theAtomicNumDensityVector[i];
184   }                                               209   }
185   //  G4cout << "BR e= " << kineticEnergy << " << 210   if(dedx < 0.) dedx = 0.;
186   dedx = std::max(dedx, 0.);                   << 
187   return dedx;                                    211   return dedx;
188 }                                                 212 }
189                                                   213 
190 //....oooOO0OOooo........oooOO0OOooo........oo    214 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
191                                                   215 
192 G4double G4MuBremsstrahlungModel::ComputMuBrem << 216 G4double G4MuBremsstrahlungModel::ComputMuBremLoss(G4double Z, G4double A,
193                                                   217                                                    G4double tkin, G4double cut)
194 {                                                 218 {
195   G4double totalEnergy = mass + tkin;             219   G4double totalEnergy = mass + tkin;
196   static const G4double ak1 = 0.05;            << 220   G4double ak1 = 0.05;
197   static const G4int k2 = 5;                   << 221   G4int    k2=5;
                                                   >> 222   G4double xgi[]={0.03377,0.16940,0.38069,0.61931,0.83060,0.96623};
                                                   >> 223   G4double wgi[]={0.08566,0.18038,0.23396,0.23396,0.18038,0.08566};
198   G4double loss = 0.;                             224   G4double loss = 0.;
199                                                   225 
200   G4double vcut = cut/totalEnergy;                226   G4double vcut = cut/totalEnergy;
201   G4int kkk = (G4int)(vcut/ak1) + k2;          << 227   G4double vmax = tkin/totalEnergy;
202   if (kkk > 8) { kkk = 8; }                    << 228 
203   else if (kkk < 1) { kkk = 1; }               << 229   G4double aaa = 0.;
204   G4double hhh = vcut/(G4double)(kkk);         << 230   G4double bbb = vcut;
205                                                << 231   if(vcut>vmax) bbb=vmax ;
206   G4double aa = 0.;                            << 232   G4int kkk = (G4int)((bbb-aaa)/ak1)+k2 ;
207   for(G4int l=0; l<kkk; ++l) {                 << 233   G4double hhh=(bbb-aaa)/float(kkk) ;
208     for(G4int i=0; i<6; ++i) {                 << 234 
                                                   >> 235   G4double aa = aaa;
                                                   >> 236   for(G4int l=0; l<kkk; l++)
                                                   >> 237   {
                                                   >> 238     for(G4int i=0; i<6; i++)
                                                   >> 239     {
209       G4double ep = (aa + xgi[i]*hhh)*totalEne    240       G4double ep = (aa + xgi[i]*hhh)*totalEnergy;
210       loss += ep*wgi[i]*ComputeDMicroscopicCro << 241       loss += ep*wgi[i]*ComputeDMicroscopicCrossSection(tkin, Z, A, ep);
211     }                                             242     }
212     aa += hhh;                                    243     aa += hhh;
213   }                                               244   }
214                                                   245 
215   loss *= hhh*totalEnergy;                     << 246   loss *=hhh*totalEnergy ;
                                                   >> 247 
216   return loss;                                    248   return loss;
217 }                                                 249 }
218                                                   250 
219 //....oooOO0OOooo........oooOO0OOooo........oo    251 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
220                                                   252 
221 G4double G4MuBremsstrahlungModel::ComputeMicro    253 G4double G4MuBremsstrahlungModel::ComputeMicroscopicCrossSection(
222                                            G4d    254                                            G4double tkin,
223                                            G4d    255                                            G4double Z,
                                                   >> 256                                            G4double A,
224                                            G4d    257                                            G4double cut)
225 {                                                 258 {
226   G4double totalEnergy = tkin + mass;             259   G4double totalEnergy = tkin + mass;
227   static const G4double ak1 = 2.3;             << 260   G4double ak1 = 2.3;
228   static const G4int k2 = 4;                   << 261   G4int    k2  = 4;
                                                   >> 262   G4double xgi[]={0.03377,0.16940,0.38069,0.61931,0.83060,0.96623};
                                                   >> 263   G4double wgi[]={0.08566,0.18038,0.23396,0.23396,0.18038,0.08566};
229   G4double cross = 0.;                            264   G4double cross = 0.;
230                                                   265 
231   if(cut >= tkin) return cross;                   266   if(cut >= tkin) return cross;
232                                                   267 
233   G4double vcut = cut/totalEnergy;                268   G4double vcut = cut/totalEnergy;
234   G4double vmax = tkin/totalEnergy;               269   G4double vmax = tkin/totalEnergy;
235                                                   270 
236   G4double aaa = G4Log(vcut);                  << 271   G4double aaa = log(vcut);
237   G4double bbb = G4Log(vmax);                  << 272   G4double bbb = log(vmax);
238   G4int kkk = (G4int)((bbb-aaa)/ak1) + k2 ;    << 273   G4int    kkk = (G4int)((bbb-aaa)/ak1)+k2 ;
239   if(kkk > 8) { kkk = 8; }                     << 274   G4double hhh = (bbb-aaa)/float(kkk);
240   else if (kkk < 1) { kkk = 1; }               << 275 
241   G4double hhh = (bbb-aaa)/(G4double)(kkk);    << 
242   G4double aa = aaa;                              276   G4double aa = aaa;
243                                                   277 
244   for(G4int l=0; l<kkk; ++l) {                 << 278   for(G4int l=0; l<kkk; l++)
245     for(G4int i=0; i<6; ++i) {                 << 279   {
246       G4double ep = G4Exp(aa + xgi[i]*hhh)*tot << 280     for(G4int i=0; i<6; i++)
247       cross += ep*wgi[i]*ComputeDMicroscopicCr << 281     {
                                                   >> 282       G4double ep = exp(aa + xgi[i]*hhh)*totalEnergy;
                                                   >> 283       cross += ep*wgi[i]*ComputeDMicroscopicCrossSection(tkin, Z, A, ep);
248     }                                             284     }
249     aa += hhh;                                    285     aa += hhh;
250   }                                               286   }
251                                                   287 
252   cross *= hhh;                                << 288   cross *=hhh;
253   //G4cout << "BR e= " << tkin<< "  cross= " < << 289 
254   return cross;                                   290   return cross;
255 }                                                 291 }
256                                                   292 
257 //....oooOO0OOooo........oooOO0OOooo........oo    293 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
258                                                   294 
259 G4double G4MuBremsstrahlungModel::ComputeDMicr    295 G4double G4MuBremsstrahlungModel::ComputeDMicroscopicCrossSection(
260                                            G4d    296                                            G4double tkin,
261                                            G4d    297                                            G4double Z,
                                                   >> 298                                            G4double A,
262                                            G4d    299                                            G4double gammaEnergy)
263 //  differential cross section                    300 //  differential cross section
264 {                                                 301 {
                                                   >> 302   static const G4double sqrte=sqrt(exp(1.)) ;
                                                   >> 303   static const G4double bh=202.4,bh1=446.,btf=183.,btf1=1429. ;
                                                   >> 304   static const G4double rmass=mass/electron_mass_c2 ;
                                                   >> 305   static const G4double cc=classic_electr_radius/rmass ;
                                                   >> 306   static const G4double coeff= 16.*fine_structure_const*cc*cc/3. ;
                                                   >> 307 
265   G4double dxsection = 0.;                        308   G4double dxsection = 0.;
266   if(gammaEnergy > tkin) { return dxsection; } << 309 
                                                   >> 310   if( gammaEnergy > tkin) return dxsection ;
267                                                   311 
268   G4double E = tkin + mass ;                      312   G4double E = tkin + mass ;
269   G4double v = gammaEnergy/E ;                    313   G4double v = gammaEnergy/E ;
270   G4double delta = 0.5*mass*mass*v/(E-gammaEne    314   G4double delta = 0.5*mass*mass*v/(E-gammaEnergy) ;
271   G4double rab0  = delta*sqrte ;               << 315   G4double rab0=delta*sqrte ;
                                                   >> 316 
                                                   >> 317   G4double z13 = exp(-log(Z)/3.) ;
                                                   >> 318   G4double dn  = 1.54*exp(0.27*log(A)) ;
                                                   >> 319 
                                                   >> 320   G4double b,b1,dnstar ;
272                                                   321 
273   G4int iz = G4lrint(Z);                       << 322   if(Z<1.5)
274   if(iz < 1) { iz = 1; }                       << 323   {
275   else if(iz > 92) { iz = 92; }                << 324     b=bh;
276                                                << 325     b1=bh1;
277   G4double z13 = 1.0/nist->GetZ13(iz);         << 326     dnstar=dn ;
278   G4double dnstar = fDN[iz];                   << 327   }
279                                                << 328   else
280   G4double b,b1;                               << 329   {
281   if(1 == iz) {                                << 330     b=btf;
282     b  = bh;                                   << 331     b1=btf1;
283     b1 = bh1;                                  << 332     dnstar = exp((1.-1./Z)*log(dn)) ;
284   } else {                                     << 
285     b  = btf;                                  << 
286     b1 = btf1;                                 << 
287   }                                               333   }
288                                                   334 
289   // nucleus contribution logarithm               335   // nucleus contribution logarithm
290   G4double rab1 = b*z13;                       << 336   G4double rab1=b*z13;
291   G4double fn = G4Log(rab1/(dnstar*(CLHEP::ele << 337   G4double fn=log(rab1/(dnstar*(electron_mass_c2+rab0*rab1))*
292   (mass + delta*(dnstar*sqrte-2.)));           << 338               (mass+delta*(dnstar*sqrte-2.))) ;
293   fn = std::max(fn, 0.);                       << 339   if(fn <0.) fn = 0. ;
294   // electron contribution logarithm              340   // electron contribution logarithm
295   G4double epmax1 = E/(1.+0.5*mass*rmass/E);   << 341   G4double epmax1=E/(1.+0.5*mass*rmass/E) ;
296   G4double fe = 0.;                            << 342   G4double fe=0.;
297   if(gammaEnergy < epmax1) {                   << 343   if(gammaEnergy<epmax1)
298     G4double rab2 = b1*z13*z13;                << 344   {
299     fe = G4Log(rab2*mass/((1.+delta*rmass/(CLH << 345     G4double rab2=b1*z13*z13 ;
300   (CLHEP::electron_mass_c2+rab0*rab2)));       << 346     fe=log(rab2*mass/((1.+delta*rmass/(electron_mass_c2*sqrte))*
301     fe = std::max(fe, 0.);                     << 347                               (electron_mass_c2+rab0*rab2))) ;
                                                   >> 348     if(fe<0.) fe=0. ;
302   }                                               349   }
303                                                   350 
304   dxsection = coeff*(1.-v*(1. - 0.75*v))*Z*(fn    351   dxsection = coeff*(1.-v*(1. - 0.75*v))*Z*(fn*Z + fe)/gammaEnergy;
305   dxsection = std::max(dxsection, 0.0);        << 352 
306   return dxsection;                               353   return dxsection;
307 }                                                 354 }
308                                                   355 
309 //....oooOO0OOooo........oooOO0OOooo........oo    356 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
310                                                   357 
311 G4double G4MuBremsstrahlungModel::ComputeCross    358 G4double G4MuBremsstrahlungModel::ComputeCrossSectionPerAtom(
312                                            con    359                                            const G4ParticleDefinition*,
313                                                   360                                                  G4double kineticEnergy,
314                                                << 361              G4double Z, G4double A,
315                                                   362                                                  G4double cutEnergy,
316                                                << 363                                                  G4double)
                                                   >> 364 {
                                                   >> 365   G4double cut  = min(cutEnergy, kineticEnergy);
                                                   >> 366   if(cut < cutFixed || ignoreCut) cut = cutFixed;
                                                   >> 367   G4double cross =
                                                   >> 368     ComputeMicroscopicCrossSection (kineticEnergy, Z, A/(g/mole), cut);
                                                   >> 369   return cross;
                                                   >> 370 }
                                                   >> 371 
                                                   >> 372 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
                                                   >> 373 
                                                   >> 374 G4double G4MuBremsstrahlungModel::CrossSectionPerVolume(
                                                   >> 375                  const G4Material* material,
                                                   >> 376                                                const G4ParticleDefinition*,
                                                   >> 377                                                      G4double kineticEnergy,
                                                   >> 378                                                      G4double cutEnergy,
                                                   >> 379                                                      G4double maxEnergy)
317 {                                                 380 {
318   G4double cross = 0.0;                           381   G4double cross = 0.0;
319   if (kineticEnergy <= lowestKinEnergy) return << 382   if (cutEnergy >= maxEnergy || kineticEnergy <= lowestKinEnergy) return cross;
320   G4double tmax = std::min(maxEnergy, kineticE << 383   
321   G4double cut  = std::min(cutEnergy, kineticE << 384   G4double tmax = min(maxEnergy, kineticEnergy);
322   if (cut < minThreshold) cut = minThreshold;  << 385   G4double cut  = min(cutEnergy, tmax);
323   if (cut >= tmax) return cross;               << 386   if(cut < cutFixed || ignoreCut) cut = cutFixed;
324                                                << 387 
325   cross = ComputeMicroscopicCrossSection (kine << 388   const G4ElementVector* theElementVector = material->GetElementVector();
326   if(tmax < kineticEnergy) {                   << 389   const G4double* theAtomNumDensityVector =
327     cross -= ComputeMicroscopicCrossSection(ki << 390                                           material->GetAtomicNumDensityVector();
                                                   >> 391 
                                                   >> 392   for (size_t i=0; i<material->GetNumberOfElements(); i++) {
                                                   >> 393 
                                                   >> 394     G4double Z = (*theElementVector)[i]->GetZ();
                                                   >> 395     G4double A = (*theElementVector)[i]->GetA()/(g/mole);
                                                   >> 396 
                                                   >> 397     G4double cr = ComputeMicroscopicCrossSection(kineticEnergy, Z, A, cut);
                                                   >> 398 
                                                   >> 399     if(tmax < kineticEnergy) {
                                                   >> 400       cr -= ComputeMicroscopicCrossSection(kineticEnergy, Z, A, tmax);
                                                   >> 401     }
                                                   >> 402     cross += theAtomNumDensityVector[i] * cr;
328   }                                               403   }
                                                   >> 404 
329   return cross;                                   405   return cross;
330 }                                                 406 }
331                                                   407 
332 //....oooOO0OOooo........oooOO0OOooo........oo    408 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
333                                                   409 
334 void G4MuBremsstrahlungModel::SampleSecondarie << 410 G4DataVector* G4MuBremsstrahlungModel::ComputePartialSumSigma(
335                               std::vector<G4Dy << 411                                        const G4Material* material,
336                               const G4Material << 412                                              G4double kineticEnergy,
337                               const G4DynamicP << 413                                              G4double cut)
338                               G4double minEner << 414 
339                               G4double maxEner << 415 // Build the table of cross section per element. The table is built for MATERIAL
                                                   >> 416 // This table is used by DoIt to select randomly an element in the material.
                                                   >> 417 {
                                                   >> 418   G4int nElements = material->GetNumberOfElements();
                                                   >> 419   const G4ElementVector* theElementVector = material->GetElementVector();
                                                   >> 420   const G4double* theAtomNumDensityVector = 
                                                   >> 421                                           material->GetAtomicNumDensityVector();
                                                   >> 422 
                                                   >> 423   G4DataVector* dv = new G4DataVector();
                                                   >> 424 
                                                   >> 425   G4double cross = 0.0;
                                                   >> 426 
                                                   >> 427   for (G4int i=0; i<nElements; i++ ) {
                                                   >> 428 
                                                   >> 429     G4double Z = (*theElementVector)[i]->GetZ();
                                                   >> 430     G4double A = (*theElementVector)[i]->GetA()/(g/mole) ;
                                                   >> 431     cross += theAtomNumDensityVector[i] 
                                                   >> 432              * ComputeMicroscopicCrossSection(kineticEnergy, Z, A, cut);
                                                   >> 433     dv->push_back(cross);
                                                   >> 434   }
                                                   >> 435   return dv;
                                                   >> 436 }
                                                   >> 437 
                                                   >> 438 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
                                                   >> 439 
                                                   >> 440 void G4MuBremsstrahlungModel::MakeSamplingTables()
                                                   >> 441 {
                                                   >> 442 
                                                   >> 443   G4double AtomicNumber,AtomicWeight,KineticEnergy,
                                                   >> 444            TotalEnergy,Maxep;
                                                   >> 445 
                                                   >> 446   for (G4int iz=0; iz<nzdat; iz++)
                                                   >> 447    {
                                                   >> 448      AtomicNumber = zdat[iz];
                                                   >> 449      AtomicWeight = adat[iz]*g/mole ;
                                                   >> 450 
                                                   >> 451      for (G4int it=0; it<ntdat; it++)
                                                   >> 452      {
                                                   >> 453        KineticEnergy = tdat[it];
                                                   >> 454        TotalEnergy = KineticEnergy + mass;
                                                   >> 455        Maxep = KineticEnergy ;
                                                   >> 456 
                                                   >> 457        G4double CrossSection = 0.0 ;
                                                   >> 458 
                                                   >> 459        // calculate the differential cross section
                                                   >> 460        // numerical integration in
                                                   >> 461        //  log ...............
                                                   >> 462        G4double c = log(Maxep/cutFixed) ;
                                                   >> 463        G4double ymin = -5. ;
                                                   >> 464        G4double ymax = 0. ;
                                                   >> 465        G4double dy = (ymax-ymin)/NBIN ;
                                                   >> 466 
                                                   >> 467        G4double y = ymin - 0.5*dy ;
                                                   >> 468        G4double yy = ymin - dy ;
                                                   >> 469        G4double x = exp(y);
                                                   >> 470        G4double fac = exp(dy);
                                                   >> 471        G4double dx = exp(yy)*(fac - 1.0);
                                                   >> 472 
                                                   >> 473        for (G4int i=0 ; i<NBIN; i++)
                                                   >> 474        {
                                                   >> 475          y += dy ;
                                                   >> 476          x *= fac;
                                                   >> 477          dx*= fac;
                                                   >> 478          G4double ep = cutFixed*exp(c*x) ;
                                                   >> 479 
                                                   >> 480          CrossSection += ep*dx*ComputeDMicroscopicCrossSection(
                                                   >> 481                                                  KineticEnergy,AtomicNumber,
                                                   >> 482                                                  AtomicWeight,ep) ;
                                                   >> 483          ya[i]=y ;
                                                   >> 484          proba[iz][it][i] = CrossSection ;
                                                   >> 485 
                                                   >> 486        }
                                                   >> 487 
                                                   >> 488        proba[iz][it][NBIN] = CrossSection ;
                                                   >> 489        ya[NBIN] = 0. ;   //   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                                                   >> 490 
                                                   >> 491        if(CrossSection > 0.)
                                                   >> 492        {
                                                   >> 493          for(G4int ib=0; ib<=NBIN; ib++)
                                                   >> 494          {
                                                   >> 495            proba[iz][it][ib] /= CrossSection ;
                                                   >> 496          }
                                                   >> 497        }
                                                   >> 498      }
                                                   >> 499    }
                                                   >> 500   samplingTablesAreFilled = true;
                                                   >> 501 }
                                                   >> 502 
                                                   >> 503 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
                                                   >> 504 
                                                   >> 505 void G4MuBremsstrahlungModel::SampleSecondaries(std::vector<G4DynamicParticle*>* vdp,
                                                   >> 506             const G4MaterialCutsCouple* couple,
                                                   >> 507             const G4DynamicParticle* dp,
                                                   >> 508             G4double minEnergy,
                                                   >> 509             G4double maxEnergy)
340 {                                                 510 {
341   G4double kineticEnergy = dp->GetKineticEnerg    511   G4double kineticEnergy = dp->GetKineticEnergy();
342   // check against insufficient energy            512   // check against insufficient energy
343   G4double tmax = std::min(kineticEnergy, maxE << 513   G4double tmax = min(kineticEnergy, maxEnergy);
344   G4double tmin = std::min(kineticEnergy, minE << 514   G4double tmin = min(kineticEnergy, minEnergy);
345   tmin = std::max(tmin, minThreshold);         << 515   if(tmin < cutFixed || ignoreCut) tmin = cutFixed;
346   if(tmin >= tmax) return;                        516   if(tmin >= tmax) return;
347                                                   517 
                                                   >> 518   // ===== the begining of a new code  ======
348   // ===== sampling of energy transfer ======     519   // ===== sampling of energy transfer ======
349                                                   520 
350   G4ParticleMomentum partDirection = dp->GetMo    521   G4ParticleMomentum partDirection = dp->GetMomentumDirection();
351                                                   522 
352   // select randomly one element constituing t    523   // select randomly one element constituing the material
353   const G4Element* anElement = SelectRandomAto << 524   const G4Element* anElement = SelectRandomAtom(couple);
354   G4double Z = anElement->GetZ();              << 
355   G4double func1 = tmin*                       << 
356     ComputeDMicroscopicCrossSection(kineticEne << 
357                                                   525 
358   G4double gEnergy;                            << 526   G4double totalEnergy   = kineticEnergy + mass;
359   G4double func2;                              << 527   G4double totalMomentum = sqrt(kineticEnergy*(kineticEnergy + 2.0*mass));
                                                   >> 528 
                                                   >> 529   G4double AtomicNumber = anElement->GetZ();
                                                   >> 530   G4double AtomicWeight = anElement->GetA()/(g/mole);
360                                                   531 
361   G4double xmin = G4Log(tmin/minThreshold);    << 532   G4double func1 = tmin*ComputeDMicroscopicCrossSection(
362   G4double xmax = G4Log(tmax/tmin);            << 533             kineticEnergy,AtomicNumber,
                                                   >> 534             AtomicWeight,tmin);
                                                   >> 535 
                                                   >> 536   G4double lnepksi, epksi;
                                                   >> 537   G4double func2;
                                                   >> 538   G4double ksi2;
363                                                   539 
364   do {                                            540   do {
365     gEnergy = minThreshold*G4Exp(xmin + G4Unif << 541     lnepksi = log(tmin) + G4UniformRand()*log(kineticEnergy/tmin);
366     func2 = gEnergy*ComputeDMicroscopicCrossSe << 542     epksi   = exp(lnepksi);
367                                                << 543     func2   = epksi*ComputeDMicroscopicCrossSection(
368     // Loop checking, 03-Aug-2015, Vladimir Iv << 544         kineticEnergy,AtomicNumber,
369   } while(func2 < func1*G4UniformRand());      << 545         AtomicWeight,epksi);
                                                   >> 546     ksi2 = G4UniformRand();
                                                   >> 547 
                                                   >> 548   } while(func2/func1 < ksi2);
                                                   >> 549 
                                                   >> 550   // ===== the end of a new code =====
370                                                   551 
371   // angles of the emitted gamma using general << 
372   G4ThreeVector gamDir =                       << 
373     GetAngularDistribution()->SampleDirection( << 
374                                                << 
375   // create G4DynamicParticle object for the G    552   // create G4DynamicParticle object for the Gamma
376   G4DynamicParticle* gamma = new G4DynamicPart << 553   G4double gEnergy = epksi;
377   vdp->push_back(gamma);                       << 554 
                                                   >> 555   // sample angle
                                                   >> 556   G4double gam  = totalEnergy/mass;
                                                   >> 557   G4double rmax = gam*min(1.0, totalEnergy/gEnergy - 1.0);
                                                   >> 558   rmax *= rmax;
                                                   >> 559   G4double x = G4UniformRand()*rmax/(1.0 + rmax);
                                                   >> 560 
                                                   >> 561   G4double theta = sqrt(x/(1.0 - x))/gam;
                                                   >> 562   G4double sint  = sin(theta);
                                                   >> 563   G4double phi   = twopi * G4UniformRand() ;
                                                   >> 564   G4double dirx  = sint*cos(phi), diry = sint*sin(phi), dirz = cos(theta) ;
                                                   >> 565 
                                                   >> 566   G4ThreeVector gDirection(dirx, diry, dirz);
                                                   >> 567   gDirection.rotateUz(partDirection);
                                                   >> 568 
                                                   >> 569   partDirection *= totalMomentum;
                                                   >> 570   partDirection -= gEnergy*gDirection;
                                                   >> 571   partDirection = partDirection.unit();
                                                   >> 572 
                                                   >> 573   // primary change
                                                   >> 574   kineticEnergy -= gEnergy;
                                                   >> 575   fParticleChange->SetProposedKineticEnergy(kineticEnergy);
                                                   >> 576   fParticleChange->SetProposedMomentumDirection(partDirection);
                                                   >> 577 
                                                   >> 578   // save secondary
                                                   >> 579   G4DynamicParticle* aGamma = new G4DynamicParticle(theGamma,gDirection,gEnergy);
                                                   >> 580   vdp->push_back(aGamma);
                                                   >> 581 }
                                                   >> 582 
                                                   >> 583 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
                                                   >> 584 
                                                   >> 585 const G4Element* G4MuBremsstrahlungModel::SelectRandomAtom(
                                                   >> 586            const G4MaterialCutsCouple* couple) const
                                                   >> 587 {
                                                   >> 588   // select randomly 1 element within the material
                                                   >> 589 
                                                   >> 590   const G4Material* material = couple->GetMaterial();
                                                   >> 591   G4int nElements = material->GetNumberOfElements();
                                                   >> 592   const G4ElementVector* theElementVector = material->GetElementVector();
                                                   >> 593   if(1 == nElements) return (*theElementVector)[0];
                                                   >> 594   else if(1 > nElements) return 0;
378                                                   595 
379   // compute post-interaction kinematics of pr << 596   G4DataVector* dv = partialSumSigma[couple->GetIndex()];
380   // energy-momentum conservation              << 597   G4double rval = G4UniformRand()*((*dv)[nElements-1]);
381   const G4double totMomentum =                 << 598   for (G4int i=0; i<nElements; i++) {
382     std::sqrt(kineticEnergy*(kineticEnergy + 2 << 599     if (rval <= (*dv)[i]) return (*theElementVector)[i];
383   G4ThreeVector dir =                          << 
384     (totMomentum*dp->GetMomentumDirection() -  << 
385   const G4double finalE = kineticEnergy - gEne << 
386                                                << 
387   // if secondary gamma energy is higher than  << 
388   // then stop tracking the primary particle a << 
389   // instead of the primary one                << 
390   if (gEnergy > SecondaryThreshold()) {        << 
391     fParticleChange->ProposeTrackStatus(fStopA << 
392     fParticleChange->SetProposedKineticEnergy( << 
393     G4DynamicParticle* newdp = new G4DynamicPa << 
394     vdp->push_back(newdp);                     << 
395   } else {                                     << 
396     // continue tracking the primary e-/e+ oth << 
397     fParticleChange->SetProposedMomentumDirect << 
398     fParticleChange->SetProposedKineticEnergy( << 
399   }                                               600   }
                                                   >> 601   return (*theElementVector)[nElements-1];
400 }                                                 602 }
401                                                   603 
402 //....oooOO0OOooo........oooOO0OOooo........oo    604 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
403                                                   605