// Author: Gero Flucke <mailto:flucke@mail.desy.de>
//____________________________________
// GFDstarHistsAnalysisData
// Author: Gero Flucke
// Date: June 2nd, 2002
// last update: $Date: 2005/06/13 15:10:07 $
// by: $Author: flucke $
//
#include <iostream>
#include <TFile.h>
#include <TH1.h>
#include <TH2.h>
#include <TGraphAsymmErrors.h>
#include <TString.h>
#include <TAxis.h>
#include <TCanvas.h>
#include <TObjArray.h>
#include "GFAnalysis/GFDstarHistsAnalysisData.h"
#include "GFAnalysis/GFAxisVariables.h"
#include "GFUtils/GFHistManager.h"
#include "GFUtils/GFHistArray.h"
#include "GFUtils/GFHistManip.h"
#include "GFUtils/GFMath.h"
#include "GFAnalysis/GFDstarCount.h"
#include "/afs/desy.de/user/f/flucke/h1/root/DstarDmFitter/DstarDmFitter.h"
using namespace std;
ClassImp(GFDstarHistsAnalysisData)
GFDstarHistsAnalysisData::GFDstarHistsAnalysisData(const char* dataFileIn)
: GFDstarHistsAnalysis(dataFileIn), fL4Eff(2)
{
// fPeriod = "Data";
TString file(dataFileIn);
fPeriod = "Data";
if(file.Contains("2000")) fPeriod += ": 2000";
if(file.Contains("99ePlus")) fPeriod += ": 99e+";
}
//____________________________________
GFDstarHistsAnalysisData::GFDstarHistsAnalysisData(const char* prefix,
const char* period)
: GFDstarHistsAnalysis(prefix, period), fL4Eff(2)
{
TString periodString(period);
fPeriod = "Data";
if(periodString.Contains("2000")) fPeriod += ": 2000";
if(periodString.Contains("99ePlus")) fPeriod += ": 99e+";
}
//____________________________________
GFDstarHistsAnalysisData::~GFDstarHistsAnalysisData()
{
// no further clean up necessary!
}
//____________________________________
void GFDstarHistsAnalysisData::SetTrigger(Int_t trigger)
{
if(fTrigger != trigger){
fL4Eff[0] = fL4Eff[1] = 0.;
}
this->GFDstarHistsAnalysis::SetTrigger(trigger);
}
//____________________________________
TArrayD GFDstarHistsAnalysisData::DrawDmFitWc()
{
// var: pt, eta, phi, wGammaP
fHistManager->Clear();
TH1* h = this->GetHistPtCut();
TH1* hWc = this->GetHistPtCutWc();
// const Int_t fitModeAll = fMultiDmFitter->GetFitModeAll();
// fMultiDmFitter->SetFitModeAll(-1);
// fDstarFitter->Fit(-1, hist1);
TArrayD array = fMultiDmFitter->FitAll(h, hWc);
fHistManager->AddHist(h);
h->SetOption("e");
fHistManager->Draw();
return array;
}
//____________________________________
TH1* GFDstarHistsAnalysisData::DrawDmFitWc(const char* var)
{
// var: pt, eta, phi, wGammaP
fHistManager->Clear();
fHist2D = this->GetHist2D(var);
TH2* hist2DWc = this->GetHist2DWc(var);
fHist1D = this->GetHistPtCut();
return this->DrawDmVariable(GFAxisVariables::GetAxisLabel(var),
hist2DWc, this->GetHistPtCutWc());
}
//____________________________________
void GFDstarHistsAnalysisData::DrawDmWc(Option_t* drawOpt)
{
// fDstarFitter->ResetFitParameters();
fHistManager->Clear();
TH1* hist1 = this->GetHistPt1CutWc();
TH1* hist2 = this->GetHistPt2CutWc();
const Int_t fitModeAll = fMultiDmFitter->GetFitModeAll();
fMultiDmFitter->SetFitModeAll(-1);
// fDstarFitter->Fit(-1, hist1);
fMultiDmFitter->FitAll(hist1);
fHistManager->AddHist(hist1);
// fDstarFitter->Fit(-1, hist2);
fMultiDmFitter->FitAll(hist2);
fHistManager->AddHist(hist2);
fHistManager->SetHistsOption(drawOpt);
fHistManager->SetHistsXTitle("m(K#pi#pi_{s}) - m(K#pi) [GeV]");
fHistManager->Draw();
this->SetHistPointerNull();
fMultiDmFitter->SetFitModeAll(fitModeAll);
}
//____________________________________
TH1* GFDstarHistsAnalysisData::DrawAccept(const char* varName)
{
// // Pt,Phi,Eta,WgammaP
fHistNumDstar = this->GetHistAcceptNom(varName);
fHist1D = this->GetHistAccept(varName);
if(!fHist1D || !fHistNumDstar || fHist1D->GetDimension() != fHistNumDstar->GetDimension()){
return NULL;
}
fHistManager->Clear();
if(fHist1D->GetDimension() == 2){
TH1* hRef = this->GetHistPtCut();
fHistNumDstar = fMultiDmFitter->Fit(static_cast<TH2*>(fHistNumDstar), hRef);
fHistManager->AddHists(fMultiDmFitter->GetHists1D(), 4);
fHistManager->AddHist(fMultiDmFitter->GetHistSignalBack(), 4);
// fMultiDmFitter->GetHists1D()->Delete();
// delete fMultiDmFitter->GetHistSignalBack();
fHist1D = fMultiDmFitter->Fit(static_cast<TH2*>(fHist1D), hRef);
fHistManager->AddHists(fMultiDmFitter->GetHists1D(), 5);
fHistManager->AddHist(fMultiDmFitter->GetHistSignalBack(), 5);
// fMultiDmFitter->GetHists1D()->Delete();
// delete fMultiDmFitter->GetHistSignalBack();
}
TString name("acceptance");
this->MakeStringName((name+=varName)+=fTrigger);
// this->DeleteObject(name);
fHistManager->AddHist(static_cast<TH1*>(fHistNumDstar->Clone(name+"Num")));
fHistNumDstar->Divide(fHist1D);
TString title("#bar{A_{ET");
fHistNumDstar->SetTitle(title += (fTrigger == 83 ? "33}}" : "44}}"));
fHistNumDstar->SetXTitle(GFAxisVariables::GetAxisLabel(varName));
fHistManager->AddHist(fHist1D);
TAxis* helpXaxis = fHistNumDstar->GetXaxis();
// this->DeleteObject(name+="Total");
fHist1D = new TH1F(name, title+=" (total)", 1,
helpXaxis->GetBinLowEdge(helpXaxis->GetFirst()),
helpXaxis->GetBinUpEdge(helpXaxis->GetLast()));
TArrayD acceptErr = this->TotalAccept();
fHist1D->SetBinContent(1, acceptErr[0]);
fHist1D->SetBinError(1, acceptErr[1]);
// fHist1D->SetDrawOption("E2");
// fHist1D->SetFillColor(kYellow);
fHist1D->SetLineColor(kRed);
fHistManager->AddHist(fHistNumDstar,1, "bins");
fHistManager->AddHistSame(fHist1D,1, 0, "mean");
fHistManager->Draw();
TH1* h = fHistNumDstar;
this->SetHistPointerNull();
title = "tagger acceptance from Data in bins of ";
this->PrintTable(h, title += varName);
return h;
}
//________________________________________________
TH1* GFDstarHistsAnalysisData::CreateTrigEff(const char* variable, Int_t TE)
{
// pt eta phi wGammaP y, TE 19, 31 or other (other == 19 && 31)
TString var(variable);
TString numTE;
if(TE>=0) numTE += TE; else numTE += "19+31";
TH1* hAll = this->GetHist(var+"HistNonTrig");
TH1* hTriggered = this->GetHist(TE==-1?var+"HistTrig":var+"HistTrig"+numTE);
if(!hAll || ! hTriggered) return NULL;
fHistManager->Clear();
fHistManager->AddHist(hTriggered);
fHistManager->AddHist(hAll);
TString effHistName("effTE");
if(TE >= 0) effHistName += numTE;
else effHistName += "19+31";
this->MakeStringName((effHistName+=var).operator+=(fTrigger));
TGraphAsymmErrors *grPtr = NULL;
TH1* hEff = GFHistManip::CreateRatioBinomErrors(hTriggered, hAll, NULL, NULL, NULL, &grPtr);
if(hEff){
hEff->SetName(effHistName);
} else {
this->Warning("CreateTrigEff", "Cannot do correct errors from binomial!");
hEff = static_cast<TH1*>(hTriggered->Clone(effHistName));
hEff->Reset();
if(hEff->GetSumw2N() == 0) hEff->Sumw2();
hEff->Divide(hTriggered, hAll, 1., 1., "B");
}
hEff->SetXTitle(GFAxisVariables::GetAxisLabel(variable));
TString title("#epsilon_{trig}, TE ");
title += numTE;
hEff->SetTitle(title);
hEff->SetYTitle("#epsilon_{trig}");
fHistManager->AddHist(hEff, 1);
if(grPtr){
// hEff->SetOption("HIST");
hEff->TAttLine::Copy(*grPtr);
hEff->TAttMarker::Copy(*grPtr);
fHistManager->AddObject(grPtr, 1, 0, "P");
}
this->TmpGraph(grPtr);
fHistManager->Draw();
hEff->SetDrawOption("HIST");
this->CheckTrigEff(hEff, TE);
((title += " from ")+=fPeriod) += " in bins of ";
this->PrintTable(hEff, title+=variable);
return hEff;
}
//____________________________________
TH1* GFDstarHistsAnalysisData::CreateDedxEff(const char* var)
{
//pt,eta,phi,ptSumEt,wGammaP,y,nTrack
TH1* hRef = this->GetHistPtCut();
TH2* hAll2D = static_cast<TH2*>(this->GetHist(Form("%sHisteffDedx", var), "effDedx"));
TH2* hSurvive2D = this->GetHist2D(var);
if(!hRef || !hSurvive2D || !hAll2D) return NULL;
fHistManager->Clear();
hSurvive2D->SetYTitle(var);// also for title in single hists!
TH1* hSurvive = fMultiDmFitter->Fit(hSurvive2D, hRef);
fHistManager->AddHists(fMultiDmFitter->GetHists1D(),0);
fHistManager->AddHist(fMultiDmFitter->GetHistSignalBack(),0);
fHistManager->AddHist(hSurvive2D,0);
hAll2D->SetYTitle(var);// also for title in single hists!
TH1* hAll = fMultiDmFitter->Fit(hAll2D, hRef);
fHistManager->AddHists(fMultiDmFitter->GetHists1D(),1);
fHistManager->AddHist(fMultiDmFitter->GetHistSignalBack(),1);
fHistManager->AddHist(hAll2D,1);
TH1* hEff = GFHistManip::CreateRatioGassnerErrors(hSurvive, hAll);
hEff->SetTitle(Form("#epsilon_{dEdx};%s", GFAxisVariables::GetAxisLabel(var)));
fHistManager->AddHist(hEff, 2);
fHistManager->Draw();
return hEff;
}
//____________________________________
TH1* GFDstarHistsAnalysisData::CreateDedxEff2(const char* var)
{
// Theta, Length, Nhit, PK, P + K, Pi
TH1* hRef = this->GetHistPtCut();
TH2* hAll2D = static_cast<TH2*>(this->GetHist(Form("%sDedxEffRef", var),
"effDedx"));
TH2* hSurvive2D = static_cast<TH2*>(this->GetHist(Form("%sDedxEff", var),
"effDedx"));
TH2* tmp = hAll2D;
hAll2D = hSurvive2D;
hSurvive2D = tmp;
if(!hRef || !hSurvive2D || !hAll2D) return NULL;
fHistManager->Clear();
hSurvive2D->SetYTitle(var);// also for title in single hists!
TH1* hSurvive = fMultiDmFitter->Fit(hSurvive2D, hRef);
fHistManager->AddHists(fMultiDmFitter->GetHists1D(),0);
fHistManager->AddHist(fMultiDmFitter->GetHistSignalBack(),0);
fHistManager->AddHist(hSurvive2D,0);
hAll2D->SetYTitle(var);// also for title in single hists!
TH1* hAll = fMultiDmFitter->Fit(hAll2D, hRef);
fHistManager->AddHists(fMultiDmFitter->GetHists1D(),1);
fHistManager->AddHist(fMultiDmFitter->GetHistSignalBack(),1);
fHistManager->AddHist(hAll2D,1);
TH1* hEff = GFHistManip::CreateRatioGassnerErrors(hSurvive, hAll);
hEff->SetTitle(Form("#epsilon_{dEdx};%s", GFAxisVariables::GetAxisLabel(var)));
fHistManager->AddHist(hEff, 2);
fHistManager->Draw();
return hEff;
}
//____________________________________
void GFDstarHistsAnalysisData::DrawTrigRefVsDm(const char* varName)
{
const Bool_t oldBatch = fHistManager->SetBatch(kTRUE);
const Double_t scaleAll = this->DrawDm().At(0);
TH1* hAll = this->DrawDm(varName, kFALSE); // not per bin width!
TH1* hTrigRef = this->GetHist(Form("%sHistNonTrig", varName));
fHistManager->SetBatch(oldBatch);
if(!hTrigRef || !hAll) return;
const Double_t scaleTrig = hTrigRef->GetEntries();
GFHistManip::Scale(hTrigRef, scaleTrig ? 1./scaleTrig : 0.);
GFHistManip::Scale(hAll, scaleAll ? 1./scaleAll : 0.);
fHistManager->AddHist(hAll, 5, "All");
fHistManager->AddHistSame(hTrigRef, 5, 0, "trigger reference");
fHistManager->Draw();
}
//________________________________________________
void GFDstarHistsAnalysisData::CheckTrigEff(TH1* hEff, Int_t TE)
{
for(Int_t bin = 1; bin <= hEff->GetNbinsX(); ++bin){
if(!hEff->GetBinError(bin)){
//FIXME:
this->Warning("CheckTrigEff", "error = 0 in bin %d!", bin);
// TArrayD ar = this->TotalTrigEff(TE);
// Double_t oldCont = hEff->GetBinContent(bin);
// hEff->SetBinContent(bin, (ar[0]+oldCont)/2.);
// hEff->SetBinError(bin, TMath::Abs(ar[0]-oldCont)/2.);
// this->Warning("CheckTrigEff", "Set EffTrig from %f to %f in bin %d!",
// oldCont, (ar[0]+oldCont)/2., bin);
}
}
}
//________________________________________________
TArrayD GFDstarHistsAnalysisData::TotalTrigEff(Int_t TE)
{
TString numTE;
if(TE != -1) numTE += TE;
const Int_t numTrig = (Int_t)this->GetHist(TString("etaHistTrig")+=numTE)->Integral();
const Int_t numAll = (Int_t)this->GetHist("etaHistNonTrig")->Integral();
TArrayD result(4);
result[0] = numAll ? numTrig/((Double_t)numAll) : 0.;
result[1] = numAll ? TMath::Sqrt(result[0] * (1.- result[0])/numAll) : 0.;
result[2] = GFMath::BinomialError(numTrig, numAll, kTRUE); // up
result[3] = -GFMath::BinomialError(numTrig, numAll, kFALSE);// down
TString text("Total trigger eff. from data ");
if(TE != -1) (text += "(TE ") += numTE += ") ";
this->PrintPlusMinus(result, text += fPeriod);
return result;
}
//________________________________________________
TArrayD GFDstarHistsAnalysisData::TotalAccept()
{
// error like in Dirks Diploma thesis!
TArrayD result(2);
TH1* hNom = this->GetHistAcceptNom("eta");
TH1* histOfWeights = this->GetHistAccept("eta");
if(histOfWeights->GetDimension() == 2 && hNom->GetDimension() == 2){
TH1* hNom1D = static_cast<TH2*>(hNom)->ProjectionX(hNom->GetName());
TH1* histOfWeights1D = static_cast<TH2*>(histOfWeights)
->ProjectionX(histOfWeights->GetName(), -1, -1, "E");
TString oldFitOption = fMultiDmFitter->GetDstarDmFitter()->GetFitOption();
TString newFitOption = oldFitOption.ReplaceAll("L", NULL).ReplaceAll("l", NULL);
fMultiDmFitter->GetDstarDmFitter()->SetFitOption(newFitOption);
const TArrayD totalPlusErr = fMultiDmFitter->FitAll(hNom1D);
const TArrayD sumWeightsPlusErr = fMultiDmFitter->FitAll(histOfWeights1D);
fMultiDmFitter->GetDstarDmFitter()->SetFitOption(oldFitOption);
result = GFMath::EfficiencyGassnerError(totalPlusErr[0], sumWeightsPlusErr[0],
totalPlusErr[1], sumWeightsPlusErr[1]);
} else {
Double_t totalNum = hNom->GetEntries();
Double_t sumWeights = histOfWeights->Integral();
Double_t sumWeightsSquare = 0.;
for(Int_t i = 1; i <= histOfWeights->GetSumw2N(); ++i){
const Double_t error = histOfWeights->GetBinError(i);
sumWeightsSquare += (error*error);
}
result[0] = sumWeights ? totalNum/sumWeights : 0;
result[1] = sumWeights ? ((result[0] * sumWeightsSquare / (sumWeights * sumWeights))
- 1. /sumWeights) * result[0] : 0.;
result[1] = TMath::Sqrt(result[1]);
}
this->PrintPlusMinus(result, "Total acceptance from data");
return result;
}
//________________________________________________
TArrayD GFDstarHistsAnalysisData::L4Efficiency(Int_t mode)
{
// only mode = 0: total eff from overall D* sample
// foreseen: D* + 1 jet (Back, Forw, all)
if(mode != 0){
this->Warning("L4Efficiency", "Only mode 0 supported, request is %d", mode);
} else if(fL4Eff[0]){
return fL4Eff;
}
// DstarDmFitter dstarFitter;
fHistManager->Clear();
TH1* dmHist = this->GetHistPtCut();
// dstarFitter.FitAll(dmHist);
fMultiDmFitter->FitAll(dmHist);
// D*-wise calculation
TH1* histAll = this->GetHist("L4effDstar");
TH1* histL4Found = this->GetHist("L4effDstarTrig");
TArrayD numDstarErr = fMultiDmFitter->FitSingle(histL4Found, NULL);
TArrayD numDstarErrAll = fMultiDmFitter->FitSingle(histAll, NULL);
fHistManager->AddHist(histL4Found);
fHistManager->AddHist(histAll);
fHistManager->SetHistsOption("e");
// signal region
Double_t signal = this->CountSignal(histAll, kFALSE).At(0); // no background subtraction
Double_t signalL4Found = this->CountSignal(histL4Found, kFALSE).At(0);// dito
TArrayD result(2);
result[0] = signalL4Found/signal;
result[1] = TMath::Sqrt(result[0] * (1-result[0]) / signal);
this->PrintPlusMinus(result, "L4-efficiency counting SR (NOT USED)");
// all delta m
// signal = histAll->GetEntries();
// signalL4Found = histL4Found->GetEntries();
// Double_t resultAllDm = signalL4Found/signal;
// cout << "D* L4 eff.:n up to delta m = " << kStartDmBackgr << ": "
// << result[0] << "+-" << result[1]
// << ",n all delta m : " << resultAllDm << "+-"
// << TMath::Sqrt(resultAllDm * (1-resultAllDm) / signal)
// << endl;
// event wise calculation
// histAll = this->GetHist("L4effEvent");
// histL4Found = this->GetHist("L4effEventTrig");
// histL4Found->Divide(histL4Found, histAll,1., 1., "B");
// result[0] = histL4Found->GetBinContent(1);
// result[1] = histL4Found->GetBinError(1);
fHistManager->SetHistsXTitle("m(K#pi#pi_{s}) - m(K#pi) [GeV]");
fHistManager->Draw();
result = GFMath::X1ThroughX2CorrErr(numDstarErr[0], numDstarErrAll[0],
numDstarErr[1], numDstarErrAll[1]);
this->PrintPlusMinus(result, "L4-efficiency from fit via 100% corr error (NOT USED)");
result = GFMath::EfficiencyTestError(numDstarErr[0], numDstarErrAll[0],
numDstarErr[1], numDstarErrAll[1]);
this->PrintPlusMinus(result, "L4-efficiency from fit test error (NOT USED)");
result = GFMath::X1ThroughX2BinomErr(numDstarErr[0], numDstarErrAll[0]);
this->PrintPlusMinus(result, "L4-efficiency from fit via binom error (NOT USED)");
result = GFMath::EfficiencyGassnerError(numDstarErr[0], numDstarErrAll[0],
numDstarErr[1], numDstarErrAll[1]);
this->PrintPlusMinus(result, "L4-efficiency from fit Gassner error (NOT USED)");
result = GFMath::EfficiencyBlobelError(numDstarErr[0], numDstarErrAll[0],
numDstarErr[1], numDstarErrAll[1]);
this->PrintPlusMinus(result, "L4-efficiency from fit Blobel error (USED)");
// if(result[0] > 1.){
// this->Info("L4Efficiency", "changing result (not error) from %f to 1.", result[0]);
// result[0] = 1.;
// }
this->Info("L4Efficiency", "changing result 'by hand'");
result[0] = 0.98;
result[1] = 0.98 * 0.02;
this->PrintPlusMinus(result, "L4-efficiency 'by hand' (REALLY USED)");
fL4Eff[0] = result[0];
fL4Eff[1] = result[1];
return result;
}
//____________________________________
void GFDstarHistsAnalysisData::DrawYresolution(const char* var) // Pt, Eta, Phi, WgammaP, Yjb, Ytag
{
if(fTrigger != 83) {
this->Warning("DrawYresolution", "Doesn't work for trigger %d", fTrigger);
return;
}
this->GFDstarHistsAnalysis::DrawYresolution(var);
}
//________________________________________________
TH1* GFDstarHistsAnalysisData::GetHistPt1CutWc()
{
return this->GetHist("dmHist1Wc");
}
//________________________________________________
TH1* GFDstarHistsAnalysisData::GetHistPt2CutWc()
{
return this->GetHist("dmHist2Wc");
}
//________________________________________________
TH1* GFDstarHistsAnalysisData::GetHistPtCutWc()
{
// gives histPt1/Cut or ptHist2Cut corresponding to trigger!
return this->GetTrigger() == 83 ? this->GetHistPt2CutWc()
: this->GetHistPt1CutWc();
}
//________________________________________________
TH2* GFDstarHistsAnalysisData::GetHist2DWc(const char* variable)
{
// "eta", "pt", "phi" or "wGammaP"
TString var(variable);
return static_cast<TH2*>(this->GetHist(var+="Hist2DWc"));
}
//________________________________________________
TH1* GFDstarHistsAnalysisData::GetHistAccept(const char* variable)
{
// "eta", "pt", "phi" or "WgammaP", etc.
// old:"Eta", "Pt", "Phi" or "WgammaP"
if(fTrigger != 83 && fTrigger != 84){
this->Warning("GetHistAccept",
"Acceptance histogram for fTrigger = %d senseless",fTrigger);
}
TH1* result = this->GetHist(TString(variable)+="HistAccept", "accept");
if(!result){
// old name
this->Info("GetHistAccept", "%s, try old name", variable);
TString var(variable);
if(var == "pt") var = "Pt";
else if(var == "eta") var = "Eta";
else if(var == "phi") var = "Phi";
else if(var == "wGammaP") var = "WgammaP";
return this->GetHist(TString("acceptHist")+=var);
}
return result;
}
//________________________________________________
TH1* GFDstarHistsAnalysisData::GetHistAcceptNom(const char* variable)
{
// "eta", "pt", "phi" or "WgammaP", etc.
// old:"Eta", "Pt", "Phi" or "WgammaP"
if(fTrigger != 83 && fTrigger != 84){
this->Warning("GetHistAcceptNom",
"Acceptance histogram for fTrigger = %d senseless",fTrigger);
}
TH1* result = this->GetHist(TString(variable)+="HistAcceptNom", "accept");
if(!result){
// old name
this->Info("GetHistAcceptNom", "%s, try old name", variable);
TString var(variable);
if(var == "pt") var = "Pt";
else if(var == "eta") var = "Eta";
else if(var == "phi") var = "Phi";
else if(var == "wGammaP") var = "WgammaP";
return this->GetHist(TString("acceptHistNom")+=var);
}
return result;
}
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.