5 #include "DetectorGeometry.h"
6 #include <fwk/CentralConfig.h>
7 #include <det/VManager.h>
8 #include <det/Detector.h>
9 #include <rdet/RDetector.h>
10 #include <utl/Branch.h>
11 #include <utl/String.h>
12 #include <utl/RadioGeometryUtilities.h>
14 #include <evt/Event.h>
15 #include <evt/ShowerSRecData.h>
16 #include <evt/ShowerRecData.h>
17 #include <evt/ShowerRRecData.h>
18 #include <evt/ShowerSimData.h>
20 #include <revt/REvent.h>
21 #include <revt/Header.h>
22 #include <revt/StationConstants.h>
23 #include <revt/StationRecData.h>
24 #include <revt/StationConstants.h>
26 #include <utl/TraceAlgorithm.h>
49 REvent* RdHyperbolicWavefrontFit::fgCurrentREvent =
nullptr;
50 Event RdHyperbolicWavefrontFit::fgCurrentEvent;
52 double RdHyperbolicWavefrontFit::gTime0 = 0;
53 unsigned int RdHyperbolicWavefrontFit::gStation0Id = 0;
59 INFODebug(
"RdHyperbolicWavefrontFit::Init()");
61 Branch topBranch = CentralConfig::GetInstance()->
GetTopBranch(
"RdHyperbolicWavefrontFit");
71 Sorter(
const std::vector<double>& x,
const std::vector<double>& y)
78 SorterSt(
const pair<double, int>& x,
const pair<double, int>& y)
80 return x.first < y.first;
85 RdHyperbolicWavefrontFit::Run(
Event& event)
87 INFODebug(
"RdHyperbolicWavefrontFit::Run()");
91 WARNING(
"eContinueLoop, No radio event found!");
95 fgCurrentEvent = event;
99 event.GetRecShower().MakeRRecShower();
102 if (fUsedCore ==
"MC"){
110 if (fUsedCore ==
"SD") {
111 ShowerSRecData& showerSdRec =
event.GetRecShower().GetSRecShower();
114 gSAxis = - showerSdRec.
GetAxis();
118 if (fUsedCore ==
"RD") {
119 ShowerRRecData& showerRdRec =
event.GetRecShower().GetRRecShower();
122 gSAxis = - showerRdRec.
GetAxis();
126 const rdet::RDetector& rDetector = det::Detector::GetInstance().GetRDetector();
129 vector<pair<double, int> > stationvec;
134 sIt != fgCurrentREvent->SignalStationsEnd(); ++sIt) {
135 const double time = sIt->GetRecData().GetParameter(revt::eSignalTime);
136 stationvec.push_back(make_pair(time, sIt->GetId()));
140 if (stationvec.size() == 0){
141 return eContinueLoop;
144 sort(stationvec.begin(), stationvec.end(),
SorterSt);
146 gTime0 = stationvec[0].first;
147 gStation0Id = stationvec[0].second;
150 vector<pair<double, int> > stationVector;
155 sIt != fgCurrentREvent->SignalStationsEnd(); ++sIt) {
158 stationVector.push_back(make_pair(distance, sIt->GetId()));
161 sort(stationVector.begin(), stationVector.end(),
SorterSt);
177 if (fDoCoreSearch && fUsedCore ==
"SD") {
178 const ShowerSRecData& showerSdRec =
event.GetRecShower().GetSRecShower();
181 r = 2 *
sqrt(CoreErr_X*CoreErr_X + CoreErr_Y*CoreErr_Y);
186 std::vector<std::vector<double>>
result;
193 for (
int i = 0; i < Ncores; ++i) {
194 const double phi = rnd. Uniform(0, TMath::TwoPi());
195 const double radius =
sqrt(rnd.Uniform(0, r*r));
196 const double x = radius*TMath::Cos(phi);
197 const double y = radius*TMath::Sin(phi);
199 const Point core(x, y, 0, FixedfgLocalCS);
205 fit.
u = gSAxis.GetTheta(fgLocalCS);
206 fit.
v = gSAxis.GetPhi(fgLocalCS);
211 sIt != fgCurrentREvent->SignalStationsEnd(); ++sIt) {
213 const double sigma_time_snr_ = 20.5 *
pow(sIt->GetRecData().GetParameter(revt::eSignalToNoise), -1.03/1.1);
214 const double sTimeSigma2 = sigma_time_snr_ * sigma_time_snr_;
215 weight += 2 *
sqrt(1 + 1/sTimeSigma2 * 5/4) - 2;
225 TMinuit minuit(
nPar);
229 minuit.SetPrintLevel(-1);
231 minuit.SetFCN(RdHyperbolicWavefrontFit::RdHyperbolicWavefrontFnc);
233 minuit.mnexcm(
"SET ERRORDEF", argList, 1, errFlag);
234 minuit.mnparm(0,
"gamma", fit.
gamma, 0.001, 0, 0, errFlag);
235 minuit.mnparm(1,
"t0", fit.
t0, 0.001, 0, 0, errFlag);
237 minuit.mnparm(2,
"u", fit.
u, 0.01, 0, 0, errFlag);
238 minuit.mnparm(3,
"v", fit.
v, 0.01, 0, 0, errFlag);
242 minuit.mnexcm(
"CALI", argList, 1, errFlag);
245 minuit.mnexcm(
"MINIMIZE", argList, 1, errFlag);
248 minuit.mnexcm(
"MINOS", argList, 0, errFlag);
256 minuit.GetParameter(1, fit.
t0, fit.
t0Error);
258 minuit.GetParameter(2, fit.
u, fit.
uError);
259 minuit.GetParameter(3, fit.
v, fit.
vError);
264 minuit.mnstat(fit.
minChi, edm, errdef, nvpar, nparx, fit.
status);
267 const std::vector<double> vec({
272 double(fit.
NDF - nvpar),
273 gCore.GetX(FixedfgLocalCS),
274 gCore.GetY(FixedfgLocalCS),
275 fit.
minChi / double(fit.
NDF - nvpar) / weight,
280 result.push_back(vec);
287 sort(result.begin(), result.end(),
Sorter);
290 if (result.size() > 0) {
291 const auto& r0 = result.front();
296 const Point core(r0[5], r0[6], 0, FixedfgLocalCS);
307 event.MakeRecShower();
310 event.GetRecShower().MakeRRecShower();
312 ShowerRRecData& showerReco =
event.GetRecShower().GetRRecShower();
315 utl::Vector axis(1, fit.
u, fit.
v, localCS, Vector::kSpherical);
319 CalculateTimeResidual(axis, fit.
gamma, fit.
t0);
324 showerReco.
SetParameter(eWaveFrontModel, ShowerRRecData::kHyperbolicWaveFit);
330 showerReco.
SetParameter(eCoreZ, finalCore.GetZ(referenceCS));
338 showerReco.
SetParameter(eRecStage, ShowerRRecData::kHyperbolicWaveFit);
345 RdHyperbolicWavefrontFit::Finish()
352 RdHyperbolicWavefrontFit::RdHyperbolicWavefrontFnc(
int&
nPar,
double*
const ,
double& value,
double*
const par,
356 const double& gamma = par[0];
357 const double& t0 = par[1];
358 double theta = gSAxis.GetTheta(fgLocalCS);
359 double phi = gSAxis.GetPhi(fgLocalCS);
365 const utl::Vector axis(1, theta, phi, fgLocalCS, Vector::kSpherical);
370 const rdet::RDetector& rDetector = det::Detector::GetInstance().GetRDetector();
373 sIt != fgCurrentREvent->SignalStationsEnd(); ++sIt) {
376 const double sigma_time_snr_ = 20.5 *
pow(sIt->GetRecData().GetParameter(revt::eSignalToNoise), -1.03/1.1);
377 const double sTimeSigma2 = sigma_time_snr_ * sigma_time_snr_;
383 const double projVec = axis * VecDistanceToCore;
387 const double signalTime = sIt->GetRecData().GetParameter(revt::eSignalTime);
388 const double projTime = signalTime - gTime0 - relativePulseTime;
394 const double expectedTime =
sqrt(1 + perp.
GetMag() * perp.
GetMag() / (gamma * gamma) ) * 9 - 9 + t0;
397 const double dt = projTime - expectedTime;
398 Mscore += 2 *
sqrt(1 + A * dt*dt / (2 * sTimeSigma2)) - 2;
406 RdHyperbolicWavefrontFit::CalculateTimeResidual(
const utl::Vector& axis,
const double gamma,
const double t0)
const
408 const rdet::RDetector& rDetector = det::Detector::GetInstance().GetRDetector();
411 const double signal_time = sRec.
GetParameter(eSignalTime);
418 const double expectedTime =
sqrt(1 + perp.
GetMag() * perp.
GetMag() / (gamma * gamma) ) * 9 - 9 + t0;
420 sRec.
SetParameter(eTimeResidual, signal_time - expectedTime);
Branch GetTopBranch() const
Class to access station level reconstructed data.
void SetParameter(Parameter i, double value, bool lock=true)
utl::Vector GetAxis() const
Returns vector of the shower axis.
void SetParameterError(Parameter i, double value, bool lock=true)
static double GetDistanceToAxis(const utl::Vector &ShowerAxis, const utl::Point &CorePosition, const utl::Point &AntennaPosition)
computes the distance from the antenna position to the shower "line" defined by the core position and...
Interface class to access to the SD Reconstruction of a Shower.
bool HasRecShower() const
Interface class to access to the Radio part of an event.
ShowerRecData & GetRecShower()
Interface class to access to the RD Reconstruction of a Shower.
double GetParameterError(const Parameter i) const
const utl::Vector & GetCoreError() const
void Init()
Initialise the registry.
revt::REvent & GetREvent()
Branch GetChild(const std::string &childName) const
Get child of this Branch by child name.
double pow(const double x, const unsigned int i)
bool Sorter(const std::vector< double > &x, const std::vector< double > &y)
Detector description interface for RDetector-related data.
Interface class to access Shower Simulated parameters.
boost::shared_ptr< const CoordinateTransformer > CoordinateSystemPtr
Shared pointer for coordinate systems.
#define INFOIntermediate(y)
Class representing a document branch.
const utl::Vector & GetDirection() const
Get the direction of the shower axis. This is the true direction of shower movement.
double GetX(const CoordinateSystemPtr &coordinateSystem) const
constexpr double nanosecond
const utl::Point & GetPosition() const
Get the position of the shower core.
bool HasRRecShower() const
const utl::Vector & GetAxis() const
#define WARNING(message)
Macro for logging warning messages.
void GetData(bool &b) const
Overloads of the GetData member template function.
bool SorterSt(const pair< double, int > &x, const pair< double, int > &y)
double GetParameter(const Parameter i) const
double GetY(const CoordinateSystemPtr &coordinateSystem) const
constexpr double kSpeedOfLight
ResultFlag
Flag returned by module methods to the RunController.
void SetParameterError(Parameter i, double value, bool lock=true)
void SetParameter(Parameter i, double value, bool lock=true)
const utl::Point & GetCorePosition() const
utl::Point GetCorePosition() const
returns pointer of the position vector of the core in the reference coor system
double GetZ(const CoordinateSystemPtr &coordinateSystem) const
utl::Point GetPosition() const
Tank position in Site Cartesian Coordinates.
static Policy::type Create(const utl::Point &theOrigin)
Create the standard local coordinate system for a Point.
const Station & GetStation(const int stationId) const
Get station by Station Id.
boost::filter_iterator< SignalStationFilter, AllStationIterator > SignalStationIterator
Iterator over all signal stations.