]> git.uio.no Git - u/mrichter/AliRoot.git/blob - FMD/analysis/AliFMDAnalysisTaskDensity.cxx
This is rather large upgrade of the analysis. The sharing correction has been improve...
[u/mrichter/AliRoot.git] / FMD / analysis / AliFMDAnalysisTaskDensity.cxx
1  
2 #include <TROOT.h>
3 #include <TSystem.h>
4 #include <TInterpreter.h>
5 #include <TChain.h>
6 #include <TFile.h>
7 #include <TList.h>
8 #include <iostream>
9 #include "TAxis.h"
10 #include "TH2F.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"
18 #include "AliStack.h"
19 #include "AliESDVertex.h"
20 #include "TMath.h"
21 #include "AliFMDAnaParameters.h"
22 #include "AliFMDGeometry.h"
23 #include "AliFMDRing.h"
24
25 ClassImp(AliFMDAnalysisTaskDensity)
26
27 //_____________________________________________________________________
28 AliFMDAnalysisTaskDensity::AliFMDAnalysisTaskDensity()
29 : fDebug(0),
30   fOutputList(),
31   fArray(),
32   fESD(0x0),
33   fVertexString(),
34   fVertex(0),
35   fStandalone(kTRUE),
36   fStatus(kTRUE)
37 {
38   // Default constructor
39   DefineInput (0, AliESDFMD::Class());
40   DefineInput (1, AliESDVertex::Class());
41   DefineOutput(0,TList::Class());
42 }
43 //_____________________________________________________________________
44 AliFMDAnalysisTaskDensity::AliFMDAnalysisTaskDensity(const char* name, Bool_t SE):
45     AliAnalysisTask(name, "Density"),
46     fDebug(0),
47     fOutputList(0),
48     fArray(),
49     fESD(0x0),
50     fVertexString(),
51     fVertex(0),
52     fStandalone(kTRUE),
53     fStatus(kTRUE)
54 {
55   fStandalone = SE;
56   if(fStandalone) {
57     DefineInput (0, AliESDFMD::Class());
58     DefineInput (1, AliESDVertex::Class());
59     DefineOutput(0, TList::Class());
60   }
61 }
62 //_____________________________________________________________________
63 void AliFMDAnalysisTaskDensity::CreateOutputObjects()
64 {
65   AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
66   
67   fArray.SetName("FMD");
68   fArray.SetOwner();
69   if(!fOutputList)
70     fOutputList = new TList();
71   fOutputList->SetName("density_list");
72   
73   fOutputList->Add(&fArray);
74   fOutputList->Add(&fVertexString);
75   
76   TH2F* hMult = 0;
77   
78   Int_t nVtxbins = pars->GetNvtxBins();
79   
80   for(Int_t det =1; det<=3;det++)
81     {
82       TObjArray* detArray = new TObjArray();
83       detArray->SetName(Form("FMD%d",det));
84       fArray.AddAtAndExpand(detArray,det);
85       Int_t nRings = (det==1 ? 1 : 2);
86       for(Int_t ring = 0;ring<nRings;ring++)
87         {
88           Char_t ringChar = (ring == 0 ? 'I' : 'O');
89           Int_t  nSec     = (ring == 0 ? 20 : 40);
90           
91           TObjArray* vtxArray = new TObjArray();
92           vtxArray->SetName(Form("FMD%d%c",det,ringChar));
93           detArray->AddAtAndExpand(vtxArray,ring);
94           for(Int_t i = 0; i< nVtxbins; i++) {
95             TH2F* hBg = pars->GetBackgroundCorrection(det, ringChar, i);
96             
97             hMult  = new TH2F(Form("FMD%d%c_vtxbin%d",det,ringChar,i),Form("FMD%d%c_vtxbin%d",det,ringChar,i),
98                               hBg->GetNbinsX(),
99                               hBg->GetXaxis()->GetXmin(),
100                               hBg->GetXaxis()->GetXmax(),
101                               nSec, 0, 2*TMath::Pi());
102             
103             vtxArray->AddAtAndExpand(hMult,i);
104           }
105         } 
106     }
107   
108   
109   
110   
111 }
112 //_____________________________________________________________________
113 void AliFMDAnalysisTaskDensity::ConnectInputData(Option_t */*option*/)
114 {
115   if(fStandalone) {
116     fESD    = (AliESDFMD*)GetInputData(0);
117     fVertex = (AliESDVertex*)GetInputData(1);
118   }
119 }
120 //_____________________________________________________________________
121 void AliFMDAnalysisTaskDensity::Exec(Option_t */*option*/)
122 {
123   AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
124   AliFMDGeometry* geo       = AliFMDGeometry::Instance();
125   
126   //AliESDFMD*   fmd = fESD->GetFMDData();
127   
128   Double_t vertex[3];
129   fVertex->GetXYZ(vertex);
130   // Z Vtx cut
131   if( TMath::Abs(vertex[2]) > pars->GetVtxCutZ()) {
132     fStatus = kFALSE;
133     return;
134   }
135   else
136     fStatus = kTRUE;
137   
138   Double_t delta = 2*pars->GetVtxCutZ()/pars->GetNvtxBins();
139   Double_t vertexBinDouble = (vertex[2] + pars->GetVtxCutZ()) / delta;
140   
141   Int_t vtxbin = (Int_t)vertexBinDouble;
142
143   fVertexString.SetString(Form("%d",vtxbin));
144   //Reset everything
145   for(UShort_t det=1;det<=3;det++) {
146     TObjArray* detArray = (TObjArray*)fArray.At(det);
147     Int_t nRings = (det==1 ? 1 : 2);
148     for (UShort_t ir = 0; ir < nRings; ir++) {
149       TObjArray* vtxArray = (TObjArray*)detArray->At(ir);
150       
151       TH2F* hMult   = (TH2F*)vtxArray->At(vtxbin); 
152       hMult->Reset();
153     }
154     
155   }
156   
157   
158   for(UShort_t det=1;det<=3;det++) {
159     TObjArray* detArray = (TObjArray*)fArray.At(det);
160     Int_t nRings = (det==1 ? 1 : 2);
161     for (UShort_t ir = 0; ir < nRings; ir++) {
162       TObjArray* vtxArray = (TObjArray*)detArray->At(ir);
163       
164       TH2F* hMult   = (TH2F*)vtxArray->At(vtxbin);
165       
166       Char_t   ring = (ir == 0 ? 'I' : 'O');
167       UShort_t nsec = (ir == 0 ? 20  : 40);
168       UShort_t nstr = (ir == 0 ? 512 : 256);
169       
170       for(UShort_t sec =0; sec < nsec;  sec++)  {
171         for(UShort_t strip = 0; strip < nstr; strip++) {
172           Float_t mult = fESD->Multiplicity(det,ring,sec,strip);
173           Float_t mult_cut = 0.1;
174           if(mult == 0 || mult == AliESDFMD::kInvalidMult) continue;
175           //Particle number cut goes here...
176           Float_t nParticles = 0;
177           if(mult > mult_cut)
178             nParticles = 1;
179           Float_t eta = fESD->Eta(det,ring,sec,strip);
180           Double_t x,y,z;
181           geo->Detector2XYZ(det,ring,sec,strip,x,y,z);
182           Float_t phi = TMath::ATan2(y,x);
183           if(phi<0)
184             phi = phi+2*TMath::Pi();
185           Float_t correction = GetAcceptanceCorrection(ring,strip);
186           if(correction) mult = mult / correction;
187           hMult->Fill(eta,phi,nParticles);
188           
189           
190         }
191       }
192       
193     }
194     
195         
196   
197   }
198   if(fStandalone) {
199     PostData(0, fOutputList); 
200   }
201   
202 }
203 //_____________________________________________________________________
204 Float_t AliFMDAnalysisTaskDensity::GetAcceptanceCorrection(Char_t ring, UShort_t strip)
205 {
206   AliFMDRing fmdring(ring);
207   fmdring.Init();
208   Float_t   rad       = fmdring.GetMaxR()-fmdring.GetMinR();
209   Float_t   segment   = rad / fmdring.GetNStrips();
210   Float_t   radius    = fmdring.GetMinR() + segment*strip;
211   
212   Float_t   basearea1 = 0.5*fmdring.GetBaseStripLength(strip)*TMath::Power(radius,2);
213   Float_t   basearea2 = 0.5*fmdring.GetBaseStripLength(strip)*TMath::Power((radius-segment),2);
214   Float_t   basearea  = basearea1 - basearea2;
215   
216   Float_t   area1     = 0.5*fmdring.GetStripLength(strip)*TMath::Power(radius,2);
217   Float_t   area2     = 0.5*fmdring.GetStripLength(strip)*TMath::Power((radius-segment),2);
218   Float_t   area      = area1 - area2;
219   
220   Float_t correction = area/basearea;
221   
222   return correction;
223 }
224
225 //
226 //EOF
227 //