44 const TObject &
object,
45 const dqm_core::AlgorithmConfig & config )
47 const TH2 * inputgraph;
49 if(
object.
IsA()->InheritsFrom(
"TH1" )) {
50 inputgraph =
static_cast<const TH2*
>( &object );
53 throw dqm_core::BadConfig( ERS_HERE, name,
"does not inherit from TH1" );
59 if (inputgraph->GetEntries() < minstat ) {
60 dqm_core::Result *result =
new dqm_core::Result(dqm_core::Result::Undefined);
61 result->tags_[
"InsufficientEntries"] = inputgraph->GetEntries();
73 std::string thresholdname=
"NBins";
79 catch ( dqm_core::Exception & ex ) {
80 throw dqm_core::BadConfig( ERS_HERE, name, ex.what(), ex );
86 refhist =
static_cast<TH2 *
>( config.getReference() );
88 catch ( dqm_core::Exception & ex ) {
89 throw dqm_core::BadRefHist(ERS_HERE,name,
" Could not retreive reference");
92 if (inputgraph->GetDimension() != refhist->GetDimension() ) {
93 throw dqm_core::BadRefHist( ERS_HERE,
"Dimension", name );
96 if ((inputgraph->GetNbinsX() != refhist->GetNbinsX()) || (inputgraph->GetNbinsY() != refhist->GetNbinsY())) {
97 throw dqm_core::BadRefHist( ERS_HERE,
"number of bins", name );
112{
double ref_entries=refhist->GetEntries();
113 double input_entries=inputgraph->GetEntries();
115 const_cast<TH2*
>(inputgraph)->Sumw2();
118 refhist->Scale(input_entries/ref_entries);
128std::vector<int> range;
132catch( dqm_core::Exception & ex ) {
133 throw dqm_core::BadConfig( ERS_HERE, name, ex.what(), ex );
151 std::vector<double> ChisqValues;
152 std::map<double,int> mymap;
154 for(i=range[0];i<(range[1]+1);i++)
156 for(j=range[2];j<(range[3]+1);j++)
158 val=inputgraph->GetBinContent(i,j);
159 refval=refhist->GetBinContent(i,j);
160 inputerr=inputgraph->GetBinError(i,j);
161 referr=refhist->GetBinError(i,j);
162 errsquared=referr*referr+inputerr*inputerr;
163 if(errsquared > 0.000001)
165 partsum=((val-refval)*(val-refval))/errsquared;
172 { chisq=chisq+partsum;
175 if(partsum>=NSigma*NSigma)
176 { ChisqValues.push_back(std::sqrt(partsum));
177 mymap.insert(std::pair<double,int>(std::sqrt(partsum),inputgraph->GetBin(i,j)));
187 double ndf=count_ndf-1;
189 throw dqm_core::BadConfig( ERS_HERE, name,
"ndf is zero!" );
191 double value=chisq/ndf;
192 dqm_core::Result* result =
new dqm_core::Result();
194 result->tags_[
"Chisq_per_NDF"]=value;
199 std::sort(ChisqValues.begin(),ChisqValues.end());
203 std::vector<double>::iterator p;
210 std::map<double,int>::iterator p2;
219int& xBin = xbinnumber;
220int& yBin = ybinnumber;
221int& zBin = zbinnumber;
232{result->tags_[
"No flagged bins were found"]=1.0;
244 { global_bin=p2->second;
245 globalbinint= (int) global_bin;
246 inputgraph->GetBinXYZ(globalbinint,xBin,yBin,zBin);
247 eta=inputgraph->GetXaxis()->GetBinCenter(xBin);
248 phi=inputgraph->GetYaxis()->GetBinCenter(yBin);
251 sprintf(ctag,
" (eta,phi)=(%f,%f) ",
eta,
phi);
252 result->tags_[ctag] = *p;
261 sprintf(ctag,
"eta_%i_error",k);
262 result->tags_[ctag]=0.0;
263 sprintf(ctag,
"phi_%i_error",k);
264 result->tags_[ctag]=0.0;
268 if(p==ChisqValues.begin()||k>Num_to_print)
277result->tags_[
"MaxSigma"]=MaxSigma;
278result->tags_[
"NSigma"]=NSigma;
279result->tags_[
"Max Bins to Publish"]=Num_to_print;
283 int BinsOver=ChisqValues.size();
284 result->tags_[
"NBinsOver"]=BinsOver;
288 if ( (BinsOver <= gthresho) &&
veto==0 ) {
289 result->status_ = dqm_core::Result::Green;
290 }
else if ( (BinsOver < rthresho) &&
veto==0 ) {
291 result->status_ = dqm_core::Result::Yellow;
293 result->status_ = dqm_core::Result::Red;
296 ERS_DEBUG(2,
"Result: "<<*result);
static dqm_algorithms::BinContentComp myInstance