32 std::vector<const xAOD::TrackParticle*> & selectedTracks,
34 std::map<
long int,std::vector<double>> & goodVrt,
38 std::vector<const xAOD::NeutralParticle*> neutralPartDummy(0);
39 std::vector<const xAOD::TrackParticle*> tracksForFit(2,
nullptr);
40 std::vector<double> impact,impactError;
41 std::vector<double> inpMass(2,
m_massPi);
46 std::vector<Vrt2Tr> all2TrVrt(0);
47 TLorentzVector PSum2T;
50 int NTracks = (int) (selectedTracks.size());
55 double signifR=0.,signifZ=0.;
56 std::vector<int> nPixHits(NTracks,0);
57 std::vector<double> trackSignif(NTracks),dRdZratio(NTracks);
58 for (i=0; i<NTracks; i++) {
59 m_fitSvc->VKalGetImpact(ctx, selectedTracks[i], primVrt.
position(), 1, impact, impactError);
60 signifR = impact[0]/ sqrt(impactError[0]);
61 signifZ = impact[1]/ sqrt(impactError[2]);
62 trackSignif[i] = sqrt( signifR*signifR + signifZ*signifZ);
63 dRdZratio[i] = std::abs(signifR/signifZ);
65 nPixHits[i]=nPixelHits;
68 h.m_hb_impactR->Fill( signifR,
m_w_1);
69 h.m_hb_impactZ->Fill( signifZ,
m_w_1);
70 h.m_hb_impactRZ->Fill(signifR, signifZ,
m_w_1);
71 h.m_hb_impact->Fill( trackSignif[i],
m_w_1);
74 h.m_curTup->pttrk[i]=selectedTracks[i]->pt();
75 h.m_curTup->d0trk[i]=selectedTracks[i]->d0();
76 h.m_curTup->Sig3D[i]=trackSignif[i];
77 h.m_curTup->idHF[i] =
getIdHF(selectedTracks[i]);
78 h.m_curTup->dRdZrat[i] =dRdZratio[i];
83 h.m_curTup->trkTRT[i] =TRTHits;
84 h.m_curTup->etatrk[i] =selectedTracks[i]->eta();
95 std::vector<std::vector<std::tuple<int,float>>> trkCount(NTracks);
96 std::unique_ptr<Trk::IVKalState> state =
m_fitSvc->makeState(ctx);
97 m_fitSvc->setMassInputParticles( inpMass, *state );
98 for (i=0; i<NTracks-1; i++) {
100 for (j=i+1; j<NTracks; j++) {
102 PSum2T=selectedTracks[i]->p4()+selectedTracks[j]->p4();
103 if( std::abs(selectedTracks[i]->
eta()-selectedTracks[j]->
eta())==0 &&
104 std::abs(selectedTracks[i]->
phi()-selectedTracks[j]->
phi())==0 &&
105 std::abs(selectedTracks[i]->pt() -selectedTracks[j]->pt())==0 )
continue;
106 tracksForFit[0]=selectedTracks[i];
107 tracksForFit[1]=selectedTracks[j];
110 if(
sc.isFailure() ) {
114 if( cosMomVrtDir>0. ) iniVrt=tmpVrt.
fitVertex;
117 if(nPixHits[i]>0 && nPixHits[j]>0){
if(minDZ>
m_fastZSVCut)
continue; }
119 m_fitSvc->setApproximateVertex(iniVrt.x(), iniVrt.y(), iniVrt.z(), *state);
122 if(
sc.isFailure())
continue;
123 if(tmpVrt.
chi2>20.)
continue;
128 testV.makePrivateStore();
134 std::make_pair(selectedTracks[i],selectedTracks[j]), testV,
136 if(!acceptV)
continue;
141 double dstMatSignif=1.e4;
144 if(vrtR<30.){ dstMatSignif=std::abs(vrtR-
m_beampipeR)/vrtRErr;}
150 double minPtT = std::min(tracksForFit[0]->pt(),tracksForFit[1]->pt());
152 float ihitR = selectedTracks[i]->radiusOfFirstHit();
153 float jhitR = selectedTracks[j]->radiusOfFirstHit();
154 int ihitIBL =
getIBLHit(selectedTracks[i]);
155 int jhitIBL =
getIBLHit(selectedTracks[j]);
156 int ihitBL =
getBLHit (selectedTracks[i]);
157 int jhitBL =
getBLHit (selectedTracks[j]);
158 double Prob2v=TMath::Prob(tmpVrt.
chi2,1);
160 ROOT::Math::PxPyPzMVector SVPV(tmpVrt.
fitVertex.x()-primVrt.
x(),
166 if(Charge==0){
h.m_hb_massPiPi->Fill(tmpVrt.
momentum.M(),1.);}
167 h.m_hb_cosSVMom->Fill(cosSVPV,1.);
168 h.m_hb_etaSV->Fill(SVPV.Eta(),1.);
170 double Sig3D=0.,Sig2D=0., Dist2D=0.;
171 int idisk1=0,idisk2=0,idisk3=0,jdisk1=0,jdisk2=0,jdisk3=0;
172 int sumIBLHits = std::max(ihitIBL,0)+std::max(jhitIBL,0);
173 int sumBLHits = std::max(ihitBL, 0)+std::max(jhitBL, 0);
180 h.m_hb_signif3D->Fill(Sig3D,1.);
181 h.m_curTup->VrtTrkHF [
h.m_curTup->n2Vrt] =
getIdHF(tracksForFit[0])+
getIdHF(tracksForFit[1]);
183 h.m_curTup->VrtTrueBar[
h.m_curTup->n2Vrt] = (barVrt1 && barVrt2 && barVrt1==barVrt2) ? 1 : 0;
184 h.m_curTup->VrtTrueNear[
h.m_curTup->n2Vrt] =
checkTrue2TrVrt(tracksForFit[0],tracksForFit[1],0.1);
185 h.m_curTup->VrtCh [
h.m_curTup->n2Vrt] = Charge;
186 h.m_curTup->VrtProb [
h.m_curTup->n2Vrt] = Prob2v;
187 h.m_curTup->VrtSig3D [
h.m_curTup->n2Vrt] = Sig3D;
188 h.m_curTup->VrtSig2D [
h.m_curTup->n2Vrt] = Sig2D;
189 h.m_curTup->VrtDist2D[
h.m_curTup->n2Vrt] = vrtR<20. ? Dist2D : vrtR;
190 h.m_curTup->VrtM [
h.m_curTup->n2Vrt] = tmpVrt.
momentum.M();
191 h.m_curTup->VrtZ [
h.m_curTup->n2Vrt] = tmpVrt.
fitVertex.z();
192 h.m_curTup->VrtPt [
h.m_curTup->n2Vrt] = tmpVrt.
momentum.Pt();
193 h.m_curTup->VrtEta [
h.m_curTup->n2Vrt] = SVPV.Eta();
194 h.m_curTup->VrtIBL [
h.m_curTup->n2Vrt] = sumIBLHits;
195 h.m_curTup->VrtBL [
h.m_curTup->n2Vrt] = sumBLHits;
196 h.m_curTup->VrtCosSPM[
h.m_curTup->n2Vrt] = cosSVPV;
197 h.m_curTup->VMinPtT [
h.m_curTup->n2Vrt] = minPtT;
198 h.m_curTup->VMinS3DT [
h.m_curTup->n2Vrt] = std::min(trackSignif[i],trackSignif[j]);
199 h.m_curTup->VMaxS3DT [
h.m_curTup->n2Vrt] = std::max(trackSignif[i],trackSignif[j]);
200 h.m_curTup->VrtBDT [
h.m_curTup->n2Vrt] = vQuality;
201 h.m_curTup->VrtHR1 [
h.m_curTup->n2Vrt] = ihitR;
202 h.m_curTup->VrtHR2 [
h.m_curTup->n2Vrt] = jhitR;
203 h.m_curTup->VrtDZ [
h.m_curTup->n2Vrt] = minDZ;
204 h.m_curTup->VrtDisk [
h.m_curTup->n2Vrt] = idisk1+10*idisk2+20*idisk3+30*jdisk1+40*jdisk2+50*jdisk3;
205 h.m_curTup->VSigMat [
h.m_curTup->n2Vrt] = dstMatSignif;
206 h.m_curTup->VrtIT [
h.m_curTup->n2Vrt] = i;
207 h.m_curTup->VrtJT [
h.m_curTup->n2Vrt] = j;
213 add_edge(i,j,compatibilityGraph);
215 trkCount[i].emplace_back(j,vQuality); trkCount[j].emplace_back(i,vQuality);
219 for(
int t=0; t<NTracks; t++){
220 if(trkCount[t].
size()==2){
221 i=std::get<0>(trkCount[t][0]);
222 j=std::get<0>(trkCount[t][1]);
223 if(trkCount[i].
size()==1 && trkCount[j].
size()==1 ){
224 if( std::get<1>(trkCount[t][0]) < std::get<1>(trkCount[t][1]) ) {
225 remove_edge(t,i,compatibilityGraph);
226 if(t<i)goodVrt.erase(NTracks*t+i);
else goodVrt.erase(NTracks*i+t);
228 trkCount[t].erase(trkCount[t].begin()+0);
230 remove_edge(t,j,compatibilityGraph);
231 if(t<j)goodVrt.erase(NTracks*t+j);
else goodVrt.erase(NTracks*j+t);
233 trkCount[t].erase(trkCount[t].begin()+1);