33 std::map<
long int,std::vector<double>> & goodVrt,
37 std::vector<const xAOD::NeutralParticle*> neutralPartDummy(0);
38 std::vector<const xAOD::TrackParticle*> tracksForFit(2,
nullptr);
39 std::vector<double> impact,impactError;
40 std::vector<double> inpMass(2,
m_massPi);
45 std::vector<Vrt2Tr> all2TrVrt(0);
46 TLorentzVector PSum2T;
49 int NTracks = (
int) (selectedTracks.size());
54 double signifR=0.,signifZ=0.;
55 std::vector<int> nPixHits(NTracks,0);
56 std::vector<double> trackSignif(NTracks),dRdZratio(NTracks);
57 for (
i=0;
i<NTracks;
i++) {
58 m_fitSvc->VKalGetImpact(selectedTracks[
i], primVrt.
position(), 1, impact, impactError);
59 signifR = impact[0]/ sqrt(impactError[0]);
60 signifZ = impact[1]/ sqrt(impactError[2]);
61 trackSignif[
i] = sqrt( signifR*signifR + signifZ*signifZ);
62 dRdZratio[
i] = std::abs(signifR/signifZ);
67 h.m_hb_impactR->Fill( signifR,
m_w_1);
68 h.m_hb_impactZ->Fill( signifZ,
m_w_1);
69 h.m_hb_impactRZ->Fill(signifR, signifZ,
m_w_1);
70 h.m_hb_impact->Fill( trackSignif[
i],
m_w_1);
73 h.m_curTup->pttrk[
i]=selectedTracks[
i]->pt();
74 h.m_curTup->d0trk[
i]=selectedTracks[
i]->d0();
75 h.m_curTup->Sig3D[
i]=trackSignif[
i];
76 h.m_curTup->idHF[
i] =
getIdHF(selectedTracks[
i]);
77 h.m_curTup->dRdZrat[
i] =dRdZratio[
i];
82 h.m_curTup->trkTRT[
i] =TRTHits;
83 h.m_curTup->etatrk[
i] =selectedTracks[
i]->eta();
94 std::vector<std::vector<std::tuple<int,float>>> trkCount(NTracks);
95 std::unique_ptr<Trk::IVKalState> state =
m_fitSvc->makeState();
96 m_fitSvc->setMassInputParticles( inpMass, *state );
97 for (
i=0;
i<NTracks-1;
i++) {
99 for (j=
i+1; j<NTracks; j++) {
101 PSum2T=selectedTracks[
i]->p4()+selectedTracks[j]->p4();
102 if( std::abs(selectedTracks[
i]->eta()-selectedTracks[j]->eta())==0 &&
103 std::abs(selectedTracks[
i]->phi()-selectedTracks[j]->phi())==0 &&
104 std::abs(selectedTracks[
i]->
pt() -selectedTracks[j]->
pt())==0 )
continue;
105 tracksForFit[0]=selectedTracks[
i];
106 tracksForFit[1]=selectedTracks[j];
109 if(
sc.isFailure() ) {
113 if( cosMomVrtDir>0. ) iniVrt=tmpVrt.
fitVertex;
116 if(nPixHits[
i]>0 && nPixHits[j]>0){
if(minDZ>
m_fastZSVCut)
continue; }
118 m_fitSvc->setApproximateVertex(iniVrt.x(), iniVrt.y(), iniVrt.z(), *state);
121 if(
sc.isFailure())
continue;
122 if(tmpVrt.
chi2>20.)
continue;
132 bool acceptV=
m_ini_v2trselector->isgood(std::make_pair(selectedTracks[
i],selectedTracks[j]), testV,
134 if(!acceptV)
continue;
139 double dstMatSignif=1.e4;
142 if(vrtR<30.){ dstMatSignif=std::abs(vrtR-
m_beampipeR)/vrtRErr;}
148 double minPtT =
std::min(tracksForFit[0]->
pt(),tracksForFit[1]->
pt());
150 float ihitR = selectedTracks[
i]->radiusOfFirstHit();
151 float jhitR = selectedTracks[j]->radiusOfFirstHit();
153 int jhitIBL =
getIBLHit(selectedTracks[j]);
154 int ihitBL =
getBLHit (selectedTracks[
i]);
155 int jhitBL =
getBLHit (selectedTracks[j]);
156 double Prob2v=TMath::Prob(tmpVrt.
chi2,1);
158 ROOT::Math::PxPyPzMVector SVPV(tmpVrt.
fitVertex.x()-primVrt.
x(),
164 if(Charge==0){
h.m_hb_massPiPi->Fill(tmpVrt.
momentum.M(),1.);}
165 h.m_hb_cosSVMom->Fill(cosSVPV,1.);
166 h.m_hb_etaSV->Fill(SVPV.Eta(),1.);
168 double Sig3D=0.,Sig2D=0., Dist2D=0.;
169 int idisk1=0,idisk2=0,idisk3=0,jdisk1=0,jdisk2=0,jdisk3=0;
178 h.m_hb_signif3D->Fill(Sig3D,1.);
179 h.m_curTup->VrtTrkHF [
h.m_curTup->n2Vrt] =
getIdHF(tracksForFit[0])+
getIdHF(tracksForFit[1]);
181 h.m_curTup->VrtTrueBar[
h.m_curTup->n2Vrt] = (barVrt1 && barVrt2 && barVrt1==barVrt2) ? 1 : 0;
182 h.m_curTup->VrtTrueNear[
h.m_curTup->n2Vrt] =
checkTrue2TrVrt(tracksForFit[0],tracksForFit[1],0.1);
183 h.m_curTup->VrtCh [
h.m_curTup->n2Vrt] = Charge;
184 h.m_curTup->VrtProb [
h.m_curTup->n2Vrt] = Prob2v;
185 h.m_curTup->VrtSig3D [
h.m_curTup->n2Vrt] = Sig3D;
186 h.m_curTup->VrtSig2D [
h.m_curTup->n2Vrt] = Sig2D;
187 h.m_curTup->VrtDist2D[
h.m_curTup->n2Vrt] = vrtR<20. ? Dist2D : vrtR;
188 h.m_curTup->VrtM [
h.m_curTup->n2Vrt] = tmpVrt.
momentum.M();
189 h.m_curTup->VrtZ [
h.m_curTup->n2Vrt] = tmpVrt.
fitVertex.z();
190 h.m_curTup->VrtPt [
h.m_curTup->n2Vrt] = tmpVrt.
momentum.Pt();
191 h.m_curTup->VrtEta [
h.m_curTup->n2Vrt] = SVPV.Eta();
192 h.m_curTup->VrtIBL [
h.m_curTup->n2Vrt] = sumIBLHits;
193 h.m_curTup->VrtBL [
h.m_curTup->n2Vrt] = sumBLHits;
194 h.m_curTup->VrtCosSPM[
h.m_curTup->n2Vrt] = cosSVPV;
195 h.m_curTup->VMinPtT [
h.m_curTup->n2Vrt] = minPtT;
196 h.m_curTup->VMinS3DT [
h.m_curTup->n2Vrt] =
std::min(trackSignif[
i],trackSignif[j]);
197 h.m_curTup->VMaxS3DT [
h.m_curTup->n2Vrt] =
std::max(trackSignif[
i],trackSignif[j]);
198 h.m_curTup->VrtBDT [
h.m_curTup->n2Vrt] = vQuality;
199 h.m_curTup->VrtHR1 [
h.m_curTup->n2Vrt] = ihitR;
200 h.m_curTup->VrtHR2 [
h.m_curTup->n2Vrt] = jhitR;
201 h.m_curTup->VrtDZ [
h.m_curTup->n2Vrt] = minDZ;
202 h.m_curTup->VrtDisk [
h.m_curTup->n2Vrt] = idisk1+10*idisk2+20*idisk3+30*jdisk1+40*jdisk2+50*jdisk3;
203 h.m_curTup->VSigMat [
h.m_curTup->n2Vrt] = dstMatSignif;
204 h.m_curTup->VrtIT [
h.m_curTup->n2Vrt] =
i;
205 h.m_curTup->VrtJT [
h.m_curTup->n2Vrt] = j;
211 add_edge(
i,j,compatibilityGraph);
213 trkCount[
i].emplace_back(j,vQuality); trkCount[j].emplace_back(
i,vQuality);
217 for(
int t=0;
t<NTracks;
t++){
218 if(trkCount[
t].
size()==2){
219 i=std::get<0>(trkCount[
t][0]);
220 j=std::get<0>(trkCount[
t][1]);
221 if(trkCount[
i].
size()==1 && trkCount[j].
size()==1 ){
222 if( std::get<1>(trkCount[
t][0]) < std::get<1>(trkCount[
t][1]) ) {
223 remove_edge(
t,
i,compatibilityGraph);
224 if(
t<
i)goodVrt.erase(NTracks*
t+
i);
else goodVrt.erase(NTracks*
i+
t);
226 trkCount[
t].erase(trkCount[
t].
begin()+0);
228 remove_edge(
t,j,compatibilityGraph);
229 if(
t<j)goodVrt.erase(NTracks*
t+j);
else goodVrt.erase(NTracks*j+
t);
231 trkCount[
t].erase(trkCount[
t].
begin()+1);