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("convLeadTrackAlgo",
135  "# of Electrons",
137  -0.5,
138  static_cast<double>(reco::TrackBase::algoSize) - 0.5);
139  h_convTrailTrackAlgo_ = ibooker.book1D("convLeadTrackAlgo",
140  "# of Electrons",
142  -0.5,
143  static_cast<double>(reco::TrackBase::algoSize) - 0.5);
144 }
145 
147  using namespace edm;
148 
149  nEvt_++;
150  LogInfo("ElectronConversionRejectionValidator")
151  << "ElectronConversionRejectionValidator Analyzing event number: " << e.id() << " Global Counter " << nEvt_
152  << "\n";
153 
155  auto convHandle = e.getHandle(convToken_);
156  if (!convHandle.isValid()) {
157  edm::LogError("ElectronConversionRejectionValidator") << "Error! Can't get the Conversion collection " << std::endl;
158  return;
159  }
160 
162  auto gsfElectronHandle = e.getHandle(gsfElecToken_);
163  const reco::GsfElectronCollection& gsfElectronCollection = *(gsfElectronHandle.product());
164  if (!gsfElectronHandle.isValid()) {
165  edm::LogError("ElectronConversionRejectionValidator") << "Error! Can't get the Electron collection " << std::endl;
166  return;
167  }
168 
169  // offline Primary vertex
170  auto vertexHandle = e.getHandle(offline_pvToken_);
171  if (!vertexHandle.isValid()) {
172  edm::LogError("ElectronConversionRejectionValidator") << "Error! Can't get the product primary Vertex Collection "
173  << "\n";
174  return;
175  }
176  const reco::Vertex& thevtx = vertexHandle->at(0);
177 
178  auto bsHandle = e.getHandle(beamspotToken_);
179  if (!bsHandle.isValid()) {
180  edm::LogError("ElectronConversionRejectionValidator") << "Error! Can't get the product beamspot Collection "
181  << "\n";
182  return;
183  }
184  const reco::BeamSpot& thebs = *bsHandle.product();
185 
186  //loop over electrons
187  for (reco::GsfElectronCollection::const_iterator iele = gsfElectronCollection.begin();
188  iele != gsfElectronCollection.end();
189  ++iele) {
190  //apply basic pre-selection cuts to remove the conversions with obviously displaced tracks which will anyways be
191  //removed from the analysis by the hit pattern or impact parameter requirements
192  if (iele->pt() < elePtMin_)
193  continue;
194  if (iele->gsfTrack()->hitPattern().numberOfLostHits(reco::HitPattern::MISSING_INNER_HITS) >
195  eleExpectedHitsInnerMax_)
196  continue;
197  if (std::abs(iele->gsfTrack()->dxy(thevtx.position())) > eleD0Max_)
198  continue;
199 
200  //fill information for all electrons
201  h_elePtAll_->Fill(iele->pt());
202  h_eleEtaAll_->Fill(iele->eta());
203  h_elePhiAll_->Fill(iele->phi());
204 
205  //find matching conversion if any
206  reco::Conversion const* conv = ConversionTools::matchedConversion(*iele, *convHandle, thebs.position());
207  //fill information on passing electrons only if there is no matching conversion (electron passed the conversion rejection cut!)
208  if (conv == nullptr) {
209  h_elePtPass_->Fill(iele->pt());
210  h_eleEtaPass_->Fill(iele->eta());
211  h_elePhiPass_->Fill(iele->phi());
212  } else {
213  //matching conversion, electron failed conversion rejection cut
214  //fill information on electron and matching conversion
215  //(Note that in case of multiple matching conversions passing the requirements, the conversion tools returns the one closest to the IP,
216  //which is most likely to be the conversion of the primary photon in case there was one.)
217 
218  //fill electron info
219  h_elePtFail_->Fill(iele->pt());
220  h_eleEtaFail_->Fill(iele->eta());
221  h_elePhiFail_->Fill(iele->phi());
222 
223  //fill conversion info
224  math::XYZVectorF convmom = conv->refittedPairMomentum();
225  h_convPt_->Fill(convmom.rho());
226  h_convEta_->Fill(convmom.eta());
227  h_convPhi_->Fill(convmom.phi());
228  h_convRho_->Fill(conv->conversionVertex().position().rho());
229  h_convZ_->Fill(conv->conversionVertex().position().z());
230  h_convProb_->Fill(ChiSquaredProbability(conv->conversionVertex().chi2(), conv->conversionVertex().ndof()));
231 
232  //fill information about conversion tracks
233  if (conv->tracks().size() < 2)
234  continue;
235 
236  RefToBase<reco::Track> tk1 = conv->tracks().front();
237  RefToBase<reco::Track> tk2 = conv->tracks().back();
238 
239  RefToBase<reco::Track> tklead;
240  RefToBase<reco::Track> tktrail;
241  if (tk1->pt() >= tk2->pt()) {
242  tklead = tk1;
243  tktrail = tk2;
244  } else {
245  tklead = tk2;
246  tktrail = tk1;
247  }
248  h_convLeadTrackpt_->Fill(tklead->pt());
249  h_convTrailTrackpt_->Fill(tktrail->pt());
250  h_convLog10TrailTrackpt_->Fill(log10(tktrail->pt()));
251  h_convLeadTrackAlgo_->Fill(tklead->algo());
252  h_convTrailTrackAlgo_->Fill(tktrail->algo());
253  }
254  }
255 }
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:128
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