• Main Page
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

/Users/jmonk/Physics/ForIA/src/Track.cxx

Go to the documentation of this file.
00001 #include "ForIA/Track.hh"
00002 
00003 #include <gsl/gsl_cdf.h>
00004 
00005 #include <cmath>
00006 #include <stdexcept>
00007 
00008 namespace ForIA{
00009  
00010   Track::Track(): IFourMomentum(), m_gotChi2_dof(false), m_gotProbability(false), 
00011   m_author(BAD_AUTHOR),
00012   m_doE(true), m_isMC(false), 
00013   m_haveThetaOrigins(false), m_haveTV(false),
00014   m_haveMatchedVertices(false){
00015     
00016   }
00018   double Track::eta() const{
00019     return m_eta;
00020   }
00021   
00023   double Track::theta(Origin org) const{
00024     
00025     switch(org){
00026       case ORIGIN:
00027         return m_theta;
00028         break;
00029       case BEAM_SPOT:
00030         if(!m_haveThetaOrigins){
00031           throw std::runtime_error("Track: Do not have information on theta relative to beam spot!");
00032         }
00033         return m_theta_wrt_bs;
00034         break;
00035       case PRIMARY_VERTEX:
00036         
00037         if(m_haveThetaOrigins){
00038           return m_theta_wrt_pvtx;
00039         }else{
00040           return m_theta;
00041         }
00042         
00043         break;
00044         
00045       case TRACK_VERTEX:
00046         if(!m_haveTV){
00047           throw std::runtime_error("Track: Do not have information on associated vertex!");
00048         }
00049         return m_theta_wrt_tv;
00050         break;
00051     }
00052     
00053     return m_theta;
00054   }
00055   
00057   double Track::theta()const{
00058     return theta(PRIMARY_VERTEX);
00059   }
00060   
00062   double Track::phi(Origin org) const{
00063     
00064     switch(org){
00065       case ORIGIN:
00066         return m_phi;
00067         break;
00068       case BEAM_SPOT:
00069         return m_phi_wrt_bs;
00070         break;
00071       case PRIMARY_VERTEX:
00072         return m_phi_wrt_pvtx;
00073         break;
00074         
00075       case TRACK_VERTEX:
00076         if(!m_haveTV){
00077           throw std::runtime_error("Track: Do not have information on associated vertex!");
00078         }
00079         return m_phi_wrt_tv;
00080         break;
00081 
00082     }
00083     return m_phi;
00084   }
00085   
00087   double Track::phi()const{
00088     return phi(PRIMARY_VERTEX);
00089   }
00090   
00092   double Track::ET() const{
00093     return m_PT;
00094   }
00095   
00097   double Track::E() const{
00098     if(!m_doE) return m_e;
00099     m_e =  ET() / fabs(cos(theta()));
00100     m_doE = false;
00101     return m_e;
00102   }
00103   
00105   double Track::PT() const{
00106     return m_PT;
00107   }
00108   
00110   double Track::px(Origin org) const{
00111     return PT() * sin(phi(org));
00112   }
00113   
00115   double Track::py(Origin org)const{
00116     return PT() * cos(phi(org));
00117   }
00118   
00120   double Track::pz(Origin org) const{
00121     double tanp = tan(theta(org));
00122     if(fabs(tanp) < 1.e-12){
00123       std::cout<<"Warning: treating track as massless"<<std::endl;
00124       return E();
00125     }
00126     
00127     return PT() / tanp;
00128   }
00129   
00131   double Track::px()const{
00132     return px(PRIMARY_VERTEX);
00133   }
00134   
00136   double Track::py()const{
00137     return py(PRIMARY_VERTEX);
00138   }
00139   
00141   double Track::pz()const{
00142     return pz(PRIMARY_VERTEX);
00143   }
00145   double Track::d0(Origin org) const{
00146     
00147     switch(org){
00148       case ORIGIN:
00149         return m_d0;
00150         break;
00151       case BEAM_SPOT:
00152         return m_d0_wrt_bs;
00153         break;
00154       case PRIMARY_VERTEX:
00155         return m_d0_wrt_pvtx;
00156         break;
00157       case TRACK_VERTEX:
00158         if(!m_haveTV){
00159           throw std::runtime_error("Track: Do not have information on associated vertex!");
00160         }
00161         return m_d0_wrt_tv;
00162         break;
00163     }
00164     
00165     return m_d0;
00166   }
00167   
00169   double Track::z0(Origin org) const{
00170     
00171     switch(org){
00172       case ORIGIN:
00173         return m_z0;
00174         break;
00175       case BEAM_SPOT:
00176         return m_z0_wrt_bs;
00177         break;
00178       case PRIMARY_VERTEX:
00179         return m_z0_wrt_pvtx;
00180         break;
00181       case TRACK_VERTEX:
00182         if(!m_haveTV){
00183           throw std::runtime_error("Track: Do not have information on associated vertex!");
00184         }
00185         return m_z0_wrt_tv;
00186         break;
00187     }
00188     
00189     return m_z0;
00190   }
00191   
00193   double Track::chi2()const{
00194     
00195     // fudge factor of 1.3 to account between track hit error estimate differences
00196     // between MC and data
00197     if(isMC()) return m_chi2 * 1.3;
00198     
00199     return m_chi2;
00200   }
00201   
00203   int Track::DOF()const{
00204     return m_dof;
00205   }
00206   
00208   double Track::chi2_DOF()const{
00209     if(m_gotChi2_dof) return m_chi2_dof;
00210     m_chi2_dof = chi2() / ((double)m_dof);
00211     m_gotChi2_dof = true;
00212     return m_chi2_dof;
00213   }
00214   
00216   double Track::fitProbability()const{
00217     if(m_gotProbability) return m_probability;
00218     
00219     // see:
00220     //  http://www.gnu.org/software/gsl/manual/html_node/The-Chi_002dsquared-Distribution.html
00221     //  http://mathworld.wolfram.com/Chi-SquaredDistribution.html
00222     
00223     // this function is the integral of the chi^2 probability density above the given value
00224     // i.e. it is the probability thst the chi^2 is equal to or larger than the given value
00225     m_probability = gsl_cdf_chisq_Q(chi2(), (double)m_dof);
00226     
00227     m_gotProbability = true;
00228     return m_probability;
00229   }
00230   
00232   int Track::nPix() const{
00233     return m_nPix;
00234   }
00235   
00237   int Track::nSCT() const{
00238     return m_nSCT;
00239   }
00240   
00242   int Track::nTRT()const{
00243     return m_nTRT;
00244   }
00245   
00247   bool Track::expectBLayer()const{
00248     return m_expectBLayer;
00249   }
00250   
00252   int Track::nBLayer()const{
00253     return m_nBLayer;
00254   }
00255   
00257   Track::TrackAuthor Track::author()const{
00258     return m_author;
00259   }
00260   
00262   bool Track::isMC()const{
00263     return m_isMC;
00264   }
00265   
00267   int Track::id()const{
00268     return m_id;
00269   }
00270   
00272   VertexVector Track::associatedVertices()const{
00273     
00274     if(m_haveMatchedVertices) return VertexVector(m_vertices.begin(), m_vertices.end());
00275     m_event->matchVerticesToTracks();
00276     
00277     return VertexVector(m_vertices.begin(), m_vertices.end());
00278   }
00279   
00281   std::ostream &operator << (std::ostream &out, const Track &trk){
00282     out<<"Track: { PT: "<<trk.m_PT<<", eta: "<<trk.m_eta<<", phi: "<<trk.m_phi;
00283     out<<", d0: "<<trk.m_d0<<", z0: "<<trk.m_z0;
00284     out<<", #Pix: "<<trk.m_nPix<<", #SCT: "<<trk.m_nSCT<<"}";
00285     return out;
00286   }
00287 }

Generated on Mon Jul 30 2012 16:56:35 for ForIA by  doxygen 1.7.2