ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4UrbanAdjointMscModel.hh
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4UrbanAdjointMscModel.hh
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
26 //
27 // -------------------------------------------------------------------
28 //
29 //
30 // GEANT4 Class header file
31 //
32 //
33 // File name: G4UrbanAdjointMscModel
34 //
35 // Author: Laszlo Urban
36 //
37 // Creation date: 19.02.2013
38 //
39 // Created from G4UrbanAdjointMscModel96
40 //
41 // New parametrization for theta0
42 // Correction for very small step length
43 //
44 // Class Description:
45 //
46 // Implementation of the model of multiple scattering based on
47 // H.W.Lewis Phys Rev 78 (1950) 526 and L.Urban model
48 
49 // -------------------------------------------------------------------
50 //
51 
52 #ifndef G4UrbanAdjointMscModel_h
53 #define G4UrbanAdjointMscModel_h 1
54 
55 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
56 
58 
59 #include "G4VMscModel.hh"
60 #include "G4MscStepLimitType.hh"
61 #include "G4Log.hh"
62 #include "G4Exp.hh"
63 #include "G4Electron.hh"
64 
65 
67 class G4SafetyHelper;
68 class G4LossTableManager;
69 
70 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
71 
73 {
74 
75 public:
76 
77  explicit G4UrbanAdjointMscModel(const G4String& nam = "UrbanMsc");
78 
79  virtual ~G4UrbanAdjointMscModel();
80 
81  virtual void Initialise(const G4ParticleDefinition*,
82  const G4DataVector&) override;
83 
84  virtual void StartTracking(G4Track*) override;
85 
86  virtual G4double
88  G4double KineticEnergy,
89  G4double AtomicNumber,
90  G4double AtomicWeight=0.,
91  G4double cut =0.,
92  G4double emax=DBL_MAX) override;
93 
95  G4double safety) override;
96 
97  virtual G4double
99  G4double& currentMinimalStep) override;
100 
101  virtual G4double ComputeGeomPathLength(G4double truePathLength) override;
102 
103  virtual G4double ComputeTrueStepLength(G4double geomStepLength) override;
104 
105  G4double ComputeTheta0(G4double truePathLength, G4double KineticEnergy);
106 
107  inline void SetNewDisplacementFlag(G4bool);
108 
109 private:
110 
111  G4double SampleCosineTheta(G4double trueStepLength, G4double KineticEnergy);
112 
113  void SampleDisplacement(G4double sinTheta, G4double phi);
114 
115  void SampleDisplacementNew(G4double sinTheta, G4double phi);
116 
117  inline void SetParticle(const G4ParticleDefinition*);
118 
119  inline void UpdateCache();
120 
121  inline G4double Randomizetlimit();
122 
123  inline G4double SimpleScattering(G4double xmeanth, G4double x2meanth);
124 
125  // hide assignment operator
128 
130 
134 
137 
141 
150 
156 
158 
164 
166 
171 
173 
178 
181 
184 
187 
188 };
189 
190 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
191 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
192 
193 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
194 
196 {
197  displacementFlag = val;
198 }
199 
200 inline
202 { const G4ParticleDefinition* p1 =p;
203 
204  if (p->GetParticleName() =="adj_e-") p1= G4Electron::Electron();
205 
206  if (p1 != particle) {
207  particle = p1;
208  mass = p1->GetPDGMass();
211  }
212 }
213 
214 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
215 
217 {
218  G4double temptlimit = tlimit;
219  if(tlimit > tlimitmin)
220  {
222  do {
223  temptlimit = G4RandGauss::shoot(rndmEngineMod,tlimit,0.1*delta);
224  // Loop checking, 10-Apr-2016, Laszlo Urban
225  } while ((temptlimit < tlimit-delta) ||
226  (temptlimit > tlimit+delta));
227  }
228  else { temptlimit = tlimitmin; }
229 
230  return temptlimit;
231 }
232 
233 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
234 
236 {
237  lnZ = G4Log(Zeff);
238  // correction in theta0 formula
239  G4double w = G4Exp(lnZ/6.);
240  G4double facz = 0.990395+w*(-0.168386+w*0.093286) ;
241  coeffth1 = facz*(1. - 8.7780e-2/Zeff);
242  coeffth2 = facz*(4.0780e-2 + 1.7315e-4*Zeff);
243 
244  // tail parameters
245  G4double Z13 = w*w;
246  coeffc1 = 2.3785 - Z13*(4.1981e-1 - Z13*6.3100e-2);
247  coeffc2 = 4.7526e-1 + Z13*(1.7694 - Z13*3.3885e-1);
248  coeffc3 = 2.3683e-1 - Z13*(1.8111 - Z13*3.2774e-1);
249  coeffc4 = 1.7888e-2 + Z13*(1.9659e-2 - Z13*2.6664e-3);
250 
251  Z2 = Zeff*Zeff;
252  Z23 = Z13*Z13;
253 
254  Zold = Zeff;
255 }
256 
257 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
258 
259 inline
261 {
262  // 'large angle scattering'
263  // 2 model functions with correct xmean and x2mean
264  G4double a = (2.*xmeanth+9.*x2meanth-3.)/(2.*xmeanth-3.*x2meanth+1.);
265  G4double prob = (a+2.)*xmeanth/a;
266 
267  // sampling
268  G4double cth = 1.;
269  if(rndmEngineMod->flat() < prob) {
270  cth = -1.+2.*G4Exp(G4Log(rndmEngineMod->flat())/(a+1.));
271  } else {
272  cth = -1.+2.*rndmEngineMod->flat();
273  }
274  return cth;
275 }
276 
277 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
278 
279 
280 #endif
281