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 **************************************************************************/
19 #include <TInterpreter.h>
28 #include <TParameter.h>
30 #include "AliAnalysisTaskPhiCorrelations.h"
31 #include "AliAnalyseLeadingTrackUE.h"
32 #include "AliUEHistograms.h"
33 #include "AliUEHist.h"
35 #include "AliAnalysisManager.h"
36 #include "AliAODHandler.h"
37 #include "AliAODInputHandler.h"
38 #include "AliAODMCParticle.h"
39 #include "AliInputEventHandler.h"
41 #include "AliMCEventHandler.h"
42 #include "AliVParticle.h"
43 #include "AliCFContainer.h"
44 #include "AliEventplane.h"
46 #include "AliESDEvent.h"
47 #include "AliESDInputHandler.h"
48 #include "AliMultiplicity.h"
49 #include "AliCentrality.h"
51 #include "AliAODMCHeader.h"
52 #include "AliGenCocktailEventHeader.h"
53 #include "AliGenEventHeader.h"
54 #include "AliCollisionGeometry.h"
56 #include "AliEventPoolManager.h"
58 #include "AliESDZDC.h"
59 #include "AliESDtrackCuts.h"
61 #include "AliHelperPID.h"
62 #include "AliAnalysisUtils.h"
65 ////////////////////////////////////////////////////////////////////////
67 // Analysis class for azimuthal correlation studies
68 // Based on the UE task from Sara Vallero and Jan Fiete
70 // This class needs input AODs.
71 // The output is a list of analysis-specific containers.
73 // The AOD can be either connected to the InputEventHandler
74 // for a chain of AOD files
76 // to the OutputEventHandler
77 // for a chain of ESD files,
78 // in this case the class should be in the train after the jet-finder
81 // Jan Fiete Grosse-Oetringhaus
83 ////////////////////////////////////////////////////////////////////////
86 ClassImp( AliAnalysisTaskPhiCorrelations )
87 ClassImp( AliDPhiBasicParticle )
89 //____________________________________________________________________
90 AliAnalysisTaskPhiCorrelations:: AliAnalysisTaskPhiCorrelations(const char* name):
91 AliAnalysisTask(name,""),
92 // general configuration
95 fReduceMemoryFootprint(kFALSE),
98 fTwoTrackEfficiencyStudy(kFALSE),
99 fTwoTrackEfficiencyCut(0),
100 fTwoTrackCutMinRadius(0.8),
102 fCourseCentralityBinning(kFALSE),
103 fSkipTrigger(kFALSE),
104 fInjectedSignals(kFALSE),
105 fRandomizeReactionPlane(kFALSE),
109 // pointers to UE classes
113 fEfficiencyCorrectionTriggers(0),
114 fEfficiencyCorrectionAssociated(0),
115 fCentralityWeights(0),
116 // handlers and events
124 // histogram settings
127 fnTracksVertex(1), // QA tracks pointing to principal vertex (= 3 default)
129 fAcceptOnlyMuEvents(kFALSE),
130 fCentralityMethod("V0M"),
133 fTrackEtaCutMin(-1.),
134 fTrackPhiCutEvPlMin(0.),
135 fTrackPhiCutEvPlMax(0.),
139 fSharedClusterCut(-1),
141 fFoundFractionCut(-1),
144 fSelectBit(AliVEvent::kMB|AliVEvent::kUserDefined),
145 fUseChargeHadrons(kFALSE),
146 fParticleSpeciesTrigger(-1),
147 fParticleSpeciesAssociated(-1),
148 fCheckMotherPDG(kTRUE),
149 fTrackletDphiCut(9999999.),
151 fTriggerSelectCharge(0),
152 fAssociatedSelectCharge(0),
153 fTriggerRestrictEta(-1),
154 fEtaOrdering(kFALSE),
155 fCutConversions(kFALSE),
156 fCutResonances(kFALSE),
157 fRejectResonanceDaughters(-1),
158 fFillOnlyStep0(kFALSE),
160 fRejectCentralityOutliers(kFALSE),
161 fRejectZeroTrackEvents(kFALSE),
162 fRemoveWeakDecays(kFALSE),
163 fRemoveDuplicates(kFALSE),
164 fSkipFastCluster(kFALSE),
165 fWeightPerEvent(kFALSE),
168 fTriggersFromDetector(0),
169 fAssociatedFromDetector(0),
170 fMCUseUncheckedCentrality(kFALSE),
173 // Default constructor
174 // Define input and output slots here
175 // Input slot #0 works with a TChain
176 DefineInput(0, TChain::Class());
177 // Output slot #0 writes into a TList container
178 DefineOutput(0, TList::Class());
181 AliAnalysisTaskPhiCorrelations::~AliAnalysisTaskPhiCorrelations()
185 if (fListOfHistos && !AliAnalysisManager::GetAnalysisManager()->IsProofMode())
186 delete fListOfHistos;
189 //____________________________________________________________________
190 void AliAnalysisTaskPhiCorrelations::ConnectInputData(Option_t* /*option*/)
193 // Connect the input data
194 if (fDebug > 1) AliInfo("ConnectInputData() ");
196 // Since AODs can either be connected to the InputEventHandler
197 // or to the OutputEventHandler ( the AOD is created by a previus task in the train )
198 // we need to get the pointer to the AODEvent correctly.
200 // Delta AODs are also accepted.
202 TObject* handler = AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
204 if( handler && handler->InheritsFrom("AliAODInputHandler") )
206 fAOD = ((AliAODInputHandler*)handler)->GetEvent();
207 if (fDebug > 1) AliInfo(" ==== Tracks and Jets from AliAODInputHandler");
211 handler = AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler();
212 if (handler && handler->InheritsFrom("AliAODHandler") )
214 fAOD = ((AliAODHandler*)handler)->GetAOD();
215 if (fDebug > 1) AliInfo(" ==== Tracks and Jets from AliAODHandler");
219 AliWarning("I can't get any AOD Event Handler");
223 if (handler && handler->InheritsFrom("AliESDInputHandler") )
225 // pointer received per event in ::Exec
226 if (fDebug > 1) AliInfo(" ==== Tracks and Jets from AliESDInputHandler");
229 // Initialize common pointers
233 //____________________________________________________________________
234 void AliAnalysisTaskPhiCorrelations::CreateOutputObjects()
236 // Create the output container
238 if (fDebug > 1) AliInfo("CreateOutputObjects()");
240 // Initialize class with main algorithms, event and track selection.
241 fAnalyseUE = new AliAnalyseLeadingTrackUE();
242 fAnalyseUE->SetParticleSelectionCriteria(fFilterBit, fUseChargeHadrons, fTrackEtaCut, fTrackEtaCutMin, fPtMin);
243 fAnalyseUE->SetDCAXYCut(fDCAXYCut);
244 fAnalyseUE->SetSharedClusterCut(fSharedClusterCut);
245 fAnalyseUE->SetCrossedRowsCut(fCrossedRowsCut);
246 fAnalyseUE->SetFoundFractionCut(fFoundFractionCut);
247 fAnalyseUE->SetTrackStatus(fTrackStatus);
248 fAnalyseUE->SetCheckMotherPDG(fCheckMotherPDG);
249 fAnalyseUE->SetDebug(fDebug);
250 fAnalyseUE->DefineESDCuts(fFilterBit);
251 fAnalyseUE->SetEventSelection(fSelectBit);
252 fAnalyseUE->SetHelperPID(fHelperPID);
253 if(fTrackPhiCutEvPlMax > 0.0001)
254 fAnalyseUE->SetParticlePhiCutEventPlane(fTrackPhiCutEvPlMin,fTrackPhiCutEvPlMax);
255 if ((fParticleSpeciesTrigger != -1 || fParticleSpeciesAssociated != -1) && !fHelperPID)
256 AliFatal("HelperPID object should be set in the steering macro");
258 // Initialize output list of containers
259 if (fListOfHistos != NULL){
260 delete fListOfHistos;
261 fListOfHistos = NULL;
264 fListOfHistos = new TList();
265 fListOfHistos->SetOwner(kTRUE);
268 // Initialize class to handle histograms
269 TString histType = "4R";
270 if (fUseVtxAxis == 1)
272 else if (fUseVtxAxis == 2)
274 if (fCourseCentralityBinning)
276 fHistos = new AliUEHistograms("AliUEHistogramsSame", histType, fCustomBinning);
277 fHistosMixed = new AliUEHistograms("AliUEHistogramsMixed", histType, fCustomBinning);
279 fHistos->SetSelectCharge(fSelectCharge);
280 fHistosMixed->SetSelectCharge(fSelectCharge);
282 fHistos->SetSelectTriggerCharge(fTriggerSelectCharge);
283 fHistosMixed->SetSelectTriggerCharge(fTriggerSelectCharge);
285 fHistos->SetSelectAssociatedCharge(fAssociatedSelectCharge);
286 fHistosMixed->SetSelectAssociatedCharge(fAssociatedSelectCharge);
288 fHistos->SetTriggerRestrictEta(fTriggerRestrictEta);
289 fHistosMixed->SetTriggerRestrictEta(fTriggerRestrictEta);
291 fHistos->SetOnlyOneEtaSide(fOnlyOneEtaSide);
292 fHistosMixed->SetOnlyOneEtaSide(fOnlyOneEtaSide);
294 fHistos->SetEtaOrdering(fEtaOrdering);
295 fHistosMixed->SetEtaOrdering(fEtaOrdering);
297 fHistos->SetPairCuts(fCutConversions, fCutResonances);
298 fHistosMixed->SetPairCuts(fCutConversions, fCutResonances);
300 fHistos->SetRejectResonanceDaughters(fRejectResonanceDaughters);
301 fHistosMixed->SetRejectResonanceDaughters(fRejectResonanceDaughters);
303 fHistos->SetTrackEtaCut(fTrackEtaCut);
304 fHistosMixed->SetTrackEtaCut(fTrackEtaCut);
306 fHistos->SetWeightPerEvent(fWeightPerEvent);
307 fHistosMixed->SetWeightPerEvent(fWeightPerEvent);
309 fHistos->SetPtOrder(fPtOrder);
310 fHistosMixed->SetPtOrder(fPtOrder);
312 fHistos->SetTwoTrackCutMinRadius(fTwoTrackCutMinRadius);
313 fHistosMixed->SetTwoTrackCutMinRadius(fTwoTrackCutMinRadius);
315 if (fEfficiencyCorrectionTriggers)
317 fHistos->SetEfficiencyCorrectionTriggers(fEfficiencyCorrectionTriggers);
318 fHistosMixed->SetEfficiencyCorrectionTriggers((THnF*) fEfficiencyCorrectionTriggers->Clone());
320 if (fEfficiencyCorrectionAssociated)
322 fHistos->SetEfficiencyCorrectionAssociated(fEfficiencyCorrectionAssociated);
323 fHistosMixed->SetEfficiencyCorrectionAssociated((THnF*) fEfficiencyCorrectionAssociated->Clone());
326 // add histograms to list
327 fListOfHistos->Add(fHistos);
328 fListOfHistos->Add(fHistosMixed);
329 // add HelperPID to list
331 fListOfHistos->Add(fHelperPID);
334 fListOfHistos->Add(fMap);
336 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));
337 fListOfHistos->Add(new TH1F("eventStat", ";;events", 4, -0.5, 3.5));
338 fListOfHistos->Add(new TH2F("mixedDist", ";centrality;tracks;events", 101, 0, 101, 200, 0, fMixingTracks * 1.5));
339 fListOfHistos->Add(new TH2F("referenceMultiplicity", ";centrality;tracks;events", 101, 0, 101, 200, 0, 200));
340 if (fCentralityMethod == "V0A_MANUAL")
342 fListOfHistos->Add(new TH2F("V0AMult", "V0A multiplicity;V0A multiplicity;V0A multiplicity (scaled)", 1000, -.5, 999.5, 1000, -.5, 999.5));
343 fListOfHistos->Add(new TH2F("V0AMultCorrelation", "V0A multiplicity;V0A multiplicity;SPD tracklets", 1000, -.5, 999.5, 1000, -.5, 999.5));
345 if (fTriggersFromDetector == 1 || fTriggersFromDetector == 2 || fAssociatedFromDetector == 1 || fAssociatedFromDetector == 2)
346 fListOfHistos->Add(new TH1F("V0SingleCells", "V0 single cell multiplicity;multiplicity;events", 100, -0.5, 99.5));
347 if (fTriggersFromDetector == 3 || fAssociatedFromDetector == 3)
348 fListOfHistos->Add(new TH1F("DphiTrklets", "tracklets Dphi;#Delta#phi,trklets (mrad);entries", 100, -100, 100));
350 PostData(0,fListOfHistos);
352 // Add task configuration to output list
356 Int_t poolsize = 1000; // Maximum number of events, ignored in the present implemention of AliEventPoolManager
358 Int_t nCentralityBins = fHistos->GetUEHist(2)->GetEventHist()->GetNBins(1);
359 Double_t* centralityBins = (Double_t*) fHistos->GetUEHist(2)->GetEventHist()->GetAxis(1, 0)->GetXbins()->GetArray();
361 const Int_t kNZvtxBins = 10+(1+10)*4;
362 // bins for further buffers are shifted by 100 cm
363 Double_t vertexBins[kNZvtxBins+1] = { -10, -8, -6, -4, -2, 0, 2, 4, 6, 8, 10,
364 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110,
365 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210,
366 290, 292, 294, 296, 298, 300, 302, 304, 306, 308, 310,
367 390, 392, 394, 396, 398, 400, 402, 404, 406, 408, 410 };
369 Int_t nZvtxBins = kNZvtxBins;
370 Double_t* zvtxbin = vertexBins;
372 if (fMode == 0 && fHistos->GetUEHist(2)->GetEventHist()->GetNVar() > 2)
374 nZvtxBins = fHistos->GetUEHist(2)->GetEventHist()->GetNBins(2);
375 zvtxbin = (Double_t*) fHistos->GetUEHist(2)->GetEventHist()->GetAxis(2, 0)->GetXbins()->GetArray();
378 fPoolMgr = new AliEventPoolManager(poolsize, fMixingTracks, nCentralityBins, centralityBins, nZvtxBins, zvtxbin);
379 fPoolMgr->SetTargetValues(fMixingTracks, 0.1, 5);
382 //____________________________________________________________________
383 void AliAnalysisTaskPhiCorrelations::Exec(Option_t */*option*/)
386 fAnalyseUE->NextEvent();
388 // receive ESD pointer if we are not running AOD analysis
391 AliVEventHandler* handler = AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
392 if (handler && handler->InheritsFrom("AliESDInputHandler"))
393 fESD = ((AliESDInputHandler*)handler)->GetEvent();
401 fMcEvent = fMcHandler->MCEvent();
405 // array of MC particles
406 fArrayMC = dynamic_cast<TClonesArray*>(fAOD->FindListObject(AliAODMCParticle::StdBranchName()));
408 AliFatal("No array of MC particles found !!!");
411 AnalyseCorrectionMode();
413 else AnalyseDataMode();
416 /******************** ANALYSIS METHODS *****************************/
418 //____________________________________________________________________
419 void AliAnalysisTaskPhiCorrelations::AddSettingsTree()
421 //Write settings to output list
422 TTree *settingsTree = new TTree("UEAnalysisSettings","Analysis Settings in UE estimation");
423 settingsTree->Branch("fnTracksVertex", &fnTracksVertex,"nTracksVertex/I");
424 settingsTree->Branch("fZVertex", &fZVertex,"ZVertex/D");
425 settingsTree->Branch("fAcceptOnlyMuEvents", &fAcceptOnlyMuEvents,"AcceptOnlyMuEvents/O");
426 //settingsTree->Branch("fCentralityMethod", fCentralityMethod.Data(),"CentralityMethod/C");
427 settingsTree->Branch("fTrackEtaCut", &fTrackEtaCut, "TrackEtaCut/D");
428 settingsTree->Branch("fTrackEtaCutMin", &fTrackEtaCutMin, "TrackEtaCutMin/D");
429 settingsTree->Branch("fTrackPhiCutEvPlMin", &fTrackPhiCutEvPlMin, "TrackPhiCutEvPlMin/D");
430 settingsTree->Branch("fTrackPhiCutEvPlMax", &fTrackPhiCutEvPlMax, "TrackPhiCutEvPlMax/D");
431 settingsTree->Branch("fOnlyOneEtaSide", &fOnlyOneEtaSide,"OnlyOneEtaSide/I");
432 settingsTree->Branch("fPtMin", &fPtMin, "PtMin/D");
433 settingsTree->Branch("fFilterBit", &fFilterBit,"FilterBit/I");
434 settingsTree->Branch("fSharedClusterCut", &fSharedClusterCut,"SharedClusterCut/D");
435 settingsTree->Branch("fCrossedRowsCut", &fCrossedRowsCut,"CrossedRowsCut/I");
436 settingsTree->Branch("fFoundFractionCut", &fFoundFractionCut,"FoundFractionCut/D");
437 settingsTree->Branch("fTrackStatus", &fTrackStatus,"TrackStatus/I");
438 settingsTree->Branch("fSelectBit", &fSelectBit,"EventSelectionBit/I");
439 settingsTree->Branch("fUseChargeHadrons", &fUseChargeHadrons,"UseChHadrons/O");
440 settingsTree->Branch("fParticleSpeciesTrigger", &fParticleSpeciesTrigger,"ParticleSpeciesTrigger/I");
441 settingsTree->Branch("fParticleSpeciesAssociated", &fParticleSpeciesAssociated,"ParticleSpeciesAssociated/I");
442 settingsTree->Branch("fCheckMotherPDG", &fCheckMotherPDG,"CheckMotherPDG/I");
443 settingsTree->Branch("fSelectCharge", &fSelectCharge,"SelectCharge/I");
444 settingsTree->Branch("fTriggerSelectCharge", &fTriggerSelectCharge,"TriggerSelectCharge/I");
445 settingsTree->Branch("fAssociatedSelectCharge", &fAssociatedSelectCharge,"fAssociatedSelectCharge/I");
446 settingsTree->Branch("fTriggerRestrictEta", &fTriggerRestrictEta,"TriggerRestrictEta/D");
447 settingsTree->Branch("fEtaOrdering", &fEtaOrdering,"EtaOrdering/O");
448 settingsTree->Branch("fCutConversions", &fCutConversions,"CutConversions/O");
449 settingsTree->Branch("fCutResonances", &fCutResonances,"CutResonances/O");
450 settingsTree->Branch("fRejectResonanceDaughters", &fRejectResonanceDaughters,"RejectResonanceDaughters/I");
451 settingsTree->Branch("fFillpT", &fFillpT,"FillpT/O");
452 settingsTree->Branch("fMixingTracks", &fMixingTracks,"MixingTracks/I");
453 settingsTree->Branch("fSkipTrigger", &fSkipTrigger,"SkipTrigger/O");
454 settingsTree->Branch("fInjectedSignals", &fInjectedSignals,"InjectedSignals/O");
455 settingsTree->Branch("fRandomizeReactionPlane", &fRandomizeReactionPlane,"RandomizeReactionPlane/O");
456 settingsTree->Branch("fRejectCentralityOutliers", &fRejectCentralityOutliers,"RejectCentralityOutliers/O");
457 settingsTree->Branch("fRejectZeroTrackEvents", &fRejectZeroTrackEvents,"RejectZeroTrackEvents/O");
458 settingsTree->Branch("fRemoveWeakDecays", &fRemoveWeakDecays,"RemoveWeakDecays/O");
459 settingsTree->Branch("fRemoveDuplicates", &fRemoveDuplicates,"RemoveDuplicates/O");
460 settingsTree->Branch("fSkipFastCluster", &fSkipFastCluster,"SkipFastCluster/O");
461 settingsTree->Branch("fWeightPerEvent", &fWeightPerEvent,"WeightPerEvent/O");
462 settingsTree->Branch("fPtOrder", &fPtOrder,"PtOrder/O");
463 settingsTree->Branch("fTriggersFromDetector", &fTriggersFromDetector,"TriggersFromDetector/I");
464 settingsTree->Branch("fAssociatedFromDetector", &fAssociatedFromDetector,"AssociatedFromDetector/I");
465 settingsTree->Branch("fMCUseUncheckedCentrality", &fMCUseUncheckedCentrality,"MCUseUncheckedCentrality/O");
466 settingsTree->Branch("fTwoTrackEfficiencyCut", &fTwoTrackEfficiencyCut,"TwoTrackEfficiencyCut/D");
467 settingsTree->Branch("fTwoTrackCutMinRadius", &fTwoTrackCutMinRadius,"TwoTrackCutMinRadius/D");
471 settingsTree->Fill();
472 fListOfHistos->Add(settingsTree);
475 //____________________________________________________________________
476 void AliAnalysisTaskPhiCorrelations::AnalyseCorrectionMode()
478 // Run the analysis on MC to get the correction maps
481 if ( fDebug > 3 ) AliInfo( " Processing event in Corrections mode ..." );
483 Double_t centrality = 0;
485 if (fCentralityMethod.Length() > 0)
487 if (fCentralityMethod == "MC_b")
489 AliGenEventHeader* eventHeader = GetFirstHeader();
492 // We avoid AliFatal here, because the AOD productions sometimes have events where the MC header is missing
493 // (due to unreadable Kinematics) and we don't want to loose the whole job because of a few events
494 AliError("Event header not found. Skipping this event.");
495 fHistos->FillEvent(0, AliUEHist::kCFStepAnaTopology);
499 AliCollisionGeometry* collGeometry = dynamic_cast<AliCollisionGeometry*> (eventHeader);
503 AliFatal("Asking for MC_b centrality, but event header has no collision geometry information");
506 centrality = collGeometry->ImpactParameter();
508 else if (fCentralityMethod == "nano")
510 centrality = (Float_t) gROOT->ProcessLine(Form("100.0 + 100.0 * ((AliNanoAODHeader*) %p)->GetCentrality(\"%s\")", fAOD->GetHeader(), fCentralityMethod.Data())) / 100 - 1.0;
514 AliCentrality *centralityObj = 0;
516 centralityObj = fAOD->GetHeader()->GetCentralityP();
518 centralityObj = fESD->GetCentrality();
522 if (fMCUseUncheckedCentrality)
523 centrality = centralityObj->GetCentralityPercentileUnchecked(fCentralityMethod);
525 centrality = centralityObj->GetCentralityPercentile(fCentralityMethod);
529 Printf("WARNING: Centrality object is 0");
534 AliInfo(Form("Centrality is %f", centrality));
537 // Support for ESD and AOD based analysis
538 AliVEvent* inputEvent = fAOD;
546 fHistos->SetRunNumber(inputEvent->GetRunNumber());
547 bSign = (inputEvent->GetMagneticField() > 0) ? 1 : -1;
550 TObject* mc = fArrayMC;
555 fHistos->FillEvent(centrality, -1);
560 // Only consider MC events within the vtx-z region used also as cut on the reconstructed vertex
561 TObject* vertexSupplier = fMcEvent;
563 vertexSupplier = fAOD->FindListObject(AliAODMCHeader::StdBranchName());
565 if (!fAnalyseUE->VertexSelection(vertexSupplier, 0, fZVertex))
570 zVtx = ((AliAODMCHeader*) vertexSupplier)->GetVtxZ();
572 zVtx = fMcEvent->GetPrimaryVertex()->GetZ();
577 // For productions with injected signals, figure out above which label to skip particles/tracks
578 Int_t skipParticlesAbove = 0;
579 if (fInjectedSignals)
581 AliGenEventHeader* eventHeader = 0;
587 AliHeader* header = (AliHeader*) fMcEvent->Header();
589 AliFatal("fInjectedSignals set but no MC header found");
591 AliGenCocktailEventHeader* cocktailHeader = dynamic_cast<AliGenCocktailEventHeader*> (header->GenEventHeader());
595 AliFatal("fInjectedSignals set but no MC cocktail header found");
598 headers = cocktailHeader->GetHeaders()->GetEntries();
599 eventHeader = dynamic_cast<AliGenEventHeader*> (cocktailHeader->GetHeaders()->First());
603 for (Int_t i=0; i<cocktailHeader->GetHeaders()->GetEntries(); i++)
605 AliGenEventHeader* headerTmp = dynamic_cast<AliGenEventHeader*> (cocktailHeader->GetHeaders()->At(i));
607 Printf("%d particles in header:", headerTmp->NProduced());
608 cocktailHeader->GetHeaders()->At(i)->Dump();
615 AliAODMCHeader* header = (AliAODMCHeader*) fAOD->GetList()->FindObject(AliAODMCHeader::StdBranchName());
617 AliFatal("fInjectedSignals set but no MC header found");
619 headers = header->GetNCocktailHeaders();
620 eventHeader = header->GetCocktailHeader(0);
625 // We avoid AliFatal here, because the AOD productions sometimes have events where the MC header is missing
626 // (due to unreadable Kinematics) and we don't want to loose the whole job because of a few events
627 AliError("First event header not found. Skipping this event.");
628 fHistos->FillEvent(centrality, AliUEHist::kCFStepAnaTopology);
632 skipParticlesAbove = eventHeader->NProduced();
633 AliInfo(Form("Injected signals in this event (%d headers). Keeping particles/tracks of %s. Will skip particles/tracks above %d.", headers, eventHeader->ClassName(), skipParticlesAbove));
636 if (fCentralityWeights && !AcceptEventCentralityWeight(centrality))
638 AliInfo(Form("Rejecting event because of centrality weighting: %f", centrality));
639 fHistos->FillEvent(centrality, AliUEHist::kCFStepAnaTopology);
645 TObjArray* tmpList = fAnalyseUE->GetAcceptedParticles(mc, 0, kTRUE, fParticleSpeciesTrigger, kTRUE);
646 CleanUp(tmpList, mc, skipParticlesAbove);
647 TObjArray* tracksMC = CloneAndReduceTrackList(tmpList);
651 TObjArray* tracksCorrelateMC = tracksMC;
652 if (fParticleSpeciesAssociated != fParticleSpeciesTrigger)
654 tmpList = fAnalyseUE->GetAcceptedParticles(mc, 0, kTRUE, fParticleSpeciesAssociated, kTRUE);
655 CleanUp(tmpList, mc, skipParticlesAbove);
656 tracksCorrelateMC = CloneAndReduceTrackList(tmpList);
660 if (fRandomizeReactionPlane)
662 Double_t centralityDigits = centrality*1000. - (Int_t)(centrality*1000.);
663 Double_t angle = TMath::TwoPi() * centralityDigits;
664 AliInfo(Form("Shifting phi of all tracks by %f (digits %f)", angle, centralityDigits));
665 ShiftTracks(tracksMC, angle);
666 if (tracksCorrelateMC != tracksMC)
667 ShiftTracks(tracksCorrelateMC, angle);
673 // Event selection based on number of number of MC particles
674 if (fRejectZeroTrackEvents && tracksMC->GetEntriesFast() == 0)
676 AliInfo(Form("Rejecting event due to kinematic selection: %f %d", centrality, tracksMC->GetEntriesFast()));
677 fHistos->FillEvent(centrality, AliUEHist::kCFStepAnaTopology);
678 if (tracksMC != tracksCorrelateMC)
679 delete tracksCorrelateMC;
684 // (MC-true all particles)
686 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepAll, tracksMC, tracksCorrelateMC, weight);
691 AliEventPool* pool = fPoolMgr->GetEventPool(centrality, zVtx);
693 ((TH2F*) fListOfHistos->FindObject("mixedDist"))->Fill(centrality, pool->NTracksInPool());
695 for (Int_t jMix=0; jMix<pool->GetCurrentNEvents(); jMix++)
696 fHistosMixed->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepAll, tracksMC, pool->GetEvent(jMix), 1.0 / pool->GetCurrentNEvents(), (jMix == 0));
697 pool->UpdatePool(CloneAndReduceTrackList(tracksCorrelateMC));
700 // Printf("trigger: %d", ((AliInputEventHandler*)fInputHandler)->IsEventSelected());
702 // Trigger selection ************************************************
703 if (!fFillOnlyStep0 && (fSkipTrigger || fAnalyseUE->TriggerSelection(fInputHandler)))
705 // (MC-true all particles)
707 if (!fReduceMemoryFootprint)
708 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepTriggered, tracksMC, tracksCorrelateMC, weight);
710 fHistos->FillEvent(centrality, AliUEHist::kCFStepTriggered);
713 AliFatal("UNEXPECTED: inputEvent is 0. Trigger selection should have failed");
717 // Vertex selection *************************************************
718 if (fAnalyseUE->VertexSelection(inputEvent, fnTracksVertex, fZVertex))
720 // fill here for tracking efficiency
721 // loop over particle species
723 for (Int_t particleSpecies = 0; particleSpecies < 4; particleSpecies++)
725 TObjArray* primMCParticles = fAnalyseUE->GetAcceptedParticles(mc, 0x0, kTRUE, particleSpecies, kTRUE);
726 TObjArray* primRecoTracksMatched = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kTRUE, particleSpecies, kTRUE, kFALSE);
727 TObjArray* allRecoTracksMatched = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kFALSE, particleSpecies, kTRUE, kFALSE);
728 TObjArray* primRecoTracksMatchedPID = 0;
729 TObjArray* allRecoTracksMatchedPID = 0;
733 primRecoTracksMatchedPID = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kTRUE, particleSpecies, kTRUE, kTRUE);
734 allRecoTracksMatchedPID = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kFALSE, particleSpecies, kTRUE, kTRUE);
737 CleanUp(primMCParticles, mc, skipParticlesAbove);
738 CleanUp(primRecoTracksMatched, mc, skipParticlesAbove);
739 CleanUp(allRecoTracksMatched, mc, skipParticlesAbove);
740 CleanUp(primRecoTracksMatchedPID, mc, skipParticlesAbove);
741 CleanUp(allRecoTracksMatchedPID, mc, skipParticlesAbove);
744 if (fTriggerSelectCharge != 0)
746 SelectCharge(primMCParticles);
747 SelectCharge(primRecoTracksMatched);
748 SelectCharge(allRecoTracksMatched);
749 SelectCharge(primRecoTracksMatchedPID);
750 SelectCharge(allRecoTracksMatchedPID);
753 fHistos->FillTrackingEfficiency(primMCParticles, primRecoTracksMatched, allRecoTracksMatched, primRecoTracksMatchedPID, allRecoTracksMatchedPID, 0, particleSpecies, centrality, zVtx);
755 // Printf("%d --> %d %d %d", particleSpecies, primMCParticles->GetEntries(), primRecoTracksMatched->GetEntries(), allRecoTracksMatched->GetEntries());
757 delete primMCParticles;
758 delete primRecoTracksMatched;
759 delete allRecoTracksMatched;
762 TObjArray* fakeParticles = fAnalyseUE->GetFakeParticles(inputEvent, mc, kFALSE, -1, kTRUE);
763 CleanUp((TObjArray*) fakeParticles->At(0), mc, skipParticlesAbove);
764 CleanUp((TObjArray*) fakeParticles->At(1), mc, skipParticlesAbove);
766 fHistos->FillTrackingEfficiency(0, 0, 0, 0, 0, (TObjArray*) fakeParticles->At(2), 0, centrality, zVtx);
767 fHistos->FillFakePt(fakeParticles, centrality);
768 // Printf(">>>>> %d %d %d fakes", ((TObjArray*) fakeParticles->At(0))->GetEntriesFast(), ((TObjArray*) fakeParticles->At(1))->GetEntriesFast(), ((TObjArray*) fakeParticles->At(2))->GetEntriesFast());
769 delete fakeParticles;
771 // (MC-true all particles)
773 if (!fReduceMemoryFootprint)
774 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepVertex, tracksMC, tracksCorrelateMC, weight);
776 fHistos->FillEvent(centrality, AliUEHist::kCFStepVertex);
778 // Get MC primaries that match reconstructed track
780 tmpList = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kTRUE, fParticleSpeciesTrigger, kTRUE);
781 CleanUp(tmpList, mc, skipParticlesAbove);
782 TObjArray* tracksRecoMatchedPrim = CloneAndReduceTrackList(tmpList);
786 TObjArray* tracksCorrelateRecoMatchedPrim = tracksRecoMatchedPrim;
787 if (fParticleSpeciesAssociated != fParticleSpeciesTrigger)
789 tmpList = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kTRUE, fParticleSpeciesAssociated, kTRUE);
790 CleanUp(tmpList, mc, skipParticlesAbove);
791 tracksCorrelateRecoMatchedPrim = CloneAndReduceTrackList(tmpList);
795 // (RECO-matched (quantities from MC particle) primary particles)
797 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepTrackedOnlyPrim, tracksRecoMatchedPrim, tracksCorrelateRecoMatchedPrim, weight);
802 AliEventPool* pool = fPoolMgr->GetEventPool(centrality, zVtx + 200);
804 for (Int_t jMix=0; jMix<pool->GetCurrentNEvents(); jMix++)
805 fHistosMixed->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepTrackedOnlyPrim, tracksRecoMatchedPrim, pool->GetEvent(jMix), 1.0 / pool->GetCurrentNEvents(), (jMix == 0));
806 pool->UpdatePool(CloneAndReduceTrackList(tracksCorrelateRecoMatchedPrim));
809 // Get MC primaries + secondaries that match reconstructed track
811 tmpList = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kFALSE, fParticleSpeciesTrigger, kTRUE);
812 CleanUp(tmpList, mc, skipParticlesAbove);
813 TObjArray* tracksRecoMatchedAll = CloneAndReduceTrackList(tmpList);
817 TObjArray* tracksCorrelateRecoMatchedAll = tracksRecoMatchedAll;
818 if (fParticleSpeciesAssociated != fParticleSpeciesTrigger)
820 tmpList = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kFALSE, fParticleSpeciesAssociated, kTRUE);
821 CleanUp(tmpList, mc, skipParticlesAbove);
822 tracksCorrelateRecoMatchedAll = CloneAndReduceTrackList(tmpList);
826 // (RECO-matched (quantities from MC particle) all particles)
828 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepTracked, tracksRecoMatchedAll, tracksCorrelateRecoMatchedAll, weight);
833 AliEventPool* pool = fPoolMgr->GetEventPool(centrality, zVtx + 300);
835 for (Int_t jMix=0; jMix<pool->GetCurrentNEvents(); jMix++)
836 fHistosMixed->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepTracked, tracksRecoMatchedAll, pool->GetEvent(jMix), 1.0 / pool->GetCurrentNEvents(), (jMix == 0));
837 pool->UpdatePool(CloneAndReduceTrackList(tracksCorrelateRecoMatchedAll));
842 tmpList = fAnalyseUE->GetAcceptedParticles(inputEvent, 0, kTRUE, fParticleSpeciesTrigger, kTRUE);
843 CleanUp(tmpList, mc, skipParticlesAbove);
844 TObjArray* tracks = CloneAndReduceTrackList(tmpList);
848 TObjArray* tracksCorrelate = tracks;
849 if (fParticleSpeciesAssociated != fParticleSpeciesTrigger)
851 tmpList = fAnalyseUE->GetAcceptedParticles(inputEvent, 0, kTRUE, fParticleSpeciesAssociated, kTRUE);
852 CleanUp(tmpList, mc, skipParticlesAbove);
853 tracksCorrelate = CloneAndReduceTrackList(tmpList);
860 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepReconstructed, tracks, tracksCorrelate, weight);
862 // two track cut, STEP 8
863 if (fTwoTrackEfficiencyCut > 0)
864 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepBiasStudy, tracks, tracksCorrelate, weight, kTRUE, kTRUE, bSign, fTwoTrackEfficiencyCut);
866 // apply correction efficiency, STEP 10
867 if (fEfficiencyCorrectionTriggers || fEfficiencyCorrectionAssociated)
869 // with or without two track efficiency depending on if fTwoTrackEfficiencyCut is set
870 Bool_t twoTrackCut = (fTwoTrackEfficiencyCut > 0);
872 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepCorrected, tracks, tracksCorrelate, weight, kTRUE, twoTrackCut, bSign, fTwoTrackEfficiencyCut, kTRUE);
878 AliEventPool* pool2 = fPoolMgr->GetEventPool(centrality, zVtx + 100);
879 ((TH2F*) fListOfHistos->FindObject("mixedDist"))->Fill(centrality, pool2->NTracksInPool());
880 if (pool2->IsReady())
882 for (Int_t jMix=0; jMix<pool2->GetCurrentNEvents(); jMix++)
886 fHistosMixed->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepReconstructed, tracks, pool2->GetEvent(jMix), 1.0 / pool2->GetCurrentNEvents(), (jMix == 0));
888 // two track cut, STEP 8
889 if (fTwoTrackEfficiencyCut > 0)
890 fHistosMixed->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepBiasStudy, tracks, pool2->GetEvent(jMix), 1.0 / pool2->GetCurrentNEvents(), (jMix == 0), kTRUE, bSign, fTwoTrackEfficiencyCut);
892 // apply correction efficiency, STEP 10
893 if (fEfficiencyCorrectionTriggers || fEfficiencyCorrectionAssociated)
895 // with or without two track efficiency depending on if fTwoTrackEfficiencyCut is set
896 Bool_t twoTrackCut = (fTwoTrackEfficiencyCut > 0);
898 fHistosMixed->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepCorrected, tracks, pool2->GetEvent(jMix), 1.0 / pool2->GetCurrentNEvents(), (jMix == 0), twoTrackCut, bSign, fTwoTrackEfficiencyCut, kTRUE);
902 pool2->UpdatePool(CloneAndReduceTrackList(tracksCorrelate));
905 if (0 && !fReduceMemoryFootprint)
907 // make list of secondaries (matched with MC)
908 TObjArray* tracksRecoMatchedSecondaries = new TObjArray;
909 for (Int_t i=0; i<tracksRecoMatchedAll->GetEntriesFast(); i++)
910 if (((AliAODMCParticle*)tracksRecoMatchedAll->At(i))->IsPhysicalPrimary() == kFALSE)
911 tracksRecoMatchedSecondaries->Add(tracksRecoMatchedAll->At(i));
913 // Study: Use only secondaries as trigger particles and plot the correlation vs. all particles; store in step 9
914 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepBiasStudy2, tracksRecoMatchedSecondaries, tracksRecoMatchedAll, weight);
916 // Study: Use only primaries as trigger particles and plot the correlation vs. secondaries; store in step 8
917 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepBiasStudy, tracksRecoMatchedPrim, tracksRecoMatchedSecondaries, weight);
919 // plot delta phi vs process id of secondaries
920 // trigger particles: primaries in 4 < pT < 10
921 // associated particles: secondaries in 1 < pT < 10
923 for (Int_t i=0; i<tracksRecoMatchedPrim->GetEntriesFast(); i++)
925 AliVParticle* triggerParticle = (AliVParticle*) tracksRecoMatchedPrim->At(i);
927 if (triggerParticle->Pt() < 4 || triggerParticle->Pt() > 10)
930 for (Int_t j=0; j<tracksRecoMatchedSecondaries->GetEntriesFast(); j++)
932 AliAODMCParticle* particle = (AliAODMCParticle*) tracksRecoMatchedSecondaries->At(j);
934 if (particle->Pt() < 1 || particle->Pt() > 10)
937 if (particle->Pt() > triggerParticle->Pt())
940 Double_t deltaPhi = triggerParticle->Phi() - particle->Phi();
941 if (deltaPhi > 1.5 * TMath::Pi())
942 deltaPhi -= TMath::TwoPi();
943 if (deltaPhi < -0.5 * TMath::Pi())
944 deltaPhi += TMath::TwoPi();
946 Int_t processID = fMcEvent->Stack()->Particle(particle->GetLabel())->GetUniqueID();
948 ((TH2F*) fListOfHistos->FindObject("processIDs"))->Fill(deltaPhi, processID);
952 delete tracksRecoMatchedSecondaries;
955 if (tracksCorrelateRecoMatchedPrim != tracksRecoMatchedPrim)
956 delete tracksCorrelateRecoMatchedPrim;
957 delete tracksRecoMatchedPrim;
959 if (tracksCorrelateRecoMatchedAll != tracksRecoMatchedAll)
960 delete tracksCorrelateRecoMatchedAll;
961 delete tracksRecoMatchedAll;
963 if (tracksCorrelate != tracks)
964 delete tracksCorrelate;
969 if (tracksMC != tracksCorrelateMC)
970 delete tracksCorrelateMC;
974 //____________________________________________________________________
975 AliGenEventHeader* AliAnalysisTaskPhiCorrelations::GetFirstHeader()
977 // get first MC header from either ESD/AOD (including cocktail header if available)
982 AliHeader* header = (AliHeader*) fMcEvent->Header();
986 AliGenCocktailEventHeader* cocktailHeader = dynamic_cast<AliGenCocktailEventHeader*> (header->GenEventHeader());
988 return dynamic_cast<AliGenEventHeader*> (cocktailHeader->GetHeaders()->First());
990 return dynamic_cast<AliGenEventHeader*> (header->GenEventHeader());
995 AliAODMCHeader* header = (AliAODMCHeader*) fAOD->GetList()->FindObject(AliAODMCHeader::StdBranchName());
999 return header->GetCocktailHeader(0);
1003 //____________________________________________________________________
1004 void AliAnalysisTaskPhiCorrelations::AnalyseDataMode()
1007 // Run the analysis on DATA or MC to get raw distributions
1009 if ( fDebug > 3 ) AliInfo( " Processing event in Data mode ..." );
1011 ((TH1F*) fListOfHistos->FindObject("eventStat"))->Fill(0);
1016 // skip not selected events here (the AOD is not updated for those)
1017 if (!fSkipTrigger && !(fInputHandler->IsEventSelected() & fSelectBit))
1020 // skip fast cluster events here if requested
1021 if (fSkipFastCluster && (fInputHandler->IsEventSelected() & AliVEvent::kFastOnly))
1024 // Support for ESD and AOD based analysis
1025 AliVEvent* inputEvent = fAOD;
1029 Double_t centrality = 0;
1031 AliCentrality *centralityObj = 0;
1032 if (fCentralityMethod.Length() > 0)
1034 if (fCentralityMethod == "ZNA_MANUAL")
1036 Bool_t zna = kFALSE;
1037 for(Int_t j = 0; j < 4; ++j) {
1038 if (fESD->GetZDCData()->GetZDCTDCData(12,j) != 0) {
1043 // Printf("%d %f", zna, fZNAtower[0]);
1046 // code from Chiara O (23.10.12)
1047 const Double_t *fZNAtower = fESD->GetZDCData()->GetZN2TowerEnergy();
1048 Float_t znacut[4] = {681., 563., 413., 191.};
1050 if(fZNAtower[0]>znacut[0]) centrality = 1;
1051 else if(fZNAtower[0]>znacut[1]) centrality = 21;
1052 else if(fZNAtower[0]>znacut[2]) centrality = 41;
1053 else if(fZNAtower[0]>znacut[3]) centrality = 61;
1054 else centrality = 81;
1059 else if (fCentralityMethod == "TRACKS_MANUAL")
1062 TObjArray* tracks = fAnalyseUE->GetAcceptedParticles(inputEvent, 0, kTRUE, -1, kTRUE);
1063 centrality = tracks->GetEntriesFast();
1064 if (centrality > 40)
1066 // Printf("%d %f", tracks->GetEntriesFast(), centrality);
1069 else if (fCentralityMethod == "V0A_MANUAL")
1073 //Total multiplicity in the VZERO A detector
1074 Float_t MV0A=inputEvent->GetVZEROData()->GetMTotV0A();
1075 Float_t MV0AScaled=0.;
1077 TParameter<float>* sf=(TParameter<float>*)fMap->GetValue(Form("%d",inputEvent->GetRunNumber()));
1078 if(sf)MV0AScaled=MV0A*sf->GetVal();
1082 centrality = MV0AScaled;
1086 else if (fCentralityMethod == "nano")
1088 // fAOD->GetHeader()->Dump();
1089 // Printf("%p %p %d", dynamic_cast<AliNanoAODHeader*> (fAOD->GetHeader()), dynamic_cast<AliNanoAODHeader*> ((TObject*) (fAOD->GetHeader())), fAOD->GetHeader()->InheritsFrom("AliNanoAODHeader"));
1092 centrality = (Float_t) gROOT->ProcessLine(Form("100.0 + 100.0 * ((AliNanoAODHeader*) %p)->GetCentrality(\"%s\")", fAOD->GetHeader(), fCentralityMethod.Data()), &error) / 100 - 1.0;
1093 if (error != TInterpreter::kNoError)
1099 centralityObj = fAOD->GetHeader()->GetCentralityP();
1101 centralityObj = fESD->GetCentrality();
1104 centrality = centralityObj->GetCentralityPercentile(fCentralityMethod);
1105 //centrality = centralityObj->GetCentralityPercentileUnchecked(fCentralityMethod);
1112 if (centrality == 0)
1114 if (fAOD->GetVZEROData())
1117 for (Int_t i=0; i<64; i++)
1118 multV0 += fAOD->GetVZEROData()->GetMultiplicity(i);
1122 AliInfo("Rejecting event due to too small V0 multiplicity");
1129 AliInfo(Form("Centrality is %f", centrality));
1132 Float_t bSign = (inputEvent->GetMagneticField() > 0) ? 1 : -1;
1134 fHistos->SetRunNumber(inputEvent->GetRunNumber());
1136 // Fill the "event-counting-container", it is needed to get the number of events remaining after each event-selection cut
1137 fHistos->FillEvent(centrality, AliUEHist::kCFStepAll);
1139 // Trigger selection ************************************************
1140 if (!fSkipTrigger && !fAnalyseUE->TriggerSelection(fInputHandler)) return;
1142 // Fill the "event-counting-container", it is needed to get the number of events remaining after each event-selection cut
1143 fHistos->FillEvent(centrality, AliUEHist::kCFStepTriggered);
1145 // Pileup selection ************************************************
1146 if (fAnalysisUtils && fAnalysisUtils->IsPileUpEvent(inputEvent))
1148 // count the removed events
1149 fHistos->FillEvent(centrality, AliUEHist::kCFStepAnaTopology);
1154 // Reject events without a muon in the muon arm ************************************************
1155 if(fAcceptOnlyMuEvents && !IsMuEvent())return;
1157 // Vertex selection *************************************************
1158 if(!fAnalyseUE->VertexSelection(inputEvent, fnTracksVertex, fZVertex)) return;
1160 // Fill the "event-counting-container", it is needed to get the number of events remaining after each event-selection cut
1161 fHistos->FillEvent(centrality, AliUEHist::kCFStepVertex);
1163 // fill V0 control histograms
1164 if (fCentralityMethod == "V0A_MANUAL")
1166 ((TH2F*) fListOfHistos->FindObject("V0AMult"))->Fill(inputEvent->GetVZEROData()->GetMTotV0A(), centrality);
1168 ((TH2F*) fListOfHistos->FindObject("V0AMultCorrelation"))->Fill(inputEvent->GetVZEROData()->GetMTotV0A(), fAOD->GetTracklets()->GetNumberOfTracklets());
1175 TObjArray* tracks = 0;
1177 Double_t evtPlanePhi = -999.; //A value outside [-pi/2,pi/2] will be ignored
1178 if(fTrackPhiCutEvPlMax > 0.0001) {
1179 AliEventplane* evtPlane = inputEvent->GetEventplane();
1180 Double_t qx = 0; Double_t qy = 0;
1181 if(evtPlane) evtPlanePhi = evtPlane->CalculateVZEROEventPlane(inputEvent, 10, 2, qx, qy);
1182 //Reject event if the plane is not available
1186 if (fTriggersFromDetector == 0)
1187 tracks = fAnalyseUE->GetAcceptedParticles(inputEvent, 0, kTRUE, fParticleSpeciesTrigger, kTRUE, kTRUE, evtPlanePhi);
1188 else if (fTriggersFromDetector <= 4)
1189 tracks=GetParticlesFromDetector(inputEvent,fTriggersFromDetector);
1191 AliFatal(Form("Invalid setting for fTriggersFromDetector: %d", fTriggersFromDetector));
1193 //Printf("Accepted %d tracks", tracks->GetEntries());
1195 // check for outlier in centrality vs number of tracks (rough constants extracted from correlation histgram)
1196 Bool_t reject = kFALSE;
1197 if (fRejectCentralityOutliers)
1199 if (centrality > 40 && centrality <= 50 && tracks->GetEntriesFast() > 1160)
1201 if (centrality > 50 && centrality <= 60 && tracks->GetEntriesFast() > 650)
1203 if (centrality > 60 && centrality <= 70 && tracks->GetEntriesFast() > 370)
1205 if (centrality > 70 && centrality <= 80 && tracks->GetEntriesFast() > 220)
1207 if (centrality > 80 && centrality <= 90 && tracks->GetEntriesFast() > 130)
1209 if (centrality > 90 && tracks->GetEntriesFast() > 75)
1215 AliInfo(Form("Rejecting event due to centrality vs tracks correlation: %f %d", centrality, tracks->GetEntriesFast()));
1216 fHistos->FillEvent(centrality, AliUEHist::kCFStepAnaTopology);
1221 if (fRejectZeroTrackEvents && tracks->GetEntriesFast() == 0)
1223 AliInfo(Form("Rejecting event because it has no tracks: %f %d", centrality, tracks->GetEntriesFast()));
1224 fHistos->FillEvent(centrality, AliUEHist::kCFStepAnaTopology);
1229 if (fCentralityWeights && !AcceptEventCentralityWeight(centrality))
1231 AliInfo(Form("Rejecting event because of centrality weighting: %f", centrality));
1232 fHistos->FillEvent(centrality, AliUEHist::kCFStepAnaTopology);
1237 // correlate particles with...
1238 TObjArray* tracksCorrelate = 0;
1239 if(fAssociatedFromDetector==0){
1240 if (fParticleSpeciesAssociated != fParticleSpeciesTrigger || fTriggersFromDetector > 0 || fTrackPhiCutEvPlMax > 0.0001)
1241 tracksCorrelate = fAnalyseUE->GetAcceptedParticles(inputEvent, 0, kTRUE, fParticleSpeciesAssociated, kTRUE);
1243 else if (fAssociatedFromDetector <= 4){
1244 if(fAssociatedFromDetector != fTriggersFromDetector)
1245 tracksCorrelate = GetParticlesFromDetector(inputEvent,fAssociatedFromDetector);
1248 AliFatal(Form("Invalid setting for fAssociatedFromDetector: %d", fAssociatedFromDetector));
1250 // reference multiplicity
1251 Int_t referenceMultiplicity = -1;
1253 referenceMultiplicity = AliESDtrackCuts::GetReferenceMultiplicity(fESD);
1255 referenceMultiplicity = tracks->GetEntriesFast(); // TODO to be replaced by the estimator once available in the AOD
1256 // referenceMultiplicity = fAOD->GetHeader()->GetRefMultiplicityComb05();
1258 ((TH2F*) fListOfHistos->FindObject("referenceMultiplicity"))->Fill(centrality, referenceMultiplicity);
1260 const AliVVertex* vertex = inputEvent->GetPrimaryVertex();
1261 Double_t zVtx = vertex->GetZ();
1267 // Fill containers at STEP 6 (reconstructed)
1268 if (centrality >= 0)
1271 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepReconstructed, tracks, tracksCorrelate, weight, kTRUE, kFALSE, 0, 0.02, kTRUE);
1273 ((TH1F*) fListOfHistos->FindObject("eventStat"))->Fill(1);
1275 if (fTwoTrackEfficiencyCut > 0)
1276 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepBiasStudy, tracks, tracksCorrelate, weight, kTRUE, kTRUE, bSign, fTwoTrackEfficiencyCut, kTRUE);
1279 // create a list of reduced objects. This speeds up processing and reduces memory consumption for the event pool
1280 TObjArray* tracksClone = CloneAndReduceTrackList(tracks);
1287 // 1. First get an event pool corresponding in mult (cent) and
1288 // zvertex to the current event. Once initialized, the pool
1289 // should contain nMix (reduced) events. This routine does not
1290 // pre-scan the chain. The first several events of every chain
1291 // will be skipped until the needed pools are filled to the
1292 // specified depth. If the pool categories are not too rare, this
1293 // should not be a problem. If they are rare, you could lose
1296 // 2. Collect the whole pool's content of tracks into one TObjArray
1297 // (bgTracks), which is effectively a single background super-event.
1299 // 3. The reduced and bgTracks arrays must both be passed into
1300 // FillCorrelations(). Also nMix should be passed in, so a weight
1301 // of 1./nMix can be applied.
1303 AliEventPool* pool = fPoolMgr->GetEventPool(centrality, zVtx);
1306 AliFatal(Form("No pool found for centrality = %f, zVtx = %f", centrality, zVtx));
1308 // pool->SetDebug(1);
1310 if (pool->IsReady())
1313 Int_t nMix = pool->GetCurrentNEvents();
1314 // cout << "nMix = " << nMix << " tracks in pool = " << pool->NTracksInPool() << endl;
1316 ((TH1F*) fListOfHistos->FindObject("eventStat"))->Fill(2);
1317 ((TH2F*) fListOfHistos->FindObject("mixedDist"))->Fill(centrality, pool->NTracksInPool());
1318 if (pool->IsReady())
1319 ((TH1F*) fListOfHistos->FindObject("eventStat"))->Fill(3);
1321 // Fill mixed-event histos here
1322 for (Int_t jMix=0; jMix<nMix; jMix++)
1324 TObjArray* bgTracks = pool->GetEvent(jMix);
1327 fHistosMixed->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepReconstructed, tracksClone, bgTracks, 1.0 / nMix, (jMix == 0), kFALSE, 0, 0.02, kTRUE);
1329 if (fTwoTrackEfficiencyCut > 0)
1330 fHistosMixed->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepBiasStudy, tracksClone, bgTracks, 1.0 / nMix, (jMix == 0), kTRUE, bSign, fTwoTrackEfficiencyCut, kTRUE);
1334 // ownership is with the pool now
1335 if (tracksCorrelate)
1337 pool->UpdatePool(CloneAndReduceTrackList(tracksCorrelate));
1341 pool->UpdatePool(tracksClone);
1342 //pool->PrintInfo();
1347 if (tracksCorrelate)
1348 delete tracksCorrelate;
1352 TObjArray* AliAnalysisTaskPhiCorrelations::CloneAndReduceTrackList(TObjArray* tracks)
1354 // clones a track list by using AliDPhiBasicParticle which uses much less memory (used for event mixing)
1356 TObjArray* tracksClone = new TObjArray;
1357 tracksClone->SetOwner(kTRUE);
1359 for (Int_t i=0; i<tracks->GetEntriesFast(); i++)
1361 AliVParticle* particle = (AliVParticle*) tracks->UncheckedAt(i);
1362 AliDPhiBasicParticle* copy = new AliDPhiBasicParticle(particle->Eta(), particle->Phi(), particle->Pt(), particle->Charge());
1363 copy->SetUniqueID(particle->GetUniqueID());
1364 tracksClone->Add(copy);
1370 //____________________________________________________________________
1371 void AliAnalysisTaskPhiCorrelations::Initialize()
1374 fInputHandler = (AliInputEventHandler*)
1375 ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
1377 fMcHandler = dynamic_cast<AliInputEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
1380 //____________________________________________________________________
1381 void AliAnalysisTaskPhiCorrelations::RemoveDuplicates(TObjArray* tracks)
1383 // remove particles with the same label
1385 Int_t before = tracks->GetEntriesFast();
1387 for (Int_t i=0; i<before; ++i)
1389 AliVParticle* part = (AliVParticle*) tracks->At(i);
1391 for (Int_t j=i+1; j<before; ++j)
1393 AliVParticle* part2 = (AliVParticle*) tracks->At(j);
1395 if (part->GetLabel() == part2->GetLabel())
1397 Printf("Removing %d with label %d (duplicated in %d)", i, part->GetLabel(), j); part->Dump(); part2->Dump();
1398 TObject* object = tracks->RemoveAt(i);
1399 if (tracks->IsOwner())
1408 if (before > tracks->GetEntriesFast())
1409 AliInfo(Form("Reduced from %d to %d", before, tracks->GetEntriesFast()));
1412 void AliAnalysisTaskPhiCorrelations::CleanUp(TObjArray* tracks, TObject* mcObj, Int_t maxLabel)
1414 // calls RemoveInjectedSignals, RemoveWeakDecays and RemoveDuplicates
1419 if (fInjectedSignals)
1420 fAnalyseUE->RemoveInjectedSignals(tracks, mcObj, maxLabel);
1421 if (fRemoveWeakDecays)
1422 fAnalyseUE->RemoveWeakDecays(tracks, mcObj);
1423 if (fRemoveDuplicates)
1424 RemoveDuplicates(tracks);
1427 //____________________________________________________________________
1428 void AliAnalysisTaskPhiCorrelations::SelectCharge(TObjArray* tracks)
1430 // remove particles with charge not selected (depending on fTriggerSelectCharge)
1435 Int_t before = tracks->GetEntriesFast();
1437 for (Int_t i=0; i<before; ++i)
1439 AliVParticle* part = (AliVParticle*) tracks->At(i);
1441 if (part->Charge() * fTriggerSelectCharge < -1)
1443 // Printf("Removing %d with charge %d", i, part->Charge());
1444 TObject* object = tracks->RemoveAt(i);
1445 if (tracks->IsOwner())
1452 if (before > tracks->GetEntriesFast())
1453 AliInfo(Form("Reduced from %d to %d", before, tracks->GetEntriesFast()));
1456 //____________________________________________________________________
1457 Bool_t AliAnalysisTaskPhiCorrelations::AcceptEventCentralityWeight(Double_t centrality)
1459 // rejects "randomly" events such that the centrality gets flat
1460 // uses fCentralityWeights histogram
1462 // TODO code taken and adapted from AliRDHFCuts; waiting for general class AliCentralityFlattening
1464 Double_t weight = fCentralityWeights->GetBinContent(fCentralityWeights->FindBin(centrality));
1465 Double_t centralityDigits = centrality*100. - (Int_t)(centrality*100.);
1467 Bool_t result = kFALSE;
1468 if (centralityDigits < weight)
1471 AliInfo(Form("Centrality: %f; Digits: %f; Weight: %f; Result: %d", centrality, centralityDigits, weight, result));
1476 //____________________________________________________________________
1477 void AliAnalysisTaskPhiCorrelations::ShiftTracks(TObjArray* tracks, Double_t angle)
1479 // shifts the phi angle of all tracks by angle
1480 // 0 <= angle <= 2pi
1482 for (Int_t i=0; i<tracks->GetEntriesFast(); ++i)
1484 AliDPhiBasicParticle* part = (AliDPhiBasicParticle*) tracks->At(i);
1485 Double_t newAngle = part->Phi() + angle;
1486 if (newAngle >= TMath::TwoPi())
1487 newAngle -= TMath::TwoPi();
1489 part->SetPhi(newAngle);
1493 //____________________________________________________________________
1494 TObjArray* AliAnalysisTaskPhiCorrelations::GetParticlesFromDetector(AliVEvent* inputEvent, Int_t idet)
1496 //1 = VZERO_A; 2 = VZERO_C; 3 = SPD tracklets
1497 TObjArray* obj = new TObjArray;
1498 obj->SetOwner(kTRUE);
1500 if (idet == 1 || idet == 2)
1502 AliVVZERO* vZero = inputEvent->GetVZEROData();
1504 const Int_t vZeroStart = (idet == 1) ? 32 : 0;
1506 TH1F* singleCells = (TH1F*) fListOfHistos->FindObject("V0SingleCells");
1507 for (Int_t i=vZeroStart; i<vZeroStart+32; i++)
1509 Float_t weight = vZero->GetMultiplicity(i);
1510 singleCells->Fill(weight);
1512 // rough estimate of multiplicity
1513 for (Int_t j=0; j<TMath::Nint(weight); j++)
1515 AliDPhiBasicParticle* particle = new AliDPhiBasicParticle((AliVVZERO::GetVZEROEtaMax(i) + AliVVZERO::GetVZEROEtaMin(i)) / 2, AliVVZERO::GetVZEROAvgPhi(i), 1.1, 0); // fit pT = 1.1 and charge = 0
1516 particle->SetUniqueID(fAnalyseUE->GetEventCounter()* 100000 + j + i * 1000);
1525 AliFatal("Tracklets only available on AOD");
1526 AliAODTracklets* trklets=(AliAODTracklets*)fAOD->GetTracklets();
1528 AliFatal("AliAODTracklets not found");
1529 for(Int_t itrklets=0;itrklets<trklets->GetNumberOfTracklets();itrklets++)
1531 Float_t eta=-TMath::Log(TMath::Tan(trklets->GetTheta(itrklets)/2));
1532 if(TMath::Abs(eta)>fTrackEtaCut)continue;
1533 Float_t pT=1000*TMath::Abs(trklets->GetDeltaPhi(itrklets));//in mrad
1534 if(pT>fTrackletDphiCut)continue;
1535 TH1F* DphiTrklets = (TH1F*)fListOfHistos->FindObject("DphiTrklets");
1536 DphiTrklets->Fill(1000*trklets->GetDeltaPhi(itrklets)); //in mrad
1537 Float_t phi=trklets->GetPhi(itrklets);
1538 phi+=trklets->GetDeltaPhi(itrklets)*39./34.; //correction dphi*39./34. (Dphi in rad)
1539 if (phi<0) phi+=TMath::TwoPi();
1540 if (phi>TMath::TwoPi()) phi-=TMath::TwoPi();
1542 AliDPhiBasicParticle* particle = new AliDPhiBasicParticle(eta,phi, pT, 0); // pT = TMath::Abs(trklets->GetDeltaPhi(itrklets)) in mrad and charge = 0
1543 particle->SetUniqueID(fAnalyseUE->GetEventCounter()* 100000 + itrklets);
1551 AliFatal("Muon selection only implemented on AOD");//FIXME to be implemented also for ESDs as in AliAnalyseLeadingTrackUE::GetAcceptedPArticles
1552 for (Int_t iTrack = 0; iTrack < fAOD->GetNTracks(); iTrack++) {
1553 AliAODTrack* track = fAOD->GetTrack(iTrack);
1554 if (!track->IsMuonTrack()) continue;
1555 //Float_t dca = track->DCA();
1556 //Float_t chi2 = track->Chi2perNDF();
1557 Float_t rabs = track->GetRAtAbsorberEnd();
1558 Float_t eta = track->Eta();
1559 Int_t matching = track->GetMatchTrigger();
1560 if (rabs < 17.6 || rabs > 89.5) continue;
1561 if (eta < -4 || eta > -2.5) continue;
1562 if (matching < 2) continue;
1564 AliDPhiBasicParticle* particle = new AliDPhiBasicParticle(eta,track->Phi(), track->Pt(), track->Charge());
1565 particle->SetUniqueID(fAnalyseUE->GetEventCounter() * 100000 + iTrack);
1571 AliFatal(Form("GetParticlesFromDetector: Invalid idet value: %d", idet));
1576 //____________________________________________________________________
1577 Bool_t AliAnalysisTaskPhiCorrelations::IsMuEvent(){
1580 AliFatal("Muon selection only implemented on AOD");//FIXME to be implemented also for ESDs as in AliAnalyseLeadingTrackUE::GetAcceptedPArticles
1581 for (Int_t iTrack = 0; iTrack < fAOD->GetNTracks(); iTrack++) {
1582 AliAODTrack* track = fAOD->GetTrack(iTrack);
1583 if (!track->IsMuonTrack()) continue;
1584 //Float_t dca = track->DCA();
1585 //Float_t chi2 = track->Chi2perNDF();
1586 Float_t rabs = track->GetRAtAbsorberEnd();
1587 Float_t eta = track->Eta();
1588 Int_t matching = track->GetMatchTrigger();
1589 if (rabs < 17.6 || rabs > 89.5) continue;
1590 if (eta < -4 || eta > -2.5) continue;
1591 if (matching < 2) continue;