Go to the documentation of this file.00001 #ifndef DQMOffline_SiStripBaseServiceFromDQM_SiStripBaseServiceFromDQM_H
00002 #define DQMOffline_SiStripBaseServiceFromDQM_SiStripBaseServiceFromDQM_H
00003
00004 #include "FWCore/Framework/interface/Frameworkfwd.h"
00005 #include "FWCore/ServiceRegistry/interface/Service.h"
00006 #include "DQMServices/Core/interface/DQMStore.h"
00007 #include "CondTools/SiStrip/interface/SiStripCondObjBuilderBase.h"
00008 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00009 #include "DQM/SiStripCommon/interface/SiStripFolderOrganizer.h"
00010 #include "DQMServices/Core/interface/MonitorElement.h"
00011
00012 #include "TH1.h"
00013
00014 #include <string>
00015 #include <memory>
00016 #include <sstream>
00017 #include <algorithm>
00018 #include <boost/lexical_cast.hpp>
00019 #include <boost/shared_ptr.hpp>
00020
00021
00022
00029 template <class T>
00030 class SiStripBaseServiceFromDQM : public SiStripCondObjBuilderBase<T>
00031 {
00032 public:
00033
00034 explicit SiStripBaseServiceFromDQM(const edm::ParameterSet&);
00035 virtual ~SiStripBaseServiceFromDQM();
00036
00038 virtual void getMetaDataString(std::stringstream& ss);
00040 virtual bool checkForCompatibility(std::string ss);
00041
00042 protected:
00043
00045 void openRequestedFile();
00047 bool goToDir(const std::string & name);
00049 void getModuleFolderList(std::vector<std::string>& mfolders);
00051 uint32_t getRunNumber() const;
00058 MonitorElement * getModuleHistogram(const uint32_t detId, const std::string & name);
00059
00060 DQMStore* dqmStore_;
00061 edm::ParameterSet iConfig_;
00062 boost::shared_ptr<SiStripFolderOrganizer> folderOrganizer_;
00063
00064
00065 struct StringNotMatch
00066 {
00067 StringNotMatch(const std::string & name) :
00068 name_(name)
00069 {
00070 }
00071 bool operator()(const MonitorElement * ME) const
00072 {
00073 return( ME->getName().find(name_) == std::string::npos );
00074 }
00075 protected:
00076 std::string name_;
00077 };
00078
00079 };
00080
00081 template <class T>
00082 SiStripBaseServiceFromDQM<T>::SiStripBaseServiceFromDQM(const edm::ParameterSet& iConfig):
00083 SiStripCondObjBuilderBase<T>::SiStripCondObjBuilderBase(iConfig),
00084 iConfig_(iConfig),
00085 folderOrganizer_(boost::shared_ptr<SiStripFolderOrganizer>(new SiStripFolderOrganizer))
00086 {
00087
00088
00089 this->obj_ = 0;
00090 }
00091
00092 template <class T>
00093 SiStripBaseServiceFromDQM<T>::~SiStripBaseServiceFromDQM()
00094 {
00095 }
00096
00097 template <class T>
00098 void SiStripBaseServiceFromDQM<T>::openRequestedFile()
00099 {
00100 dqmStore_ = edm::Service<DQMStore>().operator->();
00101
00102
00103 dqmStore_->setVerbose(0);
00104
00105 if( iConfig_.getParameter<bool>("accessDQMFile") ){
00106
00107 std::string fileName = iConfig_.getUntrackedParameter<std::string>("FILE_NAME","");
00108
00109 edm::LogInfo("SiStripBaseServiceFromDQM") << "[SiStripBaseServiceFromDQM::openRequestedFile] Accessing root File" << fileName;
00110
00111 dqmStore_->open(fileName, false);
00112 } else {
00113 edm::LogInfo("SiStripBaseServiceFromDQM") << "[SiStripBaseServiceFromDQM::openRequestedFile] Accessing dqmStore stream in Online Operation";
00114 }
00115 }
00116
00117 template <class T>
00118 bool SiStripBaseServiceFromDQM<T>::goToDir(const std::string & name)
00119 {
00120 std::string currDir = dqmStore_->pwd();
00121 std::string dirName = currDir.substr(currDir.find_last_of("/")+1);
00122
00123 if( dirName.length() == 0 ) {
00124 std::string currDirCopy(currDir, 0, currDir.length()-1);
00125 dirName = currDirCopy.substr(currDirCopy.find_last_of("/")+1);
00126 }
00127 if (dirName.find(name) == 0) {
00128 return true;
00129 }
00130 std::vector<std::string> subDirVec = dqmStore_->getSubdirs();
00131 for (std::vector<std::string>::const_iterator ic = subDirVec.begin();
00132 ic != subDirVec.end(); ic++) {
00133 dqmStore_->cd(*ic);
00134 if (!goToDir(name)) dqmStore_->goUp();
00135 else return true;
00136 }
00137 return false;
00138 }
00139
00140 template <class T>
00141 void SiStripBaseServiceFromDQM<T>::getModuleFolderList(std::vector<std::string>& mfolders)
00142 {
00143 std::string currDir = dqmStore_->pwd();
00144 if (currDir.find("module_") != std::string::npos) {
00145
00146 mfolders.push_back(currDir);
00147 } else {
00148 std::vector<std::string> subdirs = dqmStore_->getSubdirs();
00149 for( std::vector<std::string>::const_iterator it = subdirs.begin();
00150 it != subdirs.end(); ++it) {
00151 dqmStore_->cd(*it);
00152 getModuleFolderList(mfolders);
00153 dqmStore_->goUp();
00154 }
00155 }
00156 }
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182 template <class T>
00183 uint32_t SiStripBaseServiceFromDQM<T>::getRunNumber() const
00184 {
00185 edm::LogInfo("SiStripBaseServiceFromDQM") << "[SiStripBaseServiceFromDQM::getRunNumber] " << iConfig_.getParameter<uint32_t>("RunNb");
00186 return iConfig_.getParameter<uint32_t>("RunNb");
00187 }
00188
00189 template <class T>
00190 void SiStripBaseServiceFromDQM<T>::getMetaDataString(std::stringstream& ss)
00191 {
00192 std::cout << "SiStripPedestalsDQMService::getMetaDataString" << std::endl;
00193 ss << "Run " << getRunNumber() << std::endl;
00194 }
00195
00196 template <class T>
00197 bool SiStripBaseServiceFromDQM<T>::checkForCompatibility(std::string ss)
00198 {
00199 std::stringstream localString;
00200 getMetaDataString(localString);
00201 if( ss == localString.str() ) return false;
00202
00203 return true;
00204 }
00205
00206 #endif //DQMOffline_SiStripBaseServiceFromDQM_SiStripBaseServiceFromDQM_H