00001 #include <iostream>
00002 #include <cmath>
00003 #include <vector>
00004 #include <string>
00005
00006 #include <TH1.h>
00007 #include <TProfile.h>
00008
00009 #include "FWCore/Framework/interface/Frameworkfwd.h"
00010 #include "FWCore/Framework/interface/Event.h"
00011 #include "FWCore/Framework/interface/EventSetup.h"
00012 #include "FWCore/Framework/interface/EDAnalyzer.h"
00013 #include "FWCore/Utilities/interface/InputTag.h"
00014 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00015 #include "FWCore/ServiceRegistry/interface/Service.h"
00016
00017 #include "CommonTools/UtilAlgos/interface/TFileService.h"
00018
00019 #include "DataFormats/BeamSpot/interface/BeamSpot.h"
00020 #include "DataFormats/TrackReco/interface/Track.h"
00021 #include "DataFormats/VertexReco/interface/Vertex.h"
00022 #include "DataFormats/VertexReco/interface/VertexFwd.h"
00023 #include "DataFormats/HepMCCandidate/interface/GenParticle.h"
00024 #include "DataFormats/HepMCCandidate/interface/GenParticleFwd.h"
00025
00026 class PatVertexAnalyzer : public edm::EDAnalyzer {
00027 public:
00029 PatVertexAnalyzer(const edm::ParameterSet ¶ms);
00030 ~PatVertexAnalyzer();
00031
00032
00033 virtual void beginJob();
00034 virtual void analyze(const edm::Event &event, const edm::EventSetup &es);
00035
00036 private:
00037
00038 edm::InputTag src_;
00039 edm::InputTag genParticles_;
00040
00041 TH1 *nVertices_, *nTracks_;
00042 TH1 *x_, *y_, *z_;
00043 TH1 *xErr_, *yErr_, *zErr_;
00044 TH1 *xDelta_, *yDelta_, *zDelta_;
00045 TH1 *xPull_, *yPull_, *zPull_;
00046 };
00047
00048 PatVertexAnalyzer::PatVertexAnalyzer(const edm::ParameterSet ¶ms) :
00049 src_(params.getParameter<edm::InputTag>("src")),
00050 genParticles_(params.getParameter<edm::InputTag>("mc"))
00051 {
00052 }
00053
00054 PatVertexAnalyzer::~PatVertexAnalyzer()
00055 {
00056 }
00057
00058 void PatVertexAnalyzer::beginJob()
00059 {
00060
00061
00062 edm::Service<TFileService> fs;
00063
00064 nVertices_ = fs->make<TH1F>("nVertices", "number of reconstructed primary vertices", 50, 0, 50);
00065 nTracks_ = fs->make<TH1F>("nTracks", "number of tracks at primary vertex", 100, 0, 300);
00066 x_ = fs->make<TH1F>("pvX", "primary vertex x", 100, -0.1, 0.1);
00067 y_ = fs->make<TH1F>("pvY", "primary vertex y", 100, -0.1, 0.1);
00068 z_ = fs->make<TH1F>("pvZ", "primary vertex z", 100, -30, 30);
00069 xErr_ = fs->make<TH1F>("pvErrorX", "primary vertex x error", 100, 0, 0.005);
00070 yErr_ = fs->make<TH1F>("pvErrorY", "primary vertex y error", 100, 0, 0.005);
00071 zErr_ = fs->make<TH1F>("pvErrorZ", "primary vertex z error", 100, 0, 0.01);
00072 xDelta_ = fs->make<TH1F>("pvDeltaX", "x shift wrt simulated vertex", 100, -0.01, 0.01);
00073 yDelta_ = fs->make<TH1F>("pvDeltaY", "y shift wrt simulated vertex", 100, -0.01, 0.01);
00074 zDelta_ = fs->make<TH1F>("pvDeltaZ", "z shift wrt simulated vertex", 100, -0.02, 0.02);
00075 xPull_ = fs->make<TH1F>("pvPullX", "primary vertex x pull", 100, -5, 5);
00076 yPull_ = fs->make<TH1F>("pvPullY", "primary vertex y pull", 100, -5, 5);
00077 zPull_ = fs->make<TH1F>("pvPullZ", "primary vertex z pull", 100, -5, 5);
00078 }
00079
00080 void PatVertexAnalyzer::analyze(const edm::Event &event, const edm::EventSetup &es)
00081 {
00082
00083 edm::Handle<reco::VertexCollection> pvHandle;
00084 event.getByLabel(src_, pvHandle);
00085
00086
00087 edm::Handle<reco::GenParticleCollection> genParticlesHandle;
00088 event.getByLabel(genParticles_, genParticlesHandle);
00089
00090
00091 math::XYZPoint simPV = (*genParticlesHandle)[2].vertex();
00092
00093
00094 nVertices_->Fill(pvHandle->size());
00095
00096
00097 if (!pvHandle->empty()) {
00098 const reco::Vertex &pv = (*pvHandle)[0];
00099
00100 nTracks_->Fill(pv.tracksSize());
00101
00102 x_->Fill(pv.x());
00103 y_->Fill(pv.y());
00104 z_->Fill(pv.z());
00105
00106 xErr_->Fill(pv.xError());
00107 yErr_->Fill(pv.yError());
00108 zErr_->Fill(pv.zError());
00109
00110 xDelta_->Fill(pv.x() - simPV.X());
00111 yDelta_->Fill(pv.y() - simPV.Y());
00112 zDelta_->Fill(pv.z() - simPV.Z());
00113
00114 xPull_->Fill((pv.x() - simPV.X()) / pv.xError());
00115 yPull_->Fill((pv.y() - simPV.Y()) / pv.yError());
00116 zPull_->Fill((pv.z() - simPV.Z()) / pv.zError());
00117
00118
00119
00120 }
00121 }
00122
00123 #include "FWCore/Framework/interface/MakerMacros.h"
00124
00125 DEFINE_FWK_MODULE(PatVertexAnalyzer);