2#include "EvtRecEvent/EvtRecVeeVertex.h"
36 double dr( 0 ), phi0( 0 ), kappa( 0 ), dz( 0 ), tanl( 0 );
44 if ( kappa > 0.0000000001 ) charge = 1;
45 else if ( kappa < -0.0000000001 ) charge = -1;
48 if ( kappa != 0 ) pxy = 1.0 / fabs( kappa );
50 double px = pxy * ( -
sin( phi0 ) );
51 double py = pxy *
cos( phi0 );
52 double pz = pxy * tanl;
54 double e = sqrt( pxy * pxy + pz * pz +
mass *
mass );
56 return HepLorentzVector( px, py, pz, e );
59HepLorentzVector
utility::vfitref(
string channel, vector<int> kaonid, vector<int> pionid,
63 HepLorentzVector pchange( 0, 0, 0, 0 );
65 int nvalid = kaonid.size() + pionid.size();
66 if ( nvalid <= 1 )
return pchange;
68 HepSymMatrix Evx( 3, 0 );
78 double xmass[5] = { 0.000511, 0.105658, 0.139570, 0.493677, 0.938272 };
83 HepLorentzVector pold( 0, 0, 0, 0 );
85 for (
int i = 0; i < kaonid.size(); ++i )
89 pold +=
getp4( mdcKalTrk, 3 );
94 for (
int i = 0; i < pionid.size(); ++i )
98 pold +=
getp4( mdcKalTrk, 2 );
103 vector<int> trkIdxCol;
105 for (
int i = 0; i < nvalid; i++ ) trkIdxCol.push_back( i );
106 vtxfit->
AddVertex( 0, vxpar, trkIdxCol );
108 bool fitok = vtxfit->
Fit();
110 if ( !fitok ) {
return pchange; }
112 HepLorentzVector pnew( 0, 0, 0, 0 );
114 for (
int i = 0; i < nvalid; ++i )
117 HepVector trk_val = HepVector( 7, 0 );
119 HepLorentzVector P_trk( trk_val[0], trk_val[1], trk_val[2], trk_val[3] );
123 return ( pnew - pold );
131 HepLorentzVector pchange( 0, 0, 0, 0 );
133 int nvalid = kaonid.size() + pionid.size() + protonid.size();
134 if ( nvalid <= 1 )
return pchange;
136 HepSymMatrix Evx( 3, 0 );
146 double xmass[5] = { 0.000511, 0.105658, 0.139570, 0.493677, 0.938272 };
151 HepLorentzVector pold( 0, 0, 0, 0 );
153 for (
int i = 0; i < kaonid.size(); ++i )
157 pold +=
getp4( mdcKalTrk, 3 );
162 for (
int i = 0; i < pionid.size(); ++i )
166 pold +=
getp4( mdcKalTrk, 2 );
171 for (
int i = 0; i < protonid.size(); ++i )
175 pold +=
getp4( mdcKalTrk, 4 );
180 vector<int> trkIdxCol;
182 for (
int i = 0; i < nvalid; i++ ) trkIdxCol.push_back( i );
183 vtxfit->
AddVertex( 0, vxpar, trkIdxCol );
185 bool fitok = vtxfit->
Fit();
187 if ( !fitok ) {
return pchange; }
189 HepLorentzVector pnew( 0, 0, 0, 0 );
191 for (
int i = 0; i < nvalid; ++i )
194 HepVector trk_val = HepVector( 7, 0 );
196 HepLorentzVector P_trk( trk_val[0], trk_val[1], trk_val[2], trk_val[3] );
200 return ( pnew - pold );
206 double vfitchi2 = -999;
207 double vfitlength = -999;
208 double vfiterror = 999;
210 vector<double> results;
211 results.push_back( vfitchi2 );
212 results.push_back( vfitlength );
213 results.push_back( vfiterror );
231 HepSymMatrix evWideVertex( 3, 0 );
233 evWideVertex[0][0] = 1.0e12;
234 evWideVertex[1][1] = 1.0e12;
235 evWideVertex[2][2] = 1.0e12;
237 wideVertex.
setVx( vWideVertex );
238 wideVertex.
setEvx( evWideVertex );
247 vtxfit->
AddVertex( 0, wideVertex, 0, 1 );
250 bool fitok = vtxfit->
Fit();
259 HepSymMatrix evBeamSpot( 3, 0 );
265 for (
unsigned int ivx = 0; ivx < 3; ivx++ )
267 vBeamSpot[ivx] = dbv[ivx];
268 evBeamSpot[ivx][ivx] = vv[ivx] * vv[ivx];
273 cout <<
"KSSELECTOR ERROR: Could not find a vertex from VertexDbSvc" << endl;
277 beamSpot.
setVx( vBeamSpot );
278 beamSpot.
setEvx( evBeamSpot );
291 if ( !svtxfit->
Fit() )
return results;
296 vfitchi2 = svtxfit->
chisq();
299 results.push_back( vfitchi2 );
300 results.push_back( vfitlength );
301 results.push_back( vfiterror );
310 double vfitchi2 = -999;
311 double vfitlength = -999;
312 double vfiterror = 999;
314 vector<double> results;
315 results.push_back( vfitchi2 );
316 results.push_back( vfitlength );
317 results.push_back( vfiterror );
319 int index[2] = { 0, 1 };
350 HepSymMatrix evWideVertex( 3, 0 );
352 evWideVertex[0][0] = 1.0e12;
353 evWideVertex[1][1] = 1.0e12;
354 evWideVertex[2][2] = 1.0e12;
356 wideVertex.
setVx( vWideVertex );
357 wideVertex.
setEvx( evWideVertex );
366 vtxfit->
AddVertex( 0, wideVertex, 0, 1 );
369 bool fitok = vtxfit->
Fit();
378 HepSymMatrix evBeamSpot( 3, 0 );
384 for (
unsigned int ivx = 0; ivx < 3; ivx++ )
386 vBeamSpot[ivx] = dbv[ivx];
387 evBeamSpot[ivx][ivx] = vv[ivx] * vv[ivx];
392 cout <<
"LambdaSELECTOR ERROR: Could not find a vertex from VertexDbSvc" << endl;
396 beamSpot.
setVx( vBeamSpot );
397 beamSpot.
setEvx( evBeamSpot );
410 if ( !svtxfit->
Fit() )
return results;
415 vfitchi2 = svtxfit->
chisq();
418 results.push_back( vfitchi2 );
419 results.push_back( vfitlength );
420 results.push_back( vfiterror );
425HepLorentzVector
utility::vfit(
string channel, vector<int> kaonid, vector<int> pionid,
429 HepLorentzVector pchange( 0, 0, 0, 0 );
431 int nvalid = kaonid.size() + pionid.size();
432 if ( nvalid <= 1 )
return pchange;
434 HepSymMatrix Evx( 3, 0 );
444 double xmass[5] = { 0.000511, 0.105658, 0.139570, 0.493677, 0.938272 };
449 HepLorentzVector pold( 0, 0, 0, 0 );
451 for (
int i = 0; i < kaonid.size(); ++i )
455 pold +=
getp4( mdcKalTrk, 3 );
460 for (
int i = 0; i < pionid.size(); ++i )
464 pold +=
getp4( mdcKalTrk, 2 );
466 vtxfit->
AddTrack( kaonid.size() + i, wtrk );
469 vector<int> trkIdxCol;
471 for (
int i = 0; i < nvalid; i++ ) trkIdxCol.push_back( i );
472 vtxfit->
AddVertex( 0, vxpar, trkIdxCol );
473 if ( !vtxfit->
Fit( 0 ) )
return pchange;
477 HepLorentzVector pnew( 0, 0, 0, 0 );
479 for (
int i = 0; i < nvalid; ++i )
482 HepVector trk_val = HepVector( 7, 0 );
484 HepLorentzVector P_trk( trk_val[0], trk_val[1], trk_val[2], trk_val[3] );
488 return ( pnew - pold );
491HepLorentzVector
utility::vfit(
string channel, vector<int> kaonid, vector<int> pionid,
496 HepLorentzVector pchange( 0, 0, 0, 0 );
498 int nvalid = kaonid.size() + pionid.size() + protonid.size();
499 if ( nvalid <= 1 )
return pchange;
501 HepSymMatrix Evx( 3, 0 );
511 double xmass[5] = { 0.000511, 0.105658, 0.139570, 0.493677, 0.938272 };
516 HepLorentzVector pold( 0, 0, 0, 0 );
518 for (
int i = 0; i < kaonid.size(); ++i )
522 pold +=
getp4( mdcKalTrk, 3 );
527 for (
int i = 0; i < pionid.size(); ++i )
531 pold +=
getp4( mdcKalTrk, 2 );
533 vtxfit->
AddTrack( kaonid.size() + i, wtrk );
536 for (
int i = 0; i < protonid.size(); ++i )
540 pold +=
getp4( mdcKalTrk, 4 );
542 vtxfit->
AddTrack( kaonid.size() + pionid.size() + i, wtrk );
545 vector<int> trkIdxCol;
547 for (
int i = 0; i < nvalid; i++ ) trkIdxCol.push_back( i );
548 vtxfit->
AddVertex( 0, vxpar, trkIdxCol );
549 if ( !vtxfit->
Fit( 0 ) )
return pchange;
553 HepLorentzVector pnew( 0, 0, 0, 0 );
555 for (
int i = 0; i < nvalid; ++i )
558 HepVector trk_val = HepVector( 7, 0 );
560 HepLorentzVector P_trk( trk_val[0], trk_val[1], trk_val[2], trk_val[3] );
564 return ( pnew - pold );
570 double vfitchi2 = -999;
571 double vfitlength = -999;
572 double vfiterror = 999;
574 vector<double> results;
575 results.push_back( vfitchi2 );
576 results.push_back( vfitlength );
577 results.push_back( vfiterror );
595 HepSymMatrix evWideVertex( 3, 0 );
597 evWideVertex[0][0] = 1.0e12;
598 evWideVertex[1][1] = 1.0e12;
599 evWideVertex[2][2] = 1.0e12;
601 wideVertex.
setVx( vWideVertex );
602 wideVertex.
setEvx( evWideVertex );
609 vtxfit->
AddTrack( 0, veeInitialWTrack1 );
610 vtxfit->
AddTrack( 1, veeInitialWTrack2 );
611 vtxfit->
AddVertex( 0, wideVertex, 0, 1 );
625 HepSymMatrix evBeamSpot( 3, 0 );
631 for (
unsigned int ivx = 0; ivx < 3; ivx++ )
633 vBeamSpot[ivx] = dbv[ivx];
634 evBeamSpot[ivx][ivx] = vv[ivx] * vv[ivx];
639 cout <<
"KSSELECTOR ERROR: Could not find a vertex from VertexDbSvc" << endl;
643 beamSpot.
setVx( vBeamSpot );
644 beamSpot.
setEvx( evBeamSpot );
657 if ( !svtxfit->
Fit() )
return results;
662 vfitchi2 = svtxfit->
chisq();
665 results.push_back( vfitchi2 );
666 results.push_back( vfitlength );
667 results.push_back( vfiterror );
676 double vfitchi2 = -999;
677 double vfitlength = -999;
678 double vfiterror = 999;
680 vector<double> results;
681 results.push_back( vfitchi2 );
682 results.push_back( vfitlength );
683 results.push_back( vfiterror );
685 int index[2] = { 0, 1 };
716 HepSymMatrix evWideVertex( 3, 0 );
718 evWideVertex[0][0] = 1.0e12;
719 evWideVertex[1][1] = 1.0e12;
720 evWideVertex[2][2] = 1.0e12;
722 wideVertex.
setVx( vWideVertex );
723 wideVertex.
setEvx( evWideVertex );
732 vtxfit->
AddVertex( 0, wideVertex, 0, 1 );
746 HepSymMatrix evBeamSpot( 3, 0 );
752 for (
unsigned int ivx = 0; ivx < 3; ivx++ )
754 vBeamSpot[ivx] = dbv[ivx];
755 evBeamSpot[ivx][ivx] = vv[ivx] * vv[ivx];
760 cout <<
"LambdaSELECTOR ERROR: Could not find a vertex from VertexDbSvc" << endl;
764 beamSpot.
setVx( vBeamSpot );
765 beamSpot.
setEvx( evBeamSpot );
778 if ( !svtxfit->
Fit() )
return results;
783 vfitchi2 = svtxfit->
chisq();
786 results.push_back( vfitchi2 );
787 results.push_back( vfitlength );
788 results.push_back( vfiterror );
794 bool m_useVFrefine ) {
797 double m_pxks = -999;
798 double m_pyks = -999;
799 double m_pzks = -999;
801 double m_chisq = -999;
802 double m_ifok = -999;
804 vector<double> results;
806 results.push_back( m_pxks );
807 results.push_back( m_pyks );
808 results.push_back( m_pzks );
809 results.push_back( m_Eks );
810 results.push_back( m_chisq );
811 results.push_back( m_ifok );
827 HepSymMatrix evWideVertex( 3, 0 );
829 evWideVertex[0][0] = 1.0e12;
830 evWideVertex[1][1] = 1.0e12;
831 evWideVertex[2][2] = 1.0e12;
835 HepSymMatrix evBeamSpot( 3, 0 );
841 for (
unsigned int ivx = 0; ivx < 3; ivx++ )
843 vBeamSpot[ivx] = dbv[ivx];
844 evBeamSpot[ivx][ivx] = vv[ivx] * vv[ivx];
849 cout <<
"UpdateKs ERROR: Could not find a vertex from VertexDbSvc" << endl;
858 wideVertex.
setVx( vWideVertex );
859 wideVertex.
setEvx( evWideVertex );
867 vtxfitr->
AddVertex( 0, wideVertex, 0, 1 );
869 bool fitok = vtxfitr->
Fit();
873 double chisq = vtxfitr->
chisq( 0 );
874 HepLorentzVector pks = vtxfitr->
pfit( 0 );
888 wideVertex.
setVx( vWideVertex );
889 wideVertex.
setEvx( evWideVertex );
896 vtxfit->
AddTrack( 0, veeInitialWTrack1 );
897 vtxfit->
AddTrack( 1, veeInitialWTrack2 );
898 vtxfit->
AddVertex( 0, wideVertex, 0, 1 );
901 if ( vtxfit->
Fit( 0 ) )
907 double chisq = vtxfit->
chisq( 0 );
908 HepLorentzVector pks = wks.
p();
920 results.push_back( m_pxks );
921 results.push_back( m_pyks );
922 results.push_back( m_pzks );
923 results.push_back( m_Eks );
924 results.push_back( m_chisq );
925 results.push_back( m_ifok );
931 bool m_useVFrefine ) {
934 double m_pxlambda = -999;
935 double m_pylambda = -999;
936 double m_pzlambda = -999;
937 double m_Elambda = -999;
938 double m_chisq = -999;
939 double m_ifok = -999;
941 vector<double> results;
943 results.push_back( m_pxlambda );
944 results.push_back( m_pylambda );
945 results.push_back( m_pzlambda );
946 results.push_back( m_Elambda );
947 results.push_back( m_chisq );
948 results.push_back( m_ifok );
950 int index[2] = { 0, 1 };
971 HepSymMatrix evWideVertex( 3, 0 );
973 evWideVertex[0][0] = 1.0e12;
974 evWideVertex[1][1] = 1.0e12;
975 evWideVertex[2][2] = 1.0e12;
979 HepSymMatrix evBeamSpot( 3, 0 );
985 for (
unsigned int ivx = 0; ivx < 3; ivx++ )
987 vBeamSpot[ivx] = dbv[ivx];
988 evBeamSpot[ivx][ivx] = vv[ivx] * vv[ivx];
993 cout <<
"UpdateLambda ERROR: Could not find a vertex from VertexDbSvc" << endl;
1002 wideVertex.
setVx( vWideVertex );
1003 wideVertex.
setEvx( evWideVertex );
1011 vtxfitr->
AddVertex( 0, wideVertex, 0, 1 );
1013 bool fitok = vtxfitr->
Fit();
1017 double chisq = vtxfitr->
chisq( 0 );
1018 HepLorentzVector plambda = vtxfitr->
pfit( 0 );
1020 m_pxlambda = plambda.px();
1021 m_pylambda = plambda.py();
1022 m_pzlambda = plambda.pz();
1023 m_Elambda = plambda.e();
1032 wideVertex.
setVx( vWideVertex );
1033 wideVertex.
setEvx( evWideVertex );
1040 vtxfit->
AddTrack( 0, WTrk_proton );
1042 vtxfit->
AddVertex( 0, wideVertex, 0, 1 );
1045 if ( vtxfit->
Fit( 0 ) )
1051 double chisq = vtxfit->
chisq( 0 );
1052 HepLorentzVector plambda = wlambda.
p();
1054 m_pxlambda = plambda.px();
1055 m_pylambda = plambda.py();
1056 m_pzlambda = plambda.pz();
1057 m_Elambda = plambda.e();
1064 results.push_back( m_pxlambda );
1065 results.push_back( m_pylambda );
1066 results.push_back( m_pzlambda );
1067 results.push_back( m_Elambda );
1068 results.push_back( m_chisq );
1069 results.push_back( m_ifok );
HepGeom::Point3D< double > HepPoint3D
EvtRecTrackCol::iterator EvtRecTrackIterator
double sin(const BesAngle a)
double cos(const BesAngle a)
static void setPidType(PidType pidType)
RecMdcKalTrack * mdcKalTrack()
std::pair< SmartRef< EvtRecTrack >, SmartRef< EvtRecTrack > > & pairDaughters()
SmartRef< EvtRecTrack > & daughter(int i)
virtual bool IfProtonPID() const =0
virtual bool isVertexValid()=0
virtual double * SigmaPrimaryVertex()=0
virtual double * PrimaryVertex()=0
const HepVector & getZHelix() const
HepVector & getZHelixMu()
const HepSymMatrix & getZError() const
HepSymMatrix & getZErrorP()
HepSymMatrix & getZErrorK()
void setPrimaryVertex(const VertexParameter vpar)
double decayLength() const
double decayLengthError() const
static SecondVertexFit * instance()
void setVpar(const VertexParameter vpar)
void AddTrack(const int number, const double mass, const RecMdcTrack *trk)
WTrackParameter wVirtualTrack(int n) const
HepLorentzVector pfit(int n) const
void AddTrack(const int index, RecMdcKalTrack *p, const RecMdcKalTrack::PidType pid)
WTrackParameter wtrk(int n) const
static VertexFitRefine * instance()
void AddVertex(int number, VertexParameter vpar, std::vector< int > lis)
VertexParameter vpar(int n) const
WTrackParameter wtrk(int n) const
WTrackParameter wVirtualTrack(int n) const
void AddVertex(int number, VertexParameter vpar, std::vector< int > lis)
static VertexFit * instance()
VertexParameter vpar(int n) const
void BuildVirtualParticle(int number)
void setEvx(const HepSymMatrix &eVx)
void setVx(const HepPoint3D &vx)
HepLorentzVector p() const
vector< double > SecondaryVFit_Lambda(EvtRecVeeVertex *lambda, IVertexDbSvc *vtxsvc, ILambdaSelector *lambdaSelector)
HepLorentzVector vfitref(string channel, vector< int > kaonid, vector< int > pionid, HepPoint3D vx, EvtRecTrackIterator charged_begin)
vector< double > SecondaryVFitref(EvtRecVeeVertex *ks, IVertexDbSvc *vtxsvc)
vector< double > UpdatedKsIfo(EvtRecVeeVertex *ks, IVertexDbSvc *vtxsvc, bool m_useVFrefine)
vector< double > UpdatedLambdaIfo(EvtRecVeeVertex *lambda, IVertexDbSvc *vtxsvc, bool m_useVFrefine)
HepLorentzVector vfit(string channel, vector< int > kaonid, vector< int > pionid, HepPoint3D vx, EvtRecTrackIterator charged_begin)
vector< double > SecondaryVFit_Lambdaref(EvtRecVeeVertex *lambda, IVertexDbSvc *vtxsvc, ILambdaSelector *lambdaSelector)
HepLorentzVector getp4(RecMdcKalTrack *mdcKalTrack, int pid)
vector< double > SecondaryVFit(EvtRecVeeVertex *ks, IVertexDbSvc *vtxsvc)