3 #include "dNdEtaAnalysis.h"
10 #include <TCollection.h>
11 #include <TIterator.h>
15 #include "dNdEtaCorrection.h"
17 //____________________________________________________________________
18 ClassImp(dNdEtaAnalysis)
20 //____________________________________________________________________
21 dNdEtaAnalysis::dNdEtaAnalysis(Char_t* name, Char_t* title) :
24 hEtaVsVtx = new TH2F(Form("%s_eta_vs_vtx", name),"",80,-20,20,120,-6,6);
25 hEtaVsVtx->SetXTitle("vtx z [cm]");
26 hEtaVsVtx->SetYTitle("#eta");
28 hEtaVsVtxUncorrected = dynamic_cast<TH2F*> (hEtaVsVtx->Clone(Form("%s_eta_vs_vtx_uncorrected", name)));
29 hEtaVsVtxCheck = dynamic_cast<TH2F*> (hEtaVsVtx->Clone(Form("%s_eta_vs_vtx_check", name)));
30 hVtx = hEtaVsVtx->ProjectionX(Form("%s_vtx", name));
31 for (Int_t i=0; i<kVertexBinning; ++i)
33 hdNdEta[i] = hEtaVsVtx->ProjectionY(Form("%s_dNdEta_%d", name, i));
34 hdNdEta[i]->SetYTitle("dN/d#eta");
41 //____________________________________________________________________
43 dNdEtaAnalysis::FillTrack(Float_t vtx, Float_t eta, Float_t c) {
44 hEtaVsVtxUncorrected->Fill(vtx,eta);
45 hEtaVsVtxCheck->Fill(vtx, eta, c);
48 //____________________________________________________________________
50 dNdEtaAnalysis::FillEvent(Float_t vtx) {
54 //____________________________________________________________________
55 void dNdEtaAnalysis::Finish(dNdEtaCorrection* correction)
57 // correct with correction values if available
58 // TODO what do we do with the error?
60 printf("INFO: No correction applied\n");
62 // this can be replaced by TH2F::Divide if we agree that the binning will be always the same
63 for (Int_t iVtx=0; iVtx<=hEtaVsVtxUncorrected->GetNbinsX(); iVtx++)
65 for (Int_t iEta=0; iEta<=hEtaVsVtxUncorrected->GetNbinsY(); iEta++)
67 Float_t correctionValue = 1;
69 correctionValue = correction->GetCorrection(hEtaVsVtxUncorrected->GetXaxis()->GetBinCenter(iVtx), hEtaVsVtxUncorrected->GetYaxis()->GetBinCenter(iEta));
71 Float_t value = hEtaVsVtxUncorrected->GetBinContent(iVtx, iEta);
72 Float_t error = hEtaVsVtxUncorrected->GetBinError(iVtx, iEta);
74 Float_t correctedValue = value * correctionValue;
75 Float_t correctedError = error * correctionValue;
77 if (correctedValue != 0)
79 hEtaVsVtx->SetBinContent(iVtx, iEta, correctedValue);
80 hEtaVsVtx->SetBinError(iVtx, iEta, correctedError);
85 // normalize with n events (per vtx)
86 for (Int_t iVtx=0; iVtx<=hVtx->GetNbinsX(); iVtx++) {
87 Float_t nEvents = hVtx->GetBinContent(iVtx);
88 Float_t nEventsError = hVtx->GetBinError(iVtx);
90 if (nEvents==0) continue;
92 for (Int_t iEta=0; iEta<=hEtaVsVtx->GetNbinsY(); iEta++) {
93 Float_t value = hEtaVsVtx->GetBinContent(iVtx, iEta) / nEvents;
94 if (value==0) continue;
95 Float_t error = hEtaVsVtx->GetBinError(iVtx, iEta)/nEvents;
96 error = TMath::Sqrt(TMath::Power(hEtaVsVtx->GetBinError(iVtx, iEta)/
97 hEtaVsVtx->GetBinContent(iVtx, iEta),2) +
98 TMath::Power(nEventsError/nEvents,2));
99 hEtaVsVtx->SetBinContent(iVtx, iEta, value);
100 hEtaVsVtx->SetBinError(iVtx, iEta, error);
104 for (Int_t iEta=0; iEta<=hEtaVsVtxCheck->GetNbinsY(); iEta++) {
105 Float_t value = hEtaVsVtxCheck->GetBinContent(iVtx, iEta) / nEvents;
106 if (value==0) continue;
107 Float_t error = hEtaVsVtxCheck->GetBinError(iVtx, iEta)/nEvents;
108 error = TMath::Sqrt(TMath::Power(hEtaVsVtxCheck->GetBinError(iVtx, iEta)/
109 hEtaVsVtxCheck->GetBinContent(iVtx, iEta),2) +
110 TMath::Power(nEventsError/nEvents,2));
111 hEtaVsVtxCheck->SetBinContent(iVtx, iEta, value);
112 hEtaVsVtxCheck->SetBinError(iVtx, iEta, error);
116 // then take the wieghted average for each eta
117 // is this the right way to do it???
118 for (Int_t iEta=0; iEta<=hEtaVsVtx->GetNbinsY(); iEta++) {
120 Float_t sumError2 = 0;
121 Int_t nMeasurements = 0;
126 // do we have several histograms for different vertex positions?
127 Int_t vertexBinWidth = hVtx->GetNbinsX() / (kVertexBinning-1);
128 for (Int_t vertexPos=0; vertexPos<kVertexBinning; ++vertexPos)
130 Int_t vertexBinBegin = 0;
131 Int_t vertexBinEnd = hVtx->GetNbinsX();
133 // the first histogram is always for the whole vertex range
136 vertexBinBegin = vertexBinWidth * (vertexPos-1);
137 vertexBinEnd = vertexBinBegin + vertexBinWidth;
140 for (Int_t iVtx=vertexBinBegin; iVtx<=vertexBinEnd; iVtx++) {
141 if (hVtx->GetBinContent(iVtx)==0) continue;
142 if (hEtaVsVtxCheck->GetBinContent(iVtx, iEta)==0) continue;
144 Float_t w = 1/TMath::Power(hEtaVsVtx->GetBinError(iVtx, iEta),2);
145 sumXw = sumXw + hEtaVsVtxCheck->GetBinContent(iVtx, iEta)*w;
148 sum = sum + hEtaVsVtxCheck->GetBinContent(iVtx, iEta);
149 sumError2 = sumError2 + TMath::Power(hEtaVsVtxCheck->GetBinError(iVtx, iEta),2);
155 if (nMeasurements!=0) {
156 dndeta = sum/Float_t(nMeasurements);
157 error = TMath::Sqrt(sumError2)/Float_t(nMeasurements);
160 error = 1/TMath::Sqrt(sumW);
162 dndeta = dndeta/hdNdEta[vertexPos]->GetBinWidth(iEta);
163 error = error/hdNdEta[vertexPos]->GetBinWidth(iEta);
165 hdNdEta[vertexPos]->SetBinContent(iEta, dndeta);
166 hdNdEta[vertexPos]->SetBinError(iEta, error);
172 //____________________________________________________________________
174 dNdEtaAnalysis::SaveHistograms() {
176 gDirectory->mkdir(GetName());
177 gDirectory->cd(GetName());
180 hEtaVsVtxUncorrected->Write();
182 for (Int_t i=0; i<kVertexBinning; ++i)
183 hdNdEta[i] ->Write();
185 gDirectory->cd("../");
188 //____________________________________________________________________
189 void dNdEtaAnalysis::DrawHistograms()
191 TCanvas* canvas = new TCanvas("dNdEtaAnalysis", "dNdEtaAnalysis", 1200, 800);
192 canvas->Divide(3, 2);
196 hEtaVsVtx->Draw("COLZ");
200 hEtaVsVtxCheck->Draw("COLZ");
203 if (hEtaVsVtxUncorrected)
204 hEtaVsVtxUncorrected->Draw("COLZ");
207 TH2F* clone = (TH2F*) hEtaVsVtxCheck->Clone("clone");
208 clone->Divide(hEtaVsVtx);
219 // histograms for different vertices?
220 if (kVertexBinning > 0)
222 // doesnt work, but i dont get it, giving up...
223 /*TCanvas* canvas2 =*/ new TCanvas("dNdEtaAnalysisVtx", "dNdEtaAnalysisVtx", 450, 450);
224 //Int_t yPads = (Int_t) TMath::Ceil(((Double_t) kVertexBinning - 1) / 2);
225 //printf("%d\n", yPads);
226 //canvas2->Divide(2, yPads);
228 TLegend* legend = new TLegend(0.7, 0.7, 0.9, 0.9);
230 for (Int_t i=1; i<kVertexBinning; ++i)
236 hdNdEta[i]->SetLineColor(i);
237 hdNdEta[i]->Draw((i == 1) ? "" : "SAME");
238 legend->AddEntry(hdNdEta[i], Form("Vtx Bin %d", i-1));
246 Long64_t dNdEtaAnalysis::Merge(TCollection* list)
248 // Merges a list of dNdEtaAnalysis objects with this one.
249 // This is needed for PROOF.
250 // Returns the number of merged objects (including this)
258 TIterator* iter = list->MakeIterator();
262 const Int_t nCollections = kVertexBinning + 3;
263 TList* collections[nCollections];
264 for (Int_t i=0; i<nCollections; ++i)
265 collections[i] = new TList;
268 while ((obj = iter->Next()))
270 dNdEtaAnalysis* entry = dynamic_cast<dNdEtaAnalysis*> (obj);
274 collections[0]->Add(entry->hEtaVsVtx);
275 collections[1]->Add(entry->hEtaVsVtxUncorrected);
276 collections[2]->Add(entry->hVtx);
278 for (Int_t i=0; i<kVertexBinning; ++i)
279 collections[3+i]->Add(entry->hdNdEta[i]);
284 hEtaVsVtx->Merge(collections[0]);
285 hEtaVsVtxUncorrected->Merge(collections[1]);
286 hVtx->Merge(collections[2]);
287 for (Int_t i=0; i<kVertexBinning; ++i)
288 hdNdEta[i]->Merge(collections[3+i]);
290 for (Int_t i=0; i<nCollections; ++i)
291 delete collections[i];