// Author: Gero Flucke <mailto:flucke@mail.desy.de>
//____________________________________
// GFDstarXSections
// Author: Gero Flucke
// Date: May 14th, 2002
// last update: $Date: 2005/11/16 00:39:02 $
// by: $Author: flucke $
//
#include <iostream> // debugging only
using namespace std;
#include <limits.h>
#include <TROOT.h>
#include <TFile.h>
#include <TPad.h>
#include <TCanvas.h>
#include <TH1.h>
#include <TGraphAsymmErrors.h>
#include <TLegend.h>
#include <TLegendEntry.h>
// #include <TH2.h>
#include <TString.h>
#include <TObjString.h>
// #include <TAxis.h>
// #include <TObjArray.h>
#include "GFAnalysis/GFDstarXSections.h"
#include "GFAnalysis/GFDstarHistsAnalysisData.h"
#include "GFAnalysis/GFDstarHistsAnalysisMc.h"
#include "GFAnalysis/GFAxisVariables.h"
#include "GFTools/GFFitHistFrac.h"
#include "GFUtils/GFHistManager.h"
#include "GFUtils/GFHistArray.h"
#include "GFUtils/GFHistManip.h"
#include "GFUtils/GFDstarRunPeriods.h"
ClassImp(GFDstarXSections)
GFDstarXSections::GFDstarXSections(const char* filePrefix, const char* period)
: fTrigger(83), fInclXsec(2), fMcFactors(0)
{
fAnalysisData = new GFDstarHistsAnalysisData(filePrefix, (period ? period : "All"));
fAnalysisMc = new GFDstarHistsAnalysisMc(filePrefix,
(period ? Form("Pythia%s", period) : "Pythia"));
fAnalysisOtherMc = new GFDstarHistsAnalysisMc(filePrefix,
(period ? Form("Cascade%s", period):"Cascade"));
this->Init();
}
//____________________________________
GFDstarXSections::GFDstarXSections(GFDstarHistsAnalysisData* data,
GFDstarHistsAnalysisMc* m1,
GFDstarHistsAnalysisMc* m2) :
fTrigger(83), fInclXsec(2), fMcFactors(0)
{
// pointers are adopted!
fAnalysisData = data;
fAnalysisMc = m1;
fAnalysisOtherMc = m2;
if(!fAnalysisMc || !fAnalysisData){
this->Error("GFDstarXSections", "data or mc missing!");
}
fTrigger = fAnalysisData->GetTrigger();
if(fTrigger != fAnalysisMc->GetTrigger()){
this->Warning("GFDstarXSections", "trigger %d in data, MC was %d, use %d", fTrigger,
fAnalysisMc->GetTrigger(), fTrigger);
fAnalysisMc->SetTrigger(fTrigger);
}
if(fAnalysisOtherMc && fTrigger != fAnalysisOtherMc->GetTrigger()){
this->Warning("GFDstarXSections", "trigger %d in data, other MC was %d, use %d",
fTrigger, fAnalysisOtherMc->GetTrigger(), fTrigger);
fAnalysisOtherMc->SetTrigger(fTrigger);
}
this->Init();
}
//____________________________________
void GFDstarXSections::Init()
{
fHistManager = new GFHistManager;
this->SetLumi(); // after fAnalysisData is set!
fAcceptFromMc.Set(2);
fAcceptFromMc[1] = kTRUE; //S83
fAcceptFromMc[0] = kTRUE; //S84
fEffTrigFromMc = fAcceptFromMc;
fReflectCorrection = 1. - 0.035;// from S. Hengstmann's thesis
fEffDedx = 0.98;
fAnalysisData->SetBatch();
fAnalysisMc->SetBatch();
Int_t nMc = (fAnalysisMc ? 1 : 0);
if(fAnalysisOtherMc) {
fAnalysisOtherMc->SetBatch();
++nMc;
}
fMcFactors.Set(nMc);
this->SetHistPointerNull();
}
//____________________________________
GFDstarXSections::~GFDstarXSections()
{
if(fHistManager) delete fHistManager;
if(fAnalysisData) delete fAnalysisData;
if(fAnalysisMc) delete fAnalysisMc;
if(fAnalysisOtherMc) delete fAnalysisOtherMc;
if(fHistNumDstar) delete fHistNumDstar;
if(fHistTrigEff) delete fHistTrigEff;
if(fHistRecEff) delete fHistRecEff;
if(fHistAccept) delete fHistAccept;
if(fHistData1) delete fHistData1;
if(fHistData2) delete fHistData2;
if(fHistData3) delete fHistData3;
if(fHistMc1) delete fHistMc1;
if(fHistMc2) delete fHistMc2;
if(fHistMc3) delete fHistMc3;
}
//____________________________________
TH1* GFDstarXSections::XSectionNorm(const char *var)
{
const Bool_t wasBatch = fHistManager->SetBatch(kTRUE);
TH1 *hist = this->XSection(var);
if (hist) {
hist = this->XSectionNormInt(hist, "D*", var);
}
fHistManager->SetBatch(wasBatch);
fHistManager->Draw();
return hist;
}
//____________________________________
TH1* GFDstarXSections::XSectionNorm(const char *var1, const char *var2,
Int_t firstBin2, Int_t lastBin2)
{
const Bool_t wasBatch = fHistManager->SetBatch(kTRUE);
TH1 *hist = this->XSection(var1, var2, firstBin2, lastBin2);
if (hist) {
hist = this->XSectionNormInt(hist, "D*", var1);
}
fHistManager->SetBatch(wasBatch);
fHistManager->Draw();
return hist;
}
//____________________________________
TH1* GFDstarXSections::XSectionDsJetNorm(const char *var, const char* forwBack)
{
const Bool_t wasBatch = fHistManager->SetBatch(kTRUE);
TH1 *hist = this->XSectionDsJet(var, forwBack);
if (hist) {
const TString sample(Form("D* + oth. jet%s", forwBack));
hist = this->XSectionNormInt(hist, sample.Data(), var);
}
fHistManager->SetBatch(wasBatch);
fHistManager->Draw();
return hist;
}
//____________________________________
TH1* GFDstarXSections::XSectionDsDiJetNorm(const char* var)
{
const Bool_t wasBatch = fHistManager->SetBatch(kTRUE);
TH1 *hist = this->XSectionDsDiJet(var);
if (hist) {
hist = this->XSectionNormInt(hist, "D* + 2 jet", var);
}
fHistManager->SetBatch(wasBatch);
fHistManager->Draw();
return hist;
}
//____________________________________
TH1* GFDstarXSections::XSectionNormInt(TH1 *hist, const char *sample, const char *var)
{
// FIXME: MC?
if (!hist) return NULL;
TH1 *hNew = static_cast<TH1*>(hist->Clone(Form("%sNorm", hist->GetName())));
GFHistManip::ReCorrectForBinWidth(hNew);
Double_t totXSec = 0., totXSecErr2 = 0.;// sum of bins, including over-/underflow
const Int_t overflowBin = hNew->GetNbinsX() + 1;
for (Int_t iBin = 0; iBin <= overflowBin; ++iBin) {
totXSec += hNew->GetBinContent(iBin);
totXSecErr2 += hNew->GetBinError(iBin) * hNew->GetBinError(iBin);
}
TArrayD tmp(2);
tmp[0] = totXSec;
tmp[1] = TMath::Sqrt(totXSecErr2);
fAnalysisData->PrintPlusMinus(tmp, Form("total X-section as sum of previous"));
const Double_t totXSec2 = totXSec*totXSec;
for (Int_t iBin = 0; iBin <= overflowBin; ++iBin) { // FIXME: skip over-/underflow?
const Double_t cont = hNew->GetBinContent(iBin);
const Double_t err2 = hNew->GetBinError(iBin) * hNew->GetBinError(iBin);
hNew->SetBinContent(iBin, cont/totXSec);
// cf. log book November 15th, 2005:
const Double_t newErr2 = 1./totXSec2 * (err2 + cont/totXSec *
(totXSecErr2 * cont/totXSec -2. * err2));
hNew->SetBinError(iBin, TMath::Sqrt(newErr2));
}
GFHistManip::CorrectForBinWidth(hNew);
fHistManager->AddHist(hNew, fHistManager->GetNumLayers());
TString yTit(Form("1/#sigma_{%s} %s", sample, hNew->GetYaxis()->GetTitle()));
TString tit(Form("1/#sigma_{%s} %s", sample, hNew->GetTitle()));
const char *unit = this->GetUnit(GFAxisVariables::GetAxisLabel(var));
if (unit) {
yTit.ReplaceAll("nb", "1");
tit.ReplaceAll(Form("[%s]", unit), NULL);
} else {
yTit.ReplaceAll("[nb]", NULL);
tit.ReplaceAll("[nb]", NULL);
}
hNew->SetTitle(Form("%s;%s;%s", tit.Data(), hNew->GetXaxis()->GetTitle(), yTit.Data()));
GFHistManip::PrintTable(hNew, "previous now normalised");
return hNew;
}
//____________________________________
TH1* GFDstarXSections::XSectionDsJet(const char* var, const char* forwBack)
{
fHistNumDstar = fAnalysisData->DrawDmDs1Jet(var, forwBack);
fHistTrigEff = fAnalysisMc->CreateTrigEffDsJet(var, forwBack);//FIMXE ?: CreateTrigEff(var);
fHistRecEff = fAnalysisMc->CreateRecEffDs1Jet(var, forwBack);
fHistAccept = fAnalysisMc->CreateAcceptDsJet(var, forwBack);// FIXME ?: always from MC?
fHistMc1 = fAnalysisMc->XSectionDsJet(var, forwBack);
fHistMc2 = fAnalysisOtherMc ? fAnalysisOtherMc->XSectionDsJet(var, forwBack) : NULL;
TString pro(Form("D*%s + 1 jet", forwBack));
return this->XSectionInt(GFAxisVariables::GetAxisLabel(var), pro.Data());
}
//____________________________________
TH1* GFDstarXSections::XSectionDsDiJet(const char* var)
{
fHistNumDstar = fAnalysisData->DrawDmDsDiJet(var);
fHistTrigEff = fAnalysisMc->CreateTrigEffDsDiJet(var);//FIMXE ?: CreateTrigEff(var);
fHistRecEff = fAnalysisMc->CreateRecEffDsDiJet(var);
fHistAccept = fAnalysisMc->CreateAcceptDsDiJet(var);// FIXME ?: always from MC?
fHistMc1 = fAnalysisMc->XSectionDsDiJet(var);
fHistMc2 = fAnalysisOtherMc ? fAnalysisOtherMc->XSectionDsDiJet(var) : NULL;
return this->XSectionInt(GFAxisVariables::GetAxisLabel(var), "D* dijet");
}
//____________________________________
TH1* GFDstarXSections::XSection(const char* var1, const char* var2, Int_t firstBin2,
Int_t lastBin2)
{
fHistNumDstar = fAnalysisData->DrawDm(var1, var2, firstBin2, lastBin2, kTRUE);
fHistTrigEff = fAnalysisMc->CreateTrigEff(var1, var2, firstBin2, lastBin2);
fHistRecEff = fAnalysisMc->CreateRecEff(var1, var2, firstBin2, lastBin2);
fHistAccept = fAnalysisMc->CreateAccept(var1, var2, firstBin2, lastBin2);
fHistMc1 = fAnalysisMc->XSection(var1, var2, firstBin2, lastBin2);
fHistMc2 = (fAnalysisOtherMc ?
fAnalysisOtherMc->XSection(var1, var2, firstBin2, lastBin2) : NULL);
TH1* tmp = fHistMc1;
TH1* hXSec = this->XSectionInt(GFAxisVariables::GetAxisLabel(var1), "D*");
if(hXSec) hXSec->SetTitle(tmp->GetTitle());
return hXSec;
}
//____________________________________
TH1* GFDstarXSections::XSection(const char* var, Bool_t acceptOnMc)
{
fHistNumDstar = fAnalysisData->DrawDm(var);
fHistTrigEff = this->CreateTrigEff(var);
fHistRecEff = fAnalysisMc->CreateRecEff(var);
if(acceptOnMc) fHistAccept = NULL;
else{
fHistAccept = this->AcceptFromMc() ? fAnalysisMc->CreateAccept(var)
: fAnalysisData->DrawAccept(var);// FIXME ???
}
fHistMc1 = fAnalysisMc->XSection(var, acceptOnMc);
fHistMc2 = fAnalysisOtherMc ? fAnalysisOtherMc->XSection(var, acceptOnMc) : NULL;
return this->XSectionInt(GFAxisVariables::GetAxisLabel(var), "D*");
}
//____________________________________
TH1* GFDstarXSections::XSectionWgammaP(Bool_t acceptOnMc)
{
this->InitXSecWgammaP(acceptOnMc);
return this->XSectionInt("W_{#gammap}", "D*");
}
//____________________________________
void GFDstarXSections::InitXSecWgammaP(Bool_t acceptOnMc)
{
// set internal hist pointer for XSectioWgammaP...()
fHistNumDstar = fAnalysisData->DrawDm("wGammaP");//WgammaP();
fHistTrigEff = this->CreateTrigEff("wGammaP");
fHistRecEff = fAnalysisMc->CreateRecEff("wGammaP");
if(acceptOnMc) fHistAccept = NULL;
else {
fHistAccept = this->AcceptFromMc() ? fAnalysisMc->CreateAccept("wGammaP")
: fAnalysisData->DrawAccept("wGammaP");//old: WgammaP
}
// Has to be the last for XSectionWgammaPBoth:
fHistMc1 = fAnalysisMc->XSectionWgammaP(acceptOnMc);
fHistMc2 = fAnalysisOtherMc ? fAnalysisOtherMc->XSection("wGammaP", acceptOnMc) : NULL;
}
//____________________________________
TH1* GFDstarXSections::XSectionInt(const char* variable, const char* process,
Bool_t drawWrite)
{
// if(drawWrite) fHistManager->Clear();
fHistManager->Clear(); //FIXME
if(!fHistNumDstar || !fHistRecEff || !fHistTrigEff || !fHistMc1) {
return NULL;// fHistAccept or fHistMc2 may be missing
}
Int_t numBins = fHistNumDstar->GetNbinsX();
TArrayD relErrorNumDstar(numBins);
for(Int_t i = 0; i < numBins; ++i){
relErrorNumDstar[i] = fHistNumDstar->GetBinError(i+1);
if(fHistNumDstar->GetBinContent(i+1)) {
relErrorNumDstar[i] /= fHistNumDstar->GetBinContent(i+1);
}
}
GFHistManip::Scale(fHistNumDstar, fReflectCorrection);
TString name("xSection");
fAnalysisData->MakeStringName(name += variable);
TH1* temp = static_cast<TH1*>(fHistTrigEff->Clone(name+"Temp"));
temp->Multiply(fHistTrigEff, fHistRecEff,
fAnalysisMc->GetBranchRatio(), this->GetLumi());
if(!fHistAccept){
this->Warning("XSection", "using mode ignoring acceptance!");
} else if(fTrigger == 84){
if(this->AcceptFromMc()){
temp->Multiply(temp, fHistAccept);
} else {
temp->Scale(fAnalysisData->TotalAccept().At(0));
this->Warning("XSection",
"ETAG44: ignore acceptance histogram, use overall factor from data");
}
// } else if(fTrigger == 83){
// TString varStr(variable);
// if(varStr == "W_{#gammap}" || (varStr.Contains("eta") && !varStr.Contains("-"))){
// // w_gp, eta, but not delta eta...
// this->Info("XSection", "napplying acceptance histogram!n");
// temp->Multiply(temp, fHistAccept);
// } else {
// this->Warning("XSection", "using overall factor for acceptance");
// Double_t totalAccept = this->AcceptFromMc() ? fAnalysisMc->TotalAccept().At(0)
// : fAnalysisData->TotalAccept().At(0);
// temp->Scale(totalAccept);
// }
} else {
temp->Multiply(temp, fHistAccept);
}
TH1* histXSection = static_cast<TH1*>(fHistNumDstar->Clone(name+=fTrigger));
const Double_t l4Eff = fAnalysisData->L4Efficiency().At(0);
histXSection->Divide(histXSection, temp, 1., l4Eff*fEffDedx);
delete temp;
for(Int_t i = 0; i < numBins; ++i){
histXSection->SetBinError(i+1, relErrorNumDstar[i] * histXSection->GetBinContent(i+1));
}
TString title(Form("d#sigma_{vis} (ep#rightarrow %s X) / d", process));
title+=variable;//)+=" [pb]";
histXSection->SetTitle(title);
TString titleShort(Form("d#sigma / d%s [nb", variable));
const char *unit = this->GetUnit(titleShort);//NULL;
// if(titleShort.Contains("[GeV]")) unity = "GeV";
// else if(titleShort.Contains("[#circ]")) unity = "#circ";
if(unit){
titleShort.ReplaceAll(Form("[%s]", unit), NULL); // pb
(titleShort += "/") += unit;
}
titleShort += "]";
histXSection->SetYTitle(titleShort);
histXSection->SetMarkerStyle(8);//kFullDotLarge);
fHistManager->AddHist(fHistNumDstar, 0);
fHistManager->AddHist(fHistTrigEff, 0);
fHistManager->AddHist(fHistRecEff, 0);
fHistManager->AddHist(fHistAccept, 0); // if NULL pointer: ignored!
TString per;// = "H1 ";
per += fAnalysisData->GetPeriod();
fHistManager->AddHist(histXSection, 1, per.Data(), "lp");
if(!TString(variable).Contains("p_{t}")) histXSection->SetMinimum(0.); // mmhhh: fixme?
else {
histXSection->SetMinimum(-1111.);
fHistManager->SetLogY(1);
}
fMcFactors[0] = 1.;//drawWrite ? this->NormaliseToData(fHistMc1, fAnalysisMc) : 1.;
// fHistMc1->SetOption("HIST");
fHistMc1->SetMaximum(-1111.);//fHistMc1->GetMaximum() * factor);
// fHistManager->AddHistSame(fHistMc1, 1, 0, TString("PYTHIA #times ")+=factor);
fHistManager->AddHistSame(fHistMc1, 1, 0, Form("%s #times %f",
fAnalysisMc->GetPeriod(), fMcFactors[0]));
fHistManager->AddLegend(1, 0, fAnalysisData->GetSampleName());
if(fHistMc2 && fAnalysisOtherMc){
fMcFactors[1] = 1.;//this->NormaliseToData(fHistMc2, fAnalysisOtherMc);
// fHistMc2->SetOption("HIST");
fHistMc2->SetMaximum(-1111.);//fHistMc2->GetMaximum() * factor);
// fHistManager->AddHistSame(fHistMc2, 1, 0, TString("Cascade #times ")+=factor2);
fHistManager->AddHistSame(fHistMc2, 1, 0,
Form("%s #times %f",fAnalysisOtherMc->GetPeriod(),fMcFactors[1]));
}
// GFHistArray* singleMcs = fAnalysisMc->GetHistsTmp();
// for(Int_t i = 0; i < singleMcs->GetEntriesFast(); ++i){
// (*singleMcs)[i]->Scale(fMcFactors[1]);
// (*singleMcs)[i]->SetMaximum(-1111.);//(*singleMcs)[i]->GetMaximum() * factor);
// fHistManager->AddHistSame((*singleMcs)[i], 1, 0, fAnalysisMc->GetSingleMc(i)->GetPeriod());
// }
// GFHistArray* mcFitToData = this->FitFractions(histXSection, fAnalysisMc->GetHistsTmp());
// fHistManager->AddHistsSame(mcFitToData, 1, 1);
// delete mcFitToData; mcFitToData = NULL;
if(drawWrite){
fHistManager->Draw();
this->SetHistPointerNull();
}
title = Form("%s X-section in bins of ", process);
fAnalysisData->PrintTable(histXSection, title += variable);
return histXSection;
}
//____________________________________
TArrayD GFDstarXSections::XSectionTot(Bool_t ignoreAccept) const
{
if(ignoreAccept || !fInclXsec[0]){
const TArrayD numDstar = fAnalysisData->DrawDm();
const TArrayD trigEff = this->TotalTrigEff();
const TArrayD recEff = fAnalysisMc->TotalRecEff();
const TArrayD l4Eff = fAnalysisData->L4Efficiency();
Double_t accept = 1.;
if(!ignoreAccept) {
accept = this->AcceptFromMc() ? fAnalysisMc->TotalAccept().At(0)
: fAnalysisData->TotalAccept().At(0);
}
fInclXsec = this->XSectionTot(numDstar, trigEff[0], recEff[0], accept, l4Eff[0], "D*");
}
return fInclXsec;
}
TArrayD GFDstarXSections::XSectionTot(const TArrayD& numDstar, Double_t trigEff,
Double_t recEff, Double_t accept, Double_t l4Eff,
const char* what) const
{
TArrayD xSectAndError(2);
const Double_t nominator = fAnalysisMc->GetBranchRatio() * trigEff * recEff
* this->GetLumi() * accept * l4Eff * fEffDedx;
xSectAndError[0] = nominator ? numDstar[0]/nominator : 0.;
xSectAndError[1] = numDstar[0] ? xSectAndError[0] * numDstar[1]/numDstar[0] : 0.;
// reflection correction
xSectAndError[0] *= fReflectCorrection;
xSectAndError[1] *= fReflectCorrection;
fAnalysisData->PrintPlusMinus(xSectAndError, Form("%s: Total X-section", what));
return xSectAndError;
}
//____________________________________
TArrayD GFDstarXSections::XSectionDsJetTot(const char* forwBack) const
{
const TArrayD numDstar = fAnalysisData->DrawDmDsJet(forwBack);
const TArrayD trigEff = fAnalysisMc->TotalTrigEffDsJet(forwBack);
const TArrayD recEff = fAnalysisMc->TotalRecEffDsJet(forwBack);
const TArrayD l4Eff = fAnalysisData->L4Efficiency();
const Double_t accept = fAnalysisMc->TotalAcceptDsJet(forwBack).At(0);
return this->XSectionTot(numDstar, trigEff[0], recEff[0], accept, l4Eff[0],
Form("D* %s + 1 jet", forwBack));
}
//____________________________________
TArrayD GFDstarXSections::XSectionDsDiJetTot() const
{
const TArrayD numDstar = fAnalysisData->DrawDmDsDiJet();
const TArrayD trigEff = fAnalysisMc->TotalTrigEffDsDiJet();
const TArrayD recEff = fAnalysisMc->TotalRecEffDsDiJet();
const TArrayD l4Eff = fAnalysisData->L4Efficiency();
const Double_t accept = fAnalysisMc->TotalAcceptDsDiJet().At(0);
return this->XSectionTot(numDstar, trigEff[0], recEff[0], accept, l4Eff[0], "D* dijet");
}
//____________________________________
TH1* GFDstarXSections::XSectionTotHist(Bool_t draw, Bool_t ignoreAccept)
{
if(draw) fHistManager->Clear();
TArrayD xSectAndError = this->XSectionTot(ignoreAccept);
TString name("sigmaTot");
TString title("#sigma_{vis} ep #rightarrow D* + X [nb]"); // pb
TH1* hTemp = fAnalysisData->GetHist2D("wGammaP");
TH1* histX = new TH1F(name+=fTrigger,
title+=fAnalysisData->GetSampleName(),
1, hTemp->GetYaxis()->GetXmin(), hTemp->GetYaxis()->GetXmax());
histX->SetBinContent(1, xSectAndError[0]);
histX->SetBinError(1, xSectAndError[1]);
if(draw){
fHistManager->AddHist(histX);
fHistManager->Draw();
}
return histX;
}
//____________________________________
TH1* GFDstarXSections::CreateTrigEff(const char* var)
{
TH1* hTr19 = NULL;
if(this->GetTrigger() == 83){
hTr19 = this->EffTrigFromMc() ?
fAnalysisMc->CreateTrigEff(var) : fAnalysisData->CreateTrigEff(var);
} else if(this->GetTrigger() == 84){
this->Warning("CreateTrigEff", "Mixing MC per bin (TE19) with data mean (TE31)");
hTr19 = fAnalysisMc->CreateTrigEff(var, 19);
TArrayD tot31 = fAnalysisData->TotalTrigEff(31);
for(Int_t bin = 1; bin <= hTr19->GetNbinsX(); ++bin){
hTr19->SetBinContent(bin, hTr19->GetBinContent(bin) * tot31[0]);
hTr19->SetBinError(bin, 0.);
}
hTr19->SetTitle("#epsilon_{trig}: 19 from MC, 31 mean from data");
fAnalysisData->PrintTable(hTr19, TString("trigEff from MC (TE19) & data (TE31) ")+=var);
}
return hTr19;
}
//____________________________________
TArrayD GFDstarXSections::TotalTrigEff() const
{
TArrayD trigEff(2);
if(this->GetTrigger() == 83){
trigEff = this->EffTrigFromMc() ?
fAnalysisMc->TotalTrigEff() : fAnalysisData->TotalTrigEff();
} else if(this->GetTrigger() == 84){
this->Warning("TotalTrigEff", "Mixing MC (TE19) with data (TE31)");
TArrayD mc19 = fAnalysisMc->TotalTrigEff(19);
TArrayD data31 = fAnalysisData->TotalTrigEff(31);
trigEff[0] = mc19[0] * data31[0];
trigEff[1] = 0.;
fAnalysisData->PrintPlusMinus(trigEff, "Total trigEff from MC (TE19) & data (TE31)");
}
return trigEff;
}
//____________________________________
TH1* GFDstarXSections::DataVsMcDstar(const char* var, Bool_t perBinW, Bool_t log)
{
// "pt", "eta, phi
// returns data hist
const Double_t allData = fAnalysisData->DrawDm()[0];
TH1* histData = fAnalysisData->DrawDm(var, perBinW);
const Double_t allMc = fAnalysisMc->DrawDm()[0];
TH1* histMc = fAnalysisMc->DrawDm(var, perBinW);
TH1* histMc2 = (fAnalysisOtherMc ? fAnalysisOtherMc->DrawDm(var, perBinW) : NULL);
const Double_t allMc2 = (fAnalysisOtherMc ? fAnalysisOtherMc->DrawDm()[0] : 0.);
if(!histMc || !histData){
this->Error("DataVsMcDstar", "One hist missing!");
return NULL;
}
GFHistManip::Scale(histData, 1./allData);
GFHistManip::Scale(histMc, 1./allMc);
if(histMc2) {
GFHistManip::Scale(histMc2, 1./allMc2);
}
return this->DrawDataVsMC(histData, histMc, histMc2, perBinW, log);
}
//____________________________________
TH1* GFDstarXSections::DataVsMcDstar(const char* var1, const char* var2,
Int_t firstBin, Int_t lastBin, Bool_t perBinW, Bool_t log)
{
// pt, eta, wGammaP
const Double_t allData = fAnalysisData->DrawDm()[0];
TH1* histData = fAnalysisData->DrawDm(var1, var2, firstBin, lastBin, perBinW);
const Double_t allMc = fAnalysisMc->DrawDm()[0];
TH1* histMc = fAnalysisMc->DrawDm(var1, var2, firstBin, lastBin, perBinW);
TH1* histMc2 = (fAnalysisOtherMc ?
fAnalysisOtherMc->DrawDm(var1, var2, firstBin, lastBin, perBinW) : NULL);
const Double_t allMc2 = (fAnalysisOtherMc ? fAnalysisOtherMc->DrawDm()[0] : 0.);
if(!histMc || !histData){
this->Error("DataVsMcDstar", "One hist missing!");
return NULL;
}
GFHistManip::Scale(histData, 1./allData);
GFHistManip::Scale(histMc, 1./allMc);
if(histMc2) {
GFHistManip::Scale(histMc2, 1./allMc2);
}
return this->DrawDataVsMC(histData, histMc, histMc2, perBinW, log);
}
//____________________________________
TH1* GFDstarXSections::DataVsMcDsDiJet(const char* var, Bool_t perBinW, Bool_t log)
{
// Pt, Eta, Phi + Ds, Jet; xGam, Dphi, Deta,...
const UInt_t dmRefFlag = 2; // inclusive data as reference
const Double_t allData = fAnalysisData->DrawDmDsDiJet(dmRefFlag).At(0);
TH1* histData = fAnalysisData->DrawDmDsDiJet(var, perBinW, dmRefFlag);
const Double_t allMc = fAnalysisMc-> DrawDmDsDiJet(dmRefFlag).At(0);
TH1* histMc = fAnalysisMc->DrawDmDsDiJet(var, perBinW, dmRefFlag);
const Double_t allMc2 = (fAnalysisOtherMc ?
fAnalysisOtherMc->DrawDmDsDiJet(dmRefFlag).At(0) : 0.);
TH1* histMc2 = (fAnalysisOtherMc ?
fAnalysisOtherMc->DrawDmDsDiJet(var, perBinW, dmRefFlag) : NULL);
if(!histMc || !histData){
this->Error("DataVsMcDsDiJet", "One hist missing!");
return NULL;
}
GFHistManip::Scale(histData, 1./allData);
GFHistManip::Scale(histMc, 1./allMc);
if(histMc2) {
GFHistManip::Scale(histMc2, 1./allMc2);
}
TH1* hResult = this->DrawDataVsMC(histData, histMc, histMc2, perBinW, log);
TString yTitle = hResult->GetYaxis()->GetTitle();
Ssiz_t ind = yTitle.Index("D*");
if(ind != kNPOS) yTitle.Insert(ind+2, " dijet");
hResult->SetYTitle(yTitle);
return hResult;
}
//____________________________________
TH1* GFDstarXSections::DataVsMcDsJet(const char* var, const char* forwBack,
Bool_t perBinW, Bool_t log)
{
// Pt, Eta, Phi + Ds, Jet; xGam, Dphi, Deta,...
const UInt_t dmRefFlag = 2; // inclusive data as reference
const Double_t allData = fAnalysisData->DrawDmDsJet(forwBack, dmRefFlag).At(0);
TH1* histData = fAnalysisData->DrawDmDs1Jet(var, forwBack, perBinW, dmRefFlag);
const Double_t allMc = fAnalysisMc-> DrawDmDsJet(forwBack, dmRefFlag).At(0);
TH1* histMc = fAnalysisMc->DrawDmDs1Jet(var, forwBack, perBinW, dmRefFlag);
const Double_t allMc2 = (fAnalysisOtherMc ?
fAnalysisOtherMc->DrawDmDsJet(forwBack, dmRefFlag).At(0) : 0.);
TH1* histMc2 = (fAnalysisOtherMc ?
fAnalysisOtherMc->DrawDmDs1Jet(var, forwBack, perBinW, dmRefFlag) : NULL);
if(!histMc || !histData){
this->Error("DataVsMcDsJet", "One hist missing!");
return NULL;
}
GFHistManip::Scale(histData, 1./allData);
GFHistManip::Scale(histMc, 1./allMc);
if(histMc2) {
GFHistManip::Scale(histMc2, 1./allMc2);
}
TH1* hResult = this->DrawDataVsMC(histData, histMc, histMc2, perBinW, log);
TString yTitle = hResult->GetYaxis()->GetTitle();
Ssiz_t ind = yTitle.Index("D*");
if(ind != kNPOS) yTitle.Insert(ind+2, "+jet");
hResult->SetYTitle(yTitle);
return hResult;
}
//____________________________________
TH1* GFDstarXSections::DrawDataVsMC(TH1* histData, TH1* histMc, TH1* histMc2,
Bool_t perBinW, Bool_t log)
{
if(!histData || !histMc) return NULL;
fHistManager->Clear();
fHistManager->AddHist(histData, 1, fAnalysisData->GetPeriod(), "lp");
histData->SetYTitle(perBinW ? "(n(D*)/N)/bin" : "n(D*)/N");
histMc->SetOption("E2");
fHistManager->AddHistSame(histMc, 1, 0, fAnalysisMc->GetPeriod(),"f");
if(histMc2) {
histMc2->SetOption("E2");
fHistManager->AddHistSame(histMc2, 1, 0, fAnalysisOtherMc->GetPeriod(),"f");
}
// fHistManager->AddLegend(0,0,fAnalysisData->GetSampleName());
fHistManager->AddHistSame(histMc, 1, 0); // draw on top again
fHistManager->AddHistSame(histData, 1, 0); // draw on top again
if(log) fHistManager->SetLogY(1);
// TH1* hSb = this->GetDstarHistsAnalysisData()->GetHistManager()->GetHistsOf(2, 1)->At(0);
if(this->GetDstarHistsAnalysisData()->GetHistManager()->GetHistsOf(2, 1)){
fHistManager->AddHist(this->GetDstarHistsAnalysisData()->GetHistManager()
->GetHistsOf(2, 1)->At(0), 0);
}
fHistManager->Draw();
histData->SetLineStyle(1);
histData->SetLineColor(kBlack);
histData->SetMarkerColor(histData->GetLineColor());
histData->SetMarkerStyle(kFullDotLarge);
// histData->SetMarkerSize(1.3);
histMc->SetFillColor(8); // 8: dark green 5: yellow
histMc->SetLineColor(histMc->GetFillColor());
histMc->SetMarkerColor(histMc->GetFillColor());
histMc->SetLineStyle(1);
if(histMc2){
histMc2->SetFillColor(kMagenta); // 8: dark green 5: yellow
histMc2->SetLineColor(histMc2->GetFillColor());
histMc2->SetMarkerColor(histMc2->GetFillColor());
histMc2->SetLineStyle(1);
}
return histData;
}
//____________________________________
void GFDstarXSections::DataVsMcTracks(const char* var)
{
// Pt,Theta,Length,Phi,LH, etc.
TString v(var);
fHistMc1 = fAnalysisMc->DrawTrack(v+"K");
fHistMc2 = fAnalysisMc->DrawTrack(v+"Pi");
fHistMc3 = fAnalysisMc->DrawTrack(v+"Pis");
fHistData1 = fAnalysisData->DrawTrack(v+"K");
fHistData2 = fAnalysisData->DrawTrack(v+"Pi");
fHistData3 = fAnalysisData->DrawTrack(v+"Pis");
this->DataVsMcTracks();
}
//____________________________________
void GFDstarXSections::DataVsMcTracks()
{
GFHistManip::Normalise1stTo2nd(fHistMc1, fHistData1);//, "width"?
GFHistManip::Normalise1stTo2nd(fHistMc2, fHistData2);
GFHistManip::Normalise1stTo2nd(fHistMc3, fHistData3);
fHistManager->Clear();
fHistManager->AddHist(fHistMc1,0,fAnalysisMc->GetPeriod(), "f");
fHistManager->AddLegend(0,0,fAnalysisMc->GetSampleName());
fHistManager->AddHist(fHistMc2,0,fAnalysisMc->GetPeriod(), "f");
fHistManager->AddLegend(0,1,fAnalysisMc->GetSampleName());
fHistManager->AddHist(fHistMc3,0,fAnalysisMc->GetPeriod(), "f");
fHistManager->AddLegend(0,2,fAnalysisMc->GetSampleName());
fHistManager->SetHistsOption("E2");
fHistManager->SetHistsFillColor(5); // 5: yellow
fHistManager->AddHistSame(fHistData1,0,0,fAnalysisData->GetPeriod());
fHistManager->AddHistSame(fHistData2,0,1,fAnalysisData->GetPeriod());
fHistManager->AddHistSame(fHistData3,0,2,fAnalysisData->GetPeriod());
fHistManager->SetNumHistsX(1);
fHistManager->SetNumHistsY(3);
fHistManager->Draw();
this->SetHistPointerNull();
}
//____________________________________
TH1* GFDstarXSections::DataVsMcTrack(const char* varTrack)
{
// ptK, LHPi, thetaPis,...
TString var(varTrack);
const Double_t allData = fAnalysisData->DrawDm()[0];
const Double_t allMc = fAnalysisMc->DrawDm()[0];
const Double_t allMc2 = fAnalysisOtherMc ? fAnalysisOtherMc->DrawDm()[0] : 0.;
TH1* histMc = fAnalysisMc->DrawTrack(var);
TH1* histData = fAnalysisData->DrawTrack(var);
TH1* histMc2 = (fAnalysisOtherMc ? fAnalysisOtherMc->DrawTrack(var) : NULL);
if(!histMc || ! histData){
this->Error("DataVsMcTrack", "One hist missing!");
return NULL;
}
GFHistManip::Scale(histData, 1./allData);
GFHistManip::Scale(histMc, 1./allMc);
if(histMc2) {
GFHistManip::Scale(histMc2, 1./allMc2);
}
return this->DrawDataVsMC(histData, histMc, histMc2, kFALSE, kFALSE);// perBinW,log
}
//____________________________________
void GFDstarXSections::DataVsMcPtDsOverSumEt()
{
fHistMc1 = fAnalysisMc->DrawDmPtDsOverSumEt();
fHistData1 = fAnalysisData->DrawDmPtDsOverSumEt();
GFHistManip::Normalise1stTo2nd(fHistMc1, fHistData1);//, "width"?
fHistManager->Clear();
fHistManager->AddHist(fHistMc1,0);
fHistManager->SetHistsOption("E2");
fHistManager->SetHistsFillColor(5); // 5: yellow
fHistManager->AddHistSame(fHistData1,0,0);
fHistManager->Draw();
this->SetHistPointerNull();
}
//____________________________________
TH1* GFDstarXSections::DataVsMcTrigEff(const char* var, Int_t TE)
{
//pt,eta,phi,wGammaP; TE: 19/31/default=-1
// retunrs the hist defining the axis limits
TH1* histData = fAnalysisData->CreateTrigEff(var, TE);
TGraphAsymmErrors* errorsData = fAnalysisData->TmpGraph();
TH1* histAllMc = fAnalysisMc->CreateTrigEff(var, TE);
TGraphAsymmErrors* errorsMc = fAnalysisMc->TmpGraph();
if(!histData || !histAllMc) return NULL;
// GFHistArray mc;
// mc.AddAll(fAnalysisMc->GetHistsTmp());
// fHistManager->AddHist(histData, 0, fAnalysisData->GetPeriod());
// for(Int_t i = 0; i < mc.GetEntriesFast(); ++i){
// fHistManager->AddHistSame(mc[i], 0, 0, fAnalysisMc->GetSingleMc(i)->GetPeriod());
// }
// if(mc.GetEntriesFast() != (Int_t) fAnalysisMc->GetNumMc()){
// this->Warning("DataVsMcTrigEff", "number of single hists not matching");
// }
TH1* hLowerMC = GFHistManip::CreateAnalogHist(histAllMc, errorsMc, kFALSE);
TH1* hUpperMC = GFHistManip::CreateAnalogHist(histAllMc, errorsMc, kTRUE);
TString name(Form("effTrigMc%s%sS%d", fAnalysisMc->GetPeriod(), var, this->GetTrigger()));
GFHistManip::MakeUniqueName(name);
TH1* histAllMcClone = GFHistManip::CreateAnalog(histAllMc, name, kFALSE, kTRUE);
for(Int_t i = 0; i <= histAllMc->GetNbinsX()+1; ++i){ // under and overflow, too
if(hLowerMC && hUpperMC) {
histAllMc->SetBinError(i, FLT_MIN); // protect if no Graph
}
histData->SetBinError(i, FLT_MIN);// assuming same number of bins...
}
fHistManager->Clear();
if(hLowerMC && hUpperMC) {
fHistManager->AddHist(hUpperMC, 1);
fHistManager->AddHistSame(histAllMc, 1, 0);
} else {
fHistManager->AddHist(histAllMc, 1);
histAllMc->SetDrawOption("E");
}
fHistManager->AddHistSame(hLowerMC, 1, 0);
fHistManager->AddHistSame(histData, 1, 0);
fHistManager->AddObject(errorsData, 1, 0, "P");
TString header;
switch(TE){
case 19:
header = "DCRPh_Tc";
break;
case 31:
header = "zVtx_sig_1";
break;
case -1:
header = "DCRPh_Tc && zVtx_sig_1";
}
TLegend* leg = fHistManager->AddLegend(1, 0, header.Data(), kFALSE);
leg->AddEntry(errorsData, fAnalysisData->GetPeriod(), "LP");
leg->AddEntry(histAllMcClone, fAnalysisMc->GetPeriod(),"LF");
if(hLowerMC && hUpperMC) {
hUpperMC->SetFillStyle(1001);
hUpperMC->SetFillColor(kYellow);
hUpperMC->SetLineColor(10);
hUpperMC->SetLineWidth(1);
hLowerMC->SetFillStyle(1001);
hLowerMC->SetFillColor(10);
hLowerMC->SetLineColor(10);
hLowerMC->SetLineWidth(1);
hLowerMC->SetOption("HIST"); // some how needed ????
}
histAllMc->SetMarkerColor(kRed);
histAllMc->SetLineColor(kRed);
histAllMc->SetLineStyle(2);
histAllMcClone->SetFillColor(kYellow);
histAllMc->TAttLine::Copy(*histAllMcClone);
// if(hLowerMC && hUpperMC) hUpperMC->TAttFill::Copy(*histAllMcClone);
errorsData->SetMarkerStyle(8);
errorsData->SetMarkerSize(1.3);
const Bool_t oldDiff = fHistManager->DrawDiffStyle(kFALSE);
fHistManager->Draw();
fHistManager->DrawDiffStyle(oldDiff);
if(hLowerMC && hUpperMC) {
GFHistArray hists;
hists.Add(hUpperMC); hists.Add(histData); hists.Add(hLowerMC);
hUpperMC->SetMaximum(TMath::Max(1.01, GFHistManip::MinMaxOfHists(&hists, 1)));
hUpperMC->SetMinimum(TMath::Min(.85, GFHistManip::MinMaxOfHists(&hists, -1)));
}
if(gPad) gPad->RedrawAxis();
if(hLowerMC && hUpperMC) return hUpperMC;
else return histAllMc;
}
//____________________________________
void GFDstarXSections::DataVsMcL4EffSR(const char* var, Int_t dstar, Int_t fitModeData)
{
// comparing L4 eff in signal region
TObjArray vars;
if(var) vars.Add(new TObjString(var));
else {
vars.Add(new TObjString("pt"));
vars.Add(new TObjString("eta"));
vars.Add(new TObjString("phi"));
vars.Add(new TObjString("wGammaP"));
vars.Add(new TObjString("y"));
vars.Add(new TObjString("ptSumEt"));
vars.Add(new TObjString("nTrack"));
}
fHistManager->Clear();
for(Int_t iVar = 0; iVar < vars.GetEntriesFast(); ++iVar){
TH1* histData = fAnalysisData->CreateL4EffSR(vars[iVar]->GetName(), dstar, fitModeData);
TGraphAsymmErrors* grData = fAnalysisData->TmpGraph();
if(grData){
histData->SetMarkerStyle(8);
histData->TAttMarker::Copy(*grData);
histData->TAttLine::Copy(*grData);
}
TH1* histAllMc = fAnalysisMc->CreateL4EffSR(vars[iVar]->GetName(), dstar);
fHistManager->AddHist(histData, 0, fAnalysisData->GetPeriod(), "LP");
if(grData) fHistManager->AddObject(grData, 0, iVar, "P");
fHistManager->AddHistSame(histAllMc, 0, iVar, fAnalysisMc->GetPeriod());
fHistManager->AddHist(static_cast<TH1*>(histAllMc->Clone()), 1, "All MC");
// TLegend* leg = fHistManager->AddLegend(0, 0, NULL, kFALSE);
// leg->AddEntry(grData, fAnalysisData->GetPeriod(), "LP");
// for(Int_t j = 0; j < mc.GetEntriesFast(); ++j){ // before 'per lumi'
// fHistManager->AddHistSame(mc[j], 1, iVar, fAnalysisMc->GetSingleMc(j)->GetPeriod());
// }
}
fHistManager->SetHistsMinMax(0.8, 1.02);
fHistManager->Draw();
vars.Delete();
}
//____________________________________
void GFDstarXSections::SetTrigger(Int_t trigger)
{
fTrigger = trigger;
fAnalysisData->SetTrigger(fTrigger);
fAnalysisMc->SetTrigger(fTrigger);
if(fAnalysisOtherMc) fAnalysisOtherMc->SetTrigger(fTrigger);
fInclXsec[0] = fInclXsec[1] = 0.; // invalidate
}
//____________________________________
void GFDstarXSections::SetBatch(Bool_t yesNo)
{
fHistManager->SetBatch(yesNo);
fAnalysisData->SetBatch(yesNo);
fAnalysisMc->SetBatch(yesNo);
if(fAnalysisOtherMc) fAnalysisOtherMc->SetBatch(yesNo);
}
//____________________________________
void GFDstarXSections::SetHistPointerNull()
{
fHistNumDstar = fHistTrigEff = fHistRecEff = fHistAccept
= NULL;
fHistData1 = fHistData2 = fHistData3 = fHistMc1 = fHistMc2 = fHistMc3
= NULL;
}
//____________________________________
Double_t GFDstarXSections::NormaliseToData(TH1* histMc, GFDstarHistsAnalysisMc* mc,
Bool_t acceptOnMc) const
{
// returns scale that is used
if(!histMc || !mc) {
this->Error("NormaliseToData", "hist or GFDstarHistsAnalysisMc are missing");
return 0.;
}
Double_t xSectionMc = mc->XSectionTot(acceptOnMc).At(0);
Double_t scale = xSectionMc ? this->XSectionTot(acceptOnMc).At(0) / xSectionMc : 0.;
histMc->Scale(scale);
if(histMc->GetMaximumStored() != -1111.) histMc->SetMaximum(histMc->GetMaximum() * scale);
return scale;
}
//____________________________________
GFHistArray* GFDstarXSections::FitFractions(TH1* histXSection, GFHistArray* mcHists)
{
// fitting the fraction of which fit best to sum up 'mcHists' to 'histXSection'
// creates (!) output array with histXSection and clones (!) of mcHists!
GFHistArray* result = new GFHistArray;
result->Add(histXSection);
TArrayD fractions = fHistFracFitter.Fit(histXSection, mcHists);
TArrayD bins(*(histXSection->GetXaxis()->GetXbins())); // FIXME: if bins not variable!
TH1* sumMc = new TH1F("sumMcFitted", "AllMc", bins.GetSize()-1, bins.GetArray());
sumMc->SetOption("HIST");
sumMc->SetLineWidth(2);
result->Add(sumMc);
for(Int_t i = 0; i < mcHists->GetEntriesFast(); ++i){
TH1* h = static_cast<TH1*>((*mcHists)[i]->Clone());
h->Scale(fractions[i]);
result->Add(h);
sumMc->Add(h);
}
return result;
}
//____________________________________
void GFDstarXSections::SetMergeNBins(Int_t n)
{
fAnalysisData->GetMultiDmFitter()->SetMergeNBins(n);
fAnalysisMc->GetMultiDmFitter()->SetMergeNBins(n);
if(fAnalysisOtherMc) fAnalysisOtherMc->GetMultiDmFitter()->SetMergeNBins(n);
}
//____________________________________
void GFDstarXSections::SetLumi(const char* per)
{
// set lumi array: 99ePlus, 2000 or All are known periods
// if no period is given try to extract from file name of data
fLumi.Set(2); // [1]: S83, [0]: S84
TString period(per);
if(!per){
const TFile* dataFile = fAnalysisData->GetInFile();
if(dataFile) period = dataFile->GetName();
}
if(period.Contains("99ePlus", TString::kIgnoreCase)) period = "99ePlus";
if(period.Contains("2000")) period = "2000";
if(period.Contains("All", TString::kIgnoreCase)) period = "";
GFDstarRunPeriods p(83, period);
fLumi[1] = p.GetTotalLumi();
p.SetTrigger(84, period);
fLumi[0] = p.GetTotalLumi();
}
//____________________________________
void GFDstarXSections::SetFitOrNotFlag(Int_t flag)
{
fAnalysisData->GetMultiDmFitter()->SetFitOrNotFlag(flag);
fAnalysisMc->GetMultiDmFitter()->SetFitOrNotFlag(flag);
if(fAnalysisOtherMc) fAnalysisOtherMc->GetMultiDmFitter()->SetFitOrNotFlag(flag);
}
//____________________________________
const char* GFDstarXSections::GetUnit(const TString &titleShort) const
{
if(titleShort.Contains("[GeV]")) return "GeV";
if(titleShort.Contains("[#circ]")) return "#circ";
return NULL;
}
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.