/search.css" rel="stylesheet" type="text/css"/> /search.js">
00001 #include "StaticCableSvc.h" 00002 #include "Conventions/Hardware.h" 00003 #include "Conventions/Electronics.h" 00004 #include "GaudiKernel/IMessageSvc.h" 00005 #include <sstream> 00006 #include <fstream> 00007 #include "Context/ContextRange.h" 00008 #include <stdlib.h> 00009 00010 DayaBay::Detector StaticCableSvc::s_unknownSiteDet = 00011 DayaBay::Detector(Site::kUnknown,DetectorId::kUnknown); 00012 00013 DayaBay::Detector StaticCableSvc::s_allSiteDet = 00014 DayaBay::Detector(Site::kAll,DetectorId::kAll); 00015 00016 StaticCableSvc::StaticCableSvc(const std::string& name, ISvcLocator *svc) 00017 : Service(name,svc) 00018 , m_first(true) 00019 { 00020 msg = 0; 00023 declareProperty("FeeCableMap",m_feeCableFileName="", 00024 "Filename for loading the FEE cabling map."); 00026 declareProperty("FecCableMap",m_fecCableFileName="", 00027 "Filename for loading the FEC cabling map"); 00028 } 00029 00030 StaticCableSvc::~StaticCableSvc() 00031 { 00032 } 00033 00034 StatusCode StaticCableSvc::initialize() 00035 { 00036 this->Service::initialize(); 00037 00038 return StatusCode::SUCCESS; 00039 } 00040 00041 00042 StatusCode StaticCableSvc::initMap(const ServiceMode& svcMode) 00043 { 00044 // Prepare the message service for reporting 00045 msg = msgSvc(); 00046 if( !msg ){ 00047 return StatusCode::FAILURE; 00048 } 00049 MsgStream log(msgSvc(), "StaticCableSvc"); 00050 00051 if(m_feeCableFileName=="") { 00052 msg->reportMessage("StaticCableSvc",MSG::INFO, 00053 "No FeeCableMap file specified. Loading one based on Master.CableMap.txt"); 00054 00057 std::string MasterCableMapFile = "Master.CableMap.txt"; 00058 std::string Path = getenv ("DATASVCROOT"); 00059 std::ifstream m_masterCableMap( (Path+"/share/"+MasterCableMapFile).c_str() ); 00060 00061 if( !m_masterCableMap.is_open() ){ 00062 msg->reportMessage("StaticCableSvc",MSG::ERROR,"Fail to open Master.CableMap.txt"); 00063 exit(1); 00064 return StatusCode::FAILURE; 00065 } 00066 00067 int StartRun,EndRun; 00068 int Sites; 00069 int SimFlag, StartTimeSec, StartTimeNanoSec, EndTimeSec, EndTimeNanoSec; 00070 std::string MapFile; 00071 00072 std::string line; 00073 00074 while( std::getline( m_masterCableMap, line ) ){ 00075 std::stringstream streamLine(line); 00076 if( streamLine.peek() == '#' ){ 00077 continue; 00078 } 00079 streamLine >>StartRun >>EndRun >>Sites 00080 >>SimFlag >>StartTimeSec>> StartTimeNanoSec >>EndTimeSec >>EndTimeNanoSec 00081 >>MapFile; 00082 00083 ContextRange CRange( Sites, SimFlag, 00084 TimeStamp( StartTimeSec, StartTimeNanoSec ), 00085 TimeStamp( EndTimeSec, EndTimeNanoSec ) ); 00086 00087 const Context &cont = svcMode.context(); 00088 00089 /* 00090 std::cout<< "Searching: "<<cont.GetSite()<<" "<<cont.GetSimFlag()<<std::endl; 00091 std::cout<< cont.GetTimeStamp().AsString()<<std::endl; 00092 std::cout<<"Start: "<<TimeStamp( StartTimeSec, StartTimeNanoSec ).AsString()<<std::endl; 00093 std::cout<<"End: "<<TimeStamp( EndTimeSec, EndTimeNanoSec ).AsString()<<std::endl; 00094 */ 00095 00096 if( CRange.IsCompatible( cont ) && MapFile.find("fee") != MapFile.npos ) { 00097 m_feeCableFileName = Path + "/share/" + MapFile; 00098 } 00099 00100 } 00101 00102 } //if(m_feeCableFileName=="") 00103 00104 if(m_fecCableFileName=="") { 00105 log << MSG::INFO 00106 << "No FecCableMap file specified. Loading one based on Master.CableMap.txt" 00107 << endreq; 00108 00111 std::string MasterCableMapFile = "Master.CableMap.txt"; 00112 std::string Path = getenv ("DATASVCROOT"); 00113 std::ifstream m_masterCableMap( (Path+"/share/"+MasterCableMapFile).c_str() ); 00114 00115 if( !m_masterCableMap.is_open() ){ 00116 log << MSG::ERROR << "Fail to open Master.CableMap.txt" 00117 << endreq; 00118 exit(1); 00119 return StatusCode::FAILURE; 00120 } 00121 00122 int StartRun,EndRun; 00123 int Sites; 00124 int SimFlag, StartTimeSec, StartTimeNanoSec, EndTimeSec, EndTimeNanoSec; 00125 std::string MapFile; 00126 00127 std::string line; 00128 00129 while( std::getline( m_masterCableMap, line ) ){ 00130 std::stringstream streamLine(line); 00131 if( streamLine.peek() == '#' ){ 00132 continue; 00133 } 00134 streamLine >>StartRun >>EndRun >>Sites 00135 >>SimFlag >>StartTimeSec>> StartTimeNanoSec >>EndTimeSec >>EndTimeNanoSec 00136 >>MapFile; 00137 00138 ContextRange CRange( Sites, SimFlag, 00139 TimeStamp( StartTimeSec, StartTimeNanoSec ), 00140 TimeStamp( EndTimeSec, EndTimeNanoSec ) ); 00141 00142 const Context &cont = svcMode.context(); 00143 00144 if( CRange.IsCompatible( cont ) && MapFile.find("fec") != MapFile.npos ) { 00145 m_fecCableFileName = Path + "/share/" + MapFile; 00146 } 00147 } 00148 } 00149 00150 if(m_feeCableFileName!=""){ 00151 00152 msg->reportMessage("StaticCableSvc",MSG::INFO,("FeeCableMap: "+m_feeCableFileName).c_str()); 00153 00154 std::ifstream input( m_feeCableFileName.c_str() ); 00155 if( !input.is_open() ){ 00156 std::ostringstream msgStr; 00157 msgStr << "Failed to open input file: " << m_feeCableFileName; 00158 msg->reportMessage("StaticCableSvc",MSG::ERROR,msgStr.str()); 00159 exit(1); 00160 return StatusCode::FAILURE; 00161 } 00162 int site, detectorId, feeBoard, feeBoardSerial, feeConnector; 00163 int adPmtRing, adPmtColumn, poolPmtWallNumber, poolPmtWallSpot; 00164 int poolPmtInwardFacing, pmtHardwareType, pmtSerialNumber; 00165 std::string line; 00166 while( std::getline(input,line) ){ 00167 std::stringstream streamLine(line); 00168 if( streamLine.peek() == '#' ){ 00169 continue; 00170 } 00171 streamLine >> site >> detectorId >> feeBoard >> feeBoardSerial 00172 >> feeConnector >> adPmtRing >> adPmtColumn 00173 >> poolPmtWallNumber >> poolPmtWallSpot 00174 >> poolPmtInwardFacing >> pmtHardwareType 00175 >> pmtSerialNumber; 00176 DayaBay::FeeChannelId feeChannel(feeBoard, feeConnector, 00177 (Site::Site_t)site, 00178 (DetectorId::DetectorId_t)detectorId); 00179 DayaBay::FeeHardwareId feeHardware(feeBoardSerial, feeConnector); 00180 DayaBay::PmtHardwareId pmtHardware(pmtSerialNumber, 00181 (DayaBay::Hardware::Hardware_t)pmtHardwareType); 00182 // Make map by site / detector 00183 DayaBay::Detector siteId((Site::Site_t)site, DetectorId::kAll); 00184 DayaBay::Detector detector((Site::Site_t)site, 00185 (DetectorId::DetectorId_t)detectorId); 00186 m_elecChannelIdsBySiteDet[s_allSiteDet].push_back(feeChannel); 00187 m_elecChannelIdsBySiteDet[siteId].push_back(feeChannel); 00188 m_elecChannelIdsBySiteDet[detector].push_back(feeChannel); 00189 m_feeChannelIdsBySiteDet[s_allSiteDet].push_back(feeChannel); 00190 m_feeChannelIdsBySiteDet[siteId].push_back(feeChannel); 00191 m_feeChannelIdsBySiteDet[detector].push_back(feeChannel); 00192 // Make hardware connections 00193 m_channelByHardware[feeHardware] = feeChannel; 00194 m_hardwareByChannel[feeChannel] = feeHardware; 00195 00196 // Make PMT connections 00197 int sensorId = 0; 00198 if( detector.isAD() ) { 00199 // AD PMT 00200 DayaBay::AdPmtSensor pmtId(adPmtRing, adPmtColumn, 00201 (Site::Site_t)site, 00202 (DetectorId::DetectorId_t)detectorId); 00203 sensorId = pmtId.fullPackedData(); 00204 }else if( detector.isWaterShield() ) { 00205 // Pool PMT 00206 DayaBay::PoolPmtSensor pmtId(poolPmtWallNumber, poolPmtWallSpot, 00207 poolPmtInwardFacing, 00208 (Site::Site_t)site, 00209 (DetectorId::DetectorId_t)detectorId); 00210 sensorId = pmtId.fullPackedData(); 00211 } 00212 if( sensorId == 0 ){ 00213 // Unconnected FEE channel 00214 log <<"Unconnected FEE channel: S"<<site<<" D:"<<detectorId<<" B:"<<feeBoard<<" C:"<<feeConnector<<endreq; 00215 continue; 00216 } 00217 DayaBay::DetectorSensor sensor(sensorId); 00218 00219 m_sensorsBySiteDet[s_allSiteDet].push_back(sensor); 00220 m_sensorsBySiteDet[siteId].push_back(sensor); 00221 m_sensorsBySiteDet[detector].push_back(sensor); 00222 m_channelBySensor[sensor] = feeChannel; 00223 m_sensorByChannel[feeChannel] = sensor; 00224 m_hardwareBySensor[sensor] = pmtHardware; 00225 m_sensorByHardware[pmtHardware] = sensor; 00226 if(sensor.detectorId() == DetectorId::kIWS 00227 || sensor.detectorId() == DetectorId::kOWS){ 00228 DayaBay::PoolPmtSensor poolPmt(sensorId); 00229 if (poolPmt.bogus()) { 00230 log << "Warning: got bogus Pool PMT ID: " << poolPmt 00231 << " while parsing line:\"" << line << "\"" 00232 << endreq; 00233 } 00234 m_poolPmtSensorsBySiteDet[s_allSiteDet].push_back(poolPmt); 00235 m_poolPmtSensorsBySiteDet[siteId].push_back(poolPmt); 00236 m_poolPmtSensorsBySiteDet[detector].push_back(poolPmt); 00237 }else{ 00238 DayaBay::AdPmtSensor adPmt(sensorId); 00239 if (adPmt.bogus()) { 00240 log << "Warning: got bogus AD PMT ID: " << adPmt 00241 << " while parsing line:\"" << line << "\"" 00242 << endreq; 00243 } 00244 m_adPmtSensorsBySiteDet[s_allSiteDet].push_back(adPmt); 00245 m_adPmtSensorsBySiteDet[siteId].push_back(adPmt); 00246 m_adPmtSensorsBySiteDet[detector].push_back(adPmt); 00247 } 00248 } 00249 } else { // if(m_feeCableFileName!="") 00250 log << MSG::ERROR << "No compatible Fee cable map found" << endreq; 00251 } 00252 00253 // retrieve data from the FEC cable map file 00254 if(m_fecCableFileName!=""){ 00255 log<<MSG::INFO<<("FecCableMap: "+m_fecCableFileName).c_str()<<endreq; 00256 00257 std::ifstream input( m_fecCableFileName.c_str() ); 00258 if( !input.is_open() ){ 00259 log << MSG::ERROR 00260 << ("Failed to open input file: " + m_fecCableFileName).c_str() 00261 << endreq; 00262 exit(1); 00263 return StatusCode::FAILURE; 00264 } 00265 00266 int channelId, elecHwId, sensorId, detectorHwId; 00267 int romBoard, romBoardSerial, rtmBoard, rtmBoardSerial, rotBox, rotBoxSerial; 00268 int fecBoard, fecBoardSerial, fecConnector; 00269 int detectorId, site; 00270 int rpcRow, rpcColumn, rpcLayer, rpcStrip; 00271 int rpcModuleSerial; 00272 00273 std::string line; 00274 while( std::getline(input,line) ){ 00275 std::stringstream streamLine(line); 00276 if( streamLine.peek() == '#' ){ 00277 continue; 00278 } 00279 00280 streamLine >> site >> detectorId >> romBoard >> romBoardSerial 00281 >> rtmBoard >> rtmBoardSerial >> rotBox >> rotBoxSerial 00282 >> fecBoard >> fecBoardSerial >> fecConnector 00283 >> rpcRow >> rpcColumn >> rpcLayer >> rpcStrip 00284 >> rpcModuleSerial; 00285 00286 // data correct check 00287 if ( streamLine.fail() ) { 00288 log << MSG::ERROR 00289 << "The data format in the input file '" 00290 << m_fecCableFileName.c_str() << "' does not seem" 00291 << " to conform the one expected for RPC cable map." 00292 << endreq; 00293 exit(1); 00294 return StatusCode::FAILURE; 00295 } 00296 if ( detectorId != DetectorId::kRPC ) { 00297 log << MSG::ERROR 00298 << ("Incorrect data in the input file: "+ m_fecCableFileName).c_str() 00299 << "Expected RPC data. Detector Id gotten is not DetectorId::kRPC : " 00300 << detectorId << endreq; 00301 exit(1); 00302 return StatusCode::FAILURE; 00303 } 00304 00305 DayaBay::FecChannelId fecChannelId(fecBoard, fecConnector, 00306 (Site::Site_t) site, (DetectorId::DetectorId_t) detectorId); 00307 DayaBay::FecHardwareId fecHardwareId(fecBoardSerial, fecConnector); 00308 DayaBay::RpcHardwareId rpcHardwareId(rpcModuleSerial, rpcLayer, rpcStrip); 00309 // Make map by site / detector 00310 DayaBay::Detector siteId(fecChannelId.site(), DetectorId::kAll); 00311 DayaBay::Detector detector(fecChannelId.site(), DetectorId::kRPC); 00312 00313 m_elecChannelIdsBySiteDet[s_allSiteDet].push_back(fecChannelId); 00314 m_elecChannelIdsBySiteDet[siteId].push_back(fecChannelId); 00315 m_elecChannelIdsBySiteDet[detector].push_back(fecChannelId); 00316 m_fecChannelIdsBySiteDet[s_allSiteDet].push_back(fecChannelId); 00317 m_fecChannelIdsBySiteDet[siteId].push_back(fecChannelId); 00318 m_fecChannelIdsBySiteDet[detector].push_back(fecChannelId); 00319 // Make hardware connections 00320 m_channelByHardware[fecHardwareId] = fecChannelId; 00321 m_hardwareByChannel[fecChannelId] = fecHardwareId; 00322 00323 // Make RPC sensor connections 00324 int sensorId = 0; 00325 00326 DayaBay::RpcSensor rpcSensor(rpcRow, rpcColumn, rpcLayer, rpcStrip, 00327 (Site::Site_t)site, 00328 DetectorId::kRPC); 00329 sensorId = rpcSensor.fullPackedData(); 00330 00331 if( sensorId == 0 ){ 00332 // Unconnected FEC channel 00333 // note to myself: Can this ever happen? 00334 continue; 00335 } 00336 00337 DayaBay::DetectorSensor sensor(sensorId); 00338 00339 m_sensorsBySiteDet[s_allSiteDet].push_back(sensor); 00340 m_sensorsBySiteDet[siteId].push_back(sensor); 00341 m_sensorsBySiteDet[detector].push_back(sensor); 00342 m_channelBySensor[sensor] = fecChannelId; 00343 m_sensorByChannel[fecChannelId] = sensor; 00344 m_hardwareBySensor[sensor] = rpcHardwareId; 00345 m_sensorByHardware[rpcHardwareId] = sensor; 00346 00347 m_rpcSensorsBySiteDet[s_allSiteDet].push_back(rpcSensor); 00348 m_rpcSensorsBySiteDet[siteId].push_back(rpcSensor); 00349 m_rpcSensorsBySiteDet[detector].push_back(rpcSensor); 00350 } // while 00351 } else {// if(m_fecCableFileName!="") 00352 log << MSG::ERROR << "No compatible Fec cable map found" << endreq; 00353 } 00354 00355 m_first = false; 00356 00357 return StatusCode::SUCCESS; 00358 } 00359 00360 StatusCode StaticCableSvc::finalize() 00361 { 00362 return this->Service::finalize(); 00363 } 00364 00365 StatusCode StaticCableSvc::queryInterface(const InterfaceID& riid, 00366 void** ppvInterface) 00367 { 00368 StatusCode sc = StatusCode::FAILURE; 00369 if (ppvInterface) { 00370 *ppvInterface = 0; 00371 00372 if (ICableSvc::interfaceID().versionMatch(riid)) { 00373 *ppvInterface = static_cast<ICableSvc*>(this); 00374 sc = StatusCode::SUCCESS; 00375 addRef(); 00376 } 00377 else sc = Service::queryInterface( riid, ppvInterface ); 00378 } 00379 return sc; 00380 } 00381 00382 const std::vector<DayaBay::HardwareId>& StaticCableSvc::hardwareIds(const ServiceMode& svcMode) 00383 { 00384 if( m_first ) initMap(svcMode); 00385 return m_hardwareIds; 00386 } 00387 00388 const std::vector<DayaBay::PmtHardwareId>& StaticCableSvc::pmtHardwareIds(const ServiceMode& svcMode) 00389 { 00390 if( m_first ) initMap(svcMode); 00391 return m_pmtHardwareIds; 00392 } 00393 00394 const std::vector<DayaBay::RpcHardwareId>& StaticCableSvc::rpcHardwareIds(const ServiceMode& svcMode) 00395 { 00396 if( m_first ) initMap(svcMode); 00397 return m_rpcHardwareIds; 00398 } 00399 00400 const std::vector<DayaBay::FeeHardwareId>& StaticCableSvc::feeHardwareIds(const ServiceMode& svcMode) 00401 { 00402 if( m_first ) initMap(svcMode); 00403 return m_feeHardwareIds; 00404 } 00405 00406 const std::vector<DayaBay::FecHardwareId>& StaticCableSvc::fecHardwareIds(const ServiceMode& svcMode) 00407 { 00408 if( m_first ) initMap(svcMode); 00409 return m_fecHardwareIds; 00410 } 00411 00412 const std::vector<DayaBay::DetectorSensor>& StaticCableSvc::sensors(const ServiceMode& svcMode) 00413 { 00414 MsgStream log(msgSvc(), "StaticCableSvc"); 00415 00416 if( m_first ) initMap(svcMode); 00417 DayaBay::Detector siteDetId(svcMode.context().GetSite(), 00418 svcMode.context().GetDetId()); 00419 std::map<DayaBay::Detector,std::vector<DayaBay::DetectorSensor> >::iterator iter; 00420 iter = m_sensorsBySiteDet.find(siteDetId); 00421 if( iter != m_sensorsBySiteDet.end() ){ 00422 // Found site / det 00423 00424 const std::vector<DayaBay::DetectorSensor>& detSensors = iter->second; 00425 for (size_t idet = 0; idet < detSensors.size(); ++idet) { 00426 DayaBay::DetectorSensor detSens = detSensors[idet]; 00427 if (detSens.isAD() ) { 00428 DayaBay::AdPmtSensor pmtid(detSens.fullPackedData()); 00429 if (pmtid.bogus()) { 00430 log << MSG::WARNING << "bogus AD PMT id: " << pmtid << endreq; 00431 } 00432 } 00433 else if ( detSens.detectorId() != DetectorId::kRPC ) { 00434 DayaBay::PoolPmtSensor pmtid(detSens.fullPackedData()); 00435 if (pmtid.bogus()) { 00436 log << MSG::WARNING << "bogus Pool PMT id: " << pmtid << endreq; 00437 } 00438 } 00439 } 00440 00441 return iter->second; 00442 } 00443 std::ostringstream msgStr; 00444 msgStr << "sensors(): No sensors for site / detector ID: " << siteDetId; 00445 msg->reportMessage("StaticCableSvc",MSG::WARNING,msgStr.str()); 00446 return m_sensorsBySiteDet[s_unknownSiteDet]; 00447 } 00448 00449 const std::vector<DayaBay::AdPmtSensor>& StaticCableSvc::adPmtSensors(const ServiceMode& svcMode) 00450 { 00452 if( m_first ) initMap(svcMode); 00453 DayaBay::Detector siteDetId(svcMode.context().GetSite(), 00454 svcMode.context().GetDetId()); 00455 std::map<DayaBay::Detector,std::vector<DayaBay::AdPmtSensor> >::iterator iter; 00456 iter = m_adPmtSensorsBySiteDet.find(siteDetId); 00457 if( iter != m_adPmtSensorsBySiteDet.end() ){ 00458 // Found site / det 00459 return iter->second; 00460 } 00461 std::ostringstream msgStr; 00462 msgStr << "adPmtSensors(): No sensors for site / detector ID: " << siteDetId; 00463 msg->reportMessage("StaticCableSvc",MSG::WARNING,msgStr.str()); 00464 return m_adPmtSensorsBySiteDet[s_unknownSiteDet]; 00465 } 00466 00467 const std::vector<DayaBay::PoolPmtSensor>& StaticCableSvc::poolPmtSensors(const ServiceMode& svcMode) 00468 { 00470 if( m_first ) initMap(svcMode); 00471 DayaBay::Detector siteDetId(svcMode.context().GetSite(), 00472 svcMode.context().GetDetId()); 00473 std::map<DayaBay::Detector,std::vector<DayaBay::PoolPmtSensor> >::iterator iter; 00474 iter = m_poolPmtSensorsBySiteDet.find(siteDetId); 00475 if( iter != m_poolPmtSensorsBySiteDet.end() ){ 00476 // Found site / det 00477 return iter->second; 00478 } 00479 std::ostringstream msgStr; 00480 msgStr << "poolPmtSensors(): No sensors for site / detector ID: "<< siteDetId; 00481 msg->reportMessage("StaticCableSvc",MSG::WARNING,msgStr.str()); 00482 return m_poolPmtSensorsBySiteDet[s_unknownSiteDet]; 00483 } 00484 00485 const std::vector<DayaBay::RpcSensor>& StaticCableSvc::rpcSensors(const ServiceMode& svcMode) 00486 { 00487 if( m_first ) initMap(svcMode); 00488 DayaBay::Detector siteDetId(svcMode.context().GetSite(), 00489 svcMode.context().GetDetId()); 00490 std::map<DayaBay::Detector,std::vector<DayaBay::RpcSensor> >::iterator iter; 00491 iter = m_rpcSensorsBySiteDet.find(siteDetId); 00492 if( iter != m_rpcSensorsBySiteDet.end() ){ 00493 // Found site / det 00494 return iter->second; 00495 } 00496 std::ostringstream msgStr; 00497 msgStr << "rpcSensors(): No sensors for site / detector ID: "<< siteDetId; 00498 msg->reportMessage("StaticCableSvc",MSG::WARNING,msgStr.str()); 00499 return m_rpcSensorsBySiteDet[s_unknownSiteDet]; 00500 } 00501 00502 const std::vector<DayaBay::ElecChannelId>& StaticCableSvc::elecChannelIds(const ServiceMode& svcMode) 00503 { 00504 if( m_first ) initMap(svcMode); 00505 DayaBay::Detector siteDetId(svcMode.context().GetSite(), 00506 svcMode.context().GetDetId()); 00507 std::map<DayaBay::Detector,std::vector<DayaBay::ElecChannelId> >::iterator iter; 00508 iter = m_elecChannelIdsBySiteDet.find(siteDetId); 00509 if( iter != m_elecChannelIdsBySiteDet.end() ){ 00510 // Found site / det 00511 return iter->second; 00512 } 00513 std::ostringstream msgStr; 00514 msgStr << "elecChannelIds(): No sensors for site / detector ID: "<< siteDetId; 00515 msg->reportMessage("StaticCableSvc",MSG::WARNING,msgStr.str()); 00516 return m_elecChannelIdsBySiteDet[s_unknownSiteDet]; 00517 } 00518 00519 const std::vector<DayaBay::FeeChannelId>& StaticCableSvc::feeChannelIds(const ServiceMode& svcMode) 00520 { 00521 if( m_first ) initMap(svcMode); 00522 DayaBay::Detector siteDetId(svcMode.context().GetSite(), 00523 svcMode.context().GetDetId()); 00524 std::map<DayaBay::Detector,std::vector<DayaBay::FeeChannelId> >::iterator iter; 00525 iter = m_feeChannelIdsBySiteDet.find(siteDetId); 00526 if( iter != m_feeChannelIdsBySiteDet.end() ){ 00527 // Found site / det 00528 return iter->second; 00529 } 00530 std::ostringstream msgStr; 00531 msgStr << "feeChannelIds(): No sensors for site / detector ID: " << siteDetId; 00532 msg->reportMessage("StaticCableSvc",MSG::WARNING,msgStr.str()); 00533 return m_feeChannelIdsBySiteDet[s_unknownSiteDet]; 00534 } 00535 00536 const std::vector<DayaBay::FecChannelId>& StaticCableSvc::fecChannelIds(const ServiceMode& svcMode) 00537 { 00538 if( m_first ) initMap(svcMode); 00539 DayaBay::Detector siteDetId(svcMode.context().GetSite(), 00540 svcMode.context().GetDetId()); 00541 std::map<DayaBay::Detector,std::vector<DayaBay::FecChannelId> >::iterator iter; 00542 iter = m_fecChannelIdsBySiteDet.find(siteDetId); 00543 if( iter != m_fecChannelIdsBySiteDet.end() ){ 00544 // Found site / det 00545 return iter->second; 00546 } 00547 std::ostringstream msgStr; 00548 msgStr << "fecChannelIds(): No sensors for site / detector ID: " << siteDetId; 00549 msg->reportMessage("StaticCableSvc",MSG::WARNING,msgStr.str()); 00550 return m_fecChannelIdsBySiteDet[s_unknownSiteDet]; 00551 } 00552 00553 DayaBay::ElecChannelId StaticCableSvc::elecChannelId( 00554 const DayaBay::DetectorSensor& sensId, 00555 const ServiceMode& svcMode) 00556 { 00557 if( m_first ) initMap(svcMode); 00558 std::map<DayaBay::DetectorSensor,DayaBay::ElecChannelId>::iterator iter; 00559 iter = m_channelBySensor.find(sensId); 00560 if( iter != m_channelBySensor.end() ){ 00561 // Found channel 00562 return iter->second; 00563 } 00564 std::ostringstream msgStr; 00565 msgStr << "elecChannelId(): No electronics channel for sensor ID: " << sensId; 00566 msg->reportMessage("StaticCableSvc",MSG::WARNING,msgStr.str()); 00567 return DayaBay::ElecChannelId(0); 00568 } 00569 00570 DayaBay::FeeChannelId StaticCableSvc::feeChannelId( 00571 const DayaBay::AdPmtSensor& sensId, 00572 const ServiceMode& svcMode) 00573 { 00574 if( m_first ) initMap(svcMode); 00575 return DayaBay::FeeChannelId(elecChannelId(sensId,svcMode).fullPackedData()); 00576 } 00577 00578 DayaBay::FeeChannelId StaticCableSvc::feeChannelId( 00579 const DayaBay::PoolPmtSensor& sensId, 00580 const ServiceMode& svcMode) 00581 { 00582 if( m_first ) initMap(svcMode); 00583 return DayaBay::FeeChannelId(elecChannelId(sensId,svcMode).fullPackedData()); 00584 } 00585 00586 DayaBay::FecChannelId StaticCableSvc::fecChannelId( 00587 const DayaBay::RpcSensor& sensId, 00588 const ServiceMode& svcMode) 00589 { 00590 if( m_first ) initMap(svcMode); 00591 00592 // check if this is whole panel 00593 if (sensId.layer() == 0 && sensId.strip() == 0) { 00594 DayaBay::RpcSensor helper(sensId.panelRow(),sensId.panelColumn(), 00595 1, 1, sensId.site(), sensId.detectorId()); 00596 return DayaBay::FecChannelId(elecChannelId(helper, svcMode).fullPackedData()).boardId(); 00597 } 00598 return DayaBay::FecChannelId(elecChannelId(sensId,svcMode).fullPackedData()); 00599 } 00600 00601 DayaBay::DetectorSensor StaticCableSvc::sensor( 00602 const DayaBay::ElecChannelId& elecChannel, 00603 const ServiceMode& svcMode) 00604 { 00605 if( m_first ) initMap(svcMode); 00606 std::map<DayaBay::ElecChannelId,DayaBay::DetectorSensor>::iterator iter; 00607 iter = m_sensorByChannel.find(elecChannel); 00608 if( iter != m_sensorByChannel.end() ){ 00609 // Found sensor 00610 return iter->second; 00611 } 00612 static unsigned int errorCount=0; 00613 static const unsigned int maxErrors=100; 00614 if(errorCount<maxErrors){ 00615 std::ostringstream msgStr; 00616 msgStr << "elecChannelId(): No sensor ID for electronics channel: " 00617 << elecChannel; 00618 msg->reportMessage("StaticCableSvc",MSG::WARNING,msgStr.str()); 00619 errorCount++; 00620 if(errorCount==maxErrors){ 00621 msg->reportMessage("StaticCableSvc",MSG::WARNING, 00622 "elecChannelId(): No more errors will reported"); 00623 } 00624 } 00625 return DayaBay::DetectorSensor(0); 00626 } 00627 00628 DayaBay::AdPmtSensor StaticCableSvc::adPmtSensor( 00629 const DayaBay::FeeChannelId& feeChannel, 00630 const ServiceMode& svcMode) 00631 { 00632 if( m_first ) initMap(svcMode); 00633 return DayaBay::AdPmtSensor(sensor(feeChannel,svcMode).fullPackedData()); 00634 } 00635 00636 DayaBay::PoolPmtSensor StaticCableSvc::poolPmtSensor( 00637 const DayaBay::FeeChannelId& feeChannel, 00638 const ServiceMode& svcMode) 00639 { 00640 if( m_first ) initMap(svcMode); 00641 return DayaBay::PoolPmtSensor(sensor(feeChannel,svcMode).fullPackedData()); 00642 } 00643 00644 DayaBay::RpcSensor StaticCableSvc::rpcSensor( 00645 const DayaBay::FecChannelId& fecChannel, 00646 const ServiceMode& svcMode) 00647 { 00648 if( m_first ) initMap(svcMode); 00649 // check if we are dealing with full board Id 00650 if (fecChannel.connector() == 0) { 00651 DayaBay::ElecChannelId helper(fecChannel.board(), 1, fecChannel.site(), fecChannel.detectorId()); 00652 return DayaBay::RpcSensor(sensor(helper,svcMode).fullPackedData()).panel(); 00653 } 00654 00655 return DayaBay::RpcSensor(sensor(fecChannel,svcMode).fullPackedData()); 00656 } 00657 00658 DayaBay::HardwareId StaticCableSvc::hardwareId( 00659 const DayaBay::DetectorSensor& sensId, 00660 const ServiceMode& svcMode) 00661 { 00662 if( m_first ) initMap(svcMode); 00663 std::map<DayaBay::DetectorSensor,DayaBay::HardwareId>::iterator iter; 00664 iter = m_hardwareBySensor.find(sensId); 00665 if( iter != m_hardwareBySensor.end() ){ 00666 // Found hardware 00667 return iter->second; 00668 } 00669 std::ostringstream msgStr; 00670 msgStr << "hardwareId(): No hardware ID for sensor ID: " << sensId; 00671 msg->reportMessage("StaticCableSvc",MSG::WARNING,msgStr.str()); 00672 return DayaBay::HardwareId(0); 00673 } 00674 00675 DayaBay::PmtHardwareId StaticCableSvc::pmtHardwareId( 00676 const DayaBay::AdPmtSensor& sensId, 00677 const ServiceMode& svcMode) 00678 { 00679 if( m_first ) initMap(svcMode); 00680 return DayaBay::PmtHardwareId(hardwareId(sensId,svcMode).fullPackedData()); 00681 } 00682 00683 DayaBay::PmtHardwareId StaticCableSvc::pmtHardwareId( 00684 const DayaBay::PoolPmtSensor& sensId, 00685 const ServiceMode& svcMode) 00686 { 00687 if( m_first ) initMap(svcMode); 00688 return DayaBay::PmtHardwareId(hardwareId(sensId,svcMode).fullPackedData()); 00689 } 00690 00691 DayaBay::RpcHardwareId StaticCableSvc::rpcHardwareId( 00692 const DayaBay::RpcSensor& sensId, 00693 const ServiceMode& svcMode) 00694 { 00695 if( m_first ) initMap(svcMode); 00696 return DayaBay::RpcHardwareId(hardwareId(sensId,svcMode).fullPackedData()); 00697 } 00698 00699 DayaBay::DetectorSensor StaticCableSvc::sensor( 00700 const DayaBay::HardwareId& hardwareId, 00701 const ServiceMode& svcMode) 00702 { 00703 if( m_first ) initMap(svcMode); 00704 std::map<DayaBay::HardwareId,DayaBay::DetectorSensor>::iterator iter; 00705 iter = m_sensorByHardware.find(hardwareId); 00706 if( iter != m_sensorByHardware.end() ){ 00707 // Found sensor 00708 return iter->second; 00709 } 00710 std::ostringstream msgStr; 00711 msgStr << "sensor(): No sensor for hardware ID: " << hardwareId; 00712 msg->reportMessage("StaticCableSvc",MSG::WARNING,msgStr.str()); 00713 return DayaBay::DetectorSensor(0); 00714 } 00715 00716 DayaBay::AdPmtSensor StaticCableSvc::adPmtSensor( 00717 const DayaBay::PmtHardwareId& pmtId, 00718 const ServiceMode& svcMode) 00719 { 00720 if( m_first ) initMap(svcMode); 00721 return DayaBay::AdPmtSensor(sensor(pmtId,svcMode).fullPackedData()); 00722 } 00723 00724 DayaBay::PoolPmtSensor StaticCableSvc::poolPmtSensor( 00725 const DayaBay::PmtHardwareId& pmtId, 00726 const ServiceMode& svcMode) 00727 { 00728 if( m_first ) initMap(svcMode); 00729 return DayaBay::PoolPmtSensor(sensor(pmtId,svcMode).fullPackedData()); 00730 } 00731 00732 DayaBay::RpcSensor StaticCableSvc::rpcSensor( 00733 const DayaBay::RpcHardwareId& rpcId, 00734 const ServiceMode& svcMode) 00735 { 00736 if( m_first ) initMap(svcMode); 00737 return DayaBay::RpcSensor(sensor(rpcId, svcMode).fullPackedData()); 00738 } 00739 00740 DayaBay::HardwareId StaticCableSvc::hardwareId( 00741 const DayaBay::ElecChannelId& elecChannel, 00742 const ServiceMode& svcMode) 00743 { 00744 if( m_first ) initMap(svcMode); 00745 std::map<DayaBay::ElecChannelId,DayaBay::HardwareId>::iterator iter; 00746 iter = m_hardwareByChannel.find(elecChannel); 00747 if( iter != m_hardwareByChannel.end() ){ 00748 // Found hardware 00749 return iter->second; 00750 } 00751 std::ostringstream msgStr; 00752 msgStr << "hardwareId(): No hardware ID for electronics channel: " 00753 << elecChannel; 00754 msg->reportMessage("StaticCableSvc",MSG::WARNING,msgStr.str()); 00755 return DayaBay::HardwareId(0); 00756 } 00757 00758 DayaBay::FeeHardwareId StaticCableSvc::feeHardwareId( 00759 const DayaBay::FeeChannelId& feeChannel, 00760 const ServiceMode& svcMode) 00761 { 00762 if( m_first ) initMap(svcMode); 00763 return DayaBay::FeeHardwareId(hardwareId(feeChannel,svcMode).fullPackedData()); 00764 } 00765 00766 DayaBay::FecHardwareId StaticCableSvc::fecHardwareId( 00767 const DayaBay::FecChannelId& fecChannel, 00768 const ServiceMode& svcMode) 00769 { 00770 if( m_first ) initMap(svcMode); 00771 return DayaBay::FecHardwareId(hardwareId(fecChannel,svcMode).fullPackedData()); 00772 } 00773 00774 DayaBay::ElecChannelId StaticCableSvc::elecChannelId( 00775 const DayaBay::HardwareId& hardwareId, 00776 const ServiceMode& svcMode) 00777 { 00778 if( m_first ) initMap(svcMode); 00779 std::map<DayaBay::HardwareId,DayaBay::ElecChannelId>::iterator iter; 00780 iter = m_channelByHardware.find(hardwareId); 00781 if( iter != m_channelByHardware.end() ){ 00782 // Found channel 00783 return iter->second; 00784 } 00785 std::ostringstream msgStr; 00786 msgStr << "elecChannelId(): No electronics channel for hardware ID: " 00787 << hardwareId; 00788 msg->reportMessage("StaticCableSvc",MSG::WARNING,msgStr.str()); 00789 return DayaBay::ElecChannelId(0); 00790 } 00791 00792 DayaBay::FeeChannelId StaticCableSvc::feeChannelId( 00793 const DayaBay::FeeHardwareId& feeHardwareId, 00794 const ServiceMode& svcMode) 00795 { 00796 if( m_first ) initMap(svcMode); 00797 return DayaBay::FeeChannelId(elecChannelId(feeHardwareId,svcMode).fullPackedData()); 00798 } 00799 00800 DayaBay::FecChannelId StaticCableSvc::fecChannelId( 00801 const DayaBay::FecHardwareId& fecHardwareId, 00802 const ServiceMode& svcMode) 00803 { 00804 if( m_first ) initMap(svcMode); 00805 return DayaBay::FecChannelId(elecChannelId(fecHardwareId,svcMode).fullPackedData()); 00806 }