29 #include <type_traits>
31 #include "TDatabasePDG.h"
37 #include "messagefacility/MessageLogger/MessageLogger.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();
60 fAuxInfo.ResizeTo(1,1);
61 fAuxInfo(0,0) = fCacheSpu;
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) :
195 fCachePlane(), fCacheSpu(1), fAuxInfo(1,1),
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) :
249 fCachePlane(), fCacheSpu(1), fAuxInfo(1,1),
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);
319 return fRefPlane.getO()+fState[3][0]*fRefPlane.getU()+fState[4][0]*fRefPlane.getV();
324 TMatrixT<Double_t> statePred(fState);
327 extrapolate(pl,statePred);
328 retmom = fCacheSpu*(pl.
getNormal()+statePred[1][0]*pl.
getU()+statePred[2][0]*pl.
getV());
331 retmom = fSpu*(pl.
getNormal()+statePred[1][0]*pl.
getU()+statePred[2][0]*pl.
getV());
333 retmom.SetMag(1./fabs(statePred[0][0]));
338 TMatrixT<Double_t> statePred(fLastState);
340 retmom = fSpu*(pl.
getNormal()+statePred[1][0]*pl.
getU()+statePred[2][0]*pl.
getV());
342 retmom.SetMag(1./fabs(statePred[0][0]));
349 TMatrixT<Double_t> statePred(fState);
351 extrapolate(pl,statePred);
352 mom = fCacheSpu*(pl.
getNormal()+statePred[1][0]*pl.
getU()+statePred[2][0]*pl.
getV());
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);
371 TVector3 o=fRefPlane.getO();
372 TVector3 u=fRefPlane.getU();
373 TVector3 v=fRefPlane.getV();
374 TVector3
w=u.Cross(v);
376 TVector3 pTilde = fSpu* (w + fState[1][0] * u + fState[2][0] * v);
379 TVector3 point = o + fState[3][0]*u + fState[4][0]*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);
431 TVector3 o=fRefPlane.getO();
432 TVector3 u=fRefPlane.getU();
433 TVector3 v=fRefPlane.getV();
434 TVector3
w=u.Cross(v);
436 TVector3 pTilde = fSpu* (w + fState[1][0] * u + fState[2][0] * v);
439 TVector3 point = o + fState[3][0]*u + fState[4][0]*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);
482 TVector3 o=fRefPlane.getO();
483 TVector3 u=fRefPlane.getU();
484 TVector3 v=fRefPlane.getV();
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();
492 TVector3 pTilde = fSpu * (w + fState[1][0] * u + fState[2][0] * v);
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;
519 rescaleCovOffDiags();
520 cov7x7 = J_pM*(fCov*J_pM_transp);
522 (*pOut) <<
"New cov7x7 and fCov are ... " << std::endl;
529 TVector3 pos = o + fState[3][0]*u + fState[4][0]*v;
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;
593 fCacheSpu = (A*W)/fabs(A*W);
595 return coveredDistance;
602 TMatrixT<Double_t>& statePred){
604 TVector3 o=fRefPlane.getO();
605 TVector3 u=fRefPlane.getU();
606 TVector3 v=fRefPlane.getV();
607 TVector3
w=u.Cross(v);
610 TVector3 pTilde = fSpu* (w + fState[1][0] * u + fState[2][0] * v);
611 double pTildeMag = pTilde.Mag();
613 TVector3 pos = o + fState[3][0]*u + fState[4][0]*v;
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){
1228 fCov[i][j]=0.5*fCov[i][j];
1231 if (fCov[i][j]<=0.0) fCov[i][j] = 0.01;
const TMatrixT< double > * getAuxInfo(const GFDetPlane &pl)
void setON(const TVector3 &o, const TVector3 &n)
void setU(const TVector3 &u)
see a below echo S(symbol in a section other than those above)
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
BEGIN_PROLOG could also be cerr
TVector3 dist(const TVector3 &point) const
void setO(const TVector3 &o)
then echo echo For and will not be changed by echo further linking echo echo B echo The symbol is in the uninitialized data multiple common symbols may appear with the echo same name If the symbol is defined the common echo symbols are treated as undefined references For more echo details on common see the discussion of warn common echo in *Note Linker see the discussion of warn common echo in *Note Linker such as a global int variable echo as opposed to a large global array echo echo I echo The symbol is an indirect reference to another symbol This echo is a GNU extension to the a out object file format which is echo rarely used echo echo N echo The symbol is a debugging symbol echo echo R echo The symbol is in a read only data section echo echo S echo The symbol is in an uninitialized data section for small echo objects echo echo T echo The symbol is in the the normal defined echo symbol is used with no error When a weak undefined symbol echo is linked and the symbol is not the value of the echo weak symbol becomes zero with no error echo echo W echo The symbol is a weak symbol that has not been specifically echo tagged as a weak object symbol When a weak defined symbol echo is linked with a normal defined the normal defined echo symbol is used with no error When a weak undefined symbol echo is linked and the symbol is not the value of the echo weak symbol becomes zero with no error echo echo echo The symbol is a stabs symbol in an a out object file In echo this the next values printed are the stabs other echo the stabs desc and the stab type Stabs symbols are echo used to hold debugging information For more echo see *Note or object file format specific echo echo For Mac OS X
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.
process_name can override from command line with o or output trkana stream1 EC
TVector3 getNormal() const
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()
void fill(const art::PtrVector< recob::Hit > &hits, int only_plane)
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.
then echo File list $list not found else cat $list while read file do echo $file sed s
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.
BEGIN_PROLOG don t mess with this pandoraTrackGausCryoW true
BEGIN_PROLOG could also be cout
TVector3 poca2Line(const TVector3 &extr1, const TVector3 &extr2, const TVector3 &point) const
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.