58{
61
62 if(
object.
IsA()->InheritsFrom(
"TH1" ) ) {
64 if (
hist->GetDimension() >= 2 ){
65 throw dqm_core::BadConfig( ERS_HERE, name, "dimension >= 2 " );
66 }
67 } else {
68 throw dqm_core::BadConfig( ERS_HERE, name, "does not inherit from TH1" );
69 }
70
71
72 double minstat;
74 double greenTh;
75 double redTh;
76 try {
81 }
82 catch ( dqm_core::Exception & ex ) {
83 throw dqm_core::BadConfig( ERS_HERE, name, ex.what(), ex );
84 }
85
86
87
88 try {
89 ref =
static_cast<const TH1*
>(
config.getReference() );
90 }
91 catch ( dqm_core::Exception & ex ) {
92 throw dqm_core::BadRefHist(ERS_HERE,name," Could not retreive reference");
93 }
94 if (
hist->GetDimension() !=
ref->GetDimension() ) {
95 throw dqm_core::BadRefHist( ERS_HERE, name, "Reference VS histo: Different dimension!" );
96 }
97
98
99 if (
hist->GetEntries() < minstat ) {
100 ERS_INFO(
"Histogram does not satisfy MinStat requirement " <<
hist->GetName());
101 dqm_core::Result *
result =
new dqm_core::Result(dqm_core::Result::Undefined);
102 result->tags_[
"InsufficientEntries"] =
hist->GetEntries();
104 }
105 ERS_DEBUG(1,
"Statistics: "<<
hist->GetEntries()<<
" entries ");
106
107
108
109 Double_t n_min_50=0;
110 Double_t n_min_50_ref=0;
111
112 Double_t
N =
hist->GetEntries();
113 Double_t N_ref =
ref ->GetEntries();
114
116
117 do{
119 n_min_50 +=
hist->GetBinContent(i);
120 if(i>
hist->GetNbinsX()){
121 ERS_INFO("bin limit!"<<i);
122 dqm_core::Result*
result =
new dqm_core::Result();
123 result->status_ = dqm_core::Result::Undefined;
125 };
126 }
while(
hist->GetBinCenter(i)<thresh);
127
129
130 do{
132 n_min_50_ref +=
ref->GetBinContent(i);
133 if(i>
ref->GetNbinsX()){
134 ERS_INFO("bin limit!"<<i);
135 dqm_core::Result*
result =
new dqm_core::Result();
136 result->status_ = dqm_core::Result::Undefined;
138 };
139 }
while(
ref->GetBinCenter(i)<thresh);
140
142 Double_t f_r= 1;
143 Double_t sigma_hist = -1;
144 Double_t sigma_ref = -1;
147
148
149 if(N == 0 && N_ref == 0) {
150 ERS_INFO("null N entries found");
151 dqm_core::Result*
result =
new dqm_core::Result();
152 result->tags_[
"ERROR_null_entries_found"] = -999.;
153 result->status_ = dqm_core::Result::Undefined;
155 };
156
157 if(N !=0 && N_ref !=0){
159 f_r = n_min_50_ref/N_ref;
160
161 if(f*f_r == 0 || (1-f)<0 || (1-f_r)<0 ){
162 ERS_DEBUG(1,"*) f = "<<f<<" f_r = "<<f_r);
163 dqm_core::Result*
result =
new dqm_core::Result();
164 result->tags_[
"ERROR_problem_in_fraction_computation"] = -999.;
165 result->tags_[
"n_min_50/N"] =
f;
166 result->tags_[
"n_min_50_ref/N_ref"] = f_r;
167 result->status_ = dqm_core::Result::Undefined;
169 };
170
171
172
173 sigma_hist= std::sqrt(f*(1-f)/N);
174 sigma_ref= std::sqrt(f_r*(1-f_r)/N_ref);
175
177
178 sigma =
F*std::sqrt((sigma_hist/f)*(sigma_hist/f)+(sigma_ref/f_r)*(sigma_ref/f_r));
179
180
181 };
182
183
184
185
186 dqm_core::Result*
result =
new dqm_core::Result();
187 result->tags_[
"00-Pedestal_fraction"] =
f;
188 result->tags_[
"1-Pedestal_over_Ped_ref"] = (1-
F);
190
191 if(f<= greenTh || (f>greenTh && f_r>greenTh)) {
192 result->status_ = dqm_core::Result::Green;
193 }
194 else if( f>redTh && f_r<greenTh ) {
195 result->tags_[
"Difference_against_Ref-Pedestal_fraction_Ref"] = f_r;
196 result->status_ = dqm_core::Result::Red;
197 }
198 else {
199 result->status_ = dqm_core::Result::Yellow;
200 }
201
202
204}
const boost::regex ref(r_ef)
#define IsA
Declare the TObject style functions.