3 #include "AlidNdEtaAnalysisMCSelector.h"
9 #include <TParticlePDG.h>
17 #include <AliGenEventHeader.h>
18 #include <AliHeader.h>
20 #include <AliESDtrack.h>
22 #include "dNdEta/dNdEtaAnalysis.h"
23 #include <AliPWG0Helper.h>
24 #include <AliCorrection.h>
25 #include <AliCorrectionMatrix2D.h>
26 #include "esdTrackCuts/AliESDtrackCuts.h"
29 ClassImp(AlidNdEtaAnalysisMCSelector)
31 AlidNdEtaAnalysisMCSelector::AlidNdEtaAnalysisMCSelector() :
36 fdNdEtaAnalysisTrVtx(0),
37 fdNdEtaAnalysisTracks(0),
43 // Constructor. Initialization of pointers
47 AlidNdEtaAnalysisMCSelector::~AlidNdEtaAnalysisMCSelector()
54 void AlidNdEtaAnalysisMCSelector::Begin(TTree* tree)
58 ReadUserObjects(tree);
61 void AlidNdEtaAnalysisMCSelector::ReadUserObjects(TTree* tree)
63 // read the user objects, called from slavebegin and begin
65 if (!fEsdTrackCuts && fInput)
66 fEsdTrackCuts = dynamic_cast<AliESDtrackCuts*> (fInput->FindObject("AliESDtrackCuts"));
68 if (!fEsdTrackCuts && tree)
69 fEsdTrackCuts = dynamic_cast<AliESDtrackCuts*> (tree->GetUserInfo()->FindObject("AliESDtrackCuts"));
72 AliDebug(AliLog::kError, "ERROR: Could not read EsdTrackCuts from input list.");
75 void AlidNdEtaAnalysisMCSelector::SlaveBegin(TTree * tree)
77 // The SlaveBegin() function is called after the Begin() function.
78 // When running with PROOF SlaveBegin() is called on each slave server.
79 // The tree argument is deprecated (on PROOF 0 is passed).
81 AliSelectorRL::SlaveBegin(tree);
83 ReadUserObjects(tree);
85 fdNdEtaAnalysis = new dNdEtaAnalysis("dndeta", "dndeta");
86 fdNdEtaAnalysisTr = new dNdEtaAnalysis("dndetaTr", "dndetaTr");
87 fdNdEtaAnalysisTrVtx = new dNdEtaAnalysis("dndetaTrVtx", "dndetaTrVtx");
88 fdNdEtaAnalysisTracks = new dNdEtaAnalysis("dndetaTracks", "dndetaTracks");
89 fVertex = new TH3F("vertex_check", "vertex_check", 50, -50, 50, 50, -50, 50, 50, -50, 50);
90 for (Int_t i=0; i<3; ++i)
92 fPartEta[i] = new TH1F(Form("dndeta_check_%d", i), Form("dndeta_check_%d", i), 60, -6, 6);
95 fPartPt = new TH1F("dndeta_check_pt", "dndeta_check_pt", 1000, 0, 10);
97 fEvents = new TH1F("dndeta_check_vertex", "dndeta_check_vertex", 40, -20, 20);
100 void AlidNdEtaAnalysisMCSelector::Init(TTree *tree)
102 AliSelectorRL::Init(tree);
106 AliDebug(AliLog::kError, "tree not available");
110 tree->SetBranchStatus("*", 0);
111 tree->SetBranchStatus("fTriggerMask", 1);
112 tree->SetBranchStatus("fSPDVertex*", 1);
113 tree->SetBranchStatus("fTracks.fLabel", 1);
115 AliESDtrackCuts::EnableNeededBranches(tree);
118 Bool_t AlidNdEtaAnalysisMCSelector::Process(Long64_t entry)
120 // fill the dNdEtaAnalysis class from the monte carlo
122 if (AliSelectorRL::Process(entry) == kFALSE)
125 // Check prerequisites
128 AliDebug(AliLog::kError, "ESD branch not available");
132 AliStack* stack = GetStack();
135 AliDebug(AliLog::kError, "Stack not available");
139 AliHeader* header = GetHeader();
142 AliDebug(AliLog::kError, "Header not available");
146 Bool_t vertexReconstructed = AliPWG0Helper::IsVertexReconstructed(fESD);
147 Bool_t eventTriggered = AliPWG0Helper::IsEventTriggered(fESD);
150 AliGenEventHeader* genHeader = header->GenEventHeader();
153 genHeader->PrimaryVertex(vtxMC);
155 // loop over mc particles
156 Int_t nPrim = stack->GetNprimary();
158 Int_t nAcceptedParticles = 0;
160 for (Int_t iMc = 0; iMc < nPrim; ++iMc)
162 TParticle* particle = stack->Particle(iMc);
167 if (AliPWG0Helper::IsPrimaryCharged(particle, nPrim) == kFALSE)
170 AliDebug(AliLog::kDebug+1, Form("Accepted primary %d, unique ID: %d", iMc, particle->GetUniqueID()));
171 ++nAcceptedParticles;
173 fdNdEtaAnalysis->FillTrack(vtxMC[2], particle->Eta(), particle->Pt());
174 fVertex->Fill(particle->Vx(), particle->Vy(), particle->Vz());
178 fdNdEtaAnalysisTr->FillTrack(vtxMC[2], particle->Eta(), particle->Pt());
179 if (vertexReconstructed)
180 fdNdEtaAnalysisTrVtx->FillTrack(vtxMC[2], particle->Eta(), particle->Pt());
183 if (TMath::Abs(vtxMC[2]) < 20)
185 fPartEta[0]->Fill(particle->Eta());
188 fPartEta[1]->Fill(particle->Eta());
190 fPartEta[2]->Fill(particle->Eta());
193 if (TMath::Abs(particle->Eta()) < 0.8)
194 fPartPt->Fill(particle->Pt());
197 fEvents->Fill(vtxMC[2]);
199 fdNdEtaAnalysis->FillEvent(vtxMC[2], nAcceptedParticles);
202 fdNdEtaAnalysisTr->FillEvent(vtxMC[2], nAcceptedParticles);
203 if (vertexReconstructed)
204 fdNdEtaAnalysisTrVtx->FillEvent(vtxMC[2], nAcceptedParticles);
207 if (!eventTriggered || !vertexReconstructed)
210 // from tracks is only done for triggered and vertex reconstructed events
212 // get number of "good" tracks
213 TObjArray* list = fEsdTrackCuts->GetAcceptedTracks(fESD);
214 Int_t nGoodTracks = list->GetEntries();
216 // loop over esd tracks
217 for (Int_t t=0; t<nGoodTracks; t++)
219 AliESDtrack* esdTrack = dynamic_cast<AliESDtrack*> (list->At(t));
222 AliDebug(AliLog::kError, Form("ERROR: Could not retrieve track %d.", t));
226 Int_t label = TMath::Abs(esdTrack->GetLabel());
228 TParticle* particle = stack->Particle(label);
231 AliDebug(AliLog::kError, Form("ERROR: Could not retrieve particle %d.", esdTrack->GetLabel()));
235 fdNdEtaAnalysisTracks->FillTrack(vtxMC[2], particle->Eta(), particle->Pt());
236 } // end of track loop
241 // for event count per vertex
242 fdNdEtaAnalysisTracks->FillEvent(vtxMC[2], nGoodTracks);
247 void AlidNdEtaAnalysisMCSelector::SlaveTerminate()
249 // The SlaveTerminate() function is called after all entries or objects
250 // have been processed. When running with PROOF SlaveTerminate() is called
251 // on each slave server.
253 AliSelectorRL::SlaveTerminate();
255 // Add the histograms to the output on each slave server
258 AliDebug(AliLog::kError, Form("ERROR: Output list not initialized."));
262 fOutput->Add(fdNdEtaAnalysis);
263 fOutput->Add(fdNdEtaAnalysisTr);
264 fOutput->Add(fdNdEtaAnalysisTrVtx);
265 fOutput->Add(fdNdEtaAnalysisTracks);
267 fOutput->Add(fPartPt);
268 fOutput->Add(fEvents);
269 for (Int_t i=0; i<3; ++i)
270 fOutput->Add(fPartEta[i]);
273 void AlidNdEtaAnalysisMCSelector::Terminate()
277 AliSelectorRL::Terminate();
279 fdNdEtaAnalysis = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("dndeta"));
280 fdNdEtaAnalysisTr = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("dndetaTr"));
281 fdNdEtaAnalysisTrVtx = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("dndetaTrVtx"));
282 fdNdEtaAnalysisTracks = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("dndetaTracks"));
283 fPartPt = dynamic_cast<TH1F*> (fOutput->FindObject("dndeta_check_pt"));
284 fEvents = dynamic_cast<TH1F*> (fOutput->FindObject("dndeta_check_vertex"));
285 for (Int_t i=0; i<3; ++i)
286 fPartEta[i] = dynamic_cast<TH1F*> (fOutput->FindObject(Form("dndeta_check_%d", i)));
288 if (!fdNdEtaAnalysis || !fdNdEtaAnalysisTr || !fdNdEtaAnalysisTrVtx || !fPartPt || !fEvents)
290 AliDebug(AliLog::kError, Form("ERROR: Histograms not available %p %p", (void*) fdNdEtaAnalysis, (void*) fPartPt));
294 fdNdEtaAnalysis->Finish(0, -1, AlidNdEtaCorrection::kNone);
295 fdNdEtaAnalysisTr->Finish(0, -1, AlidNdEtaCorrection::kNone);
296 fdNdEtaAnalysisTrVtx->Finish(0, -1, AlidNdEtaCorrection::kNone);
297 fdNdEtaAnalysisTracks->Finish(0, -1, AlidNdEtaCorrection::kNone);
299 Int_t events = (Int_t) fdNdEtaAnalysis->GetData()->GetEventCorrection()->GetMeasuredHistogram()->Integral();
300 fPartPt->Scale(1.0/events);
301 fPartPt->Scale(1.0/fPartPt->GetBinWidth(1));
305 Int_t events1 = (Int_t) fEvents->Integral(fEvents->GetXaxis()->FindBin(-19.9), fEvents->GetXaxis()->FindBin(-0.001));
306 Int_t events2 = (Int_t) fEvents->Integral(fEvents->GetXaxis()->FindBin(0.001), fEvents->GetXaxis()->FindBin(19.9));
308 fPartEta[0]->Scale(1.0 / (events1 + events2));
309 fPartEta[1]->Scale(1.0 / events1);
310 fPartEta[2]->Scale(1.0 / events2);
312 for (Int_t i=0; i<3; ++i)
313 fPartEta[i]->Scale(1.0 / fPartEta[i]->GetBinWidth(1));
315 new TCanvas("control", "control", 500, 500);
316 for (Int_t i=0; i<3; ++i)
318 fPartEta[i]->SetLineColor(i+1);
319 fPartEta[i]->Draw((i==0) ? "" : "SAME");
323 TFile* fout = new TFile("analysis_mc.root","RECREATE");
325 fdNdEtaAnalysis->SaveHistograms();
326 fdNdEtaAnalysisTr->SaveHistograms();
327 fdNdEtaAnalysisTrVtx->SaveHistograms();
328 fdNdEtaAnalysisTracks->SaveHistograms();
336 new TCanvas("control2", "control2", 500, 500);
342 new TCanvas("control3", "control3", 500, 500);