44 const TObject &
object,
45 const dqm_core::AlgorithmConfig &
config )
50 if(
object.
IsA()->InheritsFrom(
"TH1" )) {
53 throw dqm_core::BadConfig( ERS_HERE, name,
"dimension > 2 " );
56 throw dqm_core::BadConfig( ERS_HERE, name,
"does not inherit from TH1");
61 refhist =
static_cast<TH1*
>(
config.getReference() );
63 catch (dqm_core::BadConfig &ex ) {
68 catch( dqm_core::Exception & ex ) {
69 throw dqm_core::BadConfig( ERS_HERE, name, ex.what(), ex );
76 catch( dqm_core::Exception & ex ) {
77 throw dqm_core::BadConfig( ERS_HERE, name, ex.what(), ex );
81 if (
histogram->GetDimension() != refhist->GetDimension() ) {
82 throw dqm_core::BadRefHist( ERS_HERE, name,
"Dimension" );
85 if ((
histogram->GetNbinsX() != refhist->GetNbinsX()) || (
histogram->GetNbinsY() != refhist->GetNbinsY())) {
86 throw dqm_core::BadRefHist( ERS_HERE,
"number of bins", name );
92 dqm_core::Result *
result =
new dqm_core::Result(dqm_core::Result::Undefined);
97 const TProfile* profile(
nullptr);
98 const TProfile2D* profile2D(
nullptr);
100 if(minBinEntries > 0) {
101 if (
object.InheritsFrom(
"TProfile")) profile =
dynamic_cast<const TProfile*
>(&
object);
102 else if (
object.InheritsFrom(
"TProfile2D")) profile2D =
dynamic_cast<const TProfile2D*
>(&
object);
118 if (greaterthan && lessthan) {
119 ERS_INFO(
"Both GreaterThan and LessThan parameters set: Will check for for both");
124 double bin_threshold;
132 catch( dqm_core::Exception & ex ) {
133 throw dqm_core::BadConfig( ERS_HERE, name, ex.what(), ex );
142 dqm_core::Result*
result =
new dqm_core::Result();
144 TH1* resulthisto =
nullptr;
145 if (publishHistogram) {
148 }
else if (
histogram->InheritsFrom(
"TH1")) {
151 throw dqm_core::BadConfig( ERS_HERE, name,
"does not inherit from TH1" );
154 resulthisto->Reset();
157 if (refhist && normref) {
158 double ratio=
histogram->GetEntries()/refhist->GetEntries();
159 refhist->Scale(ratio);
163 for (
int i = range[0]; i <= range[1]; ++i ) {
164 for (
int j = range[2]; j <= range[3]; ++j ) {
165 if (minBinEntries > 0) {
168 if (profile->GetBinEntries(
bin) < minBinEntries) {
172 }
else if (profile2D) {
173 if (profile2D->GetBinEntries(
bin) < minBinEntries) {
183 refcont = refhist->GetBinContent(i,j);
186 double histerr =
histogram->GetBinError(i,j);
190 if (increferr && refhist ) {
191 double referr = refhist->GetBinError(i,j);
192 inputerr = std::sqrt(std::pow(histerr,2)+std::pow(referr,2));
201 double inputcont =
histogram->GetBinContent(i,j);
202 double diff=inputcont - refcont;
204 if(refcont!=0) reldiff=
diff/refcont;
205 else if(
diff==0) reldiff=0;
207 if (ignorezero && refcont==0)
continue;
208 if (ignorezero && !refhist && inputcont==0)
continue;
209 if (ignoreInputZero && inputcont==0)
continue;
212 double sigma=
diff/inputerr;
213 if (greaterthan &&
diff < 0. )
continue;
214 if (lessthan &&
diff > 0. )
continue;
216 if ( (std::abs(sigma) > bin_threshold) && (std::abs(
diff) > maxdiffabs) && (std::abs(reldiff) > maxdiffrel) ){
217 if (resulthisto) resulthisto->SetBinContent(i,j,inputcont);
219 if (publish &&
count<maxpublish){
227 if (value == -99999) {
228 ERS_DEBUG(1,
"Number of bins " << bin_threshold <<
" Sigma away from reference is " <<
count);
230 ERS_DEBUG(1,
"Number of bins " << bin_threshold <<
" Sigma away from "<<value<<
" is " <<
count);
233 ERS_DEBUG(1,
"Green threshold: "<< gthreshold <<
" bin(s); Red threshold : " << rthreshold <<
" bin(s) ");
237 result->tags_[
"NSkippedBins"] = nSkippedBins;
238 if (resulthisto)
result->object_ = boost::shared_ptr<TObject>(resulthisto);
240 if (gthreshold > rthreshold) {
241 if (
count >= gthreshold ) {
242 result->status_ = dqm_core::Result::Green;
243 }
else if (
count > rthreshold ) {
244 result->status_ = dqm_core::Result::Yellow;
246 result->status_ = dqm_core::Result::Red;
249 if (
count <= gthreshold ) {
250 result->status_ = dqm_core::Result::Green;
251 }
else if (
count < rthreshold ) {
252 result->status_ = dqm_core::Result::Yellow;
254 result->status_ = dqm_core::Result::Red;
static dqm_algorithms::BinContentComp myInstance
file declares the dqm_algorithms::BinContentComp class.
void diff(const Jet &rJet1, const Jet &rJet2, std::map< std::string, double > varDiff)
Difference between jets - Non-Class function required by trigger.
void printDescription(std::ostream &out)
dqm_core::Result * execute(const std::string &, const TObject &, const dqm_core::AlgorithmConfig &)