63{
66
67 if(
object.
IsA()->InheritsFrom(
"TH1" ) ) {
69 if (
hist->GetDimension() >= 2 ){
70 throw dqm_core::BadConfig( ERS_HERE, name, "dimension >= 2 " );
71 }
72 } else {
73 throw dqm_core::BadConfig( ERS_HERE, name, "does not inherit from TH1" );
74 }
75
76
77 bool ref_y_n=0;
79 double minstat;
80 double greenTh;
81 double redTh;
82 try {
88 }
89 catch ( dqm_core::Exception & ex ) {
90 throw dqm_core::BadConfig( ERS_HERE, name, ex.what(), ex );
91 }
92
93
94
95 try {
96 ref =
static_cast<const TH1*
>(
config.getReference() );
97 }
98 catch ( dqm_core::Exception & ex ) {
99 throw dqm_core::BadRefHist(ERS_HERE,name," Could not retrieve reference");
100 }
101
102 if (
hist->GetDimension() !=
ref->GetDimension() ) {
103 throw dqm_core::BadRefHist( ERS_HERE, name, "Reference VS histo: Different dimension!" );
104 }
105 if (
hist->GetNbinsX() !=
ref->GetNbinsX() ) {
106 throw dqm_core::BadRefHist( ERS_HERE, name, "Reference VS histo: Different bin number in X axis!" );
107 }
108
109
110 if (
hist->GetEntries() < minstat ) {
111 ERS_INFO(
"Histogram does not satisfy MinStat requirement " <<
hist->GetName());
112 dqm_core::Result *
result =
new dqm_core::Result(dqm_core::Result::Undefined);
113 result->tags_[
"InsufficientEntries"] =
hist->GetEntries();
115 }
116 ERS_DEBUG(1,
"Statistics: "<<
hist->GetEntries()<<
" entries ");
117
118
119
120
122
123
124 std::vector<int> hist_buffer;
125 std::vector<int> ref_buffer;
126
127 std::vector< double > new_empty_bins;
129
130 for(
int x_index=1; x_index<=
binX; x_index++){
131 if(
hist->GetBinContent(x_index) != 0 ) hist_buffer.push_back((
int)
hist->GetBinContent(x_index));
132 if(ref_y_n==1) {
133 if(
ref->GetBinContent(x_index) != 0 ) ref_buffer.push_back((
int)
ref->GetBinContent(x_index));
134 }
135 };
136
137
138
139 auto median=[](std::vector<int> &
v)->
int {
140 const auto midPoint =
v.begin()+
v.size()/2;
141 std::nth_element(
v.begin(), midPoint,
v.end());
142 return v[
v.size()/2];
143 };
144
145
146 double percentThreshold =
thresh*0.01;
147 const int mediana_hist =
median(hist_buffer);
148
149 if(ref_y_n==1) {
150 const int mediana_ref =
median(ref_buffer);
151 for(
int xi=1; xi<=
binX; xi++){
152 if(
hist->GetBinContent(xi) < mediana_hist*percentThreshold &&
ref->GetBinContent(xi) >= mediana_ref*percentThreshold){
154 new_empty_bins.push_back(
hist->GetBinCenter(xi));
155 };
156 };
157 } else if(ref_y_n==0){
158 for(
int xi=1; xi<=
binX; xi++){
159 if(
hist->GetBinContent(xi) < mediana_hist*percentThreshold){
161 new_empty_bins.push_back(
hist->GetBinCenter(xi));
162 };
163 };
164 };
165
166
167
168
169
170
171
172 dqm_core::Result*
result =
new dqm_core::Result();
173
175 std::string
eta=
"ETA_";
176 std::string ml="__ML";
177 char eta_num[3];
178 std::string ml_num;
179 double num_ml_off=1;
181
182 int empty_bin_number=new_empty_bins.size();
183
184 for(
int i=0;
i<empty_bin_number;
i++){
186 do{
188 if(counter>=20) break;
189 }while(std::abs(counter-new_empty_bins[i])>0.3);
190
191 snprintf(eta_num,sizeof(eta_num),"%d",counter);
192 if( (counter-new_empty_bins[i])>=0)ml_num="1";
193 if( (counter-new_empty_bins[i])<0) ml_num="2";
196 };
197
198
199
201
203 result->status_ = dqm_core::Result::Green;
204 ERS_DEBUG(1,"Green");
206 result->status_ = dqm_core::Result::Yellow;
207 ERS_DEBUG(1,"Yellow");
208 }
else if (
count>=redTh) {
209 result->status_ = dqm_core::Result::Red;
210 ERS_DEBUG(1,"Red");
211 }
213}
const boost::regex ref(r_ef)
Scalar eta() const
pseudorapidity method
int count(std::string s, const std::string ®x)
count how many occurances of a regx are in a string
float median(std::vector< float > &Vec)
#define IsA
Declare the TObject style functions.