Go to the documentation of this file.00001 #include "Validation/RecoJets/interface/ManipHist.h"
00002 #include "Validation/RecoJets/interface/RootPostScript.h"
00003 #include <cmath>
00004
00005 using namespace std;
00006
00007 void
00008 ManipHist::configBlockSum(ConfigFile& cfg)
00009 {
00010 try{
00011
00012
00013
00014 readVector( cfg.read<std::string>( "histWeights" ), weights_);
00015 }
00016 catch(...){
00017 std::cerr << "ERROR during reading of config file" << std::endl;
00018 std::cerr << " misspelled variables in cfg ?" << std::endl;
00019 std::cerr << " [--called in configBlockSum]" << std::endl;
00020 std::exit(1);
00021 }
00022 }
00023
00024 void
00025 ManipHist::configBlockDivide(ConfigFile& cfg)
00026 {
00027 try{
00028
00029
00030
00031 errorType_ = cfg.read<int>( "errorType" );
00032 }
00033 catch(...){
00034 std::cerr << "ERROR during reading of config file" << std::endl;
00035 std::cerr << " misspelled variables in cfg ?" << std::endl;
00036 std::cerr << " [--called in configBlockDivide]" << std::endl;
00037 std::exit(1);
00038 }
00039 }
00040
00041 void
00042 ManipHist::sumHistograms()
00043 {
00044
00045
00046
00047
00048
00049
00050 for(int idx=0; idx<(int)histList_.size(); ++idx){
00051
00052
00053
00054
00055
00056 TH1F buffer;
00057 std::vector<TObjArray>::const_iterator hist = sampleList_.begin();
00058 for(int jdx=0; hist!=sampleList_.end(); ++hist, ++jdx){
00059 TH1F& hadd = *((TH1F*)(*hist)[idx]);
00060
00061 if( jdx<((int)weights_.size()) ){
00062 if( weights_[jdx]>0 ){
00063 hadd.Scale(weights_[jdx]);
00064 }
00065 }
00066
00067 if(jdx==0){
00068 buffer = hadd;
00069 }
00070
00071 else{
00072 hadd.Add(&buffer);
00073 buffer = hadd;
00074 }
00075 }
00076
00077 hist = sampleList_.begin();
00078 for(; hist!=sampleList_.end(); ++hist){
00079 TH1F& hadd = *((TH1F*)(*hist)[idx]);
00080 hadd.SetMaximum(buffer.GetMaximum());
00081 }
00082 }
00083 }
00084
00085 void
00086 ManipHist::divideAndDrawPs()
00087 {
00088
00089
00090
00091 TCanvas *canv = new TCanvas("canv", "histograms", 600, 600);
00092 setCanvasStyle( *canv );
00093
00094
00095
00096
00097
00098 if((sampleList_.size()!=2) && (dirNameList_.size()+fileList_.size()!=3)){
00099 std::cerr << "ERROR number of indicated root files/directories " << std::endl;
00100 std::cerr << " is insonsistent. Need sample & reference" << std::endl;
00101 std::cerr << " file/directory being specified solitarily" << std::endl;
00102 return;
00103 }
00104
00105
00106
00107 TString output( writeTo_.c_str() );
00108 output += "/";
00109 output += "inspectRatio";
00110 output += ".";
00111 output += writeAs_;
00112 TPostScript psFile( output, 111);
00113
00114
00115
00116
00117
00118
00119 for(int idx=0; idx<(int)histList_.size(); ++idx){
00120 psFile.NewPage();
00121 TH1F& hsam = *((TH1F*)(sampleList_[0])[idx] );
00122 TH1F& href = *((TH1F*)(sampleList_[1])[idx] );
00123 divideHistograms(hsam, href, errorType_);
00124
00125 setCanvLog( *canv, idx );
00126 setCanvGrid( *canv, idx );
00127 setHistStyles( hsam, idx, 0 );
00128
00129 hsam.Draw();
00130 canv->RedrawAxis( );
00131 canv->Update( );
00132 if(idx == (int)histList_.size()-1){
00133 psFile.Close();
00134 }
00135 }
00136 canv->Close();
00137 delete canv;
00138 }
00139
00140 void
00141 ManipHist::divideAndDrawEps()
00142 {
00143
00144
00145
00146 TCanvas *canv = new TCanvas("canv", "histograms", 600, 600);
00147 setCanvasStyle( *canv );
00148
00149
00150
00151
00152
00153 if((sampleList_.size()!=2) && (dirNameList_.size()+fileList_.size()!=3)){
00154 std::cerr << "ERROR number of indicated root files/directories " << std::endl;
00155 std::cerr << " is insonsistent. Need sample & reference" << std::endl;
00156 std::cerr << " file/directory being specified solitarily" << std::endl;
00157 return;
00158 }
00159
00160
00161
00162
00163
00164
00165 for(int idx=0; idx<(int)histList_.size(); ++idx){
00166
00167
00168
00169 TString output( writeTo_.c_str() );
00170 output += "/";
00171 output += histList_[ idx ];
00172 output += ".";
00173 output += writeAs_;
00174 TPostScript psFile( output, 113);
00175 psFile.NewPage();
00176 TH1F& hsam = *((TH1F*)(sampleList_[0])[idx] );
00177 TH1F& href = *((TH1F*)(sampleList_[1])[idx] );
00178 divideHistograms(hsam, href, errorType_);
00179
00180 setCanvLog( *canv, idx );
00181 setCanvGrid( *canv, idx );
00182 setHistStyles( hsam, idx, 0 );
00183
00184 hsam.Draw();
00185 canv->RedrawAxis( );
00186 canv->Update( );
00187 psFile.Close();
00188 }
00189 canv->Close();
00190 delete canv;
00191 }
00192
00193 TH1F&
00194 ManipHist::divideHistograms(TH1F& nom, TH1F& denom, int err)
00195 {
00196
00197
00198
00199
00200 for(int idx=0; idx<denom.GetNbinsX(); ++idx){
00201 double dx=nom.GetBinError(idx+1), x=nom.GetBinContent(idx+1);
00202 double dn=denom.GetBinError(idx+1), n=denom.GetBinContent(idx+1);
00203
00204 if(n==0){
00205 nom.SetBinContent( idx+1, 0. );
00206 nom.SetBinError ( idx+1, 0. );
00207 }
00208 else{
00209 nom.SetBinContent( idx+1, x/n );
00210 if(err==1){
00211 nom.SetBinError( idx+1, ratioCorrelatedError (x, dx, n, dn) );
00212 }
00213 else{
00214 nom.SetBinError( idx+1, ratioUncorrelatedError(x, dx, n, dn) );
00215 }
00216 }
00217 }
00218 return nom;
00219 }
00220
00221 double
00222 ManipHist::ratioCorrelatedError(double& x, double& dx, double& n, double& dn)
00223 {
00224
00225
00226
00227
00228
00229
00230
00231
00232 if(x<=0) return 0;
00233 if(n==0) return -1;
00234 return (x/n<1) ? (x/n)*sqrt(std::fabs((dx*dx)/(n*n)+(1.-2.*(x/n))*(dn*dn)/(n*n))):
00235 (n/x)*sqrt(std::fabs((dn*dn)/(x*x)+(1.-2.*(n/x))*(dx*dx)/(x*x)));
00236 }
00237
00238 double
00239 ManipHist::ratioUncorrelatedError(double& x, double& dx, double& n, double& dn)
00240 {
00241
00242
00243
00244 if(x==0) return 0;
00245 if(n==0) return 0;
00246 return (x/n)*sqrt((dx*dx)/(x*x)+(dn*dn)/(n*n));
00247 }