From db1d9fc21a4a43fe65748105bca2a4c8a7e9630f Mon Sep 17 00:00:00 2001 From: Vadim Kostyukhin Date: Wed, 16 Sep 2020 14:36:01 +0200 Subject: [PATCH] 1) Better tuning for high-pt jets 2) Some code clean-up --- .../InDetVKalVxInJetTool.h | 15 ++--- .../InDetVKalVxInJetTool/src/BTagVrtSec.cxx | 55 +++++++++++-------- .../src/BTagVrtSecMulti.cxx | 19 +++++-- .../src/InDetVKalVxInJetTool.cxx | 14 ++--- .../InDetVKalVxInJetTool/src/Utilities.cxx | 1 + 5 files changed, 61 insertions(+), 43 deletions(-) diff --git a/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/InDetVKalVxInJetTool/InDetVKalVxInJetTool.h b/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/InDetVKalVxInJetTool/InDetVKalVxInJetTool.h index fd3f55764eb..4304da94a33 100755 --- a/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/InDetVKalVxInJetTool/InDetVKalVxInJetTool.h +++ b/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/InDetVKalVxInJetTool/InDetVKalVxInJetTool.h @@ -144,8 +144,6 @@ namespace InDet { TH1D* m_hb_sig3D2tr{}; TH1D* m_hb_sig3DNtr{}; TH1D* m_hb_trkPtMax{}; - TH1F* m_hb_blshared{}; - TH1F* m_hb_pxshared{}; TH1F* m_hb_rawVrtN{}; TH1F* m_hb_lifetime{}; TH1F* m_hb_trkPErr{}; @@ -203,7 +201,8 @@ namespace InDet { double m_rLayer2{}; double m_rLayer3{}; - bool m_useVertexCleaning{}; + bool m_useVertexCleaningPix{}; + bool m_useVertexCleaningFMP{}; bool m_multiVertex{}; bool m_multiWithPrimary{}; bool m_getNegativeTail{}; @@ -258,7 +257,7 @@ namespace InDet { float wgtB[maxNTrk]; float wgtL[maxNTrk]; float wgtG[maxNTrk]; - float Sig3D[maxNTrk]; + float sig3D[maxNTrk]; int chg[maxNTrk]; int nVrtT[maxNTrk]; float TotM; @@ -267,6 +266,7 @@ namespace InDet { float VrtSig3D[maxNVrt]; float VrtSig2D[maxNVrt]; float VrtDR[maxNVrt]; + float VrtErrR[maxNVrt]; float mass[maxNVrt]; float Chi2[maxNVrt]; int itrk[maxNVrt]; @@ -274,6 +274,7 @@ namespace InDet { int badVrt[maxNVrt]; int ibl[maxNVrt]; int bl[maxNVrt]; + float fhitR[maxNVrt]; int NTHF; int itHF[maxNVrt]; //--- @@ -488,9 +489,9 @@ namespace InDet { StatusCode VKalVrtFitFastBase(const std::vector& listPart,Amg::Vector3D& Vertex, Trk::IVKalState& istate) const; template - bool Check2TrVertexInPixel( const Track* p1, const Track* p2, Amg::Vector3D &, std::vector &) const; + bool check2TrVertexInPixel( const Track* p1, const Track* p2, Amg::Vector3D &, std::vector &) const; template - bool Check1TrVertexInPixel( const Track* p1, Amg::Vector3D &, std::vector & ) const; + bool check1TrVertexInPixel( const Track* p1, Amg::Vector3D &, std::vector & ) const; void getPixelLayers(const xAOD::TrackParticle* Part, int &blHit, int &l1Hit, int &l2Hit, int &nLay) const; void getPixelDiscs(const xAOD::TrackParticle* Part, int &d0Hit, int &d1Hit, int &d2Hit) const; @@ -548,7 +549,7 @@ namespace InDet { }; template - bool InDetVKalVxInJetTool::Check1TrVertexInPixel( const Track* p1, Amg::Vector3D &FitVertex, std::vector &VrtCov) + bool InDetVKalVxInJetTool::check1TrVertexInPixel( const Track* p1, Amg::Vector3D &FitVertex, std::vector &VrtCov) const { int blTrk=0, blP=0, l1Trk=0, l1P=0, l2Trk=0, nLays=0; diff --git a/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/BTagVrtSec.cxx b/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/BTagVrtSec.cxx index ff661fb9eac..8b97cb857af 100755 --- a/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/BTagVrtSec.cxx +++ b/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/BTagVrtSec.cxx @@ -196,24 +196,21 @@ namespace InDet{ if( listSecondTracks.size()==2 ){ // If there are 2 only tracks if(msgLvl(MSG::DEBUG))msg(MSG::DEBUG)<<" Start Ntr=2 vertex check"<charge(); - uint8_t retval=0; - if( i_ntrk->summaryValue( retval, xAOD::numberOfPixelSharedHits) ) PXshared += retval; - if( i_ntrk->summaryValue( retval, xAOD::numberOfInnermostPixelLayerSharedHits) ) BLshared += retval; - } + for (auto i_ntrk : listSecondTracks) { Charge += (int) i_ntrk->charge();} vrtVrtDist(primVrt, fitVertex, errorMatrix, Signif3D); - if(m_useVertexCleaning){ - if(!Check2TrVertexInPixel(listSecondTracks[0],listSecondTracks[1],fitVertex,errorMatrix)) return 0; - if(m_fillHist){ - double xDif=fitVertex.x()-m_xLayerB, yDif=fitVertex.y()-m_yLayerB ; - double Dist2D=std::sqrt(xDif*xDif+yDif*yDif); - if (Dist2D < m_rLayerB-vrtRadiusError(fitVertex,errorMatrix)) m_hb_blshared->Fill((float)BLshared,m_w_1); - else if(Dist2D > m_rLayerB+vrtRadiusError(fitVertex,errorMatrix)) m_hb_pxshared->Fill((float)PXshared,m_w_1); - } - } //end 2tr vertex cleaning code +// Check track pixel hit patterns vs vertex position. + if(m_useVertexCleaningPix){ + if(!check2TrVertexInPixel(listSecondTracks[0],listSecondTracks[1],fitVertex,errorMatrix)) return 0; + } +// Check track first measured points vs vertex position. + if(m_useVertexCleaningFMP){ + float hitR1 = listSecondTracks[0]->radiusOfFirstHit(); + float hitR2 = listSecondTracks[1]->radiusOfFirstHit(); + float vrErr = vrtRadiusError(fitVertex, errorMatrix); + if(std::abs(hitR1-hitR2)>25.) return 0; // Hits in different pixel layers + if( fitVertex.perp()-std::min(hitR1,hitR2) > 2.*vrErr) return 0; // Vertex is behind hit in pixel + } +//-------- // if(m_fillHist){ if(Charge){m_hb_totmass2T1->Fill(Momentum.M(),m_w_1);}else{m_hb_totmass2T0->Fill(Momentum.M(),m_w_1);} } if( !Charge && std::abs(Momentum.M()-m_massK0)<15. ) { // Final rejection of K0 @@ -522,10 +519,11 @@ namespace InDet{ if(getIdHF(selectedTracks[i]))m_curTup->idMC[i]=2; if(getMCPileup(selectedTracks[i]))m_curTup->idMC[i]=3; m_curTup->wgtB[i]=trkScore[i][0]; m_curTup->wgtL[i]=trkScore[i][1]; m_curTup->wgtG[i]=trkScore[i][2]; - m_curTup->Sig3D[i]=TrkSig3D[i]; + m_curTup->sig3D[i]=TrkSig3D[i]; m_curTup->chg[i]=tmpPerigee[4]<0. ? 1: -1; m_curTup->ibl[i]=hitIBL[i]; m_curTup->bl[i]=hitBL[i]; + m_curTup->fhitR[i]=selectedTracks[i]->radiusOfFirstHit(); TLorentzVector TLV=selectedTracks[i]->p4(); m_curTup->pTvsJet[i]=TLV.Perp(jetDir.Vect()); TLorentzVector normJ; normJ.SetPtEtaPhiM(1.,jetDir.Eta(),jetDir.Phi(),0.); @@ -569,7 +567,7 @@ namespace InDet{ } m_fitSvc->setApproximateVertex(iniVrt.x(), iniVrt.y(), iniVrt.z(),*state); tmpVrt.i=i; tmpVrt.j=j; - m_fitSvc->setRobustness(4, *state); + m_fitSvc->setRobustness(6, *state); sc=VKalVrtFitBase(tracksForFit,tmpVrt.fitVertex, tmpVrt.momentum, Charge, tmpVrt.errorMatrix, tmpVrt.chi2PerTrk, tmpVrt.trkAtVrt, tmpVrt.chi2, *state, true); @@ -578,13 +576,15 @@ namespace InDet{ if(std::abs(tmpVrt.fitVertex.z())> 650.) continue; // definitely outside of Pixel detector Dist2D=tmpVrt.fitVertex.perp(); if(Dist2D > 180. ) continue; // can't be from B decay + + double vrErr = vrtRadiusError(tmpVrt.fitVertex, tmpVrt.errorMatrix); + if(vrErr>1.5&&getVrtScore(i,j,trkScore) < 4.*m_cutBVrtScore) continue; + double mass_PiPi = tmpVrt.momentum.M(); if(mass_PiPi > m_Vrt2TrMassLimit) continue; // can't be from B decay vrtVrtDist(primVrt, tmpVrt.fitVertex, tmpVrt.errorMatrix, Signif3D); tmpVrt.signif3D=Signif3D; vrtVrtDist2D(primVrt, tmpVrt.fitVertex, tmpVrt.errorMatrix, tmpVrt.signif2D); -//This selection should not be used in the multi-vertex with primary mode - if(!m_multiWithPrimary)if(getVrtScore(i,j,trkScore)*(1.-TMath::Prob(Signif3D*Signif3D,3)) < m_cutBVrtScore) continue; //--- TVector3 SVmPV(tmpVrt.fitVertex.x()-primVrt.x(),tmpVrt.fitVertex.y()-primVrt.y(),tmpVrt.fitVertex.z()-primVrt.z()); tmpVrt.dRSVPV=jetDir.DeltaR(TLorentzVector(SVmPV, 1.)); //DeltaR SV-PV vs jet @@ -595,8 +595,15 @@ namespace InDet{ if((!m_multiWithPrimary) &&(!m_getNegativeTail) && (!m_getNegativeTag) && jetVrtDir<0. ) continue; /* secondary vertex behind primary*/ if(vPos<-100.) continue; /* Secondary vertex is too far behind primary*/ // -// Check pixel hits vs vertex positions. - if(m_useVertexCleaning && !Check2TrVertexInPixel(selectedTracks[i],selectedTracks[j],tmpVrt.fitVertex,tmpVrt.errorMatrix)) continue; +// Check track pixel hit patterns vs vertex position. + if(m_useVertexCleaningPix && !check2TrVertexInPixel(selectedTracks[i],selectedTracks[j],tmpVrt.fitVertex,tmpVrt.errorMatrix)) continue; +// Check track first measured points vs vertex position. + if(m_useVertexCleaningFMP){ + float ihitR = selectedTracks[i]->radiusOfFirstHit(); + float jhitR = selectedTracks[j]->radiusOfFirstHit(); + if(std::abs(ihitR-jhitR)>25.) continue; // Hits in different pixel layers + if( tmpVrt.fitVertex.perp()-std::min(ihitR,jhitR) > 2.*vrErr) continue; // Vertex is behind hit in pixel + } //-------- // double signif3Dproj=vrtVrtDist( primVrt, tmpVrt.fitVertex, tmpVrt.errorMatrix, jetDir); @@ -776,7 +783,7 @@ namespace InDet{ template - bool InDetVKalVxInJetTool::Check2TrVertexInPixel( const Track* p1, const Track* p2, + bool InDetVKalVxInJetTool::check2TrVertexInPixel( const Track* p1, const Track* p2, Amg::Vector3D &fitVertex, std::vector & vrtErr) const { diff --git a/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/BTagVrtSecMulti.cxx b/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/BTagVrtSecMulti.cxx index 3971a4807f7..13e8cdfd297 100755 --- a/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/BTagVrtSecMulti.cxx +++ b/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/BTagVrtSecMulti.cxx @@ -450,7 +450,7 @@ InDetVKalVxInJetTool::getVrtSecMulti(workVectorArrxAOD* xAODwrk, vrtVrtDist(primVrt,curVrt.vertex, curVrt.vertexCov, Signif3D); //VK non-projected Signif3D is worse double tmpProb=TMath::Prob( curVrt.chi2, 1); //Chi2 of the original 2tr vertex bool trkGood=false; - if(xAODwrk)trkGood=Check1TrVertexInPixel(xAODwrk->listJetTracks[curVrt.selTrk[0]],curVrt.vertex,curVrt.vertexCov); + if(xAODwrk)trkGood=check1TrVertexInPixel(xAODwrk->listJetTracks[curVrt.selTrk[0]],curVrt.vertex,curVrt.vertexCov); if(trkGood && tmpProb>0.01){ /* accept only good tracks coming from good 2tr vertex*/ //if( useMaterialRejection && insideMatLayer(curVrt.vertex.x(),curVrt.vertex.y()) ) continue; std::vector Impact,ImpactError; double Signif3DP = 0; @@ -489,10 +489,19 @@ InDetVKalVxInJetTool::getVrtSecMulti(workVectorArrxAOD* xAODwrk, // Dist3D=((*wrkVrtSet)[iv].vertex-primVrt.position()).mag(); /* Not needed currently*/ // if(PrmVrtAdded && iv==PrmVrtAdded && Dist3D<3.5) continue; /* Skip added primary vertex */ //----------------------------------------------------------------------------------------- - if(nth==2 && m_useVertexCleaning){ - if(xAODwrk){ - if(!Check2TrVertexInPixel(xAODwrk->tmpListTracks[0],xAODwrk->tmpListTracks[1],curVrt.vertex,curVrt.vertexCov))continue; - } + if(nth==2 && xAODwrk){ +// Check track pixel hit patterns vs vertex position. + if(m_useVertexCleaningPix){ + if(!check2TrVertexInPixel(xAODwrk->tmpListTracks[0],xAODwrk->tmpListTracks[1],curVrt.vertex,curVrt.vertexCov))continue; + } +// Check track first measured points vs vertex position. + if(m_useVertexCleaningFMP){ + float ihitR = xAODwrk->tmpListTracks[0]->radiusOfFirstHit(); + float jhitR = xAODwrk->tmpListTracks[1]->radiusOfFirstHit(); + float vrErr = vrtRadiusError(curVrt.vertex, curVrt.vertexCov); + if(std::abs(ihitR-jhitR)>25.) continue; // Hits in different pixel layers + if( curVrt.vertex.perp()-std::min(ihitR,jhitR) > 2.*vrErr) continue; // Vertex is behind hit in pixel + } } // //--- Check interactions on pixel layers diff --git a/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/InDetVKalVxInJetTool.cxx b/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/InDetVKalVxInJetTool.cxx index f2c8e4a0935..ca297c489c9 100755 --- a/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/InDetVKalVxInJetTool.cxx +++ b/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/InDetVKalVxInJetTool.cxx @@ -62,7 +62,8 @@ InDetVKalVxInJetTool::InDetVKalVxInJetTool(const std::string& type, m_rLayerB (0.), // in jobO or initialize() m_rLayer1 (0.), m_rLayer2 (0.), - m_useVertexCleaning(false), + m_useVertexCleaningPix(false), + m_useVertexCleaningFMP(false), m_multiVertex(false), m_multiWithPrimary(false), m_getNegativeTail(false), @@ -120,7 +121,8 @@ InDetVKalVxInJetTool::InDetVKalVxInJetTool(const std::string& type, declareProperty("Rlayer1", m_rLayer1 ); declareProperty("Rlayer2", m_rLayer2 ); - declareProperty("useVertexCleaning", m_useVertexCleaning, "Clean vertices by requiring pixel hit presence according to vertex position" ); + declareProperty("useVertexCleaningPix", m_useVertexCleaningPix, "Clean vertices requiring track pixel hit patterns according to vertex position" ); + declareProperty("useVertexCleaningFMP", m_useVertexCleaningFMP, "Clean vertices requiring track F(irst) M(easured) P(oints) matching to vertex position" ); declareProperty("MultiVertex", m_multiVertex, "Run Multiple Secondary Vertices in jet finder" ); declareProperty("MultiWithPrimary", m_multiWithPrimary, "Find Multiple Secondary Vertices + primary vertex in jet. MultiVertex Finder only!" ); @@ -245,8 +247,6 @@ InDetVKalVxInJetTool::InDetVKalVxInJetTool(const std::string& type, m_hb_distVV = new TH1D("distvv","Vertex-Vertex dist", 100,0., 20.); m_hb_diffPS = new TH1D("diffPS","Primary-Secondary assoc", 200,-20., 20.); m_hb_trkPtMax = new TH1D("trkPtMax","Maximal track Pt to jet", 100, 0., 5000.); - m_hb_blshared = new TH1F("blshared","Number of shared hits in B-layer for RBL", 5, 0., 5.); m_hb_rawVrtN = new TH1F("rawVrtN","Number of raw vertices multivertex case", 20, 0., 20.); m_hb_lifetime = new TH1F("lifetime","Distance/momentum", 100, 0., 5.); m_hb_trkPErr = new TH1F("trkPErr","Track momentum error for P>10 GeV", 100, 0., 0.5); @@ -299,8 +299,6 @@ InDetVKalVxInJetTool::InDetVKalVxInJetTool(const std::string& type, sc = hist_root->regHist(histDir+"distVV", m_hb_distVV); sc = hist_root->regHist(histDir+"diffPS", m_hb_diffPS); sc = hist_root->regHist(histDir+"trkPtMax", m_hb_trkPtMax); - sc = hist_root->regHist(histDir+"blshared", m_hb_blshared); - sc = hist_root->regHist(histDir+"pxshared", m_hb_pxshared); sc = hist_root->regHist(histDir+"rawVrtN", m_hb_rawVrtN); sc = hist_root->regHist(histDir+"lifetime", m_hb_lifetime); sc = hist_root->regHist(histDir+"trkPErr", m_hb_trkPErr); @@ -332,10 +330,11 @@ InDetVKalVxInJetTool::InDetVKalVxInJetTool(const std::string& type, m_tuple->Branch("wgtB", &m_curTup->wgtB, "wgtB[ntrk]/F"); m_tuple->Branch("wgtL", &m_curTup->wgtL, "wgtL[ntrk]/F"); m_tuple->Branch("wgtG", &m_curTup->wgtG, "wgtG[ntrk]/F"); - m_tuple->Branch("Sig3D", &m_curTup->Sig3D, "Sig3D[ntrk]/F"); + m_tuple->Branch("sig3D", &m_curTup->sig3D, "sig3D[ntrk]/F"); m_tuple->Branch("idMC", &m_curTup->idMC, "idMC[ntrk]/I"); m_tuple->Branch("ibl", &m_curTup->ibl, "ibl[ntrk]/I"); m_tuple->Branch("bl", &m_curTup->bl, "bl[ntrk]/I"); + m_tuple->Branch("fhitR", &m_curTup->fhitR, "fhitRR[ntrk]/F"); m_tuple->Branch("SigR", &m_curTup->SigR, "SigR[ntrk]/F"); m_tuple->Branch("SigZ", &m_curTup->SigZ, "SigZ[ntrk]/F"); m_tuple->Branch("d0", &m_curTup->d0, "d0[ntrk]/F"); @@ -352,6 +351,7 @@ InDetVKalVxInJetTool::InDetVKalVxInJetTool(const std::string& type, m_tuple->Branch("VrtSig3D", &m_curTup->VrtSig3D, "VrtSig3D[nvrt]/F"); m_tuple->Branch("VrtSig2D", &m_curTup->VrtSig2D, "VrtSig2D[nvrt]/F"); m_tuple->Branch("VrtDR", &m_curTup->VrtDR, "VrtDR[nvrt]/F"); + m_tuple->Branch("VrtErrR", &m_curTup->VrtErrR, "VrtErrR[nvrt]/F"); m_tuple->Branch("itrk", &m_curTup->itrk, "itrk[nvrt]/I"); m_tuple->Branch("jtrk", &m_curTup->jtrk, "jtrk[nvrt]/I"); m_tuple->Branch("badV", &m_curTup->badVrt, "badV[nvrt]/I"); diff --git a/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/Utilities.cxx b/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/Utilities.cxx index 486b9f8105d..afdf92fa24e 100755 --- a/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/Utilities.cxx +++ b/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/Utilities.cxx @@ -605,6 +605,7 @@ namespace InDet{ m_curTup->Chi2[ipnt]=vrt.chi2; m_curTup->badVrt[ipnt]=vrt.badVrt; m_curTup->VrtDR[ipnt]=vrt.dRSVPV; + m_curTup->VrtErrR[ipnt]= vrtRadiusError(vrt.fitVertex, vrt.errorMatrix); ipnt++; m_curTup->nVrt=ipnt; } } -- GitLab