52 ParAveT2(0.), ParSigLogT1(0.), ParSigLogT2(0.),
53 ParSigLogA1(0.), ParSigLogA2(0.), ParRho1(0.), ParRho2(0.), ParsAveA2(0.),
54 AveLogAlphah(0.), AveLogTmaxh(0.), SigmaLogAlphah(0.), SigmaLogTmaxh(0.),
55 Rhoh(0.), Alphah(0.), Tmaxh(0.), Betah(0.), AveLogAlpha(0.), AveLogTmax(0.),
56 SigmaLogAlpha(0.), SigmaLogTmax(0.), Rho(0.),
Alpha(0.), Tmax(0.), Beta(0.)
59 else { thePar = aPar; owning =
false; }
100 ParRT1 = thePar->
ParRT1();
101 ParRT2 = thePar->
ParRT2();
102 ParRT3 = thePar->
ParRT3();
103 ParRT4 = thePar->
ParRT4();
104 ParRT5 = thePar->
ParRT5();
105 ParRT6 = thePar->
ParRT6();
136 G4cout <<
"/********************************************/ " <<
G4endl;
137 G4cout <<
" - GFlashSamplingShowerParameterisation::Constructor - " <<
G4endl;
138 G4cout <<
"/********************************************/ " <<
G4endl;
145 if(owning) {
delete thePar; }
159 Ec1 = 2.66 * std::pow((X01 * Z1 / A1),1.1);
167 Ec2 = 2.66 * std::pow((X02 * Z2 / A2),1.1);
176 G4cout <<
"/************ ComputeZAX0EFFetc ************/" <<
G4endl;
177 G4cout <<
" - GFlashSamplingShowerParameterisation::Material - " <<
G4endl;
182 G4double denominator = (d1*density1 + d2*density2);
183 G4double W1 = (d1*density1) / denominator;
184 G4double W2 = (d2*density2)/denominator;
185 Zeff = ( W1*Z2 ) + (W2*Z1);
186 Aeff = ( W1*A1 ) + (W2*A2);
187 X0eff =(1/ (( W1 / X01) +( W2 / X02)));
188 Rhoeff = ( (d1 *density1 ) + (d2 * density2 ))/
G4double (d2 + d1 );
189 Rmeff = 1/ ((((W1*Ec1)/ X01) + ((W2* Ec2)/ X02) ) / Es ) ;
190 Eceff = X0eff *((W1*Ec1)/ X01 + (W2* Ec2)/ X02 );
191 Fs = X0eff/
G4double ((d1/mm )+(d2/mm) );
192 ehat = (1. / (1+ 0.007*(Z1- Z2)));
196 G4cout <<
"effective quantities Zeff = "<<Zeff<<
G4endl;
197 G4cout <<
"effective quantities Aeff = "<<Aeff<<
G4endl;
198 G4cout <<
"effective quantities Rhoeff = "<<Rhoeff/g *cm3<<
" g/cm3" <<
G4endl;
199 G4cout <<
"effective quantities X0eff = "<<X0eff/cm <<
" cm" <<
G4endl;
201 X0eff = X0eff * Rhoeff;
203 G4cout <<
"effective quantities X0eff = "<<X0eff/g*cm2 <<
" g/cm2" <<
G4endl;
204 X0eff = X0eff /Rhoeff;
205 G4cout <<
"effective quantities RMeff = "<<Rmeff/cm<<
" cm" <<
G4endl;
206 Rmeff = Rmeff* Rhoeff;
207 G4cout <<
"effective quantities RMeff = "<<Rmeff/g *cm2<<
" g/cm2" <<
G4endl;
208 Rmeff = Rmeff/ Rhoeff;
209 G4cout <<
"effective quantities Eceff = "<<Eceff/MeV<<
" MeV"<<
G4endl;
212 G4cout <<
"/********************************************/ " <<
G4endl;
220 if ((material1==0) || (material2 ==0))
222 G4Exception(
"GFlashSamplingShowerParameterisation::GenerateLongitudinalProfile()",
226 ComputeLongitudinalParameters(y);
227 GenerateEnergyProfile(y);
228 GenerateNSpotProfile(y);
234GFlashSamplingShowerParameterisation::ComputeLongitudinalParameters(
G4double y)
236 AveLogTmaxh = std::log(std::max(ParAveT1 +std::log(y),0.1));
237 AveLogAlphah = std::log(std::max(ParAveA1 + (ParAveA2+ParAveA3/Zeff)*std::log(y),.1));
239 SigmaLogTmaxh = std::min(0.5,1.00/( ParSigLogT1 + ParSigLogT2*std::log(y)) );
240 SigmaLogAlphah = std::min(0.5,1.00/( ParSigLogA1 + ParSigLogA2*std::log(y)));
241 Rhoh = ParRho1+ParRho2*std::log(y);
243 AveLogTmax = std::max(0.1,std::log(std::exp(AveLogTmaxh)
244 + ParsAveT1/Fs + ParsAveT2*(1-ehat)));
245 AveLogAlpha = std::max(0.1,std::log(std::exp(AveLogAlphah)
248 SigmaLogTmax = std::min(0.5,1.00/( ParsSigLogT1
249 + ParsSigLogT2*std::log(y)) );
250 SigmaLogAlpha = std::min(0.5,1.00/( ParsSigLogA1
251 + ParsSigLogA2*std::log(y)));
252 Rho = ParsRho1+ParsRho2*std::log(y);
257void GFlashSamplingShowerParameterisation::GenerateEnergyProfile(
G4double )
259 G4double Correlation1 = std::sqrt((1+Rho)/2);
260 G4double Correlation2 = std::sqrt((1-Rho)/2);
261 G4double Correlation1h = std::sqrt((1+Rhoh)/2);
262 G4double Correlation2h = std::sqrt((1-Rhoh)/2);
263 G4double Random1 = G4RandGauss::shoot();
264 G4double Random2 = G4RandGauss::shoot();
266 Tmax = std::max(1.,std::exp( AveLogTmax + SigmaLogTmax *
267 (Correlation1*Random1 + Correlation2*Random2) ));
268 Alpha = std::max(1.1,std::exp( AveLogAlpha + SigmaLogAlpha *
269 (Correlation1*Random1 - Correlation2*Random2) ));
270 Beta = (Alpha-1.00)/Tmax;
272 Tmaxh = std::exp( AveLogTmaxh + SigmaLogTmaxh *
273 (Correlation1h*Random1 + Correlation2h*Random2) );
274 Alphah = std::exp( AveLogAlphah + SigmaLogAlphah *
275 (Correlation1h*Random1 - Correlation2h*Random2) );
276 Betah = (Alphah-1.00)/Tmaxh;
281void GFlashSamplingShowerParameterisation::GenerateNSpotProfile(
const G4double y)
283 TNSpot = Tmaxh * (ParsSpotT1+ParsSpotT2*Zeff);
284 TNSpot = std::max(0.5,Tmaxh * (ParsSpotT1+ParsSpotT2*Zeff));
285 AlphaNSpot = Alphah * (ParsSpotA1+ParsSpotA2*Zeff);
286 BetaNSpot = (AlphaNSpot-1.00)/TNSpot;
287 NSpot = ParsSpotN1 /SamplingResolution * std::pow(y*Eceff/GeV,ParsSpotN2 );
297 G4double Resolution = std::pow(SamplingResolution,2);
304 if(Resolution >0.0 && DEne > 0.00)
310 return DEneFluctuated;
318 G4double LongitudinalStepInX0 = LongitudinalStep / X0eff;
319 G4float x1= Betah*LongitudinalStepInX0;
321 float x3 =
gam(x1,x2);
331 G4double LongitudinalStepInX0 = LongitudinalStep / X0eff;
332 G4float x1 = BetaNSpot*LongitudinalStepInX0;
356 if(Random1 <WeightCore)
358 Radius = Rmeff * RadiusCore * std::sqrt( Random2/(1. - Random2) );
362 Radius = Rmeff * RadiusTail * std::sqrt( Random2/(1. - Random2) );
364 Radius = std::min(Radius,
DBL_MAX);
374 G4double tau = LongitudinalPosition / Tmax/ X0eff
375 * (Alpha-1.00) /Alpha
376 * std::exp(AveLogAlpha)/(std::exp(AveLogAlpha)-1.);
385 G4double z1 = ParRC1 + ParRC2* std::log(Energy/GeV);
387 RadiusCore = z1 + z2 * Tau;
390 G4double p3 = ParWC5+ParWC6*std::log(Energy/GeV);
391 WeightCore = p1 * std::exp( (p2-Tau)/p3- std::exp( (p2-Tau) /p3) );
396 G4double k4 = ParRT5+ParRT6* std::log(Energy/GeV);
398 RadiusTail = k1*(std::exp(k3*(Tau-k2))
399 + std::exp(k4*(Tau-k2)) );
403 RadiusCore = RadiusCore + ParsRC1*(1-ehat) + ParsRC2/Fs*std::exp(-Tau);
404 WeightCore = WeightCore + (1-ehat)
405 * (ParsWC1+ParsWC2/Fs * std::exp(-std::pow((Tau-1.),2)));
406 RadiusTail = RadiusTail + (1-ehat)* ParsRT1+ ParsRT2/Fs *std::exp(-Tau);
G4DLLIMPORT std::ostream G4cout
G4double GetDensity() const
G4double GetRadlen() const
G4double GenerateRadius(G4int ispot, G4double Energy, G4double LongitudinalPosition)
~GFlashSamplingShowerParameterisation()
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 GenerateExponential(G4double Energy)
G4double ComputeTau(G4double LongitudinalPosition)
void SetMaterial(G4Material *mat1, G4Material *mat2)
void GenerateLongitudinalProfile(G4double Energy)
void ComputeRadialParameters(G4double y, G4double Tau)
G4double ConstantResolution()
G4double NoiseResolution()
G4double SamplingResolution()
virtual G4double ParSigLogT1()
virtual G4double ParRT1()
virtual G4double ParRT4()
virtual G4double ParAveA1()
virtual G4double ParSigLogA2()
virtual G4double ParRC2()
virtual G4double ParWC1()
virtual G4double ParRC4()
virtual G4double ParAveT1()
virtual G4double ParSpotN2()
virtual G4double ParWC4()
virtual G4double ParRho2()
virtual G4double ParWC6()
virtual G4double ParWC3()
virtual G4double ParSpotA1()
virtual G4double ParSpotA2()
virtual G4double ParSpotT2()
virtual G4double ParRT2()
virtual G4double ParRT6()
virtual G4double ParRC3()
virtual G4double ParAveA3()
virtual G4double ParSpotT1()
virtual G4double ParSigLogT2()
virtual G4double ParWC2()
virtual G4double ParSigLogA1()
virtual G4double ParRT5()
virtual G4double ParAveA2()
virtual G4double ParSpotN1()
virtual G4double ParWC5()
virtual G4double ParRC1()
virtual G4double ParRho1()
virtual G4double ParRT3()
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)