CMS 3D CMS Logo

UpdateTProfile.cc
Go to the documentation of this file.
2 #include "TProfile.h"
3 #include <iostream>
4 #include <cmath>
5 
6 // -----------------------------------------------------------------------------
9 
10 // -----------------------------------------------------------------------------
13 
14 // -----------------------------------------------------------------------------
16 void UpdateTProfile::setBinContents(TProfile* const prof,
17  const uint32_t& bin,
18  const double& num_of_entries,
19  const double& sum_of_contents,
20  const double& sum_of_squares) {
21  // std::cout << "[UpdateTProfile::setBinContents]" << std::endl;
22 
23  double mean = 0.;
24  double spread = 0.;
25  if (num_of_entries) {
26  mean = sum_of_contents / num_of_entries;
27  spread = sqrt(sum_of_squares / num_of_entries - mean * mean);
28  }
29 
30  // LogTrace("TEST")
31  // << "[UpdateTProfile::setBinContents]"
32  // << " bin: " << bin
33  // << " entries: " << num_of_entries
34  // << " contents: " << sum_of_contents
35  // << " squared: " << sum_of_squares
36  // << " mean: " << mean
37  // << " spread: " << spread;
38 
39  UpdateTProfile::setBinContent(prof, bin, num_of_entries, mean, spread);
40 }
41 
42 // -----------------------------------------------------------------------------
81  TProfile* const prof, const uint32_t& bin, const double& num_of_entries, const double& mean, const double& spread) {
82  // std::cout << "[UpdateTProfile::setBinContents]" << std::endl;
83 
84  // Check histo exists
85  if (!prof) {
86  std::cerr << "[UpdateTProfile::setBinContents]"
87  << " NULL pointer to TProfile object!" << std::endl;
88  return;
89  }
90 
91  // Check bin number is valid
92  if (bin == 0 || bin > static_cast<uint32_t>(prof->GetNbinsX())) {
93  std::cerr << "[UpdateTProfile::setBinContents]"
94  << " Unexpected bin number!" << std::endl;
95  return;
96  }
97 
98  // Check entries are present
99  if (num_of_entries <= 0.) {
100  return;
101  } //@@ what about negative weights???
102  double entries = num_of_entries;
103 
104  // Check error option
105  const char* spread_option = "s";
106  const char* default_option = "";
107  // const char* option = prof->GetErrorOption();
108  // if ( option[0] != spread_option[0] ) {
109  // std::cout << "[UpdateTProfile::setBinContents]"
110  // << " Setting error option for TProfile to 's'!" << std::endl;
111  // prof->SetErrorOption( "s" );
112  // }
113  const char* error_option = prof->GetErrorOption();
114 
115  // Calculate "weight" used for SetBinError() method
116  double weight;
117  if (error_option[0] == spread_option[0]) {
118  weight = sqrt(mean * mean * entries + spread * spread * entries);
119  } else if (error_option[0] == default_option[0]) {
120  weight = sqrt(mean * mean * entries + spread * spread * entries * entries);
121  } else {
122  std::cerr << "[UpdateTProfile::setBinContents]"
123  << " Unexpected error option for TProfile!" << std::endl;
124  weight = 0.;
125  }
126 
127  // Set bin entries, contents and error
128  prof->SetBinEntries(bin, entries);
129  prof->SetBinContent(bin, mean * entries);
130  prof->SetBinError(bin, weight);
131 
132  // LogTrace("TEST")
133  // << "[UpdateTProfile::" << __func__ << "]"
134  // << " bin/entries/mean/content/error: "
135  // << bin << "/"
136  // << entries << "/"
137  // << mean << "/"
138  // << mean*entries << "/"
139  // << weight;
140 
141  // Set total number of entries
142  if (bin == 1) {
143  prof->SetEntries(entries);
144  } else {
145  prof->SetEntries(prof->GetEntries() + entries);
146  }
147 }
T sqrt(T t)
Definition: SSEVec.h:19
static void setBinContent(TProfile *const profile, const uint32_t &bin, const double &entries, const double &mean, const double &spread)
static void setBinContents(TProfile *const profile, const uint32_t &bin, const double &num_of_entries, const double &sum_of_contents, const double &sum_of_squares)