UnivParam.cc
Go to the documentation of this file.
1 
19 #include "UnivParam.h"
20 #include "Atmosphere.h"
21 #include "GeomAsym.h"
22 #include "AtmCorr.h"
23 
24 using namespace UnivParamNS;
25 
26 
27 UnivParam::UnivParam(int DetectorType)
28 {
29  if (DetectorType < 0 || DetectorType > 2) {
30  printf("UnivParam: Wrong Detector Type %d \n", DetectorType);
31  exit(1);
32  }
33  fDetectorType = DetectorType;
34 
35 }
36 
37 double UnivParam::DXFunc(double x, double logE, double* parDX)
38 {
39 
40  double val = 0.;
41  int icomp = int(parDX[nParDX - 1]);
42 
43  double Sref0 = parDX[0];
44  double fS_e = parDX[1];
45  double Sref = Sref0 * pow(10., (logE - 19.) * fS_e);
46 
47  double DXmax = parDX[2] ;
48 
49  double L0 = parDX[3];
50  double fL_e = parDX[4];
51  double lambda = L0 * (1. + (logE - 19.) * fL_e) ;
52 
53  double DX0 = parDX[5];
54 
55  if (x < DX0) val = 0.;
56  else val = Sref * pow((x - DX0) / (DXref[icomp] - DX0), (DXmax - DX0) / lambda) * exp((DXref[icomp] - x) / lambda);
57 
58  return val;
59 }
60 
61 //
62 double UnivParam::RFuncPar(int icomp, int iparDX , int ipar)
63 {
64  double val = 0.;
65  if (iparDX == 0 && fDetectorType == 0) val = parSref_WCD[icomp][ipar];
66  else if (iparDX == 1 && fDetectorType == 0) val = parGamma_WCD[icomp][ipar];
67  else if (iparDX == 2 && fDetectorType == 0) val = parDXmax_WCD[icomp][ipar];
68  else if (iparDX == 3 && fDetectorType == 0) val = parLambda_WCD[icomp][ipar];
69  else if (iparDX == 4 && fDetectorType == 0) val = parfLambdaE_WCD[icomp][ipar];
70  else if (iparDX == 5 && fDetectorType == 0) val = parDX0_WCD[icomp][ipar];
71  else if (iparDX == 0 && fDetectorType == 1) val = parSref_Scin[icomp][ipar];
72  else if (iparDX == 1 && fDetectorType == 1) val = parGamma_Scin[icomp][ipar];
73  else if (iparDX == 2 && fDetectorType == 1) val = parDXmax_Scin[icomp][ipar];
74  else if (iparDX == 3 && fDetectorType == 1) val = parLambda_Scin[icomp][ipar];
75  else if (iparDX == 4 && fDetectorType == 1) val = parfLambdaE_Scin[icomp][ipar];
76  else if (iparDX == 5 && fDetectorType == 1) val = parDX0_Scin[icomp][ipar];
77  else if (iparDX == 0 && fDetectorType == 2) val = parSref_MD[icomp][ipar];
78  else if (iparDX == 1 && fDetectorType == 2) val = parGamma_MD[icomp][ipar];
79  else if (iparDX == 2 && fDetectorType == 2) val = parDXmax_MD[icomp][ipar];
80  else if (iparDX == 3 && fDetectorType == 2) val = parLambda_MD[icomp][ipar];
81  else if (iparDX == 4 && fDetectorType == 2) val = parfLambdaE_MD[icomp][ipar];
82  else if (iparDX == 5 && fDetectorType == 2) val = parDX0_MD[icomp][ipar];
83  return val;
84 }
85 
86 //
87 double UnivParam::RFunc(double r, int icomp, int iparDX)
88 {
89  double par[4];
90  for (int ipar = 0; ipar < 4; ipar++) par[ipar] = RFuncPar(icomp, iparDX, ipar);
91  return RFunc(r, icomp, iparDX , par);
92 }
93 
94 
95 
96 double UnivParam::RFunc(double r, int icomp, int iparDX , double* par)
97 {
98  double r_meter = r / 1.e2;
99 
100  if (iparDX == (nParDX - 1))
101  return icomp;
102 
103 
104  //-------------------------------------------------
105  // Sref
106  //-------------------------------------------------
107  if (iparDX == 0) // NKG
108  return par[0] * pow(r_meter / 1000., -par[1]) * pow((par[3] + r_meter) / (par[3] + 1000.), -par[2]);
109  //-------------------------------------------------
110  // Scaling
111  //-------------------------------------------------
112  else if (iparDX == 1) {
113  // expo+cte
114  return par[0] + exp(-r_meter / 500.) * par[1];
115  }
116  //-------------------------------------------------
117  // DXmax
118  //-------------------------------------------------
119 
120  else if (iparDX == 2) {
121  if (icomp == 1) { // gaisser-hillas
122  double max = par[0];
123  double rmax = par[1];
124  double rlambda = par[2];
125  double r0 = par[3];
126  if (rmax < r0 || rlambda < 0.)
127  return 1.e10;
128 
129  if (r_meter > r0)
130  return max * pow((r_meter - r0) / (rmax - r0), (rmax - r0) / rlambda) * exp((rmax - r_meter) / rlambda);
131  else
132  return 0.;
133  } else // powerlaw + cte
134  return par[0] + par[1] * pow(r_meter / 1000., par[2]);
135  }
136  //-------------------------------------------------
137  // Lambda
138  //-------------------------------------------------
139  else if (iparDX == 3) {
140  if (icomp == 1) // pol1 in r + expo
141  return par[0] + r_meter / 1000.*par[1] - par[2] * exp(-r_meter / 150.);
142  else if (icomp == 3) //pol1
143  return par[0] + r_meter / 1000.*par[1];
144  else
145  return par[0] + par[1] * exp(par[2] * r_meter / 1000.); // expo + cte
146  }
147  //-------------------------------------------------
148  // fLambda_E
149  //-------------------------------------------------
150  else if (iparDX == 4) {
151  // pol1 in r
152  if (icomp == 1) return par[0] + r_meter / 1000.*par[1];
153  else return par[0];
154  }
155  //-------------------------------------------------
156  // DX0
157  //-------------------------------------------------
158  else if (iparDX == 5)
159  return par[0];
160 
161  return -100.;
162 }
163 
164 
165 
166 double UnivParam::GetS0(double r, double DX, double logE, int icomp)
167 {
168  //Signal in an spherical tank with shadow effects corrected and for a reference ground density of 1.04e-3 g/cm^3
169  // icomp=0,1 Muon/Em signal in [VEM]
170  // icomp=2,3 Ratio of Em Muon/Em Hadron to muonic signal
171  //
172  // r [cm]
173  // DX [g/cm^2] Muon/Em Muon-> DX_mu Em/Em Had -> DX_edep
174  // log(E) [eV]
175  // icomp=0,1,2,3 Muon/Em/Em Muon/Em had -1 sum
176 
177  if (r > rLimit_high) r = rLimit_high;
178  if (r < rLimit_low) r = rLimit_low;
179 
180  double parDX[nParDX];
181  for (int iparDX = 0; iparDX < nParDX; iparDX++)
182  parDX[iparDX] = RFunc(r, icomp, iparDX);
183 
184  double S0 = DXFunc(DX, logE, parDX);
185  return S0;
186 }
187 
188 double UnivParam::GetS0(double r, double DX, double logE, int icomp, double Nmu)
189 {
190  if (icomp < 0 || icomp > 3) return 0.;
191  if (r > rLimit_high) r = rLimit_high;
192  if (r < rLimit_low) r = rLimit_low;
193 
194  double val = GetS0(r, DX, logE, icomp);
195 
196  double alpha = GetAlphaFluct(r, icomp);
197  if (alpha == UNDEF) return UNDEF;
198  return val * (1. + (Nmu - 1.) * alpha);
199 }
200 
201 
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)
203 {
204 
205  if (isnan(Xmax_Edep) || Xmax_Edep < 0.) return 0.;
207  if (iatm > 0 && iatm < 13) fatm.SetCurrentAtmosphere(iatm);
208 
209  if (hGround < 0.) hGround = AtmosphereNS::hGroundRef;
210  if (rhoGround < 0.) rhoGround = fatm.GetDensity(hGround);
211 
212  double DX[4];
213  for (int icomp = 0; icomp < 4; icomp++)
214  DX[icomp] = fatm.Get_DX_DL(r, psi, Xmax_Edep + XmaxShift[icomp] , theta, hGround, UseDL[icomp], UseDiffusive[icomp]);
215 
216  return GetSignal(r, DX, logE, theta, psi, rhoGround, hGround, Nmu, icomp0);
217 
218 }
219 
220 double UnivParam::GetSignal(double r, double* DX , double logE, double theta, double psi, double rhoGround, double hGround, double Nmu, int icomp0)
221 {
222  // r [cm]
223  // Xmax_edep [g/cm²]
224  // log(E) [eV]
225  // theta/psi [rad]
226  // rhoGround [g/cm^3]
227  // hGround [cm]
228  // Nmu relative local Nmu
229  // icomp=0,1,2,3 Muon/Em/Em Muon/Em had -1 sum
230 
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.;
236 
237  if (Nmu < 0.) Nmu = 0.;
238  if (Nmu > 3.5) Nmu = 3.5;
239  if (r > rLimit_high) r = rLimit_high;
240  if (r < rLimit_low) r = rLimit_low;
241  if (theta > 65 * M_PI / 180.) theta = 65.*M_PI / 180.;
242 
243 
246 
247  double sum = 0.;
248  for (int icomp = 0; icomp < 4; icomp++) {
249  if (!(icomp == icomp0 || icomp0 == -1)) continue;
250  if (fDetectorType == 2 && icomp > 0) continue;
251 
252  double DX0 = RFunc(r, icomp, 5);
253  if (DX[icomp] <= DX0) continue;
254  if (!UseDiffusive[icomp] && DX[icomp] <= 0.) continue;
255 
256  double S0 = GetS0(r, DX[icomp], logE, icomp , Nmu) ;
257  double S = S0 * fgeom.GetGeomAsym(DX[icomp], r, theta, psi, icomp)
258  / fatmcorr.GetCorrTypeI(r, icomp, rhoGround, hGround) / fatmcorr.GetCorrTypeII(r, theta, icomp, hGround) / fatmcorr.GetCorrTypeIII(r, theta, psi, icomp);
259 
260  if (S <= 0.) S = 0.;
261  sum += S;
262  }
263  return sum;
264 }
265 
266 
267 double UnivParam::GetLogE(double vem, double r, double Xmax_Edep , double theta, double psi, double rhoGround, double hGround, double Nmu, int iatm)
268 {
269  double logE = 17.00;
270  double vemG = GetSignal(r, Xmax_Edep, logE, theta, psi, rhoGround, hGround, Nmu, -1, iatm);
271  if (vem < vemG) return logE;
272 
273  double dlogE = 0.05;
274  while (fabs(vem / vemG - 1.) > 0.0001) {
275  if (vem > vemG) logE += dlogE;
276  else {
277  logE -= dlogE;
278  dlogE /= 2.;
279  }
280  vemG = GetSignal(r, Xmax_Edep, logE, theta, psi, rhoGround, hGround, Nmu, -1, iatm);
281  }
282  return logE;
283 }
284 
285 double UnivParam::GetAlphaFluct(double r, int icomp)
286 {
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.;
292 
293  double C = (alpha1 - alpha0) / (exp(-B) - 1.0);
294  double A = alpha0 - C;
295 
296  return A + C * exp(-B * r_meter / 1.e3);
297  }
298  return UNDEF;
299 
300 }
const double parDX0_MD[4][4]
Definition: UnivParam.h:141
const bool UseDiffusive[4]
Definition: UnivParam.h:35
const double parSref_Scin[4][4]
Definition: UnivParam.h:82
const double parSref_WCD[4][4]
Definition: UnivParam.h:51
double GetGeomAsym(double DX, double r, double theta, double psi, int icomp)
Definition: GeomAsym.cc:454
const double parGamma_Scin[4][4]
Definition: UnivParam.h:87
const double parSref_MD[4][4]
Definition: UnivParam.h:116
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)
Definition: AtmCorr.cc:129
const double parDXmax_Scin[4][4]
Definition: UnivParam.h:92
double DXFunc(double DX, double logE, double *parDX)
Definition: UnivParam.cc:37
const int nParDX
Definition: UnivParam.h:44
const double parfLambdaE_Scin[4][4]
Definition: UnivParam.h:102
double pow(const double x, const unsigned int i)
int exit
Definition: dump1090.h:237
double GetSignal(double r, double XmaxEdep, double logE, double theta, double psi, double rhoGround, double hGround, double Nmu, int icomp0, int iatm)
Definition: UnivParam.cc:202
const double rLimit_low
Definition: UnivParam.h:157
const bool XmaxShift[4]
Definition: UnivParam.h:34
#define max(a, b)
const double parLambda_Scin[4][4]
Definition: UnivParam.h:97
const double parDX0_Scin[4][4]
Definition: UnivParam.h:107
double GetS0(double r, double DX, double logE, int icomp, double Nmu)
Definition: UnivParam.cc:188
double RFuncPar(int icomp, int iparDX, int ipar)
Definition: UnivParam.cc:62
const double parGamma_MD[4][4]
Definition: UnivParam.h:121
#define S
const double parfLambdaE_WCD[4][4]
Definition: UnivParam.h:71
double GetCorrTypeI(double r, int icomp, double rhoGround, double hGround)
Definition: AtmCorr.cc:50
const double parLambda_WCD[4][4]
Definition: UnivParam.h:66
const double rLimit_high
Definition: UnivParam.h:158
double RFunc(double r, int icomp, int iparDX)
Definition: UnivParam.cc:87
const bool UseDL[4]
Definition: UnivParam.h:36
double GetLogE(double vem, double r, double XmaxEdep, double theta, double psi, double rhoGround, double hGround, double Nmu, int iatm)
Definition: UnivParam.cc:267
const double parGamma_WCD[4][4]
Definition: UnivParam.h:56
double GetAlphaFluct(double r, int icomp)
Definition: UnivParam.cc:285
const double parDX0_WCD[4][4]
Definition: UnivParam.h:76
double GetCorrTypeII(double r, double theta, int icomp, double hground)
Definition: AtmCorr.cc:74
#define UNDEF
Definition: UnivRec.h:24
const double parLambda_MD[4][4]
Definition: UnivParam.h:131
const double DXref[4]
Definition: UnivParam.h:42
UnivParam(int DetectorType)
Definition: UnivParam.cc:27
const double parfLambdaE_MD[4][4]
Definition: UnivParam.h:136
const double parDXmax_MD[4][4]
Definition: UnivParam.h:126
const double parDXmax_WCD[4][4]
Definition: UnivParam.h:61

, generated on Tue Sep 26 2023.