#include <DQM/SiStripCommissioningDbClients/interface/ApvTimingHistosUsingDb.h>
Public Member Functions | |
ApvTimingHistosUsingDb (DQMStore *, SiStripConfigDb *const ) | |
ApvTimingHistosUsingDb (DQMOldReceiver *, SiStripConfigDb *const ) | |
virtual void | uploadConfigurations () |
void | uploadFedSettings (bool) |
void | uploadPllSettings (bool) |
virtual | ~ApvTimingHistosUsingDb () |
Private Member Functions | |
void | create (SiStripConfigDb::AnalysisDescriptionsV &, Analysis) |
void | update (SiStripConfigDb::FedDescriptionsRange) |
bool | update (SiStripConfigDb::DeviceDescriptionsRange) |
Private Attributes | |
bool | uploadFecSettings_ |
bool | uploadFedSettings_ |
Definition at line 9 of file ApvTimingHistosUsingDb.h.
ApvTimingHistosUsingDb::ApvTimingHistosUsingDb | ( | DQMOldReceiver * | mui, | |
SiStripConfigDb * const | db | |||
) |
Definition at line 15 of file ApvTimingHistosUsingDb.cc.
References LogTrace, and sistrip::mlDqmClient_.
00017 : CommissioningHistograms( mui, sistrip::APV_TIMING ), 00018 CommissioningHistosUsingDb( db, mui, sistrip::APV_TIMING ), 00019 ApvTimingHistograms( mui ), 00020 uploadFecSettings_(true), 00021 uploadFedSettings_(true) 00022 { 00023 LogTrace(mlDqmClient_) 00024 << "[ApvTimingHistosUsingDb::" << __func__ << "]" 00025 << " Constructing object..."; 00026 }
ApvTimingHistosUsingDb::ApvTimingHistosUsingDb | ( | DQMStore * | bei, | |
SiStripConfigDb * const | db | |||
) |
Definition at line 30 of file ApvTimingHistosUsingDb.cc.
References LogTrace, and sistrip::mlDqmClient_.
00032 : CommissioningHistosUsingDb( db, sistrip::APV_TIMING ), 00033 ApvTimingHistograms( bei ), 00034 uploadFecSettings_(true), 00035 uploadFedSettings_(true) 00036 { 00037 LogTrace(mlDqmClient_) 00038 << "[ApvTimingHistosUsingDb::" << __func__ << "]" 00039 << " Constructing object..."; 00040 }
ApvTimingHistosUsingDb::~ApvTimingHistosUsingDb | ( | ) | [virtual] |
Definition at line 44 of file ApvTimingHistosUsingDb.cc.
References LogTrace, and sistrip::mlDqmClient_.
00044 { 00045 LogTrace(mlDqmClient_) 00046 << "[ApvTimingHistosUsingDb::" << __func__ << "]" 00047 << " Destructing object..."; 00048 }
void ApvTimingHistosUsingDb::create | ( | SiStripConfigDb::AnalysisDescriptionsV & | desc, | |
Analysis | analysis | |||
) | [private, virtual] |
Reimplemented from CommissioningHistosUsingDb.
Definition at line 395 of file ApvTimingHistosUsingDb.cc.
References ApvTimingAnalysis::base(), CommissioningHistosUsingDb::db(), SiStripConfigDb::dbParams(), ApvTimingAnalysis::delay(), HLT_VtxMuL3::errors, CommissioningAnalysis::fecKey(), CommissioningAnalysis::fedKey(), ApvTimingAnalysis::frameFindingThreshold(), CommissioningAnalysis::getErrorCodes(), ApvTimingAnalysis::height(), SiStripFecKey::i2cAddr(), ApvTimingAnalysis::isValid(), ApvTimingAnalysis::optimumSamplingPoint(), SiStripDbParams::partitions(), ApvTimingAnalysis::peak(), ApvTimingAnalysis::refTime(), ApvTimingAnalysis::tickMarkHeightThreshold_, ApvTimingAnalysis::time(), and tmp.
00396 { 00397 00398 #ifdef USING_NEW_DATABASE_MODEL 00399 00400 ApvTimingAnalysis* anal = dynamic_cast<ApvTimingAnalysis*>( analysis->second ); 00401 if ( !anal ) { return; } 00402 00403 SiStripFecKey fec_key( anal->fecKey() ); 00404 SiStripFedKey fed_key( anal->fedKey() ); 00405 00406 for ( uint16_t iapv = 0; iapv < 2; ++iapv ) { 00407 00408 // std::stringstream ss; 00409 // if ( anal->isValid() ) { ss << " TEST VALID "; } 00410 // else { ss << " TEST INVALID "; } 00411 // ss << std::hex << anal->fecKey() << std::dec << " " 00412 // << anal->base() << " " 00413 // << anal->peak() << " " 00414 // << anal->height() << " " 00415 // << ( anal->base() + anal->height() * ApvTimingAnalysis::frameFindingThreshold_ ) << " " 00416 // << anal->frameFindingThreshold(); 00417 // edm::LogError("TEST") << ss.str(); 00418 00419 // Create description 00420 TimingAnalysisDescription* tmp; 00421 tmp = new TimingAnalysisDescription( anal->time(), 00422 anal->refTime(), 00423 anal->delay(), 00424 anal->height(), 00425 anal->base(), 00426 anal->peak(), 00427 anal->frameFindingThreshold(), 00428 anal->optimumSamplingPoint(), 00429 ApvTimingAnalysis::tickMarkHeightThreshold_, 00430 true, //@@ APV timing analysis (not FED timing) 00431 fec_key.fecCrate(), 00432 fec_key.fecSlot(), 00433 fec_key.fecRing(), 00434 fec_key.ccuAddr(), 00435 fec_key.ccuChan(), 00436 SiStripFecKey::i2cAddr( fec_key.lldChan(), !iapv ), 00437 db()->dbParams().partitions().begin()->second.partitionName(), 00438 db()->dbParams().partitions().begin()->second.runNumber(), 00439 anal->isValid(), 00440 "", 00441 fed_key.fedId(), 00442 fed_key.feUnit(), 00443 fed_key.feChan(), 00444 fed_key.fedApv() ); 00445 00446 // Add comments 00447 typedef std::vector<std::string> Strings; 00448 Strings errors = anal->getErrorCodes(); 00449 Strings::const_iterator istr = errors.begin(); 00450 Strings::const_iterator jstr = errors.end(); 00451 for ( ; istr != jstr; ++istr ) { tmp->addComments( *istr ); } 00452 00453 // Store description 00454 desc.push_back( tmp ); 00455 00456 } 00457 00458 #endif 00459 00460 }
void ApvTimingHistosUsingDb::update | ( | SiStripConfigDb::FedDescriptionsRange | feds | ) | [private] |
Definition at line 280 of file ApvTimingHistosUsingDb.cc.
References addr, ApvTimingAnalysis::base(), CommissioningHistosUsingDb::cabling(), FedChannelConnection::ccuAddr(), FedChannelConnection::ccuChan(), SiStripFedCabling::connection(), CommissioningHistograms::data(), CommissioningHistosUsingDb::deviceIsPresent(), FedChannelConnection::fecCrate(), SiStripFedKey::feChan(), FedChannelConnection::fecRing(), FedChannelConnection::fecSlot(), FedChannelConnection::fedCh(), sistrip::FEDCH_PER_FED, SiStripFedKey::fedChannel(), SiStripFedKey::fedId(), FedChannelConnection::fedId(), SiStripFedCabling::feds(), SiStripFedKey::feUnit(), find(), ApvTimingAnalysis::frameFindingThreshold(), ApvTimingAnalysis::height(), sistrip::invalid_, ApvTimingAnalysis::isValid(), iter, SiStripKey::key(), FedChannelConnection::lldChannel(), sistrip::mlDqmClient_, ApvTimingAnalysis::peak(), ApvTimingAnalysis::print(), and ss.
00280 { 00281 00282 // Retrieve FED ids from cabling 00283 std::vector<uint16_t> ids = cabling()->feds(); 00284 00285 // Iterate through feds and update fed descriptions 00286 uint16_t updated = 0; 00287 SiStripConfigDb::FedDescriptionsV::const_iterator ifed; 00288 for ( ifed = feds.begin(); ifed != feds.end(); ifed++ ) { 00289 00290 // If FED id not found in list (from cabling), then continue 00291 if ( find( ids.begin(), ids.end(), (*ifed)->getFedId() ) == ids.end() ) { continue; } 00292 00293 for ( uint16_t ichan = 0; ichan < sistrip::FEDCH_PER_FED; ichan++ ) { 00294 00295 // Build FED and FEC keys 00296 const FedChannelConnection& conn = cabling()->connection( (*ifed)->getFedId(), ichan ); 00297 if ( conn.fecCrate() == sistrip::invalid_ || 00298 conn.fecSlot() == sistrip::invalid_ || 00299 conn.fecRing() == sistrip::invalid_ || 00300 conn.ccuAddr() == sistrip::invalid_ || 00301 conn.ccuChan() == sistrip::invalid_ || 00302 conn.lldChannel() == sistrip::invalid_ ) { continue; } 00303 SiStripFedKey fed_key( conn.fedId(), 00304 SiStripFedKey::feUnit( conn.fedCh() ), 00305 SiStripFedKey::feChan( conn.fedCh() ) ); 00306 SiStripFecKey fec_key( conn.fecCrate(), 00307 conn.fecSlot(), 00308 conn.fecRing(), 00309 conn.ccuAddr(), 00310 conn.ccuChan(), 00311 conn.lldChannel() ); 00312 00313 // Locate appropriate analysis object 00314 Analyses::const_iterator iter = data().find( fec_key.key() ); 00315 if ( iter != data().end() ) { 00316 00317 ApvTimingAnalysis* anal = dynamic_cast<ApvTimingAnalysis*>( iter->second ); 00318 if ( !anal ) { 00319 edm::LogError(mlDqmClient_) 00320 << "[ApvTimingHistosUsingDb::" << __func__ << "]" 00321 << " NULL pointer to analysis object!"; 00322 continue; 00323 } 00324 00325 // Update frame finding threshold 00326 Fed9U::Fed9UAddress addr( ichan ); 00327 uint16_t old_threshold = static_cast<uint16_t>( (*ifed)->getFrameThreshold( addr ) ); 00328 if ( anal->isValid() ) { 00329 (*ifed)->setFrameThreshold( addr, anal->frameFindingThreshold() ); 00330 updated++; 00331 } 00332 uint16_t new_threshold = static_cast<uint16_t>( (*ifed)->getFrameThreshold( addr ) ); 00333 00334 // Debug 00335 std::stringstream ss; 00336 ss << "[ApvTimingHistosUsingDb::" << __func__ << "]"; 00337 if ( anal->isValid() ) { 00338 ss << " Updating the frame-finding threshold" 00339 << " from " << old_threshold 00340 << " to " << new_threshold 00341 << " using tick mark base/peak/height " 00342 << anal->base() << "/" 00343 << anal->peak() << "/" 00344 << anal->height(); 00345 } else { 00346 ss << " Cannot update the frame-finding threshold" 00347 << " from " << old_threshold 00348 << " to a new value using invalid analysis "; 00349 } 00350 ss << " for crate/FEC/ring/CCU/module/LLD " 00351 << fec_key.fecCrate() << "/" 00352 << fec_key.fecSlot() << "/" 00353 << fec_key.fecRing() << "/" 00354 << fec_key.ccuAddr() << "/" 00355 << fec_key.ccuChan() 00356 << fec_key.channel() 00357 << " and FED id/ch " 00358 << fed_key.fedId() << "/" 00359 << fed_key.fedChannel(); 00360 anal->print(ss); 00361 //LogTrace(mlDqmClient_) << ss.str(); 00362 00363 } else { 00364 if ( deviceIsPresent(fec_key) ) { 00365 std::stringstream ss; 00366 ss << "[ApvTimingHistosUsingDb::" << __func__ << "]" 00367 << " Unable to find analysis object and update ticker thresholds" 00368 << " for key/crate/FEC/ring/CCU/module/LLD " 00369 << std::hex << std::setw(8) << std::setfill('0') << fec_key.key() << std::dec 00370 << fec_key.fecCrate() << "/" 00371 << fec_key.fecSlot() << "/" 00372 << fec_key.fecRing() << "/" 00373 << fec_key.ccuAddr() << "/" 00374 << fec_key.ccuChan() << "/" 00375 << fec_key.channel() 00376 << " and FED key/id/ch " 00377 << std::hex << std::setw(8) << std::setfill('0') << fed_key.key() << std::dec 00378 << fed_key.fedId() << "/" 00379 << fed_key.fedChannel(); 00380 edm::LogWarning(mlDqmClient_) << ss.str(); 00381 } 00382 } 00383 } 00384 } 00385 00386 edm::LogVerbatim(mlDqmClient_) 00387 << "[ApvTimingHistosUsingDb::" << __func__ << "]" 00388 << " Updated ticker thresholds for " << updated 00389 << " channels on " << ids.size() << " FEDs!"; 00390 00391 }
bool ApvTimingHistosUsingDb::update | ( | SiStripConfigDb::DeviceDescriptionsRange | devices | ) | [private] |
Definition at line 131 of file ApvTimingHistosUsingDb.cc.
References CommissioningHistosUsingDb::addProblemDevice(), addr, SiStripFecKey::ccuAddr(), SiStripConfigDb::DeviceAddress::ccuAddr_, SiStripFecKey::ccuChan(), SiStripConfigDb::DeviceAddress::ccuChan_, SiStripKey::channel(), sistrip::CHANS_PER_LLD, CommissioningHistograms::data(), CommissioningHistosUsingDb::db(), ApvTimingAnalysis::delay(), SiStripConfigDb::deviceAddress(), CommissioningHistosUsingDb::deviceIsPresent(), SiStripFecKey::fecCrate(), SiStripConfigDb::DeviceAddress::fecCrate_, SiStripFecKey::fecRing(), SiStripConfigDb::DeviceAddress::fecRing_, SiStripFecKey::fecSlot(), SiStripConfigDb::DeviceAddress::fecSlot_, reco::method::invalid, sistrip::invalid_, edm::isDebugEnabled(), iter, SiStripKey::key(), LogTrace, sistrip::mlDqmClient_, and ss.
Referenced by uploadConfigurations().
00131 { 00132 00133 // Iterate through devices and update device descriptions 00134 uint16_t updated = 0; 00135 std::vector<SiStripFecKey> invalid; 00136 SiStripConfigDb::DeviceDescriptionsV::const_iterator idevice; 00137 for ( idevice = devices.begin(); idevice != devices.end(); idevice++ ) { 00138 00139 // Check device type 00140 if ( (*idevice)->getDeviceType() != PLL ) { continue; } 00141 00142 // Cast to retrieve appropriate description object 00143 pllDescription* desc = dynamic_cast<pllDescription*>( *idevice ); 00144 if ( !desc ) { continue; } 00145 00146 // Retrieve device addresses from device description 00147 const SiStripConfigDb::DeviceAddress& addr = db()->deviceAddress(*desc); 00148 SiStripFecKey fec_path; 00149 00150 // PLL delay settings 00151 uint32_t coarse = sistrip::invalid_; 00152 uint32_t fine = sistrip::invalid_; 00153 00154 // Iterate through LLD channels 00155 for ( uint16_t ichan = 0; ichan < sistrip::CHANS_PER_LLD; ichan++ ) { 00156 00157 // Construct key from device description 00158 SiStripFecKey fec_key( addr.fecCrate_, 00159 addr.fecSlot_, 00160 addr.fecRing_, 00161 addr.ccuAddr_, 00162 addr.ccuChan_, 00163 ichan+1 ); 00164 fec_path = fec_key; 00165 00166 // Locate appropriate analysis object 00167 Analyses::const_iterator iter = data().find( fec_key.key() ); 00168 if ( iter != data().end() ) { 00169 00170 if ( !iter->second->isValid() ) { 00171 addProblemDevice( fec_key ); //@@ Remove problem device 00172 continue; 00173 } 00174 00175 ApvTimingAnalysis* anal = dynamic_cast<ApvTimingAnalysis*>( iter->second ); 00176 if ( !anal ) { 00177 edm::LogError(mlDqmClient_) 00178 << "[ApvTimingHistosUsingDb::" << __func__ << "]" 00179 << " NULL pointer to analysis object!"; 00180 continue; 00181 } 00182 00183 // Calculate coarse and fine delays 00184 uint32_t delay = static_cast<uint32_t>( rint( anal->delay() * 24. / 25. ) ); 00185 coarse = static_cast<uint16_t>( desc->getDelayCoarse() ) 00186 + ( static_cast<uint16_t>( desc->getDelayFine() ) + delay ) / 24; 00187 fine = ( static_cast<uint16_t>( desc->getDelayFine() ) + delay ) % 24; 00188 00189 // Record PPLs maximum coarse setting 00190 if ( coarse > 15 ) { invalid.push_back(fec_key); } 00191 00192 } else { 00193 if ( deviceIsPresent(fec_key) ) { 00194 edm::LogWarning(mlDqmClient_) 00195 << "[ApvTimingHistosUsingDb::" << __func__ << "]" 00196 << " Unable to find FEC key with params crate/FEC/ring/CCU/module/LLD: " 00197 << fec_key.fecCrate() << "/" 00198 << fec_key.fecSlot() << "/" 00199 << fec_key.fecRing() << "/" 00200 << fec_key.ccuAddr() << "/" 00201 << fec_key.ccuChan() << "/" 00202 << fec_key.channel(); 00203 } 00204 } 00205 00206 // Exit LLD channel loop if coarse and fine delays are known 00207 if ( coarse != sistrip::invalid_ && 00208 fine != sistrip::invalid_ ) { break; } 00209 00210 } // lld channel loop 00211 00212 // Update PLL settings 00213 if ( coarse != sistrip::invalid_ && 00214 fine != sistrip::invalid_ ) { 00215 00216 if ( edm::isDebugEnabled() ) { 00217 std::stringstream ss; 00218 ss << "[ApvTimingHistosUsingDb::" << __func__ << "]" 00219 << " Updating coarse/fine PLL settings" 00220 << " for crate/FEC/ring/CCU/module " 00221 << fec_path.fecCrate() << "/" 00222 << fec_path.fecSlot() << "/" 00223 << fec_path.fecRing() << "/" 00224 << fec_path.ccuAddr() << "/" 00225 << fec_path.ccuChan() 00226 << " from " 00227 << static_cast<uint16_t>( desc->getDelayCoarse() ) << "/" 00228 << static_cast<uint16_t>( desc->getDelayFine() ); 00229 desc->setDelayCoarse(coarse); 00230 desc->setDelayFine(fine); 00231 updated++; 00232 ss << " to " 00233 << static_cast<uint16_t>( desc->getDelayCoarse() ) << "/" 00234 << static_cast<uint16_t>( desc->getDelayFine() ); 00235 LogTrace(mlDqmClient_) << ss.str(); 00236 } 00237 00238 } else { 00239 edm::LogWarning(mlDqmClient_) 00240 << "[ApvTimingHistosUsingDb::" << __func__ << "]" 00241 << " Invalid PLL delay settings for crate/FEC/ring/CCU/module " 00242 << fec_path.fecCrate() << "/" 00243 << fec_path.fecSlot() << "/" 00244 << fec_path.fecRing() << "/" 00245 << fec_path.ccuAddr() << "/" 00246 << fec_path.ccuChan(); 00247 } 00248 00249 } 00250 00251 // Check if invalid settings were found 00252 if ( !invalid.empty() ) { 00253 std::stringstream ss; 00254 ss << "[ApvTimingHistosUsingDb::" << __func__ << "]" 00255 << " Found PLL coarse setting of >15" 00256 << " (not allowed!) for " 00257 << invalid.size() 00258 << " channels"; 00259 ss << " (Example is crate/FEC/ring/CCU/module/LLD: " 00260 << invalid.front().fecCrate() << "/" 00261 << invalid.front().fecSlot() << "/" 00262 << invalid.front().fecRing() << "/" 00263 << invalid.front().ccuAddr() << "/" 00264 << invalid.front().ccuChan() << "/" 00265 << invalid.front().channel(); 00266 edm::LogWarning(mlDqmClient_) << ss.str(); 00267 return false; 00268 } 00269 00270 edm::LogVerbatim(mlDqmClient_) 00271 << "[ApvTimingHistosUsingDb::" << __func__ << "]" 00272 << " Updated PLL settings for " 00273 << updated << " modules"; 00274 return true; 00275 00276 }
void ApvTimingHistosUsingDb::uploadConfigurations | ( | ) | [virtual] |
Reimplemented from CommissioningHistosUsingDb.
Definition at line 52 of file ApvTimingHistosUsingDb.cc.
References CommissioningHistosUsingDb::db(), CommissioningHistosUsingDb::doUploadConf(), SiStripConfigDb::getDeviceDescriptions(), SiStripConfigDb::getFedDescriptions(), LogTrace, sistrip::mlDqmClient_, update(), SiStripConfigDb::uploadDeviceDescriptions(), uploadFecSettings_, SiStripConfigDb::uploadFedDescriptions(), and uploadFedSettings_.
00052 { 00053 LogTrace(mlDqmClient_) 00054 << "[ApvTimingHistosUsingDb::" << __func__ << "]"; 00055 00056 if ( !db() ) { 00057 edm::LogError(mlDqmClient_) 00058 << "[ApvTimingHistosUsingDb::" << __func__ << "]" 00059 << " NULL pointer to SiStripConfigDb interface!" 00060 << " Aborting upload..."; 00061 return; 00062 } 00063 00064 if ( uploadFecSettings_ ) { 00065 00066 // Retrieve and update PLL device descriptions 00067 SiStripConfigDb::DeviceDescriptionsRange devices = db()->getDeviceDescriptions( PLL ); 00068 bool upload = update( devices ); 00069 00070 // Check if new PLL settings are valid 00071 if ( !upload ) { 00072 edm::LogError(mlDqmClient_) 00073 << "[ApvTimingHistosUsingDb::" << __func__ << "]" 00074 << " Found invalid PLL settings (coarse > 15)" 00075 << " Aborting update to database..."; 00076 return; 00077 } 00078 00079 // Upload PLL device descriptions 00080 if ( doUploadConf() ) { 00081 edm::LogVerbatim(mlDqmClient_) 00082 << "[ApvTimingHistosUsingDb::" << __func__ << "]" 00083 << " Uploading PLL settings to DB..."; 00084 db()->uploadDeviceDescriptions(); 00085 edm::LogVerbatim(mlDqmClient_) 00086 << "[ApvTimingHistosUsingDb::" << __func__ << "]" 00087 << " Upload of PLL settings to DB finished!"; 00088 } else { 00089 edm::LogWarning(mlDqmClient_) 00090 << "[ApvTimingHistosUsingDb::" << __func__ << "]" 00091 << " TEST only! No PLL settings will be uploaded to DB..."; 00092 } 00093 00094 } else { 00095 LogTrace(mlDqmClient_) 00096 << "[ApvTimingHistosUsingDb::" << __func__ << "]" 00097 << " No upload of PLL settings to DB, as defined by .cfg file!"; 00098 } 00099 00100 if ( uploadFedSettings_ ) { 00101 00102 // Update FED descriptions with new ticker thresholds 00103 SiStripConfigDb::FedDescriptionsRange feds = db()->getFedDescriptions(); 00104 update( feds ); 00105 00106 // Update FED descriptions with new ticker thresholds 00107 if ( doUploadConf() ) { 00108 edm::LogVerbatim(mlDqmClient_) 00109 << "[ApvTimingHistosUsingDb::" << __func__ << "]" 00110 << " Uploading FED ticker thresholds to DB..."; 00111 db()->uploadFedDescriptions(); 00112 edm::LogVerbatim(mlDqmClient_) 00113 << "[ApvTimingHistosUsingDb::" << __func__ << "]" 00114 << " Upload of FED ticker thresholds to DB finished!"; 00115 } else { 00116 edm::LogWarning(mlDqmClient_) 00117 << "[ApvTimingHistosUsingDb::" << __func__ << "]" 00118 << " TEST only! No FED ticker thresholds will be uploaded to DB..."; 00119 } 00120 00121 } else { 00122 LogTrace(mlDqmClient_) 00123 << "[ApvTimingHistosUsingDb::" << __func__ << "]" 00124 << " No Upload of FED ticker thresholds to DB, as defined by .cfg file!"; 00125 } 00126 00127 }
Definition at line 44 of file ApvTimingHistosUsingDb.h.
References uploadFedSettings_.
Referenced by SiStripCommissioningOfflineDbClient::createHistos().
00044 { uploadFedSettings_ = upload; }
Definition at line 43 of file ApvTimingHistosUsingDb.h.
References uploadFecSettings_.
Referenced by SiStripCommissioningOfflineDbClient::createHistos().
00043 { uploadFecSettings_ = upload; }
Definition at line 35 of file ApvTimingHistosUsingDb.h.
Referenced by uploadConfigurations(), and uploadPllSettings().
Definition at line 37 of file ApvTimingHistosUsingDb.h.
Referenced by uploadConfigurations(), and uploadFedSettings().