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 
465  vTrackProfiles_.push_back(tfd.make<TProfile>("p_d0_vs_phi",
466  "Transverse Impact Parameter vs. #phi;#phi_{Track};#LT d_{0} #GT [cm]",
467  100,-3.15,3.15));
468  vTrackProfiles_.push_back(tfd.make<TProfile>("p_dz_vs_phi",
469  "Longitudinal Impact Parameter vs. #phi;#phi_{Track};#LT d_{z} #GT [cm]",
470  100,-3.15,3.15));
471  vTrackProfiles_.push_back(tfd.make<TProfile>("p_d0_vs_eta",
472  "Transverse Impact Parameter vs. #eta;#eta_{Track};#LT d_{0} #GT [cm]",
473  100,-3.15,3.15));
474  vTrackProfiles_.push_back(tfd.make<TProfile>("p_dz_vs_eta",
475  "Longitudinal Impact Parameter vs. #eta;#eta_{Track};#LT d_{z} #GT [cm]",
476  100,-3.15,3.15));
477  vTrackProfiles_.push_back(tfd.make<TProfile>("p_chi2_vs_phi",
478  "#chi^{2} vs. #phi;#phi_{Track};#LT #chi^{2} #GT",
479  100,-3.15,3.15));
480  vTrackProfiles_.push_back(tfd.make<TProfile>("p_chi2Prob_vs_phi",
481  "#chi^{2} probablility vs. #phi;#phi_{Track};#LT #chi^{2} probability#GT",
482  100,-3.15,3.15));
483  vTrackProfiles_.push_back(tfd.make<TProfile>("p_chi2Prob_vs_d0",
484  "#chi^{2} probablility vs. |d_{0}|;|d_{0}|[cm];#LT #chi^{2} probability#GT",
485  100,0,80));
486  vTrackProfiles_.push_back(tfd.make<TProfile>("p_normchi2_vs_phi",
487  "#chi^{2}/ndof vs. #phi;#phi_{Track};#LT #chi^{2}/ndof #GT",
488  100,-3.15,3.15));
489  vTrackProfiles_.push_back(tfd.make<TProfile>("p_chi2_vs_eta",
490  "#chi^{2} vs. #eta;#eta_{Track};#LT #chi^{2} #GT",
491  100,-3.15,3.15));
492  //variable binning for chi2/ndof vs. pT
493  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.};
494  vTrackProfiles_.push_back(tfd.make<TProfile>("p_normchi2_vs_pt",
495  "norm #chi^{2} vs. p_{T}_{Track}; p_{T}_{Track};#LT #chi^{2}/ndof #GT",
496  18,xBins));
497 
498  vTrackProfiles_.push_back(tfd.make<TProfile>("p_normchi2_vs_p",
499  "#chi^{2}/ndof vs. p_{Track};p_{Track};#LT #chi^{2}/ndof #GT",
500  18,xBins));
501  vTrackProfiles_.push_back(tfd.make<TProfile>("p_chi2Prob_vs_eta",
502  "#chi^{2} probability vs. #eta;#eta_{Track};#LT #chi^{2} probability #GT",
503  100,-3.15,3.15));
504  vTrackProfiles_.push_back(tfd.make<TProfile>("p_normchi2_vs_eta",
505  "#chi^{2}/ndof vs. #eta;#eta_{Track};#LT #chi^{2}/ndof #GT",
506  100,-3.15,3.15));
507  vTrackProfiles_.push_back(tfd.make<TProfile>("p_kappa_vs_phi",
508  "#kappa vs. #phi;#phi_{Track};#kappa",
509  100,-3.15,3.15));
510  vTrackProfiles_.push_back(tfd.make<TProfile>("p_kappa_vs_eta",
511  "#kappa vs. #eta;#eta_{Track};#kappa",
512  100,-3.15,3.15));
513  vTrackProfiles_.push_back(tfd.make<TProfile>("p_ptResolution_vs_phi",
514  "#delta_{p_{T}}/p_{T}^{track};#phi^{track};#delta_{p_{T}}/p_{T}^{track}",
515  100, -3.15,3.15));
516  vTrackProfiles_.push_back(tfd.make<TProfile>("p_ptResolution_vs_eta",
517  "#delta_{p_{T}}/p_{T}^{track};#eta^{track};#delta_{p_{T}}/p_{T}^{track}",
518  100, -3.15,3.15));
519 
520  vTrack2DHistos_.push_back(tfd.make<TH2F>("h2_d0_vs_phi",
521  "Transverse Impact Parameter vs. #phi;#phi_{Track};d_{0} [cm]",
522  100, -3.15, 3.15, 100,-1.,1.) );
523  vTrack2DHistos_.push_back(tfd.make<TH2F>("h2_dz_vs_phi",
524  "Longitudinal Impact Parameter vs. #phi;#phi_{Track};d_{z} [cm]",
525  100, -3.15, 3.15, 100,-100.,100.));
526  vTrack2DHistos_.push_back(tfd.make<TH2F>("h2_d0_vs_eta",
527  "Transverse Impact Parameter vs. #eta;#eta_{Track};d_{0} [cm]",
528  100, -3.15, 3.15, 100,-1.,1.));
529  vTrack2DHistos_.push_back(tfd.make<TH2F>("h2_dz_vs_eta",
530  "Longitudinal Impact Parameter vs. #eta;#eta_{Track};d_{z} [cm]",
531  100, -3.15, 3.15, 100,-100.,100.));
532  vTrack2DHistos_.push_back(tfd.make<TH2F>("h2_chi2_vs_phi",
533  "#chi^{2} vs. #phi;#phi_{Track};#chi^{2}",
534  100, -3.15, 3.15, 500, 0., 500.));
535  vTrack2DHistos_.push_back(tfd.make<TH2F>("h2_chi2Prob_vs_phi",
536  "#chi^{2} probability vs. #phi;#phi_{Track};#chi^{2} probability",
537  100, -3.15, 3.15, 100, 0., 1.));
538  vTrack2DHistos_.push_back(tfd.make<TH2F>("h2_chi2Prob_vs_d0",
539  "#chi^{2} probability vs. |d_{0}|;|d_{0}| [cm];#chi^{2} probability",
540  100, 0, 80, 100, 0., 1.));
541  vTrack2DHistos_.push_back(tfd.make<TH2F>("h2_normchi2_vs_phi",
542  "#chi^{2}/ndof vs. #phi;#phi_{Track};#chi^{2}/ndof",
543  100, -3.15, 3.15, 100, 0., 10.));
544  vTrack2DHistos_.push_back(tfd.make<TH2F>("h2_chi2_vs_eta",
545  "#chi^{2} vs. #eta;#eta_{Track};#chi^{2}",
546  100, -3.15, 3.15, 500, 0., 500.));
547  vTrack2DHistos_.push_back(tfd.make<TH2F>("h2_chi2Prob_vs_eta",
548  "#chi^{2} probaility vs. #eta;#eta_{Track};#chi^{2} probability",
549  100, -3.15, 3.15, 100, 0., 1.));
550  vTrack2DHistos_.push_back(tfd.make<TH2F>("h2_normchi2_vs_eta",
551  "#chi^{2}/ndof vs. #eta;#eta_{Track};#chi^{2}/ndof",
552  100,-3.15,3.15, 100, 0., 10.));
553  vTrack2DHistos_.push_back(tfd.make<TH2F>("h2_kappa_vs_phi",
554  "#kappa vs. #phi;#phi_{Track};#kappa",
555  100,-3.15,3.15, 100, .0,.05));
556  vTrack2DHistos_.push_back(tfd.make<TH2F>("h2_kappa_vs_eta",
557  "#kappa vs. #eta;#eta_{Track};#kappa",
558  100,-3.15,3.15, 100, .0,.05));
559  vTrack2DHistos_.push_back(tfd.make<TH2F>("h2_normchi2_vs_kappa",
560  "#kappa vs. #chi^{2}/ndof;#chi^{2}/ndof;#kappa",
561  100,0.,10, 100,-.03,.03));
562 
563  /****************** Definition of 2-D Histos of ResX vs momenta ****************************/
564  vTrack2DHistos_.push_back(tfd.make<TH2F>("p_vs_resXprime_pixB",
565  "#momentum vs. #resX in pixB;#momentum;#resX",
566  15,0.,15., 200, -0.1,0.1));
567  vTrack2DHistos_.push_back(tfd.make<TH2F>("p_vs_resXprime_pixE",
568  "#momentum vs. #resX in pixE;#momentum;#resX",
569  15,0.,15., 200, -0.1,0.1));
570  vTrack2DHistos_.push_back(tfd.make<TH2F>("p_vs_resXprime_TIB",
571  "#momentum vs. #resX in TIB;#momentum;#resX",
572  15,0.,15., 200, -0.1,0.1));
573  vTrack2DHistos_.push_back(tfd.make<TH2F>("p_vs_resXprime_TID",
574  "#momentum vs. #resX in TID;#momentum;#resX",
575  15,0.,15., 200, -0.1,0.1));
576  vTrack2DHistos_.push_back(tfd.make<TH2F>("p_vs_resXprime_TOB",
577  "#momentum vs. #resX in TOB;#momentum;#resX",
578  15,0.,15., 200, -0.1,0.1));
579  vTrack2DHistos_.push_back(tfd.make<TH2F>("p_vs_resXprime_TEC",
580  "#momentum vs. #resX in TEC;#momentum;#resX",
581  15,0.,15., 200, -0.1,0.1));
582 
583  /****************** Definition of 2-D Histos of ResY vs momenta ****************************/
584  vTrack2DHistos_.push_back(tfd.make<TH2F>("p_vs_resYprime_pixB",
585  "#momentum vs. #resY in pixB;#momentum;#resY",
586  15,0.,15., 200, -0.1,0.1));
587  vTrack2DHistos_.push_back(tfd.make<TH2F>("p_vs_resYprime_pixE",
588  "#momentum vs. #resY in pixE;#momentum;#resY",
589  15,0.,15., 200, -0.1,0.1));
590 
591 }
592 
593 
594 void
596 {
597  std::vector<Alignable*> alivec(ali.components());
598  for(int i=0, iEnd = ali.components().size();i < iEnd; ++i) {
599  std::string structurename = AlignableObjectId::idToString((alivec)[i]->alignableObjectId());
600  LogDebug("TrackerOfflineValidation") << "StructureName = " << structurename;
601  std::stringstream dirname;
602  dirname << structurename;
603  // add no suffix counter to Strip and Pixel, just aesthetics
604  if (structurename != "Strip" && structurename != "Pixel") dirname << "_" << i+1;
605 
606  if (structurename.find("Endcap",0) != std::string::npos ) {
607  DirectoryWrapper f(tfd,dirname.str(),moduleDirectory_,dqmMode_);
608  bookHists(f, *(alivec)[i], tTopo, ali.alignableObjectId() , i);
609  bookDirHists( f, *(alivec)[i], tTopo);
610  } else if( !(this->isDetOrDetUnit( (alivec)[i]->alignableObjectId()) )
611  || alivec[i]->components().size() > 1) {
612  DirectoryWrapper f(tfd,dirname.str(),moduleDirectory_,dqmMode_);
613  bookHists(tfd, *(alivec)[i], tTopo, ali.alignableObjectId() , i);
614  bookDirHists( f, *(alivec)[i], tTopo);
615  } else {
616  bookHists(tfd, *(alivec)[i], tTopo, ali.alignableObjectId() , i);
617  }
618  }
619 }
620 
621 
622 void
624 {
625  TrackerAlignableId aliid;
626  const DetId id = ali.id();
627 
628  // comparing subdetandlayer to subdetIds gives a warning at compile time
629  // -> subdetandlayer could also be pair<uint,uint> but this has to be adapted
630  // in AlignableObjId
631  std::pair<int,int> subdetandlayer = aliid.typeAndLayerFromDetId(id, tTopo);
632 
634 
635  // are we on or just above det, detunit level respectively?
636  if (type == align::AlignableDetUnit )subtype = type;
637  else if( this->isDetOrDetUnit(ali.alignableObjectId()) ) subtype = ali.alignableObjectId();
638 
639  // construct histogramm title and name
640  std::stringstream histoname, histotitle, normhistoname, normhistotitle,
641  yhistoname, yhistotitle,
642  xprimehistoname, xprimehistotitle, normxprimehistoname, normxprimehistotitle,
643  yprimehistoname, yprimehistotitle, normyprimehistoname, normyprimehistotitle,
644  localxname, localxtitle, localyname, localytitle,
645  resxvsxprofilename, resxvsxprofiletitle, resyvsxprofilename, resyvsxprofiletitle,
646  resxvsyprofilename, resxvsyprofiletitle, resyvsyprofilename, resyvsyprofiletitle;
647 
648  std::string wheel_or_layer;
649 
650  if( this->isEndCap(static_cast<uint32_t>(subdetandlayer.first)) ) wheel_or_layer = "_wheel_";
651  else if ( this->isBarrel(static_cast<uint32_t>(subdetandlayer.first)) ) wheel_or_layer = "_layer_";
652  else edm::LogWarning("TrackerOfflineValidation") << "@SUB=TrackerOfflineValidation::bookHists"
653  << "Unknown subdetid: " << subdetandlayer.first;
654 
655  histoname << "h_residuals_subdet_" << subdetandlayer.first
656  << wheel_or_layer << subdetandlayer.second << "_module_" << id.rawId();
657  yhistoname << "h_y_residuals_subdet_" << subdetandlayer.first
658  << wheel_or_layer << subdetandlayer.second << "_module_" << id.rawId();
659  xprimehistoname << "h_xprime_residuals_subdet_" << subdetandlayer.first
660  << wheel_or_layer << subdetandlayer.second << "_module_" << id.rawId();
661  yprimehistoname << "h_yprime_residuals_subdet_" << subdetandlayer.first
662  << wheel_or_layer << subdetandlayer.second << "_module_" << id.rawId();
663  normhistoname << "h_normresiduals_subdet_" << subdetandlayer.first
664  << wheel_or_layer << subdetandlayer.second << "_module_" << id.rawId();
665  normxprimehistoname << "h_normxprimeresiduals_subdet_" << subdetandlayer.first
666  << wheel_or_layer << subdetandlayer.second << "_module_" << id.rawId();
667  normyprimehistoname << "h_normyprimeresiduals_subdet_" << subdetandlayer.first
668  << wheel_or_layer << subdetandlayer.second << "_module_" << id.rawId();
669  histotitle << "X Residual for module " << id.rawId() << ";x_{tr} - x_{hit} [cm]";
670  yhistotitle << "Y Residual for module " << id.rawId() << ";y_{tr} - y_{hit} [cm]";
671  normhistotitle << "Normalized Residual for module " << id.rawId() << ";x_{tr} - x_{hit}/#sigma";
672  xprimehistotitle << "X' Residual for module " << id.rawId() << ";(x_{tr} - x_{hit})' [cm]";
673  normxprimehistotitle << "Normalized X' Residual for module " << id.rawId() << ";(x_{tr} - x_{hit})'/#sigma";
674  yprimehistotitle << "Y' Residual for module " << id.rawId() << ";(y_{tr} - y_{hit})' [cm]";
675  normyprimehistotitle << "Normalized Y' Residual for module " << id.rawId() << ";(y_{tr} - y_{hit})'/#sigma";
676 
677  if ( moduleLevelProfiles_ ) {
678  localxname << "h_localx_subdet_" << subdetandlayer.first
679  << wheel_or_layer << subdetandlayer.second << "_module_" << id.rawId();
680  localyname << "h_localy_subdet_" << subdetandlayer.first
681  << wheel_or_layer << subdetandlayer.second << "_module_" << id.rawId();
682  localxtitle << "u local for module " << id.rawId() << "; u_{tr,r}";
683  localytitle << "v local for module " << id.rawId() << "; v_{tr,r}";
684 
685  resxvsxprofilename << "p_residuals_x_vs_x_subdet_" << subdetandlayer.first
686  << wheel_or_layer << subdetandlayer.second << "_module_" << id.rawId();
687  resyvsxprofilename << "p_residuals_y_vs_x_subdet_" << subdetandlayer.first
688  << wheel_or_layer << subdetandlayer.second << "_module_" << id.rawId();
689  resxvsyprofilename << "p_residuals_x_vs_y_subdet_" << subdetandlayer.first
690  << wheel_or_layer << subdetandlayer.second << "_module_" << id.rawId();
691  resyvsyprofilename << "p_residuals_y_vs_y_subdet_" << subdetandlayer.first
692  << wheel_or_layer << subdetandlayer.second << "_module_" << id.rawId();
693  resxvsxprofiletitle << "U Residual vs u for module " << id.rawId() << "; u_{tr,r} ;(u_{tr} - u_{hit})/tan#alpha [cm]";
694  resyvsxprofiletitle << "V Residual vs u for module " << id.rawId() << "; u_{tr,r} ;(v_{tr} - v_{hit})/tan#beta [cm]";
695  resxvsyprofiletitle << "U Residual vs v for module " << id.rawId() << "; v_{tr,r} ;(u_{tr} - u_{hit})/tan#alpha [cm]";
696  resyvsyprofiletitle << "V Residual vs v for module " << id.rawId() << "; v_{tr,r} ;(v_{tr} - v_{hit})/tan#beta [cm]";
697  }
698 
699  if( this->isDetOrDetUnit( subtype ) ) {
700  ModuleHistos &histStruct = this->getHistStructFromMap(id);
701  int nbins = 0;
702  double xmin = 0., xmax = 0.;
703  double ymin = -0.1, ymax = 0.1;
704 
705  // do not allow transient hists in DQM mode
706  bool moduleLevelHistsTransient(moduleLevelHistsTransient_);
707  if (dqmMode_) moduleLevelHistsTransient = false;
708 
709  // decide via cfg if hists in local coordinates should be booked
710  if(lCoorHistOn_) {
711  this->getBinning(id.subdetId(), XResidual, nbins, xmin, xmax);
712  histStruct.ResHisto = this->bookTH1F(moduleLevelHistsTransient, tfd,
713  histoname.str().c_str(),histotitle.str().c_str(),
714  nbins, xmin, xmax);
715  this->getBinning(id.subdetId(), NormXResidual, nbins, xmin, xmax);
716  histStruct.NormResHisto = this->bookTH1F(moduleLevelHistsTransient, tfd,
717  normhistoname.str().c_str(),normhistotitle.str().c_str(),
718  nbins, xmin, xmax);
719  }
720  this->getBinning(id.subdetId(), XprimeResidual, nbins, xmin, xmax);
721  histStruct.ResXprimeHisto = this->bookTH1F(moduleLevelHistsTransient, tfd,
722  xprimehistoname.str().c_str(),xprimehistotitle.str().c_str(),
723  nbins, xmin, xmax);
724  this->getBinning(id.subdetId(), NormXprimeResidual, nbins, xmin, xmax);
725  histStruct.NormResXprimeHisto = this->bookTH1F(moduleLevelHistsTransient, tfd,
726  normxprimehistoname.str().c_str(),normxprimehistotitle.str().c_str(),
727  nbins, xmin, xmax);
728 
729  if ( moduleLevelProfiles_ ) {
730  this->getBinning(id.subdetId(), XResidualProfile, nbins, xmin, xmax);
731 
732  histStruct.LocalX = this->bookTH1F(moduleLevelHistsTransient, tfd,
733  localxname.str().c_str(),localxtitle.str().c_str(),
734  nbins, xmin, xmax);
735  histStruct.LocalY = this->bookTH1F(moduleLevelHistsTransient, tfd,
736  localyname.str().c_str(),localytitle.str().c_str(),
737  nbins, xmin, xmax);
738  histStruct.ResXvsXProfile = this->bookTProfile(moduleLevelHistsTransient, tfd,
739  resxvsxprofilename.str().c_str(),resxvsxprofiletitle.str().c_str(),
740  nbins, xmin, xmax, ymin, ymax);
741  histStruct.ResXvsXProfile->Sumw2(); // to be filled with weights, so uncertainties need sum of square of weights
742  histStruct.ResXvsYProfile = this->bookTProfile(moduleLevelHistsTransient, tfd,
743  resxvsyprofilename.str().c_str(),resxvsyprofiletitle.str().c_str(),
744  nbins, xmin, xmax, ymin, ymax);
745  histStruct.ResXvsYProfile->Sumw2(); // to be filled with weights, so uncertainties need sum of square of weights
746  }
747 
748  if( this->isPixel(subdetandlayer.first) || stripYResiduals_ ) {
749  this->getBinning(id.subdetId(), YprimeResidual, nbins, xmin, xmax);
750  histStruct.ResYprimeHisto = this->bookTH1F(moduleLevelHistsTransient, tfd,
751  yprimehistoname.str().c_str(),yprimehistotitle.str().c_str(),
752  nbins, xmin, xmax);
753  if (lCoorHistOn_) { // un-primed y-residual
754  this->getBinning(id.subdetId(), YResidual, nbins, xmin, xmax);
755  histStruct.ResYHisto = this->bookTH1F(moduleLevelHistsTransient, tfd,
756  yhistoname.str().c_str(), yhistotitle.str().c_str(),
757  nbins, xmin, xmax);
758  }
759  this->getBinning(id.subdetId(), NormYprimeResidual, nbins, xmin, xmax);
760  histStruct.NormResYprimeHisto = this->bookTH1F(moduleLevelHistsTransient, tfd,
761  normyprimehistoname.str().c_str(),normyprimehistotitle.str().c_str(),
762  nbins, xmin, xmax);
763  // Here we could add un-primed normalised y-residuals if(lCoorHistOn_)...
764  if ( moduleLevelProfiles_ ) {
765  this->getBinning(id.subdetId(), YResidualProfile, nbins, xmin, xmax);
766 
767  histStruct.ResYvsXProfile = this->bookTProfile(moduleLevelHistsTransient, tfd,
768  resyvsxprofilename.str().c_str(),resyvsxprofiletitle.str().c_str(),
769  nbins, xmin, xmax, ymin, ymax);
770  histStruct.ResYvsXProfile->Sumw2(); // to be filled with weights, so uncertainties need sum of square of weights
771  histStruct.ResYvsYProfile = this->bookTProfile(moduleLevelHistsTransient, tfd,
772  resyvsyprofilename.str().c_str(),resyvsyprofiletitle.str().c_str(),
773  nbins, xmin, xmax, ymin, ymax);
774  histStruct.ResYvsYProfile->Sumw2(); // to be filled with weights, so uncertainties need sum of square of weights
775  }
776  }
777  }
778 }
779 
780 
781 TH1* TrackerOfflineValidation::bookTH1F(bool isTransient, DirectoryWrapper& tfd, const char* histName, const char* histTitle,
782  int nBinsX, double lowX, double highX)
783 {
784  if (isTransient) {
785  vDeleteObjects_.push_back(new TH1F(histName, histTitle, nBinsX, lowX, highX));
786  return vDeleteObjects_.back(); // return last element of vector
787  }
788  else
789  return tfd.make<TH1F>(histName, histTitle, nBinsX, lowX, highX);
790 }
791 
792 TProfile* TrackerOfflineValidation::bookTProfile(bool isTransient, DirectoryWrapper& tfd, const char* histName, const char* histTitle,
793  int nBinsX, double lowX, double highX)
794 {
795  if (isTransient) {
796  TProfile * profile = new TProfile(histName, histTitle, nBinsX, lowX, highX);
797  vDeleteObjects_.push_back(profile);
798  return profile;
799  }
800  else
801  return (TProfile*)tfd.make<TProfile>(histName, histTitle, nBinsX, lowX, highX);
802 }
803 
804 
805 TProfile* TrackerOfflineValidation::bookTProfile(bool isTransient, DirectoryWrapper& tfd, const char* histName, const char* histTitle,
806  int nBinsX, double lowX, double highX, double lowY, double highY)
807 {
808  if (isTransient) {
809  TProfile * profile = new TProfile(histName, histTitle, nBinsX, lowX, highX, lowY, highY);
810  vDeleteObjects_.push_back(profile);
811  return profile;
812  }
813  else
814  return (TProfile*)tfd.make<TProfile>(histName, histTitle, nBinsX, lowX, highX, lowY, highY);
815 }
816 
818 {
819  return (subDetId == StripSubdetector::TIB ||
820  subDetId == StripSubdetector::TOB ||
821  subDetId == PixelSubdetector::PixelBarrel );
822 }
823 
824 
826 {
827  return ( subDetId == StripSubdetector::TID ||
828  subDetId == StripSubdetector::TEC ||
829  subDetId == PixelSubdetector::PixelEndcap );
830 }
831 
832 
834 {
835  return (subDetId == PixelSubdetector::PixelBarrel ||
836  subDetId == PixelSubdetector::PixelEndcap );
837 }
838 
839 
841 {
842  return ( type == align::AlignableDet ||
843  type == align::AlignableDetUnit );
844 }
845 
846 
847 void
850  int& nBinsX, double& lowerBoundX, double& upperBoundX)
851 {
852  // determine if
853  const bool isPixel = this->isPixel(subDetId);
854 
855  edm::ParameterSet binningPSet;
856 
857  switch(residualType)
858  {
859  case XResidual :
860  if(isPixel) binningPSet = parSet_.getParameter<edm::ParameterSet>("TH1XResPixelModules");
861  else binningPSet = parSet_.getParameter<edm::ParameterSet>("TH1XResStripModules");
862  break;
863  case NormXResidual :
864  if(isPixel) binningPSet = parSet_.getParameter<edm::ParameterSet>("TH1NormXResPixelModules");
865  else binningPSet = parSet_.getParameter<edm::ParameterSet>("TH1NormXResStripModules");
866  break;
867  case XprimeResidual :
868  if(isPixel) binningPSet = parSet_.getParameter<edm::ParameterSet>("TH1XprimeResPixelModules");
869  else binningPSet = parSet_.getParameter<edm::ParameterSet>("TH1XprimeResStripModules");
870  break;
871  case NormXprimeResidual :
872  if(isPixel) binningPSet = parSet_.getParameter<edm::ParameterSet>("TH1NormXprimeResPixelModules");
873  else binningPSet = parSet_.getParameter<edm::ParameterSet>("TH1NormXprimeResStripModules");
874  break;
875  case YResidual : // borrow y-residual binning from yprime
876  case YprimeResidual :
877  if(isPixel) binningPSet = parSet_.getParameter<edm::ParameterSet>("TH1YResPixelModules");
878  else binningPSet = parSet_.getParameter<edm::ParameterSet>("TH1YResStripModules");
879  break;
880  /* case NormYResidual :*/
881  case NormYprimeResidual :
882  if(isPixel) binningPSet = parSet_.getParameter<edm::ParameterSet>("TH1NormYResPixelModules");
883  else binningPSet = parSet_.getParameter<edm::ParameterSet>("TH1NormYResStripModules");
884  break;
885  case XResidualProfile :
886  if(isPixel) binningPSet = parSet_.getParameter<edm::ParameterSet>("TProfileXResPixelModules");
887  else binningPSet = parSet_.getParameter<edm::ParameterSet>("TProfileXResStripModules");
888  break;
889  case YResidualProfile :
890  if(isPixel) binningPSet = parSet_.getParameter<edm::ParameterSet>("TProfileYResPixelModules");
891  else binningPSet = parSet_.getParameter<edm::ParameterSet>("TProfileYResStripModules");
892  break;
893  }
894  nBinsX = binningPSet.getParameter<int32_t>("Nbinx");
895  lowerBoundX = binningPSet.getParameter<double>("xmin");
896  upperBoundX = binningPSet.getParameter<double>("xmax");
897 }
898 
899 
900 void
901 TrackerOfflineValidation::setSummaryBin(int bin, TH1* targetHist, TH1* sourceHist)
902 {
903  if(targetHist && sourceHist) {
904  targetHist->SetBinContent(bin, sourceHist->GetMean(1));
905  if(useFwhm_) targetHist->SetBinError(bin, Fwhm(sourceHist)/2.);
906  else targetHist->SetBinError(bin, sourceHist->GetRMS(1) );
907  }
908  else return;
909 }
910 
911 
912 void
914  SummaryContainer& sourceContainer)
915 {
916  this->setSummaryBin(bin, targetContainer.summaryXResiduals_, sourceContainer.sumXResiduals_);
917  this->setSummaryBin(bin, targetContainer.summaryNormXResiduals_, sourceContainer.sumNormXResiduals_);
918  // If no y-residual hists, just returns:
919  this->setSummaryBin(bin, targetContainer.summaryYResiduals_, sourceContainer.sumYResiduals_);
920  this->setSummaryBin(bin, targetContainer.summaryNormYResiduals_, sourceContainer.sumNormYResiduals_);
921 }
922 
923 
924 void
926  SummaryContainer& targetContainer,
927  ModuleHistos& sourceContainer)
928 {
929  // takes two summary Containers and sets summaryBins for all histograms
930  this->setSummaryBin(bin, targetContainer.summaryXResiduals_, sourceContainer.ResXprimeHisto);
931  this->setSummaryBin(bin, targetContainer.summaryNormXResiduals_, sourceContainer.NormResXprimeHisto);
932  if( this->isPixel(subDetId) || stripYResiduals_ ) {
933  this->setSummaryBin(bin, targetContainer.summaryYResiduals_, sourceContainer.ResYprimeHisto);
934  this->setSummaryBin(bin, targetContainer.summaryNormYResiduals_, sourceContainer.NormResYprimeHisto);
935  }
936 }
937 
938 
941 {
942  // get a struct with histograms from the respective map
943  // if no object exist, the reference is automatically created by the map
944  // throw exception if non-tracker id is passed
945  uint subdetid = detid.subdetId();
946  if(subdetid == PixelSubdetector::PixelBarrel ) {
947  return mPxbResiduals_[detid.rawId()];
948  } else if (subdetid == PixelSubdetector::PixelEndcap) {
949  return mPxeResiduals_[detid.rawId()];
950  } else if(subdetid == StripSubdetector::TIB) {
951  return mTibResiduals_[detid.rawId()];
952  } else if(subdetid == StripSubdetector::TID) {
953  return mTidResiduals_[detid.rawId()];
954  } else if(subdetid == StripSubdetector::TOB) {
955  return mTobResiduals_[detid.rawId()];
956  } else if(subdetid == StripSubdetector::TEC) {
957  return mTecResiduals_[detid.rawId()];
958  } else {
959  throw cms::Exception("Geometry Error")
960  << "[TrackerOfflineValidation] Error, tried to get reference for non-tracker subdet " << subdetid
961  << " from detector " << detid.det();
962  return mPxbResiduals_[0];
963  }
964 }
965 
966 
967 // ------------ method called to for each event ------------
968 void
970 {
971  if (useOverflowForRMS_)TH1::StatOverflows(kTRUE);
972  this->checkBookHists(iSetup); // check whether hists are booked and do so if not yet done
973 
974  TrackerValidationVariables avalidator_(iSetup,parSet_);
975 
976  std::vector<TrackerValidationVariables::AVTrackStruct> vTrackstruct;
977  avalidator_.fillTrackQuantities(iEvent, vTrackstruct);
978 
979  for (std::vector<TrackerValidationVariables::AVTrackStruct>::const_iterator itT = vTrackstruct.begin();
980  itT != vTrackstruct.end();
981  ++itT) {
982 
983  // Fill 1D track histos
984  static const int etaindex = this->GetIndex(vTrackHistos_,"h_tracketa");
985  vTrackHistos_[etaindex]->Fill(itT->eta);
986  static const int phiindex = this->GetIndex(vTrackHistos_,"h_trackphi");
987  vTrackHistos_[phiindex]->Fill(itT->phi);
988  static const int numOfValidHitsindex = this->GetIndex(vTrackHistos_,"h_trackNumberOfValidHits");
989  vTrackHistos_[numOfValidHitsindex]->Fill(itT->numberOfValidHits);
990  static const int numOfLostHitsindex = this->GetIndex(vTrackHistos_,"h_trackNumberOfLostHits");
991  vTrackHistos_[numOfLostHitsindex]->Fill(itT->numberOfLostHits);
992  static const int kappaindex = this->GetIndex(vTrackHistos_,"h_curvature");
993  vTrackHistos_[kappaindex]->Fill(itT->kappa);
994  static const int kappaposindex = this->GetIndex(vTrackHistos_,"h_curvature_pos");
995  if (itT->charge > 0)
996  vTrackHistos_[kappaposindex]->Fill(fabs(itT->kappa));
997  static const int kappanegindex = this->GetIndex(vTrackHistos_,"h_curvature_neg");
998  if (itT->charge < 0)
999  vTrackHistos_[kappanegindex]->Fill(fabs(itT->kappa));
1000  static const int normchi2index = this->GetIndex(vTrackHistos_,"h_normchi2");
1001  vTrackHistos_[normchi2index]->Fill(itT->normchi2);
1002  static const int chi2index = this->GetIndex(vTrackHistos_,"h_chi2");
1003  vTrackHistos_[chi2index]->Fill(itT->chi2);
1004  static const int chi2Probindex = this->GetIndex(vTrackHistos_,"h_chi2Prob");
1005  vTrackHistos_[chi2Probindex]->Fill(itT->chi2Prob);
1006  static const int ptindex = this->GetIndex(vTrackHistos_,"h_pt");
1007  vTrackHistos_[ptindex]->Fill(itT->pt);
1008  if (itT->ptError != 0.) {
1009  static const int ptResolutionindex = this->GetIndex(vTrackHistos_,"h_ptResolution");
1010  vTrackHistos_[ptResolutionindex]->Fill(itT->ptError/itT->pt);
1011  }
1012  // Fill track profiles
1013  static const int d0phiindex = this->GetIndex(vTrackProfiles_,"p_d0_vs_phi");
1014  vTrackProfiles_[d0phiindex]->Fill(itT->phi,itT->d0);
1015  static const int dzphiindex = this->GetIndex(vTrackProfiles_,"p_dz_vs_phi");
1016  vTrackProfiles_[dzphiindex]->Fill(itT->phi,itT->dz);
1017  static const int d0etaindex = this->GetIndex(vTrackProfiles_,"p_d0_vs_eta");
1018  vTrackProfiles_[d0etaindex]->Fill(itT->eta,itT->d0);
1019  static const int dzetaindex = this->GetIndex(vTrackProfiles_,"p_dz_vs_eta");
1020  vTrackProfiles_[dzetaindex]->Fill(itT->eta,itT->dz);
1021  static const int chiphiindex = this->GetIndex(vTrackProfiles_,"p_chi2_vs_phi");
1022  vTrackProfiles_[chiphiindex]->Fill(itT->phi,itT->chi2);
1023  static const int chiProbphiindex = this->GetIndex(vTrackProfiles_,"p_chi2Prob_vs_phi");
1024  vTrackProfiles_[chiProbphiindex]->Fill(itT->phi,itT->chi2Prob);
1025  static const int chiProbabsd0index = this->GetIndex(vTrackProfiles_,"p_chi2Prob_vs_d0");
1026  vTrackProfiles_[chiProbabsd0index]->Fill(fabs(itT->d0),itT->chi2Prob);
1027  static const int normchiphiindex = this->GetIndex(vTrackProfiles_,"p_normchi2_vs_phi");
1028  vTrackProfiles_[normchiphiindex]->Fill(itT->phi,itT->normchi2);
1029  static const int chietaindex = this->GetIndex(vTrackProfiles_,"p_chi2_vs_eta");
1030  vTrackProfiles_[chietaindex]->Fill(itT->eta,itT->chi2);
1031  static const int normchiptindex = this->GetIndex(vTrackProfiles_,"p_normchi2_vs_pt");
1032  vTrackProfiles_[normchiptindex]->Fill(itT->pt,itT->normchi2);
1033  static const int normchipindex = this->GetIndex(vTrackProfiles_,"p_normchi2_vs_p");
1034  vTrackProfiles_[normchipindex]->Fill(itT->p,itT->normchi2);
1035  static const int chiProbetaindex = this->GetIndex(vTrackProfiles_,"p_chi2Prob_vs_eta");
1036  vTrackProfiles_[chiProbetaindex]->Fill(itT->eta,itT->chi2Prob);
1037  static const int normchietaindex = this->GetIndex(vTrackProfiles_,"p_normchi2_vs_eta");
1038  vTrackProfiles_[normchietaindex]->Fill(itT->eta,itT->normchi2);
1039  static const int kappaphiindex = this->GetIndex(vTrackProfiles_,"p_kappa_vs_phi");
1040  vTrackProfiles_[kappaphiindex]->Fill(itT->phi,itT->kappa);
1041  static const int kappaetaindex = this->GetIndex(vTrackProfiles_,"p_kappa_vs_eta");
1042  vTrackProfiles_[kappaetaindex]->Fill(itT->eta,itT->kappa);
1043  static const int ptResphiindex = this->GetIndex(vTrackProfiles_,"p_ptResolution_vs_phi");
1044  vTrackProfiles_[ptResphiindex]->Fill(itT->phi,itT->ptError/itT->pt);
1045  static const int ptResetaindex = this->GetIndex(vTrackProfiles_,"p_ptResolution_vs_eta");
1046  vTrackProfiles_[ptResetaindex]->Fill(itT->eta,itT->ptError/itT->pt);
1047 
1048  // Fill 2D track histos
1049  static const int d0phiindex_2d = this->GetIndex(vTrack2DHistos_,"h2_d0_vs_phi");
1050  vTrack2DHistos_[d0phiindex_2d]->Fill(itT->phi,itT->d0);
1051  static const int dzphiindex_2d = this->GetIndex(vTrack2DHistos_,"h2_dz_vs_phi");
1052  vTrack2DHistos_[dzphiindex_2d]->Fill(itT->phi,itT->dz);
1053  static const int d0etaindex_2d = this->GetIndex(vTrack2DHistos_,"h2_d0_vs_eta");
1054  vTrack2DHistos_[d0etaindex_2d]->Fill(itT->eta,itT->d0);
1055  static const int dzetaindex_2d = this->GetIndex(vTrack2DHistos_,"h2_dz_vs_eta");
1056  vTrack2DHistos_[dzetaindex_2d]->Fill(itT->eta,itT->dz);
1057  static const int chiphiindex_2d = this->GetIndex(vTrack2DHistos_,"h2_chi2_vs_phi");
1058  vTrack2DHistos_[chiphiindex_2d]->Fill(itT->phi,itT->chi2);
1059  static const int chiProbphiindex_2d = this->GetIndex(vTrack2DHistos_,"h2_chi2Prob_vs_phi");
1060  vTrack2DHistos_[chiProbphiindex_2d]->Fill(itT->phi,itT->chi2Prob);
1061  static const int chiProbabsd0index_2d = this->GetIndex(vTrack2DHistos_,"h2_chi2Prob_vs_d0");
1062  vTrack2DHistos_[chiProbabsd0index_2d]->Fill(fabs(itT->d0),itT->chi2Prob);
1063  static const int normchiphiindex_2d = this->GetIndex(vTrack2DHistos_,"h2_normchi2_vs_phi");
1064  vTrack2DHistos_[normchiphiindex_2d]->Fill(itT->phi,itT->normchi2);
1065  static const int chietaindex_2d = this->GetIndex(vTrack2DHistos_,"h2_chi2_vs_eta");
1066  vTrack2DHistos_[chietaindex_2d]->Fill(itT->eta,itT->chi2);
1067  static const int chiProbetaindex_2d = this->GetIndex(vTrack2DHistos_,"h2_chi2Prob_vs_eta");
1068  vTrack2DHistos_[chiProbetaindex_2d]->Fill(itT->eta,itT->chi2Prob);
1069  static const int normchietaindex_2d = this->GetIndex(vTrack2DHistos_,"h2_normchi2_vs_eta");
1070  vTrack2DHistos_[normchietaindex_2d]->Fill(itT->eta,itT->normchi2);
1071  static const int kappaphiindex_2d = this->GetIndex(vTrack2DHistos_,"h2_kappa_vs_phi");
1072  vTrack2DHistos_[kappaphiindex_2d]->Fill(itT->phi,itT->kappa);
1073  static const int kappaetaindex_2d = this->GetIndex(vTrack2DHistos_,"h2_kappa_vs_eta");
1074  vTrack2DHistos_[kappaetaindex_2d]->Fill(itT->eta,itT->kappa);
1075  static const int normchi2kappa_2d = this->GetIndex(vTrack2DHistos_,"h2_normchi2_vs_kappa");
1076  vTrack2DHistos_[normchi2kappa_2d]->Fill(itT->normchi2,itT->kappa);
1077 
1078  // hit quantities: residuals, normalized residuals
1079  for (std::vector<TrackerValidationVariables::AVHitStruct>::const_iterator itH = itT->hits.begin();
1080  itH != itT->hits.end();
1081  ++itH) {
1082 
1083  DetId detid(itH->rawDetId);
1084  ModuleHistos &histStruct = this->getHistStructFromMap(detid);
1085 
1086  // fill histos in local coordinates if set in cf
1087  if (lCoorHistOn_) {
1088  histStruct.ResHisto->Fill(itH->resX);
1089  if(itH->resErrX != 0) histStruct.NormResHisto->Fill(itH->resX/itH->resErrX);
1090  if (this->isPixel(detid.subdetId()) || stripYResiduals_ ) {
1091  histStruct.ResYHisto->Fill(itH->resY);
1092  // here add un-primed normalised y-residuals if wanted
1093  }
1094  }
1095  if (itH->resXprime != -999.) {
1096  histStruct.ResXprimeHisto->Fill(itH->resXprime);
1097 
1098  /******************************* Fill 2-D histo ResX vs momenta *****************************/
1099  if (detid.subdetId() == PixelSubdetector::PixelBarrel) {
1100  static const int resXvsPindex_2d = this->GetIndex(vTrack2DHistos_,"p_vs_resXprime_pixB");
1101  vTrack2DHistos_[resXvsPindex_2d]->Fill(itT->p,itH->resXprime);
1102  }
1103  if (detid.subdetId() == PixelSubdetector::PixelEndcap) {
1104  static const int resXvsPindex_2d = this->GetIndex(vTrack2DHistos_,"p_vs_resXprime_pixE");
1105  vTrack2DHistos_[resXvsPindex_2d]->Fill(itT->p,itH->resXprime);
1106  }
1107  if (detid.subdetId() == StripSubdetector::TIB) {
1108  static const int resXvsPindex_2d = this->GetIndex(vTrack2DHistos_,"p_vs_resXprime_TIB");
1109  vTrack2DHistos_[resXvsPindex_2d]->Fill(itT->p,itH->resXprime);
1110  }
1111  if (detid.subdetId() == StripSubdetector::TID) {
1112  static const int resXvsPindex_2d = this->GetIndex(vTrack2DHistos_,"p_vs_resXprime_TID");
1113  vTrack2DHistos_[resXvsPindex_2d]->Fill(itT->p,itH->resXprime);
1114  }
1115  if (detid.subdetId() == StripSubdetector::TOB) {
1116  static const int resXvsPindex_2d = this->GetIndex(vTrack2DHistos_,"p_vs_resXprime_TOB");
1117  vTrack2DHistos_[resXvsPindex_2d]->Fill(itT->p,itH->resXprime);
1118  }
1119  if (detid.subdetId() == StripSubdetector::TEC) {
1120  static const int resXvsPindex_2d = this->GetIndex(vTrack2DHistos_,"p_vs_resXprime_TEC");
1121  vTrack2DHistos_[resXvsPindex_2d]->Fill(itT->p,itH->resXprime);
1122  }
1123  /******************************************/
1124 
1125  if ( moduleLevelProfiles_ && itH->inside ) {
1126  float tgalpha = tan(itH->localAlpha);
1127  if ( fabs(tgalpha)!=0 ){
1128  histStruct.LocalX->Fill(itH->localXnorm, tgalpha*tgalpha);
1129  histStruct.LocalY->Fill(itH->localYnorm, tgalpha*tgalpha);
1130 /* if (this->isEndCap(detid.subdetId()) && !this->isPixel(detid.subdetId())) {
1131  if((itH->resX)*(itH->resXprime)>0){
1132  histStruct.ResXvsXProfile->Fill(itH->localXnorm, itH->resXatTrkY/tgalpha, tgalpha*tgalpha);
1133  histStruct.ResXvsYProfile->Fill(itH->localYnorm, itH->resXatTrkY/tgalpha, tgalpha*tgalpha);
1134  } else {
1135  histStruct.ResXvsXProfile->Fill(itH->localXnorm, (-1)*itH->resXatTrkY/tgalpha, tgalpha*tgalpha);
1136  histStruct.ResXvsYProfile->Fill(itH->localYnorm, (-1)*itH->resXatTrkY/tgalpha, tgalpha*tgalpha);
1137  }
1138 
1139  }else {
1140 */
1141  histStruct.ResXvsXProfile->Fill(itH->localXnorm, itH->resXatTrkY/tgalpha, tgalpha*tgalpha);
1142  histStruct.ResXvsYProfile->Fill(itH->localYnorm, itH->resXatTrkY/tgalpha, tgalpha*tgalpha);
1143 
1144 // }
1145 
1146  }
1147  }
1148 
1149  if(itH->resXprimeErr != 0 && itH->resXprimeErr != -999 ) {
1150  histStruct.NormResXprimeHisto->Fill(itH->resXprime/itH->resXprimeErr);
1151  }
1152  }
1153 
1154  if (itH->resYprime != -999.) {
1155  if (this->isPixel(detid.subdetId()) || stripYResiduals_ ) {
1156  histStruct.ResYprimeHisto->Fill(itH->resYprime);
1157 
1158  /******************************* Fill 2-D histo ResY vs momenta *****************************/
1159  if (detid.subdetId() == PixelSubdetector::PixelBarrel) {
1160  static const int resYvsPindex_2d = this->GetIndex(vTrack2DHistos_,"p_vs_resYprime_pixB");
1161  vTrack2DHistos_[resYvsPindex_2d]->Fill(itT->p,itH->resYprime);
1162  }
1163  if (detid.subdetId() == PixelSubdetector::PixelEndcap) {
1164  static const int resYvsPindex_2d = this->GetIndex(vTrack2DHistos_,"p_vs_resYprime_pixE");
1165  vTrack2DHistos_[resYvsPindex_2d]->Fill(itT->p,itH->resYprime);
1166  }
1167  /******************************************/
1168 
1169  if ( moduleLevelProfiles_ && itH->inside ) {
1170  float tgbeta = tan(itH->localBeta);
1171  if ( fabs(tgbeta)!=0 ){
1172 /* if (this->isEndCap(detid.subdetId()) && !this->isPixel(detid.subdetId())) {
1173 
1174  if((itH->resY)*(itH->resYprime)>0){
1175  histStruct.ResYvsXProfile->Fill(itH->localXnorm, itH->resYprime/tgbeta, tgbeta*tgbeta);
1176  histStruct.ResYvsYProfile->Fill(itH->localYnorm, itH->resYprime/tgbeta, tgbeta*tgbeta);
1177  } else {
1178  histStruct.ResYvsXProfile->Fill(itH->localXnorm, (-1)*itH->resYprime/tgbeta, tgbeta*tgbeta);
1179  histStruct.ResYvsYProfile->Fill(itH->localYnorm, (-1)*itH->resYprime/tgbeta, tgbeta*tgbeta);
1180  }
1181 
1182  }else {
1183 */
1184  histStruct.ResYvsXProfile->Fill(itH->localXnorm, itH->resY/tgbeta, tgbeta*tgbeta);
1185  histStruct.ResYvsYProfile->Fill(itH->localYnorm, itH->resY/tgbeta, tgbeta*tgbeta);
1186 // }
1187  }
1188  }
1189 
1190  if (itH->resYprimeErr != 0 && itH->resYprimeErr != -999. ) {
1191  histStruct.NormResYprimeHisto->Fill(itH->resYprime/itH->resYprimeErr);
1192  }
1193  }
1194  }
1195 
1196  } // finish loop over hit quantities
1197  } // finish loop over track quantities
1198 
1199  if (useOverflowForRMS_) TH1::StatOverflows(kFALSE);
1200 }
1201 
1202 
1203 // ------------ method called once each job just after ending the event loop ------------
1204 void
1206 {
1207 
1208  if (!tkGeom_.product()) return;
1209 
1210  //Retrieve tracker topology from geometry
1211  edm::ESHandle<TrackerTopology> tTopoHandle;
1212  lastSetup_->get<IdealGeometryRecord>().get(tTopoHandle);
1213  const TrackerTopology* const tTopo = tTopoHandle.product();
1214 
1215  AlignableTracker aliTracker(&(*tkGeom_), tTopo);
1216 
1217  static const int kappadiffindex = this->GetIndex(vTrackHistos_,"h_diff_curvature");
1218  vTrackHistos_[kappadiffindex]->Add(vTrackHistos_[this->GetIndex(vTrackHistos_,"h_curvature_neg")],
1219  vTrackHistos_[this->GetIndex(vTrackHistos_,"h_curvature_pos")],-1,1);
1220 
1221  // Collate Information for Subdetectors
1222  // create summary histogramms recursively
1223  std::vector<TrackerOfflineValidation::SummaryContainer> vTrackerprofiles;
1225  this->collateSummaryHists(f,(aliTracker), 0, vTrackerprofiles);
1226 
1227  if (dqmMode_) return;
1228  // Should be excluded in dqmMode, since TTree is not usable
1229  // In dqmMode tree operations are are sourced out to the additional module TrackerOfflineValidationSummary
1230 
1232  TTree *tree = fs->make<TTree>("TkOffVal","TkOffVal");
1233 
1234  TkOffTreeVariables *treeMemPtr = new TkOffTreeVariables;
1235  // We create branches for all members of 'TkOffTreeVariables' (even if not needed).
1236  // This works because we have a dictionary for 'TkOffTreeVariables'
1237  // (see src/classes_def.xml and src/classes.h):
1238  tree->Branch("TkOffTreeVariables", &treeMemPtr); // address of pointer!
1239 
1240  this->fillTree(*tree, mPxbResiduals_, *treeMemPtr, *tkGeom_, tTopo);
1241  this->fillTree(*tree, mPxeResiduals_, *treeMemPtr, *tkGeom_, tTopo);
1242  this->fillTree(*tree, mTibResiduals_, *treeMemPtr, *tkGeom_, tTopo);
1243  this->fillTree(*tree, mTidResiduals_, *treeMemPtr, *tkGeom_, tTopo);
1244  this->fillTree(*tree, mTobResiduals_, *treeMemPtr, *tkGeom_, tTopo);
1245  this->fillTree(*tree, mTecResiduals_, *treeMemPtr, *tkGeom_, tTopo);
1246 
1247  delete treeMemPtr; treeMemPtr = 0;
1248 }
1249 
1250 
1251 void
1253  std::vector<TrackerOfflineValidation::SummaryContainer>& vLevelProfiles)
1254 {
1255  std::vector<Alignable*> alivec(ali.components());
1256  if( this->isDetOrDetUnit((alivec)[0]->alignableObjectId()) ) return;
1257 
1258  for(int iComp=0, iCompEnd = ali.components().size();iComp < iCompEnd; ++iComp) {
1259  std::vector< TrackerOfflineValidation::SummaryContainer > vProfiles;
1260  std::string structurename = AlignableObjectId::idToString((alivec)[iComp]->alignableObjectId());
1261 
1262  LogDebug("TrackerOfflineValidation") << "StructureName = " << structurename;
1263  std::stringstream dirname;
1264  dirname << structurename;
1265 
1266  // add no suffix counter to strip and pixel -> just aesthetics
1267  if (structurename != "Strip" && structurename != "Pixel") dirname << "_" << iComp+1;
1268 
1269  if( !(this->isDetOrDetUnit( (alivec)[iComp]->alignableObjectId()) )
1270  || (alivec)[0]->components().size() > 1 ) {
1271  DirectoryWrapper f(tfd,dirname.str(),moduleDirectory_,dqmMode_);
1272  this->collateSummaryHists( f, *(alivec)[iComp], i, vProfiles);
1273  vLevelProfiles.push_back(this->bookSummaryHists(tfd, *(alivec[iComp]), ali.alignableObjectId(), iComp+1));
1274  TH1 *hY = vLevelProfiles[iComp].sumYResiduals_;
1275  TH1 *hNormY = vLevelProfiles[iComp].sumNormYResiduals_;
1276  for(uint n = 0; n < vProfiles.size(); ++n) {
1277  this->summarizeBinInContainer(n+1, vLevelProfiles[iComp], vProfiles[n] );
1278  vLevelProfiles[iComp].sumXResiduals_->Add(vProfiles[n].sumXResiduals_);
1279  vLevelProfiles[iComp].sumNormXResiduals_->Add(vProfiles[n].sumNormXResiduals_);
1280  if (hY) hY->Add(vProfiles[n].sumYResiduals_); // only if existing
1281  if (hNormY) hNormY->Add(vProfiles[n].sumNormYResiduals_); // dito (pxl, stripYResiduals_)
1282  }
1283  if(dqmMode_)continue; // No fits in dqmMode
1284  //add fit values to stat box
1285  this->fitResiduals(vLevelProfiles[iComp].sumXResiduals_);
1286  this->fitResiduals(vLevelProfiles[iComp].sumNormXResiduals_);
1287  if (hY) this->fitResiduals(hY); // only if existing (pixel or stripYResiduals_)
1288  if (hNormY) this->fitResiduals(hNormY); // dito
1289  } else {
1290  // nothing to be done for det or detunits
1291  continue;
1292  }
1293  }
1294 }
1295 
1296 
1299  align::StructureType type, int i)
1300 {
1301  const uint aliSize = ali.components().size();
1302  const align::StructureType alitype = ali.alignableObjectId();
1303  const align::StructureType subtype = ali.components()[0]->alignableObjectId();
1304  const char *aliTypeName = AlignableObjectId::idToString(alitype); // lifetime of char* OK
1305  const char *aliSubtypeName = AlignableObjectId::idToString(subtype);
1306  const char *typeName = AlignableObjectId::idToString(type);
1307 
1308  const DetId aliDetId = ali.id();
1309  // y residuals only if pixel or specially requested for strip:
1310  const bool bookResidY = this->isPixel(aliDetId.subdetId()) || stripYResiduals_;
1311 
1312  SummaryContainer sumContainer;
1313 
1314  // Book summary hists with one bin per component,
1315  // but special case for Det with two DetUnit that we want to summarize one level up
1316  // (e.g. in TOBRods with 12 bins for 6 stereo and 6 rphi DetUnit.)
1317  // component of ali is not Det or Det with just one components
1318  const uint subcompSize = ali.components()[0]->components().size();
1319  if (subtype != align::AlignableDet || subcompSize == 1) { // Det with 1 comp. should not exist anymore...
1320  const TString title(Form("Summary for substructures in %s %d;%s;",aliTypeName,i,aliSubtypeName));
1321 
1322  sumContainer.summaryXResiduals_ = tfd.make<TH1F>(Form("h_summaryX%s_%d",aliTypeName,i),
1323  title + "#LT #Delta x' #GT",
1324  aliSize, 0.5, aliSize+0.5);
1325  sumContainer.summaryNormXResiduals_ = tfd.make<TH1F>(Form("h_summaryNormX%s_%d",aliTypeName,i),
1326  title + "#LT #Delta x'/#sigma #GT",
1327  aliSize,0.5,aliSize+0.5);
1328 
1329  if (bookResidY) {
1330  sumContainer.summaryYResiduals_ = tfd.make<TH1F>(Form("h_summaryY%s_%d",aliTypeName,i),
1331  title + "#LT #Delta y' #GT",
1332  aliSize, 0.5, aliSize+0.5);
1333  sumContainer.summaryNormYResiduals_ = tfd.make<TH1F>(Form("h_summaryNormY%s_%d",aliTypeName,i),
1334  title + "#LT #Delta y'/#sigma #GT",
1335  aliSize,0.5,aliSize+0.5);
1336  }
1337 
1338  } else if (subtype == align::AlignableDet && subcompSize > 1) { // fixed: was aliSize before
1339  if (subcompSize != 2) { // strange... expect only 2 DetUnits in DS layers
1340  // this 2 is hardcoded factor 2 in binning below and also assumed later on
1341  edm::LogError("Alignment") << "@SUB=bookSummaryHists"
1342  << "Det with " << subcompSize << " components";
1343  }
1344  // title contains x-title
1345  const TString title(Form("Summary for substructures in %s %d;%s;", aliTypeName, i,
1346  AlignableObjectId::idToString(ali.components()[0]->components()[0]->alignableObjectId())));
1347 
1348  sumContainer.summaryXResiduals_
1349  = tfd.make<TH1F>(Form("h_summaryX%s_%d", aliTypeName, i),
1350  title + "#LT #Delta x' #GT", (2*aliSize), 0.5, 2*aliSize+0.5);
1351  sumContainer.summaryNormXResiduals_
1352  = tfd.make<TH1F>(Form("h_summaryNormX%s_%d", aliTypeName, i),
1353  title + "#LT #Delta x'/#sigma #GT", (2*aliSize), 0.5, 2*aliSize+0.5);
1354 
1355  if (bookResidY) {
1356  sumContainer.summaryYResiduals_
1357  = tfd.make<TH1F>(Form("h_summaryY%s_%d", aliTypeName, i),
1358  title + "#LT #Delta y' #GT", (2*aliSize), 0.5, 2*aliSize+0.5);
1359  sumContainer.summaryNormYResiduals_
1360  = tfd.make<TH1F>(Form("h_summaryNormY%s_%d", aliTypeName, i),
1361  title + "#LT #Delta y'/#sigma #GT", (2*aliSize), 0.5, 2*aliSize+0.5);
1362  }
1363 
1364  } else {
1365  edm::LogError("TrackerOfflineValidation") << "@SUB=TrackerOfflineValidation::bookSummaryHists"
1366  << "No summary histogramm for hierarchy level "
1367  << aliTypeName << " in subdet " << aliDetId.subdetId();
1368  }
1369 
1370  // Now book hists that just sum up the residual histograms from lower levels.
1371  // Axis title is copied from lowest level module of structure.
1372  // Should be safe that y-hists are only touched if non-null pointers...
1373  int nbins = 0;
1374  double xmin = 0., xmax = 0.;
1375  const TString sumTitle(Form("Residual for %s %d in %s;", aliTypeName, i, typeName));
1376  const ModuleHistos &xTitHists = this->getHistStructFromMap(aliDetId); // for x-axis titles
1377  this->getBinning(aliDetId.subdetId(), XprimeResidual, nbins, xmin, xmax);
1378 
1379  sumContainer.sumXResiduals_ = tfd.make<TH1F>(Form("h_Xprime_%s_%d", aliTypeName, i),
1380  sumTitle + xTitHists.ResXprimeHisto->GetXaxis()->GetTitle(),
1381  nbins, xmin, xmax);
1382 
1383  this->getBinning(aliDetId.subdetId(), NormXprimeResidual, nbins, xmin, xmax);
1384  sumContainer.sumNormXResiduals_ = tfd.make<TH1F>(Form("h_NormXprime_%s_%d",aliTypeName,i),
1385  sumTitle + xTitHists.NormResXprimeHisto->GetXaxis()->GetTitle(),
1386  nbins, xmin, xmax);
1387  if (bookResidY) {
1388  this->getBinning(aliDetId.subdetId(), YprimeResidual, nbins, xmin, xmax);
1389  sumContainer.sumYResiduals_ = tfd.make<TH1F>(Form("h_Yprime_%s_%d",aliTypeName,i),
1390  sumTitle + xTitHists.ResYprimeHisto->GetXaxis()->GetTitle(),
1391  nbins, xmin, xmax);
1392 
1393  this->getBinning(aliDetId.subdetId(), NormYprimeResidual, nbins, xmin, xmax);
1394  sumContainer.sumNormYResiduals_ = tfd.make<TH1F>(Form("h_NormYprime_%s_%d",aliTypeName,i),
1395  sumTitle + xTitHists.NormResYprimeHisto->GetXaxis()->GetTitle(),
1396  nbins, xmin, xmax);
1397  }
1398 
1399  // If we are at the lowest level, we already sum up and fill the summary.
1400 
1401  // special case I: For DetUnits and Dets with only one subcomponent start filling summary histos
1402  if( ( subtype == align::AlignableDet && subcompSize == 1) || subtype == align::AlignableDetUnit ) {
1403  for(uint k = 0; k < aliSize; ++k) {
1404  DetId detid = ali.components()[k]->id();
1405  ModuleHistos &histStruct = this->getHistStructFromMap(detid);
1406  this->summarizeBinInContainer(k+1, detid.subdetId() ,sumContainer, histStruct );
1407  sumContainer.sumXResiduals_->Add(histStruct.ResXprimeHisto);
1408  sumContainer.sumNormXResiduals_->Add(histStruct.NormResXprimeHisto);
1409  if( this->isPixel(detid.subdetId()) || stripYResiduals_ ) {
1410  sumContainer.sumYResiduals_->Add(histStruct.ResYprimeHisto);
1411  sumContainer.sumNormYResiduals_->Add(histStruct.NormResYprimeHisto);
1412  }
1413  }
1414  } else if( subtype == align::AlignableDet && subcompSize > 1) { // fixed: was aliSize before
1415  // special case II: Fill summary histos for dets with two detunits
1416  for(uint k = 0; k < aliSize; ++k) {
1417  for(uint j = 0; j < subcompSize; ++j) { // assumes all have same size (as binning does)
1418  DetId detid = ali.components()[k]->components()[j]->id();
1419  ModuleHistos &histStruct = this->getHistStructFromMap(detid);
1420  this->summarizeBinInContainer(2*k+j+1, detid.subdetId() ,sumContainer, histStruct );
1421  sumContainer.sumXResiduals_->Add( histStruct.ResXprimeHisto);
1422  sumContainer.sumNormXResiduals_->Add( histStruct.NormResXprimeHisto);
1423  if( this->isPixel(detid.subdetId()) || stripYResiduals_ ) {
1424  sumContainer.sumYResiduals_->Add( histStruct.ResYprimeHisto);
1425  sumContainer.sumNormYResiduals_->Add( histStruct.NormResYprimeHisto);
1426  }
1427  }
1428  }
1429  }
1430  return sumContainer;
1431 }
1432 
1433 
1434 float
1436 {
1437  float max = hist->GetMaximum();
1438  int left = -1, right = -1;
1439  for(unsigned int i = 1, iEnd = hist->GetNbinsX(); i <= iEnd; ++i) {
1440  if(hist->GetBinContent(i) < max/2. && hist->GetBinContent(i+1) > max/2. && left == -1) {
1441  if(max/2. - hist->GetBinContent(i) < hist->GetBinContent(i+1) - max/2.) {
1442  left = i;
1443  ++i;
1444  } else {
1445  left = i+1;
1446  ++i;
1447  }
1448  }
1449  if(left != -1 && right == -1) {
1450  if(hist->GetBinContent(i) > max/2. && hist->GetBinContent(i+1) < max/2.) {
1451  if( hist->GetBinContent(i) - max/2. < max/2. - hist->GetBinContent(i+1)) {
1452  right = i;
1453  } else {
1454  right = i+1;
1455  }
1456 
1457  }
1458  }
1459  }
1460  return hist->GetXaxis()->GetBinCenter(right) - hist->GetXaxis()->GetBinCenter(left);
1461 }
1462 
1463 
1464 void
1466  const std::map<int, TrackerOfflineValidation::ModuleHistos>& moduleHist_,
1467  TkOffTreeVariables &treeMem, const TrackerGeometry& tkgeom, const TrackerTopology* tTopo)
1468 {
1469 
1470  for(std::map<int, TrackerOfflineValidation::ModuleHistos>::const_iterator it = moduleHist_.begin(),
1471  itEnd= moduleHist_.end(); it != itEnd;++it ) {
1472  treeMem.clear(); // make empty/default
1473 
1474  //variables concerning the tracker components/hierarchy levels
1475  DetId detId_ = it->first;
1476  treeMem.moduleId = detId_;
1477  treeMem.subDetId = detId_.subdetId();
1478  treeMem.isDoubleSide =0;
1479 
1480  if(treeMem.subDetId == PixelSubdetector::PixelBarrel){
1481  unsigned int whichHalfBarrel(1), rawId(detId_.rawId()); //DetId does not know about halfBarrels is PXB ...
1482  if( (rawId>=302056964 && rawId<302059300) || (rawId>=302123268 && rawId<302127140) ||
1483  (rawId>=302189572 && rawId<302194980) ) whichHalfBarrel=2;
1484  treeMem.layer = tTopo->pxbLayer(detId_);
1485  treeMem.half = whichHalfBarrel;
1486  treeMem.rod = tTopo->pxbLadder(detId_); // ... so, ladder is not per halfBarrel-Layer, but per barrel-layer!
1487  treeMem.module = tTopo->pxbModule(detId_);
1488  } else if(treeMem.subDetId == PixelSubdetector::PixelEndcap){
1489  unsigned int whichHalfCylinder(1), rawId(detId_.rawId()); //DetId does not kmow about halfCylinders in PXF
1490  if( (rawId>=352394500 && rawId<352406032) || (rawId>=352460036 && rawId<352471568) ||
1491  (rawId>=344005892 && rawId<344017424) || (rawId>=344071428 && rawId<344082960) ) whichHalfCylinder=2;
1492  treeMem.layer = tTopo->pxfDisk(detId_);
1493  treeMem.side = tTopo->pxfSide(detId_);
1494  treeMem.half = whichHalfCylinder;
1495  treeMem.blade = tTopo->pxfBlade(detId_);
1496  treeMem.panel = tTopo->pxfPanel(detId_);
1497  treeMem.module = tTopo->pxfModule(detId_);
1498  } else if(treeMem.subDetId == StripSubdetector::TIB){
1499  unsigned int whichHalfShell(1), rawId(detId_.rawId()); //DetId does not kmow about halfShells in TIB
1500  if ( (rawId>=369120484 && rawId<369120688) || (rawId>=369121540 && rawId<369121776) ||
1501  (rawId>=369136932 && rawId<369137200) || (rawId>=369137988 && rawId<369138288) ||
1502  (rawId>=369153396 && rawId<369153744) || (rawId>=369154436 && rawId<369154800) ||
1503  (rawId>=369169844 && rawId<369170256) || (rawId>=369170900 && rawId<369171344) ||
1504  (rawId>=369124580 && rawId<369124784) || (rawId>=369125636 && rawId<369125872) ||
1505  (rawId>=369141028 && rawId<369141296) || (rawId>=369142084 && rawId<369142384) ||
1506  (rawId>=369157492 && rawId<369157840) || (rawId>=369158532 && rawId<369158896) ||
1507  (rawId>=369173940 && rawId<369174352) || (rawId>=369174996 && rawId<369175440) ) whichHalfShell=2;
1508  treeMem.layer = tTopo->tibLayer(detId_);
1509  treeMem.side = tTopo->tibStringInfo(detId_)[0];
1510  treeMem.half = whichHalfShell;
1511  treeMem.rod = tTopo->tibStringInfo(detId_)[2];
1512  treeMem.outerInner = tTopo->tibStringInfo(detId_)[1];
1513  treeMem.module = tTopo->tibModule(detId_);
1514  treeMem.isStereo = tTopo->tibStereo(detId_);
1515  treeMem.isDoubleSide = tTopo->tibIsDoubleSide(detId_);
1516  } else if(treeMem.subDetId == StripSubdetector::TID){
1517  treeMem.layer = tTopo->tidWheel(detId_);
1518  treeMem.side = tTopo->tidSide(detId_);
1519  treeMem.ring = tTopo->tidRing(detId_);
1520  treeMem.outerInner = tTopo->tidModuleInfo(detId_)[0];
1521  treeMem.module = tTopo->tidModuleInfo(detId_)[1];
1522  treeMem.isStereo = tTopo->tidStereo(detId_);
1523  treeMem.isDoubleSide = tTopo->tidIsDoubleSide(detId_);
1524  } else if(treeMem.subDetId == StripSubdetector::TOB){
1525  treeMem.layer = tTopo->tobLayer(detId_);
1526  treeMem.side = tTopo->tobRodInfo(detId_)[0];
1527  treeMem.rod = tTopo->tobRodInfo(detId_)[1];
1528  treeMem.module = tTopo->tobModule(detId_);
1529  treeMem.isStereo = tTopo->tobStereo(detId_);
1530  treeMem.isDoubleSide = tTopo->tobIsDoubleSide(detId_);
1531  } else if(treeMem.subDetId == StripSubdetector::TEC) {
1532  treeMem.layer = tTopo->tecWheel(detId_);
1533  treeMem.side = tTopo->tecSide(detId_);
1534  treeMem.ring = tTopo->tecRing(detId_);
1535  treeMem.petal = tTopo->tecPetalInfo(detId_)[1];
1536  treeMem.outerInner = tTopo->tecPetalInfo(detId_)[0];
1537  treeMem.module = tTopo->tecModule(detId_);
1538  treeMem.isStereo = tTopo->tecStereo(detId_);
1539  treeMem.isDoubleSide = tTopo->tecIsDoubleSide(detId_);
1540  }
1541 
1542  //variables concerning the tracker geometry
1543  const Surface::PositionType &gPModule = tkgeom.idToDet(detId_)->position();
1544  treeMem.posPhi = gPModule.phi();
1545  treeMem.posEta = gPModule.eta();
1546  treeMem.posR = gPModule.perp();
1547  treeMem.posX = gPModule.x();
1548  treeMem.posY = gPModule.y();
1549  treeMem.posZ = gPModule.z();
1550 
1551  const Surface& surface = tkgeom.idToDet(detId_)->surface();
1552 
1553  //global Orientation of local coordinate system of dets/detUnits
1554  LocalPoint lUDirection(1.,0.,0.), lVDirection(0.,1.,0.), lWDirection(0.,0.,1.);
1555  GlobalPoint gUDirection = surface.toGlobal(lUDirection),
1556  gVDirection = surface.toGlobal(lVDirection),
1557  gWDirection = surface.toGlobal(lWDirection);
1558  double dR(999.), dPhi(999.), dZ(999.);
1560  dR = gWDirection.perp() - gPModule.perp();
1561  dPhi = deltaPhi(gUDirection.phi(),gPModule.phi());
1562  dZ = gVDirection.z() - gPModule.z();
1563  if(dZ>=0.)treeMem.rOrZDirection = 1; else treeMem.rOrZDirection = -1;
1564  }else if(treeMem.subDetId==PixelSubdetector::PixelEndcap){
1565  dR = gUDirection.perp() - gPModule.perp();
1566  dPhi = deltaPhi(gVDirection.phi(),gPModule.phi());
1567  dZ = gWDirection.z() - gPModule.z();
1568  if(dR>=0.)treeMem.rOrZDirection = 1; else treeMem.rOrZDirection = -1;
1569  }else if(treeMem.subDetId==StripSubdetector::TID || treeMem.subDetId==StripSubdetector::TEC){
1570  dR = gVDirection.perp() - gPModule.perp();
1571  dPhi = deltaPhi(gUDirection.phi(),gPModule.phi());
1572  dZ = gWDirection.z() - gPModule.z();
1573  if(dR>=0.)treeMem.rOrZDirection = 1; else treeMem.rOrZDirection = -1;
1574  }
1575  if(dR>=0.)treeMem.rDirection = 1; else treeMem.rDirection = -1;
1576  if(dPhi>=0.)treeMem.phiDirection = 1; else treeMem.phiDirection = -1;
1577  if(dZ>=0.)treeMem.zDirection = 1; else treeMem.zDirection = -1;
1578 
1579  //mean and RMS values (extracted from histograms(Xprime on module level)
1580  treeMem.entries = static_cast<UInt_t>(it->second.ResXprimeHisto->GetEntries());
1581  treeMem.meanX = it->second.ResXprimeHisto->GetMean();
1582  treeMem.rmsX = it->second.ResXprimeHisto->GetRMS();
1583  //treeMem.sigmaX = Fwhm(it->second.ResXprimeHisto)/2.355;
1584 
1585  if (useFit_) {
1586  //call fit function which returns mean and sigma from the fit
1587  //for absolute residuals
1588  std::pair<float,float> fitResult1 = this->fitResiduals(it->second.ResXprimeHisto);
1589  treeMem.fitMeanX = fitResult1.first;
1590  treeMem.fitSigmaX = fitResult1.second;
1591  //for normalized residuals
1592  std::pair<float,float> fitResult2 = this->fitResiduals(it->second.NormResXprimeHisto);
1593  treeMem.fitMeanNormX = fitResult2.first;
1594  treeMem.fitSigmaNormX = fitResult2.second;
1595  }
1596 
1597  //get median for absolute residuals
1598  treeMem.medianX = this->getMedian(it->second.ResXprimeHisto);
1599 
1600  int numberOfBins=it->second.ResXprimeHisto->GetNbinsX();
1601  treeMem.numberOfUnderflows = it->second.ResXprimeHisto->GetBinContent(0);
1602  treeMem.numberOfOverflows = it->second.ResXprimeHisto->GetBinContent(numberOfBins+1);
1603  treeMem.numberOfOutliers = it->second.ResXprimeHisto->GetBinContent(0)+it->second.ResXprimeHisto->GetBinContent(numberOfBins+1);
1604 
1605  //mean and RMS values (extracted from histograms(normalized Xprime on module level)
1606  treeMem.meanNormX = it->second.NormResXprimeHisto->GetMean();
1607  treeMem.rmsNormX = it->second.NormResXprimeHisto->GetRMS();
1608 
1609  double stats[20];
1610  it->second.NormResXprimeHisto->GetStats(stats);
1611  // GF treeMem.chi2PerDofX = stats[3]/(stats[0]-1);
1612  if (stats[0]) treeMem.chi2PerDofX = stats[3]/stats[0];
1613 
1614  treeMem.sigmaNormX = Fwhm(it->second.NormResXprimeHisto)/2.355;
1615  treeMem.histNameX = it->second.ResXprimeHisto->GetName();
1616  treeMem.histNameNormX = it->second.NormResXprimeHisto->GetName();
1617 
1618  // fill tree variables in local coordinates if set in cfg
1619  if(lCoorHistOn_) {
1620  treeMem.meanLocalX = it->second.ResHisto->GetMean();
1621  treeMem.rmsLocalX = it->second.ResHisto->GetRMS();
1622  treeMem.meanNormLocalX = it->second.NormResHisto->GetMean();
1623  treeMem.rmsNormLocalX = it->second.NormResHisto->GetRMS();
1624 
1625  treeMem.histNameLocalX = it->second.ResHisto->GetName();
1626  treeMem.histNameNormLocalX = it->second.NormResHisto->GetName();
1627  if (it->second.ResYHisto) treeMem.histNameLocalY = it->second.ResYHisto->GetName();
1628  }
1629 
1630  // mean and RMS values in local y (extracted from histograms(normalized Yprime on module level)
1631  // might exist in pixel only
1632  if (it->second.ResYprimeHisto) {//(stripYResiduals_)
1633  TH1 *h = it->second.ResYprimeHisto;
1634  treeMem.meanY = h->GetMean();
1635  treeMem.rmsY = h->GetRMS();
1636 
1637  if (useFit_) { // fit function which returns mean and sigma from the fit
1638  std::pair<float,float> fitMeanSigma = this->fitResiduals(h);
1639  treeMem.fitMeanY = fitMeanSigma.first;
1640  treeMem.fitSigmaY = fitMeanSigma.second;
1641  }
1642 
1643  //get median for absolute residuals
1644  treeMem.medianY = this->getMedian(h);
1645 
1646  treeMem.histNameY = h->GetName();
1647  }
1648  if (it->second.NormResYprimeHisto) {
1649  TH1 *h = it->second.NormResYprimeHisto;
1650  treeMem.meanNormY = h->GetMean();
1651  treeMem.rmsNormY = h->GetRMS();
1652  h->GetStats(stats); // stats buffer defined above
1653  if (stats[0]) treeMem.chi2PerDofY = stats[3]/stats[0];
1654 
1655  if (useFit_) { // fit function which returns mean and sigma from the fit
1656  std::pair<float,float> fitMeanSigma = this->fitResiduals(h);
1657  treeMem.fitMeanNormY = fitMeanSigma.first;
1658  treeMem.fitSigmaNormY = fitMeanSigma.second;
1659  }
1660  treeMem.histNameNormY = h->GetName();
1661  }
1662 
1663  if (moduleLevelProfiles_) {
1664  if (it->second.ResXvsXProfile) {
1665  TH1 *h = it->second.ResXvsXProfile;
1666  treeMem.meanResXvsX = h->GetMean();
1667  treeMem.rmsResXvsX = h->GetRMS();
1668  treeMem.profileNameResXvsX = h->GetName();
1669  }
1670  if (it->second.ResXvsYProfile) {
1671  TH1 *h = it->second.ResXvsYProfile;
1672  treeMem.meanResXvsY = h->GetMean();
1673  treeMem.rmsResXvsY = h->GetRMS();
1674  treeMem.profileNameResXvsY = h->GetName();
1675  }
1676  if (it->second.ResYvsXProfile) {
1677  TH1 *h = it->second.ResYvsXProfile;
1678  treeMem.meanResYvsX = h->GetMean();
1679  treeMem.rmsResYvsX = h->GetRMS();
1680  treeMem.profileNameResYvsX = h->GetName();
1681  }
1682  if (it->second.ResYvsYProfile) {
1683  TH1 *h = it->second.ResYvsYProfile;
1684  treeMem.meanResYvsY = h->GetMean();
1685  treeMem.rmsResYvsY = h->GetRMS();
1686  treeMem.profileNameResYvsY = h->GetName();
1687  }
1688  }
1689 
1690  tree.Fill();
1691  }
1692 }
1693 
1694 
1695 std::pair<float,float>
1697 {
1698  std::pair<float,float> fitResult(9999., 9999.);
1699  if (!hist || hist->GetEntries() < 20) return fitResult;
1700 
1701  float mean = hist->GetMean();
1702  float sigma = hist->GetRMS();
1703 
1704  try { // for < CMSSW_2_2_0 since ROOT warnings from fit are converted to exceptions
1705  // Remove the try/catch for more recent CMSSW!
1706  // first fit: two RMS around mean
1707  TF1 func("tmp", "gaus", mean - 2.*sigma, mean + 2.*sigma);
1708  if (0 == hist->Fit(&func,"QNR")) { // N: do not blow up file by storing fit!
1709  mean = func.GetParameter(1);
1710  sigma = func.GetParameter(2);
1711  // second fit: three sigma of first fit around mean of first fit
1712  func.SetRange(mean - 3.*sigma, mean + 3.*sigma);
1713  // I: integral gives more correct results if binning is too wide
1714  // L: Likelihood can treat empty bins correctly (if hist not weighted...)
1715  if (0 == hist->Fit(&func, "Q0LR")) {
1716  if (hist->GetFunction(func.GetName())) { // Take care that it is later on drawn:
1717  hist->GetFunction(func.GetName())->ResetBit(TF1::kNotDraw);
1718  }
1719  fitResult.first = func.GetParameter(1);
1720  fitResult.second = func.GetParameter(2);
1721  }
1722  }
1723  } catch (cms::Exception const & e) {
1724  edm::LogWarning("Alignment") << "@SUB=TrackerOfflineValidation::fitResiduals"
1725  << "Caught this exception during ROOT fit: "
1726  << e.what();
1727  }
1728  return fitResult;
1729 }
1730 
1731 
1732 float
1734 {
1735  float median = 999;
1736  int nbins = histo->GetNbinsX();
1737 
1738  //extract median from histogram
1739  double *x = new double[nbins];
1740  double *y = new double[nbins];
1741  for (int j = 0; j < nbins; j++) {
1742  x[j] = histo->GetBinCenter(j+1);
1743  y[j] = histo->GetBinContent(j+1);
1744  }
1745  median = TMath::Median(nbins, x, y);
1746 
1747  delete[] x; x = 0;
1748  delete [] y; y = 0;
1749 
1750  return median;
1751 
1752 }
1753 //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
#define nullptr
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
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:35
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:243
std::vector< unsigned int > tecPetalInfo(const DetId &id) const
const Surface::PositionType & position() const
The position (origin of the R.F.)
Definition: GeomDet.h:41
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)
const T & max(const T &a, const T &b)
std::vector< unsigned int > tobRodInfo(const DetId &id) const
constexpr unsigned int subDetId[12]
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]
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
virtual const GeomDet * idToDet(DetId) const
std::string histNameNormLocalX
unsigned int tibModule(const DetId &id) const
unsigned int pxfModule(const DetId &id) const
int k[5][pyjets_maxn]
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
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
Definition: Activities.doc:4
std::string histNameLocalX
const T & get() const
Definition: EventSetup.h:55
bool tidIsDoubleSide(const DetId &id) const
T const * product() const
Definition: ESHandle.h:62
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.
string func
Definition: statics.py:48
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
bool isBarrel(uint32_t subDetId)