3 #include "dNdEtaAnalysis.h"
11 #include <TCollection.h>
12 #include <TIterator.h>
16 #include "AlidNdEtaCorrection.h"
17 #include "AliPWG0Helper.h"
19 //____________________________________________________________________
20 ClassImp(dNdEtaAnalysis)
22 //____________________________________________________________________
23 dNdEtaAnalysis::dNdEtaAnalysis(Char_t* name, Char_t* title) :
32 fData = new TH3F(Form("%s_analysis", name),"dNdEtaAnalysis",80,-20,20,120,-6,6,100, 0, 10);
33 fData->SetXTitle("vtx z [cm]");
34 fData->SetYTitle("#eta");
35 fData->SetZTitle("p_{T}");
37 fDataUncorrected = dynamic_cast<TH3F*> (fData->Clone(Form("%s_analysis_uncorrected", name)));
38 fVtx = dynamic_cast<TH1D*> (fData->Project3D("x"));
40 fdNdEta[0] = dynamic_cast<TH1D*> (fData->Project3D("y"));
41 for (Int_t i=1; i<kVertexBinning; ++i)
43 fdNdEta[i] = dynamic_cast<TH1D*> (fdNdEta[0]->Clone(Form("%s_%d", fdNdEta[0]->GetName(), i)));
44 fdNdEta[i]->SetYTitle("dN/d#eta");
51 //____________________________________________________________________
52 dNdEtaAnalysis::~dNdEtaAnalysis()
59 delete fDataUncorrected;
65 for (Int_t i=0; i<kVertexBinning; ++i)
72 //_____________________________________________________________________________
73 dNdEtaAnalysis::dNdEtaAnalysis(const dNdEtaAnalysis &c) :
81 // dNdEtaAnalysis copy constructor
84 ((dNdEtaAnalysis &) c).Copy(*this);
87 //_____________________________________________________________________________
88 dNdEtaAnalysis &dNdEtaAnalysis::operator=(const dNdEtaAnalysis &c)
91 // Assignment operator
94 if (this != &c) ((dNdEtaAnalysis &) c).Copy(*this);
98 //_____________________________________________________________________________
99 void dNdEtaAnalysis::Copy(TObject &c) const
105 dNdEtaAnalysis& target = (dNdEtaAnalysis &) c;
107 target.fData = dynamic_cast<TH3F*> (fData->Clone());
108 target.fDataUncorrected = dynamic_cast<TH3F*> (fDataUncorrected->Clone());
109 target.fVtx = dynamic_cast<TH1D*> (fVtx->Clone());
111 for (Int_t i=0; i<kVertexBinning; ++i)
112 target.fdNdEta[i] = dynamic_cast<TH1D*> (fdNdEta[i]->Clone());
114 target.fNEvents = fNEvents;
116 TNamed::Copy((TNamed &) c);
119 //____________________________________________________________________
120 void dNdEtaAnalysis::FillTrack(Float_t vtx, Float_t eta, Float_t pt, Float_t weight)
122 // fills a track into the histograms
124 fDataUncorrected->Fill(vtx, eta, pt);
125 fData->Fill(vtx, eta, pt, weight);
128 //____________________________________________________________________
129 void dNdEtaAnalysis::FillEvent(Float_t vtx, Float_t weight)
131 // fills an event into the histograms
133 fVtx->Fill(vtx, weight);
138 //____________________________________________________________________
139 void dNdEtaAnalysis::Finish(AlidNdEtaCorrection* correction, Float_t ptCut)
141 // correct with correction values if available
143 // TODO what do we do with the error?
145 printf("INFO: No correction applied\n");
147 // In fData we have the track2particle and vertex reconstruction efficiency correction already applied
149 // integrate over pt (with pt cut)
150 fData->GetZaxis()->SetRange(fData->GetZaxis()->FindBin(ptCut), fData->GetZaxis()->GetNbins());
151 TH2D* vtxVsEta = dynamic_cast<TH2D*> (fData->Project3D("yx2"));
154 printf("ERROR: pt integration failed\n");
159 vtxVsEta->Draw("COLZ");
161 for (Int_t iEta=0; iEta<=vtxVsEta->GetNbinsY(); iEta++)
163 // do we have several histograms for different vertex positions?
164 Int_t vertexBinWidth = fVtx->GetNbinsX() / (kVertexBinning-1);
165 for (Int_t vertexPos=0; vertexPos<kVertexBinning; ++vertexPos)
167 Int_t vertexBinBegin = 1;
168 Int_t vertexBinEnd = fVtx->GetNbinsX() + 1;
170 // the first histogram is always for the whole vertex range
173 vertexBinBegin = 1 + vertexBinWidth * (vertexPos-1);
174 vertexBinEnd = vertexBinBegin + vertexBinWidth;
177 Float_t totalEvents = fVtx->Integral(vertexBinBegin, vertexBinEnd - 1);
178 if (totalEvents == 0)
180 printf("WARNING: No events for hist %d %d %d\n", vertexPos, vertexBinBegin, vertexBinEnd);
185 Float_t sumError2 = 0;
186 for (Int_t iVtx = vertexBinBegin; iVtx < vertexBinEnd; iVtx++)
188 if (vtxVsEta->GetBinContent(iVtx, iEta) != 0)
190 sum = sum + vtxVsEta->GetBinContent(iVtx, iEta);
191 sumError2 = sumError2 + TMath::Power(vtxVsEta->GetBinError(iVtx, iEta),2);
195 Float_t ptCutOffCorrection = correction->GetMeasuredFraction(ptCut, vtxVsEta->GetYaxis()->GetBinCenter(iEta));
196 //ptCutOffCorrection = 1;
197 if (ptCutOffCorrection <= 0)
199 printf("UNEXPECTED: ptCutOffCorrection is %f for hist %d %d %d\n", ptCutOffCorrection, vertexPos, vertexBinBegin, vertexBinEnd);
203 Float_t dndeta = sum / totalEvents / ptCutOffCorrection;
204 Float_t error = TMath::Sqrt(sumError2) / totalEvents / ptCutOffCorrection;
206 dndeta = dndeta/fdNdEta[vertexPos]->GetBinWidth(iEta);
207 error = error/fdNdEta[vertexPos]->GetBinWidth(iEta);
209 fdNdEta[vertexPos]->SetBinContent(iEta, dndeta);
210 fdNdEta[vertexPos]->SetBinError(iEta, error);
215 //____________________________________________________________________
216 void dNdEtaAnalysis::SaveHistograms()
218 // save the histograms to a directory with the name of this class (retrieved from TNamed)
220 gDirectory->mkdir(GetName());
221 gDirectory->cd(GetName());
224 AliPWG0Helper::CreateProjections(fData);
225 fDataUncorrected->Write();
226 AliPWG0Helper::CreateProjections(fDataUncorrected);
229 for (Int_t i=0; i<kVertexBinning; ++i)
230 fdNdEta[i] ->Write();
232 gDirectory->cd("../");
235 void dNdEtaAnalysis::LoadHistograms()
237 // loads the histograms from a directory with the name of this class (retrieved from TNamed)
239 gDirectory->cd(GetName());
241 fData = dynamic_cast<TH3F*> (gDirectory->Get(fData->GetName()));
242 fDataUncorrected = dynamic_cast<TH3F*> (gDirectory->Get(fDataUncorrected->GetName()));
244 fVtx = dynamic_cast<TH1D*> (gDirectory->Get(fVtx->GetName()));
246 for (Int_t i=0; i<kVertexBinning; ++i)
247 fdNdEta[i] = dynamic_cast<TH1D*> (gDirectory->Get(fdNdEta[i]->GetName()));
249 gDirectory->cd("../");
252 //____________________________________________________________________
253 void dNdEtaAnalysis::DrawHistograms()
255 // draws the histograms
257 TCanvas* canvas = new TCanvas("dNdEtaAnalysis", "dNdEtaAnalysis", 800, 800);
258 canvas->Divide(2, 2);
265 if (fDataUncorrected)
266 fDataUncorrected->Draw("COLZ");
276 // histograms for different vertices?
277 if (kVertexBinning > 0)
279 // doesnt work, but i dont get it, giving up...
280 /*TCanvas* canvas2 =*/ new TCanvas("dNdEtaAnalysisVtx", "dNdEtaAnalysisVtx", 450, 450);
281 //Int_t yPads = (Int_t) TMath::Ceil(((Double_t) kVertexBinning - 1) / 2);
282 //printf("%d\n", yPads);
283 //canvas2->Divide(2, yPads);
285 TLegend* legend = new TLegend(0.7, 0.7, 0.9, 0.9);
287 for (Int_t i=0; i<kVertexBinning; ++i)
293 fdNdEta[i]->SetLineColor(i+1);
294 fdNdEta[i]->Draw((i == 0) ? "" : "SAME");
295 legend->AddEntry(fdNdEta[i], (i == 0) ? "Vtx All" : Form("Vtx Bin %d", i-1));
303 Long64_t dNdEtaAnalysis::Merge(TCollection* list)
305 // Merges a list of dNdEtaAnalysis objects with this one.
306 // This is needed for PROOF.
307 // Returns the number of merged objects (including this)
315 TIterator* iter = list->MakeIterator();
319 const Int_t nCollections = kVertexBinning + 3;
320 TList* collections[nCollections];
321 for (Int_t i=0; i<nCollections; ++i)
322 collections[i] = new TList;
325 while ((obj = iter->Next()))
327 dNdEtaAnalysis* entry = dynamic_cast<dNdEtaAnalysis*> (obj);
331 collections[0]->Add(entry->fData);
332 collections[1]->Add(entry->fDataUncorrected);
333 collections[2]->Add(entry->fVtx);
335 for (Int_t i=0; i<kVertexBinning; ++i)
336 collections[3+i]->Add(entry->fdNdEta[i]);
341 fData->Merge(collections[0]);
342 fDataUncorrected->Merge(collections[1]);
343 fVtx->Merge(collections[2]);
344 for (Int_t i=0; i<kVertexBinning; ++i)
345 fdNdEta[i]->Merge(collections[3+i]);
347 for (Int_t i=0; i<nCollections; ++i)
348 delete collections[i];