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

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

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

ClassImp(GFDstarCascade)

//_________________________________________________________
 GFDstarCascade::GFDstarCascade(const char *fileStart, const char *rootDir,
			       const char *filePath) 
  : GFDstarVirtualHztool(rootDir, filePath), fName("Cascade 1.2"), fFileStart(fileStart)
{
}

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

//_________________________________________________________
 void GFDstarCascade::DrawHists(const char *var, Int_t flag, Bool_t rel)
{
  // flag 0: final
  //      1: mass variation only
  //      2: scale variation only
  TObjArray *vars = this->CreateVarArray(var);

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

//_________________________________________________________
 GFHistArray* GFDstarCascade::CreateHistsFinal(const char *var, Int_t dirResFlag)
{
  // < 0 res, > 0 dir
  // take max deviation from variation of one of mass and mu
  GFHistArray *histsScale = this->CreateHistsScale(var, dirResFlag);
  GFHistArray *histsMass  = this->CreateHistsMass (var, dirResFlag);
  if(!histsScale || !histsMass) {
    if(histsScale) histsScale->Delete();
    if(histsMass) histsMass->Delete();
    delete histsScale;
    delete histsMass;
    return NULL;
  }

  GFHistArray histsAllVar; // the center will be in it twice, but that does not matter...
  histsAllVar.AddAll(histsScale);
  histsAllVar.AddAll(histsMass);
  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 *hTmp = histsScale->At(1);//                              no sumw2 but fill
    TH1 *hCenter = GFHistManip::CreateAnalog(hTmp, hTmp->GetName(), kFALSE, kTRUE);
    hCenter->SetDirectory(NULL);

    result = new GFHistArray(3);
    result->AddAt(hUpper, 0);
    result->AddAt(hCenter, 1);
    result->AddAt(hLower, 2);
  } else {
    delete hUpper;
    delete hLower;
  }

  histsScale->Delete();
  histsMass->Delete();
  delete histsScale;
  delete histsMass;

  return result;
}

//_________________________________________________________
 GFHistArray* GFDstarCascade::CreateHistsMass(const char *var, Int_t dirResFlag)
{
  //flag obsolete

  GFHistArray *result = this->CreateHistsUpDown(var, "m17", "m13", dirResFlag);
  if(result && result->GetEntriesFast()) return result;

  delete result;
  this->Error("CreateHistsMass", "Currently there are no mass variations");
  return new GFHistArray(0);
}

//_________________________________________________________
 GFHistArray* GFDstarCascade::CreateHistsScale(const char *var, Int_t dirResFlag)
{
  //flag obsolete
  return this->CreateHistsUpDown(var, "-", "+", dirResFlag);
}

//_________________________________________________________
 TH1* GFDstarCascade::CreateHist(const char *var, const char *note)
{
  // get final hist for var with file-notifyer note
  // there is only direct in CASADE!
  return this->CreateHistDir(var, note);
}

//_________________________________________________________
 TH1* GFDstarCascade::CreateHistDir(const char *var, const char *note)
{
  // note maybe "", "+", "-", "m13" or "m17"
  TString hName = this->GetHistName(var);

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

  if(hDir){
    hDir->SetName(Form("%sDir", hName.Data()));
    const char *label = GFAxisVariables::GetAxisLabel(var);
    hDir->SetTitle(label);
    hDir->SetXTitle(label);
    hDir->SetYTitle(this->YAxisTitleBinWidth("#sigma [nb]", label));
  }
  
  return hDir;
}


//_________________________________________________________
 TH1* GFDstarCascade::CreateHistRes(const char *var, const char *note)
{
  // no resolved in CASCADE!
  this->Info("CreateHistRes","There are no resolved processes in CASCADE, try beauty instead");
//   return NULL;
  return this->CreateHistDir(var, Form("-bb%s", note));
}

//_________________________________________________________
 GFHistArray* GFDstarCascade::CreateHistsFinalNorm(const char *var, 
						  Int_t dirResFlag)
{
  // < 0 res, > 0 dir 
  TObjArray upDowns;
  upDowns.SetOwner();
  upDowns.Add(new TObjString(""));
  upDowns.Add(new TObjString("-"));
  upDowns.Add(new TObjString("+"));
  upDowns.Add(new TObjString("m13"));
  upDowns.Add(new TObjString("m17"));

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

//_________________________________________________________
 TArrayD GFDstarCascade::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(""));
  upDowns.Add(new TObjString("-"));
  upDowns.Add(new TObjString("+"));
  upDowns.Add(new TObjString("m13"));
  upDowns.Add(new TObjString("m17"));

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

//_________________________________________________________
 const char* GFDstarCascade::GetName() const
{
  return fName.Data(); //"Cascade 1.2";
}

//_________________________________________________________
 void GFDstarCascade::SetNameAdd(const char *add)
{
  // add 'add' to the name
  // if add == NULL, remove previously added stuff
  fName = "Cascade 1.2";
  if (add) fName += add;
}

//_________________________________________________________
 Bool_t GFDstarCascade::ShouldApplyHadCor() const
{
  // no hadronisation corrections should be applied for cascade
  return kFALSE;
}



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.