RdGeoCeLDFFitter.cc
Go to the documentation of this file.
1 #include "RdGeoCeLDFFitter.h"
2 
3 #include <utl/ErrorLogger.h>
4 
5 #include <fwk/CentralConfig.h>
6 
7 #include <utl/Vector.h>
8 #include <utl/Point.h>
9 #include <utl/BasicVector.h>
10 #include <utl/GeometryUtilities.h>
11 #include <utl/RadioGeometryUtilities.h>
12 #include <utl/CoordinateSystemPtr.h>
13 #include <utl/StringCompare.h>
14 
15 #include <evt/Event.h>
16 #include <evt/ShowerRecData.h>
17 #include <evt/ShowerSRecData.h>
18 #include <evt/ShowerRRecData.h>
19 #include <evt/ShowerFRecData.h>
20 #include <evt/ShowerSimData.h>
21 #include <evt/RadioSimulation.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 
31 // include root stuff
32 #include "TGraph2DErrors.h"
33 #include "TF2.h"
34 #include "TMath.h"
35 #include "TMinuit.h"
36 #include "TFitResultPtr.h"
37 #include "TRandom3.h"
38 
39 #include <cstddef>
40 #include <iostream>
41 #include <iomanip>
42 #include <cstdlib>
43 #include <sys/stat.h>
44 
45 #include "Minuit2/Minuit2Minimizer.h"
46 #include "Minuit2/MnUserParameters.h"
47 #include "Minuit2/MnMigrad.h"
48 #include "Minuit2/MnContours.h"
49 #include "Minuit2/FunctionMinimum.h"
50 #include "Minuit2/MinimumParameters.h"
51 #include "Minuit2/MnPrint.h"
52 #include "Minuit2/MnPlot.h"
53 #include "Minuit2/MnUserCovariance.h"
54 #include <boost/accumulators/statistics/variance.hpp>
55 
56 #include "LikelihoodFunction.h"
57 
58 using namespace evt;
59 using namespace fwk;
60 using namespace std;
61 using namespace utl;
62 using namespace det;
63 
64 
65 namespace RdGeoCeLDFFitter {
66 
67  // gets the most probable Xmax value for a given energy E and mass number A according to EPOS-LHC model
68  double
69  GetXmaxGumble(const double e, const double a)
70  {
71  const double lgE = log10(e / utl::eV) - 19;
72  const double lnA = log(a);
73 
74  const double p0 = 775.589 - 7.047 * lnA - 2.427 * lnA * lnA;
75  const double p1 = 57.589 - 0.743 * lnA + 0.214 * lnA * lnA;
76  const double p2 = -0.820 - 0.169 * lnA - 0.027 * lnA * lnA;
77 
78  const double xmax = p0 + p1 * lgE + p2 * lgE * lgE;
79  return xmax;
80  }
81 
82 
85  {
86  const Branch topBranch = CentralConfig::GetInstance()->GetTopBranch("RdGeoCeLDFFitter");
87  topBranch.GetChild("InfoLevel").GetData(fInfoLevel);
88  topBranch.GetChild("minNuberOfStationsForCoreFit").GetData(fMinNuberOfStationsForCoreFit);
89  topBranch.GetChild("seedForCoreRandomization").GetData(fRandomSeed);
90  topBranch.GetChild("fixCore").GetData(fFixCore);
91 
92  return eSuccess;
93  }
94 
95 
97  RdGeoCeLDFFitter::Run(evt::Event& event)
98  {
99  // Check if there are events at all
100  if (!event.HasREvent()) {
101  WARNING("No radio event found!");
102  return eSuccess;
103  }
104 
105  // initialize data structures
106  revt::REvent& rEvent = event.GetREvent();
107 
108  if (!event.HasRecShower())
109  event.MakeRecShower();
110 
111  if (!event.GetRecShower().HasRRecShower())
112  event.GetRecShower().MakeRRecShower();
113 
114  ShowerRRecData& showerrrec = event.GetRecShower().GetRRecShower();
115 
116  const rdet::RDetector& rDetector = det::Detector::GetInstance().GetRDetector();
117 
119 
120  // get reference coordinate system of detector (usually PampaAmarilla)
121  const CoordinateSystemPtr referenceCS =
122  det::Detector::GetInstance().GetReferenceCoordinateSystem();
123 
124  const Point core = showerrrec.GetReferenceCorePosition(event);
125  utl::CoordinateSystemPtr localCS = LocalCoordinateSystem::Create(core);
126  utl::Vector showerAxis = showerrrec.GetReferenceAxis(event);
127  const double zenith = showerAxis.GetTheta(localCS);
128  const double azimuth = showerAxis.GetPhi(localCS);
129 
130  const int Nant = rEvent.GetNumberOfSignalStations();
131  if (Nant < 3) {
132  WARNING("Number of signalstations less than 3 -> doing nothing");
133  return eSuccess;
134  }
135 
136  Vector MagneticField = showerrrec.GetMagneticFieldVector();
137  utl::RadioGeometryUtilities transformation =
138  utl::RadioGeometryUtilities(showerAxis, localCS, MagneticField);
139 
140  MagneticField /= MagneticField.GetMag();
141 
142  ostringstream info;
143  info << "zenith, azimuth (rad) = " << zenith / utl::rad << ", " << azimuth / utl::rad << "\n"
144  "zenith, azimuth (deg) = " << zenith / utl::deg << ", " << azimuth / utl::deg;
145  INFODebug(info);
146 
147  unsigned int numberOfSignalStations = 0;
148  unsigned int numberOfSilentStations = 0;
149 
150  for (const auto& station : rEvent.CandidateStationsRange()) {
151  if (station.IsSaturated()) // skip saturated stations
152  continue;
153 
154  if (!station.HasSignal()) // skip silent station
155  ++numberOfSilentStations;
156  else
157  ++numberOfSignalStations;
158  }
159 
160  // For now, satured stations are no included.
161  if (numberOfSignalStations < 3) {
162  WARNING("Number of signal stations after rejection of saturated stations < 3 -> doing nothing!");
163  return eSuccess;
164  }
165 
166  const bool fitCore = !fFixCore && int(numberOfSignalStations) >= fMinNuberOfStationsForCoreFit;
167  info.str("");
168  info << "Core fit will ";
169  if (!fitCore)
170  info << "not ";
171  info << "be performed. The number of signal stations is " << numberOfSignalStations;
172  INFOIntermediate(info);
173 
174  /*
175  double ratio_sil2sig = 1;
176  if (numberOfSilentStations > numberOfSignalStations) {
177  // limit influence of silent stations only if we have more silent than signal stations
178  ratio_sil2sig = numberOfSilentStations / numberOfSignalStations;
179  } */
180 
181  const double sineAlpha =
182  RadioGeometryUtilities::GetLorentzVector(
183  showerrrec.GetReferenceAxis(event), showerrrec.GetMagneticFieldVector()
184  ).GetMag();
185 
186  // set EventFitData
187  EventFitData eventFitData;
188  eventFitData.sinalpha = sineAlpha;
189  eventFitData.zenith = zenith;
190  info.str("");
191  info << "setting zenith = " << zenith / utl::deg << " sinalpha = " << sineAlpha;
192  INFODebug(info);
193 
194  std::vector<StationFitData> vStationFitData;
195  std::vector<StationFitData> vStationFitDataSignalStations;
196 
197  // we use the station iterator here to save the position in the vxB frame for all stations
198  for (auto& station : rEvent.StationsRange()) {
199  revt::StationRecData& sRec = station.GetRecData();
200 
201  const Point sPos = rDetector.GetStation(station).GetPosition();
202  double X_VxB = 0;
203  double Y_VxB = 0;
204  double Z_VxB = 0;
205 
206  // due to the choice of coordinate system the station position will be evaluated relative to the core position
207  transformation.GetVectorInShowerPlaneVxB(X_VxB, Y_VxB, Z_VxB, sPos);
208 
209  if (station.IsSaturated()) // skip saturated stations
210  continue;
211 
212  if (!fUserSubThresholdStations && !station.HasSignal()) // skip sub threshold stations
213  continue;
214 
215  if (station.IsRejected())
216  continue;
217 
218  StationFitData tmpStationFitData;
219  tmpStationFitData.f = sRec.GetParameter(revt::eSignalEnergyFluenceMag);
220  tmpStationFitData.ferror = sRec.GetParameterError(revt::eSignalEnergyFluenceMag);
221  tmpStationFitData.f_vB = sRec.GetParameter(revt::eSignalEnergyFluenceVxB);
222  tmpStationFitData.ferror_vB = sRec.GetParameterError(revt::eSignalEnergyFluenceVxB);
223  tmpStationFitData.f_vvB = sRec.GetParameter(revt::eSignalEnergyFluenceVxVxB);
224  tmpStationFitData.ferror_vvB = sRec.GetParameterError(revt::eSignalEnergyFluenceVxVxB);
225  tmpStationFitData.x = X_VxB;
226  tmpStationFitData.y = Y_VxB;
227  tmpStationFitData.distance = sqrt(X_VxB * X_VxB + Y_VxB * Y_VxB);
228  tmpStationFitData.hasSignal = station.HasSignal();
229 
230  // the noise level is added to reflect the uncertainty of the model
231  //double uncertainty = sqrt(Sqr(integralUncertainty) + Sqr(noiseLevel));
232 
233  info.str("");
234  info << "Station position (reference CS): " << sPos.GetX(referenceCS) / utl::m << ", "
235  << sPos.GetY(referenceCS) / utl::m << ", " << sPos.GetZ(referenceCS) / utl::m << "\n"
236  << "Station Position (localCS): " << sPos.GetX(localCS) / utl::m << ", "
237  << sPos.GetY(localCS) / utl::m << ", " << sPos.GetZ(localCS) / utl::m << endl << "\n"
238  << "core position (reference CS): " << core.GetX(referenceCS) << ", "
239  << core.GetY(referenceCS) << ", " << core.GetZ(referenceCS) << "\n"
240  << "showerAxis (local cs): " << showerAxis.GetX(localCS) << ", "
241  << showerAxis.GetY(localCS) << ", " << showerAxis.GetZ(localCS) << "\n"
242  << "magnetic field (localCS): " << MagneticField.GetX(localCS) << ", "
243  << MagneticField.GetY(localCS) << ", " << MagneticField.GetZ(localCS) << "\n"
244  << "magnetic field (referenceCS): " << MagneticField.GetX(referenceCS) << ", "
245  << MagneticField.GetY(referenceCS) << ", " << MagneticField.GetZ(referenceCS);
246  INFODebug(info);
247 
248  // set subthreshold stations to 0 and increase their uncertainty by N_silent/N_signal
249  /*
250  if (!station.HasSignal()) {
251  LateralDistribution2DvxB->SetPoint(LateralDistribution2DvxB->GetN(), X_VxB, Y_VxB, integral);
252  LateralDistribution2DvxB->SetPointError(LateralDistribution2DvxB->GetN() - 1, 0., 0.,
253  uncertainty * ratio_sil2sig);
254  } else {
255  LateralDistribution2DvxB->SetPoint(LateralDistribution2DvxB->GetN(), X_VxB, Y_VxB, integral);
256  LateralDistribution2DvxB->SetPointError(LateralDistribution2DvxB->GetN() - 1, 0., 0.,
257  uncertainty);
258  index_signal_stations[i][0] = LateralDistribution2DvxB->GetN() - 1;
259  index_signal_stations[i][1] = X_VxB;
260  index_signal_stations[i][2] = Y_VxB;
261  index_signal_stations[i][3] = integral;
262  index_signal_stations[i][4] = uncertainty;
263  ++i;
264  } */
265 
266  if (station.HasSignal()) {
267  info.str("");
268  info << "position in vxB, vxvxB, z: " << X_VxB << ", " << Y_VxB << ", " << Z_VxB << " "
269  "f " << tmpStationFitData.f << " +- "
270  << sRec.GetParameter(revt::eNoiseEnergyFluenceMag) << " +- "
271  << sRec.GetParameterError(revt::eSignalEnergyFluenceMag) << " "
272  "fvB " << tmpStationFitData.f_vB << " +- "
273  << sRec.GetParameter(revt::eNoiseEnergyFluenceVxB) << " +- "
274  << sRec.GetParameterError(revt::eSignalEnergyFluenceVxB) << " "
275  "fvvB " << tmpStationFitData.f_vvB << " +- " << tmpStationFitData.ferror_vvB;
276  INFODebug(info);
277  vStationFitDataSignalStations.push_back(tmpStationFitData);
278  }
279 
280  vStationFitData.push_back(tmpStationFitData);
281  }
282 
283  // keep only a few non signal stations
284 
285  INFODebug("setting fit parameters");
286 
287  FitConfig fitConfig;
288 
289  LDFLikelihoodFunction fitFunction = LDFLikelihoodFunction(fitConfig, eventFitData, vStationFitData);
290 
291  double Erad_start = 10;
292  double Erad_start_error = 10;
293  double CRenergy = 1 * utl::EeV;
294 
295  // calculate start value for Erad from SD cosmic-ray energy
296  if (event.GetRecShower().HasSRecShower()) {
297  CRenergy = event.GetRecShower().GetSRecShower().GetEnergy();
298  const double CRenergyError = event.GetRecShower().GetSRecShower().GetEnergyError() + 0.18 * CRenergy;
299  Erad_start = 15.8 * utl::MeV * Sqr(sineAlpha * CRenergy / utl::EeV);
300  Erad_start_error = 15.8 * utl::MeV * Sqr(sineAlpha) * 2 * CRenergy / utl::EeV * CRenergyError / utl::EeV;
301  }
302 
303  const double XmaxEstimate = 0.5 * (GetXmaxGumble(CRenergy, 1) + GetXmaxGumble(CRenergy, 56));
304  const double DXmaxEstimate = getAtmosphere(1564) / cos(zenith) - XmaxEstimate;
305 
306  info.str("");
307  info << "start values: Erad = " << Erad_start / utl::MeV << " +- " << Erad_start_error / utl::MeV
308  << " MeV, Dxmax = " << DXmaxEstimate;
309  INFOIntermediate(info);
310 
311  ROOT::Minuit2::MnUserParameters upar;
312  upar.Add("Erad", Erad_start / utl::MeV, Erad_start_error / utl::MeV);
313  upar.Add("dxmax", DXmaxEstimate, 50);
314  upar.Add("coreX", 0., 100);
315  upar.Add("coreY", 0., 100);
316 
317  upar.Fix("dxmax");
318  upar.Fix("coreX");
319  upar.Fix("coreY");
320 
321  if (fInfoLevel < eInfoDebug){
322  // suppress printing the Minuit2 outout
323  // Info in <Minuit2>: VariableMetricBuilder: no improvement in line search
324  // Info in <Minuit2>: DavidonErrorUpdator: delgam < 0 : first derivatives increasing along search line
325  // Info in <Minuit2>: VariableMetricBuilder: matrix not pos.def, gdel > 0
326  gErrorIgnoreLevel = 1001;
327  }
328 
329  ROOT::Minuit2::MnMigrad migrad_pre(fitFunction, upar);
330  // minimize calls migrad algorithm. If migrad fails it calls simplex and then migrad again.
331  ROOT::Minuit2::FunctionMinimum minimum_pre = migrad_pre();
332  info.str("");
333  info << "prefit: " << minimum_pre;
334  INFOIntermediate(info);
335  migrad_pre.Fix("Erad");
336 
337  if (fitCore) {
338  migrad_pre.Release("coreX");
339  migrad_pre.Release("coreY");
340 
341  minimum_pre = migrad_pre();
342  info.str("");
343  info << "prefit: " << minimum_pre;
344  INFOIntermediate(info.str());
345  }
346 
347  migrad_pre.Release("Erad");
348  migrad_pre.Release("dxmax");
349  migrad_pre.Fix("coreX");
350  migrad_pre.Fix("coreY");
351  minimum_pre = migrad_pre();
352  info.str("");
353  info << "Releasing Erad + dxmax, fixing corex, corey. prefit: " << minimum_pre;
354  INFOIntermediate(info.str());
355 
356  if (fitCore) {
357  migrad_pre.Release("coreX");
358  migrad_pre.Release("coreY");
359  }
360 
361  // minimize calls migrad algorithm. If migrad fails it calls simplex and then migrad again.
362  ROOT::Minuit2::FunctionMinimum minimum = migrad_pre();
363  info.str("");
364  info << "minimum: " << minimum;
365  INFOIntermediate(info);
366 
367  // abort if fit was not successful
368  if (!minimum.IsValid()) {
369  info.str("");
370  info << "Geo ce LDF fit not converged. No result will be saved, returning eSuccess.";
371  INFOFinal(info);
372  return eSuccess;
373  }
374 
375  ROOT::Minuit2::MnUserParameterState minUstate_tmp = minimum.UserState();
376  ROOT::Minuit2::MnUserCovariance cov = minUstate_tmp.Covariance();
377 
378  // propagate uncertainty of SD core
379  double eradRMS = 0;
380  double dxmaxRMS = 0;
381  if (!fitCore) {
382  const int number_of_trials = 100;
383  std::vector<double> radiation_energies;
384  std::vector<double> dxmaxs;
385  utl::Vector coreError = showerrrec.GetReferenceCoreError(event);
386  Double_t mu[2] = { 0, 0 };
387  Double_t sigma[2] = { 0, 0 };
388  sigma[0] = coreError.GetX(localCS);
389  sigma[1] = coreError.GetY(localCS);
390  double rho = showerrrec.GetReferenceCoreErrorCorrelationXY(event);
391  CorRand rnd(mu, sigma, rho, fRandomSeed);
392  for (int i = 0; i < number_of_trials; ++i) {
393  double dX;
394  double dY;
395  rnd.GetRnd(&dX, &dY);
396  utl::Point tmpcore = core + utl::Vector(dX, dY, 0, localCS);
397  utl::CoordinateSystemPtr tmpLocalCS = LocalCoordinateSystem::Create(tmpcore);
398  utl::RadioGeometryUtilities tmptransformation = utl::RadioGeometryUtilities(showerAxis, tmpLocalCS, MagneticField);
399 
400  std::vector<StationFitData> tmpvStationFitData;
401  for (const auto& station : rEvent.CandidateStationsRange()) {
402  // we use the station iterator here to save the position in the vxB frame for all stations
403  const auto& sRec = station.GetRecData();
404 
405  const Point sPos = rDetector.GetStation(station).GetPosition();
406  double X_VxB = 0;
407  double Y_VxB = 0;
408  double Z_VxB = 0;
409 
410  // due to the choice of coordinate system the station position will be evaluated relative to the core position
411  tmptransformation.GetVectorInShowerPlaneVxB(X_VxB, Y_VxB, Z_VxB, sPos);
412 
413  if (station.IsSaturated()) // skip saturated stations
414  continue;
415 
416  if (!fUserSubThresholdStations && !station.HasSignal()) // skip sub threshold stations
417  continue;
418 
419  StationFitData tmpStationFitData;
420  tmpStationFitData.f = sRec.GetParameter(revt::eSignalEnergyFluenceMag);
421  tmpStationFitData.ferror = sRec.GetParameterError(revt::eSignalEnergyFluenceMag);
422  tmpStationFitData.f_vB = sRec.GetParameter(revt::eSignalEnergyFluenceVxB);
423  tmpStationFitData.ferror_vB = sRec.GetParameterError(revt::eSignalEnergyFluenceVxB);
424  tmpStationFitData.f_vvB = sRec.GetParameter(revt::eSignalEnergyFluenceVxVxB);
425  tmpStationFitData.ferror_vvB = sRec.GetParameterError(revt::eSignalEnergyFluenceVxVxB);
426  tmpStationFitData.x = X_VxB;
427  tmpStationFitData.y = Y_VxB;
428  tmpStationFitData.distance = sqrt(X_VxB * X_VxB + Y_VxB * Y_VxB);
429  tmpStationFitData.hasSignal = station.HasSignal();
430 
431  tmpvStationFitData.push_back(tmpStationFitData);
432  }
433 
434  FitConfig fitConfig;
435 
436  LDFLikelihoodFunction tmpfitFunction = LDFLikelihoodFunction(fitConfig, eventFitData, tmpvStationFitData);
437  ROOT::Minuit2::MnUserParameters tmpupar;
438  tmpupar.Add("Erad", minUstate_tmp.Value("Erad"), 0.1 * minUstate_tmp.Value("Erad"));
439  tmpupar.Add("dxmax", minUstate_tmp.Value("dxmax"), minUstate_tmp.Value("dxmax") * 0.1);
440  tmpupar.Add("coreX", 0., 100);
441  tmpupar.Add("coreY", 0., 100);
442 
443  tmpupar.Fix("coreX");
444  tmpupar.Fix("coreY");
445 
446  ROOT::Minuit2::MnMigrad tmpmigrad(tmpfitFunction, tmpupar);
447  ROOT::Minuit2::FunctionMinimum tmpminimum = tmpmigrad();
448  ROOT::Minuit2::MnUserParameterState tmpminUstate = tmpminimum.UserState();
449  radiation_energies.push_back(tmpminUstate.Value("Erad"));
450  dxmaxs.push_back(tmpminUstate.Value("dxmax"));
451  }
452 
453  for (unsigned int i = 0; i < radiation_energies.size(); ++i) {
454  eradRMS += Sqr(radiation_energies[i] - minUstate_tmp.Value("Erad"));
455  dxmaxRMS += Sqr(dxmaxs[i] - minUstate_tmp.Value("dxmax"));
456  }
457 
458  eradRMS /= radiation_energies.size();
459  dxmaxRMS /= dxmaxs.size();
460  eradRMS = sqrt(eradRMS);
461  dxmaxRMS = sqrt(dxmaxRMS);
462  }
463 
464  const double radiationEnergy = minUstate_tmp.Value("Erad") * utl::MeV;
465  showerrrec.SetParameter(revt::eGeoCeLDFErad, radiationEnergy);
466  showerrrec.SetParameter(revt::eGeoCeLDFDxmax, minUstate_tmp.Value("dxmax"));
467 
468  if (fInfoLevel >= eInfoIntermediate && event.HasSimShower() && event.GetSimShower().HasRadioSimulation()) {
469  const double radiationEnergySim = event.GetSimShower().GetRadioSimulation().GetRadiationEnergy();
470  if (radiationEnergySim) {
471  info.str("");
472  info << " (" << (radiationEnergy - radiationEnergySim) / radiationEnergySim * 100
473  << "% wrt true/simulated radiation energy";
474  INFO(info);
475  }
476  }
477 
478  // save core position in auger CS
479  utl::Point radioCore;
480  if (fitCore) {
481  double x = minUstate_tmp.Value("coreX");
482  double y = minUstate_tmp.Value("coreY");
483  showerrrec.SetParameter(revt::eGeoCeLDFCoreX, x);
484  showerrrec.SetParameter(revt::eGeoCeLDFCoreY, y);
485 
486  radioCore = transformation.GetVectorFromShowerPlaneVxB(x, y);
487  showerrrec.SetParameter(revt::eCoreX, radioCore.GetX(referenceCS));
488  showerrrec.SetParameter(revt::eCoreY, radioCore.GetY(referenceCS));
489  showerrrec.SetParameter(revt::eCoreZ, radioCore.GetZ(referenceCS));
490  } else {
491  radioCore = core; // if no core is fitted use the reference core
492  }
493 
494  utl::RadioGeometryUtilities transformationRadioCore =
495  utl::RadioGeometryUtilities(showerAxis, LocalCoordinateSystem::Create(radioCore), MagneticField);
496 
497  // we use the station iterator here to save the position in the vxB frame for all stations
498  for (auto& station : rEvent.StationsRange()) {
499  revt::StationRecData& sRec = station.GetRecData();
500 
501  const Point sPos = rDetector.GetStation(station).GetPosition();
502  double X_VxB = 0;
503  double Y_VxB = 0;
504  double Z_VxB = 0;
505 
506  // due to the choice of coordinate system the station position will be evaluated relative to the core position
507  transformationRadioCore.GetVectorInShowerPlaneVxB(X_VxB, Y_VxB, Z_VxB, sPos);
508  sRec.SetParameter(revt::eLDFFitStationPositionVxB, X_VxB);
509  sRec.SetParameter(revt::eLDFFitStationPositionVxVxB, Y_VxB);
510  sRec.SetParameter(revt::eLDFFitStationPositionV, Z_VxB);
511  }
512 
513  INFODebug("Calculating chi2...");
514  // calculate chi2 only from signal stations
515  LDFLikelihoodFunction fitFunctionChi2 = LDFLikelihoodFunction(fitConfig, eventFitData, vStationFitDataSignalStations);
516  std::vector<double> pars = {
517  minUstate_tmp.Value("Erad"), minUstate_tmp.Value("dxmax"),
518  minUstate_tmp.Value("coreX"), minUstate_tmp.Value("coreY")
519  };
520 
521  const double chi2 = fitFunctionChi2.GetChi2FullEnergyFluence(pars);
522  int ndf = numberOfSignalStations - 4;
523  if (!fitCore)
524  ndf = numberOfSignalStations - 2;
525  showerrrec.SetParameter(revt::eGeoCeLDFChi2, chi2);
526  showerrrec.SetParameter(revt::eGeoCeLDFNDF, ndf);
527 
528  info.str("");
529  info << "chi2/ndf = " << chi2 << "/" << ndf;
530  INFOIntermediate(info);
531 
532  // fixme: check if any element is nan
533  if (isnan(cov(0, 0))) {
534  WARNING("Cov matrix contains nan. Can not estimate uncertainties");
535  return eSuccess;
536  }
537 
538  // save covariances
539  const double radiationEnergyError = sqrt(Sqr(cov(0, 0)) + Sqr(eradRMS)) * pow(utl::MeV, 2);
540 
541  showerrrec.SetParameterCovariance(revt::eGeoCeLDFErad, revt::eGeoCeLDFErad, radiationEnergyError);
542  showerrrec.SetParameterCovariance(revt::eGeoCeLDFErad, revt::eGeoCeLDFDxmax, cov(0, 1) * utl::MeV);
543  const double dxmaxError = sqrt(Sqr(cov(1, 1)) + Sqr(dxmaxRMS));
544  showerrrec.SetParameterCovariance(revt::eGeoCeLDFDxmax, revt::eGeoCeLDFDxmax, dxmaxError);
545 
546  if (fitCore) {
547  showerrrec.SetParameterCovariance(revt::eGeoCeLDFErad, revt::eGeoCeLDFCoreX, cov(0, 2) * utl::MeV);
548  showerrrec.SetParameterCovariance(revt::eGeoCeLDFErad, revt::eGeoCeLDFCoreY, cov(0, 3) * utl::MeV);
549  showerrrec.SetParameterCovariance(revt::eGeoCeLDFDxmax, revt::eGeoCeLDFCoreX, cov(1, 2));
550  showerrrec.SetParameterCovariance(revt::eGeoCeLDFDxmax, revt::eGeoCeLDFCoreY, cov(1, 3));
551  showerrrec.SetParameterCovariance(revt::eGeoCeLDFCoreX, revt::eGeoCeLDFCoreX, cov(2, 2));
552  showerrrec.SetParameterCovariance(revt::eGeoCeLDFCoreY, revt::eGeoCeLDFCoreY, cov(3, 3));
553  showerrrec.SetParameterCovariance(revt::eGeoCeLDFCoreX, revt::eGeoCeLDFCoreY, cov(2, 3));
554  }
555 
556  return eSuccess;
557  }
558 
559 
561  RdGeoCeLDFFitter::Finish()
562  {
563  return eSuccess;
564  }
565 
566 }
Branch GetTopBranch() const
Definition: Branch.cc:63
Class to access station level reconstructed data.
void SetParameter(Parameter i, double value, bool lock=true)
constexpr double eV
Definition: AugerUnits.h:185
utl::Point GetReferenceCorePosition(const Event &event) const
Returning the reference core position depending on the corresponding flag.
constexpr T Sqr(const T &x)
Point object.
Definition: Point.h:32
constexpr double EeV
Definition: AugerUnits.h:190
double GetPhi(const CoordinateSystemPtr &coordinateSystem) const
azimuth (phi) angle in spherical and cylindrical coordinates
Definition: BasicVector.h:254
double GetChi2FullEnergyFluence(const std::vector< double > &pars) const
bool HasRecShower() const
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
ShowerRecData & GetRecShower()
Interface class to access to the RD Reconstruction of a Shower.
constexpr double rad
Definition: AugerUnits.h:137
bool HasSimShower() const
double GetParameterError(const Parameter i) const
#define INFO(message)
Macro for logging informational messages.
Definition: ErrorLogger.h:161
void Init()
Initialise the registry.
double GetXmaxGumble(const double e, const double a)
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)
bool HasREvent() const
double GetMag() const
Definition: Vector.h:58
utl::Vector GetReferenceCoreError(const Event &event) const
Returning the reference core position error depending on the corresponding flag.
double GetReferenceCoreErrorCorrelationXY(const Event &event) const
Returning the reference core position error correlation xy depending on the corresponding flag...
Detector description interface for RDetector-related data.
Definition: RDetector.h:46
constexpr double deg
Definition: AugerUnits.h:140
constexpr double MeV
Definition: AugerUnits.h:184
boost::shared_ptr< const CoordinateTransformer > CoordinateSystemPtr
Shared pointer for coordinate systems.
#define INFOIntermediate(y)
Definition: VModule.h:162
utl::Point GetVectorFromShowerPlaneVxB(const double x, const double y, const double z, const bool verticalZero) const
in case of positions, the positions has to be relative to the core positions!!!
Class representing a document branch.
Definition: Branch.h:107
double GetX(const CoordinateSystemPtr &coordinateSystem) const
Definition: BasicVector.h:206
bool HasRRecShower() const
#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
#define INFODebug(y)
Definition: VModule.h:163
int GetNumberOfSignalStations() const
Get number of signal stations in the event.
Definition: REvent.h:209
double GetParameter(const Parameter i) const
void GetVectorInShowerPlaneVxB(double &x, double &y, double &z, const utl::Point &point) const
in case of positions, the positions has to be relative to the core positions!!!
double GetY(const CoordinateSystemPtr &coordinateSystem) const
Definition: BasicVector.h:209
ResultFlag
Flag returned by module methods to the RunController.
Definition: VModule.h:60
double lnA(const double Rmu, const double Xmax, const double lgE, const bool realEvent)
Definition: Functions.cc:505
void SetParameter(Parameter i, double value, bool lock=true)
Vector object.
Definition: Vector.h:30
utl::Vector GetReferenceAxis(const Event &event) const
Returning the referencedirection depending on the corresponding flag.
double GetZ(const CoordinateSystemPtr &coordinateSystem) const
Definition: BasicVector.h:212
utl::Point GetPosition() const
Tank position in Site Cartesian Coordinates.
#define INFOFinal(y)
Definition: VModule.h:161
utl::Vector GetMagneticFieldVector() const
returns the magnetic field vector from the components stored in the parameter storage ...
constexpr double m
Definition: AugerUnits.h:121
const Station & GetStation(const int stationId) const
Get station by Station Id.
Definition: RDetector.cc:141
bool HasSRecShower() const
void GetRnd(double *const a, double *const b)
void SetParameterCovariance(Parameter i1, Parameter i2, double value, bool lock=true)

, generated on Tue Sep 26 2023.