Long_term_correction_header.h
Go to the documentation of this file.
1 #ifndef Long_term_correction_header_h
2 #define Long_term_correction_header_h
3 
4 /* by Jakub Vicha
5  * slightly modified to be compiled within offline by Max Stadelmaier
6  *
7  * long-term corrections for energ(FD)/energy(SD)
8  * probably this should be implemented by an FD expert somewhere else
9  */
10 
11 unsigned int DataRelease = 1, NumberOfBreaks = 2;
12 
14 
15 double LongTermCorrectionPerEye( double EsdOverFd, double gpsmegatime, unsigned int eye ) // Esd / Efd, GPS time in Ms and zenith-angle bin
16 {
17  const unsigned int nFDsites = 4; // LL, LM, LA, CO
18 
19  double GPSbreak[nFDsites], a1[nFDsites], a2[nFDsites], b[nFDsites];
20  double GPSbreak1_2breaks[nFDsites], GPSbreak2_2breaks[nFDsites], a1_2breaks[nFDsites], a2_2breaks[nFDsites], a3_2breaks[nFDsites], b_2breaks[nFDsites];
21  double CorrectedRatio, f; //, fRef;
22 
23  if( DataRelease == 0 )
24  {
25 // above log Efd = 18.5 - ICRC 17
26 
27 // GPS time [Ms] of long-term break
28  GPSbreak[0] = 1059.67;
29  GPSbreak[1] = 1004.65;
30  GPSbreak[2] = 1063.43;
31  GPSbreak[3] = 1001.87;
32 
33  a1[0] = 0.000301326;
34  a1[1] = 0.00111561;
35  a1[2] = 0.000521306;
36  a1[3] = 0.000681541;
37 
38  a2[0] = 0.000240983;
39  a2[1] = -0.000198824;
40  a2[2] = -0.00170036;
41  a2[3] = -0.00078575;
42 
43  b[0] = 0.707388;
44  b[1] = -0.0298003;
45  b[2] = 0.495244;
46  b[3] = 0.336456;
47  }
48 
49  if( DataRelease == 1 )
50  {
51  // above log Efd = 18.5 - ICRC 19 + 2018 + Core < 800m & angle < 5deg & LDF Cuts > 10^-10
52 
53  // GPS time [Ms] of long-term break
54  GPSbreak[0] = 961.821;
55  GPSbreak[1] = 985.511;
56  GPSbreak[2] = 1047.96;
57  GPSbreak[3] = 959.097;
58 
59  a1[0] = 0.000229442;
60  a1[1] = 0.00110734;
61  a1[2] = 0.00040724;
62  a1[3] = 0.00068503;
63 
64  a2[0] = 0.000325319;
65  a2[1] = 0.000192236;
66  a2[2] = -0.000279451;
67  a2[3] = -0.000187543;
68 
69  b[0] = 0.760063;
70  b[1] = -0.0304074;
71  b[2] = 0.60066;
72  b[3] = 0.334217;
73 
74 
75  // GPS time [Ms] of long-term break
76  GPSbreak1_2breaks[0] = 1073.59;
77  GPSbreak1_2breaks[1] = 1044.57;
78  GPSbreak1_2breaks[2] = 1066.6;
79  GPSbreak1_2breaks[3] = 1042.24;
80 
81  GPSbreak2_2breaks[0] = 1128.46;
82  GPSbreak2_2breaks[1] = 1098.82;
83  GPSbreak2_2breaks[2] = 1092.46;
84  GPSbreak2_2breaks[3] = 1095;
85 
86  a1_2breaks[0] = 0.00040397;
87  a1_2breaks[1] = 0.00103914;
88  a1_2breaks[2] = 0.000437;
89  a1_2breaks[3] = 0.000509163;
90 
91  a2_2breaks[0] = -0.00114323;
92  a2_2breaks[1] = -0.00147673;
93  a2_2breaks[2] = -0.00203909;
94  a2_2breaks[3] = -0.00175069;
95 
96  a3_2breaks[0] = 0.00177153;
97  a3_2breaks[1] = 0.00101904;
98  a3_2breaks[2] = 3.87678e-05;
99  a3_2breaks[3] = 0.000419606;
100 
101  b_2breaks[0] = -1.03302;
102  b_2breaks[1] = -0.0856851;
103  b_2breaks[2] = 0.944868;
104  b_2breaks[3] = 0.466709;
105  }
106 
107  if( NumberOfBreaks == 1 )
108  {
109  if( gpsmegatime < GPSbreak[eye] )
110  {
111  f = a1[eye] * gpsmegatime + b[eye];
112 
113  CorrectedRatio = EsdOverFd / f;
114  }
115  else
116  {
117  f = a2[eye] * gpsmegatime + b[eye] + (a1[eye]-a2[eye]) * GPSbreak[eye];
118 
119  CorrectedRatio = EsdOverFd / f;
120  }
121  }
122 
123  if( NumberOfBreaks == 2 )
124  {
125  if( gpsmegatime < GPSbreak1_2breaks[eye] )
126  {
127  f = a1_2breaks[eye] * gpsmegatime + b_2breaks[eye] + ( a3_2breaks[eye] - a2_2breaks[eye] ) * GPSbreak2_2breaks[eye] + ( a2_2breaks[eye] - a1_2breaks[eye] ) * GPSbreak1_2breaks[eye]; // a1*x + b3 + (a3-a2)*X2 + (a2-a1)*X1
128 
129  CorrectedRatio = EsdOverFd / f;
130  }
131  if( gpsmegatime > GPSbreak1_2breaks[eye] && gpsmegatime < GPSbreak2_2breaks[eye] )
132  {
133  f = a2_2breaks[eye] * gpsmegatime + b_2breaks[eye] + (a3_2breaks[eye]-a2_2breaks[eye]) * GPSbreak2_2breaks[eye]; //y = a2*x + b3 + (a3-a2)*X2
134 
135  CorrectedRatio = EsdOverFd / f;
136  }
137  if( gpsmegatime > GPSbreak2_2breaks[eye] )
138  {
139  f = a3_2breaks[eye] * gpsmegatime + b_2breaks[eye]; //y = a3*x + b3
140 
141  CorrectedRatio = EsdOverFd / f;
142  }
143  }
144 
145  return CorrectedRatio;
146 }
147 
148 //=======================================================================================================================================
149 
150 
151 double LongTermCorrectionPerEyeAY( double EsdOverFd, double gpsmegatime, unsigned int eye ) // Esd / Efd, GPS time in Ms and zenith-angle bin
152 {
153  const double MoonCycleLength = 29.532;
154  //Jan 1st 2004
155  const double MoonCycleJan1st2004 = 11.45 - 344/MoonCycleLength;
156  const int GPSJan1st2004 = 756950413;
157 
158  const double x = MoonCycleJan1st2004 + (gpsmegatime*1e6 - GPSJan1st2004)/(MoonCycleLength*24*3600);//Moon cycle
159 
160  double constant;
161  double breaks[2];
162  double slope[3];
163 
164  double LL_par[2] = {0, 0}; //linear part of fit >130 MoonCycles for LL
165  double LL_stitch = 0;
166  //fits
167  switch (eye)
168  {
169  case 0:
170  //Eye 1 - LL
171  //special fit with 2 breaks in range < 130 && then linear
172  constant = 0.99413;
173  slope[0] = 0.000557776;
174  slope[1] = 0.00536182;
175  slope[2] = -0.0321092;
176  breaks[0] = 100.198;
177  breaks[1] = 124.123;
178 
179  //linear part > 130
180  LL_par[0] = 9.33706e-01;
181  LL_par[1] = 3.40356e-03;
182  LL_stitch = 130;
183 
184  //default 2 break fit
185  /*constant = 1.04467;
186  slope[0] = 0.00106613;
187  slope[1] = -0.00376464;
188  slope[2] = 0.00295298;
189  breaks[0] = 123.426;
190  breaks[1] = 140.68;
191  LL_stitch = 10000;
192  */
193  break;
194 
195  case 1:
196  //Eye 2 - LM
197  constant = 1.09387;
198  slope[0] = 0.00205574;
199  slope[1] = -0.000290713;
200  slope[2] = 0.00323317;
201  breaks[0] = 111.5;
202  breaks[1] = 155.503;
203  break;
204 
205  case 2:
206  //Eye 3 - LA
207  constant = 1.06842;
208  slope[0] = 0.00222544;
209  slope[1] = -0.00306826;
210  slope[2] = 7.98857e-05;
211  breaks[0] = 113.499;
212  breaks[1] = 138.242;
213  break;
214 
215  case 3:
216  //Eye 4 - Co
217  constant = 1.04585;
218  slope[0] = 0.00134737;
219  slope[1] = -0.0961635;
220  slope[2] = 0.00152404;
221  breaks[0] = 124.918;
222  breaks[1] = 126.311;
223  break;
224 
225  default:
226  constant = 1.;
227  slope[0] = 0.0;
228  slope[1] = -0.0;
229  slope[2] = 0.0;
230  breaks[0] = 100.;
231  breaks[1] = 100.;
232  break;
233 
234  }
235 
236  double f = x < breaks[1]? (x < breaks[0] ? constant + slope[0] * (x - breaks[0]) : constant + slope[1] * (x - breaks[0])) : constant + slope[1] * (breaks[1] - breaks[0]) + slope[2] * (x - breaks[1]);
237 
238  if (x > LL_stitch && eye == 0)
239  f = LL_par[0] + LL_par[1] * (x - LL_stitch);
240 
241  return EsdOverFd / f;
242 }
243 
244 
245 #endif // #ifdef Long_term_correction_header_cxx
unsigned int DataRelease
unsigned int NumberOfBreaks
double LongTermCorrectionPerEye(double EsdOverFd, double gpsmegatime, unsigned int eye)
bool ReadNewLTparametrization
double LongTermCorrectionPerEyeAY(double EsdOverFd, double gpsmegatime, unsigned int eye)

, generated on Tue Sep 26 2023.