CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
GlobalMuonMatchAnalyzer.cc
Go to the documentation of this file.
1 
12 
13 // user include files
19 
22 
24 
28 
31 
32 #include <TH2.h>
33 
35 
36 {
37  iConfig = ps;
38  //now do what ever initialization is needed
41 
42  tkAssociatorToken_ = consumes<reco::TrackToTrackingParticleAssociator>(tkAssociatorName_);
43  muAssociatorToken_ = consumes<reco::TrackToTrackingParticleAssociator>(muAssociatorName_);
44 
45  subsystemname_ = iConfig.getUntrackedParameter<std::string>("subSystemFolder", "YourSubsystem");
50 
53 
54  tpToken_ = consumes<edm::View<reco::Track> >(tpName_);
55  tkToken_ = consumes<edm::View<reco::Track> >(tkName_);
56  staToken_ = consumes<edm::View<reco::Track> >(staName_);
57  glbToken_ = consumes<edm::View<reco::Track> >(glbName_);
58 }
59 
61  // do anything here that needs to be done at desctruction time
62  // (e.g. close files, deallocate resources etc.)
63 }
64 
65 //
66 // member functions
67 //
68 
69 // ------------ method called to for each event ------------
71  using namespace edm;
72  using namespace reco;
73 
75  iEvent.getByToken(tpToken_, tpHandle);
76  const TrackingParticleCollection tpColl = *(tpHandle.product());
77 
79  iEvent.getByToken(glbToken_, muHandle);
80  const reco::MuonTrackLinksCollection muColl = *(muHandle.product());
81 
82  Handle<View<Track> > staHandle;
83  iEvent.getByToken(staToken_, staHandle);
84 
85  Handle<View<Track> > glbHandle;
86  iEvent.getByToken(glbToken_, glbHandle);
87 
88  Handle<View<Track> > tkHandle;
89  iEvent.getByToken(tkToken_, tkHandle);
90 
92  iEvent.getByToken(tkAssociatorToken_, tkAssociator);
93 
94  // Mu Associator
96  iEvent.getByToken(muAssociatorToken_, muAssociator);
97 
98  reco::RecoToSimCollection tkrecoToSimCollection = tkAssociator->associateRecoToSim(tkHandle, tpHandle);
99  reco::SimToRecoCollection tksimToRecoCollection = tkAssociator->associateSimToReco(tkHandle, tpHandle);
100 
101  reco::RecoToSimCollection starecoToSimCollection = muAssociator->associateRecoToSim(staHandle, tpHandle);
102  reco::SimToRecoCollection stasimToRecoCollection = muAssociator->associateSimToReco(staHandle, tpHandle);
103 
104  reco::RecoToSimCollection glbrecoToSimCollection = muAssociator->associateRecoToSim(glbHandle, tpHandle);
105  reco::SimToRecoCollection glbsimToRecoCollection = muAssociator->associateSimToReco(glbHandle, tpHandle);
106 
107  for (TrackingParticleCollection::size_type i = 0; i < tpColl.size(); ++i) {
108  TrackingParticleRef tp(tpHandle, i);
109 
110  std::vector<std::pair<RefToBase<Track>, double> > rvGlb;
111  RefToBase<Track> rGlb;
112  if (glbsimToRecoCollection.find(tp) != glbsimToRecoCollection.end()) {
113  rvGlb = glbsimToRecoCollection[tp];
114  if (!rvGlb.empty()) {
115  rGlb = rvGlb.begin()->first;
116  }
117  }
118 
119  std::vector<std::pair<RefToBase<Track>, double> > rvSta;
120  RefToBase<Track> rSta;
121  if (stasimToRecoCollection.find(tp) != stasimToRecoCollection.end()) {
122  rvSta = stasimToRecoCollection[tp];
123  if (!rvSta.empty()) {
124  rSta = rvSta.begin()->first;
125  }
126  }
127 
128  std::vector<std::pair<RefToBase<Track>, double> > rvTk;
129  RefToBase<Track> rTk;
130  if (tksimToRecoCollection.find(tp) != tksimToRecoCollection.end()) {
131  rvTk = tksimToRecoCollection[tp];
132  if (!rvTk.empty()) {
133  rTk = rvTk.begin()->first;
134  }
135  }
136 
137  if (!rvSta.empty() && !rvTk.empty()) {
138  //should have matched
139  h_shouldMatch->Fill(rTk->eta(), rTk->pt());
140  }
141 
142  for (reco::MuonTrackLinksCollection::const_iterator links = muHandle->begin(); links != muHandle->end(); ++links) {
143  if (rGlb == RefToBase<Track>(links->globalTrack())) {
144  if (RefToBase<Track>(links->trackerTrack()) == rTk && RefToBase<Track>(links->standAloneTrack()) == rSta) {
145  //goodMatch
146  h_goodMatchSim->Fill(rGlb->eta(), rGlb->pt());
147  }
148  if (RefToBase<Track>(links->trackerTrack()) == rTk && RefToBase<Track>(links->standAloneTrack()) != rSta) {
149  //tkOnlyMatch
150  h_tkOnlySim->Fill(rGlb->eta(), rGlb->pt());
151  }
152  if (RefToBase<Track>(links->standAloneTrack()) == rSta && RefToBase<Track>(links->trackerTrack()) != rTk) {
153  //staOnlyMatch
154  h_staOnlySim->Fill(rGlb->eta(), rGlb->pt());
155  }
156  }
157  }
158  }
159 
161 
162  for (reco::MuonTrackLinksCollection::const_iterator links = muHandle->begin(); links != muHandle->end(); ++links) {
163  RefToBase<Track> glbRef = RefToBase<Track>(links->globalTrack());
164  RefToBase<Track> staRef = RefToBase<Track>(links->standAloneTrack());
165  RefToBase<Track> tkRef = RefToBase<Track>(links->trackerTrack());
166 
167  std::vector<std::pair<TrackingParticleRef, double> > tp1;
168  TrackingParticleRef tp1r;
169  if (glbrecoToSimCollection.find(glbRef) != glbrecoToSimCollection.end()) {
170  tp1 = glbrecoToSimCollection[glbRef];
171  if (!tp1.empty()) {
172  tp1r = tp1.begin()->first;
173  }
174  }
175 
176  std::vector<std::pair<TrackingParticleRef, double> > tp2;
177  TrackingParticleRef tp2r;
178  if (starecoToSimCollection.find(staRef) != starecoToSimCollection.end()) {
179  tp2 = starecoToSimCollection[staRef];
180  if (!tp2.empty()) {
181  tp2r = tp2.begin()->first;
182  }
183  }
184 
185  std::vector<std::pair<TrackingParticleRef, double> > tp3;
186  TrackingParticleRef tp3r;
187  if (tkrecoToSimCollection.find(tkRef) != tkrecoToSimCollection.end()) {
188  tp3 = tkrecoToSimCollection[tkRef];
189  if (!tp3.empty()) {
190  tp3r = tp3.begin()->first;
191  }
192  }
193 
194  if (!tp1.empty()) {
195  //was reconstructed
196  h_totReco->Fill(glbRef->eta(), glbRef->pt());
197  if (tp2r == tp3r) { // && tp1r == tp3r) {
198  //came from same TP
199  h_goodMatch->Fill(glbRef->eta(), glbRef->pt());
200  } else {
201  //mis-match
202  h_fakeMatch->Fill(glbRef->eta(), glbRef->pt());
203  }
204  }
205  }
206 }
207 
208 // ------------ method called once each job just after ending the event loop ------------
212 
215 
216  if (!out.empty() && dbe_)
217  dbe_->save(out);
218 }
219 
220 //void GlobalMuonMatchAnalyzer::beginRun(const edm::Run&, const edm::EventSetup& setup)
221 
223  edm::Run const &iRun,
224  edm::EventSetup const &iSetup) {
225  // Tk Associator
226 
227  ibooker.cd();
228  // Run histos only for dqmEndRun handling
229  ibooker.setScope(MonitorElementData::Scope::RUN);
230 
231  std::string dirName = "Matcher/";
232  // ibooker.setCurrentFolder("RecoMuonV/Matcher");
233  ibooker.setCurrentFolder(dirName);
234 
235  h_shouldMatch = ibooker.book2D("h_shouldMatch", "SIM associated to Tk and Sta", 50, -2.5, 2.5, 100, 0., 500.);
236  h_goodMatchSim = ibooker.book2D("h_goodMatchSim", "SIM associated to Glb Sta Tk", 50, -2.5, 2.5, 100, 0., 500.);
237  h_tkOnlySim = ibooker.book2D("h_tkOnlySim", "SIM associated to Glb Tk", 50, -2.5, 2.5, 100, 0., 500.);
238  h_staOnlySim = ibooker.book2D("h_staOnlySim", "SIM associated to Glb Sta", 50, -2.5, 2.5, 100, 0., 500.);
239 
240  h_totReco = ibooker.book2D("h_totReco", "Total Glb Reconstructed", 50, -2.5, 2.5, 100, 0., 500.);
241  h_goodMatch = ibooker.book2D("h_goodMatch", "Sta and Tk from same SIM", 50, -2.5, 2.5, 100, 0., 500.);
242  h_fakeMatch = ibooker.book2D("h_fakeMatch", "Sta and Tk not from same SIM", 50, -2.5, 2.5, 100, 0., 500.);
243 
244  h_effic = ibooker.book1D("h_effic", "Efficiency vs #eta", 50, -2.5, 2.5);
245  h_efficPt = ibooker.book1D("h_efficPt", "Efficiency vs p_{T}", 100, 0., 100.);
246 
247  h_fake = ibooker.book1D("h_fake", "Fake fraction vs #eta", 50, -2.5, 2.5);
248  h_fakePt = ibooker.book1D("h_fakePt", "Fake fraction vs p_{T}", 100, 0., 100.);
249 }
250 
252  MonitorElement *recoTH2,
253  MonitorElement *simTH2) {
254  TH2F *h1 = recoTH2->getTH2F();
255  TH1D *reco = h1->ProjectionX();
256 
257  TH2F *h2 = simTH2->getTH2F();
258  TH1D *sim = h2->ProjectionX();
259 
260  TH1F *hEff = (TH1F *)reco->Clone();
261 
262  hEff->Divide(sim);
263 
264  hEff->SetName("tmp_" + TString(reco->GetName()));
265 
266  // Set the error accordingly to binomial statistics
267  int nBinsEta = hEff->GetNbinsX();
268  for (int bin = 1; bin <= nBinsEta; bin++) {
269  float nSimHit = sim->GetBinContent(bin);
270  float eff = hEff->GetBinContent(bin);
271  float error = 0;
272  if (nSimHit != 0 && eff <= 1) {
273  error = sqrt(eff * (1 - eff) / nSimHit);
274  }
275  hEff->SetBinError(bin, error);
276  effHist->setBinContent(bin, eff);
277  effHist->setBinError(bin, error);
278  }
279 }
280 
282  MonitorElement *recoTH2,
283  MonitorElement *simTH2) {
284  TH2F *h1 = recoTH2->getTH2F();
285  TH1D *reco = h1->ProjectionY();
286 
287  TH2F *h2 = simTH2->getTH2F();
288  TH1D *sim = h2->ProjectionY();
289 
290  TH1F *hEff = (TH1F *)reco->Clone();
291 
292  hEff->Divide(sim);
293 
294  hEff->SetName("tmp_" + TString(reco->GetName()));
295 
296  // Set the error accordingly to binomial statistics
297  int nBinsPt = hEff->GetNbinsX();
298  for (int bin = 1; bin <= nBinsPt; bin++) {
299  float nSimHit = sim->GetBinContent(bin);
300  float eff = hEff->GetBinContent(bin);
301  float error = 0;
302  if (nSimHit != 0 && eff <= 1) {
303  error = sqrt(eff * (1 - eff) / nSimHit);
304  }
305  hEff->SetBinError(bin, error);
306  effHist->setBinContent(bin, eff);
307  effHist->setBinError(bin, error);
308  }
309 }
T getUntrackedParameter(std::string const &, T const &) const
edm::EDGetTokenT< reco::TrackToTrackingParticleAssociator > muAssociatorToken_
virtual void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:32
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:539
virtual MonitorElementData::Scope setScope(MonitorElementData::Scope newscope)
Definition: DQMStore.cc:46
Definition: sim.h:19
uint16_t size_type
void dqmEndRun(const edm::Run &, const edm::EventSetup &) override
std::vector< MuonTrackLinks > MuonTrackLinksCollection
collection of MuonTrackLinks
Definition: MuonFwd.h:22
void Fill(long long x)
int iEvent
Definition: GenABIO.cc:224
double eta() const
pseudorapidity of momentum vector
Definition: TrackBase.h:652
edm::EDGetTokenT< edm::View< reco::Track > > glbToken_
T sqrt(T t)
Definition: SSEVec.h:19
void computeEfficiencyPt(MonitorElement *, MonitorElement *recoTH2, MonitorElement *simTH2)
double pt() const
track transverse momentum
Definition: TrackBase.h:637
edm::EDGetTokenT< edm::View< reco::Track > > staToken_
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
void analyze(const edm::Event &, const edm::EventSetup &) override
virtual void setBinContent(int binx, double content)
set content of bin (1-D)
GlobalMuonMatchAnalyzer(const edm::ParameterSet &)
MonitorElement * book2D(TString const &name, TString const &title, int nchX, double lowX, double highX, int nchY, double lowY, double highY, FUNC onbooking=NOOP())
Definition: DQMStore.h:177
DQM_DEPRECATED void save(std::string const &filename, std::string const &path="")
Definition: DQMStore.cc:784
edm::EDGetTokenT< edm::View< reco::Track > > tpToken_
virtual void setBinError(int binx, double error)
set uncertainty on content of bin (1-D)
std::vector< TrackingParticle > TrackingParticleCollection
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX, FUNC onbooking=NOOP())
Definition: DQMStore.h:98
void computeEfficiencyEta(MonitorElement *, MonitorElement *recoTH2, MonitorElement *simTH2)
edm::EDGetTokenT< reco::TrackToTrackingParticleAssociator > tkAssociatorToken_
Definition: Run.h:45
edm::EDGetTokenT< edm::View< reco::Track > > tkToken_