3 #include "AlidNdEtaTask.h"
14 #include <TParticle.h>
17 #include <TObjString.h>
22 #include <AliESDVertex.h>
23 #include <AliESDEvent.h>
25 #include <AliHeader.h>
26 #include <AliGenEventHeader.h>
27 #include <AliMultiplicity.h>
28 #include <AliAnalysisManager.h>
29 #include <AliMCEventHandler.h>
30 #include <AliMCEvent.h>
31 #include <AliESDInputHandler.h>
32 #include <AliESDInputHandlerRP.h>
33 #include <AliESDHeader.h>
35 #include "AliESDtrackCuts.h"
36 #include "AliPWG0Helper.h"
37 #include "AliCorrection.h"
38 #include "AliCorrectionMatrix3D.h"
39 #include "dNdEta/dNdEtaAnalysis.h"
40 #include "AliTriggerAnalysis.h"
41 #include "AliPhysicsSelection.h"
46 #include "../ITS/AliITSRecPoint.h"
47 #include "AliCDBManager.h"
48 #include "AliCDBEntry.h"
49 #include "AliGeomManager.h"
50 #include "TGeoManager.h"
53 ClassImp(AlidNdEtaTask)
55 AlidNdEtaTask::AlidNdEtaTask(const char* opt) :
56 AliAnalysisTask("AlidNdEtaTask", ""),
60 fAnalysisMode((AliPWG0Helper::AnalysisMode) (AliPWG0Helper::kTPC | AliPWG0Helper::kFieldOn)),
61 fTrigger(AliTriggerAnalysis::kMB1),
62 fRequireTriggerClass(),
63 fRejectTriggerClass(),
68 fOnlyPrimaries(kFALSE),
70 fCheckEventType(kFALSE),
75 fdNdEtaAnalysisESD(0),
82 fdNdEtaAnalysisNSD(0),
84 fdNdEtaAnalysisTrVtx(0),
85 fdNdEtaAnalysisTracks(0),
96 fTrackletsVsClusters(0),
97 fTrackletsVsUnassigned(0),
103 // Constructor. Initialization of pointers
106 // Define input and output slots here
107 DefineInput(0, TChain::Class());
108 DefineOutput(0, TList::Class());
113 AliLog::SetClassDebugLevel("AlidNdEtaTask", AliLog::kWarning);
116 AlidNdEtaTask::~AlidNdEtaTask()
122 // histograms are in the output list and deleted when the output
123 // list is deleted by the TSelector dtor
131 Bool_t AlidNdEtaTask::Notify()
133 static Int_t count = 0;
135 Printf("Processing %d. file: %s", count, ((TTree*) GetInputData(0))->GetCurrentFile()->GetName());
139 //________________________________________________________________________
140 void AlidNdEtaTask::ConnectInputData(Option_t *)
145 Printf("AlidNdEtaTask::ConnectInputData called");
147 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
150 Printf("ERROR: Could not get ESDInputHandler");
152 fESD = esdH->GetEvent();
154 TString branches("AliESDHeader Vertex ");
156 if (fAnalysisMode & AliPWG0Helper::kSPD || fTrigger & AliTriggerAnalysis::kOfflineFlag)
157 branches += "AliMultiplicity ";
159 if (fAnalysisMode & AliPWG0Helper::kTPC || fAnalysisMode & AliPWG0Helper::kTPCITS)
160 branches += "Tracks ";
162 // Enable only the needed branches
163 esdH->SetActiveBranches(branches);
166 // disable info messages of AliMCEvent (per event)
167 AliLog::SetClassDebugLevel("AliMCEvent", AliLog::kWarning - AliLog::kDebug + 1);
171 AliCDBManager::Instance()->SetDefaultStorage("raw://");
173 AliCDBManager::Instance()->SetDefaultStorage("MC", "Residual");
174 AliCDBManager::Instance()->SetRun(0);
176 AliCDBManager* mgr = AliCDBManager::Instance();
177 AliCDBEntry* obj = mgr->Get(AliCDBPath("GRP", "Geometry", "Data"));
178 AliGeomManager::SetGeometry((TGeoManager*) obj->GetObject());
180 AliGeomManager::GetNalignable("ITS");
181 AliGeomManager::ApplyAlignObjsFromCDB("ITS");
185 void AlidNdEtaTask::CreateOutputObjects()
187 // create result objects and add to output list
189 Printf("AlidNdEtaTask::CreateOutputObjects");
192 Printf("WARNING: Processing only primaries (MC information used). This is for systematical checks only.");
195 Printf("WARNING: Using MC kine information. This is for systematical checks only.");
198 Printf("WARNING: Replacing vertex by MC vertex. This is for systematical checks only.");
203 fdNdEtaAnalysisESD = new dNdEtaAnalysis("fdNdEtaAnalysisESD", "fdNdEtaAnalysisESD", fAnalysisMode);
204 fOutput->Add(fdNdEtaAnalysisESD);
206 fMult = new TH1F("fMult", "fMult;Ntracks;Count", 201, -0.5, 200.5);
209 fMultVtx = new TH1F("fMultVtx", "fMultVtx;Ntracks;Count", 201, -0.5, 200.5);
210 fOutput->Add(fMultVtx);
212 for (Int_t i=0; i<3; ++i)
214 fPartEta[i] = new TH1F(Form("dndeta_check_%d", i), Form("dndeta_check_%d", i), 60, -6, 6);
215 fPartEta[i]->Sumw2();
216 fOutput->Add(fPartEta[i]);
219 fEvents = new TH1F("dndeta_check_vertex", "dndeta_check_vertex", 800, -40, 40);
220 fOutput->Add(fEvents);
222 Float_t resMax = (fAnalysisMode & AliPWG0Helper::kSPD) ? 0.2 : 2;
223 fVertexResolution = new TH1F("dndeta_vertex_resolution_z", "dndeta_vertex_resolution_z", 1000, 0, resMax);
224 fOutput->Add(fVertexResolution);
226 fPhi = new TH1F("fPhi", "fPhi;#phi in rad.;count", 720, 0, 2 * TMath::Pi());
229 fEtaPhi = new TH2F("fEtaPhi", "fEtaPhi;#eta;#phi in rad.;count", 80, -4, 4, 18*5, 0, 2 * TMath::Pi());
230 fOutput->Add(fEtaPhi);
232 fTriggerVsTime = new TGraph; //TH1F("fTriggerVsTime", "fTriggerVsTime;trigger time;count", 100, 0, 100);
233 fTriggerVsTime->SetName("fTriggerVsTime");
234 fTriggerVsTime->GetXaxis()->SetTitle("trigger time");
235 fTriggerVsTime->GetYaxis()->SetTitle("count");
236 fOutput->Add(fTriggerVsTime);
238 fStats = new TH1F("fStats", "fStats", 5, 0.5, 5.5);
239 fStats->GetXaxis()->SetBinLabel(1, "vertexer 3d");
240 fStats->GetXaxis()->SetBinLabel(2, "vertexer z");
241 fStats->GetXaxis()->SetBinLabel(3, "trigger");
242 fStats->GetXaxis()->SetBinLabel(4, "physics events");
243 fStats->GetXaxis()->SetBinLabel(5, "physics events after veto");
244 fOutput->Add(fStats);
246 fStats2 = new TH2F("fStats2", "fStats2", 7, -0.5, 6.5, 10, -0.5, 9.5);
248 fStats2->GetXaxis()->SetBinLabel(1, "No trigger");
249 fStats2->GetXaxis()->SetBinLabel(2, "Splash identification");
250 fStats2->GetXaxis()->SetBinLabel(3, "No Vertex");
251 fStats2->GetXaxis()->SetBinLabel(4, "|z-vtx| > 10");
252 fStats2->GetXaxis()->SetBinLabel(5, "0 tracklets");
253 fStats2->GetXaxis()->SetBinLabel(6, "V0 Veto");
254 fStats2->GetXaxis()->SetBinLabel(7, "Selected");
256 fStats2->GetYaxis()->SetBinLabel(1, "n/a");
257 fStats2->GetYaxis()->SetBinLabel(2, "empty");
258 fStats2->GetYaxis()->SetBinLabel(3, "BBA");
259 fStats2->GetYaxis()->SetBinLabel(4, "BBC");
260 fStats2->GetYaxis()->SetBinLabel(5, "BBA BBC");
261 fStats2->GetYaxis()->SetBinLabel(6, "BGA");
262 fStats2->GetYaxis()->SetBinLabel(7, "BGC");
263 fStats2->GetYaxis()->SetBinLabel(8, "BGA BGC");
264 fStats2->GetYaxis()->SetBinLabel(9, "BBA BGC");
265 fStats2->GetYaxis()->SetBinLabel(10, "BGA BBC");
266 fOutput->Add(fStats2);
268 fTrackletsVsClusters = new TH2F("fTrackletsVsClusters", ";tracklets;clusters in ITS", 50, -0.5, 49.5, 1000, -0.5, 999.5);
269 fOutput->Add(fTrackletsVsClusters);
271 if (fAnalysisMode & AliPWG0Helper::kSPD)
273 fDeltaPhi = new TH1F("fDeltaPhi", "fDeltaPhi;#Delta #phi;Entries", 500, -0.2, 0.2);
274 fOutput->Add(fDeltaPhi);
275 fDeltaTheta = new TH1F("fDeltaTheta", "fDeltaTheta;#Delta #theta;Entries", 500, -0.2, 0.2);
276 fOutput->Add(fDeltaTheta);
277 fFiredChips = new TH2F("fFiredChips", "fFiredChips;Chips L1 + L2;tracklets", 1201, -0.5, 1201, 50, -0.5, 49.5);
278 fOutput->Add(fFiredChips);
279 fTrackletsVsUnassigned = new TH2F("fTrackletsVsUnassigned", ";tracklets;unassigned clusters in L0", 50, -0.5, 49.5, 200, -0.5, 199.5);
280 fOutput->Add(fTrackletsVsUnassigned);
281 for (Int_t i=0; i<2; i++)
283 fZPhi[i] = new TH2F(Form("fZPhi_%d", i), Form("fZPhi Layer %d;z (cm);#phi (rad.)", i), 200, -15, 15, 200, 0, TMath::Pi() * 2);
284 fOutput->Add(fZPhi[i]);
287 fModuleMap = new TH1F("fModuleMap", "fModuleMap;module number;cluster count", 240, -0.5, 239.5);
288 fOutput->Add(fModuleMap);
291 if (fAnalysisMode & AliPWG0Helper::kTPC || fAnalysisMode & AliPWG0Helper::kTPCITS)
293 fRawPt = new TH1F("fRawPt", "raw pt;p_{T};Count", 2000, 0, 100);
294 fOutput->Add(fRawPt);
297 fVertex = new TH3F("vertex_check", "vertex_check;x;y;z", 100, -1, 1, 100, -1, 1, 100, -30, 30);
298 fOutput->Add(fVertex);
300 fVertexVsMult = new TH3F("fVertexVsMult", "fVertexVsMult;x;y;multiplicity", 100, -1, 1, 100, -1, 1, 100, -0.5, 99.5);
301 fOutput->Add(fVertexVsMult);
305 fdNdEtaAnalysis = new dNdEtaAnalysis("dndeta", "dndeta", fAnalysisMode);
306 fOutput->Add(fdNdEtaAnalysis);
308 fdNdEtaAnalysisND = new dNdEtaAnalysis("dndetaND", "dndetaND", fAnalysisMode);
309 fOutput->Add(fdNdEtaAnalysisND);
311 fdNdEtaAnalysisNSD = new dNdEtaAnalysis("dndetaNSD", "dndetaNSD", fAnalysisMode);
312 fOutput->Add(fdNdEtaAnalysisNSD);
314 fdNdEtaAnalysisTr = new dNdEtaAnalysis("dndetaTr", "dndetaTr", fAnalysisMode);
315 fOutput->Add(fdNdEtaAnalysisTr);
317 fdNdEtaAnalysisTrVtx = new dNdEtaAnalysis("dndetaTrVtx", "dndetaTrVtx", fAnalysisMode);
318 fOutput->Add(fdNdEtaAnalysisTrVtx);
320 fdNdEtaAnalysisTracks = new dNdEtaAnalysis("dndetaTracks", "dndetaTracks", fAnalysisMode);
321 fOutput->Add(fdNdEtaAnalysisTracks);
323 fPartPt = new TH1F("dndeta_check_pt", "dndeta_check_pt", 1000, 0, 10);
325 fOutput->Add(fPartPt);
330 fEsdTrackCuts->SetName("fEsdTrackCuts");
331 fOutput->Add(fEsdTrackCuts);
334 if (!fPhysicsSelection)
335 fPhysicsSelection = new AliPhysicsSelection;
337 fPhysicsSelection->SetName("AliPhysicsSelection_outputlist"); // to prevent conflict with object that is automatically streamed back
338 //AliLog::SetClassDebugLevel("AliPhysicsSelection", AliLog::kDebug);
339 //fOutput->Add(fPhysicsSelection);
341 fTriggerAnalysis = new AliTriggerAnalysis;
342 fTriggerAnalysis->EnableHistograms();
343 fTriggerAnalysis->SetSPDGFOThreshhold(2);
344 fOutput->Add(fTriggerAnalysis);
347 void AlidNdEtaTask::Exec(Option_t*)
351 // these variables are also used in the MC section below; however, if ESD is off they stay with their default values
352 Bool_t eventTriggered = kFALSE;
353 const AliESDVertex* vtxESD = 0;
355 // post the data already here
356 PostData(0, fOutput);
361 AliESDHeader* esdHeader = fESD->GetHeader();
364 Printf("ERROR: esdHeader could not be retrieved");
368 // if (fCheckEventType)
369 // eventTriggered = fPhysicsSelection->IsCollisionCandidate(fESD);
371 // check event type (should be PHYSICS = 7)
374 UInt_t eventType = esdHeader->GetEventType();
377 Printf("Skipping event because it is of type %d", eventType);
381 //Printf("Trigger classes: %s:", fESD->GetFiredTriggerClasses().Data());
383 Bool_t accept = kTRUE;
384 if (fRequireTriggerClass.Length() > 0 && !fESD->IsTriggerClassFired(fRequireTriggerClass))
386 if (fRejectTriggerClass.Length() > 0 && fESD->IsTriggerClassFired(fRejectTriggerClass))
391 Printf("Skipping event because it does not have the correct trigger class(es): %s", fESD->GetFiredTriggerClasses().Data());
398 fTriggerAnalysis->FillHistograms(fESD);
400 AliTriggerAnalysis::V0Decision v0A = fTriggerAnalysis->V0Trigger(fESD, AliTriggerAnalysis::kASide, kFALSE);
401 AliTriggerAnalysis::V0Decision v0C = fTriggerAnalysis->V0Trigger(fESD, AliTriggerAnalysis::kCSide, kFALSE);
404 if (v0A != AliTriggerAnalysis::kV0Invalid && v0C != AliTriggerAnalysis::kV0Invalid)
406 if (v0A == AliTriggerAnalysis::kV0Empty && v0C == AliTriggerAnalysis::kV0Empty) vZero = 1;
407 if (v0A == AliTriggerAnalysis::kV0BB && v0C == AliTriggerAnalysis::kV0Empty) vZero = 2;
408 if (v0A == AliTriggerAnalysis::kV0Empty && v0C == AliTriggerAnalysis::kV0BB) vZero = 3;
409 if (v0A == AliTriggerAnalysis::kV0BB && v0C == AliTriggerAnalysis::kV0BB) vZero = 4;
410 if (v0A == AliTriggerAnalysis::kV0BG && v0C == AliTriggerAnalysis::kV0Empty) vZero = 5;
411 if (v0A == AliTriggerAnalysis::kV0Empty && v0C == AliTriggerAnalysis::kV0BG) vZero = 6;
412 if (v0A == AliTriggerAnalysis::kV0BG && v0C == AliTriggerAnalysis::kV0BG) vZero = 7;
413 if (v0A == AliTriggerAnalysis::kV0BB && v0C == AliTriggerAnalysis::kV0BG) vZero = 8;
414 if (v0A == AliTriggerAnalysis::kV0BG && v0C == AliTriggerAnalysis::kV0BB) vZero = 9;
417 Bool_t filled = kFALSE;
420 eventTriggered = fTriggerAnalysis->IsTriggerFired(fESD, fTrigger);
424 fStats2->Fill(0.0, vZero);
428 if (v0A == AliTriggerAnalysis::kV0BG || v0C == AliTriggerAnalysis::kV0BG)
429 eventTriggered = kFALSE;
438 /*const Int_t kMaxEvents = 1;
439 UInt_t maskedEvents[kMaxEvents][2] = {
443 for (Int_t i=0; i<kMaxEvents; i++)
445 if (fESD->GetPeriodNumber() == maskedEvents[i][0] && fESD->GetOrbitNumber() == maskedEvents[i][1])
447 Printf("Skipping event because it is masked: period: %d orbit: %x", fESD->GetPeriodNumber(), fESD->GetOrbitNumber());
450 fStats2->Fill(1, vZero);
458 AliESDInputHandlerRP* handlerRP = dynamic_cast<AliESDInputHandlerRP*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
461 TTree* itsClusterTree = handlerRP->GetTreeR("ITS");
465 TClonesArray* itsClusters = new TClonesArray("AliITSRecPoint");
466 TBranch* itsClusterBranch=itsClusterTree->GetBranch("ITSRecPoints");
468 itsClusterBranch->SetAddress(&itsClusters);
470 Int_t nItsSubs = (Int_t)itsClusterTree->GetEntries();
472 Int_t totalClusters = 0;
474 // loop over the its subdetectors
475 for (Int_t iIts=0; iIts < nItsSubs; iIts++) {
477 if (!itsClusterTree->GetEvent(iIts))
480 Int_t nClusters = itsClusters->GetEntriesFast();
481 totalClusters += nClusters;
484 if (fAnalysisMode & AliPWG0Helper::kSPD)
486 // loop over clusters
487 while (nClusters--) {
488 AliITSRecPoint* cluster = (AliITSRecPoint*) itsClusters->UncheckedAt(nClusters);
490 Int_t layer = cluster->GetLayer();
495 Float_t xyz[3] = {0., 0., 0.};
496 cluster->GetGlobalXYZ(xyz);
498 Float_t phi = TMath::Pi() + TMath::ATan2(-xyz[1], -xyz[0]);
501 fZPhi[layer]->Fill(z, phi);
502 fModuleMap->Fill(layer * 80 + cluster->GetDetectorIndex());
508 const AliMultiplicity* mult = fESD->GetMultiplicity();
512 fTrackletsVsClusters->Fill(mult->GetNumberOfTracklets(), totalClusters);
514 Int_t limit = 80 + mult->GetNumberOfTracklets() * 220/20;
516 if (totalClusters > limit)
518 Printf("Skipping event because %d clusters is above limit of %d from %d tracklets: Period number: %d Orbit number: %x", totalClusters, limit, mult->GetNumberOfTracklets(), fESD->GetPeriodNumber(), fESD->GetOrbitNumber());
521 fStats2->Fill(1, vZero);
524 return; // TODO we skip this also for the MC. not good...
529 vtxESD = AliPWG0Helper::GetVertex(fESD, fAnalysisMode);
534 fStats2->Fill(2, vZero);
543 if (TMath::Abs(vtx[2]) > 10)
547 fStats2->Fill(3, vZero);
552 const AliMultiplicity* mult = fESD->GetMultiplicity();
556 if (mult->GetNumberOfTracklets() == 0)
560 fStats2->Fill(4, vZero);
571 fStats2->Fill(5, vZero);
577 fStats2->Fill(6, vZero);
579 //Printf("Skipping event %d: Period number: %d Orbit number: %x", decision, fESD->GetPeriodNumber(), fESD->GetOrbitNumber());
586 // get the ESD vertex
587 vtxESD = AliPWG0Helper::GetVertex(fESD, fAnalysisMode);
589 //Printf("vertex is: %s", fESD->GetPrimaryVertex()->GetTitle());
593 // fill z vertex resolution
596 fVertexResolution->Fill(vtxESD->GetZRes());
597 //if (strcmp(vtxESD->GetTitle(), "vertexer: 3D") == 0)
599 fVertex->Fill(vtxESD->GetXv(), vtxESD->GetYv(), vtxESD->GetZv());
602 if (AliPWG0Helper::TestVertex(vtxESD, fAnalysisMode))
607 if (strcmp(vtxESD->GetTitle(), "vertexer: 3D") == 0)
610 if (fCheckEventType && TMath::Abs(vtx[0] > 0.3))
612 Printf("Suspicious x-vertex x=%f y=%f z=%f (period: %d orbit %x)", vtx[0], vtx[1], vtx[2], fESD->GetPeriodNumber(), fESD->GetOrbitNumber());
614 if (fCheckEventType && (vtx[1] < 0.05 || vtx[1] > 0.5))
616 Printf("Suspicious y-vertex x=%f y=%f z=%f (period: %d orbit %x)", vtx[0], vtx[1], vtx[2], fESD->GetPeriodNumber(), fESD->GetOrbitNumber());
619 else if (strcmp(vtxESD->GetTitle(), "vertexer: Z") == 0)
628 // needed for syst. studies
632 if (fUseMCVertex || fUseMCKine || fOnlyPrimaries || fReadMC) {
634 Printf("ERROR: fUseMCVertex or fUseMCKine or fOnlyPrimaries set without fReadMC set!");
638 AliMCEventHandler* eventHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
640 Printf("ERROR: Could not retrieve MC event handler");
644 AliMCEvent* mcEvent = eventHandler->MCEvent();
646 Printf("ERROR: Could not retrieve MC event");
650 AliHeader* header = mcEvent->Header();
653 AliDebug(AliLog::kError, "Header not available");
658 AliGenEventHeader* genHeader = header->GenEventHeader();
661 AliDebug(AliLog::kError, "Could not retrieve genHeader from Header");
664 genHeader->PrimaryVertex(vtxMC);
669 stack = mcEvent->Stack();
672 AliDebug(AliLog::kError, "Stack not available");
677 // create list of (label, eta, pt) tuples
678 Int_t inputCount = 0;
681 Float_t* thirdDimArr = 0;
682 if (fAnalysisMode & AliPWG0Helper::kSPD)
685 const AliMultiplicity* mult = fESD->GetMultiplicity();
688 AliDebug(AliLog::kError, "AliMultiplicity not available");
692 labelArr = new Int_t[mult->GetNumberOfTracklets()];
693 etaArr = new Float_t[mult->GetNumberOfTracklets()];
694 thirdDimArr = new Float_t[mult->GetNumberOfTracklets()];
696 // get multiplicity from SPD tracklets
697 for (Int_t i=0; i<mult->GetNumberOfTracklets(); ++i)
699 //printf("%d %f %f %f\n", i, mult->GetTheta(i), mult->GetPhi(i), mult->GetDeltaPhi(i));
702 if (mult->GetLabel(i, 0) < 0 || mult->GetLabel(i, 0) != mult->GetLabel(i, 1) || !stack->IsPhysicalPrimary(mult->GetLabel(i, 0)))
705 Float_t deltaPhi = mult->GetDeltaPhi(i);
706 // prevent values to be shifted by 2 Pi()
707 if (deltaPhi < -TMath::Pi())
708 deltaPhi += TMath::Pi() * 2;
709 if (deltaPhi > TMath::Pi())
710 deltaPhi -= TMath::Pi() * 2;
712 if (TMath::Abs(deltaPhi) > 1)
713 printf("WARNING: Very high Delta Phi: %d %f %f %f\n", i, mult->GetTheta(i), mult->GetPhi(i), deltaPhi);
715 Int_t label = mult->GetLabel(i, 0);
716 Float_t eta = mult->GetEta(i);
718 // control histograms
719 Float_t phi = mult->GetPhi(i);
721 phi += TMath::Pi() * 2;
723 fEtaPhi->Fill(eta, phi);
725 // if (deltaPhi < 0.01)
728 // Float_t z = vtx[2] + 3.9 / TMath::Tan(2 * TMath::ATan(TMath::Exp(- eta)));
729 // fZPhi[0]->Fill(z, phi);
731 // z = vtx[2] + 7.6 / TMath::Tan(2 * TMath::ATan(TMath::Exp(- eta)));
732 // fZPhi[1]->Fill(z, phi);
735 if (vtxESD && TMath::Abs(vtx[2]) < 10)
737 fDeltaPhi->Fill(deltaPhi);
738 fDeltaTheta->Fill(mult->GetDeltaTheta(i));
741 if (fDeltaPhiCut > 0 && TMath::Abs(deltaPhi) > fDeltaPhiCut)
748 TParticle* particle = stack->Particle(label);
749 eta = particle->Eta();
750 phi = particle->Phi();
753 Printf("WARNING: fUseMCKine set without fOnlyPrimaries and no label found");
757 eta = TMath::Abs(eta);
759 etaArr[inputCount] = eta;
760 labelArr[inputCount] = label;
761 thirdDimArr[inputCount] = phi;
767 // fill multiplicity in third axis
768 for (Int_t i=0; i<inputCount; ++i)
769 thirdDimArr[i] = inputCount;
772 Int_t firedChips = mult->GetNumberOfFiredChips(0) + mult->GetNumberOfFiredChips(1);
773 fFiredChips->Fill(firedChips, inputCount);
774 Printf("Accepted %d tracklets (%d fired chips)", inputCount, firedChips);
776 fTrackletsVsUnassigned->Fill(inputCount, mult->GetNumberOfSingleClusters());
778 else if (fAnalysisMode & AliPWG0Helper::kTPC || fAnalysisMode & AliPWG0Helper::kTPCITS)
782 AliDebug(AliLog::kError, "fESDTrackCuts not available");
788 // get multiplicity from ESD tracks
789 TObjArray* list = fEsdTrackCuts->GetAcceptedTracks(fESD, fAnalysisMode & AliPWG0Helper::kTPC);
790 Int_t nGoodTracks = list->GetEntries();
791 Printf("Accepted %d tracks out of %d total ESD tracks", nGoodTracks, fESD->GetNumberOfTracks());
793 labelArr = new Int_t[nGoodTracks];
794 etaArr = new Float_t[nGoodTracks];
795 thirdDimArr = new Float_t[nGoodTracks];
797 // loop over esd tracks
798 for (Int_t i=0; i<nGoodTracks; i++)
800 AliESDtrack* esdTrack = dynamic_cast<AliESDtrack*> (list->At(i));
803 AliDebug(AliLog::kError, Form("ERROR: Could not retrieve track %d.", i));
807 Float_t phi = esdTrack->Phi();
809 phi += TMath::Pi() * 2;
811 Float_t eta = esdTrack->Eta();
812 Int_t label = TMath::Abs(esdTrack->GetLabel());
813 Float_t pT = esdTrack->Pt();
815 // force pT to fixed value without B field
816 if (!(fAnalysisMode & AliPWG0Helper::kFieldOn))
820 fEtaPhi->Fill(eta, phi);
821 if (eventTriggered && vtxESD)
829 if (stack->IsPhysicalPrimary(label) == kFALSE)
837 TParticle* particle = stack->Particle(label);
838 eta = particle->Eta();
842 Printf("WARNING: fUseMCKine set without fOnlyPrimaries and no label found");
846 eta = TMath::Abs(eta);
847 etaArr[inputCount] = eta;
848 labelArr[inputCount] = TMath::Abs(esdTrack->GetLabel());
849 thirdDimArr[inputCount] = pT;
854 Printf("Event with %d accepted TPC tracks. Period number: %d Orbit number: %x Bunch crossing number: %d", inputCount, fESD->GetPeriodNumber(), fESD->GetOrbitNumber(), fESD->GetBunchCrossNumber());
856 // TODO restrict inputCount used as measure for the multiplicity to |eta| < 1
864 // Processing of ESD information (always)
868 fMult->Fill(inputCount);
869 fdNdEtaAnalysisESD->FillTriggeredEvent(inputCount);
871 fTriggerVsTime->SetPoint(fTriggerVsTime->GetN(), fESD->GetTimeStamp(), 1);
877 if (strcmp(vtxESD->GetTitle(), "vertexer: 3D") == 0)
878 fVertexVsMult->Fill(vtxESD->GetXv(), vtxESD->GetYv(), inputCount);
880 fMultVtx->Fill(inputCount);
882 for (Int_t i=0; i<inputCount; ++i)
884 Float_t eta = etaArr[i];
885 Float_t thirdDim = thirdDimArr[i];
887 fdNdEtaAnalysisESD->FillTrack(vtx[2], eta, thirdDim);
889 if (TMath::Abs(vtx[2]) < 10)
891 fPartEta[0]->Fill(eta);
894 fPartEta[1]->Fill(eta);
896 fPartEta[2]->Fill(eta);
900 // for event count per vertex
901 fdNdEtaAnalysisESD->FillEvent(vtx[2], inputCount);
905 fEvents->Fill(vtx[2]);
909 // from tracks is only done for triggered and vertex reconstructed events
910 for (Int_t i=0; i<inputCount; ++i)
912 Int_t label = labelArr[i];
917 //Printf("Getting particle of track %d", label);
918 TParticle* particle = stack->Particle(label);
922 AliDebug(AliLog::kError, Form("ERROR: Could not retrieve particle %d.", label));
926 Float_t thirdDim = -1;
927 if (fAnalysisMode & AliPWG0Helper::kSPD)
931 thirdDim = particle->Phi();
934 thirdDim = inputCount;
937 thirdDim = particle->Pt();
939 Float_t eta = particle->Eta();
941 eta = TMath::Abs(eta);
942 fdNdEtaAnalysisTracks->FillTrack(vtxMC[2], eta, thirdDim);
943 } // end of track loop
945 // for event count per vertex
946 fdNdEtaAnalysisTracks->FillEvent(vtxMC[2], inputCount);
956 delete[] thirdDimArr;
959 if (fReadMC) // Processing of MC information (optional)
961 AliMCEventHandler* eventHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
963 Printf("ERROR: Could not retrieve MC event handler");
967 AliMCEvent* mcEvent = eventHandler->MCEvent();
969 Printf("ERROR: Could not retrieve MC event");
973 AliStack* stack = mcEvent->Stack();
976 AliDebug(AliLog::kError, "Stack not available");
980 AliHeader* header = mcEvent->Header();
983 AliDebug(AliLog::kError, "Header not available");
988 AliGenEventHeader* genHeader = header->GenEventHeader();
991 AliDebug(AliLog::kError, "Could not retrieve genHeader from Header");
996 genHeader->PrimaryVertex(vtxMC);
999 Int_t processType = AliPWG0Helper::GetEventProcessType(header);
1000 AliDebug(AliLog::kDebug+1, Form("Found process type %d", processType));
1002 if (processType==AliPWG0Helper::kInvalidProcess)
1003 AliDebug(AliLog::kError, Form("Unknown process type %d.", processType));
1005 // loop over mc particles
1006 Int_t nPrim = stack->GetNprimary();
1008 Int_t nAcceptedParticles = 0;
1010 // count particles first, then fill
1011 for (Int_t iMc = 0; iMc < nPrim; ++iMc)
1013 if (!stack->IsPhysicalPrimary(iMc))
1016 //Printf("Getting particle %d", iMc);
1017 TParticle* particle = stack->Particle(iMc);
1022 if (particle->GetPDG()->Charge() == 0)
1025 //AliDebug(AliLog::kDebug+1, Form("Accepted primary %d, unique ID: %d", iMc, particle->GetUniqueID()));
1026 Float_t eta = particle->Eta();
1028 // 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))
1029 if (TMath::Abs(eta) < 1.5) // && pt > 0.3)
1030 nAcceptedParticles++;
1033 for (Int_t iMc = 0; iMc < nPrim; ++iMc)
1035 if (!stack->IsPhysicalPrimary(iMc))
1038 //Printf("Getting particle %d", iMc);
1039 TParticle* particle = stack->Particle(iMc);
1044 if (particle->GetPDG()->Charge() == 0)
1047 Float_t eta = particle->Eta();
1049 eta = TMath::Abs(eta);
1051 Float_t thirdDim = -1;
1053 if (fAnalysisMode & AliPWG0Helper::kSPD)
1057 thirdDim = particle->Phi();
1060 thirdDim = nAcceptedParticles;
1063 thirdDim = particle->Pt();
1065 fdNdEtaAnalysis->FillTrack(vtxMC[2], eta, thirdDim);
1067 if (processType != AliPWG0Helper::kSD)
1068 fdNdEtaAnalysisNSD->FillTrack(vtxMC[2], eta, thirdDim);
1070 if (processType == AliPWG0Helper::kND)
1071 fdNdEtaAnalysisND->FillTrack(vtxMC[2], eta, thirdDim);
1075 fdNdEtaAnalysisTr->FillTrack(vtxMC[2], eta, thirdDim);
1077 fdNdEtaAnalysisTrVtx->FillTrack(vtxMC[2], eta, thirdDim);
1080 if (TMath::Abs(eta) < 1.0 && particle->Pt() > 0 && particle->P() > 0)
1082 //Float_t value = 1. / TMath::TwoPi() / particle->Pt() * particle->Energy() / particle->P();
1084 fPartPt->Fill(particle->Pt(), value);
1088 fdNdEtaAnalysis->FillEvent(vtxMC[2], nAcceptedParticles);
1089 if (processType != AliPWG0Helper::kSD)
1090 fdNdEtaAnalysisNSD->FillEvent(vtxMC[2], nAcceptedParticles);
1091 if (processType == AliPWG0Helper::kND)
1092 fdNdEtaAnalysisND->FillEvent(vtxMC[2], nAcceptedParticles);
1096 fdNdEtaAnalysisTr->FillEvent(vtxMC[2], nAcceptedParticles);
1098 fdNdEtaAnalysisTrVtx->FillEvent(vtxMC[2], nAcceptedParticles);
1103 void AlidNdEtaTask::Terminate(Option_t *)
1105 // The Terminate() function is the last function to be called during
1106 // a query. It always runs on the client, it can be used to present
1107 // the results graphically or save the results to file.
1109 fOutput = dynamic_cast<TList*> (GetOutputData(0));
1111 Printf("ERROR: fOutput not available");
1115 fdNdEtaAnalysisESD = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("fdNdEtaAnalysisESD"));
1116 fMult = dynamic_cast<TH1F*> (fOutput->FindObject("fMult"));
1117 fMultVtx = dynamic_cast<TH1F*> (fOutput->FindObject("fMultVtx"));
1118 for (Int_t i=0; i<3; ++i)
1119 fPartEta[i] = dynamic_cast<TH1F*> (fOutput->FindObject(Form("dndeta_check_%d", i)));
1120 fEvents = dynamic_cast<TH1F*> (fOutput->FindObject("dndeta_check_vertex"));
1121 fVertexResolution = dynamic_cast<TH1F*> (fOutput->FindObject("dndeta_vertex_resolution_z"));
1123 fVertex = dynamic_cast<TH3F*> (fOutput->FindObject("vertex_check"));
1124 fVertexVsMult = dynamic_cast<TH3F*> (fOutput->FindObject("fVertexVsMult"));
1125 fPhi = dynamic_cast<TH1F*> (fOutput->FindObject("fPhi"));
1126 fRawPt = dynamic_cast<TH1F*> (fOutput->FindObject("fRawPt"));
1127 fEtaPhi = dynamic_cast<TH2F*> (fOutput->FindObject("fEtaPhi"));
1128 for (Int_t i=0; i<2; ++i)
1129 fZPhi[i] = dynamic_cast<TH2F*> (fOutput->FindObject(Form("fZPhi_%d", i)));
1130 fModuleMap = dynamic_cast<TH1F*> (fOutput->FindObject("fModuleMap"));
1131 fDeltaPhi = dynamic_cast<TH1F*> (fOutput->FindObject("fDeltaPhi"));
1132 fDeltaTheta = dynamic_cast<TH1F*> (fOutput->FindObject("fDeltaTheta"));
1133 fFiredChips = dynamic_cast<TH2F*> (fOutput->FindObject("fFiredChips"));
1134 fTrackletsVsClusters = dynamic_cast<TH2F*> (fOutput->FindObject("fTrackletsVsClusters"));
1135 fTrackletsVsUnassigned = dynamic_cast<TH2F*> (fOutput->FindObject("fTrackletsVsUnassigned"));
1136 fTriggerVsTime = dynamic_cast<TGraph*> (fOutput->FindObject("fTriggerVsTime"));
1137 fStats = dynamic_cast<TH1F*> (fOutput->FindObject("fStats"));
1138 fStats2 = dynamic_cast<TH2F*> (fOutput->FindObject("fStats2"));
1140 fEsdTrackCuts = dynamic_cast<AliESDtrackCuts*> (fOutput->FindObject("fEsdTrackCuts"));
1141 fPhysicsSelection = dynamic_cast<AliPhysicsSelection*> (fOutput->FindObject("AliPhysicsSelection_outputlist"));
1142 fTriggerAnalysis = dynamic_cast<AliTriggerAnalysis*> (fOutput->FindObject("AliTriggerAnalysis"));
1145 if (!fdNdEtaAnalysisESD)
1147 AliDebug(AliLog::kError, "ERROR: fdNdEtaAnalysisESD not available");
1151 if (fMult && fMultVtx)
1155 fMultVtx->SetLineColor(2);
1156 fMultVtx->Draw("SAME");
1162 fFiredChips->Draw("COLZ");
1167 Int_t events1 = (Int_t) fEvents->Integral(fEvents->GetXaxis()->FindBin(-19.9), fEvents->GetXaxis()->FindBin(-0.001));
1168 Int_t events2 = (Int_t) fEvents->Integral(fEvents->GetXaxis()->FindBin(0.001), fEvents->GetXaxis()->FindBin(19.9));
1170 Printf("%d events with vertex used", events1 + events2);
1172 if (events1 > 0 && events2 > 0)
1174 fPartEta[0]->Scale(1.0 / (events1 + events2));
1175 fPartEta[1]->Scale(1.0 / events1);
1176 fPartEta[2]->Scale(1.0 / events2);
1178 for (Int_t i=0; i<3; ++i)
1179 fPartEta[i]->Scale(1.0 / fPartEta[i]->GetBinWidth(1));
1181 new TCanvas("control", "control", 500, 500);
1182 for (Int_t i=0; i<3; ++i)
1184 fPartEta[i]->SetLineColor(i+1);
1185 fPartEta[i]->Draw((i==0) ? "" : "SAME");
1192 new TCanvas("control3", "control3", 500, 500);
1199 fStats2->Draw("TEXT");
1202 TFile* fout = new TFile("analysis_esd_raw.root", "RECREATE");
1204 if (fdNdEtaAnalysisESD)
1205 fdNdEtaAnalysisESD->SaveHistograms();
1208 fEsdTrackCuts->SaveHistograms("esd_track_cuts");
1210 if (fPhysicsSelection)
1212 fPhysicsSelection->SaveHistograms("physics_selection");
1213 fPhysicsSelection->Print();
1216 if (fTriggerAnalysis)
1217 fTriggerAnalysis->SaveHistograms();
1225 for (Int_t i=0; i<3; ++i)
1227 fPartEta[i]->Write();
1232 if (fVertexResolution)
1233 fVertexResolution->Write();
1239 fDeltaTheta->Write();
1250 for (Int_t i=0; i<2; ++i)
1255 fModuleMap->Write();
1258 fFiredChips->Write();
1260 if (fTrackletsVsClusters)
1261 fTrackletsVsClusters->Write();
1263 if (fTrackletsVsUnassigned)
1264 fTrackletsVsUnassigned->Write();
1267 fTriggerVsTime->Write();
1279 fVertexVsMult->Write();
1284 Printf("Writting result to analysis_esd_raw.root");
1291 fdNdEtaAnalysis = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("dndeta"));
1292 fdNdEtaAnalysisND = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("dndetaND"));
1293 fdNdEtaAnalysisNSD = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("dndetaNSD"));
1294 fdNdEtaAnalysisTr = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("dndetaTr"));
1295 fdNdEtaAnalysisTrVtx = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("dndetaTrVtx"));
1296 fdNdEtaAnalysisTracks = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("dndetaTracks"));
1297 fPartPt = dynamic_cast<TH1F*> (fOutput->FindObject("dndeta_check_pt"));
1300 if (!fdNdEtaAnalysis || !fdNdEtaAnalysisTr || !fdNdEtaAnalysisTrVtx || !fPartPt)
1302 AliDebug(AliLog::kError, Form("ERROR: Histograms not available %p %p", (void*) fdNdEtaAnalysis, (void*) fPartPt));
1306 fdNdEtaAnalysis->Finish(0, -1, AlidNdEtaCorrection::kNone);
1307 fdNdEtaAnalysisND->Finish(0, -1, AlidNdEtaCorrection::kNone);
1308 fdNdEtaAnalysisNSD->Finish(0, -1, AlidNdEtaCorrection::kNone);
1309 fdNdEtaAnalysisTr->Finish(0, -1, AlidNdEtaCorrection::kNone);
1310 fdNdEtaAnalysisTrVtx->Finish(0, -1, AlidNdEtaCorrection::kNone);
1311 fdNdEtaAnalysisTracks->Finish(0, -1, AlidNdEtaCorrection::kNone);
1313 Int_t events = (Int_t) fdNdEtaAnalysis->GetData()->GetEventCorrection()->GetMeasuredHistogram()->Integral();
1314 fPartPt->Scale(1.0/events);
1315 fPartPt->Scale(1.0/fPartPt->GetBinWidth(1));
1317 TFile* fout = new TFile("analysis_mc.root","RECREATE");
1319 fdNdEtaAnalysis->SaveHistograms();
1320 fdNdEtaAnalysisND->SaveHistograms();
1321 fdNdEtaAnalysisNSD->SaveHistograms();
1322 fdNdEtaAnalysisTr->SaveHistograms();
1323 fdNdEtaAnalysisTrVtx->SaveHistograms();
1324 fdNdEtaAnalysisTracks->SaveHistograms();
1332 Printf("Writting result to analysis_mc.root");
1336 new TCanvas("control2", "control2", 500, 500);