9 #include "AliAnalysisTask.h"
10 #include "AliAnalysisManager.h"
13 #include "AliMCEvent.h"
14 #include "AliESDEvent.h"
15 #include "AliESDInputHandler.h"
16 //#include "AliESDtrackCuts.h"
17 #include "AliCentrality.h"
19 #include "AliEbyEFluctuationAnalysisTaskTrain.h"
21 // Event by event charge fluctuation analysis
22 // Authors: Satyajit Jena and Panos Cristakoglou
25 ClassImp(AliEbyEFluctuationAnalysisTaskTrain)
27 //________________________________________________________________________
28 AliEbyEFluctuationAnalysisTaskTrain::AliEbyEFluctuationAnalysisTaskTrain(const char *name)
29 : AliAnalysisTaskSE(name), fESD(0), fOutputList(0),
30 fHistEventStats(0), fHistCentrality(0),
31 fHistNMult(0), fHistNPlusNMinus(0),
32 fHistNMultMC(0), fHistNPlusNMinusMC(0),
33 fAnalysisType("ESD"), fAnalysisMode("TPC"),
34 fCentralityEstimator("V0M"),
35 fCentralityPercentileMin(0.), fCentralityPercentileMax(5.),
36 fVxMax(3.), fVyMax(3.), fVzMax(10.),
37 fMinNumberOfTPCClusters(80), fMaxChi2PerTPCCluster(4.0),
38 fMaxDCAxy(3.0), fMaxDCAz(3.0) {
41 // Define input and output slots here
42 // Input slot #0 works with a TChain
43 DefineInput(0, TChain::Class());
44 // Output slot #0 id reserved by the base class for AOD
45 // Output slot #1 writes into a TH1 container
46 DefineOutput(1, TList::Class());
49 //________________________________________________________________________
50 void AliEbyEFluctuationAnalysisTaskTrain::UserCreateOutputObjects() {
54 fOutputList = new TList();
55 fOutputList->SetOwner();
58 TString gCutName[4] = {"Total","Offline trigger",
60 fHistEventStats = new TH1F("fHistEventStats",
61 "Event statistics;;N_{events}",
63 for(Int_t i = 1; i <= 4; i++)
64 fHistEventStats->GetXaxis()->SetBinLabel(i,gCutName[i-1].Data());
65 fOutputList->Add(fHistEventStats);
68 if(fAnalysisType.CompareTo("ESD") == 0 ) {
69 fHistCentrality = new TH1F("fHistCentrality",";Centrality bin;Events",
71 fOutputList->Add(fHistCentrality);
74 histName = "fHistNMult";
75 fHistNMult = new TH1F(histName.Data(),
78 fOutputList->Add(fHistNMult);
80 histName = "fHistNPlusNMinus";
81 fHistNPlusNMinus = new TH2F(histName.Data(),
83 2000,0.5,2000.5,2000,0.5,2000.5);
84 fOutputList->Add(fHistNPlusNMinus);
86 else if(fAnalysisType.CompareTo("MC") == 0) {
87 TString histName = "fHistNMultMC";
88 fHistNMultMC = new TH1F(histName.Data(),
91 fOutputList->Add(fHistNMultMC);
93 histName = "fHistNPlusNMinusMC";
94 fHistNPlusNMinusMC = new TH2F(histName.Data(),
96 3000,0.5,3000.5,3000,0.5,3000.5);
97 fOutputList->Add(fHistNPlusNMinusMC);
100 PostData(1, fOutputList);
103 //________________________________________________________________________
104 void AliEbyEFluctuationAnalysisTaskTrain::UserExec(Option_t *) {
106 // Called for each event
108 Int_t nPlus = 0, nMinus = 0;
112 if(fAnalysisType.CompareTo("ESD") == 0) {
113 fESD = dynamic_cast<AliESDEvent*>(InputEvent());
115 printf("ERROR: fESD not available\n");
119 fHistEventStats->Fill(1); //all events
121 //Bool_t isSelected = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kMB);
123 fHistEventStats->Fill(2); //triggered + centrality
127 AliCentrality *centrality = fESD->GetCentrality();
128 Int_t nCentrality = 0;
130 if(centrality->IsEventInCentralityClass(fCentralityPercentileMin,
131 fCentralityPercentileMax,
132 fCentralityEstimator.Data())) {
133 if(fAnalysisMode.CompareTo("TPC") == 0 ) {
134 const AliESDVertex *vertex = fESD->GetPrimaryVertexTPC();
136 if(vertex->GetNContributors() > 0) {
137 if(vertex->GetZRes() != 0) {
138 fHistEventStats->Fill(3); //events with a proper vertex
139 if(TMath::Abs(vertex->GetXv()) < fVxMax) {
140 if(TMath::Abs(vertex->GetYv()) < fVyMax) {
141 if(TMath::Abs(vertex->GetZv()) < fVzMax) {
142 fHistEventStats->Fill(4); //analyzed events
144 Printf("Centrality percentile: %lf - Centrality: %d - Total tracks: %d",
145 centrality->GetCentralityPercentile(fCentralityEstimator.Data()),
146 nCentrality,fESD->GetNumberOfTracks());
149 Int_t nAcceptedTracks = 0;
151 nAcceptedTracks = fESD->GetNumberOfTracks();
152 AliESDtrack* track = 0;
154 Float_t dcaXY = 0.0, dcaZ = 0.0;
156 for (Int_t iTracks = 0; iTracks < nAcceptedTracks; iTracks++)
158 track = dynamic_cast<AliESDtrack *>(fESD->GetTrack(iTracks));
160 printf("ERROR: Could not receive track %d\n", iTracks);
164 AliESDtrack *tpcOnlyTrack = new AliESDtrack();
166 if (!track->FillTPCOnlyTrack(*tpcOnlyTrack)) {
171 tpcOnlyTrack->GetImpactParameters(dcaXY,dcaZ);
173 Int_t nClustersITS = track->GetITSclusters(0x0);
174 Int_t nClustersTPC = track->GetTPCclusters(0x0);
176 Float_t chi2PerClusterITS = -1;
178 chi2PerClusterITS = track->GetITSchi2()/Float_t(nClustersITS);
179 Float_t chi2PerClusterTPC = -1;
181 chi2PerClusterTPC = track->GetTPCchi2()/Float_t(nClustersTPC);
185 if(nClustersTPC < fMinNumberOfTPCClusters) continue;
186 if(chi2PerClusterTPC > fMaxChi2PerTPCCluster) continue;
187 if(TMath::Abs(dcaXY) > fMaxDCAxy) continue;
188 if(TMath::Abs(dcaZ) > fMaxDCAz) continue;
190 Short_t gCharge = tpcOnlyTrack->Charge();
191 if(gCharge > 0) nPlus += 1;
192 if(gCharge < 0) nMinus += 1;
196 if( nPlus == 0 && nMinus == 0) return;
198 // cout<<"=========NPlus: "<<nPlus<<"=========NMinus: "<<nMinus<<endl;
199 fHistCentrality->Fill(nCentrality);
200 fHistNPlusNMinus->Fill(nPlus,nMinus);
201 fHistNMult->Fill(nPlus+nMinus);
208 }//number of contributors
212 //}//physics selection
213 }//ESD analysis level
216 if(fAnalysisType.CompareTo("MC") == 0 ) {
217 AliMCEvent* mcEvent = MCEvent();
219 Printf("ERROR: Could not retrieve MC event");
222 AliStack* stack = mcEvent->Stack();
224 Printf("ERROR: Could not retrieve MC stack");
228 fHistEventStats->Fill(1);
229 fHistEventStats->Fill(2);
230 fHistEventStats->Fill(3);
231 fHistEventStats->Fill(4); //analyzed events
232 for (Int_t iTracks = 0; iTracks < mcEvent->GetNumberOfTracks(); iTracks++) {
233 AliVParticle* track = mcEvent->GetTrack(iTracks);
235 Printf("ERROR: Could not receive track %d (mc loop)", iTracks);
239 if(!stack->IsPhysicalPrimary(iTracks)) continue;
240 if((track->Pt() < 0.3) && (track->Pt() > 1.5)) continue;
241 if(TMath::Abs(track->Eta()) > 0.8) continue;
243 Short_t gCharge = track->Charge();
244 if(gCharge > 0) nPlus += 1;
245 if(gCharge < 0) nMinus += 1;
247 fHistNPlusNMinusMC->Fill(nPlus,nMinus);
248 fHistNMultMC->Fill(nPlus+nMinus);
255 //________________________________________________________________________
256 void AliEbyEFluctuationAnalysisTaskTrain::Terminate(Option_t *) {
257 // Draw result to the screen
258 // Called once at the end of the query
260 fOutputList = dynamic_cast<TList*> (GetOutputData(1));
262 printf("ERROR: Output list not available\n");