Changes in external/TrackCovariance/ObsTrk.cc [ff9fb2d9:a0f5d71] in git
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
external/TrackCovariance/ObsTrk.cc
rff9fb2d9 ra0f5d71 1 #include <iostream>2 3 1 #include <TMath.h> 4 2 #include <TVector3.h> … … 7 5 #include <TDecompChol.h> 8 6 #include <TRandom.h> 9 7 #include <iostream> 10 8 #include "SolGridCov.h" 11 9 #include "ObsTrk.h" 12 13 using namespace std; 14 10 // 11 // Constructors 15 12 // x(3) track origin, p(3) track momentum at origin, Q charge, B magnetic field in Tesla 16 13 ObsTrk::ObsTrk(TVector3 x, TVector3 p, Double_t Q, Double_t B, SolGridCov *GC) 17 14 { 18 fGC = GC; 19 fGenX = x; 20 fGenP = p; 21 fGenQ = Q; 22 fB = B; 23 fGenPar.ResizeTo(5); 24 fObsPar.ResizeTo(5); 25 fCov.ResizeTo(5, 5); 26 fGenPar = XPtoPar(x, p, Q); 27 fObsPar = GenToObsPar(fGenPar, fGC); 28 fObsX = ParToX(fObsPar); 29 fObsP = ParToP(fObsPar); 30 fObsQ = ParToQ(fObsPar); 31 } 32 15 fGC = GC; 16 fGenX = x; 17 fGenP = p; 18 fGenQ = Q; 19 fB = B; 20 fGenPar.ResizeTo(5); 21 fGenParACTS.ResizeTo(6); 22 fGenParILC.ResizeTo(5); 23 fObsPar.ResizeTo(5); 24 fObsParACTS.ResizeTo(6); 25 fObsParILC.ResizeTo(5); 26 fCov.ResizeTo(5, 5); 27 fCovACTS.ResizeTo(6, 6); 28 fCovILC.ResizeTo(5, 5); 29 fGenPar = XPtoPar(x,p,Q); 30 fGenParACTS = ParToACTS(fGenPar); 31 fGenParILC = ParToILC(fGenPar); 32 /* 33 std::cout << "ObsTrk::ObsTrk: fGenPar"; 34 for (Int_t i = 0; i < 5; i++)std::cout << fGenPar(i) << ", "; 35 std::cout << std::endl; 36 */ 37 fObsPar = GenToObsPar(fGenPar, fGC); 38 fObsParACTS = ParToACTS(fObsPar); 39 fObsParILC = ParToILC(fObsPar); 40 fObsX = ParToX(fObsPar); 41 fObsP = ParToP(fObsPar); 42 fObsQ = ParToQ(fObsPar); 43 fCovACTS = CovToACTS(fCov); 44 fCovILC = CovToILC(fCov); 45 } 46 // 47 // Destructor 33 48 ObsTrk::~ObsTrk() 34 49 { 35 } 36 50 fGenX.Clear(); 51 fGenP.Clear(); 52 fGenPar.Clear(); 53 fGenParACTS.Clear(); 54 fObsX.Clear(); 55 fObsP.Clear(); 56 fObsPar.Clear(); 57 fObsParACTS.Clear(); 58 fCov.Clear(); 59 fCovACTS.Clear(); 60 } 37 61 TVectorD ObsTrk::XPtoPar(TVector3 x, TVector3 p, Double_t Q) 38 62 { 39 TVectorD Par(5); 40 // Transverse parameters 41 Double_t a = -Q * fB * 0.2998; // Units are Tesla, GeV and m 42 Double_t pt = p.Pt(); 43 Double_t C = a / (2 * pt); // Half curvature 44 45 Double_t r2 = x.Perp2(); 46 Double_t cross = x(0) * p(1) - x(1) * p(0); 47 Double_t T = TMath::Sqrt(pt * pt - 2 * a * cross + a * a * r2); 48 Double_t phi0 = TMath::ATan2((p(1) - a * x(0)) / T, (p(0) + a * x(1)) / T); // Phi0 49 Double_t D; // Impact parameter D 50 if (pt < 10.0) D = (T - pt) / a; 51 else D = (-2 * cross + a * r2) / (T + pt); 52 53 Par(0) = D; // Store D 54 Par(1) = phi0; // Store phi0 55 Par(2) = C; // Store C 56 // Longitudinal parameters 57 Double_t B = C * TMath::Sqrt(TMath::Max(r2 - D * D,0.0) / (1 + 2 * C * D)); 58 Double_t st = TMath::ASin(B) / C; 59 Double_t ct = p(2) / pt; 60 Double_t z0 = x(2) - ct * st; 61 62 Par(3) = z0; // Store z0 63 Par(4) = ct; // Store cot(theta) 64 65 return Par; 66 } 67 63 // 64 TVectorD Par(5); 65 // Transverse parameters 66 Double_t a = -Q*fB*0.2998; // Units are Tesla, GeV and meters 67 Double_t pt = p.Pt(); 68 Double_t C = a / (2 * pt); // Half curvature 69 //std::cout << "ObsTrk::XPtoPar: fB = " << fB << ", a = " << a << ", pt = " << pt << ", C = " << C << std::endl; 70 Double_t r2 = x.Perp2(); 71 Double_t cross = x(0)*p(1) - x(1)*p(0); 72 Double_t T = TMath::Sqrt(pt*pt - 2 * a*cross + a*a*r2); 73 Double_t phi0 = TMath::ATan2((p(1) - a*x(0)) / T, (p(0) + a*x(1)) / T); // Phi0 74 Double_t D; // Impact parameter D 75 if (pt < 10.0) D = (T - pt) / a; 76 else D = (-2 * cross + a*r2) / (T + pt); 77 // 78 Par(0) = D; // Store D 79 Par(1) = phi0; // Store phi0 80 Par(2) = C; // Store C 81 //Longitudinal parameters 82 Double_t B = C*TMath::Sqrt(TMath::Max(r2 - D*D,0.0) / (1 + 2 * C*D)); 83 Double_t st = TMath::ASin(B) / C; 84 Double_t ct = p(2) / pt; 85 Double_t z0 = x(2) - ct*st; 86 // 87 Par(3) = z0; // Store z0 88 Par(4) = ct; // Store cot(theta) 89 // 90 return Par; 91 } 92 // 68 93 TVector3 ObsTrk::ParToX(TVectorD Par) 69 94 { 70 71 72 73 74 75 Xval(0) = -D * TMath::Sin(phi0); 76 Xval(1) = D * TMath::Cos(phi0); 77 78 79 80 } 81 95 Double_t D = Par(0); 96 Double_t phi0 = Par(1); 97 Double_t z0 = Par(3); 98 // 99 TVector3 Xval; 100 Xval(0) = -D*TMath::Sin(phi0); 101 Xval(1) = D*TMath::Cos(phi0); 102 Xval(2) = z0; 103 // 104 return Xval; 105 } 106 // 82 107 TVector3 ObsTrk::ParToP(TVectorD Par) 83 108 { 84 Double_t C = Par(2); 85 Double_t phi0 = Par(1); 86 Double_t ct = Par(4); 87 // 88 TVector3 Pval; 89 Double_t pt = fB * 0.2998 / TMath::Abs(2 * C); 90 Pval(0) = pt * TMath::Cos(phi0); 91 Pval(1) = pt * TMath::Sin(phi0); 92 Pval(2) = pt * ct; 93 // 94 return Pval; 95 } 109 Double_t C = Par(2); 110 Double_t phi0 = Par(1); 111 Double_t ct = Par(4); 112 // 113 TVector3 Pval; 114 Double_t pt = fB*0.2998 / TMath::Abs(2 * C); 115 Pval(0) = pt*TMath::Cos(phi0); 116 Pval(1) = pt*TMath::Sin(phi0); 117 Pval(2) = pt*ct; 118 // 119 return Pval; 120 } 121 // 96 122 97 123 Double_t ObsTrk::ParToQ(TVectorD Par) 98 124 { 99 100 } 101 125 return TMath::Sign(1.0, -Par(2)); 126 } 127 // 102 128 TVectorD ObsTrk::GenToObsPar(TVectorD gPar, SolGridCov *GC) 103 129 { 104 TVector3 p = ParToP(gPar); 105 Double_t pt = p.Pt(); 106 Double_t tanTh = 1.0 / TMath::Abs(gPar(4)); 107 Double_t angd = TMath::ATan(tanTh) * 180. / TMath::Pi(); 108 // Check ranges 109 Double_t minPt = GC->GetMinPt (); 110 if (pt < minPt) cout << "Warning ObsTrk::GenToObsPar: pt " << pt << " is below grid range of " << minPt << endl; 111 Double_t maxPt = GC->GetMaxPt(); 112 if (pt > maxPt) cout << "Warning ObsTrk::GenToObsPar: pt " << pt << " is above grid range of " << maxPt << endl; 113 Double_t minAn = GC->GetMinAng(); 114 if (angd < minAn) cout << "Warning ObsTrk::GenToObsPar: angle " << angd 115 << " is below grid range of " << minAn << endl; 116 Double_t maxAn = GC->GetMaxAng(); 117 if (angd > maxAn) cout << "Warning ObsTrk::GenToObsPar: angle " << angd 118 << " is above grid range of " << maxAn << endl; 119 TMatrixDSym Cov = GC->GetCov(pt, angd); 120 fCov = Cov; 121 // Now do Choleski decomposition and random number extraction, with appropriate stabilization 122 TMatrixDSym CvN = Cov; 123 TMatrixDSym DCv(5); DCv.Zero(); 124 TMatrixDSym DCvInv(5); DCvInv.Zero(); 125 for (Int_t id = 0; id < 5; id++) 126 { 127 Double_t dVal = TMath::Sqrt(Cov(id, id)); 128 DCv (id, id) = dVal; 129 DCvInv(id, id) = 1.0 / dVal; 130 } 131 CvN.Similarity(DCvInv); // Normalize diagonal to 1 132 TDecompChol Chl(CvN); 133 Bool_t OK = Chl.Decompose(); // Choleski decomposition of normalized matrix 134 TMatrixD U = Chl.GetU(); // Get Upper triangular matrix 135 TMatrixD Ut(TMatrixD::kTransposed, U); // Transposed of U (lower triangular) 136 TVectorD r(5); 137 for (Int_t i = 0; i < 5; i++) r(i) = gRandom->Gaus(0.0, 1.0); // Array of normal random numbers 138 TVectorD oPar = gPar + DCv * (Ut * r); // Observed parameter vector 139 140 return oPar; 141 } 130 TVector3 p = ParToP(gPar); 131 Double_t pt = p.Pt(); 132 Double_t tanTh = 1.0 / TMath::Abs(gPar(4)); 133 Double_t angd = TMath::ATan(tanTh)*180. / TMath::Pi(); 134 // 135 // Check ranges 136 Double_t minPt = GC->GetMinPt (); 137 if (pt < minPt) std::cout << "Warning ObsTrk::GenToObsPar: pt " << pt << " is below grid range of " << minPt << std::endl; 138 Double_t maxPt = GC->GetMaxPt(); 139 if (pt > maxPt) std::cout << "Warning ObsTrk::GenToObsPar: pt " << pt << " is above grid range of " << maxPt << std::endl; 140 Double_t minAn = GC->GetMinAng(); 141 if (angd < minAn) std::cout << "Warning ObsTrk::GenToObsPar: angle " << angd 142 << " is below grid range of " << minAn << std::endl; 143 Double_t maxAn = GC->GetMaxAng(); 144 if (angd > maxAn) std::cout << "Warning ObsTrk::GenToObsPar: angle " << angd 145 << " is above grid range of " << maxAn << std::endl; 146 // 147 TMatrixDSym Cov = GC->GetCov(pt, angd); 148 fCov = Cov; 149 // 150 // Now do Choleski decomposition and random number extraction, with appropriate stabilization 151 // 152 TMatrixDSym CvN = Cov; 153 TMatrixDSym DCv(5); DCv.Zero(); 154 TMatrixDSym DCvInv(5); DCvInv.Zero(); 155 for (Int_t id = 0; id < 5; id++) 156 { 157 Double_t dVal = TMath::Sqrt(Cov(id, id)); 158 DCv (id, id) = dVal; 159 DCvInv(id, id) = 1.0 / dVal; 160 } 161 CvN.Similarity(DCvInv); // Normalize diagonal to 1 162 TDecompChol Chl(CvN); 163 Bool_t OK = Chl.Decompose(); // Choleski decomposition of normalized matrix 164 TMatrixD U = Chl.GetU(); // Get Upper triangular matrix 165 TMatrixD Ut(TMatrixD::kTransposed, U); // Transposed of U (lower triangular) 166 TVectorD r(5); 167 for (Int_t i = 0; i < 5; i++)r(i) = gRandom->Gaus(0.0, 1.0); // Array of normal random numbers 168 TVectorD oPar = gPar + DCv*(Ut*r); // Observed parameter vector 169 // 170 return oPar; 171 } 172 // Parameter conversion to ACTS format 173 TVectorD ObsTrk::ParToACTS(TVectorD Par) 174 { 175 TVectorD pACTS(6); // Return vector 176 // 177 Double_t b = -0.29988*fB / 2.; 178 pACTS(0) = 1000*Par(0); // D from m to mm 179 pACTS(1) = 1000 * Par(3); // z0 from m to mm 180 pACTS(2) = Par(1); // Phi0 is unchanged 181 pACTS(3) = TMath::ATan(1.0 / Par(4)) + TMath::PiOver2(); // Theta in [0, pi] range 182 pACTS(4) = Par(2) / (b*TMath::Sqrt(1 + Par(4)*Par(4))); // q/p in GeV 183 pACTS(5) = 0.0; // Time: currently undefined 184 // 185 return pACTS; 186 } 187 // Covariance conversion to ACTS format 188 TMatrixDSym ObsTrk::CovToACTS(TMatrixDSym Cov) 189 { 190 TMatrixDSym cACTS(6); cACTS.Zero(); 191 Double_t b = -0.29988*fB / 2.; 192 // 193 // Fill derivative matrix 194 TMatrixD A(5, 5); A.Zero(); 195 Double_t ct = fGenPar(4); // cot(theta) 196 Double_t C = fGenPar(2); // half curvature 197 A(0, 0) = 1000.; // D-D conversion to mm 198 A(1, 2) = 1.0; // phi0-phi0 199 A(2, 4) = 1.0/(TMath::Sqrt(1.0 + ct*ct) * b); // q/p-C 200 A(3, 1) = 1000.; // z0-z0 conversion to mm 201 A(4, 3) = -1.0 / (1.0 + ct*ct); // theta - cot(theta) 202 A(4, 4) = -C*ct / (b*pow(1.0 + ct*ct,3.0/2.0)); // q/p-cot(theta) 203 // 204 TMatrixDSym Cv = Cov; 205 TMatrixD At(5, 5); 206 At.Transpose(A); 207 Cv.Similarity(At); 208 TMatrixDSub(cACTS, 0, 4, 0, 4) = Cv; 209 cACTS(5, 5) = 0.1; // Currently undefined: set to arbitrary value to avoid crashes 210 // 211 return cACTS; 212 } 213 214 // Parameter conversion to ILC format 215 TVectorD ObsTrk::ParToILC(TVectorD Par) 216 { 217 TVectorD pILC(5); // Return vector 218 // 219 pILC(0) = Par(0)*1.0e3; // d0 in mm 220 pILC(1) = Par(1); // phi0 is unchanged 221 pILC(2) = -2 * Par(2)*1.0e-3; // w in mm^-1 222 pILC(3) = Par(3)*1.0e3; // z0 in mm 223 pILC(4) = Par(4); // tan(lambda) = cot(theta) 224 // 225 return pILC; 226 } 227 // Covariance conversion to ILC format 228 TMatrixDSym ObsTrk::CovToILC(TMatrixDSym Cov) 229 { 230 TMatrixDSym cILC(5); cILC.Zero(); 231 // 232 // Fill derivative matrix 233 TMatrixD A(5, 5); A.Zero(); 234 // 235 A(0, 0) = 1.0e3; // D-d0 in mm 236 A(1, 1) = 1.0; // phi0-phi0 237 A(2, 2) = -2.0e-3; // w-C 238 A(3, 3) = 1.0e3; // z0-z0 conversion to mm 239 A(4, 4) = 1.0; // tan(lambda) - cot(theta) 240 // 241 TMatrixDSym Cv = Cov; 242 TMatrixD At(5, 5); 243 At.Transpose(A); 244 Cv.Similarity(At); 245 cILC = Cv; 246 // 247 return cILC; 248 } 249 250 251 252
Note:
See TracChangeset
for help on using the changeset viewer.