CMS 3D CMS Logo

MillePedeDQMModule.cc
Go to the documentation of this file.
1 
9 /*** header-file ***/
11 
12 /*** ROOT objects ***/
13 #include "TH1F.h"
14 
15 /*** Core framework functionality ***/
19 
20 /*** Geometry ***/
24 
25 /*** Alignment ***/
29 
30 /*** Thresholds from DB ***/
32 
34  : mpReaderConfig_(config.getParameter<edm::ParameterSet>("MillePedeFileReader")) {}
35 
37 
38 //=============================================================================
39 //=== INTERFACE IMPLEMENTATION ===
40 //=============================================================================
41 
43  edm::LogInfo("MillePedeDQMModule") << "Booking histograms";
44 
45  booker.cd();
46  booker.setCurrentFolder("AlCaReco/SiPixelAli/");
47 
48  h_xPos = booker.book1D("Xpos", "Alignment fit #DeltaX;;#mum", 36, 0., 36.);
49  h_xRot = booker.book1D("Xrot", "Alignment fit #Delta#theta_{X};;#murad", 36, 0., 36.);
50  h_yPos = booker.book1D("Ypos", "Alignment fit #DeltaY;;#mum", 36, 0., 36.);
51  h_yRot = booker.book1D("Yrot", "Alignment fit #Delta#theta_{Y};;#murad", 36, 0., 36.);
52  h_zPos = booker.book1D("Zpos", "Alignment fit #DeltaZ;;#mum", 36, 0., 36.);
53  h_zRot = booker.book1D("Zrot", "Alignment fit #Delta#theta_{Z};;#murad", 36, 0., 36.);
54 
55  statusResults = booker.book2D("statusResults", "Status of SiPixelAli PCL workflow;;", 6, 0., 6., 1, 0., 1.);
56  binariesAvalaible = booker.bookInt("BinariesFound");
57  exitCode = booker.bookString("PedeExitCode", "");
58 
59  booker.cd();
60 }
61 
63  bookHistograms(booker);
64  if (mpReader_) {
65  mpReader_->read();
66  } else {
67  throw cms::Exception("LogicError") << "@SUB=MillePedeDQMModule::dqmEndJob\n"
68  << "Try to read MillePede results before initializing MillePedeFileReader";
69  }
72  binariesAvalaible->Fill(mpReader_->binariesAmount());
73  auto theResults = mpReader_->getResults();
74  std::string exitCodeStr = theResults.getExitMessage();
75  exitCode->Fill(exitCodeStr);
76 }
77 
78 //=============================================================================
79 //=== PRIVATE METHOD IMPLEMENTATION ===
80 //=============================================================================
81 
83  if (!setupChanged(setup))
84  return;
85 
87  setup.get<TrackerTopologyRcd>().get(tTopo);
88  edm::ESHandle<GeometricDet> geometricDet;
89  setup.get<IdealGeometryRecord>().get(geometricDet);
91  setup.get<PTrackerParametersRcd>().get(ptp);
92 
93  // take the thresholds from DB
94  edm::ESHandle<AlignPCLThresholds> thresholdHandle;
95  setup.get<AlignPCLThresholdsRcd>().get(thresholdHandle);
96  auto thresholds_ = thresholdHandle.product();
97 
98  auto myThresholds = std::make_shared<AlignPCLThresholds>();
99  myThresholds->setAlignPCLThresholds(thresholds_->getNrecords(), thresholds_->getThreshold_Map());
100 
102 
103  const auto trackerGeometry = builder.build(&(*geometricDet), *ptp, &(*tTopo));
104  tracker_ = std::make_unique<AlignableTracker>(trackerGeometry, &(*tTopo));
105 
106  const std::string labelerPlugin{"PedeLabeler"};
107  edm::ParameterSet labelerConfig{};
108  labelerConfig.addUntrackedParameter("plugin", labelerPlugin);
109  labelerConfig.addUntrackedParameter("RunRangeSelection", edm::VParameterSet{});
110 
111  std::shared_ptr<PedeLabelerBase> pedeLabeler{PedeLabelerPluginFactory::get()->create(
112  labelerPlugin, PedeLabelerBase::TopLevelAlignables(tracker_.get(), nullptr, nullptr), labelerConfig)};
113 
114  mpReader_ = std::make_unique<MillePedeFileReader>(
115  mpReaderConfig_, pedeLabeler, std::shared_ptr<const AlignPCLThresholds>(myThresholds));
116 }
117 
119  TH2F* histo_status = statusHisto->getTH2F();
120  auto theResults = mpReader_->getResults();
121  theResults.print();
122  histo_status->SetBinContent(1, 1, theResults.getDBUpdated());
123  histo_status->GetXaxis()->SetBinLabel(1, "DB updated");
124  histo_status->SetBinContent(2, 1, theResults.exceedsCutoffs());
125  histo_status->GetXaxis()->SetBinLabel(2, "significant movement");
126  histo_status->SetBinContent(3, 1, theResults.getDBVetoed());
127  histo_status->GetXaxis()->SetBinLabel(3, "DB update vetoed");
128  histo_status->SetBinContent(4, 1, !theResults.exceedsThresholds());
129  histo_status->GetXaxis()->SetBinLabel(4, "within max movement");
130  histo_status->SetBinContent(5, 1, !theResults.exceedsMaxError());
131  histo_status->GetXaxis()->SetBinLabel(5, "within max error");
132  histo_status->SetBinContent(6, 1, !theResults.belowSignificance());
133  histo_status->GetXaxis()->SetBinLabel(6, "above significance");
134 }
135 
137  std::array<double, 6> Xcut_, sigXcut_, maxMoveXcut_, maxErrorXcut_;
138  std::array<double, 6> tXcut_, sigtXcut_, maxMovetXcut_, maxErrortXcut_;
139 
140  std::array<double, 6> Ycut_, sigYcut_, maxMoveYcut_, maxErrorYcut_;
141  std::array<double, 6> tYcut_, sigtYcut_, maxMovetYcut_, maxErrortYcut_;
142 
143  std::array<double, 6> Zcut_, sigZcut_, maxMoveZcut_, maxErrorZcut_;
144  std::array<double, 6> tZcut_, sigtZcut_, maxMovetZcut_, maxErrortZcut_;
145 
146  auto myMap = mpReader_->getThresholdMap();
147 
148  std::vector<std::string> alignablesList;
149  for (auto it = myMap.begin(); it != myMap.end(); ++it) {
150  alignablesList.push_back(it->first);
151  }
152 
153  for (auto& alignable : alignablesList) {
154  int detIndex = getIndexFromString(alignable);
155 
156  Xcut_[detIndex] = myMap[alignable].getXcut();
157  sigXcut_[detIndex] = myMap[alignable].getSigXcut();
158  maxMoveXcut_[detIndex] = myMap[alignable].getMaxMoveXcut();
159  maxErrorXcut_[detIndex] = myMap[alignable].getErrorXcut();
160 
161  Ycut_[detIndex] = myMap[alignable].getYcut();
162  sigYcut_[detIndex] = myMap[alignable].getSigYcut();
163  maxMoveYcut_[detIndex] = myMap[alignable].getMaxMoveYcut();
164  maxErrorYcut_[detIndex] = myMap[alignable].getErrorYcut();
165 
166  Zcut_[detIndex] = myMap[alignable].getZcut();
167  sigZcut_[detIndex] = myMap[alignable].getSigZcut();
168  maxMoveZcut_[detIndex] = myMap[alignable].getMaxMoveZcut();
169  maxErrorZcut_[detIndex] = myMap[alignable].getErrorZcut();
170 
171  tXcut_[detIndex] = myMap[alignable].getThetaXcut();
172  sigtXcut_[detIndex] = myMap[alignable].getSigThetaXcut();
173  maxMovetXcut_[detIndex] = myMap[alignable].getMaxMoveThetaXcut();
174  maxErrortXcut_[detIndex] = myMap[alignable].getErrorThetaXcut();
175 
176  tYcut_[detIndex] = myMap[alignable].getThetaYcut();
177  sigtYcut_[detIndex] = myMap[alignable].getSigThetaYcut();
178  maxMovetYcut_[detIndex] = myMap[alignable].getMaxMoveThetaYcut();
179  maxErrortYcut_[detIndex] = myMap[alignable].getErrorThetaYcut();
180 
181  tZcut_[detIndex] = myMap[alignable].getThetaZcut();
182  sigtZcut_[detIndex] = myMap[alignable].getSigThetaZcut();
183  maxMovetZcut_[detIndex] = myMap[alignable].getMaxMoveThetaZcut();
184  maxErrortZcut_[detIndex] = myMap[alignable].getErrorThetaZcut();
185  }
186 
187  fillExpertHisto(h_xPos, Xcut_, sigXcut_, maxMoveXcut_, maxErrorXcut_, mpReader_->getXobs(), mpReader_->getXobsErr());
189  h_xRot, tXcut_, sigtXcut_, maxMovetXcut_, maxErrortXcut_, mpReader_->getTXobs(), mpReader_->getTXobsErr());
190 
191  fillExpertHisto(h_yPos, Ycut_, sigYcut_, maxMoveYcut_, maxErrorYcut_, mpReader_->getYobs(), mpReader_->getYobsErr());
193  h_yRot, tYcut_, sigtYcut_, maxMovetYcut_, maxErrortYcut_, mpReader_->getTYobs(), mpReader_->getTYobsErr());
194 
195  fillExpertHisto(h_zPos, Zcut_, sigZcut_, maxMoveZcut_, maxErrorZcut_, mpReader_->getZobs(), mpReader_->getZobsErr());
197  h_zRot, tZcut_, sigtZcut_, maxMovetZcut_, maxErrortZcut_, mpReader_->getTZobs(), mpReader_->getTZobsErr());
198 }
199 
201  const std::array<double, 6>& cut,
202  const std::array<double, 6>& sigCut,
203  const std::array<double, 6>& maxMoveCut,
204  const std::array<double, 6>& maxErrorCut,
205  const std::array<double, 6>& obs,
206  const std::array<double, 6>& obsErr) {
207  TH1F* histo_0 = histo->getTH1F();
208 
209  double max_ = *std::max_element(maxMoveCut.begin(), maxMoveCut.end());
210 
211  histo_0->SetMinimum(-(max_));
212  histo_0->SetMaximum(max_);
213 
214  // Schematics of the bin contents
215  //
216  // XX XX XX XX XX XX OO OO OO OO II II II II
217  // |--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|
218  // | 1| 2| 3| 4| 5| 6| 7| 8| 9|10|11|12|13|14|15|16|17| ...
219  //
220  // |-----------------| |-----------| |-----------|
221  // |observed movement| |thresholds1| |thresholds2|
222 
223  for (size_t i = 0; i < obs.size(); ++i) {
224  // fist obs.size() bins for observed movements
225  histo_0->SetBinContent(i + 1, obs[i]);
226  histo_0->SetBinError(i + 1, obsErr[i]);
227 
228  // then at bin 8,8+5,8+10,... for cutoffs
229  // 5 bins is the space allocated for the 4 other thresholds + 1 empty separation bin
230  histo_0->SetBinContent(8 + i * 5, cut[i]);
231 
232  // then at bin 9,9+5,9+10,... for significances
233  histo_0->SetBinContent(9 + i * 5, sigCut[i]);
234 
235  // then at bin 10,10+5,10+10,... for maximum movements
236  histo_0->SetBinContent(10 + i * 5, maxMoveCut[i]);
237 
238  // then at bin 11,11+5,11+10,... for maximum errors
239  histo_0->SetBinContent(11 + i * 5, maxErrorCut[i]);
240  }
241 }
242 
244  bool changed{false};
245 
247  changed = true;
249  changed = true;
251  changed = true;
252 
253  return changed;
254 }
255 
257  if (alignableId == "TPBHalfBarrelXminus") {
258  return 3;
259  } else if (alignableId == "TPBHalfBarrelXplus") {
260  return 2;
261  } else if (alignableId == "TPEHalfCylinderXminusZminus") {
262  return 1;
263  } else if (alignableId == "TPEHalfCylinderXplusZminus") {
264  return 0;
265  } else if (alignableId == "TPEHalfCylinderXminusZplus") {
266  return 5;
267  } else if (alignableId == "TPEHalfCylinderXplusZplus") {
268  return 4;
269  } else {
270  throw cms::Exception("LogicError") << "@SUB=MillePedeDQMModule::getIndexFromString\n"
271  << "Retrieving conversion for not supported Alignable partition" << alignableId;
272  }
273 }
edm::ESWatcher::check
bool check(const edm::EventSetup &iSetup)
Definition: ESWatcher.h:52
edm::ESHandle::product
T const * product() const
Definition: ESHandle.h:86
mps_fire.i
i
Definition: mps_fire.py:355
MessageLogger.h
MillePedeDQMModule::dqmEndJob
void dqmEndJob(DQMStore::IBooker &, DQMStore::IGetter &) override
Definition: MillePedeDQMModule.cc:62
PedeLabelerPluginFactory.h
TkAlMuonSelectors_cfi.cut
cut
Definition: TkAlMuonSelectors_cfi.py:5
MillePedeDQMModule::binariesAvalaible
MonitorElement * binariesAvalaible
Definition: MillePedeDQMModule.h:88
ESHandle.h
MillePedeDQMModule::tracker_
std::unique_ptr< AlignableTracker > tracker_
Definition: MillePedeDQMModule.h:72
edm::Run
Definition: Run.h:45
edm
HLT enums.
Definition: AlignableModifier.h:19
MillePedeDQMModule::mpReader_
std::unique_ptr< MillePedeFileReader > mpReader_
Definition: MillePedeDQMModule.h:73
MillePedeDQMModule::h_xPos
MonitorElement * h_xPos
Definition: MillePedeDQMModule.h:80
edm::LogInfo
Definition: MessageLogger.h:254
dqm::implementation::NavigatorBase::setCurrentFolder
virtual void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:32
timingPdfMaker.histo
histo
Definition: timingPdfMaker.py:279
edm::VParameterSet
std::vector< ParameterSet > VParameterSet
Definition: ParameterSet.h:33
TrackerGeomBuilderFromGeometricDet::build
TrackerGeometry * build(const GeometricDet *gd, const PTrackerParameters &ptp, const TrackerTopology *tTopo)
Definition: TrackerGeomBuilderFromGeometricDet.cc:43
dqm::legacy::MonitorElement
Definition: MonitorElement.h:461
AlignPCLThresholdsRcd
Definition: AlignPCLThresholdsRcd.h:23
PTrackerParameters.h
MillePedeDQMModule::bookHistograms
void bookHistograms(DQMStore::IBooker &)
Definition: MillePedeDQMModule.cc:42
MillePedeDQMModule::fillStatusHisto
void fillStatusHisto(MonitorElement *statusHisto)
Definition: MillePedeDQMModule.cc:118
edm::ParameterSet::addUntrackedParameter
void addUntrackedParameter(std::string const &name, T const &value)
Definition: ParameterSet.h:181
PedeLabelerBase.h
singleTopDQM_cfi.setup
setup
Definition: singleTopDQM_cfi.py:37
PTrackerParametersRcd
Definition: PTrackerParametersRcd.h:9
config
Definition: config.py:1
TrackerTopology.h
AlignPCLThresholdsRcd.h
MillePedeDQMModule::fillExpertHistos
void fillExpertHistos()
Definition: MillePedeDQMModule.cc:136
dqm::impl::MonitorElement::Fill
void Fill(long long x)
Definition: MonitorElement.h:290
MillePedeDQMModule::watchPTrackerParametersRcd_
edm::ESWatcher< PTrackerParametersRcd > watchPTrackerParametersRcd_
Definition: MillePedeDQMModule.h:77
edm::ESHandle< TrackerTopology >
dqm::implementation::NavigatorBase::cd
virtual void cd()
Definition: DQMStore.cc:29
MillePedeDQMModule::h_yPos
MonitorElement * h_yPos
Definition: MillePedeDQMModule.h:82
PedeLabelerBase::TopLevelAlignables
Definition: PedeLabelerBase.h:39
AlCaHLTBitMon_QueryRunRegistry.string
string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
MillePedeDQMModule::h_zPos
MonitorElement * h_zPos
Definition: MillePedeDQMModule.h:84
edm::ParameterSet
Definition: ParameterSet.h:36
MillePedeAlignmentAlgorithm_cfi.pedeLabeler
pedeLabeler
Definition: MillePedeAlignmentAlgorithm_cfi.py:38
dqm::implementation::IBooker::bookString
MonitorElement * bookString(TString const &name, TString const &value, FUNC onbooking=NOOP())
Definition: DQMStore.h:87
ParameterSet
Definition: Functions.h:16
MillePedeDQMModule::mpReaderConfig_
const edm::ParameterSet mpReaderConfig_
Definition: MillePedeDQMModule.h:71
MillePedeDQMModule::watchIdealGeometryRcd_
edm::ESWatcher< IdealGeometryRecord > watchIdealGeometryRcd_
Definition: MillePedeDQMModule.h:76
dqm::implementation::IBooker::bookInt
MonitorElement * bookInt(TString const &name, FUNC onbooking=NOOP())
Definition: DQMStore.h:73
MillePedeDQMModule::~MillePedeDQMModule
~MillePedeDQMModule() override
Definition: MillePedeDQMModule.cc:36
edm::EventSetup
Definition: EventSetup.h:57
MillePedeDQMModule::MillePedeDQMModule
MillePedeDQMModule(const edm::ParameterSet &)
Definition: MillePedeDQMModule.cc:33
MillePedeDQMModule::fillExpertHisto
void fillExpertHisto(MonitorElement *histo, const std::array< double, 6 > &cut, const std::array< double, 6 > &sigCut, const std::array< double, 6 > &maxMoveCut, const std::array< double, 6 > &maxErrorCut, const std::array< double, 6 > &obs, const std::array< double, 6 > &obsErr)
Definition: MillePedeDQMModule.cc:200
get
#define get
MillePedeDQMModule::h_yRot
MonitorElement * h_yRot
Definition: MillePedeDQMModule.h:83
MillePedeDQMModule::setupChanged
bool setupChanged(const edm::EventSetup &)
Definition: MillePedeDQMModule.cc:243
dqm::implementation::IGetter
Definition: DQMStore.h:484
dqm::implementation::IBooker::book2D
MonitorElement * book2D(TString const &name, TString const &title, int nchX, double lowX, double highX, int nchY, double lowY, double highY, FUNC onbooking=NOOP())
Definition: DQMStore.h:177
Exception
Definition: hltDiff.cc:246
MillePedeDQMModule::beginRun
void beginRun(const edm::Run &, const edm::EventSetup &) override
Definition: MillePedeDQMModule.cc:82
EventSetup.h
HLT_2018_cff.sigCut
sigCut
Definition: HLT_2018_cff.py:50439
dqm::implementation::IBooker
Definition: DQMStore.h:43
TrackerGeomBuilderFromGeometricDet.h
TrackerGeomBuilderFromGeometricDet
Definition: TrackerGeomBuilderFromGeometricDet.h:17
MillePedeDQMModule::h_zRot
MonitorElement * h_zRot
Definition: MillePedeDQMModule.h:85
AlignableTracker.h
MillePedeDQMModule::exitCode
MonitorElement * exitCode
Definition: MillePedeDQMModule.h:89
TrackerTopologyRcd
Definition: TrackerTopologyRcd.h:10
MillePedeDQMModule::getIndexFromString
int getIndexFromString(const std::string &alignableId)
Definition: MillePedeDQMModule.cc:256
MillePedeDQMModule::watchTrackerTopologyRcd_
edm::ESWatcher< TrackerTopologyRcd > watchTrackerTopologyRcd_
Definition: MillePedeDQMModule.h:75
MillePedeDQMModule.h
DQM Plotter for PCL-Alignment.
MillePedeDQMModule::h_xRot
MonitorElement * h_xRot
Definition: MillePedeDQMModule.h:81
IdealGeometryRecord
Definition: IdealGeometryRecord.h:27
MillePedeDQMModule::statusResults
MonitorElement * statusResults
Definition: MillePedeDQMModule.h:87
dqm::implementation::IBooker::book1D
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX, FUNC onbooking=NOOP())
Definition: DQMStore.h:98
dqm::legacy::MonitorElement::getTH2F
virtual TH2F * getTH2F() const
Definition: MonitorElement.h:490