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 = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
307 AliESDEvent* esd = eventHandler->GetEvent();
309 const AliMultiplicity* spdmult = esd->GetMultiplicity();
310 for(Int_t j = 0; j< spdmult->GetNumberOfTracklets();j++) {
311 hSPDMult->Fill(spdmult->GetEta(j),spdmult->GetPhi(j));
312 hSPDMultTrVtx->Fill(spdmult->GetEta(j),spdmult->GetPhi(j));
313 hSPDMultNSD->Fill(spdmult->GetEta(j),spdmult->GetPhi(j));
315 for(Int_t j = 0; j< spdmult->GetNumberOfSingleClusters();j++) {
316 hSPDMult->Fill(-TMath::Log(TMath::Tan(spdmult->GetThetaSingle(j)/2.)),spdmult->GetPhiSingle(j));
317 hSPDMultTrVtx->Fill(-TMath::Log(TMath::Tan(spdmult->GetThetaSingle(j)/2.)),spdmult->GetPhiSingle(j));
318 hSPDMultNSD->Fill(-TMath::Log(TMath::Tan(spdmult->GetThetaSingle(j)/2.)),spdmult->GetPhiSingle(j));
321 TH2F* hBgSPD = pars->GetBackgroundCorrection(0, 'Q', vtxbin);
324 hSPDMult->Divide(hBgSPD);
325 hSPDMultTrVtx->Divide(hBgSPD);
326 hSPDMultNSD->Divide(hBgSPD);
328 TH1F* hDead = pars->GetSPDDeadCorrection(vtxbin);
329 for(Int_t i=1; i<=hSPDMult->GetNbinsX(); i++) {
330 for(Int_t j=1; j<=hSPDMult->GetNbinsY(); j++) {
331 Float_t mult = hSPDMult->GetBinContent(i,j);
332 Float_t correction = hBgSPD->GetBinContent(i,j);
333 Float_t correctedMult = 0;
334 Float_t correctedError = 0;
337 if( mult > 0 && correction > 0.) {
338 correctedMult = mult;///correction;
339 //std::cout<<correction<<" "<<hSPDMult->GetXaxis()->GetBinCenter(i)<<std::endl;
340 // correctedMult = mult/correction;
342 if(hDead->GetBinContent(i) > 0)
343 correctedMult = correctedMult/hDead->GetBinContent(i);
344 correctedError = correctedMult*TMath::Sqrt( TMath::Power(hSPDMult->GetBinError(i,j)/hSPDMult->GetBinContent(i,j),2) +
345 TMath::Power(hBgSPD->GetBinError(i,j)/hBgSPD->GetBinContent(i,j),2));
349 if(correctedMult > 0) {
350 hSPDMult->SetBinContent(i,j,correctedMult);
351 hSPDMultTrVtx->SetBinContent(i,j,correctedMult);
352 hSPDMult->SetBinError(i,j,correctedError);
353 hSPDMultTrVtx->SetBinError(i,j,correctedError);
355 hSPDMultNSD->SetBinContent(i,j,correctedMult);
356 hSPDMultNSD->SetBinError(i,j,correctedError);
362 hSPDMult->Divide(pars->GetEventSelectionEfficiency("INEL",vtxbin,'I'));
363 hSPDMultNSD->Divide(pars->GetEventSelectionEfficiency("NSD",vtxbin,'I'));
366 AliWarning("No SPD background map found");
368 //std::cout<<spdmult->GetNumberOfTracklets()<<" "<<spdmult->GetNumberOfITSClusters(0)<<" "<< spdmult->GetNumberOfSingleClusters()<<std::endl;
370 CreatePerEventHistogram(vtxbin);
373 PostData(0, fOutputList);
377 //_____________________________________________________________________
378 void AliFMDAnalysisTaskBackgroundCorrection::Terminate(Option_t */*option*/) {
379 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
381 Int_t nVtxbins = pars->GetNvtxBins();
383 for(UShort_t det=1;det<=3;det++) {
384 Int_t nRings = (det==1 ? 1 : 2);
385 for (UShort_t ir = 0; ir < nRings; ir++) {
386 Char_t ringChar = (ir == 0 ? 'I' : 'O');
387 for(Int_t i =0; i<nVtxbins; i++) {
388 TH2F* hHits = (TH2F*)fHitList->FindObject(Form("hits_FMD%d%c_vtxbin%d",det,ringChar,i));
389 TH1D* hHitsproj = hHits->ProjectionX(Form("hits_FMD%d%c_vtxbin%d_proj",det,ringChar,i),1,hHits->GetNbinsY());
390 TH1D* hHitsNoCuts = (TH1D*)hHitsproj->Clone(Form("hits_NoCuts_FMD%d%c_vtxbin%d_proj",det,ringChar,i));
391 if(pars->GetEventSelectionEfficiency(i) > 0)
392 hHitsNoCuts->Scale(1/pars->GetEventSelectionEfficiency(i));
394 hHitsNoCuts->Scale(0);
395 fHitList->Add(hHitsproj);
396 fHitList->Add(hHitsNoCuts);
403 //_____________________________________________________________________
404 void AliFMDAnalysisTaskBackgroundCorrection::CreatePerEventHistogram(Int_t vtxbin) {
406 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
407 TH2F* dNdetadphiHistogram = (TH2F*)fHitList->FindObject("dNdetadphiHistogramTrVtx");
408 TH2F* dNdetadphiHistogramSPD = (TH2F*)fHitList->FindObject("dNdetadphiHistogramSPDTrVtx");
410 dNdetadphiHistogram->Reset();
411 dNdetadphiHistogramSPD->Reset();
413 for(Int_t det = 0; det<=3; det++) {
414 Int_t maxRing = (det<= 1 ? 0 : 1);
418 for(Int_t ring = 0;ring<=maxRing;ring++) {
420 Char_t ringChar = (ring == 0 ? 'I' : 'O');
422 TH2F* multhistoriginal = 0;
425 multhistoriginal = (TH2F*)fOutputList->FindObject(Form("multTrVtx_SPD_vtxbin%d",vtxbin));
427 multhistoriginal = (TH2F*)fOutputList->FindObject(Form("multTrVtx_FMD%d%c_vtxbin%d",det,ringChar,vtxbin));
429 TH2F* multhist = (TH2F*)multhistoriginal->Clone("tmp");
433 if(ringChar == 'O' && det > 0)
436 for(Int_t i=pars->GetFirstEtaBinToInclude(vtxbin,det,ringChar); i<=pars->GetLastEtaBinToInclude(vtxbin,det,ringChar); i++) {
437 for(Int_t j=1; j<=multhist->GetNbinsY(); j++) {
438 if(multhist->GetBinContent(i,j) < 0.0001) continue;
440 Bool_t overlapFMD = kFALSE;
441 Bool_t overlapSPD = kFALSE;
443 if(det == 1 && ringChar =='I')
444 if(i<=pars->GetLastEtaBinToInclude(vtxbin,2,'I'))
447 if(det == 2 && ringChar =='O') {
448 if(i>=pars->GetFirstEtaBinToInclude(vtxbin,2,'I'))
450 if(i<=pars->GetLastEtaBinToInclude(vtxbin,0,'I'))// && TMath::Abs(multhist->GetXaxis()->GetBinCenter(i)) < 2)
453 if(det == 2 && ringChar =='I')
454 if(i<=pars->GetLastEtaBinToInclude(vtxbin,2,'O') || i>=pars->GetFirstEtaBinToInclude(vtxbin,1,'I'))
457 if(det == 3 && ringChar =='I')
458 if(i>=pars->GetFirstEtaBinToInclude(vtxbin,3,'O'))
461 if(det == 3 && ringChar =='O') {
462 if(i<=pars->GetLastEtaBinToInclude(vtxbin,3,'I'))
464 if(i>=pars->GetFirstEtaBinToInclude(vtxbin,0,'I'))// && TMath::Abs(multhist->GetXaxis()->GetBinCenter(i)) < 2)
469 if(i<=pars->GetLastEtaBinToInclude(vtxbin,3,'O') || i>=pars->GetFirstEtaBinToInclude(vtxbin,2,'O'))
472 //std::cout<<overlapFMD<<" "<<overlapSPD<<std::endl;
477 dNdetadphiHistogram->SetBinContent(i,j,dNdetadphiHistogram->GetBinContent(i,j)+0.5*multhist->GetBinContent(i,j));
478 dNdetadphiHistogram->SetBinError(i,j,TMath::Sqrt(TMath::Power(dNdetadphiHistogram->GetBinError(i,j),2)+TMath::Power(0.5*multhist->GetBinError(i,j),2)));
481 dNdetadphiHistogram->SetBinContent(i,j,multhist->GetBinContent(i,j));
482 dNdetadphiHistogram->SetBinError(i,j,multhist->GetBinError(i,j));
486 if( overlapFMD && overlapSPD) {
487 dNdetadphiHistogramSPD->SetBinContent(i,j,dNdetadphiHistogramSPD->GetBinContent(i,j)+0.33*multhist->GetBinContent(i,j));
488 dNdetadphiHistogramSPD->SetBinError(i,j,TMath::Sqrt(TMath::Power(dNdetadphiHistogramSPD->GetBinError(i,j),2)+TMath::Power(0.33*multhist->GetBinError(i,j),2)));
490 else if( overlapFMD || overlapSPD) {
491 dNdetadphiHistogramSPD->SetBinContent(i,j,dNdetadphiHistogramSPD->GetBinContent(i,j)+0.5*multhist->GetBinContent(i,j));
492 dNdetadphiHistogramSPD->SetBinError(i,j,TMath::Sqrt(TMath::Power(dNdetadphiHistogramSPD->GetBinError(i,j),2)+TMath::Power(0.5*multhist->GetBinError(i,j),2)));
495 dNdetadphiHistogramSPD->SetBinContent(i,j,multhist->GetBinContent(i,j));
496 dNdetadphiHistogramSPD->SetBinError(i,j,multhist->GetBinError(i,j));
509 //_____________________________________________________________________