File indexing completed on 2023-10-25 09:37:28
0001 #include "CondFormats/SiPixelObjects/interface/SiPixelFrameConverter.h"
0002 #include "CondFormats/SiPixelObjects/interface/SiPixelFedCabling.h"
0003
0004 #include "CondFormats/SiPixelObjects/interface/PixelROC.h"
0005 #include "CondFormats/SiPixelObjects/interface/CablingPathToDetUnit.h"
0006
0007 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0008
0009 #include <sstream>
0010
0011 using namespace std;
0012 using namespace sipixelobjects;
0013
0014 SiPixelFrameConverter::SiPixelFrameConverter(const SiPixelFedCabling* map, int fedId)
0015 : theFedId(fedId),
0016 theMap(map),
0017 theTree(dynamic_cast<SiPixelFedCablingTree const*>(map)),
0018 theFed(theTree ? theTree->fed(fedId) : nullptr) {}
0019
0020 bool SiPixelFrameConverter::hasDetUnit(uint32_t rawId) const {
0021 return theMap->pathToDetUnitHasDetUnit(rawId, static_cast<unsigned int>(theFedId));
0022 }
0023
0024 PixelROC const* SiPixelFrameConverter::toRoc(int link, int roc) const {
0025 CablingPathToDetUnit path = {
0026 static_cast<unsigned int>(theFedId), static_cast<unsigned int>(link), static_cast<unsigned int>(roc)};
0027 const PixelROC* rocp = (theFed) ? theTree->findItemInFed(path, theFed) : theMap->findItem(path);
0028 if UNLIKELY (!rocp) {
0029 stringstream stm;
0030 stm << "Map shows no fed=" << theFedId << ", link=" << link << ", roc=" << roc;
0031 edm::LogWarning("SiPixelFrameConverter") << stm.str();
0032 }
0033 return rocp;
0034 }
0035
0036 int SiPixelFrameConverter::toCabling(ElectronicIndex& cabling, const DetectorIndex& detector) const {
0037 std::vector<CablingPathToDetUnit> path = theMap->pathToDetUnit(detector.rawId);
0038 typedef std::vector<CablingPathToDetUnit>::const_iterator IT;
0039 for (IT it = path.begin(); it != path.end(); ++it) {
0040 const PixelROC* roc = theMap->findItem(*it);
0041 if (!roc)
0042 return 2;
0043 if (roc->rawId() != detector.rawId)
0044 return 3;
0045
0046 GlobalPixel global = {detector.row, detector.col};
0047
0048
0049 LocalPixel local = roc->toLocal(global);
0050
0051
0052
0053 if (!local.valid())
0054 continue;
0055 ElectronicIndex cabIdx = {static_cast<int>(it->link), static_cast<int>(it->roc), local.dcol(), local.pxid()};
0056 cabling = cabIdx;
0057 return 0;
0058 }
0059 return 1;
0060 }