CMS 3D CMS Logo

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  std::string dirName = "Matcher/";
229  // ibooker.setCurrentFolder("RecoMuonV/Matcher");
230  ibooker.setCurrentFolder(dirName);
231 
232  h_shouldMatch = ibooker.book2D("h_shouldMatch", "SIM associated to Tk and Sta", 50, -2.5, 2.5, 100, 0., 500.);
233  h_goodMatchSim = ibooker.book2D("h_goodMatchSim", "SIM associated to Glb Sta Tk", 50, -2.5, 2.5, 100, 0., 500.);
234  h_tkOnlySim = ibooker.book2D("h_tkOnlySim", "SIM associated to Glb Tk", 50, -2.5, 2.5, 100, 0., 500.);
235  h_staOnlySim = ibooker.book2D("h_staOnlySim", "SIM associated to Glb Sta", 50, -2.5, 2.5, 100, 0., 500.);
236 
237  h_totReco = ibooker.book2D("h_totReco", "Total Glb Reconstructed", 50, -2.5, 2.5, 100, 0., 500.);
238  h_goodMatch = ibooker.book2D("h_goodMatch", "Sta and Tk from same SIM", 50, -2.5, 2.5, 100, 0., 500.);
239  h_fakeMatch = ibooker.book2D("h_fakeMatch", "Sta and Tk not from same SIM", 50, -2.5, 2.5, 100, 0., 500.);
240 
241  h_effic = ibooker.book1D("h_effic", "Efficiency vs #eta", 50, -2.5, 2.5);
242  h_efficPt = ibooker.book1D("h_efficPt", "Efficiency vs p_{T}", 100, 0., 100.);
243 
244  h_fake = ibooker.book1D("h_fake", "Fake fraction vs #eta", 50, -2.5, 2.5);
245  h_fakePt = ibooker.book1D("h_fakePt", "Fake fraction vs p_{T}", 100, 0., 100.);
246 }
247 
249  MonitorElement *recoTH2,
250  MonitorElement *simTH2) {
251  TH2F *h1 = recoTH2->getTH2F();
252  TH1D *reco = h1->ProjectionX();
253 
254  TH2F *h2 = simTH2->getTH2F();
255  TH1D *sim = h2->ProjectionX();
256 
257  TH1F *hEff = (TH1F *)reco->Clone();
258 
259  hEff->Divide(sim);
260 
261  hEff->SetName("tmp_" + TString(reco->GetName()));
262 
263  // Set the error accordingly to binomial statistics
264  int nBinsEta = hEff->GetNbinsX();
265  for (int bin = 1; bin <= nBinsEta; bin++) {
266  float nSimHit = sim->GetBinContent(bin);
267  float eff = hEff->GetBinContent(bin);
268  float error = 0;
269  if (nSimHit != 0 && eff <= 1) {
270  error = sqrt(eff * (1 - eff) / nSimHit);
271  }
272  hEff->SetBinError(bin, error);
273  effHist->setBinContent(bin, eff);
274  effHist->setBinError(bin, error);
275  }
276 }
277 
279  MonitorElement *recoTH2,
280  MonitorElement *simTH2) {
281  TH2F *h1 = recoTH2->getTH2F();
282  TH1D *reco = h1->ProjectionY();
283 
284  TH2F *h2 = simTH2->getTH2F();
285  TH1D *sim = h2->ProjectionY();
286 
287  TH1F *hEff = (TH1F *)reco->Clone();
288 
289  hEff->Divide(sim);
290 
291  hEff->SetName("tmp_" + TString(reco->GetName()));
292 
293  // Set the error accordingly to binomial statistics
294  int nBinsPt = hEff->GetNbinsX();
295  for (int bin = 1; bin <= nBinsPt; bin++) {
296  float nSimHit = sim->GetBinContent(bin);
297  float eff = hEff->GetBinContent(bin);
298  float error = 0;
299  if (nSimHit != 0 && eff <= 1) {
300  error = sqrt(eff * (1 - eff) / nSimHit);
301  }
302  hEff->SetBinError(bin, error);
303  effHist->setBinContent(bin, eff);
304  effHist->setBinError(bin, error);
305  }
306 }
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX)
Definition: DQMStore.cc:239
reco::SimToRecoCollection associateSimToReco(const edm::Handle< edm::View< reco::Track >> &tCH, const edm::Handle< TrackingParticleCollection > &tPCH) const
T getUntrackedParameter(std::string const &, T const &) const
edm::EDGetTokenT< reco::TrackToTrackingParticleAssociator > muAssociatorToken_
std::vector< TrackingParticle > TrackingParticleCollection
const_iterator end() const
last iterator over the map (read only)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:525
void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:418
const_iterator find(const key_type &k) const
find element with specified reference key
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:617
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:602
edm::EDGetTokenT< edm::View< reco::Track > > staToken_
reco::RecoToSimCollection associateRecoToSim(const edm::Handle< edm::View< reco::Track >> &tCH, const edm::Handle< TrackingParticleCollection > &tPCH) const
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
T const * product() const
Definition: Handle.h:69
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 &)
fixed size matrix
HLT enums.
MonitorElement * book2D(TString const &name, TString const &title, int nchX, double lowX, double highX, int nchY, double lowY, double highY)
Definition: DQMStore.cc:266
edm::EDGetTokenT< edm::View< reco::Track > > tpToken_
virtual void setBinError(int binx, double error)
set uncertainty on content of bin (1-D)
void computeEfficiencyEta(MonitorElement *, MonitorElement *recoTH2, MonitorElement *simTH2)
void save(std::string const &filename, std::string const &path="", std::string const &pattern="", std::string const &rewrite="", uint32_t run=0, uint32_t lumi=0, SaveReferenceTag ref=SaveWithReference, int minStatus=dqm::qstatus::STATUS_OK, std::string const &fileupdate="RECREATE")
Definition: DQMStore.cc:2244
edm::EDGetTokenT< reco::TrackToTrackingParticleAssociator > tkAssociatorToken_
Definition: Run.h:45
edm::EDGetTokenT< edm::View< reco::Track > > tkToken_