コード例 #1
0
ファイル: makePlot.cpp プロジェクト: Andrej-CMS/cmssw
bool PlotManager::saveResolution(const string& histName, const string& histTitle, 
                                   const string& srcHistName, const char sliceDirection)
{
  if ( ! isSetup_ ) return false;
  
  TH2F* srcHist = dynamic_cast<TH2F*>(theSrcFile_->Get(srcHistName.c_str()));

  // Check validity of objects
  if ( srcHist == NULL ) {
    cerr << "Cannot get object : " << histName << endl;
    return false;
  }
  
  if ( srcHist->IsA()->InheritsFrom("TH2") ) return false;

  // Push to base directory
  string pwd(gDirectory->GetPath());

  string newHistPath = dirname(histName);
  string newHistName = basename(histName);

  if ( newHistPath.empty() ) {
    theOutFile_->cd();
  }
  else if ( theOutFile_->cd(newHistPath.c_str()) == kFALSE ) {
    cout << "Cannot find directory, do mkdirs" << endl;
    mkdirs(theOutFile_, newHistPath)->cd();
  }

  // Create a function for resolution model
  TF1 gaus("gaus", "gaus");
  gaus.SetParameters(1.0, 0.0, 0.1);
  //gaus.SetRange(yMin, yMax);

  // Do FitSlices.
  if ( sliceDirection == 'X' ) srcHist->FitSlicesX(&gaus);
  else srcHist->FitSlicesY(&gaus);

  TH1F* meanHist  = dynamic_cast<TH1F*>(theOutFile_->Get((srcHistName+"_1").c_str()));
  TH1F* widthHist = dynamic_cast<TH1F*>(theOutFile_->Get((srcHistName+"_2").c_str()));
  TH1F* chi2Hist  = dynamic_cast<TH1F*>(theOutFile_->Get((srcHistName+"_chi2").c_str()));

  // Cosmetics
  meanHist ->SetName((newHistName+"_Mean" ).c_str());
  widthHist->SetName((newHistName+"_Width").c_str());
  chi2Hist ->SetName((newHistName+"_Chi2" ).c_str());

  meanHist ->SetTitle((histTitle+" Mean" ).c_str());
  widthHist->SetTitle((histTitle+" Width").c_str());
  chi2Hist ->SetTitle((histTitle+" Chi2" ).c_str());

  meanHist ->GetYaxis()->SetTitle("Gaussian mean"        );
  widthHist->GetYaxis()->SetTitle("Gaussian width"       );
  chi2Hist ->GetYaxis()->SetTitle("Gaussian fit #Chi^{2}");

  // Save histograms
  meanHist ->Write();
  widthHist->Write();
  chi2Hist ->Write();

  // Pop directory
  gDirectory->cd(pwd.c_str());

  return true;
}