19 double a=-2.0*exp(-p->eta())/(1.0+exp(-2.0*p->eta()));
23 m_q[1]=2.0*atan(exp(-p->eta()));
24 m_q[2]=p->pT()/1000.0;
27 Ck[0][0]=(*p->cov())[0];Ck[0][1]=Ck[1][0]=(*p->cov())[2];
28 Ck[0][2]=Ck[2][0]=(*p->cov())[1];Ck[0][3]=Ck[3][0]=(*p->cov())[3];
29 Ck[0][4]=Ck[4][0]=(*p->cov())[4];Ck[1][1]=(*p->cov())[9];
30 Ck[1][2]=Ck[2][1]=(*p->cov())[6];Ck[1][3]=Ck[3][1]=(*p->cov())[10];
31 Ck[1][4]=Ck[4][1]=(*p->cov())[11];Ck[2][2]=(*p->cov())[5];
32 Ck[2][3]=Ck[3][2]=(*p->cov())[7];Ck[2][4]=Ck[4][2]=(*p->cov())[8];
33 Ck[3][3]=(*p->cov())[12];Ck[3][4]=Ck[4][3]=(*p->cov())[13];
34 Ck[4][4]=(*p->cov())[14];
37 Ck[3][i]=
a*Ck[3][i];Ck[i][3]=Ck[3][i];
42 Ck[4][i]=Ck[4][i]/1000.0;Ck[i][4]=Ck[4][i];
47 for(i=0;i<2;i++)
for(j=0;j<2;j++)
m_Vuu[i][j]=Ck[i][j];
48 for(i=0;i<2;i++)
for(j=0;j<3;j++)
m_Vuq[i][j]=Ck[i][j+2];
49 for(i=0;i<3;i++)
for(j=0;j<3;j++)
m_Vqq[i][j]=Ck[i+2][j+2];
86 if( pP->covariance() ){
106 const double a = cos(pP->parameters()[
Trk::theta])/ptC;
109 Ck[3][3]=Ck[3][3]+2.0*
a*Ck[3][4]+
a*
a*Ck[4][4];
110 Ck[3][4]=Ck[4][3]=b*Ck[3][4]+
a*b*Ck[4][4];
111 Ck[4][4]=b*b*Ck[4][4];
112 Ck[0][3]=Ck[3][0]=Ck[0][3]+
a*Ck[0][4];Ck[0][4]*=b;Ck[4][0]=Ck[0][4];
113 Ck[1][3]=Ck[3][1]=Ck[1][3]+
a*Ck[1][4];Ck[1][4]*=b;Ck[4][1]=Ck[1][4];
114 Ck[2][3]=Ck[3][2]=Ck[2][3]+
a*Ck[2][4];Ck[2][4]*=b;Ck[4][2]=Ck[2][4];
115 for(
int i=0;i<2;i++)
for(
int j=0;j<2;j++)
m_Vuu[i][j]=Ck[i][j];
116 for(
int i=0;i<3;i++)
for(
int j=0;j<3;j++)
m_Vqq[i][j]=Ck[i+2][j+2];
117 for(
int i=0;i<2;i++)
for(
int j=0;j<3;j++)
m_Vuq[i][j]=Ck[i][j+2];
198 const double C=0.02997;
199 const double B=20.84;
200 const double alpha=
C*B/1000.0;
202 double Sk[2][2],detr,
chi2;
203 double AC[2][3],BV[2][3];
221 const double cosPhi0=cos(phi0);
222 const double sinPhi0=sin(phi0);
223 const double sinPsi=-alpha*(xv*cosPhi0+yv*sinPhi0)/P0;
224 if(fabs(sinPsi)>1.0)
return -999.9;
225 const double cosPsi=sqrt(1.0-sinPsi*sinPsi);
226 const double psi=asin(sinPsi);
227 const double sint=sin(theta0);
228 const double ctt=cos(theta0)/sint;
230 m_A[0][0]=-sin(phi0+psi)/cosPsi;
231 m_A[0][1]= cos(phi0+psi)/cosPsi;
234 m_A[1][0]=-ctt*cosPhi0/cosPsi;
235 m_A[1][1]=-ctt*sinPhi0/cosPsi;
240 m_B[0][2]=(1.0-1.0/cosPsi)/alpha;
243 m_B[1][1]=-P0*psi/(alpha*sint*sint);
244 m_B[1][2]=ctt*(psi-sinPsi/cosPsi)/alpha;
246 m_h[0]=yv*cosPhi0-xv*sinPhi0+P0*(1-cosPsi)/alpha;
247 m_h[1]=zv+P0*ctt*psi/alpha;
252 for(i=0;i<2;i++)
for(j=0;j<2;j++) Sk[i][j]=
m_Vuu[i][j];
253 for(i=0;i<2;i++)
for(j=0;j<3;j++)
256 for(k=0;k<3;k++) AC[i][j]+=
m_A[i][k]*pV->
m_Gk[k][j];
258 for(i=0;i<2;i++)
for(j=0;j<2;j++)
260 for(k=0;k<3;k++) Sk[i][j]+=AC[i][k]*
m_A[j][k];
266 for(k=0;k<3;k++) BV[i][j]+=
m_B[i][k]*
m_Vqq[k][j];
271 for(k=0;k<3;k++) Sk[i][j]+=BV[i][k]*
m_B[j][k];
279 detr=1.0/(Sk[0][0]*Sk[1][1]-Sk[0][1]*Sk[1][0]);
280 m_V[0][0]=Sk[1][1]*detr;
281 m_V[1][1]=Sk[0][0]*detr;
282 m_V[0][1]=
m_V[1][0]=-Sk[0][1]*detr;
289 for(j=0;j<3;j++)
m_D[i][j]=AC[i][j];
290 for(j=3;j<3+shift;j++)
296 for(j=0;j<3;j++)
m_D[i][j+3+shift]=BV[i][j]-
m_Vuq[i][j];
315 for(k=0;k<2;k++) K[i][j]+=
m_D[k][j]*
m_V[k][i];
323 pV->
m_Gk[i][j]-=K[0][i]*
m_D[0][j]+K[1][i]*
m_D[1][j];
369 const double C=0.029997;
370 const double B=20.84;
372 double invMass=0.0,alpha=
C*B/1000.0;
373 double P[3];
double E=0.0;
378 for(
int i=0;i<3;i++)
P[i]=0.0;
380 for(std::list<const TrigVertexFitInputTrack*>::iterator it=
m_trackList.begin();it!=
m_trackList.end();++it)
382 offset=3+3*(*it)->getIndex();
383 double mass=(*it)->getMass()/1000.0;
384 double pT=fabs(Rk[offset+2]);
385 double p=pT/sin(Rk[offset+1]);
387 double psi=-asin(alpha*(Rk[0]*cos(Rk[offset])+Rk[1]*sin(Rk[offset]))/Rk[offset+2]);
388 double phiV=Rk[offset]+psi;
391 P[2]+=pT*cos(Rk[offset+1])/sin(Rk[offset+1]);
392 E+=sqrt(mass*mass+p*p);
394 invMass=sqrt(E*E-
P[0]*
P[0]-
P[1]*
P[1]-
P[2]*
P[2]);
402 const double C=0.029997;
403 const double B=20.84;
405 double invMass=0.0,alpha=
C*B/1000.0;
409 bool linFailed=
false;
413 for(i=0;i<3;i++)
P[i]=0.0;
417 for(std::list<const TrigVertexFitInputTrack*>::iterator it=
m_trackList.begin();it!=
m_trackList.end();++it)
419 offset=3+3*(*it)->getIndex();
420 double mass=(*it)->getMass()/1000.0;
421 double pT=fabs(Rk[offset+2]);
422 double p=pT/sin(Rk[offset+1]);
424 double psi=-asin(alpha*(Rk[0]*cos(Rk[offset])+Rk[1]*sin(Rk[offset]))/Rk[offset+2]);
425 double phiV=Rk[offset]+psi;
428 P[2]+=pT*cos(Rk[offset+1])/sin(Rk[offset+1]);
429 E+=sqrt(mass*mass+p*p);
431 invMass=sqrt(E*E-
P[0]*
P[0]-
P[1]*
P[1]-
P[2]*
P[2]);
434 m_D[0][0]=0.0;
m_D[0][1]=0.0;
m_D[0][2]=0.0;
436 for(std::list<const TrigVertexFitInputTrack*>::iterator it=
m_trackList.begin();it!=
m_trackList.end();++it)
438 offset=3+3*(*it)->getIndex();
440 double mass=(*it)->getMass()/1000.0;
441 double Ck=(Rk[offset+2]<0.0)?-1.0:1.0;
442 double sinT=sin(Rk[offset+1]);
443 double cosT=cos(Rk[offset+1]);
444 double pT=fabs(Rk[offset+2]);
446 double e=sqrt(p*p+mass*mass);
447 double sinF=sin(Rk[offset]);
448 double cosF=cos(Rk[offset]);
450 double sinPsi=-alpha*(Rk[0]*cosF+Rk[1]*sinF)/Rk[offset+2];
456 double psi=asin(sinPsi);
457 double cosPsi=sqrt(1.0-sinPsi*sinPsi);
458 double phiV=Rk[offset]+psi;
460 double aCos=alpha*Ck/cosPsi;
461 double dP=
P[1]*cos(phiV)-
P[0]*sin(phiV);
462 double eE=E*Rk[offset+2]/(e*sinT);
464 m_D[0][0]+=dP*cosF*aCos;
465 m_D[0][1]+=dP*sinF*aCos;
466 m_D[0][offset]=-dP*Ck*(Rk[offset+2]-Ck*aCos*(Rk[1]*cosF-Rk[0]*sinF));
467 m_D[0][offset+1]=(Rk[offset+2]/(sinT*sinT))*(
P[2]*Ck-eE*cosT);
468 m_D[0][offset+2]=eE/sinT-Ck*(
P[0]*cos(phiV)+
P[1]*sin(phiV)+
P[2]*cosT/sinT)+dP*Ck*sinPsi/cosPsi;
470 for(i=0;i<nSize;i++)
m_D[0][i]/=invMass;
471 if(linFailed)
return -999.9;
500 double dCov=pV->
m_Gk[i][j]*
m_D[0][i]*
m_D[0][j];
513 const int nSize=3+3*pV->
getTracks()->size();
519 for(j=0;j<nSize;j++) gain+=pV->
m_Gk[i][j]*
m_D[0][j];
528 pV->
m_Gk[i][j]-=K[i]*
m_D[1][j];
548 m_pvTracks=
new std::list<TrigVertexFitInputTrack*>;
562 for(std::list<TrigVertexFitInputTrack*>::iterator tIt=
m_pvTracks->begin();
567 for(std::list<TrigVertexFitConstraint*>::iterator tIt=
m_pvConstraints->begin();
695 for(
int i=0;i<nSize;i++)
698 for(
int j=0;j<nSize;j++)
msg<<
m_Gk[i][j]<<
" ";
707 for(std::list<TrigVertexFitInputTrack*>::iterator it=
m_pvTracks->begin();
710 if((*it)->getTrackType()!=1)
continue;
711 if(pT==(*it)->getTrigTrack())
723 for(std::list<TrigVertexFitInputTrack*>::iterator it=
m_pvTracks->begin();
726 if((*it)->getTrackType()!=2)
continue;
727 if(pT==(*it)->getTrkTrack())
#define AmgSymMatrix(dim)
#define MAX_SIZE_VERT_COVM
encapsulates LVL2 track parameters and covariance matrix The vector of track parameters consists of
represents a LVL2 ID track
bool isVertexFitted()
vertex status
MsgStream & report(MsgStream &) const
void addNdof(int)
increments accumulated number-of-degree-of-freedom of the fit
void setMotherTrack(TrigInDetTrackFitPar *)
sets mother particle parameters after kinematical fitting
void setMassVariance(double)
sets variance of the calculated mass of the vertex
std::list< TrigVertexFitConstraint * > * m_pvConstraints
std::list< TrigVertexFitInputTrack * > * getTracks()
lists of tracks in the vertex
void setMass(double)
sets calculated mass of the vertex
bool isReadyForFit()
vertex status
const TrigInDetTrackFitPar * getMotherTrack()
returns mother particle parameters if m_isMassEstimated() is true
void addChi2(double)
increments accumulated of the fit
double mass()
returns calculated mass of the vertex
bool isMassEstimated()
vertex status
void setStatus(int)
sets vertex status flag
const TrigVertexFitInputTrack * contains(const TrigInDetTrack *)
checks whether L2 track is in the vertex
double chi2()
returns accumulated of the fit
double m_Rk[MAX_SIZE_VERT_COVM]
bool prepareForFit()
resets all internal structures + initialization of the covariance
std::list< TrigVertexFitConstraint * > * getConstraints()
lists of all constraints imposed on the vertex
double * getParametersVector()
returns vector of vertex fit parameters: vertex position + refitted track momenta at-perigee (sic !...
void reset()
resets all internal structures
int ndof()
returns accumulated number-of-degree-of-freedom of the fit
TrigInDetTrackFitPar * m_P
double massVariance()
returns variance of the calculated mass of the vertex
std::list< TrigVertexFitInputTrack * > * m_pvTracks
int getStatus()
returns vertex status flag
double m_Gk[MAX_SIZE_VERT_COVM][MAX_SIZE_VERT_COVM]
virtual void updateVertex(class TrigL2Vertex *)
implementation of abstract method from the base class
TrigVertexFitConstraint(double, const TrigVertexFitInputTrack *, const TrigVertexFitInputTrack *)
two-track mass constraint
~TrigVertexFitConstraint()
virtual double getChi2Distance(class TrigL2Vertex *)
implementation of abstract method from the base class
virtual MsgStream & report(MsgStream &) const
double calculateInvariantMass(TrigL2Vertex *pV)
std::list< const TrigVertexFitInputTrack * > m_trackList
double getValue()
returns a mass of the constraint
double m_D[2][MAX_SIZE_VERT_COVM]
double chi2(TH1 *h0, TH1 *h1)
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee