00001
00002
00003 #include "DataFormats/SiStripCommon/interface/SiStripFecKey.h"
00004 #include "DataFormats/SiStripCommon/interface/SiStripNullKey.h"
00005 #include "DataFormats/SiStripCommon/interface/Constants.h"
00006 #include "DataFormats/SiStripCommon/interface/ConstantsForHardwareSystems.h"
00007 #include "DataFormats/SiStripCommon/interface/ConstantsForDqm.h"
00008 #include "DataFormats/SiStripCommon/interface/ConstantsForView.h"
00009 #include "DataFormats/SiStripCommon/interface/SiStripEnumsAndStrings.h"
00010 #include <iomanip>
00011
00012
00013
00014 SiStripFecKey::SiStripFecKey( const uint16_t& fec_crate,
00015 const uint16_t& fec_slot,
00016 const uint16_t& fec_ring,
00017 const uint16_t& ccu_addr,
00018 const uint16_t& ccu_chan,
00019 const uint16_t& lld_chan,
00020 const uint16_t& i2c_addr ) :
00021 SiStripKey(),
00022 fecCrate_(fec_crate),
00023 fecSlot_(fec_slot),
00024 fecRing_(fec_ring),
00025 ccuAddr_(ccu_addr),
00026 ccuChan_(ccu_chan),
00027 lldChan_(lld_chan),
00028 i2cAddr_(i2c_addr)
00029 {
00030
00031 initFromValue();
00032 initFromKey();
00033 initFromPath();
00034 initGranularity();
00035 }
00036
00037
00038
00039 SiStripFecKey::SiStripFecKey( const uint32_t& fec_key ) :
00040 SiStripKey(fec_key),
00041 fecCrate_(sistrip::invalid_),
00042 fecSlot_(sistrip::invalid_),
00043 fecRing_(sistrip::invalid_),
00044 ccuAddr_(sistrip::invalid_),
00045 ccuChan_(sistrip::invalid_),
00046 lldChan_(sistrip::invalid_),
00047 i2cAddr_(sistrip::invalid_)
00048 {
00049
00050 initFromKey();
00051 initFromValue();
00052 initFromPath();
00053 initGranularity();
00054 }
00055
00056
00057
00058 SiStripFecKey::SiStripFecKey( const std::string& path ) :
00059 SiStripKey(path),
00060 fecCrate_(sistrip::invalid_),
00061 fecSlot_(sistrip::invalid_),
00062 fecRing_(sistrip::invalid_),
00063 ccuAddr_(sistrip::invalid_),
00064 ccuChan_(sistrip::invalid_),
00065 lldChan_(sistrip::invalid_),
00066 i2cAddr_(sistrip::invalid_)
00067 {
00068
00069 initFromPath();
00070 initFromValue();
00071 initFromKey();
00072 initGranularity();
00073 }
00074
00075
00076
00077 SiStripFecKey::SiStripFecKey( const SiStripFecKey& input ) :
00078 SiStripKey(),
00079 fecCrate_(input.fecCrate()),
00080 fecSlot_(input.fecSlot()),
00081 fecRing_(input.fecRing()),
00082 ccuAddr_(input.ccuAddr()),
00083 ccuChan_(input.ccuChan()),
00084 lldChan_(input.lldChan()),
00085 i2cAddr_(input.i2cAddr())
00086 {
00087 key(input.key());
00088 path(input.path());
00089 granularity(input.granularity());
00090 }
00091
00092
00093
00094 SiStripFecKey::SiStripFecKey( const SiStripKey& input ) :
00095 SiStripKey(),
00096 fecCrate_(sistrip::invalid_),
00097 fecSlot_(sistrip::invalid_),
00098 fecRing_(sistrip::invalid_),
00099 ccuAddr_(sistrip::invalid_),
00100 ccuChan_(sistrip::invalid_),
00101 lldChan_(sistrip::invalid_),
00102 i2cAddr_(sistrip::invalid_)
00103 {
00104 const SiStripFecKey& fec_key = dynamic_cast<const SiStripFecKey&>(input);
00105 if ( (&fec_key) ) {
00106 key(fec_key.key());
00107 path(fec_key.path());
00108 granularity(fec_key.granularity());
00109 fecCrate_ = fec_key.fecCrate();
00110 fecSlot_ = fec_key.fecSlot();
00111 fecRing_ = fec_key.fecRing();
00112 ccuAddr_ = fec_key.ccuAddr();
00113 ccuChan_ = fec_key.ccuChan();
00114 lldChan_ = fec_key.lldChan();
00115 i2cAddr_ = fec_key.i2cAddr();
00116 }
00117 }
00118
00119
00120
00121 SiStripFecKey::SiStripFecKey( const SiStripKey& input,
00122 const sistrip::Granularity& gran ) :
00123 SiStripKey(),
00124 fecCrate_(0),
00125 fecSlot_(0),
00126 fecRing_(0),
00127 ccuAddr_(0),
00128 ccuChan_(0),
00129 lldChan_(0),
00130 i2cAddr_(0)
00131 {
00132 const SiStripFecKey& fec_key = dynamic_cast<const SiStripFecKey&>(input);
00133 if ( (&fec_key) ) {
00134
00135 if ( gran == sistrip::FEC_CRATE || gran == sistrip::FEC_SLOT ||
00136 gran == sistrip::FEC_RING || gran == sistrip::CCU_ADDR ||
00137 gran == sistrip::CCU_CHAN || gran == sistrip::LLD_CHAN ||
00138 gran == sistrip::APV ) {
00139 fecCrate_ = fec_key.fecCrate();
00140 }
00141
00142 if ( gran == sistrip::FEC_SLOT || gran == sistrip::FEC_RING ||
00143 gran == sistrip::CCU_ADDR || gran == sistrip::CCU_CHAN ||
00144 gran == sistrip::LLD_CHAN || gran == sistrip::APV ) {
00145 fecSlot_ = fec_key.fecSlot();
00146 }
00147
00148 if ( gran == sistrip::FEC_RING || gran == sistrip::CCU_ADDR ||
00149 gran == sistrip::CCU_CHAN || gran == sistrip::LLD_CHAN ||
00150 gran == sistrip::APV ) {
00151 fecRing_ = fec_key.fecRing();
00152 }
00153
00154 if ( gran == sistrip::CCU_ADDR || gran == sistrip::CCU_CHAN ||
00155 gran == sistrip::LLD_CHAN || gran == sistrip::APV ) {
00156 ccuAddr_ = fec_key.ccuAddr();
00157 }
00158
00159 if ( gran == sistrip::CCU_CHAN || gran == sistrip::LLD_CHAN ||
00160 gran == sistrip::APV ) {
00161 ccuChan_ = fec_key.ccuChan();
00162 }
00163
00164 if ( gran == sistrip::LLD_CHAN || gran == sistrip::APV ) {
00165 lldChan_ = fec_key.lldChan();
00166 }
00167
00168 if ( gran == sistrip::APV ) {
00169 i2cAddr_ = fec_key.i2cAddr();
00170 }
00171
00172 initFromValue();
00173 initFromKey();
00174 initFromPath();
00175 initGranularity();
00176
00177 }
00178
00179 }
00180
00181
00182
00183 SiStripFecKey::SiStripFecKey() :
00184 SiStripKey(),
00185 fecCrate_(sistrip::invalid_),
00186 fecSlot_(sistrip::invalid_),
00187 fecRing_(sistrip::invalid_),
00188 ccuAddr_(sistrip::invalid_),
00189 ccuChan_(sistrip::invalid_),
00190 lldChan_(sistrip::invalid_),
00191 i2cAddr_(sistrip::invalid_)
00192 {;}
00193
00194
00195
00196 uint16_t SiStripFecKey::hybridPos( const uint16_t& i2c_addr ) {
00197 if ( i2c_addr < sistrip::APV_I2C_MIN ||
00198 i2c_addr > sistrip::APV_I2C_MAX ) {
00199 return sistrip::invalid_;
00200 }
00201 return ( i2c_addr - sistrip::APV_I2C_MIN + 1 );
00202 }
00203
00204
00205
00206 uint16_t SiStripFecKey::i2cAddr( const uint16_t& hybrid_pos ) {
00207 if ( !hybrid_pos ||
00208 hybrid_pos >
00209 ( sistrip::APV_I2C_MAX -
00210 sistrip::APV_I2C_MIN + 1 ) ) {
00211 return sistrip::invalid_;
00212 }
00213 return ( hybrid_pos + sistrip::APV_I2C_MIN - 1 );
00214 }
00215
00216
00217
00218 uint16_t SiStripFecKey::i2cAddr( const uint16_t& lld_chan,
00219 const bool& first_apv ) {
00220 if ( lld_chan < sistrip::LLD_CHAN_MIN ||
00221 lld_chan > sistrip::LLD_CHAN_MAX ) {
00222 return sistrip::invalid_;
00223 }
00224 return ( sistrip::APV_I2C_MIN + lld_chan * sistrip::APVS_PER_CHAN - (first_apv?2:1) );
00225 }
00226
00227
00228
00229 uint16_t SiStripFecKey::lldChan( const uint16_t& i2c_addr ) {
00230 if ( i2c_addr == 0 ) { return 0; }
00231 else if ( i2c_addr < sistrip::APV_I2C_MIN ||
00232 i2c_addr > sistrip::APV_I2C_MAX ) {
00233 return sistrip::invalid_;
00234 }
00235 return ( ( i2c_addr - sistrip::APV_I2C_MIN ) / 2 + 1 );
00236 }
00237
00238
00239
00240 bool SiStripFecKey::firstApvOfPair( const uint16_t& i2c_addr ) {
00241 if ( i2c_addr < sistrip::APV_I2C_MIN ||
00242 i2c_addr > sistrip::APV_I2C_MAX ) {
00243 return sistrip::invalid_;
00244 }
00245 return ( ( ( i2c_addr - sistrip::APV_I2C_MIN ) % 2 ) == 0 );
00246 }
00247
00248
00249
00250 bool SiStripFecKey::isEqual( const SiStripKey& key ) const {
00251 const SiStripFecKey& input = dynamic_cast<const SiStripFecKey&>(key);
00252 if ( !(&input) ) { return false; }
00253 if ( fecCrate_ == input.fecCrate() &&
00254 fecSlot_ == input.fecSlot() &&
00255 fecRing_ == input.fecRing() &&
00256 ccuAddr_ == input.ccuAddr() &&
00257 ccuChan_ == input.ccuChan() &&
00258 lldChan_ == input.lldChan() &&
00259 i2cAddr_ == input.i2cAddr() ) {
00260 return true;
00261 } else { return false; }
00262 }
00263
00264
00265
00266 bool SiStripFecKey::isConsistent( const SiStripKey& key ) const {
00267 const SiStripFecKey& input = dynamic_cast<const SiStripFecKey&>(key);
00268 if ( !(&input) ) { return false; }
00269 if ( isEqual(input) ) { return true; }
00270 else if ( ( fecCrate_ == 0 || input.fecCrate() == 0 ) &&
00271 ( fecSlot_ == 0 || input.fecSlot() == 0 ) &&
00272 ( fecRing_ == 0 || input.fecRing() == 0 ) &&
00273 ( ccuAddr_ == 0 || input.ccuAddr() == 0 ) &&
00274 ( lldChan_ == 0 || input.lldChan() == 0 ) &&
00275 ( i2cAddr_ == 0 || input.i2cAddr() == 0 ) ) {
00276 return true;
00277 } else { return false; }
00278 }
00279
00280
00281
00282 bool SiStripFecKey::isValid() const {
00283 return isValid(sistrip::APV);
00284 }
00285
00286
00287
00288 bool SiStripFecKey::isValid( const sistrip::Granularity& gran ) const {
00289 if ( gran == sistrip::FEC_SYSTEM ) { return true; }
00290 else if ( gran == sistrip::UNDEFINED_GRAN ||
00291 gran == sistrip::UNKNOWN_GRAN ) { return false; }
00292
00293 if ( fecCrate_ != sistrip::invalid_ ) {
00294 if ( gran == sistrip::FEC_CRATE ) { return true; }
00295 if ( fecSlot_ != sistrip::invalid_ ) {
00296 if ( gran == sistrip::FEC_RING ) { return true; }
00297 if ( fecRing_ != sistrip::invalid_ ) {
00298 if ( gran == sistrip::FEC_RING ) { return true; }
00299 if ( ccuAddr_ != sistrip::invalid_ ) {
00300 if ( gran == sistrip::CCU_ADDR ) { return true; }
00301 if ( ccuChan_ != sistrip::invalid_ ) {
00302 if ( gran == sistrip::CCU_CHAN ) { return true; }
00303 if ( lldChan_ != sistrip::invalid_ ) {
00304 if ( gran == sistrip::LLD_CHAN ) { return true; }
00305 if ( i2cAddr_ != sistrip::invalid_ ) {
00306 if ( gran == sistrip::APV ) { return true; }
00307 }
00308 }
00309 }
00310 }
00311 }
00312 }
00313 }
00314 return false;
00315 }
00316
00317
00318
00319 bool SiStripFecKey::isInvalid() const {
00320 return isInvalid(sistrip::APV);
00321 }
00322
00323
00324
00325 bool SiStripFecKey::isInvalid( const sistrip::Granularity& gran ) const {
00326 if ( gran == sistrip::FEC_SYSTEM ) { return false; }
00327 else if ( gran == sistrip::UNDEFINED_GRAN ||
00328 gran == sistrip::UNKNOWN_GRAN ) { return false; }
00329
00330 if ( fecCrate_ == sistrip::invalid_ ) {
00331 if ( gran == sistrip::FEC_CRATE ) { return true; }
00332 if ( fecSlot_ == sistrip::invalid_ ) {
00333 if ( gran == sistrip::FEC_RING ) { return true; }
00334 if ( fecRing_ == sistrip::invalid_ ) {
00335 if ( gran == sistrip::FEC_RING ) { return true; }
00336 if ( ccuAddr_ == sistrip::invalid_ ) {
00337 if ( gran == sistrip::CCU_ADDR ) { return true; }
00338 if ( ccuChan_ == sistrip::invalid_ ) {
00339 if ( gran == sistrip::CCU_CHAN ) { return true; }
00340 if ( lldChan_ == sistrip::invalid_ ) {
00341 if ( gran == sistrip::LLD_CHAN ) { return true; }
00342 if ( i2cAddr_ == sistrip::invalid_ ) {
00343 if ( gran == sistrip::APV ) { return true; }
00344 }
00345 }
00346 }
00347 }
00348 }
00349 }
00350 }
00351 return false;
00352 }
00353
00354
00355
00356 void SiStripFecKey::initFromValue() {
00357
00358
00359 if ( fecCrate_ >= sistrip::FEC_CRATE_MIN &&
00360 fecCrate_ <= sistrip::FEC_CRATE_MAX ) {
00361 fecCrate_ = fecCrate_;
00362 } else if ( fecCrate_ == 0 ) {
00363 fecCrate_ = 0;
00364 } else { fecCrate_ = sistrip::invalid_; }
00365
00366
00367 if ( fecSlot_ >= sistrip::CRATE_SLOT_MIN &&
00368 fecSlot_ <= sistrip::CRATE_SLOT_MAX ) {
00369 fecSlot_ = fecSlot_;
00370 } else if ( fecSlot_ == 0 ) {
00371 fecSlot_ = 0;
00372 } else { fecSlot_ = sistrip::invalid_; }
00373
00374
00375 if ( fecRing_ >= sistrip::FEC_RING_MIN &&
00376 fecRing_ <= sistrip::FEC_RING_MAX ) {
00377 fecRing_ = fecRing_;
00378 } else if ( fecRing_ == 0 ) {
00379 fecRing_ = 0;
00380 } else { fecRing_ = sistrip::invalid_; }
00381
00382
00383 if ( ccuAddr_ >= sistrip::CCU_ADDR_MIN &&
00384 ccuAddr_ <= sistrip::CCU_ADDR_MAX ) {
00385 ccuAddr_ = ccuAddr_;
00386 } else if ( ccuAddr_ == 0 ) {
00387 ccuAddr_ = 0;
00388 } else { ccuAddr_ = sistrip::invalid_; }
00389
00390
00391 if ( ccuChan_ >= sistrip::CCU_CHAN_MIN &&
00392 ccuChan_ <= sistrip::CCU_CHAN_MAX ) {
00393 ccuChan_ = ccuChan_;
00394 } else if ( ccuChan_ == 0 ) {
00395 ccuChan_ = 0;
00396 } else { ccuChan_ = sistrip::invalid_; }
00397
00398
00399 if ( lldChan_ >= sistrip::LLD_CHAN_MIN &&
00400 lldChan_ <= sistrip::LLD_CHAN_MAX ) {
00401 lldChan_ = lldChan_;
00402 } else if ( lldChan_ == 0 ) {
00403 lldChan_ = 0;
00404 } else { lldChan_ = sistrip::invalid_; }
00405
00406
00407 if ( i2cAddr_ >= sistrip::APV_I2C_MIN &&
00408 i2cAddr_ <= sistrip::APV_I2C_MAX ) {
00409 i2cAddr_ = i2cAddr_;
00410 if ( lldChan_ && lldChan( i2cAddr_ ) != lldChan_ ) {
00411 i2cAddr_ = sistrip::invalid_;
00412 key( key() | (i2cAddrMask_<<i2cAddrOffset_) );
00413 }
00414 } else if ( i2cAddr_ == 0 ) {
00415 i2cAddr_ = 0;
00416 } else { i2cAddr_ = sistrip::invalid_; }
00417
00418 }
00419
00420
00421
00422 void SiStripFecKey::initFromKey() {
00423
00424 if ( key() == sistrip::invalid32_ ) {
00425
00426
00427
00428
00429 key(0);
00430
00431
00432 if ( fecCrate_ >= sistrip::FEC_CRATE_MIN &&
00433 fecCrate_ <= sistrip::FEC_CRATE_MAX ) {
00434 key( key() | (fecCrate_<<fecCrateOffset_) );
00435 } else if ( fecCrate_ == 0 ) {
00436 key( key() | (fecCrate_<<fecCrateOffset_) );
00437 } else {
00438 key( key() | (fecCrateMask_<<fecCrateOffset_) );
00439 }
00440
00441
00442 if ( fecSlot_ >= sistrip::CRATE_SLOT_MIN &&
00443 fecSlot_ <= sistrip::CRATE_SLOT_MAX ) {
00444 key( key() | (fecSlot_<<fecSlotOffset_) );
00445 } else if ( fecSlot_ == 0 ) {
00446 key( key() | (fecSlot_<<fecSlotOffset_) );
00447 } else {
00448 key( key() | (fecSlotMask_<<fecSlotOffset_) );
00449 }
00450
00451
00452 if ( fecRing_ >= sistrip::FEC_RING_MIN &&
00453 fecRing_ <= sistrip::FEC_RING_MAX ) {
00454 key( key() | (fecRing_<<fecRingOffset_) );
00455 } else if ( fecRing_ == 0 ) {
00456 key( key() | (fecRing_<<fecRingOffset_) );
00457 } else {
00458 key( key() | (fecRingMask_<<fecRingOffset_) );
00459 }
00460
00461
00462 if ( ccuAddr_ >= sistrip::CCU_ADDR_MIN &&
00463 ccuAddr_ <= sistrip::CCU_ADDR_MAX ) {
00464 key( key() | (ccuAddr_<<ccuAddrOffset_) );
00465 } else if ( ccuAddr_ == 0 ) {
00466 key( key() | (ccuAddr_<<ccuAddrOffset_) );
00467 } else {
00468 key( key() | (ccuAddrMask_<<ccuAddrOffset_) );
00469 }
00470
00471
00472 if ( ccuChan_ >= sistrip::CCU_CHAN_MIN &&
00473 ccuChan_ <= sistrip::CCU_CHAN_MAX ) {
00474 key( key() | ( (ccuChan_-(sistrip::CCU_CHAN_MIN-1)) << ccuChanOffset_ ) );
00475 } else if ( ccuChan_ == 0 ) {
00476 key( key() | (ccuChan_<<ccuChanOffset_) );
00477 } else {
00478 key( key() | (ccuChanMask_<<ccuChanOffset_) );
00479 }
00480
00481
00482 if ( lldChan_ >= sistrip::LLD_CHAN_MIN &&
00483 lldChan_ <= sistrip::LLD_CHAN_MAX ) {
00484 key( key() | (lldChan_<<lldChanOffset_) );
00485 } else if ( lldChan_ == 0 ) {
00486 key( key() | (lldChan_<<lldChanOffset_) );
00487 } else {
00488 key( key() | (lldChanMask_<<lldChanOffset_) );
00489 }
00490
00491
00492 if ( i2cAddr_ >= sistrip::APV_I2C_MIN &&
00493 i2cAddr_ <= sistrip::APV_I2C_MAX ) {
00494 key( key() | ( ( firstApvOfPair( i2cAddr_ ) ? 1 : 2 ) << i2cAddrOffset_ ) );
00495 if ( lldChan_ && lldChan( i2cAddr_ ) != lldChan_ ) {
00496 i2cAddr_ = sistrip::invalid_;
00497 key( key() | (i2cAddrMask_<<i2cAddrOffset_) );
00498 }
00499 } else if ( i2cAddr_ == 0 ) {
00500 key( key() | (i2cAddr_<<i2cAddrOffset_) );
00501 } else {
00502 key( key() | (i2cAddrMask_<<i2cAddrOffset_) );
00503 }
00504
00505 } else {
00506
00507
00508
00509 fecCrate_ = ( key()>>fecCrateOffset_ ) & fecCrateMask_;
00510 fecSlot_ = ( key()>>fecSlotOffset_ ) & fecSlotMask_;
00511 fecRing_ = ( key()>>fecRingOffset_ ) & fecRingMask_;
00512 ccuAddr_ = ( key()>>ccuAddrOffset_ ) & ccuAddrMask_;
00513 ccuChan_ = ( key()>>ccuChanOffset_ ) & ccuChanMask_;
00514 lldChan_ = ( key()>>lldChanOffset_ ) & lldChanMask_;
00515 i2cAddr_ = ( key()>>i2cAddrOffset_ ) & i2cAddrMask_;
00516
00517 if ( fecCrate_ == fecCrateMask_ ) { fecCrate_ = sistrip::invalid_; }
00518 if ( fecSlot_ == fecSlotMask_ ) { fecSlot_ = sistrip::invalid_; }
00519 if ( fecRing_ == fecRingMask_ ) { fecRing_ = sistrip::invalid_; }
00520 if ( ccuAddr_ == ccuAddrMask_ ) { ccuAddr_ = sistrip::invalid_; }
00521 if ( ccuChan_ == ccuChanMask_ ) { ccuChan_ = sistrip::invalid_; }
00522 else if ( ccuChan_ ) { ccuChan_ += (sistrip::CCU_CHAN_MIN-1); }
00523 if ( lldChan_ == lldChanMask_ ) { lldChan_ = sistrip::invalid_; }
00524 if ( i2cAddr_ == i2cAddrMask_ ) { i2cAddr_ = sistrip::invalid_; }
00525 else if ( i2cAddr_ && lldChan_ != lldChanMask_ ) { i2cAddr_ = i2cAddr( lldChan_, 2-i2cAddr_ ); }
00526
00527 }
00528
00529 }
00530
00531
00532
00533 void SiStripFecKey::initFromPath() {
00534
00535 if ( path() == sistrip::null_ ) {
00536
00537
00538
00539 std::stringstream dir;
00540
00541 dir << sistrip::root_ << sistrip::dir_
00542 << sistrip::controlView_ << sistrip::dir_;
00543
00544
00545 if ( fecCrate_ ) {
00546 dir << sistrip::fecCrate_ << fecCrate_ << sistrip::dir_;
00547
00548
00549 if ( fecSlot_ ) {
00550 dir << sistrip::fecSlot_ << fecSlot_ << sistrip::dir_;
00551
00552
00553 if ( fecRing_ ) {
00554 dir << sistrip::fecRing_ << fecRing_ << sistrip::dir_;
00555
00556
00557 if ( ccuAddr_ ) {
00558 dir << sistrip::ccuAddr_ << ccuAddr_ << sistrip::dir_;
00559
00560
00561 if ( ccuChan_ ) {
00562 dir << sistrip::ccuChan_ << ccuChan_ << sistrip::dir_;
00563
00564
00565 if ( lldChan_ ) {
00566 dir << sistrip::lldChan_ << lldChan_ << sistrip::dir_;
00567
00568
00569 if ( i2cAddr_ ) {
00570 dir << sistrip::apv_ << i2cAddr_ << sistrip::dir_;
00571 }
00572 }
00573 }
00574 }
00575 }
00576 }
00577 }
00578
00579 std::string temp( dir.str() );
00580 path( temp );
00581
00582 } else {
00583
00584
00585
00586 fecCrate_ = 0;
00587 fecSlot_ = 0;
00588 fecRing_ = 0;
00589 ccuAddr_ = 0;
00590 ccuChan_ = 0;
00591 lldChan_ = 0;
00592 i2cAddr_ = 0;
00593
00594
00595 if ( path().find( sistrip::root_ ) == std::string::npos ) {
00596 std::string temp = path();
00597 path( std::string(sistrip::root_) + sistrip::dir_ + temp );
00598 }
00599
00600 size_t curr = 0;
00601 size_t next = 0;
00602 next = path().find( sistrip::controlView_, curr );
00603
00604
00605 curr = next;
00606 if ( curr != std::string::npos ) {
00607 next = path().find( sistrip::fecCrate_, curr );
00608 std::string control_view( path(),
00609 curr+(sizeof(sistrip::controlView_) - 1),
00610 next-(sizeof(sistrip::dir_) - 1)-curr );
00611
00612
00613 curr = next;
00614 if ( curr != std::string::npos ) {
00615 next = path().find( sistrip::fecSlot_, curr );
00616 std::string fec_crate( path(),
00617 curr+(sizeof(sistrip::fecCrate_) - 1),
00618 next-(sizeof(sistrip::dir_) - 1)-curr );
00619 fecCrate_ = std::atoi( fec_crate.c_str() );
00620
00621
00622 curr = next;
00623 if ( curr != std::string::npos ) {
00624 next = path().find( sistrip::fecRing_, curr );
00625 std::string fec_slot( path(),
00626 curr+(sizeof(sistrip::fecSlot_) - 1),
00627 next-(sizeof(sistrip::dir_) - 1)-curr );
00628 fecSlot_ = std::atoi( fec_slot.c_str() );
00629
00630
00631 curr = next;
00632 if ( curr != std::string::npos ) {
00633 next = path().find( sistrip::ccuAddr_, curr );
00634 std::string fec_ring( path(),
00635 curr+(sizeof(sistrip::fecRing_) - 1),
00636 next-(sizeof(sistrip::dir_) - 1)-curr );
00637 fecRing_ = std::atoi( fec_ring.c_str() );
00638
00639
00640 curr = next;
00641 if ( curr != std::string::npos ) {
00642 next = path().find( sistrip::ccuChan_, curr );
00643 std::string ccu_addr( path(),
00644 curr+(sizeof(sistrip::ccuAddr_) - 1),
00645 next-(sizeof(sistrip::dir_) - 1)-curr );
00646 ccuAddr_ = std::atoi( ccu_addr.c_str() );
00647
00648
00649 curr = next;
00650 if ( curr != std::string::npos ) {
00651 next = path().find( sistrip::lldChan_, curr );
00652 std::string ccu_chan( path(),
00653 curr+(sizeof(sistrip::ccuChan_) - 1),
00654 next-(sizeof(sistrip::dir_) - 1)-curr );
00655 ccuChan_ = std::atoi( ccu_chan.c_str() );
00656
00657
00658 curr = next;
00659 if ( curr != std::string::npos ) {
00660 next = path().find( sistrip::apv_, curr );
00661 std::string lld_chan( path(),
00662 curr+(sizeof(sistrip::lldChan_) - 1),
00663 next-(sizeof(sistrip::dir_) - 1)-curr );
00664 lldChan_ = std::atoi( lld_chan.c_str() );
00665
00666
00667 curr = next;
00668 if ( curr != std::string::npos ) {
00669 next = std::string::npos;
00670 std::string i2c_addr( path(),
00671 curr+(sizeof(sistrip::apv_) - 1),
00672 next-curr );
00673 i2cAddr_ = std::atoi( i2c_addr.c_str() );
00674 }
00675 }
00676 }
00677 }
00678 }
00679 }
00680 }
00681 } else {
00682 std::stringstream ss;
00683 ss << sistrip::root_ << sistrip::dir_;
00684
00685
00686 std::string temp( ss.str() );
00687 path( temp );
00688 }
00689
00690 }
00691
00692 }
00693
00694
00695
00696 void SiStripFecKey::initGranularity() {
00697
00698 granularity( sistrip::FEC_SYSTEM );
00699 channel(0);
00700 if ( fecCrate_ && fecCrate_ != sistrip::invalid_ ) {
00701 granularity( sistrip::FEC_CRATE );
00702 channel(fecCrate_);
00703 if ( fecSlot_ && fecSlot_ != sistrip::invalid_ ) {
00704 granularity( sistrip::FEC_SLOT );
00705 channel(fecSlot_);
00706 if ( fecRing_ && fecRing_ != sistrip::invalid_ ) {
00707 granularity( sistrip::FEC_RING );
00708 channel(fecRing_);
00709 if ( ccuAddr_ && ccuAddr_ != sistrip::invalid_ ) {
00710 granularity( sistrip::CCU_ADDR );
00711 channel(ccuAddr_);
00712 if ( ccuChan_ && ccuChan_ != sistrip::invalid_ ) {
00713 granularity( sistrip::CCU_CHAN );
00714 channel(ccuChan_);
00715 if ( lldChan_ && lldChan_ != sistrip::invalid_ ) {
00716 granularity( sistrip::LLD_CHAN );
00717 channel(lldChan_);
00718 if ( i2cAddr_ && i2cAddr_ != sistrip::invalid_ ) {
00719 granularity( sistrip::APV );
00720 channel(i2cAddr_);
00721 } else if ( i2cAddr_ == sistrip::invalid_ ) {
00722 granularity( sistrip::UNKNOWN_GRAN );
00723 channel(sistrip::invalid_);
00724 }
00725 } else if ( lldChan_ == sistrip::invalid_ ) {
00726 granularity( sistrip::UNKNOWN_GRAN );
00727 channel(sistrip::invalid_);
00728 }
00729 } else if ( ccuChan_ == sistrip::invalid_ ) {
00730 granularity( sistrip::UNKNOWN_GRAN );
00731 channel(sistrip::invalid_);
00732 }
00733 } else if ( ccuAddr_ == sistrip::invalid_ ) {
00734 granularity( sistrip::UNKNOWN_GRAN );
00735 channel(sistrip::invalid_);
00736 }
00737 } else if ( fecRing_ == sistrip::invalid_ ) {
00738 granularity( sistrip::UNKNOWN_GRAN );
00739 channel(sistrip::invalid_);
00740 }
00741 } else if ( fecSlot_ == sistrip::invalid_ ) {
00742 granularity( sistrip::UNKNOWN_GRAN );
00743 channel(sistrip::invalid_);
00744 }
00745 } else if ( fecCrate_ == sistrip::invalid_ ) {
00746 granularity( sistrip::UNKNOWN_GRAN );
00747 channel(sistrip::invalid_);
00748 }
00749
00750 }
00751
00752
00753
00754 void SiStripFecKey::terse( std::stringstream& ss ) const {
00755 ss << "FEC:crate/slot/ring/CCU/module/LLD/I2C= "
00756 << fecCrate() << "/"
00757 << fecSlot() << "/"
00758 << fecRing() << "/"
00759 << ccuAddr() << "/"
00760 << ccuChan() << "/"
00761 << lldChan() << "/"
00762 << i2cAddr();
00763
00764
00765
00766
00767
00768
00769
00770
00771
00772
00773
00774
00775
00776 }
00777
00778
00779
00780 void SiStripFecKey::print( std::stringstream& ss ) const {
00781 ss << " [SiStripFecKey::print]" << std::endl
00782 << std::hex
00783 << " FEC key : 0x"
00784 << std::setfill('0')
00785 << std::setw(8) << key() << std::endl
00786 << std::setfill(' ')
00787 << std::dec
00788 << " FEC VME crate : " << fecCrate() << std::endl
00789 << " FEC VME slot : " << fecSlot() << std::endl
00790 << " FEC control ring : " << fecRing() << std::endl
00791 << " CCU I2C address : " << ccuAddr() << std::endl
00792 << " CCU chan (FE module) : " << ccuChan() << std::endl
00793 << " LaserDriver channel : " << lldChan() << std::endl
00794 << " APV I2C address : " << i2cAddr() << std::endl
00795 << " Directory : " << path() << std::endl
00796 << " Granularity : "
00797 << SiStripEnumsAndStrings::granularity( granularity() ) << std::endl
00798 << " Channel : " << channel() << std::endl
00799 << " isValid : " << isValid();
00800 }
00801
00802
00803
00804 std::ostream& operator<< ( std::ostream& os, const SiStripFecKey& input ) {
00805 std::stringstream ss;
00806 input.print(ss);
00807 os << ss.str();
00808 return os;
00809 }
00810
00811
00812
00813 ConsistentWithKey::ConsistentWithKey( const SiStripFecKey& key )
00814 : mask_( key.fecCrate() ? sistrip::invalid_ : 0,
00815 key.fecSlot() ? sistrip::invalid_ : 0,
00816 key.fecRing() ? sistrip::invalid_ : 0,
00817 key.ccuAddr() ? sistrip::invalid_ : 0,
00818 key.ccuChan() ? sistrip::invalid_ : 0,
00819 key.lldChan() ? sistrip::invalid_ : 0,
00820 key.i2cAddr() ? sistrip::invalid_ : 0 ) {;}
00821
00822
00823
00824 ConsistentWithKey::ConsistentWithKey()
00825 : mask_(SiStripNullKey()) {;}
00826
00827
00828
00829 bool ConsistentWithKey::operator() ( const uint32_t& a, const uint32_t& b ) const {
00830 return ( ( a & mask_.key() ) < ( b & mask_.key() ) );
00831 }