CMS 3D CMS Logo

Public Member Functions | Protected Member Functions | Protected Attributes

ManipHist Class Reference

#include <ManipHist.h>

Inheritance diagram for ManipHist:
FitHist CompHist CalibClosureTest TopInspectRatio TopInspectSum

List of all members.

Public Member Functions

void divideAndDrawEps ()
void divideAndDrawPs ()
 ManipHist ()
void sumHistograms ()
virtual ~ManipHist ()

Protected Member Functions

void configBlockDivide (ConfigFile &)
void configBlockSum (ConfigFile &)
TH1F & divideHistograms (TH1F &, TH1F &, int)
double ratioCorrelatedError (double &, double &, double &, double &)
double ratioUncorrelatedError (double &, double &, double &, double &)

Protected Attributes

int errorType_
std::vector< double > weights_

Detailed Description

Definition at line 6 of file ManipHist.h.


Constructor & Destructor Documentation

ManipHist::ManipHist ( ) [inline]

Definition at line 10 of file ManipHist.h.

{};
virtual ManipHist::~ManipHist ( ) [inline, virtual]

Definition at line 12 of file ManipHist.h.

{};

Member Function Documentation

void ManipHist::configBlockDivide ( ConfigFile cfg) [protected]

Definition at line 25 of file ManipHist.cc.

References dtNoiseDBValidation_cfg::cerr, cmsRelvalreport::exit, and ConfigFile::read().

{
  try{
    //-----------------------------------------------
    // histogram manipulations
    //-----------------------------------------------
    errorType_ = cfg.read<int>( "errorType" );
  }
  catch(...){
    std::cerr << "ERROR during reading of config file"   << std::endl;
    std::cerr << "      misspelled variables in cfg ?"   << std::endl;
    std::cerr << "      [--called in configBlockDivide]" << std::endl;
    std::exit(1);
  }
}
void ManipHist::configBlockSum ( ConfigFile cfg) [protected]

Definition at line 8 of file ManipHist.cc.

References dtNoiseDBValidation_cfg::cerr, cmsRelvalreport::exit, ConfigFile::read(), and readVector().

{
  try{
    //-----------------------------------------------
    // histogram manipulations
    //-----------------------------------------------  
    readVector( cfg.read<std::string>( "histWeights" ), weights_);
  }
  catch(...){
    std::cerr << "ERROR during reading of config file" << std::endl;
    std::cerr << "      misspelled variables in cfg ?" << std::endl;
    std::cerr << "      [--called in configBlockSum]"  << std::endl;
    std::exit(1);
  }
}
void ManipHist::divideAndDrawEps ( )

Definition at line 141 of file ManipHist.cc.

References dtNoiseDBValidation_cfg::cerr, cmsDownloadME::href, UserOptions_cff::idx, and convertSQLitetoXML_cfg::output.

Referenced by main().

{
  //-----------------------------------------------
  // define canvas
  //-----------------------------------------------
  TCanvas *canv = new TCanvas("canv", "histograms", 600, 600);
  setCanvasStyle( *canv  );

  //-----------------------------------------------
  // number of files/directories in root file must 
  // be >1 otherwise return with error message
  //-----------------------------------------------
  if((sampleList_.size()!=2) && (dirNameList_.size()+fileList_.size()!=3)){
    std::cerr << "ERROR number of indicated root files/directories " << std::endl;
    std::cerr << "      is insonsistent. Need sample & reference"    << std::endl;
    std::cerr << "      file/directory being specified solitarily"   << std::endl;
    return;
  }
  //-----------------------------------------------
  // loop histograms via the list of histogram
  // names stored in histList_, open a new page 
  // for each histogram & plot each sample in 
  // the same canvas
  //-----------------------------------------------  
  for(int idx=0; idx<(int)histList_.size(); ++idx){
    //-----------------------------------------------
    // open output files
    //-----------------------------------------------
    TString output( writeTo_.c_str() );
    output += "/";
    output += histList_[ idx ];
    output += ".";
    output += writeAs_;
    TPostScript psFile( output, 113);
    psFile.NewPage();
    TH1F& hsam = *((TH1F*)(sampleList_[0])[idx] ); //recieve sample
    TH1F& href = *((TH1F*)(sampleList_[1])[idx] ); //recieve reference
    divideHistograms(hsam, href, errorType_);
    
    setCanvLog( *canv, idx );
    setCanvGrid( *canv, idx );
    setHistStyles( hsam, idx, 0 ); //there is only one sample
    
    hsam.Draw();
    canv->RedrawAxis( );
    canv->Update( );
    psFile.Close();
  }
  canv->Close();
  delete canv;
}
void ManipHist::divideAndDrawPs ( )

Definition at line 86 of file ManipHist.cc.

References dtNoiseDBValidation_cfg::cerr, cmsDownloadME::href, UserOptions_cff::idx, and convertSQLitetoXML_cfg::output.

Referenced by main().

{
  //-----------------------------------------------
  // define canvas
  //-----------------------------------------------
  TCanvas *canv = new TCanvas("canv", "histograms", 600, 600);
  setCanvasStyle( *canv  );

  //-----------------------------------------------
  // number of files/directories in root file must 
  // be >1 otherwise return with error message
  //-----------------------------------------------
  if((sampleList_.size()!=2) && (dirNameList_.size()+fileList_.size()!=3)){
    std::cerr << "ERROR number of indicated root files/directories " << std::endl;
    std::cerr << "      is insonsistent. Need sample & reference"    << std::endl;
    std::cerr << "      file/directory being specified solitarily"   << std::endl;
    return;
  }
  //-----------------------------------------------
  // open output file
  //-----------------------------------------------
  TString output( writeTo_.c_str() );
  output += "/";
  output += "inspectRatio";
  output += ".";
  output += writeAs_;
  TPostScript psFile( output, 111); //112 for portrait
  //-----------------------------------------------
  // loop histograms via the list of histogram
  // names stored in histList_, open a new page 
  // for each histogram & plot each sample in 
  // the same canvas, divide 
  //-----------------------------------------------
  for(int idx=0; idx<(int)histList_.size(); ++idx){
    psFile.NewPage();
    TH1F& hsam = *((TH1F*)(sampleList_[0])[idx] ); //recieve sample
    TH1F& href = *((TH1F*)(sampleList_[1])[idx] ); //recieve reference
    divideHistograms(hsam, href, errorType_);
    
    setCanvLog( *canv, idx );
    setCanvGrid( *canv, idx );
    setHistStyles( hsam, idx, 0 ); //there is only one sample
    
    hsam.Draw();
    canv->RedrawAxis( );
    canv->Update( );
    if(idx == (int)histList_.size()-1){
      psFile.Close();
    }
  }
  canv->Close();
  delete canv;
}
TH1F & ManipHist::divideHistograms ( TH1F &  nom,
TH1F &  denom,
int  err 
) [protected]

Definition at line 194 of file ManipHist.cc.

References UserOptions_cff::idx, n, and x.

{
  //------------------------------------------------
  // divide histograms bin by bin & add appropriate 
  // error according to specification in errorType_
  //------------------------------------------------
  for(int idx=0; idx<denom.GetNbinsX(); ++idx){
    double dx=nom.GetBinError(idx+1), x=nom.GetBinContent(idx+1);
    double dn=denom.GetBinError(idx+1), n=denom.GetBinContent(idx+1);

    if(n==0){
      nom.SetBinContent( idx+1, 0. );
      nom.SetBinError  ( idx+1, 0. );      
    }
    else{
      nom.SetBinContent( idx+1, x/n );
      if(err==1){
        nom.SetBinError( idx+1, ratioCorrelatedError  (x, dx, n, dn) );
      }
      else{
        nom.SetBinError( idx+1, ratioUncorrelatedError(x, dx, n, dn) );
      }
    }
  }
  return nom;
}
double ManipHist::ratioCorrelatedError ( double &  x,
double &  dx,
double &  n,
double &  dn 
) [protected]

Definition at line 222 of file ManipHist.cc.

References n, and mathSSE::sqrt().

{
  //------------------------------------------------
  // Get error deps of correlated ratio eps=x/n:
  //
  // For gaussian distributed quantities the formular: 
  // * deps=eps*Sqrt((dx/x)^2+(1-2*eps)*(dn/n)^2))
  // automatically turns into 
  // * deps=Sqrt(eps*(1-eps)/n)
  //------------------------------------------------
  if(x<=0) return  0;
  if(n==0) return -1;
  return (x/n<1) ? (x/n)*sqrt(std::fabs((dx*dx)/(n*n)+(1.-2.*(x/n))*(dn*dn)/(n*n))): 
                   (n/x)*sqrt(std::fabs((dn*dn)/(x*x)+(1.-2.*(n/x))*(dx*dx)/(x*x)));
}
double ManipHist::ratioUncorrelatedError ( double &  x,
double &  dx,
double &  n,
double &  dn 
) [protected]

Definition at line 239 of file ManipHist.cc.

References mathSSE::sqrt().

{
  //------------------------------------------------
  // Get error deps of uncorrelated ratio eps=x/n:
  //------------------------------------------------
  if(x==0) return 0;
  if(n==0) return 0;
  return (x/n)*sqrt((dx*dx)/(x*x)+(dn*dn)/(n*n));
}
void ManipHist::sumHistograms ( )

Definition at line 42 of file ManipHist.cc.

References hadd(), estimatePileup::hist, and UserOptions_cff::idx.

Referenced by main().

{
  //-----------------------------------------------
  // loop histograms via the list of histogram
  // names stored in histList_, open a new page 
  // for each histogram & plot each sample in 
  // the same canvas
  //-----------------------------------------------
  for(int idx=0; idx<(int)histList_.size(); ++idx){
    //-----------------------------------------------
    // loop all samples via the list sampleList_, which 
    // containas the histograms of each sample as 
    // TObjects in TObjectArrays
    //-----------------------------------------------
    TH1F buffer;
    std::vector<TObjArray>::const_iterator hist = sampleList_.begin();
    for(int jdx=0; hist!=sampleList_.end(); ++hist, ++jdx){
      TH1F& hadd = *((TH1F*)(*hist)[idx]);
      //apply weights if required
      if( jdx<((int)weights_.size()) ){
        if( weights_[jdx]>0 ){
          hadd.Scale(weights_[jdx]);
        }
      }
      //buffer first histogram unchanged
      if(jdx==0){
        buffer = hadd;
      }
      //add histograms buffer last one
      else{
        hadd.Add(&buffer);
        buffer = hadd;
      }
    }
    //reset maximum for all histograms
    hist = sampleList_.begin();
    for(; hist!=sampleList_.end(); ++hist){
      TH1F& hadd = *((TH1F*)(*hist)[idx]);
      hadd.SetMaximum(buffer.GetMaximum());
    }
  }
}

Member Data Documentation

int ManipHist::errorType_ [protected]

Definition at line 37 of file ManipHist.h.

std::vector<double> ManipHist::weights_ [protected]

Definition at line 38 of file ManipHist.h.