diff --git a/CalibTracker/SiStripDCS/plugins/SiStripDetVOffPrinter.cc b/CalibTracker/SiStripDCS/plugins/SiStripDetVOffPrinter.cc new file mode 100644 index 0000000000000..6609bd1a41fb4 --- /dev/null +++ b/CalibTracker/SiStripDCS/plugins/SiStripDetVOffPrinter.cc @@ -0,0 +1,233 @@ +#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" + +#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::one::EDAnalyzer<> { +public: + + explicit SiStripDetVOffPrinter(const edm::ParameterSet& iConfig ); + ~SiStripDetVOffPrinter() override; + void analyze( const edm::Event& evt, const edm::EventSetup& evtSetup) override; + void endJob() override; + static void fillDescriptions(edm::ConfigurationDescriptions & descriptions); + +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.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(); +} + +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: "<("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() { +} + +DEFINE_FWK_MODULE(SiStripDetVOffPrinter); + diff --git a/CalibTracker/SiStripDCS/python/dcs_print_summary_cfg.py b/CalibTracker/SiStripDCS/python/dcs_print_summary_cfg.py new file mode 100644 index 0000000000000..8346624fa2058 --- /dev/null +++ b/CalibTracker/SiStripDCS/python/dcs_print_summary_cfg.py @@ -0,0 +1,41 @@ +import FWCore.ParameterSet.Config as cms +import os + +process = cms.Process("summary") + +process.MessageLogger = cms.Service( "MessageLogger", + debugModules = cms.untracked.vstring( "*" ), + cout = cms.untracked.PSet( threshold = cms.untracked.string( "DEBUG" ) ), + destinations = cms.untracked.vstring( "cout" ) + ) + +process.maxEvents = cms.untracked.PSet( + input = cms.untracked.int32(1) +) +process.source = cms.Source("EmptySource", + numberEventsInRun = cms.untracked.uint32(1), + firstRun = cms.untracked.uint32(1) +) + +process.SiStripDetInfoFileReader = cms.Service("SiStripDetInfoFileReader") + +process.load("CondCore.CondDB.CondDB_cfi") +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.siStripDetVOffPrinter)