]> git.uio.no Git - u/mrichter/AliRoot.git/blame - FMD/analysis/AliFMDAnalysisTaskDndeta.cxx
This is an upgrade to the FMD analysis which includes better sharing correction,...
[u/mrichter/AliRoot.git] / FMD / analysis / AliFMDAnalysisTaskDndeta.cxx
CommitLineData
7c3e5162 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>
bb8a464f 9#include "TH1F.h"
7c3e5162 10#include "TH2F.h"
11#include "AliFMDAnalysisTaskDndeta.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 "AliLog.h"
20#include "AliESDVertex.h"
21#include "TMath.h"
22#include "AliFMDAnaParameters.h"
23#include "AliFMDGeometry.h"
bb8a464f 24#include "AliGenEventHeader.h"
cc066cb9 25#include "AliHeader.h"
6289b3e8 26#include "TDatabasePDG.h"
27#include "TParticlePDG.h"
cc066cb9 28#include "AliFMDStripIndex.h"
7c3e5162 29ClassImp(AliFMDAnalysisTaskDndeta)
30
31
32AliFMDAnalysisTaskDndeta::AliFMDAnalysisTaskDndeta()
33: fDebug(0),
34 fOutputList(0),
35 fInputList(0),
36 fArray(0),
37 fInputArray(0),
38 fVertexString(0x0),
39 fNevents(),
bb8a464f 40 fNMCevents(),
41 fStandalone(kTRUE),
cc066cb9 42 fMCevent(0),
43 fLastTrackByStrip()
7c3e5162 44{
45 // Default constructor
46 DefineInput (0, TList::Class());
47 DefineOutput(0, TList::Class());
48}
49//_____________________________________________________________________
50AliFMDAnalysisTaskDndeta::AliFMDAnalysisTaskDndeta(const char* name, Bool_t SE):
51 AliAnalysisTask(name, "Density"),
52 fDebug(0),
53 fOutputList(0),
54 fInputList(0),
55 fArray(),
56 fInputArray(0),
57 fVertexString(0x0),
58 fNevents(),
bb8a464f 59 fNMCevents(),
60 fStandalone(kTRUE),
cc066cb9 61 fMCevent(0),
62 fLastTrackByStrip()
7c3e5162 63{
64 fStandalone = SE;
65 if(fStandalone) {
66 DefineInput (0, TList::Class());
67 DefineInput(1, TObjString::Class());
68 DefineOutput(0, TList::Class());
69
70 }
71}
72//_____________________________________________________________________
73void AliFMDAnalysisTaskDndeta::CreateOutputObjects()
74{
75 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
76
77 fArray.SetName("FMD");
78 fArray.SetOwner();
79
80 if(!fOutputList)
81 fOutputList = new TList();
82 fOutputList->SetName("BackgroundCorrected");
83
84
85 TH2F* hMult = 0;
cc066cb9 86 TH1F* hHits = 0;
bb8a464f 87 TH1F* hPrimVertexBin = 0;
7c3e5162 88
bb8a464f 89
5ea1e0a9 90 TH2F* hBgTmp = pars->GetBackgroundCorrection(1, 'I', 0);
bb8a464f 91 TH1F* hPrimary = new TH1F("hMultvsEta","hMultvsEta",
5ea1e0a9 92 hBgTmp->GetNbinsX(),
93 hBgTmp->GetXaxis()->GetXmin(),
94 hBgTmp->GetXaxis()->GetXmax());
bb8a464f 95 hPrimary->Sumw2();
96 fOutputList->Add(hPrimary);
7c3e5162 97 Int_t nVtxbins = pars->GetNvtxBins();
98
bb8a464f 99
7c3e5162 100 for(Int_t det =1; det<=3;det++)
101 {
102 TObjArray* detArray = new TObjArray();
103 detArray->SetName(Form("FMD%d",det));
104 fArray.AddAtAndExpand(detArray,det);
105 Int_t nRings = (det==1 ? 1 : 2);
106 for(Int_t ring = 0;ring<nRings;ring++)
107 {
108 Char_t ringChar = (ring == 0 ? 'I' : 'O');
109 Int_t nSec = (ring == 0 ? 20 : 40);
110
111 TObjArray* vtxArray = new TObjArray();
112 vtxArray->SetName(Form("FMD%d%c",det,ringChar));
113 detArray->AddAtAndExpand(vtxArray,ring);
114 for(Int_t i = 0; i< nVtxbins; i++) {
115 TH2F* hBg = pars->GetBackgroundCorrection(det, ringChar, i);
116 hMult = new TH2F(Form("dNdeta_FMD%d%c_vtxbin%d",det,ringChar,i),Form("dNdeta_FMD%d%c_vtxbin%d",det,ringChar,i),
117 hBg->GetNbinsX(),
118 hBg->GetXaxis()->GetXmin(),
119 hBg->GetXaxis()->GetXmax(),
120 nSec, 0, 2*TMath::Pi());
cc066cb9 121
122 hHits = new TH1F(Form("hHits_FMD%d%c_vtxbin%d",det,ringChar,i),Form("hHits_FMD%d%c_vtxbin%d",det,ringChar,i),
123 hBg->GetNbinsX(),
124 hBg->GetXaxis()->GetXmin(),
125 hBg->GetXaxis()->GetXmax());
126
127
128
7c3e5162 129 hMult->Sumw2();
cc066cb9 130 hHits->Sumw2();
7c3e5162 131 fOutputList->Add(hMult);
cc066cb9 132 fOutputList->Add(hHits);
7c3e5162 133 vtxArray->AddAtAndExpand(hMult,i);
134
135 }
136 }
137 }
138
bb8a464f 139 for(Int_t i = 0; i< nVtxbins; i++) {
140
141 hPrimVertexBin = new TH1F(Form("primmult_vtxbin%d",i),
142 Form("primmult_vtxbin%d",i),
5ea1e0a9 143 hBgTmp->GetNbinsX(),
144 hBgTmp->GetXaxis()->GetXmin(),
145 hBgTmp->GetXaxis()->GetXmax());
bb8a464f 146 hPrimVertexBin->Sumw2();
147 fOutputList->Add(hPrimVertexBin);
148
149 }
150
7c3e5162 151 fNevents.SetBins(nVtxbins,0,nVtxbins);
152 fNevents.SetName("nEvents");
bb8a464f 153 fNMCevents.SetBins(nVtxbins,0,nVtxbins);
154 fNMCevents.SetName("nMCEvents");
7c3e5162 155 fOutputList->Add(&fNevents);
bb8a464f 156 fOutputList->Add(&fNMCevents);
7c3e5162 157
158}
159//_____________________________________________________________________
160void AliFMDAnalysisTaskDndeta::ConnectInputData(Option_t */*option*/)
161{
162 if(fStandalone) {
163 fInputList = (TList*)GetInputData(0);
164 fVertexString = (TObjString*)GetInputData(1);
165 }
166}
167//_____________________________________________________________________
168void AliFMDAnalysisTaskDndeta::Exec(Option_t */*option*/)
169{
170 Int_t vtxbin = fVertexString->GetString().Atoi();
171 fNevents.Fill(vtxbin);
7c3e5162 172 for(UShort_t det=1;det<=3;det++) {
173 //TObjArray* detInputArray = (TObjArray*)fInputArray->At(det);
174 TObjArray* detArray = (TObjArray*)fArray.At(det);
175 Int_t nRings = (det==1 ? 1 : 2);
176 for (UShort_t ir = 0; ir < nRings; ir++) {
177 Char_t ringChar = (ir == 0 ? 'I' : 'O');
178 //TObjArray* vtxInputArray = (TObjArray*)detInputArray->At(ir);
179 TObjArray* vtxArray = (TObjArray*)detArray->At(ir);
180 TH2F* hMultTotal = (TH2F*)vtxArray->At(vtxbin);
181
182
183 TH2F* hMultInput = (TH2F*)fInputList->FindObject(Form("mult_FMD%d%c_vtxbin%d",det,ringChar,vtxbin));
1282ce49 184
7c3e5162 185 hMultTotal->Add(hMultInput);
186
187
188 }
189 }
bb8a464f 190
191 if(fMCevent)
192 ProcessPrimary();
193
7c3e5162 194 if(fStandalone) {
195 PostData(0, fOutputList);
196 }
197
198}
199//_____________________________________________________________________
200void AliFMDAnalysisTaskDndeta::Terminate(Option_t */*option*/) {
201
1282ce49 202
7c3e5162 203 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
204
205 Int_t nVtxbins = pars->GetNvtxBins();
206
207 for(UShort_t det=1;det<=3;det++) {
208 TObjArray* detArray = (TObjArray*)fArray.At(det);
209 Int_t nRings = (det==1 ? 1 : 2);
210 for (UShort_t ir = 0; ir < nRings; ir++) {
211 TObjArray* vtxArray = (TObjArray*)detArray->At(ir);
1282ce49 212 Char_t ringChar = (ir == 0 ? 'I' : 'O');
7c3e5162 213 for(Int_t i =0; i<nVtxbins; i++) {
214 TH2F* hMultTotal = (TH2F*)vtxArray->At(i);
1282ce49 215 TH1D* hMultProj = hMultTotal->ProjectionX(Form("dNdeta_FMD%d%c_vtxbin%d_proj",det,ringChar,i),1,hMultTotal->GetNbinsY());
216 fOutputList->Add(hMultProj);
7c3e5162 217 }
218 }
219 }
1282ce49 220
bb8a464f 221}
222//_____________________________________________________________________
223void AliFMDAnalysisTaskDndeta::ProcessPrimary() {
cc066cb9 224
225 fLastTrackByStrip.Reset(-1);
226
bb8a464f 227 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
228
229 AliMCParticle* particle = 0;
230 AliStack* stack = fMCevent->Stack();
231
232 TH1F* hPrimary = (TH1F*)fOutputList->FindObject("hMultvsEta");
cc066cb9 233 AliHeader* header = fMCevent->Header();
234 AliGenEventHeader* genHeader = header->GenEventHeader();
235
236 TArrayF vertex;
237 genHeader->PrimaryVertex(vertex);
238 if(TMath::Abs(vertex.At(2)) > pars->GetVtxCutZ())
239 return;
240 Double_t delta = 2*pars->GetVtxCutZ()/pars->GetNvtxBins();
241 Double_t vertexBinDouble = (vertex.At(2) + pars->GetVtxCutZ()) / delta;
242 Int_t vertexBin = (Int_t)vertexBinDouble;
bb8a464f 243
244 Bool_t firstTrack = kTRUE;
245 Int_t nTracks = fMCevent->GetNumberOfTracks();
246 for(Int_t i = 0 ;i<nTracks;i++) {
247 particle = fMCevent->GetTrack(i);
248 if(!particle)
249 continue;
6289b3e8 250
bb8a464f 251 if(stack->IsPhysicalPrimary(i) && particle->Charge() != 0) {
252 hPrimary->Fill(particle->Eta());
cc066cb9 253
6289b3e8 254
bb8a464f 255 TH1F* hPrimVtxBin = (TH1F*)fOutputList->FindObject(Form("primmult_vtxbin%d",vertexBin));
256 hPrimVtxBin->Fill(particle->Eta());
257 if(firstTrack) {
258 fNMCevents.Fill(vertexBin);
259 firstTrack = kFALSE;
260 }
261 }
cc066cb9 262
263 for(Int_t j=0; j<particle->GetNumberOfTrackReferences();j++) {
bb8a464f 264
cc066cb9 265 AliTrackReference* ref = particle->GetTrackReference(j);
266 UShort_t det,sec,strip;
267 Char_t ring;
268 if(ref->DetectorId() != AliTrackReference::kFMD)
269 continue;
270 AliFMDStripIndex::Unpack(ref->UserId(),det,ring,sec,strip);
271 Float_t thisStripTrack = fLastTrackByStrip.operator()(det,ring,sec,strip);
272 if(particle->Charge() != 0 && i != thisStripTrack ) {
273 Double_t x,y,z;
274 AliFMDGeometry* fmdgeo = AliFMDGeometry::Instance();
275 fmdgeo->Detector2XYZ(det,ring,sec,strip,x,y,z);
276
277 Float_t phi = TMath::ATan2(y,x);
278 if(phi<0) phi = phi+2*TMath::Pi();
279 Float_t r = TMath::Sqrt(TMath::Power(x,2)+TMath::Power(y,2));
280 Float_t theta = TMath::ATan2(r,z-vertex.At(2));
281 Float_t eta = -1*TMath::Log(TMath::Tan(0.5*theta));
282 TH1F* hHits = (TH1F*)fOutputList->FindObject(Form("hHits_FMD%d%c_vtxbin%d",det,ring,vertexBin));
283 hHits->Fill(eta);
284 Float_t nstrips = (ring =='O' ? 256 : 512);
285
286 // if(det == 1 && ring == 'I')
287 // std::cout<<"hit in FMD 1I "<<sec<<" "<<strip<<" "<<eta<<" "<<phi<<std::endl;
288 fLastTrackByStrip.operator()(det,ring,sec,strip) = (Float_t)i;
289
290 if(strip >0)
291 fLastTrackByStrip.operator()(det,ring,sec,strip-1) = (Float_t)i;
292 if(strip < (nstrips - 1))
293 fLastTrackByStrip.operator()(det,ring,sec,strip+1) = (Float_t)i;
294
295
296 }
297 }
298
299
bb8a464f 300 }
301
7c3e5162 302}
303//_____________________________________________________________________
304//
305//
306// EOF