//////////////////////////////////////////////////////////////////////////
// //
// 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.