File indexing completed on 2024-09-07 04:34:55
0001
0002
0003
0004
0005
0006
0007 #include "CalibFormats/SiPixelObjects/interface/PixelNameTranslation.h"
0008 #include "CalibFormats/SiPixelObjects/interface/PixelDetectorConfig.h"
0009 #include "CalibFormats/SiPixelObjects/interface/PixelTimeFormatter.h"
0010
0011 #include <fstream>
0012 #include <sstream>
0013 #include <map>
0014 #include <string>
0015 #include <vector>
0016 #include <cassert>
0017 #include <stdexcept>
0018
0019 using namespace pos;
0020 using namespace std;
0021
0022 PixelNameTranslation::PixelNameTranslation(std::vector<std::vector<std::string> >& tableMat)
0023 : PixelConfigBase(" ", " ", " ") {
0024 std::string mthn = "[PixelNameTranslation::PixelNameTranslation()]\t\t ";
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
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049 colNames.push_back("CONFIG_KEY");
0050 colNames.push_back("KEY_TYPE");
0051 colNames.push_back("KEY_ALIAS");
0052 colNames.push_back("VERSION");
0053 colNames.push_back("KIND_OF_COND");
0054 colNames.push_back("ROC_NAME");
0055 colNames.push_back("PXLFEC_NAME");
0056 colNames.push_back("MFEC_POSN");
0057 colNames.push_back("MFEC_CHAN");
0058 colNames.push_back("HUB_ADDRS");
0059 colNames.push_back("PORT_NUM");
0060 colNames.push_back("ROC_I2C_ADDR");
0061 colNames.push_back("PXLFED_NAME");
0062 colNames.push_back("FED_CHAN");
0063 colNames.push_back("FED_ROC_NUM");
0064 colNames.push_back("TBM_MODE");
0065
0066 for (unsigned int c = 0; c < tableMat[0].size(); c++) {
0067 for (unsigned int n = 0; n < colNames.size(); n++) {
0068 if (tableMat[0][c] == colNames[n]) {
0069 colM[colNames[n]] = c;
0070 break;
0071 }
0072 }
0073 }
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083 for (unsigned int r = 1; r < tableMat.size(); r++) {
0084 std::string rocname = tableMat[r][colM["ROC_NAME"]];
0085 std::string TBMChannel = tableMat[r][colM["TBM_MODE"]];
0086 if (TBMChannel.empty()) {
0087 TBMChannel = "A";
0088 }
0089
0090
0091
0092
0093
0094
0095 unsigned int fecnumber = (unsigned int)atoi(tableMat[r][colM["PXLFEC_NAME"]].c_str());
0096 unsigned int mfec = (unsigned int)atoi(tableMat[r][colM["MFEC_POSN"]].c_str());
0097 unsigned int mfecchannel = (unsigned int)atoi(tableMat[r][colM["MFEC_CHAN"]].c_str());
0098 unsigned int hubaddress = (unsigned int)atoi(tableMat[r][colM["HUB_ADDRS"]].c_str());
0099 unsigned int portaddress = (unsigned int)atoi(tableMat[r][colM["PORT_NUM"]].c_str());
0100 unsigned int rocid = (unsigned int)atoi(tableMat[r][colM["ROC_I2C_ADDR"]].c_str());
0101
0102
0103
0104
0105
0106
0107 unsigned int fednumber = (unsigned int)atoi(tableMat[r][colM["PXLFED_NAME"]].c_str());
0108 unsigned int fedchannel = (unsigned int)atoi(tableMat[r][colM["FED_CHAN"]].c_str());
0109 unsigned int fedrocnumber = (unsigned int)(atoi(tableMat[r][colM["FED_ROC_NUM"]].c_str()));
0110
0111 PixelROCName aROC(rocname);
0112 if (aROC.rocname() != rocname) {
0113 std::cout << __LINE__ << "]\t" << mthn << "Rocname : " << rocname << std::endl;
0114 std::cout << __LINE__ << "]\t" << mthn << "Parsed to: " << aROC.rocname() << std::endl;
0115 assert(0);
0116 }
0117
0118 if (ROCNameFromFEDChannelROCExists(fednumber, fedchannel, fedrocnumber)) {
0119 std::cout << __LINE__ << "]\t" << mthn << "ROC with fednumber=" << fednumber << " fedchannel=" << fedchannel
0120 << " roc number=" << fedrocnumber << " already exists" << std::endl;
0121 std::cout << __LINE__ << "]\t" << mthn << "Fix this inconsistency in the name translation" << std::endl;
0122 assert(0);
0123 }
0124
0125 PixelHdwAddress hdwAdd(
0126 fecnumber, mfec, mfecchannel, hubaddress, portaddress, rocid, fednumber, fedchannel, fedrocnumber);
0127
0128 translationtable_[aROC] = hdwAdd;
0129 fedlookup_[hdwAdd] = aROC;
0130
0131 PixelModuleName aModule(rocname);
0132 PixelChannel aChannel(aModule, TBMChannel);
0133
0134 hdwTranslationTable_[hdwAdd] = aChannel;
0135
0136
0137 bool foundChannel = false;
0138
0139 std::map<PixelChannel, PixelHdwAddress>::const_iterator channelTranslationTable_itr =
0140 channelTranslationTable_.find(aChannel);
0141
0142 if (channelTranslationTable_itr != channelTranslationTable_.end()) {
0143 if (!(channelTranslationTable_itr->second |= hdwAdd)) {
0144 cout << "Found two ROCs on the same channe, but not same hdw" << endl;
0145 cout << "Hdw1:" << endl << channelTranslationTable_itr->second << endl;
0146 cout << "Hdw2:" << endl << hdwAdd << endl;
0147 }
0148 assert(channelTranslationTable_itr->second |= hdwAdd);
0149 foundChannel = true;
0150 } else if (channelTranslationTable_itr->first.module() == aModule) {
0151 assert(channelTranslationTable_itr->second.fecnumber() == hdwAdd.fecnumber());
0152 assert(channelTranslationTable_itr->second.mfec() == hdwAdd.mfec());
0153 assert(channelTranslationTable_itr->second.mfecchannel() == hdwAdd.mfecchannel());
0154
0155 assert(channelTranslationTable_itr->second.hubaddress() == hdwAdd.hubaddress());
0156 assert(channelTranslationTable_itr->second.fednumber() != hdwAdd.fednumber() ||
0157 channelTranslationTable_itr->second.fedchannel() != hdwAdd.fedchannel());
0158 }
0159
0160 if (foundChannel == false) {
0161 channelTranslationTable_[aChannel] = hdwAdd;
0162 }
0163
0164 }
0165
0166 const std::map<unsigned int, std::set<unsigned int> > fedsAndChannels = getFEDsAndChannels();
0167
0168 std::vector<PixelROCName> tmp(24);
0169
0170 std::map<unsigned int, std::map<unsigned int, int> > counter;
0171
0172
0173 std::map<unsigned int, std::map<unsigned int, int> > maxindex;
0174
0175 std::map<PixelROCName, PixelHdwAddress>::const_iterator it = translationtable_.begin();
0176
0177 for (; it != translationtable_.end(); ++it) {
0178 int index = it->second.fedrocnumber();
0179
0180 unsigned int fednumber = it->second.fednumber();
0181 unsigned int fedchannel = it->second.fedchannel();
0182
0183 std::vector<PixelROCName>& tmp = rocsFromFEDidAndChannel_[fednumber][fedchannel];
0184
0185 if (tmp.empty()) {
0186 tmp.resize(24);
0187 counter[fednumber][fedchannel] = 0;
0188 maxindex[fednumber][fedchannel] = 0;
0189 }
0190
0191 if (index > maxindex[fednumber][fedchannel])
0192 maxindex[fednumber][fedchannel] = index;
0193 tmp[index] = it->first;
0194 counter[fednumber][fedchannel]++;
0195 }
0196
0197 it = translationtable_.begin();
0198
0199 for (; it != translationtable_.end(); ++it) {
0200 unsigned int fednumber = it->second.fednumber();
0201 unsigned int fedchannel = it->second.fedchannel();
0202
0203 std::vector<PixelROCName>& tmp = rocsFromFEDidAndChannel_[fednumber][fedchannel];
0204
0205 assert(counter[fednumber][fedchannel] == maxindex[fednumber][fedchannel] + 1);
0206
0207 tmp.resize(counter[fednumber][fedchannel]);
0208 }
0209
0210 }
0211
0212
0213 PixelNameTranslation::PixelNameTranslation(std::string filename) : PixelConfigBase(" ", " ", " ") {
0214 static std::string mthn = "[PixelNameTranslation::PixelNameTranslation()]\t\t ";
0215
0216 std::ifstream in(filename.c_str());
0217
0218 if (!in.good()) {
0219 std::cout << __LINE__ << "]\t" << mthn << "Could not open: " << filename << std::endl;
0220 throw std::runtime_error("Failed to open file " + filename);
0221 } else {
0222 std::cout << __LINE__ << "]\t" << mthn << "Reading from: " << filename << std::endl;
0223 }
0224
0225 std::string dummy;
0226
0227 getline(in, dummy);
0228
0229 do {
0230 std::string rocname;
0231 std::string TBMChannel;
0232 unsigned int fecnumber;
0233 unsigned int mfec;
0234 unsigned int mfecchannel;
0235 unsigned int hubaddress;
0236 unsigned int portaddress;
0237 unsigned int rocid;
0238 unsigned int fednumber;
0239 unsigned int fedchannel;
0240 unsigned int fedrocnumber;
0241
0242 in >> rocname;
0243 in >> TBMChannel;
0244 if (TBMChannel != "A" &&
0245 TBMChannel !=
0246 "B")
0247 {
0248 fecnumber = atoi(TBMChannel.c_str());
0249 TBMChannel = "A";
0250 } else
0251 {
0252 in >> fecnumber;
0253 }
0254 in >> mfec >> mfecchannel >> hubaddress >> portaddress >> rocid >> fednumber >> fedchannel >> fedrocnumber;
0255
0256 if (!in.eof()) {
0257 PixelROCName aROC(rocname);
0258
0259
0260
0261
0262
0263
0264
0265
0266 if (ROCNameFromFEDChannelROCExists(fednumber, fedchannel, fedrocnumber)) {
0267 std::cout << __LINE__ << "]\t" << mthn << "ROC with fednumber=" << fednumber << " fedchannel=" << fedchannel
0268 << " roc number=" << fedrocnumber << " already exists" << std::endl;
0269 std::cout << __LINE__ << "]\t" << mthn << "Fix this inconsistency in the name translation" << std::endl;
0270 assert(0);
0271 }
0272
0273 PixelHdwAddress hdwAdd(
0274 fecnumber, mfec, mfecchannel, hubaddress, portaddress, rocid, fednumber, fedchannel, fedrocnumber);
0275
0276
0277
0278
0279
0280
0281
0282
0283
0284
0285
0286
0287
0288
0289
0290
0291
0292
0293
0294
0295
0296
0297
0298
0299 translationtable_[aROC] = hdwAdd;
0300 fedlookup_[hdwAdd] = aROC;
0301
0302 PixelModuleName aModule(rocname);
0303 PixelChannel aChannel(aModule, TBMChannel);
0304
0305 hdwTranslationTable_[hdwAdd] = aChannel;
0306
0307
0308
0309
0310
0311 bool foundChannel = false;
0312
0313 std::map<PixelChannel, PixelHdwAddress>::const_iterator channelTranslationTable_itr =
0314 channelTranslationTable_.find(aChannel);
0315
0316 if (channelTranslationTable_itr != channelTranslationTable_.end()) {
0317 if (!(channelTranslationTable_itr->second |= hdwAdd)) {
0318 cout << __LINE__ << "]\t" << mthn << "Found two ROCs on the same channe, but not same hdw" << endl;
0319 cout << __LINE__ << "]\t" << mthn << "Hdw1: " << endl << channelTranslationTable_itr->second << endl;
0320 cout << __LINE__ << "]\t" << mthn << "Hdw2: " << endl << hdwAdd << endl;
0321 }
0322 assert(channelTranslationTable_itr->second |= hdwAdd);
0323 foundChannel = true;
0324 } else if (channelTranslationTable_itr->first.module() == aModule) {
0325 assert(channelTranslationTable_itr->second.fecnumber() == hdwAdd.fecnumber());
0326 assert(channelTranslationTable_itr->second.mfec() == hdwAdd.mfec());
0327 assert(channelTranslationTable_itr->second.mfecchannel() == hdwAdd.mfecchannel());
0328
0329 assert(channelTranslationTable_itr->second.hubaddress() == hdwAdd.hubaddress());
0330 assert(channelTranslationTable_itr->second.fednumber() != hdwAdd.fednumber() ||
0331 channelTranslationTable_itr->second.fedchannel() != hdwAdd.fedchannel());
0332 }
0333
0334 if (foundChannel == false) {
0335 channelTranslationTable_[aChannel] = hdwAdd;
0336 }
0337 }
0338 } while (!in.eof());
0339 in.close();
0340
0341 const std::map<unsigned int, std::set<unsigned int> > fedsAndChannels = getFEDsAndChannels();
0342
0343 std::vector<PixelROCName> tmp(24);
0344
0345 std::map<unsigned int, std::map<unsigned int, int> > counter;
0346
0347
0348 std::map<unsigned int, std::map<unsigned int, int> > maxindex;
0349
0350 std::map<PixelROCName, PixelHdwAddress>::const_iterator it = translationtable_.begin();
0351
0352 for (; it != translationtable_.end(); ++it) {
0353 int index = it->second.fedrocnumber();
0354
0355 unsigned int fednumber = it->second.fednumber();
0356 unsigned int fedchannel = it->second.fedchannel();
0357
0358 std::vector<PixelROCName>& tmp = rocsFromFEDidAndChannel_[fednumber][fedchannel];
0359
0360 if (tmp.empty()) {
0361 tmp.resize(24);
0362 counter[fednumber][fedchannel] = 0;
0363 maxindex[fednumber][fedchannel] = 0;
0364 }
0365
0366 if (index > maxindex[fednumber][fedchannel])
0367 maxindex[fednumber][fedchannel] = index;
0368 tmp[index] = it->first;
0369 counter[fednumber][fedchannel]++;
0370 }
0371
0372 it = translationtable_.begin();
0373
0374 for (; it != translationtable_.end(); ++it) {
0375 unsigned int fednumber = it->second.fednumber();
0376 unsigned int fedchannel = it->second.fedchannel();
0377
0378 std::vector<PixelROCName>& tmp = rocsFromFEDidAndChannel_[fednumber][fedchannel];
0379
0380 assert(counter[fednumber][fedchannel] == maxindex[fednumber][fedchannel] + 1);
0381
0382 tmp.resize(counter[fednumber][fedchannel]);
0383 }
0384 }
0385
0386 std::ostream& operator<<(std::ostream& s, const PixelNameTranslation& table) {
0387
0388
0389
0390 return s;
0391 }
0392
0393 std::list<const PixelROCName*> PixelNameTranslation::getROCs() const {
0394 std::list<const PixelROCName*> listOfROCs;
0395 for (std::map<PixelROCName, PixelHdwAddress>::const_iterator translationTableEntry = translationtable_.begin();
0396 translationTableEntry != translationtable_.end();
0397 ++translationTableEntry) {
0398 listOfROCs.push_back(&(translationTableEntry->first));
0399 }
0400
0401 return listOfROCs;
0402 }
0403
0404 std::list<const PixelModuleName*> PixelNameTranslation::getModules() const {
0405 std::list<const PixelModuleName*> listOfModules;
0406 for (std::map<PixelChannel, PixelHdwAddress>::const_iterator channelTranslationTable_itr =
0407 channelTranslationTable_.begin();
0408 channelTranslationTable_itr != channelTranslationTable_.end();
0409 ++channelTranslationTable_itr) {
0410 bool foundOne = false;
0411 for (std::list<const PixelModuleName*>::const_iterator listOfModules_itr = listOfModules.begin();
0412 listOfModules_itr != listOfModules.end();
0413 ++listOfModules_itr) {
0414 if (*(*listOfModules_itr) == channelTranslationTable_itr->first.module()) {
0415 foundOne = true;
0416 break;
0417 }
0418 }
0419 if (!foundOne)
0420 listOfModules.push_back(&(channelTranslationTable_itr->first.module()));
0421 }
0422
0423 return listOfModules;
0424 }
0425
0426 std::set<PixelChannel> PixelNameTranslation::getChannels() const {
0427 std::set<PixelChannel> channelSet;
0428 for (std::map<PixelChannel, PixelHdwAddress>::const_iterator channelTranslationTable_itr =
0429 channelTranslationTable_.begin();
0430 channelTranslationTable_itr != channelTranslationTable_.end();
0431 ++channelTranslationTable_itr) {
0432 channelSet.insert(channelTranslationTable_itr->first);
0433 }
0434 return channelSet;
0435 }
0436
0437 std::set<PixelChannel> PixelNameTranslation::getChannels(const PixelDetectorConfig& aDetectorConfig) const {
0438 std::set<PixelChannel> channelSet;
0439 for (std::map<PixelChannel, PixelHdwAddress>::const_iterator channelTranslationTable_itr =
0440 channelTranslationTable_.begin();
0441 channelTranslationTable_itr != channelTranslationTable_.end();
0442 ++channelTranslationTable_itr) {
0443 if (aDetectorConfig.containsModule(channelTranslationTable_itr->first.module()))
0444 channelSet.insert(channelTranslationTable_itr->first);
0445 }
0446 return channelSet;
0447 }
0448
0449 const PixelHdwAddress* PixelNameTranslation::getHdwAddress(const PixelROCName& aROC) const {
0450 static std::string mthn = "[PixelNameTranslation::getHdwAddress()]\t\t ";
0451 std::map<PixelROCName, PixelHdwAddress>::const_iterator it = translationtable_.find(aROC);
0452
0453 if (it == translationtable_.end()) {
0454 std::cout << __LINE__ << "]\t" << mthn << "Could not look up ROC: " << aROC << std::endl;
0455 assert(0);
0456 }
0457
0458 return &(it->second);
0459 }
0460
0461
0462 bool PixelNameTranslation::checkROCExistence(const PixelROCName& aROC) const {
0463 std::string mthn = "[PixelNameTranslation::checkROCExistence()]\t\t ";
0464 if (translationtable_.find(aROC) == translationtable_.end())
0465 return false;
0466 return true;
0467 }
0468
0469 const bool PixelNameTranslation::checkFor(const PixelROCName& aROC) const {
0470 if (translationtable_.find(aROC) == translationtable_.end()) {
0471 return false;
0472 } else {
0473 return true;
0474 }
0475 }
0476
0477 const PixelHdwAddress& PixelNameTranslation::getHdwAddress(const PixelChannel& aChannel) const {
0478 std::map<PixelChannel, PixelHdwAddress>::const_iterator channelHdwAddress_itr =
0479 channelTranslationTable_.find(aChannel);
0480 assert(channelHdwAddress_itr != channelTranslationTable_.end());
0481 return channelHdwAddress_itr->second;
0482 }
0483
0484 const PixelHdwAddress& PixelNameTranslation::firstHdwAddress(const PixelModuleName& aModule) const {
0485 std::string mthn = "[PixelNameTranslation::firstHdwAddress()]\t\t ";
0486 std::set<PixelChannel> channelsOnModule = getChannelsOnModule(aModule);
0487 if (channelsOnModule.empty()) {
0488 cout << __LINE__ << "]\t" << mthn << "module=" << aModule << " has zero channels!" << endl;
0489 cout << __LINE__ << "]\t" << mthn << "Will terminate" << endl;
0490 ::abort();
0491 }
0492 std::set<PixelChannel>::const_iterator firstChannel = channelsOnModule.begin();
0493 assert(firstChannel != channelsOnModule.end());
0494 return getHdwAddress(*firstChannel);
0495 }
0496
0497 const PixelChannel& PixelNameTranslation::getChannelForROC(const PixelROCName& aROC) const {
0498 std::map<PixelROCName, PixelHdwAddress>::const_iterator foundEntry = translationtable_.find(aROC);
0499 assert(foundEntry != translationtable_.end());
0500 return getChannelFromHdwAddress(foundEntry->second);
0501 }
0502
0503 std::set<PixelChannel> PixelNameTranslation::getChannelsOnModule(const PixelModuleName& aModule) const {
0504 std::set<PixelChannel> returnThis;
0505 for (std::map<PixelChannel, PixelHdwAddress>::const_iterator channelTranslationTable_itr =
0506 channelTranslationTable_.begin();
0507 channelTranslationTable_itr != channelTranslationTable_.end();
0508 ++channelTranslationTable_itr) {
0509 if (channelTranslationTable_itr->first.module() == aModule)
0510 returnThis.insert(channelTranslationTable_itr->first);
0511 }
0512 assert(returnThis.size() <= 2);
0513 return returnThis;
0514 }
0515
0516 const std::vector<PixelROCName>& PixelNameTranslation::getROCsFromFEDChannel(unsigned int fednumber,
0517 unsigned int fedchannel) const {
0518 std::map<unsigned int, std::map<unsigned int, std::vector<PixelROCName> > >::const_iterator it =
0519 rocsFromFEDidAndChannel_.find(fednumber);
0520
0521 assert(it != rocsFromFEDidAndChannel_.end());
0522
0523 std::map<unsigned int, std::vector<PixelROCName> >::const_iterator it2 = it->second.find(fedchannel);
0524
0525 assert(it2 != it->second.end());
0526
0527 return it2->second;
0528 }
0529
0530
0531
0532
0533
0534 std::vector<PixelROCName> PixelNameTranslation::buildROCsFromFEDChannel(unsigned int fednumber,
0535 unsigned int fedchannel) const {
0536 std::vector<PixelROCName> tmp(24);
0537
0538 int counter = 0;
0539
0540 int maxindex = 0;
0541
0542 std::map<PixelROCName, PixelHdwAddress>::const_iterator it = translationtable_.begin();
0543
0544 for (; it != translationtable_.end(); ++it) {
0545 if (it->second.fednumber() == fednumber && it->second.fedchannel() == fedchannel) {
0546 int index = it->second.fedrocnumber();
0547 if (index > maxindex)
0548 maxindex = index;
0549
0550 tmp[index] = it->first;
0551 counter++;
0552 }
0553 }
0554
0555 assert(counter == maxindex + 1);
0556
0557 tmp.resize(counter);
0558
0559 return tmp;
0560 }
0561
0562 bool PixelNameTranslation::ROCNameFromFEDChannelROCExists(unsigned int fednumber,
0563 unsigned int channel,
0564 unsigned int roc) const {
0565 PixelHdwAddress tmp(0, 0, 0, 0, 0, 0, fednumber, channel, roc);
0566
0567 return (fedlookup_.find(tmp) != fedlookup_.end());
0568 }
0569
0570 PixelROCName PixelNameTranslation::ROCNameFromFEDChannelROC(unsigned int fednumber,
0571 unsigned int channel,
0572 unsigned int roc) const {
0573 std::string mthn = "[PixelNameTranslation::ROCNameFromFEDChannelROC()]\t\t ";
0574 PixelHdwAddress tmp(0, 0, 0, 0, 0, 0, fednumber, channel, roc);
0575
0576 std::map<PixelHdwAddress, PixelROCName, PixelHdwAddress>::const_iterator it1 = fedlookup_.find(tmp);
0577
0578 if (it1 != fedlookup_.end()) {
0579 return it1->second;
0580 }
0581
0582 std::cout << __LINE__ << "]\t" << mthn << "could not find ROCName "
0583 << " for FED#" << fednumber << " chan=" << channel << " roc#=" << roc << std::endl;
0584
0585 assert(0);
0586
0587 PixelROCName tmp1;
0588
0589 return tmp1;
0590 }
0591
0592 PixelChannel PixelNameTranslation::ChannelFromFEDChannel(unsigned int fednumber, unsigned int fedchannel) const {
0593 std::string mthn = "[PixelNameTranslation::ChannelFromFEDChannel()]\t\t ";
0594 std::map<PixelChannel, PixelHdwAddress>::const_iterator toReturn;
0595 bool foundOne = false;
0596 for (std::map<PixelChannel, PixelHdwAddress>::const_iterator it = channelTranslationTable_.begin();
0597 it != channelTranslationTable_.end();
0598 ++it) {
0599 if (it->second.fednumber() == fednumber && it->second.fedchannel() == fedchannel) {
0600 if (foundOne) {
0601 std::cout << __LINE__ << "]\t" << mthn << "ERROR: multiple channels on FED#" << fednumber
0602 << ", chan=" << fedchannel << std::endl;
0603 assert(0);
0604 } else {
0605 toReturn = it;
0606 foundOne = true;
0607 }
0608 }
0609 }
0610
0611 if (!foundOne) {
0612 std::cout << __LINE__ << "]\t" << mthn << "ERROR: no channel found for FED#" << fednumber << ", chan=" << fedchannel
0613 << std::endl;
0614 assert(0);
0615 }
0616
0617 return toReturn->first;
0618 }
0619
0620 bool PixelNameTranslation::FEDChannelExist(unsigned int fednumber, unsigned int fedchannel) const {
0621 std::string mthn = "[PixelNameTranslation::FEDChannelExist()]\t\t ";
0622 std::map<PixelChannel, PixelHdwAddress>::const_iterator toReturn;
0623 bool foundOne = false;
0624 for (std::map<PixelChannel, PixelHdwAddress>::const_iterator it = channelTranslationTable_.begin();
0625 it != channelTranslationTable_.end();
0626 ++it) {
0627 if (it->second.fednumber() == fednumber && it->second.fedchannel() == fedchannel) {
0628 if (foundOne) {
0629 std::cout << __LINE__ << "]\t" << mthn << "ERROR: multiple channels on FED#" << fednumber
0630 << ", chan=" << fedchannel << std::endl;
0631 assert(0);
0632 } else {
0633 toReturn = it;
0634 foundOne = true;
0635 }
0636 }
0637 }
0638 return foundOne;
0639 }
0640
0641 const PixelChannel& PixelNameTranslation::getChannelFromHdwAddress(const PixelHdwAddress& aHdwAddress) const {
0642
0643 std::string mthn = "[PixelNameTranslation::getChannelFromHdwAddress()]\t\t ";
0644
0645 std::map<PixelHdwAddress, PixelChannel>::const_iterator it = hdwTranslationTable_.find(aHdwAddress);
0646
0647 if (it == hdwTranslationTable_.end()) {
0648 std::cout << __LINE__ << "]\t" << mthn << "ERROR: no channel found for hardware address " << aHdwAddress
0649 << std::endl;
0650 assert(0);
0651 }
0652
0653 return it->second;
0654
0655
0656
0657
0658
0659
0660
0661
0662
0663
0664
0665
0666
0667
0668
0669
0670 }
0671
0672 void PixelNameTranslation::writeASCII(std::string dir) const {
0673 std::string mthn = "[PixelNameTranslation::writeASCII()]\t\t\t ";
0674 if (!dir.empty())
0675 dir += "/";
0676 std::string filename = dir + "translation.dat";
0677
0678 std::ofstream out(filename.c_str());
0679
0680
0681
0682
0683
0684
0685
0686
0687
0688 out << "# name TBMchannel FEC mfec mfecchannel hubaddress portadd rocid FED "
0689 "channel roc#"
0690 << endl;
0691
0692 std::map<PixelROCName, PixelHdwAddress>::const_iterator iroc = translationtable_.begin();
0693
0694 for (; iroc != translationtable_.end(); ++iroc) {
0695
0696 std::string TBMChannel = getChannelFromHdwAddress(iroc->second).TBMChannelString();
0697
0698 out << iroc->first.rocname() << " " << TBMChannel << " " << iroc->second.fecnumber() << " "
0699 << iroc->second.mfec() << " " << iroc->second.mfecchannel() << " " << iroc->second.hubaddress()
0700 << " " << iroc->second.portaddress() << " " << iroc->second.rocid() << " "
0701 << iroc->second.fednumber() << " " << iroc->second.fedchannel() << " "
0702 << iroc->second.fedrocnumber() << endl;
0703 }
0704
0705 out.close();
0706 }
0707
0708
0709 void PixelNameTranslation::writeXMLHeader(pos::PixelConfigKey key,
0710 int version,
0711 std::string path,
0712 std::ofstream* outstream,
0713 std::ofstream* out1stream,
0714 std::ofstream* out2stream) const {
0715 std::string mthn = "[PixelNameTranslation:::writeXMLHeader()]\t\t\t ";
0716 std::stringstream fullPath;
0717 fullPath << path << "/Pixel_NameTranslation_" << PixelTimeFormatter::getmSecTime() << ".xml";
0718 cout << __LINE__ << "]\t" << mthn << "Writing to: " << fullPath.str() << endl;
0719
0720 outstream->open(fullPath.str().c_str());
0721 *outstream << "<?xml version='1.0' encoding='UTF-8' standalone='yes'?>" << endl;
0722 *outstream << "<ROOT xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>" << endl;
0723 *outstream << " <HEADER>" << endl;
0724 *outstream << " <TYPE>" << endl;
0725 *outstream << " <EXTENSION_TABLE_NAME>PIXEL_NAME_TRANSLATION</EXTENSION_TABLE_NAME>" << endl;
0726 *outstream << " <NAME>Pixel Name Translation</NAME>" << endl;
0727 *outstream << " </TYPE>" << endl;
0728 *outstream << " <RUN>" << endl;
0729 *outstream << " <RUN_TYPE>Pixel Name Translation</RUN_TYPE>" << endl;
0730 *outstream << " <RUN_NUMBER>1</RUN_NUMBER>" << endl;
0731 *outstream << " <RUN_BEGIN_TIMESTAMP>" << pos::PixelTimeFormatter::getTime() << "</RUN_BEGIN_TIMESTAMP>" << endl;
0732 *outstream << " <LOCATION>CERN P5</LOCATION>" << endl;
0733 *outstream << " </RUN>" << endl;
0734 *outstream << " </HEADER>" << endl;
0735 *outstream << " " << endl;
0736 *outstream << " <DATA_SET>" << endl;
0737 *outstream << " <PART>" << endl;
0738 *outstream << " <NAME_LABEL>CMS-PIXEL-ROOT</NAME_LABEL>" << endl;
0739 *outstream << " <KIND_OF_PART>Detector ROOT</KIND_OF_PART>" << endl;
0740 *outstream << " </PART>" << endl;
0741 *outstream << " <VERSION>" << version << "</VERSION>" << endl;
0742 *outstream << " <COMMENT_DESCRIPTION>" << getComment() << "</COMMENT_DESCRIPTION>" << endl;
0743 *outstream << " <CREATED_BY_USER>" << getAuthor() << "</CREATED_BY_USER>" << endl;
0744 *outstream << " " << endl;
0745 }
0746
0747
0748 void PixelNameTranslation::writeXML(std::ofstream* outstream,
0749 std::ofstream* out1stream,
0750 std::ofstream* out2stream) const {
0751 std::string mthn = "[PixelNameTranslation::writeXML()]\t\t\t ";
0752
0753 std::map<PixelROCName, PixelHdwAddress>::const_iterator iroc = translationtable_.begin();
0754
0755 for (; iroc != translationtable_.end(); ++iroc) {
0756
0757 std::string TBMChannel = getChannelFromHdwAddress(iroc->second).TBMChannelString();
0758
0759 *outstream << " <DATA>" << endl;
0760 *outstream << " <ROC_NAME>" << iroc->first.rocname() << "</ROC_NAME>" << endl;
0761 *outstream << " <TBM_MODE>" << TBMChannel << "</TBM_MODE>" << endl;
0762 *outstream << " <PXLFEC_NAME>" << iroc->second.fecnumber() << "</PXLFEC_NAME>" << endl;
0763 *outstream << " <MFEC_POSN>" << iroc->second.mfec() << "</MFEC_POSN>" << endl;
0764 *outstream << " <MFEC_CHAN>" << iroc->second.mfecchannel() << "</MFEC_CHAN>" << endl;
0765 *outstream << " <HUB_ADDRS>" << iroc->second.hubaddress() << "</HUB_ADDRS>" << endl;
0766 *outstream << " <PORT_NUM>" << iroc->second.portaddress() << "</PORT_NUM>" << endl;
0767 *outstream << " <ROC_I2C_ADDR>" << iroc->second.rocid() << "</ROC_I2C_ADDR>" << endl;
0768 *outstream << " <PXLFED_NAME>" << iroc->second.fednumber() << "</PXLFED_NAME>" << endl;
0769 *outstream << " <FED_CHAN>" << iroc->second.fedchannel() << "</FED_CHAN>" << endl;
0770 *outstream << " <FED_ROC_NUM>" << iroc->second.fedrocnumber() << "</FED_ROC_NUM>" << endl;
0771 *outstream << " </DATA>" << endl;
0772 *outstream << "" << endl;
0773 }
0774 }
0775
0776
0777 void PixelNameTranslation::writeXMLTrailer(std::ofstream* outstream,
0778 std::ofstream* out1stream,
0779 std::ofstream* out2stream) const {
0780 std::string mthn = "[PixelNameTranslation::writeXMLTrailer()]\t\t\t ";
0781
0782 *outstream << " </DATA_SET>" << endl;
0783 *outstream << "</ROOT> " << endl;
0784
0785 outstream->close();
0786 }
0787
0788
0789 void PixelNameTranslation::writeXML(pos::PixelConfigKey key, int version, std::string path) const {
0790 std::string mthn = "[PixelNameTranslation::writeXML]\t\t\t ";
0791 std::stringstream fullPath;
0792
0793 fullPath << path << "/Pixel_NameTranslation.xml";
0794 cout << __LINE__ << "]\t" << mthn << "Writing to: " << fullPath.str() << endl;
0795
0796 std::ofstream out(fullPath.str().c_str());
0797
0798 out << "<?xml version='1.0' encoding='UTF-8' standalone='yes'?>" << endl;
0799 out << "<ROOT xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>" << endl;
0800 out << "" << endl;
0801 out << " <HEADER>" << endl;
0802 out << " <HINTS mode='only-det-root' />" << endl;
0803 out << " <TYPE>" << endl;
0804 out << " <EXTENSION_TABLE_NAME>PIXEL_NAME_TRANSLATION</EXTENSION_TABLE_NAME>" << endl;
0805 out << " <NAME>Pixel Name Translation</NAME>" << endl;
0806 out << " </TYPE>" << endl;
0807 out << " <RUN>" << endl;
0808 out << " <RUN_TYPE>Pixel Name Translation</RUN_TYPE>" << endl;
0809 out << " <RUN_NUMBER>1</RUN_NUMBER>" << endl;
0810 out << " <RUN_BEGIN_TIMESTAMP>" << pos::PixelTimeFormatter::getTime() << "</RUN_BEGIN_TIMESTAMP>" << endl;
0811 out << " <COMMENT_DESCRIPTION>Test of Name Translation xml</COMMENT_DESCRIPTION>" << endl;
0812 out << " <LOCATION>CERN TAC</LOCATION>" << endl;
0813 out << " <CREATED_BY_USER>Dario Menasce</CREATED_BY_USER>" << endl;
0814 out << " </RUN>" << endl;
0815 out << " </HEADER>" << endl;
0816 out << "" << endl;
0817 out << " <DATA_SET>" << endl;
0818 out << " <VERSION>" << version << "</VERSION>" << endl;
0819 out << " <PART>" << endl;
0820 out << " <NAME_LABEL>CMS-PIXEL-ROOT</NAME_LABEL>" << endl;
0821 out << " <KIND_OF_PART>Detector ROOT</KIND_OF_PART>" << endl;
0822 out << " </PART>" << endl;
0823 out << "" << endl;
0824
0825 std::map<PixelROCName, PixelHdwAddress>::const_iterator iroc = translationtable_.begin();
0826
0827 for (; iroc != translationtable_.end(); ++iroc) {
0828
0829 std::string TBMChannel = getChannelFromHdwAddress(iroc->second).TBMChannelString();
0830
0831 out << " <DATA>" << endl;
0832 out << " <PXLFEC_NAME>" << iroc->second.fecnumber() << "</PXLFEC_NAME>" << endl;
0833 out << " <MFEC_POSN>" << iroc->second.mfec() << "</MFEC_POSN>" << endl;
0834 out << " <MFEC_CHAN>" << iroc->second.mfecchannel() << "</MFEC_CHAN>" << endl;
0835 out << " <HUB_ADDRS>" << iroc->second.hubaddress() << "</HUB_ADDRS>" << endl;
0836 out << " <PORT_NUM>" << iroc->second.portaddress() << "</PORT_NUM>" << endl;
0837 out << " <ROC_I2C_ADDR>" << iroc->second.rocid() << "</ROC_I2C_ADDR>" << endl;
0838 out << " <PXLFED_NAME>" << iroc->second.fednumber() << "</PXLFED_NAME>" << endl;
0839 out << " <FED_CHAN>" << iroc->second.fedchannel() << "</FED_CHAN>" << endl;
0840 out << " <FED_RO_NUM>" << iroc->second.fedrocnumber() << "</FED_ROC_NUM>" << endl;
0841 out << " </DATA>" << endl;
0842 out << "" << endl;
0843 }
0844 out << " </DATA_SET> " << endl;
0845 out << "</ROOT> " << endl;
0846 out.close();
0847 assert(0);
0848 }
0849
0850 const std::vector<PixelROCName>& PixelNameTranslation::getROCsFromChannel(const PixelChannel& aChannel) const {
0851 const PixelHdwAddress& channelHdwAddress = getHdwAddress(aChannel);
0852 return getROCsFromFEDChannel(channelHdwAddress.fednumber(), channelHdwAddress.fedchannel());
0853 }
0854
0855 std::vector<PixelROCName> PixelNameTranslation::getROCsFromModule(const PixelModuleName& aModule) const {
0856 std::vector<PixelROCName> returnThis;
0857
0858 std::set<PixelChannel> channelsOnThisModule = getChannelsOnModule(aModule);
0859 for (std::set<PixelChannel>::const_iterator channelsOnThisModule_itr = channelsOnThisModule.begin();
0860 channelsOnThisModule_itr != channelsOnThisModule.end();
0861 ++channelsOnThisModule_itr) {
0862 std::vector<PixelROCName> ROCsOnThisChannel = getROCsFromChannel(*channelsOnThisModule_itr);
0863 for (std::vector<PixelROCName>::const_iterator ROCsOnThisChannel_itr = ROCsOnThisChannel.begin();
0864 ROCsOnThisChannel_itr != ROCsOnThisChannel.end();
0865 ++ROCsOnThisChannel_itr) {
0866 returnThis.push_back(*ROCsOnThisChannel_itr);
0867 }
0868 }
0869
0870 return returnThis;
0871 }
0872
0873
0874
0875 bool PixelNameTranslation::ROCexists(PixelROCName theROC) {
0876 if (translationtable_.find(theROC) == translationtable_.end()) {
0877 return false;
0878 }
0879 return true;
0880 }
0881
0882 std::map<unsigned int, std::set<unsigned int> > PixelNameTranslation::getFEDsAndChannels() const {
0883 std::map<unsigned int, std::set<unsigned int> > tmp;
0884
0885 std::map<PixelChannel, PixelHdwAddress>::const_iterator channelTranslationTable_itr =
0886 channelTranslationTable_.begin();
0887
0888 for (; channelTranslationTable_itr != channelTranslationTable_.end(); ++channelTranslationTable_itr) {
0889 unsigned int fednumber = channelTranslationTable_itr->second.fednumber();
0890 unsigned int fedchannel = channelTranslationTable_itr->second.fedchannel();
0891
0892 tmp[fednumber].insert(fedchannel);
0893 }
0894
0895 return tmp;
0896 }