![]() |
![]() |
#include <OnlineDB/SiStripESSources/interface/SiStripFedCablingBuilderFromDb.h>
Public Member Functions | |
virtual SiStripFedCabling * | make (const SiStripFedCablingRcd &) |
Builds FED cabling using info from configuration database. | |
SiStripFedCablingBuilderFromDb (const edm::ParameterSet &) | |
virtual | ~SiStripFedCablingBuilderFromDb () |
Static Public Member Functions | |
static void | buildFecCabling (SiStripConfigDb *const, SiStripFecCabling &) |
Generic method which builds FEC cabling. | |
static void | buildFecCabling (SiStripConfigDb *const, SiStripFecCabling &, const sistrip::CablingSource &) |
Generic method which builds FEC cabling. | |
static void | buildFecCablingFromDetIds (SiStripConfigDb *const, SiStripFecCabling &) |
Builds the SiStripFecCabling conditions object using information found within the "dcuinfo.xml" file (ie, based on DetIds). | |
static void | buildFecCablingFromDevices (SiStripConfigDb *const, SiStripFecCabling &) |
Builds the SiStripFecCabling conditions object using information found within the "fec.xml" and "dcuinfo.xml" files. | |
static void | buildFecCablingFromFedConnections (SiStripConfigDb *const, SiStripFecCabling &) |
Builds the SiStripFecCabling conditions object using information found within the "module.xml" and "dcuinfo.xml" files. | |
static void | getFecCabling (const SiStripFedCabling &in, SiStripFecCabling &out) |
Utility method that takes a FED cabling object as input and returns (as an arg) the corresponding FEC cabling object. | |
static void | getFedCabling (const SiStripFecCabling &in, SiStripFedCabling &out) |
Utility method that takes a FEC cabling object as input and returns (as an arg) the corresponding FED cabling object. | |
Protected Member Functions | |
virtual void | setIntervalFor (const edm::eventsetup::EventSetupRecordKey &, const edm::IOVSyncValue &, edm::ValidityInterval &) |
virtual void | writeFedCablingToCondDb (const SiStripFedCabling &) |
Virtual method that is called by makeFedCabling() to allow FED cabling to be written to the conds DB (local or otherwise). | |
Static Protected Member Functions | |
static void | assignDcuAndDetIds (SiStripFecCabling &, std::vector< std::pair< uint32_t, TkDcuInfo * > >) |
Protected Attributes | |
SiStripConfigDb * | db_ |
Access to the configuration DB interface class. | |
sistrip::CablingSource | source_ |
Defines "source" (conns, devices, detids) of cabling info. |
Definition at line 19 of file SiStripFedCablingBuilderFromDb.h.
SiStripFedCablingBuilderFromDb::SiStripFedCablingBuilderFromDb | ( | const edm::ParameterSet & | pset | ) |
Definition at line 22 of file SiStripFedCablingBuilderFromDb.cc.
References SiStripEnumsAndStrings::cablingSource(), edm::ParameterSet::getUntrackedParameter(), LogTrace, sistrip::mlCabling_, source, and source_.
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 // Defined cabling "source" (connections, devices, detids) 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 }
SiStripFedCablingBuilderFromDb::~SiStripFedCablingBuilderFromDb | ( | ) | [virtual] |
Definition at line 46 of file SiStripFedCablingBuilderFromDb.cc.
References LogTrace, and sistrip::mlCabling_.
00046 { 00047 LogTrace(mlCabling_) 00048 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]" 00049 << " Destructing object..."; 00050 }
void SiStripFedCablingBuilderFromDb::assignDcuAndDetIds | ( | SiStripFecCabling & | fec_cabling, | |
std::vector< std::pair< uint32_t, TkDcuInfo * > > | in | |||
) | [static, protected] |
Definition at line 883 of file SiStripFedCablingBuilderFromDb.cc.
References SiStripFecCabling::crates(), SiStripModule::dcuId(), SiStripModule::detId(), lat::endl(), SiStripConfigDb::findDcuDetId(), in, iter, SiStripModule::length(), LogTrace, combine::missing, sistrip::mlCabling_, SiStripModule::nApvPairs(), mergeAndRegister_online::pairs, path(), ss, and edm::productstatus::unknown().
Referenced by buildFecCablingFromDevices(), and buildFecCablingFromFedConnections().
00884 { 00885 00886 // ---------- Check if entries found in DCU-DetId vector ---------- 00887 00888 if ( in.empty() ) { 00889 edm::LogError(mlCabling_) 00890 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]" 00891 << " No entries in DCU-DetId vector!"; 00892 } 00893 00894 // ---------- Assign DCU and DetId to Modules in FEC cabling object ---------- 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 //@@ TEMP FIX UNTIL LAURENT DEBUGS FedChannelConnectionDescription CLASS 00914 module.nApvPairs(0); 00915 00916 // --- Check for null DCU --- 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 ); // Assign DCU id equal to control 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 // --- Check for null DetId --- 00934 00935 if ( !module.detId() ) { 00936 00937 // --- Search for DcuId in map --- 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 // --- Assign DetId and set nApvPairs based on APVs found in given Module --- 00951 00952 module.detId( iter->second->getDetId() ); 00953 module.nApvPairs(0); 00954 00955 // count expected channels 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 // --- Check number of APV pairs is valid and consistent with cached map --- 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 // --- Check for null fibre length --- 01004 01005 if ( !module.length() ) { 01006 module.length( static_cast<uint16_t>( iter->second->getFibreLength() ) ); 01007 } 01008 01009 // --- Remove TkDcuInfo object from cached map --- 01010 01011 in.erase( iter ); 01012 01013 } // Set for DCU in static table 01014 } // Check for null DetId 01015 01016 } // Module loop 01017 } // CCU loop 01018 } // FEC ring loop 01019 } // FEC loop 01020 } // FEC crate loop 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 // ---------- "Randomly" assign DetIds to Modules with DCU ids not found in static table ---------- 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; // Incremented "dummy" DetId 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 // --- Check for null DetId and search for DCU in cached map --- 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 // --- Search for "random" module with consistent number of APV pairs --- 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 // --- Assign "random" DetId if number of APV pairs is consistent --- 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 { // --- Else, assign "dummy" DetId based on counter --- 01097 01098 // If no match found, then assign DetId using incremented counter 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 } // Module loop 01129 } // CCU loop 01130 } // FEC ring loop 01131 } // FEC loop 01132 } // FEC crate loop 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 // ---------- Check for unassigned DetIds ---------- 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 }
void SiStripFedCablingBuilderFromDb::buildFecCabling | ( | SiStripConfigDb * const | db, | |
SiStripFecCabling & | fec_cabling | |||
) | [static] |
Generic method which builds FEC cabling.
Call ones of the three methods below depending on what descriptions are available within the database or which xml files are available.
Definition at line 154 of file SiStripFedCablingBuilderFromDb.cc.
References buildFecCablingFromDetIds(), buildFecCablingFromDevices(), buildFecCablingFromFedConnections(), SiStripFecCabling::countDevices(), lat::endl(), SiStripConfigDb::getDcuDetIds(), SiStripConfigDb::getDeviceDescriptions(), SiStripConfigDb::getFedConnections(), LogTrace, sistrip::mlCabling_, and ss.
00155 { 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 // Debug 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 }
void SiStripFedCablingBuilderFromDb::buildFecCabling | ( | SiStripConfigDb * const | db, | |
SiStripFecCabling & | fec_cabling, | |||
const sistrip::CablingSource & | source | |||
) | [static] |
Generic method which builds FEC cabling.
Call ones of the three methods below depending on the cabling "source" parameter (connections, devices, detids).
Definition at line 114 of file SiStripFedCablingBuilderFromDb.cc.
References buildFecCablingFromDetIds(), buildFecCablingFromDevices(), buildFecCablingFromFedConnections(), sistrip::CABLING_FROM_CONNS, sistrip::CABLING_FROM_DETIDS, sistrip::CABLING_FROM_DEVICES, SiStripEnumsAndStrings::cablingSource(), SiStripFecCabling::countDevices(), lat::endl(), LogTrace, sistrip::mlCabling_, ss, and sistrip::UNDEFINED_CABLING_SOURCE.
Referenced by SiStripCondObjBuilderFromDb::buildCondObj(), CommissioningHistosUsingDb::CommissioningHistosUsingDb(), and make().
00116 { 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 // Debug 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 }
void SiStripFedCablingBuilderFromDb::buildFecCablingFromDetIds | ( | SiStripConfigDb * const | db, | |
SiStripFecCabling & | fec_cabling | |||
) | [static] |
Builds the SiStripFecCabling conditions object using information found within the "dcuinfo.xml" file (ie, based on DetIds).
Builds the SiStripFedCabling conditions object that is available via the EventSetup interface.
"Dummy" values are provided when necessary.
The object contains the full FedChannel-Dcu-DetId mapping information.
This method is typically used when only the Dcu-DetId map (ie, from "dcuinfo.xml") exists and the FED connections (ie, "module.xml" file) and device descriptions (ie, from "fec.xml") are both missing.
The map is built using the Dcu-DetId map that is cached by the SiStripConfigDb object. As a minimum, the map should contain values within both the DetId and APpvPair fields, but if any information is missing, the method provides "dummy" values.
Methodology:
The FEC cabling object is built using the Dcu-DetId map (ie, from "dcuinfo.xml"). For each entry, the DcuId, DetId and ApvPairs values are retrieved. For each ApvPair, a FED channel connection object is created using "dummy" hardware addresses.
If the DcuId (provided by the hardware device descriptions) is null, a dummy value is provided, based on the control key.
If the DetId is null, a value is assigned using an incremented counter (starting from 0xFFFF).
If the number of APV pairs is null, a value of 2 or 3 is randomly assigned.
Given that the FED channel connections are not known, APV pairs are cabled to "random" FED ids and channels.
All Dcu-DetId mappings are accumulated in a new map, and this modified map is returned by the method.
Definition at line 758 of file SiStripFedCablingBuilderFromDb.cc.
References SiStripFecCabling::addDevices(), addr, SiStripFecCabling::crates(), SiStripConfigDb::getDcuDetIds(), iter, LogTrace, sistrip::mlCabling_, and range.
Referenced by buildFecCabling().
00759 { 00760 edm::LogVerbatim(mlCabling_) 00761 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]" 00762 << " Building FEC cabling object from DetIds..."; 00763 00764 // ---------- Some initialization ---------- 00765 00766 // fec_cabling.clear(); 00767 00768 // chans_per_ring = chans_per_ccu * ccus_per_ring = 100 (TOB gives lower limit of 60) 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 // ---------- Retrieve necessary descriptions from database ---------- 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 // ---------- Populate FEC cabling object with DCU, DetId and "dummy" control info ---------- 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(); //@@ should be double! 00818 00819 // --- Check if DCU, DetId and nApvPairs are null --- 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 // --- Construct FedChannelConnection objects --- 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, // FED id and channel 00846 length, 00847 true, true, true, true ); 00848 fec_cabling.addDevices( conn ); 00849 } 00850 00851 imodule++; 00852 } 00853 00854 // ---------- Assign "dummy" FED ids/chans to Modules of FEC cabling object ---------- 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; } // move to next FED 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, // 16 FEDs per crate, numbering starts from 1 00867 (fed_id-50)%16+2, // FED slot starts from 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 }
void SiStripFedCablingBuilderFromDb::buildFecCablingFromDevices | ( | SiStripConfigDb * const | db, | |
SiStripFecCabling & | fec_cabling | |||
) | [static] |
Builds the SiStripFecCabling conditions object using information found within the "fec.xml" and "dcuinfo.xml" files.
Builds the SiStripFedCabling conditions object that is available via the EventSetup interface.
"Dummy" values are provided when necessary.
The object contains the full FedChannel-Dcu-DetId mapping information.
This method is typically used when the FED connections (ie, "module.xml" file) does not exist, such as prior to the FED cabling or "bare connection" procedure.
The map is built using information cached by the SiStripConfigDb object, comprising: 1) the hardware device descriptions, as found in the "fec.xml" file; 2) and Dcu-DetId mapping, as found in the "dcuinfo.xml" file. If any information is missing, the method provides "dummy" values.
Methodology:
The FEC cabling object is built using the hardware device descriptions (ie, from "fec.xml").
Given that the FED channel connections are not known, APV pairs are cabled to "random" FED ids and channels. FED ids are retrieved from any FED descriptions cached by the SiStripConfigDb object (ie, from "fed.xml"). A check is made to ensure sufficient FEDs exist to cable the entire control system. If not, the shortfall is met by generating FED ids using an incremented counter (starting from 50).
If the DcuId (provided by the hardware device descriptions) is null, a dummy value is provided, based on the control key.
The Dcu-DetId map (ie, from "dcuinfo.xml") is queried for a matching DcuId. If found, the DetId and ApvPairs are updated. If not, a "random" DetId within the Dcu-DetId map is assigned. Note that a check is made on the number of APV pairs before the DetId is assigned. If no appropriate match is found, the DetId is assigned a value using an incremented counter (starting from 0xFFFF).
All Dcu-DetId mappings are accumulated in a new map, and this modified map is returned by the method.
Definition at line 374 of file SiStripFedCablingBuilderFromDb.cc.
References SiStripFecCabling::addDevices(), addr, assignDcuAndDetIds(), SiStripFedCablingESProducer::ccuAddr(), SiStripConfigDb::DeviceAddress::ccuAddr_, SiStripFedCablingESProducer::ccuChan(), SiStripConfigDb::DeviceAddress::ccuChan_, SiStripFecCabling::countDevices(), SiStripFecCabling::crates(), SiStripFecCabling::dcuId(), SiStripConfigDb::deviceAddress(), lat::endl(), sistrip::FEC_CRATE_OFFSET, sistrip::FEC_RING_OFFSET, SiStripFedCablingESProducer::fecCrate(), SiStripConfigDb::DeviceAddress::fecCrate_, SiStripFedCablingESProducer::fecRing(), SiStripConfigDb::DeviceAddress::fecRing_, SiStripFedCablingESProducer::fecSlot(), SiStripConfigDb::DeviceAddress::fecSlot_, FedChannelConnection::fedCrate(), FedChannelConnection::fedSlot(), SiStripConfigDb::getDcuDetIds(), SiStripConfigDb::getDeviceDescriptions(), SiStripConfigDb::getFedIds(), SiStripFecKey::i2cAddr(), SiStripConfigDb::DeviceAddress::i2cAddr_, sistrip::invalid32_, getDQMSummary::key, sistrip::LLD_CHAN_MAX, sistrip::LLD_CHAN_MIN, LogTrace, sistrip::mlCabling_, NumberOfDevices::print(), range, python::multivaluedict::sort(), and pyDBSRunClass::temp.
Referenced by buildFecCabling(), and CommissioningHistosUsingDb::CommissioningHistosUsingDb().
00375 { 00376 edm::LogVerbatim(mlCabling_) 00377 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]" 00378 << " Building FEC cabling object from device descriptions..."; 00379 00380 // ---------- Some initialization ---------- 00381 00382 // fec_cabling.clear(); //@@ Need to add method to "clear" FecCabling? 00383 00384 // ---------- Retrieve APV descriptions from database ---------- 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 // ---------- Retrieve DCU descriptions from database ---------- 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 // ---------- Retrieve DCU-DetId vector from database ---------- 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 // ---------- Retrieve FED ids from database ---------- 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 // ---------- Populate FEC cabling object with retrieved info ---------- 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, //@@ temp 00489 addr.fecSlot_, 00490 addr.fecRing_ + sistrip::FEC_RING_OFFSET, //@@ temp 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, //@@ temp, 00513 addr.fecSlot_, 00514 addr.fecRing_ + sistrip::FEC_RING_OFFSET, //@@ temp, 00515 addr.ccuAddr_, 00516 addr.ccuChan_, 00517 0, 0, // APV I2C addresses not used 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 // ---------- Counters used in assigning "dummy" FED ids and channels ---------- 00535 00536 std::vector<uint16_t>::const_iterator ifed = fed_ids.begin(); 00537 uint16_t fed_ch = 0; 00538 00539 // ---------- Assign "dummy" FED crates/slots/ids/chans to constructed modules ---------- 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 // Set number of APV pairs based on devices found 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 // // Add middle LLD channel if missing (to guarantee all FED channels are cabled!) 00580 // if ( imod->nApvPairs() == 2 ) { 00581 // const_cast<SiStripModule&>(*imod).nApvPairs(3); 00582 // FedChannelConnection temp( imod->fecCrate(), 00583 // imod->fecSlot(), 00584 // imod->fecRing(), 00585 // imod->ccuAddr(), 00586 // imod->ccuChan(), 00587 // SiStripFecKey::i2cAddr(2,true), 00588 // SiStripFecKey::i2cAddr(2,false) ); 00589 // const_cast<SiStripModule&>(*imod).addDevices( temp ); 00590 // } 00591 // const_cast<SiStripModule&>(*imod).nApvPairs(0); 00592 00593 // Iterate through APV pairs 00594 for ( uint16_t ipair = 0; ipair < imod->nApvPairs(); ipair++ ) { 00595 00596 // Check FED id and channel 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 // Set "dummy" FED id and channel 00607 pair<uint16_t,uint16_t> addr = imod->activeApvPair( imod->lldChannel(ipair) ); 00608 SiStripModule::FedChannel fed_channel( (*ifed)/16+1, // 16 FEDs per crate, numbering starts from 1 00609 (*ifed)%16+2, // FED slot starts from 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 // ---------- Assign "dummy" devices to remaining FED ids/chans ---------- 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 // Check FED id and channel 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 //if ( std::find( used_keys.begin(), used_keys.end(), key ) != used_keys.end() ) { break; } 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, // npairs 00688 *ifed, 00689 fed_ch ); 00690 uint16_t fed_crate = (*ifed)/16+1; // 16 FEDs per crate, numbering starts from 1 00691 uint16_t fed_slot = (*ifed)%16+2; // FED slot starts from 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 // ---------- Assign DCU and DetIds and then FED cabling ---------- 00715 00716 assignDcuAndDetIds( fec_cabling, dcu_detid_vector ); 00717 00718 }
void SiStripFedCablingBuilderFromDb::buildFecCablingFromFedConnections | ( | SiStripConfigDb * const | db, | |
SiStripFecCabling & | fec_cabling | |||
) | [static] |
Builds the SiStripFecCabling conditions object using information found within the "module.xml" and "dcuinfo.xml" files.
Populates the SiStripFecCabling conditions object that is available via the EventSetup interface.
"Dummy" values are provided when necessary.
The object contains the full FedChannel-Dcu-DetId mapping information.
The map is built using information cached by the SiStripConfigDb object, comprising: 1) the FED channel connections, as found in the "module.xml" file or database; 2) and Dcu-DetId mapping, as found in the "dcuinfo.xml" file or DCU-DetId static table. If any information is missing, the method provides "dummy" values.
Methodology:
1) The FEC cabling object is built using FED channel connection objects.
2) If the DcuId for a module is null (as defined within the connection description), a "dummy" DCU id is provided, based on the control key.
3) The cached Dcu-DetId map is queried for a matching DcuId. If found, the DetId and ApvPairs are updated. The number of APV pairs is checked.
4) If the DCU is not found in the cached map, a "random" DetId is assigned (using the remaining "unassigned" DetIds within the cached map). The DetId is only assigned if the number of APV pairs is consistent with the entry in the cached map.
5) If no appropriate match is found, the DetId is assigned a "dummy" value using an incremented counter (starting from 0xFFFF).
6) All Dcu-DetId mappings are accumulated in a new map, and this modified map is returned by the method.
Definition at line 219 of file SiStripFedCablingBuilderFromDb.cc.
References SiStripFecCabling::addDevices(), assignDcuAndDetIds(), sistrip::FEC_CRATE_OFFSET, sistrip::FEC_RING_OFFSET, FedChannelConnection::fedCrate(), FedChannelConnection::fedSlot(), SiStripConfigDb::getDcuDetIds(), SiStripConfigDb::getFedConnections(), sistrip::invalid_, LogTrace, sistrip::mlCabling_, and range.
Referenced by buildFecCabling().
00220 { 00221 edm::LogVerbatim(mlCabling_) 00222 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]" 00223 << " Building FEC cabling from FED connections descriptions..."; 00224 00225 // ---------- Some initialization ---------- 00226 00227 //fec_cabling.clear(); //@@ Need to add method to "clear" FecCabling? 00228 00229 // ---------- Retrieve connection descriptions from database ---------- 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 // ---------- Retrieve DCU-DetId vector from database ---------- 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 // ---------- Populate FEC cabling object with retrieved info ---------- 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 //uint16_t fec_id = static_cast<uint16_t>( (*ifed)->getFecHardwareId() ); 00273 uint16_t fec_crate = static_cast<uint16_t>( (*ifed)->getFecCrateId() + sistrip::FEC_CRATE_OFFSET ); //@@ temporary 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 ); //@@ temporary 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; //@@ needs implementing! 00280 uint32_t dcu_id = static_cast<uint32_t>( (*ifed)->getDcuHardId() ); 00281 uint32_t det_id = 0; //@@ static_cast<uint32_t>( (*ifed)->getDetId() ); 00282 uint16_t npairs = 0; //@@ static_cast<uint16_t>( (*ifed)->getApvPairs() ); 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; //@@ static_cast<uint16_t>( (*ifed)->getFiberLength() ); 00286 #else 00287 uint16_t fec_crate = static_cast<uint16_t>( (*ifed)->getFecInstance() + sistrip::FEC_CRATE_OFFSET ); //@@ temporary 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 ); //@@ temporary 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; //@@ needs implementing! 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() ); // "internal" numbering scheme 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; // dummy numbering: FED crate starts from 1 (16 FEDs per crate) 00316 fed_slot = id % 16 + 2; // dummy numbering: FED slot starts from 2 (16 FEDs per crate) 00317 #endif 00318 conn.fedCrate( fed_crate ); 00319 conn.fedSlot( fed_slot ); 00320 00321 fec_cabling.addDevices( conn ); 00322 00323 } 00324 00325 // ---------- Assign DCU and DetIds and then FED cabling ---------- 00326 00327 assignDcuAndDetIds( fec_cabling, dcu_detid_vector ); 00328 00329 }
void SiStripFedCablingBuilderFromDb::getFecCabling | ( | const SiStripFedCabling & | in, | |
SiStripFecCabling & | out | |||
) | [static] |
Utility method that takes a FED cabling object as input and returns (as an arg) the corresponding FEC cabling object.
Definition at line 1165 of file SiStripFedCablingBuilderFromDb.cc.
References SiStripFecCabling::buildFecCabling().
void SiStripFedCablingBuilderFromDb::getFedCabling | ( | const SiStripFecCabling & | in, | |
SiStripFedCabling & | out | |||
) | [static] |
Utility method that takes a FEC cabling object as input and returns (as an arg) the corresponding FED cabling object.
Definition at line 1156 of file SiStripFedCablingBuilderFromDb.cc.
References SiStripFedCabling::buildFedCabling(), and SiStripFecCabling::connections().
Referenced by SiStripCondObjBuilderFromDb::buildCondObj(), CommissioningHistosUsingDb::CommissioningHistosUsingDb(), and make().
01157 { 01158 vector<FedChannelConnection> conns; 01159 fec_cabling.connections( conns ); 01160 fed_cabling.buildFedCabling( conns ); 01161 }
SiStripFedCabling * SiStripFedCablingBuilderFromDb::make | ( | const SiStripFedCablingRcd & | ) | [virtual] |
Builds FED cabling using info from configuration database.
Implements SiStripFedCablingESProducer.
Definition at line 54 of file SiStripFedCablingBuilderFromDb.cc.
References buildFecCabling(), SiStripConfigDb::databaseCache(), db_, SiStripConfigDb::deviceFactory(), getFedCabling(), LogTrace, sistrip::mlCabling_, source_, and writeFedCablingToCondDb().
00054 { 00055 LogTrace(mlCabling_) 00056 << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]" 00057 << " Constructing FED cabling..."; 00058 00059 // Create FED cabling object 00060 SiStripFedCabling* fed_cabling = new SiStripFedCabling(); 00061 00062 // Build and retrieve SiStripConfigDb object using service 00063 db_ = edm::Service<SiStripConfigDb>().operator->(); 00064 00065 // Check pointer 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 // Check if DB connection is made 00081 if ( db_->deviceFactory() || 00082 db_->databaseCache() ) { 00083 00084 // Build FEC cabling object 00085 SiStripFecCabling fec_cabling; 00086 buildFecCabling( db_, fec_cabling, source_ ); 00087 00088 // Populate FED cabling object 00089 getFedCabling( fec_cabling, *fed_cabling ); 00090 00091 // Call virtual method that writes FED cabling object to conditions DB 00092 writeFedCablingToCondDb( *fed_cabling ); 00093 00094 // Prints FED cabling 00095 //stringstream ss; 00096 //ss << "[SiStripFedCablingBuilderFromDb::" << __func__ << "]" 00097 //<< " Printing cabling map..." << endl 00098 //<< *fed_cabling; 00099 //LogTrace(mlCabling_) << ss.str(); 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 }
void SiStripFedCablingBuilderFromDb::setIntervalFor | ( | const edm::eventsetup::EventSetupRecordKey & | key, | |
const edm::IOVSyncValue & | iov_sync, | |||
edm::ValidityInterval & | iov_validity | |||
) | [protected, virtual] |
Implements edm::EventSetupRecordIntervalFinder.
Definition at line 1172 of file SiStripFedCablingBuilderFromDb.cc.
References edm::IOVSyncValue::beginOfTime(), edm::IOVSyncValue::endOfTime(), and infinity.
01174 { 01175 edm::ValidityInterval infinity( iov_sync.beginOfTime(), iov_sync.endOfTime() ); 01176 iov_validity = infinity; 01177 }
virtual void SiStripFedCablingBuilderFromDb::writeFedCablingToCondDb | ( | const SiStripFedCabling & | ) | [inline, protected, virtual] |
Virtual method that is called by makeFedCabling() to allow FED cabling to be written to the conds DB (local or otherwise).
Definition at line 91 of file SiStripFedCablingBuilderFromDb.h.
Referenced by make().
SiStripConfigDb* SiStripFedCablingBuilderFromDb::db_ [protected] |
Access to the configuration DB interface class.
Definition at line 94 of file SiStripFedCablingBuilderFromDb.h.
Referenced by make().
Defines "source" (conns, devices, detids) of cabling info.
Definition at line 97 of file SiStripFedCablingBuilderFromDb.h.
Referenced by make(), and SiStripFedCablingBuilderFromDb().