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 "AliGenPythiaEventHeader.h"
26 #include "AliHeader.h"
27 //#include "TDatabasePDG.h"
28 //#include "TParticlePDG.h"
29 #include "AliFMDStripIndex.h"
30 #include "AliESDInputHandler.h"
32 ClassImp(AliFMDAnalysisTaskDndeta)
35 AliFMDAnalysisTaskDndeta::AliFMDAnalysisTaskDndeta()
49 // Default constructor
50 DefineInput (0, TList::Class());
51 DefineOutput(0, TList::Class());
53 //_____________________________________________________________________
54 AliFMDAnalysisTaskDndeta::AliFMDAnalysisTaskDndeta(const char* name, Bool_t SE):
55 AliAnalysisTask(name, "Density"),
71 DefineInput (0, TList::Class());
72 DefineInput(1, TObjString::Class());
73 DefineOutput(0, TList::Class());
77 //_____________________________________________________________________
78 void AliFMDAnalysisTaskDndeta::CreateOutputObjects()
80 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
83 fOutputList = new TList();
84 fOutputList->SetName("BackgroundCorrected");
91 TH1F* hPrimVertexBin = 0;
92 TH1F* hPrimVertexBinNSD = 0;
94 TH2F* hBgTmp = pars->GetBackgroundCorrection(1, 'I', 0);
95 TH1F* hPrimary = new TH1F("hMultvsEta","hMultvsEta",
97 hBgTmp->GetXaxis()->GetXmin(),
98 hBgTmp->GetXaxis()->GetXmax());
100 fOutputList->Add(hPrimary);
101 TH1F* hPrimaryNSD = new TH1F("hMultvsEtaNSD","hMultvsEtaNSD",
103 hBgTmp->GetXaxis()->GetXmin(),
104 hBgTmp->GetXaxis()->GetXmax());
105 hPrimaryNSD->Sumw2();
106 fOutputList->Add(hPrimaryNSD);
107 Int_t nVtxbins = pars->GetNvtxBins();
109 for(Int_t i = 0; i< nVtxbins; i++) {
111 for(Int_t det =1; det<=3;det++)
113 Int_t nRings = (det==1 ? 1 : 2);
114 for(Int_t ring = 0;ring<nRings;ring++)
116 Char_t ringChar = (ring == 0 ? 'I' : 'O');
117 Int_t nSec = (ring == 0 ? 20 : 40);
121 hBg = pars->GetBackgroundCorrection(det, ringChar, i);
122 hMult = new TH2F(Form("dNdeta_FMD%d%c_vtxbin%d",det,ringChar,i),Form("dNdeta_FMD%d%c_vtxbin%d",det,ringChar,i),
124 hBg->GetXaxis()->GetXmin(),
125 hBg->GetXaxis()->GetXmax(),
126 nSec, 0, 2*TMath::Pi());
127 hMultTrVtx = new TH2F(Form("dNdetaTrVtx_FMD%d%c_vtxbin%d",det,ringChar,i),Form("dNdetaTrVtx_FMD%d%c_vtxbin%d",det,ringChar,i),
129 hBg->GetXaxis()->GetXmin(),
130 hBg->GetXaxis()->GetXmax(),
131 nSec, 0, 2*TMath::Pi());
132 hMultNSD = new TH2F(Form("dNdetaNSD_FMD%d%c_vtxbin%d",det,ringChar,i),Form("dNdetaNSD_FMD%d%c_vtxbin%d",det,ringChar,i),
134 hBg->GetXaxis()->GetXmin(),
135 hBg->GetXaxis()->GetXmax(),
136 nSec, 0, 2*TMath::Pi());
137 hHits = new TH1F(Form("hMCHits_FMD%d%c_vtxbin%d",det,ringChar,i),Form("hMCHits_FMD%d%c_vtxbin%d",det,ringChar,i),
139 hBg->GetXaxis()->GetXmin(),
140 hBg->GetXaxis()->GetXmax());
142 fOutputList->Add(hHits);
145 fOutputList->Add(hMult);
148 fOutputList->Add(hMultTrVtx);
151 fOutputList->Add(hMultNSD);
157 for(Int_t i = 0; i< nVtxbins; i++) {
159 hPrimVertexBin = new TH1F(Form("primmult_vtxbin%d",i),
160 Form("primmult_vtxbin%d",i),
162 hBgTmp->GetXaxis()->GetXmin(),
163 hBgTmp->GetXaxis()->GetXmax());
164 hPrimVertexBin->Sumw2();
165 fOutputList->Add(hPrimVertexBin);
167 hPrimVertexBinNSD = new TH1F(Form("primmult_NSD_vtxbin%d",i),
168 Form("primmult_NSD_vtxbin%d",i),
170 hBgTmp->GetXaxis()->GetXmin(),
171 hBgTmp->GetXaxis()->GetXmax());
172 hPrimVertexBinNSD->Sumw2();
173 fOutputList->Add(hPrimVertexBinNSD);
177 TH2F* hSPDMult = new TH2F(Form("dNdeta_SPD_vtxbin%d",i),Form("dNdeta_SPD_vtxbin%d",i),
179 hBgTmp->GetXaxis()->GetXmin(),
180 hBgTmp->GetXaxis()->GetXmax(),
181 20, 0, 2*TMath::Pi());
183 fOutputList->Add(hSPDMult);
184 TH2F* hSPDMultTrVtx = new TH2F(Form("dNdetaTrVtx_SPD_vtxbin%d",i),Form("dNdetaTrVtx_SPD_vtxbin%d",i),
186 hBgTmp->GetXaxis()->GetXmin(),
187 hBgTmp->GetXaxis()->GetXmax(),
188 20, 0, 2*TMath::Pi());
189 hSPDMultTrVtx->Sumw2();
190 fOutputList->Add(hSPDMultTrVtx);
192 TH2F* hSPDMultNSD = new TH2F(Form("dNdetaNSD_SPD_vtxbin%d",i),Form("dNdetaNSD_SPD_vtxbin%d",i),
194 hBgTmp->GetXaxis()->GetXmin(),
195 hBgTmp->GetXaxis()->GetXmax(),
196 20, 0, 2*TMath::Pi());
197 hSPDMultNSD->Sumw2();
198 fOutputList->Add(hSPDMultNSD);
202 //AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
204 // TH2F* dNdetadphiHistogramTotal = new TH2F("dNdetadphiHistogramTotal","dNdetadphiHistogram;#eta;#Phi",pars->GetNetaBins(),-6,6,20,0,2*TMath::Pi());
205 //dNdetadphiHistogramTotal->SetErrorOption("g");
206 //fOutputList->Add(dNdetadphiHistogramTotal);
210 fNevents.SetBins(nVtxbins,0,nVtxbins);
211 fNevents.SetName("nEvents");
212 fNNSDevents.SetBins(nVtxbins,0,nVtxbins);
213 fNNSDevents.SetName("nNSDEvents");
215 fNMCevents.SetBins(nVtxbins,0,nVtxbins);
216 fNMCevents.SetName("nMCEvents");
217 fNMCNSDevents.SetBins(nVtxbins,0,nVtxbins);
218 fNMCNSDevents.SetName("nMCNSDEvents");
219 fOutputList->Add(&fNevents);
220 fOutputList->Add(&fNNSDevents);
221 fOutputList->Add(&fNMCevents);
222 fOutputList->Add(&fNMCNSDevents);
224 //_____________________________________________________________________
225 void AliFMDAnalysisTaskDndeta::ConnectInputData(Option_t */*option*/)
228 fInputList = (TList*)GetInputData(0);
231 //_____________________________________________________________________
232 void AliFMDAnalysisTaskDndeta::Exec(Option_t */*option*/)
234 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
235 fVertexString = (TObjString*)fInputList->At(0);
237 Int_t vtxbin = fVertexString->GetString().Atoi();
239 fNevents.Fill(vtxbin);
241 //AliESDInputHandler* eventHandler = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
242 //AliESDEvent* esd = eventHandler->GetEvent();
243 Bool_t nsd = pars->IsEventTriggered(AliFMDAnaParameters::kNSD);
244 if(nsd) fNNSDevents.Fill(vtxbin);
246 for(UShort_t det=1;det<=3;det++) {
247 Int_t nRings = (det==1 ? 1 : 2);
248 for (UShort_t ir = 0; ir < nRings; ir++) {
249 Char_t ringChar = (ir == 0 ? 'I' : 'O');
251 TH2F* hMultTotal = (TH2F*)fOutputList->FindObject(Form("dNdeta_FMD%d%c_vtxbin%d",det,ringChar,vtxbin));
252 TH2F* hMultTotalTrVtx = (TH2F*)fOutputList->FindObject(Form("dNdetaTrVtx_FMD%d%c_vtxbin%d",det,ringChar,vtxbin));
253 TH2F* hMultTotalNSD = (TH2F*)fOutputList->FindObject(Form("dNdetaNSD_FMD%d%c_vtxbin%d",det,ringChar,vtxbin));
256 TH2F* hMultInput = (TH2F*)fInputList->FindObject(Form("mult_FMD%d%c_vtxbin%d",det,ringChar,vtxbin));
257 TH2F* hMultInputTrVtx = (TH2F*)fInputList->FindObject(Form("multTrVtx_FMD%d%c_vtxbin%d",det,ringChar,vtxbin));
258 TH2F* hMultInputNSD = (TH2F*)fInputList->FindObject(Form("multNSD_FMD%d%c_vtxbin%d",det,ringChar,vtxbin));
260 hMultTotal->Add(hMultInput);
261 hMultTotalTrVtx->Add(hMultInputTrVtx);
263 hMultTotalNSD->Add(hMultInputNSD);
269 TH2F* hMultSPDTotal = (TH2F*)fOutputList->FindObject(Form("dNdeta_SPD_vtxbin%d",vtxbin));
270 TH2F* hMultSPDTotalTrVtx = (TH2F*)fOutputList->FindObject(Form("dNdetaTrVtx_SPD_vtxbin%d",vtxbin));
271 TH2F* hMultSPDTotalNSD = (TH2F*)fOutputList->FindObject(Form("dNdetaNSD_SPD_vtxbin%d",vtxbin));
272 TH2F* hMultSPDInput = (TH2F*)fInputList->FindObject(Form("mult_SPD_vtxbin%d",vtxbin));
273 TH2F* hMultSPDInputTrVtx = (TH2F*)fInputList->FindObject(Form("multTrVtx_SPD_vtxbin%d",vtxbin));
274 TH2F* hMultSPDInputNSD = (TH2F*)fInputList->FindObject(Form("multNSD_SPD_vtxbin%d",vtxbin));
276 hMultSPDTotal->Add(hMultSPDInput);
277 hMultSPDTotalTrVtx->Add(hMultSPDInputTrVtx);
279 hMultSPDTotalNSD->Add(hMultSPDInputNSD);
281 if(pars->GetProcessPrimary())
284 //TH2F* dNdetadphiHistogram = (TH2F*)fOutputList->FindObject("dNdetadphiHistogramSPDTrVtx");
286 // TH2F* dNdetadphiHistogramTotal = (TH2F*)fOutputList->FindObject("dNdetadphiHistogramTotal");
289 // dNdetadphiHistogramTotal->Add(dNdetadphiHistogram);
295 PostData(0, fOutputList);
299 //_____________________________________________________________________
300 void AliFMDAnalysisTaskDndeta::Terminate(Option_t */*option*/) {
302 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
304 Int_t nVtxbins = pars->GetNvtxBins();
306 for(UShort_t det=1;det<=3;det++) {
307 Int_t nRings = (det==1 ? 1 : 2);
308 for (UShort_t ir = 0; ir < nRings; ir++) {
309 Char_t ringChar = (ir == 0 ? 'I' : 'O');
310 for(Int_t i =0; i<nVtxbins; i++) {
312 TH2F* hMultTotal = (TH2F*)fOutputList->FindObject(Form("dNdeta_FMD%d%c_vtxbin%d",det,ringChar,i));
314 hMultTotal->Scale(fVtxEff);
316 TH2F* hMultTotalNSD = (TH2F*)fOutputList->FindObject(Form("dNdetaNSD_FMD%d%c_vtxbin%d",det,ringChar,i));
318 hMultTotalNSD->Scale(fVtxEffNSD);
320 //TH2F* hMultTrVtx = (TH2F*)hMultTotal->Clone(Form("dNdeta_FMD%d%c_TrVtx_vtxbin%d",det,ringChar,i));
321 TH2F* hMultTrVtx = (TH2F*)fOutputList->FindObject(Form("dNdetaTrVtx_FMD%d%c_vtxbin%d",det,ringChar,i));
323 TH1D* hMultProj = hMultTotal->ProjectionX(Form("dNdeta_FMD%d%c_vtxbin%d_proj",det,ringChar,i),1,hMultTotal->GetNbinsY());
324 TH1D* hMultProjTrVtx = hMultTrVtx->ProjectionX(Form("dNdeta_FMD%d%c_TrVtx_vtxbin%d_proj",det,ringChar,i),1,hMultTrVtx->GetNbinsY());
325 TH1D* hMultProjNSD = hMultTotalNSD->ProjectionX(Form("dNdetaNSD_FMD%d%c_vtxbin%d_proj",det,ringChar,i),1,hMultTotalNSD->GetNbinsY());
327 //fOutputList->Add(hMultTrVtx);
328 fOutputList->Add(hMultProj);
329 fOutputList->Add(hMultProjTrVtx);
330 fOutputList->Add(hMultProjNSD);
335 for(Int_t i =0; i<nVtxbins; i++) {
337 TH2F* hSPDMult = (TH2F*)fOutputList->FindObject(Form("dNdeta_SPD_vtxbin%d",i));
338 TH2F* hSPDMultTrVtx = (TH2F*)fOutputList->FindObject(Form("dNdetaTrVtx_SPD_vtxbin%d",i));
339 TH2F* hSPDMultNSD = (TH2F*)fOutputList->FindObject(Form("dNdetaNSD_SPD_vtxbin%d",i));
342 hSPDMult->Scale(fVtxEff);
345 hSPDMult->Scale(fVtxEffNSD);
347 TH1D* hMultProj = hSPDMult->ProjectionX(Form("dNdeta_SPD_vtxbin%d_proj",i),1,hSPDMult->GetNbinsY());
348 TH1D* hMultProjTrVtx = hSPDMultTrVtx->ProjectionX(Form("dNdetaTrVtx_SPD_vtxbin%d_proj",i),1,hSPDMultTrVtx->GetNbinsY());
349 TH1D* hMultProjNSD = hSPDMultNSD->ProjectionX(Form("dNdetaNSD_SPD_vtxbin%d_proj",i),1,hSPDMultNSD->GetNbinsY());
350 fOutputList->Add(hMultProj);
351 fOutputList->Add(hMultProjTrVtx);
352 fOutputList->Add(hMultProjNSD);
356 std::cout<<"FMD analysis accepted "<<fNevents.GetEntries()<<" INEL events and "<<fNNSDevents.GetEntries()<<" NSD events"<<std::endl;
358 //_____________________________________________________________________
359 void AliFMDAnalysisTaskDndeta::ProcessPrimary() {
361 AliMCEventHandler* eventHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
362 AliMCEvent* mcEvent = eventHandler->MCEvent();
366 fLastTrackByStrip.Reset(-1);
368 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
370 AliMCParticle* particle = 0;
371 AliStack* stack = mcEvent->Stack();
373 TH1F* hPrimary = (TH1F*)fOutputList->FindObject("hMultvsEta");
374 TH1F* hPrimaryNSD = (TH1F*)fOutputList->FindObject("hMultvsEtaNSD");
375 AliHeader* header = mcEvent->Header();
376 AliGenEventHeader* genHeader = header->GenEventHeader();
378 AliGenPythiaEventHeader* pythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*>(genHeader);
380 if (!pythiaGenHeader) {
381 std::cout<<" no pythia header!"<<std::endl;
385 Int_t pythiaType = pythiaGenHeader->ProcessType();
387 if(pythiaType==92||pythiaType==93)
391 genHeader->PrimaryVertex(vertex);
392 if(TMath::Abs(vertex.At(2)) > pars->GetVtxCutZ())
394 Double_t delta = 2*pars->GetVtxCutZ()/pars->GetNvtxBins();
395 Double_t vertexBinDouble = (vertex.At(2) + pars->GetVtxCutZ()) / delta;
396 Int_t vertexBin = (Int_t)vertexBinDouble;
398 Bool_t firstTrack = kTRUE;
399 Bool_t firstTrackNSD = kTRUE;
401 TH1F* hPrimVtxBinNSD = (TH1F*)fOutputList->FindObject(Form("primmult_NSD_vtxbin%d",vertexBin));
402 TH1F* hPrimVtxBin = (TH1F*)fOutputList->FindObject(Form("primmult_vtxbin%d",vertexBin));
404 // we loop over the primaries only unless we need the hits (diagnostics running slowly)
405 Int_t nTracks = stack->GetNprimary();
406 if(pars->GetProcessHits())
407 nTracks = stack->GetNtrack();
409 for(Int_t i = 0 ;i<nTracks;i++) {
410 particle = (AliMCParticle*) mcEvent->GetTrack(i);
414 if(stack->IsPhysicalPrimary(i) && particle->Charge() != 0) {
415 hPrimary->Fill(particle->Eta());
416 hPrimVtxBin->Fill(particle->Eta());
418 fNMCevents.Fill(vertexBin);
423 hPrimaryNSD->Fill(particle->Eta());
424 hPrimVtxBinNSD->Fill(particle->Eta());
426 fNMCNSDevents.Fill(vertexBin);
427 firstTrackNSD = kFALSE;
434 if(pars->GetProcessHits()) {
436 for(Int_t j=0; j<particle->GetNumberOfTrackReferences();j++) {
438 AliTrackReference* ref = particle->GetTrackReference(j);
439 UShort_t det,sec,strip;
441 if(ref->DetectorId() != AliTrackReference::kFMD)
443 AliFMDStripIndex::Unpack(ref->UserId(),det,ring,sec,strip);
444 Float_t thisStripTrack = fLastTrackByStrip(det,ring,sec,strip);
445 if(particle->Charge() != 0 && i != thisStripTrack ) {
448 Float_t eta = pars->GetEtaFromStrip(det,ring,sec,strip,vertex.At(2));//-1*TMath::Log(TMath::Tan(0.5*theta));
449 TH1F* hHits = (TH1F*)fOutputList->FindObject(Form("hMCHits_FMD%d%c_vtxbin%d",det,ring,vertexBin));
454 Float_t nstrips = (ring =='O' ? 256 : 512);
456 fLastTrackByStrip(det,ring,sec,strip) = (Float_t)i;
459 fLastTrackByStrip(det,ring,sec,strip-1) = (Float_t)i;
460 if(strip < (nstrips - 1))
461 fLastTrackByStrip(det,ring,sec,strip+1) = (Float_t)i;
475 //_____________________________________________________________________