CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
SiStripRecHitsValid.cc
Go to the documentation of this file.
3 
4 //needed for the geometry:
18 
19 
20 //--- for RecHit
25 
27 
28 using namespace std;
29 using namespace edm;
30 
31 namespace helper {
32  struct GetDetId {
33  template<typename X>
34  DetId operator()(const X &x) { return DetId(x.detId()); }
35  };
36 
37  template<typename T>
38  std::pair<typename T::DetSet::const_iterator, typename T::DetSet::const_iterator>
39  getRange(const T &detset, const DetId &id) {
40  typedef std::pair<typename T::DetSet::const_iterator, typename T::DetSet::const_iterator> return_type;
41  typename T::const_iterator match = detset.find(id);
42  if (match == detset.end()) return return_type();
43  typename T::DetSet hits = *match;
44  return return_type(hits.begin(), hits.end());
45  }
46 }
47 
48 
49 
50 //Constructor
52  conf_(ps),
53  m_cacheID_(0)
54  // matchedRecHits_( ps.getParameter<edm::InputTag>("matchedRecHits") ),
55  // rphiRecHits_( ps.getParameter<edm::InputTag>("rphiRecHits") ),
56  // stereoRecHits_( ps.getParameter<edm::InputTag>("stereoRecHits") )
57 {
58  matchedRecHitsToken_ = consumes<SiStripMatchedRecHit2DCollection>( ps.getParameter<edm::InputTag>("matchedRecHits") );
59 
60  rphiRecHitsToken_ = consumes<SiStripRecHit2DCollection>( ps.getParameter<edm::InputTag>("rphiRecHits") );
61 
62  stereoRecHitsToken_ = consumes<SiStripRecHit2DCollection>( ps.getParameter<edm::InputTag>("stereoRecHits") );
63 
64  topFolderName_ = conf_.getParameter<std::string>("TopFolderName");
65 
66  SubDetList_ = conf_.getParameter<std::vector<std::string> >("SubDetList");
67 
68  edm::ParameterSet ParametersNumTotrphi = conf_.getParameter<edm::ParameterSet>("TH1NumTotrphi");
69  switchNumTotrphi = ParametersNumTotrphi.getParameter<bool>("switchon");
70 
71  edm::ParameterSet ParametersNumTotStereo = conf_.getParameter<edm::ParameterSet>("TH1NumTotStereo");
72  switchNumTotStereo = ParametersNumTotStereo.getParameter<bool>("switchon");
73 
74  edm::ParameterSet ParametersNumTotMatched = conf_.getParameter<edm::ParameterSet>("TH1NumTotMatched");
75  switchNumTotMatched = ParametersNumTotMatched.getParameter<bool>("switchon");
76 
77  edm::ParameterSet ParametersNumrphi = conf_.getParameter<edm::ParameterSet>("TH1Numrphi");
78  switchNumrphi = ParametersNumrphi.getParameter<bool>("switchon");
79 
80  edm::ParameterSet ParametersBunchrphi = conf_.getParameter<edm::ParameterSet>("TH1Bunchrphi");
81  switchBunchrphi = ParametersBunchrphi.getParameter<bool>("switchon");
82 
83  edm::ParameterSet ParametersEventrphi = conf_.getParameter<edm::ParameterSet>("TH1Eventrphi");
84  switchEventrphi = ParametersEventrphi.getParameter<bool>("switchon");
85 
86  edm::ParameterSet ParametersNumStereo = conf_.getParameter<edm::ParameterSet>("TH1NumStereo");
87  switchNumStereo = ParametersNumStereo.getParameter<bool>("switchon");
88 
89  edm::ParameterSet ParametersBunchStereo = conf_.getParameter<edm::ParameterSet>("TH1BunchStereo");
90  switchBunchStereo = ParametersBunchStereo.getParameter<bool>("switchon");
91 
92  edm::ParameterSet ParametersEventStereo = conf_.getParameter<edm::ParameterSet>("TH1EventStereo");
93  switchEventStereo = ParametersEventStereo.getParameter<bool>("switchon");
94 
95  edm::ParameterSet ParametersNumMatched = conf_.getParameter<edm::ParameterSet>("TH1NumMatched");
96  switchNumMatched = ParametersNumMatched.getParameter<bool>("switchon");
97 
98  edm::ParameterSet ParametersBunchMatched = conf_.getParameter<edm::ParameterSet>("TH1BunchMatched");
99  switchBunchMatched = ParametersBunchMatched.getParameter<bool>("switchon");
100 
101  edm::ParameterSet ParametersEventMatched = conf_.getParameter<edm::ParameterSet>("TH1EventMatched");
102  switchEventMatched = ParametersEventMatched.getParameter<bool>("switchon");
103 
104  edm::ParameterSet ParametersWclusrphi = conf_.getParameter<edm::ParameterSet>("TH1Wclusrphi");
105  switchWclusrphi = ParametersWclusrphi.getParameter<bool>("switchon");
106 
107  edm::ParameterSet ParametersAdcrphi = conf_.getParameter<edm::ParameterSet>("TH1Adcrphi");
108  switchAdcrphi = ParametersAdcrphi.getParameter<bool>("switchon");
109 
110  edm::ParameterSet ParametersPosxrphi = conf_.getParameter<edm::ParameterSet>("TH1Posxrphi");
111  switchPosxrphi = ParametersPosxrphi.getParameter<bool>("switchon");
112 
113  edm::ParameterSet ParametersResolxrphi = conf_.getParameter<edm::ParameterSet>("TH1Resolxrphi");
114  switchResolxrphi = ParametersResolxrphi.getParameter<bool>("switchon");
115 
116  edm::ParameterSet ParametersResrphi = conf_.getParameter<edm::ParameterSet>("TH1Resrphi");
117  switchResrphi = ParametersResrphi.getParameter<bool>("switchon");
118 
119  edm::ParameterSet ParametersPullLFrphi = conf_.getParameter<edm::ParameterSet>("TH1PullLFrphi");
120  switchPullLFrphi = ParametersPullLFrphi.getParameter<bool>("switchon");
121 
122  edm::ParameterSet ParametersPullMFrphi = conf_.getParameter<edm::ParameterSet>("TH1PullMFrphi");
123  switchPullMFrphi = ParametersPullMFrphi.getParameter<bool>("switchon");
124 
125  edm::ParameterSet ParametersChi2rphi = conf_.getParameter<edm::ParameterSet>("TH1Chi2rphi");
126  switchChi2rphi = ParametersChi2rphi.getParameter<bool>("switchon");
127 
128  edm::ParameterSet ParametersNsimHitrphi = conf_.getParameter<edm::ParameterSet>("TH1NsimHitrphi");
129  switchNsimHitrphi = ParametersNsimHitrphi.getParameter<bool>("switchon");
130 
131  edm::ParameterSet ParametersWclusStereo = conf_.getParameter<edm::ParameterSet>("TH1WclusStereo");
132  switchWclusStereo = ParametersWclusStereo.getParameter<bool>("switchon");
133 
134  edm::ParameterSet ParametersAdcStereo = conf_.getParameter<edm::ParameterSet>("TH1AdcStereo");
135  switchAdcStereo = ParametersAdcStereo.getParameter<bool>("switchon");
136 
137  edm::ParameterSet ParametersPosxStereo = conf_.getParameter<edm::ParameterSet>("TH1PosxStereo");
138  switchPosxStereo = ParametersPosxStereo.getParameter<bool>("switchon");
139 
140  edm::ParameterSet ParametersResolxStereo = conf_.getParameter<edm::ParameterSet>("TH1ResolxStereo");
141  switchResolxStereo = ParametersResolxStereo.getParameter<bool>("switchon");
142 
143  edm::ParameterSet ParametersResStereo = conf_.getParameter<edm::ParameterSet>("TH1ResStereo");
144  switchResStereo = ParametersResStereo.getParameter<bool>("switchon");
145 
146  edm::ParameterSet ParametersPullLFStereo = conf_.getParameter<edm::ParameterSet>("TH1PullLFStereo");
147  switchPullLFStereo = ParametersPullLFStereo.getParameter<bool>("switchon");
148 
149  edm::ParameterSet ParametersPullMFStereo = conf_.getParameter<edm::ParameterSet>("TH1PullMFStereo");
150  switchPullMFStereo = ParametersPullMFStereo.getParameter<bool>("switchon");
151 
152  edm::ParameterSet ParametersChi2Stereo = conf_.getParameter<edm::ParameterSet>("TH1Chi2Stereo");
153  switchChi2Stereo = ParametersChi2Stereo.getParameter<bool>("switchon");
154 
155  edm::ParameterSet ParametersNsimHitStereo = conf_.getParameter<edm::ParameterSet>("TH1NsimHitStereo");
156  switchNsimHitStereo = ParametersNsimHitStereo.getParameter<bool>("switchon");
157 
158  edm::ParameterSet ParametersPosxMatched = conf_.getParameter<edm::ParameterSet>("TH1PosxMatched");
159  switchPosxMatched = ParametersPosxMatched.getParameter<bool>("switchon");
160 
161  edm::ParameterSet ParametersPosyMatched = conf_.getParameter<edm::ParameterSet>("TH1PosyMatched");
162  switchPosyMatched = ParametersPosyMatched.getParameter<bool>("switchon");
163 
164  edm::ParameterSet ParametersResolxMatched = conf_.getParameter<edm::ParameterSet>("TH1ResolxMatched");
165  switchResolxMatched = ParametersResolxMatched.getParameter<bool>("switchon");
166 
167  edm::ParameterSet ParametersResolyMatched = conf_.getParameter<edm::ParameterSet>("TH1ResolyMatched");
168  switchResolyMatched = ParametersResolyMatched.getParameter<bool>("switchon");
169 
170  edm::ParameterSet ParametersResxMatched = conf_.getParameter<edm::ParameterSet>("TH1ResxMatched");
171  switchResxMatched = ParametersResxMatched.getParameter<bool>("switchon");
172 
173  edm::ParameterSet ParametersResyMatched = conf_.getParameter<edm::ParameterSet>("TH1ResyMatched");
174  switchResyMatched = ParametersResyMatched.getParameter<bool>("switchon");
175 
176  edm::ParameterSet ParametersChi2Matched = conf_.getParameter<edm::ParameterSet>("TH1Chi2Matched");
177  switchChi2Matched = ParametersChi2Matched.getParameter<bool>("switchon");
178 
179  edm::ParameterSet ParametersNsimHitMatched = conf_.getParameter<edm::ParameterSet>("TH1NsimHitMatched");
180  switchNsimHitMatched = ParametersNsimHitMatched.getParameter<bool>("switchon");
181 
182 }
183 
185 }
186 
187 //--------------------------------------------------------------------------------------------
189 
190  unsigned long long cacheID = es.get<SiStripDetCablingRcd>().cacheIdentifier();
191  if (m_cacheID_ != cacheID) {
192  m_cacheID_ = cacheID;
193  edm::LogInfo("SiStripRecHitsValid") <<"SiStripRecHitsValid::beginRun: "
194  << " Creating MEs for new Cabling ";
195 
196  createMEs(ibooker,es);
197  }
198 }
199 
201 }
202 
204 
205  LogInfo("EventInfo") << " Run = " << e.id().run() << " Event = " << e.id().event();
206  //cout << " Run = " << e.id().run() << " Event = " << e.id().event() << endl;
207 
208  //Retrieve tracker topology from geometry
209  edm::ESHandle<TrackerTopology> tTopoHandle;
210  es.get<IdealGeometryRecord>().get(tTopoHandle);
211  const TrackerTopology* const tTopo = tTopoHandle.product();
212 
213  // Step A: Get Inputs
217  e.getByToken(matchedRecHitsToken_, rechitsmatched);
218  e.getByToken(rphiRecHitsToken_, rechitsrphi);
219  e.getByToken(stereoRecHitsToken_, rechitsstereo);
220 
221  int numrechitrphi =0;
222  int numrechitstereo =0;
223  int numrechitmatched=0;
224 
225  //Variables in order to count total num of rechitrphi,rechitstereo, rechitmatched in subdetectors
226  std::map<std::string, std::vector<int> > totnumrechitrphi;
227  std::map<std::string, std::vector<int> > totnumrechitstereo;
228  std::map<std::string, std::vector<int> > totnumrechitmatched;
229  totnumrechitrphi.clear();
230  totnumrechitstereo.clear();
231  totnumrechitmatched.clear();
232  int totrechitrphi =0;
233  int totrechitstereo =0;
234  int totrechitmatched =0;
235 
236  TrackerHitAssociator associate(e, conf_);
237 
239  es.get<TrackerDigiGeometryRecord> ().get (pDD);
240  const TrackerGeometry &tracker(*pDD);
241  // FIXME: this using of vector<DetId> is suboptimal, but I don't want to re-write the full class now
242  std::vector<DetId> IDs;
243  IDs.reserve(rechitsrphi->size() + rechitsmatched->size() + rechitsstereo->size());
244  std::transform(rechitsrphi->begin(), rechitsrphi->end(), std::back_inserter(IDs), helper::GetDetId() );
245  std::transform(rechitsstereo->begin(), rechitsstereo->end(), std::back_inserter(IDs), helper::GetDetId() );
246  std::transform(rechitsmatched->begin(), rechitsmatched->end(), std::back_inserter(IDs), helper::GetDetId() );
247  // loop over DetIds
248  // for(TrackerGeometry::DetContainer::const_iterator it = pDD->dets().begin(); it != pDD->dets().end(); it++){
249  for(std::vector<DetId>::const_iterator it = IDs.begin(); it != IDs.end(); ++it ){//loop on detector with hits
250  uint32_t myid=((*it).rawId());
251  DetId detid = ((*it));
252 
253  rechitrphi.clear();
254  rechitstereo.clear();
255  rechitmatched.clear();
256 
257  numrechitrphi =0;
258  //loop over rechits-rphi in the same subdetector
259  std::pair<SiStripRecHit2DCollection::DetSet::const_iterator,SiStripRecHit2DCollection::DetSet::const_iterator> rechitrphiRange = helper::getRange(*rechitsrphi, detid);
260  SiStripRecHit2DCollection::DetSet::const_iterator rechitrphiRangeIteratorBegin = rechitrphiRange.first;
261  SiStripRecHit2DCollection::DetSet::const_iterator rechitrphiRangeIteratorEnd = rechitrphiRange.second;
262  SiStripRecHit2DCollection::DetSet::const_iterator iterrphi=rechitrphiRangeIteratorBegin;
263 
264  numrechitrphi = rechitrphiRangeIteratorEnd - rechitrphiRangeIteratorBegin;
265 
266  if(numrechitrphi > 0 ){
267  totrechitrphi+=numrechitrphi;
268  for(iterrphi=rechitrphiRangeIteratorBegin; iterrphi!=rechitrphiRangeIteratorEnd;++iterrphi){
269 
270  const GeomDetUnit * det = tracker.idToDetUnit(detid);
271  const StripGeomDetUnit * stripdet=(const StripGeomDetUnit*)(det);
272  const StripTopology &topol=(StripTopology&)stripdet->topology();
273  SiStripRecHit2D const rechit=*iterrphi;
274  //analyze RecHits
275  rechitanalysis(rechit,topol,associate);
276  rechitrphi.push_back(rechitpro);
277  }
278  }
279 
280  //loop over rechits-stereo in the same subdetector
281  numrechitstereo=0;
282  std::pair<SiStripRecHit2DCollection::DetSet::const_iterator,SiStripRecHit2DCollection::DetSet::const_iterator> rechitstereoRange = helper::getRange(*rechitsstereo, detid);
283  SiStripRecHit2DCollection::DetSet::const_iterator rechitstereoRangeIteratorBegin = rechitstereoRange.first;
284  SiStripRecHit2DCollection::DetSet::const_iterator rechitstereoRangeIteratorEnd = rechitstereoRange.second;
285  SiStripRecHit2DCollection::DetSet::const_iterator iterstereo=rechitstereoRangeIteratorBegin;
286  numrechitstereo = rechitstereoRangeIteratorEnd - rechitstereoRangeIteratorBegin;
287  if(numrechitstereo > 0){
288  totrechitstereo+=numrechitstereo;
289  for(iterstereo=rechitstereoRangeIteratorBegin; iterstereo!=rechitstereoRangeIteratorEnd;++iterstereo){
290  const GeomDetUnit * det = tracker.idToDetUnit(detid);
291  const StripGeomDetUnit * stripdet=(const StripGeomDetUnit*)(det);
292  const StripTopology &topol=(StripTopology&)stripdet->topology();
293  SiStripRecHit2D const rechit=*iterstereo;
294  //analyze RecHits
295  rechitanalysis(rechit,topol,associate);
296  rechitstereo.push_back(rechitpro);
297  }
298  }
299 
300  //now matched hits
301  //loop over rechits-matched in the same subdetector
302  numrechitmatched=0;
303  std::pair<SiStripMatchedRecHit2DCollection::DetSet::const_iterator,SiStripMatchedRecHit2DCollection::DetSet::const_iterator> rechitmatchedRange = helper::getRange(*rechitsmatched, detid);
304  SiStripMatchedRecHit2DCollection::DetSet::const_iterator rechitmatchedRangeIteratorBegin = rechitmatchedRange.first;
305  SiStripMatchedRecHit2DCollection::DetSet::const_iterator rechitmatchedRangeIteratorEnd = rechitmatchedRange.second;
306  SiStripMatchedRecHit2DCollection::DetSet::const_iterator itermatched=rechitmatchedRangeIteratorBegin;
307  numrechitmatched = rechitmatchedRangeIteratorEnd - rechitmatchedRangeIteratorBegin;
308  if(numrechitmatched > 0){
309  totrechitmatched +=numrechitmatched;
310 
311  for(itermatched=rechitmatchedRangeIteratorBegin; itermatched!=rechitmatchedRangeIteratorEnd;++itermatched){
312  SiStripMatchedRecHit2D const rechit=*itermatched;
313  const GluedGeomDet* gluedDet = (const GluedGeomDet*)tracker.idToDet(rechit.geographicalId());
314  //analyze RecHits
315  rechitanalysis_matched(rechit, gluedDet, associate);
316  rechitmatched.push_back(rechitpro);
317  }
318  }
319 
320  SiStripHistoId hidmanager;
321  std::string label = hidmanager.getSubdetid(myid,tTopo,true);
322  std::map<std::string, LayerMEs>::iterator iLayerME = LayerMEsMap.find(label);
323  std::map<std::string, StereoAndMatchedMEs>::iterator iStereoAndMatchedME = StereoAndMatchedMEsMap.find(label);
324  //std::cout << "label " << label << endl;
325  SiStripFolderOrganizer fold_organ;
326  std::pair<std::string,int32_t> det_lay_pair = fold_organ.GetSubDetAndLayer(myid,tTopo,true);
327 
328  if(numrechitrphi>0 || numrechitstereo>0 || numrechitmatched){
329 
330  totnumrechitrphi[det_lay_pair.first].push_back(numrechitrphi);
331  totnumrechitstereo[det_lay_pair.first].push_back(numrechitstereo);
332  totnumrechitmatched[det_lay_pair.first].push_back(numrechitmatched);
333 
334  for (std::vector<RecHitProperties>::iterator irh=rechitrphi.begin(); irh!=rechitrphi.end(); ++irh) {
335  if(iLayerME != LayerMEsMap.end()){
336  fillME(iLayerME->second.meWclusrphi,(*irh).clusiz);
337  fillME(iLayerME->second.meAdcrphi,(*irh).cluchg);
338  fillME(iLayerME->second.mePosxrphi,(*irh).x);
339  fillME(iLayerME->second.meResolxrphi,(*irh).resolxx);
340  fillME(iLayerME->second.meNsimHitrphi,(*irh).NsimHit);
341  if ((*irh).NsimHit > 0) {
342  std::map<std::string, SubDetMEs>::iterator iSubDetME = SubDetMEsMap.find(det_lay_pair.first);
343  fillME(iSubDetME->second.meBunchrphi, (*irh).bunch);
344  if ((*irh).bunch == 0) fillME(iSubDetME->second.meEventrphi, (*irh).event);
345  }
346  if ( (*irh).resx != -999999. || (*irh).pullMF != -999999. || (*irh).chi2 != -999999. ){
347  fillME(iLayerME->second.meResrphi,(*irh).resx);
348  fillME(iLayerME->second.mePullLFrphi,(*irh).resx/sqrt((*irh).resolxx));
349  fillME(iLayerME->second.mePullMFrphi,(*irh).pullMF);
350  fillME(iLayerME->second.meChi2rphi,(*irh).chi2);
351  }
352  }
353  }
354 
355 
356  for (std::vector<RecHitProperties>::iterator irh=rechitstereo.begin(); irh!=rechitstereo.end(); ++irh) {
357  if(iStereoAndMatchedME != StereoAndMatchedMEsMap.end()){
358  fillME(iStereoAndMatchedME->second.meWclusStereo,(*irh).clusiz);
359  fillME(iStereoAndMatchedME->second.meAdcStereo,(*irh).cluchg);
360  fillME(iStereoAndMatchedME->second.mePosxStereo,(*irh).x);
361  fillME(iStereoAndMatchedME->second.meResolxStereo,sqrt((*irh).resolxx));
362  fillME(iStereoAndMatchedME->second.meNsimHitStereo,(*irh).NsimHit);
363  if ((*irh).NsimHit > 0) {
364  std::map<std::string, SubDetMEs>::iterator iSubDetME = SubDetMEsMap.find(det_lay_pair.first);
365  fillME(iSubDetME->second.meBunchStereo, (*irh).bunch);
366  if ((*irh).bunch == 0) fillME(iSubDetME->second.meEventStereo, (*irh).event);
367  }
368  if ( (*irh).resx != -999999. || (*irh).pullMF != -999999. || (*irh).chi2 != -999999. ){
369  fillME(iStereoAndMatchedME->second.meResStereo,(*irh).resx);
370  fillME(iStereoAndMatchedME->second.mePullLFStereo,(*irh).resx/sqrt((*irh).resolxx));
371  fillME(iStereoAndMatchedME->second.mePullMFStereo,(*irh).pullMF);
372  fillME(iStereoAndMatchedME->second.meChi2Stereo,(*irh).chi2);
373  }
374  }
375  }
376 
377  for (std::vector<RecHitProperties>::iterator irh=rechitmatched.begin(); irh!=rechitmatched.end(); ++irh) {
378  if(iStereoAndMatchedME != StereoAndMatchedMEsMap.end()){
379  fillME(iStereoAndMatchedME->second.mePosxMatched,(*irh).x);
380  fillME(iStereoAndMatchedME->second.mePosyMatched,(*irh).y);
381  fillME(iStereoAndMatchedME->second.meResolxMatched,sqrt((*irh).resolxx));
382  fillME(iStereoAndMatchedME->second.meResolyMatched,sqrt((*irh).resolyy));
383  fillME(iStereoAndMatchedME->second.meNsimHitMatched,(*irh).NsimHit);
384  if ((*irh).NsimHit > 0) {
385  std::map<std::string, SubDetMEs>::iterator iSubDetME = SubDetMEsMap.find(det_lay_pair.first);
386  fillME(iSubDetME->second.meBunchMatched, (*irh).bunch);
387  if ((*irh).bunch == 0) fillME(iSubDetME->second.meEventMatched, (*irh).event);
388  }
389  if ( (*irh).resx != -999999. || (*irh).resy != -999999. || (*irh).chi2 != -999999. ){
390  fillME(iStereoAndMatchedME->second.meResxMatched,(*irh).resx);
391  fillME(iStereoAndMatchedME->second.meResyMatched,(*irh).resy);
392  fillME(iStereoAndMatchedME->second.meChi2Matched,(*irh).chi2);
393  }
394  }
395  }
396 
397  }
398 
399  }//End of loop over detectors
400 
401 
402  //now fill the cumulative histograms of the hits
403  for (std::vector<std::string>::iterator iSubdet = SubDetList_.begin(); iSubdet != SubDetList_.end(); iSubdet++){
404  std::map<std::string, SubDetMEs>::iterator iSubDetME = SubDetMEsMap.find((*iSubdet));
405  fillME(iSubDetME->second.meNumrphi,std::accumulate(totnumrechitrphi[(*iSubdet)].rbegin(), totnumrechitrphi[(*iSubdet)].rend(), 0));
406  fillME(iSubDetME->second.meNumStereo,std::accumulate(totnumrechitstereo[(*iSubdet)].rbegin(), totnumrechitstereo[(*iSubdet)].rend(), 0));
407  fillME(iSubDetME->second.meNumMatched,std::accumulate(totnumrechitmatched[(*iSubdet)].rbegin(), totnumrechitmatched[(*iSubdet)].rend(), 0));
408  }
409 
410  fillME(totalMEs.meNumTotrphi,totrechitrphi);
411  fillME(totalMEs.meNumTotStereo,totrechitstereo);
412  fillME(totalMEs.meNumTotMatched,totrechitmatched);
413 
414 }
415 
416 
417 //needed by to do the residual for matched hits
418 std::pair<LocalPoint,LocalVector> SiStripRecHitsValid::projectHit( const PSimHit& hit, const StripGeomDetUnit* stripDet,
419  const BoundPlane& plane)
420 {
421  // const StripGeomDetUnit* stripDet = dynamic_cast<const StripGeomDetUnit*>(hit.det());
422  //if (stripDet == 0) throw MeasurementDetException("HitMatcher hit is not on StripGeomDetUnit");
423 
424  const StripTopology& topol = stripDet->specificTopology();
425  GlobalPoint globalpos= stripDet->surface().toGlobal(hit.localPosition());
426  LocalPoint localHit = plane.toLocal(globalpos);
427  //track direction
428  LocalVector locdir=hit.localDirection();
429  //rotate track in new frame
430 
431  GlobalVector globaldir= stripDet->surface().toGlobal(locdir);
432  LocalVector dir=plane.toLocal(globaldir);
433  double scale = -localHit.z() / dir.z();
434 
435  LocalPoint projectedPos = localHit + scale*dir;
436 
437  // std::cout << "projectedPos " << projectedPos << std::endl;
438 
439  double selfAngle = topol.stripAngle( topol.strip( hit.localPosition()));
440 
441  LocalVector stripDir( sin(selfAngle), cos(selfAngle), 0); // vector along strip in hit frame
442 
443  LocalVector localStripDir( plane.toLocal(stripDet->surface().toGlobal( stripDir)));
444 
445  return std::pair<LocalPoint,LocalVector>( projectedPos, localStripDir);
446 }
447 //--------------------------------------------------------------------------------------------
449 
450  rechitpro.x = -999999.; rechitpro.y = -999999.; rechitpro.z = -999999.; rechitpro.resolxx = -999999.; rechitpro.resolxy = -999999.;
451  rechitpro.resolyy = -999999.; rechitpro.resx = -999999.; rechitpro.resy = -999999.;rechitpro.pullMF = -999999.;
452  rechitpro.clusiz = -999999.; rechitpro.cluchg = -999999.; rechitpro.chi2 = -999999.; rechitpro.NsimHit = -999999.;
453  rechitpro.bunch = -999999.; rechitpro.event = -999999.;
454 
457  MeasurementPoint Mposition;
458  MeasurementError Merror;
459  Mposition = topol.measurementPosition(position);
460  Merror = topol.measurementError(position,error);
461  SiStripRecHit2D::ClusterRef clust=rechit.cluster();
462  int clusiz=0;
463  int totcharge=0;
464  clusiz = clust->amplitudes().size();
465  const auto & amplitudes=clust->amplitudes();
466  for(size_t ia=0; ia<amplitudes.size();ia++){
467  totcharge+=amplitudes[ia];
468  }
469  rechitpro.x = position.x();
470  rechitpro.y = position.y();
471  rechitpro.z = position.z();
472  rechitpro.resolxx = error.xx();
473  rechitpro.resolxy = error.xy();
474  rechitpro.resolyy = error.yy();
475  rechitpro.clusiz = clusiz;
476  rechitpro.cluchg = totcharge;
477 
478 
479  matched.clear();
480  matched = associate.associateHit(rechit);
481  rechitpro.NsimHit = matched.size();
482 
483  double mindist = 999999;
484  double dist = 999999;
485  PSimHit closest;
486 
487  if(!matched.empty()){
488 
489  for(vector<PSimHit>::const_iterator m=matched.begin(); m<matched.end(); m++){
490  dist = fabs(rechitpro.x - (*m).localPosition().x());
491  if(dist<mindist){
492  mindist = dist;
493  closest = (*m);
494  }
495  }
496  rechitpro.bunch = closest.eventId().bunchCrossing();
497  rechitpro.event = closest.eventId().event();
498  rechitpro.resx = rechitpro.x - closest.localPosition().x();
499  rechitpro.pullMF = (Mposition.x() - (topol.measurementPosition(closest.localPosition())).x())/sqrt(Merror.uu());
500 
501  //chi2test compare rechit errors with the simhit position ( using null matrix for the simhit).
502  //Can spot problems in the geometry better than a simple residual. (thanks to BorisM)
503  AlgebraicVector rhparameters(2);//= rechit.parameters();
504  rhparameters[0] = position.x();
505  rhparameters[1] = position.y();
506  AlgebraicVector shparameters(2);
507  shparameters[0] = closest.localPosition().x();
508  shparameters[1] = closest.localPosition().y();
509  AlgebraicVector r(rhparameters - shparameters);
510  AlgebraicSymMatrix R(2);// = rechit.parametersError();
511  R[0][0] = error.xx();
512  R[0][1] = error.xy();
513  R[1][1] = error.yy();
514  int ierr;
515  R.invert(ierr); // if (ierr != 0) throw exception;
516  double est = R.similarity(r);
517  // std::cout << " ====== Chi2 test rphi hits ====== " << std::endl;
518  // std::cout << "RecHit param. = " << rhparameters << std::endl;
519  // std::cout << "RecHit errors = " << R << std::endl;
520  // std::cout << "SimHit param. = " << shparameters << std::endl;
521  // std::cout << " chi2 = " << est << std::endl;
522  // std::cout << "DEBUG BORIS,filling chi2rphi[i],i: " << i << std::endl;
523  rechitpro.chi2 = est;
524  }
525 
526 }
527 
528 
529 //--------------------------------------------------------------------------------------------
531 
532  rechitpro.x = -999999.; rechitpro.y = -999999.; rechitpro.z = -999999.; rechitpro.resolxx = -999999.; rechitpro.resolxy = -999999.;
533  rechitpro.resolyy = -999999.; rechitpro.resx = -999999.; rechitpro.resy = -999999.;rechitpro.pullMF = -999999.;
534  rechitpro.clusiz = -999999.; rechitpro.cluchg = -999999.; rechitpro.chi2 = -999999.; rechitpro.NsimHit = -999999.;
535  rechitpro.bunch = -999999.; rechitpro.event = -999999.;
536 
539 
540  rechitpro.x = position.x();
541  rechitpro.y = position.y();
542  rechitpro.z = position.z();
543  rechitpro.resolxx = error.xx();
544  rechitpro.resolxy = error.xy();
545  rechitpro.resolyy = error.yy();
546 
547  matched.clear();
548  matched = associate.associateHit(rechit);
549  rechitpro.NsimHit = matched.size();
550 
551  double mindist = 999999;
552  double dist = 999999;
553  double distx = 999999;
554  double disty = 999999;
555  PSimHit closest;
556  std::pair<LocalPoint,LocalVector> closestPair;
557 
558  if(!matched.empty()){
559 
560  const StripGeomDetUnit* partnerstripdet =(StripGeomDetUnit*) gluedDet->stereoDet();
561  std::pair<LocalPoint,LocalVector> hitPair;
562 
563 
564  for(vector<PSimHit>::const_iterator m=matched.begin(); m<matched.end(); m++){
565  SiStripDetId hitDetId(m->detUnitId());
566  if (hitDetId.stereo()) { // project from the stereo sensor
567  //project simhit;
568  hitPair= projectHit((*m),partnerstripdet,gluedDet->surface());
569  distx = fabs(rechitpro.x - hitPair.first.x());
570  disty = fabs(rechitpro.y - hitPair.first.y());
571  dist = sqrt(distx*distx+disty*disty);
572  // std::cout << " Simhit position x = " << hitPair.first.x()
573  // << " y = " << hitPair.first.y() << " dist = " << dist << std::endl;
574  if(dist<mindist){
575  mindist = dist;
576  closestPair = hitPair;
577  closest = (*m);
578  }
579  }
580  }
581  rechitpro.bunch = closest.eventId().bunchCrossing();
582  rechitpro.event = closest.eventId().event();
583  rechitpro.resx = rechitpro.x - closestPair.first.x();
584  rechitpro.resy = rechitpro.y - closestPair.first.y();
585  //std::cout << " Closest position x = " << closestPair.first.x()
586  // << " y = " << closestPair.first.y() << " dist = " << dist << std::endl;
587 
588  //chi2test compare rechit errors with the simhit position ( using null matrix for the simhit).
589  //Can spot problems in the geometry better than a simple residual. (thanks to BorisM)
590  AlgebraicVector rhparameters(2);//= rechit.parameters();
591  rhparameters[0] = position.x();
592  rhparameters[1] = position.y();
593  LocalPoint sh = closestPair.first;
594  AlgebraicVector shparameters(2);
595  shparameters[0] = sh.x();
596  shparameters[1] = sh.y();
597  AlgebraicVector r(rhparameters - shparameters);
598  AlgebraicSymMatrix R(2);// = rechit.parametersError();
599  R[0][0] = error.xx();
600  R[0][1] = error.xy();
601  R[1][1] = error.yy();
602  int ierr;
603  R.invert(ierr); // if (ierr != 0) throw exception;
604  double est = R.similarity(r);
605  // std::cout << " ====== Chi2 test rphi hits ====== " << std::endl;
606  // std::cout << "RecHit param. = " << rhparameters << std::endl;
607  // std::cout << "RecHit errors = " << R << std::endl;
608  // std::cout << "SimHit param. = " << shparameters << std::endl;
609  // std::cout << " chi2 = " << est << std::endl;
610  // std::cout << "DEBUG BORIS,filling chi2rphi[i],i: " << i << std::endl;
611  rechitpro.chi2 = est;
612  }
613 
614 
615 }
616 
617 //--------------------------------------------------------------------------------------------
619 
620  //Retrieve tracker topology from geometry
621  edm::ESHandle<TrackerTopology> tTopoHandle;
622  es.get<IdealGeometryRecord>().get(tTopoHandle);
623  const TrackerTopology* const tTopo = tTopoHandle.product();
624 
625  // take from eventSetup the SiStripDetCabling object - here will use SiStripDetControl later on
627 
628  // get list of active detectors from SiStripDetCabling
629  std::vector<uint32_t> activeDets;
630  SiStripDetCabling_->addActiveDetectorsRawIds(activeDets);
631 
632  SiStripSubStructure substructure;
633 
634  SiStripFolderOrganizer folder_organizer;
635  // folder_organizer.setSiStripFolderName(topFolderName_);
636  std::string curfold = topFolderName_;
637  folder_organizer.setSiStripFolderName(curfold);
638  folder_organizer.setSiStripFolder();
639 
640  // std::cout << "curfold " << curfold << std::endl;
641 
642  createTotalMEs(ibooker);
643 
644  // loop over detectors and book MEs
645  edm::LogInfo("SiStripTkRecHits|SiStripRecHitsValid")<<"nr. of activeDets: "<<activeDets.size();
646  for(std::vector<uint32_t>::iterator detid_iterator = activeDets.begin(); detid_iterator!=activeDets.end(); detid_iterator++){
647  uint32_t detid = (*detid_iterator);
648  // remove any eventual zero elements - there should be none, but just in case
649  if(detid == 0) {
650  activeDets.erase(detid_iterator);
651  continue;
652  }
653 
654  // Create Layer Level MEs
655  std::pair<std::string,int32_t> det_layer_pair = folder_organizer.GetSubDetAndLayer(detid,tTopo,true);
656  SiStripHistoId hidmanager;
657  std::string label = hidmanager.getSubdetid(detid,tTopo,true);
658  // std::cout << "label " << label << endl;
659 
660  std::map<std::string, LayerMEs>::iterator iLayerME = LayerMEsMap.find(label);
661  if(iLayerME==LayerMEsMap.end()) {
662 
663  // get detids for the layer
664  // Keep in mind that when we are on the TID or TEC we deal with rings not wheel
665  int32_t lnumber = det_layer_pair.second;
666  std::vector<uint32_t> layerDetIds;
667  if (det_layer_pair.first == "TIB") {
668  substructure.getTIBDetectors(activeDets,layerDetIds,lnumber,0,0,0);
669  } else if (det_layer_pair.first == "TOB") {
670  substructure.getTOBDetectors(activeDets,layerDetIds,lnumber,0,0);
671  } else if (det_layer_pair.first == "TID" && lnumber > 0) {
672  substructure.getTIDDetectors(activeDets,layerDetIds,2,0,abs(lnumber),0);
673  } else if (det_layer_pair.first == "TID" && lnumber < 0) {
674  substructure.getTIDDetectors(activeDets,layerDetIds,1,0,abs(lnumber),0);
675  } else if (det_layer_pair.first == "TEC" && lnumber > 0) {
676  substructure.getTECDetectors(activeDets,layerDetIds,2,0,0,0,abs(lnumber),0);
677  } else if (det_layer_pair.first == "TEC" && lnumber < 0) {
678  substructure.getTECDetectors(activeDets,layerDetIds,1,0,0,0,abs(lnumber),0);
679  }
680  LayerDetMap[label] = layerDetIds;
681 
682  // book Layer MEs
683  folder_organizer.setLayerFolder(detid,tTopo,det_layer_pair.second,true);
684  // std::stringstream ss;
685  // folder_organizer.getLayerFolderName(ss, detid, tTopo, true);
686  // std::cout << "Folder Name " << ss.str().c_str() << std::endl;
687  createLayerMEs(ibooker,label);
688  }
689  // book sub-detector plots
690  std::pair<std::string,std::string> sdet_pair = folder_organizer.getSubDetFolderAndTag(detid, tTopo);
691  // std::cout << "sdet_pair " << sdet_pair.first << " " << sdet_pair.second << std::endl;
692  if (SubDetMEsMap.find(det_layer_pair.first) == SubDetMEsMap.end()){
693  ibooker.setCurrentFolder(sdet_pair.first);
694  createSubDetMEs(ibooker,det_layer_pair.first);
695  }
696  //Create StereoAndMatchedMEs
697  std::map<std::string, StereoAndMatchedMEs>::iterator iStereoAndMatchedME = StereoAndMatchedMEsMap.find(label);
698  if(iStereoAndMatchedME==StereoAndMatchedMEsMap.end()) {
699 
700  // get detids for the stereo and matched layer. We are going to need a bool for these layers
701  bool isStereo = false;
702  // Keep in mind that when we are on the TID or TEC we deal with rings not wheel
703  int32_t stereolnumber = det_layer_pair.second;
704  std::vector<uint32_t> stereoandmatchedDetIds;
705  if ( (det_layer_pair.first == "TIB") && (TIBDetId(detid).stereo()== 1) ) {
706  substructure.getTIBDetectors(activeDets,stereoandmatchedDetIds,stereolnumber,0,0,0);
707  isStereo = true;
708  } else if ( (det_layer_pair.first == "TOB") && (TOBDetId(detid).stereo()== 1) ) {
709  substructure.getTOBDetectors(activeDets,stereoandmatchedDetIds,stereolnumber,0,0);
710  isStereo = true;
711  } else if ( (det_layer_pair.first == "TID") && (stereolnumber > 0) && (TIDDetId(detid).stereo()== 1) ) {
712  substructure.getTIDDetectors(activeDets,stereoandmatchedDetIds,2,0,abs(stereolnumber),1);
713  isStereo = true;
714  } else if ( (det_layer_pair.first == "TID") && (stereolnumber < 0) && (TIDDetId(detid).stereo()== 1) ) {
715  substructure.getTIDDetectors(activeDets,stereoandmatchedDetIds,1,0,abs(stereolnumber),1);
716  isStereo = true;
717  } else if ( (det_layer_pair.first == "TEC") && (stereolnumber > 0) && (TECDetId(detid).stereo()== 1) ) {
718  substructure.getTECDetectors(activeDets,stereoandmatchedDetIds,2,0,0,0,abs(stereolnumber),1);
719  isStereo = true;
720  } else if ( (det_layer_pair.first == "TEC") && (stereolnumber < 0) && (TECDetId(detid).stereo()== 1) ) {
721  substructure.getTECDetectors(activeDets,stereoandmatchedDetIds,1,0,0,0,abs(stereolnumber),1);
722  isStereo = true;
723  }
724  StereoAndMatchedDetMap[label] = stereoandmatchedDetIds;
725 
726  if(isStereo){
727  //book StereoAndMatched MEs
728  folder_organizer.setLayerFolder(detid,tTopo,det_layer_pair.second,true);
729  // std::stringstream ss1;
730  // folder_organizer.getLayerFolderName(ss1, detid, tTopo, true);
731  // std::cout << "Folder Name stereo " << ss1.str().c_str() << std::endl;
732  //Create the Monitor Elements only when we have a stereo module
733  createStereoAndMatchedMEs(ibooker,label);
734  }
735  }
736 
737 
738  }//end of loop over detectors
739 }
740 //------------------------------------------------------------------------------------------
742 {
746 
747  //NumTotrphi
748  if(switchNumTotrphi) {
749  totalMEs.meNumTotrphi = bookME1D(ibooker,"TH1NumTotrphi", "TH1NumTotrphi" ,"Num of RecHits rphi");
750  totalMEs.meNumTotrphi->setAxisTitle("Total number of RecHits");
751  }
752  //NumTotStereo
753  if(switchNumTotStereo) {
754  totalMEs.meNumTotStereo = bookME1D(ibooker,"TH1NumTotStereo", "TH1NumTotStereo","Num of RecHits stereo");
755  totalMEs.meNumTotStereo ->setAxisTitle("Total number of RecHits (stereo)");
756  }
757  //NumTotMatched
758  if(switchNumTotMatched) {
759  totalMEs.meNumTotMatched = bookME1D(ibooker,"TH1NumTotMatched","TH1NumTotMatched","Num of RecHits matched");
760  totalMEs.meNumTotMatched->setAxisTitle("Total number of matched RecHits");
761  }
762 
763 }
764 //------------------------------------------------------------------------------------------
766 {
767  SiStripHistoId hidmanager;
768  LayerMEs layerMEs;
769 
770  layerMEs.meWclusrphi = 0;
771  layerMEs.meAdcrphi = 0;
772  layerMEs.mePosxrphi = 0;
773  layerMEs.meResolxrphi = 0;
774  layerMEs.meResrphi = 0;
775  layerMEs.mePullLFrphi = 0;
776  layerMEs.mePullMFrphi = 0;
777  layerMEs.meChi2rphi = 0;
778  layerMEs.meNsimHitrphi = 0;
779 
780  //Wclusrphi
781  if(switchWclusrphi) {
782  layerMEs.meWclusrphi = bookME1D(ibooker,"TH1Wclusrphi", hidmanager.createHistoLayer("Wclus_rphi","layer",label,"").c_str() ,"Cluster Width - Number of strips that belong to the RecHit cluster");
783  layerMEs.meWclusrphi->setAxisTitle(("Cluster Width [nr strips] in "+ label).c_str());
784  }
785  //Adcrphi
786  if(switchAdcrphi) {
787  layerMEs.meAdcrphi = bookME1D(ibooker,"TH1Adcrphi", hidmanager.createHistoLayer("Adc_rphi","layer",label,"").c_str() ,"RecHit Cluster Charge");
788  layerMEs.meAdcrphi->setAxisTitle(("cluster charge [ADC] in " + label).c_str());
789  }
790  //Posxrphi
791  if(switchPosxrphi) {
792  layerMEs.mePosxrphi = bookME1D(ibooker,"TH1Posxrphi", hidmanager.createHistoLayer("Posx_rphi","layer",label,"").c_str() ,"RecHit x coord.");
793  layerMEs.mePosxrphi->setAxisTitle(("x RecHit coord. (local frame) in " + label).c_str());
794  }
795  //Resolxrphi
796  if(switchResolxrphi) {
797  layerMEs.meResolxrphi = bookME1D(ibooker,"TH1Resolxrphi", hidmanager.createHistoLayer("Resolx_rphi","layer",label,"").c_str() ,"RecHit resol(x) coord."); //<resolor>~20micron
798  layerMEs.meResolxrphi->setAxisTitle(("resol(x) RecHit coord. (local frame) in " + label).c_str());
799  }
800  //Resrphi
801  if(switchResrphi) {
802  layerMEs.meResrphi = bookME1D(ibooker,"TH1Resrphi", hidmanager.createHistoLayer("Res_rphi","layer",label,"").c_str() ,"Residuals of the hit x coordinate");
803  layerMEs.meResrphi->setAxisTitle(("RecHit Res(x) in " + label).c_str());
804  }
805  //PullLFrphi
806  if(switchPullLFrphi) {
807  layerMEs.mePullLFrphi = bookME1D(ibooker,"TH1PullLFrphi", hidmanager.createHistoLayer("Pull_LF_rphi","layer",label,"").c_str() ,"Pull distribution");
808  layerMEs.mePullLFrphi->setAxisTitle(("Pull distribution (local frame) in " + label).c_str());
809  }
810  //PullMFrphi
811  if(switchPullMFrphi) {
812  layerMEs.mePullMFrphi = bookME1D(ibooker,"TH1PullMFrphi", hidmanager.createHistoLayer("Pull_MF_rphi","layer",label,"").c_str() ,"Pull distribution");
813  layerMEs.mePullMFrphi->setAxisTitle(("Pull distribution (measurement frame) in " + label).c_str());
814  }
815  //Chi2rphi
816  if(switchChi2rphi) {
817  layerMEs.meChi2rphi = bookME1D(ibooker,"TH1Chi2rphi", hidmanager.createHistoLayer("Chi2_rphi","layer",label,"").c_str() ,"RecHit Chi2 test");
818  layerMEs.meChi2rphi->setAxisTitle(("RecHit Chi2 test in " + label).c_str());
819  }
820  //NsimHitrphi
821  if(switchNsimHitrphi) {
822  layerMEs.meNsimHitrphi = bookME1D(ibooker,"TH1NsimHitrphi", hidmanager.createHistoLayer("NsimHit_rphi","layer",label,"").c_str() ,"No. of assoc. simHits");
823  layerMEs.meNsimHitrphi->setAxisTitle(("Number of assoc. simHits in " + label).c_str());
824  }
825 
826  LayerMEsMap[label]=layerMEs;
827 
828 }
829 //------------------------------------------------------------------------------------------
831 {
832  SiStripHistoId hidmanager;
833  StereoAndMatchedMEs stereoandmatchedMEs;
834 
835  stereoandmatchedMEs.meWclusStereo = 0;
836  stereoandmatchedMEs.meAdcStereo = 0;
837  stereoandmatchedMEs.mePosxStereo = 0;
838  stereoandmatchedMEs.meResolxStereo = 0;
839  stereoandmatchedMEs.meResStereo = 0;
840  stereoandmatchedMEs.mePullLFStereo = 0;
841  stereoandmatchedMEs.mePullMFStereo = 0;
842  stereoandmatchedMEs.meChi2Stereo = 0;
843  stereoandmatchedMEs.meNsimHitStereo = 0;
844  stereoandmatchedMEs.mePosxMatched = 0;
845  stereoandmatchedMEs.mePosyMatched = 0;
846  stereoandmatchedMEs.meResolxMatched = 0;
847  stereoandmatchedMEs.meResolyMatched = 0;
848  stereoandmatchedMEs.meResxMatched = 0;
849  stereoandmatchedMEs.meResyMatched = 0;
850  stereoandmatchedMEs.meChi2Matched = 0;
851  stereoandmatchedMEs.meNsimHitMatched = 0;
852 
853  //WclusStereo
854  if(switchWclusStereo) {
855  stereoandmatchedMEs.meWclusStereo = bookME1D(ibooker,"TH1WclusStereo", hidmanager.createHistoLayer("Wclus_stereo","layer",label,"").c_str() ,"Cluster Width - Number of strips that belong to the RecHit cluster");
856  stereoandmatchedMEs.meWclusStereo->setAxisTitle(("Cluster Width [nr strips] in stereo modules in "+ label).c_str());
857  }
858  //AdcStereo
859  if(switchAdcStereo) {
860  stereoandmatchedMEs.meAdcStereo = bookME1D(ibooker,"TH1AdcStereo", hidmanager.createHistoLayer("Adc_stereo","layer",label,"").c_str() ,"RecHit Cluster Charge");
861  stereoandmatchedMEs.meAdcStereo->setAxisTitle(("cluster charge [ADC] in stereo modules in " + label).c_str());
862  }
863  //PosxStereo
864  if(switchPosxStereo) {
865  stereoandmatchedMEs.mePosxStereo = bookME1D(ibooker,"TH1PosxStereo", hidmanager.createHistoLayer("Posx_stereo","layer",label,"").c_str() ,"RecHit x coord.");
866  stereoandmatchedMEs.mePosxStereo->setAxisTitle(("x RecHit coord. (local frame) in stereo modules in " + label).c_str());
867  }
868  //ResolxStereo
869  if(switchResolxStereo) {
870  stereoandmatchedMEs.meResolxStereo = bookME1D(ibooker,"TH1ResolxStereo", hidmanager.createHistoLayer("Resolx_stereo","layer",label,"").c_str() ,"RecHit resol(x) coord.");
871  stereoandmatchedMEs.meResolxStereo->setAxisTitle(("resol(x) RecHit coord. (local frame) in stereo modules in " + label).c_str());
872  }
873  //ResStereo
874  if(switchResStereo) {
875  stereoandmatchedMEs.meResStereo = bookME1D(ibooker,"TH1ResStereo", hidmanager.createHistoLayer("Res_stereo","layer",label,"").c_str() ,"Residuals of the hit x coordinate");
876  stereoandmatchedMEs.meResStereo->setAxisTitle(("RecHit Res(x) in stereo modules in " + label).c_str());
877  }
878  //PullLFStereo
879  if(switchPullLFStereo) {
880  stereoandmatchedMEs.mePullLFStereo = bookME1D(ibooker,"TH1PullLFStereo", hidmanager.createHistoLayer("Pull_LF_stereo","layer",label,"").c_str() ,"Pull distribution");
881  stereoandmatchedMEs.mePullLFStereo->setAxisTitle(("Pull distribution (local frame) in stereo modules in " + label).c_str());
882  }
883  //PullMFStereo
884  if(switchPullMFStereo) {
885  stereoandmatchedMEs.mePullMFStereo = bookME1D(ibooker,"TH1PullMFStereo", hidmanager.createHistoLayer("Pull_MF_stereo","layer",label,"").c_str() ,"Pull distribution");
886  stereoandmatchedMEs.mePullMFStereo->setAxisTitle(("Pull distribution (measurement frame) in stereo modules in " + label).c_str());
887  }
888  //Chi2Stereo
889  if(switchChi2Stereo) {
890  stereoandmatchedMEs.meChi2Stereo = bookME1D(ibooker,"TH1Chi2Stereo", hidmanager.createHistoLayer("Chi2_stereo","layer",label,"").c_str() ,"RecHit Chi2 test");
891  stereoandmatchedMEs.meChi2Stereo->setAxisTitle(("RecHit Chi2 test in stereo modules in " + label).c_str());
892  }
893  //NsimHitStereo
894  if(switchNsimHitStereo) {
895  stereoandmatchedMEs.meNsimHitStereo = bookME1D(ibooker,"TH1NsimHitStereo", hidmanager.createHistoLayer("NsimHit_stereo","layer",label,"").c_str() ,"No. of assoc. simHits");
896  stereoandmatchedMEs.meNsimHitStereo->setAxisTitle(("Number of assoc. simHits in stereo modules in " + label).c_str());
897  }
898  //PosxMatched
899  if(switchPosxMatched) {
900  stereoandmatchedMEs.mePosxMatched = bookME1D(ibooker,"TH1PosxMatched", hidmanager.createHistoLayer("Posx_matched","layer",label,"").c_str() ,"RecHit x coord.");
901  stereoandmatchedMEs.mePosxMatched->setAxisTitle(("x coord. matched RecHit (local frame) in " + label).c_str());
902  }
903  //PosyMatched
904  if(switchPosyMatched) {
905  stereoandmatchedMEs.mePosyMatched = bookME1D(ibooker,"TH1PosyMatched", hidmanager.createHistoLayer("Posy_matched","layer",label,"").c_str() ,"RecHit y coord.");
906  stereoandmatchedMEs.mePosyMatched->setAxisTitle(("y coord. matched RecHit (local frame) in " + label).c_str());
907  }
908  //ResolxMatched
909  if(switchResolxMatched) {
910  stereoandmatchedMEs.meResolxMatched = bookME1D(ibooker,"TH1ResolxMatched", hidmanager.createHistoLayer("Resolx_matched","layer",label,"").c_str() ,"RecHit resol(x) coord.");
911  stereoandmatchedMEs.meResolxMatched->setAxisTitle(("resol(x) coord. matched RecHit (local frame) in " + label).c_str());
912  }
913  //ResolyMatched
914  if(switchResolyMatched) {
915  stereoandmatchedMEs.meResolyMatched = bookME1D(ibooker,"TH1ResolyMatched", hidmanager.createHistoLayer("Resoly_matched","layer",label,"").c_str() ,"RecHit resol(y) coord.");
916  stereoandmatchedMEs.meResolyMatched->setAxisTitle(("resol(y) coord. matched RecHit (local frame) in " + label).c_str());
917  }
918  //ResxMatched
919  if(switchResxMatched) {
920  stereoandmatchedMEs.meResxMatched = bookME1D(ibooker,"TH1ResxMatched", hidmanager.createHistoLayer("Resx_matched","layer",label,"").c_str() ,"Residuals of the hit x coord.");
921  stereoandmatchedMEs.meResxMatched->setAxisTitle(("Res(x) in matched RecHit in " + label).c_str());
922  }
923  //ResyMatched
924  if(switchResyMatched) {
925  stereoandmatchedMEs.meResyMatched = bookME1D(ibooker,"TH1ResyMatched", hidmanager.createHistoLayer("Resy_matched","layer",label,"").c_str() ,"Residuals of the hit y coord.");
926  stereoandmatchedMEs.meResyMatched->setAxisTitle(("Res(y) in matched RecHit in " + label).c_str());
927  }
928  //Chi2Matched
929  if(switchChi2Matched) {
930  stereoandmatchedMEs.meChi2Matched = bookME1D(ibooker,"TH1Chi2Matched", hidmanager.createHistoLayer("Chi2_matched","layer",label,"").c_str() ,"RecHit Chi2 test");
931  stereoandmatchedMEs.meChi2Matched->setAxisTitle(("Matched RecHit Chi2 test in " + label).c_str());
932  }
933  //NsimHitMatched
935  stereoandmatchedMEs.meNsimHitMatched = bookME1D(ibooker,"TH1NsimHitMatched", hidmanager.createHistoLayer("NsimHit_matched","layer",label,"").c_str() ,"No. of assoc. simHits");
936  stereoandmatchedMEs.meNsimHitMatched->setAxisTitle(("Number of assoc. simHits in " + label).c_str());
937  }
938 
939  StereoAndMatchedMEsMap[label]=stereoandmatchedMEs;
940 
941 }
942 //------------------------------------------------------------------------------------------
944 
945  SubDetMEs subdetMEs;
946  subdetMEs.meNumrphi = 0;
947  subdetMEs.meBunchrphi = 0;
948  subdetMEs.meEventrphi = 0;
949  subdetMEs.meNumStereo = 0;
950  subdetMEs.meBunchStereo = 0;
951  subdetMEs.meEventStereo = 0;
952  subdetMEs.meNumMatched = 0;
953  subdetMEs.meBunchMatched = 0;
954  subdetMEs.meEventMatched = 0;
955 
957  //Numrphi
958  if (switchNumrphi){
959  HistoName = "TH1Numrphi__" + label;
960  subdetMEs.meNumrphi = bookME1D(ibooker,"TH1Numrphi",HistoName.c_str(),"Num of RecHits");
961  subdetMEs.meNumrphi->setAxisTitle(("Total number of RecHits in "+ label).c_str());
962  }
963  //Bunchrphi
964  if(switchBunchrphi) {
965  HistoName = "TH1Bunchrphi__" + label;
966  subdetMEs.meBunchrphi = bookME1D(ibooker,"TH1Bunchrphi",HistoName.c_str(),"Bunch Crossing");
967  subdetMEs.meBunchrphi->setAxisTitle(("Bunch crossing in " + label).c_str());
968  }
969  //Eventrphi
970  if(switchEventrphi) {
971  HistoName = "TH1Eventrphi__" + label;
972  subdetMEs.meEventrphi = bookME1D(ibooker,"TH1Eventrphi",HistoName.c_str(),"Event (in-time bunch)");
973  subdetMEs.meEventrphi->setAxisTitle(("Event (in-time bunch) in " + label).c_str());
974  }
975  //NumStereo
976  if (switchNumStereo){
977  HistoName = "TH1NumStereo__" + label;
978  subdetMEs.meNumStereo = bookME1D(ibooker,"TH1NumStereo",HistoName.c_str(),"Num of RecHits in stereo modules");
979  subdetMEs.meNumStereo->setAxisTitle(("Total number of RecHits, stereo modules in "+ label).c_str());
980  }
981  //BunchStereo
982  if(switchBunchStereo) {
983  HistoName = "TH1BunchStereo__" + label;
984  subdetMEs.meBunchStereo = bookME1D(ibooker,"TH1BunchStereo",HistoName.c_str(),"Bunch Crossing");
985  subdetMEs.meBunchStereo->setAxisTitle(("Bunch crossing, stereo modules in " + label).c_str());
986  }
987  //EventStereo
988  if(switchEventStereo) {
989  HistoName = "TH1EventStereo__" + label;
990  subdetMEs.meEventStereo = bookME1D(ibooker,"TH1EventStereo",HistoName.c_str(),"Event (in-time bunch)");
991  subdetMEs.meEventStereo->setAxisTitle(("Event (in-time bunch), stereo modules in " + label).c_str());
992  }
993  //NumMatched
994  if (switchNumMatched){
995  HistoName = "TH1NumMatched__" + label;
996  subdetMEs.meNumMatched = bookME1D(ibooker,"TH1NumMatched",HistoName.c_str(),"Num of matched RecHits" );
997  subdetMEs.meNumMatched->setAxisTitle(("Total number of matched RecHits in "+ label).c_str());
998  }
999  //BunchMatched
1000  if(switchBunchMatched) {
1001  HistoName = "TH1BunchMatched__" + label;
1002  subdetMEs.meBunchMatched = bookME1D(ibooker,"TH1BunchMatched",HistoName.c_str(),"Bunch Crossing");
1003  subdetMEs.meBunchMatched->setAxisTitle(("Bunch crossing, matched RecHits in " + label).c_str());
1004  }
1005  //EventMatched
1006  if(switchEventMatched) {
1007  HistoName = "TH1EventMatched__" + label;
1008  subdetMEs.meEventMatched = bookME1D(ibooker,"TH1EventMatched",HistoName.c_str(),"Event (in-time bunch)");
1009  subdetMEs.meEventMatched->setAxisTitle(("Event (in-time bunch), matched RecHits in " + label).c_str());
1010  }
1011 
1012  SubDetMEsMap[label]=subdetMEs;
1013 }
1014 //------------------------------------------------------------------------------------------
1015 MonitorElement* SiStripRecHitsValid::bookME1D(DQMStore::IBooker & ibooker, const char* ParameterSetLabel, const char* HistoName, const char* HistoTitle)
1016 {
1017  Parameters = conf_.getParameter<edm::ParameterSet>(ParameterSetLabel);
1018  return ibooker.book1D(HistoName,HistoTitle,
1019  Parameters.getParameter<int32_t>("Nbinx"),
1020  Parameters.getParameter<double>("xmin"),
1021  Parameters.getParameter<double>("xmax")
1022  );
1023 }
1024 
1025 //define this as a plug-in
1027 
RunNumber_t run() const
Definition: EventID.h:39
RecHitProperties rechitpro
GlobalPoint toGlobal(const Point2DBase< Scalar, LocalTag > lp) const
Definition: Surface.h:114
T getParameter(std::string const &) const
EventNumber_t event() const
Definition: EventID.h:41
std::vector< std::string > SubDetList_
virtual const TrackerGeomDet * idToDetUnit(DetId) const
Return the pointer to the GeomDetUnit corresponding to a given DetId.
float xx() const
Definition: LocalError.h:24
boost::transform_iterator< IterHelp, const_IdIter > const_iterator
void rechitanalysis_matched(SiStripMatchedRecHit2D const rechit, const GluedGeomDet *gluedDet, TrackerHitAssociator &associate)
edm::ParameterSet Parameters
void createStereoAndMatchedMEs(DQMStore::IBooker &ibooker, std::string label)
int event() const
get the contents of the subdetector field (should be protected?)
void setSiStripFolderName(std::string name)
virtual float stripAngle(float strip) const =0
uint32_t stereo() const
Definition: SiStripDetId.h:162
std::map< std::string, std::vector< uint32_t > > LayerDetMap
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:446
void createSubDetMEs(DQMStore::IBooker &ibooker, std::string label)
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
std::vector< PSimHit > matched
std::map< std::string, SubDetMEs > SubDetMEsMap
void rechitanalysis(SiStripRecHit2D const rechit, const StripTopology &topol, TrackerHitAssociator &associate)
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
std::map< std::string, StereoAndMatchedMEs > StereoAndMatchedMEsMap
T y() const
Definition: PV3DBase.h:63
#define X(str)
Definition: MuonsGrabber.cc:48
std::pair< std::string, int32_t > GetSubDetAndLayer(const uint32_t &detid, const TrackerTopology *tTopo, bool ring_flag=0)
std::vector< RecHitProperties > rechitstereo
virtual const StripTopology & specificTopology() const
Returns a reference to the strip proxy topology.
const Plane & surface() const
The nominal surface of the GeomDet.
Definition: GeomDet.h:40
virtual float strip(const LocalPoint &) const =0
edm::EDGetTokenT< SiStripRecHit2DCollection > stereoRecHitsToken_
virtual void analyze(const edm::Event &e, const edm::EventSetup &c)
virtual LocalError localPositionError() const
float xy() const
Definition: LocalError.h:25
std::vector< RecHitProperties > rechitmatched
virtual MeasurementError measurementError(const LocalPoint &, const LocalError &) const =0
void getTOBDetectors(const std::vector< uint32_t > &inputDetRawIds, std::vector< uint32_t > &tobDetRawIds, uint32_t layer=0, uint32_t bkw_frw=0, uint32_t rod=0) const
float yy() const
Definition: LocalError.h:26
Local3DPoint localPosition() const
Definition: PSimHit.h:44
T sqrt(T t)
Definition: SSEVec.h:48
int bunchCrossing() const
get the detector field from this detid
T z() const
Definition: PV3DBase.h:64
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
float uu() const
MonitorElement * book1D(Args &&...args)
Definition: DQMStore.h:115
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
virtual const Topology & topology() const override
Returns a reference to the strip proxy topology.
ClusterRef cluster() const
virtual MeasurementPoint measurementPosition(const LocalPoint &) const =0
void createMEs(DQMStore::IBooker &ibooker, const edm::EventSetup &es)
EncodedEventId eventId() const
Definition: PSimHit.h:105
edm::EDGetTokenT< SiStripRecHit2DCollection > rphiRecHitsToken_
std::string getSubdetid(uint32_t id, const TrackerTopology *tTopo, bool flag_ring)
std::pair< typename T::DetSet::const_iterator, typename T::DetSet::const_iterator > getRange(const T &detset, const DetId &id)
MonitorElement * bookME1D(DQMStore::IBooker &ibooker, const char *ParameterSetLabel, const char *HistoName, const char *HistoTitle)
LocalVector localDirection() const
Obsolete. Same as momentumAtEntry().unit(), for backward compatibility.
Definition: PSimHit.h:52
SiStripRecHitsValid(const edm::ParameterSet &conf)
Detector identifier class for the strip tracker.
Definition: SiStripDetId.h:17
Definition: DetId.h:18
std::map< std::string, LayerMEs > LayerMEsMap
edm::ESHandle< SiStripDetCabling > SiStripDetCabling_
CLHEP::HepVector AlgebraicVector
void setLayerFolder(uint32_t rawdetid, const TrackerTopology *tTopo, int32_t layer=0, bool ring_flag=0)
void setCurrentFolder(const std::string &fullpath)
Definition: DQMStore.cc:274
std::map< std::string, std::vector< uint32_t > > StereoAndMatchedDetMap
const T & get() const
Definition: EventSetup.h:55
T const * product() const
Definition: ESHandle.h:86
std::pair< LocalPoint, LocalVector > projectHit(const PSimHit &hit, const StripGeomDetUnit *stripDet, const BoundPlane &plane)
std::pair< std::string, std::string > getSubDetFolderAndTag(const uint32_t &detid, const TrackerTopology *tTopo)
std::string HistoName
void getTECDetectors(const std::vector< uint32_t > &inputDetRawIds, std::vector< uint32_t > &tecDetRawIds, uint32_t side=0, uint32_t wheel=0, uint32_t petal_bkw_frw=0, uint32_t petal=0, uint32_t ring=0, uint32_t ster=0) const
void createTotalMEs(DQMStore::IBooker &ibooker)
edm::ParameterSet conf_
edm::EventID id() const
Definition: EventBase.h:56
edm::EDGetTokenT< SiStripMatchedRecHit2DCollection > matchedRecHitsToken_
static int position[264][3]
Definition: ReadPGInfo.cc:509
void beginJob(const edm::EventSetup &es)
void getTIBDetectors(const std::vector< uint32_t > &inputDetRawIds, std::vector< uint32_t > &tibDetRawIds, uint32_t layer=0, uint32_t bkw_frw=0, uint32_t int_ext=0, uint32_t string=0) const
CLHEP::HepSymMatrix AlgebraicSymMatrix
void createLayerMEs(DQMStore::IBooker &ibooker, std::string label)
void fillME(MonitorElement *ME, float value1)
std::vector< PSimHit > associateHit(const TrackingRecHit &thit) const
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
Definition: Utils.h:6
void getTIDDetectors(const std::vector< uint32_t > &inputDetRawIds, std::vector< uint32_t > &tidDetRawIds, uint32_t side=0, uint32_t wheel=0, uint32_t ring=0, uint32_t ster=0) const
DetId geographicalId() const
dbl *** dir
Definition: mlp_gen.cc:35
unsigned long long m_cacheID_
Definition: DDAxes.h:10
std::string createHistoLayer(std::string description, std::string id_type, std::string path, std::string flag)
T x() const
Definition: PV2DBase.h:45
long double T
T x() const
Definition: PV3DBase.h:62
virtual LocalPoint localPosition() const
void setAxisTitle(const std::string &title, int axis=1)
set x-, y- or z-axis title (axis=1, 2, 3 respectively)
DetId operator()(const X &x)
const GeomDetUnit * stereoDet() const
Definition: GluedGeomDet.h:21
Definition: Run.h:41
virtual const TrackerGeomDet * idToDet(DetId) const
void bookHistograms(DQMStore::IBooker &ibooker, const edm::Run &run, const edm::EventSetup &es)
std::vector< RecHitProperties > rechitrphi