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"
45 #include "AliESDEvent.h"
46 #include "AliESDInputHandler.h"
47 #include "AliMultiplicity.h"
48 #include "AliCentrality.h"
50 #include "AliAODMCHeader.h"
51 #include "AliGenCocktailEventHeader.h"
52 #include "AliGenEventHeader.h"
53 #include "AliCollisionGeometry.h"
55 #include "AliEventPoolManager.h"
57 #include "AliESDZDC.h"
58 #include "AliESDtrackCuts.h"
60 #include "AliHelperPID.h"
61 #include "AliAnalysisUtils.h"
64 ////////////////////////////////////////////////////////////////////////
66 // Analysis class for azimuthal correlation studies
67 // Based on the UE task from Sara Vallero and Jan Fiete
69 // This class needs input AODs.
70 // The output is a list of analysis-specific containers.
72 // The AOD can be either connected to the InputEventHandler
73 // for a chain of AOD files
75 // to the OutputEventHandler
76 // for a chain of ESD files,
77 // in this case the class should be in the train after the jet-finder
80 // Jan Fiete Grosse-Oetringhaus
82 ////////////////////////////////////////////////////////////////////////
85 ClassImp( AliAnalysisTaskPhiCorrelations )
86 ClassImp( AliDPhiBasicParticle )
88 //____________________________________________________________________
89 AliAnalysisTaskPhiCorrelations:: AliAnalysisTaskPhiCorrelations(const char* name):
90 AliAnalysisTask(name,""),
91 // general configuration
94 fReduceMemoryFootprint(kFALSE),
97 fTwoTrackEfficiencyStudy(kFALSE),
98 fTwoTrackEfficiencyCut(0),
99 fTwoTrackCutMinRadius(0.8),
101 fCourseCentralityBinning(kFALSE),
102 fSkipTrigger(kFALSE),
103 fInjectedSignals(kFALSE),
104 fRandomizeReactionPlane(kFALSE),
108 // pointers to UE classes
112 fEfficiencyCorrectionTriggers(0),
113 fEfficiencyCorrectionAssociated(0),
114 fCentralityWeights(0),
115 // handlers and events
123 // histogram settings
126 fnTracksVertex(1), // QA tracks pointing to principal vertex (= 3 default)
128 fAcceptOnlyMuEvents(kFALSE),
129 fCentralityMethod("V0M"),
132 fTrackEtaCutMin(-1.),
133 fTrackPhiCutEvPlMin(0),
134 fTrackPhiCutEvPlMax(0),
138 fSharedClusterCut(-1),
140 fFoundFractionCut(-1),
143 fSelectBit(AliVEvent::kMB|AliVEvent::kUserDefined),
144 fUseChargeHadrons(kFALSE),
145 fParticleSpeciesTrigger(-1),
146 fParticleSpeciesAssociated(-1),
147 fCheckMotherPDG(kTRUE),
148 fTrackletDphiCut(9999999.),
150 fTriggerSelectCharge(0),
151 fAssociatedSelectCharge(0),
152 fTriggerRestrictEta(-1),
153 fEtaOrdering(kFALSE),
154 fCutConversions(kFALSE),
155 fCutResonances(kFALSE),
156 fRejectResonanceDaughters(-1),
157 fFillOnlyStep0(kFALSE),
159 fRejectCentralityOutliers(kFALSE),
160 fRejectZeroTrackEvents(kFALSE),
161 fRemoveWeakDecays(kFALSE),
162 fRemoveDuplicates(kFALSE),
163 fSkipFastCluster(kFALSE),
164 fWeightPerEvent(kFALSE),
167 fTriggersFromDetector(0),
168 fAssociatedFromDetector(0),
169 fMCUseUncheckedCentrality(kFALSE),
172 // Default constructor
173 // Define input and output slots here
174 // Input slot #0 works with a TChain
175 DefineInput(0, TChain::Class());
176 // Output slot #0 writes into a TList container
177 DefineOutput(0, TList::Class());
180 AliAnalysisTaskPhiCorrelations::~AliAnalysisTaskPhiCorrelations()
184 if (fListOfHistos && !AliAnalysisManager::GetAnalysisManager()->IsProofMode())
185 delete fListOfHistos;
188 //____________________________________________________________________
189 void AliAnalysisTaskPhiCorrelations::ConnectInputData(Option_t* /*option*/)
192 // Connect the input data
193 if (fDebug > 1) AliInfo("ConnectInputData() ");
195 // Since AODs can either be connected to the InputEventHandler
196 // or to the OutputEventHandler ( the AOD is created by a previus task in the train )
197 // we need to get the pointer to the AODEvent correctly.
199 // Delta AODs are also accepted.
201 TObject* handler = AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
203 if( handler && handler->InheritsFrom("AliAODInputHandler") )
205 fAOD = ((AliAODInputHandler*)handler)->GetEvent();
206 if (fDebug > 1) AliInfo(" ==== Tracks and Jets from AliAODInputHandler");
210 handler = AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler();
211 if (handler && handler->InheritsFrom("AliAODHandler") )
213 fAOD = ((AliAODHandler*)handler)->GetAOD();
214 if (fDebug > 1) AliInfo(" ==== Tracks and Jets from AliAODHandler");
218 AliWarning("I can't get any AOD Event Handler");
222 if (handler && handler->InheritsFrom("AliESDInputHandler") )
224 // pointer received per event in ::Exec
225 if (fDebug > 1) AliInfo(" ==== Tracks and Jets from AliESDInputHandler");
228 // Initialize common pointers
232 //____________________________________________________________________
233 void AliAnalysisTaskPhiCorrelations::CreateOutputObjects()
235 // Create the output container
237 if (fDebug > 1) AliInfo("CreateOutputObjects()");
239 // Initialize class with main algorithms, event and track selection.
240 fAnalyseUE = new AliAnalyseLeadingTrackUE();
241 fAnalyseUE->SetParticleSelectionCriteria(fFilterBit, fUseChargeHadrons, fTrackEtaCut, fTrackEtaCutMin, fPtMin);
242 fAnalyseUE->SetDCAXYCut(fDCAXYCut);
243 fAnalyseUE->SetSharedClusterCut(fSharedClusterCut);
244 fAnalyseUE->SetCrossedRowsCut(fCrossedRowsCut);
245 fAnalyseUE->SetFoundFractionCut(fFoundFractionCut);
246 fAnalyseUE->SetTrackStatus(fTrackStatus);
247 fAnalyseUE->SetCheckMotherPDG(fCheckMotherPDG);
248 fAnalyseUE->SetDebug(fDebug);
249 fAnalyseUE->DefineESDCuts(fFilterBit);
250 fAnalyseUE->SetEventSelection(fSelectBit);
251 fAnalyseUE->SetHelperPID(fHelperPID);
252 if(fTrackPhiCutEvPlMax!=0)
253 fAnalyseUE->SetParticlePhiCutEventPlane(fTrackPhiCutEvPlMin,fTrackPhiCutEvPlMax);
254 if ((fParticleSpeciesTrigger != -1 || fParticleSpeciesAssociated != -1) && !fHelperPID)
255 AliFatal("HelperPID object should be set in the steering macro");
257 // Initialize output list of containers
258 if (fListOfHistos != NULL){
259 delete fListOfHistos;
260 fListOfHistos = NULL;
263 fListOfHistos = new TList();
264 fListOfHistos->SetOwner(kTRUE);
267 // Initialize class to handle histograms
268 TString histType = "4R";
269 if (fUseVtxAxis == 1)
271 else if (fUseVtxAxis == 2)
273 if (fCourseCentralityBinning)
275 fHistos = new AliUEHistograms("AliUEHistogramsSame", histType, fCustomBinning);
276 fHistosMixed = new AliUEHistograms("AliUEHistogramsMixed", histType, fCustomBinning);
278 fHistos->SetSelectCharge(fSelectCharge);
279 fHistosMixed->SetSelectCharge(fSelectCharge);
281 fHistos->SetSelectTriggerCharge(fTriggerSelectCharge);
282 fHistosMixed->SetSelectTriggerCharge(fTriggerSelectCharge);
284 fHistos->SetSelectAssociatedCharge(fAssociatedSelectCharge);
285 fHistosMixed->SetSelectAssociatedCharge(fAssociatedSelectCharge);
287 fHistos->SetTriggerRestrictEta(fTriggerRestrictEta);
288 fHistosMixed->SetTriggerRestrictEta(fTriggerRestrictEta);
290 fHistos->SetOnlyOneEtaSide(fOnlyOneEtaSide);
291 fHistosMixed->SetOnlyOneEtaSide(fOnlyOneEtaSide);
293 fHistos->SetEtaOrdering(fEtaOrdering);
294 fHistosMixed->SetEtaOrdering(fEtaOrdering);
296 fHistos->SetPairCuts(fCutConversions, fCutResonances);
297 fHistosMixed->SetPairCuts(fCutConversions, fCutResonances);
299 fHistos->SetRejectResonanceDaughters(fRejectResonanceDaughters);
300 fHistosMixed->SetRejectResonanceDaughters(fRejectResonanceDaughters);
302 fHistos->SetTrackEtaCut(fTrackEtaCut);
303 fHistosMixed->SetTrackEtaCut(fTrackEtaCut);
305 fHistos->SetWeightPerEvent(fWeightPerEvent);
306 fHistosMixed->SetWeightPerEvent(fWeightPerEvent);
308 fHistos->SetPtOrder(fPtOrder);
309 fHistosMixed->SetPtOrder(fPtOrder);
311 fHistos->SetTwoTrackCutMinRadius(fTwoTrackCutMinRadius);
312 fHistosMixed->SetTwoTrackCutMinRadius(fTwoTrackCutMinRadius);
314 if (fEfficiencyCorrectionTriggers)
316 fHistos->SetEfficiencyCorrectionTriggers(fEfficiencyCorrectionTriggers);
317 fHistosMixed->SetEfficiencyCorrectionTriggers((THnF*) fEfficiencyCorrectionTriggers->Clone());
319 if (fEfficiencyCorrectionAssociated)
321 fHistos->SetEfficiencyCorrectionAssociated(fEfficiencyCorrectionAssociated);
322 fHistosMixed->SetEfficiencyCorrectionAssociated((THnF*) fEfficiencyCorrectionAssociated->Clone());
325 // add histograms to list
326 fListOfHistos->Add(fHistos);
327 fListOfHistos->Add(fHistosMixed);
328 // add HelperPID to list
330 fListOfHistos->Add(fHelperPID);
333 fListOfHistos->Add(fMap);
335 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));
336 fListOfHistos->Add(new TH1F("eventStat", ";;events", 4, -0.5, 3.5));
337 fListOfHistos->Add(new TH2F("mixedDist", ";centrality;tracks;events", 101, 0, 101, 200, 0, fMixingTracks * 1.5));
338 fListOfHistos->Add(new TH2F("referenceMultiplicity", ";centrality;tracks;events", 101, 0, 101, 200, 0, 200));
339 if (fCentralityMethod == "V0A_MANUAL")
341 fListOfHistos->Add(new TH2F("V0AMult", "V0A multiplicity;V0A multiplicity;V0A multiplicity (scaled)", 1000, -.5, 999.5, 1000, -.5, 999.5));
342 fListOfHistos->Add(new TH2F("V0AMultCorrelation", "V0A multiplicity;V0A multiplicity;SPD tracklets", 1000, -.5, 999.5, 1000, -.5, 999.5));
344 if (fTriggersFromDetector == 1 || fTriggersFromDetector == 2 || fAssociatedFromDetector == 1 || fAssociatedFromDetector == 2)
345 fListOfHistos->Add(new TH1F("V0SingleCells", "V0 single cell multiplicity;multiplicity;events", 100, -0.5, 99.5));
346 if (fTriggersFromDetector == 3 || fAssociatedFromDetector == 3)
347 fListOfHistos->Add(new TH1F("DphiTrklets", "tracklets Dphi;#Delta#phi,trklets (mrad);entries", 100, -100, 100));
349 PostData(0,fListOfHistos);
351 // Add task configuration to output list
355 Int_t poolsize = 1000; // Maximum number of events, ignored in the present implemention of AliEventPoolManager
357 Int_t nCentralityBins = fHistos->GetUEHist(2)->GetEventHist()->GetNBins(1);
358 Double_t* centralityBins = (Double_t*) fHistos->GetUEHist(2)->GetEventHist()->GetAxis(1, 0)->GetXbins()->GetArray();
360 const Int_t kNZvtxBins = 10+(1+10)*4;
361 // bins for further buffers are shifted by 100 cm
362 Double_t vertexBins[kNZvtxBins+1] = { -10, -8, -6, -4, -2, 0, 2, 4, 6, 8, 10,
363 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110,
364 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210,
365 290, 292, 294, 296, 298, 300, 302, 304, 306, 308, 310,
366 390, 392, 394, 396, 398, 400, 402, 404, 406, 408, 410 };
368 Int_t nZvtxBins = kNZvtxBins;
369 Double_t* zvtxbin = vertexBins;
371 if (fMode == 0 && fHistos->GetUEHist(2)->GetEventHist()->GetNVar() > 2)
373 nZvtxBins = fHistos->GetUEHist(2)->GetEventHist()->GetNBins(2);
374 zvtxbin = (Double_t*) fHistos->GetUEHist(2)->GetEventHist()->GetAxis(2, 0)->GetXbins()->GetArray();
377 fPoolMgr = new AliEventPoolManager(poolsize, fMixingTracks, nCentralityBins, centralityBins, nZvtxBins, zvtxbin);
378 fPoolMgr->SetTargetValues(fMixingTracks, 0.1, 5);
381 //____________________________________________________________________
382 void AliAnalysisTaskPhiCorrelations::Exec(Option_t */*option*/)
385 fAnalyseUE->NextEvent();
387 // receive ESD pointer if we are not running AOD analysis
390 AliVEventHandler* handler = AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
391 if (handler && handler->InheritsFrom("AliESDInputHandler"))
392 fESD = ((AliESDInputHandler*)handler)->GetEvent();
400 fMcEvent = fMcHandler->MCEvent();
404 // array of MC particles
405 fArrayMC = dynamic_cast<TClonesArray*>(fAOD->FindListObject(AliAODMCParticle::StdBranchName()));
407 AliFatal("No array of MC particles found !!!");
410 AnalyseCorrectionMode();
412 else AnalyseDataMode();
415 /******************** ANALYSIS METHODS *****************************/
417 //____________________________________________________________________
418 void AliAnalysisTaskPhiCorrelations::AddSettingsTree()
420 //Write settings to output list
421 TTree *settingsTree = new TTree("UEAnalysisSettings","Analysis Settings in UE estimation");
422 settingsTree->Branch("fnTracksVertex", &fnTracksVertex,"nTracksVertex/I");
423 settingsTree->Branch("fZVertex", &fZVertex,"ZVertex/D");
424 settingsTree->Branch("fAcceptOnlyMuEvents", &fAcceptOnlyMuEvents,"AcceptOnlyMuEvents/O");
425 //settingsTree->Branch("fCentralityMethod", fCentralityMethod.Data(),"CentralityMethod/C");
426 settingsTree->Branch("fTrackEtaCut", &fTrackEtaCut, "TrackEtaCut/D");
427 settingsTree->Branch("fTrackEtaCutMin", &fTrackEtaCutMin, "TrackEtaCutMin/D");
428 settingsTree->Branch("fOnlyOneEtaSide", &fOnlyOneEtaSide,"OnlyOneEtaSide/I");
429 settingsTree->Branch("fPtMin", &fPtMin, "PtMin/D");
430 settingsTree->Branch("fFilterBit", &fFilterBit,"FilterBit/I");
431 settingsTree->Branch("fSharedClusterCut", &fSharedClusterCut,"SharedClusterCut/D");
432 settingsTree->Branch("fCrossedRowsCut", &fCrossedRowsCut,"CrossedRowsCut/I");
433 settingsTree->Branch("fFoundFractionCut", &fFoundFractionCut,"FoundFractionCut/D");
434 settingsTree->Branch("fTrackStatus", &fTrackStatus,"TrackStatus/I");
435 settingsTree->Branch("fSelectBit", &fSelectBit,"EventSelectionBit/I");
436 settingsTree->Branch("fUseChargeHadrons", &fUseChargeHadrons,"UseChHadrons/O");
437 settingsTree->Branch("fParticleSpeciesTrigger", &fParticleSpeciesTrigger,"ParticleSpeciesTrigger/I");
438 settingsTree->Branch("fParticleSpeciesAssociated", &fParticleSpeciesAssociated,"ParticleSpeciesAssociated/I");
439 settingsTree->Branch("fCheckMotherPDG", &fCheckMotherPDG,"CheckMotherPDG/I");
440 settingsTree->Branch("fSelectCharge", &fSelectCharge,"SelectCharge/I");
441 settingsTree->Branch("fTriggerSelectCharge", &fTriggerSelectCharge,"TriggerSelectCharge/I");
442 settingsTree->Branch("fAssociatedSelectCharge", &fAssociatedSelectCharge,"fAssociatedSelectCharge/I");
443 settingsTree->Branch("fTriggerRestrictEta", &fTriggerRestrictEta,"TriggerRestrictEta/D");
444 settingsTree->Branch("fEtaOrdering", &fEtaOrdering,"EtaOrdering/O");
445 settingsTree->Branch("fCutConversions", &fCutConversions,"CutConversions/O");
446 settingsTree->Branch("fCutResonances", &fCutResonances,"CutResonances/O");
447 settingsTree->Branch("fRejectResonanceDaughters", &fRejectResonanceDaughters,"RejectResonanceDaughters/I");
448 settingsTree->Branch("fFillpT", &fFillpT,"FillpT/O");
449 settingsTree->Branch("fMixingTracks", &fMixingTracks,"MixingTracks/I");
450 settingsTree->Branch("fSkipTrigger", &fSkipTrigger,"SkipTrigger/O");
451 settingsTree->Branch("fInjectedSignals", &fInjectedSignals,"InjectedSignals/O");
452 settingsTree->Branch("fRandomizeReactionPlane", &fRandomizeReactionPlane,"RandomizeReactionPlane/O");
453 settingsTree->Branch("fRejectCentralityOutliers", &fRejectCentralityOutliers,"RejectCentralityOutliers/O");
454 settingsTree->Branch("fRejectZeroTrackEvents", &fRejectZeroTrackEvents,"RejectZeroTrackEvents/O");
455 settingsTree->Branch("fRemoveWeakDecays", &fRemoveWeakDecays,"RemoveWeakDecays/O");
456 settingsTree->Branch("fRemoveDuplicates", &fRemoveDuplicates,"RemoveDuplicates/O");
457 settingsTree->Branch("fSkipFastCluster", &fSkipFastCluster,"SkipFastCluster/O");
458 settingsTree->Branch("fWeightPerEvent", &fWeightPerEvent,"WeightPerEvent/O");
459 settingsTree->Branch("fPtOrder", &fPtOrder,"PtOrder/O");
460 settingsTree->Branch("fTriggersFromDetector", &fTriggersFromDetector,"TriggersFromDetector/I");
461 settingsTree->Branch("fAssociatedFromDetector", &fAssociatedFromDetector,"AssociatedFromDetector/I");
462 settingsTree->Branch("fMCUseUncheckedCentrality", &fMCUseUncheckedCentrality,"MCUseUncheckedCentrality/O");
463 settingsTree->Branch("fTwoTrackEfficiencyCut", &fTwoTrackEfficiencyCut,"TwoTrackEfficiencyCut/D");
464 settingsTree->Branch("fTwoTrackCutMinRadius", &fTwoTrackCutMinRadius,"TwoTrackCutMinRadius/D");
468 settingsTree->Fill();
469 fListOfHistos->Add(settingsTree);
472 //____________________________________________________________________
473 void AliAnalysisTaskPhiCorrelations::AnalyseCorrectionMode()
475 // Run the analysis on MC to get the correction maps
478 if ( fDebug > 3 ) AliInfo( " Processing event in Corrections mode ..." );
480 Double_t centrality = 0;
482 if (fCentralityMethod.Length() > 0)
484 if (fCentralityMethod == "MC_b")
486 AliGenEventHeader* eventHeader = GetFirstHeader();
489 // We avoid AliFatal here, because the AOD productions sometimes have events where the MC header is missing
490 // (due to unreadable Kinematics) and we don't want to loose the whole job because of a few events
491 AliError("Event header not found. Skipping this event.");
492 fHistos->FillEvent(0, AliUEHist::kCFStepAnaTopology);
496 AliCollisionGeometry* collGeometry = dynamic_cast<AliCollisionGeometry*> (eventHeader);
500 AliFatal("Asking for MC_b centrality, but event header has no collision geometry information");
503 centrality = collGeometry->ImpactParameter();
505 else if (fCentralityMethod == "nano")
507 centrality = (Float_t) gROOT->ProcessLine(Form("100.0 + 100.0 * ((AliNanoAODHeader*) %p)->GetCentrality(\"%s\")", fAOD->GetHeader(), fCentralityMethod.Data())) / 100 - 1.0;
511 AliCentrality *centralityObj = 0;
513 centralityObj = fAOD->GetHeader()->GetCentralityP();
515 centralityObj = fESD->GetCentrality();
519 if (fMCUseUncheckedCentrality)
520 centrality = centralityObj->GetCentralityPercentileUnchecked(fCentralityMethod);
522 centrality = centralityObj->GetCentralityPercentile(fCentralityMethod);
526 Printf("WARNING: Centrality object is 0");
531 AliInfo(Form("Centrality is %f", centrality));
534 // Support for ESD and AOD based analysis
535 AliVEvent* inputEvent = fAOD;
543 fHistos->SetRunNumber(inputEvent->GetRunNumber());
544 bSign = (inputEvent->GetMagneticField() > 0) ? 1 : -1;
547 TObject* mc = fArrayMC;
552 fHistos->FillEvent(centrality, -1);
557 // Only consider MC events within the vtx-z region used also as cut on the reconstructed vertex
558 TObject* vertexSupplier = fMcEvent;
560 vertexSupplier = fAOD->FindListObject(AliAODMCHeader::StdBranchName());
562 if (!fAnalyseUE->VertexSelection(vertexSupplier, 0, fZVertex))
567 zVtx = ((AliAODMCHeader*) vertexSupplier)->GetVtxZ();
569 zVtx = fMcEvent->GetPrimaryVertex()->GetZ();
574 // For productions with injected signals, figure out above which label to skip particles/tracks
575 Int_t skipParticlesAbove = 0;
576 if (fInjectedSignals)
578 AliGenEventHeader* eventHeader = 0;
584 AliHeader* header = (AliHeader*) fMcEvent->Header();
586 AliFatal("fInjectedSignals set but no MC header found");
588 AliGenCocktailEventHeader* cocktailHeader = dynamic_cast<AliGenCocktailEventHeader*> (header->GenEventHeader());
592 AliFatal("fInjectedSignals set but no MC cocktail header found");
595 headers = cocktailHeader->GetHeaders()->GetEntries();
596 eventHeader = dynamic_cast<AliGenEventHeader*> (cocktailHeader->GetHeaders()->First());
600 for (Int_t i=0; i<cocktailHeader->GetHeaders()->GetEntries(); i++)
602 AliGenEventHeader* headerTmp = dynamic_cast<AliGenEventHeader*> (cocktailHeader->GetHeaders()->At(i));
604 Printf("%d particles in header:", headerTmp->NProduced());
605 cocktailHeader->GetHeaders()->At(i)->Dump();
612 AliAODMCHeader* header = (AliAODMCHeader*) fAOD->GetList()->FindObject(AliAODMCHeader::StdBranchName());
614 AliFatal("fInjectedSignals set but no MC header found");
616 headers = header->GetNCocktailHeaders();
617 eventHeader = header->GetCocktailHeader(0);
622 // We avoid AliFatal here, because the AOD productions sometimes have events where the MC header is missing
623 // (due to unreadable Kinematics) and we don't want to loose the whole job because of a few events
624 AliError("First event header not found. Skipping this event.");
625 fHistos->FillEvent(centrality, AliUEHist::kCFStepAnaTopology);
629 skipParticlesAbove = eventHeader->NProduced();
630 AliInfo(Form("Injected signals in this event (%d headers). Keeping particles/tracks of %s. Will skip particles/tracks above %d.", headers, eventHeader->ClassName(), skipParticlesAbove));
633 if (fCentralityWeights && !AcceptEventCentralityWeight(centrality))
635 AliInfo(Form("Rejecting event because of centrality weighting: %f", centrality));
636 fHistos->FillEvent(centrality, AliUEHist::kCFStepAnaTopology);
642 TObjArray* tmpList = fAnalyseUE->GetAcceptedParticles(mc, 0, kTRUE, fParticleSpeciesTrigger, kTRUE);
643 CleanUp(tmpList, mc, skipParticlesAbove);
644 TObjArray* tracksMC = CloneAndReduceTrackList(tmpList);
648 TObjArray* tracksCorrelateMC = tracksMC;
649 if (fParticleSpeciesAssociated != fParticleSpeciesTrigger)
651 tmpList = fAnalyseUE->GetAcceptedParticles(mc, 0, kTRUE, fParticleSpeciesAssociated, kTRUE);
652 CleanUp(tmpList, mc, skipParticlesAbove);
653 tracksCorrelateMC = CloneAndReduceTrackList(tmpList);
657 if (fRandomizeReactionPlane)
659 Double_t centralityDigits = centrality*1000. - (Int_t)(centrality*1000.);
660 Double_t angle = TMath::TwoPi() * centralityDigits;
661 AliInfo(Form("Shifting phi of all tracks by %f (digits %f)", angle, centralityDigits));
662 ShiftTracks(tracksMC, angle);
663 if (tracksCorrelateMC != tracksMC)
664 ShiftTracks(tracksCorrelateMC, angle);
670 // Event selection based on number of number of MC particles
671 if (fRejectZeroTrackEvents && tracksMC->GetEntriesFast() == 0)
673 AliInfo(Form("Rejecting event due to kinematic selection: %f %d", centrality, tracksMC->GetEntriesFast()));
674 fHistos->FillEvent(centrality, AliUEHist::kCFStepAnaTopology);
675 if (tracksMC != tracksCorrelateMC)
676 delete tracksCorrelateMC;
681 // (MC-true all particles)
683 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepAll, tracksMC, tracksCorrelateMC, weight);
688 AliEventPool* pool = fPoolMgr->GetEventPool(centrality, zVtx);
690 ((TH2F*) fListOfHistos->FindObject("mixedDist"))->Fill(centrality, pool->NTracksInPool());
692 for (Int_t jMix=0; jMix<pool->GetCurrentNEvents(); jMix++)
693 fHistosMixed->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepAll, tracksMC, pool->GetEvent(jMix), 1.0 / pool->GetCurrentNEvents(), (jMix == 0));
694 pool->UpdatePool(CloneAndReduceTrackList(tracksCorrelateMC));
697 // Printf("trigger: %d", ((AliInputEventHandler*)fInputHandler)->IsEventSelected());
699 // Trigger selection ************************************************
700 if (!fFillOnlyStep0 && (fSkipTrigger || fAnalyseUE->TriggerSelection(fInputHandler)))
702 // (MC-true all particles)
704 if (!fReduceMemoryFootprint)
705 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepTriggered, tracksMC, tracksCorrelateMC, weight);
707 fHistos->FillEvent(centrality, AliUEHist::kCFStepTriggered);
710 AliFatal("UNEXPECTED: inputEvent is 0. Trigger selection should have failed");
714 // Vertex selection *************************************************
715 if (fAnalyseUE->VertexSelection(inputEvent, fnTracksVertex, fZVertex))
717 // fill here for tracking efficiency
718 // loop over particle species
720 for (Int_t particleSpecies = 0; particleSpecies < 4; particleSpecies++)
722 TObjArray* primMCParticles = fAnalyseUE->GetAcceptedParticles(mc, 0x0, kTRUE, particleSpecies, kTRUE);
723 TObjArray* primRecoTracksMatched = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kTRUE, particleSpecies, kTRUE, kFALSE);
724 TObjArray* allRecoTracksMatched = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kFALSE, particleSpecies, kTRUE, kFALSE);
725 TObjArray* primRecoTracksMatchedPID = 0;
726 TObjArray* allRecoTracksMatchedPID = 0;
730 primRecoTracksMatchedPID = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kTRUE, particleSpecies, kTRUE, kTRUE);
731 allRecoTracksMatchedPID = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kFALSE, particleSpecies, kTRUE, kTRUE);
734 CleanUp(primMCParticles, mc, skipParticlesAbove);
735 CleanUp(primRecoTracksMatched, mc, skipParticlesAbove);
736 CleanUp(allRecoTracksMatched, mc, skipParticlesAbove);
737 CleanUp(primRecoTracksMatchedPID, mc, skipParticlesAbove);
738 CleanUp(allRecoTracksMatchedPID, mc, skipParticlesAbove);
741 if (fTriggerSelectCharge != 0)
743 SelectCharge(primMCParticles);
744 SelectCharge(primRecoTracksMatched);
745 SelectCharge(allRecoTracksMatched);
746 SelectCharge(primRecoTracksMatchedPID);
747 SelectCharge(allRecoTracksMatchedPID);
750 fHistos->FillTrackingEfficiency(primMCParticles, primRecoTracksMatched, allRecoTracksMatched, primRecoTracksMatchedPID, allRecoTracksMatchedPID, 0, particleSpecies, centrality, zVtx);
752 // Printf("%d --> %d %d %d", particleSpecies, primMCParticles->GetEntries(), primRecoTracksMatched->GetEntries(), allRecoTracksMatched->GetEntries());
754 delete primMCParticles;
755 delete primRecoTracksMatched;
756 delete allRecoTracksMatched;
759 TObjArray* fakeParticles = fAnalyseUE->GetFakeParticles(inputEvent, mc, kFALSE, -1, kTRUE);
760 CleanUp((TObjArray*) fakeParticles->At(0), mc, skipParticlesAbove);
761 CleanUp((TObjArray*) fakeParticles->At(1), mc, skipParticlesAbove);
763 fHistos->FillTrackingEfficiency(0, 0, 0, 0, 0, (TObjArray*) fakeParticles->At(2), 0, centrality, zVtx);
764 fHistos->FillFakePt(fakeParticles, centrality);
765 // Printf(">>>>> %d %d %d fakes", ((TObjArray*) fakeParticles->At(0))->GetEntriesFast(), ((TObjArray*) fakeParticles->At(1))->GetEntriesFast(), ((TObjArray*) fakeParticles->At(2))->GetEntriesFast());
766 delete fakeParticles;
768 // (MC-true all particles)
770 if (!fReduceMemoryFootprint)
771 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepVertex, tracksMC, tracksCorrelateMC, weight);
773 fHistos->FillEvent(centrality, AliUEHist::kCFStepVertex);
775 // Get MC primaries that match reconstructed track
777 tmpList = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kTRUE, fParticleSpeciesTrigger, kTRUE);
778 CleanUp(tmpList, mc, skipParticlesAbove);
779 TObjArray* tracksRecoMatchedPrim = CloneAndReduceTrackList(tmpList);
783 TObjArray* tracksCorrelateRecoMatchedPrim = tracksRecoMatchedPrim;
784 if (fParticleSpeciesAssociated != fParticleSpeciesTrigger)
786 tmpList = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kTRUE, fParticleSpeciesAssociated, kTRUE);
787 CleanUp(tmpList, mc, skipParticlesAbove);
788 tracksCorrelateRecoMatchedPrim = CloneAndReduceTrackList(tmpList);
792 // (RECO-matched (quantities from MC particle) primary particles)
794 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepTrackedOnlyPrim, tracksRecoMatchedPrim, tracksCorrelateRecoMatchedPrim, weight);
799 AliEventPool* pool = fPoolMgr->GetEventPool(centrality, zVtx + 200);
801 for (Int_t jMix=0; jMix<pool->GetCurrentNEvents(); jMix++)
802 fHistosMixed->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepTrackedOnlyPrim, tracksRecoMatchedPrim, pool->GetEvent(jMix), 1.0 / pool->GetCurrentNEvents(), (jMix == 0));
803 pool->UpdatePool(CloneAndReduceTrackList(tracksCorrelateRecoMatchedPrim));
806 // Get MC primaries + secondaries that match reconstructed track
808 tmpList = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kFALSE, fParticleSpeciesTrigger, kTRUE);
809 CleanUp(tmpList, mc, skipParticlesAbove);
810 TObjArray* tracksRecoMatchedAll = CloneAndReduceTrackList(tmpList);
814 TObjArray* tracksCorrelateRecoMatchedAll = tracksRecoMatchedAll;
815 if (fParticleSpeciesAssociated != fParticleSpeciesTrigger)
817 tmpList = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kFALSE, fParticleSpeciesAssociated, kTRUE);
818 CleanUp(tmpList, mc, skipParticlesAbove);
819 tracksCorrelateRecoMatchedAll = CloneAndReduceTrackList(tmpList);
823 // (RECO-matched (quantities from MC particle) all particles)
825 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepTracked, tracksRecoMatchedAll, tracksCorrelateRecoMatchedAll, weight);
830 AliEventPool* pool = fPoolMgr->GetEventPool(centrality, zVtx + 300);
832 for (Int_t jMix=0; jMix<pool->GetCurrentNEvents(); jMix++)
833 fHistosMixed->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepTracked, tracksRecoMatchedAll, pool->GetEvent(jMix), 1.0 / pool->GetCurrentNEvents(), (jMix == 0));
834 pool->UpdatePool(CloneAndReduceTrackList(tracksCorrelateRecoMatchedAll));
839 tmpList = fAnalyseUE->GetAcceptedParticles(inputEvent, 0, kTRUE, fParticleSpeciesTrigger, kTRUE);
840 CleanUp(tmpList, mc, skipParticlesAbove);
841 TObjArray* tracks = CloneAndReduceTrackList(tmpList);
845 TObjArray* tracksCorrelate = tracks;
846 if (fParticleSpeciesAssociated != fParticleSpeciesTrigger)
848 tmpList = fAnalyseUE->GetAcceptedParticles(inputEvent, 0, kTRUE, fParticleSpeciesAssociated, kTRUE);
849 CleanUp(tmpList, mc, skipParticlesAbove);
850 tracksCorrelate = CloneAndReduceTrackList(tmpList);
857 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepReconstructed, tracks, tracksCorrelate, weight);
859 // two track cut, STEP 8
860 if (fTwoTrackEfficiencyCut > 0)
861 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepBiasStudy, tracks, tracksCorrelate, weight, kTRUE, kTRUE, bSign, fTwoTrackEfficiencyCut);
863 // apply correction efficiency, STEP 10
864 if (fEfficiencyCorrectionTriggers || fEfficiencyCorrectionAssociated)
866 // with or without two track efficiency depending on if fTwoTrackEfficiencyCut is set
867 Bool_t twoTrackCut = (fTwoTrackEfficiencyCut > 0);
869 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepCorrected, tracks, tracksCorrelate, weight, kTRUE, twoTrackCut, bSign, fTwoTrackEfficiencyCut, kTRUE);
875 AliEventPool* pool2 = fPoolMgr->GetEventPool(centrality, zVtx + 100);
876 ((TH2F*) fListOfHistos->FindObject("mixedDist"))->Fill(centrality, pool2->NTracksInPool());
877 if (pool2->IsReady())
879 for (Int_t jMix=0; jMix<pool2->GetCurrentNEvents(); jMix++)
883 fHistosMixed->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepReconstructed, tracks, pool2->GetEvent(jMix), 1.0 / pool2->GetCurrentNEvents(), (jMix == 0));
885 // two track cut, STEP 8
886 if (fTwoTrackEfficiencyCut > 0)
887 fHistosMixed->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepBiasStudy, tracks, pool2->GetEvent(jMix), 1.0 / pool2->GetCurrentNEvents(), (jMix == 0), kTRUE, bSign, fTwoTrackEfficiencyCut);
889 // apply correction efficiency, STEP 10
890 if (fEfficiencyCorrectionTriggers || fEfficiencyCorrectionAssociated)
892 // with or without two track efficiency depending on if fTwoTrackEfficiencyCut is set
893 Bool_t twoTrackCut = (fTwoTrackEfficiencyCut > 0);
895 fHistosMixed->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepCorrected, tracks, pool2->GetEvent(jMix), 1.0 / pool2->GetCurrentNEvents(), (jMix == 0), twoTrackCut, bSign, fTwoTrackEfficiencyCut, kTRUE);
899 pool2->UpdatePool(CloneAndReduceTrackList(tracksCorrelate));
902 if (0 && !fReduceMemoryFootprint)
904 // make list of secondaries (matched with MC)
905 TObjArray* tracksRecoMatchedSecondaries = new TObjArray;
906 for (Int_t i=0; i<tracksRecoMatchedAll->GetEntriesFast(); i++)
907 if (((AliAODMCParticle*)tracksRecoMatchedAll->At(i))->IsPhysicalPrimary() == kFALSE)
908 tracksRecoMatchedSecondaries->Add(tracksRecoMatchedAll->At(i));
910 // Study: Use only secondaries as trigger particles and plot the correlation vs. all particles; store in step 9
911 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepBiasStudy2, tracksRecoMatchedSecondaries, tracksRecoMatchedAll, weight);
913 // Study: Use only primaries as trigger particles and plot the correlation vs. secondaries; store in step 8
914 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepBiasStudy, tracksRecoMatchedPrim, tracksRecoMatchedSecondaries, weight);
916 // plot delta phi vs process id of secondaries
917 // trigger particles: primaries in 4 < pT < 10
918 // associated particles: secondaries in 1 < pT < 10
920 for (Int_t i=0; i<tracksRecoMatchedPrim->GetEntriesFast(); i++)
922 AliVParticle* triggerParticle = (AliVParticle*) tracksRecoMatchedPrim->At(i);
924 if (triggerParticle->Pt() < 4 || triggerParticle->Pt() > 10)
927 for (Int_t j=0; j<tracksRecoMatchedSecondaries->GetEntriesFast(); j++)
929 AliAODMCParticle* particle = (AliAODMCParticle*) tracksRecoMatchedSecondaries->At(j);
931 if (particle->Pt() < 1 || particle->Pt() > 10)
934 if (particle->Pt() > triggerParticle->Pt())
937 Double_t deltaPhi = triggerParticle->Phi() - particle->Phi();
938 if (deltaPhi > 1.5 * TMath::Pi())
939 deltaPhi -= TMath::TwoPi();
940 if (deltaPhi < -0.5 * TMath::Pi())
941 deltaPhi += TMath::TwoPi();
943 Int_t processID = fMcEvent->Stack()->Particle(particle->GetLabel())->GetUniqueID();
945 ((TH2F*) fListOfHistos->FindObject("processIDs"))->Fill(deltaPhi, processID);
949 delete tracksRecoMatchedSecondaries;
952 if (tracksCorrelateRecoMatchedPrim != tracksRecoMatchedPrim)
953 delete tracksCorrelateRecoMatchedPrim;
954 delete tracksRecoMatchedPrim;
956 if (tracksCorrelateRecoMatchedAll != tracksRecoMatchedAll)
957 delete tracksCorrelateRecoMatchedAll;
958 delete tracksRecoMatchedAll;
960 if (tracksCorrelate != tracks)
961 delete tracksCorrelate;
966 if (tracksMC != tracksCorrelateMC)
967 delete tracksCorrelateMC;
971 //____________________________________________________________________
972 AliGenEventHeader* AliAnalysisTaskPhiCorrelations::GetFirstHeader()
974 // get first MC header from either ESD/AOD (including cocktail header if available)
979 AliHeader* header = (AliHeader*) fMcEvent->Header();
983 AliGenCocktailEventHeader* cocktailHeader = dynamic_cast<AliGenCocktailEventHeader*> (header->GenEventHeader());
985 return dynamic_cast<AliGenEventHeader*> (cocktailHeader->GetHeaders()->First());
987 return dynamic_cast<AliGenEventHeader*> (header->GenEventHeader());
992 AliAODMCHeader* header = (AliAODMCHeader*) fAOD->GetList()->FindObject(AliAODMCHeader::StdBranchName());
996 return header->GetCocktailHeader(0);
1000 //____________________________________________________________________
1001 void AliAnalysisTaskPhiCorrelations::AnalyseDataMode()
1004 // Run the analysis on DATA or MC to get raw distributions
1006 if ( fDebug > 3 ) AliInfo( " Processing event in Data mode ..." );
1008 ((TH1F*) fListOfHistos->FindObject("eventStat"))->Fill(0);
1013 // skip not selected events here (the AOD is not updated for those)
1014 if (!fSkipTrigger && !(fInputHandler->IsEventSelected() & fSelectBit))
1017 // skip fast cluster events here if requested
1018 if (fSkipFastCluster && (fInputHandler->IsEventSelected() & AliVEvent::kFastOnly))
1021 // Support for ESD and AOD based analysis
1022 AliVEvent* inputEvent = fAOD;
1026 Double_t centrality = 0;
1028 AliCentrality *centralityObj = 0;
1029 if (fCentralityMethod.Length() > 0)
1031 if (fCentralityMethod == "ZNA_MANUAL")
1033 Bool_t zna = kFALSE;
1034 for(Int_t j = 0; j < 4; ++j) {
1035 if (fESD->GetZDCData()->GetZDCTDCData(12,j) != 0) {
1040 // Printf("%d %f", zna, fZNAtower[0]);
1043 // code from Chiara O (23.10.12)
1044 const Double_t *fZNAtower = fESD->GetZDCData()->GetZN2TowerEnergy();
1045 Float_t znacut[4] = {681., 563., 413., 191.};
1047 if(fZNAtower[0]>znacut[0]) centrality = 1;
1048 else if(fZNAtower[0]>znacut[1]) centrality = 21;
1049 else if(fZNAtower[0]>znacut[2]) centrality = 41;
1050 else if(fZNAtower[0]>znacut[3]) centrality = 61;
1051 else centrality = 81;
1056 else if (fCentralityMethod == "TRACKS_MANUAL")
1059 TObjArray* tracks = fAnalyseUE->GetAcceptedParticles(inputEvent, 0, kTRUE, -1, kTRUE);
1060 centrality = tracks->GetEntriesFast();
1061 if (centrality > 40)
1063 // Printf("%d %f", tracks->GetEntriesFast(), centrality);
1066 else if (fCentralityMethod == "V0A_MANUAL")
1070 //Total multiplicity in the VZERO A detector
1071 Float_t MV0A=inputEvent->GetVZEROData()->GetMTotV0A();
1072 Float_t MV0AScaled=0.;
1074 TParameter<float>* sf=(TParameter<float>*)fMap->GetValue(Form("%d",inputEvent->GetRunNumber()));
1075 if(sf)MV0AScaled=MV0A*sf->GetVal();
1079 centrality = MV0AScaled;
1083 else if (fCentralityMethod == "nano")
1085 // fAOD->GetHeader()->Dump();
1086 // Printf("%p %p %d", dynamic_cast<AliNanoAODHeader*> (fAOD->GetHeader()), dynamic_cast<AliNanoAODHeader*> ((TObject*) (fAOD->GetHeader())), fAOD->GetHeader()->InheritsFrom("AliNanoAODHeader"));
1089 centrality = (Float_t) gROOT->ProcessLine(Form("100.0 + 100.0 * ((AliNanoAODHeader*) %p)->GetCentrality(\"%s\")", fAOD->GetHeader(), fCentralityMethod.Data()), &error) / 100 - 1.0;
1090 if (error != TInterpreter::kNoError)
1096 centralityObj = fAOD->GetHeader()->GetCentralityP();
1098 centralityObj = fESD->GetCentrality();
1101 centrality = centralityObj->GetCentralityPercentile(fCentralityMethod);
1102 //centrality = centralityObj->GetCentralityPercentileUnchecked(fCentralityMethod);
1109 if (centrality == 0)
1111 if (fAOD->GetVZEROData())
1114 for (Int_t i=0; i<64; i++)
1115 multV0 += fAOD->GetVZEROData()->GetMultiplicity(i);
1119 AliInfo("Rejecting event due to too small V0 multiplicity");
1126 AliInfo(Form("Centrality is %f", centrality));
1129 Float_t bSign = (inputEvent->GetMagneticField() > 0) ? 1 : -1;
1131 fHistos->SetRunNumber(inputEvent->GetRunNumber());
1133 // Fill the "event-counting-container", it is needed to get the number of events remaining after each event-selection cut
1134 fHistos->FillEvent(centrality, AliUEHist::kCFStepAll);
1136 // Trigger selection ************************************************
1137 if (!fSkipTrigger && !fAnalyseUE->TriggerSelection(fInputHandler)) return;
1139 // Fill the "event-counting-container", it is needed to get the number of events remaining after each event-selection cut
1140 fHistos->FillEvent(centrality, AliUEHist::kCFStepTriggered);
1142 // Pileup selection ************************************************
1143 if (fAnalysisUtils && fAnalysisUtils->IsPileUpEvent(inputEvent))
1145 // count the removed events
1146 fHistos->FillEvent(centrality, AliUEHist::kCFStepAnaTopology);
1151 // Reject events without a muon in the muon arm ************************************************
1152 if(fAcceptOnlyMuEvents && !IsMuEvent())return;
1154 // Vertex selection *************************************************
1155 if(!fAnalyseUE->VertexSelection(inputEvent, fnTracksVertex, fZVertex)) return;
1157 // Fill the "event-counting-container", it is needed to get the number of events remaining after each event-selection cut
1158 fHistos->FillEvent(centrality, AliUEHist::kCFStepVertex);
1160 // fill V0 control histograms
1161 if (fCentralityMethod == "V0A_MANUAL")
1163 ((TH2F*) fListOfHistos->FindObject("V0AMult"))->Fill(inputEvent->GetVZEROData()->GetMTotV0A(), centrality);
1165 ((TH2F*) fListOfHistos->FindObject("V0AMultCorrelation"))->Fill(inputEvent->GetVZEROData()->GetMTotV0A(), fAOD->GetTracklets()->GetNumberOfTracklets());
1172 TObjArray* tracks = 0;
1174 Double_t evtPlanePhi = 10e10; //A value outside [-pi/2,pi/2] will be ignored
1175 if(fTrackPhiCutEvPlMax!=0) {
1176 AliEventplane* evtPlane = inputEvent->GetEventplane();
1177 Double_t qx = 0; Double_t qy = 0;
1178 if(evtPlane) evtPlanePhi = evtPlane->CalculateVZEROEventPlane(inputEvent, 10, 2, qx, qy);
1179 //Reject event if the plane is not available
1183 if (fTriggersFromDetector == 0)
1184 tracks = fAnalyseUE->GetAcceptedParticles(inputEvent, 0, kTRUE, fParticleSpeciesTrigger, kTRUE, kTRUE, evtPlanePhi);
1185 else if (fTriggersFromDetector <= 4)
1186 tracks=GetParticlesFromDetector(inputEvent,fTriggersFromDetector);
1188 AliFatal(Form("Invalid setting for fTriggersFromDetector: %d", fTriggersFromDetector));
1190 //Printf("Accepted %d tracks", tracks->GetEntries());
1192 // check for outlier in centrality vs number of tracks (rough constants extracted from correlation histgram)
1193 Bool_t reject = kFALSE;
1194 if (fRejectCentralityOutliers)
1196 if (centrality > 40 && centrality <= 50 && tracks->GetEntriesFast() > 1160)
1198 if (centrality > 50 && centrality <= 60 && tracks->GetEntriesFast() > 650)
1200 if (centrality > 60 && centrality <= 70 && tracks->GetEntriesFast() > 370)
1202 if (centrality > 70 && centrality <= 80 && tracks->GetEntriesFast() > 220)
1204 if (centrality > 80 && centrality <= 90 && tracks->GetEntriesFast() > 130)
1206 if (centrality > 90 && tracks->GetEntriesFast() > 75)
1212 AliInfo(Form("Rejecting event due to centrality vs tracks correlation: %f %d", centrality, tracks->GetEntriesFast()));
1213 fHistos->FillEvent(centrality, AliUEHist::kCFStepAnaTopology);
1218 if (fRejectZeroTrackEvents && tracks->GetEntriesFast() == 0)
1220 AliInfo(Form("Rejecting event because it has no tracks: %f %d", centrality, tracks->GetEntriesFast()));
1221 fHistos->FillEvent(centrality, AliUEHist::kCFStepAnaTopology);
1226 if (fCentralityWeights && !AcceptEventCentralityWeight(centrality))
1228 AliInfo(Form("Rejecting event because of centrality weighting: %f", centrality));
1229 fHistos->FillEvent(centrality, AliUEHist::kCFStepAnaTopology);
1234 // correlate particles with...
1235 TObjArray* tracksCorrelate = 0;
1236 if(fAssociatedFromDetector==0){
1237 if (fParticleSpeciesAssociated != fParticleSpeciesTrigger || fTriggersFromDetector > 0 || fTrackPhiCutEvPlMax != 0)
1238 tracksCorrelate = fAnalyseUE->GetAcceptedParticles(inputEvent, 0, kTRUE, fParticleSpeciesAssociated, kTRUE);
1240 else if (fAssociatedFromDetector <= 4){
1241 if(fAssociatedFromDetector != fTriggersFromDetector)
1242 tracksCorrelate = GetParticlesFromDetector(inputEvent,fAssociatedFromDetector);
1245 AliFatal(Form("Invalid setting for fAssociatedFromDetector: %d", fAssociatedFromDetector));
1247 // reference multiplicity
1248 Int_t referenceMultiplicity = -1;
1250 referenceMultiplicity = AliESDtrackCuts::GetReferenceMultiplicity(fESD);
1252 referenceMultiplicity = tracks->GetEntriesFast(); // TODO to be replaced by the estimator once available in the AOD
1253 // referenceMultiplicity = fAOD->GetHeader()->GetRefMultiplicityComb05();
1255 ((TH2F*) fListOfHistos->FindObject("referenceMultiplicity"))->Fill(centrality, referenceMultiplicity);
1257 const AliVVertex* vertex = inputEvent->GetPrimaryVertex();
1258 Double_t zVtx = vertex->GetZ();
1264 // Fill containers at STEP 6 (reconstructed)
1265 if (centrality >= 0)
1268 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepReconstructed, tracks, tracksCorrelate, weight, kTRUE, kFALSE, 0, 0.02, kTRUE);
1270 ((TH1F*) fListOfHistos->FindObject("eventStat"))->Fill(1);
1272 if (fTwoTrackEfficiencyCut > 0)
1273 fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepBiasStudy, tracks, tracksCorrelate, weight, kTRUE, kTRUE, bSign, fTwoTrackEfficiencyCut, kTRUE);
1276 // create a list of reduced objects. This speeds up processing and reduces memory consumption for the event pool
1277 TObjArray* tracksClone = CloneAndReduceTrackList(tracks);
1284 // 1. First get an event pool corresponding in mult (cent) and
1285 // zvertex to the current event. Once initialized, the pool
1286 // should contain nMix (reduced) events. This routine does not
1287 // pre-scan the chain. The first several events of every chain
1288 // will be skipped until the needed pools are filled to the
1289 // specified depth. If the pool categories are not too rare, this
1290 // should not be a problem. If they are rare, you could lose
1293 // 2. Collect the whole pool's content of tracks into one TObjArray
1294 // (bgTracks), which is effectively a single background super-event.
1296 // 3. The reduced and bgTracks arrays must both be passed into
1297 // FillCorrelations(). Also nMix should be passed in, so a weight
1298 // of 1./nMix can be applied.
1300 AliEventPool* pool = fPoolMgr->GetEventPool(centrality, zVtx);
1303 AliFatal(Form("No pool found for centrality = %f, zVtx = %f", centrality, zVtx));
1305 // pool->SetDebug(1);
1307 if (pool->IsReady())
1310 Int_t nMix = pool->GetCurrentNEvents();
1311 // cout << "nMix = " << nMix << " tracks in pool = " << pool->NTracksInPool() << endl;
1313 ((TH1F*) fListOfHistos->FindObject("eventStat"))->Fill(2);
1314 ((TH2F*) fListOfHistos->FindObject("mixedDist"))->Fill(centrality, pool->NTracksInPool());
1315 if (pool->IsReady())
1316 ((TH1F*) fListOfHistos->FindObject("eventStat"))->Fill(3);
1318 // Fill mixed-event histos here
1319 for (Int_t jMix=0; jMix<nMix; jMix++)
1321 TObjArray* bgTracks = pool->GetEvent(jMix);
1324 fHistosMixed->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepReconstructed, tracksClone, bgTracks, 1.0 / nMix, (jMix == 0), kFALSE, 0, 0.02, kTRUE);
1326 if (fTwoTrackEfficiencyCut > 0)
1327 fHistosMixed->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepBiasStudy, tracksClone, bgTracks, 1.0 / nMix, (jMix == 0), kTRUE, bSign, fTwoTrackEfficiencyCut, kTRUE);
1331 // ownership is with the pool now
1332 if (tracksCorrelate)
1334 pool->UpdatePool(CloneAndReduceTrackList(tracksCorrelate));
1338 pool->UpdatePool(tracksClone);
1339 //pool->PrintInfo();
1344 if (tracksCorrelate)
1345 delete tracksCorrelate;
1349 //____________________________________________________________________
1350 TObjArray* AliAnalysisTaskPhiCorrelations::CloneAndReduceTrackList(TObjArray* tracks)
1352 // clones a track list by using AliDPhiBasicParticle which uses much less memory (used for event mixing)
1354 TObjArray* tracksClone = new TObjArray;
1355 tracksClone->SetOwner(kTRUE);
1357 for (Int_t i=0; i<tracks->GetEntriesFast(); i++)
1359 AliVParticle* particle = (AliVParticle*) tracks->UncheckedAt(i);
1360 AliDPhiBasicParticle* copy = new AliDPhiBasicParticle(particle->Eta(), particle->Phi(), particle->Pt(), particle->Charge());
1361 copy->SetUniqueID(particle->GetUniqueID());
1362 tracksClone->Add(copy);
1368 //____________________________________________________________________
1369 void AliAnalysisTaskPhiCorrelations::Initialize()
1372 fInputHandler = (AliInputEventHandler*)
1373 ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
1375 fMcHandler = dynamic_cast<AliInputEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
1378 //____________________________________________________________________
1379 void AliAnalysisTaskPhiCorrelations::RemoveDuplicates(TObjArray* tracks)
1381 // remove particles with the same label
1383 Int_t before = tracks->GetEntriesFast();
1385 for (Int_t i=0; i<before; ++i)
1387 AliVParticle* part = (AliVParticle*) tracks->At(i);
1389 for (Int_t j=i+1; j<before; ++j)
1391 AliVParticle* part2 = (AliVParticle*) tracks->At(j);
1393 if (part->GetLabel() == part2->GetLabel())
1395 Printf("Removing %d with label %d (duplicated in %d)", i, part->GetLabel(), j); part->Dump(); part2->Dump();
1396 TObject* object = tracks->RemoveAt(i);
1397 if (tracks->IsOwner())
1406 if (before > tracks->GetEntriesFast())
1407 AliInfo(Form("Reduced from %d to %d", before, tracks->GetEntriesFast()));
1410 //____________________________________________________________________
1411 void AliAnalysisTaskPhiCorrelations::CleanUp(TObjArray* tracks, TObject* mcObj, Int_t maxLabel)
1413 // calls RemoveInjectedSignals, RemoveWeakDecays and RemoveDuplicates
1418 if (fInjectedSignals)
1419 fAnalyseUE->RemoveInjectedSignals(tracks, mcObj, maxLabel);
1420 if (fRemoveWeakDecays)
1421 fAnalyseUE->RemoveWeakDecays(tracks, mcObj);
1422 if (fRemoveDuplicates)
1423 RemoveDuplicates(tracks);
1426 //____________________________________________________________________
1427 void AliAnalysisTaskPhiCorrelations::SelectCharge(TObjArray* tracks)
1429 // remove particles with charge not selected (depending on fTriggerSelectCharge)
1434 Int_t before = tracks->GetEntriesFast();
1436 for (Int_t i=0; i<before; ++i)
1438 AliVParticle* part = (AliVParticle*) tracks->At(i);
1440 if (part->Charge() * fTriggerSelectCharge < -1)
1442 // Printf("Removing %d with charge %d", i, part->Charge());
1443 TObject* object = tracks->RemoveAt(i);
1444 if (tracks->IsOwner())
1451 if (before > tracks->GetEntriesFast())
1452 AliInfo(Form("Reduced from %d to %d", before, tracks->GetEntriesFast()));
1455 //____________________________________________________________________
1456 Bool_t AliAnalysisTaskPhiCorrelations::AcceptEventCentralityWeight(Double_t centrality)
1458 // rejects "randomly" events such that the centrality gets flat
1459 // uses fCentralityWeights histogram
1461 // TODO code taken and adapted from AliRDHFCuts; waiting for general class AliCentralityFlattening
1463 Double_t weight = fCentralityWeights->GetBinContent(fCentralityWeights->FindBin(centrality));
1464 Double_t centralityDigits = centrality*100. - (Int_t)(centrality*100.);
1466 Bool_t result = kFALSE;
1467 if (centralityDigits < weight)
1470 AliInfo(Form("Centrality: %f; Digits: %f; Weight: %f; Result: %d", centrality, centralityDigits, weight, result));
1475 //____________________________________________________________________
1476 void AliAnalysisTaskPhiCorrelations::ShiftTracks(TObjArray* tracks, Double_t angle)
1478 // shifts the phi angle of all tracks by angle
1479 // 0 <= angle <= 2pi
1481 for (Int_t i=0; i<tracks->GetEntriesFast(); ++i)
1483 AliDPhiBasicParticle* part = (AliDPhiBasicParticle*) tracks->At(i);
1484 Double_t newAngle = part->Phi() + angle;
1485 if (newAngle >= TMath::TwoPi())
1486 newAngle -= TMath::TwoPi();
1488 part->SetPhi(newAngle);
1492 //____________________________________________________________________
1493 TObjArray* AliAnalysisTaskPhiCorrelations::GetParticlesFromDetector(AliVEvent* inputEvent, Int_t idet)
1495 //1 = VZERO_A; 2 = VZERO_C; 3 = SPD tracklets
1496 TObjArray* obj = new TObjArray;
1497 obj->SetOwner(kTRUE);
1499 if (idet == 1 || idet == 2)
1501 AliVVZERO* vZero = inputEvent->GetVZEROData();
1503 const Int_t vZeroStart = (idet == 1) ? 32 : 0;
1505 TH1F* singleCells = (TH1F*) fListOfHistos->FindObject("V0SingleCells");
1506 for (Int_t i=vZeroStart; i<vZeroStart+32; i++)
1508 Float_t weight = vZero->GetMultiplicity(i);
1509 singleCells->Fill(weight);
1511 // rough estimate of multiplicity
1512 for (Int_t j=0; j<TMath::Nint(weight); j++)
1514 AliDPhiBasicParticle* particle = new AliDPhiBasicParticle((AliVVZERO::GetVZEROEtaMax(i) + AliVVZERO::GetVZEROEtaMin(i)) / 2, AliVVZERO::GetVZEROAvgPhi(i), 1.1, 0); // fit pT = 1.1 and charge = 0
1515 particle->SetUniqueID(fAnalyseUE->GetEventCounter()* 100000 + j + i * 1000);
1524 AliFatal("Tracklets only available on AOD");
1525 AliAODTracklets* trklets=(AliAODTracklets*)fAOD->GetTracklets();
1527 AliFatal("AliAODTracklets not found");
1528 for(Int_t itrklets=0;itrklets<trklets->GetNumberOfTracklets();itrklets++)
1530 Float_t eta=-TMath::Log(TMath::Tan(trklets->GetTheta(itrklets)/2));
1531 if(TMath::Abs(eta)>fTrackEtaCut)continue;
1532 Float_t pT=1000*TMath::Abs(trklets->GetDeltaPhi(itrklets));//in mrad
1533 if(pT>fTrackletDphiCut)continue;
1534 TH1F* DphiTrklets = (TH1F*)fListOfHistos->FindObject("DphiTrklets");
1535 DphiTrklets->Fill(1000*trklets->GetDeltaPhi(itrklets)); //in mrad
1536 Float_t phi=trklets->GetPhi(itrklets);
1537 phi+=trklets->GetDeltaPhi(itrklets)*39./34.; //correction dphi*39./34. (Dphi in rad)
1538 if (phi<0) phi+=TMath::TwoPi();
1539 if (phi>TMath::TwoPi()) phi-=TMath::TwoPi();
1541 AliDPhiBasicParticle* particle = new AliDPhiBasicParticle(eta,phi, pT, 0); // pT = TMath::Abs(trklets->GetDeltaPhi(itrklets)) in mrad and charge = 0
1542 particle->SetUniqueID(fAnalyseUE->GetEventCounter()* 100000 + itrklets);
1550 AliFatal("Muon selection only implemented on AOD");//FIXME to be implemented also for ESDs as in AliAnalyseLeadingTrackUE::GetAcceptedPArticles
1551 for (Int_t iTrack = 0; iTrack < fAOD->GetNTracks(); iTrack++) {
1552 AliAODTrack* track = fAOD->GetTrack(iTrack);
1553 if (!track->IsMuonTrack()) continue;
1554 //Float_t dca = track->DCA();
1555 //Float_t chi2 = track->Chi2perNDF();
1556 Float_t rabs = track->GetRAtAbsorberEnd();
1557 Float_t eta = track->Eta();
1558 Int_t matching = track->GetMatchTrigger();
1559 if (rabs < 17.6 || rabs > 89.5) continue;
1560 if (eta < -4 || eta > -2.5) continue;
1561 if (matching < 2) continue;
1563 AliDPhiBasicParticle* particle = new AliDPhiBasicParticle(eta,track->Phi(), track->Pt(), track->Charge());
1564 particle->SetUniqueID(fAnalyseUE->GetEventCounter() * 100000 + iTrack);
1570 AliFatal(Form("GetParticlesFromDetector: Invalid idet value: %d", idet));
1575 //____________________________________________________________________
1576 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;