27 m_hPvNPriVtx(nullptr),
28 m_hPvNPileupVtx(nullptr),
37 m_hPvChiSqDoF(nullptr),
38 m_hPvNTracks(nullptr),
39 m_hPvTrackPt(nullptr),
40 m_hPvTrackEta(nullptr),
42 m_hVrt_XpullVsNtrkAverage_split(nullptr),
43 m_hVrt_YpullVsNtrkAverage_split(nullptr),
44 m_hVrt_ZpullVsNtrkAverage_split(nullptr),
46 m_hVrt_XpullVsPt2Average_split(nullptr),
47 m_hVrt_YpullVsPt2Average_split(nullptr),
48 m_hVrt_ZpullVsPt2Average_split(nullptr),
50 m_hVrt_Xerr_vs_ntrk(nullptr),
51 m_hVrt_Yerr_vs_ntrk(nullptr),
52 m_hVrt_Zerr_vs_ntrk(nullptr),
54 m_hVrt_Xerr_vs_pt2(nullptr),
55 m_hVrt_Yerr_vs_pt2(nullptr),
56 m_hVrt_Zerr_vs_pt2(nullptr),
57 m_hVrt_split_tag_ntrk(nullptr),
58 m_hVrt_split_probe_ntrk(nullptr),
59 m_hVrt_split_matched_tag_ntrk(nullptr),
60 m_hVrt_split_matched_probe_ntrk(nullptr),
61 m_hVrt_split_dist_tag(nullptr),
62 m_hVrt_split_dist_probe(nullptr),
63 m_histFolder(
"InDetGlobal/PrimaryVertex"),
64 m_splitVertexTrkInvFraction(2),
65 m_distanceSplitVxMatch(5.0),
66 m_splitMatchingMetric(3),
67 m_doEnhancedMonitoring(false)
72 declareProperty(
"splitMatchingMetric",
m_splitMatchingMetric,
"Determines which function to use to calculate matching between split vertices and original input vertex -- used in selection efficiency");
73 declareProperty(
"doEnhancedMonitoring" ,
m_doEnhancedMonitoring,
"turn on the enhanced vertex monitoring, it is triggered by the same InDetFlag that also triggers the creation of no beam constraint and split vertices");
81 if(!
sc.isSuccess())
return sc;
87 return StatusCode::SUCCESS;
101 m_hPvN =
makeAndRegisterTH1F(al_primaryvertex_shift,
"pvN",
"Total number of vertices (primary and pile up);Total number of vertices",50,0.,50.);
103 ATH_MSG_WARNING (
"Unable to book histogram with name = "+std::string(
"pvN_LB"));
123 float minBinNTrk(-0.5);
float maxBinNTrk(149.5);
unsigned int numBinsNTrk((
unsigned int)(maxBinNTrk-minBinNTrk));
124 float minBinSumPt2(0.);
float maxBinSumPt2(20.);
unsigned int numBinsSumPt2((
unsigned int)( (maxBinSumPt2-minBinSumPt2) / 0.25 ));
139 m_hVrt_Xerr_vs_pt2 =
makeAndRegisterTH2F(al_primaryvertex_expert,
"Vrt_Xerr_vs_pt2",
"Entries;#sqrt{#sum p_{T}^{2}} [GeV];x vertex Error [mm]", numBinsSumPt2, minBinSumPt2, maxBinSumPt2, 200, 0., 1.);
140 m_hVrt_Yerr_vs_pt2 =
makeAndRegisterTH2F(al_primaryvertex_expert,
"Vrt_Yerr_vs_pt2",
"Entries;#sqrt{#sum p_{T}^{2}} [GeV];y vertex Error [mm]", numBinsSumPt2, minBinSumPt2, maxBinSumPt2, 200, 0., 1.);
141 m_hVrt_Zerr_vs_pt2 =
makeAndRegisterTH2F(al_primaryvertex_expert,
"Vrt_Zerr_vs_pt2",
"Entries;#sqrt{#sum p_{T}^{2}} [GeV];z vertex Error [mm]", numBinsSumPt2, minBinSumPt2, maxBinSumPt2, 400, 0., 2.);
145 m_hVrt_split_probe_ntrk =
makeAndRegisterTH1F(al_primaryvertex_expert,
"Vrt_split_probe_ntrk",
"N. events with both tag and probe reconstructed;Number of tracks @ probe vertex", numBinsNTrk, minBinNTrk, maxBinNTrk);
187 return StatusCode::SUCCESS;
197 return StatusCode::SUCCESS;
201 return StatusCode::SUCCESS;
221 if ((*vxIter)->numberDoF() <= 0)
continue;
234 const auto & trackparticles = (*vxIter)->trackParticleLinks();
240 for (
const auto& trackparticle : trackparticles )
242 const Trk::Perigee & measuredPerigee = (*trackparticle)->perigeeParameters();
254 if (!vxContainerWithoutBeamConstraint.
isPresent()) {
256 return StatusCode::SUCCESS;
258 if (!vxContainerWithoutBeamConstraint.
isValid()) {
260 return StatusCode::SUCCESS;
266 return StatusCode::SUCCESS;
268 if (!vxContainerSplit.
isValid()) {
270 return StatusCode::SUCCESS;
278 if ((*vxIter)->numberDoF() <= 0)
continue;
283 if ((*vxIter)->vxTrackAtVertexAvailable())
285 std::vector<Trk::VxTrackAtVertex> vxTrackAtVertex = (*vxIter)->vxTrackAtVertex();
289 trkIter != vxTrackAtVertex.end() ; ++trkIter)
293 if (measuredPerigee ==
nullptr) measuredPerigee =
dynamic_cast<const Trk::Perigee*
>((*trkIter).initialPerigee());
294 if (measuredPerigee!=
nullptr) sumpt2 += (measuredPerigee->pT()*measuredPerigee->pT())/1e6;
302 float sqrt_sumpt2(std::sqrt(sumpt2));
309 if (vxContainerSplit->
size() >= 3)
315 if (splitVxCandiate1 !=
nullptr and splitVxCandiate2 !=
nullptr)
319 const xAOD::Vertex* origVertexNoBC = vxContainerWithoutBeamConstraint->
at(0);
320 if ( vxContainerWithoutBeamConstraint->
size() == 2 and
323 vxContainerSplit->
size() == 4 and
351 float x_distance = splitVxCandiate1->
position().x()-splitVxCandiate2->
position().x();
352 float y_distance = splitVxCandiate1->
position().y()-splitVxCandiate2->
position().y();
353 float z_distance = splitVxCandiate1->
position().z()-splitVxCandiate2->
position().z();
362 float x_split_pull = x_distance/x_error;
363 float y_split_pull = y_distance/y_error;
364 float z_split_pull = z_distance/z_error;
366 const std::vector< Trk::VxTrackAtVertex >& splitVxTrackAtVertexVector1 = splitVxCandiate1->
vxTrackAtVertex();
367 const std::vector< Trk::VxTrackAtVertex >& splitVxTrackAtVertexVector2 = splitVxCandiate2->
vxTrackAtVertex();
369 int ntrk_even = splitVxTrackAtVertexVector1.size();
370 int ntrk_odd = splitVxTrackAtVertexVector2.size();
371 int ntrk_av = (ntrk_odd + ntrk_even)/2;
378 float sum_pt2_1 = 0.;
379 float sum_pt2_2 = 0.;
381 for (std::vector<Trk::VxTrackAtVertex>::const_iterator trkIter = splitVxTrackAtVertexVector1.begin();
382 trkIter != splitVxTrackAtVertexVector1.end() ; ++trkIter)
386 if (measuredPerigee ==
nullptr) measuredPerigee =
dynamic_cast<const Trk::Perigee*
>((*trkIter).initialPerigee());
387 if (measuredPerigee!=
nullptr)
390 float pT = measuredPerigee->pT()/1000.;
394 float sqrt_sum_pt2_1(std::sqrt(sum_pt2_1));
396 for (std::vector<Trk::VxTrackAtVertex>::const_iterator trkIter = splitVxTrackAtVertexVector2.begin();
397 trkIter != splitVxTrackAtVertexVector2.end() ; ++trkIter)
401 if (measuredPerigee ==
nullptr) measuredPerigee =
dynamic_cast<const Trk::Perigee*
>((*trkIter).initialPerigee());
402 if (measuredPerigee!=
nullptr)
404 float pT = measuredPerigee->pT()/1000.;
408 float sqrt_sum_pt2_2(std::sqrt(sum_pt2_2));
410 float sqrt_sum_pt2_average((sqrt_sum_pt2_1+sqrt_sum_pt2_2)/2.);
419 return StatusCode::SUCCESS;
424 const std::string& hTitle,
431 if (
mon.regHist(
h).isFailure()) {
432 ATH_MSG_WARNING (
"Unable to book histogram with name = "+std::string(hName));
438 const char* hName,
const std::string& hTitle,
439 int nBinsX,
float minX,
float maxX,
440 int nBinsY,
float minY,
float maxY) {
444 if (
mon.regHist(
h).isFailure()) {
445 ATH_MSG_WARNING (
"Unable to book histogram with name = "+std::string(hName));
451 const char* hName,
const std::string& hTitle,
452 int nBinsX,
double* xRange,
453 int nBinsY,
float minY,
float maxY) {
457 if (
mon.regHist(
h).isFailure()) {
458 ATH_MSG_WARNING (
"Unable to book histogram with name = "+std::string(hName));
465 TGraph*
h =
new TGraph();
467 if (
mon.regGraph(
h).isFailure()) {
468 ATH_MSG_WARNING (
"Unable to book TGraph with name = " + std::string(hName));
491 return TMath::Abs(dz);
512 ATH_MSG_DEBUG(
"Invalid choice for the vertex selection efficiency metric.");