UnivCalibConstants.cc
Go to the documentation of this file.
1 #include "UnivCalibConstants.h"
2 
3 using namespace UnivCalibConstantsNS;
4 
5 
6 UnivCalibConstants::UnivCalibConstants(int CalibOpt_i, int RecSys_i, int RecMixture_i)
7 {
8  CalibOpt = CalibOpt_i;
9  RecSys = RecSys_i;
10  HadronicModel = (CalibOpt_i >= 0 ? CalibOpt : UNDEF);
11  RecMixture = RecMixture_i;
12 
13  //printf("UnivCalibConstants: CalibOpt=%d RecSys=%d HadronicModel=%d RecMixture=%d \n",CalibOpt,RecSys,HadronicModel,
14  // RecMixture);
15 
16  if (CalibOpt < -3 || CalibOpt > 3) {
17  printf("UnivCalibConstants: Fatal error CalibOpt \n");
18  exit(1);
19  }
20 
21  if (CalibOpt < 0) {
22  RecMixture = UNDEF;
24  } else if (RecMixture < 0 || RecMixture >= nRecMixtures || HadronicModel < 0 || HadronicModel > 3) {
25  printf("UnivCalibConstants: Fatal error RecMixture \n");
26  exit(1);
27  }
28 
29  if (CalibOpt <= -2 && (RecSys < 0 || RecSys >= nSys)) {
30  printf("UnivCalibConstants: Fatal error RecSys %d %d \n", CalibOpt, RecSys);
31  exit(1);
32  }
33 }
34 
35 
36 //-----------------------------------------------------------------------------------
37 //--------- Proton fraction
38 //-----------------------------------------------------------------------------------
39 double
41 {
42  double fp = UNDEF;
43  if (CalibOpt < 0)
44  return fp;
45 
46  const double fProton19[nRecMixtures] = {1, 0, 0.5, 0.1, 0.9, 1};
47  const double fProton20[nRecMixtures] = {1, 0, 0.5, 0.1, 0.9, 0};
48 
49  fp = fProton19[RecMixture] + (logE - 19) * (fProton20[RecMixture] - fProton19[RecMixture]);
50 
51  if (fp < 0)
52  fp = 0;
53 
54  if (fp > 1)
55  fp = 1;
56 
57  return fp;
58 }
59 
60 
61 //-----------------------------------------------------------------------------------
62 //---------<Xmax>
63 //-----------------------------------------------------------------------------------
64 double
66 {
67  double meanXmax = UNDEF;
68 
69  // Data
70  if (CalibOpt <= -2) {
71  logE -= log10(fEnergySys_Auger[RecSys]);
72 
73  const double logE0 = 18.36, Xmax0 = 754, ER0 = 71, ER1 = 19;
74 
75  if (logE < logE0)
76  meanXmax = Xmax0 + (logE - logE0) * ER0;
77  else
78  meanXmax = Xmax0 + (logE - logE0) * ER1;
79 
80  meanXmax += fXmaxSys_Auger[RecSys];
81 
82  } else if (CalibOpt == -1) { // Photon analysis
83  const double Xmax_PhotonSearch = 1050;
84  meanXmax = Xmax_PhotonSearch;
85 
86  } else { // MC
87  const double Xmax0_Models[4][2] = {{788, 703}, {819, 712}, {790, 695}, { 805, 709}}; //[HadronicModel][Primary]
88  const double A_Xmax_Models[4][2] = {{43, 51}, {63, 62}, {55, 56}, {56, 59}};
89 
90  double meanXmax_i[2]; // Proton/Iron
91  for (int ip = 0; ip < 2; ++ip)
92  meanXmax_i[ip] = Xmax0_Models[HadronicModel][ip] + (logE - logE_Calib) * A_Xmax_Models[HadronicModel][ip];
93 
94  double fp = GetProtonFraction(logE);
95  meanXmax = meanXmax_i[0] * fp + meanXmax_i[1] * (1 - fp);
96  }
97 
98  return meanXmax;
99 }
100 
101 
102 //-----------------------------------------------------------------------------------
103 //---------<Nmu>
104 //-----------------------------------------------------------------------------------
105 double
106 UnivCalibConstants::GetMeanNmu(double logE, double theta, double Xmax)
107 {
108  double MeanNmu = GetMeanNmu(logE, theta);
109 
110  // <Nmu>
111  if (Xmax < 0 || CalibOpt == -1)
112  return MeanNmu;
113 
114  // Using Nmu(Xmax) correlation and normalizing so Nmu(<Xmax>)=<Nmu>
115  double MeanXmax_pFe = GetMeanXmax_pFe(logE);
116  double dX0 = GetMeanXmax(logE) - MeanXmax_pFe;
117  double dX = Xmax - MeanXmax_pFe;
118  double Nmu = MeanNmu * (1. + 0.5 * atan(-dX / 40) / M_PI) / (1. + 0.5 * atan(-dX0 / 40) / M_PI) ;
119 
120  return Nmu;
121 }
122 
123 
124 double
125 UnivCalibConstants::GetMeanNmu(double logE, double theta)
126 {
127  double meanNmu = UNDEF;
128 
129  // Calib Data
130  if (CalibOpt == -3)
131  return meanNmu;
132  else if (CalibOpt == -2) { // Data
133  logE -= log10(fEnergySys_Auger[RecSys]);
134 
135  const double Nmu0_Auger = 1.99, A_Nmu_Auger = 0.21, B_Nmu_Auger = 0.17;
136  meanNmu = Nmu0_Auger + A_Nmu_Auger * (logE - logE_Calib) + B_Nmu_Auger * (1 / cos(theta) - 2) ;
137 
138  meanNmu *= fNmuSys_Auger[RecSys];
139  } else if (CalibOpt == -1) { // Photon Analysis
140  const double Nmu_PhotonSearch = 0.15;
141  meanNmu = Nmu_PhotonSearch;
142  } else { // MC
143  const double Nmu0_Models[4][2] = {{0.98, 1.38}, {1.19, 1.70}, {1.20, 1.69}, {1.28, 1.82}}; // Nmu at theta=60 [deg] log(E)=19.5 [eV]
144  const double A_Nmu_Models[4][2] = {{ -0.04, 0.02 }, { -0.14, -0.12}, {0.07, 0.13}, {0.01, 0.10}}; // Zenith dependence
145  const double B_Nmu_Models[4][2] = {{ -0.01, -0.09}, { -0.04, -0.11}, { -0.01, -0.10}, { -0.01, -0.11}}; // Energy evolution
146 
147  double meanNmu_i[2];
148  for (int ip = 0; ip < 2; ++ip)
149  meanNmu_i[ip] = Nmu0_Models[HadronicModel][ip] + A_Nmu_Models[HadronicModel][ip] * (1 / cos(theta) - 2) + B_Nmu_Models[HadronicModel][ip] * (logE - logE_Calib);
150 
151  const double fp = GetProtonFraction(logE);
152  meanNmu = meanNmu_i[0] * fp + meanNmu_i[1] * (1 - fp);
153  }
154 
155  return meanNmu;
156 }
157 
158 
159 //-----------------------------------------------------------------------------------
160 //--------- OffsetM_Mu
161 //-----------------------------------------------------------------------------------
162 double
164 {
165  return GetOffsetM_Mu(UNDEF, theta, UNDEF);
166 }
167 
168 
169 double
170 UnivCalibConstants::GetOffsetM_Mu(double /*logE*/, double theta, double /*Xmax*/)
171 {
172  double offsetM_Mu[2] = {UNDEF, UNDEF};
173 
174  if (CalibOpt == -3) { // Calib Data
175  offsetM_Mu[0] = OffsetM_Mu_Calib[0];
176  offsetM_Mu[1] = OffsetM_Mu_Calib[1];
177  } else if (CalibOpt == -2) { // Data
178  offsetM_Mu[0] = OffsetM_Mu_Auger[0][RecSys];
179  offsetM_Mu[1] = OffsetM_Mu_Auger[1][RecSys];
180  } else if (CalibOpt == -1) { // Photon Analysis
181  offsetM_Mu[0] = OffsetM_Mu_Photon[0];
182  offsetM_Mu[1] = OffsetM_Mu_Photon[1];
183  } else { // MC
184  offsetM_Mu[0] = OffsetM_Mu_Models[0][HadronicModel];
185  offsetM_Mu[1] = OffsetM_Mu_Models[1][HadronicModel];
186  }
187 
188  const double offset = offsetM_Mu[0] + offsetM_Mu[1] * (1 / cos(theta) - 1);
189 
190  return offset;
191 }
192 
193 
194 //----------------------------------------------------------------------------------------------------
195 //--------- MC -> <Xmax>(logE) for a 50% p/Fe mixture
196 //--------- Data -> <Xmax>(logE) from Nmu(Xmax) fit at log(E)=19 [eV]
197 //----------------------------------------------------------------------------------------------------
198 double
200 {
201  double MeanXmax_pFe, ER_pFe;
202  if (CalibOpt == -3) {
203  MeanXmax_pFe = MeanXmax_pFe_Calib;
204  ER_pFe = ER_pFe_Calib;
205  } else if (CalibOpt == -2) {
206  logE -= log10(fEnergySys_Auger[RecSys]);
209  } else if (CalibOpt == -1) {
210  MeanXmax_pFe = MeanXmax_pFe_Models[0];
211  ER_pFe = ER_pFe_Models[0];
212  } else {
213  MeanXmax_pFe = MeanXmax_pFe_Models[HadronicModel];
214  ER_pFe = ER_pFe_Models[HadronicModel];
215  }
216 
217  return MeanXmax_pFe + (logE - logE_Calib) * ER_pFe;
218 }
219 
220 
221 //----------------------------------------------------------------------------------------------------
222 //---------- Xmax_SD / Xmax_FD / Nmu_FD resolution / RMS Xmax( RMS XmaxSD)
223 //----------------------------------------------------------------------------------------------------
224 double
225 UnivCalibConstants::GetSigmaXmax_SD(double logE, int ndev, bool IsInfill)
226 {
227  double A_p[2] = {51.5, 25.5}, B_p [2] = {0.8, 0.5}; // Proton
228  double A_fe[2] = {43.5, 21}, B_fe[2] = {0.8, 0.76}; // Iron
229 
230  unsigned int infill = IsInfill;
231 
232  double sigma_p = A_p[infill] * exp(-(logE - 19) * B_p[infill]);
233  double sigma_fe = A_fe[infill] * exp(-(logE - 19) * B_fe[infill]);
234 
235  double sigma = 0.5 * (sigma_p + sigma_fe) + 0.5 * ndev * (sigma_p - sigma_fe);
236 
237  return sigma;
238 }
239 
240 
241 double
243 {
244  return GetSigmaXmax_SD(logE, ndev, false);
245 }
246 
247 
248 double
250 {
251  return 20;
252 }
253 
254 
255 double
257 {
258  return 0.2 - 0.05 * (logE - 19); // Nmu/Nmu(true)
259 }
260 
261 
262 double
263 UnivCalibConstants::GetTrueRMSXmax(double rms, double logE, bool IsInfill)
264 {
265  double slope = 1.025 - 0.1 * (logE - 19);
266  double sigma = (IsInfill ? 17.5 * exp(-(logE - 19) * 1) : 43 * exp(-(logE - 19) * 0.8));
267  if (rms / slope < sigma)
268  return UNDEF;
269  return sqrt(rms * rms / slope / slope - sigma * sigma);
270 }
static const int nSys
static const double fNmuSys_Auger[nSys]
double GetMeanNmu(double logE, double theta)
static const double ER_pFe_Models[nModels]
static const double MeanXmax_pFe_Models[nModels]
int exit
Definition: dump1090.h:237
static const double OffsetM_Mu_Models[2][nModels]
double GetSigmaXmax_SD(double logE, int ndev, bool IsInfill)
static const double Offset_ER_pFe_Auger[nSys]
static const double MeanXmax_pFe_Auger
static const int nRecMixtures
static const double ER_pFe_Auger
UnivCalibConstants(int CalibOpt_i, int RecSys_i, int RecMixture_i)
static const double fXmaxSys_Auger[nSys]
static const double logE_Calib
#define UNDEF
Definition: UnivRec.h:24
static const double OffsetM_Mu_Auger[2][nSys]
static const double OffsetM_Mu_Photon[2]
static const double Offset_MeanXmax_pFe_Auger[nSys]
static const double OffsetM_Mu_Calib[2]
static const double MeanXmax_pFe_Calib
static const double fEnergySys_Auger[nSys]
const double ndev
Definition: UnivParamTime.h:38
static const double ER_pFe_Calib
double GetTrueRMSXmax(double rms, double logE, bool IsInfill)

, generated on Tue Sep 26 2023.