CMS 3D CMS Logo

PedsOnlyAlgorithm.cc
Go to the documentation of this file.
6 #include "TProfile.h"
7 #include "TH1.h"
8 #include <iostream>
9 #include <iomanip>
10 #include <cmath>
11 
12 using namespace sistrip;
13 
14 // ----------------------------------------------------------------------------
15 //
17  : CommissioningAlgorithm(anal), hPeds_(nullptr, ""), hNoise_(nullptr, "") {}
18 
19 // ----------------------------------------------------------------------------
20 //
21 void PedsOnlyAlgorithm::extract(const std::vector<TH1*>& histos) {
22  if (!anal()) {
23  edm::LogWarning(mlCommissioning_) << "[PedsOnlyAlgorithm::" << __func__ << "]"
24  << " NULL pointer to Analysis object!";
25  return;
26  }
27 
28  // Check number of histograms
29  if (histos.size() != 2) {
31  }
32 
33  // Extract FED key from histo title
34  if (!histos.empty()) {
35  anal()->fedKey(extractFedKey(histos.front()));
36  }
37 
38  // Extract histograms
39  std::vector<TH1*>::const_iterator ihis = histos.begin();
40  for (; ihis != histos.end(); ihis++) {
41  // Check for NULL pointer
42  if (!(*ihis)) {
43  continue;
44  }
45 
46  // Check run type
47  SiStripHistoTitle title((*ihis)->GetName());
48  if (title.runType() != sistrip::PEDS_ONLY) {
50  continue;
51  }
52 
53  // Extract peds and raw noise histos (check for legacy names first!)
54  if (title.extraInfo().find(sistrip::extrainfo::pedsAndRawNoise_) != std::string::npos) {
55  hPeds_.first = *ihis;
56  hPeds_.second = (*ihis)->GetName();
57  hNoise_.first = *ihis;
58  hNoise_.second = (*ihis)->GetName();
59  PedsOnlyAnalysis* a = dynamic_cast<PedsOnlyAnalysis*>(const_cast<CommissioningAnalysis*>(anal()));
60  if (a) {
61  a->legacy_ = true;
62  }
63  } else if (title.extraInfo().find(sistrip::extrainfo::pedestals_) != std::string::npos) {
64  hPeds_.first = *ihis;
65  hPeds_.second = (*ihis)->GetName();
66  } else if (title.extraInfo().find(sistrip::extrainfo::rawNoise_) != std::string::npos) {
67  hNoise_.first = *ihis;
68  hNoise_.second = (*ihis)->GetName();
69  } else {
71  }
72  }
73 }
74 
75 // -----------------------------------------------------------------------------
76 //
78  if (!anal()) {
79  edm::LogWarning(mlCommissioning_) << "[PedsOnlyAlgorithm::" << __func__ << "]"
80  << " NULL pointer to base Analysis object!";
81  return;
82  }
83 
85  PedsOnlyAnalysis* anal = dynamic_cast<PedsOnlyAnalysis*>(tmp);
86  if (!anal) {
87  edm::LogWarning(mlCommissioning_) << "[PedsOnlyAlgorithm::" << __func__ << "]"
88  << " NULL pointer to derived Analysis object!";
89  return;
90  }
91 
92  if (!hPeds_.first) {
94  return;
95  }
96 
97  if (!hNoise_.first) {
99  return;
100  }
101 
102  TProfile* peds_histo = dynamic_cast<TProfile*>(hPeds_.first);
103  TProfile* raw_histo = dynamic_cast<TProfile*>(hNoise_.first);
104 
105  if (!peds_histo) {
107  return;
108  }
109 
110  if (!raw_histo) {
112  return;
113  }
114 
115  if (peds_histo->GetNbinsX() != 256) {
117  return;
118  }
119 
120  if (raw_histo->GetNbinsX() != 256) {
122  return;
123  }
124 
125  // Iterate through APVs
126  for (uint16_t iapv = 0; iapv < 2; iapv++) {
127  // Used to calc mean and rms for peds and noise
128  float p_sum = 0., p_sum2 = 0., p_max = -1. * sistrip::invalid_, p_min = sistrip::invalid_;
129  float r_sum = 0., r_sum2 = 0., r_max = -1. * sistrip::invalid_, r_min = sistrip::invalid_;
130 
131  // Iterate through strips of APV
132  for (uint16_t istr = 0; istr < 128; istr++) {
133  uint16_t strip = iapv * 128 + istr;
134 
135  // Pedestals
136  if (peds_histo) {
137  if (peds_histo->GetBinEntries(strip + 1)) {
138  anal->peds_[iapv][istr] = peds_histo->GetBinContent(strip + 1);
139  p_sum += anal->peds_[iapv][istr];
140  p_sum2 += (anal->peds_[iapv][istr] * anal->peds_[iapv][istr]);
141  if (anal->peds_[iapv][istr] > p_max) {
142  p_max = anal->peds_[iapv][istr];
143  }
144  if (anal->peds_[iapv][istr] < p_min) {
145  p_min = anal->peds_[iapv][istr];
146  }
147  }
148  }
149 
150  // Raw noise
151  if (!anal->legacy_) {
152  if (raw_histo) {
153  if (raw_histo->GetBinEntries(strip + 1)) {
154  anal->raw_[iapv][istr] = raw_histo->GetBinContent(strip + 1);
155  r_sum += anal->raw_[iapv][istr];
156  r_sum2 += (anal->raw_[iapv][istr] * anal->raw_[iapv][istr]);
157  if (anal->raw_[iapv][istr] > r_max) {
158  r_max = anal->raw_[iapv][istr];
159  }
160  if (anal->raw_[iapv][istr] < r_min) {
161  r_min = anal->raw_[iapv][istr];
162  }
163  }
164  }
165  } else {
166  if (peds_histo) {
167  if (peds_histo->GetBinEntries(strip + 1)) {
168  anal->raw_[iapv][istr] = raw_histo->GetBinError(strip + 1);
169  r_sum += anal->raw_[iapv][istr];
170  r_sum2 += (anal->raw_[iapv][istr] * anal->raw_[iapv][istr]);
171  if (anal->raw_[iapv][istr] > r_max) {
172  r_max = anal->raw_[iapv][istr];
173  }
174  if (anal->raw_[iapv][istr] < r_min) {
175  r_min = anal->raw_[iapv][istr];
176  }
177  }
178  }
179  }
180 
181  } // strip loop
182 
183  // Calc mean and rms for peds
184  if (!anal->peds_[iapv].empty()) {
185  p_sum /= static_cast<float>(anal->peds_[iapv].size());
186  p_sum2 /= static_cast<float>(anal->peds_[iapv].size());
187  anal->pedsMean_[iapv] = p_sum;
188  anal->pedsSpread_[iapv] = sqrt(fabs(p_sum2 - p_sum * p_sum));
189  }
190 
191  // Calc mean and rms for raw noise
192  if (!anal->raw_[iapv].empty()) {
193  r_sum /= static_cast<float>(anal->raw_[iapv].size());
194  r_sum2 /= static_cast<float>(anal->raw_[iapv].size());
195  anal->rawMean_[iapv] = r_sum;
196  anal->rawSpread_[iapv] = sqrt(fabs(r_sum2 - r_sum * r_sum));
197  }
198 
199  // Set max and min values for peds and raw noise
200  if (p_max > -1. * sistrip::maximum_) {
201  anal->pedsMax_[iapv] = p_max;
202  }
203  if (p_min < 1. * sistrip::maximum_) {
204  anal->pedsMin_[iapv] = p_min;
205  }
206  if (r_max > -1. * sistrip::maximum_) {
207  anal->rawMax_[iapv] = r_max;
208  }
209  if (r_min < 1. * sistrip::maximum_) {
210  anal->rawMin_[iapv] = r_min;
211  }
212 
213  } // apv loop
214 }
static const char unexpectedTask_[]
Histogram-based analysis for pedestal run.
static const char rawNoise_[]
const uint32_t & fedKey() const
static const char pedsAndRawNoise_[]
Utility class that holds histogram title.
static const char numberOfHistos_[]
#define nullptr
void extract(const std::vector< TH1 * > &) override
static const char unexpectedExtraInfo_[]
static const char numberOfBins_[]
sistrip classes
uint32_t extractFedKey(const TH1 *const)
static const char mlCommissioning_[]
T sqrt(T t)
Definition: SSEVec.h:19
static const uint16_t maximum_
Definition: Constants.h:20
virtual void addErrorCode(const std::string &error)
static const char pedestals_[]
static const uint16_t invalid_
Definition: Constants.h:16
histos
Definition: combine.py:4
double a
Definition: hdecay.h:119
Abstract base for derived classes that provide analysis of commissioning histograms.
tmp
align.sh
Definition: createJobs.py:716
CommissioningAnalysis *const anal() const
static const char nullPtr_[]
void analyse() override