CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
TrackerOfflineValidation.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: TrackerOfflineValidation
4 // Class: TrackerOfflineValidation
5 //
13 //
14 // Original Author: Erik Butz
15 // Created: Tue Dec 11 14:03:05 CET 2007
16 // $Id: TrackerOfflineValidation.cc,v 1.55 2012/09/28 20:48:06 flucke Exp $
17 //
18 //
19 
20 // system include files
21 #include <memory>
22 #include <map>
23 #include <sstream>
24 #include <math.h>
25 #include <utility>
26 #include <vector>
27 #include <iostream>
28 
29 // ROOT includes
30 #include "TH1.h"
31 #include "TH2.h"
32 #include "TProfile.h"
33 #include "TFile.h"
34 #include "TTree.h"
35 #include "TF1.h"
36 #include "TMath.h"
37 
38 // user include files
47 
53 
56 
60 
63 
69 
72 
73 //
74 // class declaration
75 //
77 public:
80 
82  YResidual, /*NormYResidual, */
86 
87 private:
88 
89  struct ModuleHistos{
90  ModuleHistos() : ResHisto(), NormResHisto(), ResYHisto(), /*NormResYHisto(),*/
95  LocalX(), LocalY() {}
96  TH1* ResHisto;
98  TH1* ResYHisto;
99  /* TH1* NormResYHisto; */
104 
105  TProfile* ResXvsXProfile;
106  TProfile* ResXvsYProfile;
107  TProfile* ResYvsXProfile;
108  TProfile* ResYvsYProfile;
109 
110  TH1* LocalX;
111  TH1* LocalY;
112  };
113 
114  // container struct to organize collection of histogramms during endJob
120 
129  };
130 
131 
133  DirectoryWrapper(const DirectoryWrapper& upDir,const std::string& newDir,
134  const std::string& basedir,bool useDqmMode)
135  : tfd(0),
136  dqmMode(useDqmMode),
137  theDbe(0) {
138  if (newDir.length()!=0){
139  if(upDir.directoryString.length()!=0)directoryString=upDir.directoryString+"/"+newDir;
140  else directoryString = newDir;
141  }
142  else
144 
145  if (!dqmMode){
146  if (newDir.length()==0) tfd.reset(&(*upDir.tfd));
147  else
148  tfd.reset(new TFileDirectory(upDir.tfd->mkdir(newDir)));
149  }
150  else {
152  }
153  }
154 
155  DirectoryWrapper(const std::string& newDir,const std::string& basedir,bool useDqmMode)
156  : tfd(0),
157  dqmMode(useDqmMode),
158  theDbe(0) {
159  if (!dqmMode){
161  if (newDir.length()==0){
162  tfd.reset(new TFileDirectory(fs->tFileDirectory()));
163  }
164  else {
165  tfd.reset(new TFileDirectory(fs->mkdir(newDir)));
166  directoryString=newDir;
167  }
168  }
169  else {
170  if (newDir.length()!=0){
171  if(basedir.length()!=0)directoryString=basedir+"/"+newDir;
172  else directoryString = newDir;
173  }
174  else directoryString=basedir;
176  }
177  }
178  // Generalization of Histogram Booking; allows switch between TFileService and DQMStore
179  template <typename T> TH1* make(const char* name,const char* title,int nBinX,double minBinX,double maxBinX);
180  template <typename T> TH1* make(const char* name,const char* title,int nBinX,double *xBins);//variable bin size in x for profile histo
181  template <typename T> TH1* make(const char* name,const char* title,int nBinX,double minBinX,double maxBinX,int nBinY,double minBinY,double maxBinY);
182  template <typename T> TH1* make(const char* name,const char* title,int nBinX,double minBinX,double maxBinX,double minBinY,double maxBinY); // at present not used
183 
184  std::auto_ptr<TFileDirectory> tfd;
186  const bool dqmMode;
188  };
189 
190 
191  //
192  // ------------- private member function -------------
193  //
194  virtual void analyze(const edm::Event&, const edm::EventSetup&) override;
195  virtual void endJob() override;
196 
197  virtual void checkBookHists(const edm::EventSetup& setup);
198 
200  void bookDirHists(DirectoryWrapper& tfd, const Alignable& ali, const TrackerTopology* tTopo);
201  void bookHists(DirectoryWrapper& tfd, const Alignable& ali, const TrackerTopology* tTopo, align::StructureType type, int i);
202 
203  void collateSummaryHists( DirectoryWrapper& tfd, const Alignable& ali, int i,
204  std::vector<TrackerOfflineValidation::SummaryContainer>& vLevelProfiles);
205 
206  void fillTree(TTree& tree, const std::map<int, TrackerOfflineValidation::ModuleHistos>& moduleHist_,
207  TkOffTreeVariables& treeMem, const TrackerGeometry& tkgeom, const TrackerTopology* tTopo);
208 
210  const Alignable& ali,
211  align::StructureType type, int i);
212 
214 
215  bool isBarrel(uint32_t subDetId);
216  bool isEndCap(uint32_t subDetId);
217  bool isPixel(uint32_t subDetId);
219 
220  TH1* bookTH1F(bool isTransient, DirectoryWrapper& tfd, const char* histName, const char* histTitle,
221  int nBinsX, double lowX, double highX);
222 
223  TProfile* bookTProfile(bool isTransient, DirectoryWrapper& tfd, const char* histName, const char* histTitle,
224  int nBinsX, double lowX, double highX);
225 
226  TProfile* bookTProfile(bool isTransient, DirectoryWrapper& tfd, const char* histName, const char* histTitle,
227  int nBinsX, double lowX, double highX, double lowY, double highY);
228 
229  void getBinning(uint32_t subDetId, TrackerOfflineValidation::HistogrammType residualtype,
230  int& nBinsX, double& lowerBoundX, double& upperBoundX);
231 
232  void summarizeBinInContainer(int bin, SummaryContainer& targetContainer,
233  SummaryContainer& sourceContainer);
234 
235  void summarizeBinInContainer(int bin, uint32_t subDetId, SummaryContainer& targetContainer,
236  ModuleHistos& sourceContainer);
237 
238  void setSummaryBin(int bin, TH1* targetHist, TH1* sourceHist);
239 
240  float Fwhm(const TH1* hist) const;
241  std::pair<float,float> fitResiduals(TH1* hist) const; //, float meantmp, float rmstmp);
242  float getMedian( const TH1* hist) const;
243 
244  // From MillePedeAlignmentMonitor: Get Index for Arbitary vector<class> by name
245  template <class OBJECT_TYPE> int GetIndex(const std::vector<OBJECT_TYPE*>& vec, const TString& name);
246 
247 
248  // ---------- member data ---------------------------
249 
252  const TrackerGeometry *bareTkGeomPtr_; // ugly hack to book hists only once, but check
253 
254  // parameters from cfg to steer
255  const bool lCoorHistOn_;
258  const bool stripYResiduals_;
259  const bool useFwhm_;
260  const bool useFit_;
261  const bool useOverflowForRMS_;
262  const bool dqmMode_;
264 
265  // a vector to keep track which pointers should be deleted at the very end
266  std::vector<TH1*> vDeleteObjects_;
267 
268  std::vector<TH1*> vTrackHistos_;
269  std::vector<TH1*> vTrackProfiles_;
270  std::vector<TH1*> vTrack2DHistos_;
271 
272  std::map<int,TrackerOfflineValidation::ModuleHistos> mPxbResiduals_;
273  std::map<int,TrackerOfflineValidation::ModuleHistos> mPxeResiduals_;
274  std::map<int,TrackerOfflineValidation::ModuleHistos> mTibResiduals_;
275  std::map<int,TrackerOfflineValidation::ModuleHistos> mTidResiduals_;
276  std::map<int,TrackerOfflineValidation::ModuleHistos> mTobResiduals_;
277  std::map<int,TrackerOfflineValidation::ModuleHistos> mTecResiduals_;
278 
280 };
281 
282 
283 //
284 // constants, enums and typedefs
285 //
286 
287 //
288 // static data member definitions
289 //
290 
291 template <class OBJECT_TYPE>
292 int TrackerOfflineValidation::GetIndex(const std::vector<OBJECT_TYPE*> &vec, const TString &name)
293 {
294  int result = 0;
295  for (typename std::vector<OBJECT_TYPE*>::const_iterator iter = vec.begin(), iterEnd = vec.end();
296  iter != iterEnd; ++iter, ++result) {
297  if (*iter && (*iter)->GetName() == name) return result;
298  }
299  edm::LogError("Alignment") << "@SUB=TrackerOfflineValidation::GetIndex" << " could not find " << name;
300  return -1;
301 }
302 
303 
304 template <> TH1* TrackerOfflineValidation::DirectoryWrapper::make<TH1F>(const char* name,const char* title,int nBinX,double minBinX,double maxBinX){
305  if(dqmMode){theDbe->setCurrentFolder(directoryString); return theDbe->book1D(name,title,nBinX,minBinX,maxBinX)->getTH1();}
306  else{return tfd->make<TH1F>(name,title,nBinX,minBinX,maxBinX);}
307 }
308 
309 template <> TH1* TrackerOfflineValidation::DirectoryWrapper::make<TProfile>(const char* name,const char* title,int nBinX,double *xBins){
310  if(dqmMode){
311  theDbe->setCurrentFolder(directoryString);
312  //DQM profile requires y-bins for construction... using TProfile creator by hand...
313  TProfile *tmpProfile=new TProfile(name,title,nBinX,xBins);
314  tmpProfile->SetDirectory(0);
315  return theDbe->bookProfile(name,tmpProfile)->getTH1();
316  }
317  else{return tfd->make<TProfile>(name,title,nBinX,xBins);}
318 }
319 
320 template <> TH1* TrackerOfflineValidation::DirectoryWrapper::make<TProfile>(const char* name,const char* title,int nBinX,double minBinX,double maxBinX){
321  if(dqmMode){
322  theDbe->setCurrentFolder(directoryString);
323  //DQM profile requires y-bins for construction... using TProfile creator by hand...
324  TProfile *tmpProfile=new TProfile(name,title,nBinX,minBinX,maxBinX);
325  tmpProfile->SetDirectory(0);
326  return theDbe->bookProfile(name,tmpProfile)->getTH1();
327  }
328  else{return tfd->make<TProfile>(name,title,nBinX,minBinX,maxBinX);}
329 }
330 
331 template <> TH1* TrackerOfflineValidation::DirectoryWrapper::make<TProfile>(const char* name ,const char* title,int nbinX,double minX ,double maxX,double minY,double maxY){
332  if(dqmMode){
333  theDbe->setCurrentFolder(directoryString);
334  int dummy(0); // DQMProfile wants Y channels... does not use them!
335  return (theDbe->bookProfile(name,title,nbinX,minX,maxX,dummy,minY,maxY)->getTH1());
336  }
337  else{
338  return tfd->make<TProfile>(name,title,nbinX,minX,maxX,minY,maxY);
339  }
340 }
341 
342 template <> TH1* TrackerOfflineValidation::DirectoryWrapper::make<TH2F>(const char* name,const char* title,int nBinX,double minBinX,double maxBinX,int nBinY,double minBinY,double maxBinY){
343  if(dqmMode){theDbe->setCurrentFolder(directoryString); return theDbe->book2D(name,title,nBinX,minBinX,maxBinX,nBinY,minBinY,maxBinY)->getTH1();}
344  else{return tfd->make<TH2F>(name,title,nBinX,minBinX,maxBinX,nBinY,minBinY,maxBinY);}
345 }
346 
347 
348 //
349 // constructors and destructor
350 //
352  : parSet_(iConfig), bareTkGeomPtr_(0), lCoorHistOn_(parSet_.getParameter<bool>("localCoorHistosOn")),
353  moduleLevelHistsTransient_(parSet_.getParameter<bool>("moduleLevelHistsTransient")),
354  moduleLevelProfiles_(parSet_.getParameter<bool>("moduleLevelProfiles")),
355  stripYResiduals_(parSet_.getParameter<bool>("stripYResiduals")),
356  useFwhm_(parSet_.getParameter<bool>("useFwhm")),
357  useFit_(parSet_.getParameter<bool>("useFit")),
358  useOverflowForRMS_(parSet_.getParameter<bool>("useOverflowForRMS")),
359  dqmMode_(parSet_.getParameter<bool>("useInDqmMode")),
360  moduleDirectory_(parSet_.getParameter<std::string>("moduleDirectoryInOutput")),
361  lastSetup_(nullptr)
362 {
363 }
364 
365 
367 {
368  // do anything here that needs to be done at desctruction time
369  // (e.g. close files, deallocate resources etc.)
370  for( std::vector<TH1*>::const_iterator it = vDeleteObjects_.begin(), itEnd = vDeleteObjects_.end();
371  it != itEnd;
372  ++it) delete *it;
373 }
374 
375 
376 //
377 // member functions
378 //
379 
380 
381 // ------------ method called once each job just before starting event loop ------------
382 void
384 {
386  const TrackerGeometry *newBareTkGeomPtr = &(*tkGeom_);
387  if (newBareTkGeomPtr == bareTkGeomPtr_) return; // already booked hists, nothing changed
388 
389  if (!bareTkGeomPtr_) { // pointer not yet set: called the first time => book hists
390 
391  //Retrieve tracker topology from geometry
392  edm::ESHandle<TrackerTopology> tTopoHandle;
393  es.get<IdealGeometryRecord>().get(tTopoHandle);
394  const TrackerTopology* const tTopo = tTopoHandle.product();
395 
396  // construct alignable tracker to get access to alignable hierarchy
397  AlignableTracker aliTracker(&(*tkGeom_), tTopo);
398 
399  edm::LogInfo("TrackerOfflineValidation") << "There are " << newBareTkGeomPtr->detIds().size()
400  << " dets in the Geometry record.\n"
401  << "Out of these "<<newBareTkGeomPtr->detUnitIds().size()
402  <<" are detUnits";
403 
404  // Book Histogramms for global track quantities
405  std::string globDir("GlobalTrackVariables");
406  DirectoryWrapper trackglobal(globDir,moduleDirectory_,dqmMode_);
407  this->bookGlobalHists(trackglobal);
408 
409  // recursively book histogramms on lowest level
411  this->bookDirHists(tfdw, aliTracker, tTopo);
412  }
413  else { // histograms booked, but changed TrackerGeometry?
414  edm::LogWarning("GeometryChange") << "@SUB=checkBookHists"
415  << "TrackerGeometry changed, but will not re-book hists!";
416  }
417  bareTkGeomPtr_ = newBareTkGeomPtr;
418 }
419 
420 
421 void
423 {
424 
425  vTrackHistos_.push_back(tfd.make<TH1F>("h_tracketa",
426  "Track #eta;#eta_{Track};Number of Tracks",
427  90,-3.,3.));
428  vTrackHistos_.push_back(tfd.make<TH1F>("h_trackphi",
429  "Track #phi;#phi_{Track};Number of Tracks",
430  90,-3.15,3.15));
431  vTrackHistos_.push_back(tfd.make<TH1F>("h_trackNumberOfValidHits",
432  "Track # of valid hits;# of valid hits _{Track};Number of Tracks",
433  40,0.,40.));
434  vTrackHistos_.push_back(tfd.make<TH1F>("h_trackNumberOfLostHits",
435  "Track # of lost hits;# of lost hits _{Track};Number of Tracks",
436  10,0.,10.));
437  vTrackHistos_.push_back(tfd.make<TH1F>("h_curvature",
438  "Curvature #kappa;#kappa_{Track};Number of Tracks",
439  100,-.05,.05));
440  vTrackHistos_.push_back(tfd.make<TH1F>("h_curvature_pos",
441  "Curvature |#kappa| Positive Tracks;|#kappa_{pos Track}|;Number of Tracks",
442  100,.0,.05));
443  vTrackHistos_.push_back(tfd.make<TH1F>("h_curvature_neg",
444  "Curvature |#kappa| Negative Tracks;|#kappa_{neg Track}|;Number of Tracks",
445  100,.0,.05));
446  vTrackHistos_.push_back(tfd.make<TH1F>("h_diff_curvature",
447  "Curvature |#kappa| Tracks Difference;|#kappa_{Track}|;# Pos Tracks - # Neg Tracks",
448  100,.0,.05));
449  vTrackHistos_.push_back(tfd.make<TH1F>("h_chi2",
450  "#chi^{2};#chi^{2}_{Track};Number of Tracks",
451  500,-0.01,500.));
452  vTrackHistos_.push_back(tfd.make<TH1F>("h_chi2Prob",
453  "#chi^{2} probability;#chi^{2}prob_{Track};Number of Tracks",
454  100,0.0,1.));
455  vTrackHistos_.push_back(tfd.make<TH1F>("h_normchi2",
456  "#chi^{2}/ndof;#chi^{2}/ndof;Number of Tracks",
457  100,-0.01,10.));
458  vTrackHistos_.push_back(tfd.make<TH1F>("h_pt",
459  "p_{T}^{track};p_{T}^{track} [GeV];Number of Tracks",
460  250,0.,250));
461  vTrackHistos_.push_back(tfd.make<TH1F>("h_ptResolution",
462  "#delta_{p_{T}}/p_{T}^{track};#delta_{p_{T}}/p_{T}^{track};Number of Tracks",
463  100,0.,0.5));
464  vTrackProfiles_.push_back(tfd.make<TProfile>("p_d0_vs_phi",
465  "Transverse Impact Parameter vs. #phi;#phi_{Track};#LT d_{0} #GT [cm]",
466  100,-3.15,3.15));
467  vTrackProfiles_.push_back(tfd.make<TProfile>("p_dz_vs_phi",
468  "Longitudinal Impact Parameter vs. #phi;#phi_{Track};#LT d_{z} #GT [cm]",
469  100,-3.15,3.15));
470  vTrackProfiles_.push_back(tfd.make<TProfile>("p_d0_vs_eta",
471  "Transverse Impact Parameter vs. #eta;#eta_{Track};#LT d_{0} #GT [cm]",
472  100,-3.15,3.15));
473  vTrackProfiles_.push_back(tfd.make<TProfile>("p_dz_vs_eta",
474  "Longitudinal Impact Parameter vs. #eta;#eta_{Track};#LT d_{z} #GT [cm]",
475  100,-3.15,3.15));
476  vTrackProfiles_.push_back(tfd.make<TProfile>("p_chi2_vs_phi",
477  "#chi^{2} vs. #phi;#phi_{Track};#LT #chi^{2} #GT",
478  100,-3.15,3.15));
479  vTrackProfiles_.push_back(tfd.make<TProfile>("p_chi2Prob_vs_phi",
480  "#chi^{2} probablility vs. #phi;#phi_{Track};#LT #chi^{2} probability#GT",
481  100,-3.15,3.15));
482  vTrackProfiles_.push_back(tfd.make<TProfile>("p_chi2Prob_vs_d0",
483  "#chi^{2} probablility vs. |d_{0}|;|d_{0}|[cm];#LT #chi^{2} probability#GT",
484  100,0,80));
485  vTrackProfiles_.push_back(tfd.make<TProfile>("p_normchi2_vs_phi",
486  "#chi^{2}/ndof vs. #phi;#phi_{Track};#LT #chi^{2}/ndof #GT",
487  100,-3.15,3.15));
488  vTrackProfiles_.push_back(tfd.make<TProfile>("p_chi2_vs_eta",
489  "#chi^{2} vs. #eta;#eta_{Track};#LT #chi^{2} #GT",
490  100,-3.15,3.15));
491  //variable binning for chi2/ndof vs. pT
492  double xBins[19]={0.,0.15,0.5,1.,1.5,2.,2.5,3.,3.5,4.,4.5,5.,7.,10.,15.,25.,40.,100.,200.};
493  vTrackProfiles_.push_back(tfd.make<TProfile>("p_normchi2_vs_pt",
494  "norm #chi^{2} vs. p_{T}_{Track}; p_{T}_{Track};#LT #chi^{2}/ndof #GT",
495  18,xBins));
496 
497  vTrackProfiles_.push_back(tfd.make<TProfile>("p_normchi2_vs_p",
498  "#chi^{2}/ndof vs. p_{Track};p_{Track};#LT #chi^{2}/ndof #GT",
499  18,xBins));
500  vTrackProfiles_.push_back(tfd.make<TProfile>("p_chi2Prob_vs_eta",
501  "#chi^{2} probability vs. #eta;#eta_{Track};#LT #chi^{2} probability #GT",
502  100,-3.15,3.15));
503  vTrackProfiles_.push_back(tfd.make<TProfile>("p_normchi2_vs_eta",
504  "#chi^{2}/ndof vs. #eta;#eta_{Track};#LT #chi^{2}/ndof #GT",
505  100,-3.15,3.15));
506  vTrackProfiles_.push_back(tfd.make<TProfile>("p_kappa_vs_phi",
507  "#kappa vs. #phi;#phi_{Track};#kappa",
508  100,-3.15,3.15));
509  vTrackProfiles_.push_back(tfd.make<TProfile>("p_kappa_vs_eta",
510  "#kappa vs. #eta;#eta_{Track};#kappa",
511  100,-3.15,3.15));
512  vTrackProfiles_.push_back(tfd.make<TProfile>("p_ptResolution_vs_phi",
513  "#delta_{p_{T}}/p_{T}^{track};#phi^{track};#delta_{p_{T}}/p_{T}^{track}",
514  100, -3.15,3.15));
515  vTrackProfiles_.push_back(tfd.make<TProfile>("p_ptResolution_vs_eta",
516  "#delta_{p_{T}}/p_{T}^{track};#eta^{track};#delta_{p_{T}}/p_{T}^{track}",
517  100, -3.15,3.15));
518 
519  vTrack2DHistos_.push_back(tfd.make<TH2F>("h2_d0_vs_phi",
520  "Transverse Impact Parameter vs. #phi;#phi_{Track};d_{0} [cm]",
521  100, -3.15, 3.15, 100,-1.,1.) );
522  vTrack2DHistos_.push_back(tfd.make<TH2F>("h2_dz_vs_phi",
523  "Longitudinal Impact Parameter vs. #phi;#phi_{Track};d_{z} [cm]",
524  100, -3.15, 3.15, 100,-100.,100.));
525  vTrack2DHistos_.push_back(tfd.make<TH2F>("h2_d0_vs_eta",
526  "Transverse Impact Parameter vs. #eta;#eta_{Track};d_{0} [cm]",
527  100, -3.15, 3.15, 100,-1.,1.));
528  vTrack2DHistos_.push_back(tfd.make<TH2F>("h2_dz_vs_eta",
529  "Longitudinal Impact Parameter vs. #eta;#eta_{Track};d_{z} [cm]",
530  100, -3.15, 3.15, 100,-100.,100.));
531  vTrack2DHistos_.push_back(tfd.make<TH2F>("h2_chi2_vs_phi",
532  "#chi^{2} vs. #phi;#phi_{Track};#chi^{2}",
533  100, -3.15, 3.15, 500, 0., 500.));
534  vTrack2DHistos_.push_back(tfd.make<TH2F>("h2_chi2Prob_vs_phi",
535  "#chi^{2} probability vs. #phi;#phi_{Track};#chi^{2} probability",
536  100, -3.15, 3.15, 100, 0., 1.));
537  vTrack2DHistos_.push_back(tfd.make<TH2F>("h2_chi2Prob_vs_d0",
538  "#chi^{2} probability vs. |d_{0}|;|d_{0}| [cm];#chi^{2} probability",
539  100, 0, 80, 100, 0., 1.));
540  vTrack2DHistos_.push_back(tfd.make<TH2F>("h2_normchi2_vs_phi",
541  "#chi^{2}/ndof vs. #phi;#phi_{Track};#chi^{2}/ndof",
542  100, -3.15, 3.15, 100, 0., 10.));
543  vTrack2DHistos_.push_back(tfd.make<TH2F>("h2_chi2_vs_eta",
544  "#chi^{2} vs. #eta;#eta_{Track};#chi^{2}",
545  100, -3.15, 3.15, 500, 0., 500.));
546  vTrack2DHistos_.push_back(tfd.make<TH2F>("h2_chi2Prob_vs_eta",
547  "#chi^{2} probaility vs. #eta;#eta_{Track};#chi^{2} probability",
548  100, -3.15, 3.15, 100, 0., 1.));
549  vTrack2DHistos_.push_back(tfd.make<TH2F>("h2_normchi2_vs_eta",
550  "#chi^{2}/ndof vs. #eta;#eta_{Track};#chi^{2}/ndof",
551  100,-3.15,3.15, 100, 0., 10.));
552  vTrack2DHistos_.push_back(tfd.make<TH2F>("h2_kappa_vs_phi",
553  "#kappa vs. #phi;#phi_{Track};#kappa",
554  100,-3.15,3.15, 100, .0,.05));
555  vTrack2DHistos_.push_back(tfd.make<TH2F>("h2_kappa_vs_eta",
556  "#kappa vs. #eta;#eta_{Track};#kappa",
557  100,-3.15,3.15, 100, .0,.05));
558  vTrack2DHistos_.push_back(tfd.make<TH2F>("h2_normchi2_vs_kappa",
559  "#kappa vs. #chi^{2}/ndof;#chi^{2}/ndof;#kappa",
560  100,0.,10, 100,-.03,.03));
561 
562  /****************** Definition of 2-D Histos of ResX vs momenta ****************************/
563  vTrack2DHistos_.push_back(tfd.make<TH2F>("p_vs_resXprime_pixB",
564  "res_{x'} vs momentum in BPix;p [GeV]; res_{x'}",
565  15,0.,15., 200, -0.1,0.1));
566  vTrack2DHistos_.push_back(tfd.make<TH2F>("p_vs_resXprime_pixE",
567  "res_{x'} vs momentum in FPix;p [GeV]; res_{x'}",
568  15,0.,15., 200, -0.1,0.1));
569  vTrack2DHistos_.push_back(tfd.make<TH2F>("p_vs_resXprime_TIB",
570  "res_{x'} vs momentum in TIB;p [GeV]; res_{x'}",
571  15,0.,15., 200, -0.1,0.1));
572  vTrack2DHistos_.push_back(tfd.make<TH2F>("p_vs_resXprime_TID",
573  "res_{x'} vs momentum in TID;p [GeV]; res_{x'}",
574  15,0.,15., 200, -0.1,0.1));
575  vTrack2DHistos_.push_back(tfd.make<TH2F>("p_vs_resXprime_TOB",
576  "res_{x'} vs momentum in TOB;p [GeV]; res_{x'}",
577  15,0.,15., 200, -0.1,0.1));
578  vTrack2DHistos_.push_back(tfd.make<TH2F>("p_vs_resXprime_TEC",
579  "res_{x'} vs momentum in TEC;p [GeV]; res_{x'}",
580  15,0.,15., 200, -0.1,0.1));
581 
582  /****************** Definition of 2-D Histos of ResY vs momenta ****************************/
583  vTrack2DHistos_.push_back(tfd.make<TH2F>("p_vs_resYprime_pixB",
584  "res_{y'} vs momentum in BPix;p [GeV]; res_{y'}",
585  15,0.,15., 200, -0.1,0.1));
586  vTrack2DHistos_.push_back(tfd.make<TH2F>("p_vs_resYprime_pixE",
587  "res_{y'} vs momentum in FPix;p [GeV]; res_{y'}",
588  15,0.,15., 200, -0.1,0.1));
589 
590 }
591 
592 
593 void
595 {
596  std::vector<Alignable*> alivec(ali.components());
597  for(int i=0, iEnd = ali.components().size();i < iEnd; ++i) {
598  std::string structurename = AlignableObjectId::idToString((alivec)[i]->alignableObjectId());
599  LogDebug("TrackerOfflineValidation") << "StructureName = " << structurename;
600  std::stringstream dirname;
601  dirname << structurename;
602  // add no suffix counter to Strip and Pixel, just aesthetics
603  if (structurename != "Strip" && structurename != "Pixel") dirname << "_" << i+1;
604 
605  if (structurename.find("Endcap",0) != std::string::npos ) {
606  DirectoryWrapper f(tfd,dirname.str(),moduleDirectory_,dqmMode_);
607  bookHists(f, *(alivec)[i], tTopo, ali.alignableObjectId() , i);
608  bookDirHists( f, *(alivec)[i], tTopo);
609  } else if( !(this->isDetOrDetUnit( (alivec)[i]->alignableObjectId()) )
610  || alivec[i]->components().size() > 1) {
611  DirectoryWrapper f(tfd,dirname.str(),moduleDirectory_,dqmMode_);
612  bookHists(tfd, *(alivec)[i], tTopo, ali.alignableObjectId() , i);
613  bookDirHists( f, *(alivec)[i], tTopo);
614  } else {
615  bookHists(tfd, *(alivec)[i], tTopo, ali.alignableObjectId() , i);
616  }
617  }
618 }
619 
620 
621 void
623 {
624  TrackerAlignableId aliid;
625  const DetId id = ali.id();
626 
627  // comparing subdetandlayer to subdetIds gives a warning at compile time
628  // -> subdetandlayer could also be pair<uint,uint> but this has to be adapted
629  // in AlignableObjId
630  std::pair<int,int> subdetandlayer = aliid.typeAndLayerFromDetId(id, tTopo);
631 
633 
634  // are we on or just above det, detunit level respectively?
635  if (type == align::AlignableDetUnit )subtype = type;
636  else if( this->isDetOrDetUnit(ali.alignableObjectId()) ) subtype = ali.alignableObjectId();
637 
638  // construct histogramm title and name
639  std::stringstream histoname, histotitle, normhistoname, normhistotitle,
640  yhistoname, yhistotitle,
641  xprimehistoname, xprimehistotitle, normxprimehistoname, normxprimehistotitle,
642  yprimehistoname, yprimehistotitle, normyprimehistoname, normyprimehistotitle,
643  localxname, localxtitle, localyname, localytitle,
644  resxvsxprofilename, resxvsxprofiletitle, resyvsxprofilename, resyvsxprofiletitle,
645  resxvsyprofilename, resxvsyprofiletitle, resyvsyprofilename, resyvsyprofiletitle;
646 
647  std::string wheel_or_layer;
648 
649  if( this->isEndCap(static_cast<uint32_t>(subdetandlayer.first)) ) wheel_or_layer = "_wheel_";
650  else if ( this->isBarrel(static_cast<uint32_t>(subdetandlayer.first)) ) wheel_or_layer = "_layer_";
651  else edm::LogWarning("TrackerOfflineValidation") << "@SUB=TrackerOfflineValidation::bookHists"
652  << "Unknown subdetid: " << subdetandlayer.first;
653 
654  histoname << "h_residuals_subdet_" << subdetandlayer.first
655  << wheel_or_layer << subdetandlayer.second << "_module_" << id.rawId();
656  yhistoname << "h_y_residuals_subdet_" << subdetandlayer.first
657  << wheel_or_layer << subdetandlayer.second << "_module_" << id.rawId();
658  xprimehistoname << "h_xprime_residuals_subdet_" << subdetandlayer.first
659  << wheel_or_layer << subdetandlayer.second << "_module_" << id.rawId();
660  yprimehistoname << "h_yprime_residuals_subdet_" << subdetandlayer.first
661  << wheel_or_layer << subdetandlayer.second << "_module_" << id.rawId();
662  normhistoname << "h_normresiduals_subdet_" << subdetandlayer.first
663  << wheel_or_layer << subdetandlayer.second << "_module_" << id.rawId();
664  normxprimehistoname << "h_normxprimeresiduals_subdet_" << subdetandlayer.first
665  << wheel_or_layer << subdetandlayer.second << "_module_" << id.rawId();
666  normyprimehistoname << "h_normyprimeresiduals_subdet_" << subdetandlayer.first
667  << wheel_or_layer << subdetandlayer.second << "_module_" << id.rawId();
668  histotitle << "X Residual for module " << id.rawId() << ";x_{tr} - x_{hit} [cm]";
669  yhistotitle << "Y Residual for module " << id.rawId() << ";y_{tr} - y_{hit} [cm]";
670  normhistotitle << "Normalized Residual for module " << id.rawId() << ";x_{tr} - x_{hit}/#sigma";
671  xprimehistotitle << "X' Residual for module " << id.rawId() << ";(x_{tr} - x_{hit})' [cm]";
672  normxprimehistotitle << "Normalized X' Residual for module " << id.rawId() << ";(x_{tr} - x_{hit})'/#sigma";
673  yprimehistotitle << "Y' Residual for module " << id.rawId() << ";(y_{tr} - y_{hit})' [cm]";
674  normyprimehistotitle << "Normalized Y' Residual for module " << id.rawId() << ";(y_{tr} - y_{hit})'/#sigma";
675 
676  if ( moduleLevelProfiles_ ) {
677  localxname << "h_localx_subdet_" << subdetandlayer.first
678  << wheel_or_layer << subdetandlayer.second << "_module_" << id.rawId();
679  localyname << "h_localy_subdet_" << subdetandlayer.first
680  << wheel_or_layer << subdetandlayer.second << "_module_" << id.rawId();
681  localxtitle << "u local for module " << id.rawId() << "; u_{tr,r}";
682  localytitle << "v local for module " << id.rawId() << "; v_{tr,r}";
683 
684  resxvsxprofilename << "p_residuals_x_vs_x_subdet_" << subdetandlayer.first
685  << wheel_or_layer << subdetandlayer.second << "_module_" << id.rawId();
686  resyvsxprofilename << "p_residuals_y_vs_x_subdet_" << subdetandlayer.first
687  << wheel_or_layer << subdetandlayer.second << "_module_" << id.rawId();
688  resxvsyprofilename << "p_residuals_x_vs_y_subdet_" << subdetandlayer.first
689  << wheel_or_layer << subdetandlayer.second << "_module_" << id.rawId();
690  resyvsyprofilename << "p_residuals_y_vs_y_subdet_" << subdetandlayer.first
691  << wheel_or_layer << subdetandlayer.second << "_module_" << id.rawId();
692  resxvsxprofiletitle << "U Residual vs u for module " << id.rawId() << "; u_{tr,r} ;(u_{tr} - u_{hit})/tan#alpha [cm]";
693  resyvsxprofiletitle << "V Residual vs u for module " << id.rawId() << "; u_{tr,r} ;(v_{tr} - v_{hit})/tan#beta [cm]";
694  resxvsyprofiletitle << "U Residual vs v for module " << id.rawId() << "; v_{tr,r} ;(u_{tr} - u_{hit})/tan#alpha [cm]";
695  resyvsyprofiletitle << "V Residual vs v for module " << id.rawId() << "; v_{tr,r} ;(v_{tr} - v_{hit})/tan#beta [cm]";
696  }
697 
698  if( this->isDetOrDetUnit( subtype ) ) {
699  ModuleHistos &histStruct = this->getHistStructFromMap(id);
700  int nbins = 0;
701  double xmin = 0., xmax = 0.;
702  double ymin = -0.1, ymax = 0.1;
703 
704  // do not allow transient hists in DQM mode
705  bool moduleLevelHistsTransient(moduleLevelHistsTransient_);
706  if (dqmMode_) moduleLevelHistsTransient = false;
707 
708  // decide via cfg if hists in local coordinates should be booked
709  if(lCoorHistOn_) {
710  this->getBinning(id.subdetId(), XResidual, nbins, xmin, xmax);
711  histStruct.ResHisto = this->bookTH1F(moduleLevelHistsTransient, tfd,
712  histoname.str().c_str(),histotitle.str().c_str(),
713  nbins, xmin, xmax);
714  this->getBinning(id.subdetId(), NormXResidual, nbins, xmin, xmax);
715  histStruct.NormResHisto = this->bookTH1F(moduleLevelHistsTransient, tfd,
716  normhistoname.str().c_str(),normhistotitle.str().c_str(),
717  nbins, xmin, xmax);
718  }
719  this->getBinning(id.subdetId(), XprimeResidual, nbins, xmin, xmax);
720  histStruct.ResXprimeHisto = this->bookTH1F(moduleLevelHistsTransient, tfd,
721  xprimehistoname.str().c_str(),xprimehistotitle.str().c_str(),
722  nbins, xmin, xmax);
723  this->getBinning(id.subdetId(), NormXprimeResidual, nbins, xmin, xmax);
724  histStruct.NormResXprimeHisto = this->bookTH1F(moduleLevelHistsTransient, tfd,
725  normxprimehistoname.str().c_str(),normxprimehistotitle.str().c_str(),
726  nbins, xmin, xmax);
727 
728  if ( moduleLevelProfiles_ ) {
729  this->getBinning(id.subdetId(), XResidualProfile, nbins, xmin, xmax);
730 
731  histStruct.LocalX = this->bookTH1F(moduleLevelHistsTransient, tfd,
732  localxname.str().c_str(),localxtitle.str().c_str(),
733  nbins, xmin, xmax);
734  histStruct.LocalY = this->bookTH1F(moduleLevelHistsTransient, tfd,
735  localyname.str().c_str(),localytitle.str().c_str(),
736  nbins, xmin, xmax);
737  histStruct.ResXvsXProfile = this->bookTProfile(moduleLevelHistsTransient, tfd,
738  resxvsxprofilename.str().c_str(),resxvsxprofiletitle.str().c_str(),
739  nbins, xmin, xmax, ymin, ymax);
740  histStruct.ResXvsXProfile->Sumw2(); // to be filled with weights, so uncertainties need sum of square of weights
741  histStruct.ResXvsYProfile = this->bookTProfile(moduleLevelHistsTransient, tfd,
742  resxvsyprofilename.str().c_str(),resxvsyprofiletitle.str().c_str(),
743  nbins, xmin, xmax, ymin, ymax);
744  histStruct.ResXvsYProfile->Sumw2(); // to be filled with weights, so uncertainties need sum of square of weights
745  }
746 
747  if( this->isPixel(subdetandlayer.first) || stripYResiduals_ ) {
748  this->getBinning(id.subdetId(), YprimeResidual, nbins, xmin, xmax);
749  histStruct.ResYprimeHisto = this->bookTH1F(moduleLevelHistsTransient, tfd,
750  yprimehistoname.str().c_str(),yprimehistotitle.str().c_str(),
751  nbins, xmin, xmax);
752  if (lCoorHistOn_) { // un-primed y-residual
753  this->getBinning(id.subdetId(), YResidual, nbins, xmin, xmax);
754  histStruct.ResYHisto = this->bookTH1F(moduleLevelHistsTransient, tfd,
755  yhistoname.str().c_str(), yhistotitle.str().c_str(),
756  nbins, xmin, xmax);
757  }
758  this->getBinning(id.subdetId(), NormYprimeResidual, nbins, xmin, xmax);
759  histStruct.NormResYprimeHisto = this->bookTH1F(moduleLevelHistsTransient, tfd,
760  normyprimehistoname.str().c_str(),normyprimehistotitle.str().c_str(),
761  nbins, xmin, xmax);
762  // Here we could add un-primed normalised y-residuals if(lCoorHistOn_)...
763  if ( moduleLevelProfiles_ ) {
764  this->getBinning(id.subdetId(), YResidualProfile, nbins, xmin, xmax);
765 
766  histStruct.ResYvsXProfile = this->bookTProfile(moduleLevelHistsTransient, tfd,
767  resyvsxprofilename.str().c_str(),resyvsxprofiletitle.str().c_str(),
768  nbins, xmin, xmax, ymin, ymax);
769  histStruct.ResYvsXProfile->Sumw2(); // to be filled with weights, so uncertainties need sum of square of weights
770  histStruct.ResYvsYProfile = this->bookTProfile(moduleLevelHistsTransient, tfd,
771  resyvsyprofilename.str().c_str(),resyvsyprofiletitle.str().c_str(),
772  nbins, xmin, xmax, ymin, ymax);
773  histStruct.ResYvsYProfile->Sumw2(); // to be filled with weights, so uncertainties need sum of square of weights
774  }
775  }
776  }
777 }
778 
779 
780 TH1* TrackerOfflineValidation::bookTH1F(bool isTransient, DirectoryWrapper& tfd, const char* histName, const char* histTitle,
781  int nBinsX, double lowX, double highX)
782 {
783  if (isTransient) {
784  vDeleteObjects_.push_back(new TH1F(histName, histTitle, nBinsX, lowX, highX));
785  return vDeleteObjects_.back(); // return last element of vector
786  }
787  else
788  return tfd.make<TH1F>(histName, histTitle, nBinsX, lowX, highX);
789 }
790 
791 TProfile* TrackerOfflineValidation::bookTProfile(bool isTransient, DirectoryWrapper& tfd, const char* histName, const char* histTitle,
792  int nBinsX, double lowX, double highX)
793 {
794  if (isTransient) {
795  TProfile * profile = new TProfile(histName, histTitle, nBinsX, lowX, highX);
796  vDeleteObjects_.push_back(profile);
797  return profile;
798  }
799  else
800  return (TProfile*)tfd.make<TProfile>(histName, histTitle, nBinsX, lowX, highX);
801 }
802 
803 
804 TProfile* TrackerOfflineValidation::bookTProfile(bool isTransient, DirectoryWrapper& tfd, const char* histName, const char* histTitle,
805  int nBinsX, double lowX, double highX, double lowY, double highY)
806 {
807  if (isTransient) {
808  TProfile * profile = new TProfile(histName, histTitle, nBinsX, lowX, highX, lowY, highY);
809  vDeleteObjects_.push_back(profile);
810  return profile;
811  }
812  else
813  return (TProfile*)tfd.make<TProfile>(histName, histTitle, nBinsX, lowX, highX, lowY, highY);
814 }
815 
817 {
818  return (subDetId == StripSubdetector::TIB ||
819  subDetId == StripSubdetector::TOB ||
820  subDetId == PixelSubdetector::PixelBarrel );
821 }
822 
823 
825 {
826  return ( subDetId == StripSubdetector::TID ||
827  subDetId == StripSubdetector::TEC ||
828  subDetId == PixelSubdetector::PixelEndcap );
829 }
830 
831 
833 {
834  return (subDetId == PixelSubdetector::PixelBarrel ||
835  subDetId == PixelSubdetector::PixelEndcap );
836 }
837 
838 
840 {
841  return ( type == align::AlignableDet ||
842  type == align::AlignableDetUnit );
843 }
844 
845 
846 void
849  int& nBinsX, double& lowerBoundX, double& upperBoundX)
850 {
851  // determine if
852  const bool isPixel = this->isPixel(subDetId);
853 
854  edm::ParameterSet binningPSet;
855 
856  switch(residualType)
857  {
858  case XResidual :
859  if(isPixel) binningPSet = parSet_.getParameter<edm::ParameterSet>("TH1XResPixelModules");
860  else binningPSet = parSet_.getParameter<edm::ParameterSet>("TH1XResStripModules");
861  break;
862  case NormXResidual :
863  if(isPixel) binningPSet = parSet_.getParameter<edm::ParameterSet>("TH1NormXResPixelModules");
864  else binningPSet = parSet_.getParameter<edm::ParameterSet>("TH1NormXResStripModules");
865  break;
866  case XprimeResidual :
867  if(isPixel) binningPSet = parSet_.getParameter<edm::ParameterSet>("TH1XprimeResPixelModules");
868  else binningPSet = parSet_.getParameter<edm::ParameterSet>("TH1XprimeResStripModules");
869  break;
870  case NormXprimeResidual :
871  if(isPixel) binningPSet = parSet_.getParameter<edm::ParameterSet>("TH1NormXprimeResPixelModules");
872  else binningPSet = parSet_.getParameter<edm::ParameterSet>("TH1NormXprimeResStripModules");
873  break;
874  case YResidual : // borrow y-residual binning from yprime
875  case YprimeResidual :
876  if(isPixel) binningPSet = parSet_.getParameter<edm::ParameterSet>("TH1YResPixelModules");
877  else binningPSet = parSet_.getParameter<edm::ParameterSet>("TH1YResStripModules");
878  break;
879  /* case NormYResidual :*/
880  case NormYprimeResidual :
881  if(isPixel) binningPSet = parSet_.getParameter<edm::ParameterSet>("TH1NormYResPixelModules");
882  else binningPSet = parSet_.getParameter<edm::ParameterSet>("TH1NormYResStripModules");
883  break;
884  case XResidualProfile :
885  if(isPixel) binningPSet = parSet_.getParameter<edm::ParameterSet>("TProfileXResPixelModules");
886  else binningPSet = parSet_.getParameter<edm::ParameterSet>("TProfileXResStripModules");
887  break;
888  case YResidualProfile :
889  if(isPixel) binningPSet = parSet_.getParameter<edm::ParameterSet>("TProfileYResPixelModules");
890  else binningPSet = parSet_.getParameter<edm::ParameterSet>("TProfileYResStripModules");
891  break;
892  }
893  nBinsX = binningPSet.getParameter<int32_t>("Nbinx");
894  lowerBoundX = binningPSet.getParameter<double>("xmin");
895  upperBoundX = binningPSet.getParameter<double>("xmax");
896 }
897 
898 
899 void
900 TrackerOfflineValidation::setSummaryBin(int bin, TH1* targetHist, TH1* sourceHist)
901 {
902  if(targetHist && sourceHist) {
903  targetHist->SetBinContent(bin, sourceHist->GetMean(1));
904  if(useFwhm_) targetHist->SetBinError(bin, Fwhm(sourceHist)/2.);
905  else targetHist->SetBinError(bin, sourceHist->GetRMS(1) );
906  }
907  else return;
908 }
909 
910 
911 void
913  SummaryContainer& sourceContainer)
914 {
915  this->setSummaryBin(bin, targetContainer.summaryXResiduals_, sourceContainer.sumXResiduals_);
916  this->setSummaryBin(bin, targetContainer.summaryNormXResiduals_, sourceContainer.sumNormXResiduals_);
917  // If no y-residual hists, just returns:
918  this->setSummaryBin(bin, targetContainer.summaryYResiduals_, sourceContainer.sumYResiduals_);
919  this->setSummaryBin(bin, targetContainer.summaryNormYResiduals_, sourceContainer.sumNormYResiduals_);
920 }
921 
922 
923 void
925  SummaryContainer& targetContainer,
926  ModuleHistos& sourceContainer)
927 {
928  // takes two summary Containers and sets summaryBins for all histograms
929  this->setSummaryBin(bin, targetContainer.summaryXResiduals_, sourceContainer.ResXprimeHisto);
930  this->setSummaryBin(bin, targetContainer.summaryNormXResiduals_, sourceContainer.NormResXprimeHisto);
931  if( this->isPixel(subDetId) || stripYResiduals_ ) {
932  this->setSummaryBin(bin, targetContainer.summaryYResiduals_, sourceContainer.ResYprimeHisto);
933  this->setSummaryBin(bin, targetContainer.summaryNormYResiduals_, sourceContainer.NormResYprimeHisto);
934  }
935 }
936 
937 
940 {
941  // get a struct with histograms from the respective map
942  // if no object exist, the reference is automatically created by the map
943  // throw exception if non-tracker id is passed
944  uint subdetid = detid.subdetId();
945  if(subdetid == PixelSubdetector::PixelBarrel ) {
946  return mPxbResiduals_[detid.rawId()];
947  } else if (subdetid == PixelSubdetector::PixelEndcap) {
948  return mPxeResiduals_[detid.rawId()];
949  } else if(subdetid == StripSubdetector::TIB) {
950  return mTibResiduals_[detid.rawId()];
951  } else if(subdetid == StripSubdetector::TID) {
952  return mTidResiduals_[detid.rawId()];
953  } else if(subdetid == StripSubdetector::TOB) {
954  return mTobResiduals_[detid.rawId()];
955  } else if(subdetid == StripSubdetector::TEC) {
956  return mTecResiduals_[detid.rawId()];
957  } else {
958  throw cms::Exception("Geometry Error")
959  << "[TrackerOfflineValidation] Error, tried to get reference for non-tracker subdet " << subdetid
960  << " from detector " << detid.det();
961  return mPxbResiduals_[0];
962  }
963 }
964 
965 
966 // ------------ method called to for each event ------------
967 void
969 {
970  if (useOverflowForRMS_)TH1::StatOverflows(kTRUE);
971  this->checkBookHists(iSetup); // check whether hists are booked and do so if not yet done
972 
973  TrackerValidationVariables avalidator_(iSetup,parSet_);
974 
975  std::vector<TrackerValidationVariables::AVTrackStruct> vTrackstruct;
976  avalidator_.fillTrackQuantities(iEvent, vTrackstruct);
977 
978  for (std::vector<TrackerValidationVariables::AVTrackStruct>::const_iterator itT = vTrackstruct.begin();
979  itT != vTrackstruct.end();
980  ++itT) {
981 
982  // Fill 1D track histos
983  static const int etaindex = this->GetIndex(vTrackHistos_,"h_tracketa");
984  vTrackHistos_[etaindex]->Fill(itT->eta);
985  static const int phiindex = this->GetIndex(vTrackHistos_,"h_trackphi");
986  vTrackHistos_[phiindex]->Fill(itT->phi);
987  static const int numOfValidHitsindex = this->GetIndex(vTrackHistos_,"h_trackNumberOfValidHits");
988  vTrackHistos_[numOfValidHitsindex]->Fill(itT->numberOfValidHits);
989  static const int numOfLostHitsindex = this->GetIndex(vTrackHistos_,"h_trackNumberOfLostHits");
990  vTrackHistos_[numOfLostHitsindex]->Fill(itT->numberOfLostHits);
991  static const int kappaindex = this->GetIndex(vTrackHistos_,"h_curvature");
992  vTrackHistos_[kappaindex]->Fill(itT->kappa);
993  static const int kappaposindex = this->GetIndex(vTrackHistos_,"h_curvature_pos");
994  if (itT->charge > 0)
995  vTrackHistos_[kappaposindex]->Fill(fabs(itT->kappa));
996  static const int kappanegindex = this->GetIndex(vTrackHistos_,"h_curvature_neg");
997  if (itT->charge < 0)
998  vTrackHistos_[kappanegindex]->Fill(fabs(itT->kappa));
999  static const int normchi2index = this->GetIndex(vTrackHistos_,"h_normchi2");
1000  vTrackHistos_[normchi2index]->Fill(itT->normchi2);
1001  static const int chi2index = this->GetIndex(vTrackHistos_,"h_chi2");
1002  vTrackHistos_[chi2index]->Fill(itT->chi2);
1003  static const int chi2Probindex = this->GetIndex(vTrackHistos_,"h_chi2Prob");
1004  vTrackHistos_[chi2Probindex]->Fill(itT->chi2Prob);
1005  static const int ptindex = this->GetIndex(vTrackHistos_,"h_pt");
1006  vTrackHistos_[ptindex]->Fill(itT->pt);
1007  if (itT->ptError != 0.) {
1008  static const int ptResolutionindex = this->GetIndex(vTrackHistos_,"h_ptResolution");
1009  vTrackHistos_[ptResolutionindex]->Fill(itT->ptError/itT->pt);
1010  }
1011  // Fill track profiles
1012  static const int d0phiindex = this->GetIndex(vTrackProfiles_,"p_d0_vs_phi");
1013  vTrackProfiles_[d0phiindex]->Fill(itT->phi,itT->d0);
1014  static const int dzphiindex = this->GetIndex(vTrackProfiles_,"p_dz_vs_phi");
1015  vTrackProfiles_[dzphiindex]->Fill(itT->phi,itT->dz);
1016  static const int d0etaindex = this->GetIndex(vTrackProfiles_,"p_d0_vs_eta");
1017  vTrackProfiles_[d0etaindex]->Fill(itT->eta,itT->d0);
1018  static const int dzetaindex = this->GetIndex(vTrackProfiles_,"p_dz_vs_eta");
1019  vTrackProfiles_[dzetaindex]->Fill(itT->eta,itT->dz);
1020  static const int chiphiindex = this->GetIndex(vTrackProfiles_,"p_chi2_vs_phi");
1021  vTrackProfiles_[chiphiindex]->Fill(itT->phi,itT->chi2);
1022  static const int chiProbphiindex = this->GetIndex(vTrackProfiles_,"p_chi2Prob_vs_phi");
1023  vTrackProfiles_[chiProbphiindex]->Fill(itT->phi,itT->chi2Prob);
1024  static const int chiProbabsd0index = this->GetIndex(vTrackProfiles_,"p_chi2Prob_vs_d0");
1025  vTrackProfiles_[chiProbabsd0index]->Fill(fabs(itT->d0),itT->chi2Prob);
1026  static const int normchiphiindex = this->GetIndex(vTrackProfiles_,"p_normchi2_vs_phi");
1027  vTrackProfiles_[normchiphiindex]->Fill(itT->phi,itT->normchi2);
1028  static const int chietaindex = this->GetIndex(vTrackProfiles_,"p_chi2_vs_eta");
1029  vTrackProfiles_[chietaindex]->Fill(itT->eta,itT->chi2);
1030  static const int normchiptindex = this->GetIndex(vTrackProfiles_,"p_normchi2_vs_pt");
1031  vTrackProfiles_[normchiptindex]->Fill(itT->pt,itT->normchi2);
1032  static const int normchipindex = this->GetIndex(vTrackProfiles_,"p_normchi2_vs_p");
1033  vTrackProfiles_[normchipindex]->Fill(itT->p,itT->normchi2);
1034  static const int chiProbetaindex = this->GetIndex(vTrackProfiles_,"p_chi2Prob_vs_eta");
1035  vTrackProfiles_[chiProbetaindex]->Fill(itT->eta,itT->chi2Prob);
1036  static const int normchietaindex = this->GetIndex(vTrackProfiles_,"p_normchi2_vs_eta");
1037  vTrackProfiles_[normchietaindex]->Fill(itT->eta,itT->normchi2);
1038  static const int kappaphiindex = this->GetIndex(vTrackProfiles_,"p_kappa_vs_phi");
1039  vTrackProfiles_[kappaphiindex]->Fill(itT->phi,itT->kappa);
1040  static const int kappaetaindex = this->GetIndex(vTrackProfiles_,"p_kappa_vs_eta");
1041  vTrackProfiles_[kappaetaindex]->Fill(itT->eta,itT->kappa);
1042  static const int ptResphiindex = this->GetIndex(vTrackProfiles_,"p_ptResolution_vs_phi");
1043  vTrackProfiles_[ptResphiindex]->Fill(itT->phi,itT->ptError/itT->pt);
1044  static const int ptResetaindex = this->GetIndex(vTrackProfiles_,"p_ptResolution_vs_eta");
1045  vTrackProfiles_[ptResetaindex]->Fill(itT->eta,itT->ptError/itT->pt);
1046 
1047  // Fill 2D track histos
1048  static const int d0phiindex_2d = this->GetIndex(vTrack2DHistos_,"h2_d0_vs_phi");
1049  vTrack2DHistos_[d0phiindex_2d]->Fill(itT->phi,itT->d0);
1050  static const int dzphiindex_2d = this->GetIndex(vTrack2DHistos_,"h2_dz_vs_phi");
1051  vTrack2DHistos_[dzphiindex_2d]->Fill(itT->phi,itT->dz);
1052  static const int d0etaindex_2d = this->GetIndex(vTrack2DHistos_,"h2_d0_vs_eta");
1053  vTrack2DHistos_[d0etaindex_2d]->Fill(itT->eta,itT->d0);
1054  static const int dzetaindex_2d = this->GetIndex(vTrack2DHistos_,"h2_dz_vs_eta");
1055  vTrack2DHistos_[dzetaindex_2d]->Fill(itT->eta,itT->dz);
1056  static const int chiphiindex_2d = this->GetIndex(vTrack2DHistos_,"h2_chi2_vs_phi");
1057  vTrack2DHistos_[chiphiindex_2d]->Fill(itT->phi,itT->chi2);
1058  static const int chiProbphiindex_2d = this->GetIndex(vTrack2DHistos_,"h2_chi2Prob_vs_phi");
1059  vTrack2DHistos_[chiProbphiindex_2d]->Fill(itT->phi,itT->chi2Prob);
1060  static const int chiProbabsd0index_2d = this->GetIndex(vTrack2DHistos_,"h2_chi2Prob_vs_d0");
1061  vTrack2DHistos_[chiProbabsd0index_2d]->Fill(fabs(itT->d0),itT->chi2Prob);
1062  static const int normchiphiindex_2d = this->GetIndex(vTrack2DHistos_,"h2_normchi2_vs_phi");
1063  vTrack2DHistos_[normchiphiindex_2d]->Fill(itT->phi,itT->normchi2);
1064  static const int chietaindex_2d = this->GetIndex(vTrack2DHistos_,"h2_chi2_vs_eta");
1065  vTrack2DHistos_[chietaindex_2d]->Fill(itT->eta,itT->chi2);
1066  static const int chiProbetaindex_2d = this->GetIndex(vTrack2DHistos_,"h2_chi2Prob_vs_eta");
1067  vTrack2DHistos_[chiProbetaindex_2d]->Fill(itT->eta,itT->chi2Prob);
1068  static const int normchietaindex_2d = this->GetIndex(vTrack2DHistos_,"h2_normchi2_vs_eta");
1069  vTrack2DHistos_[normchietaindex_2d]->Fill(itT->eta,itT->normchi2);
1070  static const int kappaphiindex_2d = this->GetIndex(vTrack2DHistos_,"h2_kappa_vs_phi");
1071  vTrack2DHistos_[kappaphiindex_2d]->Fill(itT->phi,itT->kappa);
1072  static const int kappaetaindex_2d = this->GetIndex(vTrack2DHistos_,"h2_kappa_vs_eta");
1073  vTrack2DHistos_[kappaetaindex_2d]->Fill(itT->eta,itT->kappa);
1074  static const int normchi2kappa_2d = this->GetIndex(vTrack2DHistos_,"h2_normchi2_vs_kappa");
1075  vTrack2DHistos_[normchi2kappa_2d]->Fill(itT->normchi2,itT->kappa);
1076 
1077  // hit quantities: residuals, normalized residuals
1078  for (std::vector<TrackerValidationVariables::AVHitStruct>::const_iterator itH = itT->hits.begin();
1079  itH != itT->hits.end();
1080  ++itH) {
1081 
1082  DetId detid(itH->rawDetId);
1083  ModuleHistos &histStruct = this->getHistStructFromMap(detid);
1084 
1085  // fill histos in local coordinates if set in cf
1086  if (lCoorHistOn_) {
1087  histStruct.ResHisto->Fill(itH->resX);
1088  if(itH->resErrX != 0) histStruct.NormResHisto->Fill(itH->resX/itH->resErrX);
1089  if (this->isPixel(detid.subdetId()) || stripYResiduals_ ) {
1090  histStruct.ResYHisto->Fill(itH->resY);
1091  // here add un-primed normalised y-residuals if wanted
1092  }
1093  }
1094  if (itH->resXprime != -999.) {
1095  histStruct.ResXprimeHisto->Fill(itH->resXprime);
1096 
1097  /******************************* Fill 2-D histo ResX vs momenta *****************************/
1098  if (detid.subdetId() == PixelSubdetector::PixelBarrel) {
1099  static const int resXvsPindex_2d = this->GetIndex(vTrack2DHistos_,"p_vs_resXprime_pixB");
1100  vTrack2DHistos_[resXvsPindex_2d]->Fill(itT->p,itH->resXprime);
1101  }
1102  if (detid.subdetId() == PixelSubdetector::PixelEndcap) {
1103  static const int resXvsPindex_2d = this->GetIndex(vTrack2DHistos_,"p_vs_resXprime_pixE");
1104  vTrack2DHistos_[resXvsPindex_2d]->Fill(itT->p,itH->resXprime);
1105  }
1106  if (detid.subdetId() == StripSubdetector::TIB) {
1107  static const int resXvsPindex_2d = this->GetIndex(vTrack2DHistos_,"p_vs_resXprime_TIB");
1108  vTrack2DHistos_[resXvsPindex_2d]->Fill(itT->p,itH->resXprime);
1109  }
1110  if (detid.subdetId() == StripSubdetector::TID) {
1111  static const int resXvsPindex_2d = this->GetIndex(vTrack2DHistos_,"p_vs_resXprime_TID");
1112  vTrack2DHistos_[resXvsPindex_2d]->Fill(itT->p,itH->resXprime);
1113  }
1114  if (detid.subdetId() == StripSubdetector::TOB) {
1115  static const int resXvsPindex_2d = this->GetIndex(vTrack2DHistos_,"p_vs_resXprime_TOB");
1116  vTrack2DHistos_[resXvsPindex_2d]->Fill(itT->p,itH->resXprime);
1117  }
1118  if (detid.subdetId() == StripSubdetector::TEC) {
1119  static const int resXvsPindex_2d = this->GetIndex(vTrack2DHistos_,"p_vs_resXprime_TEC");
1120  vTrack2DHistos_[resXvsPindex_2d]->Fill(itT->p,itH->resXprime);
1121  }
1122  /******************************************/
1123 
1124  if ( moduleLevelProfiles_ && itH->inside ) {
1125  float tgalpha = tan(itH->localAlpha);
1126  if ( fabs(tgalpha)!=0 ){
1127  histStruct.LocalX->Fill(itH->localXnorm, tgalpha*tgalpha);
1128  histStruct.LocalY->Fill(itH->localYnorm, tgalpha*tgalpha);
1129 /* if (this->isEndCap(detid.subdetId()) && !this->isPixel(detid.subdetId())) {
1130  if((itH->resX)*(itH->resXprime)>0){
1131  histStruct.ResXvsXProfile->Fill(itH->localXnorm, itH->resXatTrkY/tgalpha, tgalpha*tgalpha);
1132  histStruct.ResXvsYProfile->Fill(itH->localYnorm, itH->resXatTrkY/tgalpha, tgalpha*tgalpha);
1133  } else {
1134  histStruct.ResXvsXProfile->Fill(itH->localXnorm, (-1)*itH->resXatTrkY/tgalpha, tgalpha*tgalpha);
1135  histStruct.ResXvsYProfile->Fill(itH->localYnorm, (-1)*itH->resXatTrkY/tgalpha, tgalpha*tgalpha);
1136  }
1137 
1138  }else {
1139 */
1140  histStruct.ResXvsXProfile->Fill(itH->localXnorm, itH->resXatTrkY/tgalpha, tgalpha*tgalpha);
1141  histStruct.ResXvsYProfile->Fill(itH->localYnorm, itH->resXatTrkY/tgalpha, tgalpha*tgalpha);
1142 
1143 // }
1144 
1145  }
1146  }
1147 
1148  if(itH->resXprimeErr != 0 && itH->resXprimeErr != -999 ) {
1149  histStruct.NormResXprimeHisto->Fill(itH->resXprime/itH->resXprimeErr);
1150  }
1151  }
1152 
1153  if (itH->resYprime != -999.) {
1154  if (this->isPixel(detid.subdetId()) || stripYResiduals_ ) {
1155  histStruct.ResYprimeHisto->Fill(itH->resYprime);
1156 
1157  /******************************* Fill 2-D histo ResY vs momenta *****************************/
1158  if (detid.subdetId() == PixelSubdetector::PixelBarrel) {
1159  static const int resYvsPindex_2d = this->GetIndex(vTrack2DHistos_,"p_vs_resYprime_pixB");
1160  vTrack2DHistos_[resYvsPindex_2d]->Fill(itT->p,itH->resYprime);
1161  }
1162  if (detid.subdetId() == PixelSubdetector::PixelEndcap) {
1163  static const int resYvsPindex_2d = this->GetIndex(vTrack2DHistos_,"p_vs_resYprime_pixE");
1164  vTrack2DHistos_[resYvsPindex_2d]->Fill(itT->p,itH->resYprime);
1165  }
1166  /******************************************/
1167 
1168  if ( moduleLevelProfiles_ && itH->inside ) {
1169  float tgbeta = tan(itH->localBeta);
1170  if ( fabs(tgbeta)!=0 ){
1171 /* if (this->isEndCap(detid.subdetId()) && !this->isPixel(detid.subdetId())) {
1172 
1173  if((itH->resY)*(itH->resYprime)>0){
1174  histStruct.ResYvsXProfile->Fill(itH->localXnorm, itH->resYprime/tgbeta, tgbeta*tgbeta);
1175  histStruct.ResYvsYProfile->Fill(itH->localYnorm, itH->resYprime/tgbeta, tgbeta*tgbeta);
1176  } else {
1177  histStruct.ResYvsXProfile->Fill(itH->localXnorm, (-1)*itH->resYprime/tgbeta, tgbeta*tgbeta);
1178  histStruct.ResYvsYProfile->Fill(itH->localYnorm, (-1)*itH->resYprime/tgbeta, tgbeta*tgbeta);
1179  }
1180 
1181  }else {
1182 */
1183  histStruct.ResYvsXProfile->Fill(itH->localXnorm, itH->resY/tgbeta, tgbeta*tgbeta);
1184  histStruct.ResYvsYProfile->Fill(itH->localYnorm, itH->resY/tgbeta, tgbeta*tgbeta);
1185 // }
1186  }
1187  }
1188 
1189  if (itH->resYprimeErr != 0 && itH->resYprimeErr != -999. ) {
1190  histStruct.NormResYprimeHisto->Fill(itH->resYprime/itH->resYprimeErr);
1191  }
1192  }
1193  }
1194 
1195  } // finish loop over hit quantities
1196  } // finish loop over track quantities
1197 
1198  if (useOverflowForRMS_) TH1::StatOverflows(kFALSE);
1199 }
1200 
1201 
1202 // ------------ method called once each job just after ending the event loop ------------
1203 void
1205 {
1206 
1207  if (!tkGeom_.product()) return;
1208 
1209  //Retrieve tracker topology from geometry
1210  edm::ESHandle<TrackerTopology> tTopoHandle;
1211  lastSetup_->get<IdealGeometryRecord>().get(tTopoHandle);
1212  const TrackerTopology* const tTopo = tTopoHandle.product();
1213 
1214  AlignableTracker aliTracker(&(*tkGeom_), tTopo);
1215 
1216  static const int kappadiffindex = this->GetIndex(vTrackHistos_,"h_diff_curvature");
1217  vTrackHistos_[kappadiffindex]->Add(vTrackHistos_[this->GetIndex(vTrackHistos_,"h_curvature_neg")],
1218  vTrackHistos_[this->GetIndex(vTrackHistos_,"h_curvature_pos")],-1,1);
1219 
1220  // Collate Information for Subdetectors
1221  // create summary histogramms recursively
1222  std::vector<TrackerOfflineValidation::SummaryContainer> vTrackerprofiles;
1224  this->collateSummaryHists(f,(aliTracker), 0, vTrackerprofiles);
1225 
1226  if (dqmMode_) return;
1227  // Should be excluded in dqmMode, since TTree is not usable
1228  // In dqmMode tree operations are are sourced out to the additional module TrackerOfflineValidationSummary
1229 
1231  TTree *tree = fs->make<TTree>("TkOffVal","TkOffVal");
1232 
1233  TkOffTreeVariables *treeMemPtr = new TkOffTreeVariables;
1234  // We create branches for all members of 'TkOffTreeVariables' (even if not needed).
1235  // This works because we have a dictionary for 'TkOffTreeVariables'
1236  // (see src/classes_def.xml and src/classes.h):
1237  tree->Branch("TkOffTreeVariables", &treeMemPtr); // address of pointer!
1238 
1239  this->fillTree(*tree, mPxbResiduals_, *treeMemPtr, *tkGeom_, tTopo);
1240  this->fillTree(*tree, mPxeResiduals_, *treeMemPtr, *tkGeom_, tTopo);
1241  this->fillTree(*tree, mTibResiduals_, *treeMemPtr, *tkGeom_, tTopo);
1242  this->fillTree(*tree, mTidResiduals_, *treeMemPtr, *tkGeom_, tTopo);
1243  this->fillTree(*tree, mTobResiduals_, *treeMemPtr, *tkGeom_, tTopo);
1244  this->fillTree(*tree, mTecResiduals_, *treeMemPtr, *tkGeom_, tTopo);
1245 
1246  delete treeMemPtr; treeMemPtr = 0;
1247 }
1248 
1249 
1250 void
1252  std::vector<TrackerOfflineValidation::SummaryContainer>& vLevelProfiles)
1253 {
1254  std::vector<Alignable*> alivec(ali.components());
1255  if( this->isDetOrDetUnit((alivec)[0]->alignableObjectId()) ) return;
1256 
1257  for(int iComp=0, iCompEnd = ali.components().size();iComp < iCompEnd; ++iComp) {
1258  std::vector< TrackerOfflineValidation::SummaryContainer > vProfiles;
1259  std::string structurename = AlignableObjectId::idToString((alivec)[iComp]->alignableObjectId());
1260 
1261  LogDebug("TrackerOfflineValidation") << "StructureName = " << structurename;
1262  std::stringstream dirname;
1263  dirname << structurename;
1264 
1265  // add no suffix counter to strip and pixel -> just aesthetics
1266  if (structurename != "Strip" && structurename != "Pixel") dirname << "_" << iComp+1;
1267 
1268  if( !(this->isDetOrDetUnit( (alivec)[iComp]->alignableObjectId()) )
1269  || (alivec)[0]->components().size() > 1 ) {
1270  DirectoryWrapper f(tfd,dirname.str(),moduleDirectory_,dqmMode_);
1271  this->collateSummaryHists( f, *(alivec)[iComp], i, vProfiles);
1272  vLevelProfiles.push_back(this->bookSummaryHists(tfd, *(alivec[iComp]), ali.alignableObjectId(), iComp+1));
1273  TH1 *hY = vLevelProfiles[iComp].sumYResiduals_;
1274  TH1 *hNormY = vLevelProfiles[iComp].sumNormYResiduals_;
1275  for(uint n = 0; n < vProfiles.size(); ++n) {
1276  this->summarizeBinInContainer(n+1, vLevelProfiles[iComp], vProfiles[n] );
1277  vLevelProfiles[iComp].sumXResiduals_->Add(vProfiles[n].sumXResiduals_);
1278  vLevelProfiles[iComp].sumNormXResiduals_->Add(vProfiles[n].sumNormXResiduals_);
1279  if (hY) hY->Add(vProfiles[n].sumYResiduals_); // only if existing
1280  if (hNormY) hNormY->Add(vProfiles[n].sumNormYResiduals_); // dito (pxl, stripYResiduals_)
1281  }
1282  if(dqmMode_)continue; // No fits in dqmMode
1283  //add fit values to stat box
1284  this->fitResiduals(vLevelProfiles[iComp].sumXResiduals_);
1285  this->fitResiduals(vLevelProfiles[iComp].sumNormXResiduals_);
1286  if (hY) this->fitResiduals(hY); // only if existing (pixel or stripYResiduals_)
1287  if (hNormY) this->fitResiduals(hNormY); // dito
1288  } else {
1289  // nothing to be done for det or detunits
1290  continue;
1291  }
1292  }
1293 }
1294 
1295 
1298  align::StructureType type, int i)
1299 {
1300  const uint aliSize = ali.components().size();
1301  const align::StructureType alitype = ali.alignableObjectId();
1302  const align::StructureType subtype = ali.components()[0]->alignableObjectId();
1303  const char *aliTypeName = AlignableObjectId::idToString(alitype); // lifetime of char* OK
1304  const char *aliSubtypeName = AlignableObjectId::idToString(subtype);
1305  const char *typeName = AlignableObjectId::idToString(type);
1306 
1307  const DetId aliDetId = ali.id();
1308  // y residuals only if pixel or specially requested for strip:
1309  const bool bookResidY = this->isPixel(aliDetId.subdetId()) || stripYResiduals_;
1310 
1311  SummaryContainer sumContainer;
1312 
1313  // Book summary hists with one bin per component,
1314  // but special case for Det with two DetUnit that we want to summarize one level up
1315  // (e.g. in TOBRods with 12 bins for 6 stereo and 6 rphi DetUnit.)
1316  // component of ali is not Det or Det with just one components
1317  const uint subcompSize = ali.components()[0]->components().size();
1318  if (subtype != align::AlignableDet || subcompSize == 1) { // Det with 1 comp. should not exist anymore...
1319  const TString title(Form("Summary for substructures in %s %d;%s;",aliTypeName,i,aliSubtypeName));
1320 
1321  sumContainer.summaryXResiduals_ = tfd.make<TH1F>(Form("h_summaryX%s_%d",aliTypeName,i),
1322  title + "#LT #Delta x' #GT",
1323  aliSize, 0.5, aliSize+0.5);
1324  sumContainer.summaryNormXResiduals_ = tfd.make<TH1F>(Form("h_summaryNormX%s_%d",aliTypeName,i),
1325  title + "#LT #Delta x'/#sigma #GT",
1326  aliSize,0.5,aliSize+0.5);
1327 
1328  if (bookResidY) {
1329  sumContainer.summaryYResiduals_ = tfd.make<TH1F>(Form("h_summaryY%s_%d",aliTypeName,i),
1330  title + "#LT #Delta y' #GT",
1331  aliSize, 0.5, aliSize+0.5);
1332  sumContainer.summaryNormYResiduals_ = tfd.make<TH1F>(Form("h_summaryNormY%s_%d",aliTypeName,i),
1333  title + "#LT #Delta y'/#sigma #GT",
1334  aliSize,0.5,aliSize+0.5);
1335  }
1336 
1337  } else if (subtype == align::AlignableDet && subcompSize > 1) { // fixed: was aliSize before
1338  if (subcompSize != 2) { // strange... expect only 2 DetUnits in DS layers
1339  // this 2 is hardcoded factor 2 in binning below and also assumed later on
1340  edm::LogError("Alignment") << "@SUB=bookSummaryHists"
1341  << "Det with " << subcompSize << " components";
1342  }
1343  // title contains x-title
1344  const TString title(Form("Summary for substructures in %s %d;%s;", aliTypeName, i,
1345  AlignableObjectId::idToString(ali.components()[0]->components()[0]->alignableObjectId())));
1346 
1347  sumContainer.summaryXResiduals_
1348  = tfd.make<TH1F>(Form("h_summaryX%s_%d", aliTypeName, i),
1349  title + "#LT #Delta x' #GT", (2*aliSize), 0.5, 2*aliSize+0.5);
1350  sumContainer.summaryNormXResiduals_
1351  = tfd.make<TH1F>(Form("h_summaryNormX%s_%d", aliTypeName, i),
1352  title + "#LT #Delta x'/#sigma #GT", (2*aliSize), 0.5, 2*aliSize+0.5);
1353 
1354  if (bookResidY) {
1355  sumContainer.summaryYResiduals_
1356  = tfd.make<TH1F>(Form("h_summaryY%s_%d", aliTypeName, i),
1357  title + "#LT #Delta y' #GT", (2*aliSize), 0.5, 2*aliSize+0.5);
1358  sumContainer.summaryNormYResiduals_
1359  = tfd.make<TH1F>(Form("h_summaryNormY%s_%d", aliTypeName, i),
1360  title + "#LT #Delta y'/#sigma #GT", (2*aliSize), 0.5, 2*aliSize+0.5);
1361  }
1362 
1363  } else {
1364  edm::LogError("TrackerOfflineValidation") << "@SUB=TrackerOfflineValidation::bookSummaryHists"
1365  << "No summary histogramm for hierarchy level "
1366  << aliTypeName << " in subdet " << aliDetId.subdetId();
1367  }
1368 
1369  // Now book hists that just sum up the residual histograms from lower levels.
1370  // Axis title is copied from lowest level module of structure.
1371  // Should be safe that y-hists are only touched if non-null pointers...
1372  int nbins = 0;
1373  double xmin = 0., xmax = 0.;
1374  const TString sumTitle(Form("Residual for %s %d in %s;", aliTypeName, i, typeName));
1375  const ModuleHistos &xTitHists = this->getHistStructFromMap(aliDetId); // for x-axis titles
1376  this->getBinning(aliDetId.subdetId(), XprimeResidual, nbins, xmin, xmax);
1377 
1378  sumContainer.sumXResiduals_ = tfd.make<TH1F>(Form("h_Xprime_%s_%d", aliTypeName, i),
1379  sumTitle + xTitHists.ResXprimeHisto->GetXaxis()->GetTitle(),
1380  nbins, xmin, xmax);
1381 
1382  this->getBinning(aliDetId.subdetId(), NormXprimeResidual, nbins, xmin, xmax);
1383  sumContainer.sumNormXResiduals_ = tfd.make<TH1F>(Form("h_NormXprime_%s_%d",aliTypeName,i),
1384  sumTitle + xTitHists.NormResXprimeHisto->GetXaxis()->GetTitle(),
1385  nbins, xmin, xmax);
1386  if (bookResidY) {
1387  this->getBinning(aliDetId.subdetId(), YprimeResidual, nbins, xmin, xmax);
1388  sumContainer.sumYResiduals_ = tfd.make<TH1F>(Form("h_Yprime_%s_%d",aliTypeName,i),
1389  sumTitle + xTitHists.ResYprimeHisto->GetXaxis()->GetTitle(),
1390  nbins, xmin, xmax);
1391 
1392  this->getBinning(aliDetId.subdetId(), NormYprimeResidual, nbins, xmin, xmax);
1393  sumContainer.sumNormYResiduals_ = tfd.make<TH1F>(Form("h_NormYprime_%s_%d",aliTypeName,i),
1394  sumTitle + xTitHists.NormResYprimeHisto->GetXaxis()->GetTitle(),
1395  nbins, xmin, xmax);
1396  }
1397 
1398  // If we are at the lowest level, we already sum up and fill the summary.
1399 
1400  // special case I: For DetUnits and Dets with only one subcomponent start filling summary histos
1401  if( ( subtype == align::AlignableDet && subcompSize == 1) || subtype == align::AlignableDetUnit ) {
1402  for(uint k = 0; k < aliSize; ++k) {
1403  DetId detid = ali.components()[k]->id();
1404  ModuleHistos &histStruct = this->getHistStructFromMap(detid);
1405  this->summarizeBinInContainer(k+1, detid.subdetId() ,sumContainer, histStruct );
1406  sumContainer.sumXResiduals_->Add(histStruct.ResXprimeHisto);
1407  sumContainer.sumNormXResiduals_->Add(histStruct.NormResXprimeHisto);
1408  if( this->isPixel(detid.subdetId()) || stripYResiduals_ ) {
1409  sumContainer.sumYResiduals_->Add(histStruct.ResYprimeHisto);
1410  sumContainer.sumNormYResiduals_->Add(histStruct.NormResYprimeHisto);
1411  }
1412  }
1413  } else if( subtype == align::AlignableDet && subcompSize > 1) { // fixed: was aliSize before
1414  // special case II: Fill summary histos for dets with two detunits
1415  for(uint k = 0; k < aliSize; ++k) {
1416  for(uint j = 0; j < subcompSize; ++j) { // assumes all have same size (as binning does)
1417  DetId detid = ali.components()[k]->components()[j]->id();
1418  ModuleHistos &histStruct = this->getHistStructFromMap(detid);
1419  this->summarizeBinInContainer(2*k+j+1, detid.subdetId() ,sumContainer, histStruct );
1420  sumContainer.sumXResiduals_->Add( histStruct.ResXprimeHisto);
1421  sumContainer.sumNormXResiduals_->Add( histStruct.NormResXprimeHisto);
1422  if( this->isPixel(detid.subdetId()) || stripYResiduals_ ) {
1423  sumContainer.sumYResiduals_->Add( histStruct.ResYprimeHisto);
1424  sumContainer.sumNormYResiduals_->Add( histStruct.NormResYprimeHisto);
1425  }
1426  }
1427  }
1428  }
1429  return sumContainer;
1430 }
1431 
1432 
1433 float
1435 {
1436  float max = hist->GetMaximum();
1437  int left = -1, right = -1;
1438  for(unsigned int i = 1, iEnd = hist->GetNbinsX(); i <= iEnd; ++i) {
1439  if(hist->GetBinContent(i) < max/2. && hist->GetBinContent(i+1) > max/2. && left == -1) {
1440  if(max/2. - hist->GetBinContent(i) < hist->GetBinContent(i+1) - max/2.) {
1441  left = i;
1442  ++i;
1443  } else {
1444  left = i+1;
1445  ++i;
1446  }
1447  }
1448  if(left != -1 && right == -1) {
1449  if(hist->GetBinContent(i) > max/2. && hist->GetBinContent(i+1) < max/2.) {
1450  if( hist->GetBinContent(i) - max/2. < max/2. - hist->GetBinContent(i+1)) {
1451  right = i;
1452  } else {
1453  right = i+1;
1454  }
1455 
1456  }
1457  }
1458  }
1459  return hist->GetXaxis()->GetBinCenter(right) - hist->GetXaxis()->GetBinCenter(left);
1460 }
1461 
1462 
1463 void
1465  const std::map<int, TrackerOfflineValidation::ModuleHistos>& moduleHist_,
1466  TkOffTreeVariables &treeMem, const TrackerGeometry& tkgeom, const TrackerTopology* tTopo)
1467 {
1468 
1469  for(std::map<int, TrackerOfflineValidation::ModuleHistos>::const_iterator it = moduleHist_.begin(),
1470  itEnd= moduleHist_.end(); it != itEnd;++it ) {
1471  treeMem.clear(); // make empty/default
1472 
1473  //variables concerning the tracker components/hierarchy levels
1474  DetId detId_ = it->first;
1475  treeMem.moduleId = detId_;
1476  treeMem.subDetId = detId_.subdetId();
1477  treeMem.isDoubleSide =0;
1478 
1479  if(treeMem.subDetId == PixelSubdetector::PixelBarrel){
1480  unsigned int whichHalfBarrel(1), rawId(detId_.rawId()); //DetId does not know about halfBarrels is PXB ...
1481  if( (rawId>=302056964 && rawId<302059300) || (rawId>=302123268 && rawId<302127140) ||
1482  (rawId>=302189572 && rawId<302194980) ) whichHalfBarrel=2;
1483  treeMem.layer = tTopo->pxbLayer(detId_);
1484  treeMem.half = whichHalfBarrel;
1485  treeMem.rod = tTopo->pxbLadder(detId_); // ... so, ladder is not per halfBarrel-Layer, but per barrel-layer!
1486  treeMem.module = tTopo->pxbModule(detId_);
1487  } else if(treeMem.subDetId == PixelSubdetector::PixelEndcap){
1488  unsigned int whichHalfCylinder(1), rawId(detId_.rawId()); //DetId does not kmow about halfCylinders in PXF
1489  if( (rawId>=352394500 && rawId<352406032) || (rawId>=352460036 && rawId<352471568) ||
1490  (rawId>=344005892 && rawId<344017424) || (rawId>=344071428 && rawId<344082960) ) whichHalfCylinder=2;
1491  treeMem.layer = tTopo->pxfDisk(detId_);
1492  treeMem.side = tTopo->pxfSide(detId_);
1493  treeMem.half = whichHalfCylinder;
1494  treeMem.blade = tTopo->pxfBlade(detId_);
1495  treeMem.panel = tTopo->pxfPanel(detId_);
1496  treeMem.module = tTopo->pxfModule(detId_);
1497  } else if(treeMem.subDetId == StripSubdetector::TIB){
1498  unsigned int whichHalfShell(1), rawId(detId_.rawId()); //DetId does not kmow about halfShells in TIB
1499  if ( (rawId>=369120484 && rawId<369120688) || (rawId>=369121540 && rawId<369121776) ||
1500  (rawId>=369136932 && rawId<369137200) || (rawId>=369137988 && rawId<369138288) ||
1501  (rawId>=369153396 && rawId<369153744) || (rawId>=369154436 && rawId<369154800) ||
1502  (rawId>=369169844 && rawId<369170256) || (rawId>=369170900 && rawId<369171344) ||
1503  (rawId>=369124580 && rawId<369124784) || (rawId>=369125636 && rawId<369125872) ||
1504  (rawId>=369141028 && rawId<369141296) || (rawId>=369142084 && rawId<369142384) ||
1505  (rawId>=369157492 && rawId<369157840) || (rawId>=369158532 && rawId<369158896) ||
1506  (rawId>=369173940 && rawId<369174352) || (rawId>=369174996 && rawId<369175440) ) whichHalfShell=2;
1507  treeMem.layer = tTopo->tibLayer(detId_);
1508  treeMem.side = tTopo->tibStringInfo(detId_)[0];
1509  treeMem.half = whichHalfShell;
1510  treeMem.rod = tTopo->tibStringInfo(detId_)[2];
1511  treeMem.outerInner = tTopo->tibStringInfo(detId_)[1];
1512  treeMem.module = tTopo->tibModule(detId_);
1513  treeMem.isStereo = tTopo->tibStereo(detId_);
1514  treeMem.isDoubleSide = tTopo->tibIsDoubleSide(detId_);
1515  } else if(treeMem.subDetId == StripSubdetector::TID){
1516  treeMem.layer = tTopo->tidWheel(detId_);
1517  treeMem.side = tTopo->tidSide(detId_);
1518  treeMem.ring = tTopo->tidRing(detId_);
1519  treeMem.outerInner = tTopo->tidModuleInfo(detId_)[0];
1520  treeMem.module = tTopo->tidModuleInfo(detId_)[1];
1521  treeMem.isStereo = tTopo->tidStereo(detId_);
1522  treeMem.isDoubleSide = tTopo->tidIsDoubleSide(detId_);
1523  } else if(treeMem.subDetId == StripSubdetector::TOB){
1524  treeMem.layer = tTopo->tobLayer(detId_);
1525  treeMem.side = tTopo->tobRodInfo(detId_)[0];
1526  treeMem.rod = tTopo->tobRodInfo(detId_)[1];
1527  treeMem.module = tTopo->tobModule(detId_);
1528  treeMem.isStereo = tTopo->tobStereo(detId_);
1529  treeMem.isDoubleSide = tTopo->tobIsDoubleSide(detId_);
1530  } else if(treeMem.subDetId == StripSubdetector::TEC) {
1531  treeMem.layer = tTopo->tecWheel(detId_);
1532  treeMem.side = tTopo->tecSide(detId_);
1533  treeMem.ring = tTopo->tecRing(detId_);
1534  treeMem.petal = tTopo->tecPetalInfo(detId_)[1];
1535  treeMem.outerInner = tTopo->tecPetalInfo(detId_)[0];
1536  treeMem.module = tTopo->tecModule(detId_);
1537  treeMem.isStereo = tTopo->tecStereo(detId_);
1538  treeMem.isDoubleSide = tTopo->tecIsDoubleSide(detId_);
1539  }
1540 
1541  //variables concerning the tracker geometry
1542  const Surface::PositionType &gPModule = tkgeom.idToDet(detId_)->position();
1543  treeMem.posPhi = gPModule.phi();
1544  treeMem.posEta = gPModule.eta();
1545  treeMem.posR = gPModule.perp();
1546  treeMem.posX = gPModule.x();
1547  treeMem.posY = gPModule.y();
1548  treeMem.posZ = gPModule.z();
1549 
1550  const Surface& surface = tkgeom.idToDet(detId_)->surface();
1551 
1552  //global Orientation of local coordinate system of dets/detUnits
1553  LocalPoint lUDirection(1.,0.,0.), lVDirection(0.,1.,0.), lWDirection(0.,0.,1.);
1554  GlobalPoint gUDirection = surface.toGlobal(lUDirection),
1555  gVDirection = surface.toGlobal(lVDirection),
1556  gWDirection = surface.toGlobal(lWDirection);
1557  double dR(999.), dPhi(999.), dZ(999.);
1559  dR = gWDirection.perp() - gPModule.perp();
1560  dPhi = deltaPhi(gUDirection.phi(),gPModule.phi());
1561  dZ = gVDirection.z() - gPModule.z();
1562  if(dZ>=0.)treeMem.rOrZDirection = 1; else treeMem.rOrZDirection = -1;
1563  }else if(treeMem.subDetId==PixelSubdetector::PixelEndcap){
1564  dR = gUDirection.perp() - gPModule.perp();
1565  dPhi = deltaPhi(gVDirection.phi(),gPModule.phi());
1566  dZ = gWDirection.z() - gPModule.z();
1567  if(dR>=0.)treeMem.rOrZDirection = 1; else treeMem.rOrZDirection = -1;
1568  }else if(treeMem.subDetId==StripSubdetector::TID || treeMem.subDetId==StripSubdetector::TEC){
1569  dR = gVDirection.perp() - gPModule.perp();
1570  dPhi = deltaPhi(gUDirection.phi(),gPModule.phi());
1571  dZ = gWDirection.z() - gPModule.z();
1572  if(dR>=0.)treeMem.rOrZDirection = 1; else treeMem.rOrZDirection = -1;
1573  }
1574  if(dR>=0.)treeMem.rDirection = 1; else treeMem.rDirection = -1;
1575  if(dPhi>=0.)treeMem.phiDirection = 1; else treeMem.phiDirection = -1;
1576  if(dZ>=0.)treeMem.zDirection = 1; else treeMem.zDirection = -1;
1577 
1578  //mean and RMS values (extracted from histograms(Xprime on module level)
1579  treeMem.entries = static_cast<UInt_t>(it->second.ResXprimeHisto->GetEntries());
1580  treeMem.meanX = it->second.ResXprimeHisto->GetMean();
1581  treeMem.rmsX = it->second.ResXprimeHisto->GetRMS();
1582  //treeMem.sigmaX = Fwhm(it->second.ResXprimeHisto)/2.355;
1583 
1584  if (useFit_) {
1585  //call fit function which returns mean and sigma from the fit
1586  //for absolute residuals
1587  std::pair<float,float> fitResult1 = this->fitResiduals(it->second.ResXprimeHisto);
1588  treeMem.fitMeanX = fitResult1.first;
1589  treeMem.fitSigmaX = fitResult1.second;
1590  //for normalized residuals
1591  std::pair<float,float> fitResult2 = this->fitResiduals(it->second.NormResXprimeHisto);
1592  treeMem.fitMeanNormX = fitResult2.first;
1593  treeMem.fitSigmaNormX = fitResult2.second;
1594  }
1595 
1596  //get median for absolute residuals
1597  treeMem.medianX = this->getMedian(it->second.ResXprimeHisto);
1598 
1599  int numberOfBins=it->second.ResXprimeHisto->GetNbinsX();
1600  treeMem.numberOfUnderflows = it->second.ResXprimeHisto->GetBinContent(0);
1601  treeMem.numberOfOverflows = it->second.ResXprimeHisto->GetBinContent(numberOfBins+1);
1602  treeMem.numberOfOutliers = it->second.ResXprimeHisto->GetBinContent(0)+it->second.ResXprimeHisto->GetBinContent(numberOfBins+1);
1603 
1604  //mean and RMS values (extracted from histograms(normalized Xprime on module level)
1605  treeMem.meanNormX = it->second.NormResXprimeHisto->GetMean();
1606  treeMem.rmsNormX = it->second.NormResXprimeHisto->GetRMS();
1607 
1608  double stats[20];
1609  it->second.NormResXprimeHisto->GetStats(stats);
1610  // GF treeMem.chi2PerDofX = stats[3]/(stats[0]-1);
1611  if (stats[0]) treeMem.chi2PerDofX = stats[3]/stats[0];
1612 
1613  treeMem.sigmaNormX = Fwhm(it->second.NormResXprimeHisto)/2.355;
1614  treeMem.histNameX = it->second.ResXprimeHisto->GetName();
1615  treeMem.histNameNormX = it->second.NormResXprimeHisto->GetName();
1616 
1617  // fill tree variables in local coordinates if set in cfg
1618  if(lCoorHistOn_) {
1619  treeMem.meanLocalX = it->second.ResHisto->GetMean();
1620  treeMem.rmsLocalX = it->second.ResHisto->GetRMS();
1621  treeMem.meanNormLocalX = it->second.NormResHisto->GetMean();
1622  treeMem.rmsNormLocalX = it->second.NormResHisto->GetRMS();
1623 
1624  treeMem.histNameLocalX = it->second.ResHisto->GetName();
1625  treeMem.histNameNormLocalX = it->second.NormResHisto->GetName();
1626  if (it->second.ResYHisto) treeMem.histNameLocalY = it->second.ResYHisto->GetName();
1627  }
1628 
1629  // mean and RMS values in local y (extracted from histograms(normalized Yprime on module level)
1630  // might exist in pixel only
1631  if (it->second.ResYprimeHisto) {//(stripYResiduals_)
1632  TH1 *h = it->second.ResYprimeHisto;
1633  treeMem.meanY = h->GetMean();
1634  treeMem.rmsY = h->GetRMS();
1635 
1636  if (useFit_) { // fit function which returns mean and sigma from the fit
1637  std::pair<float,float> fitMeanSigma = this->fitResiduals(h);
1638  treeMem.fitMeanY = fitMeanSigma.first;
1639  treeMem.fitSigmaY = fitMeanSigma.second;
1640  }
1641 
1642  //get median for absolute residuals
1643  treeMem.medianY = this->getMedian(h);
1644 
1645  treeMem.histNameY = h->GetName();
1646  }
1647  if (it->second.NormResYprimeHisto) {
1648  TH1 *h = it->second.NormResYprimeHisto;
1649  treeMem.meanNormY = h->GetMean();
1650  treeMem.rmsNormY = h->GetRMS();
1651  h->GetStats(stats); // stats buffer defined above
1652  if (stats[0]) treeMem.chi2PerDofY = stats[3]/stats[0];
1653 
1654  if (useFit_) { // fit function which returns mean and sigma from the fit
1655  std::pair<float,float> fitMeanSigma = this->fitResiduals(h);
1656  treeMem.fitMeanNormY = fitMeanSigma.first;
1657  treeMem.fitSigmaNormY = fitMeanSigma.second;
1658  }
1659  treeMem.histNameNormY = h->GetName();
1660  }
1661 
1662  if (moduleLevelProfiles_) {
1663  if (it->second.ResXvsXProfile) {
1664  TH1 *h = it->second.ResXvsXProfile;
1665  treeMem.meanResXvsX = h->GetMean();
1666  treeMem.rmsResXvsX = h->GetRMS();
1667  treeMem.profileNameResXvsX = h->GetName();
1668  }
1669  if (it->second.ResXvsYProfile) {
1670  TH1 *h = it->second.ResXvsYProfile;
1671  treeMem.meanResXvsY = h->GetMean();
1672  treeMem.rmsResXvsY = h->GetRMS();
1673  treeMem.profileNameResXvsY = h->GetName();
1674  }
1675  if (it->second.ResYvsXProfile) {
1676  TH1 *h = it->second.ResYvsXProfile;
1677  treeMem.meanResYvsX = h->GetMean();
1678  treeMem.rmsResYvsX = h->GetRMS();
1679  treeMem.profileNameResYvsX = h->GetName();
1680  }
1681  if (it->second.ResYvsYProfile) {
1682  TH1 *h = it->second.ResYvsYProfile;
1683  treeMem.meanResYvsY = h->GetMean();
1684  treeMem.rmsResYvsY = h->GetRMS();
1685  treeMem.profileNameResYvsY = h->GetName();
1686  }
1687  }
1688 
1689  tree.Fill();
1690  }
1691 }
1692 
1693 
1694 std::pair<float,float>
1696 {
1697  std::pair<float,float> fitResult(9999., 9999.);
1698  if (!hist || hist->GetEntries() < 20) return fitResult;
1699 
1700  float mean = hist->GetMean();
1701  float sigma = hist->GetRMS();
1702 
1703  try { // for < CMSSW_2_2_0 since ROOT warnings from fit are converted to exceptions
1704  // Remove the try/catch for more recent CMSSW!
1705  // first fit: two RMS around mean
1706  TF1 func("tmp", "gaus", mean - 2.*sigma, mean + 2.*sigma);
1707  if (0 == hist->Fit(&func,"QNR")) { // N: do not blow up file by storing fit!
1708  mean = func.GetParameter(1);
1709  sigma = func.GetParameter(2);
1710  // second fit: three sigma of first fit around mean of first fit
1711  func.SetRange(mean - 3.*sigma, mean + 3.*sigma);
1712  // I: integral gives more correct results if binning is too wide
1713  // L: Likelihood can treat empty bins correctly (if hist not weighted...)
1714  if (0 == hist->Fit(&func, "Q0LR")) {
1715  if (hist->GetFunction(func.GetName())) { // Take care that it is later on drawn:
1716  hist->GetFunction(func.GetName())->ResetBit(TF1::kNotDraw);
1717  }
1718  fitResult.first = func.GetParameter(1);
1719  fitResult.second = func.GetParameter(2);
1720  }
1721  }
1722  } catch (cms::Exception const & e) {
1723  edm::LogWarning("Alignment") << "@SUB=TrackerOfflineValidation::fitResiduals"
1724  << "Caught this exception during ROOT fit: "
1725  << e.what();
1726  }
1727  return fitResult;
1728 }
1729 
1730 
1731 float
1733 {
1734  float median = 999;
1735  int nbins = histo->GetNbinsX();
1736 
1737  //extract median from histogram
1738  double *x = new double[nbins];
1739  double *y = new double[nbins];
1740  for (int j = 0; j < nbins; j++) {
1741  x[j] = histo->GetBinCenter(j+1);
1742  y[j] = histo->GetBinContent(j+1);
1743  }
1744  median = TMath::Median(nbins, x, y);
1745 
1746  delete[] x; x = 0;
1747  delete [] y; y = 0;
1748 
1749  return median;
1750 
1751 }
1752 //define this as a plug-in
#define LogDebug(id)
const TrackerGeometry * bareTkGeomPtr_
virtual char const * what() const
Definition: Exception.cc:141
type
Definition: HCALResponse.h:21
GlobalPoint toGlobal(const Point2DBase< Scalar, LocalTag > lp) const
Definition: Surface.h:114
T getParameter(std::string const &) const
align::ID id() const
Return the ID of Alignable, i.e. DetId of &#39;first&#39; component GeomDet(Unit).
Definition: Alignable.h:180
int i
Definition: DBlmapReader.cc:9
bool tecIsDoubleSide(const DetId &id) const
bool tobIsDoubleSide(const DetId &id) const
std::vector< TH1 * > vDeleteObjects_
std::map< int, TrackerOfflineValidation::ModuleHistos > mPxeResiduals_
bool tibIsDoubleSide(const DetId &id) const
T perp() const
Definition: PV3DBase.h:72
void collateSummaryHists(DirectoryWrapper &tfd, const Alignable &ali, int i, std::vector< TrackerOfflineValidation::SummaryContainer > &vLevelProfiles)
unsigned int tibLayer(const DetId &id) const
std::pair< int, int > typeAndLayerFromDetId(const DetId &detId, const TrackerTopology *tTopo) const
unsigned int tidRing(const DetId &id) const
TH1 * make(const char *name, const char *title, int nBinX, double minBinX, double maxBinX)
bool isPixel(uint32_t subDetId)
std::vector< unsigned int > tidModuleInfo(const DetId &id) const
std::vector< TH1 * > vTrack2DHistos_
TH1 * bookTH1F(bool isTransient, DirectoryWrapper &tfd, const char *histName, const char *histTitle, int nBinsX, double lowX, double highX)
std::map< int, TrackerOfflineValidation::ModuleHistos > mTecResiduals_
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
unsigned int pxfDisk(const DetId &id) const
container to hold data to be written into TTree
std::string profileNameResXvsX
unsigned int tecRing(const DetId &id) const
ring id
uint32_t tobStereo(const DetId &id) const
Geom::Phi< T > phi() const
Definition: PV3DBase.h:69
unsigned int pxbLadder(const DetId &id) const
edm::ESHandle< TrackerGeometry > tkGeom_
T y() const
Definition: PV3DBase.h:63
int GetIndex(const std::vector< OBJECT_TYPE * > &vec, const TString &name)
unsigned int tidWheel(const DetId &id) const
unsigned int pxbModule(const DetId &id) const
T * make(const Args &...args) const
make new ROOT object
Definition: TFileService.h:64
void fillTree(TTree &tree, const std::map< int, TrackerOfflineValidation::ModuleHistos > &moduleHist_, TkOffTreeVariables &treeMem, const TrackerGeometry &tkgeom, const TrackerTopology *tTopo)
float getMedian(const TH1 *hist) const
#define nullptr
ModuleHistos & getHistStructFromMap(const DetId &detid)
void setSummaryBin(int bin, TH1 *targetHist, TH1 *sourceHist)
std::vector< unsigned int > tibStringInfo(const DetId &id) const
virtual Alignables components() const =0
Return vector of all direct components.
std::map< int, TrackerOfflineValidation::ModuleHistos > mTibResiduals_
TrackerOfflineValidation::SummaryContainer bookSummaryHists(DirectoryWrapper &tfd, const Alignable &ali, align::StructureType type, int i)
const Plane & surface() const
The nominal surface of the GeomDet.
Definition: GeomDet.h:40
std::string profileNameResYvsX
std::map< int, TrackerOfflineValidation::ModuleHistos > mTidResiduals_
uint32_t rawId() const
get the raw id
Definition: DetId.h:43
virtual const DetIdContainer & detIds() const
Returm a vector of all GeomDet DetIds (including those of GeomDetUnits)
TFileDirectory & tFileDirectory()
Definition: TFileService.h:42
int iEvent
Definition: GenABIO.cc:230
std::vector< unsigned int > tecPetalInfo(const DetId &id) const
const Surface::PositionType & position() const
The position (origin of the R.F.)
Definition: GeomDet.h:46
unsigned int tidSide(const DetId &id) const
double dPhi(double phi1, double phi2)
Definition: JetUtil.h:30
uint32_t tidStereo(const DetId &id) const
void getBinning(uint32_t subDetId, TrackerOfflineValidation::HistogrammType residualtype, int &nBinsX, double &lowerBoundX, double &upperBoundX)
std::vector< unsigned int > tobRodInfo(const DetId &id) const
unsigned int subDetId[18]
T z() const
Definition: PV3DBase.h:64
tuple result
Definition: query.py:137
Tan< T >::type tan(const T &t)
Definition: Tan.h:22
virtual StructureType alignableObjectId() const =0
Return the alignable type identifier.
int j
Definition: DBlmapReader.cc:9
virtual void checkBookHists(const edm::EventSetup &setup)
TProfile * bookTProfile(bool isTransient, DirectoryWrapper &tfd, const char *histName, const char *histTitle, int nBinsX, double lowX, double highX)
double f[11][100]
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
Definition: Activities.doc:4
int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:37
std::string histNameLocalY
std::string histNameNormLocalX
unsigned int tibModule(const DetId &id) const
unsigned int pxfModule(const DetId &id) const
bool isDetOrDetUnit(align::StructureType type)
std::map< int, TrackerOfflineValidation::ModuleHistos > mTobResiduals_
unsigned int pxbLayer(const DetId &id) const
unsigned int tecModule(const DetId &id) const
DirectoryWrapper(const std::string &newDir, const std::string &basedir, bool useDqmMode)
Definition: DetId.h:18
TFileDirectory mkdir(const std::string &dir, const std::string &descr="")
create a new subdirectory
Definition: TFileService.h:69
std::pair< float, float > fitResiduals(TH1 *hist) const
std::string histNameLocalX
const T & get() const
Definition: EventSetup.h:55
bool tidIsDoubleSide(const DetId &id) const
T const * product() const
Definition: ESHandle.h:86
void summarizeBinInContainer(int bin, SummaryContainer &targetContainer, SummaryContainer &sourceContainer)
void fillTrackQuantities(const edm::Event &, std::vector< AVTrackStruct > &v_avtrackout)
bool isEndCap(uint32_t subDetId)
unsigned int tobModule(const DetId &id) const
std::string profileNameResXvsY
T eta() const
Definition: PV3DBase.h:76
void clear()
set to empty values
void bookGlobalHists(DirectoryWrapper &tfd)
DirectoryWrapper(const DirectoryWrapper &upDir, const std::string &newDir, const std::string &basedir, bool useDqmMode)
uint32_t tecStereo(const DetId &id) const
virtual const DetIdContainer & detUnitIds() const
Returm a vector of all GeomDetUnit DetIds.
std::vector< TH1 * > vTrackProfiles_
unsigned int pxfSide(const DetId &id) const
void bookDirHists(DirectoryWrapper &tfd, const Alignable &ali, const TrackerTopology *tTopo)
Definition: DDAxes.h:10
static const char * idToString(align::StructureType type)
std::map< int, TrackerOfflineValidation::ModuleHistos > mPxbResiduals_
uint32_t tibStereo(const DetId &id) const
Detector det() const
get the detector field from this detid
Definition: DetId.h:35
const edm::ParameterSet parSet_
TrackerOfflineValidation(const edm::ParameterSet &)
T x() const
Definition: PV3DBase.h:62
float Fwhm(const TH1 *hist) const
unsigned int tecWheel(const DetId &id) const
void setup(std::vector< TH2F > &depth, std::string name, std::string units="")
tuple size
Write out results.
const edm::EventSetup * lastSetup_
unsigned int pxfPanel(const DetId &id) const
unsigned int pxfBlade(const DetId &id) const
virtual void analyze(const edm::Event &, const edm::EventSetup &) override
std::string profileNameResYvsY
unsigned int tobLayer(const DetId &id) const
void bookHists(DirectoryWrapper &tfd, const Alignable &ali, const TrackerTopology *tTopo, align::StructureType type, int i)
unsigned int tecSide(const DetId &id) const
virtual const TrackerGeomDet * idToDet(DetId) const
bool isBarrel(uint32_t subDetId)