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 "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),
46 fTrigger(AliPWG0Helper::kMB1),
51 fdNdEtaAnalysisESD(0),
57 fdNdEtaAnalysisNSD(0),
59 fdNdEtaAnalysisTrVtx(0),
60 fdNdEtaAnalysisTracks(0),
66 // Constructor. Initialization of pointers
69 // Define input and output slots here
70 DefineInput(0, TChain::Class());
71 DefineOutput(0, TList::Class());
74 AlidNdEtaTask::~AlidNdEtaTask()
80 // histograms are in the output list and deleted when the output
81 // list is deleted by the TSelector dtor
89 //________________________________________________________________________
90 void AlidNdEtaTask::ConnectInputData(Option_t *)
95 Printf("AlidNdEtaTask::ConnectInputData called");
97 TTree* tree = dynamic_cast<TTree*> (GetInputData(0));
99 Printf("ERROR: Could not read tree from input slot 0");
101 // Disable all branches and enable only the needed ones
102 //tree->SetBranchStatus("*", 0);
104 tree->SetBranchStatus("TriggerMask", 1);
105 tree->SetBranchStatus("SPDVertex*", 1);
106 tree->SetBranchStatus("PrimaryVertex*", 1);
107 tree->SetBranchStatus("TPCVertex*", 1);
109 if (fAnalysisMode == AliPWG0Helper::kSPD) {
110 tree->SetBranchStatus("AliMultiplicity*", 1);
113 if (fAnalysisMode == AliPWG0Helper::kTPC || fAnalysisMode == AliPWG0Helper::kTPCITS) {
114 //AliESDtrackCuts::EnableNeededBranches(tree);
115 tree->SetBranchStatus("Tracks*", 1);
118 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
121 Printf("ERROR: Could not get ESDInputHandler");
123 fESD = esdH->GetEvent();
126 // disable info messages of AliMCEvent (per event)
127 AliLog::SetClassDebugLevel("AliMCEvent", AliLog::kWarning - AliLog::kDebug + 1);
130 void AlidNdEtaTask::CreateOutputObjects()
132 // create result objects and add to output list
134 Printf("AlidNdEtaTask::CreateOutputObjects");
139 fdNdEtaAnalysisESD = new dNdEtaAnalysis("fdNdEtaAnalysisESD", "fdNdEtaAnalysisESD", fAnalysisMode);
140 fOutput->Add(fdNdEtaAnalysisESD);
142 fMult = new TH1F("fMult", "fMult;Ntracks;Count", 201, -0.5, 200.5);
145 fMultVtx = new TH1F("fMultVtx", "fMultVtx;Ntracks;Count", 201, -0.5, 200.5);
146 fOutput->Add(fMultVtx);
148 for (Int_t i=0; i<3; ++i)
150 fPartEta[i] = new TH1F(Form("dndeta_check_%d", i), Form("dndeta_check_%d", i), 60, -6, 6);
151 fPartEta[i]->Sumw2();
152 fOutput->Add(fPartEta[i]);
155 fEvents = new TH1F("dndeta_check_vertex", "dndeta_check_vertex", 160, -40, 40);
156 fOutput->Add(fEvents);
158 fVertexResolution = new TH1F("dndeta_vertex_resolution_z", "dndeta_vertex_resolution_z", 1000, 0, 10);
159 fOutput->Add(fVertexResolution);
163 fdNdEtaAnalysis = new dNdEtaAnalysis("dndeta", "dndeta", fAnalysisMode);
164 fOutput->Add(fdNdEtaAnalysis);
166 fdNdEtaAnalysisNSD = new dNdEtaAnalysis("dndetaNSD", "dndetaNSD", fAnalysisMode);
167 fOutput->Add(fdNdEtaAnalysisNSD);
169 fdNdEtaAnalysisTr = new dNdEtaAnalysis("dndetaTr", "dndetaTr", fAnalysisMode);
170 fOutput->Add(fdNdEtaAnalysisTr);
172 fdNdEtaAnalysisTrVtx = new dNdEtaAnalysis("dndetaTrVtx", "dndetaTrVtx", fAnalysisMode);
173 fOutput->Add(fdNdEtaAnalysisTrVtx);
175 fdNdEtaAnalysisTracks = new dNdEtaAnalysis("dndetaTracks", "dndetaTracks", fAnalysisMode);
176 fOutput->Add(fdNdEtaAnalysisTracks);
178 fVertex = new TH3F("vertex_check", "vertex_check", 50, -50, 50, 50, -50, 50, 50, -50, 50);
179 fOutput->Add(fVertex);
181 fPartPt = new TH1F("dndeta_check_pt", "dndeta_check_pt", 1000, 0, 10);
183 fOutput->Add(fPartPt);
186 if (fAnalysisMode == AliPWG0Helper::kSPD)
187 fDeltaPhi = new TH1F("fDeltaPhi", "fDeltaPhi;#Delta #phi;Entries", 1000, -3.14, 3.14);
190 void AlidNdEtaTask::Exec(Option_t*)
194 // Check prerequisites
197 AliDebug(AliLog::kError, "ESD branch not available");
201 // trigger definition
202 Bool_t eventTriggered = AliPWG0Helper::IsEventTriggered(fESD->GetTriggerMask(), fTrigger);
204 // get the ESD vertex
205 const AliESDVertex* vtxESD = AliPWG0Helper::GetVertex(fESD, fAnalysisMode);
214 // fill z vertex resolution
216 fVertexResolution->Fill(vtxESD->GetZRes());
218 // post the data already here
219 PostData(0, fOutput);
221 // needed for syst. studies
224 if (fUseMCVertex || fUseMCKine) {
226 Printf("ERROR: fUseMCVertex or fUseMCKine set without fReadMC set!");
230 AliMCEventHandler* eventHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
232 Printf("ERROR: Could not retrieve MC event handler");
236 AliMCEvent* mcEvent = eventHandler->MCEvent();
238 Printf("ERROR: Could not retrieve MC event");
242 AliHeader* header = mcEvent->Header();
245 AliDebug(AliLog::kError, "Header not available");
251 Printf("WARNING: Replacing vertex by MC vertex. This is for systematical checks only.");
253 AliGenEventHeader* genHeader = header->GenEventHeader();
255 genHeader->PrimaryVertex(vtxMC);
262 stack = mcEvent->Stack();
265 AliDebug(AliLog::kError, "Stack not available");
271 // create list of (label, eta, pt) tuples
272 Int_t inputCount = 0;
276 if (fAnalysisMode == AliPWG0Helper::kSPD)
279 const AliMultiplicity* mult = fESD->GetMultiplicity();
282 AliDebug(AliLog::kError, "AliMultiplicity not available");
286 labelArr = new Int_t[mult->GetNumberOfTracklets()];
287 etaArr = new Float_t[mult->GetNumberOfTracklets()];
288 ptArr = new Float_t[mult->GetNumberOfTracklets()];
290 if (fUseMCKine && stack)
291 Printf("Processing only primaries (MC information used). This is for systematical checks only.");
293 // get multiplicity from ITS tracklets
294 for (Int_t i=0; i<mult->GetNumberOfTracklets(); ++i)
296 //printf("%d %f %f %f\n", i, mult->GetTheta(i), mult->GetPhi(i), mult->GetDeltaPhi(i));
298 if (fUseMCKine && stack)
299 if (mult->GetLabel(i, 0) < 0 || mult->GetLabel(i, 0) != mult->GetLabel(i, 1) || !stack->IsPhysicalPrimary(mult->GetLabel(i, 0)))
302 Float_t deltaPhi = mult->GetDeltaPhi(i);
303 // prevent values to be shifted by 2 Pi()
304 if (deltaPhi < -TMath::Pi())
305 deltaPhi += TMath::Pi() * 2;
306 if (deltaPhi > TMath::Pi())
307 deltaPhi -= TMath::Pi() * 2;
309 if (TMath::Abs(deltaPhi) > 1)
310 printf("WARNING: Very high Delta Phi: %d %f %f %f\n", i, mult->GetTheta(i), mult->GetPhi(i), deltaPhi);
312 fDeltaPhi->Fill(deltaPhi);
314 etaArr[inputCount] = mult->GetEta(i);
315 labelArr[inputCount] = mult->GetLabel(i, 0);
316 ptArr[inputCount] = 0; // no pt for tracklets
320 Printf("Accepted %d tracklets", inputCount);
322 else if (fAnalysisMode == AliPWG0Helper::kTPC || fAnalysisMode == AliPWG0Helper::kTPCITS)
326 AliDebug(AliLog::kError, "fESDTrackCuts not available");
330 // get multiplicity from ESD tracks
331 TObjArray* list = fEsdTrackCuts->GetAcceptedTracks(fESD);
332 Int_t nGoodTracks = list->GetEntries();
334 labelArr = new Int_t[nGoodTracks];
335 etaArr = new Float_t[nGoodTracks];
336 ptArr = new Float_t[nGoodTracks];
338 // loop over esd tracks
339 for (Int_t i=0; i<nGoodTracks; i++)
341 AliESDtrack* esdTrack = dynamic_cast<AliESDtrack*> (list->At(i));
344 AliDebug(AliLog::kError, Form("ERROR: Could not retrieve track %d.", i));
348 etaArr[inputCount] = esdTrack->Eta();
349 labelArr[inputCount] = TMath::Abs(esdTrack->GetLabel());
350 ptArr[inputCount] = esdTrack->Pt();
354 Printf("Accepted %d tracks", nGoodTracks);
361 // Processing of ESD information (always)
365 fMult->Fill(inputCount);
366 fdNdEtaAnalysisESD->FillTriggeredEvent(inputCount);
371 fMultVtx->Fill(inputCount);
373 for (Int_t i=0; i<inputCount; ++i)
375 Float_t eta = etaArr[i];
376 Float_t pt = ptArr[i];
378 fdNdEtaAnalysisESD->FillTrack(vtx[2], eta, pt);
380 if (TMath::Abs(vtx[2]) < 20)
382 fPartEta[0]->Fill(eta);
385 fPartEta[1]->Fill(eta);
387 fPartEta[2]->Fill(eta);
391 // for event count per vertex
392 fdNdEtaAnalysisESD->FillEvent(vtx[2], inputCount);
395 fEvents->Fill(vtx[2]);
399 if (fReadMC) // Processing of MC information (optional)
401 AliMCEventHandler* eventHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
403 Printf("ERROR: Could not retrieve MC event handler");
407 AliMCEvent* mcEvent = eventHandler->MCEvent();
409 Printf("ERROR: Could not retrieve MC event");
413 stack = mcEvent->Stack();
416 AliDebug(AliLog::kError, "Stack not available");
420 AliHeader* header = mcEvent->Header();
423 AliDebug(AliLog::kError, "Header not available");
428 AliGenEventHeader* genHeader = header->GenEventHeader();
430 genHeader->PrimaryVertex(vtxMC);
432 // get process type; NB: this only works for Pythia
433 Int_t processType = AliPWG0Helper::GetPythiaEventProcessType(header);
434 AliDebug(AliLog::kDebug+1, Form("Found pythia process type %d", processType));
437 AliDebug(AliLog::kError, Form("Unknown Pythia process type %d.", processType));
439 // loop over mc particles
440 Int_t nPrim = stack->GetNprimary();
442 Int_t nAcceptedParticles = 0;
444 for (Int_t iMc = 0; iMc < nPrim; ++iMc)
446 //Printf("Getting particle %d", iMc);
447 TParticle* particle = stack->Particle(iMc);
452 if (AliPWG0Helper::IsPrimaryCharged(particle, nPrim) == kFALSE)
455 AliDebug(AliLog::kDebug+1, Form("Accepted primary %d, unique ID: %d", iMc, particle->GetUniqueID()));
456 Float_t eta = particle->Eta();
457 Float_t pt = particle->Pt();
459 // 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))
460 if (TMath::Abs(eta) < 1.5 && pt > 0.3)
461 nAcceptedParticles++;
463 fdNdEtaAnalysis->FillTrack(vtxMC[2], eta, pt);
464 fVertex->Fill(particle->Vx(), particle->Vy(), particle->Vz());
466 if (processType != 92 && processType != 93)
467 fdNdEtaAnalysisNSD->FillTrack(vtxMC[2], eta, pt);
471 fdNdEtaAnalysisTr->FillTrack(vtxMC[2], eta, pt);
473 fdNdEtaAnalysisTrVtx->FillTrack(vtxMC[2], eta, pt);
476 if (TMath::Abs(eta) < 0.8)
480 fdNdEtaAnalysis->FillEvent(vtxMC[2], nAcceptedParticles);
481 if (processType != 92 && processType != 93)
482 fdNdEtaAnalysisNSD->FillEvent(vtxMC[2], nAcceptedParticles);
486 fdNdEtaAnalysisTr->FillEvent(vtxMC[2], nAcceptedParticles);
488 fdNdEtaAnalysisTrVtx->FillEvent(vtxMC[2], nAcceptedParticles);
491 if (eventTriggered && vtxESD)
493 // from tracks is only done for triggered and vertex reconstructed events
495 for (Int_t i=0; i<inputCount; ++i)
497 Int_t label = labelArr[i];
502 //Printf("Getting particle of track %d", label);
503 TParticle* particle = stack->Particle(label);
507 AliDebug(AliLog::kError, Form("ERROR: Could not retrieve particle %d.", label));
511 fdNdEtaAnalysisTracks->FillTrack(vtxMC[2], particle->Eta(), particle->Pt());
512 } // end of track loop
514 // for event count per vertex
515 fdNdEtaAnalysisTracks->FillEvent(vtxMC[2], inputCount);
524 void AlidNdEtaTask::Terminate(Option_t *)
526 // The Terminate() function is the last function to be called during
527 // a query. It always runs on the client, it can be used to present
528 // the results graphically or save the results to file.
530 fOutput = dynamic_cast<TList*> (GetOutputData(0));
532 Printf("ERROR: fOutput not available");
536 fdNdEtaAnalysisESD = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("fdNdEtaAnalysisESD"));
537 fMult = dynamic_cast<TH1F*> (fOutput->FindObject("fMult"));
538 fMultVtx = dynamic_cast<TH1F*> (fOutput->FindObject("fMultVtx"));
539 fEvents = dynamic_cast<TH1F*> (fOutput->FindObject("dndeta_check_vertex"));
540 fVertexResolution = dynamic_cast<TH1F*> (fOutput->FindObject("dndeta_vertex_resolution_z"));
541 for (Int_t i=0; i<3; ++i)
542 fPartEta[i] = dynamic_cast<TH1F*> (fOutput->FindObject(Form("dndeta_check_%d", i)));
544 if (!fdNdEtaAnalysisESD)
546 AliDebug(AliLog::kError, "ERROR: fdNdEtaAnalysisESD not available");
550 if (fMult && fMultVtx)
554 fMultVtx->SetLineColor(2);
555 fMultVtx->Draw("SAME");
560 Int_t events1 = (Int_t) fEvents->Integral(fEvents->GetXaxis()->FindBin(-19.9), fEvents->GetXaxis()->FindBin(-0.001));
561 Int_t events2 = (Int_t) fEvents->Integral(fEvents->GetXaxis()->FindBin(0.001), fEvents->GetXaxis()->FindBin(19.9));
563 Printf("%d events with vertex used", events1 + events2);
565 if (events1 > 0 && events2 > 0)
567 fPartEta[0]->Scale(1.0 / (events1 + events2));
568 fPartEta[1]->Scale(1.0 / events1);
569 fPartEta[2]->Scale(1.0 / events2);
571 for (Int_t i=0; i<3; ++i)
572 fPartEta[i]->Scale(1.0 / fPartEta[i]->GetBinWidth(1));
574 new TCanvas("control", "control", 500, 500);
575 for (Int_t i=0; i<3; ++i)
577 fPartEta[i]->SetLineColor(i+1);
578 fPartEta[i]->Draw((i==0) ? "" : "SAME");
585 new TCanvas("control3", "control3", 500, 500);
589 TFile* fout = new TFile("analysis_esd_raw.root", "RECREATE");
591 if (fdNdEtaAnalysisESD)
592 fdNdEtaAnalysisESD->SaveHistograms();
595 fEsdTrackCuts->SaveHistograms("esd_tracks_cuts");
603 for (Int_t i=0; i<3; ++i)
605 fPartEta[i]->Write();
610 if (fVertexResolution)
611 fVertexResolution->Write();
619 Printf("Writting result to analysis_esd_raw.root");
623 fdNdEtaAnalysis = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("dndeta"));
624 fdNdEtaAnalysisNSD = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("dndetaNSD"));
625 fdNdEtaAnalysisTr = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("dndetaTr"));
626 fdNdEtaAnalysisTrVtx = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("dndetaTrVtx"));
627 fdNdEtaAnalysisTracks = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("dndetaTracks"));
628 fPartPt = dynamic_cast<TH1F*> (fOutput->FindObject("dndeta_check_pt"));
630 if (!fdNdEtaAnalysis || !fdNdEtaAnalysisTr || !fdNdEtaAnalysisTrVtx || !fPartPt)
632 AliDebug(AliLog::kError, Form("ERROR: Histograms not available %p %p", (void*) fdNdEtaAnalysis, (void*) fPartPt));
636 fdNdEtaAnalysis->Finish(0, -1, AlidNdEtaCorrection::kNone);
637 fdNdEtaAnalysisNSD->Finish(0, -1, AlidNdEtaCorrection::kNone);
638 fdNdEtaAnalysisTr->Finish(0, -1, AlidNdEtaCorrection::kNone);
639 fdNdEtaAnalysisTrVtx->Finish(0, -1, AlidNdEtaCorrection::kNone);
640 fdNdEtaAnalysisTracks->Finish(0, -1, AlidNdEtaCorrection::kNone);
642 Int_t events = (Int_t) fdNdEtaAnalysis->GetData()->GetEventCorrection()->GetMeasuredHistogram()->Integral();
643 fPartPt->Scale(1.0/events);
644 fPartPt->Scale(1.0/fPartPt->GetBinWidth(1));
646 fout = new TFile("analysis_mc.root","RECREATE");
648 fdNdEtaAnalysis->SaveHistograms();
649 fdNdEtaAnalysisNSD->SaveHistograms();
650 fdNdEtaAnalysisTr->SaveHistograms();
651 fdNdEtaAnalysisTrVtx->SaveHistograms();
652 fdNdEtaAnalysisTracks->SaveHistograms();
658 Printf("Writting result to analysis_mc.root");
662 new TCanvas("control2", "control2", 500, 500);