24 using namespace UnivParamNS;
29 if (DetectorType < 0 || DetectorType > 2) {
30 printf(
"UnivParam: Wrong Detector Type %d \n", DetectorType);
41 int icomp = int(parDX[
nParDX - 1]);
43 double Sref0 = parDX[0];
44 double fS_e = parDX[1];
45 double Sref = Sref0 *
pow(10., (logE - 19.) * fS_e);
47 double DXmax = parDX[2] ;
50 double fL_e = parDX[4];
51 double lambda = L0 * (1. + (logE - 19.) * fL_e) ;
53 double DX0 = parDX[5];
55 if (x < DX0) val = 0.;
56 else val = Sref *
pow((x - DX0) / (
DXref[icomp] - DX0), (DXmax - DX0) / lambda) * exp((
DXref[icomp] - x) / lambda);
90 for (
int ipar = 0; ipar < 4; ipar++) par[ipar] =
RFuncPar(icomp, iparDX, ipar);
91 return RFunc(r, icomp, iparDX , par);
98 double r_meter = r / 1.e2;
100 if (iparDX == (
nParDX - 1))
108 return par[0] *
pow(r_meter / 1000., -par[1]) *
pow((par[3] + r_meter) / (par[3] + 1000.), -par[2]);
112 else if (iparDX == 1) {
114 return par[0] + exp(-r_meter / 500.) * par[1];
120 else if (iparDX == 2) {
123 double rmax = par[1];
124 double rlambda = par[2];
126 if (rmax < r0 || rlambda < 0.)
130 return max *
pow((r_meter - r0) / (rmax - r0), (rmax - r0) / rlambda) * exp((rmax - r_meter) / rlambda);
134 return par[0] + par[1] *
pow(r_meter / 1000., par[2]);
139 else if (iparDX == 3) {
141 return par[0] + r_meter / 1000.*par[1] - par[2] * exp(-r_meter / 150.);
143 return par[0] + r_meter / 1000.*par[1];
145 return par[0] + par[1] * exp(par[2] * r_meter / 1000.);
150 else if (iparDX == 4) {
152 if (icomp == 1)
return par[0] + r_meter / 1000.*par[1];
158 else if (iparDX == 5)
181 for (
int iparDX = 0; iparDX <
nParDX; iparDX++)
182 parDX[iparDX] =
RFunc(r, icomp, iparDX);
184 double S0 =
DXFunc(DX, logE, parDX);
190 if (icomp < 0 || icomp > 3)
return 0.;
194 double val =
GetS0(r, DX, logE, icomp);
198 return val * (1. + (Nmu - 1.) * alpha);
202 double UnivParam::GetSignal(
double r,
double Xmax_Edep ,
double logE,
double theta,
double psi,
double rhoGround,
double hGround,
double Nmu,
int icomp0,
int iatm)
205 if (isnan(Xmax_Edep) || Xmax_Edep < 0.)
return 0.;
210 if (rhoGround < 0.) rhoGround = fatm.
GetDensity(hGround);
213 for (
int icomp = 0; icomp < 4; icomp++)
216 return GetSignal(r, DX, logE, theta, psi, rhoGround, hGround, Nmu, icomp0);
220 double UnivParam::GetSignal(
double r,
double* DX ,
double logE,
double theta,
double psi,
double rhoGround,
double hGround,
double Nmu,
int icomp0)
231 if (isnan(r) || isnan(logE) || isnan(theta) || isnan(Nmu))
return 0;
232 if (icomp0 < -1 || icomp0 > 3)
return 0.;
233 if (
fDetectorType == 2 && !(icomp0 == 0 || icomp0 == -1))
return 0.;
234 if (hGround <= 0.)
return 0.;
235 if (rhoGround <= 0.)
return 0.;
237 if (Nmu < 0.) Nmu = 0.;
238 if (Nmu > 3.5) Nmu = 3.5;
241 if (theta > 65 * M_PI / 180.) theta = 65.*M_PI / 180.;
248 for (
int icomp = 0; icomp < 4; icomp++) {
249 if (!(icomp == icomp0 || icomp0 == -1))
continue;
252 double DX0 =
RFunc(r, icomp, 5);
253 if (DX[icomp] <= DX0)
continue;
256 double S0 =
GetS0(r, DX[icomp], logE, icomp , Nmu) ;
257 double S = S0 * fgeom.
GetGeomAsym(DX[icomp], r, theta, psi, icomp)
267 double UnivParam::GetLogE(
double vem,
double r,
double Xmax_Edep ,
double theta,
double psi,
double rhoGround,
double hGround,
double Nmu,
int iatm)
270 double vemG =
GetSignal(r, Xmax_Edep, logE, theta, psi, rhoGround, hGround, Nmu, -1, iatm);
271 if (vem < vemG)
return logE;
274 while (fabs(vem / vemG - 1.) > 0.0001) {
275 if (vem > vemG) logE += dlogE;
280 vemG =
GetSignal(r, Xmax_Edep, logE, theta, psi, rhoGround, hGround, Nmu, -1, iatm);
287 if (icomp == 0 || icomp == 2)
return 1.;
288 else if (icomp == 1)
return -0.075;
289 else if (icomp == 3) {
290 double r_meter = r / 1.e2;
291 double alpha0 = 1.12, alpha1 = 1.25, B = 6.;
293 double C = (alpha1 - alpha0) / (exp(-B) - 1.0);
294 double A = alpha0 - C;
296 return A + C * exp(-B * r_meter / 1.e3);
const double parDX0_MD[4][4]
const bool UseDiffusive[4]
const double parSref_Scin[4][4]
const double parSref_WCD[4][4]
double GetGeomAsym(double DX, double r, double theta, double psi, int icomp)
const double parGamma_Scin[4][4]
const double parSref_MD[4][4]
float Get_DX_DL(float r, float psi, float SlantDepth, float theta, float hground, bool UseDL, bool IsDiffusive)
double GetCorrTypeIII(double r, double theta, double psi, int icomp)
const double parDXmax_Scin[4][4]
double DXFunc(double DX, double logE, double *parDX)
const double parfLambdaE_Scin[4][4]
double pow(const double x, const unsigned int i)
double GetSignal(double r, double XmaxEdep, double logE, double theta, double psi, double rhoGround, double hGround, double Nmu, int icomp0, int iatm)
float GetDensity(float h)
const double parLambda_Scin[4][4]
const double parDX0_Scin[4][4]
double GetS0(double r, double DX, double logE, int icomp, double Nmu)
double RFuncPar(int icomp, int iparDX, int ipar)
const double parGamma_MD[4][4]
const double parfLambdaE_WCD[4][4]
double GetCorrTypeI(double r, int icomp, double rhoGround, double hGround)
const double parLambda_WCD[4][4]
double RFunc(double r, int icomp, int iparDX)
double GetLogE(double vem, double r, double XmaxEdep, double theta, double psi, double rhoGround, double hGround, double Nmu, int iatm)
const double parGamma_WCD[4][4]
double GetAlphaFluct(double r, int icomp)
const double parDX0_WCD[4][4]
double GetCorrTypeII(double r, double theta, int icomp, double hground)
const double parLambda_MD[4][4]
UnivParam(int DetectorType)
const double parfLambdaE_MD[4][4]
void SetCurrentAtmosphere(AtmModel theAtm)
const double parDXmax_MD[4][4]
const double parDXmax_WCD[4][4]