5 #include <FairLogger.h>
7 #include <Math/Functor.h>
8 #include <Math/Point3D.h>
9 #include <Math/Vector3D.h>
10 #include <TEveCompound.h>
11 #include <TEveElement.h>
13 #include <TEvePointSet.h>
16 #include <Fit/FitConfig.h>
17 #include <Fit/FitResult.h>
18 #include <Fit/Fitter.h>
19 #include <Fit/ParameterSettings.h>
33 auto shape =
new TEveCompound();
36 shape->SetMainColor(kGreen);
37 shape->CSCApplyMainColorToMatchingChildren();
38 shape->OpenCompound();
42 dynamic_cast<TEveLine *
>(beam)->SetName(
"beam");
43 beam->SetMainColor(kRed);
44 shape->AddElement(beam);
46 for (
int i = 0; i < 2; ++i) {
48 dynamic_cast<TEveLine *
>(elem)->SetName(Form(
"frag_%d", i));
49 elem->SetMainColor(kGreen);
50 shape->AddElement(elem);
54 auto vertex =
new TEvePointSet(
"vertex", 1);
55 vertex->SetOwnIds(
true);
56 vertex->SetMarkerSize(2);
57 vertex->SetMainColor(kGreen);
59 shape->AddElement(vertex);
61 shape->CloseCompound();
68 auto comp = [](
const std::pair<XYZPoint, double> &a,
const std::pair<XYZPoint, double> &b) {
69 return a.second < b.second;
71 auto points = std::set<std::pair<XYZPoint, double>, decltype(comp)>(comp);
75 points.insert({ray.ClosestPointOnPattern(point), ray.DistanceToPattern(point)});
78 return points.begin()->first;
83 std::vector<double> distances;
86 distances.push_back(ray.DistanceToPattern(point));
87 return *std::min_element(distances.begin(), distances.end());
92 auto comp = [](
const std::pair<int, double> &a,
const std::pair<int, double> &b) {
return a.second < b.second; };
93 auto points = std::set<std::pair<int, double>, decltype(comp)>(comp);
96 points.insert({i,
fFragments[i].DistanceToPattern(point)});
97 points.insert({fFragments.size(), fBeam.DistanceToPattern(point)});
99 return points.begin()->first;
102 std::vector<double> AtPatternY::GetPatternPar()
const
104 std::vector<double> ret;
112 for (
int i = 0; i < 2; ++i) {
129 if (par.size() != 12) {
130 LOG(error) <<
"Defining a Y pattern requires 12 parameters!";
134 XYZPoint vertex(par[0], par[1], par[2]);
135 XYZVector beamDir(par[3], par[4], par[5]);
136 std::array<XYZVector, 2> fragDir;
137 for (
int i = 0; i < 2; ++i)
138 fragDir[i] = {par[6 + i * 3], par[7 + i * 3], par[8 + i * 3]};
143 const std::array<XYZVector, 2> &fragDir)
146 for (
int i = 0; i < 2; ++i)
153 LOG(fatal) <<
"Trying to create model with wrong number of points " << points.size();
156 auto sortedPoints = points;
157 std::sort(sortedPoints.begin(), sortedPoints.end(),
161 auto fVertex = points[1];
163 auto dir = points[0] - fVertex;
168 for (
int i = 0; i < 2; ++i) {
169 fFragments[i].DefinePattern({fVertex, points[i + 2]});
190 bool weighted = points.size() == charge.size();
191 LOG(debug) <<
"Fitting with" << (weighted ?
" " :
"out ") <<
"charge weighting";
196 auto func = [&points, &charge, weighted](
const double *par) {
201 for (
int i = 0; i < points.size(); ++i) {
202 auto q = weighted ? charge[i] : 1;
207 return fabs(chi2 / qTot);
210 auto functor = ROOT::Math::Functor(func, 12);
212 ROOT::Fit::Fitter fitter;
215 LOG(debug) <<
"Initial parameters";
216 for (
int i = 0; i < iniPar.size(); ++i)
217 LOG(debug) << Form(
"Par_%d", i) <<
"\t = " << iniPar[i];
219 fitter.SetFCN(functor, iniPar.data());
222 for (
int i = 0; i < 3; ++i)
223 fitter.Config().ParSettings(5 + i * 3).Fix();
225 for (
int i = 0; i < 12; ++i)
226 fitter.Config().ParSettings(i).SetStepSize(.01);
228 bool ok = fitter.FitFCN();
230 LOG(error) <<
"Failed to fit the pattern, using result of SAC";
235 auto &result = fitter.Result();
237 fChi2 = result.MinFcnValue();
238 fNFree = points.size() - result.NPar();