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"), fTCandArray(0), fRecoArray(0), fTrackArray(0),
fGeoH(0) {
60 fmin = ROOT::Math::Factory::CreateMinimizer(
"Minuit2",
"Migrad");
62 fmin->SetMaxFunctionCalls(1000000);
63 fmin->SetMaxIterations(100000);
64 fmin->SetTolerance(0.001);
66 for (
int ih = 0; ih < 4; ih++)
71 FairTask(
"3D-Straight-Line-Fit"), fTCandArray(0), fRecoArray(0), fTrackArray(0),
fGeoH(0) {
85 fmin = ROOT::Math::Factory::CreateMinimizer(
"Minuit2",
"Migrad");
87 fmin->SetMaxFunctionCalls(1000000);
88 fmin->SetMaxIterations(100000);
89 fmin->SetTolerance(0.001);
91 for (
int ih = 0; ih < 4; ih++)
97 cout <<
"PndLmdLinFitTask::~PndLmdLinFitTask()" << endl;
102 FairRootManager* ioman = FairRootManager::Instance();
105 Error(
"PndLmdLinFitTask::Init",
"RootManager not instantiated!");
113 Error(
"PndLmdLinFitTask::Init",
"trackcand-array not found!");
120 Error(
"PndLmdLinFitTask::Init",
"reco-array not found!");
128 FairRun*
fRun = FairRun::Instance();
129 FairRuntimeDb*
rtdb = fRun->GetRuntimeDb();
130 FairBaseParSet*
par = (FairBaseParSet*) (rtdb->findContainer(
"FairBaseParSet"));
131 fPbeam = par->GetBeamMom();
139 if (totRadLen < 1e-6) totRadLen = 0.00306;
143 double totRadLenCable = 0.053;
144 totRadLenCable += 0.05;
149 std::cout <<
"-I- PndLmdLinFitTask: Initialisation successfull" << std::endl;
155 if (
fTrackArray == 0) Fatal(
"PndLmdLinFitTask::Exec",
"No TrackArray");
161 if (
fVerbose > 1) std::cout <<
" -I- PndLmdLinFitTask: contains " << ntcand <<
" RhoCandidates"
164 std::cout <<
" Detailed Debug info on the candidates:" << std::endl;
165 unsigned int index = 12345;
167 for (Int_t itr = 0; itr < ntcand; ++itr) {
169 std::cout <<
"TrackCand no. " << itr <<
" has " << trcnd->
GetNHits() <<
" hits." << std::endl;
170 std::cout <<
"Point: \t Index: " << std::endl;
171 for (
unsigned int ihit = 0; ihit < trcnd->
GetNHits(); ihit++) {
175 std::cout << ihit <<
"\t" << index << std::endl;
187 const int numPts = trcnd->
GetNHits();
189 TGraph2DErrors fitme(numPts);
192 for (
int ihit = 0; ihit < numPts; ihit++) {
205 double xhit = addPos.X();
206 double yhit = addPos.Y();
207 double zhit = addPos.Z();
215 if (ihit == 2) hit1 = addPos;
218 if (ihit == numPts - 1) {
223 double errxhit = addHit->GetDx();
224 double erryhit = addHit->GetDy();
225 double errzhit = addHit->GetDz();
226 fitme.SetPoint(ihit, xhit, yhit, zhit);
227 fitme.SetPointError(ihit, errxhit, erryhit, errzhit);
231 TVector3 dirSeed = hit1 - hit0;
232 TVector3 posSeed = hit0;
235 dirSeed = dirSeed.Unit();
236 std::vector<double> fit_parameters(22);
237 TMatrixDSym* COVmatrix =
new TMatrixDSym(6);
243 if (accuracy > 1e5) {
244 std::cout <<
"WARNING: accuracy check failed, track fit likely didn't converge!\n";
248 TVector3 FitPoint(fit_parameters[0], fit_parameters[2], fit_parameters[4]);
249 TVector3 FitDir(fit_parameters[1], fit_parameters[3], fit_parameters[5]);
252 TVector3 FitMom = FitDir *
fPbeam;
255 for (
int ij = 0; ij < 6; ij++) {
256 for (
int ji = 0; ji < 6; ji++)
257 COVmatrixPosMom[ij][ji] = 0;
260 int iconver[6] = { 3, 0, 4, 1, 5, 2 };
261 for (
int ij = 0; ij < 6; ij++) {
262 for (
int ji = 0; ji < 6; ji++) {
263 if (ij == 1 || ij == 3 || ij == 5) (*COVmatrix)(ij, ji) *= fPbeam;
264 if (ji == 1 || ji == 3 || ji == 5) (*COVmatrix)(ij, ji) *= fPbeam;
265 int km = iconver[ij];
266 int mk = iconver[ji];
267 COVmatrixPosMom[km][mk] = (*COVmatrix)(ij, ji);
282 TVector3 o = FitPoint;
286 FairTrackParP* trkfitp =
new FairTrackParP(FitPoint, FitMom, COVmatrixPosMom,
fCharge, o, dj, dk);
288 if (accuracy > 1e3) flagpndtrk = -1;
289 int ndf = 2 * (trcnd->
GetNHits()) - 4;
294 new ((*fTrackArray)[rec_tkr])
PndTrack(*(trackfit));
302 if (
fVerbose > 2) std::cout <<
"Fitting done" << std::endl;
309 const double*
p,
double* zpr) {
310 double THfunc[8] = { 1, 1, 1, 1, 1, 1, 1, 1 };
315 Double_t t_min = p[1] * (x - p[0]) + p[3] * (y - p[2])
316 +
sqrt(1 - p[1] * p[1] - p[3] * p[3]) * (z - p[4]);
318 for (
int iz = 0; iz < 8; iz++)
319 if (((p[4] + t_min) - zpr[iz]) <= 0) THfunc[iz] = 0;
321 double funcX = p[0] + p[1] * t_min + (-p[6] + p[7]) * ((p[4] + t_min) - zpr[0]) * THfunc[0]
322 + (-p[8] + p[9]) * ((p[4] + t_min) - zpr[2]) * THfunc[2]
323 + (-p[10] + p[11]) * ((p[4] + t_min) - zpr[4]) * THfunc[4]
324 + (-p[12] + p[13]) * ((p[4] + t_min) - zpr[6]) * THfunc[6];
325 double funcY = p[2] + p[3] * t_min + (-p[14] + p[15]) * ((p[4] + t_min) - zpr[0]) * THfunc[0]
326 + (-p[16] + p[17]) * ((p[4] + t_min) - zpr[2]) * THfunc[2]
327 + (-p[18] + p[19]) * ((p[4] + t_min) - zpr[4]) * THfunc[4]
328 + (-p[20] + p[21]) * ((p[4] + t_min) - zpr[6]) * THfunc[6];
330 double fdx = TMath::Power((x - funcX) / errx, 2);
331 double fdy = TMath::Power((y - funcY) / erry, 2);
333 double fchi2 = fdx + fdy + fdz;
350 for (
int izpl = 0; izpl < 4; izpl++) {
351 zpr[izcur] = z[izpl];
353 zpr[izcur] = z[izpl];
357 double chi2 =
distance_MS(x[
i], y[i], z[i], errx[i], erry[i], vars, zpr);
361 for (
int jms = 0; jms < 8; jms = jms + 2) {
362 double errTot =
sqrt(erralA * erralA + erralB * erralB);
363 fdal += TMath::Power(((vars[7 + jms] - vars[6 + jms]) / errTot), 2);
364 fdal += TMath::Power(((vars[15 + jms] - vars[14 + jms]) / errTot), 2);
376 TLorentzVector LorMom(0, 0,
fPbeam, Ebeam);
386 const TVector3& dirSeed, std::vector<double>& fitpar, TMatrixDSym* covmatrix) {
387 const int nparams = fitpar.size();
389 fmin->SetFunction(f);
391 if (
fVerbose > 2) cout <<
"PndLmdLinFitTask::line3Dfit with SEED is used (multiple "
392 "scattering taking into account with kinks)" << endl;
393 Int_t Npoint = gr->GetN();
401 Double_t errRx = TMath::Hypot(ErrX1, ErrX2);
402 Double_t errRy = TMath::Hypot(ErrY1, ErrY2);
407 cout <<
"Number of hits = " << Npoint << endl;
408 cout <<
"posSeed:" << endl;
410 TVector3 ErrPosSeed(ErrX1, ErrY1, ErrZ1);
411 cout <<
"ErrposSeed:" << endl;
413 cout <<
"dirSeed:" << endl;
417 fmin->SetVariable(0,
"x0", posSeed.X(), ErrX1);
418 fmin->SetVariable(1,
"Ax", dirSeed.X(), errRx);
419 fmin->SetVariable(2,
"y0", posSeed.Y(), ErrY1);
420 fmin->SetVariable(3,
"Ay", dirSeed.Y(), errRy);
422 fmin->SetFixedVariable(4,
"z0", posSeed.Z());
423 fmin->SetFixedVariable(5,
"Az", dirSeed.Z());
425 double scaling_factor(1e-4);
426 fmin->SetVariable(6,
"al0x_a", 0.0, scaling_factor *
fsigmaMSa);
427 fmin->SetVariable(7,
"al0x_b", 0.0, scaling_factor *
fsigmaMSb);
428 fmin->SetFixedVariable(8,
"al1x_a", 0.0);
429 fmin->SetVariable(9,
"al1x_b", 0.0, scaling_factor * fsigmaMSb);
430 fmin->SetFixedVariable(10,
"al2x_a", 0.0);
431 fmin->SetVariable(11,
"al2x_b", 0.0, scaling_factor * fsigmaMSb);
432 fmin->SetFixedVariable(12,
"al3x_a", 0.0);
433 fmin->SetFixedVariable(13,
"al3x_b", 0.0);
435 fmin->SetVariable(14,
"al0y_a", 0.0, scaling_factor * fsigmaMSa);
436 fmin->SetVariable(15,
"al0y_b", 0.0, scaling_factor * fsigmaMSb);
437 fmin->SetFixedVariable(16,
"al1y_a", 0.0);
438 fmin->SetVariable(17,
"al1y_b", 0.0, scaling_factor * fsigmaMSb);
439 fmin->SetFixedVariable(18,
"al2y_a", 0.0);
440 fmin->SetVariable(19,
"al2y_b", 0.0, scaling_factor * fsigmaMSb);
441 fmin->SetFixedVariable(20,
"al3y_a", 0.0);
442 fmin->SetFixedVariable(21,
"al3y_b", 0.0);
445 fmin->FixVariable(11);
446 fmin->FixVariable(19);
451 double recpres = 1e-7;
453 if (
fmin->Edm() > 1e2 * recpres) {
458 for (
int i = 0;
i < nparams; ++
i) {
462 for (
size_t i = 0;
i < 6;
i++) {
463 for (
size_t j = 0; j < 6; j++) {
464 (*covmatrix)(
i, j) =
fmin->CovMatrix(i, j);
469 (*covmatrix)(4, 4) = (gr->GetErrorZ(0) * gr->GetErrorZ(0)) / 12.;
471 fitpar[5] =
sqrt(1 - fitpar[1] * fitpar[1] - fitpar[3] * fitpar[3]);
472 double dp5_dp1 = fitpar[1] / fitpar[5];
473 double dp5_dp3 = fitpar[3] / fitpar[5];
474 double errdz2 = pow(dp5_dp1, 2) * (*covmatrix)(1, 1) + pow(dp5_dp3, 2) * (*covmatrix)(3, 3)
475 + 2 *
fabs(dp5_dp1 * dp5_dp3 * (*covmatrix)(1, 3));
476 (*covmatrix)(5, 5) = errdz2;
482 cout <<
" chi2 = " << chi2 << endl;
483 cout <<
"[AFTER FIT] start.point: (" << fitpar[0] <<
", " << fitpar[2] <<
", " << fitpar[4] <<
")"
485 cout <<
"[AFTER FIT] dir: (" << fitpar[1] <<
", " << fitpar[3] <<
", " << fitpar[5] <<
")"
486 <<
" sqrt(p1^2+p3^2+p5^2) = "
487 <<
sqrt(fitpar[1] * fitpar[1] + fitpar[3] * fitpar[3] + fitpar[5] * fitpar[5]) << endl;
TGraph2DErrors * fGraph2D
void GetOUVShortId(Int_t shortId, TVector3 &o, TVector3 &u, TVector3 &v)
ClassImp(PndLmdLinFitTask)
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()