Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add resolution and pull plots to vertex validation, and fix two bugs #8009

Merged
merged 5 commits into from Mar 3, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -145,6 +145,9 @@ class PrimaryVertexAnalyzer4PUSlimmed : public DQMEDAnalyzer {
void fillGenAssociatedRecoVertexHistograms(const std::string &,
int,
recoPrimaryVertex &v);
void fillResolutionAndPullHistograms(const std::string &,
int,
recoPrimaryVertex &v);

std::vector<PrimaryVertexAnalyzer4PUSlimmed::simPrimaryVertex> getSimPVs(
const edm::Handle<TrackingVertexCollection>);
Expand Down
2 changes: 1 addition & 1 deletion Validation/RecoVertex/python/HLTpostProcessorVertex_cfi.py
Expand Up @@ -3,4 +3,4 @@
from Validation.RecoVertex.PrimaryVertexAnalyzer4PUSlimmed_Client_cfi import *

postProcessorHLTvertexing = postProcessorVertex.clone()
postProcessorVertex.subDirs = cms.untracked.vstring("HLT/Vertexing/ValidationWRTsim/*")
postProcessorHLTvertexing.subDirs = cms.untracked.vstring("HLT/Vertexing/ValidationWRTsim/*")
Expand Up @@ -39,7 +39,24 @@
"duplicate_vs_NumTracks 'Duplicate vs NumTracks' RecoAllAssoc2MultiMatchedGen_NumTracks RecoAllAssoc2Gen_NumTracks",
"duplicate_vs_ClosestVertexInZ 'Duplicate vs ClosestsVtx In Z' RecoAllAssoc2MultiMatchedGen_ClosestDistanceZ RecoAllAssoc2Gen_ClosestDistanceZ"
),
resolution = cms.vstring(),
resolution = cms.vstring(
"RecoAllAssoc2GenMatched_ResolX_vs_PU '#sigma(x) vs PU' RecoAllAssoc2GenMatched_ResolX_vs_PU",
"RecoAllAssoc2GenMatched_ResolY_vs_PU '#sigma(y) vs PU' RecoAllAssoc2GenMatched_ResolY_vs_PU",
"RecoAllAssoc2GenMatched_ResolZ_vs_PU '#sigma(z) vs PU' RecoAllAssoc2GenMatched_ResolZ_vs_PU",
"RecoAllAssoc2GenMatched_ResolPt2_vs_PU '#sigma(p_{T}^{2}) vs PU' RecoAllAssoc2GenMatched_ResolPt2_vs_PU",
"RecoAllAssoc2GenMatched_ResolX_vs_NumTracks '#sigma(x) vs NumTracks' RecoAllAssoc2GenMatched_ResolX_vs_NumTracks",
"RecoAllAssoc2GenMatched_ResolY_vs_NumTracks '#sigma(y) vs NumTracks' RecoAllAssoc2GenMatched_ResolY_vs_NumTracks",
"RecoAllAssoc2GenMatched_ResolZ_vs_NumTracks '#sigma(z) vs NumTracks' RecoAllAssoc2GenMatched_ResolZ_vs_NumTracks",
"RecoAllAssoc2GenMatched_ResolPt2_vs_NumTracks '#sigma(p_{T}^{2}) vs NumTracks' RecoAllAssoc2GenMatched_ResolPt2_vs_NumTracks",
"RecoAllAssoc2GenMatchedMerged_ResolX_vs_PU '#sigma(x) vs PU' RecoAllAssoc2GenMatchedMerged_ResolX_vs_PU",
"RecoAllAssoc2GenMatchedMerged_ResolY_vs_PU '#sigma(y) vs PU' RecoAllAssoc2GenMatchedMerged_ResolY_vs_PU",
"RecoAllAssoc2GenMatchedMerged_ResolZ_vs_PU '#sigma(z) vs PU' RecoAllAssoc2GenMatchedMerged_ResolZ_vs_PU",
"RecoAllAssoc2GenMatchedMerged_ResolPt2_vs_PU '#sigma(p_{T}^{2}) vs PU' RecoAllAssoc2GenMatchedMerged_ResolPt2_vs_PU",
"RecoAllAssoc2GenMatchedMerged_ResolX_vs_NumTracks '#sigma(x) vs NumTracks' RecoAllAssoc2GenMatchedMerged_ResolX_vs_NumTracks",
"RecoAllAssoc2GenMatchedMerged_ResolY_vs_NumTracks '#sigma(y) vs NumTracks' RecoAllAssoc2GenMatchedMerged_ResolY_vs_NumTracks",
"RecoAllAssoc2GenMatchedMerged_ResolZ_vs_NumTracks '#sigma(z) vs NumTracks' RecoAllAssoc2GenMatchedMerged_ResolZ_vs_NumTracks",
"RecoAllAssoc2GenMatchedMerged_ResolPt2_vs_NumTracks '#sigma(p_{T}^{2}) vs NumTracks' RecoAllAssoc2GenMatchedMerged_ResolPt2_vs_NumTracks",
),
outputFileName = cms.untracked.string(""),
verbose = cms.untracked.uint32(5)
)
Expand Down
129 changes: 121 additions & 8 deletions Validation/RecoVertex/src/PrimaryVertexAnalyzer4PUSlimmed.cc
Expand Up @@ -465,6 +465,69 @@ void PrimaryVertexAnalyzer4PUSlimmed::bookHistograms(
"RecoAllAssoc2GenSimForMerge_ClosestDistanceZ",
"RecoAllAssoc2GenSimForMerge_ClosestDistanceZ",
17, &log_mergez_bins[0]);


// Resolution and pull histograms
auto book1d = [&](const char *name, int bins, double min, double max) {
mes_[label][name] = i.book1D(name, name, bins, min, max);
};
auto book2d = [&](const char *name,
int xbins, double xmin, double xmax,
int ybins, double ymin, double ymax) {
mes_[label][name] = i.book2D(name, name, xbins,xmin,xmax, ybins,ymin,ymax);
};
auto book2dlogx = [&](const char *name,
int xbins, float *xbinedges,
int ybins, double ymin, double ymax) {
auto me = i.book2D(name, name, xbins,xbinedges[0],xbinedges[xbins], ybins,ymin,ymax);
me->getTH2F()->GetXaxis()->Set(xbins, xbinedges);
mes_[label][name] = me;
};

const double resolx = 0.1;
const double resoly = 0.1;
const double resolz = 0.1;
const double resolpt2 = 10;

// Non-merged vertices
book1d("RecoAllAssoc2GenMatched_ResolX", 100,-resolx,resolx);
book1d("RecoAllAssoc2GenMatched_ResolY", 100,-resoly,resoly);
book1d("RecoAllAssoc2GenMatched_ResolZ", 100,-resolz,resolz);
book1d("RecoAllAssoc2GenMatched_ResolPt2", 100,-resolpt2,resolpt2);

book2d("RecoAllAssoc2GenMatched_ResolX_vs_PU", 125,0.,250., 100,-resolx,resolx);
book2d("RecoAllAssoc2GenMatched_ResolY_vs_PU", 125,0.,250., 100,-resoly,resoly);
book2d("RecoAllAssoc2GenMatched_ResolZ_vs_PU", 125,0.,250., 100,-resolz,resolz);
book2d("RecoAllAssoc2GenMatched_ResolPt2_vs_PU", 125,0.,250., 100,-resolpt2,resolpt2);

book2dlogx("RecoAllAssoc2GenMatched_ResolX_vs_NumTracks", 24,&log_ntrk_bins[0], 100,-resolx,resolx);
book2dlogx("RecoAllAssoc2GenMatched_ResolY_vs_NumTracks", 24,&log_ntrk_bins[0], 100,-resoly,resoly);
book2dlogx("RecoAllAssoc2GenMatched_ResolZ_vs_NumTracks", 24,&log_ntrk_bins[0], 100,-resolz,resolz);
book2dlogx("RecoAllAssoc2GenMatched_ResolPt2_vs_NumTracks", 24,&log_ntrk_bins[0], 100,-resolpt2,resolpt2);

book1d("RecoAllAssoc2GenMatched_PullX", 250,-25,25);
book1d("RecoAllAssoc2GenMatched_PullY", 250,-25,25);
book1d("RecoAllAssoc2GenMatched_PullZ", 250,-25,25);

// Merged vertices
book1d("RecoAllAssoc2GenMatchedMerged_ResolX", 100,-resolx,resolx);
book1d("RecoAllAssoc2GenMatchedMerged_ResolY", 100,-resoly,resoly);
book1d("RecoAllAssoc2GenMatchedMerged_ResolZ", 100,-resolz,resolz);
book1d("RecoAllAssoc2GenMatchedMerged_ResolPt2", 100,-resolpt2,resolpt2);

book2d("RecoAllAssoc2GenMatchedMerged_ResolX_vs_PU", 125,0.,250., 100,-resolx,resolx);
book2d("RecoAllAssoc2GenMatchedMerged_ResolY_vs_PU", 125,0.,250., 100,-resoly,resoly);
book2d("RecoAllAssoc2GenMatchedMerged_ResolZ_vs_PU", 125,0.,250., 100,-resolz,resolz);
book2d("RecoAllAssoc2GenMatchedMerged_ResolPt2_vs_PU", 125,0.,250., 100,-resolpt2,resolpt2);

book2dlogx("RecoAllAssoc2GenMatchedMerged_ResolX_vs_NumTracks", 24,&log_ntrk_bins[0], 100,-resolx,resolx);
book2dlogx("RecoAllAssoc2GenMatchedMerged_ResolY_vs_NumTracks", 24,&log_ntrk_bins[0], 100,-resoly,resoly);
book2dlogx("RecoAllAssoc2GenMatchedMerged_ResolZ_vs_NumTracks", 24,&log_ntrk_bins[0], 100,-resolz,resolz);
book2dlogx("RecoAllAssoc2GenMatchedMerged_ResolPt2_vs_NumTracks", 24,&log_ntrk_bins[0], 100,-resolpt2,resolpt2);

book1d("RecoAllAssoc2GenMatchedMerged_PullX", 250,-25,25);
book1d("RecoAllAssoc2GenMatchedMerged_PullY", 250,-25,25);
book1d("RecoAllAssoc2GenMatchedMerged_PullZ", 250,-25,25);
}
}

Expand Down Expand Up @@ -556,6 +619,10 @@ void PrimaryVertexAnalyzer4PUSlimmed::fillGenAssociatedRecoVertexHistograms(
if (v.closest_vertex_distance_z > 0.)
mes_[label]["RecoAllAssoc2GenMatched_ClosestDistanceZ"]
->Fill(v.closest_vertex_distance_z);

// Fill resolution and pull plots here (as in MultiTrackValidator)
fillResolutionAndPullHistograms(label, num_pileup_vertices, v);

// Now keep track of all RecoVTX associated to a SimVTX that
// itself is associated to more than one RecoVTX, for
// duplicate-rate plots on reco quantities.
Expand Down Expand Up @@ -599,6 +666,57 @@ void PrimaryVertexAnalyzer4PUSlimmed::fillGenAssociatedRecoVertexHistograms(
mes_[label]["RecoAllAssoc2GenProperties"]->Fill(v.kind_of_vertex);
}

void PrimaryVertexAnalyzer4PUSlimmed::fillResolutionAndPullHistograms(
const std::string& label,
int num_pileup_vertices,
PrimaryVertexAnalyzer4PUSlimmed::recoPrimaryVertex& v) {

std::string prefix = "RecoAllAssoc2GenMatched";
const simPrimaryVertex *bestMatch = v.sim_vertices_internal[0];
if(v.sim_vertices_internal.size() > 1) {

prefix += "Merged";
// Pick the sim-vertex with largest number of tracks associated to
// reco-tracks as the best match
auto bestVtx = std::max_element(v.sim_vertices_internal.begin(),
v.sim_vertices_internal.end(),
[](const simPrimaryVertex *a, const simPrimaryVertex *b) {
return a->num_matched_reco_tracks < b->num_matched_reco_tracks;
});
bestMatch = *bestVtx;
}


const double xres = v.x - bestMatch->x;
const double yres = v.y - bestMatch->y;
const double zres = v.z - bestMatch->z;
const double pt2res = v.ptsq - bestMatch->ptsq;

const double xresol = xres;
const double yresol = yres;
const double zresol = zres;
const double pt2resol = pt2res/v.ptsq;

mes_[label][prefix+"_ResolX"]->Fill(xresol);
mes_[label][prefix+"_ResolY"]->Fill(yresol);
mes_[label][prefix+"_ResolZ"]->Fill(zresol);
mes_[label][prefix+"_ResolPt2"]->Fill(pt2resol);

mes_[label][prefix+"_ResolX_vs_PU"]->Fill(num_pileup_vertices, xresol);
mes_[label][prefix+"_ResolY_vs_PU"]->Fill(num_pileup_vertices, yresol);
mes_[label][prefix+"_ResolZ_vs_PU"]->Fill(num_pileup_vertices, zresol);
mes_[label][prefix+"_ResolPt2_vs_PU"]->Fill(num_pileup_vertices, pt2resol);

mes_[label][prefix+"_ResolX_vs_NumTracks"]->Fill(v.nRecoTrk, xresol);
mes_[label][prefix+"_ResolY_vs_NumTracks"]->Fill(v.nRecoTrk, yresol);
mes_[label][prefix+"_ResolZ_vs_NumTracks"]->Fill(v.nRecoTrk, zresol);
mes_[label][prefix+"_ResolPt2_vs_NumTracks"]->Fill(v.nRecoTrk, pt2resol);

mes_[label][prefix+"_PullX"]->Fill(xres/v.recVtx->xError());
mes_[label][prefix+"_PullY"]->Fill(yres/v.recVtx->yError());
mes_[label][prefix+"_PullZ"]->Fill(zres/v.recVtx->zError());
}

/* Extract information form TrackingParticles/TrackingVertex and fill
* the helper class simPrimaryVertex with proper generation-level
* information */
Expand Down Expand Up @@ -1027,8 +1145,7 @@ void PrimaryVertexAnalyzer4PUSlimmed::analyze(const edm::Event& iEvent,
const simPrimaryVertex& rhs) {
return lhs.ptsq < rhs.ptsq;
}) == simpv.begin();
kind_of_signal_vertex = (kind_of_signal_vertex & ~(1<<HIGHEST_PT)) |
(signal_is_highest_pt << HIGHEST_PT);
kind_of_signal_vertex |= (signal_is_highest_pt << HIGHEST_PT);
mes_["root_folder"]["SignalIsHighestPt2"]->Fill(
signal_is_highest_pt ? 1. : 0.);
computePairDistance(simpv,
Expand Down Expand Up @@ -1067,14 +1184,10 @@ void PrimaryVertexAnalyzer4PUSlimmed::analyze(const edm::Event& iEvent,
if (std::find(v.rec_vertices.begin(), v.rec_vertices.end(),
&((*recVtxs.product())[0])) != v.rec_vertices.end()) {
mistag = 0.;
kind_of_signal_vertex =
(kind_of_signal_vertex & ~(1<<IS_ASSOC2FIRST_RECO)) |
(signal_is_highest_pt << IS_ASSOC2FIRST_RECO);
kind_of_signal_vertex |= (1 << IS_ASSOC2FIRST_RECO);
} else {
if (v.rec_vertices.size()) {
kind_of_signal_vertex =
(kind_of_signal_vertex & ~(1<<IS_ASSOC2ANY_RECO)) |
(signal_is_highest_pt << IS_ASSOC2ANY_RECO);
kind_of_signal_vertex |= (1 << IS_ASSOC2ANY_RECO);
}
}
mes_[label]["KindOfSignalPV"]->Fill(kind_of_signal_vertex);
Expand Down