25 if(TrkPt > 0. && JetPt > 0.){
27 double pfrac=(TrkPt-
m_cutPt)/std::sqrt(JetPt);
28 p_prob= pfrac/(coeffPt+pfrac);
29 if (Signif == 0.)
return p_prob;
33 s_prob=(Signif-coeffSig)/Signif;
34 if(TrkPt + JetPt == 0.)
return s_prob;
38 return (1.+contrib)*
std::max(s_prob,0.)+(1.-contrib)*p_prob;
54 pnt1.normalize(); pnt2.normalize(); mom1.normalize(); mom2.normalize();
59 Amg::Vector3D t=norm1.cross(norm2);
t.normalize();
if(
t.dot(mom1+mom2)<0.)
t*=-1.;
60 double aveP=(trk1->
p4()+trk2->
p4()).P()/2.;
61 TLorentzVector
tl;
tl.SetXYZM(
t.x()*aveP,
t.y()*aveP,
t.z()*aveP,139.57);
62 if(
tl.DeltaR(trk1->
p4()) >dRLim ||
tl.DeltaR(trk2->
p4()) >dRLim ) {V1*=0.; V2*=0.;
return tl;}
67 std::abs(mom1[1]*
t[2]-mom1[2]*
t[1])>std::abs(mom1[0]*
t[2]-mom1[2]*
t[0]) ?
X=(
t[1]*pnt1[2]-
t[2]*pnt1[1])/(mom1[1]*
t[2]-mom1[2]*
t[1])
68 :
X=(
t[0]*pnt1[2]-
t[2]*pnt1[0])/(mom1[0]*
t[2]-mom1[2]*
t[0]);
70 std::abs(mom2[1]*
t[2]-mom2[2]*
t[1])>std::abs(mom2[0]*
t[2]-mom2[2]*
t[0]) ?
X=(
t[1]*pnt2[2]-
t[2]*pnt2[1])/(mom2[1]*
t[2]-mom2[2]*
t[1])
71 :
X=(
t[0]*pnt2[2]-
t[2]*pnt2[0])/(mom2[0]*
t[2]-mom2[2]*
t[0]);
74 if(V1.dot(
t)<0. && V2.dot(
t)<0.) {V1*=0.;V2*=0.;}
75 else {V1+=PVRT; V2+=PVRT;}
82 for(
const auto & iv : *wrkVrtSet) {
83 std::ostringstream ostr1,ostr2;
84 for(
long kk : iv.selTrk) {ostr1<<
kk<<
", ";}
85 for(
int kk=0;
kk<(
int)iv.selTrk.size();
kk++) {ostr2<<
momAtVrt(iv.trkAtVrt[
kk]).Perp()<<
", ";}
90 <<
" NTrk="<<iv.selTrk.size()
91 <<
" is good="<<std::boolalpha<<iv.Good<<std::noboolalpha
93 <<
" Mass="<<iv.vertexMom.M()
94 <<
" detached="<<iv.detachedTrack
95 <<
" proj.dist="<<iv.projectedVrt
96 <<
" trk="<<ostr1.str()<<
" trk Pt="<<ostr2.str());
105 TVector3 SV_PV( SV.x()-PV.
x(), SV.y()-PV.
y(), SV.z()-PV.
z() );
106 return Jet.Vect().Unit()*SV_PV.Unit();
111 float R = std::hypot(xvt, yvt);
114 if( std::abs(R-
m_rLayerB) < 2.5)
return true;
115 if( std::abs(R-
m_rLayer1) < 3.0)
return true;
116 if( std::abs(R-
m_rLayer2) < 3.0)
return true;
119 if( std::abs(R-
m_rLayerB) < 3.5)
return true;
120 if( std::abs(R-
m_rLayer1) < 4.0)
return true;
121 if( std::abs(R-
m_rLayer2) < 5.0)
return true;
127 const std::vector<double>& SecVrtErr,
double& Signif)
131 Amg::Vector3D SVPV(PrimVrt.
x()- SecVrt.x(),PrimVrt.
y()- SecVrt.y(),PrimVrt.
z()- SecVrt.z());
133 AmgSymMatrix(3) PrimCovMtx=PrimVrt.covariancePosition();
134 PrimCovMtx(0,0) += SecVrtErr[0];
135 PrimCovMtx(0,1) += SecVrtErr[1];
136 PrimCovMtx(1,0) += SecVrtErr[1];
137 PrimCovMtx(1,1) += SecVrtErr[2];
138 PrimCovMtx(0,2) += SecVrtErr[3];
139 PrimCovMtx(2,0) += SecVrtErr[3];
140 PrimCovMtx(1,2) += SecVrtErr[4];
141 PrimCovMtx(2,1) += SecVrtErr[4];
142 PrimCovMtx(2,2) += SecVrtErr[5];
146 PrimCovMtx.computeInverseWithCheck(WgtMtx, success);
147 if( !success || WgtMtx(0,0)<=0. || WgtMtx(1,1)<=0. || WgtMtx(2,2)<=0. ){
148 ATH_MSG_DEBUG(
" Cov.matrix inversion failure in vertex distance significane");
152 Signif=SVPV.transpose()*WgtMtx*SVPV;
154 if(Signif<=0.)
return 1.e10;
155 Signif=std::sqrt(Signif);
156 if( Signif!=Signif ) Signif = 0.;
161 const std::vector<double>& SecVrtErr,
double& Signif)
166 AmgSymMatrix(3) PrimCovMtx=PrimVrt.covariancePosition();
168 CovMtx(0,0) = PrimCovMtx(0,0) + SecVrtErr[0];
169 CovMtx(0,1) = PrimCovMtx(0,1) + SecVrtErr[1];
170 CovMtx(1,0) = PrimCovMtx(1,0) + SecVrtErr[1];
171 CovMtx(1,1) = PrimCovMtx(1,1) + SecVrtErr[2];
175 CovMtx.computeInverseWithCheck(WgtMtx, success);
176 if( !success || WgtMtx(0,0)<=0. || WgtMtx(1,1)<=0. ){
177 ATH_MSG_DEBUG(
" Cov.matrix inversion failure in vertex distance significane");
181 Signif=SVPV.transpose()*WgtMtx*SVPV;
183 if(Signif<=0.)
return 1.e10;
184 Signif=std::sqrt(Signif);
185 if( Signif!=Signif ) Signif = 0.;
193 const std::vector<double>& SecVrtErr,
const TLorentzVector & JetDir)
196 Amg::Vector3D jetDir(JetDir.Vect().Unit().X(), JetDir.Vect().Unit().Y(), JetDir.Vect().Unit().Z());
197 double projDist=(SecVrt-PrimVrt.
position()).
dot(jetDir);
200 AmgSymMatrix(3) PrimCovMtx=PrimVrt.covariancePosition();
201 PrimCovMtx(0,0) += SecVrtErr[0];
202 PrimCovMtx(0,1) += SecVrtErr[1];
203 PrimCovMtx(1,0) += SecVrtErr[1];
204 PrimCovMtx(1,1) += SecVrtErr[2];
205 PrimCovMtx(0,2) += SecVrtErr[3];
206 PrimCovMtx(2,0) += SecVrtErr[3];
207 PrimCovMtx(1,2) += SecVrtErr[4];
208 PrimCovMtx(2,1) += SecVrtErr[4];
209 PrimCovMtx(2,2) += SecVrtErr[5];
213 PrimCovMtx.computeInverseWithCheck(WgtMtx, success);
214 if( !success || WgtMtx(0,0)<=0. || WgtMtx(1,1)<=0. || WgtMtx(2,2)<=0. ){
215 ATH_MSG_DEBUG(
" Cov.matrix inversion failure in vertex distance significane");
219 double Signif=SVPV.transpose()*WgtMtx*SVPV;
220 if(Signif<=0.)
return 1.e10;
221 Signif=std::sqrt(Signif);
222 if( Signif!=Signif ) Signif = 0.;
223 if(projDist<0)Signif=-Signif;
228 const Amg::Vector3D & Vrt2,
const std::vector<double> & VrtErr2)
232 Amg::Vector3D SVPV(Vrt1.x()- Vrt2.x(),Vrt1.y()- Vrt2.y(),Vrt1.z()- Vrt2.z());
235 PrimCovMtx(0,0) = VrtErr1[0]+VrtErr2[0];
236 PrimCovMtx(0,1) = PrimCovMtx(1,0) = VrtErr1[1]+VrtErr2[1];
237 PrimCovMtx(1,1) = VrtErr1[2]+VrtErr2[2];
238 PrimCovMtx(0,2) = PrimCovMtx(2,0) = VrtErr1[3]+VrtErr2[3];
239 PrimCovMtx(1,2) = PrimCovMtx(2,1) = VrtErr1[4]+VrtErr2[4];
240 PrimCovMtx(2,2) = VrtErr1[5]+VrtErr2[5];
244 PrimCovMtx.computeInverseWithCheck(WgtMtx, success);
245 if( !success || WgtMtx(0,0)<=0. || WgtMtx(1,1)<=0. || WgtMtx(2,2)<=0. ){
246 ATH_MSG_DEBUG(
" Cov.matrix inversion failure in vertex distance significane");
250 Signif=SVPV.transpose()*WgtMtx*SVPV;
251 if(Signif<=0.)
return 1.e10;
252 Signif=std::sqrt(Signif);
253 if(Signif != Signif) Signif = 0.;
264 double DirX=SecVrt.x(), DirY=SecVrt.y();
265 double Covar = DirX*VrtErr[0]*DirX
266 +2.*DirX*VrtErr[1]*DirY
267 +DirY*VrtErr[2]*DirY;
268 Covar /= DirX*DirX + DirY*DirY;
269 Covar=std::sqrt(Covar);
270 if(Covar != Covar) Covar = 0.;
281 double etaJet = jetDir.PseudoRapidity();
282 double adphi = std::abs(jetDir.Phi()-vectPerig[2]);
284 return std::sqrt(adphi*adphi + (etaJet-etaTr)*(etaJet-etaTr));
293 double massP,
double massPi )
296 double ap1=1./std::abs(trkAtVrt[0][2]);
297 double ap2=1./std::abs(trkAtVrt[1][2]);
302 double px = phi1.
cs*theta1.
sn*ap1
303 + phi2.
cs*theta2.
sn*ap2;
304 double py = phi1.
sn*theta1.
sn*ap1
305 + phi2.
sn*theta2.
sn*ap2;
306 double pz = theta1.
cs*ap1
308 double ee= (ap1 > ap2) ?
309 (std::sqrt(ap1*ap1+massP*massP)+std::sqrt(ap2*ap2+massPi*massPi)):
310 (std::sqrt(ap2*ap2+massP*massP)+std::sqrt(ap1*ap1+massPi*massPi));
312 return test>0 ? std::sqrt(
test) : 0.;
323 if( chi2PerTrk.empty() )
return position ;
324 for (
int i=0;
i< (
int)chi2PerTrk.size();
i++){
325 if(chi2PerTrk[
i]/
std::max(rank[
i],(
float)0.1) > chi2Ref) { chi2Ref=chi2PerTrk[
i]/
std::max(rank[
i],(
float)0.1); position=
i;}
340 double api=1./std::abs(inpTrk[2]);
351 return std::hypot(
px,
py,
pz);
357 AmgVector(5) vectPerig; vectPerig.setZero();
358 double px=0.,
py=0.,
pz=0.,ee=0.;
359 for (
const auto *
i : inpTrk) {
361 vectPerig =
i->parameters();
362 double api=1./std::abs(vectPerig[4]);
376 TLorentzVector
sum(0.,0.,0.,0.);
377 for (
const auto *
i : InpTrk) {
378 if(
i ==
nullptr )
continue;
388 double api=1./std::abs(inpTrk[2]);
409 const std::vector<const xAOD::TrackParticle*>& listTrk,
419 TLorentzVector& Momentum,
421 std::vector<double>& ErrorMatrix,
422 std::vector<double>& Chi2PerTrk,
423 std::vector< std::vector<double> >& TrkAtVrt,
428 std::vector<const xAOD::NeutralParticle*> netralPartDummy(0);
430 ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2,
443 blHit=l1Hit=l2Hit=nLays=0;
445 uint8_t IBLhit,BLhit,NPlay,IBLexp,BLexp;
451 blHit=IBLhit;
if( IBLexp==0 ) blHit=-1;
452 l1Hit= BLhit;
if( BLexp==0 ) l1Hit=-1;
465 uint8_t BLhit,NPlay,NHoles,IBLhit;
468 BLhit=BLhit>IBLhit ? BLhit : IBLhit;
495 splshIBL=share+
split;
515 vrtCovMtx(0,0) = errorMatrix[0];
516 vrtCovMtx(0,1) = vrtCovMtx(1,0) = errorMatrix[1];
517 vrtCovMtx(1,1) = errorMatrix[2];
518 vrtCovMtx(0,2) = vrtCovMtx(2,0) = errorMatrix[3];
519 vrtCovMtx(1,2) = vrtCovMtx(2,1) = errorMatrix[4];
520 vrtCovMtx(2,2) = errorMatrix[5];
531 for(
auto & vrt : all2TrVrt) {
533 h.m_curTup->VrtDist2D[ipnt]=vrt.fitVertex.perp();
534 h.m_curTup->VrtSig3D[ipnt]=vrt.signif3D;
535 h.m_curTup->VrtSig2D[ipnt]=vrt.signif2D;
536 h.m_curTup->itrk[ipnt]=vrt.i;
537 h.m_curTup->jtrk[ipnt]=vrt.j;
538 h.m_curTup->mass[ipnt]=vrt.momentum.M();
539 h.m_curTup->Chi2[ipnt]=vrt.chi2;
540 h.m_curTup->badVrt[ipnt]=vrt.badVrt;
541 h.m_curTup->VrtDR[ipnt]=vrt.dRSVPV;
542 h.m_curTup->VrtErrR[ipnt]=
vrtRadiusError(vrt.fitVertex, vrt.errorMatrix);
546 ipnt++;
h.m_curTup->nVrt=ipnt;
557 TLorentzVector VertexMom;
558 for(
auto & vrt : VrtSet) {
560 h.m_curTup->NVrtDist2D[ipnt]=vrt.vertex.perp();
561 h.m_curTup->NVrtNT[ipnt]=vrt.selTrk.size();
562 h.m_curTup->NVrtTrkI[ipnt]=vrt.selTrk[0];
563 h.m_curTup->NVrtM[ipnt]=vrt.vertexMom.M();
564 h.m_curTup->NVrtChi2[ipnt]=vrt.chi2;
565 float maxW=0., sumW=0.;
566 for(
auto trk : vrt.selTrk){ sumW+=trkScore[trk][0]; maxW=
std::max(trkScore[trk][0], maxW);}
567 h.m_curTup->NVrtMaxW[ipnt]=maxW;
568 h.m_curTup->NVrtAveW[ipnt]=sumW/vrt.selTrk.size();
569 TLorentzVector SVPV(vrt.vertex.x()-PV.
x(),vrt.vertex.y()-PV.
y(),vrt.vertex.z()-PV.
z(),1.);
570 h.m_curTup->NVrtDR[ipnt]=JetDir.DeltaR(SVPV);
571 VertexMom += vrt.vertexMom;
572 ipnt++;
h.m_curTup->nNVrt=ipnt;
574 h.m_curTup->TotM=VertexMom.M();
582 truthParticleLinkAcc (*TP);
583 if( !tplink.
isValid() )
return 0;
585 if( truthMatchProbabilityAcc (*TP ) < 0.5 )
return 0;
587 if( (*tplink)->hasProdVtx()){
588 if( (*tplink)->prodVtx()->nIncomingParticles()==1){
589 int PDGID1=0, PDGID2=0, PDGID3=0, PDGID4=0;
600 if(noBC1 && noBC2 && noBC3 && noBC4)
return 0;
608 if(PDGID<=0)
return 1;
609 if(PDGID>600 && PDGID<4000)noBC=1;
610 if(PDGID<400 || PDGID>5600)noBC=1;
611 if(PDGID==513 || PDGID==523 || PDGID==533 || PDGID==543)noBC=1;
612 if(PDGID==5114 || PDGID==5214 || PDGID==5224 || PDGID==5314 || PDGID==5324)noBC=1;
633 truthParticleLinkAcc (*TP);
642 truthParticleLinkAcc (*TP);
643 if( !tplink.
isValid() )
return 1;