Warning removed.
[u/mrichter/AliRoot.git] / PWG0 / dNdEta / AlidNdEtaAnalysisESDSelector.cxx
CommitLineData
dc740de4 1/* $Id$ */
2
3#include "AlidNdEtaAnalysisESDSelector.h"
4
5#include <TStyle.h>
6#include <TSystem.h>
7#include <TCanvas.h>
8#include <TVector3.h>
7029240a 9#include <TChain.h>
16e24ca3 10#include <TFile.h>
9e952c39 11#include <TH1F.h>
dc740de4 12
13#include <AliLog.h>
fcf2fb36 14#include <AliESDVertex.h>
15#include <AliESD.h>
dc740de4 16
17#include "esdTrackCuts/AliESDtrackCuts.h"
16e24ca3 18#include "dNdEta/dNdEtaAnalysis.h"
45e97e28 19#include "AliPWG0Helper.h"
dc740de4 20
74fd10b3 21#include "AliGenEventHeader.h"
22#include "AliHeader.h"
23#include "AliStack.h"
24#include "TParticle.h"
25
dc740de4 26ClassImp(AlidNdEtaAnalysisESDSelector)
27
28AlidNdEtaAnalysisESDSelector::AlidNdEtaAnalysisESDSelector() :
93ec06b5 29 AliSelector(),
1afae8ff 30 fdNdEtaAnalysis(0),
9e952c39 31 fMult(0),
74fd10b3 32 fEsdTrackCuts(0)
33{
dc740de4 34 //
35 // Constructor. Initialization of pointers
36 //
16e24ca3 37
0ab29cfa 38 AliLog::SetClassDebugLevel("AlidNdEtaAnalysisESDSelector", AliLog::kDebug);
dc740de4 39}
40
41AlidNdEtaAnalysisESDSelector::~AlidNdEtaAnalysisESDSelector()
42{
43 //
44 // Destructor
45 //
46
47 // histograms are in the output list and deleted when the output
48 // list is deleted by the TSelector dtor
49}
50
0ab29cfa 51void AlidNdEtaAnalysisESDSelector::Begin(TTree* tree)
dc740de4 52{
0ab29cfa 53 // Begin function
dc740de4 54
0ab29cfa 55 ReadUserObjects(tree);
56}
dc740de4 57
0ab29cfa 58void AlidNdEtaAnalysisESDSelector::ReadUserObjects(TTree* tree)
59{
60 // read the user objects, called from slavebegin and begin
dc740de4 61
16e24ca3 62 if (!fEsdTrackCuts && fInput)
63 fEsdTrackCuts = dynamic_cast<AliESDtrackCuts*> (fInput->FindObject("AliESDtrackCuts"));
64
1afae8ff 65 if (!fEsdTrackCuts && tree)
66 fEsdTrackCuts = dynamic_cast<AliESDtrackCuts*> (tree->GetUserInfo()->FindObject("AliESDtrackCuts"));
67
16e24ca3 68 if (!fEsdTrackCuts)
69 AliDebug(AliLog::kError, "ERROR: Could not read EsdTrackCuts from input list.");
0ab29cfa 70}
1afae8ff 71
0ab29cfa 72void AlidNdEtaAnalysisESDSelector::SlaveBegin(TTree* tree)
73{
74 // The SlaveBegin() function is called after the Begin() function.
75 // When running with PROOF SlaveBegin() is called on each slave server.
76 // The tree argument is deprecated (on PROOF 0 is passed).
77
93ec06b5 78 AliSelector::SlaveBegin(tree);
0ab29cfa 79
80 ReadUserObjects(tree);
1afae8ff 81
16e24ca3 82 fdNdEtaAnalysis = new dNdEtaAnalysis("dndeta", "dndeta");
9e952c39 83 fMult = new TH1F("fMult", "fMult;Ntracks;Count", 201, -0.5, 200.5);
16e24ca3 84}
85
86void AlidNdEtaAnalysisESDSelector::Init(TTree* tree)
87{
88 // read the user objects
89
93ec06b5 90 AliSelector::Init(tree);
5c495d37 91
92 // Enable only the needed branches
93 if (tree)
94 {
95 tree->SetBranchStatus("*", 0);
96 tree->SetBranchStatus("fTriggerMask", 1);
97 tree->SetBranchStatus("fSPDVertex*", 1);
74fd10b3 98 tree->SetBranchStatus("fTracks.fLabel", 1);
5c495d37 99
100 AliESDtrackCuts::EnableNeededBranches(tree);
101 }
dc740de4 102}
103
104Bool_t AlidNdEtaAnalysisESDSelector::Process(Long64_t entry)
105{
74fd10b3 106 // loop over all events
dc740de4 107
93ec06b5 108 if (AliSelector::Process(entry) == kFALSE)
dc740de4 109 return kFALSE;
110
111 // Check prerequisites
112 if (!fESD)
113 {
114 AliDebug(AliLog::kError, "ESD branch not available");
115 return kFALSE;
116 }
117
118 if (!fEsdTrackCuts)
119 {
120 AliDebug(AliLog::kError, "fESDTrackCuts not available");
121 return kFALSE;
122 }
123
847489f7 124 if (AliPWG0Helper::IsEventTriggered(fESD) == kFALSE)
5c495d37 125 {
126 AliDebug(AliLog::kDebug+1, Form("Skipping event %d because it was not triggered", (Int_t) entry));
847489f7 127 return kTRUE;
5c495d37 128 }
847489f7 129
45e97e28 130 if (AliPWG0Helper::IsVertexReconstructed(fESD) == kFALSE)
5c495d37 131 {
132 AliDebug(AliLog::kDebug+1, Form("Skipping event %d because its vertex was not reconstructed", (Int_t) entry));
dc740de4 133 return kTRUE;
5c495d37 134 }
dc740de4 135
74fd10b3 136 // get the ESD vertex
45e97e28 137 const AliESDVertex* vtxESD = fESD->GetVertex();
dc740de4 138 Double_t vtx[3];
139 vtxESD->GetXYZ(vtx);
140
45e97e28 141 // get number of "good" tracks
142 TObjArray* list = fEsdTrackCuts->GetAcceptedTracks(fESD);
143 Int_t nGoodTracks = list->GetEntries();
144
dc740de4 145 // loop over esd tracks
45e97e28 146 for (Int_t t=0; t<nGoodTracks; t++)
dc740de4 147 {
45e97e28 148 AliESDtrack* esdTrack = dynamic_cast<AliESDtrack*> (list->At(t));
dc740de4 149 if (!esdTrack)
150 {
151 AliDebug(AliLog::kError, Form("ERROR: Could not retrieve track %d.", t));
152 continue;
153 }
154
dc740de4 155 Double_t p[3];
38233af1 156 esdTrack->GetConstrainedPxPyPz(p); // ### TODO should be okay because we have a vertex, however GetInnerPxPyPy / GetOuterPxPyPy also exist
dc740de4 157 TVector3 vector(p);
158
159 Float_t theta = vector.Theta();
160 Float_t eta = -TMath::Log(TMath::Tan(theta/2.));
45e97e28 161 Float_t pt = vector.Pt();
162
74fd10b3 163 fdNdEtaAnalysis->FillTrack(vtx[2], eta, pt);
dc740de4 164 } // end of track loop
165
45e97e28 166 delete list;
167 list = 0;
168
dc740de4 169 // for event count per vertex
74fd10b3 170 fdNdEtaAnalysis->FillEvent(vtx[2], nGoodTracks);
9e952c39 171 fMult->Fill(nGoodTracks);
dc740de4 172
173 return kTRUE;
174}
175
16e24ca3 176void AlidNdEtaAnalysisESDSelector::SlaveTerminate()
177{
178 // The SlaveTerminate() function is called after all entries or objects
179 // have been processed. When running with PROOF SlaveTerminate() is called
180 // on each slave server.
181
93ec06b5 182 AliSelector::SlaveTerminate();
16e24ca3 183
184 // Add the histograms to the output on each slave server
185 if (!fOutput)
186 {
187 AliDebug(AliLog::kError, Form("ERROR: Output list not initialized."));
188 return;
189 }
190
38233af1 191 // Add the objects to the output list and set them to 0, so that the destructor does not delete them.
192
16e24ca3 193 fOutput->Add(fdNdEtaAnalysis);
9e952c39 194 fOutput->Add(fMult);
195
38233af1 196 fdNdEtaAnalysis = 0;
16e24ca3 197}
198
199void AlidNdEtaAnalysisESDSelector::Terminate()
dc740de4 200{
16e24ca3 201 // The Terminate() function is the last function to be called during
202 // a query. It always runs on the client, it can be used to present
203 // the results graphically or save the results to file.
204
93ec06b5 205 AliSelector::Terminate();
16e24ca3 206
207 fdNdEtaAnalysis = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("dndeta"));
9e952c39 208 fMult = dynamic_cast<TH1F*> (fOutput->FindObject("fMult"));
16e24ca3 209
74fd10b3 210 if (!fdNdEtaAnalysis)
16e24ca3 211 {
74fd10b3 212 AliDebug(AliLog::kError, "ERROR: Histograms not available");
16e24ca3 213 return;
214 }
215
74fd10b3 216 TFile* fout = new TFile("analysis_esd_raw.root", "RECREATE");
16e24ca3 217
218 if (fdNdEtaAnalysis)
219 fdNdEtaAnalysis->SaveHistograms();
dc740de4 220
221 if (fEsdTrackCuts)
222 fEsdTrackCuts->SaveHistograms("esd_tracks_cuts");
16e24ca3 223
9e952c39 224 if (fMult)
225 fMult->Write();
226
16e24ca3 227 fout->Write();
228 fout->Close();
dc740de4 229}