13 #include "GaudiKernel/ITHistSvc.h"
14 #include "GaudiKernel/IChronoStatSvc.h"
15 #include "GaudiKernel/ConcurrencyFlags.h"
31 const std::string&
name,
38 m_cutSharedHits(1000),
45 m_sel2VrtChi2Cut(10.0),
50 m_cutBVrtScore(0.015),
51 m_vrt2TrMassLimit(4000.),
52 m_useFrozenVersion(false),
61 m_useVertexCleaningPix(false),
62 m_useVertexCleaningFMP(false),
63 m_rejectBadVertices(false),
65 m_multiWithPrimary(false),
66 m_getNegativeTail(false),
67 m_getNegativeTag(false),
68 m_multiWithOneTrkVrt(true),
71 m_fitterSvc(
"Trk::TrkVKalVrtFitter/VertexFitterTool",this),
72 m_trackClassificator(
"InDet::InDetTrkInJetType",this),
73 m_useITkMaterialRejection(false),
74 m_beamPipeMgr(nullptr),
75 m_pixelManager(nullptr)
80 declareInterface< ISecVertexInJetFinder >(
this);
100 declareProperty(
"CutBVrtScore",
m_cutBVrtScore,
"B vertex selection cut on 2track vertex score (probability-like) based on track classification" );
110 declareProperty(
"RobustFit",
m_RobustFit,
"Use vertex fit with RobustFit functional(VKalVrt) for common secondary vertex fit" );
120 declareProperty(
"getNegativeTail",
m_getNegativeTail,
"Allow secondary vertex behind the primary one (negative) w/r jet direction (not for multivertex!)" );
151 ATH_MSG_DEBUG(
"Using InDetEtaDependentCutsSvc. Individual inclusive track selections from config not used");
154 ATH_MSG_DEBUG(
"Using individual inclusive track selections from config");
159 return StatusCode::SUCCESS;
166 return StatusCode::SUCCESS;
189 ATH_MSG_FATAL(
"Filling histograms not supported in MT jobs.");
190 return StatusCode::FAILURE;
193 ITHistSvc* hist_root=
nullptr;
194 ATH_CHECK( service(
"THistSvc", hist_root) );
200 m_h = std::make_unique<Hists>();
214 for(
int ntv=2; ntv<=10; ntv++)
m_chiScale[ntv]=TMath::ChisquareQuantile(0.9,2.*ntv-3.)/ntv;
232 return StatusCode::SUCCESS;
237 const std::string& histDir)
255 m_hb_r2d =
new TH1D(
"r2interact",
"Interaction radius 2tr selected", 150,0., 150.);
256 m_hb_r1dc =
new TH1D(
"r1interactCommon",
"Interaction 1tr radius common", 150,0., 150.);
257 m_hb_r2dc =
new TH1D(
"r2interactCommon",
"Interaction 2tr radius common", 150,0., 150.);
258 m_hb_r3dc =
new TH1D(
"r3interactCommon",
"Interaction 3tr radius common", 150,0., 150.);
259 m_hb_rNdc =
new TH1D(
"rNinteractCommon",
"Interaction Ntr radius common", 150,0., 150.);
264 m_hb_mom =
new TH1D(
"jetmomvrt",
" Jet mom with sec. vertex", 200,0., 2000000.);
265 m_hb_signif3D =
new TH1D(
"signif3D",
" Signif3D for initial 2tr vertex", 140,-20., 50.);
266 m_hb_sig3DTot =
new TH1D(
"sig3dcommon",
" Signif3D for common vertex", 140,-20., 50.);
268 m_hb_sig3D2tr =
new TH1D(
"sig3D2tr",
"Signif3D for 2tr single vertex", 140,-20., 50.);
269 m_hb_sig3DNtr =
new TH1D(
"sig3DNtr",
"Signif3D for many-tr single vertex", 140,-20., 50.);
272 m_hb_diffPS =
new TH1D(
"diffPS",
"Primary-Secondary assoc", 200,-20., 20.);
274 m_hb_rawVrtN =
new TH1F(
"rawVrtN",
"Number of raw vertices multivertex case", 20, 0., 20.);
276 m_hb_trkPErr =
new TH1F(
"trkPErr",
"Track momentum error for P>10 GeV", 100, 0., 0.5);
329 m_tuple =
new TTree(
"Tracks",
"Tracks");
387 return StatusCode::SUCCESS;
395 return StatusCode::SUCCESS;
402 const TLorentzVector & jetDir,
403 const std::vector<const xAOD::IParticle*> & IInpTrk)
407 std::vector<const xAOD::TrackParticle*> InpTrk;
408 std::vector<const xAOD::TrackParticle*> SelSecTrk;
409 std::vector< std::vector<const xAOD::TrackParticle*> > SelSecTrkPerVrt;
410 std::vector<const xAOD::TrackParticle*> xaodTrkFromV0;
411 std::vector<xAOD::Vertex*> listVrtSec(0);
412 double SecVtxMass = 0.;
414 double EnergyJet = 0.;
415 int N2trVertices = 0 ;
422 h.m_curTup->nTrkInJet=0;
425 h.m_curTup->TotM=0.;
h.m_curTup->ewgt=1.;
433 InpTrk.clear(); InpTrk.reserve(IInpTrk.size());
434 std::vector<const xAOD::IParticle*>::const_iterator i_itrk;
435 for (i_itrk = IInpTrk.begin(); i_itrk < IInpTrk.end(); ++i_itrk) {
437 if(
tmp)InpTrk.push_back(
tmp);
441 std::unique_ptr<workVectorArrxAOD> tmpVectxAOD= std::make_unique<workVectorArrxAOD>();
442 tmpVectxAOD->InpTrk.resize(InpTrk.size());
443 std::copy(InpTrk.begin(),InpTrk.end(), tmpVectxAOD->InpTrk.begin());
445 SelSecTrkPerVrt.swap(tmpVectxAOD->FoundSecondTracks);
446 xaodTrkFromV0.swap(tmpVectxAOD->TrkFromV0);
450 if(secVrt !=
nullptr) listVrtSec.push_back(secVrt);
453 h.m_pr_effVrt->Fill((
float)nRefPVTrk,0.);
454 h.m_pr_effVrtEta->Fill( jetDir.Eta(),0.);
468 std::vector<const xAOD::IParticle*> iparTrkFromV0(0);
469 for(
auto &
i : xaodTrkFromV0)iparTrkFromV0.push_back(
i);
479 catch (std::bad_alloc& ba){
480 ATH_MSG_DEBUG(
"Trk::VxSecVKalVertexInfo allocation failure! "<< ba.what());