Fork me on GitHub

Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • external/TrackCovariance/ObsTrk.cc

    rebf40fd r53f4746  
    66#include <TRandom.h>
    77#include <iostream>
    8 #include "SolGeom.h"
    98#include "SolGridCov.h"
    109#include "ObsTrk.h"
     
    1211// Constructors
    1312//
    14 // x(3) track origin, p(3) track momentum at origin, Q charge, B ma gnetic field in Tesla
    15 ObsTrk::ObsTrk(TVector3 x, TVector3 p, Double_t Q, SolGridCov *GC, SolGeom *G)
     13// x(3) track origin, p(3) track momentum at origin, Q charge, B magnetic field in Tesla
     14ObsTrk::ObsTrk(TVector3 x, TVector3 p, Double_t Q, Double_t B, SolGridCov *GC)
    1615{
    17         fB = G->B();
    18         SetB(fB);
    19         fG = G;
     16        SetB(B);
    2017        fGC = GC;
    2118        fGenX = x;
    2219        fGenP = p;
    2320        fGenQ = Q;
     21        fB = B;
    2422        fGenPar.ResizeTo(5);
    2523        fGenParMm.ResizeTo(5);
     
    3836        fGenParACTS = ParToACTS(fGenPar);
    3937        fGenParILC = ParToILC(fGenPar);
    40         //
    41         fObsPar = GenToObsPar(fGenPar);
     38        /*
     39        cout << "ObsTrk::ObsTrk: fGenPar";
     40        for (Int_t i = 0; i < 5; i++)cout << fGenPar(i) << ", ";
     41        cout << endl;
     42        */
     43        fObsPar = GenToObsPar(fGenPar, fGC);
    4244        fObsParMm = ParToMm(fObsPar);
    4345        fObsParACTS = ParToACTS(fObsPar);
     
    5254//
    5355// x[3] track origin, p[3] track momentum at origin, Q charge, B magnetic field in Tesla
    54 ObsTrk::ObsTrk(Double_t *x, Double_t *p, Double_t Q, SolGridCov* GC, SolGeom *G)
     56ObsTrk::ObsTrk(Double_t *x, Double_t *p, Double_t Q, Double_t B, SolGridCov* GC)
    5557{
    56         fB = G->B();
    57         SetB(fB);
    58         fG = G;
     58        SetB(B);
    5959        fGC = GC;
    6060        fGenX.SetXYZ(x[0],x[1],x[2]);
    6161        fGenP.SetXYZ(p[0],p[1],p[2]);
    6262        fGenQ = Q;
     63        fB = B;
    6364        fGenPar.ResizeTo(5);
    6465        fGenParMm.ResizeTo(5);
     
    7677        fGenParACTS = ParToACTS(fGenPar);
    7778        fGenParILC = ParToILC(fGenPar);
    78         //
    79         fObsPar = GenToObsPar(fGenPar);
     79        /*
     80        cout << "ObsTrk::ObsTrk: fGenPar";
     81        for (Int_t i = 0; i < 5; i++)cout << fGenPar(i) << ", ";
     82        cout << endl;
     83        */
     84        fObsPar = GenToObsPar(fGenPar, fGC);
    8085        fObsParACTS = ParToACTS(fObsPar);
    8186        fObsParILC = ParToILC(fObsPar);
     
    108113}
    109114//
    110 TVectorD ObsTrk::GenToObsPar(TVectorD gPar)
     115TVectorD ObsTrk::GenToObsPar(TVectorD gPar, SolGridCov *GC)
    111116{
     117        TVector3 p = ParToP(gPar);
     118        Double_t pt = p.Pt();
     119        Double_t tanTh = 1.0 / TMath::Abs(gPar(4));
     120        Double_t angd = TMath::ATan(tanTh)*180. / TMath::Pi();
    112121        //
    113122        // Check ranges
    114         Double_t minPt = fGC->GetMinPt();
    115         //if (pt < minPt) std::cout << "Warning ObsTrk::GenToObsPar: pt " << pt << " is below grid range of " << minPt << std::endl;
    116         Double_t maxPt = fGC->GetMaxPt();
    117         //if (pt > maxPt) std::cout << "Warning ObsTrk::GenToObsPar: pt " << pt << " is above grid range of " << maxPt << std::endl;
    118         Double_t minAn = fGC->GetMinAng();
    119         //if (angd < minAn) std::cout << "Warning ObsTrk::GenToObsPar: angle " << angd
    120         //      << " is below grid range of " << minAn << std::endl;
    121         Double_t maxAn = fGC->GetMaxAng();
    122         //if (angd > maxAn) std::cout << "Warning ObsTrk::GenToObsPar: angle " << angd
    123         //      << " is above grid range of " << maxAn << std::endl;
     123        Double_t minPt = GC->GetMinPt ();
     124        //if (pt < minPt) cout << "Warning ObsTrk::GenToObsPar: pt " << pt << " is below grid range of " << minPt << endl;
     125        Double_t maxPt = GC->GetMaxPt();
     126        //if (pt > maxPt) cout << "Warning ObsTrk::GenToObsPar: pt " << pt << " is above grid range of " << maxPt << endl;
     127        Double_t minAn = GC->GetMinAng();
     128        //if (angd < minAn) cout << "Warning ObsTrk::GenToObsPar: angle " << angd
     129        //      << " is below grid range of " << minAn << endl;
     130        Double_t maxAn = GC->GetMaxAng();
     131        //if (angd > maxAn) cout << "Warning ObsTrk::GenToObsPar: angle " << angd
     132        //      << " is above grid range of " << maxAn << endl;
    124133        //
    125         TMatrixDSym Cov(5);
    126         //
    127         // Check if track origin is inside beampipe and betwen the first disks
    128         //
    129         Double_t Rin = fG->GetRmin();
    130         Double_t ZinPos = fG->GetZminPos();
    131         Double_t ZinNeg = fG->GetZminNeg();
    132         Bool_t inside = TrkUtil::IsInside(fGenX, Rin, ZinNeg, ZinPos); // Check if in inner box
    133         if (inside)
    134         {
    135                 //std::cout<<"ObsTrk:: inside: x= "<<fGenX(0)<<", y= "<<fGenX(1)
    136                 //                        <<", z= "<<fGenX(2)<<std::endl;
    137                 // Observed track parameters
    138                 Double_t pt = fGenP.Pt();
    139                 Double_t angd = fGenP.Theta() * 180. / TMath::Pi();
    140                 Cov = fGC->GetCov(pt, angd);                            // Track covariance
    141         }
    142         else
    143         {
    144                 //std::cout<<"ObsTrk:: outside: x= "<<fGenX(0)<<", y= "<<fGenX(1)
    145                 //                         <<", z= "<<fGenX(2)<<std::endl;
    146                 SolTrack* trk = new SolTrack(fGenX, fGenP, fG);
    147                 Bool_t Res = kTRUE; Bool_t MS = kTRUE;
    148                 trk->CovCalc(Res, MS);                                  // Calculate covariance matrix
    149                 Cov = trk->Cov();                                       // Track covariance
    150                 delete trk;
    151         }
    152         //
     134        TMatrixDSym Cov = GC->GetCov(pt, angd);
    153135        fCov = Cov;
    154136        //
    155137        // Now do Choleski decomposition and random number extraction, with appropriate stabilization
    156138        //
    157         TVectorD oPar = TrkUtil::CovSmear(gPar, Cov);
     139        TMatrixDSym CvN = Cov;
     140        TMatrixDSym DCv(5); DCv.Zero();
     141        TMatrixDSym DCvInv(5); DCvInv.Zero();
     142        for (Int_t id = 0; id < 5; id++)
     143        {
     144                Double_t dVal = TMath::Sqrt(Cov(id, id));
     145                DCv   (id, id) = dVal;
     146                DCvInv(id, id) = 1.0 / dVal;
     147        }
     148        CvN.Similarity(DCvInv);                 // Normalize diagonal to 1
     149        TDecompChol Chl(CvN);
     150        Bool_t OK = Chl.Decompose();            // Choleski decomposition of normalized matrix
     151        TMatrixD U = Chl.GetU();                        // Get Upper triangular matrix
     152        TMatrixD Ut(TMatrixD::kTransposed, U); // Transposed of U (lower triangular)
     153        TVectorD r(5);
     154        for (Int_t i = 0; i < 5; i++)r(i) = gRandom->Gaus(0.0, 1.0);            // Array of normal random numbers
     155        TVectorD oPar = gPar + DCv*(Ut*r);      // Observed parameter vector
    158156        //
    159157        return oPar;
Note: See TracChangeset for help on using the changeset viewer.