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
00196
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
00220
00221
00222
00223
00224
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 }