File indexing completed on 2024-04-06 12:08:31
0001 #include "DQM/SiStripCommissioningClients/interface/CalibrationHistograms.h"
0002 #include "CondFormats/SiStripObjects/interface/CalibrationAnalysis.h"
0003 #include "CondFormats/SiStripObjects/interface/CalibrationScanAnalysis.h"
0004 #include "DQM/SiStripCommissioningAnalysis/interface/CalibrationAlgorithm.h"
0005 #include "DQM/SiStripCommissioningAnalysis/interface/CalibrationScanAlgorithm.h"
0006 #include "DQM/SiStripCommissioningSummary/interface/CalibrationSummaryFactory.h"
0007 #include "DQM/SiStripCommissioningSummary/interface/CalibrationScanSummaryFactory.h"
0008 #include "DataFormats/SiStripCommon/interface/SiStripConstants.h"
0009 #include "DQM/SiStripCommon/interface/ExtractTObject.h"
0010 #include "DQMServices/Core/interface/DQMStore.h"
0011 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0012 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0013 #include <iostream>
0014 #include <sstream>
0015 #include <iomanip>
0016 #include "TH1F.h"
0017 #include "TFile.h"
0018 #include "TMultiGraph.h"
0019 #include "TGraph.h"
0020
0021 using namespace std;
0022 using namespace sistrip;
0023
0024
0025
0026 CalibrationHistograms::CalibrationHistograms(const edm::ParameterSet& pset, DQMStore* bei, const sistrip::RunType& task)
0027 : CommissioningHistograms(pset.getParameter<edm::ParameterSet>("CalibrationParameters"), bei, task) {
0028 LogTrace(mlDqmClient_) << "[CalibrationHistograms::" << __func__ << "]"
0029 << " Constructing object...";
0030
0031 if (task == sistrip::CALIBRATION_SCAN or task == sistrip::CALIBRATION_SCAN_DECO)
0032 factory_ = make_unique<CalibrationScanSummaryFactory>();
0033 else
0034 factory_ = make_unique<CalibrationSummaryFactory>();
0035
0036 targetRiseTime_ =
0037 this->pset().existsAs<double>("targetRiseTime") ? this->pset().getParameter<double>("targetRiseTime") : 50;
0038 targetDecayTime_ =
0039 this->pset().existsAs<double>("targetDecayTime") ? this->pset().getParameter<double>("targetDecayTime") : 125;
0040 tuneSimultaneously_ =
0041 this->pset().existsAs<bool>("tuneSimultaneously") ? this->pset().getParameter<bool>("tuneSimultaneously") : false;
0042 }
0043
0044
0045
0046 CalibrationHistograms::~CalibrationHistograms() {
0047 LogTrace(mlDqmClient_) << "[CalibrationHistograms::" << __func__ << "]"
0048 << " Deleting object...";
0049 }
0050
0051
0052
0053 void CalibrationHistograms::histoAnalysis(bool debug) {
0054
0055 Analyses::iterator ianal;
0056 for (ianal = data().begin(); ianal != data().end(); ianal++) {
0057 if (ianal->second) {
0058 delete ianal->second;
0059 }
0060 }
0061 data().clear();
0062
0063
0064 HistosMap::const_iterator iter = histos().begin();
0065
0066
0067 for (; iter != histos().end(); iter++) {
0068 if (iter->second.empty()) {
0069 edm::LogWarning(mlDqmClient_) << "[CalibrationHistograms::" << __func__ << "]"
0070 << " Zero collation histograms found!";
0071 continue;
0072 }
0073
0074
0075 vector<TH1*> profs;
0076 Histos::const_iterator ihis = iter->second.begin();
0077 for (; ihis != iter->second.end(); ihis++) {
0078 TH1F* prof = ExtractTObject<TH1F>().extract((*ihis)->me_);
0079 if (prof) {
0080 profs.push_back(prof);
0081 }
0082 }
0083
0084
0085 bool isdeconv = false;
0086 if (task() == sistrip::CALIBRATION_DECO or task() == sistrip::CALIBRATION_SCAN_DECO)
0087 isdeconv = true;
0088
0089 if (task() == sistrip::CALIBRATION_SCAN or task() == sistrip::CALIBRATION_SCAN_DECO) {
0090 CalibrationScanAnalysis* anal = new CalibrationScanAnalysis(iter->first, isdeconv);
0091 CalibrationScanAlgorithm algo(this->pset(), anal);
0092 algo.analysis(profs);
0093 data()[iter->first] = anal;
0094
0095
0096 for (int iapv = 0; iapv < 2; iapv++) {
0097 if (tuneSimultaneously_)
0098 algo.tuneSimultaneously(iapv, targetRiseTime_, targetDecayTime_);
0099 else
0100 algo.tuneIndependently(iapv, targetRiseTime_, targetDecayTime_);
0101 algo.fillTunedObservables(iapv);
0102 }
0103 } else {
0104 CalibrationAnalysis* anal = new CalibrationAnalysis(iter->first, isdeconv);
0105 CalibrationAlgorithm algo(this->pset(), anal);
0106 algo.analysis(profs);
0107 data()[iter->first] = anal;
0108 }
0109 }
0110 }
0111
0112
0113
0114 void CalibrationHistograms::printAnalyses() {
0115 Analyses::iterator ianal = data().begin();
0116 Analyses::iterator janal = data().end();
0117 for (; ianal != janal; ++ianal) {
0118 if (ianal->second) {
0119 std::stringstream ss;
0120 ianal->second->print(ss, 0);
0121 ianal->second->print(ss, 1);
0122 if (ianal->second->isValid()) {
0123 LogTrace(mlDqmClient_) << ss.str();
0124 } else {
0125 edm::LogWarning(mlDqmClient_) << ss.str();
0126 }
0127 }
0128 }
0129 }
0130
0131
0132
0133 void CalibrationHistograms::save(std::string& path, uint32_t run_number, std::string partitionName) {
0134
0135 std::stringstream ss;
0136 if (!path.empty()) {
0137 ss << path;
0138 if (ss.str().find(".root") == std::string::npos) {
0139 ss << ".root";
0140 }
0141
0142 } else {
0143
0144 std::string scratch = "SCRATCH";
0145 std::string dir = "";
0146 if (std::getenv(scratch.c_str()) != nullptr) {
0147 dir = std::getenv(scratch.c_str());
0148 }
0149
0150
0151 if (!dir.empty()) {
0152 ss << dir << "/";
0153 } else {
0154 ss << "/tmp/";
0155 }
0156
0157
0158 if (partitionName.empty())
0159 ss << sistrip::dqmClientFileName_ << "_" << std::setfill('0') << std::setw(8) << run_number << ".root";
0160 else
0161 ss << sistrip::dqmClientFileName_ << "_" << partitionName << "_" << std::setfill('0') << std::setw(8)
0162 << run_number << ".root";
0163 }
0164
0165
0166 LogTrace(mlDqmClient_) << "[CommissioningHistograms::" << __func__ << "]"
0167 << " Saving histograms to root file"
0168 << " (This may take some time!)";
0169 path = ss.str();
0170 bei()->save(path, sistrip::collate_);
0171 edm::LogVerbatim(mlDqmClient_) << "[CommissioningHistograms::" << __func__ << "]"
0172 << " Saved histograms to root file \"" << ss.str() << "\"!";
0173
0174
0175
0176 TFile* outputFile = TFile::Open(path.c_str(), "UPDATE");
0177 outputFile->cd();
0178
0179 auto contents = bei()->getAllContents("");
0180
0181 TMultiGraph* graph_isha = new TMultiGraph("riseTime_vs_isha", "");
0182 TMultiGraph* graph_vfs = new TMultiGraph("decayTime_vs_vfs", "");
0183
0184 bool save_graph_isha = false;
0185 bool save_graph_vfs = false;
0186
0187
0188 Analyses::iterator ianal = data().begin();
0189 Analyses::iterator janal = data().end();
0190 for (; ianal != janal; ++ianal) {
0191 if (ianal->second) {
0192 CalibrationScanAnalysis* anal = dynamic_cast<CalibrationScanAnalysis*>(ianal->second);
0193 SiStripFecKey feckey = anal->fecKey();
0194
0195 TString directory;
0196 for (auto me : contents) {
0197 directory = me->getPathname();
0198 if (directory.Contains(Form("FecCrate%d", feckey.fecCrate())) and
0199 directory.Contains(Form("FecRing%d", feckey.fecRing())) and
0200 directory.Contains(Form("FecSlot%d", feckey.fecSlot())) and
0201 directory.Contains(Form("CcuAddr%d", feckey.ccuAddr())) and
0202 directory.Contains(Form("CcuChan%d", feckey.ccuChan())))
0203 break;
0204 }
0205
0206 outputFile->cd("DQMData/" + directory);
0207
0208 for (size_t igraph = 0; igraph < anal->decayTimeVsVFS().size(); igraph++) {
0209 graph_vfs->Add(anal->decayTimeVsVFS()[igraph]);
0210 anal->decayTimeVsVFS()[igraph]->Write();
0211 save_graph_vfs = true;
0212 }
0213
0214 for (size_t igraph = 0; igraph < anal->riseTimeVsISHA().size(); igraph++) {
0215 graph_isha->Add(anal->riseTimeVsISHA()[igraph]);
0216 anal->riseTimeVsISHA()[igraph]->Write();
0217 save_graph_isha = true;
0218 }
0219
0220 for (size_t igraph = 0; igraph < anal->riseTimeVsISHAVsVFS().size(); igraph++)
0221 anal->riseTimeVsISHAVsVFS()[igraph]->Write();
0222
0223 for (size_t igraph = 0; igraph < anal->decayTimeVsISHAVsVFS().size(); igraph++)
0224 anal->decayTimeVsISHAVsVFS()[igraph]->Write();
0225
0226 outputFile->cd();
0227 }
0228 }
0229
0230 outputFile->cd();
0231 outputFile->cd("DQMData/Collate/SiStrip/ControlView");
0232
0233 if (save_graph_isha)
0234 graph_isha->Write("riseTime_vs_isha");
0235 if (save_graph_vfs)
0236 graph_vfs->Write("decayTime_vs_vfs");
0237
0238 outputFile->Close();
0239 }