64 if(
object.
IsA()->InheritsFrom(
"TH1" ) ) {
65 hist =
static_cast<const TH1*
>(&
object);
66 if (hist->GetDimension() >= 2 ){
67 throw dqm_core::BadConfig( ERS_HERE, name,
"dimension >= 2 " );
70 throw dqm_core::BadConfig( ERS_HERE, name,
"does not inherit from TH1" );
84 catch ( dqm_core::Exception & ex ) {
85 throw dqm_core::BadConfig( ERS_HERE, name, ex.what(), ex );
88 double cluster_size=greenTh;
93 ref =
static_cast<TH1*
>(
config.getReference() );
95 catch ( dqm_core::Exception & ex ) {
96 throw dqm_core::BadRefHist(ERS_HERE,name,
" Could not retrieve reference");
98 if (hist->GetDimension() !=
ref->GetDimension() ) {
99 throw dqm_core::BadRefHist( ERS_HERE, name,
"Reference VS histo: Different dimension!" );
101 if (hist->GetNbinsX() !=
ref->GetNbinsX() ) {
102 throw dqm_core::BadRefHist( ERS_HERE, name,
"Reference VS histo: Different bin number in X axis!" );
106 if (hist->GetEntries() < minstat ) {
107 ERS_INFO(
"Histogram does not satisfy MinStat requirement " <<hist->GetName());
108 dqm_core::Result *
result =
new dqm_core::Result(dqm_core::Result::Undefined);
109 result->tags_[
"InsufficientEntries"] = hist->GetEntries();
112 ERS_DEBUG(1,
"Statistics: "<< hist->GetEntries()<<
" entries ");
119 N= hist->GetEntries();
120 N_ref=
ref->GetEntries();
123 ERS_INFO(
"Histogram has no entries" <<hist->GetName());
124 dqm_core::Result *
result =
new dqm_core::Result(dqm_core::Result::Undefined);
125 result->tags_[
"InsufficientEntries"] = hist->GetEntries();
130 ERS_INFO(
"Reference histogram has no entries" <<hist->GetName());
131 dqm_core::Result *
result =
new dqm_core::Result(dqm_core::Result::Undefined);
132 result->tags_[
"InsufficientRefEntries"] =
ref->GetEntries();
138 double norm= (double) N/N_ref;
145 std::vector<double>
diff;
147 for(j=1;j<=hist->GetNbinsX();j++){
148 diff.push_back(hist->GetBinContent(j)-
ref->GetBinContent(j));
159 bool cluster_open=
false;
160 std::pair<int,int> bin_start_end;
161 std::pair<int , std::pair<int,int> > cluster_size_binStart_binEnd;
162 std::vector< std::pair< int , std::pair< int, int> > > clusters;
165 for(i=0;i<
diff.size();i++){
166 if(std::abs(
diff[i])>n_sigma*std::sqrt(hist->GetBinContent(i+1)+
ref->GetBinContent(i+1)*norm)){
172 if(size>=cluster_size){
173 bin_start_end.second=i;
174 cluster_size_binStart_binEnd.first=size;
175 cluster_size_binStart_binEnd.second=bin_start_end;
176 clusters.push_back(cluster_size_binStart_binEnd);
181 ERS_INFO(
"Cluster searching fail");
182 dqm_core::Result *
result =
new dqm_core::Result(dqm_core::Result::Undefined);
191 bin_start_end.first=i+1;
196 if(std::abs(
diff[i])<=n_sigma*std::sqrt(hist->GetBinContent(i+1)+
ref->GetBinContent(i+1)*norm)){
198 if(size>=cluster_size){
199 bin_start_end.second=i;
200 cluster_size_binStart_binEnd.first=size;
201 cluster_size_binStart_binEnd.second=bin_start_end;
202 clusters.push_back(cluster_size_binStart_binEnd);
207 if(i==
diff.size()-1){
209 if(size>=cluster_size){
210 bin_start_end.second=i+1;
211 cluster_size_binStart_binEnd.first=size;
212 cluster_size_binStart_binEnd.second=bin_start_end;
213 clusters.push_back(cluster_size_binStart_binEnd);
223 dqm_core::Result*
result =
new dqm_core::Result();
224 result->tags_[
"00-N_clusters"] = clusters.size();
226 std::string Cluster=
"Cluster_";
228 std::string Size=
"_info_1_size";
229 std::string start_at_bin=
"_info_2_start_at_bin";
230 std::string finish_at_bin=
"_info_3_finish_at_bin";
231 std::string message1;
232 std::string message2;
233 std::string message3;
235 for(i=0;i<clusters.size();i++){
237 sprintf(num,
"0%u",(i+1));
241 sprintf(num,
"%u",(i+1));
244 message1 = Cluster + (std::string) num + Size;
245 message2 = Cluster + (std::string) num + start_at_bin;
246 message3 = Cluster + (std::string) num + finish_at_bin;
248 result->tags_[message1] = clusters[i].first;
249 result->tags_[message2] = clusters[i].second.first;
250 result->tags_[message3] = clusters[i].second.second;
256 for(i=0;i<clusters.size();i++){
257 if(clusters[i].first<redTh) flag++;
258 if(clusters[i].first>=redTh) flag+=2;
263 result->status_ = dqm_core::Result::Green;
264 ERS_DEBUG(1,
"Green");
265 }
else if ( flag>=1 && flag<2 ) {
266 result->status_ = dqm_core::Result::Yellow;
267 ERS_DEBUG(1,
"Yellow");
268 }
else if (flag>=2) {
269 result->status_ = dqm_core::Result::Red;