00001 #include "DbiCableSvc.h"
00002 #include "GaudiKernel/IMessageSvc.h"
00003
00004 #include "genDbi/GFeeCableMap.h"
00005
00006 #include "Conventions/Hardware.h"
00007 #include "Conventions/Electronics.h"
00008 #include "DatabaseInterface/Dbi.h"
00009 #include "DatabaseInterface/DbiResultAgg.h"
00010 #include "DatabaseInterface/DbiCascader.h"
00011 #include "DatabaseInterface/DbiConfigSet.h"
00012 #include "DatabaseInterface/DbiLogEntry.h"
00013 #include "DatabaseInterface/DbiResultKey.h"
00014 #include "DatabaseInterface/DbiResultNonAgg.h"
00015 #include "DatabaseInterface/DbiResultPtr.h"
00016 #include "DatabaseInterface/DbiResultSet.h"
00017 #include "DatabaseInterface/DbiServices.h"
00018 #include "DatabaseInterface/DbiValRecSet.h"
00019 #include "DatabaseInterface/DbiLog.h"
00020 #include "DatabaseInterface/DbiCache.h"
00021 #include "DatabaseInterface/DbiSqlContext.h"
00022 #include <sstream>
00023 #include <fstream>
00024
00025 DayaBay::Detector DbiCableSvc::s_unknownSiteDet =
00026 DayaBay::Detector(Site::kUnknown,DetectorId::kUnknown);
00027
00028 DayaBay::Detector DbiCableSvc::s_allSiteDet =
00029 DayaBay::Detector(Site::kAll,DetectorId::kAll);
00030
00031 DbiCableSvc::DbiCableSvc(const std::string& name, ISvcLocator *svc)
00032 : Service(name,svc)
00033 {
00034 }
00035
00036 DbiCableSvc::~DbiCableSvc()
00037 {
00038 }
00039
00040 StatusCode DbiCableSvc::initialize()
00041 {
00042 this->Service::initialize();
00043
00044
00045
00046
00047
00048
00049
00050 MsgStream msg(msgSvc(),name());
00051 feeLastResult = 0;
00052 return StatusCode::SUCCESS;
00053 }
00054
00055 StatusCode DbiCableSvc::finalize()
00056 {
00057 return this->Service::finalize();
00058 }
00059
00060 StatusCode DbiCableSvc::queryInterface(const InterfaceID& riid,
00061 void** ppvInterface)
00062 {
00063 StatusCode sc = StatusCode::FAILURE;
00064 if (ppvInterface) {
00065 *ppvInterface = 0;
00066
00067 if (ICableSvc::interfaceID().versionMatch(riid)) {
00068 *ppvInterface = static_cast<ICableSvc*>(this);
00069 sc = StatusCode::SUCCESS;
00070 addRef();
00071 }
00072 else sc = Service::queryInterface( riid, ppvInterface );
00073 }
00074 return sc;
00075 }
00076
00077 const std::vector<DayaBay::HardwareId>& DbiCableSvc::hardwareIds(const ServiceMode& serviceMode)
00078 {
00079 readFeeTable(serviceMode);
00080 return m_hardwareIds;
00081 }
00082
00083 const std::vector<DayaBay::PmtHardwareId>& DbiCableSvc::pmtHardwareIds(const ServiceMode& serviceMode)
00084 {
00085 readFeeTable(serviceMode);
00086 return m_pmtHardwareIds;
00087 }
00088
00089 const std::vector<DayaBay::RpcHardwareId>& DbiCableSvc::rpcHardwareIds(const ServiceMode& serviceMode)
00090 {
00091 readFeeTable(serviceMode);
00092 return m_rpcHardwareIds;
00093 }
00094
00095 const std::vector<DayaBay::FeeHardwareId>& DbiCableSvc::feeHardwareIds(const ServiceMode& serviceMode)
00096 {
00097 readFeeTable(serviceMode);
00098 return m_feeHardwareIds;
00099 }
00100
00101 const std::vector<DayaBay::FecHardwareId>& DbiCableSvc::fecHardwareIds(const ServiceMode& serviceMode)
00102 {
00103 readFeeTable(serviceMode);
00104 return m_fecHardwareIds;
00105 }
00106
00107 const std::vector<DayaBay::DetectorSensor>& DbiCableSvc::sensors(const ServiceMode& svcMode)
00108 {
00109 readFeeTable(svcMode);
00110 DayaBay::Detector siteDetId(svcMode.context().GetSite(),
00111 svcMode.context().GetDetId());
00112 std::map<DayaBay::Detector,std::vector<DayaBay::DetectorSensor> >::iterator iter;
00113 iter = m_sensorsBySiteDet.find(siteDetId);
00114 if( iter != m_sensorsBySiteDet.end() ){
00115
00116 return iter->second;
00117 }
00118 std::ostringstream msgStr;
00119
00120
00121
00122 return m_sensorsBySiteDet[s_unknownSiteDet];
00123 }
00124
00125 const std::vector<DayaBay::AdPmtSensor>& DbiCableSvc::adPmtSensors(const ServiceMode& svcMode)
00126 {
00127 readFeeTable(svcMode);
00128 DayaBay::Detector siteDetId(svcMode.context().GetSite(),
00129 svcMode.context().GetDetId());
00130 std::map<DayaBay::Detector,std::vector<DayaBay::AdPmtSensor> >::iterator iter;
00131 iter = m_adPmtSensorsBySiteDet.find(siteDetId);
00132 if( iter != m_adPmtSensorsBySiteDet.end() ){
00133
00134 return iter->second;
00135 }
00136 std::ostringstream msgStr;
00137
00138
00139
00140 return m_adPmtSensorsBySiteDet[s_unknownSiteDet];
00141 }
00142
00143 const std::vector<DayaBay::PoolPmtSensor>& DbiCableSvc::poolPmtSensors(const ServiceMode& svcMode)
00144 {
00145 readFeeTable(svcMode);
00146 DayaBay::Detector siteDetId(svcMode.context().GetSite(),
00147 svcMode.context().GetDetId());
00148 std::map<DayaBay::Detector,std::vector<DayaBay::PoolPmtSensor> >::iterator iter;
00149 iter = m_poolPmtSensorsBySiteDet.find(siteDetId);
00150 if( iter != m_poolPmtSensorsBySiteDet.end() ){
00151
00152 return iter->second;
00153 }
00154 std::ostringstream msgStr;
00155
00156
00157
00158 return m_poolPmtSensorsBySiteDet[s_unknownSiteDet];
00159 }
00160
00161 const std::vector<DayaBay::RpcSensor>& DbiCableSvc::rpcSensors(const ServiceMode& svcMode)
00162 {
00163 readFeeTable(svcMode);
00164 DayaBay::Detector siteDetId(svcMode.context().GetSite(),
00165 svcMode.context().GetDetId());
00166 std::map<DayaBay::Detector,std::vector<DayaBay::RpcSensor> >::iterator iter;
00167 iter = m_rpcSensorsBySiteDet.find(siteDetId);
00168 if( iter != m_rpcSensorsBySiteDet.end() ){
00169
00170 return iter->second;
00171 }
00172 std::ostringstream msgStr;
00173
00174
00175
00176 return m_rpcSensorsBySiteDet[s_unknownSiteDet];
00177 }
00178
00179 const std::vector<DayaBay::ElecChannelId>& DbiCableSvc::elecChannelIds(const ServiceMode& svcMode)
00180 {
00181 readFeeTable(svcMode);
00182 DayaBay::Detector siteDetId(svcMode.context().GetSite(),
00183 svcMode.context().GetDetId());
00184 std::map<DayaBay::Detector,std::vector<DayaBay::ElecChannelId> >::iterator iter;
00185 iter = m_elecChannelIdsBySiteDet.find(siteDetId);
00186 if( iter != m_elecChannelIdsBySiteDet.end() ){
00187
00188 return iter->second;
00189 }
00190 std::ostringstream msgStr;
00191
00192
00193
00194 return m_elecChannelIdsBySiteDet[s_unknownSiteDet];
00195 }
00196
00197 const std::vector<DayaBay::FeeChannelId>& DbiCableSvc::feeChannelIds(const ServiceMode& svcMode)
00198 {
00199 readFeeTable(svcMode);
00200 DayaBay::Detector siteDetId(svcMode.context().GetSite(),
00201 svcMode.context().GetDetId());
00202 std::map<DayaBay::Detector,std::vector<DayaBay::FeeChannelId> >::iterator iter;
00203 iter = m_feeChannelIdsBySiteDet.find(siteDetId);
00204 if( iter != m_feeChannelIdsBySiteDet.end() ){
00205
00206 return iter->second;
00207 }
00208 std::ostringstream msgStr;
00209
00210
00211
00212 return m_feeChannelIdsBySiteDet[s_unknownSiteDet];
00213 }
00214
00215 const std::vector<DayaBay::FecChannelId>& DbiCableSvc::fecChannelIds(const ServiceMode& svcMode)
00216 {
00217 DayaBay::Detector siteDetId(svcMode.context().GetSite(),
00218 svcMode.context().GetDetId());
00219 std::map<DayaBay::Detector,std::vector<DayaBay::FecChannelId> >::iterator iter;
00220 iter = m_fecChannelIdsBySiteDet.find(siteDetId);
00221 if( iter != m_fecChannelIdsBySiteDet.end() ){
00222
00223 return iter->second;
00224 }
00225 std::ostringstream msgStr;
00226
00227
00228
00229 return m_fecChannelIdsBySiteDet[s_unknownSiteDet];
00230 }
00231
00232 DayaBay::ElecChannelId DbiCableSvc::elecChannelId(
00233 const DayaBay::DetectorSensor& sensId,
00234 const ServiceMode& svcMode)
00235 {
00236 readFeeTable(svcMode);
00237 std::map<DayaBay::DetectorSensor,DayaBay::ElecChannelId>::iterator iter;
00238 iter = m_channelBySensor.find(sensId);
00239 if( iter != m_channelBySensor.end() ){
00240
00241 return iter->second;
00242 }
00243 std::ostringstream msgStr;
00244
00245
00246
00247 return DayaBay::ElecChannelId(0);
00248 }
00249
00250 DayaBay::FeeChannelId DbiCableSvc::feeChannelId(
00251 const DayaBay::AdPmtSensor& sensId,
00252 const ServiceMode& svcMode)
00253 {
00254 readFeeTable(svcMode);
00255 return DayaBay::FeeChannelId(elecChannelId(sensId,svcMode).fullPackedData());
00256 }
00257
00258 DayaBay::FeeChannelId DbiCableSvc::feeChannelId(
00259 const DayaBay::PoolPmtSensor& sensId,
00260 const ServiceMode& svcMode)
00261 {
00262 readFeeTable(svcMode);
00263 return DayaBay::FeeChannelId(elecChannelId(sensId,svcMode).fullPackedData());
00264 }
00265
00266 DayaBay::FecChannelId DbiCableSvc::fecChannelId(
00267 const DayaBay::RpcSensor& sensId,
00268 const ServiceMode& svcMode)
00269 {
00270 return DayaBay::FecChannelId(elecChannelId(sensId,svcMode).fullPackedData());
00271 }
00272
00273 DayaBay::DetectorSensor DbiCableSvc::sensor(
00274 const DayaBay::ElecChannelId& elecChannel,
00275 const ServiceMode& svcMode)
00276 {
00277 readFeeTable(svcMode);
00278 std::map<DayaBay::ElecChannelId,DayaBay::DetectorSensor>::iterator iter;
00279 iter = m_sensorByChannel.find(elecChannel);
00280 if( iter != m_sensorByChannel.end() ){
00281
00282 return iter->second;
00283 }
00284 std::ostringstream msgStr;
00285
00286
00287
00288
00289 return DayaBay::DetectorSensor(0);
00290 }
00291
00292 DayaBay::AdPmtSensor DbiCableSvc::adPmtSensor(
00293 const DayaBay::FeeChannelId& feeChannel,
00294 const ServiceMode& svcMode)
00295 {
00296 return DayaBay::AdPmtSensor(sensor(feeChannel,svcMode).fullPackedData());
00297 }
00298
00299 DayaBay::PoolPmtSensor DbiCableSvc::poolPmtSensor(
00300 const DayaBay::FeeChannelId& feeChannel,
00301 const ServiceMode& svcMode)
00302 {
00303 return DayaBay::PoolPmtSensor(sensor(feeChannel,svcMode).fullPackedData());
00304 }
00305
00306 DayaBay::RpcSensor DbiCableSvc::rpcSensor(
00307 const DayaBay::FecChannelId& fecChannel,
00308 const ServiceMode& svcMode)
00309 {
00310 return DayaBay::RpcSensor(sensor(fecChannel,svcMode).fullPackedData());
00311 }
00312
00313 DayaBay::HardwareId DbiCableSvc::hardwareId(
00314 const DayaBay::DetectorSensor& sensId,
00315 const ServiceMode& svcMode)
00316 {
00317 readFeeTable(svcMode);
00318 std::map<DayaBay::DetectorSensor,DayaBay::HardwareId>::iterator iter;
00319 iter = m_hardwareBySensor.find(sensId);
00320 if( iter != m_hardwareBySensor.end() ){
00321
00322 return iter->second;
00323 }
00324 std::ostringstream msgStr;
00325
00326
00327
00328 return DayaBay::HardwareId(0);
00329 }
00330
00331 DayaBay::PmtHardwareId DbiCableSvc::pmtHardwareId(
00332 const DayaBay::AdPmtSensor& sensId,
00333 const ServiceMode& svcMode)
00334 {
00335 readFeeTable(svcMode);
00336 return DayaBay::PmtHardwareId(hardwareId(sensId,svcMode).fullPackedData());
00337 }
00338
00339 DayaBay::PmtHardwareId DbiCableSvc::pmtHardwareId(
00340 const DayaBay::PoolPmtSensor& sensId,
00341 const ServiceMode& svcMode)
00342 {
00343 readFeeTable(svcMode);
00344 return DayaBay::PmtHardwareId(hardwareId(sensId,svcMode).fullPackedData());
00345 }
00346
00347 DayaBay::RpcHardwareId DbiCableSvc::rpcHardwareId(
00348 const DayaBay::RpcSensor& sensId,
00349 const ServiceMode& svcMode)
00350 {
00351 readFeeTable(svcMode);
00352 return DayaBay::RpcHardwareId(hardwareId(sensId,svcMode).fullPackedData());
00353 }
00354
00355 DayaBay::DetectorSensor DbiCableSvc::sensor(
00356 const DayaBay::HardwareId& hardwareId,
00357 const ServiceMode& svcMode)
00358 {
00359 readFeeTable(svcMode);
00360 std::map<DayaBay::HardwareId,DayaBay::DetectorSensor>::iterator iter;
00361 iter = m_sensorByHardware.find(hardwareId);
00362 if( iter != m_sensorByHardware.end() ){
00363
00364 return iter->second;
00365 }
00366 std::ostringstream msgStr;
00367
00368
00369
00370 return DayaBay::DetectorSensor(0);
00371 }
00372
00373 DayaBay::AdPmtSensor DbiCableSvc::adPmtSensor(
00374 const DayaBay::PmtHardwareId& pmtId,
00375 const ServiceMode& svcMode)
00376 {
00377 return DayaBay::AdPmtSensor(sensor(pmtId,svcMode).fullPackedData());
00378 }
00379
00380 DayaBay::PoolPmtSensor DbiCableSvc::poolPmtSensor(
00381 const DayaBay::PmtHardwareId& pmtId,
00382 const ServiceMode& svcMode)
00383 {
00384 return DayaBay::PoolPmtSensor(sensor(pmtId,svcMode).fullPackedData());
00385 }
00386
00387 DayaBay::RpcSensor DbiCableSvc::rpcSensor(
00388 const DayaBay::RpcHardwareId& rpcId,
00389 const ServiceMode& svcMode)
00390 {
00391 return DayaBay::RpcSensor(sensor(rpcId, svcMode).fullPackedData());
00392 }
00393
00394 DayaBay::HardwareId DbiCableSvc::hardwareId(
00395 const DayaBay::ElecChannelId& elecChannel,
00396 const ServiceMode& svcMode)
00397 {
00398 readFeeTable(svcMode);
00399 std::map<DayaBay::ElecChannelId,DayaBay::HardwareId>::iterator iter;
00400 iter = m_hardwareByChannel.find(elecChannel);
00401 if( iter != m_hardwareByChannel.end() ){
00402
00403 return iter->second;
00404 }
00405 std::ostringstream msgStr;
00406
00407
00408
00409
00410 return DayaBay::HardwareId(0);
00411 }
00412
00413 DayaBay::FeeHardwareId DbiCableSvc::feeHardwareId(
00414 const DayaBay::FeeChannelId& feeChannel,
00415 const ServiceMode& svcMode)
00416 {
00417 readFeeTable(svcMode);
00418 return DayaBay::FeeHardwareId(hardwareId(feeChannel,svcMode).fullPackedData());
00419 }
00420
00421 DayaBay::FecHardwareId DbiCableSvc::fecHardwareId(
00422 const DayaBay::FecChannelId& fecChannel,
00423 const ServiceMode& svcMode)
00424 {
00425 return DayaBay::FecHardwareId(hardwareId(fecChannel,svcMode).fullPackedData());
00426 }
00427
00428 DayaBay::ElecChannelId DbiCableSvc::elecChannelId(
00429 const DayaBay::HardwareId& hardwareId,
00430 const ServiceMode& svcMode)
00431 {
00432 readFeeTable(svcMode);
00433 std::map<DayaBay::HardwareId,DayaBay::ElecChannelId>::iterator iter;
00434 iter = m_channelByHardware.find(hardwareId);
00435 if( iter != m_channelByHardware.end() ){
00436
00437 return iter->second;
00438 }
00439 std::ostringstream msgStr;
00440
00441
00442
00443
00444 return DayaBay::ElecChannelId(0);
00445 }
00446
00447 DayaBay::FeeChannelId DbiCableSvc::feeChannelId(
00448 const DayaBay::FeeHardwareId& feeHardwareId,
00449 const ServiceMode& svcMode)
00450 {
00451 readFeeTable(svcMode);
00452 return DayaBay::FeeChannelId(elecChannelId(feeHardwareId,svcMode).fullPackedData());
00453 }
00454
00455 DayaBay::FecChannelId DbiCableSvc::fecChannelId(
00456 const DayaBay::FecHardwareId& fecHardwareId,
00457 const ServiceMode& svcMode)
00458 {
00459 return DayaBay::FecChannelId(elecChannelId(fecHardwareId,svcMode).fullPackedData());
00460 }
00461
00462
00463 inline int DbiCableSvc::readFeeTable(const ServiceMode& serviceMode){
00464 if(serviceMode.context() == feeLastContext){
00465 return 2;
00466 }
00467 feeLastContext = serviceMode.context();
00468
00469 DbiResultPtr<GFeeCableMap> pr("FeeCableMap",feeLastContext,feeLastContext.GetDetId());
00470 const DbiResultKey* thisResult= pr.GetKey();
00471 if(feeLastResult == 0){
00472 feeLastResult = thisResult;
00473 }else if(thisResult->IsEqualTo(feeLastResult))
00474 {
00475 return 2;
00476 }else{
00477 feeLastResult = thisResult;
00478 }
00479 m_elecChannelIdsBySiteDet.clear();
00480 m_feeChannelIdsBySiteDet.clear();
00481 m_channelByHardware.clear();
00482 m_hardwareByChannel.clear();
00483 m_sensorsBySiteDet.clear();
00484 m_channelBySensor.clear();
00485 m_sensorByChannel.clear();
00486 m_hardwareBySensor.clear();
00487 m_sensorByHardware.clear();
00488 m_poolPmtSensorsBySiteDet.clear();
00489 m_adPmtSensorsBySiteDet.clear();
00490 unsigned int numRows = pr.GetNumRows();
00491 std::cout << "Database rows = " << numRows << std::endl;
00492 const GFeeCableMap* row ;
00493 for (unsigned int idx=0; idx < numRows; idx++) {
00494 row = pr.GetRowByIndex(idx);
00495 int sensorId = row->GetSensorId().fullPackedData();
00496 DayaBay::FeeChannelId feeChannel(row->GetFeeChannelId());
00497 DayaBay::FeeHardwareId feeHardware(row->GetFeeHardwareId());
00498 DayaBay::PmtHardwareId pmtHardware(row->GetPmtHardwareId());
00499
00500 DayaBay::Detector siteId(feeChannel.site(), DetectorId::kAll);
00501 DayaBay::Detector detector(feeChannel.site(), feeChannel.detectorId());
00502 m_elecChannelIdsBySiteDet[s_allSiteDet].push_back(feeChannel);
00503 m_elecChannelIdsBySiteDet[siteId].push_back(feeChannel);
00504 m_elecChannelIdsBySiteDet[detector].push_back(feeChannel);
00505 m_feeChannelIdsBySiteDet[s_allSiteDet].push_back(feeChannel);
00506 m_feeChannelIdsBySiteDet[siteId].push_back(feeChannel);
00507 m_feeChannelIdsBySiteDet[detector].push_back(feeChannel);
00508
00509 m_channelByHardware[feeHardware] = feeChannel;
00510 m_hardwareByChannel[feeChannel] = feeHardware;
00511
00512
00513 if( sensorId == 0 ){
00514
00515 continue;
00516 }
00517 DayaBay::DetectorSensor sensor(sensorId);
00518 m_sensorsBySiteDet[s_allSiteDet].push_back(sensor);
00519 m_sensorsBySiteDet[siteId].push_back(sensor);
00520 m_sensorsBySiteDet[detector].push_back(sensor);
00521 m_channelBySensor[sensor] = feeChannel;
00522 m_sensorByChannel[feeChannel] = sensor;
00523 m_hardwareBySensor[sensor] = pmtHardware;
00524 m_sensorByHardware[pmtHardware] = sensor;
00525 if(sensor.detectorId() == DetectorId::kIWS
00526 || sensor.detectorId() == DetectorId::kOWS){
00527 DayaBay::PoolPmtSensor poolPmt(sensorId);
00528 m_poolPmtSensorsBySiteDet[s_allSiteDet].push_back(poolPmt);
00529 m_poolPmtSensorsBySiteDet[siteId].push_back(poolPmt);
00530 m_poolPmtSensorsBySiteDet[detector].push_back(poolPmt);
00531 }else{
00532 DayaBay::AdPmtSensor adPmt(sensorId);
00533 m_adPmtSensorsBySiteDet[s_allSiteDet].push_back(adPmt);
00534 m_adPmtSensorsBySiteDet[siteId].push_back(adPmt);
00535 m_adPmtSensorsBySiteDet[detector].push_back(adPmt);
00536 }
00537 }
00538 }
00539
00540
00541
00542