From e1af6381344bbac45481d8a0aaf045eeaf8f1a82 Mon Sep 17 00:00:00 2001 From: jlagram Date: Mon, 3 Sep 2018 17:44:19 +0200 Subject: [PATCH 1/3] new module to print a summary of power supplies status during a time interval --- .../plugins/SiStripDetVOffPrinter.cc | 211 ++++++++++++++++++ .../python/dcs_print_summary_cfg.py | 36 +++ 2 files changed, 247 insertions(+) create mode 100644 CalibTracker/SiStripDCS/plugins/SiStripDetVOffPrinter.cc create mode 100644 CalibTracker/SiStripDCS/python/dcs_print_summary_cfg.py diff --git a/CalibTracker/SiStripDCS/plugins/SiStripDetVOffPrinter.cc b/CalibTracker/SiStripDCS/plugins/SiStripDetVOffPrinter.cc new file mode 100644 index 0000000000000..05ee421d77295 --- /dev/null +++ b/CalibTracker/SiStripDCS/plugins/SiStripDetVOffPrinter.cc @@ -0,0 +1,211 @@ +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/Framework/interface/EDAnalyzer.h" +#include "FWCore/Framework/interface/MakerMacros.h" +#include "FWCore/ServiceRegistry/interface/Service.h" +#include "FWCore/ParameterSet/interface/ParameterSet.h" + +#include +#include +#include + +#include "CondCore/CondDB/interface/ConnectionPool.h" + +#include "CalibTracker/SiStripCommon/interface/SiStripDetInfoFileReader.h" +#include "CondFormats/SiStripObjects/interface/SiStripDetVOff.h" +#include "CondFormats/Common/interface/Time.h" +#include "CondFormats/Common/interface/TimeConversions.h" + +#include +#include +#include +#include +#include +#include +#include + + +class SiStripDetVOffPrinter : public edm::EDAnalyzer { +public: + + explicit SiStripDetVOffPrinter(const edm::ParameterSet& iConfig ); + virtual ~SiStripDetVOffPrinter(); + virtual void analyze( const edm::Event& evt, const edm::EventSetup& evtSetup); + virtual void endJob(); + +private: + + cond::persistency::ConnectionPool m_connectionPool; + std::string m_condDb; + std::string m_tagName; + + // Manually specify the start/end time. Format: "2002-01-20 23:59:59.000". + std::string m_startTime; + std::string m_endTime; + // Specify output text file name. Leave empty if do not want to dump HV/LV counts in a file. + std::string m_output; + edm::Service detidReader; + + // IOV DETIDs + std::map > iovMap_HVOff; + std::map > iovMap_LVOff; + // DETIDs IOV + std::map > detidMap; +}; + +SiStripDetVOffPrinter::SiStripDetVOffPrinter(const edm::ParameterSet& iConfig): + m_connectionPool(), + m_condDb( iConfig.getParameter< std::string >("conditionDatabase") ), + m_tagName( iConfig.getParameter< std::string >("tagName") ), + m_startTime( iConfig.getUntrackedParameter< std::string >("startTime", "") ), + m_endTime( iConfig.getUntrackedParameter< std::string >("endTime", "") ), + m_output( iConfig.getUntrackedParameter< std::string >("output", "") ){ + m_connectionPool.setParameters( iConfig.getParameter("DBParameters") ); + m_connectionPool.configure(); +} + +SiStripDetVOffPrinter::~SiStripDetVOffPrinter() { +} + +void SiStripDetVOffPrinter::analyze(const edm::Event& evt, const edm::EventSetup& evtSetup) { + + // get total number of modules + //auto num_modules = detidReader->getAllDetIds().size(); + + // use start and end time from config file + boost::posix_time::ptime p_start, p_end; + p_start = boost::posix_time::time_from_string(m_startTime); + p_end = boost::posix_time::time_from_string(m_endTime); + cond::Time_t startIov = cond::time::from_boost(p_start); + cond::Time_t endIov = cond::time::from_boost(p_end); + if (startIov > endIov) + throw cms::Exception("endTime must be greater than startTime!"); + edm::LogInfo("SiStripDetVOffPrinter") << "[SiStripDetVOffPrinter::" << __func__ << "] " + << "Set start time " << startIov << " (" << boost::posix_time::to_simple_string(p_start) << ")" + << "\n ... Set end time " << endIov << " (" << boost::posix_time::to_simple_string(p_end) << ")" ; + + // open db session + edm::LogInfo("SiStripDetVOffPrinter") << "[SiStripDetVOffPrinter::" << __func__ << "] " + << "Query the condition database " << m_condDb; + cond::persistency::Session condDbSession = m_connectionPool.createSession( m_condDb ); + condDbSession.transaction().start( true ); + + std::stringstream ss; + // list of times with new IOVs within the time range + std::vector< cond::Time_t > vTime; + + // query the database + edm::LogInfo("SiStripDetVOffPrinter") << "[SiStripDetVOffPrinter::" << __func__ << "] " + << "Reading IOVs from tag " << m_tagName; + cond::persistency::IOVProxy iovProxy = condDbSession.readIov(m_tagName, true); // load all? + auto iiov = iovProxy.find(startIov); + auto eiov = iovProxy.find(endIov); + int niov = 0; + while (iiov != iovProxy.end() && (*iiov).since <= (*eiov).since){ + // convert cond::Time_t to seconds since epoch + if ((*iiov).since( (*iiov).payloadId ); + // print IOVs summary + ss << boost::posix_time::to_simple_string(cond::time::to_boost((*iiov).since)) + << " (" << (*iiov).since << ")" + << ", # HV Off=" << std::setw(6) << payload->getHVoffCounts() + << ", # LV Off=" << std::setw(6) << payload->getLVoffCounts() << std::endl; + + // list of detids with HV/LV Off + std::vector detIds; + payload->getDetIds(detIds); + std::set detIds_HVOff; + std::set detIds_LVOff; + std::vector::const_iterator it = detIds.begin(); + for( ; it!=detIds.end(); ++it ) { + if(payload->IsModuleHVOff(*it) ) detIds_HVOff.insert(*it); + if(payload->IsModuleLVOff(*it) ) detIds_LVOff.insert(*it); + + if(detidMap.find(*it)==detidMap.end()) { + std::vector< cond::Time_t > vec; + detidMap[*it] = vec; + } + + // for each module concerned by the IOV, add the time in an history vector + detidMap[*it].push_back(vTime.back()); + } + + // fill list of channels Off at a given time + iovMap_HVOff[vTime.back()] = detIds_HVOff; + iovMap_LVOff[vTime.back()] = detIds_LVOff; + + /*std::vector::const_iterator it = detIds.begin(); + for( ; it!=detIds.end(); ++it ) { + std::cout << *it << std::endl; + }*/ + + ++iiov; + ++niov; + } + vTime.push_back(endIov); // used to compute last IOV duration + + edm::LogInfo("SiStripDetVOffPrinter") << "[SiStripDetVOffPrinter::" << __func__ << "] " + << "Read " << niov << " IOVs from tag " << m_tagName << " corresponding to the specified time interval.\n" << ss.str(); + + + // Create a map of IOVs time_duration + std::map< cond::Time_t, boost::posix_time::time_duration > mIOVsDuration; + std::vector< cond::Time_t >::const_iterator itTime = ++vTime.begin(); + std::vector< cond::Time_t >::const_iterator itPreviousTime = vTime.begin(); + //std::vector< cond::Time_t >::const_iterator itLastTime = --vTime.end(); + for( ; itTime!=vTime.end(); ++itTime ) { + mIOVsDuration[ *itPreviousTime ] = cond::time::to_boost(*itTime) - cond::time::to_boost(*itPreviousTime); + itPreviousTime = itTime; + } + boost::posix_time::time_duration time_period = cond::time::to_boost(*(--vTime.end())) - cond::time::to_boost(*(vTime.begin())); + + // debug + /*for( itTime=vTime.begin(); itTime!=itLastTime; ++itTime ) { + std::cout< >::const_iterator itMap = detidMap.begin(); + for( ; itMap!=detidMap.end(); ++itMap ) { + std::vector< cond::Time_t > vecTime = itMap->second; + + boost::posix_time::time_duration cumul_time_HVOff(0,0,0,0); + boost::posix_time::time_duration cumul_time_LVOff(0,0,0,0); + // Loop over IOVs + std::vector< cond::Time_t >::const_iterator itTime = vecTime.begin(); + for( ; itTime!=vecTime.end(); ++itTime ) { + if(iovMap_HVOff[*itTime].find(itMap->first) != iovMap_HVOff[*itTime].end()) cumul_time_HVOff+=mIOVsDuration[*itTime]; + if(iovMap_LVOff[*itTime].find(itMap->first) != iovMap_LVOff[*itTime].end()) cumul_time_LVOff+=mIOVsDuration[*itTime]; + } + ss<<"detId "<< itMap->first <<" #IOVs: "< Date: Tue, 4 Sep 2018 18:00:09 +0200 Subject: [PATCH 2/3] modernize --- .../plugins/SiStripDetVOffPrinter.cc | 166 ++++++++++-------- .../python/dcs_print_summary_cfg.py | 31 ++-- 2 files changed, 112 insertions(+), 85 deletions(-) diff --git a/CalibTracker/SiStripDCS/plugins/SiStripDetVOffPrinter.cc b/CalibTracker/SiStripDCS/plugins/SiStripDetVOffPrinter.cc index 05ee421d77295..6bcfeb20a9053 100644 --- a/CalibTracker/SiStripDCS/plugins/SiStripDetVOffPrinter.cc +++ b/CalibTracker/SiStripDCS/plugins/SiStripDetVOffPrinter.cc @@ -1,5 +1,6 @@ #include "FWCore/Framework/interface/Event.h" #include "FWCore/Framework/interface/EDAnalyzer.h" +#include "FWCore/Framework/interface/one/EDAnalyzer.h" #include "FWCore/Framework/interface/MakerMacros.h" #include "FWCore/ServiceRegistry/interface/Service.h" #include "FWCore/ParameterSet/interface/ParameterSet.h" @@ -24,13 +25,14 @@ #include -class SiStripDetVOffPrinter : public edm::EDAnalyzer { +class SiStripDetVOffPrinter : public edm::one::EDAnalyzer<> { public: explicit SiStripDetVOffPrinter(const edm::ParameterSet& iConfig ); virtual ~SiStripDetVOffPrinter(); virtual void analyze( const edm::Event& evt, const edm::EventSetup& evtSetup); virtual void endJob(); + static void fillDescriptions(edm::ConfigurationDescriptions & descriptions); private: @@ -41,7 +43,7 @@ class SiStripDetVOffPrinter : public edm::EDAnalyzer { // Manually specify the start/end time. Format: "2002-01-20 23:59:59.000". std::string m_startTime; std::string m_endTime; - // Specify output text file name. Leave empty if do not want to dump HV/LV counts in a file. + // Specify output text file name. Leave empty if do not want to dump HV/LV counts in a file. std::string m_output; edm::Service detidReader; @@ -56,9 +58,10 @@ SiStripDetVOffPrinter::SiStripDetVOffPrinter(const edm::ParameterSet& iConfig): m_connectionPool(), m_condDb( iConfig.getParameter< std::string >("conditionDatabase") ), m_tagName( iConfig.getParameter< std::string >("tagName") ), - m_startTime( iConfig.getUntrackedParameter< std::string >("startTime", "") ), - m_endTime( iConfig.getUntrackedParameter< std::string >("endTime", "") ), - m_output( iConfig.getUntrackedParameter< std::string >("output", "") ){ + m_startTime( iConfig.getParameter< std::string >("startTime") ), + m_endTime( iConfig.getParameter< std::string >("endTime") ), + m_output( iConfig.getParameter< std::string >("output") ) +{ m_connectionPool.setParameters( iConfig.getParameter("DBParameters") ); m_connectionPool.configure(); } @@ -67,7 +70,7 @@ SiStripDetVOffPrinter::~SiStripDetVOffPrinter() { } void SiStripDetVOffPrinter::analyze(const edm::Event& evt, const edm::EventSetup& evtSetup) { - + // get total number of modules //auto num_modules = detidReader->getAllDetIds().size(); @@ -80,74 +83,75 @@ void SiStripDetVOffPrinter::analyze(const edm::Event& evt, const edm::EventSetup if (startIov > endIov) throw cms::Exception("endTime must be greater than startTime!"); edm::LogInfo("SiStripDetVOffPrinter") << "[SiStripDetVOffPrinter::" << __func__ << "] " - << "Set start time " << startIov << " (" << boost::posix_time::to_simple_string(p_start) << ")" - << "\n ... Set end time " << endIov << " (" << boost::posix_time::to_simple_string(p_end) << ")" ; + << "Set start time " << startIov << " (" << boost::posix_time::to_simple_string(p_start) << ")" + << "\n ... Set end time " << endIov << " (" << boost::posix_time::to_simple_string(p_end) << ")" ; // open db session edm::LogInfo("SiStripDetVOffPrinter") << "[SiStripDetVOffPrinter::" << __func__ << "] " - << "Query the condition database " << m_condDb; + << "Query the condition database " << m_condDb; cond::persistency::Session condDbSession = m_connectionPool.createSession( m_condDb ); condDbSession.transaction().start( true ); std::stringstream ss; // list of times with new IOVs within the time range std::vector< cond::Time_t > vTime; - + // query the database edm::LogInfo("SiStripDetVOffPrinter") << "[SiStripDetVOffPrinter::" << __func__ << "] " - << "Reading IOVs from tag " << m_tagName; + << "Reading IOVs from tag " << m_tagName; cond::persistency::IOVProxy iovProxy = condDbSession.readIov(m_tagName, true); // load all? auto iiov = iovProxy.find(startIov); auto eiov = iovProxy.find(endIov); int niov = 0; while (iiov != iovProxy.end() && (*iiov).since <= (*eiov).since){ // convert cond::Time_t to seconds since epoch - if ((*iiov).since( (*iiov).payloadId ); // print IOVs summary - ss << boost::posix_time::to_simple_string(cond::time::to_boost((*iiov).since)) - << " (" << (*iiov).since << ")" - << ", # HV Off=" << std::setw(6) << payload->getHVoffCounts() - << ", # LV Off=" << std::setw(6) << payload->getLVoffCounts() << std::endl; - - // list of detids with HV/LV Off - std::vector detIds; - payload->getDetIds(detIds); - std::set detIds_HVOff; - std::set detIds_LVOff; - std::vector::const_iterator it = detIds.begin(); - for( ; it!=detIds.end(); ++it ) { - if(payload->IsModuleHVOff(*it) ) detIds_HVOff.insert(*it); - if(payload->IsModuleLVOff(*it) ) detIds_LVOff.insert(*it); - - if(detidMap.find(*it)==detidMap.end()) { - std::vector< cond::Time_t > vec; - detidMap[*it] = vec; - } - - // for each module concerned by the IOV, add the time in an history vector - detidMap[*it].push_back(vTime.back()); - } - - // fill list of channels Off at a given time - iovMap_HVOff[vTime.back()] = detIds_HVOff; - iovMap_LVOff[vTime.back()] = detIds_LVOff; - + ss << boost::posix_time::to_simple_string(cond::time::to_boost((*iiov).since)) + << " (" << (*iiov).since << ")" + << ", # HV Off=" << std::setw(6) << payload->getHVoffCounts() + << ", # LV Off=" << std::setw(6) << payload->getLVoffCounts() << std::endl; + + // list of detids with HV/LV Off + std::vector detIds; + payload->getDetIds(detIds); + std::set detIds_HVOff; + std::set detIds_LVOff; + std::vector::const_iterator it = detIds.begin(); + for( ; it!=detIds.end(); ++it ) { + if(payload->IsModuleHVOff(*it) ) detIds_HVOff.insert(*it); + if(payload->IsModuleLVOff(*it) ) detIds_LVOff.insert(*it); + + if(detidMap.find(*it)==detidMap.end()) { + std::vector< cond::Time_t > vec; + detidMap[*it] = vec; + } + + // for each module concerned by the IOV, add the time in an history vector + detidMap[*it].push_back(vTime.back()); + } + + // fill list of channels Off at a given time + iovMap_HVOff[vTime.back()] = detIds_HVOff; + iovMap_LVOff[vTime.back()] = detIds_LVOff; + /*std::vector::const_iterator it = detIds.begin(); - for( ; it!=detIds.end(); ++it ) { - std::cout << *it << std::endl; - }*/ - - ++iiov; + for( ; it!=detIds.end(); ++it ) { + std::cout << *it << std::endl; + }*/ + + ++iiov; ++niov; } vTime.push_back(endIov); // used to compute last IOV duration edm::LogInfo("SiStripDetVOffPrinter") << "[SiStripDetVOffPrinter::" << __func__ << "] " - << "Read " << niov << " IOVs from tag " << m_tagName << " corresponding to the specified time interval.\n" << ss.str(); + << "Read " << niov << " IOVs from tag " << m_tagName << " corresponding to the specified time interval.\n" << ss.str(); // Create a map of IOVs time_duration @@ -156,54 +160,72 @@ void SiStripDetVOffPrinter::analyze(const edm::Event& evt, const edm::EventSetup std::vector< cond::Time_t >::const_iterator itPreviousTime = vTime.begin(); //std::vector< cond::Time_t >::const_iterator itLastTime = --vTime.end(); for( ; itTime!=vTime.end(); ++itTime ) { - mIOVsDuration[ *itPreviousTime ] = cond::time::to_boost(*itTime) - cond::time::to_boost(*itPreviousTime); - itPreviousTime = itTime; + mIOVsDuration[ *itPreviousTime ] = cond::time::to_boost(*itTime) - cond::time::to_boost(*itPreviousTime); + itPreviousTime = itTime; } boost::posix_time::time_duration time_period = cond::time::to_boost(*(--vTime.end())) - cond::time::to_boost(*(vTime.begin())); - + // debug /*for( itTime=vTime.begin(); itTime!=itLastTime; ++itTime ) { std::cout< >::const_iterator itMap = detidMap.begin(); for( ; itMap!=detidMap.end(); ++itMap ) { - std::vector< cond::Time_t > vecTime = itMap->second; - + std::vector< cond::Time_t > vecTime = itMap->second; + boost::posix_time::time_duration cumul_time_HVOff(0,0,0,0); boost::posix_time::time_duration cumul_time_LVOff(0,0,0,0); - // Loop over IOVs - std::vector< cond::Time_t >::const_iterator itTime = vecTime.begin(); - for( ; itTime!=vecTime.end(); ++itTime ) { - if(iovMap_HVOff[*itTime].find(itMap->first) != iovMap_HVOff[*itTime].end()) cumul_time_HVOff+=mIOVsDuration[*itTime]; - if(iovMap_LVOff[*itTime].find(itMap->first) != iovMap_LVOff[*itTime].end()) cumul_time_LVOff+=mIOVsDuration[*itTime]; - } - ss<<"detId "<< itMap->first <<" #IOVs: "<::const_iterator itTime = vecTime.begin(); + for( ; itTime!=vecTime.end(); ++itTime ) { + if(iovMap_HVOff[*itTime].find(itMap->first) != iovMap_HVOff[*itTime].end()) cumul_time_HVOff+=mIOVsDuration[*itTime]; + if(iovMap_LVOff[*itTime].find(itMap->first) != iovMap_LVOff[*itTime].end()) cumul_time_LVOff+=mIOVsDuration[*itTime]; + } + ss<<"detId "<< itMap->first <<" #IOVs: "<("conditionDatabase","frontier://FrontierProd/CMS_CONDITIONS"); + desc.add("tagName","SiStripDetVOff_1hourDelay_v1_Validation"); + desc.add("startTime","2002-01-20 23:59:59.000"); + desc.add("endTime","2002-01-20 23:59:59.000"); + desc.add("output","PerModuleSummary.txt"); + desc.add("connect",""); + + edm::ParameterSetDescription descDBParameters; + descDBParameters.addUntracked("authenticationPath",""); + descDBParameters.addUntracked("authenticationSystem",0); + descDBParameters.addUntracked("security",""); + descDBParameters.addUntracked("messageLevel",0); + + desc.add("DBParameters",descDBParameters); + descriptions.add("siStripDetVOffPrinter", desc); } + void SiStripDetVOffPrinter::endJob() { } diff --git a/CalibTracker/SiStripDCS/python/dcs_print_summary_cfg.py b/CalibTracker/SiStripDCS/python/dcs_print_summary_cfg.py index c519facd399b4..8346624fa2058 100644 --- a/CalibTracker/SiStripDCS/python/dcs_print_summary_cfg.py +++ b/CalibTracker/SiStripDCS/python/dcs_print_summary_cfg.py @@ -20,17 +20,22 @@ process.SiStripDetInfoFileReader = cms.Service("SiStripDetInfoFileReader") process.load("CondCore.CondDB.CondDB_cfi") -process.DetVOffSummary = cms.EDAnalyzer( "SiStripDetVOffPrinter", - process.CondDB, - conditionDatabase = cms.string("frontier://FrontierProd/CMS_CONDITIONS"), - # Add the tag - tagName = cms.string("SiStripDetVOff_1hourDelay_v1_Validation"), - # Start and end time - # Time format: "2002-01-20 23:59:59.000" (UTC). - startTime = cms.untracked.string("2018.08.09 18:20:00"), - endTime = cms.untracked.string("2018.08.09 22:14:00"), - # Set output file name. Leave empty if do not want to dump HV/LV counts in a text file. - output = cms.untracked.string("PerModuleSummary.txt") - ) +process.load("CalibTracker.SiStripDCS.siStripDetVOffPrinter_cfi") +process.siStripDetVOffPrinter.tagName = "SiStripDetVOff_13hourDelay_v1_Validation" +process.siStripDetVOffPrinter.startTime = "2018.08.09 18:20:00" +process.siStripDetVOffPrinter.endTime = "2018.08.09 22:14:00" + +# process.DetVOffSummary = cms.EDAnalyzer( "SiStripDetVOffPrinter", +# process.CondDB, +# conditionDatabase = cms.string("frontier://FrontierProd/CMS_CONDITIONS"), +# # Add the tag +# tagName = cms.string("SiStripDetVOff_1hourDelay_v1_Validation"), +# # Start and end time +# # Time format: "2002-01-20 23:59:59.000" (UTC). +# startTime = cms.string("2018.08.09 18:20:00"), +# endTime = cms.string("2018.08.09 22:14:00"), +# # Set output file name. Leave empty if do not want to dump HV/LV counts in a text file. +# output = cms.string("PerModuleSummary.txt") +# ) -process.p = cms.Path(process.DetVOffSummary) +process.p = cms.Path(process.siStripDetVOffPrinter) From 3fda6b50ffa7af96122e3e911d2673ee430d06a4 Mon Sep 17 00:00:00 2001 From: jlagram Date: Wed, 5 Sep 2018 16:45:41 +0200 Subject: [PATCH 3/3] code-checks corrected --- CalibTracker/SiStripDCS/plugins/SiStripDetVOffPrinter.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CalibTracker/SiStripDCS/plugins/SiStripDetVOffPrinter.cc b/CalibTracker/SiStripDCS/plugins/SiStripDetVOffPrinter.cc index 6bcfeb20a9053..6609bd1a41fb4 100644 --- a/CalibTracker/SiStripDCS/plugins/SiStripDetVOffPrinter.cc +++ b/CalibTracker/SiStripDCS/plugins/SiStripDetVOffPrinter.cc @@ -29,9 +29,9 @@ class SiStripDetVOffPrinter : public edm::one::EDAnalyzer<> { public: explicit SiStripDetVOffPrinter(const edm::ParameterSet& iConfig ); - virtual ~SiStripDetVOffPrinter(); - virtual void analyze( const edm::Event& evt, const edm::EventSetup& evtSetup); - virtual void endJob(); + ~SiStripDetVOffPrinter() override; + void analyze( const edm::Event& evt, const edm::EventSetup& evtSetup) override; + void endJob() override; static void fillDescriptions(edm::ConfigurationDescriptions & descriptions); private: @@ -196,7 +196,7 @@ void SiStripDetVOffPrinter::analyze(const edm::Event& evt, const edm::EventSetup condDbSession.transaction().commit(); - if (m_output!="") { + if (!m_output.empty()) { std::ofstream fout; fout.open(m_output); fout << ss.str();