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);