6 #include <utl/ErrorLogger.h>
7 #include <utl/PhysicalConstants.h>
12 #include <Minuit2/MnUserCovariance.h>
13 #include <Minuit2/MnMigrad.h>
14 #include <Minuit2/FunctionMinimum.h>
15 #include <Minuit2/MnUserParameters.h>
16 #include <Minuit2/MnPrint.h>
22 namespace MdGeometryFitterAG {
32 parSeed.Add(
"radius", 7500, 500);
50 TimeData detector = { id, pos, time, sigma };
57 parSeed.SetValue(
"xcore", core.x());
58 parSeed.SetValue(
"ycore", core.y());
59 parSeed.SetValue(
"zcore", core.z());
93 for (std::vector<TimeData>::const_iterator it=
timeData.begin(); it!=
timeData.end(); ++it) {
94 const double sigma = it->sigma;
95 const TVector3& pos = it->pos;
96 const double invSigma2 = 1./(sigma*sigma);
98 const double x_s = pos.x() * invSigma2;
100 sxx += pos.x() * x_s;
101 sxy += pos.y() * x_s;
102 sxt += (it->time) * x_s;
103 const double y_s = pos.y() * invSigma2;
105 syy += pos.y() * y_s;
106 syt += (it->time) * y_s;
107 st += (it->time) * invSigma2;
125 mat.InvertFast(&det);
128 INFO(
"Matrix inversion failed.");
137 const TMatrixD
p = TMatrixD(mat,TMatrixD::kMult,k);
142 INFO(
"Unphysical direction cosines");
158 double uplane, vplane;
162 if (
FitPlane(uplane, vplane, ct0plane)!=EXIT_SUCCESS) {
169 parSeed.SetValue(
"ct0", ct0plane);
173 ROOT::Minuit2::MnMigrad migrad(weightFunction,
parSeed);
175 ROOT::Minuit2::FunctionMinimum min = migrad();
182 if ( !min.IsValid() || !min.HasValidCovariance() || min.HesseFailed() || min.HasReachedCallLimit() ) {
183 ERROR(
"Minuit minimize error");
188 const ROOT::Minuit2::MnUserParameterState ¶meters0 = min.UserParameters();
191 const double utemp = parameters0.Parameter(0).Value();
192 const double vtemp = parameters0.Parameter(1).Value();
195 ERROR(
" Fit failed due to unphysical angle cosines.");
212 for (std::vector<TimeData>::const_iterator it=
timeData.begin(); it!=
timeData.end(); ++it) {
213 if (it->id==detectorId) {
218 ERROR(
"Detector not found");
228 for (std::vector<TimeData>::const_iterator it=
timeData.begin(); it!=
timeData.end(); ++it) {
229 if (it->id==detectorId) {
234 ERROR(
"Detector not found");
244 for (std::vector<TimeData>::const_iterator it=
timeData.begin(); it!=
timeData.end(); ++it) {
245 if (it->id==detectorId) {
250 ERROR(
"Detector not found");
260 for (std::vector<TimeData>::const_iterator it=
timeData.begin(); it!=
timeData.end(); ++it) {
261 if (it->id==detectorId) {
278 const double residual = data.
time - showerFront(data.
pos);
292 const double deviance = data.
time - showerFront(data.
pos);
303 for (std::vector<TimeData>::const_iterator it=
timeData.begin(); it!=
timeData.end(); ++it) {
308 double meanResidual = sum / n;
319 for (std::vector<TimeData>::const_iterator it=
timeData.begin(); it!=
timeData.end(); ++it) {
334 int nFreeParameters(0);
336 if (
parSeed.Parameter(i).IsFixed()==
false) {
341 int ndof = nDetectors - nFreeParameters;
352 double spread =
sqrt(chi2/(n - 1));
368 double thetaError, phiError, thetaPhiCorrelation;
382 double thetaError, phiError, thetaPhiCorrelation;
396 double thetaError, phiError, thetaPhiCorrelation;
402 return thetaPhiCorrelation;
413 TVector3 core(x, y, z);
431 unsigned int i =
parSeed.Index(
"radius");
432 return parSeed.Parameter(i).IsFixed();
438 unsigned int i =
parSeed.Index(
"xcore");
439 return parSeed.Parameter(i).IsFixed();
void SetCore(const TVector3 &core)
constexpr T Sqr(const T &x)
double GetTimeResidual(int detectorId) const
double GetTimeResidualSpread() const
boost::tuple< double, double, double > Triple
Coordinate triple for easy getting or setting of coordinates.
bool HasDetector(int detectorId) const
double GetThetaPhiCorrelation() const
#define INFO(message)
Macro for logging informational messages.
double GetPlaneFrontDelay(int detectorId) const
bool IsCurvatureFix() const
std::unique_ptr< ROOT::Minuit2::MnUserCovariance > CovariancePtr
double GetPhiError() const
double GetTimeResidualSigmas(const TimeData &data) const
void PropagateAxisErrors(const Vector::Triple &u_v_w, const Vector::Triple &sigma_u2_uv_v2, double &thetaError, double &phiError, double &thetaPhiCorrelation)
double GetThetaError() const
std::unique_ptr< ROOT::Minuit2::MnUserParameters > ParameterPtr
constexpr double kSpeedOfLight
double GetRadiusError() const
ROOT::Minuit2::MnUserParameters parSeed
double GetTimeError(int detectorId) const
int FitPlane(double &u, double &v, double &ct0) const
std::vector< TimeData > timeData
#define ERROR(message)
Macro for logging error messages.
int GetNDetectors() const
void AddDetector(int id, TVector3 pos, double time, double sigma)
Note about vectors The TVector3 class is used here instead of the utl::Vector and utl::Point classses...
double GetMeanTimeResidual() const