File indexing completed on 2024-04-06 12:08:33
0001 #include "DQM/SiStripCommissioningDbClients/interface/CommissioningHistosUsingDb.h"
0002 #include "CalibFormats/SiStripObjects/interface/NumberOfDevices.h"
0003 #include "CalibFormats/SiStripObjects/interface/SiStripFecCabling.h"
0004 #include "CondFormats/SiStripObjects/interface/CommissioningAnalysis.h"
0005 #include "CondFormats/SiStripObjects/interface/FedChannelConnection.h"
0006 #include "CondFormats/SiStripObjects/interface/SiStripFedCabling.h"
0007 #include "DataFormats/SiStripCommon/interface/SiStripEnumsAndStrings.h"
0008 #include "OnlineDB/SiStripConfigDb/interface/SiStripConfigDb.h"
0009 #include "OnlineDB/SiStripESSources/interface/SiStripFedCablingBuilderFromDb.h"
0010 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0011 #include <iostream>
0012
0013 using namespace sistrip;
0014
0015
0016
0017 CommissioningHistosUsingDb::CommissioningHistosUsingDb(SiStripConfigDb* const db,
0018 edm::ESGetToken<TrackerTopology, TrackerTopologyRcd> tTopoToken,
0019 sistrip::RunType type)
0020 : CommissioningHistograms(),
0021 runType_(type),
0022 db_(db),
0023 cabling_(nullptr),
0024 detInfo_(),
0025 uploadAnal_(true),
0026 uploadConf_(false),
0027 tTopoToken_{tTopoToken} {
0028 LogTrace(mlDqmClient_) << "[" << __PRETTY_FUNCTION__ << "]"
0029 << " Constructing object...";
0030 }
0031
0032
0033
0034 CommissioningHistosUsingDb::CommissioningHistosUsingDb()
0035 : CommissioningHistograms(),
0036 runType_(sistrip::UNDEFINED_RUN_TYPE),
0037 db_(nullptr),
0038 cabling_(nullptr),
0039 detInfo_(),
0040 uploadAnal_(false),
0041 uploadConf_(false) {
0042 LogTrace(mlDqmClient_) << "[" << __PRETTY_FUNCTION__ << "]"
0043 << " Constructing object..." << endl;
0044 }
0045
0046
0047
0048 CommissioningHistosUsingDb::~CommissioningHistosUsingDb() {
0049 if (db_) {
0050 delete db_;
0051 }
0052 LogTrace(mlDqmClient_) << "[" << __PRETTY_FUNCTION__ << "]"
0053 << " Destructing object...";
0054 }
0055
0056 void CommissioningHistosUsingDb::configure(const edm::ParameterSet&, const edm::EventSetup& setup) {
0057 if (!db_) {
0058 edm::LogError(mlDqmClient_) << "[CommissioningHistosUsingDb::" << __func__ << "]"
0059 << " NULL pointer to SiStripConfigDb interface!"
0060 << " Cannot configure...";
0061 } else {
0062
0063 SiStripFecCabling fec_cabling;
0064 if (runType_ == sistrip::FAST_CABLING) {
0065 SiStripFedCablingBuilderFromDb::buildFecCablingFromDevices(db_, fec_cabling);
0066 } else {
0067 SiStripFedCablingBuilderFromDb::buildFecCabling(db_, fec_cabling);
0068 }
0069
0070
0071 cabling_ = new SiStripFedCabling();
0072 SiStripFedCablingBuilderFromDb::getFedCabling(fec_cabling, *cabling_);
0073 std::stringstream ss;
0074 ss << "[CommissioningHistosUsingDb::" << __func__ << "]"
0075 << " Terse print out of FED cabling:" << std::endl;
0076 cabling_->terse(ss);
0077 LogTrace(mlDqmClient_) << ss.str();
0078
0079 const auto& tTopo = setup.getData(tTopoToken_);
0080 std::stringstream sss;
0081 sss << "[CommissioningHistosUsingDb::" << __func__ << "]"
0082 << " Summary of FED cabling:" << std::endl;
0083 cabling_->summary(sss, &tTopo);
0084 edm::LogVerbatim(mlDqmClient_) << sss.str();
0085 }
0086 }
0087
0088
0089
0090 void CommissioningHistosUsingDb::uploadToConfigDb() {
0091 buildDetInfo();
0092 addDcuDetIds();
0093 uploadConfigurations();
0094 uploadAnalyses();
0095 }
0096
0097
0098
0099 void CommissioningHistosUsingDb::uploadAnalyses() {
0100 if (!db_) {
0101 edm::LogError(mlDqmClient_) << "[CommissioningHistosUsingDb::" << __func__ << "]"
0102 << " NULL pointer to SiStripConfigDb interface!"
0103 << " Aborting upload...";
0104 return;
0105 }
0106
0107 db_->clearAnalysisDescriptions();
0108 SiStripDbParams::SiStripPartitions::const_iterator ip = db_->dbParams().partitions().begin();
0109 SiStripDbParams::SiStripPartitions::const_iterator jp = db_->dbParams().partitions().end();
0110 for (; ip != jp; ++ip) {
0111 edm::LogVerbatim(mlDqmClient_) << "[CommissioningHistosUsingDb::" << __func__ << "]"
0112 << " Starting from partition " << ip->first << " with versions:\n"
0113 << std::dec << " Conn: " << ip->second.cabVersion().first << "."
0114 << ip->second.cabVersion().second << "\n"
0115 << " FED: " << ip->second.fedVersion().first << "."
0116 << ip->second.fedVersion().second << "\n"
0117 << " FEC: " << ip->second.fecVersion().first << "."
0118 << ip->second.fecVersion().second << "\n"
0119 << " Mask: " << ip->second.maskVersion().first << "."
0120 << ip->second.maskVersion().second;
0121
0122
0123 SiStripConfigDb::AnalysisDescriptionsV anals;
0124 createAnalyses(anals);
0125
0126 edm::LogVerbatim(mlDqmClient_) << "[CommissioningHistosUsingDb::" << __func__ << "]"
0127 << " Created analysis descriptions for " << anals.size() << " devices";
0128
0129
0130 if (uploadAnal_) {
0131 if (uploadConf_) {
0132 edm::LogVerbatim(mlDqmClient_) << "[CommissioningHistosUsingDb::" << __func__ << "]"
0133 << " Uploading major version of analysis descriptions to DB"
0134 << " (will be used for physics)...";
0135 } else {
0136 edm::LogVerbatim(mlDqmClient_) << "[CommissioningHistosUsingDb::" << __func__ << "]"
0137 << " Uploading minor version of analysis descriptions to DB"
0138 << " (will not be used for physics)...";
0139 }
0140 db_->clearAnalysisDescriptions(ip->second.partitionName());
0141 db_->addAnalysisDescriptions(ip->second.partitionName(), anals);
0142 db_->uploadAnalysisDescriptions(uploadConf_, ip->second.partitionName());
0143 edm::LogVerbatim(mlDqmClient_) << "[CommissioningHistosUsingDb::" << __func__ << "]"
0144 << " Upload of analysis descriptions to DB finished!";
0145 } else {
0146 edm::LogWarning(mlDqmClient_) << "[CommissioningHistosUsingDb::" << __func__ << "]"
0147 << " TEST! No analysis descriptions will be uploaded to DB...";
0148 }
0149
0150 if (uploadConf_) {
0151 SiStripDbParams::SiStripPartitions::const_iterator ip = db_->dbParams().partitions().begin();
0152 SiStripDbParams::SiStripPartitions::const_iterator jp = db_->dbParams().partitions().end();
0153 for (; ip != jp; ++ip) {
0154 DeviceFactory* df = db_->deviceFactory();
0155 tkStateVector states = df->getCurrentStates();
0156 tkStateVector::const_iterator istate = states.begin();
0157 tkStateVector::const_iterator jstate = states.end();
0158 while (istate != jstate) {
0159 if (*istate && ip->first == (*istate)->getPartitionName()) {
0160 break;
0161 }
0162 istate++;
0163 }
0164
0165 if (istate != states.end()) {
0166 edm::LogVerbatim(mlDqmClient_) << "[CommissioningHistosUsingDb::" << __func__ << "]"
0167 << " Created new version for partition " << ip->first << ". Current state:\n"
0168 << std::dec << " Conn: " << (*istate)->getConnectionVersionMajorId() << "."
0169 << (*istate)->getConnectionVersionMinorId() << "\n"
0170 << " FED: " << (*istate)->getFedVersionMajorId() << "."
0171 << (*istate)->getFedVersionMinorId() << "\n"
0172 << " FEC: " << (*istate)->getFecVersionMajorId() << "."
0173 << (*istate)->getFecVersionMinorId() << "\n"
0174 << " Mask: " << (*istate)->getMaskVersionMajorId() << "."
0175 << (*istate)->getMaskVersionMinorId();
0176 }
0177 }
0178 }
0179 }
0180 }
0181
0182
0183
0184 void CommissioningHistosUsingDb::addDcuDetIds() {
0185 if (!cabling_) {
0186 edm::LogWarning(mlDqmClient_) << "[CommissioningHistosUsingDb::" << __func__ << "]"
0187 << " NULL pointer to SiStripFedCabling object!";
0188 return;
0189 }
0190
0191 Analyses::iterator ianal = data().begin();
0192 Analyses::iterator janal = data().end();
0193 for (; ianal != janal; ++ianal) {
0194 CommissioningAnalysis* anal = ianal->second;
0195
0196 if (!anal) {
0197 edm::LogWarning(mlDqmClient_) << "[CommissioningHistosUsingDb::" << __func__ << "]"
0198 << " NULL pointer to CommissioningAnalysis object!";
0199 return;
0200 }
0201
0202 SiStripFedKey fed_key = anal->fedKey();
0203 SiStripFecKey fec_key = anal->fecKey();
0204
0205 FedChannelConnection conn = cabling_->fedConnection(fed_key.fedId(), fed_key.fedChannel());
0206
0207 SiStripFedKey fed(conn.fedId(), SiStripFedKey::feUnit(conn.fedCh()), SiStripFedKey::feChan(conn.fedCh()));
0208
0209 SiStripFecKey fec(
0210 conn.fecCrate(), conn.fecSlot(), conn.fecRing(), conn.ccuAddr(), conn.ccuChan(), conn.lldChannel());
0211
0212 if (fed_key.path() != fed.path()) {
0213 std::stringstream ss;
0214 ss << "[CommissioningHistosUsingDb::" << __func__ << "]"
0215 << " Cannot set DCU and DetId values in commissioning analysis object!" << std::endl
0216 << " Incompatible FED key retrieved from cabling!" << std::endl
0217 << " FED key from analysis object : " << fed_key.path() << std::endl
0218 << " FED key from cabling object : " << fed.path() << std::endl
0219 << " FED id/ch from analysis object: " << fed_key.fedId() << "/" << fed_key.fedChannel() << std::endl
0220 << " FED id/ch from cabling object : " << conn.fedId() << "/" << conn.fedCh();
0221 edm::LogWarning(mlDqmClient_) << ss.str();
0222
0223 } else if (fec_key.path() != fec.path()) {
0224 std::stringstream ss;
0225 ss << "[CommissioningHistosUsingDb::" << __func__ << "]"
0226 << " Cannot set DCU and DetId values in commissioning analysis object!" << std::endl
0227 << " Incompatible FEC key retrieved from cabling!" << std::endl
0228 << " FEC key from analysis object : " << fec_key.path() << std::endl
0229 << " FEC key from cabling object : " << fec.path();
0230 edm::LogWarning(mlDqmClient_) << ss.str();
0231
0232 } else {
0233 anal->dcuId(conn.dcuId());
0234 anal->detId(conn.detId());
0235 }
0236 }
0237 }
0238
0239
0240
0241 void CommissioningHistosUsingDb::createAnalyses(SiStripConfigDb::AnalysisDescriptionsV& desc) {
0242 LogTrace(mlDqmClient_) << "[CommissioningHistosUsingDb::" << __func__ << "]"
0243 << " Creating AnalysisDescriptions...";
0244
0245 desc.clear();
0246
0247 Analyses::iterator ianal = data().begin();
0248 Analyses::iterator janal = data().end();
0249 for (; ianal != janal; ++ianal) {
0250
0251 create(desc, ianal);
0252 }
0253 }
0254
0255
0256
0257 void CommissioningHistosUsingDb::buildDetInfo() {
0258 detInfo_.clear();
0259
0260 if (!db()) {
0261 edm::LogError(mlDqmClient_) << "[CommissioningHistosUsingDb::" << __func__ << "]"
0262 << " NULL pointer to SiStripConfigDb interface!";
0263 return;
0264 }
0265
0266 SiStripDbParams::SiStripPartitions::const_iterator ii = db_->dbParams().partitions().begin();
0267 SiStripDbParams::SiStripPartitions::const_iterator jj = db_->dbParams().partitions().end();
0268 for (; ii != jj; ++ii) {
0269
0270 std::string pp = ii->second.partitionName();
0271 SiStripConfigDb::DeviceDescriptionsRange dcus = db()->getDeviceDescriptions(DCU, pp);
0272 SiStripConfigDb::DcuDetIdsRange dets = db()->getDcuDetIds(pp);
0273
0274
0275 SiStripConfigDb::DeviceDescriptionsV::const_iterator idcu = dcus.begin();
0276 SiStripConfigDb::DeviceDescriptionsV::const_iterator jdcu = dcus.end();
0277 for (; idcu != jdcu; ++idcu) {
0278
0279 dcuDescription* dcu = dynamic_cast<dcuDescription*>(*idcu);
0280 if (!dcu) {
0281 continue;
0282 }
0283 if (dcu->getDcuType() != "FEH") {
0284 continue;
0285 }
0286
0287
0288
0289
0290 if (dcu->getDcuHardId() == 16448250)
0291 continue;
0292
0293
0294 SiStripConfigDb::DcuDetIdsV::const_iterator idet = dets.end();
0295 idet = SiStripConfigDb::findDcuDetId(dets.begin(), dets.end(), dcu->getDcuHardId());
0296 if (idet == dets.begin()) {
0297 continue;
0298 }
0299
0300
0301 TkDcuInfo* det = idet->second;
0302 if (!det) {
0303 continue;
0304 }
0305
0306
0307 const SiStripConfigDb::DeviceAddress& addr = db()->deviceAddress(*dcu);
0308 SiStripFecKey fec_key(addr.fecCrate_, addr.fecSlot_, addr.fecRing_, addr.ccuAddr_, addr.ccuChan_);
0309
0310
0311 DetInfo info;
0312 info.dcuId_ = det->getDcuHardId();
0313 info.detId_ = det->getDetId();
0314 info.pairs_ = det->getApvNumber() / 2;
0315
0316
0317 if (fec_key.isValid()) {
0318 detInfo_[pp][fec_key.key()] = info;
0319 }
0320 }
0321 }
0322
0323
0324 if (edm::isDebugEnabled()) {
0325 std::stringstream ss;
0326 ss << "[CommissioningHistosUsingDb::" << __func__ << "]"
0327 << " List of modules for " << detInfo_.size()
0328 << " partitions, with their DCUids, DetIds, and nApvPairs: " << std::endl;
0329 std::map<std::string, DetInfos>::const_iterator ii = detInfo_.begin();
0330 std::map<std::string, DetInfos>::const_iterator jj = detInfo_.end();
0331 for (; ii != jj; ++ii) {
0332 ss << " Partition \"" << ii->first << "\" has " << ii->second.size() << " modules:" << std::endl;
0333 DetInfos::const_iterator iii = ii->second.begin();
0334 DetInfos::const_iterator jjj = ii->second.end();
0335 for (; iii != jjj; ++iii) {
0336 SiStripFecKey key = iii->first;
0337 ss << " module= " << key.fecCrate() << "/" << key.fecSlot() << "/" << key.fecRing() << "/" << key.ccuAddr()
0338 << "/" << key.ccuChan() << ", " << std::hex << " DCUid= " << std::setw(8) << std::setfill('0')
0339 << iii->second.dcuId_ << " DetId= " << std::setw(8) << std::setfill('0') << iii->second.detId_ << std::dec
0340 << " nPairs= " << iii->second.pairs_ << std::endl;
0341 }
0342 }
0343
0344 }
0345 }
0346
0347
0348
0349 std::pair<std::string, CommissioningHistosUsingDb::DetInfo> CommissioningHistosUsingDb::detInfo(
0350 const SiStripFecKey& key) {
0351 SiStripFecKey tmp(key, sistrip::CCU_CHAN);
0352 if (tmp.isInvalid()) {
0353 return std::make_pair("", DetInfo());
0354 }
0355 std::map<std::string, DetInfos>::const_iterator ii = detInfo_.begin();
0356 std::map<std::string, DetInfos>::const_iterator jj = detInfo_.end();
0357 for (; ii != jj; ++ii) {
0358 DetInfos::const_iterator iii = ii->second.find(tmp.key());
0359 if (iii != ii->second.end()) {
0360 return std::make_pair(ii->first, iii->second);
0361 }
0362 }
0363 return std::make_pair("", DetInfo());
0364 }
0365
0366
0367
0368 bool CommissioningHistosUsingDb::deviceIsPresent(const SiStripFecKey& key) {
0369 SiStripFecKey tmp(key, sistrip::CCU_CHAN);
0370 std::pair<std::string, DetInfo> info = detInfo(key);
0371 if (info.second.dcuId_ != sistrip::invalid32_) {
0372 if (key.channel() == 2 && info.second.pairs_ == 2) {
0373 return false;
0374 } else {
0375 return true;
0376 }
0377 } else {
0378 std::stringstream ss;
0379 ss << "[CommissioningHistosUsingDb::" << __func__ << "]"
0380 << " Cannot find module (crate/FEC/ring/CCU/module): " << tmp.fecCrate() << "/" << tmp.fecSlot() << "/"
0381 << tmp.fecRing() << "/" << tmp.ccuAddr() << "/" << tmp.ccuChan() << "!";
0382 edm::LogWarning(mlDqmClient_) << ss.str();
0383 return true;
0384 }
0385 }