File indexing completed on 2023-03-17 10:51:23
0001
0002 #include "DataFormats/SiStripCommon/interface/SiStripFecKey.h"
0003 #include "DataFormats/SiStripCommon/interface/SiStripNullKey.h"
0004 #include "DataFormats/SiStripCommon/interface/Constants.h"
0005 #include "DataFormats/SiStripCommon/interface/ConstantsForHardwareSystems.h"
0006 #include "DataFormats/SiStripCommon/interface/ConstantsForDqm.h"
0007 #include "DataFormats/SiStripCommon/interface/ConstantsForView.h"
0008 #include "DataFormats/SiStripCommon/interface/SiStripEnumsAndStrings.h"
0009 #include <iomanip>
0010
0011
0012
0013 SiStripFecKey::SiStripFecKey(const uint16_t& fec_crate,
0014 const uint16_t& fec_slot,
0015 const uint16_t& fec_ring,
0016 const uint16_t& ccu_addr,
0017 const uint16_t& ccu_chan,
0018 const uint16_t& lld_chan,
0019 const uint16_t& i2c_addr)
0020 : SiStripKey(),
0021 fecCrate_(fec_crate),
0022 fecSlot_(fec_slot),
0023 fecRing_(fec_ring),
0024 ccuAddr_(ccu_addr),
0025 ccuChan_(ccu_chan),
0026 lldChan_(lld_chan),
0027 i2cAddr_(i2c_addr) {
0028
0029 initFromValue();
0030 initFromKey();
0031 initFromPath();
0032 initGranularity();
0033 }
0034
0035
0036
0037 SiStripFecKey::SiStripFecKey(const uint32_t& fec_key)
0038 : SiStripKey(fec_key),
0039 fecCrate_(sistrip::invalid_),
0040 fecSlot_(sistrip::invalid_),
0041 fecRing_(sistrip::invalid_),
0042 ccuAddr_(sistrip::invalid_),
0043 ccuChan_(sistrip::invalid_),
0044 lldChan_(sistrip::invalid_),
0045 i2cAddr_(sistrip::invalid_) {
0046
0047 initFromKey();
0048 initFromValue();
0049 initFromPath();
0050 initGranularity();
0051 }
0052
0053
0054
0055 SiStripFecKey::SiStripFecKey(const std::string& path)
0056 : SiStripKey(path),
0057 fecCrate_(sistrip::invalid_),
0058 fecSlot_(sistrip::invalid_),
0059 fecRing_(sistrip::invalid_),
0060 ccuAddr_(sistrip::invalid_),
0061 ccuChan_(sistrip::invalid_),
0062 lldChan_(sistrip::invalid_),
0063 i2cAddr_(sistrip::invalid_) {
0064
0065 initFromPath();
0066 initFromValue();
0067 initFromKey();
0068 initGranularity();
0069 }
0070
0071
0072
0073 SiStripFecKey::SiStripFecKey(const SiStripFecKey& input)
0074 : SiStripKey(),
0075 fecCrate_(input.fecCrate()),
0076 fecSlot_(input.fecSlot()),
0077 fecRing_(input.fecRing()),
0078 ccuAddr_(input.ccuAddr()),
0079 ccuChan_(input.ccuChan()),
0080 lldChan_(input.lldChan()),
0081 i2cAddr_(input.i2cAddr()) {
0082 key(input.key());
0083 path(input.path());
0084 granularity(input.granularity());
0085 }
0086
0087
0088
0089 SiStripFecKey::SiStripFecKey(const SiStripKey& input)
0090 : SiStripKey(),
0091 fecCrate_(sistrip::invalid_),
0092 fecSlot_(sistrip::invalid_),
0093 fecRing_(sistrip::invalid_),
0094 ccuAddr_(sistrip::invalid_),
0095 ccuChan_(sistrip::invalid_),
0096 lldChan_(sistrip::invalid_),
0097 i2cAddr_(sistrip::invalid_) {
0098 const SiStripFecKey& fec_key = dynamic_cast<const SiStripFecKey&>(input);
0099 key(fec_key.key());
0100 path(fec_key.path());
0101 granularity(fec_key.granularity());
0102 fecCrate_ = fec_key.fecCrate();
0103 fecSlot_ = fec_key.fecSlot();
0104 fecRing_ = fec_key.fecRing();
0105 ccuAddr_ = fec_key.ccuAddr();
0106 ccuChan_ = fec_key.ccuChan();
0107 lldChan_ = fec_key.lldChan();
0108 i2cAddr_ = fec_key.i2cAddr();
0109 }
0110
0111
0112
0113 SiStripFecKey::SiStripFecKey(const SiStripKey& input, const sistrip::Granularity& gran)
0114 : SiStripKey(), fecCrate_(0), fecSlot_(0), fecRing_(0), ccuAddr_(0), ccuChan_(0), lldChan_(0), i2cAddr_(0) {
0115 const SiStripFecKey& fec_key = dynamic_cast<const SiStripFecKey&>(input);
0116 if (gran == sistrip::FEC_CRATE || gran == sistrip::FEC_SLOT || gran == sistrip::FEC_RING ||
0117 gran == sistrip::CCU_ADDR || gran == sistrip::CCU_CHAN || gran == sistrip::LLD_CHAN || gran == sistrip::APV) {
0118 fecCrate_ = fec_key.fecCrate();
0119 }
0120
0121 if (gran == sistrip::FEC_SLOT || gran == sistrip::FEC_RING || gran == sistrip::CCU_ADDR ||
0122 gran == sistrip::CCU_CHAN || gran == sistrip::LLD_CHAN || gran == sistrip::APV) {
0123 fecSlot_ = fec_key.fecSlot();
0124 }
0125
0126 if (gran == sistrip::FEC_RING || gran == sistrip::CCU_ADDR || gran == sistrip::CCU_CHAN ||
0127 gran == sistrip::LLD_CHAN || gran == sistrip::APV) {
0128 fecRing_ = fec_key.fecRing();
0129 }
0130
0131 if (gran == sistrip::CCU_ADDR || gran == sistrip::CCU_CHAN || gran == sistrip::LLD_CHAN || gran == sistrip::APV) {
0132 ccuAddr_ = fec_key.ccuAddr();
0133 }
0134
0135 if (gran == sistrip::CCU_CHAN || gran == sistrip::LLD_CHAN || gran == sistrip::APV) {
0136 ccuChan_ = fec_key.ccuChan();
0137 }
0138
0139 if (gran == sistrip::LLD_CHAN || gran == sistrip::APV) {
0140 lldChan_ = fec_key.lldChan();
0141 }
0142
0143 if (gran == sistrip::APV) {
0144 i2cAddr_ = fec_key.i2cAddr();
0145 }
0146
0147 initFromValue();
0148 initFromKey();
0149 initFromPath();
0150 initGranularity();
0151 }
0152
0153
0154
0155 SiStripFecKey::SiStripFecKey()
0156 : SiStripKey(),
0157 fecCrate_(sistrip::invalid_),
0158 fecSlot_(sistrip::invalid_),
0159 fecRing_(sistrip::invalid_),
0160 ccuAddr_(sistrip::invalid_),
0161 ccuChan_(sistrip::invalid_),
0162 lldChan_(sistrip::invalid_),
0163 i2cAddr_(sistrip::invalid_) {
0164 ;
0165 }
0166
0167
0168
0169 uint16_t SiStripFecKey::hybridPos(const uint16_t& i2c_addr) {
0170 if (i2c_addr < sistrip::APV_I2C_MIN || i2c_addr > sistrip::APV_I2C_MAX) {
0171 return sistrip::invalid_;
0172 }
0173 return (i2c_addr - sistrip::APV_I2C_MIN + 1);
0174 }
0175
0176
0177
0178 uint16_t SiStripFecKey::i2cAddr(const uint16_t& hybrid_pos) {
0179 if (!hybrid_pos || hybrid_pos > (sistrip::APV_I2C_MAX - sistrip::APV_I2C_MIN + 1)) {
0180 return sistrip::invalid_;
0181 }
0182 return (hybrid_pos + sistrip::APV_I2C_MIN - 1);
0183 }
0184
0185
0186
0187 uint16_t SiStripFecKey::i2cAddr(const uint16_t& lld_chan, const bool& first_apv) {
0188 if (lld_chan < sistrip::LLD_CHAN_MIN || lld_chan > sistrip::LLD_CHAN_MAX) {
0189 return sistrip::invalid_;
0190 }
0191 return (sistrip::APV_I2C_MIN + lld_chan * sistrip::APVS_PER_CHAN - (first_apv ? 2 : 1));
0192 }
0193
0194
0195
0196 uint16_t SiStripFecKey::lldChan(const uint16_t& i2c_addr) {
0197 if (i2c_addr == 0) {
0198 return 0;
0199 } else if (i2c_addr < sistrip::APV_I2C_MIN || i2c_addr > sistrip::APV_I2C_MAX) {
0200 return sistrip::invalid_;
0201 }
0202 return ((i2c_addr - sistrip::APV_I2C_MIN) / 2 + 1);
0203 }
0204
0205
0206
0207 bool SiStripFecKey::firstApvOfPair(const uint16_t& i2c_addr) {
0208 if (i2c_addr < sistrip::APV_I2C_MIN || i2c_addr > sistrip::APV_I2C_MAX) {
0209 return sistrip::invalid_;
0210 }
0211 return (((i2c_addr - sistrip::APV_I2C_MIN) % 2) == 0);
0212 }
0213
0214
0215
0216 bool SiStripFecKey::isEqual(const SiStripKey& key) const {
0217 const SiStripFecKey& input = dynamic_cast<const SiStripFecKey&>(key);
0218 if (fecCrate_ == input.fecCrate() && fecSlot_ == input.fecSlot() && fecRing_ == input.fecRing() &&
0219 ccuAddr_ == input.ccuAddr() && ccuChan_ == input.ccuChan() && lldChan_ == input.lldChan() &&
0220 i2cAddr_ == input.i2cAddr()) {
0221 return true;
0222 } else {
0223 return false;
0224 }
0225 }
0226
0227
0228
0229 bool SiStripFecKey::isConsistent(const SiStripKey& key) const {
0230 const SiStripFecKey& input = dynamic_cast<const SiStripFecKey&>(key);
0231 if (isEqual(input)) {
0232 return true;
0233 } else if ((fecCrate_ == 0 || input.fecCrate() == 0) && (fecSlot_ == 0 || input.fecSlot() == 0) &&
0234 (fecRing_ == 0 || input.fecRing() == 0) && (ccuAddr_ == 0 || input.ccuAddr() == 0) &&
0235 (lldChan_ == 0 || input.lldChan() == 0) && (i2cAddr_ == 0 || input.i2cAddr() == 0)) {
0236 return true;
0237 } else {
0238 return false;
0239 }
0240 }
0241
0242
0243
0244 bool SiStripFecKey::isValid() const { return isValid(sistrip::APV); }
0245
0246
0247
0248 bool SiStripFecKey::isValid(const sistrip::Granularity& gran) const {
0249 if (gran == sistrip::FEC_SYSTEM) {
0250 return true;
0251 } else if (gran == sistrip::UNDEFINED_GRAN || gran == sistrip::UNKNOWN_GRAN) {
0252 return false;
0253 }
0254
0255 if (fecCrate_ != sistrip::invalid_) {
0256 if (gran == sistrip::FEC_CRATE) {
0257 return true;
0258 }
0259 if (fecSlot_ != sistrip::invalid_) {
0260 if (gran == sistrip::FEC_RING) {
0261 return true;
0262 }
0263 if (fecRing_ != sistrip::invalid_) {
0264 if (gran == sistrip::FEC_RING) {
0265 return true;
0266 }
0267 if (ccuAddr_ != sistrip::invalid_) {
0268 if (gran == sistrip::CCU_ADDR) {
0269 return true;
0270 }
0271 if (ccuChan_ != sistrip::invalid_) {
0272 if (gran == sistrip::CCU_CHAN) {
0273 return true;
0274 }
0275 if (lldChan_ != sistrip::invalid_) {
0276 if (gran == sistrip::LLD_CHAN) {
0277 return true;
0278 }
0279 if (i2cAddr_ != sistrip::invalid_) {
0280 if (gran == sistrip::APV) {
0281 return true;
0282 }
0283 }
0284 }
0285 }
0286 }
0287 }
0288 }
0289 }
0290 return false;
0291 }
0292
0293
0294
0295 bool SiStripFecKey::isInvalid() const { return isInvalid(sistrip::APV); }
0296
0297
0298
0299 bool SiStripFecKey::isInvalid(const sistrip::Granularity& gran) const {
0300 if (gran == sistrip::FEC_SYSTEM) {
0301 return false;
0302 } else if (gran == sistrip::UNDEFINED_GRAN || gran == sistrip::UNKNOWN_GRAN) {
0303 return false;
0304 }
0305
0306 if (fecCrate_ == sistrip::invalid_) {
0307 if (gran == sistrip::FEC_CRATE) {
0308 return true;
0309 }
0310 if (fecSlot_ == sistrip::invalid_) {
0311 if (gran == sistrip::FEC_RING) {
0312 return true;
0313 }
0314 if (fecRing_ == sistrip::invalid_) {
0315 if (gran == sistrip::FEC_RING) {
0316 return true;
0317 }
0318 if (ccuAddr_ == sistrip::invalid_) {
0319 if (gran == sistrip::CCU_ADDR) {
0320 return true;
0321 }
0322 if (ccuChan_ == sistrip::invalid_) {
0323 if (gran == sistrip::CCU_CHAN) {
0324 return true;
0325 }
0326 if (lldChan_ == sistrip::invalid_) {
0327 if (gran == sistrip::LLD_CHAN) {
0328 return true;
0329 }
0330 if (i2cAddr_ == sistrip::invalid_) {
0331 if (gran == sistrip::APV) {
0332 return true;
0333 }
0334 }
0335 }
0336 }
0337 }
0338 }
0339 }
0340 }
0341 return false;
0342 }
0343
0344
0345
0346 void SiStripFecKey::initFromValue() {
0347
0348 if (not((fecCrate_ >= sistrip::FEC_CRATE_MIN && fecCrate_ <= sistrip::FEC_CRATE_MAX) || (fecCrate_ == 0))) {
0349 fecCrate_ = sistrip::invalid_;
0350 }
0351
0352
0353 if (not((fecSlot_ >= sistrip::CRATE_SLOT_MIN && fecSlot_ <= sistrip::CRATE_SLOT_MAX) || (fecSlot_ == 0))) {
0354 fecSlot_ = sistrip::invalid_;
0355 }
0356
0357
0358 if (not((fecRing_ >= sistrip::FEC_RING_MIN && fecRing_ <= sistrip::FEC_RING_MAX) || (fecRing_ == 0))) {
0359 fecRing_ = sistrip::invalid_;
0360 }
0361
0362
0363 if (not((ccuAddr_ >= sistrip::CCU_ADDR_MIN && ccuAddr_ <= sistrip::CCU_ADDR_MAX) || (ccuAddr_ == 0))) {
0364 ccuAddr_ = sistrip::invalid_;
0365 }
0366
0367
0368 if (not((ccuChan_ >= sistrip::CCU_CHAN_MIN && ccuChan_ <= sistrip::CCU_CHAN_MAX) || (ccuChan_ == 0))) {
0369 ccuChan_ = sistrip::invalid_;
0370 }
0371
0372
0373 if (not((lldChan_ >= sistrip::LLD_CHAN_MIN && lldChan_ <= sistrip::LLD_CHAN_MAX) || (lldChan_ == 0))) {
0374 lldChan_ = sistrip::invalid_;
0375 }
0376
0377
0378 if (i2cAddr_ >= sistrip::APV_I2C_MIN && i2cAddr_ <= sistrip::APV_I2C_MAX) {
0379 if (lldChan_ && lldChan(i2cAddr_) != lldChan_) {
0380 i2cAddr_ = sistrip::invalid_;
0381 key(key() | (i2cAddrMask_ << i2cAddrOffset_));
0382 }
0383 } else if (i2cAddr_ != 0) {
0384 i2cAddr_ = sistrip::invalid_;
0385 }
0386 }
0387
0388
0389
0390 void SiStripFecKey::initFromKey() {
0391 if (key() == sistrip::invalid32_) {
0392
0393
0394
0395 key(0);
0396
0397
0398 if (fecCrate_ >= sistrip::FEC_CRATE_MIN && fecCrate_ <= sistrip::FEC_CRATE_MAX) {
0399 key(key() | (fecCrate_ << fecCrateOffset_));
0400 } else if (fecCrate_ == 0) {
0401 key(key() | (fecCrate_ << fecCrateOffset_));
0402 } else {
0403 key(key() | (fecCrateMask_ << fecCrateOffset_));
0404 }
0405
0406
0407 if (fecSlot_ >= sistrip::CRATE_SLOT_MIN && fecSlot_ <= sistrip::CRATE_SLOT_MAX) {
0408 key(key() | (fecSlot_ << fecSlotOffset_));
0409 } else if (fecSlot_ == 0) {
0410 key(key() | (fecSlot_ << fecSlotOffset_));
0411 } else {
0412 key(key() | (fecSlotMask_ << fecSlotOffset_));
0413 }
0414
0415
0416 if (fecRing_ >= sistrip::FEC_RING_MIN && fecRing_ <= sistrip::FEC_RING_MAX) {
0417 key(key() | (fecRing_ << fecRingOffset_));
0418 } else if (fecRing_ == 0) {
0419 key(key() | (fecRing_ << fecRingOffset_));
0420 } else {
0421 key(key() | (fecRingMask_ << fecRingOffset_));
0422 }
0423
0424
0425 if (ccuAddr_ >= sistrip::CCU_ADDR_MIN && ccuAddr_ <= sistrip::CCU_ADDR_MAX) {
0426 key(key() | (ccuAddr_ << ccuAddrOffset_));
0427 } else if (ccuAddr_ == 0) {
0428 key(key() | (ccuAddr_ << ccuAddrOffset_));
0429 } else {
0430 key(key() | (ccuAddrMask_ << ccuAddrOffset_));
0431 }
0432
0433
0434 if (ccuChan_ >= sistrip::CCU_CHAN_MIN && ccuChan_ <= sistrip::CCU_CHAN_MAX) {
0435 key(key() | ((ccuChan_ - (sistrip::CCU_CHAN_MIN - 1)) << ccuChanOffset_));
0436 } else if (ccuChan_ == 0) {
0437 key(key() | (ccuChan_ << ccuChanOffset_));
0438 } else {
0439 key(key() | (ccuChanMask_ << ccuChanOffset_));
0440 }
0441
0442
0443 if (lldChan_ >= sistrip::LLD_CHAN_MIN && lldChan_ <= sistrip::LLD_CHAN_MAX) {
0444 key(key() | (lldChan_ << lldChanOffset_));
0445 } else if (lldChan_ == 0) {
0446 key(key() | (lldChan_ << lldChanOffset_));
0447 } else {
0448 key(key() | (lldChanMask_ << lldChanOffset_));
0449 }
0450
0451
0452 if (i2cAddr_ >= sistrip::APV_I2C_MIN && i2cAddr_ <= sistrip::APV_I2C_MAX) {
0453 key(key() | ((firstApvOfPair(i2cAddr_) ? 1 : 2) << i2cAddrOffset_));
0454 if (lldChan_ && lldChan(i2cAddr_) != lldChan_) {
0455 i2cAddr_ = sistrip::invalid_;
0456 key(key() | (i2cAddrMask_ << i2cAddrOffset_));
0457 }
0458 } else if (i2cAddr_ == 0) {
0459 key(key() | (i2cAddr_ << i2cAddrOffset_));
0460 } else {
0461 key(key() | (i2cAddrMask_ << i2cAddrOffset_));
0462 }
0463
0464 } else {
0465
0466
0467 fecCrate_ = (key() >> fecCrateOffset_) & fecCrateMask_;
0468 fecSlot_ = (key() >> fecSlotOffset_) & fecSlotMask_;
0469 fecRing_ = (key() >> fecRingOffset_) & fecRingMask_;
0470 ccuAddr_ = (key() >> ccuAddrOffset_) & ccuAddrMask_;
0471 ccuChan_ = (key() >> ccuChanOffset_) & ccuChanMask_;
0472 lldChan_ = (key() >> lldChanOffset_) & lldChanMask_;
0473 i2cAddr_ = (key() >> i2cAddrOffset_) & i2cAddrMask_;
0474
0475 if (fecCrate_ == fecCrateMask_) {
0476 fecCrate_ = sistrip::invalid_;
0477 }
0478 if (fecSlot_ == fecSlotMask_) {
0479 fecSlot_ = sistrip::invalid_;
0480 }
0481 if (fecRing_ == fecRingMask_) {
0482 fecRing_ = sistrip::invalid_;
0483 }
0484 if (ccuAddr_ == ccuAddrMask_) {
0485 ccuAddr_ = sistrip::invalid_;
0486 }
0487 if (ccuChan_ == ccuChanMask_) {
0488 ccuChan_ = sistrip::invalid_;
0489 } else if (ccuChan_) {
0490 ccuChan_ += (sistrip::CCU_CHAN_MIN - 1);
0491 }
0492 if (lldChan_ == lldChanMask_) {
0493 lldChan_ = sistrip::invalid_;
0494 }
0495 if (i2cAddr_ == i2cAddrMask_) {
0496 i2cAddr_ = sistrip::invalid_;
0497 } else if (i2cAddr_ && lldChan_ != lldChanMask_) {
0498 i2cAddr_ = i2cAddr(lldChan_, 2 - i2cAddr_);
0499 }
0500 }
0501 }
0502
0503
0504
0505 void SiStripFecKey::initFromPath() {
0506 if (path() == sistrip::null_) {
0507
0508
0509 std::stringstream dir;
0510
0511 dir << sistrip::root_ << sistrip::dir_ << sistrip::controlView_ << sistrip::dir_;
0512
0513
0514 if (fecCrate_) {
0515 dir << sistrip::fecCrate_ << fecCrate_ << sistrip::dir_;
0516
0517
0518 if (fecSlot_) {
0519 dir << sistrip::fecSlot_ << fecSlot_ << sistrip::dir_;
0520
0521
0522 if (fecRing_) {
0523 dir << sistrip::fecRing_ << fecRing_ << sistrip::dir_;
0524
0525
0526 if (ccuAddr_) {
0527 dir << sistrip::ccuAddr_ << ccuAddr_ << sistrip::dir_;
0528
0529
0530 if (ccuChan_) {
0531 dir << sistrip::ccuChan_ << ccuChan_ << sistrip::dir_;
0532
0533
0534 if (lldChan_) {
0535 dir << sistrip::lldChan_ << lldChan_ << sistrip::dir_;
0536
0537
0538 if (i2cAddr_) {
0539 dir << sistrip::apv_ << i2cAddr_ << sistrip::dir_;
0540 }
0541 }
0542 }
0543 }
0544 }
0545 }
0546 }
0547
0548 std::string temp(dir.str());
0549 path(temp);
0550
0551 } else {
0552
0553
0554 fecCrate_ = 0;
0555 fecSlot_ = 0;
0556 fecRing_ = 0;
0557 ccuAddr_ = 0;
0558 ccuChan_ = 0;
0559 lldChan_ = 0;
0560 i2cAddr_ = 0;
0561
0562
0563 if (path().find(sistrip::root_) == std::string::npos) {
0564 std::string temp = path();
0565 path(std::string(sistrip::root_) + sistrip::dir_ + temp);
0566 }
0567
0568 size_t curr = 0;
0569 size_t next = 0;
0570 next = path().find(sistrip::controlView_, curr);
0571
0572
0573 curr = next;
0574 if (curr != std::string::npos) {
0575 next = path().find(sistrip::fecCrate_, curr);
0576 std::string control_view(
0577 path(), curr + (sizeof(sistrip::controlView_) - 1), next - (sizeof(sistrip::dir_) - 1) - curr);
0578
0579
0580 curr = next;
0581 if (curr != std::string::npos) {
0582 next = path().find(sistrip::fecSlot_, curr);
0583 std::string fec_crate(
0584 path(), curr + (sizeof(sistrip::fecCrate_) - 1), next - (sizeof(sistrip::dir_) - 1) - curr);
0585 fecCrate_ = std::atoi(fec_crate.c_str());
0586
0587
0588 curr = next;
0589 if (curr != std::string::npos) {
0590 next = path().find(sistrip::fecRing_, curr);
0591 std::string fec_slot(
0592 path(), curr + (sizeof(sistrip::fecSlot_) - 1), next - (sizeof(sistrip::dir_) - 1) - curr);
0593 fecSlot_ = std::atoi(fec_slot.c_str());
0594
0595
0596 curr = next;
0597 if (curr != std::string::npos) {
0598 next = path().find(sistrip::ccuAddr_, curr);
0599 std::string fec_ring(
0600 path(), curr + (sizeof(sistrip::fecRing_) - 1), next - (sizeof(sistrip::dir_) - 1) - curr);
0601 fecRing_ = std::atoi(fec_ring.c_str());
0602
0603
0604 curr = next;
0605 if (curr != std::string::npos) {
0606 next = path().find(sistrip::ccuChan_, curr);
0607 std::string ccu_addr(
0608 path(), curr + (sizeof(sistrip::ccuAddr_) - 1), next - (sizeof(sistrip::dir_) - 1) - curr);
0609 ccuAddr_ = std::atoi(ccu_addr.c_str());
0610
0611
0612 curr = next;
0613 if (curr != std::string::npos) {
0614 next = path().find(sistrip::lldChan_, curr);
0615 std::string ccu_chan(
0616 path(), curr + (sizeof(sistrip::ccuChan_) - 1), next - (sizeof(sistrip::dir_) - 1) - curr);
0617 ccuChan_ = std::atoi(ccu_chan.c_str());
0618
0619
0620 curr = next;
0621 if (curr != std::string::npos) {
0622 next = path().find(sistrip::apv_, curr);
0623 std::string lld_chan(
0624 path(), curr + (sizeof(sistrip::lldChan_) - 1), next - (sizeof(sistrip::dir_) - 1) - curr);
0625 lldChan_ = std::atoi(lld_chan.c_str());
0626
0627
0628 curr = next;
0629 if (curr != std::string::npos) {
0630 next = std::string::npos;
0631 std::string i2c_addr(path(), curr + (sizeof(sistrip::apv_) - 1), next - curr);
0632 i2cAddr_ = std::atoi(i2c_addr.c_str());
0633 }
0634 }
0635 }
0636 }
0637 }
0638 }
0639 }
0640 } else {
0641 std::stringstream ss;
0642 ss << sistrip::root_ << sistrip::dir_;
0643
0644
0645 std::string temp(ss.str());
0646 path(temp);
0647 }
0648 }
0649 }
0650
0651
0652
0653 void SiStripFecKey::initGranularity() {
0654 granularity(sistrip::FEC_SYSTEM);
0655 channel(0);
0656 if (fecCrate_ && fecCrate_ != sistrip::invalid_) {
0657 granularity(sistrip::FEC_CRATE);
0658 channel(fecCrate_);
0659 if (fecSlot_ && fecSlot_ != sistrip::invalid_) {
0660 granularity(sistrip::FEC_SLOT);
0661 channel(fecSlot_);
0662 if (fecRing_ && fecRing_ != sistrip::invalid_) {
0663 granularity(sistrip::FEC_RING);
0664 channel(fecRing_);
0665 if (ccuAddr_ && ccuAddr_ != sistrip::invalid_) {
0666 granularity(sistrip::CCU_ADDR);
0667 channel(ccuAddr_);
0668 if (ccuChan_ && ccuChan_ != sistrip::invalid_) {
0669 granularity(sistrip::CCU_CHAN);
0670 channel(ccuChan_);
0671 if (lldChan_ && lldChan_ != sistrip::invalid_) {
0672 granularity(sistrip::LLD_CHAN);
0673 channel(lldChan_);
0674 if (i2cAddr_ && i2cAddr_ != sistrip::invalid_) {
0675 granularity(sistrip::APV);
0676 channel(i2cAddr_);
0677 } else if (i2cAddr_ == sistrip::invalid_) {
0678 granularity(sistrip::UNKNOWN_GRAN);
0679 channel(sistrip::invalid_);
0680 }
0681 } else if (lldChan_ == sistrip::invalid_) {
0682 granularity(sistrip::UNKNOWN_GRAN);
0683 channel(sistrip::invalid_);
0684 }
0685 } else if (ccuChan_ == sistrip::invalid_) {
0686 granularity(sistrip::UNKNOWN_GRAN);
0687 channel(sistrip::invalid_);
0688 }
0689 } else if (ccuAddr_ == sistrip::invalid_) {
0690 granularity(sistrip::UNKNOWN_GRAN);
0691 channel(sistrip::invalid_);
0692 }
0693 } else if (fecRing_ == sistrip::invalid_) {
0694 granularity(sistrip::UNKNOWN_GRAN);
0695 channel(sistrip::invalid_);
0696 }
0697 } else if (fecSlot_ == sistrip::invalid_) {
0698 granularity(sistrip::UNKNOWN_GRAN);
0699 channel(sistrip::invalid_);
0700 }
0701 } else if (fecCrate_ == sistrip::invalid_) {
0702 granularity(sistrip::UNKNOWN_GRAN);
0703 channel(sistrip::invalid_);
0704 }
0705 }
0706
0707
0708
0709 void SiStripFecKey::terse(std::stringstream& ss) const {
0710 ss << "FEC:crate/slot/ring/CCU/module/LLD/I2C= " << fecCrate() << "/" << fecSlot() << "/" << fecRing() << "/"
0711 << ccuAddr() << "/" << ccuChan() << "/" << lldChan() << "/" << i2cAddr();
0712
0713
0714
0715
0716
0717
0718
0719
0720
0721
0722
0723
0724
0725 }
0726
0727
0728
0729 void SiStripFecKey::print(std::stringstream& ss) const {
0730 ss << " [SiStripFecKey::print]" << std::endl
0731 << std::hex << " FEC key : 0x" << std::setfill('0') << std::setw(8) << key() << std::endl
0732 << std::setfill(' ') << std::dec << " FEC VME crate : " << fecCrate() << std::endl
0733 << " FEC VME slot : " << fecSlot() << std::endl
0734 << " FEC control ring : " << fecRing() << std::endl
0735 << " CCU I2C address : " << ccuAddr() << std::endl
0736 << " CCU chan (FE module) : " << ccuChan() << std::endl
0737 << " LaserDriver channel : " << lldChan() << std::endl
0738 << " APV I2C address : " << i2cAddr() << std::endl
0739 << " Directory : " << path() << std::endl
0740 << " Granularity : " << SiStripEnumsAndStrings::granularity(granularity()) << std::endl
0741 << " Channel : " << channel() << std::endl
0742 << " isValid : " << isValid();
0743 }
0744
0745
0746
0747 std::ostream& operator<<(std::ostream& os, const SiStripFecKey& input) {
0748 std::stringstream ss;
0749 input.print(ss);
0750 os << ss.str();
0751 return os;
0752 }
0753
0754
0755
0756 ConsistentWithKey::ConsistentWithKey(const SiStripFecKey& key)
0757 : mask_(key.fecCrate() ? sistrip::invalid_ : 0,
0758 key.fecSlot() ? sistrip::invalid_ : 0,
0759 key.fecRing() ? sistrip::invalid_ : 0,
0760 key.ccuAddr() ? sistrip::invalid_ : 0,
0761 key.ccuChan() ? sistrip::invalid_ : 0,
0762 key.lldChan() ? sistrip::invalid_ : 0,
0763 key.i2cAddr() ? sistrip::invalid_ : 0) {
0764 ;
0765 }
0766
0767
0768
0769 ConsistentWithKey::ConsistentWithKey() : mask_(SiStripNullKey()) { ; }
0770
0771
0772
0773 bool ConsistentWithKey::operator()(const uint32_t& a, const uint32_t& b) const {
0774 return ((a & mask_.key()) < (b & mask_.key()));
0775 }