21 #include <TDatabasePDG.h>
22 #include <TGeoTorus.h>
24 #include <TMathBase.h>
26 #include <TVirtualMC.h>
34 , gMC3(static_cast<TGeant3*>(TVirtualMC::GetMC()))
37 , fdbPDG(TDatabasePDG::Instance())
44 , fpoint(TVector3(0., 0., 0.))
45 , fwire1(TVector3(0., 0., 0.))
46 , fwire2(TVector3(0., 0., 0.))
50 , fvpf(TVector3(0., 0., 0.))
51 , fvwi(TVector3(0., 0., 0.))
59 LOG(fatal) <<
"FairGeanePro::TGeant3 has not been initialized! ABORTING!";
62 afErtrio = gMC3->fErtrio;
85 for (
int i = 0; i < 5; i++)
86 for (
int j = 0; j < 5; j++) {
93 for (
int i = 0; i < 15; i++) {
140 double fCov[15], fCovOut[15];
144 double Q = TParam->
GetQ();
145 if (fabs(Q) > 1.E-8) {
146 ch = int(Q / TMath::Abs(Q));
150 for (
int i = 0; i < 15; i++) {
153 if (fPropOption.Contains(
"V")) {
161 gMC3->Eufilv(1, ein, const_cast<char*>(VName.Data()), &VCopyNo, &option);
162 }
else if (fPropOption.Contains(
"L")) {
164 gMC3->Eufill(nepred, ein, xlf);
165 }
else if (fPCA != 0) {
170 TVector3 start = TVector3(TParam->
GetX(), TParam->
GetY(), TParam->
GetZ());
173 maxdistance = (fpoint - start).Mag();
174 }
else if (fPCA == 2) {
175 double distance1, distance2;
176 distance1 = (fwire1 - start).Mag();
177 distance2 = (fwire2 - start).Mag();
178 if (distance1 < distance2) {
179 maxdistance = distance2;
181 maxdistance = distance1;
200 gMC3->Eufill(nepred, ein, &ftrklength);
203 }
else if (ProMode == 3) {
204 LOG(warning) <<
"Propagate Helix parameter to Plane is not implimented yet";
212 for (
int i = 0; i < 15; i++) {
213 fCovOut[i] = afErtrio->errout[i];
215 fCovOut[i] = fCovOut[i] * ch * ch;
217 if (i > 0 && i < 5) {
218 fCovOut[i] = fCovOut[i] * ch;
223 if (fabs(p2[0]) < 1e-9 && fabs(p2[1]) < 1e-9 && fabs(p2[2]) < 1e-9) {
226 TEnd->
SetTrackPar(x2[0], x2[1], x2[2], p2[0], p2[1], p2[2], ch, fCovOut);
234 <<
"FairGeanePro::Propagate(FairTrackParP *TParam, FairTrackParH &TEnd, int PDG) : (not used nor implemented)";
242 double fCov[15], fCovOut[15];
246 double Q = TStart->
GetQ();
248 ch = int(Q / TMath::Abs(Q));
252 LOG(warning) <<
"Propagate Parabola parameter to Volume is not implimented yet";
254 }
else if (ProMode == 3) {
256 for (
int i = 0; i < 15; i++) {
260 if (fPropOption.Contains(
"P")) {
261 gMC3->Eufilp(nepred, ein, pli, plo);
262 }
else if (fPropOption.Contains(
"L")) {
264 LOG(warning) <<
"Propagate Parabola to Parabola in Length not yet implemented";
265 }
else if (fPCA != 0) {
270 TVector3 start = TVector3(TStart->
GetX(), TStart->
GetY(), TStart->
GetZ());
273 maxdistance = (fpoint - start).Mag();
274 }
else if (fPCA == 2) {
275 double distance1, distance2;
276 distance1 = (fwire1 - start).Mag();
277 distance2 = (fwire2 - start).Mag();
278 if (distance1 < distance2) {
279 maxdistance = distance2;
281 maxdistance = distance1;
305 TVector3 fromwiretoextr = fvpf -
fvwi;
306 fromwiretoextr.SetMag(1.);
307 if (fabs(fromwiretoextr.Mag() - 1) > 1E-4) {
308 LOG(fatal) <<
"fromwire.Mag()!=1";
314 TVector3 wiredirection = fwire2 - fwire1;
317 wiredirection = mom.Cross(fromwiretoextr);
319 wiredirection.SetMag(1.);
321 if (fabs(fromwiretoextr * wiredirection) > 1e-3) {
327 TVector3 jver = TStart->
GetJVer();
329 TVector3 kver = TStart->
GetKVer();
330 bool backtracking = kFALSE;
331 if (fPropOption.Contains(
"B")) {
332 backtracking = kTRUE;
336 if (backtracking == kTRUE) {
340 gMC3->Eufilp(nepred, ein, pli, plo);
349 for (
int i = 0; i < 15; i++) {
350 fCovOut[i] = afErtrio->errout[i];
352 fCovOut[i] = fCovOut[i] * ch * ch;
354 if (i > 0 && i < 5) {
355 fCovOut[i] = fCovOut[i] * ch;
360 TVector3 origin(plo[6], plo[7], plo[8]);
361 TVector3 dj(plo[0], plo[1], plo[2]);
362 TVector3 dk(plo[3], plo[4], plo[5]);
363 TVector3 di(plo[9], plo[10], plo[11]);
365 if (fabs(p2[0]) < 1e-9 && fabs(p2[1]) < 1e-9 && fabs(p2[2]) < 1e-9) {
369 TEnd->
SetTrackPar(x2[0], x2[1], x2[2], p2[0], p2[1], p2[2], ch, fCovOut, origin, di, dj, dk);
377 LOG(warning) <<
"FairGeanePro::Propagate(FairTrackParH *TParam, FairTrackParP &TEnd, int PDG) not implemented";
384 GeantCode = fdbPDG->ConvertPdgToGeant3(PDG);
386 gMC3->Eufill(1, ein, xlf);
387 gMC3->Ertrak(X1, P1, X2, P2, GeantCode,
"L");
388 if (X2[0] < -1.E29) {
391 if (gMC3->IsTrackOut()) {
401 GeantCode = fdbPDG->ConvertPdgToGeant3(PDG);
404 gMC3->Ertrak(x1, p1, x2, p2, GeantCode, fPropOption.Data());
405 if (x2[0] < -1.E29) {
408 if (gMC3->IsTrackOut()) {
412 ftrklength = gMC3->TrackLength();
414 ftrktime = gMC3->TrackTime();
417 for (
int i = 0; i < 25; i++) {
419 trasp[i] = afErtrio->erdtrp[i];
429 x1[0] = TParam->
GetX();
430 x1[1] = TParam->
GetY();
431 x1[2] = TParam->
GetZ();
432 p1[0] = TParam->
GetPx();
433 p1[1] = TParam->
GetPy();
434 p1[2] = TParam->
GetPz();
447 TVector3 v1u = v1.Unit();
448 TVector3 v2u = v2.Unit();
463 TVector3 v1u = v1.Unit();
464 TVector3 v2u = v2.Unit();
477 TVector3 v3 = v1u.Cross(v2u);
492 for (
int i = 0; i < 15; i++) {
523 int index = fPropOption.Index(
"E");
525 fPropOption.Append(
"O");
527 fPropOption.Replace(index, 1,
"O");
532 bool FairGeanePro::PropagateFromPlane(
const TVector3& v1,
const TVector3& v2)
537 bool FairGeanePro::PropagateToPlane(
const TVector3& v0,
const TVector3& v1,
const TVector3& v2)
542 bool FairGeanePro::PropagateToVolume(TString VolName,
int CopyNo,
int option)
547 bool FairGeanePro::PropagateToLength(
float length)
552 bool FairGeanePro::PropagateOnlyParameters()
557 bool FairGeanePro::SetWire(TVector3 extremity1, TVector3 extremity2)
564 bool FairGeanePro::SetPoint(TVector3 pnt)
574 for (
int i = 0; i < 15; i++) {
581 }
else if (dir < 0) {
584 LOG(warning) <<
"FairGeanePro::SetPCAPropagation ERROR: no direction set";
591 fvpf = TVector3(0., 0., 0.);
592 fvwi = TVector3(0., 0., 0.);
598 bool FairGeanePro::PropagateToPCA(
int pca)
603 bool FairGeanePro::PropagateToPCA(
int pca,
int dir)
613 bool FairGeanePro::BackTrackToVertex()
622 fvpf = TVector3(0., 0., 0.);
623 fvwi = TVector3(0., 0., 0.);
629 bool FairGeanePro::PropagateToVirtualPlaneAtPCA(
int pca)
638 fvpf = TVector3(0., 0., 0.);
639 fvwi = TVector3(0., 0., 0.);
645 bool FairGeanePro::BackTrackToVirtualPlaneAtPCA(
int pca)
654 fvpf = TVector3(0., 0., 0.);
655 fvwi = TVector3(0., 0., 0.);
711 float pf[3] = {
static_cast<float>(Point.X()), static_cast<float>(Point.Y()), static_cast<float>(Point.Z())};
712 float w1[3] = {
static_cast<float>(Wire1.X()), static_cast<float>(Wire1.Y()), static_cast<float>(Wire1.Z())};
713 float w2[3] = {
static_cast<float>(Wire2.X()), static_cast<float>(Wire2.Y()), static_cast<float>(Wire2.Z())};
715 GeantCode = fdbPDG->ConvertPdgToGeant3(PDGCode);
725 float po1[3], po2[3], po3[3];
751 gMC3->SetClose(PCA, pf, dst, w1, w2, po1, po2, po3, cl);
756 float stdlength[1] = {
static_cast<float>(MaxDistance)};
758 gMC3->Eufill(1, ein, stdlength);
761 gMC3->Ertrak(x1, p1, x2, p2, GeantCode, fPropOption.Data());
762 if (x2[0] < -1.E29) {
765 if (gMC3->IsTrackOut()) {
768 gMC3->GetClose(po1, po2, po3, clen);
774 if (clen[0] == 0 && clen[1] == 0) {
781 if ((po1[0] == po2[0] && po1[1] == po2[1] && po1[2] == po2[2])
782 || (po2[0] == po3[0] && po2[1] == po3[1] && po2[2] == po3[2])) {
785 TVector3(po1), TVector3(po3), TVector3(pf), pcastruct.
OnTrackPCA, pcastruct.
Distance, Le, quitFlag);
788 LOG(warning) <<
"FairGeanePro:FindPCA: Track2ToPoint quitFlag " << quitFlag <<
" ABORT";
793 Track3ToPoint(TVector3(po1),
805 TVector3(po1), TVector3(po3), TVector3(pf), pcastruct.
OnTrackPCA, pcastruct.
Distance, Le, quitFlag);
808 LOG(warning) <<
"FairGeanePro:FindPCA: Track2ToPoint quitFlag " << quitFlag <<
" ABORT";
812 }
else if (flg == 2) {
814 LOG(warning) <<
"FairGeanePro:FindPCA: Track3ToPoint flg " << flg <<
" ABORT";
822 }
else if (PCA == 2) {
823 if ((po1[0] == po2[0] && po1[1] == po2[1] && po1[2] == po2[2])
824 || (po2[0] == po3[0] && po2[1] == po3[1] && po2[2] == po3[2])) {
825 Track2ToLine(TVector3(po1),
835 dist1 = (pcastruct.
OnWirePCA - TVector3(w1)).Mag();
836 dist2 = (pcastruct.
OnWirePCA - TVector3(w2)).Mag();
838 dist1 < dist2 ? Track2ToPoint(
839 TVector3(po1), TVector3(po3), TVector3(w1), pcastruct.
OnTrackPCA, pcastruct.
Distance, Le, quitFlag)
840 : Track2ToPoint(TVector3(po1),
843 pcastruct.OnTrackPCA,
849 LOG(warning) <<
"FairGeanePro:FindPCA: Track2ToPoint quitFlag " << quitFlag <<
" ABORT";
853 }
else if (flg == 2) {
855 LOG(warning) <<
"FairGeanePro:FindPCA: Track2ToLine flg " << flg <<
" ABORT";
860 Track3ToLine(TVector3(po1),
872 Track2ToLine(TVector3(po1),
882 dist1 = (pcastruct.
OnWirePCA - TVector3(w1)).Mag();
883 dist2 = (pcastruct.
OnWirePCA - TVector3(w2)).Mag();
885 dist1 < dist2 ? Track2ToPoint(TVector3(po1),
892 : Track2ToPoint(TVector3(po1),
895 pcastruct.OnTrackPCA,
901 LOG(warning) <<
"FairGeanePro:FindPCA: Track2ToPoint quitFlag " << quitFlag <<
" ABORT";
905 }
else if (flg == 2) {
907 LOG(warning) <<
"FairGeanePro:FindPCA: Track2ToLine flg " << flg <<
" ABORT";
911 }
else if (flg == 2) {
912 dist1 = (pcastruct.
OnWirePCA - TVector3(w1)).Mag();
913 dist2 = (pcastruct.
OnWirePCA - TVector3(w2)).Mag();
915 dist1 < dist2 ? Track3ToPoint(TVector3(po1),
924 : Track3ToPoint(TVector3(po1),
928 pcastruct.OnTrackPCA,
935 LOG(warning) <<
"FairGeanePro:FindPCA: Track3ToLine flg " << flg <<
" ABORT";
939 }
else if (flg == 3) {
940 dist1 = (pcastruct.
OnWirePCA - TVector3(w1)).Mag();
941 dist2 = (pcastruct.
OnWirePCA - TVector3(w2)).Mag();
943 dist1 < dist2 ? Track2ToPoint(
944 TVector3(po1), TVector3(po3), TVector3(w1), pcastruct.
OnTrackPCA, pcastruct.
Distance, Le, quitFlag)
945 : Track2ToPoint(TVector3(po1),
948 pcastruct.OnTrackPCA,
954 LOG(warning) <<
"FairGeanePro:FindPCA: Track2ToPoint quitFlag " << quitFlag <<
" ABORT";
958 }
else if (flg == 4) {
959 Track2ToLine(TVector3(po1),
970 LOG(warning) <<
"FairGeanePro:FindPCA: Track2ToLine flg " << flg <<
" ABORT";
992 void FairGeanePro::Track2ToLine(TVector3 X1,
1028 TVector3 x21, x32, w21;
1031 double a1, b1, c1, d1, e1;
1034 double Eps = 1.E-08;
1051 Delta1 = a1 * c1 - b1 * b1;
1054 double t1 = (a1 * e1 - b1 * d1) / Delta1;
1055 double s1 = (b1 * e1 - c1 * d1) / Delta1;
1057 Pfinal = (X1 + x21 * s1);
1058 Pwire = (w1 + w21 * t1);
1059 Length = s1 * x21.Mag();
1060 Dist = (Pfinal - Pwire).Mag();
1064 Pfinal.SetXYZ(0., 0., 0.);
1065 Pwire.SetXYZ(0., 0., 0.);
1072 if ((((Pwire[0] < w1[0] && Pwire[0] < w2[0]) || (w2[0] < Pwire[0] && w1[0] < Pwire[0]))
1073 && (fabs(Pwire[0] - w1[0]) > 1e-11 && fabs(Pwire[0] - w2[0]) > 1e-11))
1074 || (((Pwire[1] < w1[1] && Pwire[1] < w2[1]) || (w2[1] < Pwire[1] && w1[1] < Pwire[1]))
1075 && (fabs(Pwire[1] - w1[1]) > 1e-11 && fabs(Pwire[1] - w2[1]) > 1e-11))
1076 || (((Pwire[2] < w1[2] && Pwire[2] < w2[2]) || (w2[2] < Pwire[2] && w1[2] < Pwire[2]))
1077 && (fabs(Pwire[2] - w1[2]) > 1e-11 && fabs(Pwire[2] - w2[2]) > 1e-11))) {
1082 void FairGeanePro::Track2ToPoint(TVector3 X1,
1113 double d = (X2 - X1).Mag();
1114 if (fabs(d) < 1.E-8) {
1120 u21 = (X2 - X1).Unit();
1123 Dist = ((w1 - X1).Cross(u21)).Mag();
1124 t1 = a * (w1 - X1).Dot(u21);
1125 Pfinal = (X2 - X1) * t1 + X1;
1126 Length = (X2 - X1).Mag() * t1;
1129 void FairGeanePro::Track3ToLine(TVector3 X1,
1177 TVector3 xp1, xp2, xp3, xp32;
1179 TVector3 e1, e2, e3, aperp;
1180 TVector3 Ppfinal, Pwire;
1181 TVector3 wp1, wp2, wpt, xR, xpR;
1185 double T[3][3], TM1[3][3];
1187 TVector3 N, M, D,
B, Pointw;
1188 double a0, a1, b0, b1, c0, c1, c2;
1189 double d0, d1, d2, d3, d4, sol4[4], dmin;
1207 if (e3.Mag() < 1e-8) {
1223 for (
int i = 0; i < 3; i++) {
1230 for (
int i = 0; i < 3; i++) {
1232 for (
int j = 0; j < 3; j++) {
1233 TM1[i][j] = T[j][i];
1234 xp2[i] += T[i][j] * (X2[j] - X1[j]);
1235 xp3[i] += T[i][j] * (X3[j] - X1[j]);
1236 wp1[i] += T[i][j] * (w1[j] - X1[j]);
1237 wp2[i] += T[i][j] * (w2[j] - X1[j]);
1244 xpR[0] = 0.5 * xp2[0];
1245 if (fabs(xp3[1]) < 1.E-8) {
1249 xpR[1] = 0.5 * (xp32[0] * xp3[0] / xp3[1] + xp3[1]);
1251 Radius = sqrt(pow(xpR[0] - xp1[0], 2) + pow(xpR[1] - xp1[1], 2));
1258 N.SetXYZ(0., 0., 1.);
1262 b0 = M.Dot(D) - (N.Dot(M)) * (N.Dot(D));
1263 b1 = M.Dot(M) - (N.Dot(M)) * (N.Dot(M));
1264 c0 = D.Dot(D) - (N.Dot(D)) * (N.Dot(D));
1268 d0 = a0 * a0 * c0 - b0 * b0 * Radius * Radius;
1269 d1 = 2. * (a0 * a1 * c0 + a0 * a0 * c1 - b0 * b1 * Radius * Radius);
1270 d2 = a1 * a1 * c0 + 4. * a0 * a1 * c1 + a0 * a0 * c2 - b1 * b1 * Radius * Radius;
1271 d3 = 2. * (a1 * a1 * c1 + a0 * a1 * c2);
1275 for (
int k = 0; k < 4; k++) {
1278 if (fabs(d4) < 1.E-12) {
1284 it = t.SolveQuartic(d3 / d4, d2 / d4, d1 / d4, d0 / d4, sol4);
1295 for (
int j = 0; j <
it; j++) {
1296 Pointw[0] = B[0] + sol4[j] * M[0];
1297 Pointw[1] = B[1] + sol4[j] * M[1];
1298 Pointw[2] = B[2] + sol4[j] * M[2];
1299 Track3ToPoint(xp1, xp2, xp3, Pointw, px, Iflag, dx, Length, Radius);
1311 Pwire[0] = B[0] + sol4[imin] * M[0];
1312 Pwire[1] = B[1] + sol4[imin] * M[1];
1313 Pwire[2] = B[2] + sol4[imin] * M[2];
1314 Track3ToPoint(xp1, xp2, xp3, Pwire, px, Iflag, dx, Length, Radius);
1339 for (
int i = 0; i < 3; i++) {
1340 for (
int j = 0; j < 3; j++) {
1341 Pfinal[i] += TM1[i][j] * Ppfinal[j];
1342 Wire[i] += TM1[i][j] * Pwire[j];
1343 xR[i] += TM1[i][j] * xpR[j];
1346 Pfinal = Pfinal + X1;
1350 double dx1 = (X1 - xR).Mag();
1351 double dx2 = (Pfinal - xR).Mag();
1352 double dx12 = dx1 * dx2;
1353 if (fabs(dx12) < 1.E-8) {
1359 Angle = TMath::ACos((X1 - xR).Dot(Pfinal - xR) / (dx12));
1360 Length = Radius * Angle;
1361 if ((X2 - X1).Dot(Pfinal - X1) < 0.) {
1367 if (Radius > 1E-8) {
1368 epsi = Radius * (1. - TMath::Cos(0.5 * (X3 - X1).Mag() / Radius));
1370 if (epsi < 0.0020) {
1375 if ((((Wire[0] < w1[0] && Wire[0] < w2[0]) || (w2[0] < Wire[0] && w1[0] < Wire[0]))
1376 && (fabs(Wire[0] - w1[0]) > 1e-11 && fabs(Wire[0] - w2[0]) > 1e-11))
1377 || (((Wire[1] < w1[1] && Wire[1] < w2[1]) || (w2[1] < Wire[1] && w1[1] < Wire[1]))
1378 && (fabs(Wire[1] - w1[1]) > 1e-11 && fabs(Wire[1] - w2[1]) > 1e-11))
1379 || (((Wire[2] < w1[2] && Wire[2] < w2[2]) || (w2[2] < Wire[2] && w1[2] < Wire[2]))
1380 && (fabs(Wire[2] - w1[2]) > 1e-11 && fabs(Wire[2] - w2[2]) > 1e-11))) {
1385 void FairGeanePro::Track3ToPoint(TVector3 X1,
1420 TVector3 xp1, xp2, xp3, xp32;
1422 TVector3 e1, e2, e3;
1423 TVector3 Ppfinal, x32;
1424 TVector3 wp1, wpt, xR, xpR;
1427 TVector3 xc1, xc2, xc3, wc1;
1430 double T[3][3], TM1[3][3];
1441 double x21mag = x21.Mag();
1442 if (x21mag < 1.E-8) {
1457 if (e3.Mag() < 1e-8) {
1474 for (
int i = 0; i < 3; i++) {
1480 for (
int i = 0; i < 3; i++) {
1481 for (
int j = 0; j < 3; j++) {
1482 TM1[i][j] = T[j][i];
1484 xp2[i] += T[i][j] * (X2[j] - X1[j]);
1485 xp3[i] += T[i][j] * (X3[j] - X1[j]);
1486 wp1[i] += T[i][j] * (w1[j] - X1[j]);
1493 xpR[0] = 0.5 * xp2[0];
1494 if (fabs(xp3[1]) < 1.E-8) {
1498 xpR[1] = 0.5 * (xp32[0] * xp3[0] / xp3[1] + xp3[1]);
1501 Radius = sqrt(pow(xpR[0] - xp1[0], 2) + pow(xpR[1] - xp1[1], 2));
1507 double dwp = (wpt - xpR).Mag();
1508 if (fabs(dwp) < 1.E-8) {
1513 Ppfinal = (wpt - xpR) * Rt + xpR;
1514 Dist = (wp1 - Ppfinal).Mag();
1525 for (
int i = 0; i < 3; i++) {
1526 for (
int j = 0; j < 3; j++) {
1527 Pfinal[i] += TM1[i][j] * Ppfinal[j];
1528 xR[i] += TM1[i][j] * xpR[j];
1531 Pfinal = Pfinal + X1;
1535 double dx1 = (X1 - xR).Mag();
1536 double dx2 = (Pfinal - xR).Mag();
1537 double dx12 = dx1 * dx2;
1538 if (fabs(dx12) < 1.E-8) {
1543 Angle = TMath::ACos((X1 - xR).Dot(Pfinal - xR) / (dx12));
1544 Length = Radius * Angle;
1548 if (Radius > 1E-8) {
1549 epsi = Radius * (1. - TMath::Cos(0.5 * (X3 - X1).Mag() / Radius));
1551 if (epsi < 0.0020) {
1558 for (
int i = 0; i < 5; i++)
1559 for (
int j = 0; j < 5; j++) {
1560 trm[i][j] = trpmat[i][j];
virtual PCAOutputStruct FindPCA(int PCA, int PDGCode, TVector3 Point, TVector3 Wire1, TVector3 Wire2, double MaxDistance)
virtual Double_t GetPz() const
void GetCovQ(Double_t *CovQ)
virtual bool SetDestinationLength(float length)
ClassImp(FairEventBuilder)
void SetTrackPar(Double_t X, Double_t Y, Double_t Z, Double_t Px, Double_t Py, Double_t Pz, Int_t Q, Double_t CovMatrix[15], TVector3 o, TVector3 di, TVector3 dj, TVector3 dk)
virtual bool SetDestinationPlane(const TVector3 &v0, const TVector3 &v1, const TVector3 &v2)
virtual bool SetPCAPropagation(int pca, int dir=1, FairTrackParP *par=nullptr)
virtual Double_t GetPx() const
virtual bool SetDestinationVolume(std::string volName, int copyNo, int option)
void Init(FairTrackPar *TParam)
TVector3 contact FairRoot group if you need it return fvwi
FairMQExParamsParOne * par
virtual bool SetOriginPlane(const TVector3 &v0, const TVector3 &v1)
void FromVecToMat(fiveMat &A, Double_t V[25])
virtual Double_t GetPy() const
TVector3 contact FairRoot group if you need it
void GetTransportMatrix(double trm[5][5])
void SetTrackPar(Double_t x, Double_t y, Double_t z, Double_t Px, Double_t Py, Double_t Pz, Int_t Q, Double_t CovMatrix[15])
virtual bool Propagate(FairTrackParH *TStart, FairTrackParH *TEnd, int PDG)
int TVector3 TVector3 TVector3 double maxdistance
virtual bool SetPropagateOnlyParameters()
void GetCovQ(Double_t *CovQ)