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"
57 #include "AliHelperPID.h"
59 ////////////////////////////////////////////////////////////////////////
61 // Analysis class for azimuthal correlation studies
62 // Based on the UE task from Sara Vallero and Jan Fiete
64 // This class needs input AODs.
65 // The output is a list of analysis-specific containers.
67 // The AOD can be either connected to the InputEventHandler
68 // for a chain of AOD files
70 // to the OutputEventHandler
71 // for a chain of ESD files,
72 // in this case the class should be in the train after the jet-finder
75 // Jan Fiete Grosse-Oetringhaus
77 ////////////////////////////////////////////////////////////////////////
80 ClassImp( AliAnalysisTaskPhiCorrelations )
81 ClassImp( AliDPhiBasicParticle )
83 //____________________________________________________________________
84 AliAnalysisTaskPhiCorrelations:: AliAnalysisTaskPhiCorrelations(const char* name):
85 AliAnalysisTask(name,""),
86 // general configuration
89 fReduceMemoryFootprint(kFALSE),
92 fCompareCentralities(kFALSE),
93 fTwoTrackEfficiencyStudy(kFALSE),
94 fTwoTrackEfficiencyCut(0),
96 fCourseCentralityBinning(kFALSE),
98 fInjectedSignals(kFALSE),
99 // pointers to UE classes
104 fEfficiencyCorrection(0),
105 fCorrectTriggers(kFALSE),
106 // handlers and events
114 // histogram settings
117 fnTracksVertex(1), // QA tracks pointing to principal vertex (= 3 default)
119 fCentralityMethod("V0M"),
125 fSelectBit(AliVEvent::kMB|AliVEvent::kUserDefined),
126 fUseChargeHadrons(kFALSE),
127 fParticleSpeciesTrigger(-1),
128 fParticleSpeciesAssociated(-1),
130 fTriggerSelectCharge(0),
131 fAssociatedSelectCharge(0),
132 fTriggerRestrictEta(-1),
133 fEtaOrdering(kFALSE),
134 fCutConversions(kFALSE),
135 fCutResonances(kFALSE),
136 fFillOnlyStep0(kFALSE),
138 fRejectCentralityOutliers(kFALSE),
139 fRemoveWeakDecays(kFALSE),
140 fRemoveDuplicates(kFALSE),
141 fSkipFastCluster(kFALSE),
142 fWeightPerEvent(kFALSE),
146 // Default constructor
147 // Define input and output slots here
148 // Input slot #0 works with a TChain
149 DefineInput(0, TChain::Class());
150 // Output slot #0 writes into a TList container
151 DefineOutput(0, TList::Class());
154 AliAnalysisTaskPhiCorrelations::~AliAnalysisTaskPhiCorrelations()
158 if (fListOfHistos && !AliAnalysisManager::GetAnalysisManager()->IsProofMode())
159 delete fListOfHistos;
162 //____________________________________________________________________
163 void AliAnalysisTaskPhiCorrelations::ConnectInputData(Option_t* /*option*/)
166 // Connect the input data
167 if (fDebug > 1) AliInfo("ConnectInputData() ");
169 // Since AODs can either be connected to the InputEventHandler
170 // or to the OutputEventHandler ( the AOD is created by a previus task in the train )
171 // we need to get the pointer to the AODEvent correctly.
173 // Delta AODs are also accepted.
175 TObject* handler = AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
177 if( handler && handler->InheritsFrom("AliAODInputHandler") )
179 fAOD = ((AliAODInputHandler*)handler)->GetEvent();
180 if (fDebug > 1) AliInfo(" ==== Tracks and Jets from AliAODInputHandler");
184 handler = AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler();
185 if (handler && handler->InheritsFrom("AliAODHandler") )
187 fAOD = ((AliAODHandler*)handler)->GetAOD();
188 if (fDebug > 1) AliInfo(" ==== Tracks and Jets from AliAODHandler");
192 AliWarning("I can't get any AOD Event Handler");
196 if (handler && handler->InheritsFrom("AliESDInputHandler") )
198 // pointer received per event in ::Exec
199 if (fDebug > 1) AliInfo(" ==== Tracks and Jets from AliESDInputHandler");
202 // Initialize common pointers
206 //____________________________________________________________________
207 void AliAnalysisTaskPhiCorrelations::CreateOutputObjects()
209 // Create the output container
211 if (fDebug > 1) AliInfo("CreateOutputObjects()");
213 // Initialize class with main algorithms, event and track selection.
214 fAnalyseUE = new AliAnalyseLeadingTrackUE();
215 fAnalyseUE->SetParticleSelectionCriteria(fFilterBit, fUseChargeHadrons, fTrackEtaCut, fPtMin);
216 fAnalyseUE->SetDebug(fDebug);
217 fAnalyseUE->DefineESDCuts(fFilterBit);
218 fAnalyseUE->SetEventSelection(fSelectBit);
219 fAnalyseUE->SetHelperPID(fHelperPID);
220 if ((fParticleSpeciesTrigger != -1 || fParticleSpeciesAssociated != -1) && !fHelperPID)
221 AliFatal("HelperPID object should be set in the steering macro");
223 // Initialize output list of containers
224 if (fListOfHistos != NULL){
225 delete fListOfHistos;
226 fListOfHistos = NULL;
229 fListOfHistos = new TList();
230 fListOfHistos->SetOwner(kTRUE);
233 // Initialize class to handle histograms
234 TString histType = "4R";
235 if (fUseVtxAxis == 1)
237 else if (fUseVtxAxis == 2)
239 if (fCourseCentralityBinning)
241 fHistos = new AliUEHistograms("AliUEHistogramsSame", histType, fCustomBinning);
242 fHistosMixed = new AliUEHistograms("AliUEHistogramsMixed", histType, fCustomBinning);
244 fHistos->SetSelectCharge(fSelectCharge);
245 fHistosMixed->SetSelectCharge(fSelectCharge);
247 fHistos->SetSelectTriggerCharge(fTriggerSelectCharge);
248 fHistosMixed->SetSelectTriggerCharge(fTriggerSelectCharge);
250 fHistos->SetSelectAssociatedCharge(fAssociatedSelectCharge);
251 fHistosMixed->SetSelectAssociatedCharge(fAssociatedSelectCharge);
253 fHistos->SetTriggerRestrictEta(fTriggerRestrictEta);
254 fHistosMixed->SetTriggerRestrictEta(fTriggerRestrictEta);
256 fHistos->SetOnlyOneEtaSide(fOnlyOneEtaSide);
257 fHistosMixed->SetOnlyOneEtaSide(fOnlyOneEtaSide);
259 fHistos->SetEtaOrdering(fEtaOrdering);
260 fHistosMixed->SetEtaOrdering(fEtaOrdering);
262 fHistos->SetPairCuts(fCutConversions, fCutResonances);
263 fHistosMixed->SetPairCuts(fCutConversions, fCutResonances);
265 fHistos->SetTrackEtaCut(fTrackEtaCut);
266 fHistosMixed->SetTrackEtaCut(fTrackEtaCut);
268 fHistos->SetWeightPerEvent(fWeightPerEvent);
269 fHistosMixed->SetWeightPerEvent(fWeightPerEvent);
271 if (fEfficiencyCorrection)
273 fHistos->SetEfficiencyCorrection(fEfficiencyCorrection, fCorrectTriggers);
274 fHistosMixed->SetEfficiencyCorrection((THnF*) fEfficiencyCorrection->Clone(), fCorrectTriggers);
277 // add histograms to list
278 fListOfHistos->Add(fHistos);
279 fListOfHistos->Add(fHistosMixed);
280 // add HelperPID to list
282 fListOfHistos->Add(fHelperPID);
284 fListOfHistos->Add(new TH2F("trackletsVsV0Cent", ";L1 clusters;v0 centrality", 100, -0.5, 9999.5, 101, 0, 101));
285 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));
286 fListOfHistos->Add(new TH1F("eventStat", ";;events", 4, -0.5, 3.5));
287 fListOfHistos->Add(new TH2F("mixedDist", ";centrality;tracks;events", 101, 0, 101, 200, 0, fMixingTracks * 1.5));
288 fListOfHistos->Add(new TH1F("pids", ";pdg;tracks", 2001, -1000.5, 1000.5));
289 fListOfHistos->Add(new TH2F("referenceMultiplicity", ";centrality;tracks;events", 101, 0, 101, 200, 0, 200));
291 PostData(0,fListOfHistos);
293 // Add task configuration to output list
297 Int_t poolsize = 1000; // Maximum number of events, ignored in the present implemention of AliEventPoolManager
299 Int_t nCentralityBins = fHistos->GetUEHist(2)->GetEventHist()->GetNBins(1);
300 Double_t* centralityBins = (Double_t*) fHistos->GetUEHist(2)->GetEventHist()->GetAxis(1, 0)->GetXbins()->GetArray();
302 const Int_t kNZvtxBins = 10+(1+10)*4;
303 // bins for further buffers are shifted by 100 cm
304 Double_t vertexBins[kNZvtxBins+1] = { -10, -8, -6, -4, -2, 0, 2, 4, 6, 8, 10,
305 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110,
306 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210,
307 290, 292, 294, 296, 298, 300, 302, 304, 306, 308, 310,
308 390, 392, 394, 396, 398, 400, 402, 404, 406, 408, 410 };
310 Int_t nZvtxBins = kNZvtxBins;
311 Double_t* zvtxbin = vertexBins;
313 if (fMode == 0 && fHistos->GetUEHist(2)->GetEventHist()->GetNVar() > 2)
315 nZvtxBins = fHistos->GetUEHist(2)->GetEventHist()->GetNBins(2);
316 zvtxbin = (Double_t*) fHistos->GetUEHist(2)->GetEventHist()->GetAxis(2, 0)->GetXbins()->GetArray();
319 fPoolMgr = new AliEventPoolManager(poolsize, fMixingTracks, nCentralityBins, centralityBins, nZvtxBins, zvtxbin);
320 fPoolMgr->SetTargetValues(fMixingTracks, 0.1, 5);
323 //____________________________________________________________________
324 void AliAnalysisTaskPhiCorrelations::Exec(Option_t */*option*/)
326 // receive ESD pointer if we are not running AOD analysis
329 AliVEventHandler* handler = AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
330 if (handler && handler->InheritsFrom("AliESDInputHandler"))
331 fESD = ((AliESDInputHandler*)handler)->GetEvent();
339 fMcEvent = fMcHandler->MCEvent();
343 // array of MC particles
344 fArrayMC = dynamic_cast<TClonesArray*>(fAOD->FindListObject(AliAODMCParticle::StdBranchName()));
346 AliFatal("No array of MC particles found !!!");
349 AnalyseCorrectionMode();
351 else AnalyseDataMode();
354 /******************** ANALYSIS METHODS *****************************/
356 //____________________________________________________________________
357 void AliAnalysisTaskPhiCorrelations::AddSettingsTree()
359 //Write settings to output list
360 TTree *settingsTree = new TTree("UEAnalysisSettings","Analysis Settings in UE estimation");
361 settingsTree->Branch("fnTracksVertex", &fnTracksVertex,"nTracksVertex/I");
362 settingsTree->Branch("fZVertex", &fZVertex,"ZVertex/D");
363 //settingsTree->Branch("fCentralityMethod", fCentralityMethod.Data(),"CentralityMethod/C");
364 settingsTree->Branch("fTrackEtaCut", &fTrackEtaCut, "TrackEtaCut/D");
365 settingsTree->Branch("fOnlyOneEtaSide", &fOnlyOneEtaSide,"OnlyOneEtaSide/I");
366 settingsTree->Branch("fPtMin", &fPtMin, "PtMin/D");
367 settingsTree->Branch("fFilterBit", &fFilterBit,"FilterBit/I");
368 settingsTree->Branch("fSelectBit", &fSelectBit,"EventSelectionBit/I");
369 settingsTree->Branch("fUseChargeHadrons", &fUseChargeHadrons,"UseChHadrons/O");
370 settingsTree->Branch("fParticleSpeciesTrigger", &fParticleSpeciesTrigger,"ParticleSpeciesTrigger/I");
371 settingsTree->Branch("fParticleSpeciesAssociated", &fParticleSpeciesAssociated,"ParticleSpeciesAssociated/I");
372 settingsTree->Branch("fSelectCharge", &fSelectCharge,"SelectCharge/I");
373 settingsTree->Branch("fTriggerSelectCharge", &fTriggerSelectCharge,"TriggerSelectCharge/I");
374 settingsTree->Branch("fAssociatedSelectCharge", &fAssociatedSelectCharge,"fAssociatedSelectCharge/I");
375 settingsTree->Branch("fTriggerRestrictEta", &fTriggerRestrictEta,"TriggerRestrictEta/D");
376 settingsTree->Branch("fEtaOrdering", &fEtaOrdering,"EtaOrdering/O");
377 settingsTree->Branch("fCutConversions", &fCutConversions,"CutConversions/O");
378 settingsTree->Branch("fCutResonances", &fCutResonances,"CutResonances/O");
379 settingsTree->Branch("fFillpT", &fFillpT,"FillpT/O");
380 settingsTree->Branch("fMixingTracks", &fMixingTracks,"MixingTracks/I");
381 settingsTree->Branch("fSkipTrigger", &fSkipTrigger,"SkipTrigger/O");
382 settingsTree->Branch("fInjectedSignals", &fInjectedSignals,"SkipTrigger/O");
383 settingsTree->Branch("fRejectCentralityOutliers", &fRejectCentralityOutliers,"RejectCentralityOutliers/O");
384 settingsTree->Branch("fRemoveWeakDecays", &fRemoveWeakDecays,"RemoveWeakDecays/O");
385 settingsTree->Branch("fRemoveDuplicates", &fRemoveDuplicates,"RemoveDuplicates/O");
386 settingsTree->Branch("fSkipFastCluster", &fSkipFastCluster,"SkipFastCluster/O");
387 settingsTree->Branch("fWeightPerEvent", &fWeightPerEvent,"WeightPerEvent/O");
389 settingsTree->Branch("fCorrectTriggers", &fCorrectTriggers,"CorrectTriggers/O");
391 settingsTree->Fill();
392 fListOfHistos->Add(settingsTree);
395 //____________________________________________________________________
396 void AliAnalysisTaskPhiCorrelations::AnalyseCorrectionMode()
398 // Run the analysis on MC to get the correction maps
401 if ( fDebug > 3 ) AliInfo( " Processing event in Corrections mode ..." );
403 Double_t centrality = 0;
405 if (fCentralityMethod.Length() > 0)
407 AliCentrality *centralityObj = 0;
409 centralityObj = fAOD->GetHeader()->GetCentralityP();
411 centralityObj = fESD->GetCentrality();
415 centrality = centralityObj->GetCentralityPercentileUnchecked(fCentralityMethod);
416 AliInfo(Form("Centrality is %f", centrality));
420 Printf("WARNING: Centrality object is 0");
425 // Support for ESD and AOD based analysis
426 AliVEvent* inputEvent = fAOD;
434 fHistos->SetRunNumber(inputEvent->GetRunNumber());
435 bSign = (inputEvent->GetMagneticField() > 0) ? 1 : -1;
438 TObject* mc = fArrayMC;
443 fHistos->FillEvent(centrality, -1);
448 // Only consider MC events within the vtx-z region used also as cut on the reconstructed vertex
449 TObject* vertexSupplier = fMcEvent;
451 vertexSupplier = fAOD->FindListObject(AliAODMCHeader::StdBranchName());
453 if (!fAnalyseUE->VertexSelection(vertexSupplier, 0, fZVertex))
458 zVtx = ((AliAODMCHeader*) vertexSupplier)->GetVtxZ();
460 zVtx = fMcEvent->GetPrimaryVertex()->GetZ();
465 // For productions with injected signals, figure out above which label to skip particles/tracks
466 Int_t skipParticlesAbove = 0;
467 if (fInjectedSignals)
469 AliGenEventHeader* eventHeader = 0;
475 AliHeader* header = (AliHeader*) fMcEvent->Header();
477 AliFatal("fInjectedSignals set but no MC header found");
479 AliGenCocktailEventHeader* cocktailHeader = dynamic_cast<AliGenCocktailEventHeader*> (header->GenEventHeader());
483 AliFatal("fInjectedSignals set but no MC cocktail header found");
486 headers = cocktailHeader->GetHeaders()->GetEntries();
487 eventHeader = dynamic_cast<AliGenEventHeader*> (cocktailHeader->GetHeaders()->First());
492 AliAODMCHeader* header = (AliAODMCHeader*) fAOD->GetList()->FindObject(AliAODMCHeader::StdBranchName());
494 AliFatal("fInjectedSignals set but no MC header found");
496 headers = header->GetNCocktailHeaders();
497 eventHeader = header->GetCocktailHeader(0);
502 // We avoid AliFatal here, because the AOD productions sometimes have events where the MC header is missing
503 // (due to unreadable Kinematics) and we don't want to loose the whole job because of a few events
504 AliError("First event header not found. Skipping this event.");
505 fHistos->FillEvent(centrality, AliUEHist::kCFStepAnaTopology);
509 skipParticlesAbove = eventHeader->NProduced();
510 AliInfo(Form("Injected signals in this event (%d headers). Keeping events of %s. Will skip particles/tracks above %d.", headers, eventHeader->ClassName(), skipParticlesAbove));
515 TObjArray* tmpList = fAnalyseUE->GetAcceptedParticles(mc, 0, kTRUE, fParticleSpeciesTrigger, kTRUE);
516 CleanUp(tmpList, mc, skipParticlesAbove);
517 TObjArray* tracksMC = CloneAndReduceTrackList(tmpList);
521 TObjArray* tracksCorrelateMC = tracksMC;
522 if (fParticleSpeciesAssociated != fParticleSpeciesTrigger)
524 // TODO for MC this uses to PDG of the mother of the particle
525 tracksCorrelateMC = fAnalyseUE->GetAcceptedParticles(mc, 0, kTRUE, fParticleSpeciesAssociated, kTRUE);
526 CleanUp(tracksCorrelateMC, mc, skipParticlesAbove);
532 for (Int_t i=0; i<fArrayMC->GetEntriesFast(); i++)
533 ((TH1F*) fListOfHistos->FindObject("pids"))->Fill(((AliAODMCParticle*) fArrayMC->At(i))->PdgCode());
537 for (Int_t i=0; i<fMcEvent->GetNumberOfTracks(); i++)
538 ((TH1F*) fListOfHistos->FindObject("pids"))->Fill(fMcEvent->GetTrack(i)->PdgCode());
545 // (MC-true all particles)
547 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepAll, tracksMC, tracksCorrelateMC, weight);
552 AliEventPool* pool = fPoolMgr->GetEventPool(centrality, zVtx);
554 for (Int_t jMix=0; jMix<pool->GetCurrentNEvents(); jMix++)
555 fHistosMixed->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepAll, tracksMC, pool->GetEvent(jMix), 1.0 / pool->GetCurrentNEvents(), (jMix == 0));
556 pool->UpdatePool(CloneAndReduceTrackList(tracksCorrelateMC));
559 // Printf("trigger: %d", ((AliInputEventHandler*)fInputHandler)->IsEventSelected());
561 // Trigger selection ************************************************
562 if (!fFillOnlyStep0 && (fSkipTrigger || fAnalyseUE->TriggerSelection(fInputHandler)))
564 // (MC-true all particles)
566 if (!fReduceMemoryFootprint)
567 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepTriggered, tracksMC, tracksCorrelateMC, weight);
569 fHistos->FillEvent(centrality, AliUEHist::kCFStepTriggered);
572 AliFatal("UNEXPECTED: inputEvent is 0. Trigger selection should have failed");
576 // Vertex selection *************************************************
577 if (fAnalyseUE->VertexSelection(inputEvent, fnTracksVertex, fZVertex))
579 // fill here for tracking efficiency
580 // loop over particle species
582 for (Int_t particleSpecies = 0; particleSpecies < 4; particleSpecies++)
584 TObjArray* primMCParticles = fAnalyseUE->GetAcceptedParticles(mc, 0x0, kTRUE, particleSpecies, kTRUE);
585 TObjArray* primRecoTracksMatched = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kTRUE, particleSpecies, kTRUE);
586 TObjArray* allRecoTracksMatched = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kFALSE, particleSpecies, kTRUE);
588 CleanUp(primMCParticles, mc, skipParticlesAbove);
589 CleanUp(primRecoTracksMatched, mc, skipParticlesAbove);
590 CleanUp(allRecoTracksMatched, mc, skipParticlesAbove);
592 fHistos->FillTrackingEfficiency(primMCParticles, primRecoTracksMatched, allRecoTracksMatched, 0, particleSpecies, centrality, zVtx);
594 // Printf("%d --> %d %d %d", particleSpecies, primMCParticles->GetEntries(), primRecoTracksMatched->GetEntries(), allRecoTracksMatched->GetEntries());
596 delete primMCParticles;
597 delete primRecoTracksMatched;
598 delete allRecoTracksMatched;
601 TObjArray* fakeParticles = fAnalyseUE->GetFakeParticles(inputEvent, mc, kFALSE, -1, kTRUE);
602 CleanUp((TObjArray*) fakeParticles->At(0), mc, skipParticlesAbove);
603 CleanUp((TObjArray*) fakeParticles->At(1), mc, skipParticlesAbove);
605 fHistos->FillTrackingEfficiency(0, 0, 0, (TObjArray*) fakeParticles->At(2), -1, centrality, zVtx);
606 fHistos->FillFakePt(fakeParticles, centrality);
607 // Printf(">>>>> %d %d %d fakes", ((TObjArray*) fakeParticles->At(0))->GetEntriesFast(), ((TObjArray*) fakeParticles->At(1))->GetEntriesFast(), ((TObjArray*) fakeParticles->At(2))->GetEntriesFast());
608 delete fakeParticles;
610 // (MC-true all particles)
612 if (!fReduceMemoryFootprint)
613 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepVertex, tracksMC, tracksCorrelateMC, weight);
615 fHistos->FillEvent(centrality, AliUEHist::kCFStepVertex);
617 // Get MC primaries that match reconstructed track
619 TObjArray* tracksRecoMatchedPrim = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kTRUE, fParticleSpeciesTrigger, kTRUE);
620 CleanUp(tracksRecoMatchedPrim, mc, skipParticlesAbove);
622 TObjArray* tracksCorrelateRecoMatchedPrim = tracksRecoMatchedPrim;
623 if (fParticleSpeciesAssociated != fParticleSpeciesTrigger)
625 tracksCorrelateRecoMatchedPrim = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kTRUE, fParticleSpeciesAssociated, kTRUE);
626 CleanUp(tracksCorrelateRecoMatchedPrim, mc, skipParticlesAbove);
629 // (RECO-matched (quantities from MC particle) primary particles)
631 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepTrackedOnlyPrim, tracksRecoMatchedPrim, tracksCorrelateRecoMatchedPrim, weight);
636 AliEventPool* pool = fPoolMgr->GetEventPool(centrality, zVtx + 200);
638 for (Int_t jMix=0; jMix<pool->GetCurrentNEvents(); jMix++)
639 fHistosMixed->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepTrackedOnlyPrim, tracksRecoMatchedPrim, pool->GetEvent(jMix), 1.0 / pool->GetCurrentNEvents(), (jMix == 0));
640 pool->UpdatePool(CloneAndReduceTrackList(tracksCorrelateRecoMatchedPrim));
643 // Get MC primaries + secondaries that match reconstructed track
645 TObjArray* tracksRecoMatchedAll = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kFALSE, fParticleSpeciesTrigger, kTRUE);
646 CleanUp(tracksRecoMatchedAll, mc, skipParticlesAbove);
648 TObjArray* tracksCorrelateRecoMatchedAll = tracksRecoMatchedAll;
649 if (fParticleSpeciesAssociated != fParticleSpeciesTrigger)
651 tracksCorrelateRecoMatchedAll = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kFALSE, fParticleSpeciesAssociated, kTRUE);
652 CleanUp(tracksCorrelateRecoMatchedAll, mc, skipParticlesAbove);
655 // (RECO-matched (quantities from MC particle) all particles)
657 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepTracked, tracksRecoMatchedAll, tracksCorrelateRecoMatchedAll, weight);
662 AliEventPool* pool = fPoolMgr->GetEventPool(centrality, zVtx + 300);
664 for (Int_t jMix=0; jMix<pool->GetCurrentNEvents(); jMix++)
665 fHistosMixed->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepTracked, tracksRecoMatchedAll, pool->GetEvent(jMix), 1.0 / pool->GetCurrentNEvents(), (jMix == 0));
666 pool->UpdatePool(CloneAndReduceTrackList(tracksCorrelateRecoMatchedAll));
671 TObjArray* tracks = fAnalyseUE->GetAcceptedParticles(inputEvent, 0, kTRUE, fParticleSpeciesTrigger, kTRUE);
672 CleanUp(tracks, mc, skipParticlesAbove);
674 TObjArray* tracksCorrelate = tracks;
675 if (fParticleSpeciesAssociated != fParticleSpeciesTrigger)
677 tracksCorrelate = fAnalyseUE->GetAcceptedParticles(inputEvent, 0, kTRUE, fParticleSpeciesAssociated, kTRUE);
678 CleanUp(tracksCorrelate, mc, skipParticlesAbove);
684 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepReconstructed, tracks, tracksCorrelate, weight);
686 // two track cut, STEP 8
687 if (fTwoTrackEfficiencyCut > 0)
688 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepBiasStudy, tracks, tracksCorrelate, weight, kTRUE, kTRUE, bSign, fTwoTrackEfficiencyCut);
690 // apply correction efficiency, STEP 10
691 if (fEfficiencyCorrection)
693 // with or without two track efficiency depending on if fTwoTrackEfficiencyCut is set
694 Bool_t twoTrackCut = (fTwoTrackEfficiencyCut > 0);
696 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepCorrected, tracks, tracksCorrelate, weight, kTRUE, twoTrackCut, bSign, fTwoTrackEfficiencyCut, kTRUE);
702 AliEventPool* pool2 = fPoolMgr->GetEventPool(centrality, zVtx + 100);
703 if (pool2->IsReady())
705 for (Int_t jMix=0; jMix<pool2->GetCurrentNEvents(); jMix++)
709 fHistosMixed->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepReconstructed, tracks, pool2->GetEvent(jMix), 1.0 / pool2->GetCurrentNEvents(), (jMix == 0));
711 // two track cut, STEP 8
712 if (fTwoTrackEfficiencyCut > 0)
713 fHistosMixed->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepBiasStudy, tracks, pool2->GetEvent(jMix), 1.0 / pool2->GetCurrentNEvents(), (jMix == 0), kTRUE, bSign, fTwoTrackEfficiencyCut);
715 // apply correction efficiency, STEP 10
716 if (fEfficiencyCorrection)
718 // with or without two track efficiency depending on if fTwoTrackEfficiencyCut is set
719 Bool_t twoTrackCut = (fTwoTrackEfficiencyCut > 0);
721 fHistosMixed->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepCorrected, tracks, pool2->GetEvent(jMix), 1.0 / pool2->GetCurrentNEvents(), (jMix == 0), twoTrackCut, bSign, fTwoTrackEfficiencyCut, kTRUE);
725 pool2->UpdatePool(CloneAndReduceTrackList(tracksCorrelate));
728 if (0 && !fReduceMemoryFootprint)
730 // make list of secondaries (matched with MC)
731 TObjArray* tracksRecoMatchedSecondaries = new TObjArray;
732 for (Int_t i=0; i<tracksRecoMatchedAll->GetEntriesFast(); i++)
733 if (((AliAODMCParticle*)tracksRecoMatchedAll->At(i))->IsPhysicalPrimary() == kFALSE)
734 tracksRecoMatchedSecondaries->Add(tracksRecoMatchedAll->At(i));
736 // Study: Use only secondaries as trigger particles and plot the correlation vs. all particles; store in step 9
737 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepBiasStudy2, tracksRecoMatchedSecondaries, tracksRecoMatchedAll, weight);
739 // Study: Use only primaries as trigger particles and plot the correlation vs. secondaries; store in step 8
740 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepBiasStudy, tracksRecoMatchedPrim, tracksRecoMatchedSecondaries, weight);
742 // plot delta phi vs process id of secondaries
743 // trigger particles: primaries in 4 < pT < 10
744 // associated particles: secondaries in 1 < pT < 10
746 for (Int_t i=0; i<tracksRecoMatchedPrim->GetEntriesFast(); i++)
748 AliVParticle* triggerParticle = (AliVParticle*) tracksRecoMatchedPrim->At(i);
750 if (triggerParticle->Pt() < 4 || triggerParticle->Pt() > 10)
753 for (Int_t j=0; j<tracksRecoMatchedSecondaries->GetEntriesFast(); j++)
755 AliAODMCParticle* particle = (AliAODMCParticle*) tracksRecoMatchedSecondaries->At(j);
757 if (particle->Pt() < 1 || particle->Pt() > 10)
760 if (particle->Pt() > triggerParticle->Pt())
763 Double_t deltaPhi = triggerParticle->Phi() - particle->Phi();
764 if (deltaPhi > 1.5 * TMath::Pi())
765 deltaPhi -= TMath::TwoPi();
766 if (deltaPhi < -0.5 * TMath::Pi())
767 deltaPhi += TMath::TwoPi();
769 Int_t processID = fMcEvent->Stack()->Particle(particle->GetLabel())->GetUniqueID();
771 ((TH2F*) fListOfHistos->FindObject("processIDs"))->Fill(deltaPhi, processID);
775 delete tracksRecoMatchedSecondaries;
778 if (tracksCorrelateRecoMatchedPrim != tracksRecoMatchedPrim)
779 delete tracksCorrelateRecoMatchedPrim;
780 delete tracksRecoMatchedPrim;
782 if (tracksCorrelateRecoMatchedAll != tracksRecoMatchedAll)
783 delete tracksCorrelateRecoMatchedAll;
784 delete tracksRecoMatchedAll;
786 if (tracksCorrelate != tracks)
787 delete tracksCorrelate;
792 if (tracksMC != tracksCorrelateMC)
793 delete tracksCorrelateMC;
797 //____________________________________________________________________
798 void AliAnalysisTaskPhiCorrelations::AnalyseDataMode()
801 // Run the analysis on DATA or MC to get raw distributions
803 if ( fDebug > 3 ) AliInfo( " Processing event in Data mode ..." );
805 ((TH1F*) fListOfHistos->FindObject("eventStat"))->Fill(0);
810 // skip not selected events here (the AOD is not updated for those)
811 if (!fSkipTrigger && !(fInputHandler->IsEventSelected() & fSelectBit))
814 // skip fast cluster events here if requested
815 if (fSkipFastCluster && (fInputHandler->IsEventSelected() & AliVEvent::kFastOnly))
818 // Support for ESD and AOD based analysis
819 AliVEvent* inputEvent = fAOD;
823 Double_t centrality = 0;
825 AliCentrality *centralityObj = 0;
826 if (fCentralityMethod.Length() > 0)
828 if (fCentralityMethod == "ZNA_MANUAL")
831 for(Int_t j = 0; j < 4; ++j) {
832 if (fESD->GetZDCData()->GetZDCTDCData(12,j) != 0) {
837 // Printf("%d %f", zna, fZNAtower[0]);
840 // code from Chiara O (23.10.12)
841 const Double_t *fZNAtower = fESD->GetZDCData()->GetZN2TowerEnergy();
842 Float_t znacut[4] = {681., 563., 413., 191.};
844 if(fZNAtower[0]>znacut[0]) centrality = 1;
845 else if(fZNAtower[0]>znacut[1]) centrality = 21;
846 else if(fZNAtower[0]>znacut[2]) centrality = 41;
847 else if(fZNAtower[0]>znacut[3]) centrality = 61;
848 else centrality = 81;
853 else if (fCentralityMethod == "TRACKS_MANUAL")
856 TObjArray* tracks = fAnalyseUE->GetAcceptedParticles(inputEvent, 0, kTRUE, -1, kTRUE);
857 centrality = tracks->GetEntriesFast();
860 // Printf("%d %f", tracks->GetEntriesFast(), centrality);
866 centralityObj = fAOD->GetHeader()->GetCentralityP();
868 centralityObj = fESD->GetCentrality();
871 centrality = centralityObj->GetCentralityPercentile(fCentralityMethod);
872 //centrality = centralityObj->GetCentralityPercentileUnchecked(fCentralityMethod);
881 if (fAOD->GetVZEROData())
884 for (Int_t i=0; i<64; i++)
885 multV0 += fAOD->GetVZEROData()->GetMultiplicity(i);
889 AliInfo("Rejecting event due to too small V0 multiplicity");
896 AliInfo(Form("Centrality is %f", centrality));
899 Float_t bSign = (inputEvent->GetMagneticField() > 0) ? 1 : -1;
901 fHistos->SetRunNumber(inputEvent->GetRunNumber());
903 // Fill the "event-counting-container", it is needed to get the number of events remaining after each event-selection cut
904 fHistos->FillEvent(centrality, AliUEHist::kCFStepAll);
906 // Trigger selection ************************************************
907 if (!fSkipTrigger && !fAnalyseUE->TriggerSelection(fInputHandler)) return;
909 // Fill the "event-counting-container", it is needed to get the number of events remaining after each event-selection cut
910 fHistos->FillEvent(centrality, AliUEHist::kCFStepTriggered);
912 // Vertex selection *************************************************
913 if(!fAnalyseUE->VertexSelection(inputEvent, fnTracksVertex, fZVertex)) return;
915 // Fill the "event-counting-container", it is needed to get the number of events remaining after each event-selection cut
916 fHistos->FillEvent(centrality, AliUEHist::kCFStepVertex);
919 if (centrality < 0 && !fCompareCentralities)
922 TObjArray* tracks = fAnalyseUE->GetAcceptedParticles(inputEvent, 0, kTRUE, fParticleSpeciesTrigger, kTRUE);
923 //Printf("Accepted %d tracks", tracks->GetEntries());
925 // check for outlier in centrality vs number of tracks (rough constants extracted from correlation histgram)
926 Bool_t reject = kFALSE;
927 if (fRejectCentralityOutliers)
929 if (centrality > 40 && centrality <= 50 && tracks->GetEntriesFast() > 1160)
931 if (centrality > 50 && centrality <= 60 && tracks->GetEntriesFast() > 650)
933 if (centrality > 60 && centrality <= 70 && tracks->GetEntriesFast() > 370)
935 if (centrality > 70 && centrality <= 80 && tracks->GetEntriesFast() > 220)
937 if (centrality > 80 && centrality <= 90 && tracks->GetEntriesFast() > 130)
939 if (centrality > 90 && tracks->GetEntriesFast() > 75)
945 AliInfo(Form("Rejecting event due to centrality vs tracks correlation: %f %d", centrality, tracks->GetEntriesFast()));
946 fHistos->FillEvent(centrality, AliUEHist::kCFStepAnaTopology);
951 // correlate particles with...
952 TObjArray* tracksCorrelate = 0;
953 if (fParticleSpeciesAssociated != fParticleSpeciesTrigger)
954 tracksCorrelate = fAnalyseUE->GetAcceptedParticles(inputEvent, 0, kTRUE, fParticleSpeciesAssociated, kTRUE);
956 // reference multiplicity
957 Int_t referenceMultiplicity = -1;
959 referenceMultiplicity = AliESDtrackCuts::GetReferenceMultiplicity(fESD);
961 referenceMultiplicity = tracks->GetEntriesFast(); // TODO to be replaced by the estimator once available in the AOD
963 ((TH2F*) fListOfHistos->FindObject("referenceMultiplicity"))->Fill(centrality, referenceMultiplicity);
965 const AliVVertex* vertex = inputEvent->GetPrimaryVertex();
966 Double_t zVtx = vertex->GetZ();
972 // fill two different centralities (syst study)
973 // the zvtx axis is used to distinguish the results of both centralities: configured centrality in zvtx = 0, SPD in zvtx = 2
974 if (fCompareCentralities)
977 // Fill containers at STEP 6 (reconstructed)
981 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepReconstructed, tracks, tracksCorrelate, weight, kTRUE, kFALSE, 0, 0.02, kTRUE);
983 ((TH1F*) fListOfHistos->FindObject("eventStat"))->Fill(1);
985 if (fTwoTrackEfficiencyCut > 0)
986 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepBiasStudy, tracks, tracksCorrelate, weight, kTRUE, kTRUE, bSign, fTwoTrackEfficiencyCut, kTRUE);
989 // fill second time with SPD centrality
990 if (fCompareCentralities && centralityObj)
992 centrality = centralityObj->GetCentralityPercentile("CL1");
993 if (centrality >= 0 && !fSkipStep6)
994 fHistos->FillCorrelations(centrality, 2, AliUEHist::kCFStepReconstructed, tracks, tracksCorrelate, weight, kFALSE, kFALSE, 0, 0.02, kTRUE);
997 // create a list of reduced objects. This speeds up processing and reduces memory consumption for the event pool
998 TObjArray* tracksClone = CloneAndReduceTrackList(tracks);
1005 // 1. First get an event pool corresponding in mult (cent) and
1006 // zvertex to the current event. Once initialized, the pool
1007 // should contain nMix (reduced) events. This routine does not
1008 // pre-scan the chain. The first several events of every chain
1009 // will be skipped until the needed pools are filled to the
1010 // specified depth. If the pool categories are not too rare, this
1011 // should not be a problem. If they are rare, you could lose
1014 // 2. Collect the whole pool's content of tracks into one TObjArray
1015 // (bgTracks), which is effectively a single background super-event.
1017 // 3. The reduced and bgTracks arrays must both be passed into
1018 // FillCorrelations(). Also nMix should be passed in, so a weight
1019 // of 1./nMix can be applied.
1021 AliEventPool* pool = fPoolMgr->GetEventPool(centrality, zVtx);
1024 AliFatal(Form("No pool found for centrality = %f, zVtx = %f", centrality, zVtx));
1026 // pool->SetDebug(1);
1028 if (pool->IsReady())
1031 Int_t nMix = pool->GetCurrentNEvents();
1032 // cout << "nMix = " << nMix << " tracks in pool = " << pool->NTracksInPool() << endl;
1034 ((TH1F*) fListOfHistos->FindObject("eventStat"))->Fill(2);
1035 ((TH2F*) fListOfHistos->FindObject("mixedDist"))->Fill(centrality, pool->NTracksInPool());
1036 if (pool->IsReady())
1037 ((TH1F*) fListOfHistos->FindObject("eventStat"))->Fill(3);
1039 // Fill mixed-event histos here
1040 for (Int_t jMix=0; jMix<nMix; jMix++)
1042 TObjArray* bgTracks = pool->GetEvent(jMix);
1045 fHistosMixed->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepReconstructed, tracksClone, bgTracks, 1.0 / nMix, (jMix == 0), kFALSE, 0, 0.02, kTRUE);
1047 if (fTwoTrackEfficiencyCut > 0)
1048 fHistosMixed->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepBiasStudy, tracksClone, bgTracks, 1.0 / nMix, (jMix == 0), kTRUE, bSign, fTwoTrackEfficiencyCut, kTRUE);
1052 // ownership is with the pool now
1053 if (tracksCorrelate)
1055 pool->UpdatePool(CloneAndReduceTrackList(tracksCorrelate));
1059 pool->UpdatePool(tracksClone);
1060 //pool->PrintInfo();
1065 if (tracksCorrelate)
1066 delete tracksCorrelate;
1070 TObjArray* AliAnalysisTaskPhiCorrelations::CloneAndReduceTrackList(TObjArray* tracks)
1072 // clones a track list by using AliDPhiBasicParticle which uses much less memory (used for event mixing)
1074 TObjArray* tracksClone = new TObjArray;
1075 tracksClone->SetOwner(kTRUE);
1077 for (Int_t i=0; i<tracks->GetEntriesFast(); i++)
1079 AliVParticle* particle = (AliVParticle*) tracks->At(i);
1080 tracksClone->Add(new AliDPhiBasicParticle(particle->Eta(), particle->Phi(), particle->Pt(), particle->Charge()));
1086 //____________________________________________________________________
1087 void AliAnalysisTaskPhiCorrelations::Initialize()
1090 fInputHandler = (AliInputEventHandler*)
1091 ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
1093 fMcHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
1096 //____________________________________________________________________
1097 void AliAnalysisTaskPhiCorrelations::RemoveDuplicates(TObjArray* tracks)
1099 // remove particles with the same label
1101 Int_t before = tracks->GetEntriesFast();
1103 for (Int_t i=0; i<before; ++i)
1105 AliVParticle* part = (AliVParticle*) tracks->At(i);
1107 for (Int_t j=i+1; j<before; ++j)
1109 AliVParticle* part2 = (AliVParticle*) tracks->At(j);
1111 if (part->GetLabel() == part2->GetLabel())
1113 Printf("Removing %d with label %d (duplicated in %d)", i, part->GetLabel(), j); part->Dump(); part2->Dump();
1114 TObject* object = tracks->RemoveAt(i);
1115 if (tracks->IsOwner())
1124 if (before > tracks->GetEntriesFast())
1125 AliInfo(Form("Reduced from %d to %d", before, tracks->GetEntriesFast()));
1128 void AliAnalysisTaskPhiCorrelations::CleanUp(TObjArray* tracks, TObject* mcObj, Int_t maxLabel)
1130 // calls RemoveInjectedSignals, RemoveWeakDecays and RemoveDuplicates
1132 if (fInjectedSignals)
1133 fAnalyseUE->RemoveInjectedSignals(tracks, mcObj, maxLabel);
1134 if (fRemoveWeakDecays)
1135 fAnalyseUE->RemoveWeakDecays(tracks, mcObj);
1136 if (fRemoveDuplicates)
1137 RemoveDuplicates(tracks);