]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGCF/EBYE/Fluctuations/AliEbyEFluctuationAnalysisTaskTrain.cxx
new analysis task: multiplicity fluctuations (Maitreyee Mukherjee <maitreyee.mukherje...
[u/mrichter/AliRoot.git] / PWGCF / EBYE / Fluctuations / AliEbyEFluctuationAnalysisTaskTrain.cxx
CommitLineData
d43b78c9 1#include "TChain.h"\r
2#include "TTree.h"\r
3#include "TH1F.h"\r
4#include "TH2F.h"\r
5#include "TCanvas.h"\r
6#include "TParticle.h"\r
7#include "TObjArray.h"\r
8\r
9#include "AliAnalysisTask.h"\r
10#include "AliAnalysisManager.h"\r
11\r
12#include "AliStack.h"\r
13#include "AliMCEvent.h"\r
14#include "AliESDEvent.h"\r
15#include "AliESDInputHandler.h"\r
16//#include "AliESDtrackCuts.h"\r
17#include "AliCentrality.h"\r
18\r
19#include "AliEbyEFluctuationAnalysisTaskTrain.h"\r
20\r
21// Event by event charge fluctuation analysis\r
22// Authors: Satyajit Jena and Panos Cristakoglou\r
23// \r
24\r
25ClassImp(AliEbyEFluctuationAnalysisTaskTrain)\r
26\r
27//________________________________________________________________________\r
28AliEbyEFluctuationAnalysisTaskTrain::AliEbyEFluctuationAnalysisTaskTrain(const char *name) \r
29 : AliAnalysisTaskSE(name), fESD(0), fOutputList(0), \r
30 fHistEventStats(0), fHistCentrality(0),\r
31 fHistNMult(0), fHistNPlusNMinus(0),\r
32 fHistNMultMC(0), fHistNPlusNMinusMC(0),\r
33 fAnalysisType("ESD"), fAnalysisMode("TPC"),\r
34 fCentralityEstimator("V0M"), \r
35 fCentralityPercentileMin(0.), fCentralityPercentileMax(5.),\r
36 fVxMax(3.), fVyMax(3.), fVzMax(10.),\r
37 fMinNumberOfTPCClusters(80), fMaxChi2PerTPCCluster(4.0), \r
38 fMaxDCAxy(3.0), fMaxDCAz(3.0) {\r
39 // Constructor\r
40 \r
41 // Define input and output slots here\r
42 // Input slot #0 works with a TChain\r
43 DefineInput(0, TChain::Class());\r
44 // Output slot #0 id reserved by the base class for AOD\r
45 // Output slot #1 writes into a TH1 container\r
46 DefineOutput(1, TList::Class());\r
47}\r
48\r
49//________________________________________________________________________\r
50void AliEbyEFluctuationAnalysisTaskTrain::UserCreateOutputObjects() {\r
51 // Create histograms\r
52 // Called once\r
53\r
54 fOutputList = new TList();\r
55 fOutputList->SetOwner();\r
56\r
57 //Event stats.\r
58 TString gCutName[4] = {"Total","Offline trigger",\r
59 "Vertex","Analyzed"};\r
60 fHistEventStats = new TH1F("fHistEventStats",\r
61 "Event statistics;;N_{events}",\r
62 4,0.5,4.5);\r
63 for(Int_t i = 1; i <= 4; i++)\r
64 fHistEventStats->GetXaxis()->SetBinLabel(i,gCutName[i-1].Data());\r
65 fOutputList->Add(fHistEventStats);\r
66\r
67 //ESD analysis\r
68 if(fAnalysisType.CompareTo("ESD") == 0 ) {\r
69 fHistCentrality = new TH1F("fHistCentrality",";Centrality bin;Events",\r
70 20,0.5,20.5);\r
71 fOutputList->Add(fHistCentrality);\r
72 \r
73 TString histName;\r
74 histName = "fHistNMult";\r
75 fHistNMult = new TH1F(histName.Data(), \r
76 ";N_{mult.}",\r
77 800,0,4000);\r
78 fOutputList->Add(fHistNMult);\r
79\r
80 histName = "fHistNPlusNMinus";\r
81 fHistNPlusNMinus = new TH2F(histName.Data(), \r
82 ";N_{+};N_{-}",\r
83 2000,0.5,2000.5,2000,0.5,2000.5); \r
84 fOutputList->Add(fHistNPlusNMinus);\r
85 }//ESD analysis\r
86 else if(fAnalysisType.CompareTo("MC") == 0) {\r
87 TString histName = "fHistNMultMC";\r
88 fHistNMultMC = new TH1F(histName.Data(), \r
89 ";N_{mult.}",\r
90 800,0,8000);\r
91 fOutputList->Add(fHistNMultMC);\r
92 \r
93 histName = "fHistNPlusNMinusMC";\r
94 fHistNPlusNMinusMC = new TH2F(histName.Data(), \r
95 ";N_{+};N_{-}",\r
96 3000,0.5,3000.5,3000,0.5,3000.5); \r
97 fOutputList->Add(fHistNPlusNMinusMC);\r
98 }//MC analysis\r
99\r
100 PostData(1, fOutputList);\r
101}\r
102\r
103//________________________________________________________________________\r
104void AliEbyEFluctuationAnalysisTaskTrain::UserExec(Option_t *) {\r
105 // Main loop\r
106 // Called for each event\r
107 \r
108 Int_t nPlus = 0, nMinus = 0;\r
109\r
110 // Post output data.\r
111 //ESD analysis\r
112 if(fAnalysisType.CompareTo("ESD") == 0) {\r
113 fESD = dynamic_cast<AliESDEvent*>(InputEvent());\r
114 if (!fESD) {\r
115 printf("ERROR: fESD not available\n");\r
116 return;\r
117 }\r
118 \r
119 fHistEventStats->Fill(1); //all events\r
120 \r
121 //Bool_t isSelected = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kMB);\r
122 //if(isSelected) {\r
123 fHistEventStats->Fill(2); //triggered + centrality\r
124 \r
125\r
126 //Centrality stuff\r
127 AliCentrality *centrality = fESD->GetCentrality();\r
128 Int_t nCentrality = 0;\r
129 \r
130 if(centrality->IsEventInCentralityClass(fCentralityPercentileMin,\r
131 fCentralityPercentileMax,\r
132 fCentralityEstimator.Data())) {\r
133 if(fAnalysisMode.CompareTo("TPC") == 0 ) {\r
134 const AliESDVertex *vertex = fESD->GetPrimaryVertexTPC();\r
135 if(vertex) {\r
136 if(vertex->GetNContributors() > 0) {\r
137 if(vertex->GetZRes() != 0) {\r
138 fHistEventStats->Fill(3); //events with a proper vertex\r
139 if(TMath::Abs(vertex->GetXv()) < fVxMax) {\r
140 if(TMath::Abs(vertex->GetYv()) < fVyMax) {\r
141 if(TMath::Abs(vertex->GetZv()) < fVzMax) {\r
142 fHistEventStats->Fill(4); //analyzed events\r
143 \r
144 Printf("Centrality percentile: %lf - Centrality: %d - Total tracks: %d",\r
145 centrality->GetCentralityPercentile(fCentralityEstimator.Data()),\r
146 nCentrality,fESD->GetNumberOfTracks());\r
147 \r
148\r
149 Int_t nAcceptedTracks = 0;\r
150 \r
151 nAcceptedTracks = fESD->GetNumberOfTracks();\r
152 AliESDtrack* track = 0;\r
153 \r
154 Float_t dcaXY = 0.0, dcaZ = 0.0;\r
155 \r
156 for (Int_t iTracks = 0; iTracks < nAcceptedTracks; iTracks++) \r
157 {\r
158 track = dynamic_cast<AliESDtrack *>(fESD->GetTrack(iTracks));\r
159 if (!track) {\r
160 printf("ERROR: Could not receive track %d\n", iTracks);\r
161 continue;\r
162 }\r
163 \r
164 AliESDtrack *tpcOnlyTrack = new AliESDtrack();\r
165 \r
166 if (!track->FillTPCOnlyTrack(*tpcOnlyTrack)) {\r
167 delete tpcOnlyTrack;\r
168 continue;\r
169 }\r
170 \r
171 tpcOnlyTrack->GetImpactParameters(dcaXY,dcaZ);\r
172 \r
173 Int_t nClustersITS = track->GetITSclusters(0x0);\r
174 Int_t nClustersTPC = track->GetTPCclusters(0x0);\r
175 \r
176 Float_t chi2PerClusterITS = -1;\r
177 if (nClustersITS!=0)\r
178 chi2PerClusterITS = track->GetITSchi2()/Float_t(nClustersITS);\r
179 Float_t chi2PerClusterTPC = -1;\r
180 if (nClustersTPC!=0)\r
181 chi2PerClusterTPC = track->GetTPCchi2()/Float_t(nClustersTPC);\r
182 \r
183 // \r
184 \r
185 if(nClustersTPC < fMinNumberOfTPCClusters) continue;\r
186 if(chi2PerClusterTPC > fMaxChi2PerTPCCluster) continue;\r
187 if(TMath::Abs(dcaXY) > fMaxDCAxy) continue;\r
188 if(TMath::Abs(dcaZ) > fMaxDCAz) continue;\r
189 \r
190 Short_t gCharge = tpcOnlyTrack->Charge();\r
191 if(gCharge > 0) nPlus += 1;\r
192 if(gCharge < 0) nMinus += 1;\r
193 delete tpcOnlyTrack;\r
194 } // track loop\r
195 \r
196 if( nPlus == 0 && nMinus == 0) return;\r
197\r
198 // cout<<"=========NPlus: "<<nPlus<<"=========NMinus: "<<nMinus<<endl;\r
199 fHistCentrality->Fill(nCentrality);\r
200 fHistNPlusNMinus->Fill(nPlus,nMinus);\r
201 fHistNMult->Fill(nPlus+nMinus);\r
202 \r
203 \r
204 }//Vz cut\r
205 }//Vy cut\r
206 }//Vx cut\r
207 }//Vz resolution\r
208 }//number of contributors\r
209 }//valid vertex\r
210 }//TPC analysis mode\r
211 }//centrality\r
212 //}//physics selection\r
213 }//ESD analysis level\r
214 \r
215 //MC analysis\r
216 if(fAnalysisType.CompareTo("MC") == 0 ) {\r
217 AliMCEvent* mcEvent = MCEvent();\r
218 if (!mcEvent) {\r
219 Printf("ERROR: Could not retrieve MC event");\r
220 return;\r
221 }\r
222 AliStack* stack = mcEvent->Stack();\r
223 if (!stack) {\r
224 Printf("ERROR: Could not retrieve MC stack");\r
225 return;\r
226 }\r
227 \r
228 fHistEventStats->Fill(1); \r
229 fHistEventStats->Fill(2); \r
230 fHistEventStats->Fill(3); \r
231 fHistEventStats->Fill(4); //analyzed events\r
232 for (Int_t iTracks = 0; iTracks < mcEvent->GetNumberOfTracks(); iTracks++) {\r
233 AliVParticle* track = mcEvent->GetTrack(iTracks);\r
234 if (!track) {\r
235 Printf("ERROR: Could not receive track %d (mc loop)", iTracks);\r
236 continue;\r
237 }\r
238 \r
239 if(!stack->IsPhysicalPrimary(iTracks)) continue;\r
240 if((track->Pt() < 0.3) && (track->Pt() > 1.5)) continue;\r
241 if(TMath::Abs(track->Eta()) > 0.8) continue;\r
242 \r
243 Short_t gCharge = track->Charge();\r
244 if(gCharge > 0) nPlus += 1;\r
245 if(gCharge < 0) nMinus += 1;\r
246 }//particle loop\r
247 fHistNPlusNMinusMC->Fill(nPlus,nMinus);\r
248 fHistNMultMC->Fill(nPlus+nMinus);\r
249 \r
250 }//MC analysis level\r
251\r
252\r
253} \r
254\r
255//________________________________________________________________________\r
256void AliEbyEFluctuationAnalysisTaskTrain::Terminate(Option_t *) {\r
257 // Draw result to the screen\r
258 // Called once at the end of the query\r
259\r
260 fOutputList = dynamic_cast<TList*> (GetOutputData(1));\r
261 if (!fOutputList) {\r
262 printf("ERROR: Output list not available\n");\r
263 return;\r
264 }\r
265}\r