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.