BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
PrimaryVertex.cxx
Go to the documentation of this file.
1#include "CLHEP/Geometry/Point3D.h"
2#include "CLHEP/Vector/LorentzVector.h"
3#ifndef ENABLE_BACKWARDS_COMPATIBILITY
4typedef HepGeom::Point3D<double> HepPoint3D;
5#endif
6#include "EventModel/Event.h"
7#include "EventModel/EventHeader.h"
8#include "EventModel/EventModel.h"
9#include "EvtRecEvent/EvtRecEvent.h"
10#include "EvtRecEvent/EvtRecPrimaryVertex.h"
11#include "EvtRecEvent/EvtRecTrack.h"
12#include "GaudiKernel/IDataManagerSvc.h"
13#include "GaudiKernel/MsgStream.h"
14#include "GaudiKernel/SmartDataPtr.h"
15#include "ParticleID/ParticleID.h"
16#include "PrimaryVertex.h"
17#include "VertexFit/BField.h"
18#include "VertexFit/FastVertexFit.h"
19#include "VertexFit/HTrackParameter.h"
20#include "VertexFit/KalmanVertexFit.h"
21#include "VertexFit/KinematicFit.h"
22#include "VertexFit/VertexFit.h"
23
24#include "TF1.h"
25#include "TH1D.h"
26#include "TH2D.h"
27#include "TMath.h"
28#include <assert.h>
29#include <fstream>
30#include <iostream>
31#include <map>
32
33using CLHEP::HepLorentzVector;
34using namespace std;
35
36const double xmass[5] = { 0.000511, 0.105658, 0.139570, 0.493677, 0.938272 }; // GeV
37const double ecms = 3.097;
38const double mpi0 = 0.134976;
39const double momega = 0.78265;
40
41typedef std::vector<int> Vint;
42typedef std::vector<HepLorentzVector> Vp4;
43
45//*******************************************************************************
46PrimaryVertex::PrimaryVertex( const std::string& name, ISvcLocator* pSvcLocator )
47 : Algorithm( name, pSvcLocator ) {
48 // Declare the properties
49 declareProperty( "Output", m_output = 0 );
50 declareProperty( "TrackNumberCut", m_trackNumberCut = 1 );
51 declareProperty( "CosThetaCut", m_cosThetaCut = 0.93 );
52 declareProperty( "Vz0Cut", m_vz0Cut = 40.0 );
53 // fit Method
54 declareProperty( "FitMethod", m_fitMethod = 0 );
55 // for global method
56 declareProperty( "Chi2CutOfGlobal", m_globalChisqCut = 200.0 );
57
58 // for Kalman method
59 declareProperty( "ChisqCut", m_chisqCut = 200.0 );
60 declareProperty( "TrackIteration", m_trackIteration = 5 );
61 declareProperty( "VertexIteration", m_vertexIteration = 5 );
62 declareProperty( "Chi2CutforTrkIter", m_chi2CutforTrkIter = 0.1 );
63 declareProperty( "FreedomCut", m_freedomCut = 1 );
64 declareProperty( "Chi2CutforSmooth", m_chi2CutforSmooth = 200.0 );
65 // declareProperty("MinDistance", m_minDistance = 100.0);
66 // declareProperty("MinPointX", m_minPointX = 0.1);
67 // declareProperty("MinPointY", m_minPointY = 0.1);
68}
69
70//*******************************************************************************
72 MsgStream log( msgSvc(), name() );
73 log << MSG::INFO << "in initialize()" << endmsg;
74
75 for ( int i = 0; i < 15; i++ ) { m_sel_number[i] = 0; }
76
77 StatusCode status;
78
79 if ( m_output == 1 )
80 {
81 NTuplePtr nt1( ntupleSvc(), "FILE999/glbvtx" );
82 if ( nt1 ) m_tuple1 = nt1;
83 else
84 {
85 m_tuple1 = ntupleSvc()->book( "FILE999/glbvtx", CLID_ColumnWiseTuple, "global vertex" );
86 if ( m_tuple1 )
87 {
88 status = m_tuple1->addItem( "gvx", m_gvx );
89 status = m_tuple1->addItem( "gvy", m_gvy );
90 status = m_tuple1->addItem( "gvz", m_gvz );
91 status = m_tuple1->addItem( "chig", m_chig );
92 status = m_tuple1->addItem( "ndofg", m_ndofg );
93 status = m_tuple1->addItem( "probg", m_probg );
94 }
95 else
96 {
97 log << MSG::ERROR << "Cannot book N-tuple:" << long( m_tuple1 ) << endmsg;
98 return StatusCode::FAILURE;
99 }
100 }
101
102 NTuplePtr nt2( ntupleSvc(), "FILE999/chisq" ); // chisq of Kalman filter
103 if ( nt2 ) m_tuple2 = nt2;
104 else
105 {
106 m_tuple2 = ntupleSvc()->book( "FILE999/chisq", CLID_ColumnWiseTuple, "chi-square of " );
107 if ( m_tuple2 )
108 {
109 status = m_tuple2->addItem( "chis", m_chis );
110 status = m_tuple2->addItem( "probs", m_probs );
111 status = m_tuple2->addItem( "chif", m_chif );
112 status = m_tuple2->addItem( "probf", m_probf );
113 }
114 else
115 {
116 log << MSG::ERROR << "Cannot book N-tuple:" << long( m_tuple2 ) << endmsg;
117 return StatusCode::FAILURE;
118 }
119 }
120
121 NTuplePtr nt3( ntupleSvc(), "FILE999/Pull" );
122 if ( nt3 ) m_tuple3 = nt3;
123 else
124 {
125 m_tuple3 = ntupleSvc()->book( "FILE999/Pull", CLID_ColumnWiseTuple, "Pull" );
126 if ( m_tuple3 )
127 {
128 status = m_tuple3->addItem( "pull_drho", m_pull_drho );
129 status = m_tuple3->addItem( "pull_phi", m_pull_phi );
130 status = m_tuple3->addItem( "pull_kapha", m_pull_kapha );
131 status = m_tuple3->addItem( "pull_dz", m_pull_dz );
132 status = m_tuple3->addItem( "pull_lamb", m_pull_lamb );
133 status = m_tuple3->addItem( "pull_momentum", m_pull_momentum );
134 }
135 else
136 {
137 log << MSG::ERROR << "Cannot book N-tuple:" << long( m_tuple3 ) << endmsg;
138 return StatusCode::FAILURE;
139 }
140 }
141
142 NTuplePtr nt4( ntupleSvc(), "FILE999/kalvtx" );
143 if ( nt4 ) m_tuple4 = nt4;
144 else
145 {
146 m_tuple4 = ntupleSvc()->book( "FILE999/kalvtx", CLID_ColumnWiseTuple, "kalman vertex" );
147 if ( m_tuple4 )
148 {
149 status = m_tuple4->addItem( "kvx", m_kvx );
150 status = m_tuple4->addItem( "kvy", m_kvy );
151 status = m_tuple4->addItem( "kvz", m_kvz );
152 status = m_tuple4->addItem( "chik", m_chik );
153 status = m_tuple4->addItem( "ndofk", m_ndofk );
154 status = m_tuple4->addItem( "probk", m_probk );
155 }
156 else
157 {
158 log << MSG::ERROR << "Cannot book N-tuple:" << long( m_tuple4 ) << endmsg;
159 return StatusCode::FAILURE;
160 }
161 }
162 } // end if output
163
164 log << MSG::INFO << "successfully return from initialize()" << endmsg;
165 return StatusCode::SUCCESS;
166}
167//*******************************************************************************
168
169StatusCode
170PrimaryVertex::RegisterEvtRecPrimaryVertex( EvtRecPrimaryVertex* aNewEvtRecPrimaryVertex,
171 MsgStream& log ) {
172 DataObject* aEvtRecEvent;
173 eventSvc()->findObject( "/Event/EvtRec", aEvtRecEvent );
174 if ( aEvtRecEvent == NULL )
175 {
176 aEvtRecEvent = new EvtRecEvent();
177 StatusCode sc = eventSvc()->registerObject( "/Event/EvtRec", aEvtRecEvent );
178 if ( sc != StatusCode::SUCCESS )
179 {
180 log << MSG::FATAL << "Could not register EvtRecEvent" << endmsg;
181 return StatusCode::FAILURE;
182 }
183 }
184 SmartIF<IDataManagerSvc> dataManSvc( eventSvc() );
185 DataObject* aEvtRecPrimaryVertex;
186 eventSvc()->findObject( "/Event/EvtRec/EvtRecPrimaryVertex", aEvtRecPrimaryVertex );
187 if ( aEvtRecPrimaryVertex != NULL )
188 {
189 // IDataManagerSvc *dataManSvc = dynamic_cast<IDataManagerSvc*> (eventSvc());
190 dataManSvc->clearSubTree( "/Event/EvtRec/EvtRecPrimaryVertex" );
191 eventSvc()->unregisterObject( "/Event/EvtRec/EvtRecPrimaryVertex" );
192 }
193 StatusCode sc = eventSvc()->registerObject( "/Event/EvtRec/EvtRecPrimaryVertex",
194 aNewEvtRecPrimaryVertex );
195 if ( sc != StatusCode::SUCCESS )
196 {
197 log << MSG::FATAL << "Could not register EvtRecPrimaryVertex in TDS!" << endmsg;
198 return StatusCode::FAILURE;
199 }
200
201 return StatusCode::SUCCESS;
202}
203
204///////////////////////////////////////////////////
205// Select good charged tracks in MDC ( no PID )
206//////////////////////////////////////////////////
207void PrimaryVertex::SelectGoodChargedTracks( SmartDataPtr<EvtRecEvent>& recEvent,
208 SmartDataPtr<EvtRecTrackCol>& recTrackCol,
209 Vint& icp, Vint& icm, Vint& iGood ) {
210 assert( recEvent->totalCharged() <= recTrackCol->size() );
211 for ( unsigned int i = 0; i < recEvent->totalCharged(); i++ )
212 {
213 EvtRecTrackIterator itTrk = recTrackCol->begin() + i;
214 if ( !( *itTrk )->isMdcTrackValid() ) continue;
215 if ( !( *itTrk )->isMdcKalTrackValid() ) continue;
216 RecMdcTrack* mdcTrk = ( *itTrk )->mdcTrack();
217 if ( fabs( cos( mdcTrk->theta() ) ) >= m_cosThetaCut ) continue;
218 if ( fabs( mdcTrk->z() ) >= m_vz0Cut ) continue;
219 iGood.push_back( ( *itTrk )->trackId() );
220 if ( mdcTrk->charge() > 0 ) { icp.push_back( ( *itTrk )->trackId() ); }
221 else if ( mdcTrk->charge() < 0 ) { icm.push_back( ( *itTrk )->trackId() ); }
222 }
223}
224
226 HepPoint3D vx( 0., 0., 0. );
227 HepSymMatrix Evx( 3, 0 );
228 double bx = 1E+6;
229 double by = 1E+6;
230 double bz = 1E+6;
231 Evx[0][0] = bx * bx;
232 Evx[1][1] = by * by;
233 Evx[2][2] = bz * bz;
234 vxpar.setVx( vx );
235 vxpar.setEvx( Evx );
236}
237
238//***************************************************************************
240 MsgStream log( msgSvc(), name() );
241 log << MSG::INFO << "in execute()" << endmsg;
242
243 cout.precision( 20 );
244 ///////////////////////////////////////////
245 // Read REC information
246 //////////////////////////////////////////
247 SmartDataPtr<Event::EventHeader> eventHeader( eventSvc(), "/Event/EventHeader" );
248 SmartDataPtr<EvtRecEvent> recEvent( eventSvc(), EventModel::EvtRec::EvtRecEvent );
249 SmartDataPtr<EvtRecTrackCol> recTrackCol( eventSvc(), EventModel::EvtRec::EvtRecTrackCol );
250 log << MSG::DEBUG << "run and event = " << eventHeader->runNumber() << " "
251 << eventHeader->eventNumber() << endmsg;
252 log << MSG::DEBUG << "ncharg, nneu, tottks = " << recEvent->totalCharged() << " , "
253 << recEvent->totalNeutral() << " , " << recEvent->totalTracks() << endmsg;
254 m_sel_number[0]++;
255 /*
256 if (eventHeader->eventNumber() % 1000 == 0) {
257 cout << "Event number = " << eventHeader->eventNumber() << endl;
258 }*/
259
260 EvtRecPrimaryVertex* aNewEvtRecPrimaryVertex = new EvtRecPrimaryVertex;
261
262 StatusCode sc = RegisterEvtRecPrimaryVertex( aNewEvtRecPrimaryVertex, log );
263 if ( sc != StatusCode::SUCCESS ) { return sc; }
264
265 // Cut 1 : for anything sample, at least 3 charged tracks
266 if ( recEvent->totalCharged() < m_trackNumberCut ) { return StatusCode::SUCCESS; }
267 m_sel_number[1]++;
268
269 Vint icp, icm, iGood;
270 SelectGoodChargedTracks( recEvent, recTrackCol, icp, icm, iGood );
271
272 // Cut 2 : for anything sample, at least 3 good charged tracks
273 if ( iGood.size() < m_trackNumberCut ) { return StatusCode::SUCCESS; }
274 m_sel_number[2]++;
275
276 // Vertex Fit
277 VertexParameter vxpar;
278 InitVertexParameter( vxpar );
279
280 // For Global Vertex Fitting
281 if ( m_fitMethod == 0 )
282 {
283 VertexFit* vtxfit = VertexFit::instance();
284 vtxfit->init();
285 Vint tlis, trkidlis;
286 for ( int i = 0; i < iGood.size(); i++ )
287 {
288 int trk_id = iGood[i];
289 EvtRecTrackIterator itTrk = recTrackCol->begin() + trk_id;
290 RecMdcKalTrack* kalTrk = ( *itTrk )->mdcKalTrack();
292 WTrackParameter wtrk( xmass[2], kalTrk->helix(), kalTrk->err() );
293 vtxfit->AddTrack( i, wtrk );
294 tlis.push_back( i );
295 trkidlis.push_back( trk_id );
296 }
297 vtxfit->AddVertex( 0, vxpar, tlis );
298 if ( !vtxfit->Fit( 0 ) ) return StatusCode::SUCCESS; // FIXME
299 if ( vtxfit->chisq( 0 ) > m_globalChisqCut ) return StatusCode::SUCCESS; // FIXME
300 if ( m_output == 1 )
301 {
302 m_chig = vtxfit->chisq( 0 );
303 m_ndofg = 2 * iGood.size() - 3;
304 m_probg = TMath::Prob( m_chig, m_ndofg );
305 HepVector glvtx = vtxfit->Vx( 0 );
306 m_gvx = glvtx[0];
307 m_gvy = glvtx[1];
308 m_gvz = glvtx[2];
309 m_tuple1->write();
310 }
311 /*
312 cout << "======== After global vertex fitting =============" << endl;
313 cout << "Event number = " << eventHeader->eventNumber() << endl;
314 cout << "NTracks: " << iGood.size() << endl;
315 cout << "Chisq: " << vtxfit->chisq(0) << endl;
316 cout << "Ndof: " << 2 * iGood.size() - 3 << endl;
317 cout << "FitMethod: "<< " 0 " << endl;
318 cout << "Vertex position: " << vtxfit->Vx(0)<< endl;
319 cout << "Vertex resolution: " << vtxfit->Evx(0) << endl;
320 cout << "track id list : " << endl;
321 for (int j = 0; j < trkidlis.size(); j++) {
322 cout << trkidlis[j] << " ";
323 }
324 cout << " " << endl; */
325
326 aNewEvtRecPrimaryVertex->setNTracks( iGood.size() );
327 aNewEvtRecPrimaryVertex->setTrackIdList( trkidlis );
328 aNewEvtRecPrimaryVertex->setChi2( vtxfit->chisq( 0 ) );
329 aNewEvtRecPrimaryVertex->setNdof( 2 * iGood.size() - 3 );
330 aNewEvtRecPrimaryVertex->setFitMethod( 0 );
331 aNewEvtRecPrimaryVertex->setVertex( vtxfit->Vx( 0 ) );
332 aNewEvtRecPrimaryVertex->setErrorVertex( vtxfit->Evx( 0 ) );
333 aNewEvtRecPrimaryVertex->setIsValid( true );
334 }
335 else if ( m_fitMethod == 1 )
336 {
337 // For Kalman Vertex Fitting
339 kalvtx->init();
340 kalvtx->initVertex( vxpar );
341 kalvtx->setChisqCut( m_chisqCut );
342 kalvtx->setTrackIteration( m_trackIteration );
343 kalvtx->setVertexIteration( m_vertexIteration );
344 kalvtx->setTrackIterationCut( m_chi2CutforTrkIter );
345 for ( int i = 0; i < iGood.size(); i++ )
346 {
347 int trk_id = iGood[i];
348 EvtRecTrackIterator itTrk = recTrackCol->begin() + trk_id;
349 RecMdcKalTrack* kalTrk = ( *itTrk )->mdcKalTrack();
351 HTrackParameter htrk( kalTrk->helix(), kalTrk->err(), trk_id, 2 );
352 kalvtx->addTrack( htrk );
353 }
354 kalvtx->filter();
355
356 // int freedomCut = -3 + 2*m_trackNumberCut;
357 if ( kalvtx->ndof() >= m_freedomCut )
358 { // Cut : add 2 when add every track
359 // for(int i = 0; i < kalvtx->numTrack(); i++) {
360 for ( int i = 0; i < iGood.size(); i++ )
361 {
362 if ( m_output == 1 )
363 {
364 m_chif = kalvtx->chiF( i );
365 m_chis = kalvtx->chiS( i );
366 m_probs = TMath::Prob( m_chis, 2 );
367 m_probf = TMath::Prob( m_chif, 2 );
368 m_tuple2->write();
369 }
370 if ( kalvtx->chiS( i ) > m_chi2CutforSmooth ) kalvtx->remove( i );
371 }
372 }
373 if ( kalvtx->ndof() >= m_freedomCut )
374 { // FIXME to Rhopi is 0 , others are 1
375 for ( int i = 0; i < iGood.size(); i++ )
376 {
377 kalvtx->smooth( i );
378
379 HepVector Pull( 5, 0 );
380 Pull = kalvtx->pull( i );
381 if ( m_output == 1 )
382 {
383 m_pull_drho = Pull[0];
384 m_pull_phi = Pull[1];
385 m_pull_kapha = Pull[2];
386 m_pull_dz = Pull[3];
387 m_pull_lamb = Pull[4];
388 m_pull_momentum = kalvtx->pullmomentum( i );
389 m_tuple3->write();
390 }
391 }
392 if ( m_output == 1 )
393 {
394 m_chik = kalvtx->chisq();
395 m_ndofk = kalvtx->ndof();
396 m_probk = TMath::Prob( m_chik, m_ndofk );
397 HepVector xp( 3, 0 );
398 xp = kalvtx->x();
399 m_kvx = xp[0];
400 m_kvy = xp[1];
401 m_kvz = xp[2];
402 m_tuple4->write();
403 }
404
405 m_sel_number[3]++;
406 /*
407 cout << "======== After Kalman vertex fitting =============" << endl;
408 cout << "NTracks: " << kalvtx->numTrack() << endl;
409 cout << "Chisq: " << kalvtx->chisq() << endl;
410 cout << "Ndof: " << kalvtx->ndof() << endl;
411 cout << "FitMethod: "<< " 1 " << endl;
412 cout << "Vertex position: " << kalvtx->x() << endl;
413 cout << "Vertex resolution: " << kalvtx->Ex() << endl;
414 for (int j = 0; j < (kalvtx->trackIDList()).size(); j++) {
415 cout << kalvtx->trackIDList()[j] << " ";
416 }
417 cout << " " << endl;*/
418
419 aNewEvtRecPrimaryVertex->setNTracks( kalvtx->numTrack() );
420 aNewEvtRecPrimaryVertex->setTrackIdList( kalvtx->trackIDList() );
421 aNewEvtRecPrimaryVertex->setChi2( kalvtx->chisq() );
422 aNewEvtRecPrimaryVertex->setNdof( kalvtx->ndof() );
423 aNewEvtRecPrimaryVertex->setFitMethod( 1 );
424 aNewEvtRecPrimaryVertex->setVertex( kalvtx->x() );
425 aNewEvtRecPrimaryVertex->setErrorVertex( kalvtx->Ex() );
426 aNewEvtRecPrimaryVertex->setIsValid( true );
427 }
428 }
429 return StatusCode::SUCCESS;
430}
431
432//***************************************************************************
433
435 MsgStream log( msgSvc(), name() );
436 log << MSG::INFO << "in finalize()" << endmsg;
437
438 log << MSG::ALWAYS << "==================================" << endmsg;
439 log << MSG::ALWAYS << "survived event :";
440 for ( int i = 0; i < 10; i++ ) { log << MSG::ALWAYS << m_sel_number[i] << " "; }
441 log << MSG::ALWAYS << endmsg;
442 log << MSG::ALWAYS << "==================================" << endmsg;
443 return StatusCode::SUCCESS;
444}
DECLARE_COMPONENT(BesBdkRc)
HepGeom::Point3D< double > HepPoint3D
EvtRecTrackCol::iterator EvtRecTrackIterator
double mpi0
std::vector< HepLorentzVector > Vp4
Definition Gam4pikp.cxx:38
const double xmass[5]
Definition Gam4pikp.cxx:35
std::vector< int > Vint
Definition Gam4pikp.cxx:37
const double momega
void InitVertexParameter(VertexParameter &vxpar)
INTupleSvc * ntupleSvc()
IMessageSvc * msgSvc()
void setTrackIdList(const std::vector< int > &trackIdList)
double pullmomentum(const int k)
HepSymMatrix Ex() const
void addTrack(const HTrackParameter)
void smooth(const int k)
int filter(const int k)
std::vector< int > trackIDList() const
double chiS(const int k) const
void initVertex(const VertexParameter vtx)
HepVector pull(const int k)
static KalmanVertexFit * instance()
void remove(const int k)
StatusCode finalize()
StatusCode initialize()
PrimaryVertex(const std::string &name, ISvcLocator *pSvcLocator)
StatusCode execute()
void AddTrack(const int number, const double mass, const RecMdcTrack *trk)
Definition TrackPool.cxx:21
void init()
Definition VertexFit.cxx:27
void AddVertex(int number, VertexParameter vpar, std::vector< int > lis)
Definition VertexFit.cxx:85
static VertexFit * instance()
Definition VertexFit.cxx:15
bool Fit()
const double ecms
Definition inclkstar.cxx:26