//////////////////////////////////////////////////////////////////////////
//                                                                      //
// GFDstarZmvfns                                                   //
//
//   Author:      Gero Flucke
//   Date:        December 20th, 2004
//   last update: $Date: 2005/11/07 18:45:26 $ (UTC)
//   by:          $Author: flucke $
//                                                                      //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "GFDstarZmvfns.h"
#include "GFAnalysis/GFAxisVariables.h"
#include "GFUtils/GFHistArray.h"
#include "GFUtils/GFHistManip.h"
#include "GFUtils/GFHistManager.h"

#include <TH1.h>
#include <TObjString.h>
#include <TLegend.h>
#include <TObjArray.h>

#include <iostream>
using std::cout;
using std::endl;

ClassImp(GFDstarZmvfns)

//_________________________________________________________
 GFDstarZmvfns::GFDstarZmvfns(const char *fileAdd, const char *filePath, 
			     const char *fileStartDir, const char *fileStartRes) : 
  GFDstarVirtualTheory(filePath),fFileStartDirNlo(fileStartDir), fFileStartResNlo(fileStartRes),
  fFileAdd(fileAdd), fName("ZMVFNS"), fNbFactor(1./1000.)
{
  if(fileAdd && strlen(fileAdd)){
//     if(strcmp(fileAdd, "_cteq5_grv") != 0) fName += fileAdd;
    if(strcmp(fileAdd, "_mrst04_grv") != 0) fName += fileAdd;
  } else {
    fName += "mrst03_afg04";
  }
}

//_________________________________________________________
 GFDstarZmvfns::~GFDstarZmvfns()
{
}

//_________________________________________________________
 void GFDstarZmvfns::DrawHists(const char *var, Int_t flag, Bool_t rel)
{
  // flag 0: final
  //      1: scale variation only (i.e. final!)
  TObjArray *vars = this->CreateVarArray(var);

  const Bool_t isBatch = fHistManager->SetBatch();
  fHistManager->Delete();
  for(Int_t i = 0; i < vars->GetEntriesFast(); ++i){
    GFHistArray *hists1 = NULL, *hists2 = NULL;
    TString vari;
    switch(flag){
    case 0:
    case 1:
      hists1 = this->CreateHistsFinal(vars->At(i)->GetName(), 0);
      if(!rel) hists2 = this->CreateHistsFinal(vars->At(i)->GetName(), -1);
      vari = "final";
      break;
    }
    if(hists1){
      hists1->First()->SetTitle(Form("%s, %s variation",hists1->At(0)->GetTitle(),vari.Data()));
      const Bool_t log = !rel && this->IsLog(vars->At(i)->GetName());
      const Int_t nHist = this->DrawTheHists(hists1, hists2, log, kTRUE);
      const Int_t layer = fHistManager->GetNumLayers()-1;
      TLegend *leg = fHistManager->AddLegend(layer, nHist, this->GetName(), kFALSE);
      leg->SetTextAlign(22);
      leg->AddEntry(hists1->At(1), "dir. + res.", "l");
      leg->AddEntry(hists1->At(0), Form("%s up", vari.Data()), "l");
      leg->AddEntry(hists1->At(2), Form("%s down", vari.Data()), "l");
      if(rel){
	hists1->At(0)->Divide(hists1->At(1));
	hists1->At(2)->Divide(hists1->At(1));
	hists1->At(1)->Divide(hists1->At(1));
	hists1->At(0)->SetYTitle("#sigma/#sigma(dir. + res.)");
	hists1->At(0)->GetYaxis()->CenterTitle();
      } else if(hists2){
	leg->AddEntry(hists2->At(0), "res. only (up)", "l");
	leg->AddEntry(hists2->At(1), "res. only", "l");
	leg->AddEntry(hists2->At(2), "res. only (down)", "l");
	delete hists2;
      }
      delete hists1;
    }
  }
  fHistManager->SetBatch(isBatch);
  fHistManager->Draw();
//   fHistManager->Update();// for the TExec added for log scale
  delete vars;
}

//_________________________________________________________
 GFHistArray* GFDstarZmvfns::CreateHistsFinal(const char *var, Int_t dirResFl)
{
  // < 0 res, > 0 dir
  // take max deviation from variation of one of mass and mu
  GFHistArray *histsScale = this->CreateHistsScale(var, dirResFl);
  if(!histsScale) return NULL;

  GFHistArray histsAllVar;
  histsAllVar.AddAll(histsScale);
  TH1 *hUpper = GFHistManip::CreateHistMinMax(&histsAllVar,  1);
  TH1 *hLower = GFHistManip::CreateHistMinMax(&histsAllVar, -1);

  GFHistArray *result = NULL;
  if(hUpper && hLower){
    hUpper->SetDirectory(NULL);
    hLower->SetDirectory(NULL);
    hUpper->SetLineStyle(4);
    hLower->SetLineStyle(3);
    TH1 *hCenter = histsScale->At(1);
    histsScale->AddAt(NULL, 1); // otherwise hCenter will be deleted at clean up below!
    result = new GFHistArray(3);
    result->AddAt(hUpper, 0);
    result->AddAt(hCenter, 1);
    result->AddAt(hLower, 2);
  } else {
    delete hUpper;
    delete hLower;
  }

  histsScale->Delete();
  delete histsScale;

  return result;
}

//_________________________________________________________
 GFHistArray* GFDstarZmvfns::CreateHistsScale(const char *var,Int_t dirResFlag)
{
  if (fFileAdd.Length() == 0 || fFileAdd == "_cteq5_grv") {
    return this->CreateHistsUpDown(var, "_mu2m125", "_mu1m4", dirResFlag);
  } else if  (fFileAdd == "_mrst04_grv") {
//     return this->CreateHistsUpDown(var, "_mu2m125", "_mu1m4", dirResFlag);
    return this->CreateHistsUpDown(var, "_mu2m1mf15", "_mu1m4", dirResFlag);
  } else {
    this->Warning("CreateHistsScale", "no variations: fFileAdd = %s, dirResFlag = %d", 
 		  fFileAdd.Data(), dirResFlag);
    return this->CreateHistsUpDown(var, "", "", dirResFlag);
  }
}

//_________________________________________________________
 TH1* GFDstarZmvfns::CreateHist(const char *var, const char *note)
{
  // get final dir+res for var with file-notifyer note (per bin width)
  TH1 *hDir = this->CreateHistDir(var, note);
  TH1 *hRes = this->CreateHistRes(var, note);

  if(!hDir || !hRes){
    delete hDir;
    delete hRes;
    return NULL;
  }
  const char *dummy = NULL;
  const char *hName = this->GetHistName(var, dummy);
  //                                                                no sumw2, but fill!
  TH1* hResult = GFHistManip::CreateAnalog(hDir, Form("%sSum", hName), kFALSE, kTRUE);
  hResult->SetDirectory(NULL);
  hResult->Add(hRes);

  delete hDir;
  delete hRes;

  return hResult;
}

//_________________________________________________________
 TH1* GFDstarZmvfns::CreateHistDir(const char *var, const char *note)
{
  // note ignored so far
  const char *fileExt = NULL;
  const char *hName = this->GetHistName(var, fileExt);

  TH1 *hDir = this->GetHist(hName, Form("%s%s%s%s.root", fFileStartDirNlo.Data(),
					fileExt, fFileAdd.Data(), note));

  if(hDir){
    hDir->SetName(Form("%sDir", hName));
    hDir->SetTitle(GFAxisVariables::GetAxisLabel(var));
    hDir->SetXTitle(GFAxisVariables::GetAxisLabel(var));

    this->Scale(hDir, var);
  
    if(strcmp(var, "Dphi") == 0 || strcmp(var, "DphiNlo") == 0) {
//     GFHistManip::RadToDegXaxis(hDir, kTRUE);
      this->SetUpperHistEgde(hDir, 180.);
    } else if(strcmp(var, "xGam") == 0) {
      this->SetUpperHistEgde(hDir, 1.0);
    } else {
// get rid of error bars                               sumw2,  fill
      TH1* hNew = GFHistManip::CreateAnalog(hDir, hDir->GetName(), kFALSE, kTRUE);
      hNew->SetDirectory(NULL);
      delete hDir;
      hDir = hNew;
    }
  }
  return hDir;
}


//_________________________________________________________
 TH1* GFDstarZmvfns::CreateHistRes(const char *var, const char *note)
{
  // note ignored so far
  const char *fileExt = NULL;
  const char *hName = this->GetHistName(var, fileExt);

  TH1 *hRes = this->GetHist(hName, Form("%s%s%s%s.root", fFileStartResNlo.Data(),
					fileExt, fFileAdd.Data(), note));

  if(hRes){
    hRes->SetName(Form("%sRes", hName));
    hRes->SetTitle(GFAxisVariables::GetAxisLabel(var));
    hRes->SetXTitle(GFAxisVariables::GetAxisLabel(var));

    this->Scale(hRes, var);
  
    if(strcmp(var, "Dphi") == 0 || strcmp(var, "DphiNlo") == 0) {
//     GFHistManip::RadToDegXaxis(hRes, kTRUE);
      this->SetUpperHistEgde(hRes, 180.);
    } else if(strcmp(var, "xGam") == 0) {
      this->SetUpperHistEgde(hRes, 1.0);
    } else {
// get rid of error bars                              sumw2,  fill
      TH1* hNew = GFHistManip::CreateAnalog(hRes, hRes->GetName(), kFALSE, kTRUE);
      hNew->SetDirectory(NULL);
      delete hRes;
      hRes = hNew;
    }
  }
  return hRes;
}

//_________________________________________________________
 GFHistArray* GFDstarZmvfns::CreateHistsFinalNorm(const char *var, Int_t dirResFlag)
{
  // < 0 res, > 0 dir 
  TObjArray upDowns;
  upDowns.SetOwner();
  upDowns.Add(new TObjString(""));
// following ifs as in TotalCrossSec
  if (fFileAdd.Length() == 0 || fFileAdd == "_cteq5_grv") {
    upDowns.Add(new TObjString("_mu2m125"));
    upDowns.Add(new TObjString("_mu1m4"));
  } else if (fFileAdd == "_mrst04_grv") {
    upDowns.Add(new TObjString("_mu2m1mf15"));
    upDowns.Add(new TObjString("_mu1m4"));
  } else {
    this->Warning("GFDstarZmvfns", "no variations, fFileAdd = %s, dirResFlag = %d",
		  fFileAdd.Data(), dirResFlag);
    upDowns.Add(new TObjString(""));
    upDowns.Add(new TObjString(""));
  }

  return this->CreateHistsFinalNormInt(var, upDowns, dirResFlag);
}

//_________________________________________________________
 TArrayD GFDstarZmvfns::TotalCrossSec(ECrossSecType dstarJet, Int_t dirResFlag)
{
  // returning array of length 3: total cross section, upper and lower bound
  // 
  // dirResFlag < 0: resolved only
  //            > 0: direct only
  //            = 0: sum

  TObjArray upDowns;
  upDowns.SetOwner();
  upDowns.Add(new TObjString(""));
// following ifs as in CreateHistsFinalNorm
  if (fFileAdd.Length() == 0 || fFileAdd == "_cteq5_grv") {
    upDowns.Add(new TObjString("_mu2m125"));
    upDowns.Add(new TObjString("_mu1m4"));
  } else if (fFileAdd == "_mrst04_grv") {
    upDowns.Add(new TObjString("_mu2m1mf15"));
    upDowns.Add(new TObjString("_mu1m4"));
  } else {
    this->Warning("TotalCrossSec", "no variations, fFileAdd = %s, dirResFlag = %d",
		  fFileAdd.Data(), dirResFlag);
    upDowns.Add(new TObjString(""));
    upDowns.Add(new TObjString(""));
  }

  return this->TotalCrossSecInt(dstarJet, dirResFlag, upDowns);
}

//_________________________________________________________
 const char* GFDstarZmvfns::GetHistName(const char *variable, 
					    const char *& fileExt) const
{
  TString var(variable);

  const char *result = NULL;
  // single diff.
  if (var == "eta")          result = "h20";
  else if (var == "pt")     result = "h21";
  else if (var == "wGammaP")result = "h22";
  else if (var == "zDs")    result = "h23";
  else if (var == "etapt11")result = "h24";
  else if (var == "etapt22")result = "h25";
  else if (var == "etapt33")result = "h26";
  if (result) {
    fileExt = "_incl";
    return result;
  }

  // double diff.
  if (var == "EtaDs")        result =  "h20";
  else if (var == "EtaJet") result =  "h21";
  else if (var == "PtDs")   result =  "h22";
  else if (var == "PtJet")  result =  "h23";
  else if (var == "Dphi" || var == "DphiNlo")   result =  "h24";
  else if (var == "PtDsJet")result =  "h25";
  else if (var == "Deta")   result =  "h26";
  else if (var == "MDsJet") result =  "h27";
  else if (var == "xGam")   result =  "h28";
  if (result) {
    fileExt = "_jeta";
    return result;
  }
  
  this->Error("GetHistName", "variable %s not known", variable);
  fileExt = NULL;
  return NULL;
}


//_________________________________________________________
 Bool_t GFDstarZmvfns::Scale(TH1 *hist, const char *var) const
{
  // scale hist to fit cross section in nb

  if(!hist) return kFALSE;

  GFHistManip::Scale(hist, fNbFactor);
  hist->SetYTitle(this->YAxisTitleBinWidth("#sigma [nb]", GFAxisVariables::GetAxisLabel(var)));

  return kTRUE;
}

//_________________________________________________________
 const char* GFDstarZmvfns::GetName() const
{
  return fName.Data();
//   if(fFileAdd.Length() == 0){
//     return "ZMVFNS";//"NLO (ZMVFNS)";
//   } else {
//     static TString buf("ZMVFNS" + fFileAdd);
//     return buf;
//   }
}

//_________________________________________________________
 void GFDstarZmvfns::SetFileAdd(const char *add)
{
  fFileAdd = add; 
  fName = "ZMVFNS";

  if(add && strlen(add)){
//     if(strcmp(add, "_cteq5_grv") != 0) fName += add;
    if(strcmp(add, "_mrst04_grv") != 0) fName += add;
  } else {
    fName += "mrst03_afg04";
  }
}

//_________________________________________________________
 void GFDstarZmvfns::SetUpperHistEgde(TH1 *&hist, Axis_t upper, Bool_t sw2) const
{
  if(!hist) return;
  if(hist->GetDimension() != 1) {
    this->Error("SetUpperHistEdge", "%d-D not yet foreseen, bit %s is!", 
		hist->GetDimension(), hist->GetName());
    return;
  }
  Axis_t *bins = new Axis_t[hist->GetNbinsX() + 1];
  for(Int_t i = 0; i < hist->GetNbinsX(); ++i){
    bins[i] = hist->GetBinLowEdge(i+1);
  }
  if(upper > bins[hist->GetNbinsX()-1]) {
    bins[hist->GetNbinsX()] = upper;
    
    TDirectory *oldHistsDir = hist->GetDirectory();
    hist->SetDirectory(NULL);
    TString tit(Form("%s;%s;%s", hist->GetTitle(), hist->GetXaxis()->GetTitle(),
		     hist->GetYaxis()->GetTitle()));
    TH1 *hnew = new TH1F(hist->GetName(), tit, hist->GetNbinsX(), bins);
    for(Int_t i = 1; i <= hist->GetNbinsX(); ++i){
      hnew->SetBinContent(i, hist->GetBinContent(i));
      if(sw2 && hist->GetSumw2N()) hnew->SetBinError(i, hist->GetBinError(i));
    }
    hnew->SetDirectory(oldHistsDir);
    delete hist;
    hist = hnew;
  } else {
    this->Error("SetUpperHistEdge", "%f is too low!", upper); 
  }
  delete bins;
}


ROOT page - Class index - Top of the page

This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.