File indexing completed on 2023-03-17 11:15:33
0001
0002 #include "OnlineDB/SiStripConfigDb/interface/SiStripConfigDb.h"
0003 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0004 #include <ostream>
0005
0006 using namespace std;
0007 using namespace sistrip;
0008
0009
0010
0011 SiStripConfigDb::FedConnectionsRange SiStripConfigDb::getFedConnections(std::string partition) {
0012
0013 if ((!dbParams_.usingDbCache() && !deviceFactory(__func__)) ||
0014 (dbParams_.usingDbCache() && !databaseCache(__func__))) {
0015 return connections_.emptyRange();
0016 }
0017
0018 try {
0019 if (!dbParams_.usingDbCache()) {
0020 SiStripDbParams::SiStripPartitions::const_iterator iter = dbParams_.partitions().begin();
0021 SiStripDbParams::SiStripPartitions::const_iterator jter = dbParams_.partitions().end();
0022 for (; iter != jter; ++iter) {
0023 if (partition.empty() || partition == iter->second.partitionName()) {
0024 if (iter->second.partitionName() == SiStripPartition::defaultPartitionName_) {
0025 continue;
0026 }
0027
0028 FedConnectionsRange range = connections_.find(iter->second.partitionName());
0029 if (range == connections_.emptyRange()) {
0030 FedConnectionsV tmp2;
0031
0032
0033 FedConnectionsV tmp1;
0034 deviceFactory(__func__)->getConnectionDescriptions(iter->second.partitionName(),
0035 tmp1,
0036 iter->second.cabVersion().first,
0037 iter->second.cabVersion().second,
0038
0039 iter->second.maskVersion().first,
0040 iter->second.maskVersion().second,
0041
0042 false);
0043
0044
0045 ConnectionFactory::vectorCopyI(tmp2, tmp1, true);
0046
0047
0048 connections_.loadNext(iter->second.partitionName(), tmp2);
0049
0050
0051 FedConnectionsRange conns = connections_.find(iter->second.partitionName());
0052 std::stringstream ss;
0053 ss << "[SiStripConfigDb::" << __func__ << "]"
0054 << " Downloaded " << conns.size() << " FED connections to local cache for partition \""
0055 << iter->second.partitionName() << "\"" << std::endl;
0056 ss << "[SiStripConfigDb::" << __func__ << "]"
0057 << " Cache holds FED connections for " << connections_.size() << " partitions.";
0058 LogTrace(mlConfigDb_) << ss.str();
0059 }
0060 }
0061 }
0062
0063 } else {
0064
0065 FedConnectionsV* tmp1 = databaseCache(__func__)->getConnections();
0066
0067 if (tmp1) {
0068
0069 FedConnectionsV tmp2;
0070 ConnectionFactory::vectorCopyI(tmp2, *tmp1, true);
0071
0072
0073 connections_.loadNext(SiStripPartition::defaultPartitionName_, tmp2);
0074
0075 } else {
0076 edm::LogWarning(mlConfigDb_) << "[SiStripConfigDb::" << __func__ << "]"
0077 << " NULL pointer to FedConnections vector!";
0078 }
0079 }
0080
0081 } catch (...) {
0082 handleException(__func__);
0083 }
0084
0085
0086 uint16_t np = 0;
0087 uint16_t nc = 0;
0088 FedConnectionsRange conns;
0089 if (!partition.empty()) {
0090 conns = connections_.find(partition);
0091 np = 1;
0092 nc = conns.size();
0093 } else {
0094 if (!connections_.empty()) {
0095 conns = FedConnectionsRange(connections_.find(dbParams_.partitions().begin()->second.partitionName()).begin(),
0096 connections_.find((--(dbParams_.partitions().end()))->second.partitionName()).end());
0097 } else {
0098 conns = connections_.emptyRange();
0099 }
0100 np = connections_.size();
0101 nc = conns.size();
0102 }
0103
0104 stringstream ss;
0105 ss << "[SiStripConfigDb::" << __func__ << "]"
0106 << " Found " << nc << " FED connections";
0107 if (!dbParams_.usingDb()) {
0108 ss << " in " << dbParams_.inputModuleXmlFiles().size() << " 'module.xml' file(s)";
0109 } else {
0110 if (!dbParams_.usingDbCache()) {
0111 ss << " in " << np << " database partition(s)";
0112 } else {
0113 ss << " from shared memory name '" << dbParams_.sharedMemory() << "'";
0114 }
0115 }
0116 if (connections_.empty()) {
0117 edm::LogWarning(mlConfigDb_) << ss.str();
0118 } else {
0119 LogTrace(mlConfigDb_) << ss.str();
0120 }
0121
0122 return conns;
0123 }
0124
0125
0126
0127 void SiStripConfigDb::addFedConnections(std::string partition, FedConnectionsV& conns) {
0128 if (!deviceFactory(__func__)) {
0129 return;
0130 }
0131
0132 if (partition.empty()) {
0133 stringstream ss;
0134 ss << "[SiStripConfigDb::" << __func__ << "]"
0135 << " Partition string is empty,"
0136 << " therefore cannot add FED connections to local cache!";
0137 edm::LogWarning(mlConfigDb_) << ss.str();
0138 return;
0139 }
0140
0141 if (conns.empty()) {
0142 stringstream ss;
0143 ss << "[SiStripConfigDb::" << __func__ << "]"
0144 << " Vector of FED connections is empty,"
0145 << " therefore cannot add FED connections to local cache!";
0146 edm::LogWarning(mlConfigDb_) << ss.str();
0147 return;
0148 }
0149
0150 SiStripDbParams::SiStripPartitions::const_iterator iter = dbParams_.partitions().begin();
0151 SiStripDbParams::SiStripPartitions::const_iterator jter = dbParams_.partitions().end();
0152 for (; iter != jter; ++iter) {
0153 if (partition == iter->second.partitionName()) {
0154 break;
0155 }
0156 }
0157 if (iter == dbParams_.partitions().end()) {
0158 stringstream ss;
0159 ss << "[SiStripConfigDb::" << __func__ << "]"
0160 << " Partition \"" << partition << "\" not found in partition list, "
0161 << " therefore cannot add FED connections!";
0162 edm::LogWarning(mlConfigDb_) << ss.str();
0163 return;
0164 }
0165
0166 FedConnectionsRange range = connections_.find(partition);
0167 if (range == connections_.emptyRange()) {
0168
0169 FedConnectionsV tmp;
0170 ConnectionFactory::vectorCopyI(tmp, conns, true);
0171
0172
0173 connections_.loadNext(partition, tmp);
0174
0175
0176 std::stringstream ss;
0177 ss << "[SiStripConfigDb::" << __func__ << "]"
0178 << " Added " << conns.size() << " FED connections to local cache for partition \"" << partition << "\""
0179 << std::endl;
0180 ss << "[SiStripConfigDb::" << __func__ << "]"
0181 << " Cache holds FED connections for " << connections_.size() << " partitions.";
0182 LogTrace(mlConfigDb_) << ss.str();
0183
0184 } else {
0185 stringstream ss;
0186 ss << "[SiStripConfigDb::" << __func__ << "]"
0187 << " Partition \"" << partition << "\" already found in local cache, "
0188 << " therefore cannot add new FED connections!";
0189 edm::LogWarning(mlConfigDb_) << ss.str();
0190 return;
0191 }
0192 }
0193
0194
0195
0196 void SiStripConfigDb::uploadFedConnections(std::string partition) {
0197 if (dbParams_.usingDbCache()) {
0198 edm::LogWarning(mlConfigDb_) << "[SiStripConfigDb::" << __func__ << "]"
0199 << " Using database cache! No uploads allowed!";
0200 return;
0201 }
0202
0203 if (!deviceFactory(__func__)) {
0204 return;
0205 }
0206
0207 if (connections_.empty()) {
0208 stringstream ss;
0209 ss << "[SiStripConfigDb::" << __func__ << "]"
0210 << " Found no cached FED connections, therefore no upload!";
0211 edm::LogWarning(mlConfigDb_) << ss.str();
0212 return;
0213 }
0214
0215 if (dbParams_.usingDb()) {
0216 try {
0217 SiStripDbParams::SiStripPartitions::const_iterator iter = dbParams_.partitions().begin();
0218 SiStripDbParams::SiStripPartitions::const_iterator jter = dbParams_.partitions().end();
0219 for (; iter != jter; ++iter) {
0220 if (partition.empty() || partition == iter->second.partitionName()) {
0221 FedConnectionsRange range = connections_.find(iter->second.partitionName());
0222 if (range != connections_.emptyRange()) {
0223 FedConnectionsV conns(range.begin(), range.end());
0224
0225 SiStripPartition::Versions cabVersion = iter->second.cabVersion();
0226 deviceFactory(__func__)->setConnectionDescriptions(conns,
0227 iter->second.partitionName(),
0228 &(cabVersion.first),
0229 &(cabVersion.second),
0230 true);
0231
0232
0233 std::stringstream ss;
0234 ss << "[SiStripConfigDb::" << __func__ << "]"
0235 << " Uploaded " << conns.size() << " FED connections to database for partition \""
0236 << iter->second.partitionName() << "\".";
0237 LogTrace(mlConfigDb_) << ss.str();
0238
0239 } else {
0240 stringstream ss;
0241 ss << "[SiStripConfigDb::" << __func__ << "]"
0242 << " Vector of FED connections is empty for partition \"" << iter->second.partitionName()
0243 << "\", therefore aborting upload for this partition!";
0244 edm::LogWarning(mlConfigDb_) << ss.str();
0245 continue;
0246 }
0247
0248 } else {
0249
0250
0251
0252
0253
0254
0255
0256 }
0257 }
0258
0259 } catch (...) {
0260 handleException(__func__);
0261 }
0262 }
0263
0264 allowCalibUpload_ = true;
0265 }
0266
0267
0268
0269 void SiStripConfigDb::clearFedConnections(std::string partition) {
0270 LogTrace(mlConfigDb_) << "[SiStripConfigDb::" << __func__ << "]";
0271
0272 if (connections_.empty()) {
0273 stringstream ss;
0274 ss << "[SiStripConfigDb::" << __func__ << "]"
0275 << " Found no cached FED connections!";
0276
0277 return;
0278 }
0279
0280
0281 FedConnections temporary_cache;
0282 if (partition.empty()) {
0283 temporary_cache = FedConnections();
0284 } else {
0285 SiStripDbParams::SiStripPartitions::const_iterator iter = dbParams_.partitions().begin();
0286 SiStripDbParams::SiStripPartitions::const_iterator jter = dbParams_.partitions().end();
0287 for (; iter != jter; ++iter) {
0288 if (partition != iter->second.partitionName()) {
0289 FedConnectionsRange range = connections_.find(iter->second.partitionName());
0290 if (range != connections_.emptyRange()) {
0291 temporary_cache.loadNext(partition, FedConnectionsV(range.begin(), range.end()));
0292 } else {
0293
0294
0295
0296
0297
0298 }
0299 }
0300 }
0301 }
0302
0303
0304 FedConnectionsRange conns;
0305 if (partition.empty()) {
0306 if (!connections_.empty()) {
0307 conns = FedConnectionsRange(connections_.find(dbParams_.partitions().begin()->second.partitionName()).begin(),
0308 connections_.find((--(dbParams_.partitions().end()))->second.partitionName()).end());
0309 } else {
0310 conns = connections_.emptyRange();
0311 }
0312 } else {
0313 SiStripDbParams::SiStripPartitions::const_iterator iter = dbParams_.partitions().begin();
0314 SiStripDbParams::SiStripPartitions::const_iterator jter = dbParams_.partitions().end();
0315 for (; iter != jter; ++iter) {
0316 if (partition == iter->second.partitionName()) {
0317 break;
0318 }
0319 }
0320 conns = connections_.find(iter->second.partitionName());
0321 }
0322
0323 if (conns != connections_.emptyRange()) {
0324 FedConnectionsV::const_iterator ifed = conns.begin();
0325 FedConnectionsV::const_iterator jfed = conns.end();
0326 for (; ifed != jfed; ++ifed) {
0327 if (*ifed) {
0328 delete *ifed;
0329 }
0330 }
0331 } else {
0332 stringstream ss;
0333 ss << "[SiStripConfigDb::" << __func__ << "]";
0334 if (partition.empty()) {
0335 ss << " Found no FED connections in local cache!";
0336 } else {
0337 ss << " Found no FED connections in local cache for partition \"" << partition << "\"!";
0338 }
0339 edm::LogWarning(mlConfigDb_) << ss.str();
0340 }
0341
0342
0343 connections_ = temporary_cache;
0344 }
0345
0346
0347
0348 void SiStripConfigDb::printFedConnections(std::string partition) {
0349 std::stringstream ss;
0350 ss << "[SiStripConfigDb::" << __func__ << "]"
0351 << " Contents of FedConnections container:" << std::endl;
0352 ss << " Number of partitions: " << connections_.size() << std::endl;
0353
0354
0355 uint16_t cntr = 0;
0356 FedConnections::const_iterator iconn = connections_.begin();
0357 FedConnections::const_iterator jconn = connections_.end();
0358 for (; iconn != jconn; ++iconn) {
0359 cntr++;
0360 if (partition.empty() || partition == iconn->first) {
0361 ss << " Partition number : " << cntr << " (out of " << connections_.size() << ")" << std::endl;
0362 ss << " Partition name : \"" << iconn->first << "\"" << std::endl;
0363 ss << " Num of connections : " << iconn->second.size() << std::endl;
0364
0365
0366 std::map<uint16_t, vector<uint16_t> > feds;
0367 FedConnectionsV::const_iterator iter = iconn->second.begin();
0368 FedConnectionsV::const_iterator jter = iconn->second.end();
0369 for (; iter != jter; ++iter) {
0370 if (*iter) {
0371 uint16_t fed_id = (*iter)->getFedId();
0372 uint16_t fed_ch = (*iter)->getFedChannel();
0373 if (find(feds[fed_id].begin(), feds[fed_id].end(), fed_ch) == feds[fed_id].end()) {
0374 feds[fed_id].push_back(fed_ch);
0375 }
0376 }
0377 }
0378
0379
0380 std::map<uint16_t, std::vector<uint16_t> > tmp;
0381 std::map<uint16_t, std::vector<uint16_t> >::const_iterator ii = feds.begin();
0382 std::map<uint16_t, std::vector<uint16_t> >::const_iterator jj = feds.end();
0383 for (; ii != jj; ++ii) {
0384 std::vector<uint16_t> temp = ii->second;
0385 std::sort(temp.begin(), temp.end());
0386 std::vector<uint16_t>::const_iterator iii = temp.begin();
0387 std::vector<uint16_t>::const_iterator jjj = temp.end();
0388 for (; iii != jjj; ++iii) {
0389 tmp[ii->first].push_back(*iii);
0390 }
0391 }
0392 feds.clear();
0393 feds = tmp;
0394
0395
0396 std::map<uint16_t, std::vector<uint16_t> >::const_iterator ifed = feds.begin();
0397 std::map<uint16_t, std::vector<uint16_t> >::const_iterator jfed = feds.end();
0398 for (; ifed != jfed; ++ifed) {
0399 ss << " Found " << std::setw(2) << ifed->second.size() << " channels for FED id " << std::setw(3)
0400 << ifed->first << " : ";
0401 if (!ifed->second.empty()) {
0402 uint16_t first = ifed->second.front();
0403 uint16_t last = ifed->second.front();
0404 std::vector<uint16_t>::const_iterator ichan = ifed->second.begin();
0405 std::vector<uint16_t>::const_iterator jchan = ifed->second.end();
0406 for (; ichan != jchan; ++ichan) {
0407 if (ichan != ifed->second.begin()) {
0408 if (*ichan != last + 1) {
0409 ss << std::setw(2) << first << "->" << std::setw(2) << last << ", ";
0410 if (ichan != ifed->second.end()) {
0411 first = *(ichan + 1);
0412 }
0413 }
0414 }
0415 last = *ichan;
0416 }
0417 if (first != last) {
0418 ss << std::setw(2) << first << "->" << std::setw(2) << last;
0419 }
0420 ss << std::endl;
0421 }
0422 }
0423 }
0424 }
0425
0426 LogTrace(mlConfigDb_) << ss.str();
0427 }