File indexing completed on 2024-04-06 12:08:32
0001
0002 #include "DQM/SiStripCommissioningClients/interface/SiStripCommissioningOfflineClient.h"
0003 #include "DataFormats/SiStripCommon/interface/SiStripEnumsAndStrings.h"
0004 #include "DataFormats/SiStripCommon/interface/SiStripHistoTitle.h"
0005 #include "DataFormats/SiStripCommon/interface/SiStripFecKey.h"
0006 #include "DQM/SiStripCommissioningClients/interface/FastFedCablingHistograms.h"
0007 #include "DQM/SiStripCommissioningClients/interface/FedCablingHistograms.h"
0008 #include "DQM/SiStripCommissioningClients/interface/ApvTimingHistograms.h"
0009 #include "DQM/SiStripCommissioningClients/interface/OptoScanHistograms.h"
0010 #include "DQM/SiStripCommissioningClients/interface/VpspScanHistograms.h"
0011 #include "DQM/SiStripCommissioningClients/interface/PedestalsHistograms.h"
0012 #include "DQM/SiStripCommissioningClients/interface/PedsOnlyHistograms.h"
0013 #include "DQM/SiStripCommissioningClients/interface/PedsFullNoiseHistograms.h"
0014 #include "DQM/SiStripCommissioningClients/interface/NoiseHistograms.h"
0015 #include "DQM/SiStripCommissioningClients/interface/SamplingHistograms.h"
0016 #include "DQM/SiStripCommissioningClients/interface/CalibrationHistograms.h"
0017 #include "DQM/SiStripCommissioningClients/interface/DaqScopeModeHistograms.h"
0018 #include "FWCore/ServiceRegistry/interface/Service.h"
0019 #include "DQMServices/Core/interface/DQMStore.h"
0020 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0021 #include "FWCore/ParameterSet/interface/FileInPath.h"
0022 #include <iostream>
0023 #include <iomanip>
0024 #include <fstream>
0025 #include <sstream>
0026 #include <sys/types.h>
0027 #include <dirent.h>
0028 #include <cerrno>
0029 #include "TProfile.h"
0030 #include <cstdint>
0031
0032 using namespace sistrip;
0033
0034
0035
0036 SiStripCommissioningOfflineClient::SiStripCommissioningOfflineClient(const edm::ParameterSet& pset)
0037 : bei_(edm::Service<DQMStore>().operator->()),
0038 histos_(nullptr),
0039
0040 outputFileName_(pset.getUntrackedParameter<std::string>("OutputRootFile", "")),
0041 collateHistos_(!pset.getUntrackedParameter<bool>("UseClientFile", false)),
0042 analyzeHistos_(pset.getUntrackedParameter<bool>("AnalyzeHistos", true)),
0043 xmlFile_((pset.getUntrackedParameter<edm::FileInPath>("SummaryXmlFile", edm::FileInPath())).fullPath()),
0044 createSummaryPlots_(false),
0045 clientHistos_(false),
0046 uploadToDb_(false),
0047 runType_(sistrip::UNKNOWN_RUN_TYPE),
0048 runNumber_(0),
0049 partitionName_(pset.existsAs<std::string>("PartitionName") ? pset.getParameter<std::string>("PartitionName")
0050 : ""),
0051 map_(),
0052 plots_(),
0053 parameters_(pset) {
0054 LogTrace(mlDqmClient_) << "[SiStripCommissioningOfflineClient::" << __func__ << "]"
0055 << " Constructing object...";
0056 usesResource("DQMStore");
0057 setInputFiles(inputFiles_,
0058 pset.getUntrackedParameter<std::string>("FilePath"),
0059 pset.existsAs<std::string>("PartitionName") ? pset.getParameter<std::string>("PartitionName") : "",
0060 pset.getUntrackedParameter<uint32_t>("RunNumber"),
0061 collateHistos_);
0062 }
0063
0064
0065
0066 SiStripCommissioningOfflineClient::~SiStripCommissioningOfflineClient() {
0067 LogTrace(mlDqmClient_) << "[SiStripCommissioningOfflineClient::" << __func__ << "]"
0068 << " Destructing object...";
0069 }
0070
0071
0072
0073 void SiStripCommissioningOfflineClient::beginRun(const edm::Run& run, const edm::EventSetup& setup) {
0074 LogTrace(mlDqmClient_) << "[SiStripCommissioningOfflineClient::" << __func__ << "]"
0075 << " Analyzing root file(s)...";
0076
0077
0078 if (!bei_) {
0079 edm::LogError(mlDqmClient_) << "[SiStripCommissioningOfflineClient::" << __func__ << "]"
0080 << " NULL pointer to DQMStore!"
0081 << " Aborting...";
0082 return;
0083 }
0084
0085
0086 std::vector<std::string>::const_iterator ifile = inputFiles_.begin();
0087 for (; ifile != inputFiles_.end(); ifile++) {
0088 std::ifstream root_file;
0089 root_file.open(ifile->c_str());
0090 if (!root_file.is_open()) {
0091 edm::LogError(mlDqmClient_) << "[SiStripCommissioningOfflineClient::" << __func__ << "]"
0092 << " The input root file \"" << *ifile << "\" could not be opened!"
0093 << " Please check the path and filename!";
0094 } else {
0095 root_file.close();
0096 std::string::size_type found = ifile->find(sistrip::dqmClientFileName_);
0097 if (found != std::string::npos && clientHistos_) {
0098 edm::LogError(mlDqmClient_) << "[SiStripCommissioningOfflineClient::" << __func__ << "]"
0099 << " The input root files appear to be a mixture"
0100 << " of \"Source\" and \"Client\" files!"
0101 << " Aborting...";
0102 return;
0103 }
0104 if (found != std::string::npos && inputFiles_.size() != 1) {
0105 edm::LogError(mlDqmClient_) << "[SiStripCommissioningOfflineClient::" << __func__ << "]"
0106 << " There appear to be multiple input \"Client\" root files!"
0107 << " Aborting...";
0108 return;
0109 }
0110 if (found != std::string::npos) {
0111 clientHistos_ = true;
0112 }
0113 }
0114 }
0115 if (clientHistos_ && inputFiles_.size() == 1) {
0116 edm::LogVerbatim(mlDqmClient_) << "[SiStripCommissioningOfflineClient::" << __func__ << "]"
0117 << " Collated histograms found in input root file \"" << inputFiles_[0] << "\"";
0118 }
0119
0120
0121 if (!xmlFile_.empty()) {
0122 std::ifstream xml_file;
0123 xml_file.open(xmlFile_.c_str());
0124 if (!xml_file.is_open()) {
0125 edm::LogError(mlDqmClient_) << "[SiStripCommissioningOfflineClient::" << __func__ << "]"
0126 << " The SummaryPlot XML file \"" << xmlFile_ << "\" could not be opened!"
0127 << " Please check the path and filename!"
0128 << " Aborting...";
0129 return;
0130 } else {
0131 createSummaryPlots_ = true;
0132 xml_file.close();
0133 }
0134 }
0135
0136
0137 if (inputFiles_.empty()) {
0138 edm::LogError(mlDqmClient_) << "[SiStripCommissioningOfflineClient::" << __func__ << "]"
0139 << " No input root files specified!";
0140 return;
0141 }
0142
0143 edm::LogVerbatim(mlDqmClient_) << "[SiStripCommissioningOfflineClient::" << __func__ << "]"
0144 << " Opening root files. This may take some time!...";
0145 std::vector<std::string>::const_iterator jfile = inputFiles_.begin();
0146 for (; jfile != inputFiles_.end(); jfile++) {
0147 LogTrace(mlDqmClient_) << "[SiStripCommissioningOfflineClient::" << __func__ << "]"
0148 << " Opening root file \"" << *jfile << "\"... (This may take some time.)";
0149 if (clientHistos_) {
0150 bei_->open(*jfile, false, sistrip::collate_, "");
0151 } else {
0152 bei_->open(*jfile, false, "SiStrip", sistrip::collate_);
0153 }
0154 LogTrace(mlDqmClient_) << "[SiStripCommissioningOfflineClient::" << __func__ << "]"
0155 << " Opened root file \"" << *jfile << "\"!";
0156 }
0157 edm::LogVerbatim(mlDqmClient_) << "[SiStripCommissioningOfflineClient::" << __func__ << "]"
0158 << " Opened " << inputFiles_.size() << " root files!";
0159
0160
0161 auto allmes = bei_->getAllContents("");
0162 std::vector<std::string> contents;
0163
0164
0165 if (clientHistos_) {
0166 std::set<std::string> temp;
0167 for (auto me : allmes) {
0168 const auto& name = me->getPathname();
0169 if (name.find(sistrip::collate_) != std::string::npos) {
0170 temp.insert(name);
0171 }
0172 }
0173 contents.clear();
0174 for (const auto& s : temp) {
0175
0176 contents.push_back(s + ":");
0177 }
0178 }
0179
0180
0181 LogTrace(mlDqmClient_) << "[SiStripCommissioningOfflineClient::" << __func__ << "]"
0182 << " Found " << contents.size() << " directories containing MonitorElements";
0183
0184
0185 if (false) {
0186 std::stringstream ss;
0187 ss << "[SiStripCommissioningOfflineClient::" << __func__ << "]"
0188 << " Directories found: " << std::endl;
0189 std::vector<std::string>::iterator istr = contents.begin();
0190 for (; istr != contents.end(); istr++) {
0191 ss << " " << *istr << std::endl;
0192 }
0193 LogTrace(mlDqmClient_) << ss.str();
0194 }
0195
0196
0197 runType_ = CommissioningHistograms::runType(bei_, contents);
0198
0199
0200 runNumber_ = CommissioningHistograms::runNumber(bei_, contents);
0201
0202
0203 CommissioningHistograms::copyCustomInformation(bei_, contents);
0204
0205
0206 if (runType_ == sistrip::UNKNOWN_RUN_TYPE) {
0207 edm::LogError(mlDqmClient_) << "[SiStripCommissioningOfflineClient::" << __func__ << "]"
0208 << " Unknown commissioning runType: " << SiStripEnumsAndStrings::runType(runType_)
0209 << " and run number is " << runNumber_;
0210 return;
0211 } else {
0212 edm::LogVerbatim(mlDqmClient_) << "[SiStripCommissioningOfflineClient::" << __func__ << "]"
0213 << " Run type is " << SiStripEnumsAndStrings::runType(runType_)
0214 << " and run number is " << runNumber_;
0215 }
0216
0217
0218 if (createSummaryPlots_) {
0219 edm::LogVerbatim(mlDqmClient_) << "[SiStripCommissioningOfflineClient::" << __func__ << "]"
0220 << " Parsing summary plot XML file...";
0221 SummaryPlotXmlParser xml_file;
0222 xml_file.parseXML(xmlFile_);
0223 plots_ = xml_file.summaryPlots(runType_);
0224 edm::LogVerbatim(mlDqmClient_) << "[SiStripCommissioningOfflineClient::" << __func__ << "]"
0225 << " Parsed summary plot XML file and found " << plots_.size() << " plots defined!";
0226 } else {
0227 edm::LogWarning(mlDqmClient_) << "[SiStripCommissioningOfflineClient::" << __func__ << "]"
0228 << " Null string for SummaryPlotXmlFile!"
0229 << " No summary plots will be created!";
0230 }
0231
0232
0233 std::stringstream ss;
0234 ss << "[SiStripCommissioningOfflineClient::" << __func__ << "]" << std::endl << " Input root files : ";
0235 if (inputFiles_.empty()) {
0236 ss << "(none)";
0237 } else {
0238 std::vector<std::string>::const_iterator ifile = inputFiles_.begin();
0239 for (; ifile != inputFiles_.end(); ifile++) {
0240 if (ifile != inputFiles_.begin()) {
0241 ss << std::setw(25) << std::setfill(' ') << ": ";
0242 }
0243 ss << "\"" << *ifile << "\"" << std::endl;
0244 }
0245 }
0246 ss << " Run type : \"" << SiStripEnumsAndStrings::runType(runType_) << "\"" << std::endl
0247 << " Run number : " << runNumber_ << std::endl
0248 << " Summary plot XML file : ";
0249 if (xmlFile_.empty()) {
0250 ss << "(none)";
0251 } else {
0252 ss << "\"" << xmlFile_ << "\"";
0253 }
0254 edm::LogVerbatim(mlDqmClient_) << ss.str();
0255
0256
0257 LogTrace(mlDqmClient_) << "[SiStripCommissioningOfflineClient::" << __func__ << "]"
0258 << " Creating CommissioningHistogram object...";
0259 createHistos(parameters_, setup);
0260 if (histos_) {
0261 LogTrace(mlDqmClient_) << "[SiStripCommissioningOfflineClient::" << __func__ << "]"
0262 << " Created CommissioningHistogram object!";
0263 } else {
0264 edm::LogError(mlDqmClient_) << "[SiStripCommissioningOfflineClient::" << __func__ << "]"
0265 << " NULL pointer to CommissioningHistogram object!"
0266 << " Aborting...";
0267 return;
0268 }
0269
0270
0271 if (histos_) {
0272 histos_->extractHistograms(contents);
0273 }
0274
0275
0276 if (analyzeHistos_) {
0277 LogTrace(mlDqmClient_) << "[SiStripCommissioningOfflineClient::" << __func__ << "]"
0278 << " Analyzing histograms...";
0279 if (histos_) {
0280 histos_->histoAnalysis(true);
0281 }
0282 LogTrace(mlDqmClient_) << "[SiStripCommissioningOfflineClient::" << __func__ << "]"
0283 << " Analyzed histograms!";
0284 } else {
0285 edm::LogWarning(mlDqmClient_) << "[SiStripCommissioningOfflineClient::" << __func__ << "]"
0286 << " No histogram analysis performed!";
0287 }
0288
0289
0290 if (createSummaryPlots_) {
0291 edm::LogVerbatim(mlDqmClient_) << "[SiStripCommissioningOfflineClient::" << __func__ << "]"
0292 << " Generating summary plots...";
0293 std::vector<SummaryPlot>::const_iterator iplot = plots_.begin();
0294 for (; iplot != plots_.end(); iplot++) {
0295 if (histos_) {
0296 histos_->createSummaryHisto(iplot->monitorable(), iplot->presentation(), iplot->level(), iplot->granularity());
0297 }
0298 }
0299 edm::LogVerbatim(mlDqmClient_) << "[SiStripCommissioningOfflineClient::" << __func__ << "]"
0300 << " Generated summary plots!";
0301 } else {
0302 edm::LogWarning(mlDqmClient_) << "[SiStripCommissioningOfflineClient::" << __func__ << "]"
0303 << " No summary plots generated!";
0304 }
0305
0306
0307 if (histos_) {
0308 bool save = parameters_.getUntrackedParameter<bool>("SaveClientFile", true);
0309 if (save) {
0310 if (runType_ != sistrip::CALIBRATION_SCAN and runType_ != sistrip::CALIBRATION_SCAN_DECO) {
0311 if (runType_ != sistrip::DAQ_SCOPE_MODE)
0312 histos_->save(outputFileName_, runNumber_);
0313 else
0314 histos_->save(outputFileName_, runNumber_, partitionName_);
0315 } else {
0316 CalibrationHistograms* histo = dynamic_cast<CalibrationHistograms*>(histos_);
0317 histo->save(outputFileName_, runNumber_);
0318 }
0319 } else {
0320 edm::LogVerbatim(mlDqmClient_) << "[SiStripCommissioningOfflineClient::" << __func__ << "]"
0321 << " Client file not saved!";
0322 }
0323 }
0324
0325
0326 uploadToConfigDb();
0327
0328
0329 if (histos_) {
0330 histos_->printAnalyses();
0331 histos_->printSummary();
0332 }
0333
0334
0335 if (histos_) {
0336 histos_->remove();
0337 }
0338
0339 edm::LogVerbatim(mlDqmClient_) << "[SiStripCommissioningOfflineClient::" << __func__ << "]"
0340 << " Finished analyzing root file(s)...";
0341 }
0342
0343
0344
0345 void SiStripCommissioningOfflineClient::analyze(const edm::Event& event, const edm::EventSetup& setup) {
0346 if (!(event.id().event() % 10)) {
0347 LogTrace(mlDqmClient_) << "[SiStripCommissioningOfflineClient::" << __func__ << "]"
0348 << " Empty event loop! User can kill job...";
0349 }
0350 }
0351
0352
0353
0354 void SiStripCommissioningOfflineClient::endJob() {}
0355
0356
0357
0358 void SiStripCommissioningOfflineClient::createHistos(const edm::ParameterSet& pset, const edm::EventSetup& setup) {
0359
0360 if (histos_) {
0361 edm::LogError(mlDqmClient_) << "[SiStripCommissioningOfflineClient::" << __func__ << "]"
0362 << " CommissioningHistogram object already exists!"
0363 << " Aborting...";
0364 return;
0365 }
0366
0367
0368 if (!bei_) {
0369 edm::LogError(mlDqmClient_) << "[SiStripCommissioningOfflineClient::" << __func__ << "]"
0370 << " NULL pointer to DQMStore!";
0371 return;
0372 }
0373
0374
0375 if (runType_ == sistrip::FAST_CABLING) {
0376 histos_ = new FastFedCablingHistograms(pset, bei_);
0377 } else if (runType_ == sistrip::FED_CABLING) {
0378 histos_ = new FedCablingHistograms(pset, bei_);
0379 } else if (runType_ == sistrip::APV_TIMING) {
0380 histos_ = new ApvTimingHistograms(pset, bei_);
0381 } else if (runType_ == sistrip::OPTO_SCAN) {
0382 histos_ = new OptoScanHistograms(pset, bei_);
0383 } else if (runType_ == sistrip::VPSP_SCAN) {
0384 histos_ = new VpspScanHistograms(pset, bei_);
0385 } else if (runType_ == sistrip::PEDESTALS) {
0386 histos_ = new PedestalsHistograms(pset, bei_);
0387 } else if (runType_ == sistrip::PEDS_FULL_NOISE) {
0388 histos_ = new PedsFullNoiseHistograms(pset, bei_);
0389 } else if (runType_ == sistrip::PEDS_ONLY) {
0390 histos_ = new PedsOnlyHistograms(pset, bei_);
0391 } else if (runType_ == sistrip::NOISE) {
0392 histos_ = new NoiseHistograms(pset, bei_);
0393 } else if (runType_ == sistrip::APV_LATENCY || runType_ == sistrip::FINE_DELAY) {
0394 histos_ = new SamplingHistograms(pset, bei_, runType_);
0395 } else if (runType_ == sistrip::CALIBRATION || runType_ == sistrip::CALIBRATION_DECO ||
0396 runType_ == sistrip::CALIBRATION_SCAN || runType_ == sistrip::CALIBRATION_SCAN_DECO) {
0397 histos_ = new CalibrationHistograms(pset, bei_, runType_);
0398 } else if (runType_ == sistrip::DAQ_SCOPE_MODE) {
0399 histos_ = new DaqScopeModeHistograms(pset, bei_);
0400 } else if (runType_ == sistrip::UNDEFINED_RUN_TYPE) {
0401 histos_ = nullptr;
0402 edm::LogError(mlDqmClient_) << "[SiStripCommissioningOfflineClient::" << __func__ << "]"
0403 << " Undefined run type!";
0404 return;
0405 } else if (runType_ == sistrip::UNKNOWN_RUN_TYPE) {
0406 histos_ = nullptr;
0407 edm::LogError(mlDqmClient_) << "[SiStripCommissioningOfflineClient::" << __func__ << "]"
0408 << " Unknown run type!";
0409 return;
0410 }
0411 histos_->configure(pset, setup);
0412 }
0413
0414
0415
0416 void SiStripCommissioningOfflineClient::setInputFiles(std::vector<std::string>& files,
0417 const std::string path,
0418 const std::string partitionName,
0419 uint32_t run_number,
0420 bool collate_histos) {
0421 std::string runStr;
0422 std::stringstream ss;
0423 ss << std::setfill('0') << std::setw(8) << run_number;
0424 runStr = ss.str();
0425
0426 std::string nameStr = "";
0427 if (!collate_histos) {
0428 nameStr = "SiStripCommissioningClient_";
0429 } else {
0430 nameStr = "SiStripCommissioningSource_";
0431 }
0432
0433 LogTrace("TEST") << " runStr " << runStr;
0434
0435
0436 DIR* dp;
0437 struct dirent* dirp;
0438 if ((dp = opendir(path.c_str())) == nullptr) {
0439 edm::LogError(mlDqmClient_) << "[SiStripCommissioningOfflineClient::" << __func__ << "]"
0440 << " Error locating directory \"" << path << "\". No such directory!";
0441 return;
0442 }
0443
0444
0445 while ((dirp = readdir(dp)) != nullptr) {
0446 std::string fileName(dirp->d_name);
0447 bool goodName = (fileName.find(nameStr) != std::string::npos);
0448 bool goodRun = (fileName.find(runStr) != std::string::npos);
0449 bool rootFile = (fileName.find(".root") != std::string::npos);
0450 bool goodPartition = true;
0451 if (not partitionName.empty()) {
0452 goodPartition = (fileName.find(partitionName) != std::string::npos);
0453 }
0454
0455
0456 if (goodName && goodRun && rootFile && goodPartition) {
0457 std::string entry = path;
0458 entry += "/";
0459 entry += fileName;
0460 files.push_back(entry);
0461 }
0462 }
0463 closedir(dp);
0464
0465
0466 if (!collate_histos && files.size() > 1) {
0467 std::stringstream ss;
0468 ss << "[SiStripCommissioningOfflineClient::" << __func__ << "]"
0469 << " Found more than one client file!";
0470 std::vector<std::string>::const_iterator ifile = files.begin();
0471 std::vector<std::string>::const_iterator jfile = files.end();
0472 for (; ifile != jfile; ++ifile) {
0473 ss << std::endl << *ifile;
0474 }
0475 edm::LogError(mlDqmClient_) << ss.str();
0476 } else if (files.empty()) {
0477 edm::LogError(mlDqmClient_) << "[SiStripCommissioningOfflineClient::" << __func__ << "]"
0478 << " No input files found!";
0479 }
0480 }