Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
GFlashHomoShowerParameterisation.cc
Go to the documentation of this file.
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// $Id$
27//
28//
29// ------------------------------------------------------------
30// GEANT 4 class implementation
31//
32// ------- GFlashHomoShowerParameterisation -------
33//
34// Authors: E.Barberio & Joanna Weng - 9.11.2004
35// ------------------------------------------------------------
36
37#include <cmath>
38
42#include "G4SystemOfUnits.hh"
43#include "Randomize.hh"
44#include "G4ios.hh"
45#include "G4Material.hh"
46#include "G4MaterialTable.hh"
47
52 ConstantResolution(0.), NoiseResolution(0.), SamplingResolution(0.),
53 AveLogAlphah(0.), AveLogTmaxh(0.), SigmaLogAlphah(0.), SigmaLogTmaxh(0.),
54 Rhoh(0.), Alphah(0.), Tmaxh(0.), Betah(0.)
55
56{
57 if(!aPar) { thePar = new GVFlashHomoShowerTuning; owning = true; }
58 else { thePar = aPar; owning = false; }
59
60 SetMaterial(aMat);
61 PrintMaterial(aMat);
62
63 /********************************************/
64 /* Homo Calorimeter */
65 /********************************************/
66 // Longitudinal Coefficients for a homogenious calo
67 // shower max
68 //
69 ParAveT1 = thePar->ParAveT1(); // ln (ln y -0.812)
70 ParAveA1 = thePar->ParAveA1(); // ln a (0.81 + (0.458 + 2.26/Z)ln y)
71 ParAveA2 = thePar->ParAveA2();
72 ParAveA3 = thePar->ParAveA3();
73
74 // Variance of shower max
75 ParSigLogT1 = thePar->ParSigLogT1(); // Sigma T1 (-1.4 + 1.26 ln y)**-1
76 ParSigLogT2 = thePar->ParSigLogT2();
77
78 // variance of 'alpha'
79 //
80 ParSigLogA1 = thePar->ParSigLogA1(); // Sigma a (-0.58 + 0.86 ln y)**-1
81 ParSigLogA2 = thePar->ParSigLogA2();
82
83 // correlation alpha%T
84 //
85 ParRho1 = thePar->ParRho1(); // Rho = 0.705 -0.023 ln y
86 ParRho2 = thePar->ParRho2();
87
88 // Radial Coefficients
89 // r_C (tau)= z_1 +z_2 tau
90 // r_t (tau)= k1 (std::exp (k3(tau -k2 ))+std::exp (k_4 (tau- k_2))))
91 //
92 ParRC1 = thePar->ParRC1(); // z_1 = 0.0251 + 0.00319 ln E
93 ParRC2 = thePar->ParRC2();
94
95 ParRC3 = thePar->ParRC3(); // z_2 = 0.1162 + - 0.000381 Z
96 ParRC4 = thePar->ParRC4();
97
98 ParWC1 = thePar->ParWC1();
99 ParWC2 = thePar->ParWC2();
100 ParWC3 = thePar->ParWC3();
101 ParWC4 = thePar->ParWC4();
102 ParWC5 = thePar->ParWC5();
103 ParWC6 = thePar->ParWC6();
104
105 ParRT1 = thePar->ParRT1();
106 ParRT2 = thePar->ParRT2();
107 ParRT3 = thePar->ParRT3();
108 ParRT4 = thePar->ParRT4();
109 ParRT5 = thePar->ParRT5();
110 ParRT6 = thePar->ParRT6();
111
112 // Coeff for fluctueted radial profiles for a uniform media
113 //
114 ParSpotT1 = thePar->ParSpotT1(); // T_spot = T_hom =(0.698 + 0.00212)
115 ParSpotT2 = thePar->ParSpotT2();
116
117 ParSpotA1 = thePar->ParSpotA1(); // a_spot= a_hom (0.639 + 0.00334)
118 ParSpotA2 = thePar->ParSpotA2();
119
120 ParSpotN1 = thePar->ParSpotN1(); // N_Spot 93 * ln(Z) E ** 0.876
121 ParSpotN2 = thePar->ParSpotN2();
122
123 // Inits
124
125 NSpot = 0.00;
126 AlphaNSpot = 0.00;
127 TNSpot = 0.00;
128 BetaNSpot = 0.00;
129
130 RadiusCore = 0.00;
131 WeightCore = 0.00;
132 RadiusTail = 0.00;
133
134 G4cout << "/********************************************/ " << G4endl;
135 G4cout << " - GFlashHomoShowerParameterisation::Constructor - " << G4endl;
136 G4cout << "/********************************************/ " << G4endl;
137}
138
140{
141 material= mat;
142 Z = GetEffZ(material);
143 A = GetEffA(material);
144 density = material->GetDensity()/(g/cm3);
145 X0 = material->GetRadlen();
146 Ec = 2.66 * std::pow((X0 * Z / A),1.1);
147 G4double Es = 21*MeV;
148 Rm = X0*Es/Ec;
149 // PrintMaterial();
150}
151
153{
154 if(owning) { delete thePar; }
155}
156
159{
160 if (material==0)
161 {
162 G4Exception("GFlashHomoShowerParameterisation::GenerateLongitudinalProfile()",
163 "InvalidSetup", FatalException, "No material initialized!");
164 }
165
166 G4double y = Energy/Ec;
167 ComputeLongitudinalParameters(y);
168 GenerateEnergyProfile(y);
169 GenerateNSpotProfile(y);
170}
171
172void
173GFlashHomoShowerParameterisation::ComputeLongitudinalParameters(G4double y)
174{
175 AveLogTmaxh = std::log(ParAveT1 + std::log(y));
176 //ok <ln T hom>
177 AveLogAlphah = std::log(ParAveA1 + (ParAveA2+ParAveA3/Z)*std::log(y));
178 //ok <ln alpha hom>
179
180 SigmaLogTmaxh = 1.00/( ParSigLogT1 + ParSigLogT2*std::log(y)) ;
181 //ok sigma (ln T hom)
182 SigmaLogAlphah = 1.00/( ParSigLogA1 + ParSigLogA2*std::log(y));
183 //ok sigma (ln alpha hom)
184 Rhoh = ParRho1+ParRho2*std::log(y); //ok
185}
186
187void GFlashHomoShowerParameterisation::GenerateEnergyProfile(G4double /* y */)
188{
189 G4double Correlation1h = std::sqrt((1+Rhoh)/2);
190 G4double Correlation2h = std::sqrt((1-Rhoh)/2);
191
192 G4double Random1 = G4RandGauss::shoot();
193 G4double Random2 = G4RandGauss::shoot();
194
195 // Parameters for Enenrgy Profile including correaltion and sigmas
196
197 Tmaxh = std::exp( AveLogTmaxh + SigmaLogTmaxh *
198 (Correlation1h*Random1 + Correlation2h*Random2) );
199 Alphah = std::exp( AveLogAlphah + SigmaLogAlphah *
200 (Correlation1h*Random1 - Correlation2h*Random2) );
201 Betah = (Alphah-1.00)/Tmaxh;
202}
203
204void GFlashHomoShowerParameterisation::GenerateNSpotProfile(const G4double y)
205{
206 TNSpot = Tmaxh * (ParSpotT1+ParSpotT2*Z); // ok
207 AlphaNSpot = Alphah * (ParSpotA1+ParSpotA2*Z);
208 BetaNSpot = (AlphaNSpot-1.00)/TNSpot; // ok
209 NSpot = ParSpotN1 * std::log(Z)*std::pow((y*Ec)/GeV,ParSpotN2 ); // ok
210}
211
213IntegrateEneLongitudinal(G4double LongitudinalStep)
214{
215 G4double LongitudinalStepInX0 = LongitudinalStep / X0;
216 G4float x1= Betah*LongitudinalStepInX0;
217 G4float x2= Alphah;
218 float x3 = gam(x1,x2);
219 G4double DEne=x3;
220 return DEne;
221}
222
224IntegrateNspLongitudinal(G4double LongitudinalStep)
225{
226 G4double LongitudinalStepInX0 = LongitudinalStep / X0;
227 G4float x1 = BetaNSpot*LongitudinalStepInX0;
228 G4float x2 = AlphaNSpot;
229 G4float x3 = gam(x1,x2);
230 G4double DNsp = x3;
231 return DNsp;
232}
233
234
236GenerateRadius(G4int ispot, G4double Energy, G4double LongitudinalPosition)
237{
238 if(ispot < 1)
239 {
240 // Determine lateral parameters in the middle of the step.
241 // They depend on energy & position along step.
242 //
243 G4double Tau = ComputeTau(LongitudinalPosition);
244 ComputeRadialParameters(Energy,Tau);
245 }
246
247 G4double Radius;
248 G4double Random1 = G4UniformRand();
249 G4double Random2 = G4UniformRand();
250
251 if(Random1 <WeightCore) //WeightCore = p < w_i
252 {
253 Radius = Rm * RadiusCore * std::sqrt( Random2/(1. - Random2) );
254 }
255 else
256 {
257 Radius = Rm * RadiusTail * std::sqrt( Random2/(1. - Random2) );
258 }
259 Radius = std::min(Radius,DBL_MAX);
260 return Radius;
261}
262
264ComputeTau(G4double LongitudinalPosition)
265{
266 G4double tau = LongitudinalPosition / Tmaxh / X0 //<t> = T* a /(a - 1)
267 * (Alphah-1.00) /Alphah *
268 std::exp(AveLogAlphah)/(std::exp(AveLogAlphah)-1.); //ok
269 return tau;
270}
271
274{
275 G4double z1 = ParRC1 + ParRC2* std::log(Energy/GeV) ; //ok
276 G4double z2 = ParRC3+ParRC4*Z ; //ok
277 RadiusCore = z1 + z2 * Tau ; //ok
278
279 G4double p1 = ParWC1+ParWC2*Z; //ok
280 G4double p2 = ParWC3+ParWC4*Z; //ok
281 G4double p3 = ParWC5+ParWC6*std::log(Energy/GeV); //ok
282
283 WeightCore = p1 * std::exp( (p2-Tau)/p3 - std::exp( (p2-Tau) /p3) ); //ok
284
285 G4double k1 = ParRT1+ParRT2*Z; // ok
286 G4double k2 = ParRT3; // ok
287 G4double k3 = ParRT4; // ok
288 G4double k4 = ParRT5+ParRT6* std::log(Energy/GeV); // ok
289
290 RadiusTail = k1*(std::exp(k3*(Tau-k2)) +
291 std::exp(k4*(Tau-k2)) ); //ok
292}
293
295GenerateExponential(const G4double /* Energy */ )
296{
297 G4double ParExp1 = 9./7.*X0;
298 G4double random = -ParExp1*CLHEP::RandExponential::shoot() ;
299 return random;
300}
@ FatalException
double G4double
Definition: G4Types.hh:64
float G4float
Definition: G4Types.hh:65
int G4int
Definition: G4Types.hh:66
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
#define G4UniformRand()
Definition: Randomize.hh:53
G4double GetDensity() const
Definition: G4Material.hh:179
G4double GetRadlen() const
Definition: G4Material.hh:219
G4double ComputeTau(G4double LongitudinalPosition)
G4double IntegrateEneLongitudinal(G4double LongitudinalStep)
GFlashHomoShowerParameterisation(G4Material *aMat, GVFlashHomoShowerTuning *aPar=0)
G4double GenerateRadius(G4int ispot, G4double Energy, G4double LongitudinalPosition)
G4double IntegrateNspLongitudinal(G4double LongitudinalStep)
void ComputeRadialParameters(G4double y, G4double Tau)
G4double GetEffZ(const G4Material *material)
G4double GetEffA(const G4Material *material)
G4double gam(G4double x, G4double a) const
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
#define DBL_MAX
Definition: templates.hh:83