ROOT logo
#include "TChain.h"
#include "TList.h"
#include "TCanvas.h"
#include "TLorentzVector.h"
#include "TGraphErrors.h"
#include "TH1F.h"

#include "AliAnalysisTaskSE.h"
#include "AliAnalysisManager.h"

#include "AliESDVertex.h"
#include "AliESDEvent.h"
#include "AliESDInputHandler.h"
#include "AliAODEvent.h"
#include "AliAODTrack.h"
#include "AliAODInputHandler.h"
#include "AliMCEventHandler.h"
#include "AliMCEvent.h"
#include "AliStack.h"
#include "AliESDtrackCuts.h"

#include "AliAnalysisTaskChargeFluctuations.h"

// Analysis task for the ChargeFluctuations code
// Authors: Panos Cristakoglou@cern.ch

ClassImp(AliAnalysisTaskChargeFluctuations)

//________________________________________________________________________
AliAnalysisTaskChargeFluctuations::AliAnalysisTaskChargeFluctuations(const char *name) 
: AliAnalysisTaskSE(name), 
  fList(0),
  fHistEventStats(0),
  fHistVx(0),
  fHistVy(0),
  fHistVz(0),
  fESDtrackCuts(0),
  fUseOfflineTrigger(kFALSE),
  fVxMax(0.3),
  fVyMax(0.3),
  fVzMax(10.) {
  // Constructor

  // Define input and output slots here
  // Input slot #0 works with a TChain
  DefineInput(0, TChain::Class());
  // Output slot #0 writes into a TH1 container
  DefineOutput(1, TList::Class());
}

//________________________________________________________________________
void AliAnalysisTaskChargeFluctuations::UserCreateOutputObjects() {
  // Create histograms
  // Called once
  fList = new TList();
  fList->SetName("outputList");

  //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());
  fList->Add(fHistEventStats);

  //Vertex distributions
  fHistVx = new TH1F("fHistVx","Primary vertex distribution - x coordinate;V_{x} (cm);Entries",100,-0.5,0.5);
  fList->Add(fHistVx);
  fHistVy = new TH1F("fHistVy","Primary vertex distribution - y coordinate;V_{y} (cm);Entries",100,-0.5,0.5);
  fList->Add(fHistVy);
  fHistVz = new TH1F("fHistVz","Primary vertex distribution - z coordinate;V_{z} (cm);Entries",100,-20.,20.);
  fList->Add(fHistVz);

  if(fESDtrackCuts) fList->Add(fESDtrackCuts);

  // Post output data.
  PostData(1, fList);
}

//________________________________________________________________________
void AliAnalysisTaskChargeFluctuations::UserExec(Option_t *) {
  // Main loop
  // Called for each event
  TString gAnalysisLevel = "ESD";

  //ESD analysis
  if(gAnalysisLevel == "ESD") {
    AliESDEvent* gESD = dynamic_cast<AliESDEvent*>(InputEvent()); // from TaskSE
    if (!gESD) {
      Printf("ERROR: gESD not available");
      return;
    }

    fHistEventStats->Fill(1); //all events
    Bool_t isSelected = kTRUE;
    if(fUseOfflineTrigger)
      isSelected = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
    if(isSelected) {
      fHistEventStats->Fill(2); //triggered events

      const AliESDVertex *vertex = gESD->GetPrimaryVertex();
      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); //analayzed events
		  fHistVx->Fill(vertex->GetX());
		  fHistVy->Fill(vertex->GetY());
		  fHistVz->Fill(vertex->GetZ());

		  //Printf("There are %d tracks in this event", gESD->GetNumberOfTracks());
		  for (Int_t iTracks = 0; iTracks < gESD->GetNumberOfTracks(); iTracks++) {
		    AliESDtrack* track = gESD->GetTrack(iTracks);
		    if (!track) {
		      Printf("ERROR: Could not receive track %d", iTracks);
		      continue;
		    }
		    
		    //ESD track cuts
		    if(fESDtrackCuts) 
		      if(!fESDtrackCuts->AcceptTrack(track)) continue;
		  } //track loop
		}//Vz cut
	      }//Vy cut
	    }//Vx cut
	  }//proper vertex resolution
	}//proper number of contributors
      }//vertex object valid
    }//triggered event 
  }//ESD analysis
  //AOD analysis
  else if(gAnalysisLevel == "AOD") {
    AliAODEvent* gAOD = dynamic_cast<AliAODEvent*>(InputEvent()); // from TaskSE
    if(!gAOD) {
      Printf("ERROR: gAOD not available");
      return;
    }

    Printf("There are %d tracks in this event", gAOD->GetNumberOfTracks());
    for (Int_t iTracks = 0; iTracks < gAOD->GetNumberOfTracks(); iTracks++) {
      AliAODTrack* track = dynamic_cast<AliAODTrack*>(gAOD->GetTrack(iTracks));
      if(!track) AliFatal("Not a standard AOD");
      if (!track) {
	Printf("ERROR: Could not receive track %d", iTracks);
	continue;
      }
    } //track loop
  }//AOD analysis
  //MC analysis
  else if(gAnalysisLevel == "MC") {

    AliMCEvent*  mcEvent = MCEvent(); 
    if (!mcEvent) {
      Printf("ERROR: mcEvent not available");
      return;
    }
    
    Printf("There are %d tracks in this event", mcEvent->GetNumberOfPrimaries());
    for (Int_t iTracks = 0; iTracks < mcEvent->GetNumberOfPrimaries(); iTracks++) {
      AliMCParticle* track = dynamic_cast<AliMCParticle *>(mcEvent->GetTrack(iTracks));
      if (!track) {
	Printf("ERROR: Could not receive particle %d", iTracks);
	continue;
      }
    } //track loop
  }//MC analysis
}

//________________________________________________________________________
void AliAnalysisTaskChargeFluctuations::Terminate(Option_t *) {
  // Draw result to the screen
  // Called once at the end of the query
  fList = dynamic_cast<TList*> (GetOutputData(1));
  if (!fList) {
    Printf("ERROR: fList not available");
    return;
  }
}
 AliAnalysisTaskChargeFluctuations.cxx:1
 AliAnalysisTaskChargeFluctuations.cxx:2
 AliAnalysisTaskChargeFluctuations.cxx:3
 AliAnalysisTaskChargeFluctuations.cxx:4
 AliAnalysisTaskChargeFluctuations.cxx:5
 AliAnalysisTaskChargeFluctuations.cxx:6
 AliAnalysisTaskChargeFluctuations.cxx:7
 AliAnalysisTaskChargeFluctuations.cxx:8
 AliAnalysisTaskChargeFluctuations.cxx:9
 AliAnalysisTaskChargeFluctuations.cxx:10
 AliAnalysisTaskChargeFluctuations.cxx:11
 AliAnalysisTaskChargeFluctuations.cxx:12
 AliAnalysisTaskChargeFluctuations.cxx:13
 AliAnalysisTaskChargeFluctuations.cxx:14
 AliAnalysisTaskChargeFluctuations.cxx:15
 AliAnalysisTaskChargeFluctuations.cxx:16
 AliAnalysisTaskChargeFluctuations.cxx:17
 AliAnalysisTaskChargeFluctuations.cxx:18
 AliAnalysisTaskChargeFluctuations.cxx:19
 AliAnalysisTaskChargeFluctuations.cxx:20
 AliAnalysisTaskChargeFluctuations.cxx:21
 AliAnalysisTaskChargeFluctuations.cxx:22
 AliAnalysisTaskChargeFluctuations.cxx:23
 AliAnalysisTaskChargeFluctuations.cxx:24
 AliAnalysisTaskChargeFluctuations.cxx:25
 AliAnalysisTaskChargeFluctuations.cxx:26
 AliAnalysisTaskChargeFluctuations.cxx:27
 AliAnalysisTaskChargeFluctuations.cxx:28
 AliAnalysisTaskChargeFluctuations.cxx:29
 AliAnalysisTaskChargeFluctuations.cxx:30
 AliAnalysisTaskChargeFluctuations.cxx:31
 AliAnalysisTaskChargeFluctuations.cxx:32
 AliAnalysisTaskChargeFluctuations.cxx:33
 AliAnalysisTaskChargeFluctuations.cxx:34
 AliAnalysisTaskChargeFluctuations.cxx:35
 AliAnalysisTaskChargeFluctuations.cxx:36
 AliAnalysisTaskChargeFluctuations.cxx:37
 AliAnalysisTaskChargeFluctuations.cxx:38
 AliAnalysisTaskChargeFluctuations.cxx:39
 AliAnalysisTaskChargeFluctuations.cxx:40
 AliAnalysisTaskChargeFluctuations.cxx:41
 AliAnalysisTaskChargeFluctuations.cxx:42
 AliAnalysisTaskChargeFluctuations.cxx:43
 AliAnalysisTaskChargeFluctuations.cxx:44
 AliAnalysisTaskChargeFluctuations.cxx:45
 AliAnalysisTaskChargeFluctuations.cxx:46
 AliAnalysisTaskChargeFluctuations.cxx:47
 AliAnalysisTaskChargeFluctuations.cxx:48
 AliAnalysisTaskChargeFluctuations.cxx:49
 AliAnalysisTaskChargeFluctuations.cxx:50
 AliAnalysisTaskChargeFluctuations.cxx:51
 AliAnalysisTaskChargeFluctuations.cxx:52
 AliAnalysisTaskChargeFluctuations.cxx:53
 AliAnalysisTaskChargeFluctuations.cxx:54
 AliAnalysisTaskChargeFluctuations.cxx:55
 AliAnalysisTaskChargeFluctuations.cxx:56
 AliAnalysisTaskChargeFluctuations.cxx:57
 AliAnalysisTaskChargeFluctuations.cxx:58
 AliAnalysisTaskChargeFluctuations.cxx:59
 AliAnalysisTaskChargeFluctuations.cxx:60
 AliAnalysisTaskChargeFluctuations.cxx:61
 AliAnalysisTaskChargeFluctuations.cxx:62
 AliAnalysisTaskChargeFluctuations.cxx:63
 AliAnalysisTaskChargeFluctuations.cxx:64
 AliAnalysisTaskChargeFluctuations.cxx:65
 AliAnalysisTaskChargeFluctuations.cxx:66
 AliAnalysisTaskChargeFluctuations.cxx:67
 AliAnalysisTaskChargeFluctuations.cxx:68
 AliAnalysisTaskChargeFluctuations.cxx:69
 AliAnalysisTaskChargeFluctuations.cxx:70
 AliAnalysisTaskChargeFluctuations.cxx:71
 AliAnalysisTaskChargeFluctuations.cxx:72
 AliAnalysisTaskChargeFluctuations.cxx:73
 AliAnalysisTaskChargeFluctuations.cxx:74
 AliAnalysisTaskChargeFluctuations.cxx:75
 AliAnalysisTaskChargeFluctuations.cxx:76
 AliAnalysisTaskChargeFluctuations.cxx:77
 AliAnalysisTaskChargeFluctuations.cxx:78
 AliAnalysisTaskChargeFluctuations.cxx:79
 AliAnalysisTaskChargeFluctuations.cxx:80
 AliAnalysisTaskChargeFluctuations.cxx:81
 AliAnalysisTaskChargeFluctuations.cxx:82
 AliAnalysisTaskChargeFluctuations.cxx:83
 AliAnalysisTaskChargeFluctuations.cxx:84
 AliAnalysisTaskChargeFluctuations.cxx:85
 AliAnalysisTaskChargeFluctuations.cxx:86
 AliAnalysisTaskChargeFluctuations.cxx:87
 AliAnalysisTaskChargeFluctuations.cxx:88
 AliAnalysisTaskChargeFluctuations.cxx:89
 AliAnalysisTaskChargeFluctuations.cxx:90
 AliAnalysisTaskChargeFluctuations.cxx:91
 AliAnalysisTaskChargeFluctuations.cxx:92
 AliAnalysisTaskChargeFluctuations.cxx:93
 AliAnalysisTaskChargeFluctuations.cxx:94
 AliAnalysisTaskChargeFluctuations.cxx:95
 AliAnalysisTaskChargeFluctuations.cxx:96
 AliAnalysisTaskChargeFluctuations.cxx:97
 AliAnalysisTaskChargeFluctuations.cxx:98
 AliAnalysisTaskChargeFluctuations.cxx:99
 AliAnalysisTaskChargeFluctuations.cxx:100
 AliAnalysisTaskChargeFluctuations.cxx:101
 AliAnalysisTaskChargeFluctuations.cxx:102
 AliAnalysisTaskChargeFluctuations.cxx:103
 AliAnalysisTaskChargeFluctuations.cxx:104
 AliAnalysisTaskChargeFluctuations.cxx:105
 AliAnalysisTaskChargeFluctuations.cxx:106
 AliAnalysisTaskChargeFluctuations.cxx:107
 AliAnalysisTaskChargeFluctuations.cxx:108
 AliAnalysisTaskChargeFluctuations.cxx:109
 AliAnalysisTaskChargeFluctuations.cxx:110
 AliAnalysisTaskChargeFluctuations.cxx:111
 AliAnalysisTaskChargeFluctuations.cxx:112
 AliAnalysisTaskChargeFluctuations.cxx:113
 AliAnalysisTaskChargeFluctuations.cxx:114
 AliAnalysisTaskChargeFluctuations.cxx:115
 AliAnalysisTaskChargeFluctuations.cxx:116
 AliAnalysisTaskChargeFluctuations.cxx:117
 AliAnalysisTaskChargeFluctuations.cxx:118
 AliAnalysisTaskChargeFluctuations.cxx:119
 AliAnalysisTaskChargeFluctuations.cxx:120
 AliAnalysisTaskChargeFluctuations.cxx:121
 AliAnalysisTaskChargeFluctuations.cxx:122
 AliAnalysisTaskChargeFluctuations.cxx:123
 AliAnalysisTaskChargeFluctuations.cxx:124
 AliAnalysisTaskChargeFluctuations.cxx:125
 AliAnalysisTaskChargeFluctuations.cxx:126
 AliAnalysisTaskChargeFluctuations.cxx:127
 AliAnalysisTaskChargeFluctuations.cxx:128
 AliAnalysisTaskChargeFluctuations.cxx:129
 AliAnalysisTaskChargeFluctuations.cxx:130
 AliAnalysisTaskChargeFluctuations.cxx:131
 AliAnalysisTaskChargeFluctuations.cxx:132
 AliAnalysisTaskChargeFluctuations.cxx:133
 AliAnalysisTaskChargeFluctuations.cxx:134
 AliAnalysisTaskChargeFluctuations.cxx:135
 AliAnalysisTaskChargeFluctuations.cxx:136
 AliAnalysisTaskChargeFluctuations.cxx:137
 AliAnalysisTaskChargeFluctuations.cxx:138
 AliAnalysisTaskChargeFluctuations.cxx:139
 AliAnalysisTaskChargeFluctuations.cxx:140
 AliAnalysisTaskChargeFluctuations.cxx:141
 AliAnalysisTaskChargeFluctuations.cxx:142
 AliAnalysisTaskChargeFluctuations.cxx:143
 AliAnalysisTaskChargeFluctuations.cxx:144
 AliAnalysisTaskChargeFluctuations.cxx:145
 AliAnalysisTaskChargeFluctuations.cxx:146
 AliAnalysisTaskChargeFluctuations.cxx:147
 AliAnalysisTaskChargeFluctuations.cxx:148
 AliAnalysisTaskChargeFluctuations.cxx:149
 AliAnalysisTaskChargeFluctuations.cxx:150
 AliAnalysisTaskChargeFluctuations.cxx:151
 AliAnalysisTaskChargeFluctuations.cxx:152
 AliAnalysisTaskChargeFluctuations.cxx:153
 AliAnalysisTaskChargeFluctuations.cxx:154
 AliAnalysisTaskChargeFluctuations.cxx:155
 AliAnalysisTaskChargeFluctuations.cxx:156
 AliAnalysisTaskChargeFluctuations.cxx:157
 AliAnalysisTaskChargeFluctuations.cxx:158
 AliAnalysisTaskChargeFluctuations.cxx:159
 AliAnalysisTaskChargeFluctuations.cxx:160
 AliAnalysisTaskChargeFluctuations.cxx:161
 AliAnalysisTaskChargeFluctuations.cxx:162
 AliAnalysisTaskChargeFluctuations.cxx:163
 AliAnalysisTaskChargeFluctuations.cxx:164
 AliAnalysisTaskChargeFluctuations.cxx:165
 AliAnalysisTaskChargeFluctuations.cxx:166
 AliAnalysisTaskChargeFluctuations.cxx:167
 AliAnalysisTaskChargeFluctuations.cxx:168
 AliAnalysisTaskChargeFluctuations.cxx:169
 AliAnalysisTaskChargeFluctuations.cxx:170
 AliAnalysisTaskChargeFluctuations.cxx:171
 AliAnalysisTaskChargeFluctuations.cxx:172
 AliAnalysisTaskChargeFluctuations.cxx:173
 AliAnalysisTaskChargeFluctuations.cxx:174
 AliAnalysisTaskChargeFluctuations.cxx:175
 AliAnalysisTaskChargeFluctuations.cxx:176
 AliAnalysisTaskChargeFluctuations.cxx:177
 AliAnalysisTaskChargeFluctuations.cxx:178
 AliAnalysisTaskChargeFluctuations.cxx:179
 AliAnalysisTaskChargeFluctuations.cxx:180
 AliAnalysisTaskChargeFluctuations.cxx:181
 AliAnalysisTaskChargeFluctuations.cxx:182
 AliAnalysisTaskChargeFluctuations.cxx:183