404   const double pt = p4.Perp(); 
 
  406     Warning(
"P7toPRG",
"Too small transverse momentum: %g",pt);
 
  412   const double qBc = -0.000299792458*B*Q; 
 
  419   const double xp = 
pos.X()-expPoint.X(); 
 
  420   const double yp = 
pos.Y()-expPoint.Y(); 
 
  421   const double zp = 
pos.Z()-expPoint.Z(); 
 
  422   const double px = p4.Px(); 
 
  423   const double py = p4.Py(); 
 
  424   const double pz = p4.Pz(); 
 
  425   const double p2 = px*px+py*py+pz*
pz;
 
  426   const double p2i = (p2==0.)?0.:1./
p2;
 
  427   const double pti = 1/
pt;
 
  429   if(
fVerbose>1) { 
printf(
"P7toPRG: x is [%8g,%8g,%8g] cm \n",xp,yp,zp); }
 
  430   if(
fVerbose>1) { 
printf(
"P7toPRG: p is [%8g,%8g,%8g] GeV/c \n",px,py,pz); }
 
  432   const double phip = p4.Phi();
 
  448     double eta = phip - TMath::ACos(xp/r);
 
  449     double tht = p4.Theta();
 
  451     helixparams[0] = r*
sin(eta);
 
  452     helixparams[1] = zp - r*
cos(eta)/tan(tht);
 
  453     helixparams[2] = 
tht;
 
  454     helixparams[3] = phip;
 
  461       jacobian[0][1] = yp*
sin(eta)/r - xp*yp*
cos(eta)/(r*r*
TMath::Sqrt(1-xp*xp/(r*r))); 
 
  468       jacobian[1][0] = 
TMath::Sqrt(1-xp*xp/(r*r))*
sin(eta)/tan(tht) - xp/r * 
cos(eta)/tan(tht);       
 
  469       jacobian[1][1] = -(yp/r*
cos(eta)/tan(tht)+xp*yp/(r*
r)*
sin(eta)/tan(tht)/
TMath::Sqrt(1-xp*xp/(r*r)));  
 
  479       jacobian[2][3] = px*pz*pti*p2i;   
 
  480       jacobian[2][4] = py*pz*pti*p2i;   
 
  481       jacobian[2][5] = -pt*p2i;     
 
  487       jacobian[3][3] = -py*pti;     
 
  488       jacobian[3][4] = px*pti;      
 
  505     const double rho = qBc*pti;
 
  506     const double R0 = 1./rho; 
 
  513     const double theta=p4.Theta();
 
  518     const double xc = xp - py/qBc;
 
  519     const double yc = yp + px/qBc;
 
  520     const double RCsq = xc*xc + yc*yc;
 
  526     const double epsilon = Q*(RC - 
TMath::Abs(R0));
 
  530     const double direction = TMath::Sign(1.,Q);
 
  539     if(
fVerbose>1) { 
printf(
"P7toPRG: phi0 = %.4g, \tphiP = %.4g, \tDeltaPhi = %.4g \tepsilon=%.4g, \tQ=%g\n",phi0,phip,phip-phi0, epsilon, Q); }
 
  541     double xnew=epsilon*
sin(phi0);
 
  542     double ynew=-epsilon*
cos(phi0);
 
  543     printf(
"P7toPRG: xnew = %.4g, \tynew = %.4g, \t(x^2+y^2) = %.4g \tepsilon^2=%.4g\n",xnew,ynew,xnew*xnew+ynew*ynew, epsilon*epsilon);
 
  547     const double z0 = zp - pz*(phip-
phi0)/qBc;
 
  549     if(
fVerbose>1) { 
printf(
"P7toPRG: z0 is %g cm from zp=%.3g cm\n",z0,zp); }
 
  551     helixparams[0]=epsilon;
 
  553     helixparams[2]=
theta;
 
  557     for(
int ai=0; ai<5; ai++) {
 
  558       std::cout<<
"helixparams["<<ai<<
"]="<<helixparams[ai]<<std::endl;
 
  565     jacobian[0][0] = Q*xc/RC; 
 
  566     jacobian[0][1] = Q*yc/RC; 
 
  568     jacobian[0][3] = Q*(yc/(qBc*RC)-TMath::Sign(pti,R0)*px/qBc); 
 
  569     jacobian[0][4] = Q*(-xc/(qBc*RC)-TMath::Sign(pti,R0)*py/qBc); 
 
  573     jacobian[1][0] = -pz*yc/(RCsq*qBc); 
 
  574     jacobian[1][1] = pz*xc/(RCsq*qBc); 
 
  576     jacobian[1][3] = (py*pti*pti + xc/(qBc*RCsq))*pz/qBc; 
 
  577     jacobian[1][4] = -(px*pti*pti - yc/(qBc*RCsq))*pz/qBc; 
 
  578     jacobian[1][5] = -(phip-
phi0)/qBc; 
 
  585     jacobian[2][3] = px*pz*pti*p2i; 
 
  586     jacobian[2][4] = py*pz*pti*p2i; 
 
  587     jacobian[2][5] = -pt*p2i; 
 
  591     jacobian[3][0] = -yc/(RCsq); 
 
  592     jacobian[3][1] = xc/(RCsq); 
 
  594     jacobian[3][3] = xc/(RCsq*qBc); 
 
  595     jacobian[3][4] = yc/(RCsq*qBc); 
 
  602     jacobian[4][3] = -rho*px*pti*pti; 
 
  603     jacobian[4][4] = -rho*py*pti*pti; 
 
  610   TMatrixD tempmat(jacobian,TMatrixD::kMult,cov77);
 
  611   TMatrixD covrho(tempmat,TMatrixD::kMultTranspose,jacobian);
 
  615     std::cout<<
"cov77: ";
 
  618     std::cout<<
"jacobian: ";
 
  622     std::cout<<
"covrho (epsilon,Z0,Theta,Phi0,rho): ";
 
  624     std::cout<<
"helixparams[0] = epsilon\t= ("<<helixparams[0]<<
" \t+- "<<
sqrt(helixCov[0][0])<<
") cm"<<std::endl;
 
  625     std::cout<<
"helixparams[1] = Z0 \t= ("<<helixparams[1]<<
" \t+- "<<
sqrt(helixCov[1][1])<<
") cm"<<std::endl;
 
  626     std::cout<<
"helixparams[2] = Theta \t= ("<<helixparams[2]<<
" \t+- "<<
sqrt(helixCov[2][2])<<
") rad"<<std::endl;
 
  627     std::cout<<
"helixparams[3] = Phi0 \t= ("<<helixparams[3]<<
" \t+- "<<
sqrt(helixCov[3][3])<<
") rad"<<std::endl;
 
  628     std::cout<<
"helixparams[4] = rho\t= ("<<helixparams[4]<<
" \t+- "<<
sqrt(helixCov[4][4])<<
") 1/cm"<<std::endl;
 
printf("RealTime=%f seconds, CpuTime=%f seconds\n", rtime, ctime)
friend F32vec4 cos(const F32vec4 &a)
friend F32vec4 sqrt(const F32vec4 &a)
static T Sqrt(const T &x)
friend F32vec4 sin(const F32vec4 &a)
TString pt(TString pts, TString exts="px py pz")
static T ATan2(const T &y, const T &x)
TString tht(TString pts, TString exts="px py pz")
friend F32vec4 fabs(const F32vec4 &a)
TMatrixT< double > TMatrixD