BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
VertexFitRefine.cxx
Go to the documentation of this file.
1/* <===<===<===<===<===<===<===<===<===~===>===>===>===>===>===>===>===>===>
2 * File Name: VertexFitRefine.cxx
3 * Author: Hao-Kai SUN
4 * Created: 2021-09-08 Wed 00:15:40 CST
5 * <<=====================================>>
6 * Last Updated: 2023-09-29 Thu 14:35:11 CST
7 * By: Hao-Kai SUN
8 * Update #: 153
9 * ============================== CODES ==============================>>> */
10#include "VertexFitRefine/VertexFitRefine.h"
11
12namespace VTXPDGM {
13 const double& electron = 0.0005109989461;
14 const double& muon = 0.1056583745;
15 const double& pion = 0.13957039;
16 const double& kaon = 0.493677;
17 const double& proton = 0.938272081;
18
19 const double empikp[5] = { electron, muon, pion, kaon, proton };
20 const double empikp2[5] = { electron * electron, muon* muon, pion* pion, kaon* kaon,
21 proton* proton };
22} // namespace VTXPDGM
23
24VertexFitRefine* VertexFitRefine::m_instance = nullptr;
25
26// const double VertexFitRefine::beampipe = 3.111;
27const double VertexFitRefine::obeampipe = 3.370; // + 0.0130 * 1;
28// 6.3000 + 0.0130*3 cm inner mdc chamber wall
29// const double VertexFitRefine::innerwall = 6.290 - 0.0130 * 1;
30// const double VertexFitRefine::oinnerwall = 6.425 + 0.0130 * 1;
31
32VertexFitRefine::VertexFitRefine() {}
33
34VertexFitRefine* VertexFitRefine::instance() {
35 if ( m_instance == nullptr ) m_instance = new VertexFitRefine();
36 return m_instance;
37}
38
40 m_trkIdxOrigin.clear();
41 m_tracksOrigin.clear();
42 m_trkPidOrigin.clear();
43 m_wtrkInfit.clear();
44 m_p4Infit.clear();
45 m_x3Infit.clear();
46 m_helices.clear();
47 vtxfit = VertexFit::instance();
48 vtxfit->init();
50 m_vtxsOrigin.clear();
51 thePath = 0;
52}
53
55
56void VertexFitRefine::AddTrack( const int index, const WTrackParameter wtrk ) {
57 m_trkIdxOrigin.push_back( index );
58 m_tracksOrigin.push_back( nullptr );
59 m_trkPidOrigin.push_back( RecMdcKalTrack::null );
60 int idx = m_trkIdxOrigin.size() - 1;
61 if ( index != idx )
62 {
63 std::cerr << "TrackPool: wrong track index " << index << ", " << m_trkIdxOrigin.size()
64 << std::endl;
65 }
66
67 m_tracksOrigin[idx]->setPidType( m_trkPidOrigin[idx] );
68 m_wtrkInfit.push_back( wtrk );
69 m_helices.push_back( HepVector( 5, 0 ) );
70 vtxfit->AddTrack( m_trkIdxOrigin[idx], m_wtrkInfit[idx] );
71}
72
73void VertexFitRefine::AddTrack( const int index, RecMdcKalTrack* p,
74 const RecMdcKalTrack::PidType pid ) {
75 m_trkIdxOrigin.push_back( index );
76 m_tracksOrigin.push_back( p );
77 m_trkPidOrigin.push_back( pid );
78 int idx = m_trkIdxOrigin.size() - 1;
79 if ( index != idx )
80 {
81 std::cerr << "TrackPool: wrong track index " << index << ", " << m_trkIdxOrigin.size()
82 << std::endl;
83 }
84
85 m_tracksOrigin[idx]->setPidType( m_trkPidOrigin[idx] );
86 m_wtrkInfit.push_back( WTrackParameter( VTXPDGM::empikp[m_trkPidOrigin[idx]],
87 m_tracksOrigin[idx]->helix(),
88 m_tracksOrigin[idx]->err() ) );
89 vtxfit->AddTrack( m_trkIdxOrigin[idx], m_wtrkInfit[idx] );
90}
91
93 HepPoint3D vx( 0.0, 0.0, 0.0 );
94
95 for ( uint i = 0; i != m_trkIdxOrigin.size(); ++i )
96 {
97 m_p4Infit.push_back( m_wtrkInfit[i].p() );
98 m_x3Infit.push_back( m_wtrkInfit[i].x() );
99 }
100
101 //// setup the initial vertex
102 HepPoint3D vWideVertex( 0., 0., 0. );
103
104 HepSymMatrix evWideVertex( 3, 0 );
105 evWideVertex[0][0] = 1.0E12;
106 evWideVertex[1][1] = 1.0E12;
107 evWideVertex[2][2] = 1.0E12;
108
109 VertexParameter wideVertex;
110 wideVertex.setVx( vWideVertex );
111 wideVertex.setEvx( evWideVertex );
112
113 if ( vtxfit->m_vpar_infit.size() == 0 )
114 {
115 std::cerr << "Not set Vertex?" << std::endl;
116 return false;
117 }
118
119 HepPoint3D ZDP = vtxfit->vx( 0 );
120 HepPoint3D ZDPE = HepPoint3D( 9999.9, 9999.9, 9999.9 );
121 bool ZFit = false;
122 HepVector ZVx = vtxfit->Vx( 0 );
123 HepSymMatrix ZEVx = evWideVertex;
124
125 //// do the fit
126 if ( vtxfit->Fit( 0 ) )
127 {
128 vtxfit->Swim( 0 );
129 vtxfit->BuildVirtualParticle( 0 );
130
131 for ( uint i = 0; i != m_trkIdxOrigin.size(); ++i )
132 {
133 m_p4Infit[i] = vtxfit->pfit( i );
134 m_x3Infit[i] = vtxfit->xfit( i );
135 }
136
137 ZDP = vtxfit->vx( 0 );
138 ZVx = vtxfit->Vx( 0 );
139 ZEVx = vtxfit->Evx( 0 );
140 ZDPE.set( vtxfit->errorVx( 0, 0 ), vtxfit->errorVx( 0, 1 ), vtxfit->errorVx( 0, 2 ) );
141 ZFit = true;
142 }
143
144 if ( ZFit )
145 {
146 if ( ZDP.perp() > obeampipe )
147 {
148 //// initialize the fitter
149 vtxfit->init();
150
151 for ( uint i = 0; i != m_trkIdxOrigin.size(); ++i )
152 {
153 m_tracksOrigin[i]->setPidType( m_trkPidOrigin[i] );
154 if ( m_trkPidOrigin[i] != RecMdcKalTrack::null )
155 {
156 m_wtrkInfit[i] =
157 WTrackParameter( VTXPDGM::empikp[m_trkPidOrigin[i]], m_tracksOrigin[i]->fhelix(),
158 m_tracksOrigin[i]->ferr() );
159 }
160 vtxfit->AddTrack( i, m_wtrkInfit[i] );
161 }
162
163 wideVertex.setVx( ZVx );
164 // wideVertex.setEvx(ZEVx * 25.0); // 5 * sigma square, not good
165 wideVertex.setEvx( evWideVertex );
166
167 //// add the daughters
168 vtxfit->AddVertex( 0, wideVertex, m_trkIdxOrigin );
169 //// do the fit
170 if ( vtxfit->Fit( 0 ) )
171 {
172 vtxfit->Swim( 0 );
173 vtxfit->BuildVirtualParticle( 0 );
174 vx = vtxfit->vx( 0 );
175 ZVx = vtxfit->Vx( 0 );
176 ZEVx = vtxfit->Evx( 0 );
177 thePath = 3;
178 }
179 else
180 {
181 vx = ZDP;
182 thePath = 2;
183 }
184 }
185 else
186 {
187 vx = ZDP;
188 thePath = 1;
189 }
190 }
191 else
192 { // initial ZFit failed.
193 //// initialize the fitter
194 vtxfit->init();
195
196 for ( uint i = 0; i != m_trkIdxOrigin.size(); ++i )
197 {
198 m_tracksOrigin[i]->setPidType( m_trkPidOrigin[i] );
199 if ( m_trkPidOrigin[i] != RecMdcKalTrack::null )
200 {
201 m_wtrkInfit[i] =
202 WTrackParameter( VTXPDGM::empikp[m_trkPidOrigin[i]], m_tracksOrigin[i]->fhelix(),
203 m_tracksOrigin[i]->ferr() );
204 }
205 vtxfit->AddTrack( i, m_wtrkInfit[i] );
206 }
207
208 if ( vtxfit->Fit( 0 ) )
209 {
210 vtxfit->Swim( 0 );
211 vtxfit->BuildVirtualParticle( 0 );
212 vx = vtxfit->vx( 0 );
213 ZVx = vtxfit->Vx( 0 );
214 ZEVx = vtxfit->Evx( 0 );
215 thePath = 4;
216 }
217 else
218 {
219 thePath = 5;
220 return false;
221 }
222 }
223 //// initialize the fitter
224 vtxfit->init();
225
226 for ( uint i = 0; i != m_trkIdxOrigin.size(); ++i )
227 {
228 m_tracksOrigin[i]->setPidType( m_trkPidOrigin[i] );
229 if ( m_trkPidOrigin[i] != RecMdcKalTrack::null )
230 {
231 vtxext->KalFitExt( vx, m_tracksOrigin[i], m_trkPidOrigin[i] );
232 m_wtrkInfit[i] = WTrackParameter( VTXPDGM::empikp[m_trkPidOrigin[i]],
233 vtxext->getHelixVector(), vtxext->getErrorMatrix() );
234 }
235 m_p4Infit[i] = m_wtrkInfit[i].p();
236 m_x3Infit[i] = m_wtrkInfit[i].x();
237
238 vtxfit->AddTrack( i, m_wtrkInfit[i] );
239 }
240
241 wideVertex.setVx( vx );
242 // wideVertex.setEvx(ZEVx * 25.0); // 5 * sigma square, not good, why?
243 wideVertex.setEvx( evWideVertex );
244 //// add the daughters
245 vtxfit->AddVertex( 0, wideVertex, m_trkIdxOrigin );
246
247 //// do the fit
248 if ( vtxfit->Fit( 0 ) )
249 {
250 vtxfit->Swim( 0 );
251 vtxfit->BuildVirtualParticle( 0 );
252 }
253 else { thePath = 6; }
254
255 return true;
256}
257
258/* ===================================================================<<< */
259/* =================== VertexFitRefine.cxx ends here ==================== */
HepGeom::Point3D< double > HepPoint3D
Double_t x[10]
static VertexExtrapolate * instance()
void AddTrack(const int index, RecMdcKalTrack *p, const RecMdcKalTrack::PidType pid)
static VertexFitRefine * instance()
static VertexFit * instance()
Definition VertexFit.cxx:15
const double & electron
const double & muon
const double & kaon
const double empikp[5]
const double & pion
const double empikp2[5]
const double & proton