CMS 3D CMS Logo

OmtfLinkMappingRpc.cc
Go to the documentation of this file.
2 
3 #include <fstream>
4 
8 
17 
20 
21 namespace omtf {
22 
24  const LinkBoardElectronicIndex& o2) const {
25  if (o1.dccId < o2.dccId)
26  return true;
27  else if (o1.dccId == o2.dccId && o1.dccInputChannelNum < o2.dccInputChannelNum)
28  return true;
29  else if (o1.dccId == o2.dccId && o1.dccInputChannelNum == o2.dccInputChannelNum &&
31  return true;
32  else
33  return false;
34  }
35 
36  MapEleIndex2LBIndex translateOmtf2Pact(const RpcLinkMap& omtfLink2Ele, const RPCReadOutMapping* pactCabling) {
37  MapEleIndex2LBIndex omtf2rpc;
38 
39  std::vector<const DccSpec*> dccs = pactCabling->dccList();
40  for (auto it1 : dccs) {
41  const std::vector<TriggerBoardSpec>& rmbs = it1->triggerBoards();
42  for (auto const& it2 : rmbs) {
43  const std::vector<LinkConnSpec>& links = it2.linkConns();
44  for (auto const& it3 : links) {
45  const std::vector<LinkBoardSpec>& lbs = it3.linkBoards();
46  for (std::vector<LinkBoardSpec>::const_iterator it4 = lbs.begin(); it4 != lbs.end(); ++it4) {
47  std::string lbNameCH = it4->linkBoardName();
48  std::string lbName = lbNameCH.substr(0, lbNameCH.size() - 4);
49  std::vector<EleIndex> omtfEles = omtfLink2Ele.omtfEleIndex(lbName);
50  // if (!omtfEles.empty()) std::cout <<" isOK ! " << it4->linkBoardName() <<" has: " << omtfEles.size() << " first: "<< omtfEles[0] << std::endl;
51  LinkBoardElectronicIndex rpcEle = {
52  it1->id(), it2.dccInputChannelNum(), it3.triggerBoardInputNumber(), it4->linkBoardNumInLink()};
53  for (const auto& omtfEle : omtfEles)
54  omtf2rpc[omtfEle] = rpcEle;
55  }
56  }
57  }
58  }
59  LogTrace(" ") << " SIZE OF OMTF to RPC map TRANSLATION is: " << omtf2rpc.size() << std::endl;
60  return omtf2rpc;
61  }
62 
63  MapLBIndex2EleIndex translatePact2Omtf(const RpcLinkMap& omtfLink2Ele, const RPCReadOutMapping* pactCabling) {
64  MapLBIndex2EleIndex pact2omtfs;
65  MapEleIndex2LBIndex omtf2rpcs = translateOmtf2Pact(omtfLink2Ele, pactCabling);
66  for (const auto& omtf2rpc : omtf2rpcs) {
67  std::pair<EleIndex, EleIndex>& omtfs = pact2omtfs[omtf2rpc.second];
68  if (omtfs.first.fed() == 0)
69  omtfs.first = omtf2rpc.first;
70  else if (omtfs.second.fed() == 0)
71  omtfs.second = omtf2rpc.first;
72  else
73  edm::LogError(" translatePact2Omtf ") << " PROBLEM LinkBoardElectronicIndex already USED!!!! ";
74  }
75  return pact2omtfs;
76  }
77 
80  es.get<RPCOMTFLinkMapRcd>().get(amcMapping);
81  const RPCAMCLinkMap::map_type& amcMap = amcMapping->getMap();
82 
83  for (const auto& item : amcMap) {
84  unsigned int fedId = item.first.getFED();
85  unsigned int amcSlot = item.first.getAMCNumber();
86  unsigned int link = item.first.getAMCInput();
87  std::string lbName = item.second.getName();
88 
89  std::string processorNameStr = "OMTF";
90  ;
91  if (fedId == 1380)
92  processorNameStr = "OMTFn";
93  else
94  processorNameStr = "OMTFp";
95  processorNameStr += std::to_string(amcSlot / 2 + 1);
96  std::string processorName = processorNameStr;
97 
98  std::map<unsigned int, std::string>& li2lb = link2lbName[processorName];
99  std::map<std::string, unsigned int>& lb2li = lbName2link[processorName];
100  li2lb[link] = lbName;
101  lb2li[lbName] = link;
102  EleIndex ele(processorName, link);
103  lbName2OmtfIndex[lbName].push_back(ele);
104  }
105  }
106 
108  std::ifstream inFile;
109  inFile.open(fName);
110  if (inFile) {
111  LogTrace("") << " reading OmtfRpcLinksMap from: " << fName;
112  } else {
113  LogTrace("") << " Unable to open file " << fName;
114 
115  throw std::runtime_error("Unable to open OmtfRpcLinksMap file " + fName);
116  }
117 
119  while (std::getline(inFile, line)) {
120  line.erase(0, line.find_first_not_of(" \t\r\n")); //cut first character
121  if (line.empty() || !line.compare(0, 2, "--"))
122  continue; // empty or comment line
123  std::stringstream ss(line);
124  std::string processorName, lbName;
125  unsigned int link, dbId;
126  if (ss >> processorName >> link >> lbName >> dbId) {
127  std::map<unsigned int, std::string>& li2lb = link2lbName[processorName];
128  std::map<std::string, unsigned int>& lb2li = lbName2link[processorName];
129  li2lb[link] = lbName;
130  lb2li[lbName] = link;
131  EleIndex ele(processorName, link);
132  lbName2OmtfIndex[lbName].push_back(ele);
133  }
134  }
135  inFile.close();
136  }
137 
138  std::vector<EleIndex> RpcLinkMap::omtfEleIndex(const std::string& lbName) const {
139  const auto pos = lbName2OmtfIndex.find(lbName);
140  return pos != lbName2OmtfIndex.end() ? pos->second : std::vector<EleIndex>();
141  }
142 
143 } // namespace omtf
std::vector< EleIndex > omtfEleIndex(const std::string &lbName) const
MapLBIndex2EleIndex translatePact2Omtf(const RpcLinkMap &omtfLnks, const RPCReadOutMapping *pactCabling)
bool operator()(const LinkBoardElectronicIndex &o1, const LinkBoardElectronicIndex &o2) const
std::vector< const DccSpec * > dccList() const
all FEDs in map
std::map< LinkBoardElectronicIndex, std::pair< EleIndex, EleIndex >, lessLinkBoardElectronicIndex > MapLBIndex2EleIndex
std::map< EleIndex, LinkBoardElectronicIndex > MapEleIndex2LBIndex
map_type & getMap()
Definition: RPCAMCLinkMap.h:27
std::map< RPCAMCLink, RPCLBLink > map_type
Definition: RPCAMCLinkMap.h:13
#define LogTrace(id)
MapEleIndex2LBIndex translateOmtf2Pact(const RpcLinkMap &omtfLnks, const RPCReadOutMapping *pactCabling)
T get() const
Definition: EventSetup.h:73
void init(const edm::EventSetup &es)