3 #include "AlidNdEtaAnalysisESDSelector.h"
14 #include <AliESDVertex.h>
17 #include "esdTrackCuts/AliESDtrackCuts.h"
18 #include "dNdEta/dNdEtaAnalysis.h"
19 #include "AliPWG0Helper.h"
21 #include "AliGenEventHeader.h"
22 #include "AliHeader.h"
24 #include "TParticle.h"
26 ClassImp(AlidNdEtaAnalysisESDSelector)
28 AlidNdEtaAnalysisESDSelector::AlidNdEtaAnalysisESDSelector() :
35 // Constructor. Initialization of pointers
38 AliLog::SetClassDebugLevel("AlidNdEtaAnalysisESDSelector", AliLog::kDebug);
41 AlidNdEtaAnalysisESDSelector::~AlidNdEtaAnalysisESDSelector()
47 // histograms are in the output list and deleted when the output
48 // list is deleted by the TSelector dtor
51 void AlidNdEtaAnalysisESDSelector::Begin(TTree* tree)
55 ReadUserObjects(tree);
58 void AlidNdEtaAnalysisESDSelector::ReadUserObjects(TTree* tree)
60 // read the user objects, called from slavebegin and begin
62 if (!fEsdTrackCuts && fInput)
63 fEsdTrackCuts = dynamic_cast<AliESDtrackCuts*> (fInput->FindObject("AliESDtrackCuts"));
65 if (!fEsdTrackCuts && tree)
66 fEsdTrackCuts = dynamic_cast<AliESDtrackCuts*> (tree->GetUserInfo()->FindObject("AliESDtrackCuts"));
69 AliDebug(AliLog::kError, "ERROR: Could not read EsdTrackCuts from input list.");
72 void AlidNdEtaAnalysisESDSelector::SlaveBegin(TTree* tree)
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).
78 AliSelector::SlaveBegin(tree);
80 ReadUserObjects(tree);
82 fdNdEtaAnalysis = new dNdEtaAnalysis("dndeta", "dndeta");
83 fMult = new TH1F("fMult", "fMult;Ntracks;Count", 201, -0.5, 200.5);
86 void AlidNdEtaAnalysisESDSelector::Init(TTree* tree)
88 // read the user objects
90 AliSelector::Init(tree);
92 // Enable only the needed branches
95 tree->SetBranchStatus("*", 0);
96 tree->SetBranchStatus("fTriggerMask", 1);
97 tree->SetBranchStatus("fSPDVertex*", 1);
98 tree->SetBranchStatus("fTracks.fLabel", 1);
100 AliESDtrackCuts::EnableNeededBranches(tree);
104 Bool_t AlidNdEtaAnalysisESDSelector::Process(Long64_t entry)
106 // loop over all events
108 if (AliSelector::Process(entry) == kFALSE)
111 // Check prerequisites
114 AliDebug(AliLog::kError, "ESD branch not available");
120 AliDebug(AliLog::kError, "fESDTrackCuts not available");
124 if (AliPWG0Helper::IsEventTriggered(fESD) == kFALSE)
126 AliDebug(AliLog::kDebug+1, Form("Skipping event %d because it was not triggered", (Int_t) entry));
130 if (AliPWG0Helper::IsVertexReconstructed(fESD) == kFALSE)
132 AliDebug(AliLog::kDebug+1, Form("Skipping event %d because its vertex was not reconstructed", (Int_t) entry));
136 // get the ESD vertex
137 const AliESDVertex* vtxESD = fESD->GetVertex();
141 // get number of "good" tracks
142 TObjArray* list = fEsdTrackCuts->GetAcceptedTracks(fESD);
143 Int_t nGoodTracks = list->GetEntries();
145 // loop over esd tracks
146 for (Int_t t=0; t<nGoodTracks; t++)
148 AliESDtrack* esdTrack = dynamic_cast<AliESDtrack*> (list->At(t));
151 AliDebug(AliLog::kError, Form("ERROR: Could not retrieve track %d.", t));
156 esdTrack->GetConstrainedPxPyPz(p); // ### TODO should be okay because we have a vertex, however GetInnerPxPyPy / GetOuterPxPyPy also exist
159 Float_t theta = vector.Theta();
160 Float_t eta = -TMath::Log(TMath::Tan(theta/2.));
161 Float_t pt = vector.Pt();
163 fdNdEtaAnalysis->FillTrack(vtx[2], eta, pt);
164 } // end of track loop
169 // for event count per vertex
170 fdNdEtaAnalysis->FillEvent(vtx[2], nGoodTracks);
171 fMult->Fill(nGoodTracks);
176 void AlidNdEtaAnalysisESDSelector::SlaveTerminate()
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.
182 AliSelector::SlaveTerminate();
184 // Add the histograms to the output on each slave server
187 AliDebug(AliLog::kError, Form("ERROR: Output list not initialized."));
191 // Add the objects to the output list and set them to 0, so that the destructor does not delete them.
193 fOutput->Add(fdNdEtaAnalysis);
199 void AlidNdEtaAnalysisESDSelector::Terminate()
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.
205 AliSelector::Terminate();
207 fdNdEtaAnalysis = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("dndeta"));
208 fMult = dynamic_cast<TH1F*> (fOutput->FindObject("fMult"));
210 if (!fdNdEtaAnalysis)
212 AliDebug(AliLog::kError, "ERROR: Histograms not available");
216 TFile* fout = new TFile("analysis_esd_raw.root", "RECREATE");
219 fdNdEtaAnalysis->SaveHistograms();
222 fEsdTrackCuts->SaveHistograms("esd_tracks_cuts");