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 Int_t nZvtxBins = 7+(1+7)*4;
278 // bins for further buffers are shifted by 100 cm
279 Double_t vertexBins[] = { -7, -5, -3, -1, 1, 3, 5, 7,
280 93, 95, 97, 99, 101, 103, 105, 107,
281 193, 195, 197, 199, 201, 203, 205, 207,
282 293, 295, 297, 299, 301, 303, 305, 307,
283 393, 395, 397, 399, 401, 403, 405, 407 };
284 Double_t* zvtxbin = vertexBins;
286 if (fMode == 0 && fHistos->GetUEHist(2)->GetEventHist()->GetNVar() > 2)
288 nZvtxBins = fHistos->GetUEHist(2)->GetEventHist()->GetNBins(2);
289 zvtxbin = (Double_t*) fHistos->GetUEHist(2)->GetEventHist()->GetAxis(2, 0)->GetXbins()->GetArray();
292 fPoolMgr = new AliEventPoolManager(poolsize, trackDepth, nCentralityBins, centralityBins, nZvtxBins, zvtxbin);
295 //____________________________________________________________________
296 void AliAnalysisTaskPhiCorrelations::Exec(Option_t */*option*/)
298 // receive ESD pointer if we are not running AOD analysis
301 AliVEventHandler* handler = AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
302 if (handler && handler->InheritsFrom("AliESDInputHandler"))
303 fESD = ((AliESDInputHandler*)handler)->GetEvent();
311 fMcEvent = fMcHandler->MCEvent();
315 // array of MC particles
316 fArrayMC = dynamic_cast<TClonesArray*>(fAOD->FindListObject(AliAODMCParticle::StdBranchName()));
318 AliFatal("No array of MC particles found !!!");
321 AnalyseCorrectionMode();
323 else AnalyseDataMode();
326 /******************** ANALYSIS METHODS *****************************/
328 //____________________________________________________________________
329 void AliAnalysisTaskPhiCorrelations::AddSettingsTree()
331 //Write settings to output list
332 TTree *settingsTree = new TTree("UEAnalysisSettings","Analysis Settings in UE estimation");
333 settingsTree->Branch("fnTracksVertex", &fnTracksVertex,"nTracksVertex/I");
334 settingsTree->Branch("fZVertex", &fZVertex,"ZVertex/D");
335 //settingsTree->Branch("fCentralityMethod", fCentralityMethod.Data(),"CentralityMethod/C");
336 settingsTree->Branch("fTrackEtaCut", &fTrackEtaCut, "TrackEtaCut/D");
337 settingsTree->Branch("fOnlyOneEtaSide", &fOnlyOneEtaSide,"OnlyOneEtaSide/I");
338 settingsTree->Branch("fPtMin", &fPtMin, "PtMin/D");
339 settingsTree->Branch("fFilterBit", &fFilterBit,"FilterBit/I");
340 settingsTree->Branch("fSelectBit", &fSelectBit,"EventSelectionBit/I");
341 settingsTree->Branch("fUseChargeHadrons", &fUseChargeHadrons,"UseChHadrons/O");
342 settingsTree->Branch("fSelectCharge", &fSelectCharge,"SelectCharge/I");
343 settingsTree->Branch("fTriggerSelectCharge", &fTriggerSelectCharge,"TriggerSelectCharge/I");
344 settingsTree->Branch("fTriggerRestrictEta", &fTriggerRestrictEta,"TriggerRestrictEta/D");
345 settingsTree->Branch("fEtaOrdering", &fEtaOrdering,"EtaOrdering/O");
346 settingsTree->Branch("fCutConversions", &fCutConversions,"CutConversions/O");
347 settingsTree->Branch("fCutResonances", &fCutResonances,"CutResonances/O");
348 settingsTree->Branch("fFillpT", &fFillpT,"FillpT/O");
349 settingsTree->Branch("fMixingTracks", &fMixingTracks,"MixingTracks/I");
350 settingsTree->Branch("fSkipTrigger", &fSkipTrigger,"SkipTrigger/O");
351 settingsTree->Branch("fInjectedSignals", &fInjectedSignals,"SkipTrigger/O");
352 settingsTree->Branch("fRejectCentralityOutliers", &fRejectCentralityOutliers,"RejectCentralityOutliers/O");
354 settingsTree->Fill();
355 fListOfHistos->Add(settingsTree);
358 //____________________________________________________________________
359 void AliAnalysisTaskPhiCorrelations::AnalyseCorrectionMode()
361 // Run the analysis on MC to get the correction maps
364 if ( fDebug > 3 ) AliInfo( " Processing event in Corrections mode ..." );
366 Double_t centrality = 0;
368 if (fCentralityMethod.Length() > 0)
370 AliCentrality *centralityObj = 0;
372 centralityObj = fAOD->GetHeader()->GetCentralityP();
374 centralityObj = fESD->GetCentrality();
378 centrality = centralityObj->GetCentralityPercentileUnchecked(fCentralityMethod);
379 AliInfo(Form("Centrality is %f", centrality));
383 Printf("WARNING: Centrality object is 0");
388 // Support for ESD and AOD based analysis
389 AliVEvent* inputEvent = fAOD;
397 fHistos->SetRunNumber(inputEvent->GetRunNumber());
398 bSign = (inputEvent->GetMagneticField() > 0) ? 1 : -1;
401 TObject* mc = fArrayMC;
406 fHistos->FillEvent(centrality, -1);
411 // Only consider MC events within the vtx-z region used also as cut on the reconstructed vertex
412 TObject* vertexSupplier = fMcEvent;
414 vertexSupplier = fAOD->FindListObject(AliAODMCHeader::StdBranchName());
416 if (!fAnalyseUE->VertexSelection(vertexSupplier, 0, fZVertex))
421 zVtx = ((AliAODMCHeader*) vertexSupplier)->GetVtxZ();
423 zVtx = fMcEvent->GetPrimaryVertex()->GetZ();
428 // For productions with injected signals, figure out above which label to skip particles/tracks
429 Int_t skipParticlesAbove = 0;
430 if (fInjectedSignals)
432 AliGenEventHeader* eventHeader = 0;
438 AliHeader* header = (AliHeader*) fMcEvent->Header();
440 AliFatal("fInjectedSignals set but no MC header found");
442 AliGenCocktailEventHeader* cocktailHeader = dynamic_cast<AliGenCocktailEventHeader*> (header->GenEventHeader());
446 AliFatal("fInjectedSignals set but no MC cocktail header found");
449 headers = cocktailHeader->GetHeaders()->GetEntries();
450 eventHeader = dynamic_cast<AliGenEventHeader*> (cocktailHeader->GetHeaders()->First());
455 AliAODMCHeader* header = (AliAODMCHeader*) fAOD->GetList()->FindObject(AliAODMCHeader::StdBranchName());
457 AliFatal("fInjectedSignals set but no MC header found");
459 headers = header->GetNCocktailHeaders();
460 eventHeader = header->GetCocktailHeader(0);
465 // We avoid AliFatal here, because the AOD productions sometimes have events where the MC header is missing
466 // (due to unreadable Kinematics) and we don't want to loose the whole job because of a few events
467 AliError("First event header not found. Skipping this event.");
468 fHistos->FillEvent(centrality, AliUEHist::kCFStepAnaTopology);
472 skipParticlesAbove = eventHeader->NProduced();
473 AliInfo(Form("Injected signals in this event (%d headers). Keeping events of %s. Will skip particles/tracks above %d.", headers, eventHeader->ClassName(), skipParticlesAbove));
477 TObjArray* tmpList = fAnalyseUE->GetAcceptedParticles(mc, 0, kTRUE, -1, kTRUE);
478 if (fInjectedSignals)
479 fAnalyseUE->RemoveInjectedSignals(tmpList, mc, skipParticlesAbove);
480 TObjArray* tracksMC = CloneAndReduceTrackList(tmpList);
486 for (Int_t i=0; i<fArrayMC->GetEntriesFast(); i++)
487 ((TH1F*) fListOfHistos->FindObject("pids"))->Fill(((AliAODMCParticle*) fArrayMC->At(i))->PdgCode());
491 for (Int_t i=0; i<fMcEvent->GetNumberOfTracks(); i++)
492 ((TH1F*) fListOfHistos->FindObject("pids"))->Fill(fMcEvent->GetTrack(i)->PdgCode());
499 // (MC-true all particles)
501 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepAll, tracksMC, 0, weight);
506 AliEventPool* pool = fPoolMgr->GetEventPool(centrality, zVtx);
508 if (pool->IsReady() || pool->NTracksInPool() > fMixingTracks / 10 || pool->GetCurrentNEvents() >= 5)
509 for (Int_t jMix=0; jMix<pool->GetCurrentNEvents(); jMix++)
510 fHistosMixed->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepAll, tracksMC, pool->GetEvent(jMix), 1.0 / pool->GetCurrentNEvents(), (jMix == 0));
511 pool->UpdatePool(CloneAndReduceTrackList(tracksMC));
514 // Printf("trigger: %d", ((AliInputEventHandler*)fInputHandler)->IsEventSelected());
516 // Trigger selection ************************************************
517 if (!fFillOnlyStep0 && (fSkipTrigger || fAnalyseUE->TriggerSelection(fInputHandler)))
519 // (MC-true all particles)
521 if (!fReduceMemoryFootprint)
522 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepTriggered, tracksMC, 0, weight);
524 fHistos->FillEvent(centrality, AliUEHist::kCFStepTriggered);
527 AliFatal("UNEXPECTED: inputEvent is 0. Trigger selection should have failed");
531 // Vertex selection *************************************************
532 if (fAnalyseUE->VertexSelection(inputEvent, fnTracksVertex, fZVertex))
534 // fill here for tracking efficiency
535 // loop over particle species
537 for (Int_t particleSpecies = 0; particleSpecies < 4; particleSpecies++)
539 TObjArray* primMCParticles = fAnalyseUE->GetAcceptedParticles(mc, 0x0, kTRUE, particleSpecies, kTRUE);
540 TObjArray* primRecoTracksMatched = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kTRUE, particleSpecies, kTRUE);
541 TObjArray* allRecoTracksMatched = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kFALSE, particleSpecies, kTRUE);
543 if (fInjectedSignals)
545 fAnalyseUE->RemoveInjectedSignals(primMCParticles, mc, skipParticlesAbove);
546 fAnalyseUE->RemoveInjectedSignals(primRecoTracksMatched, mc, skipParticlesAbove);
547 fAnalyseUE->RemoveInjectedSignals(allRecoTracksMatched, mc, skipParticlesAbove);
550 fHistos->FillTrackingEfficiency(primMCParticles, primRecoTracksMatched, allRecoTracksMatched, 0, particleSpecies, centrality, zVtx);
552 // Printf("%d --> %d %d %d", particleSpecies, primMCParticles->GetEntries(), primRecoTracksMatched->GetEntries(), allRecoTracksMatched->GetEntries());
554 delete primMCParticles;
555 delete primRecoTracksMatched;
556 delete allRecoTracksMatched;
558 TObjArray* fakeParticles = fAnalyseUE->GetFakeParticles(inputEvent, mc, kFALSE, -1, kTRUE);
559 if (fInjectedSignals)
561 fAnalyseUE->RemoveInjectedSignals((TObjArray*) fakeParticles->At(0), mc, skipParticlesAbove);
562 fAnalyseUE->RemoveInjectedSignals((TObjArray*) fakeParticles->At(1), mc, skipParticlesAbove);
564 fHistos->FillTrackingEfficiency(0, 0, 0, (TObjArray*) fakeParticles->At(2), -1, centrality, zVtx);
565 fHistos->FillFakePt(fakeParticles, centrality);
566 // Printf(">>>>> %d %d %d fakes", ((TObjArray*) fakeParticles->At(0))->GetEntriesFast(), ((TObjArray*) fakeParticles->At(1))->GetEntriesFast(), ((TObjArray*) fakeParticles->At(2))->GetEntriesFast());
567 delete fakeParticles;
569 // (MC-true all particles)
571 if (!fReduceMemoryFootprint)
572 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepVertex, tracksMC, 0, weight);
574 fHistos->FillEvent(centrality, AliUEHist::kCFStepVertex);
576 // Get MC primaries that match reconstructed track
577 TObjArray* tracksRecoMatchedPrim = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kTRUE, -1, kTRUE);
578 if (fInjectedSignals)
579 fAnalyseUE->RemoveInjectedSignals(tracksRecoMatchedPrim, mc, skipParticlesAbove);
581 // (RECO-matched (quantities from MC particle) primary particles)
583 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepTrackedOnlyPrim, tracksRecoMatchedPrim, 0, weight);
588 AliEventPool* pool = fPoolMgr->GetEventPool(centrality, zVtx + 200);
590 if (pool->IsReady() || pool->NTracksInPool() > fMixingTracks / 10 || pool->GetCurrentNEvents() >= 5)
591 for (Int_t jMix=0; jMix<pool->GetCurrentNEvents(); jMix++)
592 fHistosMixed->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepTrackedOnlyPrim, tracksRecoMatchedPrim, pool->GetEvent(jMix), 1.0 / pool->GetCurrentNEvents(), (jMix == 0));
593 pool->UpdatePool(CloneAndReduceTrackList(tracksRecoMatchedPrim));
596 // Get MC primaries + secondaries that match reconstructed track
597 TObjArray* tracksRecoMatchedAll = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kFALSE, -1, kTRUE);
598 if (fInjectedSignals)
599 fAnalyseUE->RemoveInjectedSignals(tracksRecoMatchedAll, mc, skipParticlesAbove);
601 // (RECO-matched (quantities from MC particle) all particles)
603 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepTracked, tracksRecoMatchedAll, 0, weight);
608 AliEventPool* pool = fPoolMgr->GetEventPool(centrality, zVtx + 300);
610 if (pool->IsReady() || pool->NTracksInPool() > fMixingTracks / 10 || pool->GetCurrentNEvents() >= 5)
611 for (Int_t jMix=0; jMix<pool->GetCurrentNEvents(); jMix++)
612 fHistosMixed->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepTracked, tracksRecoMatchedAll, pool->GetEvent(jMix), 1.0 / pool->GetCurrentNEvents(), (jMix == 0));
613 pool->UpdatePool(CloneAndReduceTrackList(tracksRecoMatchedAll));
617 TObjArray* tracks = fAnalyseUE->GetAcceptedParticles(inputEvent, 0, kTRUE, -1, kTRUE);
618 if (fInjectedSignals)
619 fAnalyseUE->RemoveInjectedSignals(tracks, mc, skipParticlesAbove);
624 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepReconstructed, tracks, 0, weight);
626 // two track cut, STEP 8
627 if (fTwoTrackEfficiencyCut > 0)
628 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepBiasStudy, tracks, 0, weight, kTRUE, kTRUE, bSign, fTwoTrackEfficiencyCut);
630 // apply correction efficiency, STEP 10
631 if (fEfficiencyCorrection)
633 // with or without two track efficiency depending on if fTwoTrackEfficiencyCut is set
634 Bool_t twoTrackCut = (fTwoTrackEfficiencyCut > 0);
636 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepCorrected, tracks, 0, weight, kTRUE, twoTrackCut, bSign, fTwoTrackEfficiencyCut, kTRUE);
642 AliEventPool* pool2 = fPoolMgr->GetEventPool(centrality, zVtx + 100);
643 //pool2->PrintInfo();
644 if (pool2->IsReady() || pool2->NTracksInPool() > fMixingTracks / 10 || pool2->GetCurrentNEvents() >= 5)
646 for (Int_t jMix=0; jMix<pool2->GetCurrentNEvents(); jMix++)
650 fHistosMixed->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepReconstructed, tracks, pool2->GetEvent(jMix), 1.0 / pool2->GetCurrentNEvents(), (jMix == 0));
652 // two track cut, STEP 8
653 if (fTwoTrackEfficiencyCut > 0)
654 fHistosMixed->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepBiasStudy, tracks, pool2->GetEvent(jMix), 1.0 / pool2->GetCurrentNEvents(), (jMix == 0), kTRUE, bSign, fTwoTrackEfficiencyCut);
656 // apply correction efficiency, STEP 10
657 if (fEfficiencyCorrection)
659 // with or without two track efficiency depending on if fTwoTrackEfficiencyCut is set
660 Bool_t twoTrackCut = (fTwoTrackEfficiencyCut > 0);
662 fHistosMixed->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepCorrected, tracks, pool2->GetEvent(jMix), 1.0 / pool2->GetCurrentNEvents(), (jMix == 0), twoTrackCut, bSign, fTwoTrackEfficiencyCut, kTRUE);
666 pool2->UpdatePool(CloneAndReduceTrackList(tracks));
669 if (0 && !fReduceMemoryFootprint)
671 // make list of secondaries (matched with MC)
672 TObjArray* tracksRecoMatchedSecondaries = new TObjArray;
673 for (Int_t i=0; i<tracksRecoMatchedAll->GetEntriesFast(); i++)
674 if (((AliAODMCParticle*)tracksRecoMatchedAll->At(i))->IsPhysicalPrimary() == kFALSE)
675 tracksRecoMatchedSecondaries->Add(tracksRecoMatchedAll->At(i));
677 // Study: Use only secondaries as trigger particles and plot the correlation vs. all particles; store in step 9
678 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepBiasStudy2, tracksRecoMatchedSecondaries, tracksRecoMatchedAll, weight);
680 // Study: Use only primaries as trigger particles and plot the correlation vs. secondaries; store in step 8
681 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepBiasStudy, tracksRecoMatchedPrim, tracksRecoMatchedSecondaries, weight);
683 // plot delta phi vs process id of secondaries
684 // trigger particles: primaries in 4 < pT < 10
685 // associated particles: secondaries in 1 < pT < 10
687 for (Int_t i=0; i<tracksRecoMatchedPrim->GetEntriesFast(); i++)
689 AliVParticle* triggerParticle = (AliVParticle*) tracksRecoMatchedPrim->At(i);
691 if (triggerParticle->Pt() < 4 || triggerParticle->Pt() > 10)
694 for (Int_t j=0; j<tracksRecoMatchedSecondaries->GetEntriesFast(); j++)
696 AliAODMCParticle* particle = (AliAODMCParticle*) tracksRecoMatchedSecondaries->At(j);
698 if (particle->Pt() < 1 || particle->Pt() > 10)
701 if (particle->Pt() > triggerParticle->Pt())
704 Double_t deltaPhi = triggerParticle->Phi() - particle->Phi();
705 if (deltaPhi > 1.5 * TMath::Pi())
706 deltaPhi -= TMath::TwoPi();
707 if (deltaPhi < -0.5 * TMath::Pi())
708 deltaPhi += TMath::TwoPi();
710 Int_t processID = fMcEvent->Stack()->Particle(particle->GetLabel())->GetUniqueID();
712 ((TH2F*) fListOfHistos->FindObject("processIDs"))->Fill(deltaPhi, processID);
716 delete tracksRecoMatchedSecondaries;
719 delete tracksRecoMatchedPrim;
720 delete tracksRecoMatchedAll;
728 //____________________________________________________________________
729 void AliAnalysisTaskPhiCorrelations::AnalyseDataMode()
732 // Run the analysis on DATA or MC to get raw distributions
734 if ( fDebug > 3 ) AliInfo( " Processing event in Data mode ..." );
736 ((TH1F*) fListOfHistos->FindObject("eventStat"))->Fill(0);
741 // skip not selected events here (the AOD is not updated for those)
742 if (!fSkipTrigger && !(fInputHandler->IsEventSelected() & fSelectBit))
745 // Support for ESD and AOD based analysis
746 AliVEvent* inputEvent = fAOD;
750 Double_t centrality = 0;
752 AliCentrality *centralityObj = 0;
753 if (fCentralityMethod.Length() > 0)
755 if (fCentralityMethod == "ZNA_MANUAL")
758 for(Int_t j = 0; j < 4; ++j) {
759 if (fESD->GetZDCData()->GetZDCTDCData(12,j) != 0) {
764 // Printf("%d %f", zna, fZNAtower[0]);
767 // code from Chiara O (23.10.12)
768 const Double_t *fZNAtower = fESD->GetZDCData()->GetZN2TowerEnergy();
769 Float_t znacut[4] = {681., 563., 413., 191.};
771 if(fZNAtower[0]>znacut[0]) centrality = 1;
772 else if(fZNAtower[0]>znacut[1]) centrality = 21;
773 else if(fZNAtower[0]>znacut[2]) centrality = 41;
774 else if(fZNAtower[0]>znacut[3]) centrality = 61;
775 else centrality = 81;
780 else if (fCentralityMethod == "TRACKS_MANUAL")
783 TObjArray* tracks = fAnalyseUE->GetAcceptedParticles(inputEvent, 0, kTRUE, -1, kTRUE);
784 centrality = tracks->GetEntriesFast();
787 // Printf("%d %f", tracks->GetEntriesFast(), centrality);
793 centralityObj = fAOD->GetHeader()->GetCentralityP();
795 centralityObj = fESD->GetCentrality();
798 centrality = centralityObj->GetCentralityPercentile(fCentralityMethod);
799 //centrality = centralityObj->GetCentralityPercentileUnchecked(fCentralityMethod);
808 if (fAOD->GetVZEROData())
811 for (Int_t i=0; i<64; i++)
812 multV0 += fAOD->GetVZEROData()->GetMultiplicity(i);
816 AliInfo("Rejecting event due to too small V0 multiplicity");
823 AliInfo(Form("Centrality is %f", centrality));
826 Float_t bSign = (inputEvent->GetMagneticField() > 0) ? 1 : -1;
828 fHistos->SetRunNumber(inputEvent->GetRunNumber());
830 // Fill the "event-counting-container", it is needed to get the number of events remaining after each event-selection cut
831 fHistos->FillEvent(centrality, AliUEHist::kCFStepAll);
833 // Trigger selection ************************************************
834 if (!fSkipTrigger && !fAnalyseUE->TriggerSelection(fInputHandler)) return;
836 // Fill the "event-counting-container", it is needed to get the number of events remaining after each event-selection cut
837 fHistos->FillEvent(centrality, AliUEHist::kCFStepTriggered);
839 // Vertex selection *************************************************
840 if(!fAnalyseUE->VertexSelection(inputEvent, fnTracksVertex, fZVertex)) return;
842 // Fill the "event-counting-container", it is needed to get the number of events remaining after each event-selection cut
843 fHistos->FillEvent(centrality, AliUEHist::kCFStepVertex);
846 if (centrality < 0 && !fCompareCentralities)
849 TObjArray* tracks = fAnalyseUE->GetAcceptedParticles(inputEvent, 0, kTRUE, -1, kTRUE);
851 // check for outlier in centrality vs number of tracks (rough constants extracted from correlation histgram)
852 Bool_t reject = kFALSE;
853 if (fRejectCentralityOutliers)
855 if (centrality > 40 && centrality <= 50 && tracks->GetEntriesFast() > 1160)
857 if (centrality > 50 && centrality <= 60 && tracks->GetEntriesFast() > 650)
859 if (centrality > 60 && centrality <= 70 && tracks->GetEntriesFast() > 370)
861 if (centrality > 70 && centrality <= 80 && tracks->GetEntriesFast() > 220)
863 if (centrality > 80 && centrality <= 90 && tracks->GetEntriesFast() > 130)
865 if (centrality > 90 && tracks->GetEntriesFast() > 75)
871 AliInfo(Form("Rejecting event due to centrality vs tracks correlation: %f %d", centrality, tracks->GetEntriesFast()));
872 fHistos->FillEvent(centrality, AliUEHist::kCFStepAnaTopology);
877 // reference multiplicity
878 Int_t referenceMultiplicity = -1;
880 referenceMultiplicity = AliESDtrackCuts::GetReferenceMultiplicity(fESD);
882 ((TH2F*) fListOfHistos->FindObject("referenceMultiplicity"))->Fill(centrality, referenceMultiplicity);
884 // create a list of reduced objects. This speeds up processing and reduces memory consumption for the event pool
885 TObjArray* tracksClone = CloneAndReduceTrackList(tracks);
888 //Printf("Accepted %d tracks", tracks->GetEntries());
890 const AliVVertex* vertex = inputEvent->GetPrimaryVertex();
891 Double_t zVtx = vertex->GetZ();
897 // fill two different centralities (syst study)
898 // the zvtx axis is used to distinguish the results of both centralities: configured centrality in zvtx = 0, SPD in zvtx = 2
899 if (fCompareCentralities)
902 // Fill containers at STEP 6 (reconstructed)
906 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepReconstructed, tracksClone, 0, weight, kTRUE, kFALSE, 0, 0.02, kTRUE);
908 ((TH1F*) fListOfHistos->FindObject("eventStat"))->Fill(1);
910 if (fTwoTrackEfficiencyCut > 0)
911 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepBiasStudy, tracksClone, 0, weight, kTRUE, kTRUE, bSign, fTwoTrackEfficiencyCut, kTRUE);
914 // fill second time with SPD centrality
915 if (fCompareCentralities && centralityObj)
917 centrality = centralityObj->GetCentralityPercentile("CL1");
918 if (centrality >= 0 && !fSkipStep6)
919 fHistos->FillCorrelations(centrality, 2, AliUEHist::kCFStepReconstructed, tracksClone, 0, weight, kTRUE, kFALSE, 0, 0.02, kTRUE);
926 // 1. First get an event pool corresponding in mult (cent) and
927 // zvertex to the current event. Once initialized, the pool
928 // should contain nMix (reduced) events. This routine does not
929 // pre-scan the chain. The first several events of every chain
930 // will be skipped until the needed pools are filled to the
931 // specified depth. If the pool categories are not too rare, this
932 // should not be a problem. If they are rare, you could lose
935 // 2. Collect the whole pool's content of tracks into one TObjArray
936 // (bgTracks), which is effectively a single background super-event.
938 // 3. The reduced and bgTracks arrays must both be passed into
939 // FillCorrelations(). Also nMix should be passed in, so a weight
940 // of 1./nMix can be applied.
942 AliEventPool* pool = fPoolMgr->GetEventPool(centrality, zVtx);
945 AliFatal(Form("No pool found for centrality = %f, zVtx = %f", centrality, zVtx));
949 if (pool->IsReady() || pool->NTracksInPool() > fMixingTracks / 10 || pool->GetCurrentNEvents() >= 5)
952 Int_t nMix = pool->GetCurrentNEvents();
953 // cout << "nMix = " << nMix << " tracks in pool = " << pool->NTracksInPool() << endl;
955 ((TH1F*) fListOfHistos->FindObject("eventStat"))->Fill(2);
956 ((TH2F*) fListOfHistos->FindObject("mixedDist"))->Fill(centrality, pool->NTracksInPool());
958 ((TH1F*) fListOfHistos->FindObject("eventStat"))->Fill(3);
960 // Fill mixed-event histos here
961 for (Int_t jMix=0; jMix<nMix; jMix++)
963 TObjArray* bgTracks = pool->GetEvent(jMix);
966 fHistosMixed->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepReconstructed, tracksClone, bgTracks, 1.0 / nMix, (jMix == 0), kFALSE, 0, 0.02, kTRUE);
968 if (fTwoTrackEfficiencyCut > 0)
969 fHistosMixed->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepBiasStudy, tracksClone, bgTracks, 1.0 / nMix, (jMix == 0), kTRUE, bSign, fTwoTrackEfficiencyCut, kTRUE);
973 // ownership is with the pool now
974 pool->UpdatePool(tracksClone);
981 TObjArray* AliAnalysisTaskPhiCorrelations::CloneAndReduceTrackList(TObjArray* tracks)
983 // clones a track list by using AliDPhiBasicParticle which uses much less memory (used for event mixing)
985 TObjArray* tracksClone = new TObjArray;
986 tracksClone->SetOwner(kTRUE);
988 for (Int_t i=0; i<tracks->GetEntriesFast(); i++)
990 AliVParticle* particle = (AliVParticle*) tracks->At(i);
991 tracksClone->Add(new AliDPhiBasicParticle(particle->Eta(), particle->Phi(), particle->Pt(), particle->Charge()));
997 //____________________________________________________________________
998 void AliAnalysisTaskPhiCorrelations::Initialize()
1001 fInputHandler = (AliInputEventHandler*)
1002 ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
1004 fMcHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());