18 #include "FairBaseParSet.h"
19 #include "FairRootManager.h"
21 #include "FairRuntimeDb.h"
22 #include "FairTrackParP.h"
28 #include "TClonesArray.h"
32 #include "TGraph2DErrors.h"
33 #include "TLorentzVector.h"
37 #include "Math/Factory.h"
38 #include "Math/Functor.h"
39 #include "Math/Minimizer.h"
45 : FairTask(
"3D-Straight-Line-Fit"),
64 fmin = ROOT::Math::Factory::CreateMinimizer(
"Minuit2",
"Migrad");
66 fmin->SetMaxFunctionCalls(1000000);
67 fmin->SetMaxIterations(100000);
68 fmin->SetTolerance(0.001);
70 for (
int ih = 0; ih < 4; ih++)
hitMergedfl[ih] =
false;
76 : FairTask(
"3D-Straight-Line-Fit"),
94 fmin = ROOT::Math::Factory::CreateMinimizer(
"Minuit2",
"Migrad");
96 fmin->SetMaxFunctionCalls(1000000);
97 fmin->SetMaxIterations(100000);
98 fmin->SetTolerance(0.001);
100 for (
int ih = 0; ih < 4; ih++)
hitMergedfl[ih] =
false;
105 cout <<
"PndLmdLinFitTask::~PndLmdLinFitTask()" << endl;
110 FairRootManager* ioman = FairRootManager::Instance();
113 Error(
"PndLmdLinFitTask::Init",
"RootManager not instantiated!");
121 Error(
"PndLmdLinFitTask::Init",
"trackcand-array not found!");
128 Error(
"PndLmdLinFitTask::Init",
"reco-array not found!");
136 FairRun*
fRun = FairRun::Instance();
137 FairRuntimeDb*
rtdb = fRun->GetRuntimeDb();
138 FairBaseParSet*
par =
139 (FairBaseParSet*)(rtdb->findContainer(
"FairBaseParSet"));
140 fPbeam = par->GetBeamMom();
148 if (totRadLen < 1e-6)
153 double totRadLenCable = 0.053;
154 totRadLenCable += 0.05;
159 std::cout <<
"-I- PndLmdLinFitTask: Initialisation successfull" << std::endl;
165 if (
fTrackArray == 0) Fatal(
"PndLmdLinFitTask::Exec",
"No TrackArray");
172 std::cout <<
" -I- PndLmdLinFitTask: contains " << ntcand
173 <<
" RhoCandidates" << std::endl;
175 std::cout <<
" Detailed Debug info on the candidates:" << std::endl;
176 unsigned int index = 12345;
178 for (Int_t itr = 0; itr < ntcand; ++itr) {
180 std::cout <<
"TrackCand no. " << itr <<
" has " << trcnd->
GetNHits()
181 <<
" hits." << std::endl;
182 std::cout <<
"Point: \t Index: " << std::endl;
183 for (
unsigned int ihit = 0; ihit < trcnd->
GetNHits();
188 std::cout << ihit <<
"\t" << index << std::endl;
200 const int numPts = trcnd->
GetNHits();
202 TGraph2DErrors fitme(numPts);
205 for (
int ihit = 0; ihit < numPts; ihit++) {
218 double xhit = addPos.X();
219 double yhit = addPos.Y();
220 double zhit = addPos.Z();
227 if (ihit == 2) hit1 = addPos;
230 if (ihit == numPts - 1) {
235 double errxhit = addHit->GetDx();
236 double erryhit = addHit->GetDy();
237 double errzhit = addHit->GetDz();
238 fitme.SetPoint(ihit, xhit, yhit, zhit);
239 fitme.SetPointError(ihit, errxhit, erryhit, errzhit);
243 TVector3 dirSeed = hit1 - hit0;
244 TVector3 posSeed = hit0;
247 dirSeed = dirSeed.Unit();
248 std::vector<double> fit_parameters(22);
249 TMatrixDSym* COVmatrix =
new TMatrixDSym(6);
256 TVector3 FitPoint(fit_parameters[0], fit_parameters[2], fit_parameters[4]);
257 TVector3 FitDir(fit_parameters[1], fit_parameters[3], fit_parameters[5]);
260 TVector3 FitMom = FitDir *
fPbeam;
263 for (
int ij = 0; ij < 6; ij++) {
264 for (
int ji = 0; ji < 6; ji++) COVmatrixPosMom[ij][ji] = 0;
267 int iconver[6] = {3, 0, 4, 1, 5, 2};
268 for (
int ij = 0; ij < 6; ij++) {
269 for (
int ji = 0; ji < 6; ji++) {
270 if (ij == 1 || ij == 3 || ij == 5) (*COVmatrix)(ij, ji) *= fPbeam;
271 if (ji == 1 || ji == 3 || ji == 5) (*COVmatrix)(ij, ji) *= fPbeam;
272 int km = iconver[ij];
273 int mk = iconver[ji];
274 COVmatrixPosMom[km][mk] = (*COVmatrix)(ij, ji);
289 TVector3 o = FitPoint;
293 FairTrackParP* trkfitp =
new FairTrackParP(
294 FitPoint, FitMom, COVmatrixPosMom,
fCharge, o, dj, dk);
298 int ndf = 2 * (trcnd->
GetNHits()) - 4;
302 *trkfitp, *trkfitp, *trcnd, flagpndtrk, accuracy, ndf, pid,
track,
304 new ((*fTrackArray)[rec_tkr])
PndTrack(*(trackfit));
312 if (
fVerbose > 2) std::cout <<
"Fitting done" << std::endl;
319 double erry,
const double*
p,
321 double THfunc[8] = {1, 1, 1, 1, 1, 1, 1, 1};
326 Double_t t_min = p[1] * (x - p[0]) + p[3] * (y - p[2]) +
327 sqrt(1 - p[1] * p[1] - p[3] * p[3]) * (z - p[4]);
329 for (
int iz = 0; iz < 8; iz++)
330 if (((p[4] + t_min) - zpr[iz]) <= 0) THfunc[iz] = 0;
332 double funcX = p[0] + p[1] * t_min +
333 (-p[6] + p[7]) * ((p[4] + t_min) - zpr[0]) * THfunc[0] +
334 (-p[8] + p[9]) * ((p[4] + t_min) - zpr[2]) * THfunc[2] +
335 (-p[10] + p[11]) * ((p[4] + t_min) - zpr[4]) * THfunc[4] +
336 (-p[12] + p[13]) * ((p[4] + t_min) - zpr[6]) * THfunc[6];
337 double funcY = p[2] + p[3] * t_min +
338 (-p[14] + p[15]) * ((p[4] + t_min) - zpr[0]) * THfunc[0] +
339 (-p[16] + p[17]) * ((p[4] + t_min) - zpr[2]) * THfunc[2] +
340 (-p[18] + p[19]) * ((p[4] + t_min) - zpr[4]) * THfunc[4] +
341 (-p[20] + p[21]) * ((p[4] + t_min) - zpr[6]) * THfunc[6];
343 double fdx = TMath::Power((x - funcX) / errx, 2);
344 double fdy = TMath::Power((y - funcY) / erry, 2);
346 double fchi2 = fdx + fdy + fdz;
363 for (
int izpl = 0; izpl < 4; izpl++) {
364 zpr[izcur] = z[izpl];
366 zpr[izcur] = z[izpl];
370 double chi2 =
distance_MS(x[
i], y[i], z[i], errx[i], erry[i], vars, zpr);
374 for (
int jms = 0; jms < 8; jms = jms + 2) {
375 double errTot =
sqrt(erralA * erralA + erralB * erralB);
376 fdal += TMath::Power(((vars[7 + jms] - vars[6 + jms]) / errTot), 2);
377 fdal += TMath::Power(((vars[15 + jms] - vars[14 + jms]) / errTot), 2);
389 TLorentzVector LorMom(0, 0,
fPbeam, Ebeam);
399 const TVector3& posSeed,
400 const TVector3& dirSeed,
401 std::vector<double>& fitpar,
402 TMatrixDSym* covmatrix) {
403 const int nparams = fitpar.size();
405 fmin->SetFunction(f);
408 cout <<
"PndLmdLinFitTask::line3Dfit with SEED is used (multiple "
409 "scattering taking into account with kinks)"
411 Int_t Npoint = gr->GetN();
419 Double_t errRx = TMath::Hypot(ErrX1, ErrX2);
420 Double_t errRy = TMath::Hypot(ErrY1, ErrY2);
425 cout <<
"Number of hits = " << Npoint << endl;
426 cout <<
"posSeed:" << endl;
428 TVector3 ErrPosSeed(ErrX1, ErrY1, ErrZ1);
429 cout <<
"ErrposSeed:" << endl;
431 cout <<
"dirSeed:" << endl;
435 fmin->SetVariable(0,
"x0", posSeed.X(), ErrX1);
436 fmin->SetVariable(1,
"Ax", dirSeed.X(), errRx);
437 fmin->SetVariable(2,
"y0", posSeed.Y(), ErrY1);
438 fmin->SetVariable(3,
"Ay", dirSeed.Y(), errRy);
440 fmin->SetFixedVariable(4,
"z0", posSeed.Z());
441 fmin->SetFixedVariable(5,
"Az", dirSeed.Z());
443 double scaling_factor(1e-4);
444 fmin->SetVariable(6,
"al0x_a", 0.0, scaling_factor *
fsigmaMSa);
445 fmin->SetVariable(7,
"al0x_b", 0.0, scaling_factor *
fsigmaMSb);
446 fmin->SetFixedVariable(8,
"al1x_a", 0.0);
447 fmin->SetVariable(9,
"al1x_b", 0.0, scaling_factor * fsigmaMSb);
448 fmin->SetFixedVariable(10,
"al2x_a", 0.0);
449 fmin->SetVariable(11,
"al2x_b", 0.0, scaling_factor * fsigmaMSb);
450 fmin->SetFixedVariable(12,
"al3x_a", 0.0);
451 fmin->SetFixedVariable(13,
"al3x_b", 0.0);
453 fmin->SetVariable(14,
"al0y_a", 0.0, scaling_factor * fsigmaMSa);
454 fmin->SetVariable(15,
"al0y_b", 0.0, scaling_factor * fsigmaMSb);
455 fmin->SetFixedVariable(16,
"al1y_a", 0.0);
456 fmin->SetVariable(17,
"al1y_b", 0.0, scaling_factor * fsigmaMSb);
457 fmin->SetFixedVariable(18,
"al2y_a", 0.0);
458 fmin->SetVariable(19,
"al2y_b", 0.0, scaling_factor * fsigmaMSb);
459 fmin->SetFixedVariable(20,
"al3y_a", 0.0);
460 fmin->SetFixedVariable(21,
"al3y_b", 0.0);
463 fmin->FixVariable(11);
464 fmin->FixVariable(19);
469 double recpres = 1e-7;
471 if (
fmin->Edm() > 1e2 * recpres) {
476 for (
int i = 0;
i < nparams; ++
i) {
480 for (
size_t i = 0;
i < 6;
i++) {
481 for (
size_t j = 0; j < 6; j++) {
482 (*covmatrix)(
i, j) =
fmin->CovMatrix(i, j);
487 (*covmatrix)(4, 4) = (gr->GetErrorZ(0) * gr->GetErrorZ(0)) / 12.;
489 fitpar[5] =
sqrt(1 - fitpar[1] * fitpar[1] - fitpar[3] * fitpar[3]);
490 double dp5_dp1 = fitpar[1] / fitpar[5];
491 double dp5_dp3 = fitpar[3] / fitpar[5];
492 double errdz2 = pow(dp5_dp1, 2) * (*covmatrix)(1, 1) +
493 pow(dp5_dp3, 2) * (*covmatrix)(3, 3) +
494 2 *
fabs(dp5_dp1 * dp5_dp3 * (*covmatrix)(1, 3));
495 (*covmatrix)(5, 5) = errdz2;
501 cout <<
" chi2 = " << chi2 << endl;
502 cout <<
"[AFTER FIT] start.point: (" << fitpar[0] <<
", " << fitpar[2]
503 <<
", " << fitpar[4] <<
")" << endl;
504 cout <<
"[AFTER FIT] dir: (" << fitpar[1] <<
", " << fitpar[3] <<
", "
506 <<
" sqrt(p1^2+p3^2+p5^2) = "
507 <<
sqrt(fitpar[1] * fitpar[1] + fitpar[3] * fitpar[3] +
508 fitpar[5] * fitpar[5])
TGraph2DErrors * fGraph2D
void GetOUVShortId(Int_t shortId, TVector3 &o, TVector3 &u, TVector3 &v)
static double distance_MS(double x, double y, double z, double errx, double erry, const double *p, double *zpr)
TVector3 GetPosition() const
friend F32vec4 sqrt(const F32vec4 &a)
static T Sqrt(const T &x)
PndTrackCandHit GetSortedHit(UInt_t i)
virtual ~PndLmdLinFitTask()
TClonesArray * fTCandArray
double ScatteredAngle(double radLen)
TClonesArray * fRecoArray
TString fOutputBranchName
friend F32vec4 fabs(const F32vec4 &a)
static PndGeoHandling * Instance()
double GetSigmaMS(int side)
ROOT::Math::Minimizer * fmin
double FCN_MS(const double *vars)
TClonesArray * fTrackArray
Int_t GetSensorID() const
virtual void Exec(Option_t *opt)
double line3DfitMS(TGraph2DErrors *gr, const TVector3 &posSeed, const TVector3 &dirSeed, std::vector< double > &fitpar, TMatrixDSym *covmatrix)
virtual InitStatus Init()