Go to the documentation of this file.00001
00002
00003 #include "OnlineDB/SiStripConfigDb/interface/SiStripConfigDb.h"
00004 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00005 #include <ostream>
00006
00007 using namespace std;
00008 using namespace sistrip;
00009
00010
00011
00012 SiStripConfigDb::FedConnectionsRange SiStripConfigDb::getFedConnections( std::string partition ) {
00013
00014
00015 if ( ( !dbParams_.usingDbCache() && !deviceFactory(__func__) ) ||
00016 ( dbParams_.usingDbCache() && !databaseCache(__func__) ) ) {
00017 return connections_.emptyRange();
00018 }
00019
00020 try {
00021
00022 if ( !dbParams_.usingDbCache() ) {
00023
00024 SiStripDbParams::SiStripPartitions::const_iterator iter = dbParams_.partitions().begin();
00025 SiStripDbParams::SiStripPartitions::const_iterator jter = dbParams_.partitions().end();
00026 for ( ; iter != jter; ++iter ) {
00027
00028 if ( partition == "" || partition == iter->second.partitionName() ) {
00029
00030 if ( iter->second.partitionName() == SiStripPartition::defaultPartitionName_ ) { continue; }
00031
00032 FedConnectionsRange range = connections_.find( iter->second.partitionName() );
00033 if ( range == connections_.emptyRange() ) {
00034
00035 FedConnectionsV tmp2;
00036
00037
00038 FedConnectionsV tmp1;
00039 deviceFactory(__func__)->getConnectionDescriptions( iter->second.partitionName(),
00040 tmp1,
00041 iter->second.cabVersion().first,
00042 iter->second.cabVersion().second,
00043 #ifdef USING_DATABASE_MASKING
00044 iter->second.maskVersion().first,
00045 iter->second.maskVersion().second,
00046 #endif
00047 false );
00048
00049
00050 ConnectionFactory::vectorCopyI( tmp2, tmp1, true );
00051
00052
00053 connections_.loadNext( iter->second.partitionName(), tmp2 );
00054
00055
00056 FedConnectionsRange conns = connections_.find( iter->second.partitionName() );
00057 std::stringstream ss;
00058 ss << "[SiStripConfigDb::" << __func__ << "]"
00059 << " Downloaded " << conns.size()
00060 << " FED connections to local cache for partition \""
00061 << iter->second.partitionName() << "\"" << std::endl;
00062 ss << "[SiStripConfigDb::" << __func__ << "]"
00063 << " Cache holds FED connections for "
00064 << connections_.size() << " partitions.";
00065 LogTrace(mlConfigDb_) << ss.str();
00066
00067 }
00068
00069 }
00070
00071 }
00072
00073 } else {
00074
00075 FedConnectionsV* tmp1 = databaseCache(__func__)->getConnections();
00076
00077 if ( tmp1 ) {
00078
00079
00080 FedConnectionsV tmp2;
00081 ConnectionFactory::vectorCopyI( tmp2, *tmp1, true );
00082
00083
00084 connections_.loadNext( SiStripPartition::defaultPartitionName_, tmp2 );
00085
00086 } else {
00087 edm::LogWarning(mlConfigDb_)
00088 << "[SiStripConfigDb::" << __func__ << "]"
00089 << " NULL pointer to FedConnections vector!";
00090 }
00091
00092 }
00093
00094 } catch (...) { handleException( __func__ ); }
00095
00096
00097 uint16_t np = 0;
00098 uint16_t nc = 0;
00099 FedConnectionsRange conns;
00100 if ( partition != "" ) {
00101 conns = connections_.find( partition );
00102 np = 1;
00103 nc = conns.size();
00104 } else {
00105 if ( !connections_.empty() ) {
00106 conns = FedConnectionsRange( connections_.find( dbParams_.partitions().begin()->second.partitionName() ).begin(),
00107 connections_.find( (--(dbParams_.partitions().end()))->second.partitionName() ).end() );
00108 } else { conns = connections_.emptyRange(); }
00109 np = connections_.size();
00110 nc = conns.size();
00111 }
00112
00113 stringstream ss;
00114 ss << "[SiStripConfigDb::" << __func__ << "]"
00115 << " Found " << nc << " FED connections";
00116 if ( !dbParams_.usingDb() ) { ss << " in " << dbParams_.inputModuleXmlFiles().size() << " 'module.xml' file(s)"; }
00117 else { if ( !dbParams_.usingDbCache() ) { ss << " in " << np << " database partition(s)"; }
00118 else { ss << " from shared memory name '" << dbParams_.sharedMemory() << "'"; } }
00119 if ( connections_.empty() ) { edm::LogWarning(mlConfigDb_) << ss.str(); }
00120 else { LogTrace(mlConfigDb_) << ss.str(); }
00121
00122 return conns;
00123
00124 }
00125
00126
00127
00128 void SiStripConfigDb::addFedConnections( std::string partition, FedConnectionsV& conns ) {
00129
00130 if ( !deviceFactory(__func__) ) { return; }
00131
00132 if ( partition.empty() ) {
00133 stringstream ss;
00134 ss << "[SiStripConfigDb::" << __func__ << "]"
00135 << " Partition string is empty,"
00136 << " therefore cannot add FED connections to local cache!";
00137 edm::LogWarning(mlConfigDb_) << ss.str();
00138 return;
00139 }
00140
00141 if ( conns.empty() ) {
00142 stringstream ss;
00143 ss << "[SiStripConfigDb::" << __func__ << "]"
00144 << " Vector of FED connections is empty,"
00145 << " therefore cannot add FED connections to local cache!";
00146 edm::LogWarning(mlConfigDb_) << ss.str();
00147 return;
00148 }
00149
00150 SiStripDbParams::SiStripPartitions::const_iterator iter = dbParams_.partitions().begin();
00151 SiStripDbParams::SiStripPartitions::const_iterator jter = dbParams_.partitions().end();
00152 for ( ; iter != jter; ++iter ) { if ( partition == iter->second.partitionName() ) { break; } }
00153 if ( iter == dbParams_.partitions().end() ) {
00154 stringstream ss;
00155 ss << "[SiStripConfigDb::" << __func__ << "]"
00156 << " Partition \"" << partition
00157 << "\" not found in partition list, "
00158 << " therefore cannot add FED connections!";
00159 edm::LogWarning(mlConfigDb_) << ss.str();
00160 return;
00161 }
00162
00163 FedConnectionsRange range = connections_.find( partition );
00164 if ( range == connections_.emptyRange() ) {
00165
00166
00167 FedConnectionsV tmp;
00168 ConnectionFactory::vectorCopyI( tmp, conns, true );
00169
00170
00171 connections_.loadNext( partition, tmp );
00172
00173
00174 std::stringstream ss;
00175 ss << "[SiStripConfigDb::" << __func__ << "]"
00176 << " Added " << conns.size()
00177 << " FED connections to local cache for partition \""
00178 << partition << "\"" << std::endl;
00179 ss << "[SiStripConfigDb::" << __func__ << "]"
00180 << " Cache holds FED connections for "
00181 << connections_.size() << " partitions.";
00182 LogTrace(mlConfigDb_) << ss.str();
00183
00184 } else {
00185 stringstream ss;
00186 ss << "[SiStripConfigDb::" << __func__ << "]"
00187 << " Partition \"" << partition
00188 << "\" already found in local cache, "
00189 << " therefore cannot add new FED connections!";
00190 edm::LogWarning(mlConfigDb_) << ss.str();
00191 return;
00192 }
00193
00194 }
00195
00196
00197
00198 void SiStripConfigDb::uploadFedConnections( std::string partition ) {
00199
00200 if ( dbParams_.usingDbCache() ) {
00201 edm::LogWarning(mlConfigDb_)
00202 << "[SiStripConfigDb::" << __func__ << "]"
00203 << " Using database cache! No uploads allowed!";
00204 return;
00205 }
00206
00207 if ( !deviceFactory(__func__) ) { return; }
00208
00209 if ( connections_.empty() ) {
00210 stringstream ss;
00211 ss << "[SiStripConfigDb::" << __func__ << "]"
00212 << " Found no cached FED connections, therefore no upload!";
00213 edm::LogWarning(mlConfigDb_) << ss.str();
00214 return;
00215 }
00216
00217 if ( dbParams_.usingDb() ) {
00218
00219 try {
00220
00221 SiStripDbParams::SiStripPartitions::const_iterator iter = dbParams_.partitions().begin();
00222 SiStripDbParams::SiStripPartitions::const_iterator jter = dbParams_.partitions().end();
00223 for ( ; iter != jter; ++iter ) {
00224
00225 if ( partition == "" || partition == iter->second.partitionName() ) {
00226
00227 FedConnectionsRange range = connections_.find( iter->second.partitionName() );
00228 if ( range != connections_.emptyRange() ) {
00229
00230 FedConnectionsV conns( range.begin(), range.end() );
00231
00232 deviceFactory(__func__)->setConnectionDescriptions( conns,
00233 iter->second.partitionName(),
00234 &(iter->second.cabVersion().first),
00235 &(iter->second.cabVersion().second),
00236 true );
00237
00238
00239 std::stringstream ss;
00240 ss << "[SiStripConfigDb::" << __func__ << "]"
00241 << " Uploaded " << conns.size()
00242 << " FED connections to database for partition \""
00243 << iter->second.partitionName() << "\".";
00244 LogTrace(mlConfigDb_) << ss.str();
00245
00246 } else {
00247 stringstream ss;
00248 ss << "[SiStripConfigDb::" << __func__ << "]"
00249 << " Vector of FED connections is empty for partition \""
00250 << iter->second.partitionName()
00251 << "\", therefore aborting upload for this partition!";
00252 edm::LogWarning(mlConfigDb_) << ss.str();
00253 continue;
00254 }
00255
00256 } else {
00257
00258
00259
00260
00261
00262
00263
00264 }
00265
00266 }
00267
00268 } catch (...) { handleException( __func__ ); }
00269
00270 }
00271
00272 allowCalibUpload_ = true;
00273
00274 }
00275
00276
00277
00278 void SiStripConfigDb::clearFedConnections( std::string partition ) {
00279 LogTrace(mlConfigDb_) << "[SiStripConfigDb::" << __func__ << "]";
00280
00281 if ( connections_.empty() ) {
00282 stringstream ss;
00283 ss << "[SiStripConfigDb::" << __func__ << "]"
00284 << " Found no cached FED connections!";
00285
00286 return;
00287 }
00288
00289
00290 FedConnections temporary_cache;
00291 if ( partition == "" ) { temporary_cache = FedConnections(); }
00292 else {
00293 SiStripDbParams::SiStripPartitions::const_iterator iter = dbParams_.partitions().begin();
00294 SiStripDbParams::SiStripPartitions::const_iterator jter = dbParams_.partitions().end();
00295 for ( ; iter != jter; ++iter ) {
00296 if ( partition != iter->second.partitionName() ) {
00297 FedConnectionsRange range = connections_.find( iter->second.partitionName() );
00298 if ( range != connections_.emptyRange() ) {
00299 temporary_cache.loadNext( partition, FedConnectionsV( range.begin(), range.end() ) );
00300 } else {
00301
00302
00303
00304
00305
00306 }
00307 }
00308 }
00309 }
00310
00311
00312 FedConnectionsRange conns;
00313 if ( partition == "" ) {
00314 if ( !connections_.empty() ) {
00315 conns = FedConnectionsRange( connections_.find( dbParams_.partitions().begin()->second.partitionName() ).begin(),
00316 connections_.find( (--(dbParams_.partitions().end()))->second.partitionName() ).end() );
00317 } else { conns = connections_.emptyRange(); }
00318 } else {
00319 SiStripDbParams::SiStripPartitions::const_iterator iter = dbParams_.partitions().begin();
00320 SiStripDbParams::SiStripPartitions::const_iterator jter = dbParams_.partitions().end();
00321 for ( ; iter != jter; ++iter ) { if ( partition == iter->second.partitionName() ) { break; } }
00322 conns = connections_.find( iter->second.partitionName() );
00323 }
00324
00325 if ( conns != connections_.emptyRange() ) {
00326 FedConnectionsV::const_iterator ifed = conns.begin();
00327 FedConnectionsV::const_iterator jfed = conns.end();
00328 for ( ; ifed != jfed; ++ifed ) { if ( *ifed ) { delete *ifed; } }
00329 } else {
00330 stringstream ss;
00331 ss << "[SiStripConfigDb::" << __func__ << "]";
00332 if ( partition == "" ) { ss << " Found no FED connections in local cache!"; }
00333 else { ss << " Found no FED connections in local cache for partition \"" << partition << "\"!"; }
00334 edm::LogWarning(mlConfigDb_) << ss.str();
00335 }
00336
00337
00338 connections_ = temporary_cache;
00339
00340 }
00341
00342
00343
00344 void SiStripConfigDb::printFedConnections( std::string partition ) {
00345
00346 std::stringstream ss;
00347 ss << "[SiStripConfigDb::" << __func__ << "]"
00348 << " Contents of FedConnections container:" << std::endl;
00349 ss << " Number of partitions: " << connections_.size() << std::endl;
00350
00351
00352 uint16_t cntr = 0;
00353 FedConnections::const_iterator iconn = connections_.begin();
00354 FedConnections::const_iterator jconn = connections_.end();
00355 for ( ; iconn != jconn; ++iconn ) {
00356
00357 cntr++;
00358 if ( partition == "" || partition == iconn->first ) {
00359
00360 ss << " Partition number : " << cntr << " (out of " << connections_.size() << ")" << std::endl;
00361 ss << " Partition name : \"" << iconn->first << "\"" << std::endl;
00362 ss << " Num of connections : " << iconn->second.size() << std::endl;
00363
00364
00365 std::map< uint16_t, vector<uint16_t> > feds;
00366 FedConnectionsV::const_iterator iter = iconn->second.begin();
00367 FedConnectionsV::const_iterator jter = iconn->second.end();
00368 for ( ; iter != jter; ++iter ) {
00369 if ( *iter ) {
00370 uint16_t fed_id = (*iter)->getFedId();
00371 uint16_t fed_ch = (*iter)->getFedChannel();
00372 if ( find( feds[fed_id].begin(), feds[fed_id].end(), fed_ch ) == feds[fed_id].end() ) {
00373 feds[fed_id].push_back( fed_ch );
00374 }
00375 }
00376 }
00377
00378
00379 std::map< uint16_t, std::vector<uint16_t> > tmp;
00380 std::map< uint16_t, std::vector<uint16_t> >::const_iterator ii = feds.begin();
00381 std::map< uint16_t, std::vector<uint16_t> >::const_iterator jj = feds.end();
00382 for ( ; ii != jj; ++ii ) {
00383 std::vector<uint16_t> temp = ii->second;
00384 std::sort( temp.begin(), temp.end() );
00385 std::vector<uint16_t>::const_iterator iii = temp.begin();
00386 std::vector<uint16_t>::const_iterator jjj = temp.end();
00387 for ( ; iii != jjj; ++iii ) { tmp[ii->first].push_back( *iii ); }
00388 }
00389 feds.clear();
00390 feds = tmp;
00391
00392
00393 std::map< uint16_t, std::vector<uint16_t> >::const_iterator ifed = feds.begin();
00394 std::map< uint16_t, std::vector<uint16_t> >::const_iterator jfed = feds.end();
00395 for ( ; ifed != jfed; ++ifed ) {
00396 ss << " Found " << std::setw(2) << ifed->second.size()
00397 << " channels for FED id " << std::setw(3) << ifed->first << " : ";
00398 if ( !ifed->second.empty() ) {
00399 uint16_t first = ifed->second.front();
00400 uint16_t last = ifed->second.front();
00401 std::vector<uint16_t>::const_iterator ichan = ifed->second.begin();
00402 std::vector<uint16_t>::const_iterator jchan = ifed->second.end();
00403 for ( ; ichan != jchan; ++ichan ) {
00404 if ( ichan != ifed->second.begin() ) {
00405 if ( *ichan != last+1 ) {
00406 ss << std::setw(2) << first << "->" << std::setw(2) << last << ", ";
00407 if ( ichan != ifed->second.end() ) { first = *(ichan+1); }
00408 }
00409 }
00410 last = *ichan;
00411 }
00412 if ( first != last ) { ss << std::setw(2) << first << "->" << std::setw(2) << last; }
00413 ss << std::endl;
00414 }
00415 }
00416
00417 }
00418
00419 }
00420
00421 LogTrace(mlConfigDb_) << ss.str();
00422
00423 }