Geant4 10.7.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
GFlashSamplingShowerParameterisation.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//
27//
28// ------------------------------------------------------------
29// GEANT 4 class implementation
30//
31// ------- GFlashSamplingShowerParameterisation -------
32//
33// Authors: E.Barberio & Joanna Weng - 11.2005
34// ------------------------------------------------------------
35
36#include <cmath>
37
40#include "G4SystemOfUnits.hh"
41#include "Randomize.hh"
42#include "G4ios.hh"
43#include "G4Material.hh"
44#include "G4MaterialTable.hh"
45
48 G4double dd1, G4double dd2,
51 ParAveT2(0.), ParSigLogT1(0.), ParSigLogT2(0.),
52 ParSigLogA1(0.), ParSigLogA2(0.), ParRho1(0.), ParRho2(0.), ParsAveA2(0.),
53 AveLogAlphah(0.), AveLogTmaxh(0.), SigmaLogAlphah(0.), SigmaLogTmaxh(0.),
54 Rhoh(0.), Alphah(0.), Tmaxh(0.), Betah(0.), AveLogAlpha(0.), AveLogTmax(0.),
55 SigmaLogAlpha(0.), SigmaLogTmax(0.), Rho(0.), Alpha(0.), Tmax(0.), Beta(0.)
56{
57 if(!aPar) {
58 thePar = new GFlashSamplingShowerTuning;
59 } else {
60 thePar = aPar;
61 }
62
63 SetMaterial(aMat1,aMat2 );
64 d1=dd1;
65 d2=dd2;
66
67 // Longitudinal Coefficients for a homogenious calo
68
69 // shower max
70 ParAveT1 = thePar->ParAveT1(); // ln (ln y -0.812)
71 ParAveA1 = thePar->ParAveA1(); // ln a (0.81 + (0.458 + 2.26/Z)ln y)
72 ParAveA2 = thePar->ParAveA2();
73 ParAveA3 = thePar->ParAveA3();
74 // Sampling
75 ParsAveT1 = thePar->ParsAveT1(); // T_sam = log(exp( log T_hom) + t1*Fs-1 + t2*(1-ehat));
76 ParsAveT2 = thePar->ParsAveT2();
77 ParsAveA1 = thePar->ParsAveA1();
78 // Variance of shower max sampling
79 ParsSigLogT1 = thePar->ParSigLogT1(); // Sigma T1 (-2.5 + 1.25 ln y)**-1
80 ParsSigLogT2 = thePar->ParSigLogT2();
81 // variance of 'alpha'
82 ParsSigLogA1 = thePar->ParSigLogA1(); // Sigma a (-0.82 + 0.79 ln y)**-1
83 ParsSigLogA2 = thePar->ParSigLogA2();
84 // correlation alpha%T
85 ParsRho1 = thePar->ParRho1(); // Rho = 0.784 -0.023 ln y
86 ParsRho2 = 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 ParRC1 = thePar->ParRC1(); // z_1 = 0.0251 + 0.00319 ln E
92 ParRC2 = thePar->ParRC2();
93 ParRC3 = thePar->ParRC3(); // z_2 = 0.1162 + - 0.000381 Z
94 ParRC4 = thePar->ParRC4();
95
96 ParWC1 = thePar->ParWC1();
97 ParWC2 = thePar->ParWC2();
98 ParWC3 = thePar->ParWC3();
99 ParWC4 = thePar->ParWC4();
100 ParWC5 = thePar->ParWC5();
101 ParWC6 = thePar->ParWC6();
102 ParRT1 = thePar->ParRT1();
103 ParRT2 = thePar->ParRT2();
104 ParRT3 = thePar->ParRT3();
105 ParRT4 = thePar->ParRT4();
106 ParRT5 = thePar->ParRT5();
107 ParRT6 = thePar->ParRT6();
108
109 //additional sampling parameter
110 ParsRC1= thePar->ParsRC1();
111 ParsRC2= thePar->ParsRC2();
112 ParsWC1= thePar->ParsWC1();
113 ParsWC2= thePar->ParsWC2();
114 ParsRT1= thePar->ParsRT1();
115 ParsRT2= thePar->ParsRT2();
116
117 // Coeff for fluctuedted radial profiles for a sampling media
118 ParsSpotT1 = thePar->ParSpotT1(); // T_spot = T_hom =(0.698 + 0.00212)
119 ParsSpotT2 = thePar->ParSpotT2();
120 ParsSpotA1 = thePar->ParSpotA1(); // a_spot= a_hom (0.639 + 0.00334)
121 ParsSpotA2 = thePar->ParSpotA2();
122 ParsSpotN1 = thePar->ParSpotN1(); // N_Spot 93 * ln(Z) E ** 0.876
123 ParsSpotN2 = thePar->ParSpotN2();
124 SamplingResolution = thePar->SamplingResolution();
125 ConstantResolution = thePar->ConstantResolution();
126 NoiseResolution = thePar->NoiseResolution();
127
128 // Inits
129 NSpot = 0.00;
130 AlphaNSpot = 0.00;
131 TNSpot = 0.00;
132 BetaNSpot = 0.00;
133 RadiusCore = 0.00;
134 WeightCore = 0.00;
135 RadiusTail = 0.00;
137
138 G4cout << "/********************************************/ " << G4endl;
139 G4cout << " - GFlashSamplingShowerParameterisation::Constructor - " << G4endl;
140 G4cout << "/********************************************/ " << G4endl;
141}
142
143// ------------------------------------------------------------
144
146{
147 delete thePar;
148}
149
150// ------------------------------------------------------------
151
154{
155 G4double Es = 21*MeV;
156 material1= mat1;
157 Z1 = GetEffZ(material1);
158 A1 = GetEffA(material1);
159 density1 = material1->GetDensity();
160 X01 = material1->GetRadlen();
161 Ec1 = 2.66 * std::pow((X01 * Z1 / A1),1.1);
162 Rm1 = X01*Es/Ec1;
163
164 material2= mat2;
165 Z2 = GetEffZ(material2);
166 A2 = GetEffA(material2);
167 density2 = material2->GetDensity();
168 X02 = material2->GetRadlen();
169 Ec2 = 2.66 * std::pow((X02 * Z2 / A2),1.1);
170 Rm2 = X02*Es/Ec2;
171 // PrintMaterial();
172}
173
174// ------------------------------------------------------------
175
177{
178 G4cout << "/************ ComputeZAX0EFFetc ************/" << G4endl;
179 G4cout << " - GFlashSamplingShowerParameterisation::Material - " << G4endl;
180
181 G4double Es = 21*MeV; //constant
182
183 // material and geometry parameters for a sampling calorimeter
184 G4double denominator = (d1*density1 + d2*density2);
185 G4double W1 = (d1*density1) / denominator;
186 G4double W2 = (d2*density2) / denominator;
187 Zeff = ( W1*Z1 ) + ( W2*Z2 ); //X0*Es/Ec;
188 Aeff = ( W1*A1 ) + ( W2*A2 );
189 Rhoeff = ( (d1 *density1 ) + (d2 * density2 ))/G4double (d2 + d1 );
190 X0eff = (W1 * Rhoeff) / (X01 * density1) + (W2 * Rhoeff) / (X02 * density2 );
191 X0eff = 1./ X0eff;
192 Rmeff = 1/ ((((W1*Ec1)/ X01) + ((W2* Ec2)/ X02) ) / Es ) ;
193 Eceff = X0eff *((W1*Ec1)/ X01 + (W2* Ec2)/ X02 );
194 Fs = X0eff/G4double ((d1/mm )+(d2/mm) );
195 ehat = (1. / (1+ 0.007*(Z1- Z2)));
196
197 G4cout << "W1= " << W1 << G4endl;
198 G4cout << "W2= " << W2 << G4endl;
199 G4cout << "effective quantities Zeff = "<<Zeff<< G4endl;
200 G4cout << "effective quantities Aeff = "<<Aeff<< G4endl;
201 G4cout << "effective quantities Rhoeff = "<<Rhoeff/g *cm3<<" g/cm3" << G4endl;
202 G4cout << "effective quantities X0eff = "<<X0eff/cm <<" cm" << G4endl;
203
204 X0eff = X0eff * Rhoeff;
205
206 G4cout << "effective quantities X0eff = "<<X0eff/g*cm2 <<" g/cm2" << G4endl;
207 X0eff = X0eff /Rhoeff;
208 G4cout << "effective quantities RMeff = "<<Rmeff/cm<<" cm" << G4endl;
209 Rmeff = Rmeff* Rhoeff;
210 G4cout << "effective quantities RMeff = "<<Rmeff/g *cm2<<" g/cm2" << G4endl;
211 Rmeff = Rmeff/ Rhoeff;
212 G4cout << "effective quantities Eceff = "<<Eceff/MeV<< " MeV"<< G4endl;
213 G4cout << "effective quantities Fs = "<<Fs<<G4endl;
214 G4cout << "effective quantities ehat = "<<ehat<<G4endl;
215 G4cout << "/********************************************/ " <<G4endl;
216}
217
218// ------------------------------------------------------------
219
222{
223 if ((material1==0) || (material2 ==0))
224 {
225 G4Exception("GFlashSamplingShowerParameterisation::GenerateLongitudinalProfile()",
226 "InvalidSetup", FatalException, "No material initialized!");
227 }
228 G4double y = Energy/Eceff;
229 ComputeLongitudinalParameters(y);
230 GenerateEnergyProfile(y);
231 GenerateNSpotProfile(y);
232}
233
234// ------------------------------------------------------------
235
236void
237GFlashSamplingShowerParameterisation::ComputeLongitudinalParameters(G4double y)
238{
239 AveLogTmaxh = std::log(std::max(ParAveT1 +std::log(y),0.1)); //ok
240 AveLogAlphah = std::log(std::max(ParAveA1 + (ParAveA2+ParAveA3/Zeff)*std::log(y),.1)); //ok
241 //hom
242 SigmaLogTmaxh = std::min(0.5,1.00/( ParSigLogT1 + ParSigLogT2*std::log(y)) ); //ok
243 SigmaLogAlphah = std::min(0.5,1.00/( ParSigLogA1 + ParSigLogA2*std::log(y))); //ok
244 Rhoh = ParRho1+ParRho2*std::log(y);//ok
245 // if sampling
246 AveLogTmax = std::max(0.1,std::log(std::exp(AveLogTmaxh)
247 + ParsAveT1/Fs + ParsAveT2*(1-ehat))); //ok
248 AveLogAlpha = std::max(0.1,std::log(std::exp(AveLogAlphah)
249 + (ParsAveA1/Fs))); //ok
250 //
251 SigmaLogTmax = std::min(0.5,1.00/( ParsSigLogT1
252 + ParsSigLogT2*std::log(y)) ); //ok
253 SigmaLogAlpha = std::min(0.5,1.00/( ParsSigLogA1
254 + ParsSigLogA2*std::log(y))); //ok
255 Rho = ParsRho1+ParsRho2*std::log(y); //ok
256}
257
258// ------------------------------------------------------------
259
260void GFlashSamplingShowerParameterisation::GenerateEnergyProfile(G4double /* y */)
261{
262 G4double Correlation1 = std::sqrt((1+Rho)/2);
263 G4double Correlation2 = std::sqrt((1-Rho)/2);
264 G4double Correlation1h = std::sqrt((1+Rhoh)/2);
265 G4double Correlation2h = std::sqrt((1-Rhoh)/2);
266 G4double Random1 = G4RandGauss::shoot();
267 G4double Random2 = G4RandGauss::shoot();
268
269 Tmax = std::max(1.,std::exp( AveLogTmax + SigmaLogTmax *
270 (Correlation1*Random1 + Correlation2*Random2) ));
271 Alpha = std::max(1.1,std::exp( AveLogAlpha + SigmaLogAlpha *
272 (Correlation1*Random1 - Correlation2*Random2) ));
273 Beta = (Alpha-1.00)/Tmax;
274 //Parameters for Enenrgy Profile including correaltion and sigmas
275 Tmaxh = std::exp( AveLogTmaxh + SigmaLogTmaxh *
276 (Correlation1h*Random1 + Correlation2h*Random2) );
277 Alphah = std::exp( AveLogAlphah + SigmaLogAlphah *
278 (Correlation1h*Random1 - Correlation2h*Random2) );
279 Betah = (Alphah-1.00)/Tmaxh;
280}
281
282// ------------------------------------------------------------
283
284void GFlashSamplingShowerParameterisation::GenerateNSpotProfile(const G4double y)
285{
286 TNSpot = Tmaxh * (ParsSpotT1+ParsSpotT2*Zeff); //ok.
287 TNSpot = std::max(0.5,Tmaxh * (ParsSpotT1+ParsSpotT2*Zeff));
288 AlphaNSpot = Alphah * (ParsSpotA1+ParsSpotA2*Zeff);
289 BetaNSpot = (AlphaNSpot-1.00)/TNSpot; // ok
290 NSpot = ParsSpotN1 /SamplingResolution * std::pow(y*Eceff/GeV,ParsSpotN2 );
291}
292
293// ------------------------------------------------------------
294
297ApplySampling(const G4double DEne, const G4double )
298{
299 G4double DEneFluctuated = DEne;
300 G4double Resolution = std::pow(SamplingResolution,2);
301
302 // +pow(NoiseResolution,2)/ //@@@@@@@@ FIXME
303 // Energy*(1.*MeV)+
304 // pow(ConstantResolution,2)*
305 // Energy/(1.*MeV);
306
307 if(Resolution >0.0 && DEne > 0.00)
308 {
309 G4float x1=DEne/Resolution;
310 G4float x2 = G4RandGamma::shoot(x1, 1.0)*Resolution;
311 DEneFluctuated=x2;
312 }
313 return DEneFluctuated;
314}
315
316// ------------------------------------------------------------
317
319IntegrateEneLongitudinal(G4double LongitudinalStep)
320{
321 G4double LongitudinalStepInX0 = LongitudinalStep / X0eff;
322 G4float x1= Betah*LongitudinalStepInX0;
323 G4float x2= Alphah;
324 float x3 = gam(x1,x2);
325 G4double DEne=x3;
326 return DEne;
327}
328
329// ------------------------------------------------------------
330
332IntegrateNspLongitudinal(G4double LongitudinalStep)
333{
334 G4double LongitudinalStepInX0 = LongitudinalStep / X0eff;
335 G4float x1 = BetaNSpot*LongitudinalStepInX0;
336 G4float x2 = AlphaNSpot;
337 G4float x3 = gam(x1,x2);
338 G4double DNsp = x3;
339 return DNsp;
340}
341
342// ------------------------------------------------------------
343
345GenerateRadius(G4int ispot, G4double Energy, G4double LongitudinalPosition)
346{
347 if(ispot < 1)
348 {
349 // Determine lateral parameters in the middle of the step.
350 // They depend on energy & position along step
351 //
352 G4double Tau = ComputeTau(LongitudinalPosition);
353 ComputeRadialParameters(Energy,Tau);
354 }
355
356 G4double Radius;
357 G4double Random1 = G4UniformRand();
358 G4double Random2 = G4UniformRand();
359 if(Random1 <WeightCore) //WeightCore = p < w_i
360 {
361 Radius = Rmeff * RadiusCore * std::sqrt( Random2/(1. - Random2) );
362 }
363 else
364 {
365 Radius = Rmeff * RadiusTail * std::sqrt( Random2/(1. - Random2) );
366 }
367 Radius = std::min(Radius,DBL_MAX);
368 return Radius;
369}
370
371// ------------------------------------------------------------
372
375ComputeTau(G4double LongitudinalPosition)
376{
377 G4double tau = LongitudinalPosition / Tmax/ X0eff //<t> = T* a /(a - 1)
378 * (Alpha-1.00) /Alpha
379 * std::exp(AveLogAlpha)/(std::exp(AveLogAlpha)-1.); //ok
380 return tau;
381}
382
383// ------------------------------------------------------------
384
387{
388 G4double z1 = ParRC1 + ParRC2* std::log(Energy/GeV); //ok
389 G4double z2 = ParRC3+ParRC4*Zeff; //ok
390 RadiusCore = z1 + z2 * Tau; //ok
391 G4double p1 = ParWC1+ParWC2*Zeff; //ok
392 G4double p2 = ParWC3+ParWC4*Zeff; //ok
393 G4double p3 = ParWC5+ParWC6*std::log(Energy/GeV); //ok
394 WeightCore = p1 * std::exp( (p2-Tau)/p3- std::exp( (p2-Tau) /p3) ); //ok
395
396 G4double k1 = ParRT1+ParRT2*Zeff; // ok
397 G4double k2 = ParRT3; // ok
398 G4double k3 = ParRT4; // ok
399 G4double k4 = ParRT5+ParRT6* std::log(Energy/GeV); // ok
400
401 RadiusTail = k1*(std::exp(k3*(Tau-k2))
402 + std::exp(k4*(Tau-k2)) ); //ok
403
404 // sampling calorimeter
405
406 RadiusCore = RadiusCore + ParsRC1*(1-ehat) + ParsRC2/Fs*std::exp(-Tau); //ok
407 WeightCore = WeightCore + (1-ehat)
408 * (ParsWC1+ParsWC2/Fs * std::exp(-std::pow((Tau-1.),2))); //ok
409 RadiusTail = RadiusTail + (1-ehat)* ParsRT1+ ParsRT2/Fs *std::exp(-Tau); //ok
410}
411
412// ------------------------------------------------------------
413
415GenerateExponential(const G4double /* Energy */ )
416{
417 G4double ParExp1 = 9./7.*X0eff;
418 G4double random = -ParExp1*G4RandExponential::shoot() ;
419 return random;
420}
@ FatalException
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.cc:35
float G4float
Definition: G4Types.hh:84
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
#define G4UniformRand()
Definition: Randomize.hh:52
G4double GetDensity() const
Definition: G4Material.hh:178
G4double GetRadlen() const
Definition: G4Material.hh:218
G4double GenerateRadius(G4int ispot, G4double Energy, G4double LongitudinalPosition)
GFlashSamplingShowerParameterisation(G4Material *aMat1, G4Material *aMat2, G4double d1, G4double d2, GFlashSamplingShowerTuning *aPar=0)
G4double ApplySampling(const G4double DEne, const G4double Energy)
G4double IntegrateNspLongitudinal(G4double LongitudinalStep)
G4double IntegrateEneLongitudinal(G4double LongitudinalStep)
G4double ComputeTau(G4double LongitudinalPosition)
void SetMaterial(G4Material *mat1, G4Material *mat2)
G4double GetEffZ(const G4Material *material)
G4double GetEffA(const G4Material *material)
G4double gam(G4double x, G4double a) const
#define DBL_MAX
Definition: templates.hh:62