-
Notifications
You must be signed in to change notification settings - Fork 4.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #24474 from jlagram/Print_DetVOff_Summary
Print SiStripDetVoff summary
- Loading branch information
Showing
2 changed files
with
274 additions
and
0 deletions.
There are no files selected for viewing
233 changes: 233 additions & 0 deletions
233
CalibTracker/SiStripDCS/plugins/SiStripDetVOffPrinter.cc
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 <iostream> | ||
#include <fstream> | ||
#include <sstream> | ||
|
||
#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 <TROOT.h> | ||
#include <TSystem.h> | ||
#include <TCanvas.h> | ||
#include <TFile.h> | ||
#include <TLegend.h> | ||
#include <TGraph.h> | ||
#include <TH1.h> | ||
|
||
|
||
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<SiStripDetInfoFileReader> detidReader; | ||
|
||
// IOV DETIDs | ||
std::map<cond::Time_t, std::set< uint32_t > > iovMap_HVOff; | ||
std::map<cond::Time_t, std::set< uint32_t > > iovMap_LVOff; | ||
// DETIDs IOV | ||
std::map<uint32_t, std::vector< cond::Time_t > > 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<edm::ParameterSet>("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<startIov){ | ||
vTime.push_back(startIov); | ||
} else { | ||
vTime.push_back((*iiov).since); | ||
} | ||
auto payload = condDbSession.fetchPayload<SiStripDetVOff>( (*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<uint32_t> detIds; | ||
payload->getDetIds(detIds); | ||
std::set<uint32_t> detIds_HVOff; | ||
std::set<uint32_t> detIds_LVOff; | ||
std::vector<uint32_t>::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<uint32_t>::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<<boost::posix_time::to_simple_string( cond::time::to_boost(*itTime) ) << " " <<boost::posix_time::to_simple_string(mIOVsDuration[ *itTime ])<<std::endl; | ||
}*/ | ||
|
||
// Print summary per module | ||
edm::LogInfo("SiStripDetVOffPrinter") << "[SiStripDetVOffPrinter::" << __func__ << "] " | ||
<< detidMap.size() << " modules were Off at some point during the time interval"; | ||
ss.str(""); | ||
|
||
// Loop over detIds | ||
std::map<uint32_t, std::vector< cond::Time_t > >::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: "<<vecTime.size() | ||
<<" HVOff: "<<cumul_time_HVOff<<" "<<cumul_time_HVOff.total_milliseconds()*100.0/time_period.total_milliseconds()<<"% " | ||
<<" LVOff: "<<cumul_time_LVOff<<" "<<cumul_time_LVOff.total_milliseconds()*100.0/time_period.total_milliseconds()<<"%"<<std::endl; | ||
|
||
} | ||
|
||
condDbSession.transaction().commit(); | ||
|
||
if (!m_output.empty()) { | ||
std::ofstream fout; | ||
fout.open(m_output); | ||
fout << ss.str(); | ||
fout.close(); | ||
} | ||
} | ||
|
||
void | ||
SiStripDetVOffPrinter::fillDescriptions(edm::ConfigurationDescriptions & descriptions) { | ||
|
||
edm::ParameterSetDescription desc; | ||
desc.add<std::string>("conditionDatabase","frontier://FrontierProd/CMS_CONDITIONS"); | ||
desc.add<std::string>("tagName","SiStripDetVOff_1hourDelay_v1_Validation"); | ||
desc.add<std::string>("startTime","2002-01-20 23:59:59.000"); | ||
desc.add<std::string>("endTime","2002-01-20 23:59:59.000"); | ||
desc.add<std::string>("output","PerModuleSummary.txt"); | ||
desc.add<std::string>("connect",""); | ||
|
||
edm::ParameterSetDescription descDBParameters; | ||
descDBParameters.addUntracked<std::string>("authenticationPath",""); | ||
descDBParameters.addUntracked<int>("authenticationSystem",0); | ||
descDBParameters.addUntracked<std::string>("security",""); | ||
descDBParameters.addUntracked<int>("messageLevel",0); | ||
|
||
desc.add<edm::ParameterSetDescription>("DBParameters",descDBParameters); | ||
descriptions.add("siStripDetVOffPrinter", desc); | ||
} | ||
|
||
|
||
void SiStripDetVOffPrinter::endJob() { | ||
} | ||
|
||
DEFINE_FWK_MODULE(SiStripDetVOffPrinter); | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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) |