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", ""),
45 fAnalysisMode(AliPWG0Helper::kTPC),
49 fdNdEtaAnalysisESD(0),
56 fdNdEtaAnalysisTrVtx(0),
57 fdNdEtaAnalysisTracks(0),
63 // Constructor. Initialization of pointers
66 // Define input and output slots here
67 DefineInput(0, TChain::Class());
68 DefineOutput(0, TList::Class());
71 AlidNdEtaTask::~AlidNdEtaTask()
77 // histograms are in the output list and deleted when the output
78 // list is deleted by the TSelector dtor
86 //________________________________________________________________________
87 void AlidNdEtaTask::ConnectInputData(Option_t *)
92 Printf("AlidNdEtaTask::ConnectInputData called");
94 TTree* tree = dynamic_cast<TTree*> (GetInputData(0));
96 Printf("ERROR: Could not read tree from input slot 0");
98 // Disable all branches and enable only the needed ones
99 //tree->SetBranchStatus("*", 0);
101 tree->SetBranchStatus("fTriggerMask", 1);
102 tree->SetBranchStatus("fSPDVertex*", 1);
103 // PrimaryVertex also needed
105 if (fAnalysisMode == AliPWG0Helper::kSPD) {
106 tree->SetBranchStatus("fSPDMult*", 1);
107 //AliPWG0Helper::SetBranchStatusRecursive(tree, "AliMultiplicity", kTRUE);
110 if (fAnalysisMode == AliPWG0Helper::kTPC || fAnalysisMode == AliPWG0Helper::kTPCITS) {
111 AliESDtrackCuts::EnableNeededBranches(tree);
112 tree->SetBranchStatus("fTracks.fLabel", 1);
113 //AliPWG0Helper::SetBranchStatusRecursive(tree, "Tracks", kTRUE);
116 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
119 Printf("ERROR: Could not get ESDInputHandler");
121 fESD = esdH->GetEvent();
124 // disable info messages of AliMCEvent (per event)
125 AliLog::SetClassDebugLevel("AliMCEvent", AliLog::kWarning - AliLog::kDebug + 1);
128 void AlidNdEtaTask::CreateOutputObjects()
130 // create result objects and add to output list
132 Printf("AlidNdEtaTask::CreateOutputObjects");
137 fdNdEtaAnalysisESD = new dNdEtaAnalysis("fdNdEtaAnalysisESD", "fdNdEtaAnalysisESD", fAnalysisMode);
138 fOutput->Add(fdNdEtaAnalysisESD);
140 fMult = new TH1F("fMult", "fMult;Ntracks;Count", 201, -0.5, 200.5);
143 fMultVtx = new TH1F("fMultVtx", "fMultVtx;Ntracks;Count", 201, -0.5, 200.5);
144 fOutput->Add(fMultVtx);
146 for (Int_t i=0; i<3; ++i)
148 fPartEta[i] = new TH1F(Form("dndeta_check_%d", i), Form("dndeta_check_%d", i), 60, -6, 6);
149 fPartEta[i]->Sumw2();
150 fOutput->Add(fPartEta[i]);
153 fEvents = new TH1F("dndeta_check_vertex", "dndeta_check_vertex", 40, -20, 20);
154 fOutput->Add(fEvents);
156 fVertexResolution = new TH1F("dndeta_vertex_resolution_z", "dndeta_vertex_resolution_z", 1000, 0, 10);
157 fOutput->Add(fVertexResolution);
161 fdNdEtaAnalysis = new dNdEtaAnalysis("dndeta", "dndeta", fAnalysisMode);
162 fOutput->Add(fdNdEtaAnalysis);
164 fdNdEtaAnalysisTr = new dNdEtaAnalysis("dndetaTr", "dndetaTr", fAnalysisMode);
165 fOutput->Add(fdNdEtaAnalysisTr);
167 fdNdEtaAnalysisTrVtx = new dNdEtaAnalysis("dndetaTrVtx", "dndetaTrVtx", fAnalysisMode);
168 fOutput->Add(fdNdEtaAnalysisTrVtx);
170 fdNdEtaAnalysisTracks = new dNdEtaAnalysis("dndetaTracks", "dndetaTracks", fAnalysisMode);
171 fOutput->Add(fdNdEtaAnalysisTracks);
173 fVertex = new TH3F("vertex_check", "vertex_check", 50, -50, 50, 50, -50, 50, 50, -50, 50);
174 fOutput->Add(fVertex);
176 fPartPt = new TH1F("dndeta_check_pt", "dndeta_check_pt", 1000, 0, 10);
178 fOutput->Add(fPartPt);
181 if (fAnalysisMode == AliPWG0Helper::kSPD)
182 fDeltaPhi = new TH1F("fDeltaPhi", "fDeltaPhi;#Delta #phi;Entries", 1000, -3.14, 3.14);
185 void AlidNdEtaTask::Exec(Option_t*)
189 // Check prerequisites
192 AliDebug(AliLog::kError, "ESD branch not available");
196 // trigger definition
197 Bool_t eventTriggered = AliPWG0Helper::IsEventTriggered(fESD->GetTriggerMask(), AliPWG0Helper::kMB2);
199 // get the ESD vertex
200 const AliESDVertex* vtxESD = AliPWG0Helper::GetVertex(fESD, fAnalysisMode);
209 // fill z vertex resolution
211 fVertexResolution->Fill(vtxESD->GetZRes());
213 // post the data already here
214 PostData(0, fOutput);
216 // create list of (label, eta, pt) tuples
217 Int_t inputCount = 0;
221 if (fAnalysisMode == AliPWG0Helper::kSPD)
224 const AliMultiplicity* mult = fESD->GetMultiplicity();
227 AliDebug(AliLog::kError, "AliMultiplicity not available");
231 labelArr = new Int_t[mult->GetNumberOfTracklets()];
232 etaArr = new Float_t[mult->GetNumberOfTracklets()];
233 ptArr = new Float_t[mult->GetNumberOfTracklets()];
235 // get multiplicity from ITS tracklets
236 for (Int_t i=0; i<mult->GetNumberOfTracklets(); ++i)
238 //printf("%d %f %f %f\n", i, mult->GetTheta(i), mult->GetPhi(i), mult->GetDeltaPhi(i));
240 // This removes non-tracklets in PDC06 data. Very bad solution. New solution is implemented for newer data. Keeping this for compatibility.
241 if (mult->GetDeltaPhi(i) < -1000)
244 fDeltaPhi->Fill(mult->GetDeltaPhi(i));
246 etaArr[inputCount] = mult->GetEta(i);
247 labelArr[inputCount] = mult->GetLabel(i);
248 ptArr[inputCount] = 0; // no pt for tracklets
252 Printf("Accepted %d tracklets", inputCount);
254 else if (fAnalysisMode == AliPWG0Helper::kTPC || fAnalysisMode == AliPWG0Helper::kTPCITS)
258 AliDebug(AliLog::kError, "fESDTrackCuts not available");
262 // get multiplicity from ESD tracks
263 TObjArray* list = fEsdTrackCuts->GetAcceptedTracks(fESD);
264 Int_t nGoodTracks = list->GetEntries();
266 labelArr = new Int_t[nGoodTracks];
267 etaArr = new Float_t[nGoodTracks];
268 ptArr = new Float_t[nGoodTracks];
270 // loop over esd tracks
271 for (Int_t i=0; i<nGoodTracks; i++)
273 AliESDtrack* esdTrack = dynamic_cast<AliESDtrack*> (list->At(i));
276 AliDebug(AliLog::kError, Form("ERROR: Could not retrieve track %d.", i));
280 etaArr[inputCount] = esdTrack->Eta();
281 labelArr[inputCount] = TMath::Abs(esdTrack->GetLabel());
282 ptArr[inputCount] = esdTrack->Pt();
286 Printf("Accepted %d tracks", nGoodTracks);
294 Printf("WARNING: Replacing vertex by MC vertex. This is for systematical checks only.");
296 Printf("ERROR: fUseMCVertex set without fReadMC set!");
300 AliMCEventHandler* eventHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
302 Printf("ERROR: Could not retrieve MC event handler");
306 AliMCEvent* mcEvent = eventHandler->MCEvent();
308 Printf("ERROR: Could not retrieve MC event");
312 AliHeader* header = mcEvent->Header();
315 AliDebug(AliLog::kError, "Header not available");
320 AliGenEventHeader* genHeader = header->GenEventHeader();
322 genHeader->PrimaryVertex(vtxMC);
327 // Processing of ESD information (always)
331 fMult->Fill(inputCount);
335 fMultVtx->Fill(inputCount);
337 for (Int_t i=0; i<inputCount; ++i)
339 Float_t eta = etaArr[i];
340 Float_t pt = ptArr[i];
342 fdNdEtaAnalysisESD->FillTrack(vtx[2], eta, pt);
344 if (TMath::Abs(vtx[2]) < 20)
346 fPartEta[0]->Fill(eta);
349 fPartEta[1]->Fill(eta);
351 fPartEta[2]->Fill(eta);
355 // for event count per vertex
356 fdNdEtaAnalysisESD->FillEvent(vtx[2], inputCount);
359 fEvents->Fill(vtx[2]);
363 if (fReadMC) // Processing of MC information (optional)
365 AliMCEventHandler* eventHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
367 Printf("ERROR: Could not retrieve MC event handler");
371 AliMCEvent* mcEvent = eventHandler->MCEvent();
373 Printf("ERROR: Could not retrieve MC event");
377 AliStack* stack = mcEvent->Stack();
380 AliDebug(AliLog::kError, "Stack not available");
384 AliHeader* header = mcEvent->Header();
387 AliDebug(AliLog::kError, "Header not available");
392 AliGenEventHeader* genHeader = header->GenEventHeader();
394 genHeader->PrimaryVertex(vtxMC);
396 // loop over mc particles
397 Int_t nPrim = stack->GetNprimary();
399 Int_t nAcceptedParticles = 0;
401 for (Int_t iMc = 0; iMc < nPrim; ++iMc)
403 //Printf("Getting particle %d", iMc);
404 TParticle* particle = stack->Particle(iMc);
409 if (AliPWG0Helper::IsPrimaryCharged(particle, nPrim) == kFALSE)
412 AliDebug(AliLog::kDebug+1, Form("Accepted primary %d, unique ID: %d", iMc, particle->GetUniqueID()));
413 Float_t eta = particle->Eta();
414 Float_t pt = particle->Pt();
416 // make a rough eta cut (so that nAcceptedParticles is not too far off the true measured value (NB: this histograms are only gathered for comparison))
417 if (TMath::Abs(eta) < 1.5 && pt > 0.3)
418 nAcceptedParticles++;
420 fdNdEtaAnalysis->FillTrack(vtxMC[2], eta, pt);
421 fVertex->Fill(particle->Vx(), particle->Vy(), particle->Vz());
425 fdNdEtaAnalysisTr->FillTrack(vtxMC[2], eta, pt);
427 fdNdEtaAnalysisTrVtx->FillTrack(vtxMC[2], eta, pt);
430 if (TMath::Abs(eta) < 0.8)
434 fdNdEtaAnalysis->FillEvent(vtxMC[2], nAcceptedParticles);
437 fdNdEtaAnalysisTr->FillEvent(vtxMC[2], nAcceptedParticles);
439 fdNdEtaAnalysisTrVtx->FillEvent(vtxMC[2], nAcceptedParticles);
442 if (eventTriggered && vtxESD)
444 // from tracks is only done for triggered and vertex reconstructed events
446 for (Int_t i=0; i<inputCount; ++i)
448 Int_t label = labelArr[i];
453 //Printf("Getting particle of track %d", label);
454 TParticle* particle = stack->Particle(label);
458 AliDebug(AliLog::kError, Form("ERROR: Could not retrieve particle %d.", label));
462 fdNdEtaAnalysisTracks->FillTrack(vtxMC[2], particle->Eta(), particle->Pt());
463 } // end of track loop
465 // for event count per vertex
466 fdNdEtaAnalysisTracks->FillEvent(vtxMC[2], inputCount);
475 void AlidNdEtaTask::Terminate(Option_t *)
477 // The Terminate() function is the last function to be called during
478 // a query. It always runs on the client, it can be used to present
479 // the results graphically or save the results to file.
481 fOutput = dynamic_cast<TList*> (GetOutputData(0));
483 Printf("ERROR: fOutput not available");
487 fdNdEtaAnalysisESD = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("fdNdEtaAnalysisESD"));
488 fMult = dynamic_cast<TH1F*> (fOutput->FindObject("fMult"));
489 fMultVtx = dynamic_cast<TH1F*> (fOutput->FindObject("fMultVtx"));
490 fEvents = dynamic_cast<TH1F*> (fOutput->FindObject("dndeta_check_vertex"));
491 fVertexResolution = dynamic_cast<TH1F*> (fOutput->FindObject("dndeta_vertex_resolution_z"));
492 for (Int_t i=0; i<3; ++i)
493 fPartEta[i] = dynamic_cast<TH1F*> (fOutput->FindObject(Form("dndeta_check_%d", i)));
495 if (!fdNdEtaAnalysisESD)
497 AliDebug(AliLog::kError, "ERROR: fdNdEtaAnalysisESD not available");
501 if (fMult && fMultVtx)
505 fMultVtx->SetLineColor(2);
506 fMultVtx->Draw("SAME");
511 Int_t events1 = (Int_t) fEvents->Integral(fEvents->GetXaxis()->FindBin(-19.9), fEvents->GetXaxis()->FindBin(-0.001));
512 Int_t events2 = (Int_t) fEvents->Integral(fEvents->GetXaxis()->FindBin(0.001), fEvents->GetXaxis()->FindBin(19.9));
514 Printf("%d events with vertex used", events1 + events2);
516 if (events1 > 0 && events2 > 0)
518 fPartEta[0]->Scale(1.0 / (events1 + events2));
519 fPartEta[1]->Scale(1.0 / events1);
520 fPartEta[2]->Scale(1.0 / events2);
522 for (Int_t i=0; i<3; ++i)
523 fPartEta[i]->Scale(1.0 / fPartEta[i]->GetBinWidth(1));
525 new TCanvas("control", "control", 500, 500);
526 for (Int_t i=0; i<3; ++i)
528 fPartEta[i]->SetLineColor(i+1);
529 fPartEta[i]->Draw((i==0) ? "" : "SAME");
536 new TCanvas("control3", "control3", 500, 500);
540 TFile* fout = new TFile("analysis_esd_raw.root", "RECREATE");
542 if (fdNdEtaAnalysisESD)
543 fdNdEtaAnalysisESD->SaveHistograms();
546 fEsdTrackCuts->SaveHistograms("esd_tracks_cuts");
554 for (Int_t i=0; i<3; ++i)
556 fPartEta[i]->Write();
561 if (fVertexResolution)
562 fVertexResolution->Write();
570 Printf("Writting result to analysis_esd_raw.root");
574 fdNdEtaAnalysis = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("dndeta"));
575 fdNdEtaAnalysisTr = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("dndetaTr"));
576 fdNdEtaAnalysisTrVtx = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("dndetaTrVtx"));
577 fdNdEtaAnalysisTracks = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("dndetaTracks"));
578 fPartPt = dynamic_cast<TH1F*> (fOutput->FindObject("dndeta_check_pt"));
580 if (!fdNdEtaAnalysis || !fdNdEtaAnalysisTr || !fdNdEtaAnalysisTrVtx || !fPartPt)
582 AliDebug(AliLog::kError, Form("ERROR: Histograms not available %p %p", (void*) fdNdEtaAnalysis, (void*) fPartPt));
586 fdNdEtaAnalysis->Finish(0, -1, AlidNdEtaCorrection::kNone);
587 fdNdEtaAnalysisTr->Finish(0, -1, AlidNdEtaCorrection::kNone);
588 fdNdEtaAnalysisTrVtx->Finish(0, -1, AlidNdEtaCorrection::kNone);
589 fdNdEtaAnalysisTracks->Finish(0, -1, AlidNdEtaCorrection::kNone);
591 Int_t events = (Int_t) fdNdEtaAnalysis->GetData()->GetEventCorrection()->GetMeasuredHistogram()->Integral();
592 fPartPt->Scale(1.0/events);
593 fPartPt->Scale(1.0/fPartPt->GetBinWidth(1));
595 TFile* fout = new TFile("analysis_mc.root","RECREATE");
597 fdNdEtaAnalysis->SaveHistograms();
598 fdNdEtaAnalysisTr->SaveHistograms();
599 fdNdEtaAnalysisTrVtx->SaveHistograms();
600 fdNdEtaAnalysisTracks->SaveHistograms();
606 Printf("Writting result to analysis_mc.root");
610 new TCanvas("control2", "control2", 500, 500);