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),
49 fOnlyPrimaries(kFALSE),
52 fdNdEtaAnalysisESD(0),
58 fdNdEtaAnalysisNSD(0),
60 fdNdEtaAnalysisTrVtx(0),
61 fdNdEtaAnalysisTracks(0),
69 // Constructor. Initialization of pointers
72 // Define input and output slots here
73 DefineInput(0, TChain::Class());
74 DefineOutput(0, TList::Class());
76 AliLog::SetClassDebugLevel("AlidNdEtaTask", AliLog::kWarning);
79 AlidNdEtaTask::~AlidNdEtaTask()
85 // histograms are in the output list and deleted when the output
86 // list is deleted by the TSelector dtor
94 Bool_t AlidNdEtaTask::Notify()
96 static Int_t count = 0;
98 Printf("Processing %d. file", count);
102 //________________________________________________________________________
103 void AlidNdEtaTask::ConnectInputData(Option_t *)
108 Printf("AlidNdEtaTask::ConnectInputData called");
110 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
113 Printf("ERROR: Could not get ESDInputHandler");
115 fESD = esdH->GetEvent();
117 // Enable only the needed branches
118 esdH->SetActiveBranches("AliESDHeader Vertex");
120 if (fAnalysisMode == AliPWG0Helper::kSPD)
121 esdH->SetActiveBranches("AliESDHeader Vertex AliMultiplicity");
123 if (fAnalysisMode == AliPWG0Helper::kTPC || fAnalysisMode == AliPWG0Helper::kTPCITS) {
124 esdH->SetActiveBranches("AliESDHeader Vertex Tracks");
128 // disable info messages of AliMCEvent (per event)
129 AliLog::SetClassDebugLevel("AliMCEvent", AliLog::kWarning - AliLog::kDebug + 1);
132 void AlidNdEtaTask::CreateOutputObjects()
134 // create result objects and add to output list
136 Printf("AlidNdEtaTask::CreateOutputObjects");
139 Printf("WARNING: Processing only primaries (MC information used). This is for systematical checks only.");
142 Printf("WARNING: Using MC kine information. This is for systematical checks only.");
145 Printf("WARNING: Replacing vertex by MC vertex. This is for systematical checks only.");
150 fdNdEtaAnalysisESD = new dNdEtaAnalysis("fdNdEtaAnalysisESD", "fdNdEtaAnalysisESD", fAnalysisMode);
151 fOutput->Add(fdNdEtaAnalysisESD);
153 fMult = new TH1F("fMult", "fMult;Ntracks;Count", 201, -0.5, 200.5);
156 fMultVtx = new TH1F("fMultVtx", "fMultVtx;Ntracks;Count", 201, -0.5, 200.5);
157 fOutput->Add(fMultVtx);
159 for (Int_t i=0; i<3; ++i)
161 fPartEta[i] = new TH1F(Form("dndeta_check_%d", i), Form("dndeta_check_%d", i), 60, -6, 6);
162 fPartEta[i]->Sumw2();
163 fOutput->Add(fPartEta[i]);
166 fEvents = new TH1F("dndeta_check_vertex", "dndeta_check_vertex", 160, -40, 40);
167 fOutput->Add(fEvents);
169 fVertexResolution = new TH1F("dndeta_vertex_resolution_z", "dndeta_vertex_resolution_z", 1000, 0, 10);
170 fOutput->Add(fVertexResolution);
172 fPhi = new TH1F("fPhi", "fPhi;#phi in rad.;count", 720, 0, 2 * TMath::Pi());
175 fEtaPhi = new TH2F("fEtaPhi", "fEtaPhi;#eta;#phi in rad.;count", 80, -4, 4, 18*5, 0, 2 * TMath::Pi());
176 fOutput->Add(fEtaPhi);
178 if (fAnalysisMode == AliPWG0Helper::kSPD)
179 fDeltaPhi = new TH1F("fDeltaPhi", "fDeltaPhi;#Delta #phi;Entries", 18*50, -3.14, 3.14);
183 fdNdEtaAnalysis = new dNdEtaAnalysis("dndeta", "dndeta", fAnalysisMode);
184 fOutput->Add(fdNdEtaAnalysis);
186 fdNdEtaAnalysisNSD = new dNdEtaAnalysis("dndetaNSD", "dndetaNSD", fAnalysisMode);
187 fOutput->Add(fdNdEtaAnalysisNSD);
189 fdNdEtaAnalysisTr = new dNdEtaAnalysis("dndetaTr", "dndetaTr", fAnalysisMode);
190 fOutput->Add(fdNdEtaAnalysisTr);
192 fdNdEtaAnalysisTrVtx = new dNdEtaAnalysis("dndetaTrVtx", "dndetaTrVtx", fAnalysisMode);
193 fOutput->Add(fdNdEtaAnalysisTrVtx);
195 fdNdEtaAnalysisTracks = new dNdEtaAnalysis("dndetaTracks", "dndetaTracks", fAnalysisMode);
196 fOutput->Add(fdNdEtaAnalysisTracks);
198 fVertex = new TH3F("vertex_check", "vertex_check", 50, -50, 50, 50, -50, 50, 50, -50, 50);
199 fOutput->Add(fVertex);
201 fPartPt = new TH1F("dndeta_check_pt", "dndeta_check_pt", 1000, 0, 10);
203 fOutput->Add(fPartPt);
208 fEsdTrackCuts->SetName("fEsdTrackCuts");
209 fOutput->Add(fEsdTrackCuts);
213 void AlidNdEtaTask::Exec(Option_t*)
217 // these variables are also used in the MC section below; however, if ESD is off they stay with their default values
218 Bool_t eventTriggered = kFALSE;
219 const AliESDVertex* vtxESD = 0;
224 // trigger definition
225 eventTriggered = AliPWG0Helper::IsEventTriggered(fESD->GetTriggerMask(), fTrigger);
227 // get the ESD vertex
228 vtxESD = AliPWG0Helper::GetVertex(fESD, fAnalysisMode);
237 // fill z vertex resolution
239 fVertexResolution->Fill(vtxESD->GetZRes());
241 // post the data already here
242 PostData(0, fOutput);
244 // needed for syst. studies
248 if (fUseMCVertex || fUseMCKine || fOnlyPrimaries || fReadMC) {
250 Printf("ERROR: fUseMCVertex or fUseMCKine or fOnlyPrimaries set without fReadMC set!");
254 AliMCEventHandler* eventHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
256 Printf("ERROR: Could not retrieve MC event handler");
260 AliMCEvent* mcEvent = eventHandler->MCEvent();
262 Printf("ERROR: Could not retrieve MC event");
266 AliHeader* header = mcEvent->Header();
269 AliDebug(AliLog::kError, "Header not available");
274 AliGenEventHeader* genHeader = header->GenEventHeader();
277 AliDebug(AliLog::kError, "Could not retrieve genHeader from Header");
280 genHeader->PrimaryVertex(vtxMC);
285 stack = mcEvent->Stack();
288 AliDebug(AliLog::kError, "Stack not available");
293 // create list of (label, eta, pt) tuples
294 Int_t inputCount = 0;
298 if (fAnalysisMode == AliPWG0Helper::kSPD)
301 const AliMultiplicity* mult = fESD->GetMultiplicity();
304 AliDebug(AliLog::kError, "AliMultiplicity not available");
308 labelArr = new Int_t[mult->GetNumberOfTracklets()];
309 etaArr = new Float_t[mult->GetNumberOfTracklets()];
310 ptArr = new Float_t[mult->GetNumberOfTracklets()];
312 // get multiplicity from ITS tracklets
313 for (Int_t i=0; i<mult->GetNumberOfTracklets(); ++i)
315 //printf("%d %f %f %f\n", i, mult->GetTheta(i), mult->GetPhi(i), mult->GetDeltaPhi(i));
318 if (mult->GetLabel(i, 0) < 0 || mult->GetLabel(i, 0) != mult->GetLabel(i, 1) || !stack->IsPhysicalPrimary(mult->GetLabel(i, 0)))
321 Float_t deltaPhi = mult->GetDeltaPhi(i);
322 // prevent values to be shifted by 2 Pi()
323 if (deltaPhi < -TMath::Pi())
324 deltaPhi += TMath::Pi() * 2;
325 if (deltaPhi > TMath::Pi())
326 deltaPhi -= TMath::Pi() * 2;
328 if (TMath::Abs(deltaPhi) > 1)
329 printf("WARNING: Very high Delta Phi: %d %f %f %f\n", i, mult->GetTheta(i), mult->GetPhi(i), deltaPhi);
331 Float_t phi = mult->GetPhi(i);
333 phi += TMath::Pi() * 2;
335 fEtaPhi->Fill(mult->GetEta(i), phi);
337 fDeltaPhi->Fill(deltaPhi);
339 // TODO implement fUseMCKine here
341 etaArr[inputCount] = mult->GetEta(i);
342 labelArr[inputCount] = mult->GetLabel(i, 0);
343 ptArr[inputCount] = 0; // no pt for tracklets
347 Printf("Accepted %d tracklets", inputCount);
349 else if (fAnalysisMode == AliPWG0Helper::kTPC || fAnalysisMode == AliPWG0Helper::kTPCITS)
353 AliDebug(AliLog::kError, "fESDTrackCuts not available");
357 // get multiplicity from ESD tracks
358 TObjArray* list = fEsdTrackCuts->GetAcceptedTracks(fESD, (fAnalysisMode == AliPWG0Helper::kTPC));
359 Int_t nGoodTracks = list->GetEntries();
361 labelArr = new Int_t[nGoodTracks];
362 etaArr = new Float_t[nGoodTracks];
363 ptArr = new Float_t[nGoodTracks];
365 // loop over esd tracks
366 for (Int_t i=0; i<nGoodTracks; i++)
368 AliESDtrack* esdTrack = dynamic_cast<AliESDtrack*> (list->At(i));
371 AliDebug(AliLog::kError, Form("ERROR: Could not retrieve track %d.", i));
375 Float_t phi = esdTrack->Phi();
377 phi += TMath::Pi() * 2;
379 fEtaPhi->Fill(esdTrack->Eta(), phi);
381 Float_t eta = esdTrack->Eta();
382 Int_t label = TMath::Abs(esdTrack->GetLabel());
383 Float_t pT = esdTrack->Pt();
385 if (fOnlyPrimaries && label == 0)
392 TParticle* particle = stack->Particle(label);
393 eta = particle->Eta();
397 Printf("WARNING: fUseMCKine set without fOnlyPrimaries and no label found");
400 etaArr[inputCount] = eta;
401 labelArr[inputCount] = TMath::Abs(esdTrack->GetLabel());
402 ptArr[inputCount] = pT;
406 Printf("Accepted %d tracks", nGoodTracks);
413 // Processing of ESD information (always)
417 fMult->Fill(inputCount);
418 fdNdEtaAnalysisESD->FillTriggeredEvent(inputCount);
423 fMultVtx->Fill(inputCount);
425 for (Int_t i=0; i<inputCount; ++i)
427 Float_t eta = etaArr[i];
428 Float_t pt = ptArr[i];
430 fdNdEtaAnalysisESD->FillTrack(vtx[2], eta, pt);
432 if (TMath::Abs(vtx[2]) < 20)
434 fPartEta[0]->Fill(eta);
437 fPartEta[1]->Fill(eta);
439 fPartEta[2]->Fill(eta);
443 // for event count per vertex
444 fdNdEtaAnalysisESD->FillEvent(vtx[2], inputCount);
447 fEvents->Fill(vtx[2]);
451 // from tracks is only done for triggered and vertex reconstructed events
452 for (Int_t i=0; i<inputCount; ++i)
454 Int_t label = labelArr[i];
459 //Printf("Getting particle of track %d", label);
460 TParticle* particle = stack->Particle(label);
464 AliDebug(AliLog::kError, Form("ERROR: Could not retrieve particle %d.", label));
468 fdNdEtaAnalysisTracks->FillTrack(vtxMC[2], particle->Eta(), particle->Pt());
469 } // end of track loop
471 // for event count per vertex
472 fdNdEtaAnalysisTracks->FillEvent(vtxMC[2], inputCount);
482 if (fReadMC) // Processing of MC information (optional)
484 AliMCEventHandler* eventHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
486 Printf("ERROR: Could not retrieve MC event handler");
490 AliMCEvent* mcEvent = eventHandler->MCEvent();
492 Printf("ERROR: Could not retrieve MC event");
496 AliStack* stack = mcEvent->Stack();
499 AliDebug(AliLog::kError, "Stack not available");
503 AliHeader* header = mcEvent->Header();
506 AliDebug(AliLog::kError, "Header not available");
511 AliGenEventHeader* genHeader = header->GenEventHeader();
514 AliDebug(AliLog::kError, "Could not retrieve genHeader from Header");
519 genHeader->PrimaryVertex(vtxMC);
522 Int_t processType = AliPWG0Helper::GetEventProcessType(header);
523 AliDebug(AliLog::kDebug+1, Form("Found process type %d", processType));
525 if (processType==AliPWG0Helper::kInvalidProcess)
526 AliDebug(AliLog::kError, Form("Unknown process type %d.", processType));
528 // loop over mc particles
529 Int_t nPrim = stack->GetNprimary();
531 Int_t nAcceptedParticles = 0;
533 for (Int_t iMc = 0; iMc < nPrim; ++iMc)
535 if (!stack->IsPhysicalPrimary(iMc))
538 //Printf("Getting particle %d", iMc);
539 TParticle* particle = stack->Particle(iMc);
544 if (particle->GetPDG()->Charge() == 0)
547 //AliDebug(AliLog::kDebug+1, Form("Accepted primary %d, unique ID: %d", iMc, particle->GetUniqueID()));
548 Float_t eta = particle->Eta();
549 Float_t pt = particle->Pt();
551 // 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))
552 if (TMath::Abs(eta) < 1.5) // && pt > 0.3)
553 nAcceptedParticles++;
555 fdNdEtaAnalysis->FillTrack(vtxMC[2], eta, pt);
556 fVertex->Fill(particle->Vx(), particle->Vy(), particle->Vz());
558 if (processType != AliPWG0Helper::kSD )
559 fdNdEtaAnalysisNSD->FillTrack(vtxMC[2], eta, pt);
563 fdNdEtaAnalysisTr->FillTrack(vtxMC[2], eta, pt);
565 fdNdEtaAnalysisTrVtx->FillTrack(vtxMC[2], eta, pt);
568 if (TMath::Abs(eta) < 0.8)
572 fdNdEtaAnalysis->FillEvent(vtxMC[2], nAcceptedParticles);
573 if (processType != AliPWG0Helper::kSD)
574 fdNdEtaAnalysisNSD->FillEvent(vtxMC[2], nAcceptedParticles);
578 fdNdEtaAnalysisTr->FillEvent(vtxMC[2], nAcceptedParticles);
580 fdNdEtaAnalysisTrVtx->FillEvent(vtxMC[2], nAcceptedParticles);
585 void AlidNdEtaTask::Terminate(Option_t *)
587 // The Terminate() function is the last function to be called during
588 // a query. It always runs on the client, it can be used to present
589 // the results graphically or save the results to file.
591 fOutput = dynamic_cast<TList*> (GetOutputData(0));
593 Printf("ERROR: fOutput not available");
597 fdNdEtaAnalysisESD = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("fdNdEtaAnalysisESD"));
598 fMult = dynamic_cast<TH1F*> (fOutput->FindObject("fMult"));
599 fMultVtx = dynamic_cast<TH1F*> (fOutput->FindObject("fMultVtx"));
600 for (Int_t i=0; i<3; ++i)
601 fPartEta[i] = dynamic_cast<TH1F*> (fOutput->FindObject(Form("dndeta_check_%d", i)));
602 fEvents = dynamic_cast<TH1F*> (fOutput->FindObject("dndeta_check_vertex"));
603 fVertexResolution = dynamic_cast<TH1F*> (fOutput->FindObject("dndeta_vertex_resolution_z"));
605 fPhi = dynamic_cast<TH1F*> (fOutput->FindObject("fPhi"));
606 fEtaPhi = dynamic_cast<TH2F*> (fOutput->FindObject("fEtaPhi"));
607 fDeltaPhi = dynamic_cast<TH1F*> (fOutput->FindObject("fDeltaPhi"));
609 fEsdTrackCuts = dynamic_cast<AliESDtrackCuts*> (fOutput->FindObject("fEsdTrackCuts"));
612 if (!fdNdEtaAnalysisESD)
614 AliDebug(AliLog::kError, "ERROR: fdNdEtaAnalysisESD not available");
618 if (fMult && fMultVtx)
622 fMultVtx->SetLineColor(2);
623 fMultVtx->Draw("SAME");
628 Int_t events1 = (Int_t) fEvents->Integral(fEvents->GetXaxis()->FindBin(-19.9), fEvents->GetXaxis()->FindBin(-0.001));
629 Int_t events2 = (Int_t) fEvents->Integral(fEvents->GetXaxis()->FindBin(0.001), fEvents->GetXaxis()->FindBin(19.9));
631 Printf("%d events with vertex used", events1 + events2);
633 if (events1 > 0 && events2 > 0)
635 fPartEta[0]->Scale(1.0 / (events1 + events2));
636 fPartEta[1]->Scale(1.0 / events1);
637 fPartEta[2]->Scale(1.0 / events2);
639 for (Int_t i=0; i<3; ++i)
640 fPartEta[i]->Scale(1.0 / fPartEta[i]->GetBinWidth(1));
642 new TCanvas("control", "control", 500, 500);
643 for (Int_t i=0; i<3; ++i)
645 fPartEta[i]->SetLineColor(i+1);
646 fPartEta[i]->Draw((i==0) ? "" : "SAME");
653 new TCanvas("control3", "control3", 500, 500);
657 TFile* fout = new TFile("analysis_esd_raw.root", "RECREATE");
659 if (fdNdEtaAnalysisESD)
660 fdNdEtaAnalysisESD->SaveHistograms();
663 fEsdTrackCuts->SaveHistograms("esd_tracks_cuts");
671 for (Int_t i=0; i<3; ++i)
673 fPartEta[i]->Write();
678 if (fVertexResolution)
679 fVertexResolution->Write();
693 Printf("Writting result to analysis_esd_raw.root");
699 fdNdEtaAnalysis = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("dndeta"));
700 fdNdEtaAnalysisNSD = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("dndetaNSD"));
701 fdNdEtaAnalysisTr = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("dndetaTr"));
702 fdNdEtaAnalysisTrVtx = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("dndetaTrVtx"));
703 fdNdEtaAnalysisTracks = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("dndetaTracks"));
704 fPartPt = dynamic_cast<TH1F*> (fOutput->FindObject("dndeta_check_pt"));
705 fVertex = dynamic_cast<TH3F*> (fOutput->FindObject("vertex_check"));
708 if (!fdNdEtaAnalysis || !fdNdEtaAnalysisTr || !fdNdEtaAnalysisTrVtx || !fPartPt)
710 AliDebug(AliLog::kError, Form("ERROR: Histograms not available %p %p", (void*) fdNdEtaAnalysis, (void*) fPartPt));
714 fdNdEtaAnalysis->Finish(0, -1, AlidNdEtaCorrection::kNone);
715 fdNdEtaAnalysisNSD->Finish(0, -1, AlidNdEtaCorrection::kNone);
716 fdNdEtaAnalysisTr->Finish(0, -1, AlidNdEtaCorrection::kNone);
717 fdNdEtaAnalysisTrVtx->Finish(0, -1, AlidNdEtaCorrection::kNone);
718 fdNdEtaAnalysisTracks->Finish(0, -1, AlidNdEtaCorrection::kNone);
720 Int_t events = (Int_t) fdNdEtaAnalysis->GetData()->GetEventCorrection()->GetMeasuredHistogram()->Integral();
721 fPartPt->Scale(1.0/events);
722 fPartPt->Scale(1.0/fPartPt->GetBinWidth(1));
724 fout = new TFile("analysis_mc.root","RECREATE");
726 fdNdEtaAnalysis->SaveHistograms();
727 fdNdEtaAnalysisNSD->SaveHistograms();
728 fdNdEtaAnalysisTr->SaveHistograms();
729 fdNdEtaAnalysisTrVtx->SaveHistograms();
730 fdNdEtaAnalysisTracks->SaveHistograms();
741 Printf("Writting result to analysis_mc.root");
745 new TCanvas("control2", "control2", 500, 500);