CMS 3D CMS Logo

ElectronConversionRejectionValidator.cc
Go to the documentation of this file.
20 
21 #include "TFile.h"
22 #include "TH1.h"
23 #include "TH2.h"
24 #include "TTree.h"
25 #include "TVector3.h"
26 #include "TProfile.h"
27 #include "TMath.h"
28 
29 #include <iostream>
30 
39 using namespace std;
40 
42  fName_ = pset.getUntrackedParameter<std::string>("Name");
43  verbosity_ = pset.getUntrackedParameter<int>("Verbosity");
44  parameters_ = pset;
45 
46  gsfElectronCollectionProducer_ = pset.getParameter<std::string>("gsfElectronProducer");
47  gsfElectronCollection_ = pset.getParameter<std::string>("gsfElectronCollection");
48 
49  conversionCollectionProducer_ = pset.getParameter<std::string>("convProducer");
50  conversionCollection_ = pset.getParameter<std::string>("conversionCollection");
51  // conversionTrackProducer_ = pset.getParameter<std::string>("trackProducer");
52  gsfElecToken_ =
53  consumes<reco::GsfElectronCollection>(edm::InputTag(gsfElectronCollectionProducer_, gsfElectronCollection_));
54  convToken_ =
55  consumes<reco::ConversionCollection>(edm::InputTag(conversionCollectionProducer_, conversionCollection_));
56 
57  isRunCentrally_ = pset.getParameter<bool>("isRunCentrally");
58 
59  elePtMin_ = pset.getParameter<double>("elePtMin");
60  eleExpectedHitsInnerMax_ = pset.getParameter<int>("eleExpectedHitsInnerMax");
61  eleD0Max_ = pset.getParameter<double>("eleD0Max");
62  offline_pvToken_ = consumes<reco::VertexCollection>(
63  pset.getUntrackedParameter<edm::InputTag>("offlinePV", edm::InputTag("offlinePrimaryVertices")));
64  beamspotToken_ =
65  consumes<reco::BeamSpot>(pset.getUntrackedParameter<edm::InputTag>("beamspot", edm::InputTag("offlineBeamSpot")));
66 
67  nEvt_ = 0;
68  nEntry_ = 0;
69 }
70 
72 
74  edm::Run const&,
75  edm::EventSetup const&) {
76  double ptMin = parameters_.getParameter<double>("ptMin");
77  double ptMax = parameters_.getParameter<double>("ptMax");
78  int ptBin = parameters_.getParameter<int>("ptBin");
79 
80  double trackptMin = parameters_.getParameter<double>("trackptMin");
81  double trackptMax = parameters_.getParameter<double>("trackptMax");
82  int trackptBin = parameters_.getParameter<int>("trackptBin");
83 
84  double etaMin = parameters_.getParameter<double>("etaMin");
85  double etaMax = parameters_.getParameter<double>("etaMax");
86  int etaBin = parameters_.getParameter<int>("etaBin");
87 
88  double phiMin = -TMath::Pi();
89  double phiMax = TMath::Pi();
90  int phiBin = parameters_.getParameter<int>("phiBin");
91 
92  double rhoMin = parameters_.getParameter<double>("rhoMin");
93  double rhoMax = parameters_.getParameter<double>("rhoMax");
94  int rhoBin = parameters_.getParameter<int>("rhoBin");
95 
96  double zMin = parameters_.getParameter<double>("zMin");
97  double zMax = parameters_.getParameter<double>("zMax");
98  int zBin = parameters_.getParameter<int>("zBin");
99 
101  // SC from reco photons
102 
103  //TString simfolder = TString(
104  //std::string simpath = dqmpath_ + "SimulationInfo";
105  ibooker.setCurrentFolder(dqmpath_);
106  //
107  // simulation information about conversions
108  // Histograms for efficiencies
109  h_elePtAll_ = ibooker.book1D("elePtAll", "# of Electrons", ptBin, ptMin, ptMax);
110  h_eleEtaAll_ = ibooker.book1D("eleEtaAll", "# of Electrons", etaBin, etaMin, etaMax);
111  h_elePhiAll_ = ibooker.book1D("elePhiAll", "# of Electrons", phiBin, phiMin, phiMax);
112 
113  h_elePtPass_ = ibooker.book1D("elePtPass", "# of Electrons", ptBin, ptMin, ptMax);
114  h_eleEtaPass_ = ibooker.book1D("eleEtaPass", "# of Electrons", etaBin, etaMin, etaMax);
115  h_elePhiPass_ = ibooker.book1D("elePhiPass", "# of Electrons", phiBin, phiMin, phiMax);
116 
117  h_elePtFail_ = ibooker.book1D("elePtFail", "# of Electrons", ptBin, ptMin, ptMax);
118  h_eleEtaFail_ = ibooker.book1D("eleEtaFail", "# of Electrons", etaBin, etaMin, etaMax);
119  h_elePhiFail_ = ibooker.book1D("elePhiFail", "# of Electrons", phiBin, phiMin, phiMax);
120 
121  h_convPt_ = ibooker.book1D("convPt", "# of Electrons", ptBin, ptMin, ptMax);
122  h_convEta_ = ibooker.book1D("convEta", "# of Electrons", etaBin, etaMin, etaMax);
123  h_convPhi_ = ibooker.book1D("convPhi", "# of Electrons", phiBin, phiMin, phiMax);
124  h_convRho_ = ibooker.book1D("convRho", "# of Electrons", rhoBin, rhoMin, rhoMax);
125  h_convZ_ = ibooker.book1D("convZ", "# of Electrons", zBin, zMin, zMax);
126  h_convProb_ = ibooker.book1D("convProb", "# of Electrons", 100, 0.0, 1.0);
127 
128  h_convLeadTrackpt_ = ibooker.book1D("convLeadTrackpt", "# of Electrons", trackptBin, trackptMin, trackptMax);
129 
130  h_convTrailTrackpt_ = ibooker.book1D("convTrailTrackpt", "# of Electrons", trackptBin, trackptMin, trackptMax);
131 
132  h_convLog10TrailTrackpt_ = ibooker.book1D("convLog10TrailTrackpt", "# of Electrons", ptBin, -2.0, 3.0);
133 
134  h_convLeadTrackAlgo_ = ibooker.book1D(
135  "convLeadTrackAlgo", "# of Electrons", reco::TrackBase::algoSize, -0.5, reco::TrackBase::algoSize - 0.5);
136  h_convTrailTrackAlgo_ = ibooker.book1D(
137  "convLeadTrackAlgo", "# of Electrons", reco::TrackBase::algoSize, -0.5, reco::TrackBase::algoSize - 0.5);
138 }
139 
141  using namespace edm;
142 
143  nEvt_++;
144  LogInfo("ElectronConversionRejectionValidator")
145  << "ElectronConversionRejectionValidator Analyzing event number: " << e.id() << " Global Counter " << nEvt_
146  << "\n";
147 
149  auto convHandle = e.getHandle(convToken_);
150  if (!convHandle.isValid()) {
151  edm::LogError("ElectronConversionRejectionValidator") << "Error! Can't get the Conversion collection " << std::endl;
152  return;
153  }
154 
156  auto gsfElectronHandle = e.getHandle(gsfElecToken_);
157  const reco::GsfElectronCollection& gsfElectronCollection = *(gsfElectronHandle.product());
158  if (!gsfElectronHandle.isValid()) {
159  edm::LogError("ElectronConversionRejectionValidator") << "Error! Can't get the Electron collection " << std::endl;
160  return;
161  }
162 
163  // offline Primary vertex
164  auto vertexHandle = e.getHandle(offline_pvToken_);
165  if (!vertexHandle.isValid()) {
166  edm::LogError("ElectronConversionRejectionValidator") << "Error! Can't get the product primary Vertex Collection "
167  << "\n";
168  return;
169  }
170  const reco::Vertex& thevtx = vertexHandle->at(0);
171 
172  auto bsHandle = e.getHandle(beamspotToken_);
173  if (!bsHandle.isValid()) {
174  edm::LogError("ElectronConversionRejectionValidator") << "Error! Can't get the product beamspot Collection "
175  << "\n";
176  return;
177  }
178  const reco::BeamSpot& thebs = *bsHandle.product();
179 
180  //loop over electrons
181  for (reco::GsfElectronCollection::const_iterator iele = gsfElectronCollection.begin();
182  iele != gsfElectronCollection.end();
183  ++iele) {
184  //apply basic pre-selection cuts to remove the conversions with obviously displaced tracks which will anyways be
185  //removed from the analysis by the hit pattern or impact parameter requirements
186  if (iele->pt() < elePtMin_)
187  continue;
188  if (iele->gsfTrack()->hitPattern().numberOfLostHits(reco::HitPattern::MISSING_INNER_HITS) >
189  eleExpectedHitsInnerMax_)
190  continue;
191  if (std::abs(iele->gsfTrack()->dxy(thevtx.position())) > eleD0Max_)
192  continue;
193 
194  //fill information for all electrons
195  h_elePtAll_->Fill(iele->pt());
196  h_eleEtaAll_->Fill(iele->eta());
197  h_elePhiAll_->Fill(iele->phi());
198 
199  //find matching conversion if any
200  reco::Conversion const* conv = ConversionTools::matchedConversion(*iele, *convHandle, thebs.position());
201  //fill information on passing electrons only if there is no matching conversion (electron passed the conversion rejection cut!)
202  if (conv == nullptr) {
203  h_elePtPass_->Fill(iele->pt());
204  h_eleEtaPass_->Fill(iele->eta());
205  h_elePhiPass_->Fill(iele->phi());
206  } else {
207  //matching conversion, electron failed conversion rejection cut
208  //fill information on electron and matching conversion
209  //(Note that in case of multiple matching conversions passing the requirements, the conversion tools returns the one closest to the IP,
210  //which is most likely to be the conversion of the primary photon in case there was one.)
211 
212  //fill electron info
213  h_elePtFail_->Fill(iele->pt());
214  h_eleEtaFail_->Fill(iele->eta());
215  h_elePhiFail_->Fill(iele->phi());
216 
217  //fill conversion info
218  math::XYZVectorF convmom = conv->refittedPairMomentum();
219  h_convPt_->Fill(convmom.rho());
220  h_convEta_->Fill(convmom.eta());
221  h_convPhi_->Fill(convmom.phi());
222  h_convRho_->Fill(conv->conversionVertex().position().rho());
223  h_convZ_->Fill(conv->conversionVertex().position().z());
224  h_convProb_->Fill(ChiSquaredProbability(conv->conversionVertex().chi2(), conv->conversionVertex().ndof()));
225 
226  //fill information about conversion tracks
227  if (conv->tracks().size() < 2)
228  continue;
229 
230  RefToBase<reco::Track> tk1 = conv->tracks().front();
231  RefToBase<reco::Track> tk2 = conv->tracks().back();
232 
233  RefToBase<reco::Track> tklead;
234  RefToBase<reco::Track> tktrail;
235  if (tk1->pt() >= tk2->pt()) {
236  tklead = tk1;
237  tktrail = tk2;
238  } else {
239  tklead = tk2;
240  tktrail = tk1;
241  }
242  h_convLeadTrackpt_->Fill(tklead->pt());
243  h_convTrailTrackpt_->Fill(tktrail->pt());
244  h_convLog10TrailTrackpt_->Fill(log10(tktrail->pt()));
245  h_convLeadTrackAlgo_->Fill(tklead->algo());
246  h_convTrailTrackAlgo_->Fill(tktrail->algo());
247  }
248  }
249 }
const double Pi
const Point & position() const
position
Definition: BeamSpot.h:59
virtual void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:36
const Point & position() const
position
Definition: Vertex.h:127
constexpr float ptMin
static reco::Conversion const * matchedConversion(const reco::GsfElectron &ele, const reco::ConversionCollection &convCol, const math::XYZPoint &beamspot, bool allowCkfMatch=true, float lxyMin=2.0, float probMin=1e-6, unsigned int nHitsBeforeVtxMax=0)
Log< level::Error, false > LogError
std::vector< GsfElectron > GsfElectronCollection
collection of GsfElectron objects
double pt() const
track transverse momentum
Definition: TrackBase.h:637
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
float ChiSquaredProbability(double chiSquared, double nrDOF)
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< float > > XYZVectorF
spatial vector with cartesian internal representation
Definition: Vector3D.h:16
void analyze(const edm::Event &, const edm::EventSetup &) override
Log< level::Info, false > LogInfo
TrackAlgorithm algo() const
Definition: TrackBase.h:547
void bookHistograms(DQMStore::IBooker &bei, edm::Run const &, edm::EventSetup const &) override
EPOS::IO_EPOS conv
HLT enums.
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX, FUNC onbooking=NOOP())
Definition: DQMStore.h:98
Definition: Run.h:45