CMS 3D CMS Logo

SiPixelFedCablingTree.cc
Go to the documentation of this file.
2 #include <algorithm>
3 #include <sstream>
4 #include <iostream>
5 
6 using namespace std;
7 using namespace sipixelobjects;
8 
9 typedef std::unordered_map<int, SiPixelFedCablingTree::PixelFEDCabling>::const_iterator IMAP;
10 
11 std::vector<sipixelobjects::CablingPathToDetUnit> SiPixelFedCablingTree::pathToDetUnit(uint32_t rawDetId) const {
12  std::vector<sipixelobjects::CablingPathToDetUnit> result;
13  for (auto im = theFedCablings.begin(); im != theFedCablings.end(); ++im) {
14  const PixelFEDCabling& aFed = im->second;
15  for (unsigned int idxLink = 1; idxLink <= aFed.numberOfLinks(); idxLink++) {
16  const PixelFEDLink* link = aFed.link(idxLink);
17  if (!link)
18  continue;
19  unsigned int numberOfRocs = link->numberOfROCs();
20  for (unsigned int idxRoc = 1; idxRoc <= numberOfRocs; idxRoc++) {
21  const PixelROC* roc = link->roc(idxRoc);
22  if (rawDetId == roc->rawId()) {
23  CablingPathToDetUnit path = {aFed.id(), link->id(), roc->idInLink()};
24  result.push_back(path);
25  }
26  }
27  }
28  }
29  return result;
30 }
31 
32 bool SiPixelFedCablingTree::pathToDetUnitHasDetUnit(uint32_t rawDetId, unsigned int fedId) const {
33  for (auto im = theFedCablings.begin(); im != theFedCablings.end(); ++im) {
34  const PixelFEDCabling& aFed = im->second;
35  if (aFed.id() == fedId) {
36  for (unsigned int idxLink = 1; idxLink <= aFed.numberOfLinks(); idxLink++) {
37  const PixelFEDLink* link = aFed.link(idxLink);
38  if (!link)
39  continue;
40  unsigned int numberOfRocs = link->numberOfROCs();
41  for (unsigned int idxRoc = 1; idxRoc <= numberOfRocs; idxRoc++) {
42  const PixelROC* roc = link->roc(idxRoc);
43  if (rawDetId == roc->rawId()) {
44  return true;
45  }
46  }
47  }
48  }
49  }
50  return false;
51 }
52 
53 std::unordered_map<uint32_t, unsigned int> SiPixelFedCablingTree::det2fedMap() const {
54  std::unordered_map<uint32_t, unsigned int> result;
55  for (auto im = theFedCablings.begin(); im != theFedCablings.end(); ++im) {
56  auto const& aFed = im->second;
57  for (unsigned int idxLink = 1; idxLink <= aFed.numberOfLinks(); idxLink++) {
58  auto link = aFed.link(idxLink);
59  if (!link)
60  continue;
61  unsigned int numberOfRocs = link->numberOfROCs();
62  for (unsigned int idxRoc = 1; idxRoc <= numberOfRocs; idxRoc++) {
63  auto roc = link->roc(idxRoc);
64  result[roc->rawId()] = aFed.id(); // we know that a det is in one fed only...
65  }
66  }
67  }
68  return result;
69 }
70 
71 std::map<uint32_t, std::vector<sipixelobjects::CablingPathToDetUnit> > SiPixelFedCablingTree::det2PathMap() const {
72  std::map<uint32_t, std::vector<sipixelobjects::CablingPathToDetUnit> > result;
73  for (auto im = theFedCablings.begin(); im != theFedCablings.end(); ++im) {
74  auto const& aFed = im->second;
75  for (unsigned int idxLink = 1; idxLink <= aFed.numberOfLinks(); idxLink++) {
76  auto link = aFed.link(idxLink);
77  if (!link)
78  continue;
79  unsigned int numberOfRocs = link->numberOfROCs();
80  for (unsigned int idxRoc = 1; idxRoc <= numberOfRocs; idxRoc++) {
81  auto roc = link->roc(idxRoc);
82  CablingPathToDetUnit path = {aFed.id(), link->id(), roc->idInLink()};
83  result[roc->rawId()].push_back(path);
84  }
85  }
86  }
87  return result;
88 }
89 
91  int id = f.id();
92  theFedCablings[id] = f;
93 }
94 
95 const PixelFEDCabling* SiPixelFedCablingTree::fed(unsigned int id) const {
96  auto it = theFedCablings.find(id);
97  return (it == theFedCablings.end()) ? nullptr : &(*it).second;
98 }
99 
101  ostringstream out;
102  if (depth-- >= 0) {
103  out << theVersion << endl;
104  for (IMAP it = theFedCablings.begin(); it != theFedCablings.end(); it++) {
105  out << (*it).second.print(depth);
106  }
107  }
108  out << endl;
109  return out.str();
110 }
111 
112 std::vector<const PixelFEDCabling*> SiPixelFedCablingTree::fedList() const {
113  std::vector<const PixelFEDCabling*> result;
114  for (IMAP im = theFedCablings.begin(); im != theFedCablings.end(); im++) {
115  result.push_back(&(im->second));
116  }
117  std::sort(result.begin(), result.end(), [](const PixelFEDCabling* a, const PixelFEDCabling* b) {
118  return a->id() < b->id();
119  });
120  return result;
121 }
122 
123 void SiPixelFedCablingTree::addItem(unsigned int fedId, unsigned int linkId, const PixelROC& roc) {
124  PixelFEDCabling& cabling = theFedCablings[fedId];
125  if (cabling.id() != fedId)
126  cabling = PixelFEDCabling(fedId);
127  cabling.addItem(linkId, roc);
128 }
129 
131  const PixelROC* roc = nullptr;
132  const PixelFEDCabling* aFed = fed(path.fed);
133  if (aFed) {
134  const PixelFEDLink* aLink = aFed->link(path.link);
135  if (aLink)
136  roc = aLink->roc(path.roc);
137  }
138  return roc;
139 }
140 
142  const PixelFEDCabling* aFed) const {
143  const PixelROC* roc = nullptr;
144  const PixelFEDLink* aLink = aFed->link(path.link);
145  if (aLink)
146  roc = aLink->roc(path.roc);
147  return roc;
148 }
149 
151  int status = 0;
152  for (auto im = theFedCablings.begin(); im != theFedCablings.end(); ++im) {
153  if (im->first != static_cast<int>(im->second.id())) {
154  status = 1;
155  std::cout << "PROBLEM WITH FED ID!!" << im->first << " vs: " << im->second.id() << std::endl;
156  }
157  im->second.checkLinkNumbering();
158  }
159  return status;
160 }
const sipixelobjects::PixelROC * findItemInFed(const sipixelobjects::CablingPathToDetUnit &path, const PixelFEDCabling *aFed) const
const PixelFEDLink * link(unsigned int id) const
return link identified by id. Link id&#39;s are ranged [1, numberOfLinks]
std::string print(int depth=0) const
void addItem(unsigned int linkId, const PixelROC &roc)
const sipixelobjects::PixelROC * findItem(const sipixelobjects::CablingPathToDetUnit &path) const final
std::unordered_map< uint32_t, unsigned int > det2fedMap() const final
double f[11][100]
const PixelFEDCabling * fed(unsigned int idFed) const
get fed identified by its id
std::vector< sipixelobjects::CablingPathToDetUnit > pathToDetUnit(uint32_t rawDetId) const final
std::unordered_map< int, SiPixelFedCablingTree::PixelFEDCabling >::const_iterator IMAP
unsigned int numberOfLinks() const
number of links in FED
double b
Definition: hdecay.h:118
std::vector< const PixelFEDCabling * > fedList() const
double a
Definition: hdecay.h:119
void addFed(const PixelFEDCabling &f)
add cabling for one fed
std::map< uint32_t, std::vector< sipixelobjects::CablingPathToDetUnit > > det2PathMap() const final
void addItem(unsigned int fedId, unsigned int linkId, const sipixelobjects::PixelROC &roc)
bool pathToDetUnitHasDetUnit(uint32_t rawDetId, unsigned int fedId) const final