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*Z1 ) + ( W2*Z2 );
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 );
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);
234 GFlashSamplingShowerParameterisation::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);
257 void 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);
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;
281 void 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) );
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;
391 WeightCore = p1 * std::exp( (p2-Tau)/p3- std::exp( (p2-Tau) /p3) );
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);
G4double GetEffZ(const G4Material *material)
virtual G4double ParSigLogA2()
ThreeVector shoot(const G4int Ap, const G4int Af)
virtual G4double ParSpotN2()
virtual G4double ParSpotT1()
static constexpr double mm
GFlashSamplingShowerParameterisation(G4Material *aMat1, G4Material *aMat2, G4double d1, G4double d2, GFlashSamplingShowerTuning *aPar=0)
virtual G4double ParRho1()
virtual G4double ParWC1()
static constexpr double cm2
~GFlashSamplingShowerParameterisation()
virtual G4double ParAveA2()
G4double GetDensity() const
virtual G4double ParRho2()
G4double IntegrateEneLongitudinal(G4double LongitudinalStep)
virtual G4double ParRT3()
virtual G4double ParWC3()
G4double GenerateRadius(G4int ispot, G4double Energy, G4double LongitudinalPosition)
virtual G4double ParSigLogT1()
virtual G4double ParRT6()
virtual G4double ParRT5()
G4double ComputeTau(G4double LongitudinalPosition)
virtual G4double ParAveA1()
G4GLOB_DLL std::ostream G4cout
virtual G4double ParRT1()
virtual G4double ParSigLogA1()
static constexpr double cm
virtual G4double ParSigLogT2()
G4double SamplingResolution()
G4double GenerateExponential(G4double Energy)
G4double NoiseResolution()
virtual G4double ParRT2()
G4double GetRadlen() const
static constexpr double cm3
virtual G4double ParSpotA1()
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
virtual G4double ParWC6()
G4double ApplySampling(const G4double DEne, const G4double Energy)
virtual G4double ParWC2()
virtual G4double ParSpotA2()
virtual G4double ParAveA3()
T max(const T t1, const T t2)
brief Return the largest of the two arguments
G4double ConstantResolution()
G4double gam(G4double x, G4double a) const
T min(const T t1, const T t2)
brief Return the smallest of the two arguments
static constexpr double GeV
void SetMaterial(G4Material *mat1, G4Material *mat2)
virtual G4double ParWC4()
static constexpr double MeV
G4double GetEffA(const G4Material *material)
virtual G4double ParSpotN1()
virtual G4double ParRC2()
virtual G4double ParAveT1()
virtual G4double ParRC4()
virtual G4double ParRC3()
virtual G4double ParSpotT2()
virtual G4double ParRT4()
void GenerateLongitudinalProfile(G4double Energy)
virtual G4double ParRC1()
G4double IntegrateNspLongitudinal(G4double LongitudinalStep)
virtual G4double ParWC5()
void ComputeRadialParameters(G4double y, G4double Tau)