CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
OnlineBeamMonitor.cc
Go to the documentation of this file.
1 /*
2  * \file OnlineBeamMonitor.cc
3  * \author Lorenzo Uplegger/FNAL
4  * modified by Simone Gennai INFN/Bicocca
5  */
6 
21 #include <memory>
22 
23 #include <numeric>
24 
25 using namespace std;
26 using namespace edm;
27 using namespace reco;
28 
29 //----------------------------------------------------------------------------------------------------------------------
31  : monitorName_(ps.getUntrackedParameter<string>("MonitorName")),
32  bsTransientToken_(esConsumes<edm::Transition::BeginLuminosityBlock>()),
33  bsHLTToken_(esConsumes<edm::Transition::BeginLuminosityBlock>()),
34  bsLegacyToken_(esConsumes<edm::Transition::BeginLuminosityBlock>()),
35  numberOfValuesToSave_(0) {
36  if (!monitorName_.empty())
37  monitorName_ = monitorName_ + "/";
38 
39  processedLumis_.clear();
40 
41  varNamesV_.push_back("x");
42  varNamesV_.push_back("y");
43  varNamesV_.push_back("z");
44  varNamesV_.push_back("sigmaX");
45  varNamesV_.push_back("sigmaY");
46  varNamesV_.push_back("sigmaZ");
47 
48  //histoByCategoryNames_.insert(pair<string, string>("run", "Coordinate"));
49  //histoByCategoryNames_.insert(pair<string, string>("run", "PrimaryVertex fit-DataBase"));
50  //histoByCategoryNames_.insert(pair<string, string>("run", "PrimaryVertex fit-BeamFit"));
51  //histoByCategoryNames_.insert(pair<string, string>("run", "PrimaryVertex fit-Scalers"));
52  //histoByCategoryNames_.insert(pair<string, string>("run", "PrimaryVertex-DataBase"));
53  //histoByCategoryNames_.insert(pair<string, string>("run", "PrimaryVertex-BeamFit"));
54  //histoByCategoryNames_.insert(pair<string, string>("run", "PrimaryVertex-Scalers"));
55 
56  histoByCategoryNames_.insert(pair<string, string>("lumi", "Lumibased BeamSpotHLT"));
57  histoByCategoryNames_.insert(pair<string, string>("lumi", "Lumibased BeamSpotLegacy"));
58  histoByCategoryNames_.insert(pair<string, string>("lumi", "Lumibased BeamSpotTransient"));
59 
60  for (const auto& itV : varNamesV_) {
61  for (const auto& itM : histoByCategoryNames_) {
62  histosMap_[itV][itM.first][itM.second] = nullptr;
63  }
64  }
65 }
66 
69  ps.addUntracked<std::string>("MonitorName", "YourSubsystemName");
70  iDesc.addWithDefaultLabel(ps);
71 }
72 
73 //----------------------------------------------------------------------------------------------------------------------
75  edm::Run const& iRun,
76  edm::EventSetup const& iSetup) {
77  string name;
78  string title;
79  int firstLumi = 1;
80  int lastLumi = 3000;
81  for (auto& itM : histosMap_) {
82  //Making histos per Lumi
83  // x,y,z,sigmaX,sigmaY,sigmaZ
84  for (auto& itMM : itM.second) {
85  if (itMM.first != "run") {
86  for (auto& itMMM : itMM.second) {
87  name = string("h") + itM.first + itMMM.first;
88  title = itM.first + "_{0} " + itMMM.first;
89  if (itMM.first == "lumi") {
90  ibooker.setCurrentFolder(monitorName_ + "Debug");
91  itMMM.second = ibooker.book1D(name, title, lastLumi - firstLumi + 1, firstLumi - 0.5, lastLumi + 0.5);
92  itMMM.second->setEfficiencyFlag();
93  } else {
94  LogInfo("OnlineBeamMonitorClient") << "Unrecognized category " << itMM.first;
95  }
96  if (itMMM.second != nullptr) {
97  if (itMMM.first.find('-') != string::npos) {
98  itMMM.second->setAxisTitle(string("#Delta ") + itM.first + "_{0} (cm)", 2);
99  } else {
100  itMMM.second->setAxisTitle(itM.first + "_{0} (cm)", 2);
101  }
102  itMMM.second->setAxisTitle("Lumisection", 1);
103  }
104  }
105  }
106  }
107  }
108 
109  // create and cd into new folder
110  ibooker.setCurrentFolder(monitorName_ + "Validation");
111  //Book histograms
112  bsChoice_ = ibooker.bookProfile("bsChoice",
113  "BS Choice (+1): HLT - (-1): Legacy - (-10): Fake BS - (0): No Transient ",
114  lastLumi - firstLumi + 1,
115  firstLumi - 0.5,
116  lastLumi + 0.5,
117  100,
118  -10,
119  1,
120  "");
121  bsChoice_->setAxisTitle("Lumisection", 1);
122  bsChoice_->setAxisTitle("Choice", 2);
123 }
124 
125 //----------------------------------------------------------------------------------------------------------------------
126 std::shared_ptr<onlinebeammonitor::NoCache> OnlineBeamMonitor::globalBeginLuminosityBlock(
127  const LuminosityBlock& iLumi, const EventSetup& iSetup) const {
128  // Always create a beamspot group for each lumi weather we have results or not! Each Beamspot will be of unknown type!
129 
130  processedLumis_.push_back(iLumi.id().luminosityBlock());
131  //Read BeamSpot from DB
133  ESHandle<BeamSpotOnlineObjects> bsLegacyHandle;
134  ESHandle<BeamSpotObjects> bsTransientHandle;
135 
136  if (auto bsHLTHandle = iSetup.getHandle(bsHLTToken_)) {
137  auto const& spotDB = *bsHLTHandle;
138 
139  // translate from BeamSpotObjects to reco::BeamSpot
140  BeamSpot::Point apoint(spotDB.x(), spotDB.y(), spotDB.z());
141 
143  for (int i = 0; i < 7; ++i) {
144  for (int j = 0; j < 7; ++j) {
145  matrix(i, j) = spotDB.covariance(i, j);
146  }
147  }
148 
149  beamSpotsMap_["HLT"] = BeamSpot(apoint, spotDB.sigmaZ(), spotDB.dxdz(), spotDB.dydz(), spotDB.beamWidthX(), matrix);
150 
151  BeamSpot* aSpot = &(beamSpotsMap_["HLT"]);
152 
153  aSpot->setBeamWidthY(spotDB.beamWidthY());
154  aSpot->setEmittanceX(spotDB.emittanceX());
155  aSpot->setEmittanceY(spotDB.emittanceY());
156  aSpot->setbetaStar(spotDB.betaStar());
157 
158  if (spotDB.beamType() == 2) {
159  aSpot->setType(reco::BeamSpot::Tracker);
160  } else {
161  aSpot->setType(reco::BeamSpot::Fake);
162  }
163  //LogInfo("OnlineBeamMonitor")
164  // << *aSpot << std::endl;
165  } else {
166  LogInfo("OnlineBeamMonitor") << "Database BeamSpot is not valid at lumi: " << iLumi.id().luminosityBlock();
167  }
168  if (auto bsLegacyHandle = iSetup.getHandle(bsLegacyToken_)) {
169  auto const& spotDB = *bsLegacyHandle;
170  // translate from BeamSpotObjects to reco::BeamSpot
171  BeamSpot::Point apoint(spotDB.x(), spotDB.y(), spotDB.z());
172 
174  for (int i = 0; i < 7; ++i) {
175  for (int j = 0; j < 7; ++j) {
176  matrix(i, j) = spotDB.covariance(i, j);
177  }
178  }
179 
180  beamSpotsMap_["Legacy"] =
181  BeamSpot(apoint, spotDB.sigmaZ(), spotDB.dxdz(), spotDB.dydz(), spotDB.beamWidthX(), matrix);
182 
183  BeamSpot* aSpot = &(beamSpotsMap_["Legacy"]);
184 
185  aSpot->setBeamWidthY(spotDB.beamWidthY());
186  aSpot->setEmittanceX(spotDB.emittanceX());
187  aSpot->setEmittanceY(spotDB.emittanceY());
188  aSpot->setbetaStar(spotDB.betaStar());
189 
190  if (spotDB.beamType() == 2) {
191  aSpot->setType(reco::BeamSpot::Tracker);
192  } else {
193  aSpot->setType(reco::BeamSpot::Fake);
194  }
195  //LogInfo("OnlineBeamMonitor")
196  // << *aSpot << std::endl;
197  } else {
198  LogInfo("OnlineBeamMonitor") << "Database BeamSpot is not valid at lumi: " << iLumi.id().luminosityBlock();
199  }
200  if (auto bsTransientHandle = iSetup.getHandle(bsTransientToken_)) {
201  auto const& spotDB = *bsTransientHandle;
202 
203  // translate from BeamSpotObjects to reco::BeamSpot
204  BeamSpot::Point apoint(spotDB.x(), spotDB.y(), spotDB.z());
205 
207  for (int i = 0; i < 7; ++i) {
208  for (int j = 0; j < 7; ++j) {
209  matrix(i, j) = spotDB.covariance(i, j);
210  }
211  }
212 
213  beamSpotsMap_["Transient"] =
214  BeamSpot(apoint, spotDB.sigmaZ(), spotDB.dxdz(), spotDB.dydz(), spotDB.beamWidthX(), matrix);
215 
216  BeamSpot* aSpot = &(beamSpotsMap_["Transient"]);
217 
218  aSpot->setBeamWidthY(spotDB.beamWidthY());
219  aSpot->setEmittanceX(spotDB.emittanceX());
220  aSpot->setEmittanceY(spotDB.emittanceY());
221  aSpot->setbetaStar(spotDB.betaStar());
222 
223  if (spotDB.beamType() == 2) {
224  aSpot->setType(reco::BeamSpot::Tracker);
225  } else {
226  aSpot->setType(reco::BeamSpot::Fake);
227  }
228  //LogInfo("OnlineBeamMonitor")
229  // << *aSpot << std::endl;
230  } else {
231  LogInfo("OnlineBeamMonitor") << "Database BeamSpot is not valid at lumi: " << iLumi.id().luminosityBlock();
232  }
233  return nullptr;
234 }
235 
236 //----------------------------------------------------------------------------------------------------------------------
238  //Setting up the choice
239  if (beamSpotsMap_.find("Transient") != beamSpotsMap_.end()) {
240  if (beamSpotsMap_.find("HLT") != beamSpotsMap_.end() &&
241  beamSpotsMap_["Transient"].x0() == beamSpotsMap_["HLT"].x0()) {
242  bsChoice_->Fill(iLumi.id().luminosityBlock(), 1);
243  bsChoice_->setBinError(iLumi.id().luminosityBlock(), 0.05);
244  } else if (beamSpotsMap_.find("Legacy") != beamSpotsMap_.end() &&
245  beamSpotsMap_["Transient"].x0() == beamSpotsMap_["Legacy"].x0()) {
246  bsChoice_->Fill(iLumi.id().luminosityBlock(), -1);
247  bsChoice_->setBinError(iLumi.id().luminosityBlock(), 0.05);
248  } else {
249  bsChoice_->Fill(iLumi.id().luminosityBlock(), -10);
250  bsChoice_->setBinError(iLumi.id().luminosityBlock(), 0.05);
251  }
252  } else {
253  bsChoice_->Fill(iLumi.id().luminosityBlock(), 0);
254  bsChoice_->setBinError(iLumi.id().luminosityBlock(), 0.05);
255  }
256 
257  // "PV,BF..." Value,Error
258  map<std::string, pair<double, double> > resultsMap;
259  vector<pair<double, double> > vertexResults;
260  MonitorElement* histo = nullptr;
261  for (const auto& itV : varNamesV_) {
262  resultsMap.clear();
263  for (const auto& itBS : beamSpotsMap_) {
264  if (itBS.second.type() == BeamSpot::Tracker) {
265  if (itV == "x") {
266  resultsMap[itBS.first] = pair<double, double>(itBS.second.x0(), itBS.second.x0Error());
267  } else if (itV == "y") {
268  resultsMap[itBS.first] = pair<double, double>(itBS.second.y0(), itBS.second.y0Error());
269  } else if (itV == "z") {
270  resultsMap[itBS.first] = pair<double, double>(itBS.second.z0(), itBS.second.z0Error());
271  } else if (itV == "sigmaX") {
272  resultsMap[itBS.first] = pair<double, double>(itBS.second.BeamWidthX(), itBS.second.BeamWidthXError());
273  } else if (itV == "sigmaY") {
274  resultsMap[itBS.first] = pair<double, double>(itBS.second.BeamWidthY(), itBS.second.BeamWidthYError());
275  } else if (itV == "sigmaZ") {
276  resultsMap[itBS.first] = pair<double, double>(itBS.second.sigmaZ(), itBS.second.sigmaZ0Error());
277  } else {
278  LogInfo("OnlineBeamMonitor") << "The histosMap_ has been built with the name " << itV
279  << " that I can't recognize!";
280  }
281  }
282  }
283 
284  for (const auto& itM : histoByCategoryNames_) {
285  if ((histo = histosMap_[itV][itM.first][itM.second]) == nullptr)
286  continue;
287  if (itM.second == "Lumibased BeamSpotHLT") {
288  if (resultsMap.find("HLT") != resultsMap.end()) {
289  histo->setBinContent(iLumi.id().luminosityBlock(), resultsMap["HLT"].first);
290  histo->setBinError(iLumi.id().luminosityBlock(), resultsMap["HLT"].second);
291  }
292  } else if (itM.second == "Lumibased BeamSpotLegacy") {
293  if (resultsMap.find("Legacy") != resultsMap.end()) {
294  histo->setBinContent(iLumi.id().luminosityBlock(), resultsMap["Legacy"].first);
295  histo->setBinError(iLumi.id().luminosityBlock(), resultsMap["Legacy"].second);
296  }
297  } else if (itM.second == "Lumibased BeamSpotTransient") {
298  if (resultsMap.find("Transient") != resultsMap.end()) {
299  histo->setBinContent(iLumi.id().luminosityBlock(), resultsMap["Transient"].first);
300  histo->setBinError(iLumi.id().luminosityBlock(), resultsMap["Transient"].second);
301  }
302  } else {
303  LogInfo("OnlineBeamMonitor") << "The histosMap_ have a histogram named " << itM.second
304  << " that I can't recognize in this loop!";
305  }
306  }
307  }
308 }
309 
311  if (processedLumis_.empty()) {
312  return;
313  }
314 
315  const double bigNumber = 1000000.;
316  std::sort(processedLumis_.begin(), processedLumis_.end());
317  int firstLumi = *processedLumis_.begin();
318  int lastLumi = *(--processedLumis_.end());
319  bsChoice_->getTH1()->GetXaxis()->SetRangeUser(firstLumi - 0.5, lastLumi + 0.5);
320  for (auto& itH : histosMap_) {
321  for (auto& itHH : itH.second) {
322  double min = bigNumber;
323  double max = -bigNumber;
324  if (itHH.first != "run") {
325  for (auto& itHHH : itHH.second) {
326  if (itHHH.second != nullptr) {
327  for (int bin = 1; bin <= itHHH.second->getTH1()->GetNbinsX(); bin++) {
328  if (itHHH.second->getTH1()->GetBinError(bin) != 0 || itHHH.second->getTH1()->GetBinContent(bin) != 0) {
329  if (itHHH.first == "Lumibased BeamSpotHLT" || itHHH.first == "Lumibased BeamSpotLegacy" ||
330  itHHH.first == "Lumibased BeamSpotTransient") {
331  if (min > itHHH.second->getTH1()->GetBinContent(bin)) {
332  min = itHHH.second->getTH1()->GetBinContent(bin);
333  }
334  if (max < itHHH.second->getTH1()->GetBinContent(bin)) {
335  max = itHHH.second->getTH1()->GetBinContent(bin);
336  }
337  } else {
338  LogInfo("OnlineBeamMonitorClient") << "The histosMap_ have a histogram named " << itHHH.first
339  << " that I can't recognize in this loop!";
340  }
341  }
342  }
343  }
344  }
345  for (auto& itHHH : itHH.second) {
346  if (itHHH.second != nullptr) {
347  if (itHHH.first == "Lumibased BeamSpotHLT" || itHHH.first == "Lumibased BeamSpotLegacy" ||
348  itHHH.first == "Lumibased BeamSpotTransient") {
349  if ((max == -bigNumber && min == bigNumber) || max - min == 0) {
350  itHHH.second->getTH1()->SetMinimum(itHHH.second->getTH1()->GetMinimum() - 0.01);
351  itHHH.second->getTH1()->SetMaximum(itHHH.second->getTH1()->GetMaximum() + 0.01);
352  } else {
353  itHHH.second->getTH1()->SetMinimum(min - 0.1 * (max - min));
354  itHHH.second->getTH1()->SetMaximum(max + 0.1 * (max - min));
355  }
356  } else {
357  LogInfo("OnlineBeamMonitorClient")
358  << "The histosMap_ have a histogram named " << itHHH.first << " that I can't recognize in this loop!";
359  }
360  itHHH.second->getTH1()->GetXaxis()->SetRangeUser(firstLumi - 0.5, lastLumi + 0.5);
361  }
362  }
363  }
364  }
365  }
366 }
LuminosityBlockID id() const
math::Error< dimension >::type CovarianceMatrix
Definition: BeamSpot.h:29
void addWithDefaultLabel(ParameterSetDescription const &psetDescription)
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
std::multimap< std::string, std::string > histoByCategoryNames_
virtual void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:32
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
edm::ESGetToken< BeamSpotOnlineObjects, BeamSpotOnlineLegacyObjectsRcd > bsLegacyToken_
void dqmEndRun(edm::Run const &, edm::EventSetup const &) override
math::XYZPoint Point
point in the space
Definition: BeamSpot.h:27
BeamSpotContainer beamSpotsMap_
void Fill(long long x)
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
std::vector< std::string > varNamesV_
void setBeamWidthY(double v)
Definition: BeamSpot.h:105
MonitorElement * bookProfile(TString const &name, TString const &title, int nchX, double lowX, double highX, int, double lowY, double highY, char const *option="s", FUNC onbooking=NOOP())
Definition: DQMStore.h:322
OnlineBeamMonitor(const edm::ParameterSet &)
Transition
Definition: Transition.h:12
void globalEndLuminosityBlock(const edm::LuminosityBlock &iLumi, const edm::EventSetup &iSetup) override
std::vector< int > processedLumis_
Log< level::Info, false > LogInfo
std::string monitorName_
virtual void setBinContent(int binx, double content)
set content of bin (1-D)
LuminosityBlockNumber_t luminosityBlock() const
MonitorElement * bsChoice_
edm::ESGetToken< BeamSpotOnlineObjects, BeamSpotOnlineHLTObjectsRcd > bsHLTToken_
static void fillDescriptions(edm::ConfigurationDescriptions &)
HistosContainer histosMap_
edm::ESGetToken< BeamSpotObjects, BeamSpotTransientObjectsRcd > bsTransientToken_
virtual void setBinError(int binx, double error)
set uncertainty on content of bin (1-D)
ESHandle< T > getHandle(const ESGetToken< T, R > &iToken) const
Definition: EventSetup.h:151
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX, FUNC onbooking=NOOP())
Definition: DQMStore.h:98
std::shared_ptr< onlinebeammonitor::NoCache > globalBeginLuminosityBlock(const edm::LuminosityBlock &iLumi, const edm::EventSetup &iSetup) const override
ESGetTokenH3DDVariant esConsumes(std::string const &Reccord, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
Definition: Run.h:45
virtual void setAxisTitle(const std::string &title, int axis=1)
set x-, y- or z-axis title (axis=1, 2, 3 respectively)