4 #include <TInterpreter.h>
11 #include "AliFMDAnalysisTaskDensity.h"
12 #include "AliAnalysisManager.h"
13 #include "AliESDFMD.h"
14 #include "AliESDEvent.h"
15 #include "AliAODEvent.h"
16 #include "AliAODHandler.h"
17 #include "AliMCEventHandler.h"
19 #include "AliESDVertex.h"
21 #include "AliFMDAnaParameters.h"
22 #include "AliFMDGeometry.h"
23 #include "AliFMDRing.h"
25 ClassImp(AliFMDAnalysisTaskDensity)
27 //_____________________________________________________________________
28 AliFMDAnalysisTaskDensity::AliFMDAnalysisTaskDensity()
37 // Default constructor
38 DefineInput (0, AliESDFMD::Class());
39 DefineInput (1, AliESDVertex::Class());
40 DefineOutput(0,TList::Class());
42 //_____________________________________________________________________
43 AliFMDAnalysisTaskDensity::AliFMDAnalysisTaskDensity(const char* name, Bool_t SE):
44 AliAnalysisTask(name, "Density"),
55 DefineInput (0, AliESDFMD::Class());
56 DefineInput (1, AliESDVertex::Class());
57 DefineOutput(0, TList::Class());
60 //_____________________________________________________________________
61 void AliFMDAnalysisTaskDensity::CreateOutputObjects()
63 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
65 fArray.SetName("FMD");
68 fOutputList = new TList();
69 fOutputList->SetName("density_list");
73 Int_t nVtxbins = pars->GetNvtxBins();
75 for(Int_t det =1; det<=3;det++)
77 TObjArray* detArray = new TObjArray();
78 detArray->SetName(Form("FMD%d",det));
79 fArray.AddAtAndExpand(detArray,det);
80 Int_t nRings = (det==1 ? 1 : 2);
81 for(Int_t ring = 0;ring<nRings;ring++)
83 Char_t ringChar = (ring == 0 ? 'I' : 'O');
84 Int_t nSec = (ring == 0 ? 20 : 40);
86 TObjArray* vtxArray = new TObjArray();
87 vtxArray->SetName(Form("FMD%d%c",det,ringChar));
88 detArray->AddAtAndExpand(vtxArray,ring);
89 for(Int_t i = 0; i< nVtxbins; i++) {
90 TH2F* hBg = pars->GetBackgroundCorrection(det, ringChar, i);
92 hMult = new TH2F(Form("FMD%d%c_vtxbin%d",det,ringChar,i),Form("FMD%d%c_vtxbin%d",det,ringChar,i),
94 hBg->GetXaxis()->GetXmin(),
95 hBg->GetXaxis()->GetXmax(),
96 nSec, 0, 2*TMath::Pi());
97 vtxArray->AddAtAndExpand(hMult,i);
103 fOutputList->Add(&fArray);
104 fOutputList->Add(&fVertexString);
108 //_____________________________________________________________________
109 void AliFMDAnalysisTaskDensity::ConnectInputData(Option_t */*option*/)
112 fESD = (AliESDFMD*)GetInputData(0);
113 fVertex = (AliESDVertex*)GetInputData(1);
116 //_____________________________________________________________________
117 void AliFMDAnalysisTaskDensity::Exec(Option_t */*option*/)
119 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
120 AliFMDGeometry* geo = AliFMDGeometry::Instance();
122 //AliESDFMD* fmd = fESD->GetFMDData();
125 fVertex->GetXYZ(vertex);
127 if( TMath::Abs(vertex[2]) > pars->GetVtxCutZ())
129 Double_t delta = 2*pars->GetVtxCutZ()/pars->GetNvtxBins();
130 Double_t vertexBinDouble = (vertex[2] + pars->GetVtxCutZ()) / delta;
132 Int_t vtxbin = (Int_t)vertexBinDouble;
134 fVertexString.SetString(Form("%d",vtxbin));
136 for(UShort_t det=1;det<=3;det++) {
137 TObjArray* detArray = (TObjArray*)fArray.At(det);
138 Int_t nRings = (det==1 ? 1 : 2);
139 for (UShort_t ir = 0; ir < nRings; ir++) {
140 TObjArray* vtxArray = (TObjArray*)detArray->At(ir);
142 TH2F* hMult = (TH2F*)vtxArray->At(vtxbin);
149 for(UShort_t det=1;det<=3;det++) {
150 TObjArray* detArray = (TObjArray*)fArray.At(det);
151 Int_t nRings = (det==1 ? 1 : 2);
152 for (UShort_t ir = 0; ir < nRings; ir++) {
153 TObjArray* vtxArray = (TObjArray*)detArray->At(ir);
155 TH2F* hMult = (TH2F*)vtxArray->At(vtxbin);
156 Char_t ring = (ir == 0 ? 'I' : 'O');
157 UShort_t nsec = (ir == 0 ? 20 : 40);
158 UShort_t nstr = (ir == 0 ? 512 : 256);
159 for(UShort_t sec =0; sec < nsec; sec++) {
160 for(UShort_t strip = 0; strip < nstr; strip++) {
161 Float_t mult = fESD->Multiplicity(det,ring,sec,strip);
162 if(mult < 1 || mult == AliESDFMD::kInvalidMult) continue;
163 Float_t eta = fESD->Eta(det,ring,sec,strip);
165 geo->Detector2XYZ(det,ring,sec,strip,x,y,z);
166 Float_t phi = TMath::ATan2(y,x);
168 phi = phi+2*TMath::Pi();
169 Float_t correction = GetAcceptanceCorrection(ring,strip);
170 if(correction) mult = mult / correction;
171 hMult->Fill(eta,phi,mult);
180 PostData(0, fOutputList);
184 //_____________________________________________________________________
185 Float_t AliFMDAnalysisTaskDensity::GetAcceptanceCorrection(Char_t ring, UShort_t strip)
187 AliFMDRing fmdring(ring);
189 Float_t rad = fmdring.GetMaxR()-fmdring.GetMinR();
190 Float_t segment = rad / fmdring.GetNStrips();
191 Float_t radius = fmdring.GetMinR() + segment*strip;
193 Float_t basearea1 = 0.5*fmdring.GetBaseStripLength(strip)*TMath::Power(radius,2);
194 Float_t basearea2 = 0.5*fmdring.GetBaseStripLength(strip)*TMath::Power((radius-segment),2);
195 Float_t basearea = basearea1 - basearea2;
197 Float_t area1 = 0.5*fmdring.GetStripLength(strip)*TMath::Power(radius,2);
198 Float_t area2 = 0.5*fmdring.GetStripLength(strip)*TMath::Power((radius-segment),2);
199 Float_t area = area1 - area2;
201 Float_t correction = area/basearea;