CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_6_1_1/src/DataFormats/SiStripCommon/src/SiStripFecKey.cc

Go to the documentation of this file.
00001 // Last commit: $Id: SiStripFecKey.cc,v 1.23 2012/07/04 19:04:51 eulisse Exp $
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   // order is important!
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   // order is important!
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   // order is important!
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   // FEC crate  
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   // FEC slot
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   // FEC ring
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   // CCU addr
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   // CCU chan
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   // LLD channel
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   // APV I2C address
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     // ---------- Set FecKey based on member data ----------
00427     
00428     // Initialise to null value
00429     key(0);
00430     
00431     // Extract FEC crate  
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     // Extract FEC slot
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     // Extract FEC ring
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     // Extract CCU addr
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     // Extract CCU chan
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     // Extract LLD channel
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     // Extract APV I2C address
00492     if ( i2cAddr_ >= sistrip::APV_I2C_MIN &&
00493          i2cAddr_ <= sistrip::APV_I2C_MAX ) {
00494       key( key() | ( ( firstApvOfPair( i2cAddr_ ) ? 1 : 2 ) << i2cAddrOffset_ ) ); // key encodes APV number (1 or 2)
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     // ---------- Set member data based on FEC key ----------
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     // ---------- Set directory path based on member data ----------
00538 
00539     std::stringstream dir;
00540     
00541     dir << sistrip::root_ << sistrip::dir_ 
00542         << sistrip::controlView_ << sistrip::dir_;
00543 
00544     // Add FEC crate
00545     if ( fecCrate_ ) {
00546       dir << sistrip::fecCrate_ << fecCrate_ << sistrip::dir_;
00547       
00548       // Add FEC slot
00549       if ( fecSlot_ ) {
00550         dir << sistrip::fecSlot_ << fecSlot_ << sistrip::dir_;
00551         
00552         // Add FEC ring
00553         if ( fecRing_ ) {
00554           dir << sistrip::fecRing_ << fecRing_ << sistrip::dir_;
00555           
00556           // Add CCU address
00557           if ( ccuAddr_ ) {
00558             dir << sistrip::ccuAddr_ << ccuAddr_ << sistrip::dir_;
00559             
00560             // Add CCU channel
00561             if ( ccuChan_ ) {
00562               dir << sistrip::ccuChan_ << ccuChan_ << sistrip::dir_;
00563 
00564               // Add LLD channel
00565               if ( lldChan_ ) {
00566                 dir << sistrip::lldChan_ << lldChan_ << sistrip::dir_;
00567 
00568                 // Add APV I2C address
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     // ---------- Set member data based on directory path ----------
00585     
00586     fecCrate_ = 0;
00587     fecSlot_  = 0;
00588     fecRing_  = 0;
00589     ccuAddr_  = 0;
00590     ccuChan_  = 0;
00591     lldChan_  = 0;
00592     i2cAddr_  = 0;
00593 
00594     // Check if root is found
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; // current string position
00601     size_t next = 0; // next string position
00602     next = path().find( sistrip::controlView_, curr );
00603 
00604     // Extract view 
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       // Extract FEC crate
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         // Extract FEC slot
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           // Extract FEC ring
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             // Extract CCU address
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               // Extract CCU channel
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                 // Extract LLD channel
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                   // Extract I2C address
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       //ss << sistrip::root_ << sistrip::dir_
00685       //<< sistrip::unknownView_ << sistrip::dir_;
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 //   ss << " FecKey"
00764 //     //<< "=0x" 
00765 //     //<< std::hex
00766 //     //<< std::setfill('0') << std::setw(8) << key() << std::setfill(' ') 
00767 //     //<< std::dec
00768 //     //<< ", " << ( isValid() ? "Valid" : "Invalid" )
00769 //      << ", Crate=" << fecCrate()
00770 //      << ", Slot=" << fecSlot()
00771 //      << ", Ring=" << fecRing()
00772 //      << ", CCU=" << ccuAddr()
00773 //      << ", module=" << ccuChan()
00774 //      << ", LLD=" << lldChan()
00775 //      << ", I2C=" << i2cAddr();
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 }