CMS 3D CMS Logo

RPCLinkSynchroStat.cc
Go to the documentation of this file.
2 
5 
6 #include <algorithm>
7 #include <sstream>
8 #include <iostream>
9 #include <iomanip>
10 
12  return o1.first < o2.first;
13 }
15  return o1.second.sum() < o2.second.sum();
16 }
17 
18 void RPCLinkSynchroStat::add(const std::string& lbName, const unsigned int* hits) {
19  LinkBoard lb(lbName);
21  for (auto it = theLinkStatMap.begin(); it != theLinkStatMap.end(); ++it)
22  if (it->first == lb)
23  it->second += counts;
24 }
25 
27  for (auto it = theChamberAndPartitions.begin(); it != theChamberAndPartitions.end(); ++it) {
28  if ((*it) == part)
29  return 1;
30  }
31  theChamberAndPartitions.push_back(part);
32  return 0;
33 }
34 
36  for (auto it = theElePaths.begin(); it != theElePaths.end(); ++it) {
37  if (it->dccId == ele.dccId && it->dccInputChannelNum == ele.dccInputChannelNum &&
38  it->tbLinkInputNum == ele.tbLinkInputNum && it->lbNumInLink == ele.lbNumInLink)
39  return 1;
40  }
41  theElePaths.push_back(ele);
42  return 0;
43 }
44 
46  for (unsigned int i = 0; i < 8; ++i)
47  if (theCounts[i])
48  return i;
49  return 8;
50 }
51 
52 void RPCLinkSynchroStat::SynchroCounts::set(unsigned int bxDiff) {
53  if (bxDiff < 8)
54  theCounts[bxDiff] = 1;
55 }
56 
58  if (bxDiff < 8)
59  theCounts[bxDiff]++;
60 }
61 
63  for (unsigned int i = 0; i < 8; ++i)
64  theCounts[i] += rhs.theCounts[i];
65  return *this;
66 }
67 
69  unsigned int result = 0;
70  for (unsigned int i = 0; i < 8; ++i)
71  result += theCounts[i];
72  return result;
73 }
74 
76  double result = 0.;
77  for (unsigned int i = 0; i < 8; ++i)
78  result += i * theCounts[i];
79  return result;
80 }
81 
83  unsigned int sum = mom0();
84  return sum == 0 ? 0. : mom1() / sum;
85 }
86 
88  double result = 0.;
89  int sum = mom0();
90  if (sum == 0)
91  return 0.;
92  double mean = mom1() / sum;
93  for (int i = 0; i < 8; ++i)
94  result += theCounts[i] * (mean - i) * (mean - i);
95  result /= sum;
96  return sqrt(result);
97 }
98 
100  std::ostringstream str;
101  str << " mean: " << std::setw(8) << mean();
102  str << " rms: " << std::setw(8) << rms();
103  str << " counts:";
104  for (int i = 0; i < 8; ++i)
105  str << " " << std::setw(4) << theCounts[i];
106  return str.str();
107 }
108 
110  for (unsigned int idx = 0; idx < 8; ++idx)
111  if (theCounts[idx] != o.theCounts[idx])
112  return false;
113  return true;
114 }
115 
116 RPCLinkSynchroStat::RPCLinkSynchroStat(bool useFirstFitOnly) : theUseFirstHitOnly(useFirstFitOnly) {
117  for (unsigned int i1 = 0; i1 <= MAXDCCINDEX; ++i1) {
118  for (unsigned int i2 = 0; i2 <= MAXRBCINDEX; i2++) {
119  for (unsigned int i3 = 0; i3 <= MAXLINKINDEX; ++i3) {
120  for (unsigned int i4 = 0; i4 <= MAXLBINDEX; ++i4) {
121  theLinkStatNavi[i1][i2][i3][i4] = 0;
122  }
123  }
124  }
125  }
126  theLinkStatMap.push_back(std::make_pair(LinkBoard("Dummy"), SynchroCounts()));
127 }
128 
129 void RPCLinkSynchroStat::init(const RPCReadOutMapping* theCabling, bool addChamberInfo) {
130  if (!theCabling)
131  return;
132  std::vector<const DccSpec*> dccs = theCabling->dccList();
133  for (auto it1 = dccs.begin(); it1 != dccs.end(); ++it1) {
134  const std::vector<TriggerBoardSpec>& rmbs = (*it1)->triggerBoards();
135  for (auto it2 = rmbs.begin(); it2 != rmbs.end(); ++it2) {
136  const std::vector<LinkConnSpec>& links = it2->linkConns();
137  for (auto it3 = links.begin(); it3 != links.end(); ++it3) {
138  const std::vector<LinkBoardSpec>& lbs = it3->linkBoards();
139  for (auto it4 = lbs.begin(); it4 != lbs.end(); ++it4) {
141  (*it1)->id(), it2->dccInputChannelNum(), it3->triggerBoardInputNumber(), it4->linkBoardNumInLink()};
142  LinkBoard linkBoard(it4->linkBoardName());
143  BoardAndCounts candid = std::make_pair(linkBoard, SynchroCounts());
144  std::vector<BoardAndCounts>::iterator candid_place =
145  lower_bound(theLinkStatMap.begin(), theLinkStatMap.end(), candid, LessLinkName());
146  if (candid_place != theLinkStatMap.end() && candid.first == candid_place->first) {
147  candid_place->first.add(ele);
148  } else {
149  candid_place = theLinkStatMap.insert(candid_place, candid);
150  candid_place->first.add(ele);
151  if (addChamberInfo) {
152  const std::vector<FebConnectorSpec>& febs = it4->febs();
153  for (std::vector<FebConnectorSpec>::const_iterator it5 = febs.begin(); it5 != febs.end(); ++it5) {
154  std::string chamberName = it5->chamber().chamberLocationName();
155  std::string partitionName = it5->feb().localEtaPartitionName();
156  LinkBoard::ChamberAndPartition chamberAndPartition = std::make_pair(chamberName, partitionName);
157  candid_place->first.add(chamberAndPartition);
158  }
159  }
160  }
161  }
162  }
163  }
164  }
165  for (unsigned int idx = 0; idx < theLinkStatMap.size(); ++idx) {
166  const std::vector<LinkBoardElectronicIndex>& paths = theLinkStatMap[idx].first.paths();
167  for (auto it = paths.begin(); it != paths.end(); ++it) {
168  theLinkStatNavi[it->dccId - DCCINDEXSHIFT][it->dccInputChannelNum][it->tbLinkInputNum][it->lbNumInLink] = idx;
169  }
170  }
171  // LogTrace("RPCLinkSynchroStat") <<" SIZE OF LINKS IS: " << theLinkStatMap.size() << endl;
172 }
173 
174 void RPCLinkSynchroStat::add(const RPCRawSynchro::ProdItem& vItem, std::vector<LinkBoardElectronicIndex>& problems) {
175  std::vector<int> hits(theLinkStatMap.size(), 0);
176  std::vector<ShortLinkInfo> slis;
177  for (auto it = vItem.begin(); it != vItem.end(); ++it) {
178  const LinkBoardElectronicIndex& path = it->first;
179  unsigned int bxDiff = it->second;
180  unsigned int eleCode = (path.dccId - DCCINDEXSHIFT) * 100000 + path.dccInputChannelNum * 1000 +
181  path.tbLinkInputNum * 10 + path.lbNumInLink;
182  unsigned int idx =
183  theLinkStatNavi[path.dccId - DCCINDEXSHIFT][path.dccInputChannelNum][path.tbLinkInputNum][path.lbNumInLink];
184  if (hits[idx] == 0) {
185  ShortLinkInfo sli = {idx, std::vector<unsigned int>(1, eleCode), SynchroCounts()};
186  slis.push_back(sli);
187  hits[idx] = slis.size();
188  } else {
189  std::vector<unsigned int>& v = slis[hits[idx] - 1].hit_paths;
190  std::vector<unsigned int>::iterator iv = lower_bound(v.begin(), v.end(), eleCode);
191  if (iv == v.end() || (*iv) != eleCode)
192  v.insert(iv, eleCode);
193  }
194  slis[hits[idx] - 1].counts.set(bxDiff); // ensure one count per LB per BX
195  }
196 
197  for (auto ic = slis.begin(); ic != slis.end(); ++ic) {
198  if (theUseFirstHitOnly) {
199  theLinkStatMap[ic->idx].second.increment(ic->counts.firstHit()); // first hit only
200  } else {
201  theLinkStatMap[ic->idx].second += ic->counts;
202  }
203  if (theLinkStatMap[ic->idx].first.paths().size() != ic->hit_paths.size()) {
204  const std::vector<LinkBoardElectronicIndex>& paths = theLinkStatMap[ic->idx].first.paths();
205  problems.insert(problems.end(), paths.begin(), paths.end());
206  }
207  }
208 }
209 
211  std::ostringstream str;
212  std::vector<BoardAndCounts> sortedStat = theLinkStatMap;
213  stable_sort(sortedStat.begin(), sortedStat.end(), LessCountSum());
214  for (unsigned int idx = 0; idx < sortedStat.size(); ++idx) {
215  const LinkBoard& board = sortedStat[idx].first;
216  const SynchroCounts& counts = sortedStat[idx].second;
217 
218  // DUMP LINKNAME
219  str << std::setw(20) << board.name();
220 
221  // DUMP COUNTS
222  str << " " << counts.print();
223 
224  //PATHS
225  str << " paths: ";
226  const std::vector<LinkBoardElectronicIndex>& paths = board.paths();
227  for (auto ip = paths.begin(); ip != paths.end(); ++ip)
228  str << "{" << ip->dccId << "," << std::setw(2) << ip->dccInputChannelNum << "," << std::setw(2)
229  << ip->tbLinkInputNum << "," << ip->lbNumInLink << "}";
230 
231  // DUMP CHAMBERS
232  std::map<std::string, std::vector<std::string> > chMap;
233  const std::vector<LinkBoard::ChamberAndPartition>& chamberAndPartitions = board.chamberAndPartitions();
234  for (auto it = chamberAndPartitions.begin(); it != chamberAndPartitions.end(); ++it) {
235  std::vector<std::string>& partitions = chMap[it->first];
236  if (find(partitions.begin(), partitions.end(), it->second) == partitions.end())
237  partitions.push_back(it->second);
238  }
239  str << " chambers: ";
240  for (auto im = chMap.begin(); im != chMap.end(); ++im) {
241  str << im->first << "(";
242  for (std::vector<std::string>::const_iterator ip = im->second.begin(); ip != im->second.end(); ++ip) {
243  str << *ip;
244  if ((ip + 1) != (im->second.end()))
245  str << ",";
246  else
247  str << ")";
248  }
249  }
250 
251  str << std::endl;
252  }
253  LogTrace("RPCLinkSynchroStat") << "RPCLinkSynchroStat::dumpDelays, SIZE OF LINKS IS: " << theLinkStatMap.size()
254  << std::endl;
255  return str.str();
256 }
bool operator()(const BoardAndCounts &o1, const BoardAndCounts &o2)
const std::string & name() const
void init(const RPCReadOutMapping *theCabling, bool addChamberInfo)
bool operator()(const BoardAndCounts &o1, const BoardAndCounts &o2)
unsigned int theLinkStatNavi[MAXDCCINDEX+1][MAXRBCINDEX+1][MAXLINKINDEX+1][MAXLBINDEX+1]
std::pair< std::string, std::string > ChamberAndPartition
static const unsigned int MAXLINKINDEX
void increment(unsigned int bxDiff)
const std::vector< ChamberAndPartition > & chamberAndPartitions() const
static const unsigned int MAXLBINDEX
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
#define LogTrace(id)
std::pair< LinkBoard, SynchroCounts > BoardAndCounts
RPCLinkSynchroStat(bool useFirstHitOnly)
SynchroCounts & operator+=(const SynchroCounts &rhs)
std::vector< std::pair< LinkBoardElectronicIndex, int > > ProdItem
Definition: RPCRawSynchro.h:9
T sqrt(T t)
Definition: SSEVec.h:23
static const unsigned int MAXRBCINDEX
std::vector< const DccSpec * > dccList() const
all FEDs in map
static const unsigned int DCCINDEXSHIFT
bool operator==(const SynchroCounts &) const
const std::vector< LinkBoardElectronicIndex > & paths() const
void add(const RPCRawSynchro::ProdItem &counts, std::vector< LinkBoardElectronicIndex > &problems)
part
Definition: HCALResponse.h:20
static const unsigned int MAXDCCINDEX
int add(const ChamberAndPartition &part)
std::vector< unsigned int > theCounts
std::vector< BoardAndCounts > theLinkStatMap
#define str(s)
if(threadIdxLocalY==0 &&threadIdxLocalX==0)