4 #include <TInterpreter.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"
20 #include "AliESDVertex.h"
22 #include "AliFMDAnaParameters.h"
23 //#include "AliFMDGeometry.h"
24 #include "AliGenEventHeader.h"
25 #include "AliHeader.h"
26 //#include "TDatabasePDG.h"
27 //#include "TParticlePDG.h"
28 #include "AliFMDStripIndex.h"
29 ClassImp(AliFMDAnalysisTaskDndeta)
32 AliFMDAnalysisTaskDndeta::AliFMDAnalysisTaskDndeta()
46 // Default constructor
47 DefineInput (0, TList::Class());
48 DefineOutput(0, TList::Class());
50 //_____________________________________________________________________
51 AliFMDAnalysisTaskDndeta::AliFMDAnalysisTaskDndeta(const char* name, Bool_t SE):
52 AliAnalysisTask(name, "Density"),
68 DefineInput (0, TList::Class());
69 DefineInput(1, TObjString::Class());
70 DefineOutput(0, TList::Class());
74 //_____________________________________________________________________
75 void AliFMDAnalysisTaskDndeta::CreateOutputObjects()
77 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
79 fArray.SetName("FMD");
83 fOutputList = new TList();
84 fOutputList->SetName("BackgroundCorrected");
89 TH1F* hPrimVertexBin = 0;
92 TH2F* hBgTmp = pars->GetBackgroundCorrection(1, 'I', 0);
93 TH1F* hPrimary = new TH1F("hMultvsEta","hMultvsEta",
95 hBgTmp->GetXaxis()->GetXmin(),
96 hBgTmp->GetXaxis()->GetXmax());
98 fOutputList->Add(hPrimary);
99 Int_t nVtxbins = pars->GetNvtxBins();
102 for(Int_t det =1; det<=3;det++)
104 TObjArray* detArray = new TObjArray();
105 detArray->SetName(Form("FMD%d",det));
106 fArray.AddAtAndExpand(detArray,det);
107 Int_t nRings = (det==1 ? 1 : 2);
108 for(Int_t ring = 0;ring<nRings;ring++)
110 Char_t ringChar = (ring == 0 ? 'I' : 'O');
111 Int_t nSec = (ring == 0 ? 20 : 40);
113 TObjArray* vtxArray = new TObjArray();
114 vtxArray->SetName(Form("FMD%d%c",det,ringChar));
115 detArray->AddAtAndExpand(vtxArray,ring);
116 for(Int_t i = 0; i< nVtxbins; i++) {
117 TH2F* hBg = pars->GetBackgroundCorrection(det, ringChar, i);
118 hMult = new TH2F(Form("dNdeta_FMD%d%c_vtxbin%d",det,ringChar,i),Form("dNdeta_FMD%d%c_vtxbin%d",det,ringChar,i),
120 hBg->GetXaxis()->GetXmin(),
121 hBg->GetXaxis()->GetXmax(),
122 nSec, 0, 2*TMath::Pi());
124 hHits = new TH1F(Form("hHits_FMD%d%c_vtxbin%d",det,ringChar,i),Form("hHits_FMD%d%c_vtxbin%d",det,ringChar,i),
126 hBg->GetXaxis()->GetXmin(),
127 hBg->GetXaxis()->GetXmax());
133 fOutputList->Add(hMult);
134 fOutputList->Add(hHits);
135 vtxArray->AddAtAndExpand(hMult,i);
141 for(Int_t i = 0; i< nVtxbins; i++) {
143 hPrimVertexBin = new TH1F(Form("primmult_vtxbin%d",i),
144 Form("primmult_vtxbin%d",i),
146 hBgTmp->GetXaxis()->GetXmin(),
147 hBgTmp->GetXaxis()->GetXmax());
148 hPrimVertexBin->Sumw2();
149 fOutputList->Add(hPrimVertexBin);
153 fNevents.SetBins(nVtxbins,0,nVtxbins);
154 fNevents.SetName("nEvents");
155 fNMCevents.SetBins(nVtxbins,0,nVtxbins);
156 fNMCevents.SetName("nMCEvents");
157 fOutputList->Add(&fNevents);
158 fOutputList->Add(&fNMCevents);
161 //_____________________________________________________________________
162 void AliFMDAnalysisTaskDndeta::ConnectInputData(Option_t */*option*/)
165 fInputList = (TList*)GetInputData(0);
166 fVertexString = (TObjString*)GetInputData(1);
169 //_____________________________________________________________________
170 void AliFMDAnalysisTaskDndeta::Exec(Option_t */*option*/)
172 Int_t vtxbin = fVertexString->GetString().Atoi();
173 fNevents.Fill(vtxbin);
174 for(UShort_t det=1;det<=3;det++) {
175 //TObjArray* detInputArray = (TObjArray*)fInputArray->At(det);
176 TObjArray* detArray = (TObjArray*)fArray.At(det);
177 Int_t nRings = (det==1 ? 1 : 2);
178 for (UShort_t ir = 0; ir < nRings; ir++) {
179 Char_t ringChar = (ir == 0 ? 'I' : 'O');
180 //TObjArray* vtxInputArray = (TObjArray*)detInputArray->At(ir);
181 TObjArray* vtxArray = (TObjArray*)detArray->At(ir);
182 TH2F* hMultTotal = (TH2F*)vtxArray->At(vtxbin);
185 TH2F* hMultInput = (TH2F*)fInputList->FindObject(Form("mult_FMD%d%c_vtxbin%d",det,ringChar,vtxbin));
187 hMultTotal->Add(hMultInput);
193 if(fMCevent && fPrimary)
197 PostData(0, fOutputList);
201 //_____________________________________________________________________
202 void AliFMDAnalysisTaskDndeta::Terminate(Option_t */*option*/) {
205 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
207 Int_t nVtxbins = pars->GetNvtxBins();
209 for(UShort_t det=1;det<=3;det++) {
210 TObjArray* detArray = (TObjArray*)fArray.At(det);
211 Int_t nRings = (det==1 ? 1 : 2);
212 for (UShort_t ir = 0; ir < nRings; ir++) {
213 TObjArray* vtxArray = (TObjArray*)detArray->At(ir);
214 Char_t ringChar = (ir == 0 ? 'I' : 'O');
215 for(Int_t i =0; i<nVtxbins; i++) {
216 TH2F* hMultTotal = (TH2F*)vtxArray->At(i);
217 TH1D* hMultProj = hMultTotal->ProjectionX(Form("dNdeta_FMD%d%c_vtxbin%d_proj",det,ringChar,i),1,hMultTotal->GetNbinsY());
218 fOutputList->Add(hMultProj);
224 //_____________________________________________________________________
225 void AliFMDAnalysisTaskDndeta::ProcessPrimary() {
227 fLastTrackByStrip.Reset(-1);
229 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
231 AliMCParticle* particle = 0;
232 AliStack* stack = fMCevent->Stack();
234 TH1F* hPrimary = (TH1F*)fOutputList->FindObject("hMultvsEta");
235 AliHeader* header = fMCevent->Header();
236 AliGenEventHeader* genHeader = header->GenEventHeader();
239 genHeader->PrimaryVertex(vertex);
240 if(TMath::Abs(vertex.At(2)) > pars->GetVtxCutZ())
242 Double_t delta = 2*pars->GetVtxCutZ()/pars->GetNvtxBins();
243 Double_t vertexBinDouble = (vertex.At(2) + pars->GetVtxCutZ()) / delta;
244 Int_t vertexBin = (Int_t)vertexBinDouble;
246 Bool_t firstTrack = kTRUE;
247 Int_t nTracks = fMCevent->GetNumberOfTracks();
248 for(Int_t i = 0 ;i<nTracks;i++) {
249 particle = fMCevent->GetTrack(i);
253 if(stack->IsPhysicalPrimary(i) && particle->Charge() != 0) {
254 hPrimary->Fill(particle->Eta());
257 TH1F* hPrimVtxBin = (TH1F*)fOutputList->FindObject(Form("primmult_vtxbin%d",vertexBin));
258 hPrimVtxBin->Fill(particle->Eta());
260 fNMCevents.Fill(vertexBin);
265 for(Int_t j=0; j<particle->GetNumberOfTrackReferences();j++) {
267 AliTrackReference* ref = particle->GetTrackReference(j);
268 UShort_t det,sec,strip;
270 if(ref->DetectorId() != AliTrackReference::kFMD)
272 AliFMDStripIndex::Unpack(ref->UserId(),det,ring,sec,strip);
273 Float_t thisStripTrack = fLastTrackByStrip(det,ring,sec,strip);
274 if(particle->Charge() != 0 && i != thisStripTrack ) {
277 Float_t eta = pars->GetEtaFromStrip(det,ring,sec,strip,vertex.At(2));//-1*TMath::Log(TMath::Tan(0.5*theta));
278 TH1F* hHits = (TH1F*)fOutputList->FindObject(Form("hHits_FMD%d%c_vtxbin%d",det,ring,vertexBin));
280 Float_t nstrips = (ring =='O' ? 256 : 512);
282 //if(det == 1 && ring == 'I')
283 // std::cout<<"hit in "<<det<<" "<<ring<<" "<<sec<<" "<<strip<<" "<<std::endl;
284 fLastTrackByStrip(det,ring,sec,strip) = (Float_t)i;
287 fLastTrackByStrip(det,ring,sec,strip-1) = (Float_t)i;
288 if(strip < (nstrips - 1))
289 fLastTrackByStrip(det,ring,sec,strip+1) = (Float_t)i;
299 //_____________________________________________________________________