12 using namespace sistrip;
26 <<
" NULL pointer to Analysis object!";
31 if (histos.size() != 1) {
36 if (!histos.empty()) {
41 std::vector<TH1*>::const_iterator ihis = histos.begin();
42 for (; ihis != histos.end(); ihis++) {
57 histo_.second = (*ihis)->GetName();
66 <<
" NULL pointer to base Analysis object!";
74 <<
" NULL pointer to derived Analysis object!";
83 TProfile*
histo =
dynamic_cast<TProfile*
>(
histo_.first);
90 uint16_t non_zero = 0;
93 uint16_t
nbins =
static_cast<uint16_t
>(histo->GetNbinsX());
94 std::vector<float> bin_contents;
95 std::vector<float> bin_errors;
96 std::vector<float> bin_entries;
97 bin_contents.reserve(nbins);
98 bin_errors.reserve(nbins);
99 bin_entries.reserve(nbins);
100 for (uint16_t ibin = 0; ibin <
nbins; ibin++) {
101 bin_contents.push_back(histo->GetBinContent(ibin + 1));
102 bin_errors.push_back(histo->GetBinError(ibin + 1));
103 bin_entries.push_back(histo->GetBinEntries(ibin + 1));
104 if (bin_entries[ibin]) {
105 if (bin_contents[ibin] > max) {
106 max = bin_contents[ibin];
108 if (bin_contents[ibin] < min) {
109 min = bin_contents[ibin];
114 if (bin_contents.size() < 100) {
130 std::vector<float> tick;
131 std::vector<float>
base;
132 for (uint16_t ibin = 0; ibin <
nbins; ibin++) {
133 if (bin_entries[ibin]) {
134 if (bin_contents[ibin] < threshold) {
135 base.push_back(bin_contents[ibin]);
137 tick.push_back(bin_contents[ibin]);
145 sort(tick.begin(), tick.end());
146 sort(base.begin(), base.end());
148 tickmark = tick[tick.size() % 2 ? tick.size() / 2 : tick.size() / 2];
151 baseline = base[base.size() % 2 ? base.size() / 2 : base.size() / 2];
153 anal->
base_ = baseline;
154 anal->
peak_ = tickmark;
155 anal->
height_ = tickmark - baseline;
164 for (uint16_t ibin = 0; ibin < base.size(); ibin++) {
166 mean2 += base[ibin] * base[ibin];
169 mean = mean / base.size();
170 mean2 = mean2 / base.size();
175 float baseline_rms =
sqrt(fabs(mean2 - mean * mean));
178 std::map<uint16_t, float> edges;
179 for (uint16_t ibin = 1; ibin < nbins - 1; ibin++) {
180 if (bin_entries[ibin + 1] && bin_entries[ibin - 1]) {
181 float derivative = bin_contents[ibin + 1] - bin_contents[ibin - 1];
182 if (derivative > 3. * baseline_rms) {
197 std::map<uint16_t, float>::iterator iter = edges.begin();
198 while (!found && iter != edges.end()) {
201 for (uint16_t
ii = 0;
ii < 50;
ii++) {
202 uint16_t
bin = iter->first +
ii;
206 if (static_cast<uint32_t>(bin) < 1 ||
static_cast<uint32_t
>(bin + 1) >= nbins) {
211 temp = bin_contents[bin + 1] - bin_contents[bin - 1];
214 if (temp > max_derivative) {
215 max_derivative =
temp;
216 max_derivative_bin =
bin;
220 if (
ii > 10 &&
ii < 40 && bin_entries[bin] && bin_contents[bin] < baseline + 5. * baseline_rms) {
248 std::map<uint16_t, float> edges_r;
249 for (uint16_t ibin_r = 1; ibin_r < nbins - 1; ibin_r++) {
250 if (bin_entries[ibin_r + 4] && bin_entries[ibin_r + 3] && bin_entries[ibin_r + 2] && bin_entries[ibin_r + 1] &&
251 bin_entries[ibin_r] && bin_entries[ibin_r - 1]) {
252 float derivative_r = bin_contents[ibin_r + 1] - bin_contents[ibin_r - 1];
253 float derivative_r1 = bin_contents[ibin_r + 1] - bin_contents[ibin_r];
254 float derivative_r2 = bin_contents[ibin_r + 2] - bin_contents[ibin_r + 1];
255 float derivative_r3 = bin_contents[ibin_r + 3] - bin_contents[ibin_r + 2];
257 if (derivative_r > 3. * baseline_rms && derivative_r1 > 1. * baseline_rms &&
258 derivative_r2 > 1. * baseline_rms && derivative_r3 > 1. * baseline_rms) {
259 edges_r[ibin_r] = derivative_r;
263 if (edges_r.empty()) {
271 bool found_r =
false;
272 std::map<uint16_t, float>::iterator iter_r = edges_r.begin();
273 while (!found_r && iter_r != edges_r.end()) {
276 int lowpointcount_r = 0;
277 const int lowpointallow_r = 25;
278 for (uint16_t ii_r = 0; ii_r < 50; ii_r++) {
279 uint16_t bin_r = iter_r->first + ii_r;
283 if (static_cast<uint32_t>(bin_r) < 1 ||
static_cast<uint32_t
>(bin_r + 1) >= nbins) {
288 temp_r = bin_contents[bin_r + 1] - bin_contents[bin_r - 1];
291 if (temp_r > max_derivative_r && ii_r < 10) {
292 max_derivative_r = temp_r;
293 max_derivative = temp_r;
294 max_derivative_bin = bin_r;
298 if (ii_r > 10 && ii_r < 40 && bin_entries[bin_r] && bin_contents[bin_r] < baseline + 5. * baseline_rms) {
300 if (lowpointcount_r > lowpointallow_r) {
325 anal->
time_ = max_derivative_bin * 25. / 24.;
static const char unexpectedTask_[]
const uint32_t & fedKey() const
Derivative< X, A >::type derivative(const A &_)
Utility class that holds histogram title.
static const char numberOfHistos_[]
static const float tickMarkHeightThreshold_
static const uint16_t valid_
static const char incompletePlateau_[]
static const char numberOfBins_[]
uint32_t extractFedKey(const TH1 *const)
static const char missingTickMark_[]
static const char rejectedCandidate_[]
static const char mlCommissioning_[]
static const char tickMarkRecovered_[]
void addErrorCode(const std::string &error) override
static const char tickMarkBelowThresh_[]
virtual void addErrorCode(const std::string &error)
const Histo & histo() const
static const char smallTickMarkHeight_[]
static const uint16_t invalid_
static const char noRisingEdges_[]
static const char smallDataRange_[]
Abstract base for derived classes that provide analysis of commissioning histograms.
Log< level::Warning, false > LogWarning
Analysis for timing run using APV tick marks.
void extract(const std::vector< TH1 * > &) override
CommissioningAnalysis *const anal() const
static const char nullPtr_[]