ROOT logo
#include "TChain.h"
#include "TTree.h"
#include "TH1F.h"
#include "TH2F.h"
#include "TCanvas.h"
#include "TParticle.h"
#include "TObjArray.h"

#include "AliAnalysisTask.h"
#include "AliAnalysisManager.h"

#include "AliStack.h"
#include "AliMCEvent.h"
#include "AliESDEvent.h"
#include "AliESDInputHandler.h"
#include "AliESDtrackCuts.h"
#include "AliCentrality.h"

#include "AliEbyEFluctuationAnalysisTask.h"

// Event by event charge fluctuation analysis
// Authors: Satyajit Jena and Panos Cristakoglou
// 

ClassImp(AliEbyEFluctuationAnalysisTask)

//________________________________________________________________________
AliEbyEFluctuationAnalysisTask::AliEbyEFluctuationAnalysisTask(const char *name) 
  : AliAnalysisTaskSE(name), fESD(0), fOutputList(0), 
    fHistEventStats(0), fHistCentrality(0),
    fHistNMultMC(0), fHistNPlusNMinusMC(0), 
    fESDtrackCuts(0),
    fAnalysisType("ESD"), fAnalysisMode("TPC"),
    fCentralityEstimator("V0M"), fCentralityBins20(kFALSE),
    fVxMax(3.), fVyMax(3.), fVzMax(10.) {
  // Constructor
  
  for(Int_t iBin = 1; iBin <= nCentralityBins; iBin++) {
    fHistNMult[iBin-1] = NULL;
    fHistNPlusNMinus[iBin-1] = NULL;
  }

  // Define input and output slots here
  // Input slot #0 works with a TChain
  DefineInput(0, TChain::Class());
  // Output slot #0 id reserved by the base class for AOD
  // Output slot #1 writes into a TH1 container
  DefineOutput(1, TList::Class());
}

//________________________________________________________________________
void AliEbyEFluctuationAnalysisTask::UserCreateOutputObjects() {
  // Create histograms
  // Called once

  fOutputList = new TList();
  fOutputList->SetOwner();

  //Event stats.
  TString gCutName[4] = {"Total","Offline trigger",
                         "Vertex","Analyzed"};
  fHistEventStats = new TH1F("fHistEventStats",
                             "Event statistics;;N_{events}",
                             4,0.5,4.5);
  for(Int_t i = 1; i <= 4; i++)
    fHistEventStats->GetXaxis()->SetBinLabel(i,gCutName[i-1].Data());
  fOutputList->Add(fHistEventStats);

  //ESD analysis
  if(fAnalysisType == "ESD") {
    fHistCentrality = new TH1F("fHistCentrality",";Centrality bin;Events",
			       nCentralityBins,0.5,nCentralityBins+0.5);
    fOutputList->Add(fHistCentrality);
    
    TString histName;
    for(Int_t iBin = 1; iBin <= nCentralityBins; iBin++) {
      histName = "fHistNMult"; histName += "Centrality"; histName += iBin; 
      fHistNMult[iBin-1] = new TH1F(histName.Data(), 
				    ";N_{mult.}",
				    500,0,3000);
      fOutputList->Add(fHistNMult[iBin-1]);
    }
    for(Int_t iBin = 1; iBin <= nCentralityBins; iBin++) {
      histName = "fHistNPlusNMinus"; histName += "Centrality"; histName += iBin; 
      fHistNPlusNMinus[iBin-1] = new TH2F(histName.Data(), 
					  ";N_{+};N_{-}",
					  2000,0.5,2000.5,2000,0.5,2000.5);  
      fOutputList->Add(fHistNPlusNMinus[iBin-1]);
    }
  }//ESD analysis
  else if(fAnalysisType == "MC") {
    TString histName = "fHistNMultMC";
    fHistNMultMC = new TH1F(histName.Data(), 
			    ";N_{mult.}",
			    600,0,6000);
    fOutputList->Add(fHistNMultMC);
    
    histName = "fHistNPlusNMinusMC";
    fHistNPlusNMinusMC = new TH2F(histName.Data(), 
				  ";N_{+};N_{-}",
				  3000,0.5,3000.5,3000,0.5,3000.5);  
    fOutputList->Add(fHistNPlusNMinusMC);
  }//MC analysis
}

//________________________________________________________________________
void AliEbyEFluctuationAnalysisTask::UserExec(Option_t *) {
  // Main loop
  // Called for each event
  
  Int_t nPlus = 0, nMinus = 0;

  // Post output data.
  //ESD analysis
  if(fAnalysisType == "ESD") {
    fESD = dynamic_cast<AliESDEvent*>(InputEvent());
    if (!fESD) {
      printf("ERROR: fESD not available\n");
      return;
    }
  
    fHistEventStats->Fill(1); //all events
    
    //Bool_t isSelected = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kMB);
    //if(isSelected) {
      fHistEventStats->Fill(2); //triggered + centrality
      Printf("Event accepted");

      //Centrality stuff
      AliCentrality *centrality = fESD->GetCentrality();
      Int_t nCentrality = 0;
      if(fCentralityBins20) 
	nCentrality = centrality->GetCentralityClass5(fCentralityEstimator.Data());
      else
	nCentrality = centrality->GetCentralityClass10(fCentralityEstimator.Data());

      if((nCentrality < 0)||(nCentrality > 19)) return;
      
      if(fAnalysisMode == "TPC") {
	const AliESDVertex *vertex = fESD->GetPrimaryVertexTPC();
	if(vertex) {
	  if(vertex->GetNContributors() > 0) {
	    if(vertex->GetZRes() != 0) {
	      fHistEventStats->Fill(3); //events with a proper vertex
	      if(TMath::Abs(vertex->GetX()) < fVxMax) {
		if(TMath::Abs(vertex->GetY()) < fVyMax) {
		  if(TMath::Abs(vertex->GetZ()) < fVzMax) {
		    fHistEventStats->Fill(4); //analyzed events
		    
		    //Printf("Centrality percentile: %lf - Centrality: %d - Total tracks: %d",
		    //centrality->GetCentralityPercentile(fCentralityEstimator.Data()),
		    //nCentrality,fESD->GetNumberOfTracks());
		    		    
		    Int_t nAcceptedTracks = 0;
		    TObjArray *gTrackArray = 0;
		    if(fESDtrackCuts)
                      gTrackArray = fESDtrackCuts->GetAcceptedTracks(fESD,kTRUE);
                    if(gTrackArray) {
                      nAcceptedTracks = gTrackArray->GetEntries();

		      AliESDtrack* track = 0;
		      // Track loop to fill a pT spectrum
		      for (Int_t iTracks = 0; iTracks < nAcceptedTracks; iTracks++) {
			track = dynamic_cast<AliESDtrack *>(gTrackArray->At(iTracks));
			if (!track) {
			  printf("ERROR: Could not receive track %d\n", iTracks);
			  continue;
			}
			
			Short_t gCharge = track->Charge();
			if(gCharge > 0) nPlus += 1;
			if(gCharge < 0) nMinus += 1;
		      }//track loop
		    }//TObjArray valid object
		    //if((nCentrality >= 1)&&(nCentrality <= 20)) {
		    
		    fHistCentrality->Fill(nCentrality);
		    fHistNPlusNMinus[nCentrality-1]->Fill(nPlus,nMinus);
		    fHistNMult[nCentrality-1]->Fill(nPlus+nMinus);
		    //}
		  }//Vz cut
		}//Vy cut
	      }//Vx cut
	    }//Vz resolution
	  }//number of contributors
	}//valid vertex
      }//TPC analysis mode
      //}//physics selection
  }//ESD analysis level
  
  //MC analysis
  if(fAnalysisType == "MC") {
    AliMCEvent* mcEvent = MCEvent();
    if (!mcEvent) {
      Printf("ERROR: Could not retrieve MC event");
      return;
    }
    AliStack* stack = mcEvent->Stack();
    if (!stack) {
      Printf("ERROR: Could not retrieve MC stack");
      return;
    }
    
    fHistEventStats->Fill(1); 
    fHistEventStats->Fill(2); 
    fHistEventStats->Fill(3); 
    fHistEventStats->Fill(4); //analyzed events
    for (Int_t iTracks = 0; iTracks < mcEvent->GetNumberOfTracks(); iTracks++) {
      AliVParticle* track = mcEvent->GetTrack(iTracks);
      if (!track) {
	Printf("ERROR: Could not receive track %d (mc loop)", iTracks);
	continue;
      }
      
      if(!stack->IsPhysicalPrimary(iTracks)) continue;
      if((track->Pt() < 0.3) && (track->Pt() > 1.5)) continue;
      if(TMath::Abs(track->Eta()) > 0.8) continue;
      
      Short_t gCharge = track->Charge();
      if(gCharge > 0) nPlus += 1;
      if(gCharge < 0) nMinus += 1;
    }//particle loop
    fHistNPlusNMinusMC->Fill(nPlus,nMinus);
    fHistNMultMC->Fill(nPlus+nMinus);
    
  }//MC analysis level


  PostData(1, fOutputList);
}      

//________________________________________________________________________
void AliEbyEFluctuationAnalysisTask::Terminate(Option_t *) {
  // Draw result to the screen
  // Called once at the end of the query

  fOutputList = dynamic_cast<TList*> (GetOutputData(1));
  if (!fOutputList) {
    printf("ERROR: Output list not available\n");
    return;
  }
}
 AliEbyEFluctuationAnalysisTask.cxx:1
 AliEbyEFluctuationAnalysisTask.cxx:2
 AliEbyEFluctuationAnalysisTask.cxx:3
 AliEbyEFluctuationAnalysisTask.cxx:4
 AliEbyEFluctuationAnalysisTask.cxx:5
 AliEbyEFluctuationAnalysisTask.cxx:6
 AliEbyEFluctuationAnalysisTask.cxx:7
 AliEbyEFluctuationAnalysisTask.cxx:8
 AliEbyEFluctuationAnalysisTask.cxx:9
 AliEbyEFluctuationAnalysisTask.cxx:10
 AliEbyEFluctuationAnalysisTask.cxx:11
 AliEbyEFluctuationAnalysisTask.cxx:12
 AliEbyEFluctuationAnalysisTask.cxx:13
 AliEbyEFluctuationAnalysisTask.cxx:14
 AliEbyEFluctuationAnalysisTask.cxx:15
 AliEbyEFluctuationAnalysisTask.cxx:16
 AliEbyEFluctuationAnalysisTask.cxx:17
 AliEbyEFluctuationAnalysisTask.cxx:18
 AliEbyEFluctuationAnalysisTask.cxx:19
 AliEbyEFluctuationAnalysisTask.cxx:20
 AliEbyEFluctuationAnalysisTask.cxx:21
 AliEbyEFluctuationAnalysisTask.cxx:22
 AliEbyEFluctuationAnalysisTask.cxx:23
 AliEbyEFluctuationAnalysisTask.cxx:24
 AliEbyEFluctuationAnalysisTask.cxx:25
 AliEbyEFluctuationAnalysisTask.cxx:26
 AliEbyEFluctuationAnalysisTask.cxx:27
 AliEbyEFluctuationAnalysisTask.cxx:28
 AliEbyEFluctuationAnalysisTask.cxx:29
 AliEbyEFluctuationAnalysisTask.cxx:30
 AliEbyEFluctuationAnalysisTask.cxx:31
 AliEbyEFluctuationAnalysisTask.cxx:32
 AliEbyEFluctuationAnalysisTask.cxx:33
 AliEbyEFluctuationAnalysisTask.cxx:34
 AliEbyEFluctuationAnalysisTask.cxx:35
 AliEbyEFluctuationAnalysisTask.cxx:36
 AliEbyEFluctuationAnalysisTask.cxx:37
 AliEbyEFluctuationAnalysisTask.cxx:38
 AliEbyEFluctuationAnalysisTask.cxx:39
 AliEbyEFluctuationAnalysisTask.cxx:40
 AliEbyEFluctuationAnalysisTask.cxx:41
 AliEbyEFluctuationAnalysisTask.cxx:42
 AliEbyEFluctuationAnalysisTask.cxx:43
 AliEbyEFluctuationAnalysisTask.cxx:44
 AliEbyEFluctuationAnalysisTask.cxx:45
 AliEbyEFluctuationAnalysisTask.cxx:46
 AliEbyEFluctuationAnalysisTask.cxx:47
 AliEbyEFluctuationAnalysisTask.cxx:48
 AliEbyEFluctuationAnalysisTask.cxx:49
 AliEbyEFluctuationAnalysisTask.cxx:50
 AliEbyEFluctuationAnalysisTask.cxx:51
 AliEbyEFluctuationAnalysisTask.cxx:52
 AliEbyEFluctuationAnalysisTask.cxx:53
 AliEbyEFluctuationAnalysisTask.cxx:54
 AliEbyEFluctuationAnalysisTask.cxx:55
 AliEbyEFluctuationAnalysisTask.cxx:56
 AliEbyEFluctuationAnalysisTask.cxx:57
 AliEbyEFluctuationAnalysisTask.cxx:58
 AliEbyEFluctuationAnalysisTask.cxx:59
 AliEbyEFluctuationAnalysisTask.cxx:60
 AliEbyEFluctuationAnalysisTask.cxx:61
 AliEbyEFluctuationAnalysisTask.cxx:62
 AliEbyEFluctuationAnalysisTask.cxx:63
 AliEbyEFluctuationAnalysisTask.cxx:64
 AliEbyEFluctuationAnalysisTask.cxx:65
 AliEbyEFluctuationAnalysisTask.cxx:66
 AliEbyEFluctuationAnalysisTask.cxx:67
 AliEbyEFluctuationAnalysisTask.cxx:68
 AliEbyEFluctuationAnalysisTask.cxx:69
 AliEbyEFluctuationAnalysisTask.cxx:70
 AliEbyEFluctuationAnalysisTask.cxx:71
 AliEbyEFluctuationAnalysisTask.cxx:72
 AliEbyEFluctuationAnalysisTask.cxx:73
 AliEbyEFluctuationAnalysisTask.cxx:74
 AliEbyEFluctuationAnalysisTask.cxx:75
 AliEbyEFluctuationAnalysisTask.cxx:76
 AliEbyEFluctuationAnalysisTask.cxx:77
 AliEbyEFluctuationAnalysisTask.cxx:78
 AliEbyEFluctuationAnalysisTask.cxx:79
 AliEbyEFluctuationAnalysisTask.cxx:80
 AliEbyEFluctuationAnalysisTask.cxx:81
 AliEbyEFluctuationAnalysisTask.cxx:82
 AliEbyEFluctuationAnalysisTask.cxx:83
 AliEbyEFluctuationAnalysisTask.cxx:84
 AliEbyEFluctuationAnalysisTask.cxx:85
 AliEbyEFluctuationAnalysisTask.cxx:86
 AliEbyEFluctuationAnalysisTask.cxx:87
 AliEbyEFluctuationAnalysisTask.cxx:88
 AliEbyEFluctuationAnalysisTask.cxx:89
 AliEbyEFluctuationAnalysisTask.cxx:90
 AliEbyEFluctuationAnalysisTask.cxx:91
 AliEbyEFluctuationAnalysisTask.cxx:92
 AliEbyEFluctuationAnalysisTask.cxx:93
 AliEbyEFluctuationAnalysisTask.cxx:94
 AliEbyEFluctuationAnalysisTask.cxx:95
 AliEbyEFluctuationAnalysisTask.cxx:96
 AliEbyEFluctuationAnalysisTask.cxx:97
 AliEbyEFluctuationAnalysisTask.cxx:98
 AliEbyEFluctuationAnalysisTask.cxx:99
 AliEbyEFluctuationAnalysisTask.cxx:100
 AliEbyEFluctuationAnalysisTask.cxx:101
 AliEbyEFluctuationAnalysisTask.cxx:102
 AliEbyEFluctuationAnalysisTask.cxx:103
 AliEbyEFluctuationAnalysisTask.cxx:104
 AliEbyEFluctuationAnalysisTask.cxx:105
 AliEbyEFluctuationAnalysisTask.cxx:106
 AliEbyEFluctuationAnalysisTask.cxx:107
 AliEbyEFluctuationAnalysisTask.cxx:108
 AliEbyEFluctuationAnalysisTask.cxx:109
 AliEbyEFluctuationAnalysisTask.cxx:110
 AliEbyEFluctuationAnalysisTask.cxx:111
 AliEbyEFluctuationAnalysisTask.cxx:112
 AliEbyEFluctuationAnalysisTask.cxx:113
 AliEbyEFluctuationAnalysisTask.cxx:114
 AliEbyEFluctuationAnalysisTask.cxx:115
 AliEbyEFluctuationAnalysisTask.cxx:116
 AliEbyEFluctuationAnalysisTask.cxx:117
 AliEbyEFluctuationAnalysisTask.cxx:118
 AliEbyEFluctuationAnalysisTask.cxx:119
 AliEbyEFluctuationAnalysisTask.cxx:120
 AliEbyEFluctuationAnalysisTask.cxx:121
 AliEbyEFluctuationAnalysisTask.cxx:122
 AliEbyEFluctuationAnalysisTask.cxx:123
 AliEbyEFluctuationAnalysisTask.cxx:124
 AliEbyEFluctuationAnalysisTask.cxx:125
 AliEbyEFluctuationAnalysisTask.cxx:126
 AliEbyEFluctuationAnalysisTask.cxx:127
 AliEbyEFluctuationAnalysisTask.cxx:128
 AliEbyEFluctuationAnalysisTask.cxx:129
 AliEbyEFluctuationAnalysisTask.cxx:130
 AliEbyEFluctuationAnalysisTask.cxx:131
 AliEbyEFluctuationAnalysisTask.cxx:132
 AliEbyEFluctuationAnalysisTask.cxx:133
 AliEbyEFluctuationAnalysisTask.cxx:134
 AliEbyEFluctuationAnalysisTask.cxx:135
 AliEbyEFluctuationAnalysisTask.cxx:136
 AliEbyEFluctuationAnalysisTask.cxx:137
 AliEbyEFluctuationAnalysisTask.cxx:138
 AliEbyEFluctuationAnalysisTask.cxx:139
 AliEbyEFluctuationAnalysisTask.cxx:140
 AliEbyEFluctuationAnalysisTask.cxx:141
 AliEbyEFluctuationAnalysisTask.cxx:142
 AliEbyEFluctuationAnalysisTask.cxx:143
 AliEbyEFluctuationAnalysisTask.cxx:144
 AliEbyEFluctuationAnalysisTask.cxx:145
 AliEbyEFluctuationAnalysisTask.cxx:146
 AliEbyEFluctuationAnalysisTask.cxx:147
 AliEbyEFluctuationAnalysisTask.cxx:148
 AliEbyEFluctuationAnalysisTask.cxx:149
 AliEbyEFluctuationAnalysisTask.cxx:150
 AliEbyEFluctuationAnalysisTask.cxx:151
 AliEbyEFluctuationAnalysisTask.cxx:152
 AliEbyEFluctuationAnalysisTask.cxx:153
 AliEbyEFluctuationAnalysisTask.cxx:154
 AliEbyEFluctuationAnalysisTask.cxx:155
 AliEbyEFluctuationAnalysisTask.cxx:156
 AliEbyEFluctuationAnalysisTask.cxx:157
 AliEbyEFluctuationAnalysisTask.cxx:158
 AliEbyEFluctuationAnalysisTask.cxx:159
 AliEbyEFluctuationAnalysisTask.cxx:160
 AliEbyEFluctuationAnalysisTask.cxx:161
 AliEbyEFluctuationAnalysisTask.cxx:162
 AliEbyEFluctuationAnalysisTask.cxx:163
 AliEbyEFluctuationAnalysisTask.cxx:164
 AliEbyEFluctuationAnalysisTask.cxx:165
 AliEbyEFluctuationAnalysisTask.cxx:166
 AliEbyEFluctuationAnalysisTask.cxx:167
 AliEbyEFluctuationAnalysisTask.cxx:168
 AliEbyEFluctuationAnalysisTask.cxx:169
 AliEbyEFluctuationAnalysisTask.cxx:170
 AliEbyEFluctuationAnalysisTask.cxx:171
 AliEbyEFluctuationAnalysisTask.cxx:172
 AliEbyEFluctuationAnalysisTask.cxx:173
 AliEbyEFluctuationAnalysisTask.cxx:174
 AliEbyEFluctuationAnalysisTask.cxx:175
 AliEbyEFluctuationAnalysisTask.cxx:176
 AliEbyEFluctuationAnalysisTask.cxx:177
 AliEbyEFluctuationAnalysisTask.cxx:178
 AliEbyEFluctuationAnalysisTask.cxx:179
 AliEbyEFluctuationAnalysisTask.cxx:180
 AliEbyEFluctuationAnalysisTask.cxx:181
 AliEbyEFluctuationAnalysisTask.cxx:182
 AliEbyEFluctuationAnalysisTask.cxx:183
 AliEbyEFluctuationAnalysisTask.cxx:184
 AliEbyEFluctuationAnalysisTask.cxx:185
 AliEbyEFluctuationAnalysisTask.cxx:186
 AliEbyEFluctuationAnalysisTask.cxx:187
 AliEbyEFluctuationAnalysisTask.cxx:188
 AliEbyEFluctuationAnalysisTask.cxx:189
 AliEbyEFluctuationAnalysisTask.cxx:190
 AliEbyEFluctuationAnalysisTask.cxx:191
 AliEbyEFluctuationAnalysisTask.cxx:192
 AliEbyEFluctuationAnalysisTask.cxx:193
 AliEbyEFluctuationAnalysisTask.cxx:194
 AliEbyEFluctuationAnalysisTask.cxx:195
 AliEbyEFluctuationAnalysisTask.cxx:196
 AliEbyEFluctuationAnalysisTask.cxx:197
 AliEbyEFluctuationAnalysisTask.cxx:198
 AliEbyEFluctuationAnalysisTask.cxx:199
 AliEbyEFluctuationAnalysisTask.cxx:200
 AliEbyEFluctuationAnalysisTask.cxx:201
 AliEbyEFluctuationAnalysisTask.cxx:202
 AliEbyEFluctuationAnalysisTask.cxx:203
 AliEbyEFluctuationAnalysisTask.cxx:204
 AliEbyEFluctuationAnalysisTask.cxx:205
 AliEbyEFluctuationAnalysisTask.cxx:206
 AliEbyEFluctuationAnalysisTask.cxx:207
 AliEbyEFluctuationAnalysisTask.cxx:208
 AliEbyEFluctuationAnalysisTask.cxx:209
 AliEbyEFluctuationAnalysisTask.cxx:210
 AliEbyEFluctuationAnalysisTask.cxx:211
 AliEbyEFluctuationAnalysisTask.cxx:212
 AliEbyEFluctuationAnalysisTask.cxx:213
 AliEbyEFluctuationAnalysisTask.cxx:214
 AliEbyEFluctuationAnalysisTask.cxx:215
 AliEbyEFluctuationAnalysisTask.cxx:216
 AliEbyEFluctuationAnalysisTask.cxx:217
 AliEbyEFluctuationAnalysisTask.cxx:218
 AliEbyEFluctuationAnalysisTask.cxx:219
 AliEbyEFluctuationAnalysisTask.cxx:220
 AliEbyEFluctuationAnalysisTask.cxx:221
 AliEbyEFluctuationAnalysisTask.cxx:222
 AliEbyEFluctuationAnalysisTask.cxx:223
 AliEbyEFluctuationAnalysisTask.cxx:224
 AliEbyEFluctuationAnalysisTask.cxx:225
 AliEbyEFluctuationAnalysisTask.cxx:226
 AliEbyEFluctuationAnalysisTask.cxx:227
 AliEbyEFluctuationAnalysisTask.cxx:228
 AliEbyEFluctuationAnalysisTask.cxx:229
 AliEbyEFluctuationAnalysisTask.cxx:230
 AliEbyEFluctuationAnalysisTask.cxx:231
 AliEbyEFluctuationAnalysisTask.cxx:232
 AliEbyEFluctuationAnalysisTask.cxx:233
 AliEbyEFluctuationAnalysisTask.cxx:234
 AliEbyEFluctuationAnalysisTask.cxx:235
 AliEbyEFluctuationAnalysisTask.cxx:236
 AliEbyEFluctuationAnalysisTask.cxx:237
 AliEbyEFluctuationAnalysisTask.cxx:238
 AliEbyEFluctuationAnalysisTask.cxx:239
 AliEbyEFluctuationAnalysisTask.cxx:240
 AliEbyEFluctuationAnalysisTask.cxx:241
 AliEbyEFluctuationAnalysisTask.cxx:242