00001 #include "VertexFit/VertexConstraints.h"
00002 #include "VertexFit/TrackPool.h"
00003 #include "VertexFit/BField.h"
00004
00005 const double VertexConstraints :: Alpha = -0.00299792458;
00006 const int VertexConstraints::FixedVertex = 1;
00007 const int VertexConstraints::CommonVertex = 2;
00008
00009 VertexConstraints::VertexConstraints()
00010 {
00011 m_Ec.clear();
00012 m_Dc.clear();
00013 m_dc.clear();
00014 m_VD.clear();
00015 m_EVDE.clear();
00016 m_lambda0.clear();
00017 m_lambda.clear();
00018 m_covax.clear();
00019 m_ltrk.clear();
00020 m_type = 0;
00021 }
00022
00023 void VertexConstraints::CommonVertexConstraints(std::vector<int> tlis)
00024 {
00025 m_ltrk = tlis;
00026 setType(commonVertex());
00027 }
00028
00029 void VertexConstraints::FixedVertexConstraints(std::vector<int> tlis)
00030 {
00031 m_ltrk = tlis;
00032 setType(fixedVertex());
00033 }
00034
00035 void VertexConstraints::UpdateConstraints(VertexParameter vpar, std::vector<WTrackParameter> wlis)
00036 {
00037 m_Ec.clear();
00038 m_Dc.clear();
00039 m_dc.clear();
00040 m_VD.clear();
00041 m_EVDE.clear();
00042 m_lambda0.clear();
00043 m_lambda.clear();
00044 m_covax.clear();
00045
00046 switch(m_type)
00047 {
00048 case FixedVertex:
00049 {
00050 WTrackParameter wtrk;
00051 for (unsigned int i = 0; i < wlis.size(); i++)
00052 {
00053 wtrk = wlis[i];
00054 HepLorentzVector p = wtrk.p();
00055 HepPoint3D x = wtrk.x();
00056 HepPoint3D delx = vpar.vx() - x;
00057
00058 double afield = VertexFitBField::instance()->getCBz(vpar.Vx(), wtrk.X());
00059 double a = afield * (0.0+wtrk.charge());
00060 double J = a * (delx.x()*p.px() + delx.y()*p.py())/p.perp2();
00061
00062 J = std::min(J, 1-1e-4);
00063 J = std::max(J, -1+1e-4);
00064 double Rx = delx.x() - 2*p.px() * (delx.x()*p.px() + delx.y()*p.py()) / p.perp2();
00065 double Ry = delx.y() - 2*p.py() * (delx.x()*p.px() + delx.y()*p.py()) / p.perp2();
00066 double S = 1.0/sqrt(1-J*J)/p.perp2();
00067
00068
00069 HepVector dc(2, 0);
00070 dc[0] = delx.y() * p.px() - delx.x() * p.py() - 0.5 * a * (delx.x() * delx.x() + delx.y() * delx.y());
00071 dc[1] = delx.z() - p.pz()/a*asin(J);
00072 m_dc.push_back(dc);
00073
00074 HepMatrix Ec(2, 3, 0);
00075 m_Ec.push_back(Ec);
00076
00077 HepMatrix Dc(2, 6, 0);
00078 Dc[0][0] = delx.y();
00079 Dc[0][1] = -delx.x();
00080 Dc[0][2] = 0;
00081 Dc[0][3] = p.py() + a * delx.x();
00082 Dc[0][4] = -p.px() + a * delx.y();
00083 Dc[0][5] = 0;
00084 Dc[1][0] = -p.pz() * S * Rx;
00085 Dc[1][1] = -p.pz() * S * Ry;
00086 Dc[1][2] = - asin(J) / a;
00087 Dc[1][3] = p.px() * p.pz() * S;
00088 Dc[1][4] = p.py() * p.pz() * S;
00089 Dc[1][5] = -1.0;
00090 m_Dc.push_back(Dc);
00091
00092 HepSymMatrix VD(2, 0);
00093
00094
00095 m_VD.push_back(VD);
00096
00097 HepSymMatrix EVDE(3, 0);
00098 m_EVDE.push_back(EVDE);
00099
00100 HepVector lambda0(2, 0);
00101 m_lambda0.push_back(lambda0);
00102
00103 HepVector lambda(2, 0);
00104 m_lambda.push_back(lambda);
00105
00106 HepMatrix covax(6, 3, 0);
00107 m_covax.push_back(covax);
00108 break;
00109 }
00110 }
00111 case CommonVertex:
00112 default:
00113 {
00114 WTrackParameter wtrk;
00115 for (unsigned int i = 0; i < wlis.size(); i++)
00116 {
00117 wtrk = wlis[i];
00118 HepLorentzVector p = wtrk.p();
00119 HepPoint3D x = wtrk.x();
00120 HepPoint3D delx = vpar.vx() - x;
00121 if (wtrk.charge() == 0)
00122 {
00123
00124 HepVector dc(2,0);
00125 dc[0] = p.pz()*delx.x() - p.px()*delx.z();
00126 dc[1] = p.pz()*delx.y() - p.py()*delx.z();
00127 m_dc.push_back(dc);
00128
00129 HepMatrix Ec(2,3,0);
00130 Ec[0][0] = p.pz();
00131 Ec[0][1] = 0;
00132 Ec[0][2] = -p.px();
00133 Ec[1][0] = 0;
00134 Ec[1][1] = p.pz();
00135 Ec[1][2] = -p.py();
00136 m_Ec.push_back(Ec);
00137
00138 HepMatrix Dc(2,6,0);
00139 Dc[0][0] = -delx.z();
00140 Dc[0][1] = 0;
00141 Dc[0][2] = delx.x();
00142 Dc[0][3] = -p.pz();
00143 Dc[0][4] = 0;
00144 Dc[0][5] = p.px();
00145 Dc[1][0] = 0;
00146 Dc[1][1] = -delx.z();
00147 Dc[1][2] = delx.y();
00148 Dc[1][3] = 0;
00149 Dc[1][4] = -p.pz();
00150 Dc[1][5] = p.py();
00151 m_Dc.push_back(Dc);
00152 }
00153 else
00154 {
00155 double afield = VertexFitBField::instance()->getCBz(vpar.Vx(), wtrk.X());
00156 double a = afield * (0.0+wtrk.charge());
00157 double J = a * (delx.x()*p.px() + delx.y()*p.py())/p.perp2();
00158 J = std::min(J, 1-1e-4);
00159 J = std::max(J, -1+1e-4);
00160 double Rx = delx.x() - 2*p.px() * (delx.x()*p.px() + delx.y()*p.py()) / p.perp2();
00161 double Ry = delx.y() - 2*p.py() * (delx.x()*p.px() + delx.y()*p.py()) / p.perp2();
00162 double S = 1.0/sqrt(1-J*J)/p.perp2();
00163
00164 HepVector dc(2, 0);
00165 dc[0] = delx.y() * p.px() - delx.x() * p.py() - 0.5 * a * (delx.x() * delx.x() + delx.y() * delx.y());
00166 dc[1] = delx.z() - p.pz()/a*asin(J);
00167 m_dc.push_back(dc);
00168
00169 HepMatrix Ec(2, 3, 0);
00170 Ec[0][0] = -p.py()- a * delx.x();
00171 Ec[0][1] = p.px() - a * delx.y();
00172 Ec[0][2] = 0;
00173 Ec[1][0] = -p.px() * p.pz() * S ;
00174 Ec[1][1] = -p.py() * p.pz() * S ;
00175 Ec[1][2] = 1.0;
00176 m_Ec.push_back(Ec);
00177
00178 HepMatrix Dc(2, 6, 0);
00179 Dc[0][0] = delx.y();
00180 Dc[0][1] = -delx.x();
00181 Dc[0][2] = 0;
00182 Dc[0][3] = p.py() + a * delx.x();
00183 Dc[0][4] = -p.px() + a * delx.y();
00184 Dc[0][5] = 0;
00185 Dc[1][0] = -p.pz() * S * Rx;
00186 Dc[1][1] = -p.pz() * S * Ry;
00187 Dc[1][2] = - asin(J) / a;
00188 Dc[1][3] = p.px() * p.pz() * S;
00189 Dc[1][4] = p.py() * p.pz() * S;
00190 Dc[1][5] = -1.0;
00191 m_Dc.push_back(Dc);
00192 }
00193
00194 HepSymMatrix VD(2, 0);
00195 m_VD.push_back(VD);
00196
00197 HepSymMatrix EVDE(3, 0);
00198 m_EVDE.push_back(EVDE);
00199
00200 HepVector lambda0(2, 0);
00201 m_lambda0.push_back(lambda0);
00202
00203 HepVector lambda(2, 0);
00204 m_lambda.push_back(lambda);
00205
00206 HepMatrix covax(6, 3, 0);
00207 m_covax.push_back(covax);
00208 }
00209 break;
00210 }
00211 }
00212 }
00213
00214