RdWaveFit.cc
Go to the documentation of this file.
1 #include "RdWaveFit.h"
2 
3 #include <cmath>
4 
5 #include <fwk/CentralConfig.h>
6 #include <fwk/LocalCoordinateSystem.h>
7 #include <fwk/CoordinateSystemRegistry.h>
8 
9 #include <det/Detector.h>
10 #include <rdet/RDetector.h>
11 
12 #include <utl/ErrorLogger.h>
13 #include <utl/Reader.h>
14 #include <utl/config.h>
15 #include <utl/PhysicalConstants.h>
16 #include <utl/AxialVector.h>
17 #include <utl/Math.h>
18 #include <utl/AnalyticCoordinateTransformator.h>
19 
20 #include <evt/Event.h>
21 #include <evt/ShowerRRecData.h>
22 #include <evt/ShowerSRecData.h>
23 #include <evt/ShowerFRecData.h>
24 #include <evt/ShowerRecData.h>
25 #include <evt/ShowerSimData.h>
26 
27 #include <revt/REvent.h>
28 #include <revt/Station.h>
29 #include <revt/Header.h>
30 #include <revt/StationRecData.h>
31 
32 
33 #include <TMinuit.h>
34 #include <TRandom3.h>
35 
36 #include <Math/Minimizer.h>
37 #include <Minuit2/Minuit2Minimizer.h>
39 
40 using namespace std;
41 using namespace revt;
42 using namespace evt;
43 using namespace fwk;
44 using namespace utl;
45 
46 #define OUT(x) if ((x) <= fInfoLevel) cerr << " "
47 #define NL "\n "
48 
49 namespace RdWaveFit {
50 
51 template<typename G>
52 inline string ToString(const G& g, const CoordinateSystemPtr cs)
53 {
54  ostringstream os;
55  os << '(' << g.GetX(cs) / meter << ", " << g.GetY(cs) / meter << ", " << g.GetZ(cs) / meter
56  << ") [m]";
57  return os.str();
58 }
59 
61  fInfoLevel(0),
62  fMinuitOutput(0),
63  fMinNumberOfStations(0),
64  fAllowUnphysicalCosines(0),
65  fFitType(0),
66  fThetaMax(0),
67  fRMax(0),
68  fRhoMax(0),
69  fNInitsTheta(0),
70  fNInitsPhi(0),
71  fSphericalWaveFit(0),
72  fWaveFrontModel(0),
73  currentWaveFrontModel(0),
74  fSphericalWaveFitVarC(0),
75  fComputeSigmaGamma(0),
76  fSigmaGamma(0),
77  fPenaltyTerm(0),
78  fThetaVarC(0),
79  fNumberOfStations(0),
80  fEventTimeNanoSecond(0),
81  fEventTimeSecond(0),
82  ChiPWF(0),
83  ChiSWF(0),
84  ChiSWFVarC(0),
85  ChiCWF(0),
86  fUsedDirection(""),
87  fUsedCorePosition("")
88 {
89 }
90 
92 {
93  // Initialize your module here. This method
94  // is called once at the beginning of the run.
95  // The eSuccess flag indicates the method ended
96  // successfully. For other possible return types,
97  // see the VModule documentation.
98 
99  INFO("RdWaveFit::Init()");
100 
101  // Read in the configurations of the xml file
102  Branch topBranch = CentralConfig::GetInstance()->GetTopBranch("RdWaveFit");
103 
104  topBranch.GetChild("InfoLevel").GetData(fInfoLevel);
105 
106  fMinuitOutput = (fInfoLevel >= eMinuit) ? true : false;
107 
108  topBranch.GetChild("minNumberOfStations").GetData(fMinNumberOfStations);
109  topBranch.GetChild("fitType").GetData(fFitType);
110  topBranch.GetChild("thetaMax").GetData(fThetaMax);
111  topBranch.GetChild("rMax").GetData(fRMax);
112  topBranch.GetChild("rhoMax").GetData(fRhoMax);
113  topBranch.GetChild("nInitsTheta").GetData(fNInitsTheta);
114  topBranch.GetChild("nInitsPhi").GetData(fNInitsPhi);
115  topBranch.GetChild("waveFrontModel").GetData(fWaveFrontModel);
116  topBranch.GetChild("computeSigmaGamma").GetData(fComputeSigmaGamma);
117  topBranch.GetChild("sigmaGamma").GetData(fSigmaGamma);
118  topBranch.GetChild("penaltyTerm").GetData(fPenaltyTerm);
119  topBranch.GetChild("thetaVarC").GetData(fThetaVarC);
120  topBranch.GetChild("UsedDirection").GetData(fUsedDirection);
121  topBranch.GetChild("UsedCorePosition").GetData(fUsedCorePosition);
122 
123  if (fNInitsPhi < 1) {
124  fNInitsPhi = 1;
125  }
126  if (fNInitsTheta < 1) {
127  fNInitsTheta = 1;
128  }
129 
130  ChiPWF = new Chi2ForPlaneWaveFit();
135  if (!fComputeSigmaGamma) {
137  }
138 
139  return eSuccess;
140 }
141 
142 VModule::ResultFlag RdWaveFit::Run(evt::Event& event)
143 {
145  if (fInfoLevel > 0) {
146  INFO("RdWaveFit::Run()");
147  switch (currentWaveFrontModel) {
148  case ePlane:
149  INFO("Plane Wave Fit");
150  break;
151  case eSpherical:
152  INFO("Spherical Wave Fit");
153  break;
154  case eSphericalVarC:
155  INFO("Spherical Wave Fit with variable speed of light");
156  break;
157  case eConical:
158  INFO("Conical Wave Fit");
159  break;
160  }
161  }
162 
163  // nothing to do if there is no REvent
164  if (!event.HasREvent()) {
165  OUT(eIntermediate) << "eContinueLoop: No REvent, so no reconstruction" << endl;
166  return eContinueLoop;
167  }
168 
169  REvent& rEvent = event.GetREvent();
170 
171  /* check if event was reconstructed before. */
172  if (!event.HasRecShower()) {
173  if (fInfoLevel > eNone) {
174  WARNING(
175  "RdWaveFit: No RecShower found. Plead use RdPreWaveFitter before RdWaveFit... aborting");
176  }
177  return eBreakLoop;
178  }
179  if (!event.GetRecShower().HasRRecShower()) {
180  if (fInfoLevel > eNone) {
181  WARNING(
182  "RdWaveFit: No RRecShower found. Plead use RdPreWaveFitter before RdWaveFit... aborting");
183  }
184  return eBreakLoop;
185  }
186 
187  ShowerRRecData& showerrrec = event.GetRecShower().GetRRecShower();
188  fNumberOfStations = showerrrec.GetParameter(eNumberOfStationsWithPulseFound);
189 
191  OUT(eFinal) << "eBreakLoop: Not enough stations. (Event contains only " << fNumberOfStations
192  << " station(s). Min. number of stations = " << fMinNumberOfStations << ")" << endl;
193  showerrrec.SetParameter(eFitSuccess, 0);
194  return eBreakLoop;
195  }
196 
197  // variable to indicate if this event was previously reconstructed
198  bool reuseFit = false;
199  // check if reuse fit?
200  if (showerrrec.HasParameter(eRecStage)) {
201  if (showerrrec.GetParameter(eRecStage) >= ShowerRRecData::kPlaneFit3d) {
202  reuseFit = true;
203  OUT(eMinuit) << "Fit has been performed previously, setting reusefit = true" << endl;
204  }
205  }
206 
207 
211  utl::Point baryCenter;
212  VModule::ResultFlag resultBaryCenter = ComputeBaryCenter(rEvent, baryCenter);
213  if(resultBaryCenter != eSuccess) {
214  WARNING("BaryCenter could not be determined!");
215  return resultBaryCenter;
216  }
217 
218  // get reference coordinate system of detector (usually PampaAmarilla)
219  const utl::CoordinateSystemPtr referenceCS = det::Detector::GetInstance().GetReferenceCoordinateSystem();
220  showerrrec.SetParameter(eCoreX, baryCenter.GetX(referenceCS));
221  showerrrec.SetParameter(eCoreY, baryCenter.GetY(referenceCS));
222  showerrrec.SetParameter(eCoreZ, baryCenter.GetZ(referenceCS));
223 
224 
225  // get coordinate origin depending on xml settings
226  stringstream fMessage;
227  // check if needed reconstructed quantities exist
228  if(fUsedDirection == "SD" or fUsedCorePosition == "SD") {
229  if(!event.GetRecShower().HasSRecShower()) {
230  WARNING("Event has not SRecShower. Nothing will be done!!!");
231  return eSuccess;
232  }
233  }
234  if(fUsedDirection == "MC" or fUsedCorePosition == "MC") {
235  if(!event.HasSimShower()) {
236  WARNING("Event has no simulated shower. Nothing will be done!!!");
237  return eSuccess;
238  }
239  }
240  if(fUsedDirection == "FD" or fUsedCorePosition == "FD") {
241  if(!event.GetRecShower().HasFRecShower()) {
242  WARNING("Event has no FD reconstructed shower. Nothing will be done!!!");
243  return eSuccess;
244  }
245  }
246 
247  // getting shower direction
248  double zenith(0), azimuth(0);
249  utl::Vector InitialShowerAxis = utl::Vector();
250  if (fUsedDirection == "SD") {
251  if (event.GetRecShower().HasSRecShower()) {
252  InitialShowerAxis = event.GetRecShower().GetSRecShower().GetAxis();
253  Point core = event.GetRecShower().GetSRecShower().GetCorePosition();
254  utl::CoordinateSystemPtr coordinateSystem = LocalCoordinateSystem::Create(core);
255  zenith = event.GetRecShower().GetSRecShower().GetAxis().GetTheta(coordinateSystem);
256  azimuth = event.GetRecShower().GetSRecShower().GetAxis().GetPhi(coordinateSystem);
257  OUT(eMinuit) << "Zenith = " << zenith << "\t azimuth = " << azimuth << endl;
258  } else {
259  WARNING("No SD Shower... aborting");
260  return eSuccess;
261  }
262  }
263  if (fUsedDirection == "MC") {
264  cout << "using MC shower axis" << endl;
265  InitialShowerAxis = -1 * event.GetSimShower().GetDirection();
266  }
267  if (fUsedDirection == "FD") {
268  InitialShowerAxis = event.GetRecShower().GetFRecShower().GetAxis();
269  }
270 
271  // getting shower core information
272  if (fUsedCorePosition == "MC") {
273  cout << "using MC shower core" << endl;
274  fReferenceCore = event.GetSimShower().GetPosition();
275  }
276  if (fUsedCorePosition == "SD") {
277  fReferenceCore = event.GetRecShower().GetSRecShower().GetCorePosition();
278  }
279  if (fUsedCorePosition == "Radio") {
280  fReferenceCore = event.GetRecShower().GetRRecShower().GetCorePosition();
281  }
282  if (fUsedCorePosition == "FD") {
283  fReferenceCore = event.GetRecShower().GetFRecShower().GetCorePosition();
284  }
285  if(fUsedCorePosition == "RadioCoordinateOrigin") {
286  fReferenceCore = showerrrec.GetCoordinateOrigin();
287  }
288  fLocalCS = LocalCoordinateSystem::Create(fReferenceCore);
289 
290  // this will point to the final result
291  FitParameters sFitResults;
292  // set some standard values
293  sFitResults.gamma = 1;
294  sFitResults.gammaError = 0;
295  sFitResults.r = 1;
296  sFitResults.rError = 0;
297  sFitResults.rho = 0;
298  sFitResults.rhoError = 0;
299 
300  // same fit results from previous fit to the struct sFitResults
301  if (reuseFit) {
302  // get values from RRecShower
303  utl::Vector showeraxis = showerrrec.GetAxis();
304  sFitResults.r = showeraxis.GetR(fLocalCS);
305  sFitResults.theta = showeraxis.GetTheta(fLocalCS);
306  sFitResults.phi = showeraxis.GetPhi(fLocalCS);
307 // sFitResults.gamma = showerrrec.GetGammaC();
308  if (showerrrec.HasParameter(eGamma)) {
309  sFitResults.gamma = showerrrec.GetParameter(eGamma);
310  } else {
311  sFitResults.gamma = 1;
312  }
313  }
314 
315  // Call Wave Fit for different Models
317  switch (currentWaveFrontModel) {
318  case ePlane:
319  result = CallPlaneWaveFit(rEvent, sFitResults, reuseFit);
320  break;
321  case eSpherical:
322  result = CallSphericalWaveFit(rEvent, sFitResults, reuseFit);
323  break;
324  case eSphericalVarC:
325  result = CallSphericalWaveFitVarC(rEvent, sFitResults, reuseFit);
326  break;
327  case eConical:
328  result = CallConicalWaveFit(rEvent, sFitResults, reuseFit);
329  break;
330  }
331 
332  // calculate and save residuals
333  const rdet::RDetector& rDetector = det::Detector::GetInstance().GetRDetector();
334  vector<utl::Vector> AntennaPositions;
335  vector<double> AntennaTimes;
336  vector<double> AntennaTimesError;
337  //loop over all stations
339  sIt != rEvent.SignalStationsEnd(); ++sIt) {
340  const Vector sPos = rDetector.GetStation(*sIt).GetPosition() - fReferenceCore;
341  const StationRecData& sRec = sIt->GetRecData();
342  AntennaPositions.push_back(sPos);
343  const double t = sRec.GetParameter(revt::eSignalTime);
344 // OUT(eObscure) << "SignalTime of Station " << sIt->GetId() << ": " << t << endl;
345  AntennaTimes.push_back(t);
346  AntennaTimesError.push_back(sRec.GetParameterError(eSignalTime));
347  }
348  const utl::Vector axis(sFitResults.r, sFitResults.theta, sFitResults.phi, fLocalCS, Vector::kSpherical);
349  const std::vector<double> timeResiduals = GetTimeResiduals(AntennaPositions, AntennaTimes, axis,
351  // delete time residuals of all stations
352  for (REvent::StationIterator sIt = rEvent.StationsBegin(); sIt != rEvent.StationsEnd(); ++sIt) {
353  StationRecData& sRec = sIt->GetRecData();
354  sRec.DeleteParameter(eTimeResidual);
355  }
356 
357  // set time residuals of signal stations
358  int iStation = 0;
360  sIt != rEvent.SignalStationsEnd(); ++sIt) {
361  StationRecData& sRec = sIt->GetRecData();
362  sRec.SetParameter(eTimeResidual, timeResiduals[iStation]);
363  sRec.SetParameterError(eTimeResidual, AntennaTimesError[iStation]);
364  OUT(eObscure) << "TimeResidual of Station " << sIt->GetId() << ": " << timeResiduals[iStation] << " +/- "
365  << AntennaTimesError[iStation] << " ns" << endl;
366  ++iStation;
367  }
368 
369 
370  // break loop if the fit was not successful
371  if (result != eSuccess) {
372  showerrrec.SetParameter(eFitSuccess, 0);
373  return result;
374  }
375 
376 
377  showerrrec.SetParameter(eShowerAxisX, axis.GetX(fLocalCS));
378  showerrrec.SetParameter(eShowerAxisY, axis.GetY(fLocalCS));
379  showerrrec.SetParameter(eShowerAxisZ, axis.GetZ(fLocalCS));
380 
381  // save Covariance matrix
382  double tempCov = AnalyticCoordinateTransformator::GetCartesianCovarianceFromSpherical(
383  0, 0, sFitResults.r, sFitResults.theta, sFitResults.phi, sFitResults.c00, sFitResults.c11,
384  sFitResults.c22, sFitResults.c01, sFitResults.c02, sFitResults.c12);
385  showerrrec.SetParameterCovariance(eShowerAxisX, eShowerAxisX, tempCov);
386  tempCov = AnalyticCoordinateTransformator::GetCartesianCovarianceFromSpherical(1, 1,
387  sFitResults.r,
388  sFitResults.theta,
389  sFitResults.phi,
390  sFitResults.c00,
391  sFitResults.c11,
392  sFitResults.c22,
393  sFitResults.c01,
394  sFitResults.c02,
395  sFitResults.c12);
396  showerrrec.SetParameterCovariance(eShowerAxisY, eShowerAxisY, tempCov);
397  tempCov = AnalyticCoordinateTransformator::GetCartesianCovarianceFromSpherical(2, 2,
398  sFitResults.r,
399  sFitResults.theta,
400  sFitResults.phi,
401  sFitResults.c00,
402  sFitResults.c11,
403  sFitResults.c22,
404  sFitResults.c01,
405  sFitResults.c02,
406  sFitResults.c12);
407  showerrrec.SetParameterCovariance(eShowerAxisZ, eShowerAxisZ, tempCov);
408  tempCov = AnalyticCoordinateTransformator::GetCartesianCovarianceFromSpherical(0, 1,
409  sFitResults.r,
410  sFitResults.theta,
411  sFitResults.phi,
412  sFitResults.c00,
413  sFitResults.c11,
414  sFitResults.c22,
415  sFitResults.c01,
416  sFitResults.c02,
417  sFitResults.c12);
418  showerrrec.SetParameterCovariance(eShowerAxisX, eShowerAxisY, tempCov);
419  tempCov = AnalyticCoordinateTransformator::GetCartesianCovarianceFromSpherical(0, 2,
420  sFitResults.r,
421  sFitResults.theta,
422  sFitResults.phi,
423  sFitResults.c00,
424  sFitResults.c11,
425  sFitResults.c22,
426  sFitResults.c01,
427  sFitResults.c02,
428  sFitResults.c12);
429  showerrrec.SetParameterCovariance(eShowerAxisX, eShowerAxisZ, tempCov);
430  tempCov = AnalyticCoordinateTransformator::GetCartesianCovarianceFromSpherical(1, 2,
431  sFitResults.r,
432  sFitResults.theta,
433  sFitResults.phi,
434  sFitResults.c00,
435  sFitResults.c11,
436  sFitResults.c22,
437  sFitResults.c01,
438  sFitResults.c02,
439  sFitResults.c12);
440  showerrrec.SetParameterCovariance(eShowerAxisY, eShowerAxisZ, tempCov);
441 
442  showerrrec.SetParameter(eGamma, sFitResults.gamma);
443  showerrrec.SetParameterError(eGamma, sFitResults.gammaError);
444 
445  showerrrec.SetParameter(eWaveFitChi2, sFitResults.minChi);
446  showerrrec.SetParameter(eWaveFitNDF, sFitResults.NDF);
447  showerrrec.SetParameter(eRecStage, sFitResults.recStage);
448  showerrrec.SetParameter(eWaveFrontModel,sFitResults.recStage);
449 
450  if (sFitResults.recStage >= ShowerRRecData::kConicalWaveFit) {
451  showerrrec.SetParameter(eRho, sFitResults.rho);
452  showerrrec.SetParameterError(eRho, sFitResults.rhoError);
453  }
454 
455  // set signal arrival direction for individual stations
456 
457  for (REvent::StationIterator sIt = rEvent.StationsBegin(); sIt != rEvent.StationsEnd(); ++sIt) {
458  Station& station = *sIt;
459 
460  // for spherical wave use direction to point source
461  // therefore, emission point is transfered to local coordniate system of station
463  // has to be implemented
464  const CoordinateSystemPtr stationCS = rDetector.GetStation(station.GetId()).GetLocalCoordinateSystem();
465  station.GetRecData().SetParameter(eSignalArrivalDirectionX, axis.GetX(stationCS));
466  station.GetRecData().SetParameter(eSignalArrivalDirectionY, axis.GetY(stationCS));
467  station.GetRecData().SetParameter(eSignalArrivalDirectionZ, axis.GetZ(stationCS));
468  } else {
469  // temporary solution: use shower direction for all other models.
470  // this is exact for plane wave, but typically leads to 1-2 degree error for conical or hyperbolical wavefront
471  station.GetRecData().SetParameter(eSignalArrivalDirectionX, axis.GetX(fLocalCS));
472  station.GetRecData().SetParameter(eSignalArrivalDirectionY, axis.GetY(fLocalCS));
473  station.GetRecData().SetParameter(eSignalArrivalDirectionZ, axis.GetZ(fLocalCS));
474  }
475  }
476 
477  showerrrec.SetParameter(eFitSuccess, 1);
478 
479  OUT(eFinal) << "RecStage: " << showerrrec.GetParameter(eRecStage) << NL
480  << " axis in cartesian coord.= (" << axis.GetX(fLocalCS) << ", " << axis.GetY(fLocalCS)
481  << ", " << axis.GetZ(fLocalCS) << ")" << NL << " axis in spherical coord.= ("
482  << axis.GetR(fLocalCS) << ", " << axis.GetTheta(fLocalCS) << ", " << axis.GetPhi(fLocalCS)
483  << ")" << NL << "theta = " << sFitResults.theta / utl::degree << " +/- "
484  << sFitResults.thetaError / utl::degree << "\t phi = " << sFitResults.phi / utl::degree
485  << " +/- " << sFitResults.phiError / utl::degree << NL << "Radius = "
486  << sFitResults.r / utl::m << "m +/- " << sFitResults.rError / utl::m << "m" << NL
487  << "Gamma = " << sFitResults.gamma << " +/- " << sFitResults.gammaError << NL << endl;
488  OUT(eIntermediate) << "Chi2/NDF = " << sFitResults.minChi << "/" << sFitResults.NDF << NL << endl;
489 
490  return eSuccess;
491 }
492 
493 VModule::ResultFlag RdWaveFit::Finish()
494 {
495  // Put any termination or cleanup code here.
496  // This method is called once at the end of the run.
497  INFO("RdWaveFit::Finish()");
498  delete ChiPWF;
499  delete ChiSWF;
500  delete ChiSWFVarC;
501  delete ChiCWF;
502  return eSuccess;
503 }
504 
505 VModule::ResultFlag RdWaveFit::PlaneWaveFit(revt::REvent& rEvent, FitParameters& fit,
506  int type) const
507 {
508  if (fNumberOfStations < 3) {
509  OUT(eBreakLoop) << "ERROR: At least 3 Stations are needed for a plane wave fit" << endl;
510  return eBreakLoop;
511  }
512 
513  ROOT::Minuit2::Minuit2Minimizer* minimizer = 0;
514  if (type == 0) {
515  minimizer = new ROOT::Minuit2::Minuit2Minimizer(ROOT::Minuit2::kMigrad);
516  } else if (type == 1) {
517  minimizer = new ROOT::Minuit2::Minuit2Minimizer(ROOT::Minuit2::kSimplex);
518  } else if (type == 2) {
519  minimizer = new ROOT::Minuit2::Minuit2Minimizer(ROOT::Minuit2::kCombined);
520  } else if (type == 3) {
521  minimizer = new ROOT::Minuit2::Minuit2Minimizer(ROOT::Minuit2::kScan);
522  }
523 
524  const rdet::RDetector& rDetector = det::Detector::GetInstance().GetRDetector();
525 
526  vector<utl::Vector> AntennaPositions;
527  vector<double> AntennaTimes;
528  vector<double> AntennaTimesError;
529  //loop over all stations
531  sIt != rEvent.SignalStationsEnd(); ++sIt) {
532  const Vector sPos = rDetector.GetStation(*sIt).GetPosition() - fReferenceCore;
533  const StationRecData& sRec = sIt->GetRecData();
534  AntennaPositions.push_back(sPos);
535  const double t = sRec.GetParameter(revt::eSignalTime);
536 // OUT(eObscure) << "SignalTime of Station " << sIt->GetId() << ": " << t << endl;
537  AntennaTimes.push_back(t);
538  AntennaTimesError.push_back(sRec.GetParameterError(eSignalTime));
539  }
540  fit.nStations = AntennaTimes.size();
541 
542 // Give the Antenna Positions and Times to objective function
543  ChiPWF->Set(AntennaPositions, AntennaTimes, AntennaTimesError, fLocalCS);
544  minimizer->SetFunction(*ChiPWF);
545 
546 // Set variables
547  minimizer->SetLimitedVariable(0, "theta", fit.theta, 0.1, 0., fThetaMax);
548  minimizer->SetVariable(1, "phi", fit.phi, 0.1);
549 
550 // THE FIT:
551 
552  minimizer->SetPrintLevel(0);
553  if (!minimizer->Minimize()) {
554  fit.status = minimizer->Status();
555  OUT(eObscure) << "Fit failed: FitStatus = " << minimizer->Status() << endl;
556  return eBreakLoop;
557  }
558 
559 // Save Results
560  fit.status = minimizer->Status();
561  fit.phi = NormalizeAngle(minimizer->X()[1]);
562  fit.theta = NormalizeAngle(minimizer->X()[0]);
563  fit.phiError = minimizer->Errors()[1];
564  fit.thetaError = minimizer->Errors()[0];
565 
566  fit.nCalls = minimizer->NCalls();
567  fit.minChi = minimizer->MinValue();
568  fit.recStage = ShowerRRecData::kPlaneFit3d;
569 
570 // save covariance matrix
571  fit.c00 = 0;
572  fit.c11 = minimizer->CovMatrix(0, 0);
573  fit.c22 = minimizer->CovMatrix(1, 1);
574  fit.c01 = 0;
575  fit.c02 = 0;
576  fit.c12 = minimizer->CovMatrix(0, 1);
577 
578  fit.NDF = fit.nStations - 3;
579 
580  /* the plane wave fit can be performed with just 3 stations. The number of degrees
581  * of freedom is 0, though. To be able to compute chiSquare/NDF the NDF is set to 1.
582  */
583  if (fit.nStations < 4) {
584  fit.chiSquareNDF = minimizer->MinValue() / (fit.nStations - 2);
585  } else {
586  fit.chiSquareNDF = minimizer->MinValue() / (fit.nStations - 3);
587  }
588 
589 // save Time Residual of Stations
590  const utl::Vector axis(1. * utl::m, fit.theta, fit.phi, fLocalCS, Vector::kSpherical);
591  const std::vector<double> timeResiduals = GetTimeResiduals(AntennaPositions, AntennaTimes, axis,
592  ePlane);
593 //loop over all stations
594  int iStation = 0;
595  for (REvent::StationIterator sIt = rEvent.StationsBegin(); sIt != rEvent.StationsEnd(); ++sIt) {
596  StationRecData& sRec = sIt->GetRecData();
597  sRec.DeleteParameter(eTimeResidual);
598  }
599 
601  sIt != rEvent.SignalStationsEnd(); ++sIt) {
602  StationRecData& sRec = sIt->GetRecData();
603  sRec.SetParameter(eTimeResidual, timeResiduals[iStation]);
604  sRec.SetParameterError(eTimeResidual, AntennaTimesError[iStation]);
605 // OUT(eObscure) << "TimeResidual of Station " << sIt->GetId() << ": "
606 // << timeResiduals[iStation] << " +/- " << AntennaTimesError[iStation] << " ns" << endl;
607  ++iStation;
608  }
609 
610  delete minimizer;
611 
612  return eSuccess;
613 }
614 
615 VModule::ResultFlag RdWaveFit::SphericalWaveFit(revt::REvent& rEvent, FitParameters& fit,
616  int type) const
617 {
618 
619  if (fNumberOfStations < 4) {
620  OUT(eBreakLoop) << "ERROR: At least 4 Stations are needed for a spherical wave fit" << endl;
621  return eBreakLoop;
622  }
623  // Initialize the Minuit2 Minimizer
624  ROOT::Minuit2::Minuit2Minimizer* minimizer = 0;
625  if (type == 0) {
626  minimizer = new ROOT::Minuit2::Minuit2Minimizer(ROOT::Minuit2::kMigrad);
627  } else if (type == 1) {
628  minimizer = new ROOT::Minuit2::Minuit2Minimizer(ROOT::Minuit2::kSimplex);
629  } else if (type == 2) {
630  minimizer = new ROOT::Minuit2::Minuit2Minimizer(ROOT::Minuit2::kCombined);
631  } else if (type == 3) {
632  minimizer = new ROOT::Minuit2::Minuit2Minimizer(ROOT::Minuit2::kScan);
633  }
634 
635  const rdet::RDetector& rDetector = det::Detector::GetInstance().GetRDetector();
636 
637  vector<utl::Vector> AntennaPositions;
638  vector<double> AntennaTimes;
639  vector<double> AntennaTimesError;
640 
641  //loop over all stations
643  sIt != rEvent.SignalStationsEnd(); ++sIt) {
644  const Vector sPos = rDetector.GetStation(*sIt).GetPosition() - fReferenceCore;
645 
646  const StationRecData& sRec = sIt->GetRecData();
647  AntennaPositions.push_back(sPos);
648  const double t = sRec.GetParameter(revt::eSignalTime);
649  OUT(eObscure) << "SignalTime of Station " << sIt->GetId() << ": " << t << endl;
650  AntennaTimes.push_back(t);
651  AntennaTimesError.push_back(sRec.GetParameterError(eSignalTime));
652  }
653  fit.nStations = AntennaTimes.size();
654  if (AntennaPositions.size() < 4) {
655  OUT(eBreakLoop) << "Event has less than 3 Stations, can't perform spherical wave fit. " << endl;
656  return eBreakLoop;
657  }
658 
659  // Give the Antenna Positions and Times to objective function
660  ChiSWF->Set(AntennaPositions, AntennaTimes, AntennaTimesError, fLocalCS);
661  minimizer->SetFunction(*ChiSWF);
662 
663  minimizer->SetLimitedVariable(0, "r", fit.r, 10., 0., fRMax);
664  minimizer->SetLimitedVariable(1, "theta", fit.theta, 0.1, 0., fThetaMax);
665  minimizer->SetVariable(2, "phi", fit.phi, 0.1);
666 
667  // THE FIT:
668  minimizer->SetPrintLevel(0);
669  if (!minimizer->Minimize()) {
670  fit.status = minimizer->Status();
671  return eBreakLoop;
672  }
673 
674  // Save Results
675  fit.status = minimizer->Status();
676  fit.r = minimizer->X()[0];
677  fit.phi = NormalizeAngle(minimizer->X()[2]);
678  fit.theta = NormalizeAngle(minimizer->X()[1]);
679  fit.rError = minimizer->Errors()[0];
680  fit.phiError = minimizer->Errors()[2];
681  fit.thetaError = minimizer->Errors()[1];
682 
683  fit.nCalls = minimizer->NCalls();
684  fit.minChi = minimizer->MinValue();
685  fit.recStage = ShowerRRecData::kSphericalWaveFit;
686 
687  // save covariance matrix
688  fit.c00 = minimizer->CovMatrix(0, 0);
689  fit.c11 = minimizer->CovMatrix(1, 1);
690  fit.c22 = minimizer->CovMatrix(2, 2);
691  fit.c01 = minimizer->CovMatrix(0, 1);
692  fit.c02 = minimizer->CovMatrix(0, 2);
693  fit.c12 = minimizer->CovMatrix(1, 2);
694 
695  fit.NDF = fit.nStations - 4;
696 
697  /* the spherical wave fit can be performed with just 4 stations. The number of degrees
698  * of freedom is 0, though. To be able to compute chiSquare/NDF the NDF is set to 1.
699  */
700  if (fit.nStations < 5) {
701  fit.chiSquareNDF = minimizer->MinValue() / (fit.nStations - 3);
702  } else {
703  fit.chiSquareNDF = minimizer->MinValue() / (fit.nStations - 4);
704  }
705 
706  // save Time Residual of Stations
707  const utl::Vector axis(fit.r, fit.theta, fit.phi, fLocalCS, Vector::kSpherical);
708  const std::vector<double> timeResiduals = GetTimeResiduals(AntennaPositions, AntennaTimes, axis,
709  eSpherical);
710 
711  for (REvent::StationIterator sIt = rEvent.StationsBegin(); sIt != rEvent.StationsEnd(); ++sIt) {
712  StationRecData& sRec = sIt->GetRecData();
713  sRec.DeleteParameter(eTimeResidual);
714  }
715 
716  //loop over all stations
717  int iStation = 0;
719  sIt != rEvent.SignalStationsEnd(); ++sIt) {
720  StationRecData& sRec = sIt->GetRecData();
721  sRec.SetParameter(eTimeResidual, timeResiduals[iStation]);
722  sRec.SetParameterError(eTimeResidual, AntennaTimesError[iStation]);
723 // OUT(eObscure) << "TimeResidual of Station " << sIt->GetId() << ": " << timeResiduals[iStation] << " +/- "
724 // << AntennaTimesError[iStation] << " ns" << endl;
725  ++iStation;
726  }
727 
728  delete minimizer;
729 
730  return eSuccess;
731 }
732 
733 VModule::ResultFlag RdWaveFit::SphericalWaveFitVarC(revt::REvent& rEvent, FitParameters& fit,
734  int type) const
735 {
736  if (fNumberOfStations < 5) {
737  OUT(eBreakLoop)
738  << "ERROR: At least 5 Stations are needed for a spherical wave fit with variable speed of light"
739  << endl;
740  return eBreakLoop;
741  }
742  // Initialize the Minuit2 Minimizer
743  ROOT::Minuit2::Minuit2Minimizer* minimizer = 0;
744  if (type == 0) {
745  minimizer = new ROOT::Minuit2::Minuit2Minimizer(ROOT::Minuit2::kMigrad);
746  } else if (type == 1) {
747  minimizer = new ROOT::Minuit2::Minuit2Minimizer(ROOT::Minuit2::kSimplex);
748  } else if (type == 2) {
749  minimizer = new ROOT::Minuit2::Minuit2Minimizer(ROOT::Minuit2::kCombined);
750  } else if (type == 3) {
751  minimizer = new ROOT::Minuit2::Minuit2Minimizer(ROOT::Minuit2::kScan);
752  }
753 
754  const rdet::RDetector& rDetector = det::Detector::GetInstance().GetRDetector();
755 
756  vector<utl::Vector> AntennaPositions;
757  vector<double> AntennaTimes;
758  vector<double> AntennaTimesError;
759 
760  //loop over all stations
762  sIt != rEvent.SignalStationsEnd(); ++sIt) {
763  const Vector sPos = rDetector.GetStation(*sIt).GetPosition() - fReferenceCore;
764 
765  const StationRecData& sRec = sIt->GetRecData();
766  AntennaPositions.push_back(sPos);
767  const double t = sRec.GetParameter(revt::eSignalTime);
768  OUT(eObscure) << "SignalTime of Station " << sIt->GetId() << ": " << t << endl;
769  AntennaTimes.push_back(t);
770  AntennaTimesError.push_back(sRec.GetParameterError(eSignalTime));
771  }
772  fit.nStations = AntennaTimes.size();
773 
774  // Give the Antenna Positions and Times to objective function
775  ChiSWFVarC->Set(AntennaPositions, AntennaTimes, AntennaTimesError, fLocalCS);
776  minimizer->SetFunction(*ChiSWFVarC);
777 
778  minimizer->SetLimitedVariable(0, "r", fit.r, 10., 0., fRMax);
779  minimizer->SetLimitedVariable(1, "theta", fit.theta, 0.1, 0., fThetaMax);
780  minimizer->SetVariable(2, "phi", fit.phi, 0.1);
781  minimizer->SetLowerLimitedVariable(3, "gamma", fit.gamma, 0.01, 0.);
782 
783  // THE FIT:
784  minimizer->SetPrintLevel(0);
785  if (!minimizer->Minimize()) {
786  fit.status = minimizer->Status();
787  return eBreakLoop;
788  }
789 
790  // Save Results
791  fit.status = minimizer->Status();
792  fit.r = minimizer->X()[0];
793  fit.phi = NormalizeAngle(minimizer->X()[2]);
794  fit.theta = NormalizeAngle(minimizer->X()[1]);
795  fit.rError = minimizer->Errors()[0];
796  fit.phiError = minimizer->Errors()[2];
797  fit.thetaError = minimizer->Errors()[1];
798  fit.gamma = minimizer->X()[3];
799  fit.gammaError = minimizer->Errors()[3];
800 
801  fit.nCalls = minimizer->NCalls();
802  fit.minChi = minimizer->MinValue();
803  fit.recStage = ShowerRRecData::kSphericalWaveFitVarC;
804 
805  // save covariance matrix
806  fit.c00 = minimizer->CovMatrix(0, 0);
807  fit.c11 = minimizer->CovMatrix(1, 1);
808  fit.c22 = minimizer->CovMatrix(2, 2);
809  fit.c01 = minimizer->CovMatrix(0, 1);
810  fit.c02 = minimizer->CovMatrix(0, 2);
811  fit.c12 = minimizer->CovMatrix(1, 2);
812 
813  fit.NDF = fit.nStations - 5;
814 
815  /* the spherical wave fit VarC can be performed with just 5 stations. The number of degrees
816  * of freedom is 0, though. To be able to compute chiSquare/NDF the NDF is set to 1.
817  */
818  if (fit.nStations < 6) {
819  fit.chiSquareNDF = minimizer->MinValue() / (fit.nStations - 4);
820  } else {
821  fit.chiSquareNDF = minimizer->MinValue() / (fit.nStations - 5);
822  }
823  // save Time Residual of Stations
824  const utl::Vector axis(fit.r, fit.theta, fit.phi, fLocalCS, Vector::kSpherical);
825  const std::vector<double> timeResiduals = GetTimeResiduals(AntennaPositions, AntennaTimes, axis,
826  eSphericalVarC, fit.gamma);
827  //loop over all stations
828  int iStation = 0;
829 
830  for (REvent::StationIterator sIt = rEvent.StationsBegin(); sIt != rEvent.StationsEnd(); ++sIt) {
831  StationRecData& sRec = sIt->GetRecData();
832  sRec.DeleteParameter(eTimeResidual);
833  }
834 
836  sIt != rEvent.SignalStationsEnd(); ++sIt) {
837 
838  StationRecData& sRec = sIt->GetRecData();
839  sRec.SetParameter(eTimeResidual, timeResiduals[iStation]);
840  sRec.SetParameterError(eTimeResidual, AntennaTimesError[iStation]);
841 // OUT(eObscure) << "TimeResidual of Station " << sIt->GetId() << ": " << timeResiduals[iStation] << " +/- "
842 // << AntennaTimesError[iStation] << " ns" << endl;
843  ++iStation;
844  }
845 
846  delete minimizer;
847 
848  return eSuccess;
849 }
850 
851 VModule::ResultFlag RdWaveFit::ConicalWaveFit(revt::REvent& rEvent, FitParameters& fit,
852  int type) const
853 {
854  if (fNumberOfStations < 4) {
855  OUT(eBreakLoop) << "ERROR: At least 4 stations are needed for a conical wave fit" << endl;
856  return eBreakLoop;
857  }
858  // Initiate the Minuit2 Minimizer
859  ROOT::Minuit2::Minuit2Minimizer* minimizer = 0;
860  if (type == 0) {
861  minimizer = new ROOT::Minuit2::Minuit2Minimizer(ROOT::Minuit2::kMigrad);
862  } else if (type == 1) {
863  minimizer = new ROOT::Minuit2::Minuit2Minimizer(ROOT::Minuit2::kSimplex);
864  } else if (type == 2) {
865  minimizer = new ROOT::Minuit2::Minuit2Minimizer(ROOT::Minuit2::kCombined);
866  } else if (type == 3) {
867  minimizer = new ROOT::Minuit2::Minuit2Minimizer(ROOT::Minuit2::kScan);
868  }
869 
870  const rdet::RDetector& rDetector = det::Detector::GetInstance().GetRDetector();
871 
872  vector<utl::Vector> AntennaPositions;
873  vector<double> AntennaTimes;
874  vector<double> AntennaTimesError;
875 
876  // loop over all stations
878  sIt != rEvent.SignalStationsEnd(); ++sIt) {
879  const Vector sPos = rDetector.GetStation(*sIt).GetPosition() - fReferenceCore;
880  const StationRecData& sRec = sIt->GetRecData();
881  AntennaPositions.push_back(sPos);
882  const double t = sRec.GetParameter(revt::eSignalTime);
883 // OUT(eObscure) << "SignalTime of Station " << sIt->GetId() << ": " << t << endl;
884  AntennaTimes.push_back(t);
885  AntennaTimesError.push_back(sRec.GetParameterError(eSignalTime));
886  }
887  fit.nStations = AntennaTimes.size();
888  // Give the Antenna Position and Times to objective function
889  ChiCWF->Set(AntennaPositions, AntennaTimes, AntennaTimesError, fLocalCS);
890  minimizer->SetFunction(*ChiCWF);
891  minimizer->SetVariable(0, "rho", fit.rho, 0.01);
892  //minimizer->SetLimitedVariable(0, "rho", fit.rho, 0.01, 0., fRhoMax); // for non-negative rho angles
893  /*minimizer->SetLimitedVariable(1, "theta", fit.theta, 0.1, 0., fThetaMax);
894  minimizer->SetVariable(2, "phi", fit.phi, 0.1);*/
895  // Set theta and phi fixed on values from spherical wave fit varC
896  minimizer->SetFixedVariable(1, "theta", fit.theta);
897  minimizer->SetFixedVariable(2, "phi", fit.phi);
898 
899 
900  // THE FIT:
901  OUT(eMinuit) << "vor minimization" << endl;
902  minimizer->SetPrintLevel(1);
903  if (!minimizer->Minimize()) {
904  fit.status = minimizer->Status();
905  return eBreakLoop;
906  }
907 
908  //Save Results
909  fit.status = minimizer->Status();
910  fit.rho = NormalizeAngle(minimizer->X()[0]);
911  fit.phi = NormalizeAngle(minimizer->X()[2]);
912  fit.theta = NormalizeAngle(minimizer->X()[1]);
913  fit.rhoError = minimizer->Errors()[0];
914  fit.phiError = minimizer->Errors()[2];
915  fit.thetaError = minimizer->Errors()[1];
916 
917  OUT(eMinuit) << "reconstructed rho = " << fit.rho / utl::degree << " +/- "
918  << fit.rhoError / utl::degree << " deg" << endl;
919 
920  fit.nCalls = minimizer->NCalls();
921  fit.minChi = minimizer->MinValue();
922  fit.recStage = ShowerRRecData::kConicalWaveFit;
923 
924 // OUT(eMinuit) << "nCalls: " << fit.nCalls << endl;
925 
926  // save covariance matrix
927  fit.c00 = 0; // set to zero because it's the covariance between radius and theta/phi. And radius doesn't exist in conical wave fit
928  fit.c11 = minimizer->CovMatrix(1, 1);
929  fit.c22 = minimizer->CovMatrix(2, 2);
930  fit.c01 = 0; // set to zero because it's the covariance between radius and theta/phi. And radius doesn't exist in conical wave fit
931  fit.c02 = 0; // set to zero because it's the covariance between radius and theta/phi. And radius doesn't exist in conical wave fit
932  fit.c12 = minimizer->CovMatrix(1, 2);
933 
934  fit.NDF = fit.nStations - 4;
935 
936  /* the conical wave fit can be performed with just 4 stations. The number of degrees
937  * of freedom is 0, though. To be able to compute chiSquare/NDF the NDF is set to 1.
938  */
939  if (fit.nStations < 5) {
940  fit.chiSquareNDF = minimizer->MinValue() / (fit.nStations - 3);
941  } else {
942  fit.chiSquareNDF = minimizer->MinValue() / (fit.nStations - 4);
943  }
944  // save Time Residual of Stations
945  const utl::Vector axis(1, fit.theta, fit.phi, fLocalCS, Vector::kSpherical);
946  const std::vector<double> timeResiduals = GetTimeResiduals(AntennaPositions, AntennaTimes, axis,
947  eConical, 1, fit.rho);
948  //loop over all stations
949  int iStation = 0;
950 
951  for (REvent::StationIterator sIt = rEvent.StationsBegin(); sIt != rEvent.StationsEnd(); ++sIt) {
952  StationRecData& sRec = sIt->GetRecData();
953  sRec.DeleteParameter(eTimeResidual);
954  }
955 
957  sIt != rEvent.SignalStationsEnd(); ++sIt) {
958 
959  StationRecData& sRec = sIt->GetRecData();
960  sRec.SetParameter(eTimeResidual, timeResiduals[iStation]);
961  sRec.SetParameterError(eTimeResidual, AntennaTimesError[iStation]);
962 // OUT(eObscure) << "TimeResidual of Station " << sIt->GetId() << ": " << timeResiduals[iStation] << " +/- "
963 // << AntennaTimesError[iStation] << " ns" << endl;
964  iStation++;
965  }
966 
967  delete minimizer;
968 
969  return eSuccess;
970 }
971 
972 VModule::ResultFlag RdWaveFit::ScanPWF(revt::REvent& rEvent, FitParameters& sFitResults) const
973 {
974  // this will store init & intermediate Parameters
975  FitParameters sFitParameters;
976 
977  // necessary to save standard values Radius and Gamma
978  sFitParameters = sFitResults;
979 
980  // necessary to abort if fit fails for all initial values
981  sFitResults.status = 1;
982 
983  // set initial fit parameters
984  double stepTheta = 90. / (fNInitsTheta + 1) * utl::degree;
985  double stepPhi = 360. / (fNInitsPhi) * utl::degree;
986  double theta(0.);
987  double phi = -180. * utl::degree;
988 
989  OUT(eObscure) << "Stepwidth for initial values: stepTheta = " << stepTheta / utl::deg
990  << " stepPhi = " << stepPhi / utl::deg << endl;
991 
992  // call PlaneWaveFit for different init values
993  bool first_fit = true;
994  for (int iTheta = 0; iTheta < fNInitsTheta; ++iTheta) {
995  theta = stepTheta * (iTheta + 1);
996  for (int iPhi = 0; iPhi < fNInitsPhi; ++iPhi) {
997  phi = -180. * utl::degree + stepPhi * iPhi;
998  OUT(eObscure) << " theta = " << theta / utl::deg << " deg\tphi = " << phi / utl::deg << " deg"
999  << endl;
1000 
1001  sFitParameters.theta = theta;
1002  sFitParameters.phi = phi;
1003 
1004  if (PlaneWaveFit(rEvent, sFitParameters, 1) != eSuccess) // call Fit in kSimplex mode
1005  {
1006  OUT(eObscure) << "PlaneWaveFit for theta = " << theta / utl::deg << " phi = "
1007  << phi / utl::deg
1008  << " in kSimplex was not successful: skip to next initial value" << endl;
1009  continue;
1010  }
1011  if (PlaneWaveFit(rEvent, sFitParameters, 0) != eSuccess) {
1012  OUT(eObscure) << "PlaneWaveFit for theta = " << theta / utl::deg << " phi = "
1013  << phi / utl::deg
1014  << " in kMigrad was not successful: skip to next initial value" << endl;
1015  continue;
1016  }
1017 
1018  OUT(eObscure) << "sFitParameters.status = " << sFitParameters.status << endl;
1019 
1020  // save Fit Results if better as previous fit or if its the first successful fit
1021  if (sFitParameters.minChi < sFitResults.minChi || first_fit) {
1022  first_fit = false;
1023  sFitResults = sFitParameters;
1024  }
1025 
1026  }
1027  }
1028 
1029  // break Function if reconstruction is not successful
1030  if (sFitResults.status != 0) {
1031  OUT(eBreakLoop) << "ERROR: reconstruction was not successful" << endl;
1032  return eBreakLoop;
1033  }
1034 
1035  sFitResults.corrected = false;
1036  if (sFitResults.theta > TMath::Pi() / 2.) // flip minimum about horizon, check for better minimum
1037  {
1038  sFitParameters = sFitResults; // buffer best result, so that this result won't be lost due to the new fit
1039 
1040  sFitParameters.theta = TMath::Pi() - sFitParameters.theta;
1041 
1042  if (PlaneWaveFit(rEvent, sFitParameters, 1) != eSuccess) // call Fit in kSimplex mode
1043  {
1044  OUT(eObscure) << "Horizon Correction: PlaneWaveFit for theta = " << sFitParameters.theta
1045  << " in kSimplex was not successful: calling again in kMigrad mode" << endl;
1046  }
1047 
1048  if (PlaneWaveFit(rEvent, sFitParameters, 0) == eSuccess) // call Fit in kMigrad mode
1049  {
1050  if (sFitParameters.minChi < sFitResults.minChi) {
1051  OUT(eObscure) << "Horizon corrected! " << endl;
1052  sFitParameters.corrected = true;
1053  sFitResults = sFitParameters;
1054  }
1055  } else {
1056  OUT(eObscure) << "Horizon Correction: PlaneWaveFit for theta "
1057  << sFitParameters.theta / utl::deg << " in kMigrad was not successful" << endl;
1058  }
1059  }
1060 
1061  return eSuccess;
1062 }
1063 
1064 VModule::ResultFlag RdWaveFit::ScanSWF(revt::REvent& rEvent, FitParameters& sFitResults) const
1065 {
1066  // this will store init & intermediate Parameters
1067  FitParameters sFitParameters;
1068 
1069  //save fit results from PlaneWaveFit as initial parameters for SphericalWaveFit
1070  sFitParameters = sFitResults;
1071 
1072  // initial values for the radius
1073  double rInits[] = { 0., 300., 1000., 3000., 10000. };
1074  const int nRInits = sizeof(rInits) / sizeof(rInits[0]);
1075 
1076  // set initial fit status to failure
1077  sFitResults.status = 1;
1078 
1079  // flag to identify the first successful fit
1080  bool first_fit = true;
1081  for (int i = 0; i < nRInits; ++i) {
1082  sFitParameters.r = rInits[i];
1083 
1084  if (SphericalWaveFit(rEvent, sFitParameters, 1) != eSuccess) // call Fit in kSimplex mode
1085  {
1086  OUT(eObscure) << "SphericalWaveFit for r = " << rInits[i]
1087  << " in kSimplex was not successful: skip to next initial value" << endl;
1088  continue;
1089  }
1090  if (SphericalWaveFit(rEvent, sFitParameters, 0) != eSuccess) {
1091  OUT(eObscure) << "SphericalWaveFit for r = " << rInits[i]
1092  << " in kMigrad was not successful: skip to next initial value" << endl;
1093 
1094  continue;
1095  }
1096 
1097  // save Fit Results if better as previous fit or if its the first fit
1098 
1099  if (sFitParameters.minChi < sFitResults.minChi || first_fit) {
1100  first_fit = false;
1101  sFitResults = sFitParameters;
1102  }
1103  }
1104 
1105  // break Function if reconstruction is not successful
1106  if (sFitResults.status > 0) {
1107  OUT(eBreakLoop) << "ERROR: reconstruction was not successful" << endl;
1108  return eBreakLoop;
1109  }
1110 
1111  sFitResults.corrected = false;
1112  if (sFitResults.theta > TMath::Pi() / 2.) // flip minimum about horizon, check for better minimum
1113  {
1114  sFitParameters = sFitResults; // buffer best result, so that this result won't be lost due to the new fit
1115 
1116  sFitParameters.theta = TMath::Pi() - sFitParameters.theta;
1117 
1118  if (SphericalWaveFit(rEvent, sFitParameters, 1) != eSuccess) // call Fit in kSimplex mode
1119  {
1120  OUT(eObscure) << "Horizon Correction: SphericalWaveFit for theta = " << sFitParameters.theta
1121  << " in kSimplex was not successful: calling again in kMigrad mode" << endl;
1122  }
1123 
1124  if (SphericalWaveFit(rEvent, sFitParameters, 0) == eSuccess) // call Fit in kMigrad mode
1125  {
1126  if (sFitParameters.minChi < sFitResults.minChi) {
1127  OUT(eObscure) << "Horizon corrected! " << endl;
1128  sFitParameters.corrected = true;
1129  sFitResults = sFitParameters;
1130  }
1131  } else {
1132  OUT(eObscure) << "Horizon Correction: SphericalWaveFit for theta " << sFitParameters.theta
1133  << " in kMigrad was not successful" << endl;
1134  }
1135  }
1136 
1137  return eSuccess;
1138 }
1139 
1140 VModule::ResultFlag RdWaveFit::ScanSWFVarC(revt::REvent& rEvent, FitParameters& sFitResults) const
1141 {
1142  // this will store init & intermediate Parameters
1143  FitParameters sFitParameters;
1144 
1145  //save fit results from SphericalWaveFit as initial parameters for SphericalWaveFitVarC
1146  sFitParameters = sFitResults;
1147 
1148  sFitResults.status = eFailure;
1149 
1150  if (SphericalWaveFitVarC(rEvent, sFitParameters, 1) != eSuccess) // call Fit in kSimplex mode
1151  {
1152  OUT(eBreakLoop) << "SphericalWaveFitVarC in kSimplexMode was not successful" << endl;
1153  return eBreakLoop;
1154  }
1155  if (SphericalWaveFitVarC(rEvent, sFitParameters, 0) != eSuccess) {
1156  OUT(eBreakLoop) << "SphericalWaveFitVarC in kMigradMode was not successful" << endl;
1157  return eBreakLoop;
1158  }
1159 
1160  sFitResults = sFitParameters;
1161 
1162  sFitResults.corrected = false;
1163  if (sFitResults.theta > TMath::Pi() / 2.) // flip minimum about horizon, check for better minimum
1164  {
1165  sFitParameters = sFitResults; // buffer best result, so that this result won't be lost due to the new fit
1166 
1167  sFitParameters.theta = TMath::Pi() - sFitParameters.theta;
1168 
1169  SphericalWaveFitVarC(rEvent, sFitParameters, 1); // call Fit in kSimplex mode
1170 
1171  if (SphericalWaveFitVarC(rEvent, sFitParameters, 0) == eSuccess) // call Fit in kMigrad mode
1172  {
1173  if (sFitParameters.minChi < sFitResults.minChi) {
1174  sFitParameters.corrected = true;
1175  sFitResults = sFitParameters;
1176  }
1177  }
1178  }
1179 
1180  return eSuccess;
1181 }
1182 
1183 VModule::ResultFlag RdWaveFit::ScanCWF(revt::REvent& rEvent, FitParameters& sFitResults) const
1184 {
1185  OUT(eMinuit) << "ScanCWF" << endl;
1186  //this will store init & intermediate Parameters
1187  FitParameters sFitParameters;
1188 
1189  //save fit results from ConicalWaveFit as initial parameters for ConicalWaveFit
1190  sFitParameters = sFitResults;
1191 
1192  OUT(eMinuit) << "start values for conical wave fit : zenith = "
1193  << sFitParameters.theta / utl::degree << "deg\t azimuth = "
1194  << sFitParameters.phi / utl::degree << " deg" << endl;
1195 
1196  // set initial fit status to failure
1197  sFitResults.status = eFailure;
1198 
1199  double rhoInits[] = { 0., 0.5*utl::degree, 1.0*utl::degree, 1.5*utl::degree, 2.0*utl::degree, 3.0*utl::degree };
1200  const int nRhoInits = sizeof(rhoInits) / sizeof(rhoInits[0]);
1201 
1202  bool first_fit = true;
1203  for (int i = 0; i < nRhoInits; i++) {
1204  OUT(eMinuit) << "conical wave fit for rho = " << rhoInits[i] / utl::degree << " deg" << endl;
1205 
1206  sFitParameters.rho = rhoInits[i];
1207 
1208  if (ConicalWaveFit(rEvent, sFitParameters, 1) != eSuccess) {
1209  OUT(eBreakLoop) << "ConicalWaveFit in kSimplexMode was not successful" << endl;
1210  continue;
1211  }
1212  if (ConicalWaveFit(rEvent, sFitParameters, 0) != eSuccess) {
1213  OUT(eObscure) << "ConicalWaveFit for rho = " << sFitParameters.rho
1214  << " in kMigrad was not successful: skip to next initial value" << endl;
1215 
1216  continue;
1217  }
1218 
1219  // save Fit Results if better as previous fit or if its the first fit
1220 
1221  if (sFitParameters.minChi < sFitResults.minChi || first_fit) {
1222  first_fit = false;
1223  sFitResults = sFitParameters;
1224  }
1225  }
1226 
1227  // break Function if reconstruction is not successful
1228  if (sFitResults.status != 0) {
1229  OUT(eBreakLoop) << "ERROR: reconstruction was not successful" << endl;
1230  return eBreakLoop;
1231  }
1232 
1233  sFitResults.corrected = false;
1234  if (sFitResults.theta > TMath::Pi() / 2.) // flip minimum about horizon, check for better minimum
1235  {
1236  sFitParameters = sFitResults; // buffer best result, so that this result won't be lost due to the new fit
1237 
1238  sFitParameters.theta = TMath::Pi() - sFitParameters.theta;
1239 
1240  if (ConicalWaveFit(rEvent, sFitParameters, 1) != eSuccess) // call Fit in kSimplex mode
1241  {
1242  OUT(eObscure) << "Horizon Correction: ConicalWaveFit for theta = " << sFitParameters.theta
1243  << " in kSimplex was not successful: calling again in kMigrad mode" << endl;
1244  }
1245 
1246  if (ConicalWaveFit(rEvent, sFitParameters, 0) == eSuccess) // call Fit in kMigrad mode
1247  {
1248  if (sFitParameters.minChi < sFitResults.minChi) {
1249  OUT(eObscure) << "Horizon corrected! " << endl;
1250  sFitParameters.corrected = true;
1251  sFitResults = sFitParameters;
1252  }
1253  } else {
1254  OUT(eObscure) << "Horizon Correction: ConicalWaveFit for theta " << sFitParameters.theta / utl::deg
1255  << " in kMigrad was not successful" << endl;
1256  }
1257  }
1258 
1259  return eSuccess;
1260 }
1261 
1262 VModule::ResultFlag RdWaveFit::CallPlaneWaveFit(revt::REvent& rEvent, FitParameters& sFitResults,
1263  bool reuseFit) const
1264 {
1265 
1267 
1268  if (fNumberOfStations < 3) {
1269  OUT(eBreakLoop) << "Not enough Stations" << endl;
1270  return eBreakLoop;
1271  }
1272  // for the first time
1273  if (!reuseFit) {
1274  return ScanPWF(rEvent, sFitResults);
1275  } else // for a reuse fit
1276  {
1277  // call first in kSimplex
1278  result = PlaneWaveFit(rEvent, sFitResults, 1);
1279  if (result != eSuccess) {
1280  WARNING("reuse plane wave fit in kSimplex mode was not successful");
1281  return result;
1282  }
1283 
1284  // call in kMigrad
1285  result = PlaneWaveFit(rEvent, sFitResults, 0);
1286  return result;
1287  }
1288 }
1289 
1290 VModule::ResultFlag RdWaveFit::CallSphericalWaveFit(revt::REvent& rEvent,
1291  FitParameters& sFitResults, bool reuseFit)
1292 {
1293 
1295  // if event contains only 4 Stations perform just a plane wave fit
1296  if (fNumberOfStations < 4) {
1297  if (fInfoLevel > 0) {
1298  INFO(
1299  "Event contains less than 4 Stations: Only the PlaneWaveFit will be performed. Setting WaveFrontModel to ePlane");
1300  }
1302  return CallPlaneWaveFit(rEvent, sFitResults, reuseFit);
1303  }
1304 
1305  if (!reuseFit) {
1306  // perform a plane wave fit first
1307  result = CallPlaneWaveFit(rEvent, sFitResults, reuseFit);
1308  // exit function in case of a failure
1309  if (result != eSuccess) {
1310  return result;
1311  }
1312 
1313  return ScanSWF(rEvent, sFitResults);
1314  } else // for a reuse fit
1315  {
1316  return SphericalWaveFit(rEvent, sFitResults, 0);
1317  }
1318 }
1319 
1320 VModule::ResultFlag RdWaveFit::CallSphericalWaveFitVarC(revt::REvent& rEvent,
1321  FitParameters& sFitResults, bool reuseFit)
1322 {
1323 
1325 
1326  if (fNumberOfStations < 4) {
1327  if (fInfoLevel > 0) {
1328  INFO(
1329  "Event contains less than 4 Stations: Only the PlaneWaveFit will be performed. Setting WaveFrontModel to ePlane");
1330  }
1332  return CallPlaneWaveFit(rEvent, sFitResults, reuseFit);
1333  }
1334  if (fNumberOfStations == 4) {
1335  if (fInfoLevel > 0) {
1336  INFO(
1337  "Event contains 4 Stations: Only the SphericalWaveFit will be performed. Setting WaveFrontModel to eSpherical");
1338  }
1340  return CallSphericalWaveFit(rEvent, sFitResults, reuseFit);
1341  }
1342 
1343  if (!reuseFit) {
1344  // perform a plane wave fit first
1345  result = CallPlaneWaveFit(rEvent, sFitResults, reuseFit);
1346  // exit function in case of a failure
1347  if (result != eSuccess) {
1348  return result;
1349  }
1350 
1351  if (sFitResults.theta > fThetaVarC) {
1352  // perform a spherical wave fit first
1353  result = ScanSWF(rEvent, sFitResults);
1354  // exit function in case of a failure
1355  if (result != eSuccess) {
1356  return result;
1357  }
1358 
1359  return ScanSWFVarC(rEvent, sFitResults);
1360  } else {
1361  return ScanSWF(rEvent, sFitResults);
1362  }
1363  } else // for a reuse fit
1364  {
1365  if (sFitResults.theta > fThetaVarC) {
1366  return SphericalWaveFitVarC(rEvent, sFitResults, 0);
1367  } else {
1368  return SphericalWaveFit(rEvent, sFitResults, 0);
1369  }
1370  }
1371 }
1372 
1373 VModule::ResultFlag RdWaveFit::CallConicalWaveFit(revt::REvent& rEvent, FitParameters& sFitResults,
1374  bool reuseFit)
1375 {
1376 
1378 
1379  if (fNumberOfStations < 4) {
1380  if (fInfoLevel > 0) {
1381  INFO(
1382  "Event contains less than 4 Stations: Only the PlaneWaveFit will be performed. Setting WaveFrontModel to ePlane");
1384  return CallPlaneWaveFit(rEvent, sFitResults, reuseFit);
1385  }
1386  }
1387 
1388  if (!reuseFit) {
1389  // perform a plane wave fit first
1390  /*OUT(eMinuit) << "Call plane fit before cone fit" << endl;
1391  result = CallPlaneWaveFit(rEvent, sFitResults, reuseFit);
1392  */
1393 
1394  // perform a spherical wave fit with variable speed of light first
1395  // to then use fixed shower axis from spherical wave fit for cone angle reconstruction
1396  OUT(eMinuit) << "Call spherical wave fit with variable speed of light" << endl;
1397  result = CallSphericalWaveFitVarC(rEvent, sFitResults, reuseFit);
1398 
1399 
1400  // exit function in case of a failure
1401  if (result != eSuccess) {
1402  return result;
1403  }
1404  OUT(eMinuit) << "call scan cone fit" << endl;
1405 
1406  return ScanCWF(rEvent, sFitResults);
1407  } else // for a reuse fit
1408  {
1409  return ConicalWaveFit(rEvent, sFitResults, 0);
1410  }
1411 
1412 }
1413 
1414 const std::vector<double> RdWaveFit::GetTimeResiduals(const std::vector<Vector>& AntennaPositions,
1415  const std::vector<double>& AntennaTimes,
1416  const utl::Vector& ShowerAxis,
1417  const unsigned int waveFrontModel,
1418  const double gamma, const double rho) const
1419 {
1420  double c = utl::kSpeedOfLight; // in AugerUnits
1421  std::vector<double> ExpectedTimes; // Expected time for each antenna if the test position is the source position
1422  std::vector<double> timeResiduals;
1423 
1424  double tau0(0);
1425  tau0 = TMath::Mean(AntennaTimes.begin(), AntennaTimes.end());
1426  /* an absolute event time for both the test and measured times. The absolute event time is choosen to be the mean of all measured/test times
1427  */
1428 
1429  // Calculate the expected times
1430  int n = AntennaPositions.size();
1431  double exp_time;
1432 
1433  // calculate expected times for the different wave models
1434  for (int i = 0; i < n; ++i) {
1435  switch (waveFrontModel) {
1436  case ePlane:
1437  exp_time = (-(ShowerAxis * AntennaPositions[i])) / c; // calculate (negative) projection
1438 // OUT(eObscure) << "GetTimeResiduals(): Plane Fit: Radius of ShowerAxis = " << ShowerAxis.GetMag() << std::endl;
1439  break;
1440  case eSpherical:
1441  exp_time = ((AntennaPositions[i] - ShowerAxis).GetMag()) / c;
1442 // OUT(eObscure) << "GetTimeResiduals(): SphericalWaveFit: Radius of ShowerAxis = " << ShowerAxis.GetMag() << std::endl;
1443  break;
1444  case eSphericalVarC:
1445  exp_time = ((AntennaPositions[i] - ShowerAxis).GetMag()) / (c * gamma);
1446 // OUT(eObscure) << "GetTimeResiduals(): SphericalWaveFitVarC: Radius of ShowerAxis = " << ShowerAxis.GetMag() << std::endl;
1447  break;
1448  case eConical:
1449  exp_time = (-ShowerAxis*AntennaPositions[i] + tan(rho) * fabs((fabs(ShowerAxis*AntennaPositions[i])*ShowerAxis-AntennaPositions[i]).GetMag())) / c;
1450 // OUT(eObscure) << "GetTimeResiduals(): ConicalWaveFit: Radius of ShowerAxis = " << ShowerAxis.GetMag() << std::endl;
1451  break;
1452  default:
1453  WARNING(
1454  "GetTimeResiduals(): No method definded to calculate the expected time for that wave model");
1455  return timeResiduals;
1456  }
1457  ExpectedTimes.push_back(exp_time);
1458  }
1459 
1460  // get the minimum of ExpectedTimes
1461  double t0(0);
1462  t0 = TMath::Mean(ExpectedTimes.begin(), ExpectedTimes.end());
1463 
1464  // Calculate chi square
1465  for (int i = 0; i < n; ++i) {
1466 // OUT(eObscure) << "GetTimeResiduals(): TimeResidual of Station "<< i << " = " << (AntennaTimes[i]-tau0)-(ExpectedTimes[i]-t0) << std::endl;
1467  timeResiduals.push_back((AntennaTimes[i] - tau0) - (ExpectedTimes[i] - t0));
1468  }
1469  return timeResiduals;
1470 }
1471 
1472 
1473  VModule::ResultFlag RdWaveFit::ComputeBaryCenter(const revt::REvent& rEvent,
1474  utl::Point& baryCenter)
1475  {
1476 
1477  const det::Detector& detector = det::Detector::GetInstance();
1478  const rdet::RDetector& rDetector = detector.GetRDetector();
1479  const CoordinateSystemPtr siteCS = detector.GetSiteCoordinateSystem();
1480 
1481  // the absolute points in time and space
1482  const Point siteOrigin(0, 0, 0, siteCS);
1483 
1484  Vector barySum(0, 0, 0, siteCS);
1485  double weightSum = 0;
1486 
1488  sIt != rEvent.SignalStationsEnd(); ++sIt) {
1489  const rdet::Station& dStation = rDetector.GetStation(*sIt);
1490  const StationRecData& sRec = sIt->GetRecData();
1491  weightSum += sqrt(sRec.GetParameter(eSignal));
1492  barySum += (dStation.GetPosition() - siteOrigin) * sqrt(sRec.GetParameter(eSignal));
1493  } //station loop
1494 
1495  barySum /= weightSum;
1496  baryCenter = siteOrigin + barySum;
1497 
1498  return eSuccess;
1499  }
1500 
1501 
1502 }
Branch GetTopBranch() const
Definition: Branch.cc:63
unsigned int fWaveFrontModel
Definition: RdWaveFit.h:224
Class to access station level reconstructed data.
void SetParameter(Parameter i, double value, bool lock=true)
bool HasParameter(const Parameter i) const
utl::Vector GetAxis() const
Returns vector of the shower axis.
void SetParameterError(Parameter i, double value, bool lock=true)
void DeleteParameter(const Parameter i1)
fwk::VModule::ResultFlag CallSphericalWaveFitVarC(revt::REvent &rEvent, FitParameters &sFitResults, bool reuseFit=false)
Definition: RdWaveFit.cc:1320
Point object.
Definition: Point.h:32
fwk::VModule::ResultFlag CallConicalWaveFit(revt::REvent &rEvent, FitParameters &sFitResults, bool reuseFit=false)
Definition: RdWaveFit.cc:1373
double GetPhi(const CoordinateSystemPtr &coordinateSystem) const
azimuth (phi) angle in spherical and cylindrical coordinates
Definition: BasicVector.h:254
fwk::VModule::ResultFlag PlaneWaveFit(revt::REvent &rEvent, FitParameters &fit, int type) const
Definition: RdWaveFit.cc:505
Report success to RunController.
Definition: VModule.h:62
Detector description interface for Station-related data.
StationRecData & GetRecData()
Get station level reconstructed data.
bool HasRecShower() const
Interface class to access to the Radio part of an event.
Definition: REvent.h:42
double GetR(const CoordinateSystemPtr &coordinateSystem) const
radius r in spherical coordinates coordinates (distance to origin)
Definition: BasicVector.h:257
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
fwk::VModule::ResultFlag ScanSWFVarC(revt::REvent &rEvent, FitParameters &sFitResults) const
Definition: RdWaveFit.cc:1140
ShowerRecData & GetRecShower()
Interface class to access to the RD Reconstruction of a Shower.
bool HasSimShower() const
double GetParameterError(const Parameter i) const
fwk::VModule::ResultFlag SphericalWaveFit(revt::REvent &rEvent, FitParameters &fit, int type) const
Definition: RdWaveFit.cc:615
vector< double > GetTimeResiduals(const vector< StationFitData > &vStationFitData, const Vector &showerAxis, const double tau0)
void Set(const std::vector< utl::Vector > &_AntennaPositions, const std::vector< double > &_AntennaTimes, const std::vector< double > &AntennaTimesErrors, const utl::CoordinateSystemPtr &_fgLocalCS)
const double meter
Definition: GalacticUnits.h:29
#define INFO(message)
Macro for logging informational messages.
Definition: ErrorLogger.h:161
Objective function for the spherical wave fit.
StationIterator StationsEnd()
Definition: REvent.h:130
StationIterator StationsBegin()
Definition: REvent.h:128
string ToString(const G &g, const CoordinateSystemPtr cs)
void Init()
Initialise the registry.
Branch GetChild(const std::string &childName) const
Get child of this Branch by child name.
Definition: Branch.cc:211
utl::CoordinateSystemPtr GetSiteCoordinateSystem() const
Get the coordinate system for the site.
Definition: Detector.h:137
const std::vector< double > GetTimeResiduals(const std::vector< utl::Vector > &AntennaPositions, const std::vector< double > &AntennaTimes, const utl::Vector &ShowerAxis, const unsigned int waveFrontModel, const double gamma=1, const double rho=0) const
Definition: RdWaveFit.cc:1414
#define OUT(x)
Definition: RdWaveFit.cc:46
boost::filter_iterator< StationFilter, AllStationIterator > StationIterator
Iterator over all (non-exculded) stations.
Definition: REvent.h:125
bool HasREvent() const
Detector description interface for RDetector-related data.
Definition: RDetector.h:46
constexpr double deg
Definition: AugerUnits.h:140
fwk::VModule::ResultFlag SphericalWaveFitVarC(revt::REvent &rEvent, FitParameters &fit, int type) const
Definition: RdWaveFit.cc:733
utl::CoordinateSystemPtr fLocalCS
Definition: RdWaveFit.h:240
Chi2ForSphericalWaveFit * ChiSWF
Definition: RdWaveFit.h:243
boost::shared_ptr< const CoordinateTransformer > CoordinateSystemPtr
Shared pointer for coordinate systems.
Class representing a document branch.
Definition: Branch.h:107
Break current loop. It works for nested loops too!
Definition: VModule.h:66
utl::Point GetCoordinateOrigin() const
class to hold data at the radio Station level.
fwk::VModule::ResultFlag ScanSWF(revt::REvent &rEvent, FitParameters &sFitResults) const
Definition: RdWaveFit.cc:1064
fwk::VModule::ResultFlag CallSphericalWaveFit(revt::REvent &rEvent, FitParameters &sFitResults, bool reuseFit=false)
Definition: RdWaveFit.cc:1290
Objective function for the plane wave fit.
void Set(const std::vector< utl::Vector > &_AntennaPositions, const std::vector< double > &_AntennaTimes, const std::vector< double > &_AntennaTimesError, const utl::CoordinateSystemPtr &_fgLocalCS)
double GetX(const CoordinateSystemPtr &coordinateSystem) const
Definition: BasicVector.h:206
void Set(const std::vector< utl::Vector > &_AntennaPositions, const std::vector< double > &_AntennaTimes, const std::vector< double > &_AntennaTimesError, const utl::CoordinateSystemPtr &_fgLocalCS)
const Data result[]
bool HasRRecShower() const
bool HasFRecShower() const
Chi2ForConicalWaveFit * ChiCWF
Definition: RdWaveFit.h:245
Top of the hierarchy of the detector description interface.
Definition: Detector.h:81
std::string fUsedCorePosition
Definition: RdWaveFit.h:248
constexpr double degree
constexpr double g
Definition: AugerUnits.h:200
#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
utl::Point fReferenceCore
Definition: RdWaveFit.h:239
int GetId() const
Get the station Id.
fwk::VModule::ResultFlag ScanPWF(revt::REvent &rEvent, FitParameters &sFitResults) const
Definition: RdWaveFit.cc:972
void SetSigmaGamma(double _sigma_gamma)
unsigned int currentWaveFrontModel
Definition: RdWaveFit.h:225
fwk::VModule::ResultFlag ConicalWaveFit(revt::REvent &rEvent, FitParameters &fit, int type) const
Definition: RdWaveFit.cc:851
double GetParameter(const Parameter i) const
double GetY(const CoordinateSystemPtr &coordinateSystem) const
Definition: BasicVector.h:209
constexpr double kSpeedOfLight
ResultFlag
Flag returned by module methods to the RunController.
Definition: VModule.h:60
Chi2ForSphericalWaveFitVarC * ChiSWFVarC
Definition: RdWaveFit.h:244
Chi2ForPlaneWaveFit * ChiPWF
Definition: RdWaveFit.h:242
void SetParameterError(Parameter i, double value, bool lock=true)
void Set(const std::vector< utl::Vector > &_AntennaPositions, const std::vector< double > &_AntennaTimes, const std::vector< double > &_AntennaTimesError, const utl::CoordinateSystemPtr &_fgLocalCS)
void SetParameter(Parameter i, double value, bool lock=true)
Vector object.
Definition: Vector.h:30
Report failure to RunController, causing RunController to terminate execution.
Definition: VModule.h:64
fwk::VModule::ResultFlag ScanCWF(revt::REvent &rEvent, FitParameters &sFitResults) const
Definition: RdWaveFit.cc:1183
#define NL
Definition: RdWaveFit.cc:47
const rdet::RDetector & GetRDetector() const
Definition: Detector.cc:143
double GetParameter(const Parameter i) const
double Mean(const std::vector< double > &v)
Definition: Functions.h:31
SignalStationIterator SignalStationsEnd()
Definition: REvent.h:114
double GetZ(const CoordinateSystemPtr &coordinateSystem) const
Definition: BasicVector.h:212
utl::Point GetPosition() const
Tank position in Site Cartesian Coordinates.
fwk::VModule::ResultFlag CallPlaneWaveFit(revt::REvent &rEvent, FitParameters &sFitResults, bool reuseFit=false) const
Definition: RdWaveFit.cc:1262
constexpr double m
Definition: AugerUnits.h:121
const Station & GetStation(const int stationId) const
Get station by Station Id.
Definition: RDetector.cc:141
std::string fUsedDirection
Definition: RdWaveFit.h:247
bool HasSRecShower() const
fwk::VModule::ResultFlag ComputeBaryCenter(const revt::REvent &rEvent, utl::Point &baryCenter)
Definition: RdWaveFit.cc:1473
Objective function for the conical wave fit.
Objective function for the spherical wave fit including the speed of light.
boost::filter_iterator< SignalStationFilter, AllStationIterator > SignalStationIterator
Iterator over all signal stations.
Definition: REvent.h:109
void SetParameterCovariance(Parameter i1, Parameter i2, double value, bool lock=true)
SignalStationIterator SignalStationsBegin()
Definition: REvent.h:112
boost::filter_iterator< SignalStationFilter, ConstAllStationIterator > ConstSignalStationIterator
Definition: REvent.h:110

, generated on Tue Sep 26 2023.