00001 #include <fstream>
00002 #include <sstream>
00003 #include <sys/time.h>
00004 #include <stdlib.h>
00005 #include <sys/types.h>
00006 #include <sys/stat.h>
00007 #include <unistd.h>
00008
00009 #include <cstdlib>
00010
00011 #include "xgi/Utils.h"
00012 #include "toolbox/string.h"
00013 #include "OnlineDB/Oracle/interface/Oracle.h"
00014
00015 #include "CaloOnlineTools/HcalOnlineDb/interface/HcalLutManager.h"
00016 #include "CaloOnlineTools/HcalOnlineDb/interface/ZdcLut.h"
00017 #include "CalibCalorimetry/HcalTPGAlgos/interface/XMLProcessor.h"
00018 #include "CalibCalorimetry/HcalTPGAlgos/interface/XMLDOMBlock.h"
00019 #include "CaloOnlineTools/HcalOnlineDb/interface/HcalQIEManager.h"
00020 #include "CaloOnlineTools/HcalOnlineDb/interface/LMap.h"
00021 #include "CaloOnlineTools/HcalOnlineDb/interface/XMLLUTLoader.h"
00022 #include "CaloOnlineTools/HcalOnlineDb/interface/RooGKCounter.h"
00023 #include "DataFormats/HcalDetId/interface/HcalDetId.h"
00024
00025 #include "DataFormats/HcalDetId/interface/HcalSubdetector.h"
00026
00027 using namespace std;
00028 using namespace oracle::occi;
00029 using namespace hcal;
00030
00039 HcalLutManager::HcalLutManager( void )
00040 {
00041 init();
00042 }
00043
00044
00045 HcalLutManager::HcalLutManager(std::vector<HcalGenericDetId> & map)
00046 {
00047 init();
00048 _iter . init(map);
00049 }
00050
00051
00052 HcalLutManager::HcalLutManager(const HcalElectronicsMap * _emap,
00053 const HcalChannelQuality * _cq,
00054 uint32_t _status_word_to_mask)
00055 {
00056 init();
00057 emap = _emap;
00058 cq = _cq;
00059 status_word_to_mask = _status_word_to_mask;
00060 }
00061
00062
00063 void HcalLutManager::init( void )
00064 {
00065 lut_xml = 0;
00066 lut_checksums_xml = 0;
00067 db = 0;
00068 lmap = 0;
00069 emap = 0;
00070 cq = 0;
00071 status_word_to_mask = 0x0000;
00072 }
00073
00074
00075
00076 HcalLutManager::~HcalLutManager( void )
00077 {
00078 delete lut_xml;
00079 delete lut_checksums_xml;
00080 delete db;
00081 delete lmap;
00082 }
00083
00084
00085 int HcalLutManager::initChannelIterator(std::vector<HcalGenericDetId> & map)
00086 {
00087 _iter . init(map);
00088 return _iter.size();
00089 }
00090
00091
00092 std::string & HcalLutManager::getLutXml( std::vector<unsigned int> & _lut )
00093 {
00094
00095 if (lut_xml) delete lut_xml;
00096
00097 lut_xml = new LutXml();
00098
00099 LutXml::Config _config;
00100 _config.lut = _lut;
00101 lut_xml -> addLut( _config );
00102 lut_xml -> addLut( _config );
00103 lut_xml -> addLut( _config );
00104
00105
00106 return lut_xml->getCurrentBrick();
00107
00108 }
00109
00110
00111 int HcalLutManager::getInt( std::string number )
00112 {
00113 int result;
00114 sscanf(number.c_str(), "%d", &result);
00115 return result;
00116 }
00117
00118 HcalSubdetector HcalLutManager::get_subdetector( std::string _det )
00119 {
00120 HcalSubdetector result;
00121 if ( _det.find("HB") != std::string::npos ) result = HcalBarrel;
00122 else if ( _det.find("HE") != std::string::npos ) result = HcalEndcap;
00123 else if ( _det.find("HF") != std::string::npos ) result = HcalForward;
00124 else if ( _det.find("HO") != std::string::npos ) result = HcalOuter;
00125 else result = HcalOther;
00126
00127 return result;
00128 }
00129
00130
00131 int HcalLutManager_test::getLutSetFromFile_test( std::string _filename )
00132 {
00133 HcalLutManager _manager;
00134 HcalLutSet _set = _manager . getLutSetFromFile( _filename );
00135 std::cout << "===> Test of HcalLutSet HcalLutManager::getLutSetFromFile( std::string _filename )" << std::endl << std::endl;
00136 std::cout << _set . label << std::endl;
00137 for (unsigned int i = 0; i != _set.subdet.size(); i++) std::cout << _set.subdet[i] << " ";
00138 std::cout << std::endl;
00139 for (unsigned int i = 0; i != _set.eta_min.size(); i++) std::cout << _set.eta_min[i] << " ";
00140 std::cout << std::endl;
00141 for (unsigned int i = 0; i != _set.eta_max.size(); i++) std::cout << _set.eta_max[i] << " ";
00142 std::cout << std::endl;
00143 for (unsigned int i = 0; i != _set.phi_min.size(); i++) std::cout << _set.phi_min[i] << " ";
00144 std::cout << std::endl;
00145 for (unsigned int i = 0; i != _set.phi_max.size(); i++) std::cout << _set.phi_max[i] << " ";
00146 std::cout << std::endl;
00147 for (unsigned int i = 0; i != _set.depth_min.size(); i++) std::cout << _set.depth_min[i] << " ";
00148 std::cout << std::endl;
00149 for (unsigned int i = 0; i != _set.depth_max.size(); i++) std::cout << _set.depth_max[i] << " ";
00150 std::cout << std::endl;
00151 for (unsigned int j = 0; j != _set.lut[0].size(); j++){
00152 for (unsigned int i = 0; i != _set.lut.size(); i++){
00153 std::cout << _set.lut[i][j] << " ";
00154 }
00155 std::cout << "---> " << j << std::endl;
00156 }
00157 return 0;
00158 }
00159
00160
00161 HcalLutSet HcalLutManager::getLutSetFromFile( std::string _filename, int _type )
00162 {
00163 HcalLutSet _lutset;
00164
00165 ifstream infile( _filename . c_str() );
00166 std::string buf;
00167
00168 if ( infile . is_open() ){
00169 std::cout << "File " << _filename << " is open..." << std::endl;
00170 std::cout << "Reading LUTs and their eta/phi/depth/subdet ranges...";
00171
00172
00173 getline( infile, _lutset . label );
00174
00175 if ( _type == 1 ){
00176
00177 getline( infile, buf );
00178 _lutset . subdet = HcalQIEManager::splitString( buf );
00179 }
00180
00181
00182 std::vector<std::string> buf_vec;
00183 getline( infile, buf );
00184 buf_vec = HcalQIEManager::splitString( buf );
00185 for (std::vector<std::string>::const_iterator iter = buf_vec.begin(); iter != buf_vec.end(); iter++){
00186 _lutset.eta_min.push_back(HcalLutManager::getInt(*iter));
00187 }
00188
00189
00190 getline( infile, buf );
00191 buf_vec = HcalQIEManager::splitString( buf );
00192 for (std::vector<std::string>::const_iterator iter = buf_vec.begin(); iter != buf_vec.end(); iter++){
00193 _lutset.eta_max.push_back(HcalLutManager::getInt(*iter));
00194 }
00195
00196
00197 getline( infile, buf );
00198 buf_vec = HcalQIEManager::splitString( buf );
00199 for (std::vector<std::string>::const_iterator iter = buf_vec.begin(); iter != buf_vec.end(); iter++){
00200 _lutset.phi_min.push_back(HcalLutManager::getInt(*iter));
00201 }
00202
00203
00204 getline( infile, buf );
00205 buf_vec = HcalQIEManager::splitString( buf );
00206 for (std::vector<std::string>::const_iterator iter = buf_vec.begin(); iter != buf_vec.end(); iter++){
00207 _lutset.phi_max.push_back(HcalLutManager::getInt(*iter));
00208 }
00209
00210 if ( _type == 1 ){
00211
00212 getline( infile, buf );
00213 buf_vec = HcalQIEManager::splitString( buf );
00214 for (std::vector<std::string>::const_iterator iter = buf_vec.begin(); iter != buf_vec.end(); iter++){
00215 _lutset.depth_min.push_back(HcalLutManager::getInt(*iter));
00216 }
00217
00218
00219 getline( infile, buf );
00220 buf_vec = HcalQIEManager::splitString( buf );
00221 for (std::vector<std::string>::const_iterator iter = buf_vec.begin(); iter != buf_vec.end(); iter++){
00222 _lutset.depth_max.push_back(HcalLutManager::getInt(*iter));
00223 }
00224 }
00225
00226 bool first_lut_entry = true;
00227 while ( getline( infile, buf ) > 0 ){
00228 buf_vec = HcalQIEManager::splitString( buf );
00229 for (unsigned int i = 0; i < buf_vec.size(); i++){
00230 if (first_lut_entry){
00231 std::vector<unsigned int> _l;
00232 _lutset.lut.push_back(_l);
00233 }
00234 _lutset . lut[i] . push_back(HcalLutManager::getInt(buf_vec[i]));
00235 }
00236 first_lut_entry = false;
00237 }
00238 }
00239
00240 std::cout << "done." << std::endl;
00241
00242 return _lutset;
00243 }
00244
00245
00246
00247 std::map<int, boost::shared_ptr<LutXml> > HcalLutManager::getLutXmlFromAsciiMaster( std::string _filename, std::string _tag, int _crate, bool split_by_crate )
00248 {
00249 std::cout << "Generating linearization (input) LUTs from ascii master file..." << std::endl;
00250 std::map<int, boost::shared_ptr<LutXml> > _xml;
00251
00252 LMap _lmap;
00253 _lmap . read( "./backup/HCALmapHBEF.txt", "HBEF" );
00254 _lmap . read( "./backup/HCALmapHO.txt", "HO" );
00255 std::map<int,LMapRow> & _map = _lmap.get_map();
00256 std::cout << "LMap contains " << _map . size() << " channels" << std::endl;
00257
00258
00259 HcalLutSet _set = getLutSetFromFile( _filename );
00260 int lut_set_size = _set.lut.size();
00261
00262 RooGKCounter _counter;
00263
00264 for( std::map<int,LMapRow>::const_iterator row=_map.begin(); row!=_map.end(); row++ ){
00265 LutXml::Config _cfg;
00266
00267
00268
00269 int lut_index=-1;
00270 for ( int i=0; i<lut_set_size; i++ ){
00271 if ( (row->second.crate == _crate || _crate == -1) &&
00272 _set.eta_min[i] <= row->second.side*row->second.eta &&
00273 _set.eta_max[i] >= row->second.side*row->second.eta &&
00274 _set.phi_min[i] <= row->second.phi &&
00275 _set.phi_max[i] >= row->second.phi &&
00276 _set.depth_min[i] <= row->second.depth &&
00277 _set.depth_max[i] >= row->second.depth &&
00278 get_subdetector(_set.subdet[i]) == row->second.det ){
00279 lut_index=i;
00280 }
00281 }
00282 if ( lut_index >= 0 ){
00283 if ( _xml.count(row->second.crate) == 0 && split_by_crate ){
00284 _xml.insert( std::pair<int,boost::shared_ptr<LutXml> >(row->second.crate,boost::shared_ptr<LutXml>(new LutXml())) );
00285 }
00286 else if ( _xml.count(0) == 0 && !split_by_crate ){
00287 _xml.insert( std::pair<int,boost::shared_ptr<LutXml> >(0,boost::shared_ptr<LutXml>(new LutXml())) );
00288 }
00289 _cfg.ieta = row->second.side*row->second.eta;
00290 _cfg.iphi = row->second.phi;
00291 _cfg.depth = row->second.depth;
00292 _cfg.crate = row->second.crate;
00293 _cfg.slot = row->second.htr;
00294 if (row->second.fpga . find("top") != std::string::npos) _cfg.topbottom = 1;
00295 else if (row->second.fpga . find("bot") != std::string::npos) _cfg.topbottom = 0;
00296 else std::cout << "Warning! fpga out of range..." << std::endl;
00297
00298
00299 _cfg.fiber = row->second.htr_fi;
00300 _cfg.fiberchan = row->second.fi_ch;
00301 if (_set.lut[lut_index].size() == 128) _cfg.lut_type = 1;
00302 else _cfg.lut_type = 2;
00303 _cfg.creationtag = _tag;
00304 _cfg.creationstamp = get_time_stamp( time(0) );
00305 _cfg.targetfirmware = "1.0.0";
00306 _cfg.formatrevision = "1";
00307
00308
00309
00310 _cfg.generalizedindex =
00311 _cfg.iphi*10000 + _cfg.depth*1000 +
00312 (row->second.side>0)*100 + row->second.eta +
00313 ((row->second.det==HcalForward && row->second.eta==29)?(4*10000):(0));
00314 _cfg.lut = _set.lut[lut_index];
00315 if (split_by_crate ){
00316 _xml[row->second.crate]->addLut( _cfg, lut_checksums_xml );
00317 _counter.count();
00318 }
00319 else{
00320 _xml[0]->addLut( _cfg, lut_checksums_xml );
00321 _counter.count();
00322 }
00323 }
00324 }
00325 std::cout << "LUTs generated: " << _counter.getCount() << std::endl;
00326 std::cout << "Generating linearization (input) LUTs from ascii master file...DONE" << std::endl;
00327 return _xml;
00328 }
00329
00330
00331
00332
00333 std::map<int, boost::shared_ptr<LutXml> > HcalLutManager::getLinearizationLutXmlFromAsciiMasterEmap( std::string _filename, std::string _tag, int _crate, bool split_by_crate )
00334 {
00335 std::cout << "Generating linearization (input) LUTs from ascii master file..." << std::endl;
00336 std::map<int, boost::shared_ptr<LutXml> > _xml;
00337
00338 EMap _emap(emap);
00339 std::vector<EMap::EMapRow> & _map = _emap.get_map();
00340 std::cout << "EMap contains " << _map . size() << " entries" << std::endl;
00341
00342
00343 HcalLutSet _set = getLutSetFromFile( _filename );
00344 int lut_set_size = _set.lut.size();
00345 std::cout << " ==> " << lut_set_size << " sets of different LUTs read from the master file" << std::endl;
00346
00347
00348 std::vector<unsigned int> zeroLut;
00349 for (size_t adc = 0; adc < 128; adc++) zeroLut.push_back(0);
00350
00351 RooGKCounter _counter;
00352
00353 for( std::vector<EMap::EMapRow>::const_iterator row=_map.begin(); row!=_map.end(); row++ ){
00354 if( (row->subdet.find("HB")!=string::npos ||
00355 row->subdet.find("HE")!=string::npos ||
00356 row->subdet.find("HO")!=string::npos ||
00357 row->subdet.find("HF")!=string::npos ) &&
00358 row->subdet.size()==2
00359 ){
00360 LutXml::Config _cfg;
00361
00362
00363
00364 int lut_index=-1;
00365 for ( int i=0; i<lut_set_size; i++ ){
00366 if ( (row->crate == _crate || _crate == -1) &&
00367 _set.eta_min[i] <= row->ieta &&
00368 _set.eta_max[i] >= row->ieta &&
00369 _set.phi_min[i] <= row->iphi &&
00370 _set.phi_max[i] >= row->iphi &&
00371 _set.depth_min[i] <= row->idepth &&
00372 _set.depth_max[i] >= row->idepth &&
00373 _set.subdet[i].find(row->subdet)!=string::npos ){
00374 lut_index=i;
00375 }
00376 }
00377 if ( lut_index >= 0 ){
00378 if ( _xml.count(row->crate) == 0 && split_by_crate ){
00379 _xml.insert( std::pair<int,boost::shared_ptr<LutXml> >(row->crate,boost::shared_ptr<LutXml>(new LutXml())) );
00380 }
00381 else if ( _xml.count(0) == 0 && !split_by_crate ){
00382 _xml.insert( std::pair<int,boost::shared_ptr<LutXml> >(0,boost::shared_ptr<LutXml>(new LutXml())) );
00383 }
00384 _cfg.ieta = row->ieta;
00385 _cfg.iphi = row->iphi;
00386 _cfg.depth = row->idepth;
00387 _cfg.crate = row->crate;
00388 _cfg.slot = row->slot;
00389 if (row->topbottom . find("t") != std::string::npos) _cfg.topbottom = 1;
00390 else if (row->topbottom . find("b") != std::string::npos) _cfg.topbottom = 0;
00391 else std::cout << "Warning! fpga out of range..." << std::endl;
00392 _cfg.fiber = row->fiber;
00393 _cfg.fiberchan = row->fiberchan;
00394 _cfg.lut_type = 1;
00395 _cfg.creationtag = _tag;
00396 _cfg.creationstamp = get_time_stamp( time(0) );
00397 _cfg.targetfirmware = "1.0.0";
00398 _cfg.formatrevision = "1";
00399
00400
00401
00402 _cfg.generalizedindex =
00403 _cfg.iphi*10000 + _cfg.depth*1000 +
00404 (row->ieta>0)*100 + abs(row->ieta) +
00405 (((row->subdet.find("HF")!=string::npos) && abs(row->ieta)==29)?(4*10000):(0));
00406
00407
00408 DetId _detId(row->rawId);
00409 uint32_t status_word = cq->getValues(_detId)->getValue();
00410 if ((status_word & status_word_to_mask) > 0){
00411 _cfg.lut = zeroLut;
00412 }
00413 else{
00414 _cfg.lut = _set.lut[lut_index];
00415 }
00416 if (split_by_crate ){
00417 _xml[row->crate]->addLut( _cfg, lut_checksums_xml );
00418 _counter.count();
00419 }
00420 else{
00421 _xml[0]->addLut( _cfg, lut_checksums_xml );
00422 _counter.count();
00423 }
00424 }
00425 }
00426 }
00427 std::cout << "LUTs generated: " << _counter.getCount() << std::endl;
00428 std::cout << "Generating linearization (input) LUTs from ascii master file...DONE" << std::endl;
00429 return _xml;
00430 }
00431
00432
00433 std::map<int, boost::shared_ptr<LutXml> > HcalLutManager::getLinearizationLutXmlFromAsciiMasterEmap_new( std::string _filename, std::string _tag, int _crate, bool split_by_crate )
00434 {
00435 std::cout << "Generating linearization (input) LUTs from ascii master file..." << std::endl;
00436 std::map<int, boost::shared_ptr<LutXml> > _xml;
00437
00438
00439 HcalLutSet _set = getLutSetFromFile( _filename );
00440 int lut_set_size = _set.lut.size();
00441 std::cout << " ==> " << lut_set_size << " sets of different LUTs read from the master file" << std::endl;
00442
00443 RooGKCounter _counter;
00444
00445 for( _iter.begin(); !_iter.end(); _iter.next() ){
00446 HcalSubdetector _subdet = _iter.getHcalSubdetector();
00447 if( (_subdet == HcalBarrel ||
00448 _subdet == HcalEndcap ||
00449 _subdet == HcalForward ||
00450 _subdet == HcalOuter )
00451 ){
00452 int _ieta = _iter.getIeta();
00453 int _iphi = _iter.getIphi();
00454 int _depth = _iter.getDepth();
00455
00456
00457 HcalElectronicsId _eId(_iter.getHcalGenericDetId().rawId());
00458 int aCrate = _eId . readoutVMECrateId();
00459 int aSlot = _eId . htrSlot();
00460 int aTopBottom = _eId . htrTopBottom();
00461 int aFiber = _eId . fiberIndex();
00462 int aFiberChan = _eId . fiberChanId();
00463
00464 LutXml::Config _cfg;
00465
00466
00467
00468 int lut_index=-1;
00469 for ( int i=0; i<lut_set_size; i++ ){
00470 if ( (aCrate == _crate || _crate == -1) &&
00471 _set.eta_min[i] <= _ieta &&
00472 _set.eta_max[i] >= _ieta &&
00473 _set.phi_min[i] <= _iphi &&
00474 _set.phi_max[i] >= _iphi &&
00475 _set.depth_min[i] <= _depth &&
00476 _set.depth_max[i] >= _depth &&
00477 _set.subdet[i].find(_ass.getSubdetectorString(_subdet))!=string::npos ){
00478 lut_index=i;
00479 }
00480 }
00481 if ( lut_index >= 0 ){
00482 if ( _xml.count(aCrate) == 0 && split_by_crate ){
00483 _xml.insert( std::pair<int,boost::shared_ptr<LutXml> >(aCrate,boost::shared_ptr<LutXml>(new LutXml())) );
00484 }
00485 else if ( _xml.count(0) == 0 && !split_by_crate ){
00486 _xml.insert( std::pair<int,boost::shared_ptr<LutXml> >(0,boost::shared_ptr<LutXml>(new LutXml())) );
00487 }
00488 _cfg.ieta = _ieta;
00489 _cfg.iphi = _iphi;
00490 _cfg.depth = _depth;
00491 _cfg.crate = aCrate;
00492 _cfg.slot = aSlot;
00493 _cfg.topbottom = aTopBottom;
00494 _cfg.fiber = aFiber;
00495 _cfg.fiberchan = aFiberChan;
00496 _cfg.lut_type = 1;
00497 _cfg.creationtag = _tag;
00498 _cfg.creationstamp = get_time_stamp( time(0) );
00499 _cfg.targetfirmware = "1.0.0";
00500 _cfg.formatrevision = "1";
00501
00502
00503
00504 _cfg.generalizedindex =
00505 _cfg.iphi*10000 + _cfg.depth*1000 +
00506 (_ieta>0)*100 + abs(_ieta) +
00507 (((_subdet==HcalForward) && abs(_ieta)==29)?(4*10000):(0));
00508 _cfg.lut = _set.lut[lut_index];
00509 if (split_by_crate ){
00510 _xml[aCrate]->addLut( _cfg, lut_checksums_xml );
00511 _counter.count();
00512 }
00513 else{
00514 _xml[0]->addLut( _cfg, lut_checksums_xml );
00515 _counter.count();
00516 }
00517 }
00518 }
00519 }
00520 std::cout << "LUTs generated: " << _counter.getCount() << std::endl;
00521 std::cout << "Generating linearization (input) LUTs from ascii master file...DONE" << std::endl;
00522 return _xml;
00523 }
00524
00525
00526 std::map<int, boost::shared_ptr<LutXml> > HcalLutManager::getCompressionLutXmlFromAsciiMaster( std::string _filename, std::string _tag, int _crate, bool split_by_crate )
00527 {
00528 std::cout << "Generating compression (output) LUTs from ascii master file..." << std::endl;
00529 std::map<int, boost::shared_ptr<LutXml> > _xml;
00530
00531 std::cout << "instantiating CaloTPGTranscoderULUT in order to check the validity of (ieta,iphi)..." << std::endl;
00532 CaloTPGTranscoderULUT _coder;
00533
00534
00535
00536 EMap _emap(emap);
00537 std::vector<EMap::EMapRow> & _map = _emap.get_map();
00538 std::cout << "EMap contains " << _map . size() << " channels" << std::endl;
00539
00540
00541 HcalLutSet _set = getLutSetFromFile( _filename, 2 );
00542 int lut_set_size = _set.lut.size();
00543 std::cout << " ==> " << lut_set_size << " sets of different LUTs read from the master file" << std::endl;
00544
00545
00546 RooGKCounter _counter;
00547 for( std::vector<EMap::EMapRow>::const_iterator row=_map.begin(); row!=_map.end(); row++ ){
00548 LutXml::Config _cfg;
00549
00550
00551
00552 int lut_index=-1;
00553 for ( int i=0; i<lut_set_size; i++ ){
00554 if ( row->subdet . find("HT") != std::string::npos &&
00555 (row->crate == _crate || _crate == -1) &&
00556 _set.eta_min[i] <= row->ieta &&
00557 _set.eta_max[i] >= row->ieta &&
00558 _set.phi_min[i] <= row->iphi &&
00559 _set.phi_max[i] >= row->iphi &&
00560 _coder.HTvalid(row->ieta, row->iphi) ){
00561 lut_index=i;
00562 }
00563 }
00564 if ( lut_index >= 0 ){
00565 if ( _xml.count(row->crate) == 0 && split_by_crate ){
00566 _xml.insert( std::pair<int,boost::shared_ptr<LutXml> >(row->crate,boost::shared_ptr<LutXml>(new LutXml())) );
00567 }
00568 else if ( _xml.count(0) == 0 && !split_by_crate ){
00569 _xml.insert( std::pair<int,boost::shared_ptr<LutXml> >(0,boost::shared_ptr<LutXml>(new LutXml())) );
00570 }
00571 _cfg.ieta = row->ieta;
00572 _cfg.iphi = row->iphi;
00573 _cfg.depth = row->idepth;
00574 _cfg.crate = row->crate;
00575 _cfg.slot = row->slot;
00576 if (row->topbottom . find("t") != std::string::npos) _cfg.topbottom = 1;
00577 else if (row->topbottom . find("b") != std::string::npos) _cfg.topbottom = 0;
00578 else std::cout << "Warning! fpga out of range..." << std::endl;
00579 _cfg.fiber = row->fiber;
00580 _cfg.fiberchan = row->fiberchan;
00581 if (_set.lut[lut_index].size() == 128) _cfg.lut_type = 1;
00582 else _cfg.lut_type = 2;
00583 _cfg.creationtag = _tag;
00584 _cfg.creationstamp = get_time_stamp( time(0) );
00585 _cfg.targetfirmware = "1.0.0";
00586 _cfg.formatrevision = "1";
00587
00588
00589
00590 _cfg.generalizedindex =
00591 _cfg.iphi*10000+
00592 (row->ieta>0)*100+abs(row->ieta);
00593 _cfg.lut = _set.lut[lut_index];
00594 if (split_by_crate ){
00595 _xml[row->crate]->addLut( _cfg, lut_checksums_xml );
00596 _counter.count();
00597 }
00598 else{
00599 _xml[0]->addLut( _cfg, lut_checksums_xml );
00600 _counter.count();
00601 }
00602 }
00603 }
00604 std::cout << "LUTs generated: " << _counter.getCount() << std::endl;
00605 std::cout << "Generating compression (output) LUTs from ascii master file...DONE" << std::endl;
00606 return _xml;
00607 }
00608
00609
00610 std::map<int, boost::shared_ptr<LutXml> > HcalLutManager::getLinearizationLutXmlFromCoder( const HcalTPGCoder & _coder, std::string _tag, bool split_by_crate )
00611 {
00612 std::cout << "Generating linearization (input) LUTs from HcaluLUTTPGCoder..." << std::endl;
00613 std::map<int, boost::shared_ptr<LutXml> > _xml;
00614
00615
00616
00617
00618
00619 LMap _lmap;
00620 _lmap . read( "backup/HCALmapHBEF.txt", "HBEF" );
00621
00622
00623 std::map<int,LMapRow> & _map = _lmap.get_map();
00624 std::cout << "LMap contains " << _map . size() << " channels" << std::endl;
00625
00626
00627
00628
00629
00630
00631 RooGKCounter _counter;
00632 for( std::map<int,LMapRow>::const_iterator row=_map.begin(); row!=_map.end(); row++ ){
00633 LutXml::Config _cfg;
00634
00635 if ( _xml.count(row->second.crate) == 0 && split_by_crate ){
00636 _xml.insert( std::pair<int,boost::shared_ptr<LutXml> >(row->second.crate,boost::shared_ptr<LutXml>(new LutXml())) );
00637 }
00638 else if ( _xml.count(0) == 0 && !split_by_crate ){
00639 _xml.insert( std::pair<int,boost::shared_ptr<LutXml> >(0,boost::shared_ptr<LutXml>(new LutXml())) );
00640 }
00641 _cfg.ieta = row->second.side*row->second.eta;
00642 _cfg.iphi = row->second.phi;
00643 _cfg.depth = row->second.depth;
00644 _cfg.crate = row->second.crate;
00645 _cfg.slot = row->second.htr;
00646 if (row->second.fpga . find("top") != std::string::npos) _cfg.topbottom = 1;
00647 else if (row->second.fpga . find("bot") != std::string::npos) _cfg.topbottom = 0;
00648 else std::cout << "Warning! fpga out of range..." << std::endl;
00649
00650
00651 _cfg.fiber = row->second.htr_fi;
00652 _cfg.fiberchan = row->second.fi_ch;
00653 _cfg.lut_type = 1;
00654 _cfg.creationtag = _tag;
00655 _cfg.creationstamp = get_time_stamp( time(0) );
00656 _cfg.targetfirmware = "1.0.0";
00657 _cfg.formatrevision = "1";
00658
00659
00660
00661 _cfg.generalizedindex =
00662 _cfg.iphi*10000 + _cfg.depth*1000 +
00663 (row->second.side>0)*100 + row->second.eta +
00664 ((row->second.det==HcalForward && row->second.eta==29)?(4*10000):(0));
00665
00666
00667 HcalDetId _detid(row->second.det, row->second.side*row->second.eta, row->second.phi, row->second.depth);
00668
00669
00670
00671 std::vector<unsigned short> coder_lut = _coder . getLinearizationLUT(_detid);
00672 for (std::vector<unsigned short>::const_iterator _i=coder_lut.begin(); _i!=coder_lut.end();_i++){
00673 unsigned int _temp = (unsigned int)(*_i);
00674
00675
00676 _cfg.lut.push_back(_temp);
00677 }
00678 if (split_by_crate ){
00679 _xml[row->second.crate]->addLut( _cfg, lut_checksums_xml );
00680 _counter.count();
00681 }
00682 else{
00683 _xml[0]->addLut( _cfg, lut_checksums_xml );
00684 _counter.count();
00685 }
00686 }
00687 std::cout << "Generated LUTs: " << _counter.getCount() << std::endl;
00688 std::cout << "Generating linearization (input) LUTs from HcaluLUTTPGCoder...DONE" << std::endl;
00689 return _xml;
00690 }
00691
00692
00693
00694
00695 std::map<int, boost::shared_ptr<LutXml> > HcalLutManager::getLinearizationLutXmlFromCoderEmap( const HcalTPGCoder & _coder, std::string _tag, bool split_by_crate )
00696 {
00697 std::cout << "Generating linearization (input) LUTs from HcaluLUTTPGCoder..." << std::endl;
00698 std::map<int, boost::shared_ptr<LutXml> > _xml;
00699
00700 EMap _emap(emap);
00701 std::vector<EMap::EMapRow> & _map = _emap.get_map();
00702 std::cout << "EMap contains " << _map . size() << " entries" << std::endl;
00703
00704 std::vector<unsigned int> zeroLut;
00705 for (size_t adc = 0; adc < 128; adc++) zeroLut.push_back(0);
00706
00707 RooGKCounter _counter;
00708
00709 for( std::vector<EMap::EMapRow>::const_iterator row=_map.begin(); row!=_map.end(); row++ ){
00710 if( (row->subdet.find("HB")!=string::npos ||
00711 row->subdet.find("HE")!=string::npos ||
00712 row->subdet.find("HF")!=string::npos ) &&
00713 row->subdet.size()==2
00714 ){
00715 LutXml::Config _cfg;
00716
00717 if ( _xml.count(row->crate) == 0 && split_by_crate ){
00718 _xml.insert( std::pair<int,boost::shared_ptr<LutXml> >(row->crate,boost::shared_ptr<LutXml>(new LutXml())) );
00719 }
00720 else if ( _xml.count(0) == 0 && !split_by_crate ){
00721 _xml.insert( std::pair<int,boost::shared_ptr<LutXml> >(0,boost::shared_ptr<LutXml>(new LutXml())) );
00722 }
00723 _cfg.ieta = row->ieta;
00724 _cfg.iphi = row->iphi;
00725 _cfg.depth = row->idepth;
00726 _cfg.crate = row->crate;
00727 _cfg.slot = row->slot;
00728 if (row->topbottom . find("t") != std::string::npos) _cfg.topbottom = 1;
00729 else if (row->topbottom . find("b") != std::string::npos) _cfg.topbottom = 0;
00730 else std::cout << "Warning! fpga out of range..." << std::endl;
00731 _cfg.fiber = row->fiber;
00732 _cfg.fiberchan = row->fiberchan;
00733 _cfg.lut_type = 1;
00734 _cfg.creationtag = _tag;
00735 _cfg.creationstamp = get_time_stamp( time(0) );
00736 _cfg.targetfirmware = "1.0.0";
00737 _cfg.formatrevision = "1";
00738
00739
00740
00741 _cfg.generalizedindex =
00742 _cfg.iphi*10000 + _cfg.depth*1000 +
00743 (row->ieta>0)*100 + abs(row->ieta) +
00744 (((row->subdet.find("HF")!=string::npos) && abs(row->ieta)==29)?(4*10000):(0));
00745 HcalSubdetector _subdet;
00746 if ( row->subdet.find("HB")!=string::npos ) _subdet = HcalBarrel;
00747 else if ( row->subdet.find("HE")!=string::npos ) _subdet = HcalEndcap;
00748 else if ( row->subdet.find("HO")!=string::npos ) _subdet = HcalOuter;
00749 else if ( row->subdet.find("HF")!=string::npos ) _subdet = HcalForward;
00750 else _subdet = HcalOther;
00751 HcalDetId _detid(_subdet, row->ieta, row->iphi, row->idepth);
00752
00753
00754 uint32_t status_word = cq->getValues(_detid)->getValue();
00755 if ((status_word & status_word_to_mask) > 0){
00756 _cfg.lut = zeroLut;
00757 }
00758 else{
00759 std::vector<unsigned short> coder_lut = _coder . getLinearizationLUT(_detid);
00760 for (std::vector<unsigned short>::const_iterator _i=coder_lut.begin(); _i!=coder_lut.end();_i++){
00761 unsigned int _temp = (unsigned int)(*_i);
00762 _cfg.lut.push_back(_temp);
00763 }
00764 }
00765 if (split_by_crate ){
00766 _xml[row->crate]->addLut( _cfg, lut_checksums_xml );
00767 _counter.count();
00768 }
00769 else{
00770 _xml[0]->addLut( _cfg, lut_checksums_xml );
00771 _counter.count();
00772 }
00773 }
00774 }
00775 std::cout << "Generated LUTs: " << _counter.getCount() << std::endl;
00776 std::cout << "Generating linearization (input) LUTs from HcaluLUTTPGCoder...DONE" << std::endl;
00777 return _xml;
00778 }
00779
00780
00781
00782 std::map<int, boost::shared_ptr<LutXml> > HcalLutManager::getCompressionLutXmlFromCoder( const CaloTPGTranscoderULUT & _coder, std::string _tag, bool split_by_crate )
00783 {
00784 std::cout << "Generating compression (output) LUTs from CaloTPGTranscoderULUT," << std::endl;
00785 std::cout << "initialized from Event Setup" << std::endl;
00786 std::map<int, boost::shared_ptr<LutXml> > _xml;
00787
00788
00789 EMap _emap(emap);
00790
00791 std::vector<EMap::EMapRow> & _map = _emap.get_map();
00792 std::cout << "EMap contains " << _map . size() << " channels" << std::endl;
00793
00794
00795
00796
00797
00798
00799 RooGKCounter _counter;
00800 for( std::vector<EMap::EMapRow>::const_iterator row=_map.begin(); row!=_map.end(); row++ ){
00801 LutXml::Config _cfg;
00802
00803
00804
00805 if ( row->subdet . find("HT") != std::string::npos && _coder.HTvalid(row->ieta, row->iphi) ){
00806 if ( _xml.count(row->crate) == 0 && split_by_crate ){
00807 _xml.insert( std::pair<int,boost::shared_ptr<LutXml> >(row->crate,boost::shared_ptr<LutXml>(new LutXml())) );
00808 }
00809 else if ( _xml.count(0) == 0 && !split_by_crate ){
00810 _xml.insert( std::pair<int,boost::shared_ptr<LutXml> >(0,boost::shared_ptr<LutXml>(new LutXml())) );
00811 }
00812 _cfg.ieta = row->ieta;
00813 _cfg.iphi = row->iphi;
00814 _cfg.depth = row->idepth;
00815 _cfg.crate = row->crate;
00816 _cfg.slot = row->slot;
00817 if (row->topbottom . find("t") != std::string::npos) _cfg.topbottom = 1;
00818 else if (row->topbottom . find("b") != std::string::npos) _cfg.topbottom = 0;
00819 else std::cout << "Warning! fpga out of range..." << std::endl;
00820 _cfg.fiber = row->fiber;
00821 _cfg.fiberchan = row->fiberchan;
00822 _cfg.lut_type = 2;
00823 _cfg.creationtag = _tag;
00824 _cfg.creationstamp = get_time_stamp( time(0) );
00825 _cfg.targetfirmware = "1.0.0";
00826 _cfg.formatrevision = "1";
00827
00828
00829
00830 _cfg.generalizedindex =
00831 _cfg.iphi*10000+
00832 (row->ieta>0)*100+abs(row->ieta);
00833
00834
00835
00836 HcalTrigTowerDetId _detid(row->ieta, row->iphi);
00837
00838 std::vector<unsigned char> coder_lut = _coder.getCompressionLUT(_detid);
00839 for (std::vector<unsigned char>::const_iterator _i=coder_lut.begin(); _i!=coder_lut.end();_i++){
00840 unsigned int _temp = (unsigned int)(*_i);
00841
00842
00843 _cfg.lut.push_back(_temp);
00844 }
00845
00846
00847 if (split_by_crate ){
00848 _xml[row->crate]->addLut( _cfg, lut_checksums_xml );
00849 _counter.count();
00850 }
00851 else{
00852 _xml[0]->addLut( _cfg, lut_checksums_xml );
00853 _counter.count();
00854 }
00855 }
00856 }
00857 std::cout << "LUTs generated: " << _counter.getCount() << std::endl;
00858 std::cout << "Generating compression (output) LUTs from CaloTPGTranscoderULUT...DONE" << std::endl;
00859 return _xml;
00860 }
00861
00862
00863
00864 std::map<int, boost::shared_ptr<LutXml> > HcalLutManager::getCompressionLutXmlFromCoder( std::string _tag, bool split_by_crate )
00865 {
00866 std::cout << "Generating compression (output) LUTs from CaloTPGTranscoderULUT" << std::endl;
00867 std::map<int, boost::shared_ptr<LutXml> > _xml;
00868
00869
00870
00871
00872 EMap _emap(emap);
00873
00874 std::vector<EMap::EMapRow> & _map = _emap.get_map();
00875 std::cout << "EMap contains " << _map . size() << " channels" << std::endl;
00876
00877
00878
00879
00880
00881 CaloTPGTranscoderULUT _coder;
00882
00883
00884 RooGKCounter _counter;
00885 for( std::vector<EMap::EMapRow>::const_iterator row=_map.begin(); row!=_map.end(); row++ ){
00886 LutXml::Config _cfg;
00887
00888
00889
00890 if ( row->subdet . find("HT") != std::string::npos && _coder.HTvalid(row->ieta, row->iphi) ){
00891 if ( _xml.count(row->crate) == 0 && split_by_crate ){
00892 _xml.insert( std::pair<int,boost::shared_ptr<LutXml> >(row->crate,boost::shared_ptr<LutXml>(new LutXml())) );
00893 }
00894 else if ( _xml.count(0) == 0 && !split_by_crate ){
00895 _xml.insert( std::pair<int,boost::shared_ptr<LutXml> >(0,boost::shared_ptr<LutXml>(new LutXml())) );
00896 }
00897 _cfg.ieta = row->ieta;
00898 _cfg.iphi = row->iphi;
00899 _cfg.depth = row->idepth;
00900 _cfg.crate = row->crate;
00901 _cfg.slot = row->slot;
00902 if (row->topbottom . find("t") != std::string::npos) _cfg.topbottom = 1;
00903 else if (row->topbottom . find("b") != std::string::npos) _cfg.topbottom = 0;
00904 else std::cout << "Warning! fpga out of range..." << std::endl;
00905 _cfg.fiber = row->fiber;
00906 _cfg.fiberchan = row->fiberchan;
00907 _cfg.lut_type = 2;
00908 _cfg.creationtag = _tag;
00909 _cfg.creationstamp = get_time_stamp( time(0) );
00910 _cfg.targetfirmware = "1.0.0";
00911 _cfg.formatrevision = "1";
00912
00913
00914
00915 _cfg.generalizedindex =
00916 _cfg.iphi*10000+
00917 (row->ieta>0)*100+abs(row->ieta);
00918
00919
00920
00921 HcalTrigTowerDetId _detid(row->ieta, row->iphi);
00922
00923 std::vector<unsigned char> coder_lut = _coder.getCompressionLUT(_detid);
00924 for (std::vector<unsigned char>::const_iterator _i=coder_lut.begin(); _i!=coder_lut.end();_i++){
00925 unsigned int _temp = (unsigned int)(*_i);
00926
00927
00928 _cfg.lut.push_back(_temp);
00929 }
00930
00931
00932 if (split_by_crate ){
00933 _xml[row->crate]->addLut( _cfg, lut_checksums_xml );
00934 _counter.count();
00935 }
00936 else{
00937 _xml[0]->addLut( _cfg, lut_checksums_xml );
00938 _counter.count();
00939 }
00940 }
00941 }
00942 std::cout << "LUTs generated: " << _counter.getCount() << std::endl;
00943 std::cout << "Generating compression (output) LUTs from CaloTPGTranscoderULUT...DONE" << std::endl;
00944 return _xml;
00945 }
00946
00947
00948
00949 int HcalLutManager::writeLutXmlFiles( std::map<int, boost::shared_ptr<LutXml> > & _xml, std::string _tag, bool split_by_crate )
00950 {
00951 for (std::map<int,boost::shared_ptr<LutXml> >::const_iterator cr = _xml.begin(); cr != _xml.end(); cr++){
00952 std::stringstream output_file_name;
00953 if ( split_by_crate ){
00954 output_file_name << _tag << "_" << cr->first << ".xml";
00955 }
00956 else{
00957 output_file_name << _tag << ".xml";
00958 }
00959 cr->second->write( output_file_name.str().c_str() );
00960 }
00961 return 0;
00962 }
00963
00964 int HcalLutManager::createLinLutXmlFiles( std::string _tag, std::string _lin_file, bool split_by_crate )
00965 {
00966
00967 std::map<int, boost::shared_ptr<LutXml> > xml;
00968 if ( !lut_checksums_xml ){
00969 lut_checksums_xml = new XMLDOMBlock( "CFGBrick", 1 );
00970 }
00971
00972 if ( _lin_file.size() != 0 ){
00973 addLutMap( xml, getLinearizationLutXmlFromAsciiMasterEmap( _lin_file, _tag, -1, split_by_crate ) );
00974 }
00975 writeLutXmlFiles( xml, _tag, split_by_crate );
00976
00977 std::string checksums_file = _tag + "_checksums.xml";
00978 lut_checksums_xml -> write( checksums_file . c_str() );
00979
00980 return 0;
00981 }
00982
00983 int HcalLutManager::createAllLutXmlFiles( std::string _tag, std::string _lin_file, std::string _comp_file, bool split_by_crate )
00984 {
00985
00986 std::map<int, boost::shared_ptr<LutXml> > xml;
00987 if ( !lut_checksums_xml ){
00988 lut_checksums_xml = new XMLDOMBlock( "CFGBrick", 1 );
00989 }
00990
00991 if ( _lin_file.size() != 0 ){
00992
00993 addLutMap( xml, getLinearizationLutXmlFromAsciiMasterEmap( _lin_file, _tag, -1, split_by_crate ) );
00994 }
00995 if ( _comp_file.size() != 0 ){
00996
00997 addLutMap( xml, getCompressionLutXmlFromAsciiMaster( _comp_file, _tag, -1, split_by_crate ) );
00998
00999 }
01000 writeLutXmlFiles( xml, _tag, split_by_crate );
01001
01002 std::string checksums_file = _tag + "_checksums.xml";
01003 lut_checksums_xml -> write( checksums_file . c_str() );
01004
01005 return 0;
01006 }
01007
01008 int HcalLutManager::createCompLutXmlFilesFromCoder( std::string _tag, bool split_by_crate )
01009 {
01010
01011 std::map<int, boost::shared_ptr<LutXml> > xml;
01012 if ( !lut_checksums_xml ){
01013 lut_checksums_xml = new XMLDOMBlock( "CFGBrick", 1 );
01014 }
01015
01016 addLutMap( xml, getCompressionLutXmlFromCoder( _tag, split_by_crate ) );
01017
01018 writeLutXmlFiles( xml, _tag, split_by_crate );
01019
01020 std::string checksums_file = _tag + "_checksums.xml";
01021 lut_checksums_xml -> write( checksums_file . c_str() );
01022
01023 return 0;
01024 }
01025
01026 int HcalLutManager::createAllLutXmlFilesFromCoder( const HcalTPGCoder & _coder, std::string _tag, bool split_by_crate )
01027 {
01028
01029 std::map<int, boost::shared_ptr<LutXml> > xml;
01030 if ( !lut_checksums_xml ){
01031 lut_checksums_xml = new XMLDOMBlock( "CFGBrick", 1 );
01032 }
01033
01034
01035 addLutMap( xml, getLinearizationLutXmlFromCoderEmap( _coder, _tag, split_by_crate ) );
01036 addLutMap( xml, getCompressionLutXmlFromCoder( _tag, split_by_crate ) );
01037
01038 writeLutXmlFiles( xml, _tag, split_by_crate );
01039
01040 std::string checksums_file = _tag + "_checksums.xml";
01041 lut_checksums_xml -> write( checksums_file . c_str() );
01042
01043 return 0;
01044 }
01045
01046
01047
01048
01049 int HcalLutManager::createLutXmlFiles_HBEFFromCoder_HOFromAscii( std::string _tag, const HcalTPGCoder & _coder, const CaloTPGTranscoderULUT & _transcoder, std::string _lin_file, bool split_by_crate )
01050 {
01051 std::map<int, boost::shared_ptr<LutXml> > xml;
01052 if ( !lut_checksums_xml ){
01053 lut_checksums_xml = new XMLDOMBlock( "CFGBrick", 1 );
01054 }
01055
01056 if ( _lin_file.size() != 0 ){
01057 const std::map<int, boost::shared_ptr<LutXml> > _lin_lut_ascii_xml = getLinearizationLutXmlFromAsciiMasterEmap( _lin_file, _tag, -1, split_by_crate );
01058 addLutMap( xml, _lin_lut_ascii_xml );
01059 }
01060 const std::map<int, boost::shared_ptr<LutXml> > _lin_lut_xml = getLinearizationLutXmlFromCoderEmap( _coder, _tag, split_by_crate );
01061 addLutMap( xml, _lin_lut_xml );
01062
01063 const std::map<int, boost::shared_ptr<LutXml> > _comp_lut_xml = getCompressionLutXmlFromCoder( _transcoder, _tag, split_by_crate );
01064 addLutMap( xml, _comp_lut_xml );
01065
01066 writeLutXmlFiles( xml, _tag, split_by_crate );
01067
01068 std::string checksums_file = _tag + "_checksums.xml";
01069 lut_checksums_xml -> write( checksums_file . c_str() );
01070
01071 return 0;
01072 }
01073
01074
01075 int HcalLutManager::createLutXmlFiles_HBEFFromCoder_HOFromAscii( std::string _tag, const HcalTPGCoder & _coder, std::string _lin_file, bool split_by_crate )
01076 {
01077 std::map<int, boost::shared_ptr<LutXml> > xml;
01078 if ( !lut_checksums_xml ){
01079 lut_checksums_xml = new XMLDOMBlock( "CFGBrick", 1 );
01080 }
01081
01082 if ( _lin_file.size() != 0 ){
01083 const std::map<int, boost::shared_ptr<LutXml> > _lin_lut_ascii_xml = getLinearizationLutXmlFromAsciiMasterEmap( _lin_file, _tag, -1, split_by_crate );
01084 addLutMap( xml, _lin_lut_ascii_xml );
01085 }
01086 const std::map<int, boost::shared_ptr<LutXml> > _lin_lut_xml = getLinearizationLutXmlFromCoderEmap( _coder, _tag, split_by_crate );
01087 addLutMap( xml, _lin_lut_xml );
01088
01089 const std::map<int, boost::shared_ptr<LutXml> > _comp_lut_xml = getCompressionLutXmlFromCoder( _tag, split_by_crate );
01090 addLutMap( xml, _comp_lut_xml );
01091
01092 writeLutXmlFiles( xml, _tag, split_by_crate );
01093
01094 std::string checksums_file = _tag + "_checksums.xml";
01095 lut_checksums_xml -> write( checksums_file . c_str() );
01096
01097 return 0;
01098 }
01099
01100
01101
01102 int HcalLutManager::createAllLutXmlFilesLinAsciiCompCoder( std::string _tag, std::string _lin_file, bool split_by_crate )
01103 {
01104
01105 std::map<int, boost::shared_ptr<LutXml> > xml;
01106 if ( !lut_checksums_xml ){
01107 lut_checksums_xml = new XMLDOMBlock( "CFGBrick", 1 );
01108 }
01109
01110 if ( _lin_file.size() != 0 ){
01111 addLutMap( xml, getLutXmlFromAsciiMaster( _lin_file, _tag, -1, split_by_crate ) );
01112 }
01113 addLutMap( xml, getCompressionLutXmlFromCoder( _tag, split_by_crate ) );
01114 writeLutXmlFiles( xml, _tag, split_by_crate );
01115
01116 std::string checksums_file = _tag + "_checksums.xml";
01117 lut_checksums_xml -> write( checksums_file . c_str() );
01118
01119 return 0;
01120 }
01121
01122
01123
01124 void HcalLutManager::addLutMap(std::map<int, boost::shared_ptr<LutXml> > & result, const std::map<int, boost::shared_ptr<LutXml> > & other)
01125 {
01126 for ( std::map<int, boost::shared_ptr<LutXml> >::const_iterator lut=other.begin(); lut!=other.end(); lut++ ){
01127 std::cout << "Added LUTs for crate " << lut->first << std::endl;
01128 if ( result.count(lut->first)==0 ){
01129 result . insert( *lut );
01130 }
01131 else{
01132 *(result[lut->first]) += *(lut->second);
01133 }
01134 }
01135 }
01136
01137
01138
01139
01140 string HcalLutManager::get_time_stamp( time_t _time )
01141 {
01142 char timebuf[50];
01143
01144 strftime( timebuf, 50, "%Y-%m-%d %H:%M:%S", gmtime( &_time ) );
01145 std::string creationstamp = timebuf;
01146
01147 return creationstamp;
01148 }
01149
01150
01151
01152
01153 int HcalLutManager::test_xml_access( std::string _tag, std::string _filename )
01154 {
01155 local_connect( _filename, "backup/HCALmapHBEF.txt", "backup/HCALmapHO.txt" );
01156
01157
01158 EMap _emap(emap);
01159 std::vector<EMap::EMapRow> & _map = _emap.get_map();
01160 int map_size = _map . size();
01161 std::cout << "EMap contains " << map_size << " channels" << std::endl;
01162
01163
01164 std::vector<unsigned int> _lut;
01165 _lut = getLutFromXml( _tag, 1107313727, hcal::ConfigurationDatabase::LinearizerLUT );
01166
01167
01168 std::cout << std::endl << "Testing direct parsing of the LUT XML" << std::endl;
01169 struct timeval _t;
01170 gettimeofday( &_t, NULL );
01171 double _time =(double)(_t . tv_sec) + (double)(_t . tv_usec)/1000000.0;
01172 test_direct_xml_parsing(_filename);
01173 gettimeofday( &_t, NULL );
01174 std::cout << "parsing took that much time: " << (double)(_t . tv_sec) + (double)(_t . tv_usec)/1000000.0 - _time << std::endl;
01175
01176
01177 gettimeofday( &_t, NULL );
01178 _time =(double)(_t . tv_sec) + (double)(_t . tv_usec)/1000000.0;
01179 std::cout << "before loop over random LUTs: " << _time << std::endl;
01180 int _raw_id;
01181
01182
01183 for (int _iter=0; _iter<100; _iter++){
01184 gettimeofday( &_t, NULL );
01185
01186
01187
01188 while(1){
01189 int _key = (rand() % map_size);
01190
01191 if( (_map[_key].subdet.find("HB")!=string::npos ||
01192 _map[_key].subdet.find("HE")!=string::npos ||
01193 _map[_key].subdet.find("HO")!=string::npos ||
01194 _map[_key].subdet.find("HF")!=string::npos ) &&
01195 _map[_key].subdet.size()==2
01196 ){
01197 HcalSubdetector _subdet;
01198 if ( _map[_key].subdet.find("HB")!=string::npos ) _subdet = HcalBarrel;
01199 else if ( _map[_key].subdet.find("HE")!=string::npos ) _subdet = HcalEndcap;
01200 else if ( _map[_key].subdet.find("HO")!=string::npos ) _subdet = HcalOuter;
01201 else if ( _map[_key].subdet.find("HF")!=string::npos ) _subdet = HcalForward;
01202 else _subdet = HcalOther;
01203 HcalDetId _detid(_subdet, _map[_key].ieta, _map[_key].iphi, _map[_key].idepth);
01204 _raw_id = _detid.rawId();
01205 break;
01206 }
01207 }
01208 _lut = getLutFromXml( _tag, _raw_id, hcal::ConfigurationDatabase::LinearizerLUT );
01209
01210 gettimeofday( &_t, NULL );
01211 }
01212 double d_time = _t.tv_sec+_t.tv_usec/1000000.0 - _time;
01213 std::cout << "after the loop over random LUTs: " << _time+d_time << std::endl;
01214 std::cout << "total time: " << d_time << std::endl;
01215
01216 std::cout << "LUT length = " << _lut . size() << std::endl;
01217 for ( std::vector<unsigned int>::const_iterator i = _lut . end() - 1; i != _lut . begin()-1; i-- )
01218 {
01219 std::cout << (i-_lut.begin()) << " " << _lut[(i-_lut.begin())] << std::endl;
01220 break;
01221 }
01222
01223 db -> disconnect();
01224
01225 delete db;
01226 db = 0;
01227
01228 return 0;
01229 }
01230
01231
01232
01233 int HcalLutManager::read_lmap( std::string lmap_hbef_file, std::string lmap_ho_file )
01234 {
01235 delete lmap;
01236 lmap = new LMap();
01237 lmap -> read( lmap_hbef_file, "HBEF" );
01238 lmap -> read( lmap_ho_file, "HO" );
01239 std::cout << "LMap contains " << lmap -> get_map() . size() << " channels (compare to 9072 of all HCAL channels)" << std::endl;
01240 return 0;
01241 }
01242
01243
01244
01245 int HcalLutManager::read_luts( std::string lut_xml_file )
01246 {
01247 delete db;
01248 db = new HCALConfigDB();
01249 db -> connect( lut_xml_file );
01250 return 0;
01251 }
01252
01253
01254
01255
01256
01257 int HcalLutManager::local_connect( std::string lut_xml_file, std::string lmap_hbef_file, std::string lmap_ho_file )
01258 {
01259 read_lmap( lmap_hbef_file, lmap_ho_file );
01260 read_luts( lut_xml_file );
01261 return 0;
01262 }
01263
01264
01265
01266
01267 std::vector<unsigned int> HcalLutManager::getLutFromXml( std::string tag, uint32_t _rawid, hcal::ConfigurationDatabase::LUTType _lt )
01268 {
01269 std::cout << "getLutFromXml (new version) is not implemented. Use getLutFromXml_old() for now" << std::endl;
01270
01271 std::vector<unsigned int> result;
01272
01273
01274
01275 return result;
01276 }
01277
01278
01279
01280 std::vector<unsigned int> HcalLutManager::getLutFromXml_old( std::string tag, uint32_t _rawid, hcal::ConfigurationDatabase::LUTType _lt )
01281 {
01282 if ( !lmap ){
01283 std::cout << "HcalLutManager: cannot find LUT without LMAP, exiting..." << std::endl;
01284 exit(-1);
01285 }
01286 if ( !db ){
01287 std::cout << "HcalLutManager: cannot find LUT, no source (local XML file), exiting..." << std::endl;
01288 exit(-1);
01289 }
01290
01291 std::vector<unsigned int> result;
01292
01293 std::map<int,LMapRow> & _map = lmap -> get_map();
01294
01295
01296 HcalDetId _id( _rawid );
01297
01298 unsigned int _crate, _slot, _fiber, _channel;
01299 std::string _fpga;
01300 int topbottom, luttype;
01301
01302
01303 if ( _map . find(_rawid) != _map.end() ){
01304 _crate = _map[_rawid] . crate;
01305 _slot = _map[_rawid] . htr;
01306 _fiber = _map[_rawid] . htr_fi;
01307 _channel = _map[_rawid] . fi_ch;
01308 _fpga = _map[_rawid] . fpga;
01309
01310 if ( _fpga . find("top") != std::string::npos ) topbottom = 1;
01311 else if ( _fpga . find("bot") != std::string::npos ) topbottom = 0;
01312 else{
01313 std::cout << "HcalLutManager: irregular LMAP fpga value... do not know what to do - exiting" << std::endl;
01314 exit(-1);
01315 }
01316 if ( _lt == hcal::ConfigurationDatabase::LinearizerLUT ) luttype = 1;
01317 else luttype = 2;
01318
01319 result = db -> getOnlineLUT( tag, _crate, _slot, topbottom, _fiber, _channel, luttype );
01320 }
01321
01322 return result;
01323 }
01324
01325
01326
01327 int HcalLutManager::get_xml_files_from_db( std::string tag, const std::string db_accessor, bool split_by_crate )
01328 {
01329 std::map<int, boost::shared_ptr<LutXml> > lut_map = get_brickSet_from_oracle( tag, db_accessor );
01330 if (split_by_crate){
01331 writeLutXmlFiles( lut_map, tag, split_by_crate );
01332 }
01333 else{
01334 LutXml result;
01335 for( std::map<int, boost::shared_ptr<LutXml> >::const_iterator xml = lut_map.begin(); xml != lut_map.end(); xml++ ){
01336 result += *(xml->second);
01337 }
01338 std::stringstream out_file;
01339 out_file << tag << ".xml";
01340 result . write(out_file.str());
01341 }
01342
01343 return 0;
01344 }
01345
01346 std::map<int, boost::shared_ptr<LutXml> > HcalLutManager::get_brickSet_from_oracle( std::string tag, const std::string _accessor )
01347 {
01348 HCALConfigDB * db = new HCALConfigDB();
01349 XMLProcessor::getInstance();
01350
01351 db -> connect( _accessor );
01352 oracle::occi::Connection * _connection = db -> getConnection();
01353
01354 std::cout << "Preparing to request the LUT CLOBs from the database..." << std::endl;
01355
01356
01357
01358
01359
01360
01361
01362 std::string query = ("SELECT TRIG_PRIM_LOOKUPTBL_DATA_CLOB, CRATE FROM CMS_HCL_HCAL_COND.V_HCAL_TRIG_LOOKUP_TABLES");
01363
01364 query+=toolbox::toString(" WHERE TAG_NAME='%s'", tag.c_str() );
01365
01366 std::string brick_set;
01367
01368 std::map<int, boost::shared_ptr<LutXml> > lut_map;
01369
01370 try {
01371
01372 std::cout << "Executing the query..." << std::endl;
01373 Statement* stmt = _connection -> createStatement();
01374 ResultSet *rs = stmt->executeQuery(query.c_str());
01375 std::cout << "Executing the query... done" << std::endl;
01376
01377 std::cout << "Processing the query results..." << std::endl;
01378
01379 while (rs->next()) {
01380
01381 oracle::occi::Clob clob = rs->getClob (1);
01382 int crate = rs->getInt(2);
01383 if ( crate != -1 ){
01384 cout << "Getting LUTs for crate #" << crate << " out of the database...";
01385 brick_set = db -> clobToString(clob);
01386
01387
01388
01389
01390
01391
01392
01393
01394
01395 const char * bs = brick_set . c_str();
01396 MemBufInputSource * lut_clob = new MemBufInputSource( (const XMLByte *)bs, strlen( bs ), "lut_clob", false );
01397 boost::shared_ptr<LutXml> lut_xml = boost::shared_ptr<LutXml>( new LutXml( *lut_clob ) );
01398 lut_map[crate] = lut_xml;
01399 std::cout << " done" << std::endl;
01400 }
01401 }
01402
01403 _connection -> terminateStatement(stmt);
01404
01405 } catch (SQLException& e) {
01406 XCEPT_RAISE(hcal::exception::ConfigurationDatabaseException,::toolbox::toString("Oracle exception : %s",e.getMessage().c_str()));
01407 }
01408
01409
01410
01411 db -> disconnect();
01412
01413 return lut_map;
01414 }
01415
01416
01417 int HcalLutManager::create_lut_loader( std::string file_list, std::string _prefix, std::string tag_name, std::string comment, std::string version, int subversion )
01418 {
01419 std::cout << "Generating XML loader for LUTs..." << std::endl;
01420
01421
01422 XMLLUTLoader::loaderBaseConfig baseConf;
01423 XMLLUTLoader::lutDBConfig conf;
01424 XMLLUTLoader::checksumsDBConfig CSconf;
01425
01426 baseConf . tag_name = tag_name;
01427
01428 baseConf . comment_description = comment;
01429 baseConf . iov_begin = "1";
01430 baseConf . iov_end = "-1";
01431
01432 conf . version = version;
01433
01434 std::stringstream _subversion;
01435 _subversion << subversion;
01436 conf . subversion = _subversion.str();
01437
01438 CSconf . version = conf . version;
01439 CSconf . subversion = conf . subversion;
01440 CSconf . trig_prim_lookuptbl_data_file = _prefix + "_checksums.xml.dat";
01441 CSconf . comment_description = tag_name;
01442
01443 XMLLUTLoader doc( &baseConf );
01444
01445 std::vector<int> crate_number;
01446 std::vector<std::string> file_name = HcalQIEManager::splitString(file_list);
01447 for (std::vector<std::string>::const_iterator _f = file_name.begin(); _f != file_name.end(); _f++){
01448 int crate_begin = _f->rfind("_");
01449 int crate_end = _f->rfind(".xml.dat");
01450 crate_number . push_back(getInt(_f->substr(crate_begin+1,crate_end-crate_begin-1)));
01451 }
01452
01453
01454
01455 char _buf[128];
01456 time_t _offset = time(NULL);
01457 sprintf( _buf, "%d", (uint32_t)_offset );
01458 conf.version.append(".");
01459 conf.version.append(_buf);
01460 CSconf.version = conf.version;
01461
01462 for ( std::vector<std::string>::const_iterator _file = file_name . begin(); _file != file_name . end(); _file++ )
01463 {
01464 conf . trig_prim_lookuptbl_data_file = *_file;
01465
01466 conf . crate = crate_number[ _file - file_name . begin() ];
01467
01468
01469
01470 sprintf( _buf, "%.2d", conf.crate );
01471 conf.subversion.clear();
01472 conf.subversion.append(_buf);
01473 sprintf( _buf, "CRATE%.2d", conf . crate );
01474 std::string _namelabel;
01475 _namelabel . append( _buf );
01476 conf . name_label = _namelabel;
01477 doc . addLUT( &conf );
01478 }
01479
01480 doc . addChecksums( &CSconf );
01481
01482 doc . write( tag_name + "_Loader.xml" );
01483
01484 std::cout << "Generating XML loader for LUTs... done." << std::endl;
01485
01486 return 0;
01487 }
01488
01489 void HcalLutManager::test_emap( void ){
01490
01491
01492
01493 EMap _emap(emap);
01494 std::vector<EMap::EMapRow> & _map = _emap.get_map();
01495 std::cout << "EMap contains " << _map . size() << " channels" << std::endl;
01496
01497
01498
01499 for( std::vector<EMap::EMapRow>::const_iterator row=_map.begin(); row!=_map.end(); row++ ){
01500
01501
01502 if ( row->subdet . find("HT") != std::string::npos ){
01503 std::cout << " -----> Subdet = " << row->subdet << std::endl;
01504
01505 if (abs(row->ieta)>28){
01506
01507 cout << " ==> (ieta,iphi) = " << row->ieta << ", " << row->iphi << std::endl;
01508 }
01509 }
01510 }
01511 }
01512
01513
01514
01515
01516
01517 int HcalLutManager::test_direct_xml_parsing( std::string _filename ){
01518
01519
01520
01521
01522
01523
01524
01525
01526
01527
01528
01529
01530
01531
01532
01533
01534
01535
01536
01537
01538
01539
01540
01541
01542
01543 return 0;
01544 }
01545
01546
01547
01548
01549
01550 int HcalLutManager::createLutXmlFiles_HBEFFromCoder_HOFromAscii_ZDC( std::string _tag, const HcalTPGCoder & _coder, const CaloTPGTranscoderULUT & _transcoder, std::string _lin_file, bool split_by_crate )
01551 {
01552 std::map<int, boost::shared_ptr<LutXml> > xml;
01553 if ( !lut_checksums_xml ){
01554 lut_checksums_xml = new XMLDOMBlock( "CFGBrick", 1 );
01555 }
01556
01557 if ( _lin_file.size() != 0 ){
01558 const std::map<int, boost::shared_ptr<LutXml> > _lin_lut_ascii_xml = getLinearizationLutXmlFromAsciiMasterEmap( _lin_file, _tag, -1, split_by_crate );
01559 addLutMap( xml, _lin_lut_ascii_xml );
01560 }
01561 const std::map<int, boost::shared_ptr<LutXml> > _lin_lut_xml = getLinearizationLutXmlFromCoderEmap( _coder, _tag, split_by_crate );
01562 addLutMap( xml, _lin_lut_xml );
01563
01564 const std::map<int, boost::shared_ptr<LutXml> > _comp_lut_xml = getCompressionLutXmlFromCoder( _transcoder, _tag, split_by_crate );
01565 addLutMap( xml, _comp_lut_xml );
01566
01567 const std::map<int, boost::shared_ptr<LutXml> > _zdc_lut_xml = getZdcLutXml( _tag, split_by_crate );
01568 addLutMap( xml, _zdc_lut_xml );
01569
01570 writeLutXmlFiles( xml, _tag, split_by_crate );
01571
01572 std::string checksums_file = _tag + "_checksums.xml";
01573 lut_checksums_xml -> write( checksums_file . c_str() );
01574
01575 return 0;
01576 }
01577
01578
01579 std::map<int, boost::shared_ptr<LutXml> > HcalLutManager::getZdcLutXml( std::string _tag,
01580 bool split_by_crate )
01581 {
01582 std::cout << "Generating ZDC LUTs ...may the Force be with us..." << std::endl;
01583 std::map<int, boost::shared_ptr<LutXml> > _xml;
01584
01585 EMap _emap(emap);
01586
01587 ZdcLut zdc;
01588
01589 std::vector<EMap::EMapRow> & _map = _emap.get_map();
01590 std::cout << "EMap contains " << _map . size() << " channels" << std::endl;
01591
01592
01593 RooGKCounter _counter;
01594 for( std::vector<EMap::EMapRow>::const_iterator row=_map.begin(); row!=_map.end(); row++ ){
01595 LutXml::Config _cfg;
01596
01597
01598 if ( row->zdc_section . find("ZDC") != std::string::npos ){
01599 if ( _xml.count(row->crate) == 0 && split_by_crate ){
01600 _xml.insert( std::pair<int,boost::shared_ptr<LutXml> >(row->crate,boost::shared_ptr<LutXml>(new LutXml())) );
01601 }
01602 else if ( _xml.count(0) == 0 && !split_by_crate ){
01603 _xml.insert( std::pair<int,boost::shared_ptr<LutXml> >(0,boost::shared_ptr<LutXml>(new LutXml())) );
01604 }
01605
01606 _cfg.ieta = row->zdc_channel;
01607
01608
01609 _cfg.depth = row->idepth;
01610 _cfg.crate = row->crate;
01611 _cfg.slot = row->slot;
01612 if (row->topbottom . find("t") != std::string::npos) _cfg.topbottom = 1;
01613 else if (row->topbottom . find("b") != std::string::npos) _cfg.topbottom = 0;
01614 else std::cout << "Warning! fpga out of range..." << std::endl;
01615 _cfg.fiber = row->fiber;
01616 _cfg.fiberchan = row->fiberchan;
01617 _cfg.lut_type = 1;
01618 _cfg.creationtag = _tag;
01619 _cfg.creationstamp = get_time_stamp( time(0) );
01620 _cfg.targetfirmware = "1.0.0";
01621 _cfg.formatrevision = "1";
01622 _cfg.generalizedindex = 0;
01623
01624
01625
01626 std::vector<int> coder_lut = zdc.get_lut(row->zdc_section,
01627 row->zdc_zside,
01628 row->zdc_channel);
01629 std::cout << "***DEBUG: ZDC lut size: " << coder_lut.size() << std::endl;
01630 if (coder_lut.size()!=0){
01631 for (std::vector<int>::const_iterator _i=coder_lut.begin(); _i!=coder_lut.end();_i++){
01632 unsigned int _temp = (unsigned int)(*_i);
01633
01634
01635 _cfg.lut.push_back(_temp);
01636 }
01637
01638
01639 if (split_by_crate ){
01640 _xml[row->crate]->addLut( _cfg, lut_checksums_xml );
01641 _counter.count();
01642 }
01643 else{
01644 _xml[0]->addLut( _cfg, lut_checksums_xml );
01645 _counter.count();
01646 }
01647 }
01648 }
01649 }
01650 std::cout << "LUTs generated: " << _counter.getCount() << std::endl;
01651 std::cout << "Generating ZDC LUTs...DONE" << std::endl;
01652
01653 return _xml;
01654 }
01655
01656