1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
28 #include "AliAnalysisTaskPhiCorrelations.h"
29 #include "AliAnalyseLeadingTrackUE.h"
30 #include "AliUEHistograms.h"
31 #include "AliUEHist.h"
33 #include "AliAnalysisManager.h"
34 #include "AliAODHandler.h"
35 #include "AliAODInputHandler.h"
36 #include "AliAODMCParticle.h"
37 #include "AliInputEventHandler.h"
39 #include "AliMCEventHandler.h"
40 #include "AliVParticle.h"
41 #include "AliCFContainer.h"
43 #include "AliESDEvent.h"
44 #include "AliESDInputHandler.h"
45 #include "AliMultiplicity.h"
46 #include "AliCentrality.h"
48 #include "AliAODMCHeader.h"
49 #include "AliGenCocktailEventHeader.h"
50 #include "AliGenEventHeader.h"
52 #include "AliEventPoolManager.h"
54 #include "AliESDZDC.h"
55 #include "AliESDtrackCuts.h"
58 ////////////////////////////////////////////////////////////////////////
60 // Analysis class for azimuthal correlation studies
61 // Based on the UE task from Sara Vallero and Jan Fiete
63 // This class needs input AODs.
64 // The output is a list of analysis-specific containers.
66 // The AOD can be either connected to the InputEventHandler
67 // for a chain of AOD files
69 // to the OutputEventHandler
70 // for a chain of ESD files,
71 // in this case the class should be in the train after the jet-finder
74 // Jan Fiete Grosse-Oetringhaus
76 ////////////////////////////////////////////////////////////////////////
79 ClassImp( AliAnalysisTaskPhiCorrelations )
80 ClassImp( AliDPhiBasicParticle )
82 //____________________________________________________________________
83 AliAnalysisTaskPhiCorrelations:: AliAnalysisTaskPhiCorrelations(const char* name):
84 AliAnalysisTask(name,""),
85 // general configuration
88 fReduceMemoryFootprint(kFALSE),
91 fCompareCentralities(kFALSE),
92 fTwoTrackEfficiencyStudy(kFALSE),
93 fTwoTrackEfficiencyCut(0),
95 fCourseCentralityBinning(kFALSE),
97 fInjectedSignals(kFALSE),
98 // pointers to UE classes
102 fEfficiencyCorrection(0),
103 // handlers and events
111 // histogram settings
114 fnTracksVertex(1), // QA tracks pointing to principal vertex (= 3 default)
116 fCentralityMethod("V0M"),
122 fSelectBit(AliVEvent::kMB|AliVEvent::kUserDefined),
123 fUseChargeHadrons(kFALSE),
125 fTriggerSelectCharge(0),
126 fTriggerRestrictEta(-1),
127 fEtaOrdering(kFALSE),
128 fCutConversions(kFALSE),
129 fCutResonances(kFALSE),
130 fFillOnlyStep0(kFALSE),
132 fRejectCentralityOutliers(kFALSE),
135 // Default constructor
136 // Define input and output slots here
137 // Input slot #0 works with a TChain
138 DefineInput(0, TChain::Class());
139 // Output slot #0 writes into a TList container
140 DefineOutput(0, TList::Class());
143 AliAnalysisTaskPhiCorrelations::~AliAnalysisTaskPhiCorrelations()
147 if (fListOfHistos && !AliAnalysisManager::GetAnalysisManager()->IsProofMode())
148 delete fListOfHistos;
151 //____________________________________________________________________
152 void AliAnalysisTaskPhiCorrelations::ConnectInputData(Option_t* /*option*/)
155 // Connect the input data
156 if (fDebug > 1) AliInfo("ConnectInputData() ");
158 // Since AODs can either be connected to the InputEventHandler
159 // or to the OutputEventHandler ( the AOD is created by a previus task in the train )
160 // we need to get the pointer to the AODEvent correctly.
162 // Delta AODs are also accepted.
164 TObject* handler = AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
166 if( handler && handler->InheritsFrom("AliAODInputHandler") )
168 fAOD = ((AliAODInputHandler*)handler)->GetEvent();
169 if (fDebug > 1) AliInfo(" ==== Tracks and Jets from AliAODInputHandler");
173 handler = AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler();
174 if (handler && handler->InheritsFrom("AliAODHandler") )
176 fAOD = ((AliAODHandler*)handler)->GetAOD();
177 if (fDebug > 1) AliInfo(" ==== Tracks and Jets from AliAODHandler");
181 AliWarning("I can't get any AOD Event Handler");
185 if (handler && handler->InheritsFrom("AliESDInputHandler") )
187 // pointer received per event in ::Exec
188 if (fDebug > 1) AliInfo(" ==== Tracks and Jets from AliESDInputHandler");
191 // Initialize common pointers
195 //____________________________________________________________________
196 void AliAnalysisTaskPhiCorrelations::CreateOutputObjects()
198 // Create the output container
200 if (fDebug > 1) AliInfo("CreateOutputObjects()");
202 // Initialize class with main algorithms, event and track selection.
203 fAnalyseUE = new AliAnalyseLeadingTrackUE();
204 fAnalyseUE->SetParticleSelectionCriteria(fFilterBit, fUseChargeHadrons, fTrackEtaCut, fPtMin);
205 fAnalyseUE->SetDebug(fDebug);
206 fAnalyseUE->DefineESDCuts(fFilterBit);
207 fAnalyseUE->SetEventSelection(fSelectBit);
209 // Initialize output list of containers
210 if (fListOfHistos != NULL){
211 delete fListOfHistos;
212 fListOfHistos = NULL;
215 fListOfHistos = new TList();
216 fListOfHistos->SetOwner(kTRUE);
219 // Initialize class to handle histograms
220 TString histType = "4R";
221 if (fUseVtxAxis == 1)
223 else if (fUseVtxAxis == 2)
225 if (fCourseCentralityBinning)
227 fHistos = new AliUEHistograms("AliUEHistogramsSame", histType);
228 fHistosMixed = new AliUEHistograms("AliUEHistogramsMixed", histType);
230 fHistos->SetSelectCharge(fSelectCharge);
231 fHistosMixed->SetSelectCharge(fSelectCharge);
233 fHistos->SetSelectTriggerCharge(fTriggerSelectCharge);
234 fHistosMixed->SetSelectTriggerCharge(fTriggerSelectCharge);
236 fHistos->SetTriggerRestrictEta(fTriggerRestrictEta);
237 fHistosMixed->SetTriggerRestrictEta(fTriggerRestrictEta);
239 fHistos->SetOnlyOneEtaSide(fOnlyOneEtaSide);
240 fHistosMixed->SetOnlyOneEtaSide(fOnlyOneEtaSide);
242 fHistos->SetEtaOrdering(fEtaOrdering);
243 fHistosMixed->SetEtaOrdering(fEtaOrdering);
245 fHistos->SetPairCuts(fCutConversions, fCutResonances);
246 fHistosMixed->SetPairCuts(fCutConversions, fCutResonances);
248 if (fEfficiencyCorrection)
250 fHistos->SetEfficiencyCorrection(fEfficiencyCorrection);
251 fHistosMixed->SetEfficiencyCorrection((THnF*) fEfficiencyCorrection->Clone());
254 // add histograms to list
255 fListOfHistos->Add(fHistos);
256 fListOfHistos->Add(fHistosMixed);
258 fListOfHistos->Add(new TH2F("trackletsVsV0Cent", ";L1 clusters;v0 centrality", 100, -0.5, 9999.5, 101, 0, 101));
259 fListOfHistos->Add(new TH2F("processIDs", ";#Delta#phi;process id", 100, -0.5 * TMath::Pi(), 1.5 * TMath::Pi(), kPNoProcess + 1, -0.5, kPNoProcess + 0.5));
260 fListOfHistos->Add(new TH1F("eventStat", ";;events", 4, -0.5, 3.5));
261 fListOfHistos->Add(new TH2F("mixedDist", ";centrality;tracks;events", 101, 0, 101, 200, 0, fMixingTracks * 1.5));
262 fListOfHistos->Add(new TH1F("pids", ";pdg;tracks", 2001, -1000.5, 1000.5));
263 fListOfHistos->Add(new TH2F("referenceMultiplicity", ";centrality;tracks;events", 101, 0, 101, 200, 0, 200));
265 PostData(0,fListOfHistos);
267 // Add task configuration to output list
271 Int_t trackDepth = fMixingTracks;
272 Int_t poolsize = 1000; // Maximum number of events, ignored in the present implemented of AliEventPoolManager
274 Int_t nCentralityBins = fHistos->GetUEHist(2)->GetEventHist()->GetNBins(1);
275 Double_t* centralityBins = (Double_t*) fHistos->GetUEHist(2)->GetEventHist()->GetAxis(1, 0)->GetXbins()->GetArray();
277 const Int_t kNZvtxBins = 10+(1+10)*4;
278 // bins for further buffers are shifted by 100 cm
279 Double_t vertexBins[kNZvtxBins+1] = { -10, -8, -6, -4, -2, 0, 2, 4, 6, 8, 10,
280 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110,
281 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210,
282 290, 292, 294, 296, 298, 300, 302, 304, 306, 308, 310,
283 390, 392, 394, 396, 398, 400, 402, 404, 406, 408, 410 };
285 Int_t nZvtxBins = kNZvtxBins;
286 Double_t* zvtxbin = vertexBins;
288 if (fMode == 0 && fHistos->GetUEHist(2)->GetEventHist()->GetNVar() > 2)
290 nZvtxBins = fHistos->GetUEHist(2)->GetEventHist()->GetNBins(2);
291 zvtxbin = (Double_t*) fHistos->GetUEHist(2)->GetEventHist()->GetAxis(2, 0)->GetXbins()->GetArray();
294 fPoolMgr = new AliEventPoolManager(poolsize, trackDepth, nCentralityBins, centralityBins, nZvtxBins, zvtxbin);
297 //____________________________________________________________________
298 void AliAnalysisTaskPhiCorrelations::Exec(Option_t */*option*/)
300 // receive ESD pointer if we are not running AOD analysis
303 AliVEventHandler* handler = AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
304 if (handler && handler->InheritsFrom("AliESDInputHandler"))
305 fESD = ((AliESDInputHandler*)handler)->GetEvent();
313 fMcEvent = fMcHandler->MCEvent();
317 // array of MC particles
318 fArrayMC = dynamic_cast<TClonesArray*>(fAOD->FindListObject(AliAODMCParticle::StdBranchName()));
320 AliFatal("No array of MC particles found !!!");
323 AnalyseCorrectionMode();
325 else AnalyseDataMode();
328 /******************** ANALYSIS METHODS *****************************/
330 //____________________________________________________________________
331 void AliAnalysisTaskPhiCorrelations::AddSettingsTree()
333 //Write settings to output list
334 TTree *settingsTree = new TTree("UEAnalysisSettings","Analysis Settings in UE estimation");
335 settingsTree->Branch("fnTracksVertex", &fnTracksVertex,"nTracksVertex/I");
336 settingsTree->Branch("fZVertex", &fZVertex,"ZVertex/D");
337 //settingsTree->Branch("fCentralityMethod", fCentralityMethod.Data(),"CentralityMethod/C");
338 settingsTree->Branch("fTrackEtaCut", &fTrackEtaCut, "TrackEtaCut/D");
339 settingsTree->Branch("fOnlyOneEtaSide", &fOnlyOneEtaSide,"OnlyOneEtaSide/I");
340 settingsTree->Branch("fPtMin", &fPtMin, "PtMin/D");
341 settingsTree->Branch("fFilterBit", &fFilterBit,"FilterBit/I");
342 settingsTree->Branch("fSelectBit", &fSelectBit,"EventSelectionBit/I");
343 settingsTree->Branch("fUseChargeHadrons", &fUseChargeHadrons,"UseChHadrons/O");
344 settingsTree->Branch("fSelectCharge", &fSelectCharge,"SelectCharge/I");
345 settingsTree->Branch("fTriggerSelectCharge", &fTriggerSelectCharge,"TriggerSelectCharge/I");
346 settingsTree->Branch("fTriggerRestrictEta", &fTriggerRestrictEta,"TriggerRestrictEta/D");
347 settingsTree->Branch("fEtaOrdering", &fEtaOrdering,"EtaOrdering/O");
348 settingsTree->Branch("fCutConversions", &fCutConversions,"CutConversions/O");
349 settingsTree->Branch("fCutResonances", &fCutResonances,"CutResonances/O");
350 settingsTree->Branch("fFillpT", &fFillpT,"FillpT/O");
351 settingsTree->Branch("fMixingTracks", &fMixingTracks,"MixingTracks/I");
352 settingsTree->Branch("fSkipTrigger", &fSkipTrigger,"SkipTrigger/O");
353 settingsTree->Branch("fInjectedSignals", &fInjectedSignals,"SkipTrigger/O");
354 settingsTree->Branch("fRejectCentralityOutliers", &fRejectCentralityOutliers,"RejectCentralityOutliers/O");
356 settingsTree->Fill();
357 fListOfHistos->Add(settingsTree);
360 //____________________________________________________________________
361 void AliAnalysisTaskPhiCorrelations::AnalyseCorrectionMode()
363 // Run the analysis on MC to get the correction maps
366 if ( fDebug > 3 ) AliInfo( " Processing event in Corrections mode ..." );
368 Double_t centrality = 0;
370 if (fCentralityMethod.Length() > 0)
372 AliCentrality *centralityObj = 0;
374 centralityObj = fAOD->GetHeader()->GetCentralityP();
376 centralityObj = fESD->GetCentrality();
380 centrality = centralityObj->GetCentralityPercentileUnchecked(fCentralityMethod);
381 AliInfo(Form("Centrality is %f", centrality));
385 Printf("WARNING: Centrality object is 0");
390 // Support for ESD and AOD based analysis
391 AliVEvent* inputEvent = fAOD;
399 fHistos->SetRunNumber(inputEvent->GetRunNumber());
400 bSign = (inputEvent->GetMagneticField() > 0) ? 1 : -1;
403 TObject* mc = fArrayMC;
408 fHistos->FillEvent(centrality, -1);
413 // Only consider MC events within the vtx-z region used also as cut on the reconstructed vertex
414 TObject* vertexSupplier = fMcEvent;
416 vertexSupplier = fAOD->FindListObject(AliAODMCHeader::StdBranchName());
418 if (!fAnalyseUE->VertexSelection(vertexSupplier, 0, fZVertex))
423 zVtx = ((AliAODMCHeader*) vertexSupplier)->GetVtxZ();
425 zVtx = fMcEvent->GetPrimaryVertex()->GetZ();
430 // For productions with injected signals, figure out above which label to skip particles/tracks
431 Int_t skipParticlesAbove = 0;
432 if (fInjectedSignals)
434 AliGenEventHeader* eventHeader = 0;
440 AliHeader* header = (AliHeader*) fMcEvent->Header();
442 AliFatal("fInjectedSignals set but no MC header found");
444 AliGenCocktailEventHeader* cocktailHeader = dynamic_cast<AliGenCocktailEventHeader*> (header->GenEventHeader());
448 AliFatal("fInjectedSignals set but no MC cocktail header found");
451 headers = cocktailHeader->GetHeaders()->GetEntries();
452 eventHeader = dynamic_cast<AliGenEventHeader*> (cocktailHeader->GetHeaders()->First());
457 AliAODMCHeader* header = (AliAODMCHeader*) fAOD->GetList()->FindObject(AliAODMCHeader::StdBranchName());
459 AliFatal("fInjectedSignals set but no MC header found");
461 headers = header->GetNCocktailHeaders();
462 eventHeader = header->GetCocktailHeader(0);
467 // We avoid AliFatal here, because the AOD productions sometimes have events where the MC header is missing
468 // (due to unreadable Kinematics) and we don't want to loose the whole job because of a few events
469 AliError("First event header not found. Skipping this event.");
470 fHistos->FillEvent(centrality, AliUEHist::kCFStepAnaTopology);
474 skipParticlesAbove = eventHeader->NProduced();
475 AliInfo(Form("Injected signals in this event (%d headers). Keeping events of %s. Will skip particles/tracks above %d.", headers, eventHeader->ClassName(), skipParticlesAbove));
479 TObjArray* tmpList = fAnalyseUE->GetAcceptedParticles(mc, 0, kTRUE, -1, kTRUE);
480 if (fInjectedSignals)
481 fAnalyseUE->RemoveInjectedSignals(tmpList, mc, skipParticlesAbove);
482 TObjArray* tracksMC = CloneAndReduceTrackList(tmpList);
488 for (Int_t i=0; i<fArrayMC->GetEntriesFast(); i++)
489 ((TH1F*) fListOfHistos->FindObject("pids"))->Fill(((AliAODMCParticle*) fArrayMC->At(i))->PdgCode());
493 for (Int_t i=0; i<fMcEvent->GetNumberOfTracks(); i++)
494 ((TH1F*) fListOfHistos->FindObject("pids"))->Fill(fMcEvent->GetTrack(i)->PdgCode());
501 // (MC-true all particles)
503 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepAll, tracksMC, 0, weight);
508 AliEventPool* pool = fPoolMgr->GetEventPool(centrality, zVtx);
510 if (pool->IsReady() || pool->NTracksInPool() > fMixingTracks / 10 || pool->GetCurrentNEvents() >= 5)
511 for (Int_t jMix=0; jMix<pool->GetCurrentNEvents(); jMix++)
512 fHistosMixed->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepAll, tracksMC, pool->GetEvent(jMix), 1.0 / pool->GetCurrentNEvents(), (jMix == 0));
513 pool->UpdatePool(CloneAndReduceTrackList(tracksMC));
516 // Printf("trigger: %d", ((AliInputEventHandler*)fInputHandler)->IsEventSelected());
518 // Trigger selection ************************************************
519 if (!fFillOnlyStep0 && (fSkipTrigger || fAnalyseUE->TriggerSelection(fInputHandler)))
521 // (MC-true all particles)
523 if (!fReduceMemoryFootprint)
524 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepTriggered, tracksMC, 0, weight);
526 fHistos->FillEvent(centrality, AliUEHist::kCFStepTriggered);
529 AliFatal("UNEXPECTED: inputEvent is 0. Trigger selection should have failed");
533 // Vertex selection *************************************************
534 if (fAnalyseUE->VertexSelection(inputEvent, fnTracksVertex, fZVertex))
536 // fill here for tracking efficiency
537 // loop over particle species
539 for (Int_t particleSpecies = 0; particleSpecies < 4; particleSpecies++)
541 TObjArray* primMCParticles = fAnalyseUE->GetAcceptedParticles(mc, 0x0, kTRUE, particleSpecies, kTRUE);
542 TObjArray* primRecoTracksMatched = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kTRUE, particleSpecies, kTRUE);
543 TObjArray* allRecoTracksMatched = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kFALSE, particleSpecies, kTRUE);
545 if (fInjectedSignals)
547 fAnalyseUE->RemoveInjectedSignals(primMCParticles, mc, skipParticlesAbove);
548 fAnalyseUE->RemoveInjectedSignals(primRecoTracksMatched, mc, skipParticlesAbove);
549 fAnalyseUE->RemoveInjectedSignals(allRecoTracksMatched, mc, skipParticlesAbove);
552 fHistos->FillTrackingEfficiency(primMCParticles, primRecoTracksMatched, allRecoTracksMatched, 0, particleSpecies, centrality, zVtx);
554 // Printf("%d --> %d %d %d", particleSpecies, primMCParticles->GetEntries(), primRecoTracksMatched->GetEntries(), allRecoTracksMatched->GetEntries());
556 delete primMCParticles;
557 delete primRecoTracksMatched;
558 delete allRecoTracksMatched;
560 TObjArray* fakeParticles = fAnalyseUE->GetFakeParticles(inputEvent, mc, kFALSE, -1, kTRUE);
561 if (fInjectedSignals)
563 fAnalyseUE->RemoveInjectedSignals((TObjArray*) fakeParticles->At(0), mc, skipParticlesAbove);
564 fAnalyseUE->RemoveInjectedSignals((TObjArray*) fakeParticles->At(1), mc, skipParticlesAbove);
566 fHistos->FillTrackingEfficiency(0, 0, 0, (TObjArray*) fakeParticles->At(2), -1, centrality, zVtx);
567 fHistos->FillFakePt(fakeParticles, centrality);
568 // Printf(">>>>> %d %d %d fakes", ((TObjArray*) fakeParticles->At(0))->GetEntriesFast(), ((TObjArray*) fakeParticles->At(1))->GetEntriesFast(), ((TObjArray*) fakeParticles->At(2))->GetEntriesFast());
569 delete fakeParticles;
571 // (MC-true all particles)
573 if (!fReduceMemoryFootprint)
574 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepVertex, tracksMC, 0, weight);
576 fHistos->FillEvent(centrality, AliUEHist::kCFStepVertex);
578 // Get MC primaries that match reconstructed track
579 TObjArray* tracksRecoMatchedPrim = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kTRUE, -1, kTRUE);
580 if (fInjectedSignals)
581 fAnalyseUE->RemoveInjectedSignals(tracksRecoMatchedPrim, mc, skipParticlesAbove);
583 // (RECO-matched (quantities from MC particle) primary particles)
585 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepTrackedOnlyPrim, tracksRecoMatchedPrim, 0, weight);
590 AliEventPool* pool = fPoolMgr->GetEventPool(centrality, zVtx + 200);
592 if (pool->IsReady() || pool->NTracksInPool() > fMixingTracks / 10 || pool->GetCurrentNEvents() >= 5)
593 for (Int_t jMix=0; jMix<pool->GetCurrentNEvents(); jMix++)
594 fHistosMixed->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepTrackedOnlyPrim, tracksRecoMatchedPrim, pool->GetEvent(jMix), 1.0 / pool->GetCurrentNEvents(), (jMix == 0));
595 pool->UpdatePool(CloneAndReduceTrackList(tracksRecoMatchedPrim));
598 // Get MC primaries + secondaries that match reconstructed track
599 TObjArray* tracksRecoMatchedAll = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kFALSE, -1, kTRUE);
600 if (fInjectedSignals)
601 fAnalyseUE->RemoveInjectedSignals(tracksRecoMatchedAll, mc, skipParticlesAbove);
603 // (RECO-matched (quantities from MC particle) all particles)
605 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepTracked, tracksRecoMatchedAll, 0, weight);
610 AliEventPool* pool = fPoolMgr->GetEventPool(centrality, zVtx + 300);
612 if (pool->IsReady() || pool->NTracksInPool() > fMixingTracks / 10 || pool->GetCurrentNEvents() >= 5)
613 for (Int_t jMix=0; jMix<pool->GetCurrentNEvents(); jMix++)
614 fHistosMixed->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepTracked, tracksRecoMatchedAll, pool->GetEvent(jMix), 1.0 / pool->GetCurrentNEvents(), (jMix == 0));
615 pool->UpdatePool(CloneAndReduceTrackList(tracksRecoMatchedAll));
619 TObjArray* tracks = fAnalyseUE->GetAcceptedParticles(inputEvent, 0, kTRUE, -1, kTRUE);
620 if (fInjectedSignals)
621 fAnalyseUE->RemoveInjectedSignals(tracks, mc, skipParticlesAbove);
626 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepReconstructed, tracks, 0, weight);
628 // two track cut, STEP 8
629 if (fTwoTrackEfficiencyCut > 0)
630 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepBiasStudy, tracks, 0, weight, kTRUE, kTRUE, bSign, fTwoTrackEfficiencyCut);
632 // apply correction efficiency, STEP 10
633 if (fEfficiencyCorrection)
635 // with or without two track efficiency depending on if fTwoTrackEfficiencyCut is set
636 Bool_t twoTrackCut = (fTwoTrackEfficiencyCut > 0);
638 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepCorrected, tracks, 0, weight, kTRUE, twoTrackCut, bSign, fTwoTrackEfficiencyCut, kTRUE);
644 AliEventPool* pool2 = fPoolMgr->GetEventPool(centrality, zVtx + 100);
645 //pool2->PrintInfo();
646 if (pool2->IsReady() || pool2->NTracksInPool() > fMixingTracks / 10 || pool2->GetCurrentNEvents() >= 5)
648 for (Int_t jMix=0; jMix<pool2->GetCurrentNEvents(); jMix++)
652 fHistosMixed->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepReconstructed, tracks, pool2->GetEvent(jMix), 1.0 / pool2->GetCurrentNEvents(), (jMix == 0));
654 // two track cut, STEP 8
655 if (fTwoTrackEfficiencyCut > 0)
656 fHistosMixed->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepBiasStudy, tracks, pool2->GetEvent(jMix), 1.0 / pool2->GetCurrentNEvents(), (jMix == 0), kTRUE, bSign, fTwoTrackEfficiencyCut);
658 // apply correction efficiency, STEP 10
659 if (fEfficiencyCorrection)
661 // with or without two track efficiency depending on if fTwoTrackEfficiencyCut is set
662 Bool_t twoTrackCut = (fTwoTrackEfficiencyCut > 0);
664 fHistosMixed->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepCorrected, tracks, pool2->GetEvent(jMix), 1.0 / pool2->GetCurrentNEvents(), (jMix == 0), twoTrackCut, bSign, fTwoTrackEfficiencyCut, kTRUE);
668 pool2->UpdatePool(CloneAndReduceTrackList(tracks));
671 if (0 && !fReduceMemoryFootprint)
673 // make list of secondaries (matched with MC)
674 TObjArray* tracksRecoMatchedSecondaries = new TObjArray;
675 for (Int_t i=0; i<tracksRecoMatchedAll->GetEntriesFast(); i++)
676 if (((AliAODMCParticle*)tracksRecoMatchedAll->At(i))->IsPhysicalPrimary() == kFALSE)
677 tracksRecoMatchedSecondaries->Add(tracksRecoMatchedAll->At(i));
679 // Study: Use only secondaries as trigger particles and plot the correlation vs. all particles; store in step 9
680 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepBiasStudy2, tracksRecoMatchedSecondaries, tracksRecoMatchedAll, weight);
682 // Study: Use only primaries as trigger particles and plot the correlation vs. secondaries; store in step 8
683 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepBiasStudy, tracksRecoMatchedPrim, tracksRecoMatchedSecondaries, weight);
685 // plot delta phi vs process id of secondaries
686 // trigger particles: primaries in 4 < pT < 10
687 // associated particles: secondaries in 1 < pT < 10
689 for (Int_t i=0; i<tracksRecoMatchedPrim->GetEntriesFast(); i++)
691 AliVParticle* triggerParticle = (AliVParticle*) tracksRecoMatchedPrim->At(i);
693 if (triggerParticle->Pt() < 4 || triggerParticle->Pt() > 10)
696 for (Int_t j=0; j<tracksRecoMatchedSecondaries->GetEntriesFast(); j++)
698 AliAODMCParticle* particle = (AliAODMCParticle*) tracksRecoMatchedSecondaries->At(j);
700 if (particle->Pt() < 1 || particle->Pt() > 10)
703 if (particle->Pt() > triggerParticle->Pt())
706 Double_t deltaPhi = triggerParticle->Phi() - particle->Phi();
707 if (deltaPhi > 1.5 * TMath::Pi())
708 deltaPhi -= TMath::TwoPi();
709 if (deltaPhi < -0.5 * TMath::Pi())
710 deltaPhi += TMath::TwoPi();
712 Int_t processID = fMcEvent->Stack()->Particle(particle->GetLabel())->GetUniqueID();
714 ((TH2F*) fListOfHistos->FindObject("processIDs"))->Fill(deltaPhi, processID);
718 delete tracksRecoMatchedSecondaries;
721 delete tracksRecoMatchedPrim;
722 delete tracksRecoMatchedAll;
730 //____________________________________________________________________
731 void AliAnalysisTaskPhiCorrelations::AnalyseDataMode()
734 // Run the analysis on DATA or MC to get raw distributions
736 if ( fDebug > 3 ) AliInfo( " Processing event in Data mode ..." );
738 ((TH1F*) fListOfHistos->FindObject("eventStat"))->Fill(0);
743 // skip not selected events here (the AOD is not updated for those)
744 if (!fSkipTrigger && !(fInputHandler->IsEventSelected() & fSelectBit))
747 // Support for ESD and AOD based analysis
748 AliVEvent* inputEvent = fAOD;
752 Double_t centrality = 0;
754 AliCentrality *centralityObj = 0;
755 if (fCentralityMethod.Length() > 0)
757 if (fCentralityMethod == "ZNA_MANUAL")
760 for(Int_t j = 0; j < 4; ++j) {
761 if (fESD->GetZDCData()->GetZDCTDCData(12,j) != 0) {
766 // Printf("%d %f", zna, fZNAtower[0]);
769 // code from Chiara O (23.10.12)
770 const Double_t *fZNAtower = fESD->GetZDCData()->GetZN2TowerEnergy();
771 Float_t znacut[4] = {681., 563., 413., 191.};
773 if(fZNAtower[0]>znacut[0]) centrality = 1;
774 else if(fZNAtower[0]>znacut[1]) centrality = 21;
775 else if(fZNAtower[0]>znacut[2]) centrality = 41;
776 else if(fZNAtower[0]>znacut[3]) centrality = 61;
777 else centrality = 81;
782 else if (fCentralityMethod == "TRACKS_MANUAL")
785 TObjArray* tracks = fAnalyseUE->GetAcceptedParticles(inputEvent, 0, kTRUE, -1, kTRUE);
786 centrality = tracks->GetEntriesFast();
789 // Printf("%d %f", tracks->GetEntriesFast(), centrality);
795 centralityObj = fAOD->GetHeader()->GetCentralityP();
797 centralityObj = fESD->GetCentrality();
800 centrality = centralityObj->GetCentralityPercentile(fCentralityMethod);
801 //centrality = centralityObj->GetCentralityPercentileUnchecked(fCentralityMethod);
810 if (fAOD->GetVZEROData())
813 for (Int_t i=0; i<64; i++)
814 multV0 += fAOD->GetVZEROData()->GetMultiplicity(i);
818 AliInfo("Rejecting event due to too small V0 multiplicity");
825 AliInfo(Form("Centrality is %f", centrality));
828 Float_t bSign = (inputEvent->GetMagneticField() > 0) ? 1 : -1;
830 fHistos->SetRunNumber(inputEvent->GetRunNumber());
832 // Fill the "event-counting-container", it is needed to get the number of events remaining after each event-selection cut
833 fHistos->FillEvent(centrality, AliUEHist::kCFStepAll);
835 // Trigger selection ************************************************
836 if (!fSkipTrigger && !fAnalyseUE->TriggerSelection(fInputHandler)) return;
838 // Fill the "event-counting-container", it is needed to get the number of events remaining after each event-selection cut
839 fHistos->FillEvent(centrality, AliUEHist::kCFStepTriggered);
841 // Vertex selection *************************************************
842 if(!fAnalyseUE->VertexSelection(inputEvent, fnTracksVertex, fZVertex)) return;
844 // Fill the "event-counting-container", it is needed to get the number of events remaining after each event-selection cut
845 fHistos->FillEvent(centrality, AliUEHist::kCFStepVertex);
848 if (centrality < 0 && !fCompareCentralities)
851 TObjArray* tracks = fAnalyseUE->GetAcceptedParticles(inputEvent, 0, kTRUE, -1, kTRUE);
853 // check for outlier in centrality vs number of tracks (rough constants extracted from correlation histgram)
854 Bool_t reject = kFALSE;
855 if (fRejectCentralityOutliers)
857 if (centrality > 40 && centrality <= 50 && tracks->GetEntriesFast() > 1160)
859 if (centrality > 50 && centrality <= 60 && tracks->GetEntriesFast() > 650)
861 if (centrality > 60 && centrality <= 70 && tracks->GetEntriesFast() > 370)
863 if (centrality > 70 && centrality <= 80 && tracks->GetEntriesFast() > 220)
865 if (centrality > 80 && centrality <= 90 && tracks->GetEntriesFast() > 130)
867 if (centrality > 90 && tracks->GetEntriesFast() > 75)
873 AliInfo(Form("Rejecting event due to centrality vs tracks correlation: %f %d", centrality, tracks->GetEntriesFast()));
874 fHistos->FillEvent(centrality, AliUEHist::kCFStepAnaTopology);
879 // reference multiplicity
880 Int_t referenceMultiplicity = -1;
882 referenceMultiplicity = AliESDtrackCuts::GetReferenceMultiplicity(fESD);
884 ((TH2F*) fListOfHistos->FindObject("referenceMultiplicity"))->Fill(centrality, referenceMultiplicity);
886 // create a list of reduced objects. This speeds up processing and reduces memory consumption for the event pool
887 TObjArray* tracksClone = CloneAndReduceTrackList(tracks);
890 //Printf("Accepted %d tracks", tracks->GetEntries());
892 const AliVVertex* vertex = inputEvent->GetPrimaryVertex();
893 Double_t zVtx = vertex->GetZ();
899 // fill two different centralities (syst study)
900 // the zvtx axis is used to distinguish the results of both centralities: configured centrality in zvtx = 0, SPD in zvtx = 2
901 if (fCompareCentralities)
904 // Fill containers at STEP 6 (reconstructed)
908 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepReconstructed, tracksClone, 0, weight, kTRUE, kFALSE, 0, 0.02, kTRUE);
910 ((TH1F*) fListOfHistos->FindObject("eventStat"))->Fill(1);
912 if (fTwoTrackEfficiencyCut > 0)
913 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepBiasStudy, tracksClone, 0, weight, kTRUE, kTRUE, bSign, fTwoTrackEfficiencyCut, kTRUE);
916 // fill second time with SPD centrality
917 if (fCompareCentralities && centralityObj)
919 centrality = centralityObj->GetCentralityPercentile("CL1");
920 if (centrality >= 0 && !fSkipStep6)
921 fHistos->FillCorrelations(centrality, 2, AliUEHist::kCFStepReconstructed, tracksClone, 0, weight, kTRUE, kFALSE, 0, 0.02, kTRUE);
928 // 1. First get an event pool corresponding in mult (cent) and
929 // zvertex to the current event. Once initialized, the pool
930 // should contain nMix (reduced) events. This routine does not
931 // pre-scan the chain. The first several events of every chain
932 // will be skipped until the needed pools are filled to the
933 // specified depth. If the pool categories are not too rare, this
934 // should not be a problem. If they are rare, you could lose
937 // 2. Collect the whole pool's content of tracks into one TObjArray
938 // (bgTracks), which is effectively a single background super-event.
940 // 3. The reduced and bgTracks arrays must both be passed into
941 // FillCorrelations(). Also nMix should be passed in, so a weight
942 // of 1./nMix can be applied.
944 AliEventPool* pool = fPoolMgr->GetEventPool(centrality, zVtx);
947 AliFatal(Form("No pool found for centrality = %f, zVtx = %f", centrality, zVtx));
951 if (pool->IsReady() || pool->NTracksInPool() > fMixingTracks / 10 || pool->GetCurrentNEvents() >= 5)
954 Int_t nMix = pool->GetCurrentNEvents();
955 // cout << "nMix = " << nMix << " tracks in pool = " << pool->NTracksInPool() << endl;
957 ((TH1F*) fListOfHistos->FindObject("eventStat"))->Fill(2);
958 ((TH2F*) fListOfHistos->FindObject("mixedDist"))->Fill(centrality, pool->NTracksInPool());
960 ((TH1F*) fListOfHistos->FindObject("eventStat"))->Fill(3);
962 // Fill mixed-event histos here
963 for (Int_t jMix=0; jMix<nMix; jMix++)
965 TObjArray* bgTracks = pool->GetEvent(jMix);
968 fHistosMixed->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepReconstructed, tracksClone, bgTracks, 1.0 / nMix, (jMix == 0), kFALSE, 0, 0.02, kTRUE);
970 if (fTwoTrackEfficiencyCut > 0)
971 fHistosMixed->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepBiasStudy, tracksClone, bgTracks, 1.0 / nMix, (jMix == 0), kTRUE, bSign, fTwoTrackEfficiencyCut, kTRUE);
975 // ownership is with the pool now
976 pool->UpdatePool(tracksClone);
983 TObjArray* AliAnalysisTaskPhiCorrelations::CloneAndReduceTrackList(TObjArray* tracks)
985 // clones a track list by using AliDPhiBasicParticle which uses much less memory (used for event mixing)
987 TObjArray* tracksClone = new TObjArray;
988 tracksClone->SetOwner(kTRUE);
990 for (Int_t i=0; i<tracks->GetEntriesFast(); i++)
992 AliVParticle* particle = (AliVParticle*) tracks->At(i);
993 tracksClone->Add(new AliDPhiBasicParticle(particle->Eta(), particle->Phi(), particle->Pt(), particle->Charge()));
999 //____________________________________________________________________
1000 void AliAnalysisTaskPhiCorrelations::Initialize()
1003 fInputHandler = (AliInputEventHandler*)
1004 ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
1006 fMcHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());