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