CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
RPCLinkSynchroHistoMaker.cc
Go to the documentation of this file.
3 
4 #include <algorithm>
5 #include <utility>
6 
7 struct OrderLbSpread {
8  bool operator()(const std::pair<double, unsigned int>& lb1, const std::pair<double, unsigned int>& lb2) {
9  return lb1.first > lb2.first;
10  }
11 };
12 struct OrderLbOccup {
13  bool operator()(const std::pair<unsigned int, unsigned int>& lb1, const std::pair<unsigned int, unsigned int>& lb2) {
14  return lb1.first > lb2.first;
15  }
16 };
17 
18 void RPCLinkSynchroHistoMaker::fill(TH1F* hDelay, TH2F* hDelaySpread, TH2F* hTopOccup, TH2F* hTopSpread) const {
19  hDelay->Reset();
20  hDelaySpread->Reset();
21  hTopOccup->Reset();
22  hTopSpread->Reset();
23 
24  typedef std::vector<std::pair<unsigned int, unsigned int> > TopOccup;
25  typedef std::vector<std::pair<double, unsigned int> > TopSpread;
26  TopOccup topOccup(10, std::make_pair(0, 0));
27  TopSpread topSpread(10, std::make_pair(0., 0));
28 
29  for (unsigned int idx = 0; idx < theLinkStat.theLinkStatMap.size(); ++idx) {
31 
32  int sum = bc.second.sum();
33  double rms = bc.second.rms();
34 
35  hDelaySpread->Fill(bc.second.mean() - 3., bc.second.rms());
36 
37  if (sum == 0)
38  continue;
39  for (int i = 0; i <= 7; ++i)
40  hDelay->Fill(i - 3, bc.second.counts()[i]);
41 
42  std::pair<unsigned int, unsigned int> canOccup = std::make_pair(sum, idx);
43  std::pair<double, unsigned int> canSpread = std::make_pair(rms, idx);
44  TopOccup::iterator io = upper_bound(topOccup.begin(), topOccup.end(), canOccup, OrderLbOccup());
45  TopSpread::iterator is = upper_bound(topSpread.begin(), topSpread.end(), canSpread, OrderLbSpread());
46  if (io != topOccup.end()) {
47  topOccup.insert(io, canOccup);
48  topOccup.erase(topOccup.end() - 1);
49  }
50  if (is != topSpread.end()) {
51  topSpread.insert(is, canSpread);
52  topSpread.erase(topSpread.end() - 1);
53  }
54  }
55 
56  for (int itop = 0; itop < 10; itop++) {
57  const RPCLinkSynchroStat::BoardAndCounts& occup = theLinkStat.theLinkStatMap[topOccup[itop].second];
58  const RPCLinkSynchroStat::BoardAndCounts& spread = theLinkStat.theLinkStatMap[topSpread[itop].second];
59  hTopOccup->GetYaxis()->SetBinLabel(itop + 1, occup.first.name().c_str());
60  hTopSpread->GetYaxis()->SetBinLabel(itop + 1, spread.first.name().c_str());
61  for (unsigned int icount = 0; icount < occup.second.counts().size(); icount++) {
62  hTopOccup->SetBinContent(icount + 1, itop + 1, float(occup.second.counts()[icount]));
63  hTopSpread->SetBinContent(icount + 1, itop + 1, float(spread.second.counts()[icount]));
64  }
65  }
66 }
bool operator()(const std::pair< unsigned int, unsigned int > &lb1, const std::pair< unsigned int, unsigned int > &lb2)
const RPCLinkSynchroStat & theLinkStat
__host__ __device__ constexpr RandomIt upper_bound(RandomIt first, RandomIt last, const T &value, Compare comp={})
std::pair< LinkBoard, SynchroCounts > BoardAndCounts
bool operator()(const std::pair< double, unsigned int > &lb1, const std::pair< double, unsigned int > &lb2)
void fill(TH1F *hDelay, TH2F *hDelaySpread, TH2F *hTopOccup, TH2F *hTopSpread) const
std::vector< BoardAndCounts > theLinkStatMap