Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:06:50

0001 /*
0002  * \file AlcaBeamMonitorClient.cc
0003  * \author Lorenzo Uplegger/FNAL
0004  *
0005  */
0006 
0007 #include "DQM/BeamMonitor/plugins/AlcaBeamMonitorClient.h"
0008 #include <numeric>
0009 #include "FWCore/Framework/interface/ESHandle.h"
0010 #include "FWCore/Framework/interface/EventSetup.h"
0011 #include "FWCore/Framework/interface/LuminosityBlock.h"
0012 #include "FWCore/Framework/interface/MakerMacros.h"
0013 #include "FWCore/Framework/interface/Run.h"
0014 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0015 #include "FWCore/ServiceRegistry/interface/Service.h"
0016 //#include <iostream>
0017 
0018 using namespace std;
0019 using namespace edm;
0020 // using namespace reco;
0021 
0022 //----------------------------------------------------------------------------------------------------------------------
0023 AlcaBeamMonitorClient::AlcaBeamMonitorClient(const ParameterSet& ps)
0024     : parameters_(ps),
0025       monitorName_(parameters_.getUntrackedParameter<string>("MonitorName", "YourSubsystemName")),
0026       numberOfValuesToSave_(0) {
0027   usesResource("DQMStore");
0028   dbe_ = Service<DQMStore>().operator->();
0029 
0030   if (!monitorName_.empty())
0031     monitorName_ = monitorName_ + "/";
0032 
0033   varNamesV_.push_back("x");
0034   varNamesV_.push_back("y");
0035   varNamesV_.push_back("z");
0036   varNamesV_.push_back("sigmaX");
0037   varNamesV_.push_back("sigmaY");
0038   varNamesV_.push_back("sigmaZ");
0039 
0040   histoByCategoryNames_.insert(pair<string, string>("lumi", "Lumibased BeamSpotFit"));
0041   histoByCategoryNames_.insert(pair<string, string>("lumi", "Lumibased PrimaryVertex"));
0042   histoByCategoryNames_.insert(pair<string, string>("lumi", "Lumibased DataBase"));
0043   histoByCategoryNames_.insert(pair<string, string>("lumi", "Lumibased Scalers"));
0044   histoByCategoryNames_.insert(pair<string, string>("lumi", "Lumibased PrimaryVertex-DataBase fit"));
0045   histoByCategoryNames_.insert(pair<string, string>("lumi", "Lumibased PrimaryVertex-Scalers fit"));
0046   histoByCategoryNames_.insert(pair<string, string>("validation", "Lumibased Scalers-DataBase fit"));
0047   histoByCategoryNames_.insert(pair<string, string>("validation", "Lumibased PrimaryVertex-DataBase"));
0048   histoByCategoryNames_.insert(pair<string, string>("validation", "Lumibased PrimaryVertex-Scalers"));
0049 
0050   for (vector<string>::iterator itV = varNamesV_.begin(); itV != varNamesV_.end(); itV++) {
0051     for (multimap<string, string>::iterator itM = histoByCategoryNames_.begin(); itM != histoByCategoryNames_.end();
0052          itM++) {
0053       histosMap_[*itV][itM->first][itM->second] = nullptr;
0054       positionsMap_[*itV][itM->first][itM->second] = 3 * numberOfValuesToSave_;  // value, error, ok
0055       ++numberOfValuesToSave_;
0056     }
0057   }
0058 }
0059 
0060 AlcaBeamMonitorClient::~AlcaBeamMonitorClient() {}
0061 
0062 //----------------------------------------------------------------------------------------------------------------------
0063 void AlcaBeamMonitorClient::beginJob() {}
0064 
0065 //----------------------------------------------------------------------------------------------------------------------
0066 void AlcaBeamMonitorClient::beginRun(const edm::Run& r, const EventSetup& context) {}
0067 
0068 //----------------------------------------------------------------------------------------------------------------------
0069 
0070 //----------------------------------------------------------------------------------------------------------------------
0071 void AlcaBeamMonitorClient::analyze(const Event& iEvent, const EventSetup& iSetup) {}
0072 
0073 //----------------------------------------------------------------------------------------------------------------------
0074 void AlcaBeamMonitorClient::endLuminosityBlock(const LuminosityBlock& iLumi, const EventSetup& iSetup) {
0075   MonitorElement* tmp = nullptr;
0076   tmp = dbe_->get(monitorName_ + "Service/hHistoLumiValues");
0077   if (!tmp) {
0078     return;
0079   }
0080   valuesMap_[iLumi.id().luminosityBlock()] = vector<double>();
0081   for (int i = 0; i < 3 * numberOfValuesToSave_; i++) {
0082     valuesMap_[iLumi.id().luminosityBlock()].push_back(tmp->getTProfile()->GetBinContent(i + 1));
0083   }
0084 }
0085 
0086 //----------------------------------------------------------------------------------------------------------------------
0087 void AlcaBeamMonitorClient::endRun(const Run& iRun, const EventSetup& context) {
0088   // use this in case any LS is missing.
0089   if (valuesMap_.empty()) {
0090     LogInfo("AlcaBeamMonitorClient") << "The histogram "
0091                                      << monitorName_ +
0092                                             "Service/hHistoLumiValues which contains all the values has not "
0093                                             "been found in any lumi!";
0094     return;
0095   }
0096   int lastLumi = (--valuesMap_.end())->first;
0097   int firstLumi = valuesMap_.begin()->first;
0098 
0099   // create and cd into new folder
0100   dbe_->setCurrentFolder(monitorName_ + "Validation");
0101 
0102   LogInfo("AlcaBeamMonitorClient") << "End of run " << iRun.id().run() << "(" << firstLumi << "-" << lastLumi << ")";
0103 
0104   string name;
0105   string title;
0106   // x,y,z,sigmaX,sigmaY,sigmaZ
0107   for (HistosContainer::iterator itM = histosMap_.begin(); itM != histosMap_.end(); itM++) {
0108     for (map<string, map<string, MonitorElement*> >::iterator itMM = itM->second.begin(); itMM != itM->second.end();
0109          itMM++) {
0110       if (itMM->first != "run") {
0111         for (map<string, MonitorElement*>::iterator itMMM = itMM->second.begin(); itMMM != itMM->second.end();
0112              itMMM++) {
0113           name = string("h") + itM->first + itMMM->first;
0114           title = itM->first + "_{0} " + itMMM->first;
0115           if (itMM->first == "lumi") {
0116             dbe_->setCurrentFolder(monitorName_ + "Debug");
0117             itMMM->second = dbe_->book1D(name, title, lastLumi - firstLumi + 1, firstLumi - 0.5, lastLumi + 0.5);
0118             itMMM->second->setEfficiencyFlag();
0119           } else if (itMM->first == "validation" && itMMM->first == "Lumibased Scalers-DataBase fit") {
0120             dbe_->setCurrentFolder(monitorName_ + "Validation");
0121             itMMM->second = dbe_->book1D(name, title, lastLumi - firstLumi + 1, firstLumi - 0.5, lastLumi + 0.5);
0122             itMMM->second->setEfficiencyFlag();
0123           } else if (itMM->first == "validation" && itMMM->first != "Lumibased Scalers-DataBase fit" &&
0124                      (itM->first == "x" || itM->first == "y" || itM->first == "z")) {
0125             dbe_->setCurrentFolder(monitorName_ + "Validation");
0126             itMMM->second = dbe_->book1D(name, title, lastLumi - firstLumi + 1, firstLumi - 0.5, lastLumi + 0.5);
0127             itMMM->second->setEfficiencyFlag();
0128           } else if (itMM->first == "validation" &&
0129                      (itM->first == "sigmaX" || itM->first == "sigmaY" || itM->first == "sigmaZ")) {
0130             dbe_->setCurrentFolder(monitorName_ + "Validation");
0131             itMMM->second = nullptr;
0132           } else {
0133             LogInfo("AlcaBeamMonitorClient") << "Unrecognized category " << itMM->first;
0134             // assert(0);
0135           }
0136           if (itMMM->second != nullptr) {
0137             if (itMMM->first.find('-') != string::npos) {
0138               itMMM->second->setAxisTitle(string("#Delta ") + itM->first + "_{0} (cm)", 2);
0139             } else {
0140               itMMM->second->setAxisTitle(itM->first + "_{0} (cm)", 2);
0141             }
0142             itMMM->second->setAxisTitle("Lumisection", 1);
0143           }
0144         }
0145       }
0146     }
0147   }
0148 
0149   unsigned int bin = 0;
0150   for (HistosContainer::iterator itH = histosMap_.begin(); itH != histosMap_.end(); itH++) {
0151     for (map<string, map<string, MonitorElement*> >::iterator itHH = itH->second.begin(); itHH != itH->second.end();
0152          itHH++) {
0153       for (map<string, MonitorElement*>::iterator itHHH = itHH->second.begin(); itHHH != itHH->second.end(); itHHH++) {
0154         for (map<LuminosityBlockNumber_t, vector<double> >::iterator itVal = valuesMap_.begin();
0155              itVal != valuesMap_.end();
0156              itVal++) {
0157           if (itHHH->second != nullptr) {
0158             //      cout << positionsMap_[itH->first][itHH->first][itHHH->first]
0159             //<< endl;
0160             if (itVal->second[positionsMap_[itH->first][itHH->first][itHHH->first] + 2] == 1) {
0161               bin = itHHH->second->getTH1()->FindBin(itVal->first);
0162               itHHH->second->setBinContent(bin, itVal->second[positionsMap_[itH->first][itHH->first][itHHH->first]]);
0163               itHHH->second->setBinError(bin, itVal->second[positionsMap_[itH->first][itHH->first][itHHH->first] + 1]);
0164             }
0165           }
0166         }
0167       }
0168     }
0169   }
0170 
0171   /**/
0172   const double bigNumber = 1000000.;
0173   for (HistosContainer::iterator itH = histosMap_.begin(); itH != histosMap_.end(); itH++) {
0174     for (map<string, map<string, MonitorElement*> >::iterator itHH = itH->second.begin(); itHH != itH->second.end();
0175          itHH++) {
0176       double min = bigNumber;
0177       double max = -bigNumber;
0178       double minDelta = bigNumber;
0179       double maxDelta = -bigNumber;
0180       //      double minDeltaProf = bigNumber;
0181       //      double maxDeltaProf = -bigNumber;
0182       if (itHH->first != "run") {
0183         for (map<string, MonitorElement*>::iterator itHHH = itHH->second.begin(); itHHH != itHH->second.end();
0184              itHHH++) {
0185           if (itHHH->second != nullptr) {
0186             for (int bin = 1; bin <= itHHH->second->getTH1()->GetNbinsX(); bin++) {
0187               if (itHHH->second->getTH1()->GetBinError(bin) != 0 || itHHH->second->getTH1()->GetBinContent(bin) != 0) {
0188                 if (itHHH->first == "Lumibased BeamSpotFit" || itHHH->first == "Lumibased PrimaryVertex" ||
0189                     itHHH->first == "Lumibased DataBase" || itHHH->first == "Lumibased Scalers") {
0190                   if (min > itHHH->second->getTH1()->GetBinContent(bin)) {
0191                     min = itHHH->second->getTH1()->GetBinContent(bin);
0192                   }
0193                   if (max < itHHH->second->getTH1()->GetBinContent(bin)) {
0194                     max = itHHH->second->getTH1()->GetBinContent(bin);
0195                   }
0196                 } else if (itHHH->first == "Lumibased PrimaryVertex-DataBase fit" ||
0197                            itHHH->first == "Lumibased PrimaryVertex-Scalers fit" ||
0198                            itHHH->first == "Lumibased Scalers-DataBase fit" ||
0199                            itHHH->first == "Lumibased PrimaryVertex-DataBase" ||
0200                            itHHH->first == "Lumibased PrimaryVertex-Scalers") {
0201                   if (minDelta > itHHH->second->getTH1()->GetBinContent(bin)) {
0202                     minDelta = itHHH->second->getTH1()->GetBinContent(bin);
0203                   }
0204                   if (maxDelta < itHHH->second->getTH1()->GetBinContent(bin)) {
0205                     maxDelta = itHHH->second->getTH1()->GetBinContent(bin);
0206                   }
0207                 } else {
0208                   LogInfo("AlcaBeamMonitorClient") << "The histosMap_ have a histogram named " << itHHH->first
0209                                                    << " that I can't recognize in this loop!";
0210                   // assert(0);
0211                 }
0212               }
0213             }
0214           }
0215         }
0216         for (map<string, MonitorElement*>::iterator itHHH = itHH->second.begin(); itHHH != itHH->second.end();
0217              itHHH++) {
0218           if (itHHH->second != nullptr) {
0219             if (itHHH->first == "Lumibased BeamSpotFit" || itHHH->first == "Lumibased PrimaryVertex" ||
0220                 itHHH->first == "Lumibased DataBase" || itHHH->first == "Lumibased Scalers") {
0221               if ((max == -bigNumber && min == bigNumber) || max - min == 0) {
0222                 itHHH->second->getTH1()->SetMinimum(itHHH->second->getTH1()->GetMinimum() - 0.01);
0223                 itHHH->second->getTH1()->SetMaximum(itHHH->second->getTH1()->GetMaximum() + 0.01);
0224               } else {
0225                 itHHH->second->getTH1()->SetMinimum(min - 0.1 * (max - min));
0226                 itHHH->second->getTH1()->SetMaximum(max + 0.1 * (max - min));
0227               }
0228             } else if (itHHH->first == "Lumibased PrimaryVertex-DataBase fit" ||
0229                        itHHH->first == "Lumibased PrimaryVertex-Scalers fit" ||
0230                        itHHH->first == "Lumibased Scalers-DataBase fit" ||
0231                        itHHH->first == "Lumibased PrimaryVertex-DataBase" ||
0232                        itHHH->first == "Lumibased PrimaryVertex-Scalers") {
0233               if ((maxDelta == -bigNumber && minDelta == bigNumber) || maxDelta - minDelta == 0) {
0234                 itHHH->second->getTH1()->SetMinimum(itHHH->second->getTH1()->GetMinimum() - 0.01);
0235                 itHHH->second->getTH1()->SetMaximum(itHHH->second->getTH1()->GetMaximum() + 0.01);
0236               } else {
0237                 itHHH->second->getTH1()->SetMinimum(minDelta - 2 * (maxDelta - minDelta));
0238                 itHHH->second->getTH1()->SetMaximum(maxDelta + 2 * (maxDelta - minDelta));
0239               }
0240             } else {
0241               LogInfo("AlcaBeamMonitorClient") << "The histosMap_ have a histogram named " << itHHH->first
0242                                                << " that I can't recognize in this loop!";
0243             }
0244           }
0245         }
0246       }
0247     }
0248   }
0249   /**/
0250 }
0251 
0252 DEFINE_FWK_MODULE(AlcaBeamMonitorClient);