00001
00003
00004
00005
00007
00008 #include <cmath>
00009 #include "tmb_tree/TMBSecondaryVertex.hpp"
00010
00011 using std::sqrt;
00012 using std::abs;
00013
00014 ClassImp(TMBSecondaryVertex);
00015
00016
00017
00018 TMBSecondaryVertex::TMBSecondaryVertex()
00019 {}
00020
00021
00022
00023 TMBSecondaryVertex::
00024 TMBSecondaryVertex(Float_t vertexx, Float_t vertexy, Float_t vertexz,
00025 Float_t covxx, Float_t covyy, Float_t covzz,
00026 Float_t covxy, Float_t covxz, Float_t covyz,
00027 Float_t chisq, const TRefArray* tracks,
00028 const TMBLorentzVector& smoothed_momentum,
00029 const TRef& primary_vertex) :
00030 TMBVertex(vertexx, vertexy, vertexz,
00031 covxx, covyy, covzz,
00032 covxy, covxz, covyz,
00033 chisq, tracks),
00034 _primary_vertex(primary_vertex)
00035 {
00036 *static_cast<TMBLorentzVector*>(this) = smoothed_momentum;
00037 }
00038
00039
00040
00041 void TMBSecondaryVertex::fill_pv_attributes() const
00042 {
00043 if(_pv_pos.empty()) {
00044
00045
00046
00047 assert(_primary_vertex.IsValid());
00048 const TMBPrimaryVertex& pv = GetPrimaryVertex();
00049
00050 _pv_pos.resize(3);
00051 _pv_pos[0] = pv.vx();
00052 _pv_pos[1] = pv.vy();
00053 _pv_pos[2] = pv.vz();
00054
00055 _pv_err.resize(6);
00056 _pv_err[0] = pv.sigxx();
00057 _pv_err[1] = pv.sigxy();
00058 _pv_err[2] = pv.sigyy();
00059 _pv_err[3] = pv.sigxz();
00060 _pv_err[4] = pv.sigyz();
00061 _pv_err[5] = pv.sigzz();
00062
00063
00064
00065 double dx = vx() - _pv_pos[0];
00066 double dy = vy() - _pv_pos[1];
00067 double dz = vz() - _pv_pos[2];
00068
00069 double exx = sigxx() + _pv_err[0];
00070 double exy = sigxy() + _pv_err[1];
00071 double eyy = sigyy() + _pv_err[2];
00072 double exz = sigxz() + _pv_err[3];
00073 double eyz = sigyz() + _pv_err[4];
00074 double ezz = sigzz() + _pv_err[5];
00075
00076
00077
00078 double dxy2 = dx*dx + dy*dy;
00079 _decay_len_xy = sqrt(dxy2);
00080 _decay_len_z = dz;
00081 double dxyz2 = dxy2 + dz*dz;
00082 _decay_len_xyz = sqrt(dxyz2);
00083
00084
00085
00086 _decay_sig_xy = 0.;
00087 double bxy2 = exx*eyy - exy*exy;
00088 if(bxy2 > 0) {
00089 double axy2 = dx*dx*eyy - 2.*dx*dy*exy + dy*dy*exx;
00090 _decay_sig_xy = sqrt(axy2 / bxy2);
00091 }
00092
00093
00094
00095 _decay_sig_z = abs(dz) / sqrt(ezz);
00096
00097
00098
00099 _decay_sig_xyz = 0.;
00100 double bxyz2 =
00101 exx*eyy*ezz + 2.*exy*eyz*exz - exx*eyz*eyz - eyy*exz*exz - ezz*exy*exy;
00102 if(bxyz2 > 0) {
00103 double axyz2 =
00104 dx*dx * (eyy*ezz - eyz*eyz)
00105 + dy*dy * (exx*ezz - exz*exz)
00106 + dz*dz * (exx*eyy - exy*exy)
00107 + 2.*dx*dy * (exz*eyz - ezz*exy)
00108 + 2.*dx*dz * (exy*eyz - eyy*exz)
00109 + 2.*dy*dz * (exy*exz - exx*eyz);
00110 _decay_sig_xyz = sqrt(axyz2 / bxyz2);
00111 }
00112
00113
00114
00115 double p_dot_d = dx*Px() + dy*Py() + dz*Pz();
00116 _colinearity = p_dot_d / (P() * _decay_len_xyz);
00117
00118
00119
00120
00121 if(_colinearity < 0) {
00122 _decay_len_xy = -_decay_len_xy;
00123 _decay_len_xyz = -_decay_len_xyz;
00124 }
00125 }
00126 }