1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: Satyajit Jena. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
17 //=========================================================================//
18 // AliEbyE Fluctuaion Analysis for PID //
19 // Deepika Jena | drathee@cern.ch //
20 // Satyajit Jena | sjena@cern.ch //
21 //=========================================================================//
32 #include "AliAnalysisTask.h"
33 #include "AliAnalysisManager.h"
35 #include "AliVEvent.h"
36 #include "AliESDEvent.h"
37 #include "AliMCEvent.h"
38 #include "AliAODEvent.h"
41 #include "AliGenEventHeader.h"
42 #include "AliGenPythiaEventHeader.h"
43 #include "AliGenHijingEventHeader.h"
44 #include "AliGenDPMjetEventHeader.h"
45 #include "TDatabasePDG.h"
47 #include "AliEbyEPidRatioTaskOnFly.h"
49 ClassImp(AliEbyEPidRatioTaskOnFly)
51 //-----------------------------------------------------------------------
52 AliEbyEPidRatioTaskOnFly::AliEbyEPidRatioTaskOnFly( const char *name )
53 : AliAnalysisTaskSE( name ),
66 DefineOutput(1, TList::Class());
69 AliEbyEPidRatioTaskOnFly::~AliEbyEPidRatioTaskOnFly()
71 if (fThnList) delete fThnList;
73 for (Int_t ii = 0; ii <= fOrder; ++ii)
74 if (fRedFactp[ii]) delete[] fRedFactp[ii];
75 if (fRedFactp) delete[] fRedFactp;
82 //---------------------------------------------------------------------------------
83 void AliEbyEPidRatioTaskOnFly::UserCreateOutputObjects() {
84 fThnList = new TList();
85 fThnList->SetOwner(kTRUE);
87 const Char_t *name = "Mc";
88 const Char_t *title = Form(" #eta [%2.1f-%2.1f]",fEtaLowerLimit,fEtaHigherLimit);
92 TString sTitle(title);
95 fRedFactp = new Double_t*[fOrder+1];
96 for (Int_t ii = 0 ; ii <= fOrder; ++ii)
97 fRedFactp[ii] = new Double_t[2];
100 fThnList->Add(new TList);
101 TList *list = static_cast<TList*>(fThnList->Last());
102 list->SetName(Form("f%s",name));
103 list->SetOwner(kTRUE);
105 for (Int_t iPid = 0; iPid < 4; ++iPid) {
106 TString sNetTitle(Form("%s - %s",fgkPidLatex[iPid][1],fgkPidLatex[iPid][0]));
108 list->Add(new TProfile(Form("fProfTot%sPlus%s",fgkPidName[iPid],name),
109 Form("(%s) : %s;Centrality(100);(%s)",fgkPidName[iPid], sTitle.Data(), sNetTitle.Data()),
112 list->Add(new TProfile(Form("fProfTot%sMinus%s",fgkPidName[iPid],name),
113 Form("(%s) : %s;Centrality(100);(%s)",fgkPidName[iPid], sTitle.Data(), sNetTitle.Data()),
116 for (Int_t idx = 1; idx <= fOrder; ++idx) {
117 list->Add(new TProfile(Form("fProf%s%sNet%dM",fgkPidName[iPid],name, idx),
118 Form("(%s)^{%d} : %s;Centrality(100);(%s)^{%d}",sNetTitle.Data(), idx, sTitle.Data(), sNetTitle.Data(), idx),
122 for (Int_t ii = 0; ii <= fOrder; ++ii) {
123 for (Int_t kk = 0; kk <= fOrder; ++kk) {
124 list->Add(new TProfile(Form("fProf%s%sNetF%02d%02d",fgkPidName[iPid], name, ii, kk),
125 Form("f_{%02d%02d} : %s;Centrality(100);f_{%02d%02d}", ii, kk, sTitle.Data(), ii, kk),
133 for (Int_t iPhy = 0; iPhy < 46; ++iPhy) {
134 list->Add(new TProfile(Form("fProf%sNu%02d",name,iPhy),Form("Physics Variable for index %d | %s ; Centrality;",iPhy,name),20,-0.5,19.5));
138 PostData(1, fThnList);
142 //----------------------------------------------------------------------------------
143 void AliEbyEPidRatioTaskOnFly::UserExec( Option_t * ){
144 AliMCEvent* mcEvent = MCEvent();
146 Printf("ERROR: Could not retrieve MC event");
150 for (Int_t ii = 0 ; ii < 4; ++ii)
151 for (Int_t kk = 0 ; kk < 2; ++kk)
155 const AliVVertex *vtxMC = mcEvent->GetPrimaryVertex();
156 if (vtxMC->GetZ() > 10.) return;
158 AliStack *stack = mcEvent->Stack();
160 AliGenEventHeader* genHeader = mcEvent->GenEventHeader();
162 printf(" Event generator header not available!!!\n");
168 if(genHeader->InheritsFrom(AliGenHijingEventHeader::Class())){
169 imp = ((AliGenHijingEventHeader*) genHeader)->ImpactParameter();
171 if (imp < 20) fCentrality = Int_t(imp);
174 Int_t nParticles = stack->GetNtrack();
175 for (Int_t iParticle = 0; iParticle < nParticles; iParticle++) {
176 TParticle* part = stack->Particle(iParticle);
178 Printf(" No Particle Available ");
182 Float_t pt = part->Pt();
183 if(pt < fPtLowerLimit || pt > fPtHigherLimit ) continue;
184 Float_t gEta = part->Eta();
185 if(gEta < fEtaLowerLimit || gEta > fEtaHigherLimit ) continue;
187 // Float_t gCharge = (pdgPart ? pdgPart->Charge() : 0);
189 Int_t pid = part->GetPdgCode();
190 if(pid == 211) { fNp[1][1]++; fNp[0][1]++; }
191 else if(pid == -211) { fNp[1][0]++; fNp[0][0]++; }
192 else if(pid == 321) { fNp[2][1]++; fNp[0][1]++; }
193 else if(pid == -321) { fNp[2][0]++; fNp[0][0]++; }
194 else if(pid == 2212) { fNp[3][1]++; fNp[0][1]++; }
195 else if(pid == -2212) { fNp[3][0]++; fNp[0][0]++; }
199 /*Printf("%6d %6d %6d %6d %6d %6d %6d %6d %6d", fCentrality,
200 fNp[0][0], fNp[0][1],
201 fNp[1][0], fNp[1][1],
202 fNp[2][0], fNp[2][1],
203 fNp[3][0], fNp[3][1]);*/
207 PostData(1, fThnList);
210 void AliEbyEPidRatioTaskOnFly::Terminate( Option_t * ){
211 Info("AliEbyEPidRatioTaskOnFly"," Task Successfully finished");
213 //________________________________________________________________________
214 const Char_t* AliEbyEPidRatioTaskOnFly::fgkPidName[4] = {"Nch","Npi","Nka","Npr"};
215 //________________________________________________________________________
216 const Char_t* AliEbyEPidRatioTaskOnFly::fgkPidLatex[4][2] = {{"N_{-}","N_{+}"}, {"N_{#pi^{-}}","N_{#pi^{+}}"},{"N_{K^{-}}","N_{K^{+}}"}, {"N_{#bar{p}}","N_{p}"}};
217 //________________________________________________________________________
218 const Char_t* AliEbyEPidRatioTaskOnFly::fgkPidTitles[4][2] = {{"Negative","Positive"},{"Anti-Pions","Pions"},{"Anti-Kaons","Kaons"}, {"Anti-Protons","Protons"}};
219 //________________________________________________________________________
220 void AliEbyEPidRatioTaskOnFly::FillHistSetCent() {
222 const Char_t *name = "Mc";
224 TList *list = static_cast<TList*>(fThnList->FindObject(Form("f%s",name)));
226 for (Int_t iPid = 0; iPid < 4; ++iPid) {
227 Int_t deltaNp = fNp[iPid][1]-fNp[iPid][0];
229 (static_cast<TProfile*>(list->FindObject(Form("fProfTot%sPlus%s", fgkPidName[iPid], name))))->Fill(fCentrality, fNp[iPid][1]);
230 (static_cast<TProfile*>(list->FindObject(Form("fProfTot%sMinus%s", fgkPidName[iPid], name))))->Fill(fCentrality, fNp[iPid][0]);
231 for (Int_t idxOrder = 1; idxOrder <= fOrder; ++idxOrder) {
233 (static_cast<TProfile*>(list->FindObject(Form("fProf%s%sNet%dM", fgkPidName[iPid], name, idxOrder))))->Fill(fCentrality, delta);
236 for (Int_t idxOrder = 0; idxOrder <= fOrder; ++ idxOrder) {
237 fRedFactp[idxOrder][0] = 1.;
238 fRedFactp[idxOrder][1] = 1.;
241 for (Int_t idxOrder = 1; idxOrder <= fOrder; ++ idxOrder) {
242 fRedFactp[idxOrder][0] = fRedFactp[idxOrder-1][0] * Double_t(fNp[iPid][0]-(idxOrder-1));
243 fRedFactp[idxOrder][1] = fRedFactp[idxOrder-1][1] * Double_t(fNp[iPid][1]-(idxOrder-1));
246 for (Int_t ii = 0; ii <= fOrder; ++ii) {
247 for (Int_t kk = 0; kk <= fOrder; ++kk) {
248 Double_t fik = fRedFactp[ii][1] * fRedFactp[kk][0];
249 (static_cast<TProfile*>(list->FindObject(Form("fProf%s%sNetF%02d%02d", fgkPidName[iPid], name, ii, kk))))->Fill(fCentrality, fik);
254 //Printf("%6d %20s %6.2f %6d %6d %6d %6d %6d %6d %6d %6d", idx, name, centralityBin,
255 // fNp[0][1], fNp[0][0],
256 // fNp[1][1], fNp[1][0],
257 /// fNp[2][1], fNp[2][0],
258 // fNp[3][1], fNp[3][0]);
261 Int_t a[6][4]; Int_t b[22];
262 for (Int_t iPid = 0; iPid < 4; ++iPid) {
263 a[0][iPid] = fNp[iPid][1]+fNp[iPid][0]; // 0 n+ + n-
264 a[1][iPid] = fNp[iPid][1]; // 1 n+
265 a[2][iPid] = fNp[iPid][0]; // 2 n-
266 a[3][iPid] = fNp[iPid][1]*fNp[iPid][0]; // 3 n+ . n-
267 a[4][iPid] = fNp[iPid][1]*(fNp[iPid][1]-1); // 4 n+ (n+ - 1)
268 a[5][iPid] = fNp[iPid][0]*(fNp[iPid][0]-1); // 5 n- (n- - 1)
270 // Printf("%6d %20s %6.2f %6d %6d %6d ", idx, name, centralityBin,
271 // a[0][iPid], a[1][iPid], a[2][iPid]);
275 b[0] = a[0][0]*a[0][2]; // 24 N K
276 b[1] = a[0][1]*a[0][2]; // 25 Pi K
277 b[2] = a[1][1]*a[1][2]; // 26 pi+ k+
278 b[3] = a[1][1]*a[2][2]; // 27 pi+ k-
279 b[4] = a[2][1]*a[1][2]; // 28 pi- k+
280 b[5] = a[2][1]*a[2][2]; // 29 pi- k-
282 b[6] = a[0][0]*a[0][3]; // 30 N P
283 b[7] = a[0][2]*a[0][3]; // 31 K P
284 b[8] = a[1][2]*a[1][3]; // 32 k+ p+
285 b[9] = a[1][2]*a[2][3]; // 33 k+ p-
286 b[10] = a[2][2]*a[1][3]; // 34 k- p+
287 b[11] = a[2][2]*a[2][3]; // 35 k- p-
289 b[12] = a[0][0]*a[0][1]; // 36 N Pi
290 b[13] = a[0][3]*a[0][1]; // 37 P Pi
291 b[14] = a[1][3]*a[1][1]; // 38 p+ pi+
292 b[15] = a[1][3]*a[2][1]; // 39 p+ pi-
293 b[16] = a[2][3]*a[1][1]; // 40 p- pi+
294 b[17] = a[2][3]*a[2][1]; // 41 p- pi-
296 b[18] = a[0][0]*(a[0][0] - 1); // 42 N ( N - 1 )
297 b[19] = a[0][1]*(a[0][1] - 1); // 43 Pi( Pi- 1 )
298 b[20] = a[0][2]*(a[0][1] - 1); // 44 K ( K - 1 )
299 b[21] = a[0][3]*(a[0][3] - 1); // 45 P ( P - 1 )
300 // TList *list_nu = static_cast<TList*>(fOutList->FindObject(Form("f%s_nu",name)));
302 for (Int_t j = 0; j < 4; j++) {
303 for (Int_t i = 0; i < 6; i++) {
304 (static_cast<TProfile*>(list->FindObject(Form("fProf%sNu%02d", name,k))))->Fill(fCentrality,a[i][j]);
309 for (Int_t j = 0; j < 22; j++) {
310 (static_cast<TProfile*>(list->FindObject(Form("fProf%sNu%02d", name,j+24))))->Fill(fCentrality,b[j]);
314 Printf("%6d %6d %6d %6d %6d %6d %6d %6d %6d", fCentrality,
315 fNp[0][0], fNp[0][1],
316 fNp[1][0], fNp[1][1],
317 fNp[2][0], fNp[2][1],
318 fNp[3][0], fNp[3][1]);