"hRecPtEtaVzSecWeak", "hRecPtEtaVzSecMaterial", "hRecPtEtaVzFake"};
const char * AliAnalysisMultPbTrackHistoManager::kHistoDCANames[] = { "hGenDCA", "hRecDCA", "hRecDCAPrim", "hRecDCASecWeak","hRecDCASecMaterial", "hRecDCAFake"};
const char * AliAnalysisMultPbTrackHistoManager::kHistoPrefix[] = { "hGen", "hRec", "hRecPrim", "hRecSecWeak","hRecSecMaterial", "hRecFake"};
-const char * AliAnalysisMultPbTrackHistoManager::kSpeciesName[] = { "#pi+", "K+", "p", "l+", "#pi-", "K-", "#bar{p}", "l-", "Others"};
+const char * AliAnalysisMultPbTrackHistoManager::kSpeciesName[] = { "pi+", "K+", "p", "l+", "pi-", "K-", "barp", "l-", "Others"};
AliAnalysisMultPbTrackHistoManager::AliAnalysisMultPbTrackHistoManager() : AliHistoListWrapper(), fHNameSuffix(""){
}
-TH3D * AliAnalysisMultPbTrackHistoManager::GetHistoPtEtaVz(Histo_t id) {
+TH3D * AliAnalysisMultPbTrackHistoManager::GetHistoPtEtaVz(Histo_t id, Int_t particle) {
// Returns a 3D histo of Pt/eta/vtx. It it does not exist, books it.
- TH3D * h = (TH3D*) GetHisto(kHistoPtEtaVzNames[id]);
+ TString name = kHistoPtEtaVzNames[id];
+
+ if(particle >= 0) name += kSpeciesName[particle];
+
+ TH3D * h = (TH3D*) GetHisto(name.Data());
if (!h) {
- h = BookHistoPtEtaVz(kHistoPtEtaVzNames[id], Form("Pt Eta Vz distribution (%s)",kHistoPtEtaVzNames[id]));
+ h = BookHistoPtEtaVz(name.Data(), Form("Pt Eta Vz distribution (%s)",kHistoPtEtaVzNames[id]));
}
return h;
// Get range in terms of bin numners. If the float range is
// less than -11111 take the range from the first to the last bin (i.e. no
// under/over-flows)
- Int_t min1 = minEta < -11111 ? 1 : h3D ->GetYaxis()->FindBin(minEta);
- Int_t min2 = minVz < -11111 ? 1 : h3D ->GetZaxis()->FindBin(minVz) ;
+ // FIXME: UNDERFLOWS
+ Int_t min1 = minEta < -11111 ? -1 : h3D ->GetYaxis()->FindBin(minEta);
+ Int_t min2 = minVz < -11111 ? -1 : h3D ->GetZaxis()->FindBin(minVz) ;
- Int_t max1 = maxEta < -11111 ? h3D->GetNbinsY() : h3D ->GetYaxis()->FindBin(maxEta-0.00001);
- Int_t max2 = maxVz < -11111 ? h3D->GetNbinsZ() : h3D ->GetZaxis()->FindBin(maxVz -0.00001);
+ // Int_t max1 = maxEta < -11111 ? h3D->GetNbinsY() : h3D ->GetYaxis()->FindBin(maxEta-0.00001);
+ // Int_t max2 = maxVz < -11111 ? h3D->GetNbinsZ() : h3D ->GetZaxis()->FindBin(maxVz -0.00001);
+ Int_t max1 = maxEta < -11111 ? -1 : h3D ->GetYaxis()->FindBin(maxEta-0.00001);
+ Int_t max2 = maxVz < -11111 ? -1 : h3D ->GetZaxis()->FindBin(maxVz -0.00001);
TString hname = h3D->GetName();
}
+TH1D * AliAnalysisMultPbTrackHistoManager::GetHistoVzEvent(Histo_t id) {
+
+ // Returns histogram with Vz of the event
+
+ TString name = TString(kHistoPrefix[id])+"_VzEvent";
+
+ TH1D * h = (TH1D*) GetHisto(name);
+ if (!h) {
+ name+=fHNameSuffix;
+ Bool_t oldStatus = TH1::AddDirectoryStatus();
+ TH1::AddDirectory(kFALSE);
+
+ AliInfo(Form("Booking histo %s",name.Data()));
+
+ h = new TH1D (name.Data(), Form("Vz of the event (%s)",kHistoPrefix[id]), 10, -10, 10);
+ h->Sumw2();
+ h->SetXTitle("V_{z}^{event} (cm)");
+ TH1::AddDirectory(oldStatus);
+ fList->Add(h);
+
+
+ }
+ return h;
+
+
+}
+
TH1I * AliAnalysisMultPbTrackHistoManager::GetHistoStats() {
nvzbins, binsVz
);
- h->SetXTitle("p_{T}");
+ h->SetXTitle("p_{T} (GeV)");
h->SetYTitle("#eta");
- h->SetZTitle("V_{z} (cm)");
+ h->SetZTitle("V_{z}^{tracks} (cm)");
h->Sumw2();
fList->Add(h);
void SetSuffix(const char * suffix) { fHNameSuffix = suffix;}
// Histo getters
- TH3D * GetHistoPtEtaVz(Histo_t id);
+ TH3D * GetHistoPtEtaVz(Histo_t id, Int_t particle = -1);
TH1D * GetHistoPt (Histo_t id, Float_t minEta = -22222, Float_t maxEta = -22222, Float_t minVz = -22222, Float_t maxVz = -22222, Bool_t scaleWidth = kTRUE);
TH1D * GetHistoEta(Histo_t id, Float_t minPt = -22222, Float_t maxPt = -22222, Float_t minVz = -22222, Float_t maxVz = -22222, Bool_t scaleWidth = kTRUE);
TH1D * GetHistoVz (Histo_t id, Float_t minPt = -22222, Float_t maxPt = -22222, Float_t minEta = -22222, Float_t maxEta = -22222, Bool_t scaleWidth = kTRUE);
TH1D * GetHistoSpecies(Histo_t id);
TH1D * GetHistoProcess(Histo_t id);
+ TH1D * GetHistoVzEvent(Histo_t id);
+
+
// Misch utils
void ScaleHistos (Double_t nev, Option_t * option="");
fHistoManager->GetHistoStats()->Fill(AliAnalysisMultPbTrackHistoManager::kStatCentr);
+
+
if (fIsMC) {
-
+ // Get MC vertex
+ //FIXME: which vertex do I take for MC?
+ TArrayF vertex;
+ fMCEvent->GenEventHeader()->PrimaryVertex(vertex);
+ Float_t zvGen = vertex[2];
if (!fMCEvent) {
AliError("No MC info found");
fHistoManager->GetHistoProcess(AliAnalysisMultPbTrackHistoManager::kHistoGen)->Fill(mcPart->Particle()->GetUniqueID());
fHistoManager->FillParticleID(AliAnalysisMultPbTrackHistoManager::kHistoGen, mcPart);
- // Get MC vertex
- //FIXME: which vertex do I take for MC?
- TArrayF vertex;
- fMCEvent->GenEventHeader()->PrimaryVertex(vertex);
- Float_t zv = vertex[2];
// Float_t zv = vtxESD->GetZ();
// Fill generated histo
- hTracks[AliAnalysisMultPbTrackHistoManager::kHistoGen]->Fill(mcPart->Pt(),mcPart->Eta(),zv);
+ hTracks[AliAnalysisMultPbTrackHistoManager::kHistoGen]->Fill(mcPart->Pt(),mcPart->Eta(),zvGen);
+ Int_t partCode = fHistoManager->GetLocalParticleID(mcPart);
+ if (partCode == AliAnalysisMultPbTrackHistoManager::kPartPiPlus ||
+ partCode == AliAnalysisMultPbTrackHistoManager::kPartPiMinus)
+ fHistoManager->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoGen, partCode);
}
hNTracks[AliAnalysisMultPbTrackHistoManager::kHistoGen]->Fill(nPhysicalPrimaries);
-
+ fHistoManager->GetHistoVzEvent(AliAnalysisMultPbTrackHistoManager::kHistoGen)->Fill(zvGen);
+
+
}
}
// FIXME: shall I take the primary vertex?
const AliESDVertex* vtxESD = fESD->GetPrimaryVertex();
if(!vtxESD) return;
+ // FIXME: leave the cuts here or find a better place?)
+ // Quality cut on vertexer Z, as suggested by Francesco Prino
+ if(vtxESD->IsFromVertexerZ()) {
+ if (vtxESD->GetNContributors() <= 0) return;
+ if (vtxESD->GetDispersion() >= 0.04) return;
+ if (vtxESD->GetZRes() >= 0.25) return;
+ }
fHistoManager->GetHistoStats()->Fill(AliAnalysisMultPbTrackHistoManager::kStatVtx);
-
+ fHistoManager->GetHistoVzEvent(AliAnalysisMultPbTrackHistoManager::kHistoRec)->Fill(vtxESD->GetZ());
// loop on tracks
Int_t ntracks = fESD->GetNumberOfTracks();
if(IsPhysicalPrimaryAndTransportBit(label)) {
// Fill species histo
fHistoManager->GetHistoProcess(AliAnalysisMultPbTrackHistoManager::kHistoRecPrim)->Fill(mcPart->Particle()->GetUniqueID());
- if(accepted)
+ if(accepted) {
hTracks[AliAnalysisMultPbTrackHistoManager::kHistoRecPrim]->Fill(esdTrack->Pt(),esdTrack->Eta(),vtxESD->GetZ());
+ Int_t partCode = fHistoManager->GetLocalParticleID(mcPart);
+ if (partCode == AliAnalysisMultPbTrackHistoManager::kPartPiPlus ||
+ partCode == AliAnalysisMultPbTrackHistoManager::kPartPiMinus)
+ fHistoManager->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRecPrim, partCode);
+ }
if(acceptedNoDCA)
hDCA[AliAnalysisMultPbTrackHistoManager::kHistoRecPrim]->Fill(weightedDCA);
}
// cout << classes.Data() << endl;
// }
// iter->Reset();
- Int_t itoken = 0;
+ //Int_t itoken = 0;
TObjString * tok=0;
while((tok = (TObjString*) iter->Next())){
// clean up trigger name
TIterator * iter = listToLoad->MakeIterator();
TObjString * name = 0;
TString sources = "";
- while (name = (TObjString *)iter->Next()) {
- gSystem->ExpandPathName(name->String());
- name->String().ReplaceAll("+","");
- sources = sources + name->String() + " ";
- }
// while (name = (TObjString *)iter->Next()) {
// gSystem->ExpandPathName(name->String());
- // name->String().ReplaceAll("+","");
- // sources = sources + gSystem->BaseName(name->String().Data()) + " ";
+ // name->String().ReplaceAll("+","");
+ // sources = sources + name->String() + " ";
// }
+ while (name = (TObjString *)iter->Next()) {
+ gSystem->ExpandPathName(name->String());
+ name->String().ReplaceAll("+","");
+ sources = sources + gSystem->BaseName(name->String().Data()) + " ";
+ }
plugin->SetAnalysisSource(sources.Data());
// Declare all libraries (other than the default ones for the framework. These will be
// loaded by the generated analysis macro. Add all extra files (task .cxx/.h) here.
// plugin->SetAdditionalLibs("AliCollisionsNormalization.cxx AliCollisionNormalizationTask.cxx AliPhysicsSelection.cxx AliCollisionsNormalization.h AliCollisionNormalizationTask.h AliPhysicsSelection.h");
- iter = listToLoad->MakeIterator();
- name = 0;
- sources = "";
+ // iter = listToLoad->MakeIterator();
+ // name = 0;
+ // sources = "";
// while (name = (TObjString *)iter->Next()) {
// gSystem->ExpandPathName(name->String());
// name->String().ReplaceAll("+","");
// sources = sources + gSystem->BaseName(name->String().Data()) + " ";
// }
- while (name = (TObjString *)iter->Next()) {
- gSystem->ExpandPathName(name->String());
- name->String().ReplaceAll("+","");
- sources = sources + name->String() + " ";
- }
+ // while (name = (TObjString *)iter->Next()) {
+ // gSystem->ExpandPathName(name->String());
+ // name->String().ReplaceAll("+","");
+ // sources = sources + name->String() + " ";
+ // }
plugin->SetAdditionalLibs(sources.Data());
// I'm using a modified ANALYSISalice package, so I need to load par files for everything
// plugin->EnablePackage("STEERBase");
#include "AliPhysicsSelection.h"
#include "AliESDtrackCuts.h"
#include "AliAnalysisMultPbCentralitySelector.h"
+#include "TLegend.h"
using namespace std;
// Some shorthands
// FIXME: Gen should be projected including overflow in z?
- TH1D * hDataPt = (TH1D*) hManData->GetHistoPt(AliAnalysisMultPbTrackHistoManager::kHistoRec, -0.5,0.5,-10,10)->Clone("hDataPt");
- TH1D * hMCPtGen = hManCorr->GetHistoPt(AliAnalysisMultPbTrackHistoManager::kHistoGen, -0.5,0.5,-10,10);
- TH1D * hMCPtRec = hManCorr->GetHistoPt(AliAnalysisMultPbTrackHistoManager::kHistoRec, -0.5,0.5,-10,10);
- TH1D * hMCPtPri = hManCorr->GetHistoPt(AliAnalysisMultPbTrackHistoManager::kHistoRecPrim, -0.5,0.5,-10,10);
- TH1D * hMCPtSeM = hManCorr->GetHistoPt(AliAnalysisMultPbTrackHistoManager::kHistoRecSecMat, -0.5,0.5,-10,10);
- TH1D * hMCPtSeW = hManCorr->GetHistoPt(AliAnalysisMultPbTrackHistoManager::kHistoRecSecWeak, -0.5,0.5,-10,10);
- TH1D * hMCPtFak = hManCorr->GetHistoPt(AliAnalysisMultPbTrackHistoManager::kHistoRecFake, -0.5,0.5,-10,10);
+ Float_t zmin = 0;
+ Float_t zmax = 2;
+ TH1D * hDataPt = (TH1D*) hManData->GetHistoPt(AliAnalysisMultPbTrackHistoManager::kHistoRec, -0.5,0.5,zmin,zmax)->Clone("hDataPt");
+ TH1D * hMCPtGen = hManCorr->GetHistoPt(AliAnalysisMultPbTrackHistoManager::kHistoGen, -0.5,0.5,-22222,-22222);
+ TH1D * hMCPtRec = hManCorr->GetHistoPt(AliAnalysisMultPbTrackHistoManager::kHistoRec, -0.5,0.5,zmin,zmax);
+ TH1D * hMCPtPri = hManCorr->GetHistoPt(AliAnalysisMultPbTrackHistoManager::kHistoRecPrim, -0.5,0.5,zmin,zmax);
+ TH1D * hMCPtSeM = hManCorr->GetHistoPt(AliAnalysisMultPbTrackHistoManager::kHistoRecSecMat, -0.5,0.5,zmin,zmax);
+ TH1D * hMCPtSeW = hManCorr->GetHistoPt(AliAnalysisMultPbTrackHistoManager::kHistoRecSecWeak, -0.5,0.5,zmin,zmax);
+ TH1D * hMCPtFak = hManCorr->GetHistoPt(AliAnalysisMultPbTrackHistoManager::kHistoRecFake, -0.5,0.5,zmin,zmax);
TCanvas * cdata = new TCanvas ("cData", "Data");
cdata->SetLogy();
hMCPtSeM ->Draw("same");
hMCPtSeW ->Draw("same");
hMCPtFak ->Draw("same");
+
+ hMCPtGen ->GetXaxis()->SetRangeUser(0,4.5);
+ hMCPtGen ->GetYaxis()->SetRangeUser(0.1,1e4);
+ TLegend * lMC = new TLegend(0.505034, 0.59965, 0.877517, 0.926573,"Monte Carlo");
+ lMC->AddEntry( hMCPtGen, "Generated");
+ lMC->AddEntry( hMCPtRec, "All Rec");
+ lMC->AddEntry( hMCPtPri, "Rec Primaries");
+ lMC->AddEntry( hMCPtSeM, "Rec Sec. Material");
+ lMC->AddEntry( hMCPtSeW, "Rec Sec. Weak");
+ lMC->AddEntry( hMCPtFak, "Rec Fakes");
+ lMC->Draw();
+
cout << "Fake/All Rec = " << hMCPtFak->Integral()/hMCPtRec->Integral() << endl;
cout << "SM/All Rec = " << hMCPtSeM->Integral()/hMCPtRec->Integral() << endl;
// PRIM_DATA = ALL_DATA - SEC_MC/ALL_MC*ALL_DATA - FAK_MC/ALL_MC*ALL_DATA
// TRUE_DATA = PRIM_DATA * GEN_MC/PRIM_MC
+
TH1D * hEffPt = (TH1D*) hMCPtPri->Clone("hEffPt");
hEffPt->Divide(hMCPtPri,hMCPtGen,1,1,"B");
- TH1D * hCorSeM = (TH1D*) hMCPtSeM->Clone("hEffPt");
+ TH1D * hCorSeM = (TH1D*) hMCPtSeM->Clone("hCorSeM");
hCorSeM->Divide(hMCPtSeM,hMCPtRec,1,1,"B");
hCorSeM->Scale(fractionMaterial);// rescale material correction
- hCorSeM->Multiply(hDataPt);
+ hCorSeM->Multiply(hDataPt);
- TH1D * hCorSeW = (TH1D*) hMCPtSeW->Clone("hEffPt");
+ TH1D * hCorSeW = (TH1D*) hMCPtSeW->Clone("hCorSeW");
hCorSeW->Divide(hMCPtSeW,hMCPtRec,1,1,"B");
hCorSeW->Scale(fractionWeak);// rescale weak correction
hCorSeW->Multiply(hDataPt);
- TH1D * hCorFak = (TH1D*) hMCPtFak->Clone("hEffPt");
+ TH1D * hCorFak = (TH1D*) hMCPtFak->Clone("hCorFak");
hCorFak->Divide(hMCPtFak,hMCPtRec,1,1,"B");
hCorFak->Multiply(hDataPt);
hCorrected->Divide(hEffPt);
hCorrected->SetMarkerStyle(kOpenStar);
+
+ TCanvas * cCorrections = new TCanvas("cCorrections", "cCorrections");
+
+ hEffPt->Draw();
+ // hCorSeM->Draw();
+ // hCorSeM->SetLineColor(kRed);
+ // hCorSeM->SetMarkerColor(kRed);
+ // hMCPtSeM->Draw("same");
+ // hCorSeW->Draw("same");
+ // hCorSeW->SetLineColor(kRed);
+ // hCorSeW->SetMarkerColor(kRed);
+ // hMCPtSeW->Draw("same");
+
+
cdata->cd();
hDataPt->Draw();
+ hDataPt ->GetXaxis()->SetRangeUser(0,4.5);
+ hDataPt ->GetYaxis()->SetRangeUser(0.1,1e4);
hCorrected->SetLineColor(kBlack);
hCorrected->SetMarkerColor(kBlack);
hCorrected->Draw("same");
TF1 * f = GetLevy();
hCorrected->Fit(f,"", "same");
hCorrected->Fit(f,"IME", "same");
- cout << "dN/deta = " << f->Integral(0,100) << " +- " << f->IntegralError(0,100) << endl;
+ cout << "dN/deta (function) = " << f->Integral(0,100) << " +- " << f->IntegralError(0,100) << endl;
+ cout << "dN/deta (func+data) = " << f->Integral(0,0.1) + hCorrected->Integral(3,-1,"width") << endl;//
cout << "Generated dN/deta (correction) = " << hMCPtGen->Integral("width") << endl;
// FIXME: comment this out
- TH1D * hDataGen = hManData->GetHistoPt(AliAnalysisMultPbTrackHistoManager::kHistoGen, -0.5,0.5,-10,10);
+ TH1D * hDataGen = hManData->GetHistoPt(AliAnalysisMultPbTrackHistoManager::kHistoGen, -0.5,0.5,-22222,-22222);
cout << "Generated dN/deta (data) = " << hDataGen->Integral("width") << endl;
- hDataGen->Draw("same");
+ hDataGen->Draw("same");
+ TLegend * l = new TLegend(0.520134, 0.676573, 0.885906, 0.923077,"137161, p1+++");
+ l->AddEntry(hDataPt, "Raw data");
+ l->AddEntry(hCorrected, "Corrected data");
+ l->AddEntry(hMCPtGen, "Monte Carlo (generated)");
+ l->AddEntry(f, "Levy Fit");
+ l->Draw();
}
void CheckSecondaries(Double_t &fracWeak, Double_t &fracMaterial) {
doSave = kTRUE;
}
- AliESDtrackCuts * cuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(kTRUE);
+ AliESDtrackCuts * cuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(kFALSE);
+ // AliESDtrackCuts * cuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(kTRUE);
TString pathsuffix = "";
// cuts->SetPtRange(0.15,0.2);// FIXME pt cut
// const char * pathsuffix = "_pt_015_020_nofakes";