00001
00002
00003
00004
00005
00006
00007 #include "CalibFormats/SiPixelObjects/interface/PixelNameTranslation.h"
00008 #include "CalibFormats/SiPixelObjects/interface/PixelDetectorConfig.h"
00009 #include "CalibFormats/SiPixelObjects/interface/PixelTimeFormatter.h"
00010
00011 #include <fstream>
00012 #include <sstream>
00013 #include <map>
00014 #include <string>
00015 #include <vector>
00016 #include <assert.h>
00017 #include <stdexcept>
00018
00019 using namespace pos;
00020 using namespace std;
00021
00022
00023 PixelNameTranslation::PixelNameTranslation(std::vector< std::vector<std::string> > &tableMat):PixelConfigBase(" "," "," "){
00024 std::string mthn = "[PixelNameTranslation::PixelNameTranslation()]\t\t " ;
00025 std::map<std::string , int > colM;
00026 std::vector<std::string > colNames;
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049 colNames.push_back("CONFIG_KEY" );
00050 colNames.push_back("KEY_TYPE" );
00051 colNames.push_back("KEY_ALIAS" );
00052 colNames.push_back("VERSION" );
00053 colNames.push_back("KIND_OF_COND");
00054 colNames.push_back("ROC_NAME" );
00055 colNames.push_back("PXLFEC_NAME" );
00056 colNames.push_back("MFEC_POSN" );
00057 colNames.push_back("MFEC_CHAN" );
00058 colNames.push_back("HUB_ADDRS" );
00059 colNames.push_back("PORT_NUM" );
00060 colNames.push_back("ROC_I2C_ADDR");
00061 colNames.push_back("PXLFED_NAME" );
00062 colNames.push_back("FED_CHAN" );
00063 colNames.push_back("FED_ROC_NUM" );
00064 colNames.push_back("TBM_MODE" );
00065
00066 for(unsigned int c = 0 ; c < tableMat[0].size() ; c++){
00067 for(unsigned int n=0; n<colNames.size(); n++){
00068 if(tableMat[0][c] == colNames[n]){
00069 colM[colNames[n]] = c;
00070 break;
00071 }
00072 }
00073 }
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083 for(unsigned int r = 1 ; r < tableMat.size() ; r++){
00084 std::string rocname = tableMat[r][colM["ROC_NAME"]] ;
00085 std::string TBMChannel = tableMat[r][colM["TBM_MODE"]] ;
00086 if(TBMChannel == "")
00087 {
00088 TBMChannel = "A" ;
00089 }
00090
00091
00092
00093
00094
00095
00096 unsigned int fecnumber = (unsigned int)atoi(tableMat[r][colM["PXLFEC_NAME"]].c_str());
00097 unsigned int mfec = (unsigned int)atoi(tableMat[r][colM["MFEC_POSN"]].c_str());
00098 unsigned int mfecchannel = (unsigned int)atoi(tableMat[r][colM["MFEC_CHAN"]].c_str());
00099 unsigned int hubaddress = (unsigned int)atoi(tableMat[r][colM["HUB_ADDRS"]].c_str());
00100 unsigned int portaddress = (unsigned int)atoi(tableMat[r][colM["PORT_NUM"]].c_str());
00101 unsigned int rocid = (unsigned int)atoi(tableMat[r][colM["ROC_I2C_ADDR"]].c_str());
00102
00103
00104
00105
00106
00107
00108 unsigned int fednumber = (unsigned int)atoi(tableMat[r][colM["PXLFED_NAME"]].c_str());
00109 unsigned int fedchannel = (unsigned int)atoi(tableMat[r][colM["FED_CHAN"]].c_str());
00110 unsigned int fedrocnumber = (unsigned int)(atoi(tableMat[r][colM["FED_ROC_NUM"]].c_str()));
00111
00112
00113 PixelROCName aROC(rocname);
00114 if (aROC.rocname()!=rocname){
00115 std::cout << __LINE__ << "]\t" << mthn << "Rocname : " << rocname << std::endl;
00116 std::cout << __LINE__ << "]\t" << mthn << "Parsed to: " << aROC.rocname() << std::endl;
00117 assert(0);
00118 }
00119
00120 if (ROCNameFromFEDChannelROCExists(fednumber,fedchannel,
00121 fedrocnumber)){
00122 std::cout << __LINE__ << "]\t" << mthn
00123 << "ROC with fednumber=" << fednumber
00124 << " fedchannel=" << fedchannel
00125 << " roc number=" << fedrocnumber
00126 << " already exists" << std::endl;
00127 std::cout << __LINE__ << "]\t" << mthn << "Fix this inconsistency in the name translation"
00128 << std::endl;
00129 assert(0);
00130 }
00131
00132 PixelHdwAddress hdwAdd(fecnumber,mfec,mfecchannel,
00133 hubaddress,portaddress,
00134 rocid,
00135 fednumber,fedchannel,fedrocnumber);
00136
00137 translationtable_[aROC]=hdwAdd;
00138 fedlookup_[hdwAdd]=aROC;
00139
00140 PixelModuleName aModule(rocname);
00141 PixelChannel aChannel(aModule, TBMChannel);
00142
00143 hdwTranslationTable_[hdwAdd] = aChannel;
00144
00145
00146
00147 bool foundChannel = false;
00148
00149 std::map<PixelChannel, PixelHdwAddress >::const_iterator channelTranslationTable_itr = channelTranslationTable_.find(aChannel);
00150
00151 if ( channelTranslationTable_itr != channelTranslationTable_.end()) {
00152
00153 if (!(channelTranslationTable_itr->second |= hdwAdd))
00154 {
00155 cout << "Found two ROCs on the same channe, but not same hdw"<<endl;
00156 cout << "Hdw1:"<<endl<<channelTranslationTable_itr->second<<endl;
00157 cout << "Hdw2:"<<endl<<hdwAdd<<endl;
00158 }
00159 assert( channelTranslationTable_itr->second |= hdwAdd );
00160 foundChannel = true;
00161 }
00162 else if ( channelTranslationTable_itr->first.module() == aModule )
00163 {
00164 assert( channelTranslationTable_itr->second.fecnumber() == hdwAdd.fecnumber() );
00165 assert( channelTranslationTable_itr->second.mfec() == hdwAdd.mfec() );
00166 assert( channelTranslationTable_itr->second.mfecchannel() == hdwAdd.mfecchannel() );
00167
00168 assert( channelTranslationTable_itr->second.hubaddress() == hdwAdd.hubaddress() );
00169 assert( channelTranslationTable_itr->second.fednumber() != hdwAdd.fednumber() || channelTranslationTable_itr->second.fedchannel() != hdwAdd.fedchannel() );
00170 }
00171
00172 if ( foundChannel == false ) {
00173 channelTranslationTable_[aChannel] = hdwAdd;
00174 }
00175
00176 }
00177
00178 const std::map<unsigned int, std::set<unsigned int> > fedsAndChannels=getFEDsAndChannels();
00179
00180
00181 std::vector<PixelROCName> tmp(24);
00182
00183 std::map<unsigned int, std::map<unsigned int, int > > counter;
00184
00185
00186 std::map<unsigned int, std::map<unsigned int, int > > maxindex;
00187
00188 std::map<PixelROCName,PixelHdwAddress>::const_iterator it=translationtable_.begin();
00189
00190 for(;it!=translationtable_.end();it++){
00191
00192 int index=it->second.fedrocnumber();
00193
00194 unsigned int fednumber=it->second.fednumber();
00195 unsigned int fedchannel=it->second.fedchannel();
00196
00197 std::vector<PixelROCName>& tmp= rocsFromFEDidAndChannel_[fednumber][fedchannel];
00198
00199 if (tmp.size()==0){
00200 tmp.resize(24);
00201 counter[fednumber][fedchannel]=0;
00202 maxindex[fednumber][fedchannel]=0;
00203 }
00204
00205 if (index>maxindex[fednumber][fedchannel]) maxindex[fednumber][fedchannel]=index;
00206 tmp[index]=it->first;
00207 counter[fednumber][fedchannel]++;
00208
00209 }
00210
00211
00212 it=translationtable_.begin();
00213
00214 for(;it!=translationtable_.end();it++){
00215
00216 unsigned int fednumber=it->second.fednumber();
00217 unsigned int fedchannel=it->second.fedchannel();
00218
00219 std::vector<PixelROCName>& tmp= rocsFromFEDidAndChannel_[fednumber][fedchannel];
00220
00221 assert(counter[fednumber][fedchannel]==maxindex[fednumber][fedchannel]+1);
00222
00223 tmp.resize(counter[fednumber][fedchannel]);
00224
00225 }
00226
00227 }
00228
00229
00230 PixelNameTranslation::PixelNameTranslation(std::string filename):
00231 PixelConfigBase(" "," "," "){
00232
00233 static std::string mthn = "[PixelNameTranslation::PixelNameTranslation()]\t\t " ;
00234
00235 std::ifstream in(filename.c_str());
00236
00237 if (!in.good()){
00238 std::cout << __LINE__ << "]\t" << mthn << "Could not open: " << filename << std::endl;
00239 throw std::runtime_error("Failed to open file "+filename);
00240 }
00241 else {
00242 std::cout << __LINE__ << "]\t" << mthn << "Reading from: " << filename << std::endl;
00243 }
00244
00245 std::string dummy;
00246
00247 getline(in, dummy);
00248
00249
00250 do {
00251
00252 std::string rocname;
00253 std::string TBMChannel;
00254 unsigned int fecnumber;
00255 unsigned int mfec;
00256 unsigned int mfecchannel;
00257 unsigned int hubaddress;
00258 unsigned int portaddress;
00259 unsigned int rocid;
00260 unsigned int fednumber;
00261 unsigned int fedchannel;
00262 unsigned int fedrocnumber;
00263
00264
00265 in >> rocname;
00266 in >> TBMChannel;
00267 if ( TBMChannel != "A" && TBMChannel != "B" )
00268 {
00269 fecnumber = atoi(TBMChannel.c_str());
00270 TBMChannel = "A";
00271 }
00272 else
00273 {
00274 in >> fecnumber;
00275 }
00276 in >> mfec >> mfecchannel
00277 >> hubaddress >> portaddress >> rocid >> fednumber
00278 >> fedchannel >> fedrocnumber;
00279
00280 if (!in.eof() ){
00281
00282 PixelROCName aROC(rocname);
00283
00284
00285
00286
00287
00288
00289
00290
00291 if (ROCNameFromFEDChannelROCExists(fednumber,fedchannel,
00292 fedrocnumber)){
00293 std::cout << __LINE__ << "]\t" << mthn
00294 << "ROC with fednumber=" << fednumber
00295 << " fedchannel=" << fedchannel
00296 << " roc number=" << fedrocnumber
00297 << " already exists" << std::endl;
00298 std::cout << __LINE__ << "]\t" << mthn
00299 << "Fix this inconsistency in the name translation"
00300 << std::endl;
00301 assert(0);
00302
00303 }
00304
00305 PixelHdwAddress hdwAdd(fecnumber,mfec,mfecchannel,
00306 hubaddress,portaddress,
00307 rocid,
00308 fednumber,fedchannel,fedrocnumber);
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334 translationtable_[aROC]=hdwAdd;
00335 fedlookup_[hdwAdd]=aROC;
00336
00337 PixelModuleName aModule(rocname);
00338 PixelChannel aChannel(aModule, TBMChannel);
00339
00340 hdwTranslationTable_[hdwAdd] = aChannel;
00341
00342
00343
00344
00345
00346 bool foundChannel = false;
00347
00348
00349 std::map<PixelChannel, PixelHdwAddress >::const_iterator channelTranslationTable_itr = channelTranslationTable_.find(aChannel);
00350
00351 if ( channelTranslationTable_itr != channelTranslationTable_.end()) {
00352 if (!(channelTranslationTable_itr->second |= hdwAdd)){
00353
00354 cout << __LINE__ << "]\t" << mthn << "Found two ROCs on the same channe, but not same hdw" << endl;
00355 cout << __LINE__ << "]\t" << mthn << "Hdw1: " << endl << channelTranslationTable_itr->second << endl;
00356 cout << __LINE__ << "]\t" << mthn << "Hdw2: " << endl << hdwAdd << endl;
00357 }
00358 assert( channelTranslationTable_itr->second |= hdwAdd );
00359 foundChannel = true;
00360 }
00361 else if ( channelTranslationTable_itr->first.module() == aModule ) {
00362 assert( channelTranslationTable_itr->second.fecnumber() == hdwAdd.fecnumber() );
00363 assert( channelTranslationTable_itr->second.mfec() == hdwAdd.mfec() );
00364 assert( channelTranslationTable_itr->second.mfecchannel() == hdwAdd.mfecchannel() );
00365
00366 assert( channelTranslationTable_itr->second.hubaddress() == hdwAdd.hubaddress() );
00367 assert( channelTranslationTable_itr->second.fednumber() != hdwAdd.fednumber() || channelTranslationTable_itr->second.fedchannel() != hdwAdd.fedchannel() );
00368 }
00369
00370
00371
00372 if ( foundChannel == false ){
00373 channelTranslationTable_[aChannel] = hdwAdd;
00374 }
00375
00376 }
00377 }
00378 while (!in.eof());
00379 in.close();
00380
00381
00382 const std::map<unsigned int, std::set<unsigned int> > fedsAndChannels=getFEDsAndChannels();
00383
00384
00385 std::vector<PixelROCName> tmp(24);
00386
00387 std::map<unsigned int, std::map<unsigned int, int > > counter;
00388
00389
00390 std::map<unsigned int, std::map<unsigned int, int > > maxindex;
00391
00392 std::map<PixelROCName,PixelHdwAddress>::const_iterator it=translationtable_.begin();
00393
00394 for(;it!=translationtable_.end();it++){
00395
00396 int index=it->second.fedrocnumber();
00397
00398 unsigned int fednumber=it->second.fednumber();
00399 unsigned int fedchannel=it->second.fedchannel();
00400
00401 std::vector<PixelROCName>& tmp= rocsFromFEDidAndChannel_[fednumber][fedchannel];
00402
00403 if (tmp.size()==0){
00404 tmp.resize(24);
00405 counter[fednumber][fedchannel]=0;
00406 maxindex[fednumber][fedchannel]=0;
00407 }
00408
00409 if (index>maxindex[fednumber][fedchannel]) maxindex[fednumber][fedchannel]=index;
00410 tmp[index]=it->first;
00411 counter[fednumber][fedchannel]++;
00412
00413 }
00414
00415
00416 it=translationtable_.begin();
00417
00418 for(;it!=translationtable_.end();it++){
00419
00420 unsigned int fednumber=it->second.fednumber();
00421 unsigned int fedchannel=it->second.fedchannel();
00422
00423 std::vector<PixelROCName>& tmp= rocsFromFEDidAndChannel_[fednumber][fedchannel];
00424
00425 assert(counter[fednumber][fedchannel]==maxindex[fednumber][fedchannel]+1);
00426
00427 tmp.resize(counter[fednumber][fedchannel]);
00428
00429 }
00430
00431
00432 }
00433
00434 std::ostream& operator<<(std::ostream& s, const PixelNameTranslation& table){
00435
00436
00437
00438
00439 return s;
00440
00441 }
00442
00443 std::list<const PixelROCName*> PixelNameTranslation::getROCs() const
00444 {
00445 std::list<const PixelROCName*> listOfROCs;
00446 for ( std::map<PixelROCName, PixelHdwAddress>::const_iterator translationTableEntry = translationtable_.begin();
00447 translationTableEntry != translationtable_.end(); ++translationTableEntry ) {
00448 listOfROCs.push_back(&(translationTableEntry->first));
00449 }
00450
00451 return listOfROCs;
00452 }
00453
00454 std::list<const PixelModuleName*> PixelNameTranslation::getModules() const
00455 {
00456 std::list<const PixelModuleName*> listOfModules;
00457 for ( std::map<PixelChannel, PixelHdwAddress >::const_iterator channelTranslationTable_itr = channelTranslationTable_.begin(); channelTranslationTable_itr != channelTranslationTable_.end(); channelTranslationTable_itr++ )
00458 {
00459 bool foundOne = false;
00460 for ( std::list<const PixelModuleName*>::const_iterator listOfModules_itr = listOfModules.begin(); listOfModules_itr != listOfModules.end(); listOfModules_itr++ )
00461 {
00462 if ( *(*listOfModules_itr) == channelTranslationTable_itr->first.module() )
00463 {
00464 foundOne = true;
00465 break;
00466 }
00467 }
00468 if (!foundOne) listOfModules.push_back( &(channelTranslationTable_itr->first.module()) );
00469 }
00470
00471 return listOfModules;
00472 }
00473
00474 std::set<PixelChannel> PixelNameTranslation::getChannels() const
00475 {
00476 std::set<PixelChannel> channelSet;
00477 for ( std::map<PixelChannel, PixelHdwAddress >::const_iterator channelTranslationTable_itr = channelTranslationTable_.begin(); channelTranslationTable_itr != channelTranslationTable_.end(); channelTranslationTable_itr++ )
00478 {
00479 channelSet.insert(channelTranslationTable_itr->first);
00480 }
00481 return channelSet;
00482 }
00483
00484 std::set<PixelChannel> PixelNameTranslation::getChannels(const PixelDetectorConfig& aDetectorConfig) const
00485 {
00486 std::set<PixelChannel> channelSet;
00487 for ( std::map<PixelChannel, PixelHdwAddress >::const_iterator channelTranslationTable_itr = channelTranslationTable_.begin(); channelTranslationTable_itr != channelTranslationTable_.end(); channelTranslationTable_itr++ )
00488 {
00489 if ( aDetectorConfig.containsModule(channelTranslationTable_itr->first.module()) ) channelSet.insert(channelTranslationTable_itr->first);
00490 }
00491 return channelSet;
00492 }
00493
00494 const PixelHdwAddress* PixelNameTranslation::getHdwAddress(const PixelROCName& aROC) const{
00495
00496 static std::string mthn = "[PixelNameTranslation::getHdwAddress()]\t\t " ;
00497 std::map<PixelROCName,PixelHdwAddress>::const_iterator it=
00498 translationtable_.find(aROC);
00499
00500 if (it==translationtable_.end()){
00501 std::cout<< __LINE__ << "]\t" << mthn << "Could not look up ROC: " << aROC << std::endl;
00502 assert(0);
00503 }
00504
00505 return &(it->second);
00506
00507 }
00508
00509
00510 bool PixelNameTranslation::checkROCExistence(const PixelROCName& aROC) const{
00511
00512 std::string mthn = "[PixelNameTranslation::checkROCExistence()]\t\t " ;
00513 if (translationtable_.find(aROC)==translationtable_.end()) return false ;
00514 return true ;
00515 }
00516
00517 const bool PixelNameTranslation::checkFor(const PixelROCName& aROC) const{
00518 if (translationtable_.find(aROC)==translationtable_.end())
00519 {
00520 return false ;
00521 }
00522 else
00523 {
00524 return true ;
00525 }
00526 }
00527
00528 const PixelHdwAddress& PixelNameTranslation::getHdwAddress(const PixelChannel& aChannel) const
00529 {
00530 std::map<PixelChannel, PixelHdwAddress >::const_iterator channelHdwAddress_itr = channelTranslationTable_.find(aChannel);
00531 assert( channelHdwAddress_itr != channelTranslationTable_.end() );
00532 return channelHdwAddress_itr->second;
00533 }
00534
00535 const PixelHdwAddress& PixelNameTranslation::firstHdwAddress(const PixelModuleName& aModule) const
00536 {
00537 std::string mthn = "[PixelNameTranslation::firstHdwAddress()]\t\t " ;
00538 std::set<PixelChannel> channelsOnModule = getChannelsOnModule(aModule);
00539 if (channelsOnModule.size() == 0 ){
00540 cout << __LINE__ << "]\t" << mthn << "module=" << aModule << " has zero channels!" << endl;
00541 cout << __LINE__ << "]\t" << mthn << "Will terminate" << endl;
00542 ::abort();
00543 }
00544 std::set<PixelChannel>::const_iterator firstChannel = channelsOnModule.begin();
00545 assert( firstChannel != channelsOnModule.end() );
00546 return getHdwAddress( *firstChannel );
00547 }
00548
00549 const PixelChannel& PixelNameTranslation::getChannelForROC(const PixelROCName& aROC) const
00550 {
00551 std::map<PixelROCName,PixelHdwAddress>::const_iterator foundEntry = translationtable_.find(aROC);
00552 assert( foundEntry != translationtable_.end() );
00553 return getChannelFromHdwAddress( foundEntry->second );
00554 }
00555
00556 std::set< PixelChannel > PixelNameTranslation::getChannelsOnModule(const PixelModuleName& aModule) const
00557 {
00558 std::set< PixelChannel > returnThis;
00559 for ( std::map<PixelChannel, PixelHdwAddress >::const_iterator channelTranslationTable_itr = channelTranslationTable_.begin(); channelTranslationTable_itr != channelTranslationTable_.end(); channelTranslationTable_itr++ )
00560 {
00561 if ( channelTranslationTable_itr->first.module() == aModule ) returnThis.insert(channelTranslationTable_itr->first);
00562 }
00563 assert( returnThis.size() <= 2 );
00564 return returnThis;
00565 }
00566
00567
00568 const std::vector<PixelROCName>& PixelNameTranslation::getROCsFromFEDChannel(unsigned int fednumber,
00569 unsigned int fedchannel) const{
00570
00571 std::map<unsigned int, std::map<unsigned int, std::vector<PixelROCName> > >::const_iterator it=rocsFromFEDidAndChannel_.find(fednumber);
00572
00573 assert(it!=rocsFromFEDidAndChannel_.end());
00574
00575 std::map<unsigned int, std::vector<PixelROCName> >::const_iterator it2=it->second.find(fedchannel);
00576
00577 assert(it2!=it->second.end());
00578
00579 return it2->second;
00580
00581 }
00582
00583
00584
00585
00586
00587
00588 std::vector<PixelROCName> PixelNameTranslation::buildROCsFromFEDChannel(unsigned int fednumber,
00589 unsigned int fedchannel) const{
00590
00591 std::vector<PixelROCName> tmp(24);
00592
00593 int counter=0;
00594
00595 int maxindex=0;
00596
00597 std::map<PixelROCName,PixelHdwAddress>::const_iterator it=translationtable_.begin();
00598
00599 for(;it!=translationtable_.end();it++){
00600
00601 if (it->second.fednumber()==fednumber&&
00602 it->second.fedchannel()==fedchannel){
00603 int index=it->second.fedrocnumber();
00604 if (index>maxindex) maxindex=index;
00605
00606 tmp[index]=it->first;
00607 counter++;
00608 }
00609
00610 }
00611
00612 assert(counter==maxindex+1);
00613
00614 tmp.resize(counter);
00615
00616 return tmp;
00617
00618 }
00619
00620
00621 bool PixelNameTranslation::ROCNameFromFEDChannelROCExists(unsigned int fednumber,
00622 unsigned int channel,
00623 unsigned int roc) const {
00624
00625
00626 PixelHdwAddress tmp(0,0,0,0,0,0,fednumber,channel,roc);
00627
00628 return (fedlookup_.find(tmp)!=fedlookup_.end());
00629
00630 }
00631
00632
00633 PixelROCName PixelNameTranslation::ROCNameFromFEDChannelROC(unsigned int fednumber,
00634 unsigned int channel,
00635 unsigned int roc) const {
00636
00637
00638 std::string mthn = "[PixelNameTranslation::ROCNameFromFEDChannelROC()]\t\t " ;
00639 PixelHdwAddress tmp(0,0,0,0,0,0,fednumber,channel,roc);
00640
00641 std::map<PixelHdwAddress,PixelROCName,PixelHdwAddress>::const_iterator it1=fedlookup_.find(tmp);
00642
00643 if (it1!=fedlookup_.end()){
00644 return it1->second;
00645 }
00646
00647 std::cout << __LINE__ << "]\t" << mthn << "could not find ROCName "
00648 << " for FED#" << fednumber << " chan=" << channel << " roc#=" << roc << std::endl;
00649
00650 assert(0);
00651
00652 PixelROCName tmp1;
00653
00654 return tmp1;
00655
00656 }
00657
00658 PixelChannel PixelNameTranslation::ChannelFromFEDChannel(unsigned int fednumber, unsigned int fedchannel) const
00659 {
00660 std::string mthn = "[PixelNameTranslation::ChannelFromFEDChannel()]\t\t " ;
00661 std::map<PixelChannel,PixelHdwAddress>::const_iterator toReturn;
00662 bool foundOne = false;
00663 for(std::map<PixelChannel,PixelHdwAddress>::const_iterator it=channelTranslationTable_.begin(); it!=channelTranslationTable_.end();it++)
00664 {
00665 if (it->second.fednumber()==fednumber && it->second.fedchannel()==fedchannel)
00666 {
00667 if ( foundOne )
00668 {
00669 std::cout << __LINE__ << "]\t" << mthn
00670 << "ERROR: multiple channels on FED#" << fednumber << ", chan=" << fedchannel << std::endl;
00671 assert(0);
00672 }
00673 else
00674 {
00675 toReturn = it;
00676 foundOne = true;
00677 }
00678 }
00679 }
00680
00681 if ( !foundOne )
00682 {
00683 std::cout << __LINE__ << "]\t" << mthn
00684 << "ERROR: no channel found for FED#" << fednumber << ", chan=" << fedchannel << std::endl;
00685 assert(0);
00686 }
00687
00688 return toReturn->first;
00689 }
00690
00691 bool PixelNameTranslation::FEDChannelExist(unsigned int fednumber, unsigned int fedchannel) const
00692 {
00693 std::string mthn = "[PixelNameTranslation::FEDChannelExist()]\t\t " ;
00694 std::map<PixelChannel,PixelHdwAddress>::const_iterator toReturn;
00695 bool foundOne = false;
00696 for(std::map<PixelChannel,PixelHdwAddress>::const_iterator it=channelTranslationTable_.begin(); it!=channelTranslationTable_.end();it++)
00697 {
00698 if (it->second.fednumber()==fednumber && it->second.fedchannel()==fedchannel)
00699 {
00700 if ( foundOne )
00701 {
00702 std::cout << __LINE__ << "]\t" << mthn
00703 << "ERROR: multiple channels on FED#" << fednumber << ", chan=" << fedchannel << std::endl;
00704 assert(0);
00705 }
00706 else
00707 {
00708 toReturn = it;
00709 foundOne = true;
00710 }
00711 }
00712 }
00713 return foundOne;
00714 }
00715
00716 const PixelChannel& PixelNameTranslation::getChannelFromHdwAddress(const PixelHdwAddress& aHdwAddress) const
00717 {
00718
00719 std::string mthn = "[PixelNameTranslation::getChannelFromHdwAddress()]\t\t " ;
00720
00721 std::map<PixelHdwAddress, PixelChannel >::const_iterator it=
00722 hdwTranslationTable_.find(aHdwAddress);
00723
00724 if (it==hdwTranslationTable_.end()){
00725 std::cout << __LINE__ << "]\t" << mthn
00726 << "ERROR: no channel found for hardware address " << aHdwAddress << std::endl;
00727 assert(0);
00728 }
00729
00730 return it->second;
00731
00732
00733
00734
00735
00736
00737
00738
00739
00740
00741
00742
00743
00744
00745
00746
00747 }
00748
00749 void PixelNameTranslation::writeASCII(std::string dir) const {
00750
00751 std::string mthn = "[PixelNameTranslation::writeASCII()]\t\t\t " ;
00752 if (dir!="") dir+="/";
00753 std::string filename=dir+"translation.dat";
00754
00755 std::ofstream out(filename.c_str());
00756
00757
00758
00759
00760
00761
00762
00763
00764
00765 out << "# name TBMchannel FEC mfec mfecchannel hubaddress portadd rocid FED channel roc#"<<endl;
00766
00767 std::map<PixelROCName,PixelHdwAddress>::const_iterator iroc=translationtable_.begin();
00768
00769 for (;iroc!=translationtable_.end();++iroc) {
00770
00771
00772 std::string TBMChannel = getChannelFromHdwAddress(iroc->second).TBMChannelString();
00773
00774 out << iroc->first.rocname()<<" "
00775 << TBMChannel<<" "
00776 << iroc->second.fecnumber()<<" "
00777 << iroc->second.mfec()<<" "
00778 << iroc->second.mfecchannel()<<" "
00779 << iroc->second.hubaddress()<<" "
00780 << iroc->second.portaddress()<<" "
00781 << iroc->second.rocid()<<" "
00782 << iroc->second.fednumber()<<" "
00783 << iroc->second.fedchannel()<<" "
00784 << iroc->second.fedrocnumber()
00785 << endl;
00786 }
00787
00788
00789
00790 out.close();
00791
00792 }
00793
00794
00795 void PixelNameTranslation::writeXMLHeader(pos::PixelConfigKey key,
00796 int version,
00797 std::string path,
00798 std::ofstream *outstream,
00799 std::ofstream *out1stream,
00800 std::ofstream *out2stream) const
00801 {
00802 std::string mthn = "[PixelNameTranslation:::writeXMLHeader()]\t\t\t " ;
00803 std::stringstream fullPath ;
00804 fullPath << path << "/Pixel_NameTranslation_" << PixelTimeFormatter::getmSecTime() << ".xml" ;
00805 cout << __LINE__ << "]\t" << mthn << "Writing to: " << fullPath.str() << endl ;
00806
00807 outstream->open(fullPath.str().c_str()) ;
00808 *outstream << "<?xml version='1.0' encoding='UTF-8' standalone='yes'?>" << endl ;
00809 *outstream << "<ROOT xmlns:xsi='https://www.w3.org/2001/XMLSchema-instance'>" << endl ;
00810 *outstream << " <HEADER>" << endl ;
00811 *outstream << " <TYPE>" << endl ;
00812 *outstream << " <EXTENSION_TABLE_NAME>PIXEL_NAME_TRANSLATION</EXTENSION_TABLE_NAME>" << endl ;
00813 *outstream << " <NAME>Pixel Name Translation</NAME>" << endl ;
00814 *outstream << " </TYPE>" << endl ;
00815 *outstream << " <RUN>" << endl ;
00816 *outstream << " <RUN_TYPE>Pixel Name Translation</RUN_TYPE>" << endl ;
00817 *outstream << " <RUN_NUMBER>1</RUN_NUMBER>" << endl ;
00818 *outstream << " <RUN_BEGIN_TIMESTAMP>" << pos::PixelTimeFormatter::getTime() << "</RUN_BEGIN_TIMESTAMP>" << endl ;
00819 *outstream << " <LOCATION>CERN P5</LOCATION>" << endl ;
00820 *outstream << " </RUN>" << endl ;
00821 *outstream << " </HEADER>" << endl ;
00822 *outstream << " " << endl ;
00823 *outstream << " <DATA_SET>" << endl ;
00824 *outstream << " <PART>" << endl ;
00825 *outstream << " <NAME_LABEL>CMS-PIXEL-ROOT</NAME_LABEL>" << endl ;
00826 *outstream << " <KIND_OF_PART>Detector ROOT</KIND_OF_PART>" << endl ;
00827 *outstream << " </PART>" << endl ;
00828 *outstream << " <VERSION>" << version << "</VERSION>" << endl ;
00829 *outstream << " <COMMENT_DESCRIPTION>" << getComment() << "</COMMENT_DESCRIPTION>" << endl ;
00830 *outstream << " <CREATED_BY_USER>" << getAuthor() << "</CREATED_BY_USER>" << endl ;
00831 *outstream << " " << endl ;
00832
00833 }
00834
00835
00836 void PixelNameTranslation::writeXML(std::ofstream *outstream,
00837 std::ofstream *out1stream,
00838 std::ofstream *out2stream) const
00839 {
00840 std::string mthn = "[PixelNameTranslation::writeXML()]\t\t\t " ;
00841
00842 std::map<PixelROCName,PixelHdwAddress>::const_iterator iroc=translationtable_.begin();
00843
00844 for (;iroc!=translationtable_.end();++iroc)
00845 {
00846
00847 std::string TBMChannel = getChannelFromHdwAddress(iroc->second).TBMChannelString();
00848
00849 *outstream << " <DATA>" << endl ;
00850 *outstream << " <ROC_NAME>" << iroc->first.rocname() << "</ROC_NAME>" << endl ;
00851 *outstream << " <TBM_MODE>" << TBMChannel << "</TBM_MODE>" << endl ;
00852 *outstream << " <PXLFEC_NAME>" << iroc->second.fecnumber() << "</PXLFEC_NAME>" << endl ;
00853 *outstream << " <MFEC_POSN>" << iroc->second.mfec() << "</MFEC_POSN>" << endl ;
00854 *outstream << " <MFEC_CHAN>" << iroc->second.mfecchannel() << "</MFEC_CHAN>" << endl ;
00855 *outstream << " <HUB_ADDRS>" << iroc->second.hubaddress() << "</HUB_ADDRS>" << endl ;
00856 *outstream << " <PORT_NUM>" << iroc->second.portaddress() << "</PORT_NUM>" << endl ;
00857 *outstream << " <ROC_I2C_ADDR>" << iroc->second.rocid() << "</ROC_I2C_ADDR>" << endl ;
00858 *outstream << " <PXLFED_NAME>" << iroc->second.fednumber() << "</PXLFED_NAME>" << endl ;
00859 *outstream << " <FED_CHAN>" << iroc->second.fedchannel() << "</FED_CHAN>" << endl ;
00860 *outstream << " <FED_ROC_NUM>" << iroc->second.fedrocnumber() << "</FED_ROC_NUM>" << endl ;
00861 *outstream << " </DATA>" << endl ;
00862 *outstream << "" << endl ;
00863 }
00864 }
00865
00866
00867 void PixelNameTranslation::writeXMLTrailer(std::ofstream *outstream,
00868 std::ofstream *out1stream,
00869 std::ofstream *out2stream) const
00870 {
00871 std::string mthn = "[PixelNameTranslation::writeXMLTrailer()]\t\t\t " ;
00872
00873 *outstream << " </DATA_SET>" << endl ;
00874 *outstream << "</ROOT> " << endl ;
00875
00876 outstream->close() ;
00877 }
00878
00879
00880 void PixelNameTranslation::writeXML(pos::PixelConfigKey key, int version, std::string path) const {
00881 std::string mthn = "[PixelNameTranslation::writeXML]\t\t\t " ;
00882 std::stringstream fullPath ;
00883
00884 fullPath << path << "/Pixel_NameTranslation.xml" ;
00885 cout << __LINE__ << "]\t" << mthn << "Writing to: " << fullPath.str() << endl ;
00886
00887 std::ofstream out(fullPath.str().c_str()) ;
00888
00889 out << "<?xml version='1.0' encoding='UTF-8' standalone='yes'?>" << endl ;
00890 out << "<ROOT xmlns:xsi='https://www.w3.org/2001/XMLSchema-instance'>" << endl ;
00891 out << "" << endl ;
00892 out << " <HEADER>" << endl ;
00893 out << " <HINTS mode='only-det-root' />" << endl ;
00894 out << " <TYPE>" << endl ;
00895 out << " <EXTENSION_TABLE_NAME>PIXEL_NAME_TRANSLATION</EXTENSION_TABLE_NAME>" << endl ;
00896 out << " <NAME>Pixel Name Translation</NAME>" << endl ;
00897 out << " </TYPE>" << endl ;
00898 out << " <RUN>" << endl ;
00899 out << " <RUN_TYPE>Pixel Name Translation</RUN_TYPE>" << endl ;
00900 out << " <RUN_NUMBER>1</RUN_NUMBER>" << endl ;
00901 out << " <RUN_BEGIN_TIMESTAMP>" << pos::PixelTimeFormatter::getTime() << "</RUN_BEGIN_TIMESTAMP>" << endl ;
00902 out << " <COMMENT_DESCRIPTION>Test of Name Translation xml</COMMENT_DESCRIPTION>" << endl ;
00903 out << " <LOCATION>CERN TAC</LOCATION>" << endl ;
00904 out << " <CREATED_BY_USER>Dario Menasce</CREATED_BY_USER>" << endl ;
00905 out << " </RUN>" << endl ;
00906 out << " </HEADER>" << endl ;
00907 out << "" << endl ;
00908 out << " <DATA_SET>" << endl ;
00909 out << " <VERSION>" << version << "</VERSION>" << endl ;
00910 out << " <PART>" << endl ;
00911 out << " <NAME_LABEL>CMS-PIXEL-ROOT</NAME_LABEL>" << endl ;
00912 out << " <KIND_OF_PART>Detector ROOT</KIND_OF_PART>" << endl ;
00913 out << " </PART>" << endl ;
00914 out << "" << endl ;
00915
00916 std::map<PixelROCName,PixelHdwAddress>::const_iterator iroc=translationtable_.begin();
00917
00918 for (;iroc!=translationtable_.end();++iroc)
00919 {
00920
00921 std::string TBMChannel = getChannelFromHdwAddress(iroc->second).TBMChannelString();
00922
00923 out << " <DATA>" << endl ;
00924 out << " <PXLFEC_NAME>" << iroc->second.fecnumber() << "</PXLFEC_NAME>" << endl ;
00925 out << " <MFEC_POSN>" << iroc->second.mfec() << "</MFEC_POSN>" << endl ;
00926 out << " <MFEC_CHAN>" << iroc->second.mfecchannel() << "</MFEC_CHAN>" << endl ;
00927 out << " <HUB_ADDRS>" << iroc->second.hubaddress() << "</HUB_ADDRS>" << endl ;
00928 out << " <PORT_NUM>" << iroc->second.portaddress() << "</PORT_NUM>" << endl ;
00929 out << " <ROC_I2C_ADDR>" << iroc->second.rocid() << "</ROC_I2C_ADDR>" << endl ;
00930 out << " <PXLFED_NAME>" << iroc->second.fednumber() << "</PXLFED_NAME>" << endl ;
00931 out << " <FED_CHAN>" << iroc->second.fedchannel() << "</FED_CHAN>" << endl ;
00932 out << " <FED_RO_NUM>" << iroc->second.fedrocnumber() << "</FED_ROC_NUM>" << endl ;
00933 out << " </DATA>" << endl ;
00934 out << "" << endl ;
00935 }
00936 out << " </DATA_SET> " << endl ;
00937 out << "</ROOT> " << endl ;
00938 out.close() ;
00939 assert(0) ;
00940 }
00941
00942 const std::vector<PixelROCName>&
00943 PixelNameTranslation::getROCsFromChannel(const PixelChannel& aChannel) const {
00944
00945 const PixelHdwAddress& channelHdwAddress = getHdwAddress(aChannel);
00946 return getROCsFromFEDChannel( channelHdwAddress.fednumber(),
00947 channelHdwAddress.fedchannel() );
00948
00949 }
00950
00951 std::vector<PixelROCName> PixelNameTranslation::getROCsFromModule(const PixelModuleName& aModule) const
00952 {
00953 std::vector<PixelROCName> returnThis;
00954
00955 std::set<PixelChannel> channelsOnThisModule = getChannelsOnModule(aModule);
00956 for ( std::set<PixelChannel>::const_iterator channelsOnThisModule_itr = channelsOnThisModule.begin(); channelsOnThisModule_itr != channelsOnThisModule.end(); channelsOnThisModule_itr++ )
00957 {
00958 std::vector<PixelROCName> ROCsOnThisChannel = getROCsFromChannel( *channelsOnThisModule_itr );
00959 for ( std::vector<PixelROCName>::const_iterator ROCsOnThisChannel_itr = ROCsOnThisChannel.begin(); ROCsOnThisChannel_itr != ROCsOnThisChannel.end(); ROCsOnThisChannel_itr++ )
00960 {
00961 returnThis.push_back(*ROCsOnThisChannel_itr);
00962 }
00963 }
00964
00965 return returnThis;
00966 }
00967
00968
00969
00970 bool PixelNameTranslation::ROCexists(PixelROCName theROC)
00971 {
00972 if (translationtable_.find(theROC)==translationtable_.end()) {return false ;}
00973 return true ;
00974 }
00975
00976
00977 std::map <unsigned int, std::set<unsigned int> > PixelNameTranslation::getFEDsAndChannels() const {
00978
00979 std::map <unsigned int, std::set<unsigned int> > tmp;
00980
00981 std::map<PixelChannel, PixelHdwAddress >::const_iterator
00982 channelTranslationTable_itr = channelTranslationTable_.begin();
00983
00984 for ( ; channelTranslationTable_itr != channelTranslationTable_.end();
00985 channelTranslationTable_itr++ ) {
00986
00987 unsigned int fednumber=channelTranslationTable_itr->second.fednumber();
00988 unsigned int fedchannel=channelTranslationTable_itr->second.fedchannel();
00989
00990 tmp[fednumber].insert(fedchannel);
00991
00992 }
00993
00994 return tmp;
00995
00996 }