4 #include "TLorentzVector.h"
\r
5 #include "TGraphErrors.h"
\r
10 #include "TRandom.h"
\r
14 #include "AliAnalysisTaskSE.h"
\r
15 #include "AliAnalysisManager.h"
\r
17 #include "AliESDVertex.h"
\r
18 #include "AliESDEvent.h"
\r
19 #include "AliESDInputHandler.h"
\r
20 #include "AliAODEvent.h"
\r
21 #include "AliAODTrack.h"
\r
22 #include "AliAODInputHandler.h"
\r
23 #include "AliGenEventHeader.h"
\r
24 #include "AliGenHijingEventHeader.h"
\r
25 #include "AliMCEventHandler.h"
\r
26 #include "AliMCEvent.h"
\r
27 #include "AliMixInputEventHandler.h"
\r
28 #include "AliStack.h"
\r
31 #include "AliTHn.h"
\r
33 #include "AliEventPoolManager.h"
\r
35 #include "AliAnalysisTaskTriggeredBF.h"
\r
36 #include "AliBalanceTriggered.h"
\r
39 // Analysis task for the TriggeredBF code
\r
40 // Authors: Panos.Christakoglou@nikhef.nl, m.weber@cern.ch
\r
42 ClassImp(AliAnalysisTaskTriggeredBF)
\r
44 //________________________________________________________________________
\r
45 AliAnalysisTaskTriggeredBF::AliAnalysisTaskTriggeredBF(const char *name)
\r
46 : AliAnalysisTaskSE(name),
\r
48 fRunShuffling(kFALSE),
\r
49 fShuffledBalance(0),
\r
51 fMixingTracks(50000),
\r
55 fListTriggeredBF(0),
\r
56 fListTriggeredBFS(0),
\r
57 fListTriggeredBFM(0),
\r
61 fHistTriggerStats(0),
\r
76 fCentralityEstimator("V0M"),
\r
77 fUseCentrality(kFALSE),
\r
78 fCentralityPercentileMin(0.),
\r
79 fCentralityPercentileMax(5.),
\r
80 fImpactParameterMin(0.),
\r
81 fImpactParameterMax(20.),
\r
82 fUseMultiplicity(kFALSE),
\r
83 fNumberOfAcceptedTracksMin(0),
\r
84 fNumberOfAcceptedTracksMax(10000),
\r
85 fHistNumberOfAcceptedTracks(0),
\r
86 fUseOfflineTrigger(kFALSE),
\r
90 nAODtrackCutBit(128),
\r
98 fNClustersTPCCut(-1)
\r
101 // Define input and output slots here
\r
102 // Input slot #0 works with a TChain
\r
103 DefineInput(0, TChain::Class());
\r
104 // Output slot #0 writes into a TH1 container
\r
105 DefineOutput(1, TList::Class());
\r
106 DefineOutput(2, TList::Class());
\r
107 DefineOutput(3, TList::Class());
\r
108 DefineOutput(4, TList::Class());
\r
111 //________________________________________________________________________
\r
112 AliAnalysisTaskTriggeredBF::~AliAnalysisTaskTriggeredBF() {
\r
118 //________________________________________________________________________
\r
119 void AliAnalysisTaskTriggeredBF::UserCreateOutputObjects() {
\r
120 // Create histograms
\r
123 fBalance = new AliBalanceTriggered();
\r
124 fBalance->SetAnalysisLevel("AOD");
\r
126 if(fRunShuffling) {
\r
127 if(!fShuffledBalance) {
\r
128 fShuffledBalance = new AliBalanceTriggered();
\r
129 fShuffledBalance->SetAnalysisLevel("AOD");
\r
133 if(!fMixedBalance) {
\r
134 fMixedBalance = new AliBalanceTriggered();
\r
135 fMixedBalance->SetAnalysisLevel("AOD");
\r
140 fList = new TList();
\r
141 fList->SetName("listQA");
\r
144 //Balance Function list
\r
145 fListTriggeredBF = new TList();
\r
146 fListTriggeredBF->SetName("listTriggeredBF");
\r
147 fListTriggeredBF->SetOwner();
\r
149 if(fRunShuffling) {
\r
150 fListTriggeredBFS = new TList();
\r
151 fListTriggeredBFS->SetName("listTriggeredBFShuffled");
\r
152 fListTriggeredBFS->SetOwner();
\r
155 fListTriggeredBFM = new TList();
\r
156 fListTriggeredBFM->SetName("listTriggeredBFMixed");
\r
157 fListTriggeredBFM->SetOwner();
\r
162 TString gCutName[4] = {"Total","Offline trigger",
\r
163 "Vertex","Analyzed"};
\r
164 fHistEventStats = new TH1F("fHistEventStats",
\r
165 "Event statistics;;N_{events}",
\r
167 for(Int_t i = 1; i <= 4; i++)
\r
168 fHistEventStats->GetXaxis()->SetBinLabel(i,gCutName[i-1].Data());
\r
169 fList->Add(fHistEventStats);
\r
171 TString gCentName[9] = {"V0M","FMD","TRK","TKL","CL0","CL1","V0MvsFMD","TKLvsV0M","ZEMvsZDC"};
\r
172 fHistCentStats = new TH2F("fHistCentStats",
\r
173 "Centrality statistics;;Cent percentile",
\r
174 9,-0.5,8.5,220,-5,105);
\r
175 for(Int_t i = 1; i <= 9; i++)
\r
176 fHistCentStats->GetXaxis()->SetBinLabel(i,gCentName[i-1].Data());
\r
177 fList->Add(fHistCentStats);
\r
179 fHistTriggerStats = new TH1F("fHistTriggerStats","Trigger statistics;TriggerBit;N_{events}",130,0,130);
\r
180 fList->Add(fHistTriggerStats);
\r
182 fHistTrackStats = new TH1F("fHistTrackStats","Event statistics;TrackFilterBit;N_{events}",130,0,130);
\r
183 fList->Add(fHistTrackStats);
\r
185 fHistNumberOfAcceptedTracks = new TH1F("fHistNumberOfAcceptedTracks",";N_{acc.};Entries",4001,-0.5,4000.5);
\r
186 fList->Add(fHistNumberOfAcceptedTracks);
\r
188 // Vertex distributions
\r
189 fHistVx = new TH1F("fHistVx","Primary vertex distribution - x coordinate;V_{x} (cm);Entries",100,-0.5,0.5);
\r
190 fList->Add(fHistVx);
\r
191 fHistVy = new TH1F("fHistVy","Primary vertex distribution - y coordinate;V_{y} (cm);Entries",100,-0.5,0.5);
\r
192 fList->Add(fHistVy);
\r
193 fHistVz = new TH1F("fHistVz","Primary vertex distribution - z coordinate;V_{z} (cm);Entries",100,-20.,20.);
\r
194 fList->Add(fHistVz);
\r
197 fHistClus = new TH2F("fHistClus","# Cluster (TPC vs. ITS)",10,0,10,200,0,200);
\r
198 fList->Add(fHistClus);
\r
199 fHistChi2 = new TH1F("fHistChi2","Chi2/NDF distribution",200,0,10);
\r
200 fList->Add(fHistChi2);
\r
201 fHistDCA = new TH2F("fHistDCA","DCA (xy vs. z)",400,-5,5,400,-5,5);
\r
202 fList->Add(fHistDCA);
\r
203 fHistPt = new TH1F("fHistPt","p_{T} distribution",200,0,10);
\r
204 fList->Add(fHistPt);
\r
205 fHistEta = new TH1F("fHistEta","#eta distribution",200,-2,2);
\r
206 fList->Add(fHistEta);
\r
207 fHistPhi = new TH1F("fHistPhi","#phi distribution",200,-20,380);
\r
208 fList->Add(fHistPhi);
\r
209 fHistPhiBefore = new TH1F("fHistPhiBefore","#phi distribution",200,0.,2*TMath::Pi());
\r
210 fList->Add(fHistPhiBefore);
\r
211 fHistPhiAfter = new TH1F("fHistPhiAfter","#phi distribution",200,0.,2*TMath::Pi());
\r
212 fList->Add(fHistPhiAfter);
\r
213 fHistV0M = new TH2F("fHistV0M","V0 Multiplicity C vs. A",500, 0, 20000, 500, 0, 20000);
\r
214 fList->Add(fHistV0M);
\r
215 TString gRefTrackName[6] = {"tracks","tracksPos","tracksNeg","tracksTPConly","clusITS0","clusITS1"};
\r
216 fHistRefTracks = new TH2F("fHistRefTracks","Nr of Ref tracks/event vs. ref track estimator;;Nr of tracks",6, 0, 6, 400, 0, 20000);
\r
217 for(Int_t i = 1; i <= 6; i++)
\r
218 fHistRefTracks->GetXaxis()->SetBinLabel(i,gRefTrackName[i-1].Data());
\r
219 fList->Add(fHistRefTracks);
\r
223 // Balance function histograms
\r
224 // Initialize histograms if not done yet
\r
225 if(!fBalance->GetHistNp()){
\r
226 AliWarning("Histograms not yet initialized! --> Will be done now");
\r
227 AliWarning("--> Add 'gBalance->InitHistograms()' in your configBalanceFunction");
\r
228 fBalance->InitHistograms();
\r
231 if(fRunShuffling) {
\r
232 if(!fShuffledBalance->GetHistNp()) {
\r
233 AliWarning("Histograms (shuffling) not yet initialized! --> Will be done now");
\r
234 AliWarning("--> Add 'gBalance->InitHistograms()' in your configBalanceFunction");
\r
235 fShuffledBalance->InitHistograms();
\r
240 if(!fMixedBalance->GetHistNp()) {
\r
241 AliWarning("Histograms (mixing) not yet initialized! --> Will be done now");
\r
242 AliWarning("--> Add 'gBalance->InitHistograms()' in your configBalanceFunction");
\r
243 fMixedBalance->InitHistograms();
\r
247 fListTriggeredBF->Add(fBalance->GetHistNp());
\r
248 fListTriggeredBF->Add(fBalance->GetHistNn());
\r
249 fListTriggeredBF->Add(fBalance->GetHistNpn());
\r
250 fListTriggeredBF->Add(fBalance->GetHistNnn());
\r
251 fListTriggeredBF->Add(fBalance->GetHistNpp());
\r
252 fListTriggeredBF->Add(fBalance->GetHistNnp());
\r
254 if(fRunShuffling) {
\r
255 fListTriggeredBFS->Add(fShuffledBalance->GetHistNp());
\r
256 fListTriggeredBFS->Add(fShuffledBalance->GetHistNn());
\r
257 fListTriggeredBFS->Add(fShuffledBalance->GetHistNpn());
\r
258 fListTriggeredBFS->Add(fShuffledBalance->GetHistNnn());
\r
259 fListTriggeredBFS->Add(fShuffledBalance->GetHistNpp());
\r
260 fListTriggeredBFS->Add(fShuffledBalance->GetHistNnp());
\r
264 fListTriggeredBFM->Add(fMixedBalance->GetHistNp());
\r
265 fListTriggeredBFM->Add(fMixedBalance->GetHistNn());
\r
266 fListTriggeredBFM->Add(fMixedBalance->GetHistNpn());
\r
267 fListTriggeredBFM->Add(fMixedBalance->GetHistNnn());
\r
268 fListTriggeredBFM->Add(fMixedBalance->GetHistNpp());
\r
269 fListTriggeredBFM->Add(fMixedBalance->GetHistNnp());
\r
274 Int_t trackDepth = fMixingTracks;
\r
275 Int_t poolsize = 1000; // Maximum number of events, ignored in the present implemented of AliEventPoolManager
\r
277 Double_t centralityBins[] = {0.,1.,2.,3.,4.,5.,6.,7.,8.,9.,10.,15.,20.,25.,30.,35.,40.,45.,50.,55.,60.,65.,70.,75.,80.,90.,100.}; // SHOULD BE DEDUCED FROM CREATED ALITHN!!!
\r
278 Double_t* centbins = centralityBins;
\r
279 Int_t nCentralityBins = sizeof(centralityBins) / sizeof(Double_t) - 1;
\r
281 // bins for second buffer are shifted by 100 cm
\r
282 Double_t vertexBins[] = {-10., -7., -5., -3., -1., 1., 3., 5., 7., 10.}; // SHOULD BE DEDUCED FROM CREATED ALITHN!!!
\r
283 Double_t* vtxbins = vertexBins;
\r
284 Int_t nVertexBins = sizeof(vertexBins) / sizeof(Double_t) - 1;
\r
285 cout<<nCentralityBins<<" "<<nVertexBins<<endl;
\r
287 fPoolMgr = new AliEventPoolManager(poolsize, trackDepth, nCentralityBins, centbins, nVertexBins, vtxbins);
\r
290 // Post output data.
\r
291 PostData(1, fList);
\r
292 PostData(2, fListTriggeredBF);
\r
293 if(fRunShuffling) PostData(3, fListTriggeredBFS);
\r
294 if(fRunMixing) PostData(4, fListTriggeredBFM);
\r
297 //________________________________________________________________________
\r
298 void AliAnalysisTaskTriggeredBF::UserExec(Option_t *) {
\r
300 // Called for each event
\r
302 TString gAnalysisLevel = fBalance->GetAnalysisLevel();
\r
303 Float_t fCentrality = 0.;
\r
305 // -------------------------------------------------------------
\r
306 // AOD analysis (vertex and track cuts also here!!!!)
\r
307 if(gAnalysisLevel == "AOD") {
\r
308 AliVEvent* eventMain = dynamic_cast<AliVEvent*>(InputEvent());
\r
310 AliError("eventMain not available");
\r
314 // check event cuts and fill event histograms
\r
315 if((fCentrality = IsEventAccepted(eventMain)) < 0){
\r
319 // get the accepted tracks in main event
\r
320 TObjArray *tracksMain = GetAcceptedTracks(eventMain);
\r
322 // store charges of all accepted tracks, shuffle and reassign (two extra loops!)
\r
323 TObjArray* tracksShuffled = NULL;
\r
325 tracksShuffled = GetShuffledTracks(tracksMain);
\r
328 // Event mixing --> UPDATE POOL IS MISSING!!!
\r
331 // 1. First get an event pool corresponding in mult (cent) and
\r
332 // zvertex to the current event. Once initialized, the pool
\r
333 // should contain nMix (reduced) events. This routine does not
\r
334 // pre-scan the chain. The first several events of every chain
\r
335 // will be skipped until the needed pools are filled to the
\r
336 // specified depth. If the pool categories are not too rare, this
\r
337 // should not be a problem. If they are rare, you could lose`
\r
340 // 2. Collect the whole pool's content of tracks into one TObjArray
\r
341 // (bgTracks), which is effectively a single background super-event.
\r
343 // 3. The reduced and bgTracks arrays must both be passed into
\r
344 // FillCorrelations(). Also nMix should be passed in, so a weight
\r
345 // of 1./nMix can be applied.
\r
347 AliEventPool* pool = fPoolMgr->GetEventPool(fCentrality, eventMain->GetPrimaryVertex()->GetZ());
\r
350 AliFatal(Form("No pool found for centrality = %f, zVtx = %f", fCentrality, eventMain->GetPrimaryVertex()->GetZ()));
\r
354 //pool->SetDebug(1);
\r
356 if (pool->IsReady() || pool->NTracksInPool() > fMixingTracks / 10 || pool->GetCurrentNEvents() >= 5){
\r
359 Int_t nMix = pool->GetCurrentNEvents();
\r
360 //cout << "nMix = " << nMix << " tracks in pool = " << pool->NTracksInPool() << endl;
\r
362 //((TH1F*) fListOfHistos->FindObject("eventStat"))->Fill(2);
\r
363 //((TH2F*) fListOfHistos->FindObject("mixedDist"))->Fill(centrality, pool->NTracksInPool());
\r
364 //if (pool->IsReady())
\r
365 //((TH1F*) fListOfHistos->FindObject("eventStat"))->Fill(3);
\r
367 // Fill mixed-event histos here
\r
368 for (Int_t jMix=0; jMix<nMix; jMix++)
\r
370 TObjArray* tracksMixed = pool->GetEvent(jMix);
\r
371 fMixedBalance->FillBalance(fCentrality,tracksMain,tracksMixed);
\r
375 // Update the Event pool
\r
376 pool->UpdatePool(tracksMain);
\r
377 //pool->PrintInfo();
\r
379 }//pool NULL check
\r
382 // calculate balance function
\r
383 fBalance->FillBalance(fCentrality,tracksMain,NULL);
\r
385 // calculate shuffled balance function
\r
386 if(fRunShuffling && tracksShuffled != NULL) {
\r
387 fShuffledBalance->FillBalance(fCentrality,tracksShuffled,NULL);
\r
392 AliError("Triggered Balance Function analysis only for AODs!");
\r
396 //________________________________________________________________________
\r
397 Float_t AliAnalysisTaskTriggeredBF::IsEventAccepted(AliVEvent *event){
\r
398 // Checks the Event cuts
\r
399 // Fills Event statistics histograms
\r
401 // event selection done in AliAnalysisTaskSE::Exec() --> this is not used
\r
402 fHistEventStats->Fill(1); //all events
\r
404 Bool_t isSelectedMain = kTRUE;
\r
405 Float_t fCentrality = -1.;
\r
406 TString gAnalysisLevel = fBalance->GetAnalysisLevel();
\r
408 if(fUseOfflineTrigger)
\r
409 isSelectedMain = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
\r
411 if(isSelectedMain) {
\r
412 fHistEventStats->Fill(2); //triggered events
\r
414 //Centrality stuff
\r
415 if(fUseCentrality) {
\r
416 if(gAnalysisLevel == "AOD") { //centrality in AOD header
\r
417 AliAODHeader *header = (AliAODHeader*) event->GetHeader();
\r
418 fCentrality = header->GetCentralityP()->GetCentralityPercentile(fCentralityEstimator.Data());
\r
420 // QA for centrality estimators
\r
421 fHistCentStats->Fill(0.,header->GetCentralityP()->GetCentralityPercentile("V0M"));
\r
422 fHistCentStats->Fill(1.,header->GetCentralityP()->GetCentralityPercentile("FMD"));
\r
423 fHistCentStats->Fill(2.,header->GetCentralityP()->GetCentralityPercentile("TRK"));
\r
424 fHistCentStats->Fill(3.,header->GetCentralityP()->GetCentralityPercentile("TKL"));
\r
425 fHistCentStats->Fill(4.,header->GetCentralityP()->GetCentralityPercentile("CL0"));
\r
426 fHistCentStats->Fill(5.,header->GetCentralityP()->GetCentralityPercentile("CL1"));
\r
427 fHistCentStats->Fill(6.,header->GetCentralityP()->GetCentralityPercentile("V0MvsFMD"));
\r
428 fHistCentStats->Fill(7.,header->GetCentralityP()->GetCentralityPercentile("TKLvsV0M"));
\r
429 fHistCentStats->Fill(8.,header->GetCentralityP()->GetCentralityPercentile("ZEMvsZDC"));
\r
431 // centrality QA (V0M)
\r
432 fHistV0M->Fill(event->GetVZEROData()->GetMTotV0A(), event->GetVZEROData()->GetMTotV0C());
\r
434 // centrality QA (reference tracks)
\r
435 fHistRefTracks->Fill(0.,header->GetRefMultiplicity());
\r
436 fHistRefTracks->Fill(1.,header->GetRefMultiplicityPos());
\r
437 fHistRefTracks->Fill(2.,header->GetRefMultiplicityNeg());
\r
438 fHistRefTracks->Fill(3.,header->GetTPConlyRefMultiplicity());
\r
439 fHistRefTracks->Fill(4.,header->GetNumberOfITSClusters(0));
\r
440 fHistRefTracks->Fill(5.,header->GetNumberOfITSClusters(1));
\r
441 fHistRefTracks->Fill(6.,header->GetNumberOfITSClusters(2));
\r
442 fHistRefTracks->Fill(7.,header->GetNumberOfITSClusters(3));
\r
443 fHistRefTracks->Fill(8.,header->GetNumberOfITSClusters(4));
\r
448 const AliVVertex *vertex = event->GetPrimaryVertex();
\r
451 Double32_t fCov[6];
\r
452 vertex->GetCovarianceMatrix(fCov);
\r
453 if(vertex->GetNContributors() > 0) {
\r
455 fHistEventStats->Fill(3); //events with a proper vertex
\r
456 if(TMath::Abs(vertex->GetX()) < fVxMax) {
\r
457 if(TMath::Abs(vertex->GetY()) < fVyMax) {
\r
458 if(TMath::Abs(vertex->GetZ()) < fVzMax) {
\r
459 fHistEventStats->Fill(4); //analyzed events
\r
460 fHistVx->Fill(vertex->GetX());
\r
461 fHistVy->Fill(vertex->GetY());
\r
462 fHistVz->Fill(vertex->GetZ());
\r
464 // take only events inside centrality class
\r
465 if((fCentrality > fCentralityPercentileMin) && (fCentrality < fCentralityPercentileMax)){
\r
466 return fCentrality;
\r
467 }//centrality class
\r
471 }//proper vertex resolution
\r
472 }//proper number of contributors
\r
473 }//vertex object valid
\r
474 }//triggered event
\r
476 // in all other cases return -1 (event not accepted)
\r
480 //________________________________________________________________________
\r
481 TObjArray* AliAnalysisTaskTriggeredBF::GetAcceptedTracks(AliVEvent *event){
\r
482 // Returns TObjArray with tracks after all track cuts (only for AOD!)
\r
483 // Fills QA histograms
\r
485 //output TObjArray holding all good tracks
\r
486 TObjArray* tracksAccepted = new TObjArray;
\r
487 tracksAccepted->SetOwner(kTRUE);
\r
494 // Loop over tracks in event
\r
495 for (Int_t iTracks = 0; iTracks < event->GetNumberOfTracks(); iTracks++) {
\r
496 AliAODTrack* aodTrack = dynamic_cast<AliAODTrack *>(event->GetTrack(iTracks));
\r
498 AliError(Form("Could not receive track %d", iTracks));
\r
504 // For ESD Filter Information: ANALYSIS/macros/AddTaskESDfilter.C
\r
505 // take only TPC only tracks
\r
506 fHistTrackStats->Fill(aodTrack->GetFilterMap());
\r
507 if(!aodTrack->TestFilterBit(nAODtrackCutBit)) continue;
\r
509 v_charge = aodTrack->Charge();
\r
510 v_eta = aodTrack->Eta();
\r
511 v_phi = aodTrack->Phi() * TMath::RadToDeg();
\r
512 v_pt = aodTrack->Pt();
\r
514 Float_t DCAxy = aodTrack->DCA(); // this is the DCA from global track (not exactly what is cut on)
\r
515 Float_t DCAz = aodTrack->ZAtDCA(); // this is the DCA from global track (not exactly what is cut on)
\r
518 // Kinematics cuts from ESD track cuts
\r
519 if( v_pt < fPtMin || v_pt > fPtMax) continue;
\r
520 if( v_eta < fEtaMin || v_eta > fEtaMax) continue;
\r
522 // Extra DCA cuts (for systematic studies [!= -1])
\r
523 if( fDCAxyCut != -1 && fDCAzCut != -1){
\r
524 if(TMath::Sqrt((DCAxy*DCAxy)/(fDCAxyCut*fDCAxyCut)+(DCAz*DCAz)/(fDCAzCut*fDCAzCut)) > 1 ){
\r
525 continue; // 2D cut
\r
529 // Extra TPC cuts (for systematic studies [!= -1])
\r
530 if( fTPCchi2Cut != -1 && aodTrack->Chi2perNDF() > fTPCchi2Cut){
\r
533 if( fNClustersTPCCut != -1 && aodTrack->GetTPCNcls() < fNClustersTPCCut){
\r
537 // fill QA histograms
\r
538 fHistClus->Fill(aodTrack->GetITSNcls(),aodTrack->GetTPCNcls());
\r
539 fHistDCA->Fill(DCAz,DCAxy);
\r
540 fHistChi2->Fill(aodTrack->Chi2perNDF());
\r
541 fHistPt->Fill(v_pt);
\r
542 fHistEta->Fill(v_eta);
\r
543 fHistPhi->Fill(v_phi);
\r
545 // add the track to the TObjArray
\r
546 tracksAccepted->Add(new AliBFBasicParticle(v_eta, v_phi, v_pt, v_charge));
\r
549 return tracksAccepted;
\r
552 //________________________________________________________________________
\r
553 TObjArray* AliAnalysisTaskTriggeredBF::GetShuffledTracks(TObjArray *tracks){
\r
554 // Clones TObjArray and returns it with tracks after shuffling the charges
\r
556 TObjArray* tracksShuffled = new TObjArray;
\r
557 tracksShuffled->SetOwner(kTRUE);
\r
559 vector<Short_t> *chargeVector = new vector<Short_t>; //original charge of accepted tracks
\r
561 for (Int_t i=0; i<tracks->GetEntriesFast(); i++)
\r
563 AliVParticle* track = (AliVParticle*) tracks->At(i);
\r
564 chargeVector->push_back(track->Charge());
\r
567 random_shuffle(chargeVector->begin(), chargeVector->end());
\r
569 for(Int_t i = 0; i < tracks->GetEntriesFast(); i++){
\r
570 AliVParticle* track = (AliVParticle*) tracks->At(i);
\r
571 tracksShuffled->Add(new AliBFBasicParticle(track->Eta(), track->Phi(), track->Pt(),chargeVector->at(i)));
\r
574 delete chargeVector;
\r
576 return tracksShuffled;
\r
579 //________________________________________________________________________
\r
580 void AliAnalysisTaskTriggeredBF::FinishTaskOutput(){
\r
583 AliError("fBalance not available");
\r
586 if(fRunShuffling) {
\r
587 if (!fShuffledBalance) {
\r
588 AliError("fShuffledBalance not available");
\r
595 //________________________________________________________________________
\r
596 void AliAnalysisTaskTriggeredBF::Terminate(Option_t *) {
\r
597 // Called once at the end of the query
\r
599 // not implemented ...
\r
603 void AliAnalysisTaskTriggeredBF::UserExecMix(Option_t *)
\r
606 // not yet done for event mixing!
\r