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()