1#include "CLHEP/Geometry/Point3D.h"
2#include "CLHEP/Vector/LorentzVector.h"
3#ifndef ENABLE_BACKWARDS_COMPATIBILITY
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"
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"
33using CLHEP::HepLorentzVector;
36const double xmass[5] = { 0.000511, 0.105658, 0.139570, 0.493677, 0.938272 };
38const double mpi0 = 0.134976;
41typedef std::vector<int>
Vint;
42typedef std::vector<HepLorentzVector>
Vp4;
47 : Algorithm( name, pSvcLocator ) {
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 );
54 declareProperty(
"FitMethod", m_fitMethod = 0 );
56 declareProperty(
"Chi2CutOfGlobal", m_globalChisqCut = 200.0 );
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 );
72 MsgStream log(
msgSvc(), name() );
73 log << MSG::INFO <<
"in initialize()" << endmsg;
75 for (
int i = 0; i < 15; i++ ) { m_sel_number[i] = 0; }
81 NTuplePtr nt1(
ntupleSvc(),
"FILE999/glbvtx" );
82 if ( nt1 ) m_tuple1 = nt1;
85 m_tuple1 =
ntupleSvc()->book(
"FILE999/glbvtx", CLID_ColumnWiseTuple,
"global vertex" );
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 );
97 log << MSG::ERROR <<
"Cannot book N-tuple:" << long( m_tuple1 ) << endmsg;
98 return StatusCode::FAILURE;
102 NTuplePtr nt2(
ntupleSvc(),
"FILE999/chisq" );
103 if ( nt2 ) m_tuple2 = nt2;
106 m_tuple2 =
ntupleSvc()->book(
"FILE999/chisq", CLID_ColumnWiseTuple,
"chi-square of " );
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 );
116 log << MSG::ERROR <<
"Cannot book N-tuple:" << long( m_tuple2 ) << endmsg;
117 return StatusCode::FAILURE;
121 NTuplePtr nt3(
ntupleSvc(),
"FILE999/Pull" );
122 if ( nt3 ) m_tuple3 = nt3;
125 m_tuple3 =
ntupleSvc()->book(
"FILE999/Pull", CLID_ColumnWiseTuple,
"Pull" );
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 );
137 log << MSG::ERROR <<
"Cannot book N-tuple:" << long( m_tuple3 ) << endmsg;
138 return StatusCode::FAILURE;
142 NTuplePtr nt4(
ntupleSvc(),
"FILE999/kalvtx" );
143 if ( nt4 ) m_tuple4 = nt4;
146 m_tuple4 =
ntupleSvc()->book(
"FILE999/kalvtx", CLID_ColumnWiseTuple,
"kalman vertex" );
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 );
158 log << MSG::ERROR <<
"Cannot book N-tuple:" << long( m_tuple4 ) << endmsg;
159 return StatusCode::FAILURE;
164 log << MSG::INFO <<
"successfully return from initialize()" << endmsg;
165 return StatusCode::SUCCESS;
172 DataObject* aEvtRecEvent;
173 eventSvc()->findObject(
"/Event/EvtRec", aEvtRecEvent );
174 if ( aEvtRecEvent == NULL )
177 StatusCode sc = eventSvc()->registerObject(
"/Event/EvtRec", aEvtRecEvent );
178 if ( sc != StatusCode::SUCCESS )
180 log << MSG::FATAL <<
"Could not register EvtRecEvent" << endmsg;
181 return StatusCode::FAILURE;
184 SmartIF<IDataManagerSvc> dataManSvc( eventSvc() );
185 DataObject* aEvtRecPrimaryVertex;
186 eventSvc()->findObject(
"/Event/EvtRec/EvtRecPrimaryVertex", aEvtRecPrimaryVertex );
187 if ( aEvtRecPrimaryVertex != NULL )
190 dataManSvc->clearSubTree(
"/Event/EvtRec/EvtRecPrimaryVertex" );
191 eventSvc()->unregisterObject(
"/Event/EvtRec/EvtRecPrimaryVertex" );
193 StatusCode sc = eventSvc()->registerObject(
"/Event/EvtRec/EvtRecPrimaryVertex",
194 aNewEvtRecPrimaryVertex );
195 if ( sc != StatusCode::SUCCESS )
197 log << MSG::FATAL <<
"Could not register EvtRecPrimaryVertex in TDS!" << endmsg;
198 return StatusCode::FAILURE;
201 return StatusCode::SUCCESS;
207void PrimaryVertex::SelectGoodChargedTracks( SmartDataPtr<EvtRecEvent>& recEvent,
208 SmartDataPtr<EvtRecTrackCol>& recTrackCol,
210 assert( recEvent->totalCharged() <= recTrackCol->size() );
211 for (
unsigned int i = 0; i < recEvent->totalCharged(); 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() ); }
227 HepSymMatrix Evx( 3, 0 );
240 MsgStream log(
msgSvc(), name() );
241 log << MSG::INFO <<
"in execute()" << endmsg;
243 cout.precision( 20 );
247 SmartDataPtr<Event::EventHeader> eventHeader( eventSvc(),
"/Event/EventHeader" );
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;
262 StatusCode sc = RegisterEvtRecPrimaryVertex( aNewEvtRecPrimaryVertex, log );
263 if ( sc != StatusCode::SUCCESS ) {
return sc; }
266 if ( recEvent->totalCharged() < m_trackNumberCut ) {
return StatusCode::SUCCESS; }
269 Vint icp, icm, iGood;
270 SelectGoodChargedTracks( recEvent, recTrackCol, icp, icm, iGood );
273 if ( iGood.size() < m_trackNumberCut ) {
return StatusCode::SUCCESS; }
281 if ( m_fitMethod == 0 )
286 for (
int i = 0; i < iGood.size(); i++ )
288 int trk_id = iGood[i];
295 trkidlis.push_back( trk_id );
298 if ( !vtxfit->
Fit( 0 ) )
return StatusCode::SUCCESS;
299 if ( vtxfit->
chisq( 0 ) > m_globalChisqCut )
return StatusCode::SUCCESS;
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 );
326 aNewEvtRecPrimaryVertex->
setNTracks( iGood.size() );
329 aNewEvtRecPrimaryVertex->
setNdof( 2 * iGood.size() - 3 );
331 aNewEvtRecPrimaryVertex->
setVertex( vtxfit->
Vx( 0 ) );
335 else if ( m_fitMethod == 1 )
345 for (
int i = 0; i < iGood.size(); i++ )
347 int trk_id = iGood[i];
357 if ( kalvtx->
ndof() >= m_freedomCut )
360 for (
int i = 0; i < iGood.size(); i++ )
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 );
370 if ( kalvtx->
chiS( i ) > m_chi2CutforSmooth ) kalvtx->
remove( i );
373 if ( kalvtx->
ndof() >= m_freedomCut )
375 for (
int i = 0; i < iGood.size(); i++ )
379 HepVector Pull( 5, 0 );
380 Pull = kalvtx->
pull( i );
383 m_pull_drho = Pull[0];
384 m_pull_phi = Pull[1];
385 m_pull_kapha = Pull[2];
387 m_pull_lamb = Pull[4];
394 m_chik = kalvtx->
chisq();
395 m_ndofk = kalvtx->
ndof();
396 m_probk = TMath::Prob( m_chik, m_ndofk );
397 HepVector xp( 3, 0 );
422 aNewEvtRecPrimaryVertex->
setNdof( kalvtx->
ndof() );
424 aNewEvtRecPrimaryVertex->
setVertex( kalvtx->
x() );
429 return StatusCode::SUCCESS;
435 MsgStream log(
msgSvc(), name() );
436 log << MSG::INFO <<
"in finalize()" << endmsg;
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;
DECLARE_COMPONENT(BesBdkRc)
HepGeom::Point3D< double > HepPoint3D
EvtRecTrackCol::iterator EvtRecTrackIterator
std::vector< HepLorentzVector > Vp4
double cos(const BesAngle a)
void InitVertexParameter(VertexParameter &vxpar)
const HepVector & helix() const
static void setPidType(PidType pidType)
const HepSymMatrix & err() const
const double theta() const
void setTrackIdList(const std::vector< int > &trackIdList)
void setVertex(const HepVector &vtx)
void setFitMethod(int fitMethod)
void setErrorVertex(const HepSymMatrix &Evtx)
void setChi2(double chi2)
void setNTracks(int nTracks)
void setIsValid(bool isValid)
double pullmomentum(const int k)
void setChisqCut(const double chicut)
void addTrack(const HTrackParameter)
double chiF(const int k) const
std::vector< int > trackIDList() const
double chiS(const int k) const
void initVertex(const VertexParameter vtx)
HepVector pull(const int k)
void setTrackIterationCut(const double chicut)
void setTrackIteration(const int num)
static KalmanVertexFit * instance()
void setVertexIteration(const int num)
PrimaryVertex(const std::string &name, ISvcLocator *pSvcLocator)
void AddTrack(const int number, const double mass, const RecMdcTrack *trk)
HepVector Vx(int n) const
void AddVertex(int number, VertexParameter vpar, std::vector< int > lis)
HepSymMatrix Evx(int n) const
static VertexFit * instance()
void setEvx(const HepSymMatrix &eVx)
void setVx(const HepPoint3D &vx)
_EXTERN_ std::string EvtRecEvent
_EXTERN_ std::string EvtRecTrackCol