CMS 3D CMS Logo

SiStripFedCablingBuilderFromDb Class Reference

#include <OnlineDB/SiStripESSources/interface/SiStripFedCablingBuilderFromDb.h>

Inheritance diagram for SiStripFedCablingBuilderFromDb:

SiStripFedCablingESProducer edm::EventSetupRecordIntervalFinder edm::ESProducer edm::ESProxyFactoryProducer edm::eventsetup::DataProxyProvider

List of all members.

Public Member Functions

virtual SiStripFedCablingmake (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

SiStripConfigDbdb_
 Access to the configuration DB interface class.
sistrip::CablingSource source_
 Defines "source" (conns, devices, detids) of cabling info.


Detailed Description

Definition at line 19 of file SiStripFedCablingBuilderFromDb.h.


Constructor & Destructor Documentation

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 }


Member Function Documentation

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().

01166                                                                                      {
01167   fec_cabling.buildFecCabling( fed_cabling );
01168 }

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().

00091 {;}


Member Data Documentation

SiStripConfigDb* SiStripFedCablingBuilderFromDb::db_ [protected]

Access to the configuration DB interface class.

Definition at line 94 of file SiStripFedCablingBuilderFromDb.h.

Referenced by make().

sistrip::CablingSource SiStripFedCablingBuilderFromDb::source_ [protected]

Defines "source" (conns, devices, detids) of cabling info.

Definition at line 97 of file SiStripFedCablingBuilderFromDb.h.

Referenced by make(), and SiStripFedCablingBuilderFromDb().


The documentation for this class was generated from the following files:
Generated on Tue Jun 9 18:32:21 2009 for CMSSW by  doxygen 1.5.4