Fork me on GitHub

Ignore:
Timestamp:
Mar 1, 2021, 4:01:37 PM (3 years ago)
Author:
michele <michele.selvaggi@…>
Branches:
master
Children:
40e890c
Parents:
3f8466a
Message:

adding latest TrackCovariance libraries (F. Bedeschi)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • external/TrackCovariance/ObsTrk.cc

    r3f8466a ra617744  
    1010//
    1111// Constructors
     12//
    1213// x(3) track origin, p(3) track momentum at origin, Q charge, B magnetic field in Tesla
    1314ObsTrk::ObsTrk(TVector3 x, TVector3 p, Double_t Q, Double_t B, SolGridCov *GC)
    1415{
     16        SetBfield(B);
    1517        fGC = GC;
    1618        fGenX = x;
     
    1921        fB = B;
    2022        fGenPar.ResizeTo(5);
     23        fGenParMm.ResizeTo(5);
    2124        fGenParACTS.ResizeTo(6);
    2225        fGenParILC.ResizeTo(5);
    2326        fObsPar.ResizeTo(5);
     27        fObsParMm.ResizeTo(5);
    2428        fObsParACTS.ResizeTo(6);
    2529        fObsParILC.ResizeTo(5);
    2630        fCov.ResizeTo(5, 5);
     31        fCovMm.ResizeTo(5, 5);
    2732        fCovACTS.ResizeTo(6, 6);
    2833        fCovILC.ResizeTo(5, 5);
    2934        fGenPar = XPtoPar(x,p,Q);
     35        fGenParMm = ParToMm(fGenPar);
    3036        fGenParACTS = ParToACTS(fGenPar);
    3137        fGenParILC = ParToILC(fGenPar);
    3238        /*
    33         std::cout << "ObsTrk::ObsTrk: fGenPar";
    34         for (Int_t i = 0; i < 5; i++)std::cout << fGenPar(i) << ", ";
    35         std::cout << std::endl;
     39        cout << "ObsTrk::ObsTrk: fGenPar";
     40        for (Int_t i = 0; i < 5; i++)cout << fGenPar(i) << ", ";
     41        cout << endl;
    3642        */
    3743        fObsPar = GenToObsPar(fGenPar, fGC);
     44        fObsParMm = ParToMm(fObsPar);
    3845        fObsParACTS = ParToACTS(fObsPar);
    3946        fObsParILC = ParToILC(fObsPar);
     
    4148        fObsP = ParToP(fObsPar);
    4249        fObsQ = ParToQ(fObsPar);
    43         fCovACTS = CovToACTS(fCov);
     50        fCovMm = CovToMm(fCov);
     51        fCovACTS = CovToACTS(fObsPar, fCov);
    4452        fCovILC = CovToILC(fCov);
    4553}
    46 
     54//
    4755// x[3] track origin, p[3] track momentum at origin, Q charge, B magnetic field in Tesla
    4856ObsTrk::ObsTrk(Double_t *x, Double_t *p, Double_t Q, Double_t B, SolGridCov* GC)
    4957{
     58        SetBfield(B);
    5059        fGC = GC;
    5160        fGenX.SetXYZ(x[0],x[1],x[2]);
     
    5463        fB = B;
    5564        fGenPar.ResizeTo(5);
     65        fGenParMm.ResizeTo(5);
    5666        fGenParACTS.ResizeTo(6);
    5767        fGenParILC.ResizeTo(5);
    5868        fObsPar.ResizeTo(5);
     69        fObsParMm.ResizeTo(5);
    5970        fObsParACTS.ResizeTo(6);
    6071        fObsParILC.ResizeTo(5);
    6172        fCov.ResizeTo(5, 5);
     73        fCovMm.ResizeTo(5, 5);
    6274        fCovACTS.ResizeTo(6, 6);
    6375        fCovILC.ResizeTo(5, 5);
     
    7688        fObsP = ParToP(fObsPar);
    7789        fObsQ = ParToQ(fObsPar);
    78         fCovACTS = CovToACTS(fCov);
     90        fCovACTS = CovToACTS(fObsPar, fCov);
    7991        fCovILC = CovToILC(fCov);
    8092}
    81 
    82 
    8393//
    8494// Destructor
     
    8898        fGenP.Clear();
    8999        fGenPar.Clear();
     100        fGenParMm.Clear();
    90101        fGenParACTS.Clear();
     102        fGenParILC.Clear();
    91103        fObsX.Clear();
    92104        fObsP.Clear();
    93105        fObsPar.Clear();
     106        fObsParMm.Clear();
    94107        fObsParACTS.Clear();
     108        fObsParILC.Clear();
    95109        fCov.Clear();
     110        fCovMm.Clear();
    96111        fCovACTS.Clear();
    97 }
    98 TVectorD ObsTrk::XPtoPar(TVector3 x, TVector3 p, Double_t Q)
    99 {
    100         //
    101         TVectorD Par(5);
    102         // Transverse parameters
    103         Double_t a = -Q*fB*0.2998;                      // Units are Tesla, GeV and meters
    104         Double_t pt = p.Pt();
    105         Double_t C = a / (2 * pt);                      // Half curvature
    106         //std::cout << "ObsTrk::XPtoPar: fB = " << fB << ", a = " << a << ", pt = " << pt << ", C = " << C << std::endl;
    107         Double_t r2 = x.Perp2();
    108         Double_t cross = x(0)*p(1) - x(1)*p(0);
    109         Double_t T = TMath::Sqrt(pt*pt - 2 * a*cross + a*a*r2);
    110         Double_t phi0 = TMath::ATan2((p(1) - a*x(0)) / T, (p(0) + a*x(1)) / T); // Phi0
    111         Double_t D;                                                     // Impact parameter D
    112         if (pt < 10.0) D = (T - pt) / a;
    113         else D = (-2 * cross + a*r2) / (T + pt);
    114         //
    115         Par(0) = D;             // Store D
    116         Par(1) = phi0;  // Store phi0
    117         Par(2) = C;             // Store C
    118         //Longitudinal parameters
    119         Double_t B = C*TMath::Sqrt(TMath::Max(r2 - D*D,0.0) / (1 + 2 * C*D));
    120         Double_t st = TMath::ASin(B) / C;
    121         Double_t ct = p(2) / pt;
    122         Double_t z0 = x(2) - ct*st;
    123         //
    124         Par(3) = z0;            // Store z0
    125         Par(4) = ct;            // Store cot(theta)
    126         //
    127         return Par;
    128 }
    129 //
    130 TVector3 ObsTrk::ParToX(TVectorD Par)
    131 {
    132         Double_t D    = Par(0);
    133         Double_t phi0 = Par(1);
    134         Double_t z0   = Par(3);
    135         //
    136         TVector3 Xval;
    137         Xval(0) = -D*TMath::Sin(phi0);
    138         Xval(1) =  D*TMath::Cos(phi0);
    139         Xval(2) =  z0;
    140         //
    141         return Xval;
    142 }
    143 //
    144 TVector3 ObsTrk::ParToP(TVectorD Par)
    145 {
    146         Double_t C    = Par(2);
    147         Double_t phi0 = Par(1);
    148         Double_t ct   = Par(4);
    149         //
    150         TVector3 Pval;
    151         Double_t pt = fB*0.2998 / TMath::Abs(2 * C);
    152         Pval(0) = pt*TMath::Cos(phi0);
    153         Pval(1) = pt*TMath::Sin(phi0);
    154         Pval(2) = pt*ct;
    155         //
    156         return Pval;
    157 }
    158 //
    159 
    160 Double_t ObsTrk::ParToQ(TVectorD Par)
    161 {
    162         return TMath::Sign(1.0, -Par(2));
     112        fCovILC.Clear();
    163113}
    164114//
     
    172122        // Check ranges
    173123        Double_t minPt = GC->GetMinPt ();
    174         //if (pt < minPt) std::cout << "Warning ObsTrk::GenToObsPar: pt " << pt << " is below grid range of " << minPt << std::endl;
     124        //if (pt < minPt) cout << "Warning ObsTrk::GenToObsPar: pt " << pt << " is below grid range of " << minPt << endl;
    175125        Double_t maxPt = GC->GetMaxPt();
    176         //if (pt > maxPt) std::cout << "Warning ObsTrk::GenToObsPar: pt " << pt << " is above grid range of " << maxPt << std::endl;
     126        //if (pt > maxPt) cout << "Warning ObsTrk::GenToObsPar: pt " << pt << " is above grid range of " << maxPt << endl;
    177127        Double_t minAn = GC->GetMinAng();
    178   //if (angd < minAn) std::cout << "Warning ObsTrk::GenToObsPar: angle " << angd
    179         //      << " is below grid range of " << minAn << std::endl;
     128        //if (angd < minAn) cout << "Warning ObsTrk::GenToObsPar: angle " << angd
     129        //      << " is below grid range of " << minAn << endl;
    180130        Double_t maxAn = GC->GetMaxAng();
    181         //if (angd > maxAn) std::cout << "Warning ObsTrk::GenToObsPar: angle " << angd
    182         //      << " is above grid range of " << maxAn << std::endl;
     131        //if (angd > maxAn) cout << "Warning ObsTrk::GenToObsPar: angle " << angd
     132        //      << " is above grid range of " << maxAn << endl;
    183133        //
    184134        TMatrixDSym Cov = GC->GetCov(pt, angd);
     
    207157        return oPar;
    208158}
    209 // Parameter conversion to ACTS format
    210 TVectorD ObsTrk::ParToACTS(TVectorD Par)
    211 {
    212         TVectorD pACTS(6);      // Return vector
    213         //
    214         Double_t b = -0.29988*fB / 2.;
    215         pACTS(0) = 1000*Par(0);         // D from m to mm
    216         pACTS(1) = 1000 * Par(3);       // z0 from m to mm
    217         pACTS(2) = Par(1);                      // Phi0 is unchanged
    218         pACTS(3) = TMath::ATan2(1.0,Par(4));            // Theta in [0, pi] range
    219         pACTS(4) = Par(2) / (b*TMath::Sqrt(1 + Par(4)*Par(4)));         // q/p in GeV
    220         pACTS(5) = 0.0;                         // Time: currently undefined
    221         //
    222         return pACTS;
    223 }
    224 // Covariance conversion to ACTS format
    225 TMatrixDSym ObsTrk::CovToACTS(TMatrixDSym Cov)
    226 {
    227         TMatrixDSym cACTS(6); cACTS.Zero();
    228         Double_t b = -0.29988*fB / 2.;
    229         //
    230         // Fill derivative matrix
    231         TMatrixD A(5, 5);       A.Zero();
    232         Double_t ct = fGenPar(4);       // cot(theta)
    233         Double_t C = fGenPar(2);                // half curvature
    234         A(0, 0) = 1000.;                // D-D  conversion to mm
    235         A(1, 2) = 1.0;          // phi0-phi0
    236         A(2, 4) = 1.0/(TMath::Sqrt(1.0 + ct*ct) * b);   // q/p-C
    237         A(3, 1) = 1000.;                // z0-z0 conversion to mm
    238         A(4, 3) = -1.0 / (1.0 + ct*ct); // theta - cot(theta)
    239         A(4, 4) = -C*ct / (b*pow(1.0 + ct*ct,3.0/2.0)); // q/p-cot(theta)
    240         //
    241         TMatrixDSym Cv = Cov;
    242         TMatrixD At(5, 5);
    243         At.Transpose(A);
    244         Cv.Similarity(At);
    245         TMatrixDSub(cACTS, 0, 4, 0, 4) = Cv;
    246         cACTS(5, 5) = 0.1;      // Currently undefined: set to arbitrary value to avoid crashes
    247         //
    248         return cACTS;
    249 }
    250 
    251 // Parameter conversion to ILC format
    252 TVectorD ObsTrk::ParToILC(TVectorD Par)
    253 {
    254         TVectorD pILC(5);       // Return vector
    255         //
    256         pILC(0) = Par(0)*1.0e3;                 // d0 in mm
    257         pILC(1) = Par(1);                               // phi0 is unchanged
    258         pILC(2) = -2 * Par(2)*1.0e-3;   // w in mm^-1
    259         pILC(3) = Par(3)*1.0e3;                 // z0 in mm
    260         pILC(4) = Par(4);                               // tan(lambda) = cot(theta)
    261         //
    262         return pILC;
    263 }
    264 // Covariance conversion to ILC format
    265 TMatrixDSym ObsTrk::CovToILC(TMatrixDSym Cov)
    266 {
    267         TMatrixDSym cILC(5); cILC.Zero();
    268         //
    269         // Fill derivative matrix
    270         TMatrixD A(5, 5);       A.Zero();
    271         //
    272         A(0, 0) = 1.0e3;                // D-d0 in mm
    273         A(1, 1) = 1.0;          // phi0-phi0
    274         A(2, 2) = -2.0e-3;      // w-C
    275         A(3, 3) = 1.0e3;                // z0-z0 conversion to mm
    276         A(4, 4) = 1.0;          // tan(lambda) - cot(theta)
    277         //
    278         TMatrixDSym Cv = Cov;
    279         TMatrixD At(5, 5);
    280         At.Transpose(A);
    281         Cv.Similarity(At);
    282         cILC = Cv;
    283         //
    284         return cILC;
    285 }
Note: See TracChangeset for help on using the changeset viewer.