00001
00002
00003 #include "OnlineDB/SiStripESSources/interface/SiStripFedCablingBuilderFromDb.h"
00004 #include "CalibFormats/SiStripObjects/interface/SiStripFecCabling.h"
00005 #include "CondFormats/SiStripObjects/interface/SiStripFedCabling.h"
00006 #include "CondFormats/SiStripObjects/interface/FedChannelConnection.h"
00007 #include "DataFormats/SiStripCommon/interface/SiStripEnumsAndStrings.h"
00008 #include "DataFormats/SiStripCommon/interface/SiStripFecKey.h"
00009 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00010 #include "FWCore/ServiceRegistry/interface/Service.h"
00011 #include "OnlineDB/SiStripConfigDb/interface/SiStripConfigDb.h"
00012 #include <cstdlib>
00013 #include <iostream>
00014 #include <sstream>
00015 #include <iomanip>
00016
00017 using namespace std;
00018 using namespace sistrip;
00019
00020
00022 SiStripFedCablingBuilderFromDb::SiStripFedCablingBuilderFromDb( const edm::ParameterSet& pset )
00023 : SiStripFedCablingESProducer( pset ),
00024 db_(0),
00025 source_(sistrip::UNDEFINED_CABLING_SOURCE)
00026 {
00027 findingRecord<SiStripFedCablingRcd>();
00028
00029 LogTrace(mlCabling_)
00030 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00031 << " Constructing object...";
00032
00033
00034 string source = pset.getUntrackedParameter<string>( "CablingSource", "UNDEFINED" );
00035 source_ = SiStripEnumsAndStrings::cablingSource( source );
00036
00037 LogTrace(mlCabling_)
00038 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00039 << " CablingSource configurable set to \"" << source << "\""
00040 << ". CablingSource member data set to: \""
00041 << SiStripEnumsAndStrings::cablingSource( source_ ) << "\"";
00042 }
00043
00044
00046 SiStripFedCablingBuilderFromDb::~SiStripFedCablingBuilderFromDb() {
00047 LogTrace(mlCabling_)
00048 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00049 << " Destructing object...";
00050 }
00051
00052
00054 SiStripFedCabling* SiStripFedCablingBuilderFromDb::make( const SiStripFedCablingRcd& ) {
00055 LogTrace(mlCabling_)
00056 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00057 << " Constructing FED cabling...";
00058
00059
00060 SiStripFedCabling* fed_cabling = new SiStripFedCabling();
00061
00062
00063 db_ = edm::Service<SiStripConfigDb>().operator->();
00064
00065
00066 if ( db_ ) {
00067 edm::LogVerbatim(mlCabling_)
00068 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00069 << " Pointer to SiStripConfigDb: 0x"
00070 << std::setw(8) << std::setfill('0')
00071 << std::hex << db_ << std::dec;
00072 } else {
00073 edm::LogError(mlCabling_)
00074 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00075 << " NULL pointer to SiStripConfigDb returned by DB \"service\"!"
00076 << " Cannot build FED cabling object!";
00077 return fed_cabling;
00078 }
00079
00080
00081 if ( db_->deviceFactory() ||
00082 db_->databaseCache() ) {
00083
00084
00085 SiStripFecCabling fec_cabling;
00086 buildFecCabling( db_, fec_cabling, source_ );
00087
00088
00089 getFedCabling( fec_cabling, *fed_cabling );
00090
00091
00092 writeFedCablingToCondDb( *fed_cabling );
00093
00094
00095
00096
00097
00098
00099
00100
00101 } else {
00102 edm::LogError(mlCabling_)
00103 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00104 << " NULL pointers to DeviceFactory and DatabaseCache returned by SiStripConfigDb!"
00105 << " Cannot build FED cabling object!";
00106 }
00107
00108 return fed_cabling;
00109
00110 }
00111
00112
00114 void SiStripFedCablingBuilderFromDb::buildFecCabling( SiStripConfigDb* const db,
00115 SiStripFecCabling& fec_cabling,
00116 const sistrip::CablingSource& source ) {
00117
00118 if ( source == sistrip::CABLING_FROM_CONNS ) { buildFecCablingFromFedConnections( db, fec_cabling ); }
00119 else if ( source == sistrip::CABLING_FROM_DEVICES ) { buildFecCablingFromDevices( db, fec_cabling ); }
00120 else if ( source == sistrip::CABLING_FROM_DETIDS ) { buildFecCablingFromDetIds( db, fec_cabling ); }
00121 else if ( source == sistrip::UNDEFINED_CABLING_SOURCE ) {
00122
00123 LogTrace(mlCabling_)
00124 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00125 << " Unexpected value for CablingSource: \""
00126 << SiStripEnumsAndStrings::cablingSource( source )
00127 << "\" Querying DB in order to build cabling from one of connections, devices or DetIds...";
00128 buildFecCabling( db, fec_cabling );
00129 return;
00130
00131 } else {
00132
00133 edm::LogError(mlCabling_)
00134 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00135 << " Cannot build SiStripFecCabling object!"
00136 << " sistrip::CablingSource has value: "
00137 << SiStripEnumsAndStrings::cablingSource( source );
00138 return;
00139
00140 }
00141
00142
00143 const NumberOfDevices& devs = fec_cabling.countDevices();
00144 std::stringstream ss;
00145 ss << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00146 << " Built SiStripFecCabling object with following devices:"
00147 << endl << devs;
00148 edm::LogVerbatim(mlCabling_) << ss.str() << endl;
00149
00150 }
00151
00152
00154 void SiStripFedCablingBuilderFromDb::buildFecCabling( SiStripConfigDb* const db,
00155 SiStripFecCabling& fec_cabling ) {
00156 LogTrace(mlCabling_)
00157 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00158 << " Building cabling object...";
00159
00160 if ( !db->getFedConnections().empty() ) { buildFecCablingFromFedConnections( db, fec_cabling ); }
00161 else if ( !db->getDeviceDescriptions().empty() ) { buildFecCablingFromDevices( db, fec_cabling ); }
00162 else if ( !db->getDcuDetIds().empty() ) { buildFecCablingFromDetIds( db, fec_cabling ); }
00163 else {
00164
00165 edm::LogError(mlCabling_)
00166 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00167 << " Cannot build SiStripFecCabling object!"
00168 << " FedConnections, DeviceDescriptions and DcuDetIds vectors are all empty!";
00169 return;
00170
00171 }
00172
00173
00174 const NumberOfDevices& devices = fec_cabling.countDevices();
00175 std::stringstream ss;
00176 ss << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00177 << " Built SiStripFecCabling object with following devices:"
00178 << std::endl << devices;
00179 edm::LogVerbatim(mlCabling_) << ss.str() << endl;
00180
00181 }
00182
00183
00219 void SiStripFedCablingBuilderFromDb::buildFecCablingFromFedConnections( SiStripConfigDb* const db,
00220 SiStripFecCabling& fec_cabling ) {
00221 edm::LogVerbatim(mlCabling_)
00222 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00223 << " Building FEC cabling from FED connections descriptions...";
00224
00225
00226
00227
00228
00229
00230
00231 SiStripConfigDb::FedConnectionsRange conns = db->getFedConnections();
00232 if ( conns.empty() ) {
00233 edm::LogError(mlCabling_)
00234 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00235 << " Unable to build FEC cabling!"
00236 << " No entries in FedConnections vector!";
00237 return;
00238 }
00239
00240
00241
00242 LogTrace(mlCabling_)
00243 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00244 << " Retrieving DCU-DetId vector from database...";
00245 SiStripConfigDb::DcuDetIdsRange range = db->getDcuDetIds();
00246 const SiStripConfigDb::DcuDetIdsV dcu_detid_vector( range.begin(), range.end() );
00247 if ( !dcu_detid_vector.empty() ) {
00248 LogTrace(mlCabling_)
00249 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00250 << " Found " << dcu_detid_vector.size()
00251 << " entries in DCU-DetId vector retrieved from database!";
00252 } else {
00253 edm::LogWarning(mlCabling_)
00254 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00255 << " No entries in DCU-DetId vector retrieved from database!";
00256 }
00257
00258
00259
00260 SiStripConfigDb::FedConnectionsV::const_iterator ifed = conns.begin();
00261 SiStripConfigDb::FedConnectionsV::const_iterator jfed = conns.end();
00262 for ( ; ifed != jfed; ++ifed ) {
00263
00264 if ( !(*ifed) ) {
00265 edm::LogWarning(mlCabling_)
00266 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00267 << " NULL pointer to FedConnection!";
00268 continue;
00269 }
00270
00271 #ifdef USING_NEW_DATABASE_MODEL
00272
00273 uint16_t fec_crate = static_cast<uint16_t>( (*ifed)->getFecCrateId() + sistrip::FEC_CRATE_OFFSET );
00274 uint16_t fec_slot = static_cast<uint16_t>( (*ifed)->getFecSlot() );
00275 uint16_t fec_ring = static_cast<uint16_t>( (*ifed)->getRingSlot() + sistrip::FEC_RING_OFFSET );
00276 uint16_t ccu_addr = static_cast<uint16_t>( (*ifed)->getCcuAddress() );
00277 uint16_t ccu_chan = static_cast<uint16_t>( (*ifed)->getI2cChannel() );
00278 uint16_t apv0 = static_cast<uint16_t>( (*ifed)->getApvAddress() );
00279 uint16_t apv1 = apv0 + 1;
00280 uint32_t dcu_id = static_cast<uint32_t>( (*ifed)->getDcuHardId() );
00281 uint32_t det_id = 0;
00282 uint16_t npairs = 0;
00283 uint16_t fed_id = static_cast<uint16_t>( (*ifed)->getFedId() );
00284 uint16_t fed_ch = static_cast<uint16_t>( (*ifed)->getFedChannel() );
00285 uint16_t length = 0;
00286 #else
00287 uint16_t fec_crate = static_cast<uint16_t>( (*ifed)->getFecInstance() + sistrip::FEC_CRATE_OFFSET );
00288 uint16_t fec_slot = static_cast<uint16_t>( (*ifed)->getSlot() );
00289 uint16_t fec_ring = static_cast<uint16_t>( (*ifed)->getRing() + sistrip::FEC_RING_OFFSET );
00290 uint16_t ccu_addr = static_cast<uint16_t>( (*ifed)->getCcu() );
00291 uint16_t ccu_chan = static_cast<uint16_t>( (*ifed)->getI2c() );
00292 uint16_t apv0 = static_cast<uint16_t>( (*ifed)->getApv() );
00293 uint16_t apv1 = apv0 + 1;
00294 uint32_t dcu_id = static_cast<uint32_t>( (*ifed)->getDcuHardId() );
00295 uint32_t det_id = static_cast<uint32_t>( (*ifed)->getDetId() );
00296 uint16_t npairs = static_cast<uint16_t>( (*ifed)->getApvPairs() );
00297 uint16_t fed_id = static_cast<uint16_t>( (*ifed)->getFedId() );
00298 uint16_t fed_ch = static_cast<uint16_t>( (*ifed)->getFedChannel() );
00299 uint16_t length = static_cast<uint16_t>( (*ifed)->getFiberLength() );
00300 #endif
00301
00302 FedChannelConnection conn( fec_crate, fec_slot, fec_ring, ccu_addr, ccu_chan,
00303 apv0, apv1,
00304 dcu_id, det_id, npairs,
00305 fed_id, fed_ch,
00306 length );
00307
00308 uint16_t fed_crate = sistrip::invalid_;
00309 uint16_t fed_slot = sistrip::invalid_;
00310 #ifdef USING_NEW_DATABASE_MODEL
00311 fed_crate = static_cast<uint16_t>( (*ifed)->getFedCrateId() );
00312 fed_slot = static_cast<uint16_t>( (*ifed)->getFedSlot() );
00313 #else
00314 uint16_t id = static_cast<uint16_t>( (*ifed)->getFedId() );
00315 fed_crate = id / 16 + 1;
00316 fed_slot = id % 16 + 2;
00317 #endif
00318 conn.fedCrate( fed_crate );
00319 conn.fedSlot( fed_slot );
00320
00321 fec_cabling.addDevices( conn );
00322
00323 }
00324
00325
00326
00327 assignDcuAndDetIds( fec_cabling, dcu_detid_vector );
00328
00329 }
00330
00331
00374 void SiStripFedCablingBuilderFromDb::buildFecCablingFromDevices( SiStripConfigDb* const db,
00375 SiStripFecCabling& fec_cabling ) {
00376 edm::LogVerbatim(mlCabling_)
00377 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00378 << " Building FEC cabling object from device descriptions...";
00379
00380
00381
00382
00383
00384
00385
00386 LogTrace(mlCabling_)
00387 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00388 << " Retrieving APV descriptions from database...";
00389 SiStripConfigDb::DeviceDescriptionsRange apv_desc = db->getDeviceDescriptions( APV25 );
00390 if ( !apv_desc.empty() ) {
00391 LogTrace(mlCabling_)
00392 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00393 << " Retrieved " << apv_desc.size()
00394 << " APV descriptions from database!";
00395 } else {
00396 edm::LogError(mlCabling_)
00397 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00398 << " Unable to build FEC cabling!"
00399 << " No APV descriptions found!";
00400 return;
00401 }
00402
00403
00404
00405 LogTrace(mlCabling_)
00406 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00407 << " Retrieving DCU descriptions from database...";
00408 SiStripConfigDb::DeviceDescriptionsRange dcu_desc = db->getDeviceDescriptions( DCU );
00409
00410 if ( !dcu_desc.empty() ) {
00411
00412 uint16_t feh = 0;
00413 uint16_t ccu = 0;
00414 SiStripConfigDb::DeviceDescriptionsV::const_iterator idcu;
00415 for ( idcu = dcu_desc.begin(); idcu != dcu_desc.end(); idcu++ ) {
00416 dcuDescription* dcu = dynamic_cast<dcuDescription*>( *idcu );
00417 if ( !dcu ) { continue; }
00418 if ( dcu->getDcuType() == "FEH" ) { feh++; }
00419 else { ccu++; }
00420 }
00421
00422 LogTrace(mlCabling_)
00423 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00424 << " Retrieved " << feh
00425 << " DCU-FEH descriptions from database!"
00426 << " (and a further " << ccu << " DCUs for CCU modules, etc...)";
00427
00428 } else {
00429 edm::LogWarning(mlCabling_)
00430 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00431 << " No DCU descriptions found!";
00432 }
00433
00434
00435
00436
00437 LogTrace(mlCabling_)
00438 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00439 << " Retrieving DCU-DetId vector from database...";
00440 SiStripConfigDb::DcuDetIdsRange range = db->getDcuDetIds();
00441 const SiStripConfigDb::DcuDetIdsV dcu_detid_vector( range.begin(), range.end() );
00442 if ( !dcu_detid_vector.empty() ) {
00443 LogTrace(mlCabling_)
00444 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00445 << " Found " << dcu_detid_vector.size()
00446 << " entries in DCU-DetId vector retrieved from database!";
00447 } else {
00448 edm::LogWarning(mlCabling_)
00449 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00450 << " No entries in DCU-DetId vector retrieved from database!";
00451 }
00452
00453
00454
00455 LogTrace(mlCabling_)
00456 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00457 << " Retrieving FED ids from database...";
00458 SiStripConfigDb::FedIdsRange fed_ids = db->getFedIds();
00459
00460 if ( !fed_ids.empty() ) {
00461 LogTrace(mlCabling_)
00462 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00463 << " Retrieved " << fed_ids.size()
00464 << " FED ids from database!";
00465 } else {
00466 edm::LogWarning(mlCabling_)
00467 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00468 << " No FED ids found!";
00469 }
00470
00471
00472
00473 edm::LogVerbatim(mlCabling_)
00474 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00475 << " Building FEC cabling object from APV and DCU descriptions...";
00476
00477 SiStripConfigDb::DeviceDescriptionsV::const_iterator iapv;
00478 for ( iapv = apv_desc.begin(); iapv != apv_desc.end(); iapv++ ) {
00479
00480 if ( !(*iapv) ) {
00481 edm::LogWarning(mlCabling_)
00482 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00483 << " NULL pointer to DeviceDescription (of type APV25)!";
00484 continue;
00485 }
00486
00487 SiStripConfigDb::DeviceAddress addr = db->deviceAddress(**iapv);
00488 FedChannelConnection conn( addr.fecCrate_ + sistrip::FEC_CRATE_OFFSET,
00489 addr.fecSlot_,
00490 addr.fecRing_ + sistrip::FEC_RING_OFFSET,
00491 addr.ccuAddr_,
00492 addr.ccuChan_,
00493 addr.i2cAddr_ );
00494 fec_cabling.addDevices( conn );
00495
00496 }
00497
00498 SiStripConfigDb::DeviceDescriptionsV::const_iterator idcu;
00499 for ( idcu = dcu_desc.begin(); idcu != dcu_desc.end(); idcu++ ) {
00500
00501 if ( !(*idcu) ) {
00502 edm::LogWarning(mlCabling_)
00503 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00504 << " NULL pointer to DeviceDescription (of type DCU)!";
00505 continue;
00506 }
00507
00508 SiStripConfigDb::DeviceAddress addr = db->deviceAddress(**idcu);
00509 dcuDescription* dcu = dynamic_cast<dcuDescription*>( *idcu );
00510 if ( !dcu ) { continue; }
00511 if ( dcu->getDcuType() != "FEH" ) { continue; }
00512 FedChannelConnection conn( addr.fecCrate_ + sistrip::FEC_CRATE_OFFSET,
00513 addr.fecSlot_,
00514 addr.fecRing_ + sistrip::FEC_RING_OFFSET,
00515 addr.ccuAddr_,
00516 addr.ccuChan_,
00517 0, 0,
00518 dcu->getDcuHardId() );
00519 fec_cabling.dcuId( conn );
00520
00521 }
00522
00523 LogTrace(mlCabling_)
00524 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00525 << " Finished building FEC cabling object from APV and DCU descriptions!";
00526
00527 NumberOfDevices devs1 = fec_cabling.countDevices();
00528 std::stringstream ss1;
00529 ss1 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00530 << " Number of devices in FEC cabling object:" << std::endl;
00531 devs1.print(ss1);
00532 LogTrace(mlCabling_) << ss1.str();
00533
00534
00535
00536 std::vector<uint16_t>::const_iterator ifed = fed_ids.begin();
00537 uint16_t fed_ch = 0;
00538
00539
00540
00541 std::vector<uint32_t> used_keys;
00542
00543 LogTrace(mlCabling_)
00544 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00545 << " Randomly assigning FED ids/channels to APV pairs in front-end modules...";
00546
00547 if ( fed_ids.empty() ) {
00548 edm::LogError(mlCabling_)
00549 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00550 << " No FED ids retrieved from database! Unable to cable system!";
00551 } else {
00552
00553 bool complete = false;
00554 std::vector<SiStripFecCrate>::const_iterator icrate = fec_cabling.crates().begin();
00555 std::vector<SiStripFecCrate>::const_iterator jcrate = fec_cabling.crates().end();
00556 while ( !complete && icrate != jcrate ) {
00557 std::vector<SiStripFec>::const_iterator ifec = icrate->fecs().begin();
00558 std::vector<SiStripFec>::const_iterator jfec = icrate->fecs().end();
00559 while ( !complete && ifec != jfec ) {
00560 std::vector<SiStripRing>::const_iterator iring = ifec->rings().begin();
00561 std::vector<SiStripRing>::const_iterator jring = ifec->rings().end();
00562 while ( !complete && iring != jring ) {
00563 std::vector<SiStripCcu>::const_iterator iccu = iring->ccus().begin();
00564 std::vector<SiStripCcu>::const_iterator jccu = iring->ccus().end();
00565 while ( !complete && iccu != jccu ) {
00566 std::vector<SiStripModule>::const_iterator imod = iccu->modules().begin();
00567 std::vector<SiStripModule>::const_iterator jmod = iccu->modules().end();
00568 while ( !complete && imod != jmod ) {
00569
00570
00571 const_cast<SiStripModule&>(*imod).nApvPairs(0);
00572
00573 used_keys.push_back( SiStripFecKey( imod->fecCrate(),
00574 imod->fecSlot(),
00575 imod->fecRing(),
00576 imod->ccuAddr(),
00577 imod->ccuChan() ).key() );
00578
00579
00580
00581
00582
00583
00584
00585
00586
00587
00588
00589
00590
00591
00592
00593
00594 for ( uint16_t ipair = 0; ipair < imod->nApvPairs(); ipair++ ) {
00595
00596
00597 if ( ifed == fed_ids.end() ) { fed_ch++; ifed = fed_ids.begin(); }
00598 if ( fed_ch == 96 ) {
00599 edm::LogWarning(mlCabling_)
00600 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00601 << " Insufficient FED channels to cable all devices in control system!";
00602 complete = true;
00603 break;
00604 }
00605
00606
00607 pair<uint16_t,uint16_t> addr = imod->activeApvPair( imod->lldChannel(ipair) );
00608 SiStripModule::FedChannel fed_channel( (*ifed)/16+1,
00609 (*ifed)%16+2,
00610 *ifed,
00611 fed_ch );
00612 const_cast<SiStripModule&>(*imod).fedCh( addr.first, fed_channel );
00613 ifed++;
00614
00615 }
00616
00617 imod++;
00618 }
00619 iccu++;
00620 }
00621 iring++;
00622 }
00623 ifec++;
00624 }
00625 icrate++;
00626 }
00627
00628 }
00629
00630 std::sort( used_keys.begin(), used_keys.end() );
00631
00632 NumberOfDevices devs2 = fec_cabling.countDevices();
00633 std::stringstream ss2;
00634 ss2 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00635 << " Number of devices in FEC cabling object:" << std::endl;
00636 devs2.print(ss2);
00637 LogTrace(mlCabling_) << ss2.str();
00638
00639 LogTrace(mlCabling_)
00640 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00641 << " Finished randomly assigning FED ids/channels to APV pairs in front-end modules...";
00642
00643
00644
00645 LogTrace(mlCabling_)
00646 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00647 << " Assigning APV pairs in dummy front-end modules to any remaining \"uncabled\" FED ids/channels...";
00648
00649 if ( fed_ids.empty() ) {
00650 edm::LogError(mlCabling_)
00651 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00652 << " No FED ids retrieved from database! Unable to cable system!";
00653 } else {
00654
00655 uint16_t module = 0;
00656 bool complete = false;
00657 while ( !complete ) {
00658 for ( uint16_t lld = sistrip::LLD_CHAN_MIN; lld < sistrip::LLD_CHAN_MAX+1; lld++ ) {
00659
00660
00661 if ( ifed == fed_ids.end() ) { fed_ch++; ifed = fed_ids.begin(); }
00662 if ( fed_ch == 96 ) {
00663 LogTrace(mlCabling_)
00664 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00665 << " All FED channels are now cabled!";
00666 complete = true;
00667 break;
00668 }
00669
00670 uint32_t key = SiStripFecKey( fecCrate( module ),
00671 fecSlot( module ),
00672 fecRing( module ),
00673 ccuAddr( module ),
00674 ccuChan( module ) ).key();
00675
00676
00677
00678 FedChannelConnection temp( fecCrate( module ),
00679 fecSlot( module ),
00680 fecRing( module ),
00681 ccuAddr( module ),
00682 ccuChan( module ),
00683 SiStripFecKey::i2cAddr(lld,true),
00684 SiStripFecKey::i2cAddr(lld,false),
00685 sistrip::invalid32_,
00686 sistrip::invalid32_,
00687 3,
00688 *ifed,
00689 fed_ch );
00690 uint16_t fed_crate = (*ifed)/16+1;
00691 uint16_t fed_slot = (*ifed)%16+2;
00692 temp.fedCrate( fed_crate );
00693 temp.fedSlot( fed_slot );
00694 fec_cabling.addDevices( temp );
00695 ifed++;
00696
00697 }
00698 module++;
00699 }
00700
00701 }
00702
00703 LogTrace(mlCabling_)
00704 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00705 << " Finished assigning APV pairs in dummy front-end modules to any remaining \"uncabled\" FED ids/channels...";
00706
00707 NumberOfDevices devs3 = fec_cabling.countDevices();
00708 std::stringstream ss3;
00709 ss3 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00710 << " Number of devices in FEC cabling object:" << std::endl;
00711 devs3.print(ss3);
00712 LogTrace(mlCabling_) << ss3.str();
00713
00714
00715
00716 assignDcuAndDetIds( fec_cabling, dcu_detid_vector );
00717
00718 }
00719
00720
00758 void SiStripFedCablingBuilderFromDb::buildFecCablingFromDetIds( SiStripConfigDb* const db,
00759 SiStripFecCabling& fec_cabling ) {
00760 edm::LogVerbatim(mlCabling_)
00761 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00762 << " Building FEC cabling object from DetIds...";
00763
00764
00765
00766
00767
00768
00769 uint32_t chans_per_ccu = 10;
00770 uint32_t ccus_per_ring = 10;
00771 uint32_t rings_per_fec = 8;
00772 uint32_t fecs_per_crate = 11;
00773
00774
00775
00776
00777 LogTrace(mlCabling_)
00778 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00779 << " Retrieving DCU-DetId vector from database...";
00780 SiStripConfigDb::DcuDetIdsRange range = db->getDcuDetIds();
00781 const SiStripConfigDb::DcuDetIdsV dcu_detid_vector( range.begin(), range.end() );
00782 if ( !dcu_detid_vector.empty() ) {
00783 LogTrace(mlCabling_)
00784 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00785 << " Found " << dcu_detid_vector.size()
00786 << " entries in DCU-DetId vector retrieved from database!";
00787 } else {
00788 edm::LogWarning(mlCabling_)
00789 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00790 << " No entries in DCU-DetId vector retrieved from database!"
00791 << " Unable to build FEC cabling!";
00792 return;
00793 }
00794
00795
00796
00797 uint32_t imodule = 0;
00798 SiStripConfigDb::DcuDetIdsV::const_iterator iter;
00799 for ( iter = dcu_detid_vector.begin(); iter != dcu_detid_vector.end(); iter++ ) {
00800
00801 if ( !(iter->second) ) {
00802 edm::LogWarning(mlCabling_)
00803 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00804 << " NULL pointer to TkDcuInfo!";
00805 continue;
00806 }
00807
00808 uint16_t fec_crate = ( imodule / ( chans_per_ccu * ccus_per_ring * rings_per_fec * fecs_per_crate ) ) + 1;
00809 uint16_t fec_slot = ( imodule / ( chans_per_ccu * ccus_per_ring * rings_per_fec ) ) % fecs_per_crate + 2;
00810 uint16_t fec_ring = ( imodule / ( chans_per_ccu * ccus_per_ring ) ) % rings_per_fec + 1;
00811 uint16_t ccu_addr = ( imodule / ( chans_per_ccu) ) % ccus_per_ring + 1;
00812 uint16_t ccu_chan = ( imodule ) % chans_per_ccu + 16;
00813
00814 uint32_t dcu_id = iter->second->getDcuHardId();
00815 uint32_t det_id = iter->second->getDetId();
00816 uint16_t npairs = iter->second->getApvNumber()/2;
00817 uint16_t length = (uint16_t) iter->second->getFibreLength();
00818
00819
00820
00821 if ( !dcu_id ) {
00822 dcu_id = SiStripFecKey( fec_crate,
00823 fec_slot,
00824 fec_ring,
00825 ccu_addr,
00826 ccu_chan ).key();
00827 }
00828 if ( !det_id ) { det_id = 0xFFFF + imodule; }
00829 if ( !npairs ) { npairs = rand()/2 ? 2 : 3; }
00830
00831
00832
00833 for ( uint16_t ipair = 0; ipair < npairs; ipair++ ) {
00834 uint16_t iapv =
00835 ( ipair == 1 && npairs == 2 ) ?
00836 ( iapv = 36 ) :
00837 ( iapv = 32 + 2 * ipair ) ;
00838 FedChannelConnection conn( fec_crate,
00839 fec_slot,
00840 fec_ring,
00841 ccu_addr,
00842 ccu_chan,
00843 iapv, iapv+1,
00844 dcu_id, det_id, npairs,
00845 0, 0,
00846 length,
00847 true, true, true, true );
00848 fec_cabling.addDevices( conn );
00849 }
00850
00851 imodule++;
00852 }
00853
00854
00855
00856 uint32_t fed_id = 50;
00857 uint32_t fed_ch = 0;
00858 for ( vector<SiStripFecCrate>::const_iterator icrate = fec_cabling.crates().begin(); icrate != fec_cabling.crates().end(); icrate++ ) {
00859 for ( vector<SiStripFec>::const_iterator ifec = icrate->fecs().begin(); ifec != icrate->fecs().end(); ifec++ ) {
00860 for ( vector<SiStripRing>::const_iterator iring = ifec->rings().begin(); iring != ifec->rings().end(); iring++ ) {
00861 for ( vector<SiStripCcu>::const_iterator iccu = iring->ccus().begin(); iccu != iring->ccus().end(); iccu++ ) {
00862 for ( vector<SiStripModule>::const_iterator imod = iccu->modules().begin(); imod != iccu->modules().end(); imod++ ) {
00863 if ( 96-fed_ch < imod->nApvPairs() ) { fed_id++; fed_ch = 0; }
00864 for ( uint16_t ipair = 0; ipair < imod->nApvPairs(); ipair++ ) {
00865 pair<uint16_t,uint16_t> addr = imod->activeApvPair( (*imod).lldChannel(ipair) );
00866 SiStripModule::FedChannel fed_channel( (fed_id-50)/16+1,
00867 (fed_id-50)%16+2,
00868 fed_id,
00869 fed_ch );
00870 const_cast<SiStripModule&>(*imod).fedCh( addr.first, fed_channel );
00871 fed_ch++;
00872 }
00873 }
00874 }
00875 }
00876 }
00877 }
00878
00879 }
00880
00881
00883 void SiStripFedCablingBuilderFromDb::assignDcuAndDetIds( SiStripFecCabling& fec_cabling,
00884 std::vector< std::pair<uint32_t,TkDcuInfo*> > in ) {
00885
00886
00887
00888 if ( in.empty() ) {
00889 edm::LogError(mlCabling_)
00890 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00891 << " No entries in DCU-DetId vector!";
00892 }
00893
00894
00895
00896 LogTrace(mlCabling_)
00897 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00898 << " Assigning DCU ids and DetIds to constructed modules...";
00899
00900 uint16_t channels = 0;
00901 uint16_t six = 0;
00902 uint16_t four = 0;
00903 uint16_t unknown = 0;
00904 uint16_t missing = 0;
00905
00906 for ( vector<SiStripFecCrate>::const_iterator icrate = fec_cabling.crates().begin(); icrate != fec_cabling.crates().end(); icrate++ ) {
00907 for ( vector<SiStripFec>::const_iterator ifec = icrate->fecs().begin(); ifec != icrate->fecs().end(); ifec++ ) {
00908 for ( vector<SiStripRing>::const_iterator iring = ifec->rings().begin(); iring != ifec->rings().end(); iring++ ) {
00909 for ( vector<SiStripCcu>::const_iterator iccu = iring->ccus().begin(); iccu != iring->ccus().end(); iccu++ ) {
00910 for ( vector<SiStripModule>::const_iterator imod = iccu->modules().begin(); imod != iccu->modules().end(); imod++ ) {
00911 SiStripModule& module = const_cast<SiStripModule&>(*imod);
00912
00913
00914 module.nApvPairs(0);
00915
00916
00917
00918 if ( !module.dcuId() ) {
00919 SiStripFecKey path( icrate->fecCrate(),
00920 ifec->fecSlot(),
00921 iring->fecRing(),
00922 iccu->ccuAddr(),
00923 imod->ccuChan() );
00924 uint32_t module_key = path.key();
00925 module.dcuId( module_key );
00926 stringstream ss;
00927 ss << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00928 << " Found NULL DcuId! Setting 'dummy' value based control key 0x"
00929 << hex << setw(8) << setfill('0') << module_key << dec;
00930 edm::LogWarning(mlCabling_) << ss.str();
00931 }
00932
00933
00934
00935 if ( !module.detId() ) {
00936
00937
00938
00939 SiStripConfigDb::DcuDetIdsV::iterator iter = in.end();
00940 iter = SiStripConfigDb::findDcuDetId( in.begin(), in.end(), module.dcuId() );
00941 if ( iter != in.end() ) {
00942
00943 if ( !(iter->second) ) {
00944 edm::LogWarning(mlCabling_)
00945 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
00946 << " NULL pointer to TkDcuInfo!";
00947 continue;
00948 }
00949
00950
00951
00952 module.detId( iter->second->getDetId() );
00953 module.nApvPairs(0);
00954
00955
00956 uint16_t pairs = iter->second->getApvNumber()/2;
00957 channels += pairs;
00958 if ( pairs == 2 ) { four++; }
00959 else if ( pairs == 3 ) { six++; }
00960 else { unknown++; }
00961
00962
00963
00964 if ( module.nApvPairs() != 2 && module.nApvPairs() != 3 ) {
00965
00966 missing += ( iter->second->getApvNumber()/2 - module.nApvPairs() );
00967 stringstream ss1;
00968 ss1 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]" << std::endl
00969 << " Module with DCU id 0x"
00970 << hex << setw(8) << setfill('0') << module.dcuId() << dec
00971 << " and DetId 0x"
00972 << hex << setw(8) << setfill('0') << module.detId() << dec
00973 << " has unexpected number of APV pairs ("
00974 << module.nApvPairs() << ")." << std::endl
00975 << " Some APV pairs may have not been detected by the FEC scan." << std::endl
00976 << " Setting to value found in static map ("
00977 << iter->second->getApvNumber()/2 << ")...";
00978 edm::LogWarning(mlCabling_) << ss1.str();
00979 module.nApvPairs( iter->second->getApvNumber()/2 );
00980
00981 } else if ( module.nApvPairs() < iter->second->getApvNumber()/2 ) {
00982
00983 missing += ( iter->second->getApvNumber()/2 - module.nApvPairs() );
00984 stringstream ss2;
00985 ss2 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]" << std::endl
00986 << " Module with DCU id 0x"
00987 << hex << setw(8) << setfill('0') << module.dcuId() << dec
00988 << " and DetId 0x"
00989 << hex << setw(8) << setfill('0') << module.detId() << dec
00990 << " has number of APV pairs ("
00991 << module.nApvPairs()
00992 << ") that does not match value found in DCU-DetId vector ("
00993 << iter->second->getApvNumber()/2 << ")." << std::endl
00994 << " Some APV pairs may have not been detected by"
00995 << " the FEC scan or the DCU-DetId vector may be incorrect." << std::endl
00996 << " Setting to value found in static map ("
00997 << iter->second->getApvNumber()/2 << ")...";
00998 edm::LogWarning(mlCabling_) << ss2.str();
00999 module.nApvPairs( iter->second->getApvNumber()/2 );
01000
01001 }
01002
01003
01004
01005 if ( !module.length() ) {
01006 module.length( static_cast<uint16_t>( iter->second->getFibreLength() ) );
01007 }
01008
01009
01010
01011 in.erase( iter );
01012
01013 }
01014 }
01015
01016 }
01017 }
01018 }
01019 }
01020 }
01021
01022 std::stringstream sss;
01023 sss << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]" << std::endl
01024 << " Connections in DCU-DetId map : " << channels << std::endl
01025 << " 4-APV modules : " << four << std::endl
01026 << " 6-APV modules : " << six << std::endl
01027 << " Unknown number of APV pairs : " << unknown << std::endl
01028 << " Total found APV pairs : " << ( channels - missing ) << std::endl
01029 << " Total missing APV pairs : " << missing << std::endl;
01030 edm::LogVerbatim(mlCabling_) << sss.str();
01031
01032 LogTrace(mlCabling_)
01033 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
01034 << " Finished assigning DCU ids and DetIds to constructed modules...";
01035
01036
01037
01038 LogTrace(mlCabling_)
01039 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
01040 << " Assigning \"random\" DetIds to modules with DCU ids not found in static table...";
01041
01042 uint32_t detid = 0x10000;
01043 for ( vector<SiStripFecCrate>::const_iterator icrate = fec_cabling.crates().begin(); icrate != fec_cabling.crates().end(); icrate++ ) {
01044 for ( vector<SiStripFec>::const_iterator ifec = icrate->fecs().begin(); ifec != icrate->fecs().end(); ifec++ ) {
01045 for ( vector<SiStripRing>::const_iterator iring = ifec->rings().begin(); iring != ifec->rings().end(); iring++ ) {
01046 for ( vector<SiStripCcu>::const_iterator iccu = iring->ccus().begin(); iccu != iring->ccus().end(); iccu++ ) {
01047 for ( vector<SiStripModule>::const_iterator imod = iccu->modules().begin(); imod != iccu->modules().end(); imod++ ) {
01048 SiStripModule& module = const_cast<SiStripModule&>(*imod);
01049
01050
01051
01052 if ( !module.detId() ) {
01053
01054 SiStripConfigDb::DcuDetIdsV::iterator iter = in.end();
01055 iter = SiStripConfigDb::findDcuDetId( in.begin(), in.end(), module.dcuId() );
01056 if ( iter != in.end() ) {
01057
01058
01059
01060 SiStripConfigDb::DcuDetIdsV::iterator idcu;
01061 if ( in.empty() ) { idcu = in.end(); }
01062 else {
01063 idcu = in.begin();
01064 while ( idcu != in.end() ) {
01065 if ( idcu->second ) {
01066 if ( static_cast<uint32_t>(idcu->second->getApvNumber()) ==
01067 static_cast<uint32_t>(2*module.nApvPairs()) ) { break; }
01068 }
01069 idcu++;
01070 }
01071 }
01072
01073
01074
01075 if ( idcu != in.end() ) {
01076
01077 if ( !(idcu->second) ) {
01078 edm::LogWarning(mlCabling_)
01079 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
01080 << " NULL pointer to TkDcuInfo!";
01081 continue;
01082 }
01083
01084 module.detId( idcu->second->getDetId() );
01085 in.erase( idcu );
01086
01087 stringstream ss;
01088 ss << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
01089 << " Did not find module with DCU id 0x"
01090 << hex << setw(8) << setfill('0') << module.dcuId() << dec
01091 << " in DCU-DetId vector!" << endl
01092 << " Assigned 'random' DetId 0x"
01093 << hex << setw(8) << setfill('0') << module.detId() << dec;
01094 edm::LogWarning(mlCabling_) << ss.str();
01095
01096 } else {
01097
01098
01099 module.detId( detid );
01100 detid++;
01101
01102 stringstream ss;
01103 if ( in.empty() ) {
01104 ss << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
01105 << " Did not find module with DCU id 0x"
01106 << hex << setw(8) << setfill('0') << module.dcuId() << dec
01107 << " in DCU-DetId vector!"
01108 << " Could not assign 'random' DetId as DCU-DetID map is empty!"
01109 << " Assigned DetId based on incremented counter, with value 0x"
01110 << hex << setw(8) << setfill('0') << module.detId() << dec;
01111 } else {
01112 ss << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
01113 << " Did not find module with DCU id 0x"
01114 << hex << setw(8) << setfill('0') << module.dcuId() << dec
01115 << " in DCU-DetId vector!"
01116 << " Could not assign 'random' DetId as no modules had appropriate number of APV pairs ("
01117 << module.nApvPairs()
01118 << "). Assigned DetId based on incremented counter, with value 0x"
01119 << hex << setw(8) << setfill('0') << module.detId() << dec;
01120 }
01121 edm::LogWarning(mlCabling_) << ss.str();
01122
01123 }
01124 }
01125
01126 }
01127
01128 }
01129 }
01130 }
01131 }
01132 }
01133
01134 LogTrace(mlCabling_)
01135 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
01136 << " Finished assigning \"random\" DetIds to modules with DCU ids not found in static table...";
01137
01138 LogTrace(mlCabling_)
01139 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
01140 << " Assigning \"random\" DetIds to modules with DCU ids not found in static table...";
01141
01142
01143
01144 if ( !in.empty() ) {
01145 stringstream ss;
01146 ss << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]"
01147 << " Not all DetIds have been assigned to a DcuId! "
01148 << in.size() << " DetIds are unassigned!";
01149 edm::LogWarning(mlCabling_) << ss.str();
01150 }
01151
01152 }
01153
01154
01156 void SiStripFedCablingBuilderFromDb::getFedCabling( const SiStripFecCabling& fec_cabling,
01157 SiStripFedCabling& fed_cabling ) {
01158 vector<FedChannelConnection> conns;
01159 fec_cabling.connections( conns );
01160 fed_cabling.buildFedCabling( conns );
01161 }
01162
01163
01165 void SiStripFedCablingBuilderFromDb::getFecCabling( const SiStripFedCabling& fed_cabling,
01166 SiStripFecCabling& fec_cabling ) {
01167 fec_cabling.buildFecCabling( fed_cabling );
01168 }
01169
01170
01171
01172 void SiStripFedCablingBuilderFromDb::setIntervalFor( const edm::eventsetup::EventSetupRecordKey& key,
01173 const edm::IOVSyncValue& iov_sync,
01174 edm::ValidityInterval& iov_validity ) {
01175 edm::ValidityInterval infinity( iov_sync.beginOfTime(), iov_sync.endOfTime() );
01176 iov_validity = infinity;
01177 }
01178