// @(#)root/roostats:$Id: cranmer $
// Author: Kyle Cranmer, Akira Shibata
/*************************************************************************
* Copyright (C) 1995-2008, Rene Brun and Fons Rademakers. *
* All rights reserved. *
* *
* For the licensing terms see $ROOTSYS/LICENSE. *
* For the list of contributors see $ROOTSYS/README/CREDITS. *
*************************************************************************/
//_________________________________________________
/*
BEGIN_HTML
END_HTML
*/
//
#include
#include "RooStats/HistFactory/EstimateSummary.h"
ClassImp(RooStats::HistFactory::EstimateSummary)
using namespace std;
namespace RooStats {
namespace HistFactory {
EstimateSummary::EstimateSummary(){
nominal=0;
normName="Lumi";
IncludeStatError = false;
StatConstraintType=Gaussian;
RelErrorThreshold=0.0;
relStatError=NULL;
shapeFactorName="";
}
EstimateSummary::~EstimateSummary(){}
void EstimateSummary::Print(const char * /*opt*/) const {
cout << "EstimateSummary (name = " << name << " empty = " << name.empty() << ")"<< endl;
cout << " TObj name = " << this->GetName() << endl;
cout << " Channel = " << channel << endl;
cout << " NormName = " << normName << endl;
cout << " Nominal ptr = " << nominal << endl;
if (nominal) cout << " Nominal hist name = " << nominal->GetName() << endl;
cout << " Number of hist variations = " << systSourceForHist.size()
<< " " << lowHists.size() << " "
<< " " << highHists.size() << endl;
cout << " Number of overall systematics = " << overallSyst.size() << endl;
}
void EstimateSummary::AddSyst(const string &sname, TH1* low, TH1* high){
systSourceForHist.push_back(sname);
lowHists.push_back(low);
highHists.push_back(high);
}
bool EstimateSummary::operator==(const EstimateSummary &other) const {
// Comparator for two Estimate summary objects. Useful to make sure two analyses are the same
//this->print();
//other.print();
if(! (name==other.name)){
cout << "names don't match : " << name << " vs " << other.name << endl;
return false;
}
if(! (channel==other.channel)){
cout << "channel names don't match : " << channel << " vs " << other.channel << endl;
return false;
}
if(! (normName==other.normName)){
cout << "norm names don't match : " << normName << " vs " << other.normName << endl;
return false;
}
if(! (shapeFactorName==other.shapeFactorName)){
cout << "norm names don't match : " << shapeFactorName << " vs " << other.shapeFactorName << endl;
return false;
}
if (nominal && other.nominal)
if(! CompareHisto( this->nominal, other.nominal ) ) {
cout << "nominal histo don't match" << endl;
return false;
}
if(! (IncludeStatError==other.IncludeStatError)){
cout << "Include Stat Error bools don't match : " << IncludeStatError << " vs " << other.IncludeStatError << endl;
return false;
}
if(! (StatConstraintType==other.StatConstraintType)){
cout << "Stat Constraint Types don't match : " << StatConstraintType << " vs " << other.StatConstraintType << endl;
return false;
}
if(! (RelErrorThreshold==other.RelErrorThreshold)){
cout << "Relative Stat Error Thresholds don't match : " << RelErrorThreshold << " vs " << other.RelErrorThreshold << endl;
return false;
}
if (relStatError && other.relStatError)
if(! CompareHisto( this->relStatError, other.relStatError ) ) {
cout << "relStatError histo don't match" << endl;
return false;
}
if(! (shapeFactorName==other.shapeFactorName)){
cout << "Shape Factor Names don't match : " << shapeFactorName << " vs " << other.shapeFactorName << endl;
return false;
}
/// compare histo sys
int counter=0;
for( vector::const_iterator itr=systSourceForHist.begin(); itr!=systSourceForHist.end(); ++itr){
unsigned int ind = find(other.systSourceForHist.begin(), other.systSourceForHist.end(), *itr) - other.systSourceForHist.begin();
if(ind::const_iterator itr_this=systSourceForHist.begin(); itr_this!=systSourceForHist.end(); ++itr_this){
cout << " this contains: " << *itr_this << endl;
}
for( vector::const_iterator itr_other=other.systSourceForHist.begin(); itr_other!=other.systSourceForHist.end(); ++itr_other){
cout << " other contains: " << *itr_other << endl;
}
return false;
}
counter++;
}
/// compare overall sys
if( overallSyst.size() != other.overallSyst.size()){
cout << "mismatch in overallSyst : " << overallSyst.size() << " vs " << other.overallSyst.size() << endl;
return false;
}
for( map >::const_iterator itr=overallSyst.begin(); itr!=overallSyst.end(); ++itr){
map >::const_iterator found=other.overallSyst.find(itr->first);
if(found==other.overallSyst.end()){
cout << "mismatch in overallSyst, didn't find " << itr->first << endl;
return false;
}
if(! (itr->second.first==found->second.first && itr->second.second==found->second.second)){
cout << "mismatch in overall Syst value of " << itr->first << endl;
return false;
}
}
return true;
}
bool EstimateSummary::CompareHisto( const TH1 * one, const TH1 * two) const {
if (!one && !two) return true;
if (!one) return false;
if (!two) return false;
for(int i=1; i<=one->GetNbinsX(); ++i){
if(!(one->GetBinContent(i)-two->GetBinContent(i)==0)) return false;
}
return true;
//if(one->Integral()-two->Integral()==0) return true;
//cout << "Integral of " << one->GetName() << " : " << one->Integral() << " vs Integral ov " << two->GetName() << " : " << two->Integral() << endl;
}
}
}