File indexing completed on 2024-04-06 11:58:14
0001
0002
0003
0004
0005
0006
0007
0008 #include "CalibFormats/SiPixelObjects/interface/PixelDetectorConfig.h"
0009 #include "CalibFormats/SiPixelObjects/interface/PixelTimeFormatter.h"
0010 #include <fstream>
0011 #include <iostream>
0012 #include <sstream>
0013 #include <ios>
0014 #include <stdexcept>
0015 #include <cassert>
0016 #include <cstdio>
0017
0018 using namespace std;
0019 using namespace pos;
0020
0021 PixelDetectorConfig::PixelDetectorConfig(std::vector<std::vector<std::string> > &tableMat)
0022 : PixelConfigBase("", "", "") {
0023 std::string mthn = "]\t[PixelDetectorConfig::PixelDetectorConfig()]\t\t ";
0024 std::vector<std::string> ins = tableMat[0];
0025 std::map<std::string, int> colM;
0026 std::vector<std::string> colNames;
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038 colNames.push_back("CONFIG_KEY");
0039 colNames.push_back("KEY_TYPE");
0040 colNames.push_back("KEY_ALIAS");
0041 colNames.push_back("VERSION");
0042 colNames.push_back("KIND_OF_COND");
0043 colNames.push_back("ROC_NAME");
0044 colNames.push_back("ROC_STATUS");
0045
0046 for (unsigned int c = 0; c < ins.size(); c++) {
0047 for (unsigned int n = 0; n < colNames.size(); n++) {
0048 if (tableMat[0][c] == colNames[n]) {
0049 colM[colNames[n]] = c;
0050 break;
0051 }
0052 }
0053 }
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064 modules_.clear();
0065 rocs_.clear();
0066 std::string module = "";
0067 for (unsigned int r = 1; r < tableMat.size(); r++) {
0068 PixelROCName roc(tableMat[r][colM["ROC_NAME"]]);
0069 PixelROCStatus rocstatus;
0070 std::string status = tableMat[r][colM["ROC_STATUS"]];
0071
0072
0073
0074 if (status.find("on") != string::npos) {
0075 status = "";
0076 }
0077 if (!status.empty()) {
0078 rocstatus.set(status);
0079 }
0080 rocs_[roc] = rocstatus;
0081 if (!rocstatus.get(PixelROCStatus::noInit)) {
0082 PixelModuleName module(tableMat[r][colM["ROC_NAME"]]);
0083 if (!containsModule(module)) {
0084 modules_.push_back(module);
0085 }
0086 }
0087 }
0088
0089
0090
0091 }
0092
0093
0094
0095 PixelDetectorConfig::PixelDetectorConfig(std::string filename) : PixelConfigBase("", "", "") {
0096 std::string mthn = "[PixelDetectorConfig::PixelDetectorConfig()]\t\t ";
0097
0098 if (filename[filename.size() - 1] == 't') {
0099 std::ifstream in(filename.c_str());
0100
0101 if (!in.good()) {
0102 std::cout << __LINE__ << "]\t" << mthn << "Could not open: " << filename << std::endl;
0103 throw std::runtime_error("Failed to open file " + filename);
0104 } else {
0105 std::cout << __LINE__ << "]\t" << mthn << "Opened: " << filename << std::endl;
0106 }
0107
0108 if (in.eof()) {
0109 std::cout << __LINE__ << "]\t" << mthn << "EOF before reading anything!" << std::endl;
0110 throw std::runtime_error("File seems to be empty " + filename);
0111 }
0112
0113 modules_.clear();
0114 rocs_.clear();
0115
0116 std::string module;
0117
0118 in >> module;
0119
0120 if (module == "Rocs:") {
0121 std::cout << __LINE__ << "]\t" << mthn << "New format of detconfig" << std::endl;
0122
0123 std::string rocname;
0124 in >> rocname;
0125 while (!in.eof()) {
0126
0127 PixelROCName roc(rocname);
0128 std::string line;
0129 getline(in, line);
0130
0131 istringstream instring(line);
0132 PixelROCStatus rocstatus;
0133 std::string status;
0134 while (!instring.eof()) {
0135 instring >> status;
0136
0137 if (!status.empty()) {
0138 rocstatus.set(status);
0139 }
0140 }
0141 rocs_[roc] = rocstatus;
0142 if (!rocstatus.get(PixelROCStatus::noInit)) {
0143 PixelModuleName module(rocname);
0144 if (!containsModule(module)) {
0145 modules_.push_back(module);
0146 }
0147 }
0148 in >> rocname;
0149 }
0150 return;
0151 }
0152
0153
0154
0155 if (in.eof())
0156 std::cout << mthn << "EOF after reading first module name" << std::endl;
0157
0158 std::cout << __LINE__ << "]\t" << mthn << "Old format of detconfig" << std::endl;
0159 while (!in.eof()) {
0160
0161
0162 PixelModuleName moduleName(module);
0163
0164 modules_.push_back(moduleName);
0165
0166 in >> module;
0167
0168 assert(modules_.size() < 10000);
0169 }
0170
0171 in.close();
0172
0173 } else {
0174 assert(0);
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206
0207
0208
0209
0210
0211
0212
0213
0214
0215
0216
0217
0218
0219
0220
0221
0222
0223
0224
0225
0226
0227
0228
0229
0230
0231
0232
0233
0234
0235
0236
0237
0238
0239 }
0240
0241
0242 }
0243
0244 unsigned int PixelDetectorConfig::getNModules() const { return modules_.size(); }
0245
0246 PixelModuleName PixelDetectorConfig::getModule(unsigned int i) const { return modules_[i]; }
0247
0248 std::set<unsigned int> PixelDetectorConfig::getFEDs(PixelNameTranslation *translation) const {
0249 std::set<unsigned int> feds;
0250 assert(!modules_.empty());
0251 std::vector<PixelModuleName>::const_iterator imodule = modules_.begin();
0252
0253 for (; imodule != modules_.end(); ++imodule) {
0254 std::set<PixelChannel> channelsOnThisModule = translation->getChannelsOnModule(*imodule);
0255 for (std::set<PixelChannel>::const_iterator channelsOnThisModule_itr = channelsOnThisModule.begin();
0256 channelsOnThisModule_itr != channelsOnThisModule.end();
0257 ++channelsOnThisModule_itr) {
0258 const PixelHdwAddress &channel_hdwaddress = translation->getHdwAddress(*channelsOnThisModule_itr);
0259 unsigned int fednumber = channel_hdwaddress.fednumber();
0260 feds.insert(fednumber);
0261 }
0262 }
0263
0264 return feds;
0265 }
0266
0267
0268 std::map<unsigned int, std::set<unsigned int> > PixelDetectorConfig::getFEDsAndChannels(
0269 PixelNameTranslation *translation) const {
0270
0271
0272 std::map<unsigned int, std::set<unsigned int> > fedsChannels;
0273 assert(!modules_.empty());
0274 std::vector<PixelModuleName>::const_iterator imodule = modules_.begin();
0275
0276 for (; imodule != modules_.end(); ++imodule) {
0277 std::set<PixelChannel> channelsOnThisModule = translation->getChannelsOnModule(*imodule);
0278 for (std::set<PixelChannel>::const_iterator channelsOnThisModule_itr = channelsOnThisModule.begin();
0279 channelsOnThisModule_itr != channelsOnThisModule.end();
0280 ++channelsOnThisModule_itr) {
0281 const PixelHdwAddress &channel_hdwaddress = translation->getHdwAddress(*channelsOnThisModule_itr);
0282 unsigned int fednumber = channel_hdwaddress.fednumber();
0283 unsigned int fedchannel = channel_hdwaddress.fedchannel();
0284 fedsChannels[fednumber].insert(fedchannel);
0285 }
0286 }
0287
0288 return fedsChannels;
0289 }
0290
0291 bool PixelDetectorConfig::containsModule(const PixelModuleName &moduleToFind) const {
0292 for (std::vector<PixelModuleName>::const_iterator modules_itr = modules_.begin(); modules_itr != modules_.end();
0293 ++modules_itr) {
0294 if (*modules_itr == moduleToFind)
0295 return true;
0296 }
0297 return false;
0298 }
0299
0300
0301 void PixelDetectorConfig::writeASCII(std::string dir) const {
0302 std::stringstream s;
0303 s << __LINE__ << "]\t[PixelDetectorConfig::writeASCII()]\t\t ";
0304 std::string mthn = s.str();
0305
0306 if (!dir.empty())
0307 dir += "/";
0308 std::string filename = dir + "detectconfig.dat";
0309
0310 std::ofstream out(filename.c_str(), std::ios_base::out);
0311 if (!out) {
0312 std::cout << __LINE__ << "]\t" << mthn << "Could not open file " << filename << " for write" << std::endl;
0313 exit(1);
0314 }
0315
0316 if (rocs_.empty()) {
0317 std::vector<PixelModuleName>::const_iterator imodule = modules_.begin();
0318
0319 for (; imodule != modules_.end(); ++imodule) {
0320 out << *imodule << std::endl;
0321 }
0322 } else {
0323 out << "Rocs:" << endl;
0324 std::map<PixelROCName, PixelROCStatus>::const_iterator irocs = rocs_.begin();
0325 for (; irocs != rocs_.end(); ++irocs) {
0326 out << (irocs->first).rocname() << " " << (irocs->second).statusName() << endl;
0327 }
0328 }
0329
0330 out.close();
0331 }
0332
0333
0334 void PixelDetectorConfig::writeXMLHeader(pos::PixelConfigKey key,
0335 int version,
0336 std::string path,
0337 std::ofstream *outstream,
0338 std::ofstream *out1stream,
0339 std::ofstream *out2stream) const {
0340 std::string mthn = "]\t[PixelDetectorConfig::writeXMLHeader()]\t\t\t ";
0341 std::stringstream fullPath;
0342 fullPath << path << "/Pixel_DetectorConfig_" << PixelTimeFormatter::getmSecTime() << ".xml";
0343 cout << __LINE__ << mthn << "Writing to: " << fullPath.str() << endl;
0344
0345 outstream->open(fullPath.str().c_str());
0346
0347 if (!outstream->good()) {
0348 cout << __LINE__ << mthn << "FATAL: could not open file " << fullPath.str() << endl;
0349 assert(0);
0350 }
0351
0352 *outstream << "<?xml version='1.0' encoding='UTF-8' standalone='yes'?>" << std::endl;
0353 *outstream << "<ROOT xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>" << std::endl;
0354 *outstream << "" << std::endl;
0355 *outstream << " <!-- " << mthn << "-->" << std::endl;
0356 *outstream << "" << std::endl;
0357 *outstream << " <HEADER>" << std::endl;
0358 *outstream << " <TYPE>" << std::endl;
0359 *outstream << " <EXTENSION_TABLE_NAME>PIXEL_DETECTOR_CONFIG</EXTENSION_TABLE_NAME>" << std::endl;
0360 *outstream << " <NAME>Pixel Detector Configuration</NAME>" << std::endl;
0361 *outstream << " </TYPE>" << std::endl;
0362 *outstream << " <RUN>" << std::endl;
0363 *outstream << " <RUN_TYPE>Pixel Detector Configuration test</RUN_TYPE>" << std::endl;
0364 *outstream << " <RUN_NUMBER>1</RUN_NUMBER>" << std::endl;
0365 *outstream << " <RUN_BEGIN_TIMESTAMP>" << pos::PixelTimeFormatter::getTime() << "</RUN_BEGIN_TIMESTAMP>"
0366 << std::endl;
0367 *outstream << " <LOCATION>CERN P5</LOCATION>" << std::endl;
0368 *outstream << " </RUN>" << std::endl;
0369 *outstream << " </HEADER>" << std::endl;
0370 *outstream << "" << std::endl;
0371 *outstream << " <DATA_SET>" << std::endl;
0372 *outstream << " " << std::endl;
0373 *outstream << " <VERSION>" << version << "</VERSION>" << std::endl;
0374 *outstream << " <COMMENT_DESCRIPTION>" << getComment() << "</COMMENT_DESCRIPTION>" << std::endl;
0375 *outstream << " <CREATED_BY_USER>" << getAuthor() << "</CREATED_BY_USER>" << std::endl;
0376 *outstream << " " << std::endl;
0377 *outstream << " <PART>" << std::endl;
0378 *outstream << " <NAME_LABEL>CMS-PIXEL-ROOT</NAME_LABEL>" << std::endl;
0379 *outstream << " <KIND_OF_PART>Detector ROOT</KIND_OF_PART>" << std::endl;
0380 *outstream << " </PART>" << std::endl;
0381 }
0382
0383
0384 void PixelDetectorConfig::writeXML(std::ofstream *outstream,
0385 std::ofstream *out1stream,
0386 std::ofstream *out2stream) const {
0387 std::stringstream s;
0388 s << __LINE__ << "]\t[PixelDetectorConfig::writeXML()]\t\t\t ";
0389 std::string mthn = s.str();
0390 if (rocs_.empty()) {
0391 std::vector<PixelModuleName>::const_iterator imodule = modules_.begin();
0392
0393
0394 for (; imodule != modules_.end(); ++imodule) {
0395 *outstream << " <DATA>" << std::endl;
0396
0397 *outstream << " <ROC_STATUS>on</ROC_STATUS>" << std::endl;
0398 *outstream << " </DATA>" << std::endl;
0399 *outstream << " " << std::endl;
0400 }
0401 } else {
0402 std::map<PixelROCName, PixelROCStatus>::const_iterator irocs = rocs_.begin();
0403 for (; irocs != rocs_.end(); ++irocs) {
0404 std::string sts = (irocs->second).statusName();
0405 if (sts.empty()) {
0406 sts = "on";
0407 }
0408 *outstream << " " << std::endl;
0409 *outstream << " <DATA>" << std::endl;
0410 *outstream << " <ROC_NAME>" << (irocs->first).rocname() << "</ROC_NAME>" << std::endl;
0411 *outstream << " <ROC_STATUS>" << sts << "</ROC_STATUS>" << std::endl;
0412 *outstream << " </DATA>" << std::endl;
0413 }
0414 }
0415 }
0416
0417
0418 void PixelDetectorConfig::writeXMLTrailer(std::ofstream *outstream,
0419 std::ofstream *out1stream,
0420 std::ofstream *out2stream) const {
0421 std::stringstream s;
0422 s << __LINE__ << "]\t[PixelDetectorConfig::writeXMLTrailer()]\t\t\t ";
0423 std::string mthn = s.str();
0424
0425 *outstream << " " << std::endl;
0426 *outstream << " </DATA_SET>" << std::endl;
0427 *outstream << "</ROOT> " << std::endl;
0428
0429 outstream->close();
0430 }
0431
0432 void PixelDetectorConfig::writeXML(pos::PixelConfigKey key, int version, std::string path) const {
0433 std::stringstream s;
0434 s << __LINE__ << "]\t[PixelDetectorConfig::writeXML()]\t\t\t ";
0435 std::string mthn = s.str();
0436
0437 std::stringstream fullPath;
0438
0439 fullPath << path << "/Pixel_DetectorConfig.xml";
0440 cout << __LINE__ << "]\t" << mthn << "Writing to: " << fullPath.str() << std::endl;
0441
0442 std::ofstream out(fullPath.str().c_str());
0443
0444 out << "<?xml version='1.0' encoding='UTF-8' standalone='yes'?>" << std::endl;
0445 out << "<ROOT xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>" << std::endl;
0446 out << " <HEADER>" << std::endl;
0447 out << " <TYPE>" << std::endl;
0448 out << " <EXTENSION_TABLE_NAME>PIXEL_DETECTOR_CONFIG</EXTENSION_TABLE_NAME>" << std::endl;
0449 out << " <NAME>Pixel Detector Configuration</NAME>" << std::endl;
0450 out << " </TYPE>" << std::endl;
0451 out << " <RUN>" << std::endl;
0452 out << " <RUN_TYPE>Pixel Detector Configuration test</RUN_TYPE>" << std::endl;
0453 out << " <RUN_NUMBER>1</RUN_NUMBER>" << std::endl;
0454 out << " <RUN_BEGIN_TIMESTAMP>" << pos::PixelTimeFormatter::getTime() << "</RUN_BEGIN_TIMESTAMP>" << std::endl;
0455 out << " <COMMENT_DESCRIPTION>Test of DetectorConfig xml</COMMENT_DESCRIPTION>" << std::endl;
0456 out << " <LOCATION>CERN TAC</LOCATION>" << std::endl;
0457 out << " <CREATED_BY_USER>Dario Menasce</CREATED_BY_USER>" << std::endl;
0458 out << " </RUN>" << std::endl;
0459 out << " </HEADER>" << std::endl;
0460 out << "" << std::endl;
0461 out << "" << std::endl;
0462
0463 if (rocs_.empty()) {
0464 std::vector<PixelModuleName>::const_iterator imodule = modules_.begin();
0465
0466
0467 for (; imodule != modules_.end(); ++imodule) {
0468 out << " <DATA>" << std::endl;
0469
0470 out << " <ROC_STATUS>on</ROC_STATUS>" << std::endl;
0471 out << " </DATA>" << std::endl;
0472 out << " " << std::endl;
0473 }
0474 } else {
0475 std::map<PixelROCName, PixelROCStatus>::const_iterator irocs = rocs_.begin();
0476 for (; irocs != rocs_.end(); ++irocs) {
0477 std::string sts = (irocs->second).statusName();
0478 if (sts.empty()) {
0479 sts = "on";
0480 }
0481 out << " <DATA_SET>" << std::endl;
0482 out << " <VERSION>" << version << "</VERSION>" << std::endl;
0483 out << " <PART>" << std::endl;
0484 out << " <NAME_LABEL>" << (irocs->first).rocname() << "</NAME_LABEL>" << std::endl;
0485 out << " <KIND_OF_PART>ROC</KIND_OF_PART>" << std::endl;
0486 out << " </PART>" << std::endl;
0487 out << " <DATA>" << std::endl;
0488 out << " <ROC_NAME>" << (irocs->first).rocname() << "</ROC_NAME>" << std::endl;
0489 out << " <ROC_STATUS>" << sts << "</ROC_STATUS>" << std::endl;
0490 out << " </DATA>" << std::endl;
0491 out << " </DATA_SET>" << std::endl;
0492 out << " " << std::endl;
0493 }
0494 }
0495 out << " </DATA_SET>" << std::endl;
0496 out << "</ROOT> " << std::endl;
0497 out.close();
0498 assert(0);
0499 }
0500
0501
0502 void PixelDetectorConfig::addROC(PixelROCName &theROC)
0503 {
0504 std::stringstream s;
0505 s << __LINE__ << "]\t[PixelDetectorConfig::addROC()]\t\t\t\t ";
0506 std::string mthn = s.str();
0507
0508 std::map<PixelROCName, PixelROCStatus>::iterator theROCIt = rocs_.find(theROC);
0509 if (theROCIt == rocs_.end())
0510 {
0511 PixelROCStatus theStatus;
0512 theStatus.reset();
0513 rocs_[theROC] = theStatus;
0514
0515 } else {
0516 theROCIt->second.reset();
0517
0518 }
0519 }
0520
0521
0522 void PixelDetectorConfig::addROC(PixelROCName &theROC, string statusLabel)
0523 {
0524 std::stringstream s;
0525 s << __LINE__ << "]\t[PixelDetectorConfig::addROC()]\t\t\t\t ";
0526 std::string mthn = s.str();
0527
0528 std::map<PixelROCName, PixelROCStatus>::iterator theROCIt = rocs_.find(theROC);
0529 if (theROCIt == rocs_.end())
0530 {
0531 PixelROCStatus theStatus;
0532 theStatus.set(statusLabel);
0533 theStatus.reset();
0534 rocs_[theROC] = theStatus;
0535
0536 } else {
0537 theROCIt->second.set(statusLabel);
0538
0539 }
0540 }
0541
0542
0543 void PixelDetectorConfig::removeROC(PixelROCName &theROC)
0544 {
0545 std::string mthn = "[PixelDetectorConfig::removeROC()]\t\t\t\t ";
0546
0547 std::map<PixelROCName, PixelROCStatus>::iterator theROCIt = rocs_.find(theROC);
0548 if (theROCIt != rocs_.end())
0549 {
0550 theROCIt->second.set("noInit");
0551
0552 } else {
0553 PixelROCStatus theStatus;
0554 theStatus.set("noInit");
0555 rocs_[theROC] = theStatus;
0556
0557 }
0558 }
0559
0560
0561
0562
0563
0564
0565
0566