4 #include <TInterpreter.h>
10 #include "AliFMDAnalysisTaskBackgroundCorrection.h"
11 #include "AliAnalysisManager.h"
12 #include "AliESDFMD.h"
13 #include "AliESDEvent.h"
14 #include "AliAODEvent.h"
15 #include "AliAODHandler.h"
16 #include "AliMCEventHandler.h"
19 #include "AliESDVertex.h"
21 #include "AliFMDAnaParameters.h"
22 #include "AliESDInputHandler.h"
23 #include "AliMultiplicity.h"
24 #include "TProfile2D.h"
25 //#include "AliFMDGeometry.h"
27 ClassImp(AliFMDAnalysisTaskBackgroundCorrection)
30 AliFMDAnalysisTaskBackgroundCorrection::AliFMDAnalysisTaskBackgroundCorrection()
38 fOutputVertexString(0)
40 // Default constructor
41 DefineInput (0, TList::Class());
42 DefineOutput(0, TList::Class());
45 //_____________________________________________________________________
46 AliFMDAnalysisTaskBackgroundCorrection::AliFMDAnalysisTaskBackgroundCorrection(const char* name, Bool_t SE):
47 AliAnalysisTask(name, "Density"),
55 fOutputVertexString(0)
59 DefineInput (0, TList::Class());
60 DefineOutput(0, TList::Class());
63 //_____________________________________________________________________
64 void AliFMDAnalysisTaskBackgroundCorrection::CreateOutputObjects()
66 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
69 fOutputList = new TList();
70 fOutputList->SetName("BackgroundCorrectedPerEvent");
72 fHitList = new TList();
73 fHitList->SetName("HitsList");
76 fOutputVertexString = new TObjString();
78 fOutputList->Add(fOutputVertexString);
87 TH2F* hSPDMultTrVtx = 0;
88 TH2F* hSPDMultNSD = 0;
89 // TH2F* hHitsNoCuts = 0;
90 Int_t nVtxbins = pars->GetNvtxBins();
91 for(Int_t i = 0; i< nVtxbins; i++) {
92 for(Int_t det =1; det<=3;det++)
94 Int_t nRings = (det==1 ? 1 : 2);
95 for(Int_t ring = 0;ring<nRings;ring++)
97 Char_t ringChar = (ring == 0 ? 'I' : 'O');
98 Int_t nSec = (ring == 0 ? 20 : 40);
101 TH2F* hBg = pars->GetBackgroundCorrection(det, ringChar, i);
102 hMult = new TH2F(Form("mult_FMD%d%c_vtxbin%d",det,ringChar,i),Form("mult_FMD%d%c_vtxbin%d",det,ringChar,i),
104 hBg->GetXaxis()->GetXmin(),
105 hBg->GetXaxis()->GetXmax(),
106 nSec, 0, 2*TMath::Pi());
108 fOutputList->Add(hMult);
109 hMultTrVtx = new TH2F(Form("multTrVtx_FMD%d%c_vtxbin%d",det,ringChar,i),Form("multTrVtx_FMD%d%c_vtxbin%d",det,ringChar,i),
111 hBg->GetXaxis()->GetXmin(),
112 hBg->GetXaxis()->GetXmax(),
113 nSec, 0, 2*TMath::Pi());
116 fOutputList->Add(hMultTrVtx);
118 hMultNSD = new TH2F(Form("multNSD_FMD%d%c_vtxbin%d",det,ringChar,i),Form("multNSD_FMD%d%c_vtxbin%d",det,ringChar,i),
120 hBg->GetXaxis()->GetXmin(),
121 hBg->GetXaxis()->GetXmax(),
122 nSec, 0, 2*TMath::Pi());
125 fOutputList->Add(hMultNSD);
127 hHits = new TH2F(Form("hits_FMD%d%c_vtxbin%d",det,ringChar,i),Form("hits_FMD%d%c_vtxbin%d",det,ringChar,i),
129 hBg->GetXaxis()->GetXmin(),
130 hBg->GetXaxis()->GetXmax(),
131 nSec, 0, 2*TMath::Pi());
133 /* hHitsNoCuts = new TH2F(Form("hits_NoCuts_FMD%d%c_vtxbin%d",det,ringChar,i),Form("hits_NoCuts_FMD%d%c_vtxbin%d",det,ringChar,i),
135 hBg->GetXaxis()->GetXmin(),
136 hBg->GetXaxis()->GetXmax(),
137 nSec, 0, 2*TMath::Pi());
141 fHitList->Add(hHits);
146 TH2F* hBg = pars->GetBackgroundCorrection(1, 'I', i);
147 hSPDMult = new TH2F(Form("mult_SPD_vtxbin%d",i),Form("mult_SPD_vtxbin%d",i),
149 hBg->GetXaxis()->GetXmin(),
150 hBg->GetXaxis()->GetXmax(),
151 20, 0, 2*TMath::Pi());
153 fOutputList->Add(hSPDMult);
154 hSPDMultTrVtx = new TH2F(Form("multTrVtx_SPD_vtxbin%d",i),Form("multTrVtx_SPD_vtxbin%d",i),
156 hBg->GetXaxis()->GetXmin(),
157 hBg->GetXaxis()->GetXmax(),
158 20, 0, 2*TMath::Pi());
159 hSPDMultTrVtx->Sumw2();
160 fOutputList->Add(hSPDMultTrVtx);
161 hSPDMultNSD = new TH2F(Form("multNSD_SPD_vtxbin%d",i),Form("multNSD_SPD_vtxbin%d",i),
163 hBg->GetXaxis()->GetXmin(),
164 hBg->GetXaxis()->GetXmax(),
165 20, 0, 2*TMath::Pi());
166 hSPDMultNSD->Sumw2();
167 fOutputList->Add(hSPDMultNSD);
171 TH2F* hBg = pars->GetBackgroundCorrection(1, 'I', 5);
172 TH2F* dNdetadphiHistogram = new TH2F("dNdetadphiHistogramTrVtx","dNdetadphiHistogramTrVtx;#eta;#Phi",pars->GetNetaBins(),hBg->GetXaxis()->GetXmin(),hBg->GetXaxis()->GetXmax(),20,0,2*TMath::Pi());
173 TH2F* dNdetadphiHistogramSPD = new TH2F("dNdetadphiHistogramSPDTrVtx","dNdetadphiHistogramSPDTrVtx;#eta;#Phi",pars->GetNetaBins(),hBg->GetXaxis()->GetXmin(),hBg->GetXaxis()->GetXmax(),20,0,2*TMath::Pi());
174 //dNdetadphiHistogram->SetErrorOption("g");
176 fHitList->Add(dNdetadphiHistogram);
177 fOutputList->Add(dNdetadphiHistogram);
178 fHitList->Add(dNdetadphiHistogramSPD);
179 fOutputList->Add(dNdetadphiHistogramSPD);
183 //_____________________________________________________________________
184 void AliFMDAnalysisTaskBackgroundCorrection::ConnectInputData(Option_t */*option*/)
187 fInputList = (TList*)GetInputData(0);
191 //_____________________________________________________________________
192 void AliFMDAnalysisTaskBackgroundCorrection::Exec(Option_t */*option*/)
194 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
196 fVertexString = (TObjString*)fInputList->At(0);
198 Int_t vtxbin = fVertexString->GetString().Atoi();
199 fOutputVertexString->SetString(Form("%d",vtxbin));
201 fNevents.Fill(vtxbin);
203 for(UShort_t det=1;det<=3;det++) {
204 Int_t nRings = (det==1 ? 1 : 2);
205 for (UShort_t ir = 0; ir < nRings; ir++) {
206 Char_t ringChar = (ir == 0 ? 'I' : 'O');
207 TH2F* hMult = (TH2F*)fOutputList->FindObject(Form("mult_FMD%d%c_vtxbin%d",det,ringChar,vtxbin));
209 TH2F* hMultTrVtx = (TH2F*)fOutputList->FindObject(Form("multTrVtx_FMD%d%c_vtxbin%d",det,ringChar,vtxbin));
211 TH2F* hMultNSD = (TH2F*)fOutputList->FindObject(Form("multNSD_FMD%d%c_vtxbin%d",det,ringChar,vtxbin));
214 TH2F* hSPDMult = (TH2F*)fOutputList->FindObject(Form("mult_SPD_vtxbin%d",vtxbin));
216 TH2F* hSPDMultTrVtx = (TH2F*)fOutputList->FindObject(Form("multTrVtx_SPD_vtxbin%d",vtxbin));
217 hSPDMultTrVtx->Reset();
218 TH2F* hSPDMultNSD = (TH2F*)fOutputList->FindObject(Form("multNSD_SPD_vtxbin%d",vtxbin));
219 hSPDMultNSD->Reset();
225 Bool_t nsd = pars->IsEventTriggered(AliFMDAnaParameters::kNSD);
226 for(UShort_t det=1;det<=3;det++) {
228 Int_t nRings = (det==1 ? 1 : 2);
229 for (UShort_t ir = 0; ir < nRings; ir++) {
230 Char_t ringChar = (ir == 0 ? 'I' : 'O');
232 TH2F* hMult = (TH2F*)fOutputList->FindObject(Form("mult_FMD%d%c_vtxbin%d",det,ringChar,vtxbin));
233 TH2F* hMultTrVtx = (TH2F*)fOutputList->FindObject(Form("multTrVtx_FMD%d%c_vtxbin%d",det,ringChar,vtxbin));
234 TH2F* hMultNSD = (TH2F*)fOutputList->FindObject(Form("multNSD_FMD%d%c_vtxbin%d",det,ringChar,vtxbin));
235 TH2F* hMultInput = (TH2F*)fInputList->FindObject(Form("FMD%d%c_vtxbin%d",det,ringChar,vtxbin));
236 TH2F* hHits = (TH2F*)fHitList->FindObject(Form("hits_FMD%d%c_vtxbin%d",det,ringChar,vtxbin));
238 //if(pars->GetProcessHits())
239 hHits->Add(hMultInput);
241 TH2F* hBg = pars->GetBackgroundCorrection(det, ringChar, vtxbin);
242 TH2F* hBgNSD = pars->GetBackgroundCorrectionNSD(det, ringChar, vtxbin);
243 hMult->Add(hMultInput);
244 hMultTrVtx->Add(hMultInput);
246 hMult->Divide(hBg);//,"B");
247 hMultTrVtx->Divide(hBg);//,"B");
250 hMultNSD->Add(hMultInput);
251 hMultNSD->Divide(hBgNSD);
254 //sharing efficiency correction ?
255 if(pars->SharingEffPresent()) {
256 TH1F* hSharingEff = pars->GetSharingEfficiencyTrVtx(det,ringChar,vtxbin);
257 TH1F* hSharingEffTrVtx = pars->GetSharingEfficiencyTrVtx(det,ringChar,vtxbin);
259 for(Int_t nx=1; nx<=hMult->GetNbinsX(); nx++) {
260 Float_t correction = hSharingEff->GetBinContent(nx);
261 Float_t correctionTrVtx = hSharingEffTrVtx->GetBinContent(nx);
262 //FIXME : This should be for NSD events
263 Float_t correctionNSD = hSharingEff->GetBinContent(nx);
265 for(Int_t ny=1; ny<=hMult->GetNbinsY(); ny++) {
268 hMult->SetBinContent(nx,ny,hMult->GetBinContent(nx,ny)/correction);
269 Float_t error = TMath::Sqrt(TMath::Power(hMult->GetBinError(nx,ny),2) + TMath::Power(hMult->GetBinContent(nx,ny)*hSharingEff->GetBinError(nx),2)) / correction;
270 hMult->SetBinError(nx,ny,error);
272 if(correctionTrVtx != 0){
273 hMultTrVtx->SetBinContent(nx,ny,hMultTrVtx->GetBinContent(nx,ny)/correctionTrVtx);
274 Float_t error = TMath::Sqrt(TMath::Power(hMultTrVtx->GetBinError(nx,ny),2) + TMath::Power(hMultTrVtx->GetBinContent(nx,ny)*hSharingEffTrVtx->GetBinError(nx),2)) / correctionTrVtx;
275 hMultTrVtx->SetBinError(nx,ny,error);
277 if(correctionNSD != 0 && nsd) {
278 hMultNSD->SetBinContent(nx,ny,hMultNSD->GetBinContent(nx,ny)/correctionNSD);
279 Float_t error = TMath::Sqrt(TMath::Power(hMultNSD->GetBinError(nx,ny),2) + TMath::Power(hMultNSD->GetBinContent(nx,ny)*hSharingEff->GetBinError(nx),2)) / correctionNSD;
280 hMultNSD->SetBinError(nx,ny,error);
289 // if(pars->GetEventSelectionEfficiency(vtxbin) > 0)
290 // hMult->Scale(1/pars->GetEventSelectionEfficiency(vtxbin));
293 hMult->Divide(pars->GetEventSelectionEfficiency("INEL",vtxbin,ringChar));
294 hMultNSD->Divide(pars->GetEventSelectionEfficiency("NSD",vtxbin,ringChar));
302 TH2F* hSPDMult = (TH2F*)fOutputList->FindObject(Form("mult_SPD_vtxbin%d",vtxbin));
303 TH2F* hSPDMultTrVtx = (TH2F*)fOutputList->FindObject(Form("multTrVtx_SPD_vtxbin%d",vtxbin));
304 TH2F* hSPDMultNSD = (TH2F*)fOutputList->FindObject(Form("multNSD_SPD_vtxbin%d",vtxbin));
306 AliESDInputHandler* eventHandler =
307 dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()
308 ->GetInputEventHandler());
309 if (!eventHandler) return;
311 AliESDEvent* esd = eventHandler->GetEvent();
313 const AliMultiplicity* spdmult = esd->GetMultiplicity();
314 for(Int_t j = 0; j< spdmult->GetNumberOfTracklets();j++) {
315 hSPDMult->Fill(spdmult->GetEta(j),spdmult->GetPhi(j));
316 hSPDMultTrVtx->Fill(spdmult->GetEta(j),spdmult->GetPhi(j));
317 hSPDMultNSD->Fill(spdmult->GetEta(j),spdmult->GetPhi(j));
319 for(Int_t j = 0; j< spdmult->GetNumberOfSingleClusters();j++) {
320 hSPDMult->Fill(-TMath::Log(TMath::Tan(spdmult->GetThetaSingle(j)/2.)),spdmult->GetPhiSingle(j));
321 hSPDMultTrVtx->Fill(-TMath::Log(TMath::Tan(spdmult->GetThetaSingle(j)/2.)),spdmult->GetPhiSingle(j));
322 hSPDMultNSD->Fill(-TMath::Log(TMath::Tan(spdmult->GetThetaSingle(j)/2.)),spdmult->GetPhiSingle(j));
325 TH2F* hBgSPD = pars->GetBackgroundCorrection(0, 'Q', vtxbin);
328 hSPDMult->Divide(hBgSPD);
329 hSPDMultTrVtx->Divide(hBgSPD);
330 hSPDMultNSD->Divide(hBgSPD);
332 TH1F* hDead = pars->GetSPDDeadCorrection(vtxbin);
333 for(Int_t i=1; i<=hSPDMult->GetNbinsX(); i++) {
334 for(Int_t j=1; j<=hSPDMult->GetNbinsY(); j++) {
335 Float_t mult = hSPDMult->GetBinContent(i,j);
336 Float_t correction = hBgSPD->GetBinContent(i,j);
337 Float_t correctedMult = 0;
338 Float_t correctedError = 0;
341 if( mult > 0 && correction > 0.) {
342 correctedMult = mult;///correction;
343 //std::cout<<correction<<" "<<hSPDMult->GetXaxis()->GetBinCenter(i)<<std::endl;
344 // correctedMult = mult/correction;
346 if(hDead->GetBinContent(i) > 0)
347 correctedMult = correctedMult/hDead->GetBinContent(i);
348 correctedError = correctedMult*TMath::Sqrt( TMath::Power(hSPDMult->GetBinError(i,j)/hSPDMult->GetBinContent(i,j),2) +
349 TMath::Power(hBgSPD->GetBinError(i,j)/hBgSPD->GetBinContent(i,j),2));
353 if(correctedMult > 0) {
354 hSPDMult->SetBinContent(i,j,correctedMult);
355 hSPDMultTrVtx->SetBinContent(i,j,correctedMult);
356 hSPDMult->SetBinError(i,j,correctedError);
357 hSPDMultTrVtx->SetBinError(i,j,correctedError);
359 hSPDMultNSD->SetBinContent(i,j,correctedMult);
360 hSPDMultNSD->SetBinError(i,j,correctedError);
366 hSPDMult->Divide(pars->GetEventSelectionEfficiency("INEL",vtxbin,'I'));
367 hSPDMultNSD->Divide(pars->GetEventSelectionEfficiency("NSD",vtxbin,'I'));
370 AliWarning("No SPD background map found");
372 //std::cout<<spdmult->GetNumberOfTracklets()<<" "<<spdmult->GetNumberOfITSClusters(0)<<" "<< spdmult->GetNumberOfSingleClusters()<<std::endl;
374 CreatePerEventHistogram(vtxbin);
377 PostData(0, fOutputList);
381 //_____________________________________________________________________
382 void AliFMDAnalysisTaskBackgroundCorrection::Terminate(Option_t */*option*/) {
383 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
385 Int_t nVtxbins = pars->GetNvtxBins();
387 for(UShort_t det=1;det<=3;det++) {
388 Int_t nRings = (det==1 ? 1 : 2);
389 for (UShort_t ir = 0; ir < nRings; ir++) {
390 Char_t ringChar = (ir == 0 ? 'I' : 'O');
391 for(Int_t i =0; i<nVtxbins; i++) {
392 TH2F* hHits = (TH2F*)fHitList->FindObject(Form("hits_FMD%d%c_vtxbin%d",det,ringChar,i));
393 TH1D* hHitsproj = hHits->ProjectionX(Form("hits_FMD%d%c_vtxbin%d_proj",det,ringChar,i),1,hHits->GetNbinsY());
394 TH1D* hHitsNoCuts = (TH1D*)hHitsproj->Clone(Form("hits_NoCuts_FMD%d%c_vtxbin%d_proj",det,ringChar,i));
395 if(pars->GetEventSelectionEfficiency(i) > 0)
396 hHitsNoCuts->Scale(1/pars->GetEventSelectionEfficiency(i));
398 hHitsNoCuts->Scale(0);
399 fHitList->Add(hHitsproj);
400 fHitList->Add(hHitsNoCuts);
407 //_____________________________________________________________________
408 void AliFMDAnalysisTaskBackgroundCorrection::CreatePerEventHistogram(Int_t vtxbin) {
410 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
411 TH2F* dNdetadphiHistogram = (TH2F*)fHitList->FindObject("dNdetadphiHistogramTrVtx");
412 TH2F* dNdetadphiHistogramSPD = (TH2F*)fHitList->FindObject("dNdetadphiHistogramSPDTrVtx");
414 dNdetadphiHistogram->Reset();
415 dNdetadphiHistogramSPD->Reset();
417 for(Int_t det = 0; det<=3; det++) {
418 Int_t maxRing = (det<= 1 ? 0 : 1);
422 for(Int_t ring = 0;ring<=maxRing;ring++) {
424 Char_t ringChar = (ring == 0 ? 'I' : 'O');
426 TH2F* multhistoriginal = 0;
429 multhistoriginal = (TH2F*)fOutputList->FindObject(Form("multTrVtx_SPD_vtxbin%d",vtxbin));
431 multhistoriginal = (TH2F*)fOutputList->FindObject(Form("multTrVtx_FMD%d%c_vtxbin%d",det,ringChar,vtxbin));
433 TH2F* multhist = (TH2F*)multhistoriginal->Clone("tmp");
437 if(ringChar == 'O' && det > 0)
440 for(Int_t i=pars->GetFirstEtaBinToInclude(vtxbin,det,ringChar); i<=pars->GetLastEtaBinToInclude(vtxbin,det,ringChar); i++) {
441 for(Int_t j=1; j<=multhist->GetNbinsY(); j++) {
442 if(multhist->GetBinContent(i,j) < 0.0001) continue;
444 Bool_t overlapFMD = kFALSE;
445 Bool_t overlapSPD = kFALSE;
447 if(det == 1 && ringChar =='I')
448 if(i<=pars->GetLastEtaBinToInclude(vtxbin,2,'I'))
451 if(det == 2 && ringChar =='O') {
452 if(i>=pars->GetFirstEtaBinToInclude(vtxbin,2,'I'))
454 if(i<=pars->GetLastEtaBinToInclude(vtxbin,0,'I'))// && TMath::Abs(multhist->GetXaxis()->GetBinCenter(i)) < 2)
457 if(det == 2 && ringChar =='I')
458 if(i<=pars->GetLastEtaBinToInclude(vtxbin,2,'O') || i>=pars->GetFirstEtaBinToInclude(vtxbin,1,'I'))
461 if(det == 3 && ringChar =='I')
462 if(i>=pars->GetFirstEtaBinToInclude(vtxbin,3,'O'))
465 if(det == 3 && ringChar =='O') {
466 if(i<=pars->GetLastEtaBinToInclude(vtxbin,3,'I'))
468 if(i>=pars->GetFirstEtaBinToInclude(vtxbin,0,'I'))// && TMath::Abs(multhist->GetXaxis()->GetBinCenter(i)) < 2)
473 if(i<=pars->GetLastEtaBinToInclude(vtxbin,3,'O') || i>=pars->GetFirstEtaBinToInclude(vtxbin,2,'O'))
476 //std::cout<<overlapFMD<<" "<<overlapSPD<<std::endl;
481 dNdetadphiHistogram->SetBinContent(i,j,dNdetadphiHistogram->GetBinContent(i,j)+0.5*multhist->GetBinContent(i,j));
482 dNdetadphiHistogram->SetBinError(i,j,TMath::Sqrt(TMath::Power(dNdetadphiHistogram->GetBinError(i,j),2)+TMath::Power(0.5*multhist->GetBinError(i,j),2)));
485 dNdetadphiHistogram->SetBinContent(i,j,multhist->GetBinContent(i,j));
486 dNdetadphiHistogram->SetBinError(i,j,multhist->GetBinError(i,j));
490 if( overlapFMD && overlapSPD) {
491 dNdetadphiHistogramSPD->SetBinContent(i,j,dNdetadphiHistogramSPD->GetBinContent(i,j)+0.33*multhist->GetBinContent(i,j));
492 dNdetadphiHistogramSPD->SetBinError(i,j,TMath::Sqrt(TMath::Power(dNdetadphiHistogramSPD->GetBinError(i,j),2)+TMath::Power(0.33*multhist->GetBinError(i,j),2)));
494 else if( overlapFMD || overlapSPD) {
495 dNdetadphiHistogramSPD->SetBinContent(i,j,dNdetadphiHistogramSPD->GetBinContent(i,j)+0.5*multhist->GetBinContent(i,j));
496 dNdetadphiHistogramSPD->SetBinError(i,j,TMath::Sqrt(TMath::Power(dNdetadphiHistogramSPD->GetBinError(i,j),2)+TMath::Power(0.5*multhist->GetBinError(i,j),2)));
499 dNdetadphiHistogramSPD->SetBinContent(i,j,multhist->GetBinContent(i,j));
500 dNdetadphiHistogramSPD->SetBinError(i,j,multhist->GetBinError(i,j));
513 //_____________________________________________________________________