29 #include <type_traits> 31 #include "TDatabasePDG.h" 39 #define MINSTEP 0.001 // minimum step [cm] for Runge Kutta and iteration to POCA 47 throw GFException(
"RKTrackRep::setData() called with a reference plane not the same as the one the last extrapolate(plane,state,cov) was made", __LINE__, __FILE__).
setFatal();
58 throw GFException(
"RKTrackRep::getAuxInfo() trying to get auxillary information with planes mismatch (Information returned does not belong to requested plane)", __LINE__, __FILE__).
setFatal();
85 const TVector3& poserr,
86 const TVector3& momerr,
114 TVector3
w=u.Cross(v);
119 fCov[3][3] = poserr.X()*poserr.X() * u.X()*u.X() +
120 poserr.Y()*poserr.Y() * u.Y()*u.Y() +
121 poserr.Z()*poserr.Z() * u.Z()*u.Z();
122 fCov[4][4] = poserr.X()*poserr.X() * v.X()*v.X() +
123 poserr.Y()*poserr.Y() * v.Y()*v.Y() +
124 poserr.Z()*poserr.Z() * v.Z()*v.Z();
126 (mom.X()*mom.X() * momerr.X()*momerr.X()+
127 mom.Y()*mom.Y() * momerr.Y()*momerr.Y()+
128 mom.Z()*mom.Z() * momerr.Z()*momerr.Z());
129 fCov[1][1] =
pow((u.X()/pw - w.X()*pu/(pw*pw)),2.)*momerr.X()*momerr.X() +
130 pow((u.Y()/pw - w.Y()*pu/(pw*pw)),2.)*momerr.Y()*momerr.Y() +
131 pow((u.Z()/pw - w.Z()*pu/(pw*pw)),2.)*momerr.Z()*momerr.Z();
132 fCov[2][2] =
pow((v.X()/pw - w.X()*pv/(pw*pw)),2.)*momerr.X()*momerr.X() +
133 pow((v.Y()/pw - w.Y()*pv/(pw*pw)),2.)*momerr.Y()*momerr.Y() +
134 pow((v.Z()/pw - w.Z()*pv/(pw*pw)),2.)*momerr.Z()*momerr.Z();
166 TVector3
w=u.Cross(v);
172 fCov[3][3] = poserr.X()*poserr.X() * u.X()*u.X() +
173 poserr.Y()*poserr.Y() * u.Y()*u.Y() +
174 poserr.Z()*poserr.Z() * u.Z()*u.Z();
175 fCov[4][4] = poserr.X()*poserr.X() * v.X()*v.X() +
176 poserr.Y()*poserr.Y() * v.Y()*v.Y() +
177 poserr.Z()*poserr.Z() * v.Z()*v.Z();
179 (mom.X()*mom.X() * momerr.X()*momerr.X()+
180 mom.Y()*mom.Y() * momerr.Y()*momerr.Y()+
181 mom.Z()*mom.Z() * momerr.Z()*momerr.Z());
182 fCov[1][1] =
pow((u.X()/pw - w.X()*pu/(pw*pw)),2.)*momerr.X()*momerr.X() +
183 pow((u.Y()/pw - w.Y()*pu/(pw*pw)),2.)*momerr.Y()*momerr.Y() +
184 pow((u.Z()/pw - w.Z()*pu/(pw*pw)),2.)*momerr.Z()*momerr.Z();
185 fCov[2][2] =
pow((v.X()/pw - w.X()*pv/(pw*pw)),2.)*momerr.X()*momerr.X() +
186 pow((v.Y()/pw - w.Y()*pv/(pw*pw)),2.)*momerr.Y()*momerr.Y() +
187 pow((v.Z()/pw - w.Z()*pv/(pw*pw)),2.)*momerr.Z()*momerr.Z();
193 const int& PDGCode) :
218 TVector3
w=u.Cross(v);
223 static const TVector3 stdPosErr(1.,1.,1.);
224 static const TVector3 stdMomErr(1.,1.,1.);
226 fCov[3][3] = stdPosErr.X()*stdPosErr.X() * u.X()*u.X() +
227 stdPosErr.Y()*stdPosErr.Y() * u.Y()*u.Y() +
228 stdPosErr.Z()*stdPosErr.Z() * u.Z()*u.Z();
229 fCov[4][4] = stdPosErr.X()*stdPosErr.X() * v.X()*v.X() +
230 stdPosErr.Y()*stdPosErr.Y() * v.Y()*v.Y() +
231 stdPosErr.Z()*stdPosErr.Z() * v.Z()*v.Z();
233 (mom.X()*mom.X() * stdMomErr.X()*stdMomErr.X()+
234 mom.Y()*mom.Y() * stdMomErr.Y()*stdMomErr.Y()+
235 mom.Z()*mom.Z() * stdMomErr.Z()*stdMomErr.Z());
236 fCov[1][1] =
pow((u.X()/pw - w.X()*pu/(pw*pw)),2.)*stdMomErr.X()*stdMomErr.X() +
237 pow((u.Y()/pw - w.Y()*pu/(pw*pw)),2.)*stdMomErr.Y()*stdMomErr.Y() +
238 pow((u.Z()/pw - w.Z()*pu/(pw*pw)),2.)*stdMomErr.Z()*stdMomErr.Z();
239 fCov[2][2] =
pow((v.X()/pw - w.X()*pv/(pw*pw)),2.)*stdMomErr.X()*stdMomErr.X() +
240 pow((v.Y()/pw - w.Y()*pv/(pw*pw)),2.)*stdMomErr.Y()*stdMomErr.Y() +
241 pow((v.Z()/pw - w.Z()*pv/(pw*pw)),2.)*stdMomErr.Z()*stdMomErr.Z();
247 const int& PDGCode) :
260 TVector3
w=u.Cross(v);
276 static const TVector3 stdPosErr2(1.,1.,1.);
277 static const TVector3 stdMomErr2(1.,1.,1.);
279 fCov[3][3] = stdPosErr2.X()*stdPosErr2.X() * u.X()*u.X() +
280 stdPosErr2.Y()*stdPosErr2.Y() * u.Y()*u.Y() +
281 stdPosErr2.Z()*stdPosErr2.Z() * u.Z()*u.Z();
282 fCov[4][4] = stdPosErr2.X()*stdPosErr2.X() * v.X()*v.X() +
283 stdPosErr2.Y()*stdPosErr2.Y() * v.Y()*v.Y() +
284 stdPosErr2.Z()*stdPosErr2.Z() * v.Z()*v.Z();
286 (mom.X()*mom.X() * stdMomErr2.X()*stdMomErr2.X()+
287 mom.Y()*mom.Y() * stdMomErr2.Y()*stdMomErr2.Y()+
288 mom.Z()*mom.Z() * stdMomErr2.Z()*stdMomErr2.Z());
289 fCov[1][1] =
pow((u.X()/pw - w.X()*pu/(pw*pw)),2.)*stdMomErr2.X()*stdMomErr2.X() +
290 pow((u.Y()/pw - w.Y()*pu/(pw*pw)),2.)*stdMomErr2.Y()*stdMomErr2.Y() +
291 pow((u.Z()/pw - w.Z()*pu/(pw*pw)),2.)*stdMomErr2.Z()*stdMomErr2.Z();
292 fCov[2][2] =
pow((v.X()/pw - w.X()*pv/(pw*pw)),2.)*stdMomErr2.X()*stdMomErr2.X() +
293 pow((v.Y()/pw - w.Y()*pv/(pw*pw)),2.)*stdMomErr2.Y()*stdMomErr2.Y() +
294 pow((v.Z()/pw - w.Z()*pv/(pw*pw)),2.)*stdMomErr2.Z()*stdMomErr2.Z();
301 TParticlePDG * part = TDatabasePDG::Instance()->GetParticle(
fPdg);
303 std::cerr <<
"RKTrackRep::setPDG particle " << i
304 <<
" not known to TDatabasePDG -> abort" <<
std::endl;
307 fMass = part->Mass();
315 TMatrixT<Double_t>
s(5,1);
324 TMatrixT<Double_t> statePred(
fState);
333 retmom.SetMag(1./fabs(statePred[0][0]));
342 retmom.SetMag(1./fabs(statePred[0][0]));
349 TMatrixT<Double_t> statePred(
fState);
357 mom.SetMag(1./fabs(statePred[0][0]));
358 pos = pl.
getO()+(statePred[3][0]*pl.
getU())+(statePred[4][0]*pl.
getV());
367 TVector3& dirInPoca){
369 static const int maxIt(30);
374 TVector3
w=u.Cross(v);
381 TMatrixT<Double_t> state7(7,1);
382 state7[0][0] = point.X();
383 state7[1][0] = point.Y();
384 state7[2][0] = point.Z();
385 state7[3][0] = pTilde.X();
386 state7[4][0] = pTilde.Y();
387 state7[5][0] = pTilde.Z();
388 state7[6][0] =
fState[0][0];
390 double coveredDistance(0.);
396 pl.
setON(pos,TVector3(state7[3][0],state7[4][0],state7[5][0]));
397 coveredDistance = this->
Extrap(pl,&state7);
399 if(fabs(coveredDistance)<
MINSTEP)
break;
400 if(++iterations == maxIt) {
401 throw GFException(
"RKTrackRep::extrapolateToPoint==> extrapolation to point failed, maximum number of iterations reached",__LINE__,__FILE__).
setFatal();
404 poca.SetXYZ(state7[0][0],state7[1][0],state7[2][0]);
405 dirInPoca.SetXYZ(state7[3][0],state7[4][0],state7[5][0]);
413 TVector3 theWire = extr2-extr1;
414 if(theWire.Mag()<1.E-8){
415 throw GFException(
"RKTrackRep::poca2Line(): try to find poca between line and point, but the line is really just a point",__LINE__,__FILE__).
setFatal();
417 double t = 1./(theWire*theWire)*(point*theWire+extr1*extr1-extr1*extr2);
418 return (extr1+t*theWire);
425 const TVector3& point2,
428 TVector3& poca_onwire){
429 static const int maxIt(30);
434 TVector3
w=u.Cross(v);
441 TMatrixT<Double_t> state7(7,1);
442 state7[0][0] = point.X();
443 state7[1][0] = point.Y();
444 state7[2][0] = point.Z();
445 state7[3][0] = pTilde.X();
446 state7[4][0] = pTilde.Y();
447 state7[5][0] = pTilde.Z();
448 state7[6][0] =
fState[0][0];
450 double coveredDistance(0.);
457 TVector3 currentDir(state7[3][0],state7[4][0],state7[5][0]);
458 pl.
setU(currentDir.Cross(point2-point1));
459 pl.
setV(point2-point1);
460 coveredDistance = this->
Extrap(pl,&state7);
462 if(fabs(coveredDistance)<
MINSTEP)
break;
463 if(++iterations == maxIt) {
464 throw GFException(
"RKTrackRep extrapolation to point failed, maximum number of iterations reached",__LINE__,__FILE__).
setFatal();
467 poca.SetXYZ(state7[0][0],state7[1][0],state7[2][0]);
468 dirInPoca.SetXYZ(state7[3][0],state7[4][0],state7[5][0]);
469 poca_onwire =
poca2Line(point1,point2,poca);
476 TMatrixT<Double_t>& statePred,
477 TMatrixT<Double_t>& covPred){
479 TMatrixT<Double_t> cov7x7(7,7);
480 TMatrixT<Double_t> J_pM(7,5);
485 TVector3
w=u.Cross(v);
486 std::ostream* pOut =
nullptr;
488 J_pM[0][3] = u.X();J_pM[0][4]=v.X();
489 J_pM[1][3] = u.Y();J_pM[1][4]=v.Y();
490 J_pM[2][3] = u.Z();J_pM[2][4]=v.Z();
493 double pTildeMag = pTilde.Mag();
498 J_pM[3][1] =
fSpu/pTildeMag*(u.X()-pTilde.X()/(pTildeMag*pTildeMag)*u*pTilde);
499 J_pM[4][1] =
fSpu/pTildeMag*(u.Y()-pTilde.Y()/(pTildeMag*pTildeMag)*u*pTilde);
500 J_pM[5][1] =
fSpu/pTildeMag*(u.Z()-pTilde.Z()/(pTildeMag*pTildeMag)*u*pTilde);
502 J_pM[3][2] =
fSpu/pTildeMag*(v.X()-pTilde.X()/(pTildeMag*pTildeMag)*v*pTilde);
503 J_pM[4][2] =
fSpu/pTildeMag*(v.Y()-pTilde.Y()/(pTildeMag*pTildeMag)*v*pTilde);
504 J_pM[5][2] =
fSpu/pTildeMag*(v.Z()-pTilde.Z()/(pTildeMag*pTildeMag)*v*pTilde);
508 TMatrixT<Double_t> J_pM_transp(J_pM);
511 cov7x7 = J_pM*(
fCov*J_pM_transp);
512 if (cov7x7[0][0]>=1000. || cov7x7[0][0]<1.
E-50)
515 (*pOut) <<
"RKTrackRep::extrapolate(): cov7x7[0][0] is crazy. Rescale off-diags. Try again. fCov, cov7x7 were: " <<
std::endl;
520 cov7x7 = J_pM*(
fCov*J_pM_transp);
522 (*pOut) <<
"New cov7x7 and fCov are ... " <<
std::endl;
530 TMatrixT<Double_t> state7(7,1);
531 state7[0][0] = pos.X();
532 state7[1][0] = pos.Y();
533 state7[2][0] = pos.Z();
534 state7[3][0] = pTilde.X()/pTildeMag;;
535 state7[4][0] = pTilde.Y()/pTildeMag;;
536 state7[5][0] = pTilde.Z()/pTildeMag;;
537 state7[6][0] =
fState[0][0];
539 double coveredDistance = this->
Extrap(pl,&state7,&cov7x7);
542 TVector3
O = pl.
getO();
543 TVector3 U = pl.
getU();
544 TVector3 V = pl.
getV();
547 double X = state7[0][0];
548 double Y = state7[1][0];
549 double Z = state7[2][0];
550 double AX = state7[3][0];
551 double AY = state7[4][0];
552 double AZ = state7[5][0];
553 double QOP = state7[6][0];
554 TVector3
A(AX,AY,AZ);
555 TVector3
Point(X,Y,Z);
556 TMatrixT<Double_t> J_Mp(5,7);
562 J_Mp[1][3] = (U.X()*(AtW)-W.X()*(A*U))/(AtW*AtW);
563 J_Mp[1][4] = (U.Y()*(AtW)-W.Y()*(A*U))/(AtW*AtW);
564 J_Mp[1][5] = (U.Z()*(AtW)-W.Z()*(A*U))/(AtW*AtW);
566 J_Mp[2][3] = (V.X()*(AtW)-W.X()*(A*V))/(AtW*AtW);
567 J_Mp[2][4] = (V.Y()*(AtW)-W.Y()*(A*V))/(AtW*AtW);
568 J_Mp[2][5] = (V.Z()*(AtW)-W.Z()*(A*V))/(AtW*AtW);
578 TMatrixT<Double_t> J_Mp_transp(J_Mp);
581 covPred.ResizeTo(5,5);
582 covPred = J_Mp*(cov7x7*J_Mp_transp);
585 statePred.ResizeTo(5,1);
586 statePred[0][0] = QOP;
587 statePred[1][0] = (A*U)/(A*W);
588 statePred[2][0] = (A*V)/(A*W);
589 statePred[3][0] = (Point-O)*U;
590 statePred[4][0] = (Point-O)*V;
595 return coveredDistance;
602 TMatrixT<Double_t>& statePred){
607 TVector3
w=u.Cross(v);
611 double pTildeMag = pTilde.Mag();
615 TMatrixT<Double_t> state7(7,1);
616 state7[0][0] = pos.X();
617 state7[1][0] = pos.Y();
618 state7[2][0] = pos.Z();
619 state7[3][0] = pTilde.X()/pTildeMag;
620 state7[4][0] = pTilde.Y()/pTildeMag;
621 state7[5][0] = pTilde.Z()/pTildeMag;
622 state7[6][0] =
fState[0][0];
624 TVector3
O = pl.
getO();
625 TVector3 U = pl.
getU();
626 TVector3 V = pl.
getV();
629 double coveredDistance = this->
Extrap(pl,&state7);
631 double X = state7[0][0];
632 double Y = state7[1][0];
633 double Z = state7[2][0];
634 double AX = state7[3][0];
635 double AY = state7[4][0];
636 double AZ = state7[5][0];
637 double QOP = state7[6][0];
638 TVector3
A(AX,AY,AZ);
639 TVector3
Point(X,Y,Z);
641 statePred.ResizeTo(5,1);
642 statePred[0][0] = QOP;
643 statePred[1][0] = (A*U)/(A*W);
644 statePred[2][0] = (A*V)/(A*W);
645 statePred[3][0] = (Point-O)*U;
646 statePred[4][0] = (Point-O)*V;
648 return coveredDistance;
693 double& coveredDistance,
694 std::vector<TVector3>& points,
695 std::vector<double>& pointPaths,
697 bool calcCov)
const {
699 static const double EC = .000149896229;
700 static const double DLT = .0002;
701 static const double DLT32 = DLT/32.;
702 static const double P3 = 1./3.;
703 static const double Smax = 100.0;
704 static const double Wmax = 3000.;
706 static const double Pmin = 1.E-11;
708 static const int ND = 56;
709 static const int ND1 = ND-7;
712 double SA[3] = {0.,0.,0.};
713 double Pinv = P[6]*EC;
717 bool stopBecauseOfMaterial =
false;
723 std::cerr <<
"RKTrackRep::RKutta ==> momentum too low: " << fabs(
fCharge/P[6])*1000. <<
" MeV" <<
std::endl;
728 TVector3
O = plane.
getO();
745 double Step,An,Dist,Dis,
S,Sl=0;
747 points.push_back(TVector3(R[0],R[1],R[2]));
748 pointPaths.push_back(0.);
750 An=A[0]*SU[0]+A[1]*SU[1]+A[2]*SU[2];
754 std::cerr <<
"RKTrackRep::RKutta ==> cannot propagate perpendicular to plane " <<
std::endl;
757 if( plane.
inActive(TVector3(R[0],R[1],R[2]),TVector3(A[0],A[1],A[2]))) {
758 Dist=SU[3]-R[0]*SU[0]-R[1]*SU[1]-R[2]*SU[2];
762 if( (O.X()-R[0])*A[0] + (O.Y()-R[1])*A[1] + (O.Z()-R[2])*A[2] >0 ){
763 Dist = sqrt((R[0]-O.X())*(R[0]-O.X())+
764 (R[1]-O.Y())*(R[1]-O.Y())+
765 (R[2]-O.Z())*(R[2]-O.Z()));
768 Dist = -1.*sqrt((R[0]-O.X())*(R[0]-O.X())+
769 (R[1]-O.Y())*(R[1]-O.Y())+
770 (R[2]-O.Z())*(R[2]-O.Z()));
775 if(fabs(Step)>Wmax) {
777 std::cerr<<
"RKTrackRep::RKutta ==> Too long extrapolation requested : "<<Step<<
" cm !"<<
std::endl; std::cerr<<
"X = "<<R[0]<<
" Y = "<<R[1]<<
" Z = "<<R[2]
778 <<
" COSx = "<<A[0]<<
" COSy = "<<A[1]<<
" COSz = "<<A[2]<<
std::endl;
779 std::cout<<
"Destination X = "<<SU[0]*SU[3]<<
std::endl;
781 mf::LogInfo(
"RKTrackRep::RKutta(): ") <<
"Throw cet exception here, ... ";
782 throw GFException(
"RKTrackRep::RKutta(): Runge Kutta propagation failed",__LINE__,__FILE__).
setFatal();
790 Step>Smax ? S=Smax : Step<-Smax ? S=-Smax : S=Step;
800 while(fabs(Step)>
MINSTEP && !stopBecauseOfMaterial) {
815 Ssign*A[0],Ssign*A[1],Ssign*A[2],
821 if (S > stepperLen) {
823 stopBecauseOfMaterial =
true;
825 else if (S < -stepperLen) {
827 stopBecauseOfMaterial =
true;
830 double H0[12],H1[12],H2[12],
r[3];
831 double S3=P3*
S, S4=.25*
S, PS2=Pinv*
S;
836 r[0]=R[0] ; r[1]=R[1] ; r[2]=R[2] ;
837 TVector3
pos(r[0],r[1],r[2]);
839 H0[0]=PS2*H0vect.X(); H0[1]=PS2*H0vect.Y(); H0[2]=PS2*H0vect.Z();
840 double A0=A[1]*H0[2]-A[2]*H0[1], B0=A[2]*H0[0]-A[0]*H0[2], C0=A[0]*H0[1]-A[1]*H0[0];
841 double A2=A[0]+A0 , B2=A[1]+B0 ,
C2=A[2]+C0 ;
842 double A1=A2+A[0] , B1=B2+A[1] ,
C1=C2+A[2] ;
847 r[0]+=A1*S4 ; r[1]+=B1*S4 ; r[2]+=C1*S4 ;
848 pos.SetXYZ(r[0],r[1],r[2]);
850 H1[0]=H1vect.X()*PS2; H1[1]=H1vect.Y()*PS2;H1[2]=H1vect.Z()*PS2;
851 double A3,B3,
C3,A4,B4,
C4,A5,B5,
C5;
852 A3 = B2*H1[2]-C2*H1[1]+A[0]; B3=C2*H1[0]-A2*H1[2]+A[1]; C3=A2*H1[1]-B2*H1[0]+A[2];
853 A4 = B3*H1[2]-C3*H1[1]+A[0]; B4=C3*H1[0]-A3*H1[2]+A[1]; C4=A3*H1[1]-B3*H1[0]+A[2];
854 A5 = A4-A[0]+A4 ; B5=B4-A[1]+B4 ; C5=C4-A[2]+C4 ;
859 r[0]=R[0]+S*A4 ; r[1]=R[1]+S*B4 ; r[2]=R[2]+S*C4 ;
860 pos.SetXYZ(r[0],r[1],r[2]);
862 H2[0]=H2vect.X()*PS2; H2[1]=H2vect.Y()*PS2;H2[2]=H2vect.Z()*PS2;
863 double A6=B5*H2[2]-C5*H2[1], B6=C5*H2[0]-A5*H2[2], C6=A5*H2[1]-B5*H2[0];
868 double EST = fabs((A1+A6)-(A3+A4))+fabs((B1+B6)-(B3+B4))+fabs((C1+C6)-(C3+C4));
871 stopBecauseOfMaterial =
false;
879 for(
int i=7; i!=ND; i+=7) {
882 double* dA = &P[i+3];
885 double dA0 = H0[ 2]*dA[1]-H0[ 1]*dA[2];
886 double dB0 = H0[ 0]*dA[2]-H0[ 2]*dA[0];
887 double dC0 = H0[ 1]*dA[0]-H0[ 0]*dA[1];
889 if(i==ND1) {dA0+=A0; dB0+=B0; dC0+=C0;}
891 double dA2 = dA0+dA[0];
892 double dB2 = dB0+dA[1];
893 double dC2 = dC0+dA[2];
896 double dA3 = dA[0]+dB2*H1[2]-dC2*H1[1];
897 double dB3 = dA[1]+dC2*H1[0]-dA2*H1[2];
898 double dC3 = dA[2]+dA2*H1[1]-dB2*H1[0];
900 if(i==ND1) {dA3+=A3-A[0]; dB3+=B3-A[1]; dC3+=C3-A[2];}
902 double dA4 = dA[0]+dB3*H1[2]-dC3*H1[1];
903 double dB4 = dA[1]+dC3*H1[0]-dA3*H1[2];
904 double dC4 = dA[2]+dA3*H1[1]-dB3*H1[0];
906 if(i==ND1) {dA4+=A4-A[0]; dB4+=B4-A[1]; dC4+=C4-A[2];}
909 double dA5 = dA4+dA4-dA[0];
910 double dB5 = dB4+dB4-dA[1];
911 double dC5 = dC4+dC4-dA[2];
913 double dA6 = dB5*H2[2]-dC5*H2[1];
914 double dB6 = dC5*H2[0]-dA5*H2[2];
915 double dC6 = dA5*H2[1]-dB5*H2[0];
917 if(i==ND1) {dA6+=A6; dB6+=B6; dC6+=C6;}
919 dR[0]+=(dA2+dA3+dA4)*S3; dA[0] = (dA0+dA3+dA3+dA5+dA6)*P3;
920 dR[1]+=(dB2+dB3+dB4)*S3; dA[1] = (dB0+dB3+dB3+dB5+dB6)*P3;
921 dR[2]+=(dC2+dC3+dC4)*S3; dA[2] = (dC0+dC3+dC3+dC5+dC6)*P3;
926 if((Way+=fabs(S))>Wmax){
927 std::cerr<<
"PaAlgo::RKutta ==> Trajectory is longer than length limit : "<<Way<<
" cm !" 928 <<
" p/q = "<<1./P[6]<<
" GeV"<<
std::endl;
935 R[0]+=(A2+A3+A4)*S3; A[0]+=(SA[0]=(A0+A3+A3+A5+A6)*P3-A[0]);
936 R[1]+=(B2+B3+B4)*S3; A[1]+=(SA[1]=(B0+B3+B3+B5+B6)*P3-A[1]);
937 R[2]+=(C2+C3+C4)*S3; A[2]+=(SA[2]=(C0+C3+C3+C5+C6)*P3-A[2]);
943 pointPaths.at(pointPaths.size()-1)+=S;
944 points.erase(points.end());
947 pointPaths.push_back(S);
950 points.push_back(TVector3(R[0],R[1],R[2]));
952 double CBA = 1./sqrt(A[0]*A[0]+A[1]*A[1]+A[2]*A[2]);
953 A[0]*=CBA; A[1]*=CBA; A[2]*=CBA;
956 if(fabs(Way2)>Wmax) {
965 An=A[0]*SU[0]+A[1]*SU[1]+A[2]*SU[2];
967 if( plane.
inActive(TVector3(R[0],R[1],R[2]),TVector3(A[0],A[1],A[2]))) {
968 Dis=SU[3]-R[0]*SU[0]-R[1]*SU[1]-R[2]*SU[2];
972 if( (O.X()-R[0])*A[0] + (O.Y()-R[1])*A[1] + (O.Z()-R[2])*A[2] >0 ){
973 Dis = sqrt((R[0]-O.X())*(R[0]-O.X())+
974 (R[1]-O.Y())*(R[1]-O.Y())+
975 (R[2]-O.Z())*(R[2]-O.Z()));
978 Dis = -1.*sqrt((R[0]-O.X())*(R[0]-O.X())+
979 (R[1]-O.Y())*(R[1]-O.Y())+
980 (R[2]-O.Z())*(R[2]-O.Z()));
986 if (Dis*Dist>0 && fabs(Dis)>fabs(Dist)) {
997 if (S*Step<0. || fabs(S)>fabs(Step)) S=Step;
998 else if (EST<DLT32 && fabs(2.*S)<=Smax) S*=2.;
1006 if (!stopBecauseOfMaterial) {
1008 A [0]+=(SA[0]*=Sl)*Step;
1009 A [1]+=(SA[1]*=Sl)*Step;
1010 A [2]+=(SA[2]*=Sl)*Step;
1012 P[0] = R[0]+Step*(A[0]-.5*Step*SA[0]);
1013 P[1] = R[1]+Step*(A[1]-.5*Step*SA[1]);
1014 P[2] = R[2]+Step*(A[2]-.5*Step*SA[2]);
1016 points.push_back(TVector3(P[0],P[1],P[2]));
1017 pointPaths.push_back(Step);
1020 double CBA = 1./sqrt(A[0]*A[0]+A[1]*A[1]+A[2]*A[2]);
1029 An = A[0]*SU[0]+A[1]*SU[1]+A[2]*SU[2];
1031 fabs(An) < 1.E-6 ? An=1./An : An = 0;
1033 if(calcCov && !stopBecauseOfMaterial){
1034 for(
int i=7; i!=ND; i+=7) {
1035 double* dR = &P[i];
double* dA = &P[i+3];
1036 S = (dR[0]*SU[0]+dR[1]*SU[1]+dR[2]*SU[2])*An;
1037 dR[0]-=S*A [0]; dR[1]-=S*A [1]; dR[2]-=S*A [2];
1038 dA[0]-=S*SA[0]; dA[1]-=S*SA[1]; dA[2]-=S*SA[2];
1044 std::cerr <<
"RKTrackRep::RKutta ==> Do not get closer. Path = " << Way <<
" cm" <<
" p/q = " << 1./P[6] <<
" GeV" <<
std::endl;
1049 if (!stopBecauseOfMaterial) coveredDistance=Way2+Step;
1050 else coveredDistance=Way2;
1060 static const int maxNumIt(2000);
1063 if(cov==NULL) calcCov=
false;
1066 if(calcCov)
std::fill(P, P + std::extent<decltype(P)>::
value, 0);
1069 for(
int i=0;i<7;++i){
1070 P[i] = (*state)[i][0];
1073 TMatrixT<Double_t> jac(7,7);
1074 TMatrixT<Double_t> jacT(7,7);
1075 TMatrixT<Double_t> oldCov(7,7);
1076 if(calcCov) oldCov=(*cov);
1077 double coveredDistance(0.);
1078 double sumDistance(0.);
1081 if(numIt++ > maxNumIt){
1082 throw GFException(
"RKTrackRep::Extrap ==> maximum number of iterations exceeded",
1087 memset(&P[7],0x00,49*
sizeof(
double));
1088 for(
int i=0; i<6; ++i){
1091 P[55] = (*state)[6][0];
1096 TVector3 Pvect(P[0],P[1],P[2]);
1097 TVector3 Avect(P[3],P[4],P[5]);
1107 TVector3 directionBefore(P[3],P[4],P[5]);
1108 directionBefore.SetMag(1.);
1111 std::vector<TVector3> points;
1112 std::vector<double> pointPaths;
1113 if( ! this->
RKutta(plane,P,coveredDistance,points,pointPaths,-1.,calcCov) ) {
1118 mf::LogInfo(
"RKTrackRep::RKutta(): ") <<
"Throw cet exception here, ... ";
1119 throw GFException(
"RKTrackRep::RKutta(): Runge Kutta propagation failed",
1123 TVector3 directionAfter(P[3],P[4],P[5]);
1124 directionAfter.SetMag(1.);
1126 sumDistance+=coveredDistance;
1129 std::vector<TVector3> pointsFilt(1, points.at(0));
1130 std::vector<double> pointPathsFilt(1, 0.);
1132 for(
unsigned int i=1;i<points.size();++i){
1133 if (pointPaths.at(i) * coveredDistance > 0.) {
1134 pointsFilt.push_back(points.at(i));
1135 pointPathsFilt.push_back(pointPaths.at(i));
1138 pointsFilt.back() = points.at(i);
1139 pointPathsFilt.back() += pointPaths.at(i);
1142 int position = pointsFilt.size()-1;
1143 if (fabs(pointPathsFilt.back()) <
MINSTEP && position > 1) {
1144 pointsFilt.at(position-1) = pointsFilt.at(position);
1145 pointsFilt.pop_back();
1146 pointPathsFilt.at(position-1) += pointPathsFilt.at(position);
1147 pointPathsFilt.pop_back();
1152 double checkSum(0.);
1153 for(
unsigned int i=0;i<pointPathsFilt.size();++i){
1154 checkSum+=pointPathsFilt.at(i);
1157 if(fabs(checkSum-coveredDistance)>1.
E-7){
1158 throw GFException(
"RKTrackRep::Extrap ==> fabs(checkSum-coveredDistance)>1.E-7",__LINE__,__FILE__).
setFatal();
1162 for(
int i=0;i<7;++i){
1163 for(
int j=0;j<7;++j){
1164 if(i<6) jac[i][j] = P[ (i+1)*7+j ];
1165 else jac[i][j] = P[ (i+1)*7+j ]/P[6];
1172 TMatrixT<Double_t> noise(7,7);
1198 if(fabs(P[6])>1.
E-10){
1204 *cov = jacT*((oldCov)*jac)+noise;
1210 if( plane.
inActive(TVector3(P[0],P[1],P[2]),TVector3(P[3],P[4],P[5]))) {
1214 (*state)[0][0] = P[0]; (*state)[1][0] = P[1];
1215 (*state)[2][0] = P[2]; (*state)[3][0] = P[3];
1216 (*state)[4][0] = P[4]; (*state)[5][0] = P[5];
1217 (*state)[6][0] = P[6];
1225 for(
int i=0;i<
fCov.GetNrows();++i){
1226 for(
int j=0;j<
fCov.GetNcols();++j){
1231 if (
fCov[i][j]<=0.0)
fCov[i][j] = 0.01;
int fPdg
PDG particle code.
const TMatrixT< double > * getAuxInfo(const GFDetPlane &pl)
void setON(const TVector3 &o, const TVector3 &n)
void setU(const TVector3 &u)
static GFMaterialEffects * getInstance()
TVector3 getPosError() const
void extrapolateToLine(const TVector3 &point1, const TVector3 &point2, TVector3 &poca, TVector3 &dirInPoca, TVector3 &poca_onwire)
This method extrapolates to the point of closest approach to a line.
TVector3 getPosSeed() const
get the seed value for track: pos
MaybeLogger_< ELseverityLevel::ELsev_info, false > LogInfo
TVector3 dist(const TVector3 &point) const
double fMass
Mass (in GeV)
void setO(const TVector3 &o)
std::pair< float, std::string > P
double extrapolate(const GFDetPlane &, TMatrixT< Double_t > &statePred, TMatrixT< Double_t > &covPred)
returns the tracklength spanned in this extrapolation
TVector3 getDirSeed() const
get the seed value for track: direction
void setData(const TMatrixT< double > &st, const GFDetPlane &pl, const TMatrixT< double > *cov=NULL, const TMatrixT< double > *aux=NULL)
Sets state, plane and (optionally) covariance.
Base Class for genfit track representations. Defines interface for track parameterizations.
TVector3 getNormal() const
TMatrixT< double > fAuxInfo
TMatrixT< Double_t > fCov
The covariance matrix.
void setV(const TVector3 &v)
double distance(TVector3 &) const
std::tuple< double, double, const reco::ClusterHit3D * > Point
Definitions used by the VoronoiDiagram algorithm.
virtual void setData(const TMatrixT< Double_t > &st, const GFDetPlane &pl, const TMatrixT< Double_t > *cov=NULL)
void rescaleCovOffDiags()
class C5 in the third group.
TMatrixT< Double_t > fLastState
int getPdgCode() const
get the PDG code
void extrapolateToPoint(const TVector3 &pos, TVector3 &poca, TVector3 &dirInPoca)
This method is to extrapolate the track to point of closest approach to a point in space...
static TVector3 getFieldVal(const TVector3 &x)
void setPDG(int)
Set PDG particle code.
Exception class for error handling in GENFIT (provides storage for diagnostic information) ...
constexpr double dist(const TReal *x, const TReal *y, const unsigned int dimension)
double effects(const std::vector< TVector3 > &points, const std::vector< double > &pointPaths, const double &mom, const int &pdg, const bool &doNoise=false, TMatrixT< Double_t > *noise=NULL, const TMatrixT< Double_t > *jacobian=NULL, const TVector3 *directionBefore=NULL, const TVector3 *directionAfter=NULL)
Calculates energy loss in the travelled path, optional calculation of noise matrix.
double Extrap(const GFDetPlane &plane, TMatrixT< Double_t > *state, TMatrixT< Double_t > *cov=NULL) const
Handles propagation and material effects.
void setNormal(TVector3 n)
void PrintROOTobject(std::ostream &, const ROOTOBJ &)
Small utility functions which print some ROOT objects into an output stream.
GFException & setFatal(bool b=true)
set fatal flag. if this is true, the fit stops for this current track repr.
TVector3 getMomLast(const GFDetPlane &)
TVector3 getDirError() const
get the seed value for track: error on direction (standard deviation)
TMatrixT< Double_t > fState
The vector of track parameters.
bool inActive(const TVector3 &point, const TVector3 &dir) const
intersect in the active area? C.f. GFAbsFinitePlane
void getPosMom(const GFDetPlane &, TVector3 &pos, TVector3 &mom)
Gets position and momentum in the plane by exrapolating or not.
bool RKutta(const GFDetPlane &plane, double *P, double &coveredDistance, std::vector< TVector3 > &points, std::vector< double > &pointLengths, const double &maxLen=-1, bool calcCov=true) const
Contains all material effects.
TVector3 poca2Line(const TVector3 &extr1, const TVector3 &extr2, const TVector3 &point) const
QTextStream & endl(QTextStream &s)
double stepper(const double &maxDist, const double &posx, const double &posy, const double &posz, const double &dirx, const double &diry, const double &dirz, const double &mom, const int &pdg)
Returns maximum length so that a specified momentum loss will not be exceeded.