3 #include "AlidNdEtaTask.h"
14 #include <TParticle.h>
17 #include <TObjString.h>
21 #include <AliESDVertex.h>
22 #include <AliESDEvent.h>
24 #include <AliHeader.h>
25 #include <AliGenEventHeader.h>
26 #include <AliMultiplicity.h>
27 #include <AliAnalysisManager.h>
28 #include <AliMCEventHandler.h>
29 #include <AliMCEvent.h>
30 #include <AliESDInputHandler.h>
32 #include "esdTrackCuts/AliESDtrackCuts.h"
33 #include "AliPWG0Helper.h"
34 #include "AliCorrection.h"
35 #include "AliCorrectionMatrix3D.h"
36 #include "dNdEta/dNdEtaAnalysis.h"
38 ClassImp(AlidNdEtaTask)
40 AlidNdEtaTask::AlidNdEtaTask(const char* opt) :
41 AliAnalysisTask("AlidNdEtaTask", ""),
48 fdNdEtaAnalysisESD(0),
54 fdNdEtaAnalysisTrVtx(0),
55 fdNdEtaAnalysisTracks(0),
60 // Constructor. Initialization of pointers
63 // Define input and output slots here
64 DefineInput(0, TChain::Class());
65 DefineOutput(0, TList::Class());
68 AlidNdEtaTask::~AlidNdEtaTask()
74 // histograms are in the output list and deleted when the output
75 // list is deleted by the TSelector dtor
83 //________________________________________________________________________
84 void AlidNdEtaTask::ConnectInputData(Option_t *)
89 Printf("AlidNdEtaTask::ConnectInputData called");
91 TTree* tree = dynamic_cast<TTree*> (GetInputData(0));
93 Printf("ERROR: Could not read tree from input slot 0");
95 // Disable all branches and enable only the needed ones
96 //tree->SetBranchStatus("*", 0);
98 tree->SetBranchStatus("fTriggerMask", 1);
99 tree->SetBranchStatus("fSPDVertex*", 1);
101 if (fAnalysisMode == kSPD)
102 tree->SetBranchStatus("fSPDMult*", 1);
104 if (fAnalysisMode == kTPC) {
105 AliESDtrackCuts::EnableNeededBranches(tree);
106 tree->SetBranchStatus("fTracks.fLabel", 1);
109 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
112 Printf("ERROR: Could not get ESDInputHandler");
114 fESD = esdH->GetEvent();
118 void AlidNdEtaTask::CreateOutputObjects()
120 // create result objects and add to output list
126 if (fAnalysisMode == kTPC)
130 else if (fAnalysisMode == kSPD)
133 fdNdEtaAnalysisESD = new dNdEtaAnalysis("fdNdEtaAnalysisESD", "fdNdEtaAnalysisESD", detector);
134 fOutput->Add(fdNdEtaAnalysisESD);
136 fMult = new TH1F("fMult", "fMult;Ntracks;Count", 201, -0.5, 200.5);
139 fMultVtx = new TH1F("fMultVtx", "fMultVtx;Ntracks;Count", 201, -0.5, 200.5);
140 fOutput->Add(fMultVtx);
142 for (Int_t i=0; i<3; ++i)
144 fPartEta[i] = new TH1F(Form("dndeta_check_%d", i), Form("dndeta_check_%d", i), 60, -6, 6);
145 fPartEta[i]->Sumw2();
146 fOutput->Add(fPartEta[i]);
149 fEvents = new TH1F("dndeta_check_vertex", "dndeta_check_vertex", 40, -20, 20);
150 fOutput->Add(fEvents);
154 fdNdEtaAnalysis = new dNdEtaAnalysis("dndeta", "dndeta", detector);
155 fOutput->Add(fdNdEtaAnalysis);
157 fdNdEtaAnalysisTr = new dNdEtaAnalysis("dndetaTr", "dndetaTr", detector);
158 fOutput->Add(fdNdEtaAnalysisTr);
160 fdNdEtaAnalysisTrVtx = new dNdEtaAnalysis("dndetaTrVtx", "dndetaTrVtx", detector);
161 fOutput->Add(fdNdEtaAnalysisTrVtx);
163 fdNdEtaAnalysisTracks = new dNdEtaAnalysis("dndetaTracks", "dndetaTracks", detector);
164 fOutput->Add(fdNdEtaAnalysisTracks);
166 fVertex = new TH3F("vertex_check", "vertex_check", 50, -50, 50, 50, -50, 50, 50, -50, 50);
167 fOutput->Add(fVertex);
169 fPartPt = new TH1F("dndeta_check_pt", "dndeta_check_pt", 1000, 0, 10);
171 fOutput->Add(fPartPt);
175 void AlidNdEtaTask::Exec(Option_t*)
179 // Check prerequisites
182 AliDebug(AliLog::kError, "ESD branch not available");
186 // trigger definition
187 Bool_t eventTriggered = AliPWG0Helper::IsEventTriggered(fESD->GetTriggerMask(), AliPWG0Helper::kMB2);
189 Bool_t eventVertex = AliPWG0Helper::IsVertexReconstructed(fESD->GetVertex());
191 // get the ESD vertex
192 const AliESDVertex* vtxESD = fESD->GetVertex();
196 // post the data already here
197 PostData(0, fOutput);
199 // create list of (label, eta, pt) tuples
200 Int_t inputCount = 0;
204 if (fAnalysisMode == kSPD)
207 const AliMultiplicity* mult = fESD->GetMultiplicity();
210 AliDebug(AliLog::kError, "AliMultiplicity not available");
214 labelArr = new Int_t[mult->GetNumberOfTracklets()];
215 etaArr = new Float_t[mult->GetNumberOfTracklets()];
216 ptArr = new Float_t[mult->GetNumberOfTracklets()];
218 // get multiplicity from ITS tracklets
219 for (Int_t i=0; i<mult->GetNumberOfTracklets(); ++i)
221 //printf("%d %f %f %f\n", i, mult->GetTheta(i), mult->GetPhi(i), mult->GetDeltaPhi(i));
223 // This removes non-tracklets in PDC06 data. Very bad solution. New solution is implemented for newer data. Keeping this for compatibility.
224 if (mult->GetDeltaPhi(i) < -1000)
227 etaArr[inputCount] = mult->GetEta(i);
228 labelArr[inputCount] = mult->GetLabel(i);
229 ptArr[inputCount] = 0; // no pt for tracklets
233 else if (fAnalysisMode == kTPC)
237 AliDebug(AliLog::kError, "fESDTrackCuts not available");
241 // get multiplicity from ESD tracks
242 TObjArray* list = fEsdTrackCuts->GetAcceptedTracks(fESD);
243 Int_t nGoodTracks = list->GetEntries();
245 labelArr = new Int_t[nGoodTracks];
246 etaArr = new Float_t[nGoodTracks];
247 ptArr = new Float_t[nGoodTracks];
249 // loop over esd tracks
250 for (Int_t i=0; i<nGoodTracks; i++)
252 AliESDtrack* esdTrack = dynamic_cast<AliESDtrack*> (list->At(i));
255 AliDebug(AliLog::kError, Form("ERROR: Could not retrieve track %d.", i));
259 etaArr[inputCount] = esdTrack->Eta();
260 labelArr[inputCount] = TMath::Abs(esdTrack->GetLabel());
261 ptArr[inputCount] = esdTrack->Pt();
264 Printf("%f", esdTrack->Pt());
270 // Processing of ESD information (always)
274 fMult->Fill(inputCount);
276 fMultVtx->Fill(inputCount);
282 for (Int_t i=0; i<inputCount; ++i)
284 Float_t eta = etaArr[i];
285 Float_t pt = ptArr[i];
287 fdNdEtaAnalysisESD->FillTrack(vtx[2], eta, pt);
289 if (TMath::Abs(vtx[2]) < 20)
291 fPartEta[0]->Fill(eta);
294 fPartEta[1]->Fill(eta);
296 fPartEta[2]->Fill(eta);
300 // for event count per vertex
301 fdNdEtaAnalysisESD->FillEvent(vtx[2], inputCount);
304 fEvents->Fill(vtx[2]);
307 if (fReadMC) // Processing of MC information (optional)
309 AliMCEventHandler* eventHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
311 Printf("ERROR: Could not retrieve MC event handler");
315 AliMCEvent* mcEvent = eventHandler->MCEvent();
317 Printf("ERROR: Could not retrieve MC event");
321 AliStack* stack = mcEvent->Stack();
324 AliDebug(AliLog::kError, "Stack not available");
328 AliHeader* header = mcEvent->Header();
331 AliDebug(AliLog::kError, "Header not available");
336 AliGenEventHeader* genHeader = header->GenEventHeader();
338 genHeader->PrimaryVertex(vtxMC);
340 // loop over mc particles
341 Int_t nPrim = stack->GetNprimary();
343 Int_t nAcceptedParticles = 0;
345 for (Int_t iMc = 0; iMc < nPrim; ++iMc)
347 //Printf("Getting particle %d", iMc);
348 TParticle* particle = stack->Particle(iMc);
353 if (AliPWG0Helper::IsPrimaryCharged(particle, nPrim) == kFALSE)
356 AliDebug(AliLog::kDebug+1, Form("Accepted primary %d, unique ID: %d", iMc, particle->GetUniqueID()));
357 ++nAcceptedParticles;
359 Float_t eta = particle->Eta();
360 Float_t pt = particle->Pt();
362 fdNdEtaAnalysis->FillTrack(vtxMC[2], eta, pt);
363 fVertex->Fill(particle->Vx(), particle->Vy(), particle->Vz());
367 fdNdEtaAnalysisTr->FillTrack(vtxMC[2], eta, pt);
369 fdNdEtaAnalysisTrVtx->FillTrack(vtxMC[2], eta, pt);
372 if (TMath::Abs(eta) < 0.8)
376 fdNdEtaAnalysis->FillEvent(vtxMC[2], nAcceptedParticles);
379 fdNdEtaAnalysisTr->FillEvent(vtxMC[2], nAcceptedParticles);
381 fdNdEtaAnalysisTrVtx->FillEvent(vtxMC[2], nAcceptedParticles);
384 if (eventTriggered && eventVertex)
386 // from tracks is only done for triggered and vertex reconstructed events
388 for (Int_t i=0; i<inputCount; ++i)
390 Int_t label = labelArr[i];
395 //Printf("Getting particle of track %d", label);
396 TParticle* particle = stack->Particle(label);
400 AliDebug(AliLog::kError, Form("ERROR: Could not retrieve particle %d.", label));
404 fdNdEtaAnalysisTracks->FillTrack(vtxMC[2], particle->Eta(), particle->Pt());
405 } // end of track loop
407 // for event count per vertex
408 fdNdEtaAnalysisTracks->FillEvent(vtxMC[2], inputCount);
417 void AlidNdEtaTask::Terminate(Option_t *)
419 // The Terminate() function is the last function to be called during
420 // a query. It always runs on the client, it can be used to present
421 // the results graphically or save the results to file.
423 fOutput = dynamic_cast<TList*> (GetOutputData(0));
425 Printf("ERROR: fOutput not available");
429 fdNdEtaAnalysisESD = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("fdNdEtaAnalysisESD"));
430 fMult = dynamic_cast<TH1F*> (fOutput->FindObject("fMult"));
431 fMultVtx = dynamic_cast<TH1F*> (fOutput->FindObject("fMultVtx"));
432 fEvents = dynamic_cast<TH1F*> (fOutput->FindObject("dndeta_check_vertex"));
433 for (Int_t i=0; i<3; ++i)
434 fPartEta[i] = dynamic_cast<TH1F*> (fOutput->FindObject(Form("dndeta_check_%d", i)));
436 if (!fdNdEtaAnalysisESD)
438 AliDebug(AliLog::kError, "ERROR: fdNdEtaAnalysisESD not available");
442 if (fMult && fMultVtx)
446 fMultVtx->SetLineColor(2);
447 fMultVtx->DrawCopy("SAME");
452 Int_t events1 = (Int_t) fEvents->Integral(fEvents->GetXaxis()->FindBin(-19.9), fEvents->GetXaxis()->FindBin(-0.001));
453 Int_t events2 = (Int_t) fEvents->Integral(fEvents->GetXaxis()->FindBin(0.001), fEvents->GetXaxis()->FindBin(19.9));
455 fPartEta[0]->Scale(1.0 / (events1 + events2));
456 fPartEta[1]->Scale(1.0 / events1);
457 fPartEta[2]->Scale(1.0 / events2);
459 for (Int_t i=0; i<3; ++i)
460 fPartEta[i]->Scale(1.0 / fPartEta[i]->GetBinWidth(1));
462 new TCanvas("control", "control", 500, 500);
463 for (Int_t i=0; i<3; ++i)
465 fPartEta[i]->SetLineColor(i+1);
466 fPartEta[i]->Draw((i==0) ? "" : "SAME");
472 new TCanvas("control3", "control3", 500, 500);
476 TFile* fout = new TFile("analysis_esd_raw.root", "RECREATE");
478 if (fdNdEtaAnalysisESD)
479 fdNdEtaAnalysisESD->SaveHistograms();
482 fEsdTrackCuts->SaveHistograms("esd_tracks_cuts");
490 for (Int_t i=0; i<3; ++i)
492 fPartEta[i]->Write();
500 Printf("Writting result to analysis_esd_raw.root");
504 fdNdEtaAnalysis = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("dndeta"));
505 fdNdEtaAnalysisTr = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("dndetaTr"));
506 fdNdEtaAnalysisTrVtx = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("dndetaTrVtx"));
507 fdNdEtaAnalysisTracks = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("dndetaTracks"));
508 fPartPt = dynamic_cast<TH1F*> (fOutput->FindObject("dndeta_check_pt"));
510 if (!fdNdEtaAnalysis || !fdNdEtaAnalysisTr || !fdNdEtaAnalysisTrVtx || !fPartPt)
512 AliDebug(AliLog::kError, Form("ERROR: Histograms not available %p %p", (void*) fdNdEtaAnalysis, (void*) fPartPt));
516 fdNdEtaAnalysis->Finish(0, -1, AlidNdEtaCorrection::kNone);
517 fdNdEtaAnalysisTr->Finish(0, -1, AlidNdEtaCorrection::kNone);
518 fdNdEtaAnalysisTrVtx->Finish(0, -1, AlidNdEtaCorrection::kNone);
519 fdNdEtaAnalysisTracks->Finish(0, -1, AlidNdEtaCorrection::kNone);
521 Int_t events = (Int_t) fdNdEtaAnalysis->GetData()->GetEventCorrection()->GetMeasuredHistogram()->Integral();
522 fPartPt->Scale(1.0/events);
523 fPartPt->Scale(1.0/fPartPt->GetBinWidth(1));
525 TFile* fout = new TFile("analysis_mc.root","RECREATE");
527 fdNdEtaAnalysis->SaveHistograms();
528 fdNdEtaAnalysisTr->SaveHistograms();
529 fdNdEtaAnalysisTrVtx->SaveHistograms();
530 fdNdEtaAnalysisTracks->SaveHistograms();
536 Printf("Writting result to analysis_mc.root");
540 new TCanvas("control2", "control2", 500, 500);