RdGlobalFit.cc
Go to the documentation of this file.
1 #include "RdGlobalFit.h"
2 #include <utl/ErrorLogger.h>
3 
4 #include <cmath>
5 
6 #include <fwk/CentralConfig.h>
7 #include <revt/StationRecData.h>
8 #include <utl/Vector.h>
9 #include <utl/Point.h>
10 #include <utl/BasicVector.h>
11 #include <utl/GeometryUtilities.h>
12 #include <utl/RadioGeometryUtilities.h>
13 #include <utl/CoordinateSystemPtr.h>
14 #include <utl/StringCompare.h>
15 
16 #include <evt/Event.h>
17 #include <evt/ShowerRecData.h>
18 #include <evt/ShowerSRecData.h>
19 #include <evt/ShowerRRecData.h>
20 #include <evt/ShowerFRecData.h>
21 #include <evt/ShowerSimData.h>
22 
23 #include <revt/REvent.h>
24 #include <revt/Station.h>
25 #include <revt/Header.h>
26 #include <revt/StationRecData.h>
27 #include <revt/StationRRecDataQuantities.h>
28 
29 #include <det/Detector.h>
30 #include <rdet/RDetector.h>
31 
32 // include root stuff
33 #include "TGraph2DErrors.h"
34 #include "TF2.h"
35 #include "TMath.h"
36 #include "TMinuit.h"
37 #include "TFitResultPtr.h"
38 #include "TRandom3.h"
39 
40 #include <cstddef>
41 #include <string>
42 #include <cstdlib>
43 #include <iostream>
44 
45 #include <sstream>
46 #include <fstream>
47 #include <iomanip>
48 #include <stdlib.h>
49 #include <sys/stat.h>
50 #include <math.h>
51 #include <algorithm>
52 #include <vector>
53 
54 using namespace revt;
55 using namespace evt;
56 using namespace fwk;
57 using namespace std;
58 using namespace utl;
59 using namespace det;
60 
61 //#include "DetectorGeometry.h"
62 #include <fwk/CentralConfig.h>
63 #include <det/VManager.h>
64 #include <det/Detector.h>
65 #include <rdet/RDetector.h>
66 #include <utl/Branch.h>
67 #include <utl/RadioGeometryUtilities.h>
68 
69 #include <evt/Event.h>
70 #include <evt/ShowerSRecData.h>
71 #include <evt/ShowerRecData.h>
72 #include <evt/ShowerRRecData.h>
73 #include <evt/ShowerSimData.h>
74 
75 #include <revt/REvent.h>
76 #include <revt/Header.h>
77 #include <revt/StationConstants.h>
78 #include <revt/StationConstants.h>
79 
80 #include <utl/TraceAlgorithm.h>
81 
82 #include <sstream>
83 #include <algorithm>
84 #include <TMinuit.h>
85 #include <TRandom.h>
86 
87 // atmosphere
88 #include <atm/AerosolDB.h>
89 #include <atm/AerosolZone.h>
90 #include <atm/ProfileResult.h>
91 #include <atm/MonthlyAvgDBProfileModel.h>
92 
93 using namespace std;
94 using namespace fwk;
95 using namespace det;
96 using namespace utl;
97 using namespace evt;
98 using namespace revt;
99 
100 #define OUT(x) if ((x) <= fInfoLevel) cerr << " "
101 #define NL "\n "
102 
103 namespace RdGlobalFit {
104 
106  fInfoLevel(0),
107  fGlobalFitData()
108 {
109 }
110 
111 RdGlobalFit::~RdGlobalFit()
112 {
113 }
114 
116 
117 {
118  // Initialize your module here. This method
119  // is called once at the beginning of the run.
120  // The eSuccess flag indicates the method ended
121  // successfully. For other possible return types,
122  // see the VModule documentation.
123 
124  INFO("RdGlobalFit::Init()");
125 
126  // Read in the configurations of the xml file
127  Branch topBranch;
128  topBranch = CentralConfig::GetInstance()->GetTopBranch("RdGlobalFit");
129  topBranch.GetChild("InfoLevel").GetData(fInfoLevel);
130  //B.Z.: TODO If fuseOwnSettings
131  // topBranch.GetChild("UsedDirection").GetData(fUsedDirection);
132  topBranch.GetChild("InfoLevel").GetData(fInfoLevel);
133 
134  topBranch.GetChild("A_scale").GetData(fLDFConstsTable.A_scale);
135  topBranch.GetChild("C3").GetData(fLDFConstsTable.C3);
136  topBranch.GetChild("C4").GetData(fLDFConstsTable.C4);
137 
138  topBranch.GetChild("C1theta_0_10").GetData(fLDFConstsTable.C1theta_0_10);
139  topBranch.GetChild("C2theta_0_10").GetData(fLDFConstsTable.C2theta_0_10);
140 
141  topBranch.GetChild("C1theta_10_20").GetData(fLDFConstsTable.C1theta_10_20);
142  topBranch.GetChild("C2theta_10_20").GetData(fLDFConstsTable.C2theta_10_20);
143 
144  topBranch.GetChild("C1theta_20_30").GetData(fLDFConstsTable.C1theta_20_30);
145  topBranch.GetChild("C2theta_20_30").GetData(fLDFConstsTable.C2theta_20_30);
146 
147  topBranch.GetChild("C1theta_30_40").GetData(fLDFConstsTable.C1theta_30_40);
148  topBranch.GetChild("C2theta_30_40").GetData(fLDFConstsTable.C2theta_30_40);
149 
150  topBranch.GetChild("C1theta_40_50").GetData(fLDFConstsTable.C1theta_40_50);
151  topBranch.GetChild("C2theta_40_50").GetData(fLDFConstsTable.C2theta_40_50);
152 
153  topBranch.GetChild("C1theta_50_55").GetData(fLDFConstsTable.C1theta_50_55);
154  topBranch.GetChild("C2theta_50_55").GetData(fLDFConstsTable.C2theta_50_55);
155  topBranch.GetChild("A_scale_50_55").GetData(fLDFConstsTable.A_scale_50_55);
156 
157  topBranch.GetChild("C1theta_55").GetData(fLDFConstsTable.C1theta_55);
158  topBranch.GetChild("C2theta_55").GetData(fLDFConstsTable.C2theta_55);
159  topBranch.GetChild("A_scale_55").GetData(fLDFConstsTable.A_scale_55);
160 
161  utl::Branch bFitConfig = topBranch.GetChild("FitConfig");
162  bFitConfig.GetChild("fitArrivalTime").GetData(fFitConfig.fitArrivalTime);
163  bFitConfig.GetChild("fitTwoDLDF").GetData(fFitConfig.fitTwoDLDF);
164  bFitConfig.GetChild("fixCore").GetData(fFitConfig.fixCore);
165  bFitConfig.GetChild("fitGammaAndSigmaPlusIndependently").GetData(
167  bFitConfig.GetChild("fitShowerMaxAsRMax").GetData(fFitConfig.fitShowerMaxAsRMax);
168  bFitConfig.GetChild("fitShowerMaxAsXMAX").GetData(fFitConfig.fitShowerMaxAsXMAX);
169  bFitConfig.GetChild("fitShowerMaxAsDXMAX").GetData(fFitConfig.fitShowerMaxAsDXMax);
170  bFitConfig.GetChild("SaveCoreContourData").GetData(fFitConfig.SaveCoreContourData);
171  bFitConfig.GetChild("printMinuitScans").GetData(fFitConfig.printMinuitScans);
172  bFitConfig.GetChild("useCS").GetData(fFitConfig.useCS);
173 
175  utl::Branch bGlobalFitData = topBranch.GetChild("GlobalFitData");
176  utl::Branch bAplus = bGlobalFitData.GetChild("Aplus");
177  bAplus.GetChild("isFix").GetData(fGlobalFitData.Aplus.isFix);
178  bAplus.GetChild("hasLimits").GetData(fGlobalFitData.Aplus.hasLimits);
179  bAplus.GetChild("startValueFrom").GetData(fGlobalFitData.Aplus.startValueFrom);
180  bAplus.GetChild("startValue").GetData(fGlobalFitData.Aplus.startValue);
181  bAplus.GetChild("startError").GetData(fGlobalFitData.Aplus.startError);
182  bAplus.GetChild("lowLimit").GetData(fGlobalFitData.Aplus.lowLimit);
183  bAplus.GetChild("highLimit").GetData(fGlobalFitData.Aplus.highLimit);
184 
185  utl::Branch bcore_x = bGlobalFitData.GetChild("core_x");
186  bcore_x.GetChild("isFix").GetData(fGlobalFitData.core_x.isFix);
187  bcore_x.GetChild("hasLimits").GetData(fGlobalFitData.core_x.hasLimits);
188  bcore_x.GetChild("startValueFrom").GetData(fGlobalFitData.core_x.startValueFrom);
189  bcore_x.GetChild("startValue").GetData(fGlobalFitData.core_x.startValue);
190  bcore_x.GetChild("startError").GetData(fGlobalFitData.core_x.startError);
191  bcore_x.GetChild("lowLimit").GetData(fGlobalFitData.core_x.lowLimit);
192  bcore_x.GetChild("highLimit").GetData(fGlobalFitData.core_x.highLimit);
193 
194  utl::Branch bcore_y = bGlobalFitData.GetChild("core_y");
195  bcore_y.GetChild("isFix").GetData(fGlobalFitData.core_y.isFix);
196  bcore_y.GetChild("hasLimits").GetData(fGlobalFitData.core_y.hasLimits);
197  bcore_y.GetChild("startValueFrom").GetData(fGlobalFitData.core_y.startValueFrom);
198  bcore_y.GetChild("startValue").GetData(fGlobalFitData.core_y.startValue);
199  bcore_y.GetChild("startError").GetData(fGlobalFitData.core_y.startError);
200  bcore_y.GetChild("lowLimit").GetData(fGlobalFitData.core_y.lowLimit);
201  bcore_y.GetChild("highLimit").GetData(fGlobalFitData.core_y.highLimit);
202 
203  utl::Branch bcore_z = bGlobalFitData.GetChild("core_z");
204  bcore_z.GetChild("isFix").GetData(fGlobalFitData.core_z.isFix);
205  bcore_z.GetChild("hasLimits").GetData(fGlobalFitData.core_z.hasLimits);
206  bcore_z.GetChild("startValueFrom").GetData(fGlobalFitData.core_z.startValueFrom);
207  bcore_z.GetChild("startValue").GetData(fGlobalFitData.core_z.startValue);
208  bcore_z.GetChild("startError").GetData(fGlobalFitData.core_z.startError);
209  bcore_z.GetChild("lowLimit").GetData(fGlobalFitData.core_z.lowLimit);
210  bcore_z.GetChild("highLimit").GetData(fGlobalFitData.core_z.highLimit);
211 
212  utl::Branch bsigmaPlus = bGlobalFitData.GetChild("sigmaPlus");
213  bsigmaPlus.GetChild("isFix").GetData(fGlobalFitData.sigmaPlus.isFix);
214  bsigmaPlus.GetChild("hasLimits").GetData(fGlobalFitData.sigmaPlus.hasLimits);
215  bsigmaPlus.GetChild("startValueFrom").GetData(fGlobalFitData.sigmaPlus.startValueFrom);
216  bsigmaPlus.GetChild("startValue").GetData(fGlobalFitData.sigmaPlus.startValue);
217  bsigmaPlus.GetChild("startError").GetData(fGlobalFitData.sigmaPlus.startError);
218  bsigmaPlus.GetChild("lowLimit").GetData(fGlobalFitData.sigmaPlus.lowLimit);
219  bsigmaPlus.GetChild("highLimit").GetData(fGlobalFitData.sigmaPlus.highLimit);
220 
221  utl::Branch bC2Theta = bGlobalFitData.GetChild("C2Theta");
222  bC2Theta.GetChild("isFix").GetData(fGlobalFitData.C2Theta.isFix);
223  bC2Theta.GetChild("hasLimits").GetData(fGlobalFitData.C2Theta.hasLimits);
224  bC2Theta.GetChild("startValueFrom").GetData(fGlobalFitData.C2Theta.startValueFrom);
225  bC2Theta.GetChild("startValue").GetData(fGlobalFitData.C2Theta.startValue);
226  bC2Theta.GetChild("startError").GetData(fGlobalFitData.C2Theta.startError);
227  bC2Theta.GetChild("lowLimit").GetData(fGlobalFitData.C2Theta.lowLimit);
228  bC2Theta.GetChild("highLimit").GetData(fGlobalFitData.C2Theta.highLimit);
229 
230  utl::Branch bC1Theta = bGlobalFitData.GetChild("C1Theta");
231  bC1Theta.GetChild("isFix").GetData(fGlobalFitData.C1Theta.isFix);
232  bC1Theta.GetChild("hasLimits").GetData(fGlobalFitData.C1Theta.hasLimits);
233  bC1Theta.GetChild("startValueFrom").GetData(fGlobalFitData.C1Theta.startValueFrom);
234  bC1Theta.GetChild("startValue").GetData(fGlobalFitData.C1Theta.startValue);
235  bC1Theta.GetChild("startError").GetData(fGlobalFitData.C1Theta.startError);
236  bC1Theta.GetChild("lowLimit").GetData(fGlobalFitData.C1Theta.lowLimit);
237  bC1Theta.GetChild("highLimit").GetData(fGlobalFitData.C1Theta.highLimit);
238 
239  utl::Branch bCTheta = bGlobalFitData.GetChild("CTheta");
240  bCTheta.GetChild("isFix").GetData(fGlobalFitData.CTheta.isFix);
241  bCTheta.GetChild("hasLimits").GetData(fGlobalFitData.CTheta.hasLimits);
242  bCTheta.GetChild("startValueFrom").GetData(fGlobalFitData.CTheta.startValueFrom);
243  bCTheta.GetChild("startValue").GetData(fGlobalFitData.CTheta.startValue);
244  bCTheta.GetChild("startError").GetData(fGlobalFitData.CTheta.startError);
245  bCTheta.GetChild("lowLimit").GetData(fGlobalFitData.CTheta.lowLimit);
246  bCTheta.GetChild("highLimit").GetData(fGlobalFitData.CTheta.highLimit);
247 
248  utl::Branch bC1 = bGlobalFitData.GetChild("C1");
249  bC1.GetChild("isFix").GetData(fGlobalFitData.C1.isFix);
250  bC1.GetChild("hasLimits").GetData(fGlobalFitData.C1.hasLimits);
251  bC1.GetChild("startValueFrom").GetData(fGlobalFitData.C1.startValueFrom);
252  bC1.GetChild("startValue").GetData(fGlobalFitData.C1.startValue);
253  bC1.GetChild("startError").GetData(fGlobalFitData.C1.startError);
254  bC1.GetChild("lowLimit").GetData(fGlobalFitData.C1.lowLimit);
255  bC1.GetChild("highLimit").GetData(fGlobalFitData.C1.highLimit);
256 
257  utl::Branch bC2 = bGlobalFitData.GetChild("C2");
258  bC2.GetChild("isFix").GetData(fGlobalFitData.C2.isFix);
259  bC2.GetChild("hasLimits").GetData(fGlobalFitData.C2.hasLimits);
260  bC2.GetChild("startValueFrom").GetData(fGlobalFitData.C2.startValueFrom);
261  bC2.GetChild("startValue").GetData(fGlobalFitData.C2.startValue);
262  bC2.GetChild("startError").GetData(fGlobalFitData.C2.startError);
263  bC2.GetChild("lowLimit").GetData(fGlobalFitData.C2.lowLimit);
264  bC2.GetChild("highLimit").GetData(fGlobalFitData.C2.highLimit);
265 
266  utl::Branch bgamma = bGlobalFitData.GetChild("gamma");
267  bgamma.GetChild("isFix").GetData(fGlobalFitData.gamma.isFix);
268  bgamma.GetChild("hasLimits").GetData(fGlobalFitData.gamma.hasLimits);
269  bgamma.GetChild("startValueFrom").GetData(fGlobalFitData.gamma.startValueFrom);
270  bgamma.GetChild("startValue").GetData(fGlobalFitData.gamma.startValue);
271  bgamma.GetChild("startError").GetData(fGlobalFitData.gamma.startError);
272  bgamma.GetChild("lowLimit").GetData(fGlobalFitData.gamma.lowLimit);
273  bgamma.GetChild("highLimit").GetData(fGlobalFitData.gamma.highLimit);
274 
275  utl::Branch bb = bGlobalFitData.GetChild("b");
276  bb.GetChild("isFix").GetData(fGlobalFitData.b.isFix);
277  bb.GetChild("hasLimits").GetData(fGlobalFitData.b.hasLimits);
278  bb.GetChild("startValueFrom").GetData(fGlobalFitData.b.startValueFrom);
279  bb.GetChild("startValue").GetData(fGlobalFitData.b.startValue);
280  bb.GetChild("startError").GetData(fGlobalFitData.b.startError);
281  bb.GetChild("lowLimit").GetData(fGlobalFitData.b.lowLimit);
282  bb.GetChild("highLimit").GetData(fGlobalFitData.b.highLimit);
283 
284  utl::Branch bt0 = bGlobalFitData.GetChild("t0");
285  bt0.GetChild("isFix").GetData(fGlobalFitData.t0.isFix);
286  bt0.GetChild("hasLimits").GetData(fGlobalFitData.t0.hasLimits);
287  bt0.GetChild("startValueFrom").GetData(fGlobalFitData.t0.startValueFrom);
288  bt0.GetChild("startValue").GetData(fGlobalFitData.t0.startValue);
289  bt0.GetChild("startError").GetData(fGlobalFitData.t0.startError);
290  bt0.GetChild("lowLimit").GetData(fGlobalFitData.t0.lowLimit);
291  bt0.GetChild("highLimit").GetData(fGlobalFitData.t0.highLimit);
292 
293  utl::Branch barrivalDirection_phi = bGlobalFitData.GetChild("arrivalDirection_phi");
294  barrivalDirection_phi.GetChild("isFix").GetData(fGlobalFitData.arrivalDirection_phi.isFix);
295  barrivalDirection_phi.GetChild("hasLimits").GetData(
297  barrivalDirection_phi.GetChild("startValueFrom").GetData(
299  barrivalDirection_phi.GetChild("startValue").GetData(
301  barrivalDirection_phi.GetChild("startError").GetData(
303  barrivalDirection_phi.GetChild("lowLimit").GetData(fGlobalFitData.arrivalDirection_phi.lowLimit);
304  barrivalDirection_phi.GetChild("highLimit").GetData(
306 
307  utl::Branch barrivalDirection_theta = bGlobalFitData.GetChild("arrivalDirection_theta");
308  barrivalDirection_theta.GetChild("isFix").GetData(fGlobalFitData.arrivalDirection_theta.isFix);
309  barrivalDirection_theta.GetChild("hasLimits").GetData(
311  barrivalDirection_theta.GetChild("startValueFrom").GetData(
313  barrivalDirection_theta.GetChild("startValue").GetData(
315  barrivalDirection_theta.GetChild("startError").GetData(
317  barrivalDirection_theta.GetChild("lowLimit").GetData(
319  barrivalDirection_theta.GetChild("highLimit").GetData(
321 
322  utl::Branch bshowerMax = bGlobalFitData.GetChild("showerMax");
323  bshowerMax.GetChild("isFix").GetData(fGlobalFitData.showerMax.isFix);
324  bshowerMax.GetChild("hasLimits").GetData(fGlobalFitData.showerMax.hasLimits);
325  bshowerMax.GetChild("startValueFrom").GetData(fGlobalFitData.showerMax.startValueFrom);
326  bshowerMax.GetChild("startValue").GetData(fGlobalFitData.showerMax.startValue);
327  bshowerMax.GetChild("startError").GetData(fGlobalFitData.showerMax.startError);
328  bshowerMax.GetChild("lowLimit").GetData(fGlobalFitData.showerMax.lowLimit);
329  bshowerMax.GetChild("highLimit").GetData(fGlobalFitData.showerMax.highLimit);
330 
331  return eSuccess;
332 }
333 
334 bool Sorter(std::vector<double> x, std::vector<double> y)
335 {
336  return (x[7] < y[7]);
337 }
338 
339 VModule::ResultFlag RdGlobalFit::Run(evt::Event& event)
340 {
341  // Put your simulation, reconstruction or analysis
342  // algorithm here. This method is normally called
343  // once per event, though the user can customize
344  // when it is called using the sequencing XML file.
345 
346  // For debugging of the SDCore:
347 
348  INFO("RdGlobalFit::Run()");
349  // Check if there are events at all
350  if (!event.HasREvent()) {
351  WARNING("No radio event found!");
352  return eSuccess;
353  }
354 
355  // initialize data structures
356  REvent& rEvent = event.GetREvent();
357  if (!event.HasRecShower()) {
358  event.MakeRecShower();
359  }
360  if (!event.GetRecShower().HasRRecShower()) {
361  event.GetRecShower().MakeRRecShower();
362  }
363 
364  ShowerRRecData& showerrrec = event.GetRecShower().GetRRecShower();
365 
366  const rdet::RDetector& rDetector = det::Detector::GetInstance().GetRDetector();
367 
368  // Initialising fit geometry.
369  const Point coreRF = event.GetRecShower().GetRRecShower().GetCoordinateOrigin();
370  utl::CoordinateSystemPtr RFCS = LocalCoordinateSystem::Create(coreRF);
371  utl::Vector showerAxis = showerrrec.GetReferenceAxis(event);
372 
373  // B.Z. Here the used Coordinatesystem is defined! Needs OPtions like ReFCS, MCCS, SDCS
374  // Later this is propagated to event.flocalCS
375  fLocalCS = getlocalCSPtr(event);
377  ERROR("fetching the localCSPtr according to Infile lead to NULLPtr -> eBreakLoop");
378  return (eBreakLoop);
379  }
380 
381  const double zenith = showerAxis.GetTheta(fLocalCS);
382 
383  int Nant = showerrrec.GetParameter(revt::eNumberOfStationsWithPulseFound);
384  if (Nant < 3)
385  return eContinueLoop;
386 
387  //B.Z. Übergang in ShowerCoordinates!! localCS muss überall verwendet werden!
388  Vector MagneticField = showerrrec.GetMagneticFieldVector();
389  //utl::RadioGeometryUtilities transformation = utl::RadioGeometryUtilities(showerAxis, localCS,
390  // MagneticField);
391 
392  unsigned int signal_stations = 0;
393  unsigned int silent_stations = 0;
394 
396  sIt != rEvent.CandidateStationsEnd(); ++sIt) {
397 
398  Station& station = *sIt;
399 
400  if (station.IsSaturated()) { // skip saturated stations
401  continue;
402  }
403 
404  if (!station.HasSignal()) { // skip silent station
405  silent_stations++;
406  } else {
407  signal_stations++;
408  }
409 
410  }
411 
412  // Only events with at least 3 stations are considered further.
413  if (signal_stations < 3) {
414  WARNING("Number of signalstations after rejection of saturated stations < 3 -> CONTINUE!");
415  return eSuccess;
416  }
417 
418  //Fetching the Data to be fitted by the Global Fit
419  EventFitData eventData;
420  eventData.fLocalCS = fLocalCS;
421  std::vector<StationFitData> vStationFitData;
422  unsigned int nrDataPoints = 0;
423  double meanSignalTime = 0.; // used as startvalue of t0 in timefit.
424  double meanSignalTimeError = 0.;
426  sIt != rEvent.CandidateStationsEnd(); ++sIt) {
427  Station& station = *sIt;
428  StationRecData& sRec = station.GetRecData();
429  if (station.IsSaturated()) { // skip saturated stations
430  continue;
431  }
432  if (!station.HasSignal()) { // skip silent stations
433  continue;
434  }
435  // Fetching Position independent from coordinate system
436  const Point sPos = rDetector.GetStation(station).GetPosition();
437 
438  //Fetching Energydensity for 2dLDFFit
439  double integral = sRec.GetParameter(revt::eSignalEnergyFluenceMag);
440  double uncertainty = sRec.GetParameterError(revt::eSignalEnergyFluenceMag);
441 
442  // the noise level is added to reflect the uncertainty of the model
443  uncertainty = uncertainty * sqrt(1.79);
444 
445  //Calculating and Fetching time Parameter for ArrivalTimeFit
446  double signalTime = sIt->GetRecData().GetParameter(revt::eSignalTime);
447  double signalTimeError = sIt->GetRecData().GetParameterError(eSignalTime) * sqrt(1.65);
448 
449  if (station.HasSignal()) {
450  ofstream errorDatei("ExperimentalErrors.txt", ios::out | ios::app);
451  errorDatei << event.GetHeader().GetId() << "\t"
452  << event.GetREvent().GetHeader().GetRunNumber() << "\t OfflineTimeerror: "
453  << signalTimeError << "\t IntAmplError: " << uncertainty << endl;
454  errorDatei.close();
455 
456  //Providing the global Fit Datastructure with data.
457  StationFitData temp_StationFitData;
458  temp_StationFitData.stationId = sIt->GetId();
459  temp_StationFitData.stationPosition = sPos;
460  temp_StationFitData.energyFluence = integral;
461  temp_StationFitData.energyFluenceError = uncertainty;
462  temp_StationFitData.signalTime = signalTime;
463  temp_StationFitData.signalTimeError = signalTimeError;
464  vStationFitData.push_back(temp_StationFitData);
465  ++nrDataPoints;
466  meanSignalTime = meanSignalTime + signalTime;
467  meanSignalTimeError = meanSignalTimeError + signalTimeError;
468  }
469  }
470 
471  meanSignalTime /= nrDataPoints;
472  meanSignalTimeError /= nrDataPoints;
473 
475  eventData,
476  vStationFitData,
477  MagneticField,
480 
481  //Needs to be uncomented when deleting the original ldffit above
482 
483  double A_scale = fLDFConstsTable.A_scale;
484 
485  if ((zenith) < 10. * utl::degree) {
488  } else if ((zenith) < 20. * utl::degree) {
491  } else if ((zenith) < 30. * utl::degree) {
494  } else if ((zenith) < 40. * utl::degree) {
497  } else if ((zenith) < 50. * utl::degree) {
500  } else if ((zenith) < 55. * utl::degree) {
503  A_scale = fLDFConstsTable.A_scale_50_55;
504  fcalcLDFConsts.C0 = 0.46;
505  } else {
508  A_scale = fLDFConstsTable.A_scale_55;
509  fcalcLDFConsts.C0 = 0.71;
510  }
511 
512  // Depending on the infile settings fGlobalFitData:Values are overwritten for core, direction.
514 
515  ROOT::Minuit2::MnUserParameters upar;
516 
519  1.1 * fcalcLDFConsts.C2theta);
522  1.1 * fcalcLDFConsts.C1theta);
524  0.1 * fLDFConstsTable.A_scale, A_scale,
525  1.1 * fLDFConstsTable.A_scale);
530 
531  // Filling minuit Parameters
532  // Even though, t0 startvalue is set here also, is always overwritten by the meanSignalTime later.
547  upar.Add("arrivalDirection_phi", fGlobalFitData.arrivalDirection_phi.startValue,
549  upar.Add("arrivalDirection_theta", fGlobalFitData.arrivalDirection_theta.startValue,
551 
552  //Fix Parameters which are given by Johannes 2dLDF studies. Compare ...Paper...
553  upar.Fix("CTheta");
554  upar.Fix("C2Theta");
555  upar.Fix("C1Theta");
556  upar.Fix("C1");
557  upar.Fix("C2");
558 
559  if (fFitConfig.fixCore == true) {
560  upar.Fix("core_x");
561  upar.Fix("core_y");
562  upar.Fix("core_z");
563  }
564 
565  if (fFitConfig.fitTwoDLDF == false) {
566  upar.Fix("sigmaPlus");
567  upar.Fix("Aplus");
568  }
569 
570  if (fFitConfig.fitArrivalTime == false) {
571  upar.Fix("gamma");
572  upar.Fix("b");
573  upar.Fix("t0");
574  }
575 
576  // Filling minuit Parameters
578  upar.Fix("Aplus");
580  upar.Fix("core_x");
582  upar.Fix("core_y");
584  upar.Fix("core_z");
586  upar.Fix("sigmaPlus");
588  upar.Fix("C2Theta");
590  upar.Fix("C1Theta");
592  upar.Fix("CTheta");
593  if (fGlobalFitData.C1.isFix)
594  upar.Fix("C1");
595  if (fGlobalFitData.C2.isFix)
596  upar.Fix("C2");
598  upar.Fix("gamma");
599  if (fGlobalFitData.b.isFix)
600  upar.Fix("b");
601  if (fGlobalFitData.t0.isFix)
602  upar.Fix("t0");
604  upar.Fix("arrivalDirection_phi");
606  upar.Fix("arrivalDirection_theta");
608  upar.Fix("showerMax");
609 
610  //Setting user Parameter Limits
612  upar.SetLimits("Aplus", fGlobalFitData.Aplus.lowLimit, fGlobalFitData.Aplus.highLimit);
614  upar.SetLimits("core_x", fGlobalFitData.core_x.lowLimit, fGlobalFitData.core_x.highLimit);
616  upar.SetLimits("core_y", fGlobalFitData.core_y.lowLimit, fGlobalFitData.core_y.highLimit);
618  upar.SetLimits("core_z", fGlobalFitData.core_z.lowLimit, fGlobalFitData.Aplus.highLimit);
620  upar.SetLimits("sigmaPlus", fGlobalFitData.sigmaPlus.lowLimit,
623  upar.SetLimits("C2Theta", fGlobalFitData.C2Theta.lowLimit, fGlobalFitData.Aplus.highLimit);
625  upar.SetLimits("C1Theta", fGlobalFitData.C1Theta.lowLimit, fGlobalFitData.C1Theta.highLimit);
627  upar.SetLimits("CTheta", fGlobalFitData.CTheta.lowLimit, fGlobalFitData.CTheta.highLimit);
629  upar.SetLimits("C1", fGlobalFitData.C1.lowLimit, fGlobalFitData.C1.highLimit);
631  upar.SetLimits("C2", fGlobalFitData.C2.lowLimit, fGlobalFitData.C2.highLimit);
633  upar.SetLimits("gamma", fGlobalFitData.gamma.lowLimit, fGlobalFitData.gamma.highLimit);
635  upar.SetLimits("b", fGlobalFitData.b.lowLimit, fGlobalFitData.b.highLimit);
637  upar.SetLimits("t0", fGlobalFitData.t0.lowLimit, fGlobalFitData.t0.highLimit);
639  upar.SetLimits("arrivalDirection_phi", fGlobalFitData.arrivalDirection_phi.lowLimit,
642  upar.SetLimits("arrivalDirection_theta", fGlobalFitData.arrivalDirection_theta.lowLimit,
645  upar.SetLimits("showerMax", fGlobalFitData.showerMax.lowLimit,
647 
648  // Here, t0 startvalue is always overwritten by the meansignaltime.
649  upar.SetValue("t0", meanSignalTime);
650  upar.SetLimits("t0", meanSignalTime + 30, meanSignalTime - 30);
651 
652  // Start the actual FIT in 5 stages
653  const ROOT::Minuit2::MnStrategy strat(2);
654  //Stage 1: A and sigma are free
655  int NDF = 0;
656  ROOT::Minuit2::MnMigrad LDFPrefit(fitFunction, upar, strat);
657  if (fOrigFitConfig.fitTwoDLDF == true) {
658  fFitConfig.fitTwoDLDF = true;
659  fFitConfig.fitArrivalTime = false;
660  upar.Fix("core_x");
661  upar.Fix("core_y");
662  ROOT::Minuit2::MnMigrad LDFPrefit(fitFunction, upar, strat);
663  LDFPrefit.Fix("arrivalDirection_phi");
664  LDFPrefit.Fix("arrivalDirection_theta");
665  LDFPrefit.Fix("gamma");
666  LDFPrefit.Fix("t0");
667  NDF = calcNDF(LDFPrefit.Parameters(), nrDataPoints);
668  if (NDF < 1) {
669  INFO("NDF less than 1 -> eContinueLoop");
670  return eContinueLoop;
671  }
672  ROOT::Minuit2::FunctionMinimum LDFPrefitMin = LDFPrefit();
673  cout << "Fit result Stage 1:" << endl << LDFPrefitMin << endl;
674  }
675 
676  //Stage 2: Full energy fluence fit (arrival direction stays fix)
677  ROOT::Minuit2::MnMigrad LDFPrefit2 = LDFPrefit;
678  if (fOrigFitConfig.fitTwoDLDF == true) {
679  fFitConfig.fitTwoDLDF = true;
680  fFitConfig.fitArrivalTime = false;
681  LDFPrefit2.Fix("arrivalDirection_phi");
682  LDFPrefit2.Fix("arrivalDirection_theta");
683  LDFPrefit2.Fix("gamma");
684  LDFPrefit2.Fix("t0");
686  LDFPrefit2.Release("core_x");
688  LDFPrefit2.Release("core_y");
689  NDF = calcNDF(LDFPrefit2.Parameters(), nrDataPoints);
690  if (NDF < 1) {
691  INFO("NDF less than 1 -> eContinueLoop");
692  return eContinueLoop;
693  }
694  ROOT::Minuit2::FunctionMinimum LDFPrefitMin2 = LDFPrefit2();
695  cout << "Fit result Stage 2:" << endl << LDFPrefitMin2 << endl;
696  }
697 
698  //Stage 3: Only impact parameter t0 is free
699  ROOT::Minuit2::MnMigrad PrefitT0 = LDFPrefit2;
700  if (fOrigFitConfig.fitArrivalTime == true) {
701  //still use LDF chi2 to bind the fit improvement to 2dLDF already.
702  if (fOrigFitConfig.fitTwoDLDF == true) {
703  fFitConfig.fitTwoDLDF = true;
704  PrefitT0.Fix("Aplus");
705  PrefitT0.Fix("sigmaPlus");
706  } else {
707  fFitConfig.fitTwoDLDF = false;
708  }
709  fFitConfig.fitArrivalTime = true;
710  PrefitT0.Fix("arrivalDirection_phi");
711  PrefitT0.Fix("arrivalDirection_theta");
712  PrefitT0.Fix("gamma");
713  PrefitT0.Fix("core_x");
714  PrefitT0.Fix("core_y");
715  if (!fGlobalFitData.t0.isFix)
716  PrefitT0.Release("t0");
717  NDF = calcNDF(PrefitT0.Parameters(), nrDataPoints);
718  if (NDF < 1) {
719  INFO("NDF less than 1 -> eContinueLoop");
720  return eContinueLoop;
721  }
722  ROOT::Minuit2::FunctionMinimum PrefitT0Min = PrefitT0();
723  cout << "Fit result Stage 3:" << endl << PrefitT0Min << endl;
724  }
725 
726  //Stage 4: Arrivaltime fit (core taken from energy fluence fit)
727  ROOT::Minuit2::MnMigrad PrefitT = PrefitT0;
728  if (fOrigFitConfig.fitArrivalTime == true) {
729  //still use LDF chi2 to base the fit improvement on 2dLDF chi2 already.
730  if (fOrigFitConfig.fitTwoDLDF == true) {
731  fFitConfig.fitTwoDLDF = true;
732  PrefitT.Fix("Aplus");
733  PrefitT.Fix("sigmaPlus");
734  } else {
735  fFitConfig.fitTwoDLDF = false;
736  }
737  fFitConfig.fitArrivalTime = true;
739  PrefitT.Release("arrivalDirection_phi");
741  PrefitT.Release("arrivalDirection_theta");
743  PrefitT.Release("gamma");
744  if (!fGlobalFitData.t0.isFix)
745  PrefitT.Release("t0");
746 
747  PrefitT.Fix("core_x");
748  PrefitT.Fix("core_y");
749  NDF = calcNDF(PrefitT.Parameters(), nrDataPoints);
750  if (NDF < 1) {
751  INFO("NDF less than 1 -> eContinueLoop");
752  return eContinueLoop;
753  }
754  ROOT::Minuit2::FunctionMinimum PrefitTMin = PrefitT();
755  cout << "Fit result Stage 4:" << endl << PrefitTMin << endl;
756  }
757 
758  //Stage 5: Finally, all Parameters are fitted according the xml specifications.
759  ROOT::Minuit2::MnMigrad Fit = PrefitT;
760  if (fOrigFitConfig.fitTwoDLDF == true) {
761  fFitConfig.fitTwoDLDF = true;
763  Fit.Release("Aplus");
765  Fit.Release("sigmaPlus");
766  } else {
767  fFitConfig.fitTwoDLDF = false;
768  }
769  if (fOrigFitConfig.fitArrivalTime == true) {
770  fFitConfig.fitArrivalTime = true;
772  Fit.Release("arrivalDirection_phi");
774  Fit.Release("arrivalDirection_theta");
776  Fit.Release("gamma");
777  if (!fGlobalFitData.t0.isFix)
778  Fit.Release("t0");
779  } else {
780  fFitConfig.fitArrivalTime = false;
781  }
782  Fit.Fix("core_x");
783  Fit.Fix("core_y");
785  Fit.Release("core_x");
787  Fit.Release("core_y");
788  NDF = calcNDF(Fit.Parameters(), nrDataPoints);
789  if (NDF < 1) {
790  INFO("NDF less than 1 -> eContinueLoop");
791  return eContinueLoop;
792  }
793  if (fOrigFitConfig.fitArrivalTime == true) {
795  Fit.Release("arrivalDirection_phi");
797  Fit.Release("arrivalDirection_theta");
798  }
799  ROOT::Minuit2::FunctionMinimum minimum = Fit(10000, 0.0001);
800  cout << "Final fit result (Stage 5):" << endl << event.GetHeader().GetId() << "\t"
801  << event.GetREvent().GetHeader().GetRunNumber() << "\t" << endl << "Nr. St = " << nrDataPoints
802  << endl << meanSignalTime << meanSignalTime << endl << minimum << endl;
803  std::cout << "Nr fct calls: " << minimum.NFcn() << std::endl;
804 
805  // get the Likelihoods of the Minimum.
806  fitFunction(minimum.UserParameters().Params());
807  double minTwoDLDFLikelihood = fitFunction.getTwoDLDFLikelyhood();
808  double minArrivalTimeLikelihood = fitFunction.getArrivalTimeLikelihood();
809 
810  // Save core contour as text file.
811  // 1.) range from -300 m to 300 m
813  std::vector<double> contourParams = minimum.UserParameters().Params();
814  std::vector<std::vector<double> > contourVec;
815  ofstream Zieldatei("CoreContour.dat", ios::out | ios::app);
816  for (int x = -300; x < 301; x = x + 10) {
817  for (int y = -300; y < 301; y = y + 10) {
818  std::vector<double> contourtriple;
819  contourParams[1] = x;
820  contourParams[2] = y;
821  contourtriple.push_back(x);
822  contourtriple.push_back(y);
823  contourtriple.push_back(fitFunction(contourParams));
824  contourVec.push_back(contourtriple);
825  Zieldatei << contourtriple[0] << "\t" << contourtriple[1] << "\t" << contourtriple[2]
826  << "\t" << event.GetHeader().GetId() << std::endl;
827  }
828  }
829  Zieldatei.close();
830  }
831  // 2.) Zoom into the range from -5 m to 5 m
833  std::vector<double> contourParams = minimum.UserParameters().Params();
834  double min_x = minimum.UserParameters().Value("core_x");
835  double min_y = minimum.UserParameters().Value("core_y");
836  std::vector<std::vector<double> > contourVec;
837  ofstream Zieldatei("CoreContourZoom.dat", ios::out | ios::app);
838  for (double x = min_x - 5; x < min_x + 5; x = x + 0.25) {
839  for (double y = min_y - 5; y < min_y + 5; y = y + 0.25) {
840  std::vector<double> contourtriple;
841  contourParams[1] = x;
842  contourParams[2] = y;
843  contourtriple.push_back(x);
844  contourtriple.push_back(y);
845  contourtriple.push_back(fitFunction(contourParams));
846  contourVec.push_back(contourtriple);
847  Zieldatei << contourtriple[0] << "\t" << contourtriple[1] << "\t" << contourtriple[2]
848  << "\t" << event.GetHeader().GetId() << std::endl;
849  }
850  }
851  Zieldatei.close();
852  }
853 
854  //Scan & Plot the parameters to the console (partly via std::cout)
856  std::vector<std::string> parameterNames;
857  parameterNames.push_back("showerMax");
858  parameterNames.push_back("core_x");
859  parameterNames.push_back("core_y");
860  parameterNames.push_back("core_z");
861  parameterNames.push_back("t0");
862  parameterNames.push_back("gamma");
863  parameterNames.push_back("arrivalDirection_theta");
864  parameterNames.push_back("arrivalDirection_phi");
865  parameterNames.push_back("Aplus");
866  parameterNames.push_back("sigmaPlus");
867  std::cout << "Defined scan parameters" << std::endl << flush;
868  std::vector<std::pair<std::vector<std::pair<double, double> >, std::string> > scanPlots(
869  scanParameters(fitFunction, minimum, parameterNames));
870  printPlotsVec(scanPlots);
871  }
872 
873  ROOT::Minuit2::MnUserParameterState minUstate = minimum.UserState();
874  ROOT::Minuit2::MnUserCovariance cov = minUstate.Covariance();
875 
876  utl::Vector fittedShoweraxis(
877  sin(minUstate.Value("arrivalDirection_theta")) * cos(minUstate.Value("arrivalDirection_phi")),
878  sin(minUstate.Value("arrivalDirection_theta")) * sin(minUstate.Value("arrivalDirection_phi")),
879  cos(minUstate.Value("arrivalDirection_theta")), eventData.fLocalCS);
880  double sineAlpha = RadioGeometryUtilities::GetLorentzVector(fittedShoweraxis,
881  showerrrec.GetMagneticFieldVector())
882  .GetMag();
883  double sigma = minUstate.Value("sigmaPlus");
884  double sigma_error = minUstate.Error("sigmaPlus");
885  double A = minUstate.Value("Aplus");
886  double A_error = minUstate.Error("Aplus");
887  double sigmaA_error = 0; //The global Fit does not now this error
888 
889  double gl_epsilon =
890  A * TMath::Pi()
891  * (pow(sigma, 2)
893  * TMath::Exp(2 * fLDFConstsTable.C3 + 2 * fLDFConstsTable.C4 * sigma));
894  double gl_epsilonError = pow(
895  pow(TMath::Pi(), 2)
896  * pow(
898  * TMath::Exp(2 * fLDFConstsTable.C3 + 2 * fLDFConstsTable.C4 * sigma)
899  - pow(sigma, 2),
900  2) * pow(A_error, 2)
901  + pow(A, 2) * pow(TMath::Pi(), 2)
902  * pow(
904  * TMath::Exp(2 * fLDFConstsTable.C4 * sigma + 2 * fLDFConstsTable.C3)
905  - 2 * sigma),
906  2) * pow(sigma_error, 2)
907  - TMath::Pi()
909  * TMath::Exp(2 * fLDFConstsTable.C4 * sigma + 2 * fLDFConstsTable.C3) - 2 * sigma)
910  * sigmaA_error,
911  0.5);
912 
913  const double d = 2.3137 * 1e14; // energy calibration parameters from Aab et al., PRD 93, 122005 (2016)
914  const double c = 0.505;
915  double gl_energy = d * std::pow(gl_epsilon / (sineAlpha * sineAlpha), c);
916  double gl_energyError = c * d * std::pow(1 / (sineAlpha * sineAlpha), c)
917  * std::pow(gl_epsilon, c - 1) * gl_epsilonError;
918 
919  Point coreFit(minUstate.Value("core_x"), minUstate.Value("core_y"), minUstate.Value("core_z"),
920  eventData.fLocalCS);
921  Point coreFitError(minUstate.Error("core_x"), minUstate.Error("core_y"),
922  minUstate.Error("core_z"), fLocalCS);
923 
924  // should be GetSiteCoordinateSystem(); but RdFiller.cc::AddRadioDetector() sets
925  // the positions against the comments in ADST Detector to referenceCS.
926  utl::CoordinateSystemPtr siteCS = det::Detector::GetInstance().GetReferenceCoordinateSystem();
927  Point coreInSiteCS = getCoreInCSPlane(coreFit, fittedShoweraxis, siteCS);
928 
929  // Get the referenceCS (which is the same as siteCS, see above)
930  utl::CoordinateSystemPtr referenceCS =
931  det::Detector::GetInstance().GetReferenceCoordinateSystem();
932  Point coreInReferenceCS = getCoreInCSPlane(coreFit, fittedShoweraxis, referenceCS);
933 
934  // At one point, one can think of moving this to FitModels.cc
935  double RmaxFrSigma = 65 * minUstate.Value("sigmaPlus") - 3129; // in m
936  double RmaxFrGamma = 200 * minUstate.Value("gamma") - 17700; // in m
937  double zenitInLocalCS = fittedShoweraxis.GetTheta(getlocalCSPtr(event));
938  double XmaxFromSigma = XmaxFromRmax(event, RmaxFrSigma, zenitInLocalCS);
939  double XmaxFromGamma = XmaxFromRmax(event, RmaxFrGamma, zenitInLocalCS);
940 
941  ShowerRRecData& showerReco = event.GetRecShower().GetRRecShower();
942  showerReco.SetParameter(eGlobalFitA, minUstate.Value("Aplus"));
943  showerReco.SetParameterError(eGlobalFitA, minUstate.Error("Aplus"));
944  showerReco.SetParameter(eGlobalFitB, minUstate.Value("b"));
945  showerReco.SetParameterError(eGlobalFitB, minUstate.Error("b"));
946  showerReco.SetParameter(eGlobalFitChi2, minUstate.Fval());
947  showerReco.SetParameter(eGlobalFitChi2A, minTwoDLDFLikelihood);
948  showerReco.SetParameter(eGlobalFitChi2T, minArrivalTimeLikelihood);
949  showerReco.SetParameter(eGlobalFitE, gl_energy);
950  showerReco.SetParameterError(eGlobalFitE, gl_energyError);
951  showerReco.SetParameter(eGlobalFitGamma, minUstate.Value("gamma"));
952  showerReco.SetParameterError(eGlobalFitGamma, minUstate.Error("gamma"));
953  showerReco.SetParameter(eGlobalFitPhi, fittedShoweraxis.GetPhi(RFCS));
954  showerReco.SetParameter(eGlobalFitTheta, fittedShoweraxis.GetTheta(RFCS));
955  showerReco.SetParameter(eGlobalFitRadE, gl_epsilon);
956  showerReco.SetParameterError(eGlobalFitRadE, gl_epsilonError);
957  showerReco.SetParameter(eGlobalFitSigma, minUstate.Value("sigmaPlus"));
958  showerReco.SetParameterError(eGlobalFitSigma, minUstate.Error("sigmaPlus"));
959  showerReco.SetParameter(eGlobalFitT0, minUstate.Value("t0"));
960  showerReco.SetParameterError(eGlobalFitT0, minUstate.Error("t0"));
961  showerReco.SetParameter(eGlobalFitX, coreInReferenceCS.GetX(referenceCS));
962  showerReco.SetParameterError(eGlobalFitX, minUstate.Error("core_x"));
963  showerReco.SetParameter(eGlobalFitY, coreInReferenceCS.GetY(referenceCS));
964  showerReco.SetParameterError(eGlobalFitY, minUstate.Error("core_y"));
965  showerReco.SetParameter(eGlobalFitZ, coreInReferenceCS.GetY(referenceCS));
966  showerReco.SetParameterError(eGlobalFitZ, minUstate.Error("core_z"));
967  showerReco.SetParameter(eGlobalFitValMin, minimum.IsValid());
968  showerReco.SetParameter(eGlobalFitRmaxFrSigma, RmaxFrSigma);
969  showerReco.SetParameter(eGlobalFitXmaxFrSigma, XmaxFromSigma);
970  showerReco.SetParameter(eGlobalFitRmaxFrGamma, RmaxFrGamma);
971  showerReco.SetParameter(eGlobalFitXmaxFrGamma, XmaxFromGamma);
972  showerReco.SetParameter(eGlobalFitXsitCS, coreInSiteCS.GetX(siteCS));
973  showerReco.SetParameter(eGlobalFitYsitCS, coreInSiteCS.GetY(siteCS));
974  showerReco.SetParameter(eGlobalFitZsitCS, coreInSiteCS.GetZ(siteCS));
975  showerReco.SetParameter(eGlobalFitNDF, NDF);
976  showerReco.SetParameter(eGlobalFitNDFA, 0.);
977  showerReco.SetParameter(eGlobalFitNDFT, 0.);
978  return (eSuccess);
979 }
980 
981 std::vector<std::pair<std::vector<std::pair<double, double> >, std::string> > RdGlobalFit::scanParameters(
983  ROOT::Minuit2::FunctionMinimum minimum/*, ROOT::Minuit2::MnStrategy strat*/,
984  std::vector<std::string> parameterToScan)
985 {
986  ROOT::Minuit2::MnStrategy strat(2);
987  std::vector<std::pair<std::vector<std::pair<double, double> >, std::string> > scanResults;
988  ROOT::Minuit2::MnScan scan(fitFct, minimum.UserState(), strat);
989  for (std::vector<std::string>::iterator it = parameterToScan.begin(); it != parameterToScan.end();
990  ++it) {
991  std::cout << "Actual scaning of parameters." << std::endl << flush;
992  int parameterIndex = minimum.UserParameters().Index(*it);
993  double low = minimum.UserParameters().Value(*it) - 10 * minimum.UserParameters().Error(*it);
994  double up = minimum.UserParameters().Value(*it) + 10 * minimum.UserParameters().Error(*it);
995  std::vector<std::pair<double, double> > points = scan.Scan(parameterIndex, 50, low, up);
996  std::pair<std::vector<std::pair<double, double> >, std::string> parameterScan(points, *it);
997  scanResults.push_back(parameterScan);
998  }
999  return scanResults;
1000 }
1001 
1002 void RdGlobalFit::printPlotsVec(
1003  std::vector<std::pair<std::vector<std::pair<double, double> >, std::string> > plotsVec)
1004 {
1005  for (std::vector<std::pair<std::vector<std::pair<double, double> >, std::string> >::iterator it =
1006  plotsVec.begin(); it != plotsVec.end(); ++it) {
1007  std::cout << "Plotting core scans" << std::endl << flush;
1008  std::vector<std::pair<double, double> > plotPoints = it->first;
1009  std::string plotComment = it->second;
1010  ROOT::Minuit2::MnPlot plot;
1011  cout << "Comment: " << endl << plotComment << endl;
1012  plot(plotPoints);
1013  }
1014 }
1015 
1016 utl::CoordinateSystemPtr RdGlobalFit::getlocalCSPtr(evt::Event& event)
1017 {
1018  if (fFitConfig.useCS == "RLocal") {
1019  const Point coreRLocal = event.GetRecShower().GetRRecShower().GetCoordinateOrigin();
1020  utl::CoordinateSystemPtr RLocalCS = LocalCoordinateSystem::Create(coreRLocal);
1021  return RLocalCS;
1022  }
1023 
1024  if (fFitConfig.useCS == "SD") {
1025  const Point coreSD = event.GetRecShower().GetSRecShower().GetCorePosition(); // use SD-Core as reference for fit
1026  utl::CoordinateSystemPtr SDCS = LocalCoordinateSystem::Create(coreSD); // use SD-Core as reference for fit
1027  return SDCS;
1028  }
1029 
1030  if (fFitConfig.useCS == "MC") {
1031  const Point coreMC = event.GetSimShower().GetPosition();
1032  utl::CoordinateSystemPtr MCCS = LocalCoordinateSystem::Create(coreMC);
1033  return MCCS;
1034  }
1035 
1036  if (fFitConfig.useCS == "REF") {
1037  const Point coreRF = event.GetRecShower().GetRRecShower().GetCoordinateOrigin();
1038  utl::CoordinateSystemPtr RFCS = LocalCoordinateSystem::Create(coreRF);
1039  return RFCS;
1040  }
1041 
1042  if (fFitConfig.useCS == "RD") {
1043  const Point coreRD = event.GetRecShower().GetRRecShower().GetCorePosition();
1044  utl::CoordinateSystemPtr RDCS = LocalCoordinateSystem::Create(coreRD);
1045  return RDCS;
1046  }
1047 
1048  return (utl::CoordinateSystemPtr());
1049 }
1050 
1051 // Is not using the right atmospheric model yet. Its results are not validated yet.
1052 double RdGlobalFit::XmaxFromRmax(evt::Event& event, double rmax, double zenithInLocalCS)
1053 {
1054  det::Detector& detector = det::Detector::GetInstance();
1055  detector.Update(event.GetHeader().GetTime().GetGPSSecond());
1056  const atm::Atmosphere& theAtm = det::Detector::GetInstance().GetAtmosphere();
1057  double hauger = 1564; //m
1058  atm::ProfileResult depthVsheight = theAtm.EvaluateDepthVsHeight();
1059  double Xmax = ((depthVsheight.Y(hauger + rmax * m * cos(zenithInLocalCS))) / (g / cm / cm))
1060  / cos(zenithInLocalCS); //Xmax
1061  return Xmax;
1062 }
1063 void RdGlobalFit::setGlFitDataStartValues(evt::Event& event)
1064 {
1065  setGlFitDataCore(event);
1066  setGlFitDataDirection(event);
1067 }
1068 
1069 utl::Point RdGlobalFit::adaptSDCoreTofLocalCS(evt::Event& event)
1070 {
1071  const Point originFLocalCS(0., 0., 0., fLocalCS);
1072  const utl::Vector zAxisFLocalCS(0., 0., 1., fLocalCS);
1073  const utl::Plane XYPlaneFLocalCS(originFLocalCS, zAxisFLocalCS);
1074 
1075  const Point coreSD = event.GetRecShower().GetSRecShower().GetCorePosition();
1076  const utl::Vector& axisSD = event.GetRecShower().GetSRecShower().GetAxis();
1077  const utl::Line SDCoreAxisLine(coreSD, axisSD);
1078 
1079  utl::Point CorrCoreSD(utl::Intersection(SDCoreAxisLine, XYPlaneFLocalCS));
1080  return CorrCoreSD;
1081 }
1082 
1083 utl::Point RdGlobalFit::getCoreInCSPlane(utl::Point core, utl::Vector& axis,
1084  utl::CoordinateSystemPtr targetCS)
1085 {
1086  const Point originTargetCS(0., 0., 0., targetCS);
1087  const utl::Vector zAxisTargetCS(0., 0., 1., targetCS);
1088  const utl::Plane XYPlaneTargetCS(originTargetCS, zAxisTargetCS);
1089 
1090  const utl::Line CoreAxisLine(core, axis);
1091 
1092  utl::Point CoreInTargetCSPlane(utl::Intersection(CoreAxisLine, XYPlaneTargetCS));
1093  return CoreInTargetCSPlane;
1094 }
1095 
1096 void RdGlobalFit::setGlFitDataCore(evt::Event& event)
1097 {
1098  /* This is dangerous. Offline may crash when asked e.g. for the RD core, even if it is not
1099  used at all later on. Setting start values to MC missing.
1100  Initiating the x, y, and z component with different SD/RD/MC reconstructions seems odd.
1101  */
1102 
1103  const Point coreRD = event.GetRecShower().GetRRecShower().GetCorePosition();
1104  const Point coreSD = adaptSDCoreTofLocalCS(event);
1105 
1106  if (fGlobalFitData.core_x.startValueFrom == "RD") {
1108  }
1109  if (fGlobalFitData.core_x.startValueFrom == "SD") {
1111  }
1112 
1113  if (fGlobalFitData.core_y.startValueFrom == "RD") {
1115  }
1116  if (fGlobalFitData.core_y.startValueFrom == "SD") {
1118  }
1119 
1120  if (fGlobalFitData.core_z.startValueFrom == "RD") {
1122  }
1123  if (fGlobalFitData.core_z.startValueFrom == "SD") {
1125  }
1126 }
1127 
1128 void RdGlobalFit::setGlFitDataDirection(evt::Event& event)
1129 {
1130 
1132  fGlobalFitData.arrivalDirection_phi.startValue = event.GetRecShower().GetRRecShower().GetAxis()
1133  .GetPhi(fLocalCS);
1134  }
1136  fGlobalFitData.arrivalDirection_phi.startValue = event.GetRecShower().GetSRecShower().GetAxis()
1137  .GetPhi(fLocalCS);
1138  }
1140  //This compensates the fact, that MC-axis points in oposit direction with respect to RD, SD.
1141  utl::Vector sAxis = -event.GetSimShower().GetDirection();
1143  }
1144 
1147  event.GetRecShower().GetRRecShower().GetAxis().GetTheta(fLocalCS);
1148  }
1151  event.GetRecShower().GetSRecShower().GetAxis().GetTheta(fLocalCS);
1152  }
1154  //This compensates the fact, that MC-axis points in oposit direction with respect to RD, SD.
1155  utl::Vector sAxis = -event.GetSimShower().GetDirection();
1157  }
1158 }
1159 int RdGlobalFit::calcNDF(ROOT::Minuit2::MnUserParameters upar, int nrSigSt)
1160 {
1161  const std::vector<ROOT::Minuit2::MinuitParameter>& parameter = upar.Parameters();
1162  int dataPerStation = 0;
1163  if (fOrigFitConfig.fitTwoDLDF == true)
1164  ++dataPerStation;
1165  if (fOrigFitConfig.fitArrivalTime == true)
1166  ++dataPerStation;
1167  int NDF = dataPerStation * nrSigSt; //Assuming Time and Amplitude are independent.
1168  for (std::vector<ROOT::Minuit2::MinuitParameter>::const_iterator parit = parameter.begin();
1169  parit != parameter.end(); ++parit) {
1170 
1171  if ((parit->GetName() == "core_x") && !parit->IsFixed())
1172  --NDF;
1173  if ((parit->GetName() == "core_y") && !parit->IsFixed())
1174  --NDF;
1175  if ((parit->GetName() == "core_z") && !parit->IsFixed())
1176  --NDF;
1177  if ((parit->GetName() == "arrivalDirection_theta") && !parit->IsFixed())
1178  --NDF;
1179  if ((parit->GetName() == "arrivalDirection_phi") && !parit->IsFixed())
1180  --NDF;
1181  if ((parit->GetName() == "Aplus") && !parit->IsFixed())
1182  --NDF;
1183  if ((parit->GetName() == "C2Theta") && !parit->IsFixed())
1184  --NDF;
1185  if ((parit->GetName() == "C1Theta") && !parit->IsFixed())
1186  --NDF;
1187  if ((parit->GetName() == "CTheta") && !parit->IsFixed())
1188  --NDF;
1189  if ((parit->GetName() == "C1") && !parit->IsFixed())
1190  --NDF;
1191  if ((parit->GetName() == "C2") && !parit->IsFixed())
1192  --NDF;
1193  if ((parit->GetName() == "sigmaPlus") && !parit->IsFixed())
1194  --NDF;
1195  if ((parit->GetName() == "gamma") && !parit->IsFixed())
1196  --NDF;
1197  if ((parit->GetName() == "b") && !parit->IsFixed())
1198  --NDF;
1199  if ((parit->GetName() == "t0") && !parit->IsFixed())
1200  --NDF;
1201  }
1202  std::cout << "calculated NDF = " << NDF << std::endl;
1203  return NDF;
1204 }
1205 
1206 VModule::ResultFlag RdGlobalFit::Finish()
1207 {
1208  // Put any termination or cleanup code here.
1209  // This method is called once at the end of the run.
1210  INFO("RdGlobalFit::Finish()");
1211  return eSuccess;
1212 }
1213 
1214 }
Branch GetTopBranch() const
Definition: Branch.cc:63
std::string useCS
Definition: FitModels.h:31
utl::CoordinateSystemPtr getlocalCSPtr(evt::Event &event)
void Update(const utl::TimeStamp &time, const bool invData=true, const bool invComp=true, const bool forceRadio=false)
Update detector: deletes currently constructed stations and sets new time.
Definition: Detector.cc:179
Class to access station level reconstructed data.
Top of the interface to Atmosphere information.
void SetParameter(Parameter i, double value, bool lock=true)
Point object.
Definition: Point.h:32
double GetPhi(const CoordinateSystemPtr &coordinateSystem) const
azimuth (phi) angle in spherical and cylindrical coordinates
Definition: BasicVector.h:254
boost::filter_iterator< CandidateStationFilter, AllStationIterator > CandidateStationIterator
Iterator over all CandidateStations (i.e., HasSignal, HasNoSignal)
Definition: REvent.h:141
Report success to RunController.
Definition: VModule.h:62
evt::Header & GetHeader()
StationRecData & GetRecData()
Get station level reconstructed data.
bool HasRecShower() const
CandidateStationIterator CandidateStationsEnd()
Definition: REvent.h:146
utl::CoordinateSystemPtr fLocalCS
Definition: RdGlobalFit.h:85
Interface class to access to the Radio part of an event.
Definition: REvent.h:42
double GetTheta(const CoordinateSystemPtr &coordinateSystem) const
zenith (theta) angle in spherical coordinates
Definition: BasicVector.h:248
Skip remaining modules in the current loop and continue with next iteration of the loop...
Definition: VModule.h:68
ShowerRecData & GetRecShower()
Interface class to access to the RD Reconstruction of a Shower.
int calcNDF(ROOT::Minuit2::MnUserParameters upar, int nrSigSt)
double GetParameterError(const Parameter i) const
bool Sorter(std::vector< double > x, std::vector< double > y)
Definition: RdGlobalFit.cc:334
#define INFO(message)
Macro for logging informational messages.
Definition: ErrorLogger.h:161
void Init()
Initialise the registry.
vector< t2list > out
output of the algorithm: a list of clusters
Definition: XbAlgo.cc:32
Branch GetChild(const std::string &childName) const
Get child of this Branch by child name.
Definition: Branch.cc:211
double pow(const double x, const unsigned int i)
LDFConstsTable fLDFConstsTable
Definition: RdGlobalFit.h:99
bool HasREvent() const
double XmaxFromRmax(evt::Event &event, double rmax, double zenithInLocalCS)
double Y(const double x) const
Get the Y value (coordinate) for given X (ordinate)
const utl::TimeStamp & GetTime() const
Definition: Event/Header.h:33
Line Intersection(const Plane &p1, const Plane &p2)
Detector description interface for RDetector-related data.
Definition: RDetector.h:46
RdGlobalFitData fGlobalFitData
Definition: RdGlobalFit.h:98
utl::Point adaptSDCoreTofLocalCS(evt::Event &event)
boost::shared_ptr< const CoordinateTransformer > CoordinateSystemPtr
Shared pointer for coordinate systems.
void setGlFitDataCore(evt::Event &event)
Class representing a document branch.
Definition: Branch.h:107
Break current loop. It works for nested loops too!
Definition: VModule.h:66
class to hold data at the radio Station level.
Class describing a Plane object.
Definition: Plane.h:17
double GetX(const CoordinateSystemPtr &coordinateSystem) const
Definition: BasicVector.h:206
Class describing the Atmospheric profile.
Definition: ProfileResult.h:25
utl::CoordinateSystemPtr fLocalCS
Definition: FitModels.h:214
void printPlotsVec(std::vector< std::pair< std::vector< std::pair< double, double > >, std::string > >)
calcLDFConsts fcalcLDFConsts
Definition: RdGlobalFit.h:100
std::string startValueFrom
Definition: FitModels.h:143
bool HasRRecShower() const
Top of the hierarchy of the detector description interface.
Definition: Detector.h:81
void setGlFitDataStartValues(evt::Event &event)
bool IsSaturated() const
const atm::ProfileResult & EvaluateDepthVsHeight() const
Tabulated function giving Y=depth as a function of X=height.
CandidateStationIterator CandidateStationsBegin()
Definition: REvent.h:144
constexpr double degree
constexpr double g
Definition: AugerUnits.h:200
void setGlFitDataDirection(evt::Event &event)
#define WARNING(message)
Macro for logging warning messages.
Definition: ErrorLogger.h:163
void GetData(bool &b) const
Overloads of the GetData member template function.
Definition: Branch.cc:644
double GetParameter(const Parameter i) const
double GetY(const CoordinateSystemPtr &coordinateSystem) const
Definition: BasicVector.h:209
utl::Point getCoreInCSPlane(utl::Point core, utl::Vector &axis, utl::CoordinateSystemPtr targetCS)
ResultFlag
Flag returned by module methods to the RunController.
Definition: VModule.h:60
const double low[npar]
Definition: UnivRec.h:77
unsigned long GetGPSSecond() const
GPS second.
Definition: TimeStamp.h:124
void SetParameterError(Parameter i, double value, bool lock=true)
constexpr double cm
Definition: AugerUnits.h:117
std::vector< std::pair< std::vector< std::pair< double, double > >, std::string > > scanParameters(RdGlobalFitMinimizationCriterion, ROOT::Minuit2::FunctionMinimum, std::vector< std::string >)
Definition: RdGlobalFit.cc:981
Vector object.
Definition: Vector.h:30
utl::Vector GetReferenceAxis(const Event &event) const
Returning the referencedirection depending on the corresponding flag.
bool fitGammaAndSigmaPlusIndependently
Definition: FitModels.h:25
double GetParameter(const Parameter i) const
double GetZ(const CoordinateSystemPtr &coordinateSystem) const
Definition: BasicVector.h:212
utl::Point GetPosition() const
Tank position in Site Cartesian Coordinates.
utl::Vector GetMagneticFieldVector() const
returns the magnetic field vector from the components stored in the parameter storage ...
#define ERROR(message)
Macro for logging error messages.
Definition: ErrorLogger.h:165
constexpr double m
Definition: AugerUnits.h:121
const Station & GetStation(const int stationId) const
Get station by Station Id.
Definition: RDetector.cc:141
Definition: Line.h:17
bool HasSignal() const

, generated on Tue Sep 26 2023.