7 //#include <TParameter.h>
9 #include "AliAnalysisTaskTwoPlusOne.h"
10 #include "AliCFParticle.h"
11 #include "AliAnalyseLeadingTrackUE.h"
12 #include "AliTwoPlusOneContainer.h"
13 #include "AliUEHist.h"
15 #include "AliAODHandler.h"
16 #include "AliAODInputHandler.h"
17 #include "AliVParticle.h"
18 #include "AliCFContainer.h"
20 #include "AliEventPoolManager.h"
23 ClassImp( AliAnalysisTaskTwoPlusOne )
25 //________________________________________________________________________
26 AliAnalysisTaskTwoPlusOne::AliAnalysisTaskTwoPlusOne(const char *name)
27 : AliAnalysisTaskSE(name),
30 // pointers to UE classes
32 // handlers and events
35 fEventCombination(0x0),
40 fnTracksVertex(1), // QA tracks pointing to principal vertex (= 3 default)
42 fCentralityMethod("V0M"),
48 fSharedClusterCut(-1),
50 fFoundFractionCut(-1),
53 fThreeParticleMixed(0),
54 fUseEventCombination(0),
60 DefineOutput(1, TList::Class());
63 //________________________________________________________________________
64 AliAnalysisTaskTwoPlusOne::~AliAnalysisTaskTwoPlusOne()
70 //________________________________________________________________________
71 void AliAnalysisTaskTwoPlusOne::UserCreateOutputObjects()
73 // Initialize class with main algorithms, event and track selection.
74 fAnalyseUE = new AliAnalyseLeadingTrackUE();
75 fAnalyseUE->SetParticleSelectionCriteria(fFilterBit, kFALSE, fTrackEtaCut, fTrackEtaCutMin, fPtMin);
76 fAnalyseUE->SetDCAXYCut(fDCAXYCut);
77 fAnalyseUE->SetSharedClusterCut(fSharedClusterCut);
78 fAnalyseUE->SetCrossedRowsCut(fCrossedRowsCut);
79 fAnalyseUE->SetFoundFractionCut(fFoundFractionCut);
80 fAnalyseUE->SetTrackStatus(fTrackStatus);
81 fAnalyseUE->SetDebug(fDebug);
82 fAnalyseUE->DefineESDCuts(fFilterBit);
84 fListOfHistos = new TList();
85 fListOfHistos->SetOwner(kTRUE);
87 fHistos = new AliTwoPlusOneContainer("AliTwoPlusOneContainer", fCustomBinning, fAlpha);
88 fHistos->GetData()->SetTrackEtaCut(fTrackEtaCut);
89 fHistos->SetUseLeadingPt(fUseLeadingPt);
91 fListOfHistos->Add(fHistos);
93 fListOfHistos->Add(new TH1F("eventStat", ";;events", 4, -0.5, 3.5));
94 fListOfHistos->Add(new TH2F("mixedDist", ";centrality;tracks;events", 101, 0, 101, 200, 0, fMixingTracks * 1.5));
96 PostData(1,fListOfHistos);
98 // Add task configuration to output list
102 Int_t poolsize = 1000; // Maximum number of events, ignored in the present implemention of AliEventPoolManager
104 Int_t nCentralityBins = fHistos->GetData()->GetTrackHist(AliUEHist::kToward)->GetNBins(3);
107 Double_t* centralityBins = (Double_t*) fHistos->GetData()->GetTrackHist(AliUEHist::kToward)->GetAxis(3, 0)->GetXbins()->GetArray();
109 Int_t nZvtxBins = fHistos->GetData()->GetTrackHist(AliUEHist::kToward)->GetNBins(5);
111 Double_t* zvtxbin = (Double_t*) fHistos->GetData()->GetTrackHist(AliUEHist::kToward)->GetAxis(5, 0)->GetXbins()->GetArray();
113 fPoolMgr = new AliEventPoolManager(poolsize, fMixingTracks, nCentralityBins, centralityBins, nZvtxBins, zvtxbin);
114 fPoolMgr->SetTargetValues(fMixingTracks, 0.1, 5);
116 fEventCombination = new TObjArray;
119 //________________________________________________________________________
120 void AliAnalysisTaskTwoPlusOne::UserExec(Option_t *)
123 fAnalyseUE->NextEvent();
125 ((TH1F*) fListOfHistos->FindObject("eventStat"))->Fill(0);
127 // Support for AOD based analysis
128 fAOD = dynamic_cast<AliAODEvent*> (InputEvent());
130 Double_t centrality = 0;
131 AliCentrality *centralityObj = 0;
133 centralityObj = ((AliVAODHeader*)fAOD->GetHeader())->GetCentralityP();
137 centrality = centralityObj->GetCentralityPercentile(fCentralityMethod);
145 if (fAOD->GetVZEROData())
148 for (Int_t i=0; i<64; i++)
149 multV0 += fAOD->GetVZEROData()->GetMultiplicity(i);
153 AliInfo("Rejecting event due to too small V0 multiplicity");
160 AliInfo(Form("Centrality is %f", centrality));
163 // Vertex selection *************************************************
164 if(!fAnalyseUE->VertexSelection(InputEvent(), fnTracksVertex, fZVertex)) return;
170 TObjArray* tracks = fAnalyseUE->GetAcceptedParticles(InputEvent(), 0, kTRUE, -1, kTRUE);
171 // create a list of reduced objects. This speeds up processing and reduces memory consumption for the event pool
172 TObjArray* tracksClone = CloneAndReduceTrackList(tracks);
175 const AliVVertex* vertex = InputEvent()->GetPrimaryVertex();
176 Double_t zVtx = vertex->GetZ();
178 //at this point of the code the event is acctepted
179 //if this run is used to add 30-50% centrality events to the multiplicity of central events this is done here, all other events are skipped.
180 if(fUseEventCombination){
181 if(centrality>30&¢rality<=50){
183 AddEventCombination(tracksClone);
184 //do only continue if there are 4 events in the fEventCombination
186 tracksClone = fEventCombination;
192 fHistos->FillCorrelations(centrality, zVtx, AliTwoPlusOneContainer::kSameNS, tracksClone, tracksClone, tracksClone, tracksClone, 1.0, kFALSE, kFALSE);//same event for near and away side
194 fHistos->FillCorrelations(centrality, zVtx, AliTwoPlusOneContainer::k1plus1, tracksClone, tracksClone, tracksClone, tracksClone, 1.0, kTRUE, kFALSE);//get number of possible away side triggers in the trigger area and outside of it
196 fHistos->FillCorrelations(centrality, zVtx, AliTwoPlusOneContainer::kBackgroundSameNS, tracksClone, tracksClone, tracksClone, tracksClone, 1.0, kFALSE, kTRUE);//background estimation for the same event
198 ((TH1F*) fListOfHistos->FindObject("eventStat"))->Fill(1);
202 // 1. First get an event pool corresponding in mult (cent) and
203 // zvertex to the current event. Once initialized, the pool
204 // should contain nMix (reduced) events. This routine does not
205 // pre-scan the chain. The first several events of every chain
206 // will be skipped until the needed pools are filled to the
207 // specified depth. If the pool categories are not too rare, this
208 // should not be a problem. If they are rare, you could lose
211 // 2. Collect the whole pool's content of tracks into one TObjArray
212 // (bgTracks), which is effectively a single background super-event.
214 // 3. The reduced and bgTracks arrays must both be passed into
215 // FillCorrelations(). Also nMix should be passed in, so a weight
216 // of 1./nMix can be applied.
218 AliEventPool* pool = fPoolMgr->GetEventPool(centrality, zVtx);
221 AliFatal(Form("No pool found for centrality = %f, zVtx = %f", centrality, zVtx));
222 if (pool->IsReady()){
223 ((TH2F*) fListOfHistos->FindObject("mixedDist"))->Fill(centrality, pool->NTracksInPool());
224 Int_t nMix = pool->GetCurrentNEvents();
226 ((TH1F*) fListOfHistos->FindObject("eventStat"))->Fill(2);
228 // Fill mixed-event histos here
229 for (Int_t jMix=0; jMix<nMix; jMix++){
230 TObjArray* bgTracks = pool->GetEvent(jMix);
232 //standard mixed event
233 if(!fThreeParticleMixed){
234 fHistos->FillCorrelations(centrality, zVtx, AliTwoPlusOneContainer::kMixedNS, tracksClone, tracksClone, bgTracks, bgTracks, 1.0 / (2*nMix), kFALSE, kFALSE);
235 fHistos->FillCorrelations(centrality, zVtx, AliTwoPlusOneContainer::kMixedNS, bgTracks, bgTracks, tracksClone, tracksClone, 1.0 / (2*nMix), kFALSE, kFALSE);
239 fHistos->FillCorrelations(centrality, zVtx, AliTwoPlusOneContainer::kMixed1plus1, tracksClone, tracksClone, bgTracks, bgTracks, 1.0 / (2*nMix), kTRUE, kFALSE);
240 fHistos->FillCorrelations(centrality, zVtx, AliTwoPlusOneContainer::kMixed1plus1, bgTracks, bgTracks, tracksClone, tracksClone, 1.0 / (2*nMix), kTRUE, kFALSE);
242 //mixed combinatorics
243 fHistos->FillCorrelations(centrality, zVtx, AliTwoPlusOneContainer::kMixedCombNS, tracksClone, bgTracks, tracksClone, bgTracks, 1.0 / (2*nMix), kFALSE, kFALSE);
244 fHistos->FillCorrelations(centrality, zVtx, AliTwoPlusOneContainer::kMixedCombNS, bgTracks, tracksClone, bgTracks, tracksClone, 1.0 / (2*nMix), kFALSE, kFALSE);
248 // use 3 particle mixed event
249 if(fThreeParticleMixed && nMix>1){
250 TObjArray* tracks_t2 = pool->GetEvent(0);
251 for (Int_t jMix=1; jMix<nMix; jMix++){
253 TObjArray* bgTracks = pool->GetEvent(jMix);
255 fHistos->FillCorrelations(centrality, zVtx, AliTwoPlusOneContainer::kMixedNS, tracksClone, tracks_t2, bgTracks, bgTracks, 1.0 / (nMix-1), kFALSE, kFALSE);
262 // ownership is with the pool now
263 pool->UpdatePool(tracksClone);
266 //________________________________________________________________________
267 void AliAnalysisTaskTwoPlusOne::Terminate(Option_t*)
269 //terminate function is called at the end
270 //can be used to draw histograms etc.
276 TObjArray* AliAnalysisTaskTwoPlusOne::CloneAndReduceTrackList(TObjArray* tracks)
278 // clones a track list by using AliCFParticle which uses much less memory (used for event mixing)
280 TObjArray* tracksClone = new TObjArray;
281 tracksClone->SetOwner(kTRUE);
283 for (Int_t i=0; i<tracks->GetEntriesFast(); i++)
285 AliVParticle* particle = (AliVParticle*) tracks->UncheckedAt(i);
286 AliCFParticle* copy = new AliCFParticle(particle->Pt(), particle->Eta(), particle->Phi(), particle->Charge(), 0);
287 copy->SetUniqueID(particle->GetUniqueID());
288 tracksClone->Add(copy);
294 //____________________________________________________________________
295 void AliAnalysisTaskTwoPlusOne::AddEventCombination(TObjArray* tracks)
297 //if fEventCombination was full before, clear it
299 fEventCombination->Clear();
303 for (Int_t i=0; i<tracks->GetEntriesFast(); i++)
305 AliCFParticle* part = (AliCFParticle*) tracks->UncheckedAt(i);
306 fEventCombination->Add(part);
312 //____________________________________________________________________
313 void AliAnalysisTaskTwoPlusOne::AddSettingsTree()
315 //Write settings to output list
316 TTree *settingsTree = new TTree("UEAnalysisSettings","Analysis Settings in UE estimation");
317 settingsTree->Branch("fnTracksVertex", &fnTracksVertex,"nTracksVertex/I");
318 settingsTree->Branch("fZVertex", &fZVertex,"ZVertex/D");
319 //settingsTree->Branch("fCentralityMethod", fCentralityMethod.Data(),"CentralityMethod/C");
320 settingsTree->Branch("fTrackEtaCut", &fTrackEtaCut, "TrackEtaCut/D");
321 settingsTree->Branch("fTrackEtaCutMin", &fTrackEtaCutMin, "TrackEtaCutMin/D");
322 settingsTree->Branch("fPtMin", &fPtMin, "PtMin/D");
323 settingsTree->Branch("fFilterBit", &fFilterBit,"FilterBit/I");
324 settingsTree->Branch("fSharedClusterCut", &fSharedClusterCut,"SharedClusterCut/D");
325 settingsTree->Branch("fCrossedRowsCut", &fCrossedRowsCut,"CrossedRowsCut/I");
326 settingsTree->Branch("fFoundFractionCut", &fFoundFractionCut,"FoundFractionCut/D");
327 settingsTree->Branch("fTrackStatus", &fTrackStatus,"TrackStatus/I");
328 settingsTree->Branch("fThreeParticleMixed", &fThreeParticleMixed,"fThreeParticleMixed/I");
329 settingsTree->Branch("fMixingTracks", &fMixingTracks,"MixingTracks/I");
331 settingsTree->Fill();
332 fListOfHistos->Add(settingsTree);