7 #include "TObjString.h"
15 #include "THnSparse.h"
17 #include "TProfile2D.h"
21 #include "TObjectTable.h"
24 //#include "TStopwatch.h"
26 #include "AliAnalysisTask.h"
27 #include "AliAnalysisManager.h"
30 #include "AliESDEvent.h"
31 #include "AliESDInputHandler.h"
32 #include "AliESDtrackCuts.h"
34 #include "AliAODEvent.h"
35 #include "AliAODInputHandler.h"
36 #include "AliAODMCParticle.h"
37 //#include "AliAnalysisUtils.h"
38 #include "AliHelperPID.h"
39 #include "AliEventPoolManager.h"
41 #include "AliAnalysisTaskFemtoESE.h"
43 //#include "AliSpectraAODEventCuts.h"
44 //#include "AliSpectraAODTrackCuts.h"
45 //#include "/opt/alice/aliroot/master/src/PWGLF/SPECTRA/PiKaPr/TestAOD/AliSpectraAODEventCuts.h"
46 //#include "/opt/alice/aliroot/master/src/PWGLF/SPECTRA/PiKaPr/TestAOD/AliSpectraAODTrackCuts.h"
47 //#include "AliSpectraAODEventCuts.h"
48 //#include "AliSpectraAODTrackCuts.h"
50 ClassImp(AliAnalysisTaskFemtoESE)
53 //________________________________________________________________________
54 // Default constructor
55 AliAnalysisTaskFemtoESE::AliAnalysisTaskFemtoESE() :
64 fSelectBit(AliVEvent::kMB),
110 hphistaretapair10(0x0),
111 hphistaretapair16(0x0),
112 hphistaretapair10a(0x0),
113 hphistaretapair16a(0x0),
114 hphistaretapair10b(0x0),
115 hphistaretapair16b(0x0),
148 //________________________________________________________________________
150 AliAnalysisTaskFemtoESE::AliAnalysisTaskFemtoESE(const char* name) :
151 AliAnalysisTaskSE(name),
159 fSelectBit(AliVEvent::kMB),
162 fMixingTracks(10000),
167 fShareFraction(0.05),
205 hphistaretapair10(0x0),
206 hphistaretapair16(0x0),
207 hphistaretapair10a(0x0),
208 hphistaretapair16a(0x0),
209 hphistaretapair10b(0x0),
210 hphistaretapair16b(0x0),
242 Printf("*******************************************");
243 Printf("AliAnalysisTaskFemtoESE named %s",name);
244 Printf("*******************************************");
247 //SetEPBins(12,-TMath::Pi()/12.,2*TMath::Pi()-TMath::Pi()/12.);
248 SetEPBins(12,0,2*TMath::Pi());
249 Double_t ktBinsTemp[5] = {0.2,0.3,0.4,0.5,0.7};
250 SetKtBins(4,ktBinsTemp);
251 Double_t centBinsTemp[7] = {0,5,10,20,30,40,50};
252 SetCentBins(6,centBinsTemp);
253 Double_t vzBinsTemp[9] = {-8,-6,-4,-2,0,2,4,6,8};
254 SetVzBins(8,vzBinsTemp);
256 vertex[0] = vertex[1] = vertex[2] = 0.;
258 DefineInput(0, TChain::Class());
259 DefineOutput(1, TList::Class());
260 DefineOutput(2, AliHelperPID::Class());
261 DefineOutput(3, AliSpectraAODEventCuts::Class());
262 DefineOutput(4, AliSpectraAODTrackCuts::Class());
266 //________________________________________________________________________
268 AliAnalysisTaskFemtoESE::~AliAnalysisTaskFemtoESE()
272 //________________________________________________________________________
274 AliAnalysisTaskFemtoESE::AliAnalysisTaskFemtoESE(const AliAnalysisTaskFemtoESE &/*obj*/) :
283 fSelectBit(AliVEvent::kMB),
286 fMixingTracks(10000),
291 fShareFraction(0.05),
329 hphistaretapair10(0x0),
330 hphistaretapair16(0x0),
331 hphistaretapair10a(0x0),
332 hphistaretapair16a(0x0),
333 hphistaretapair10b(0x0),
334 hphistaretapair16b(0x0),
367 //________________________________________________________________________
368 // assignment operator
369 AliAnalysisTaskFemtoESE& AliAnalysisTaskFemtoESE::operator=(const AliAnalysisTaskFemtoESE &/*obj*/)
375 //________________________________________________________________________
376 void AliAnalysisTaskFemtoESE::UserCreateOutputObjects()
380 if (!fTrackCuts) AliFatal("Track Cuts should be set in the steering macro");
381 if (!fEventCuts) AliFatal("Event Cuts should be set in the steering macro");
382 if (!fHelperPID) AliFatal("HelperPID should be set in the steering macro");
384 fOutputList = new TList();
385 fOutputList->SetOwner();
386 fOutputList->SetName("fOutputList");
388 hpx = new TH1D("hpx","px",200,-2,2);
389 hpx->GetXaxis()->SetTitle("p_{x}");
390 fOutputList->Add(hpx);
391 hpy = new TH1D("hpy","py",200,-2,2);
392 hpy->GetXaxis()->SetTitle("p_{y}");
393 fOutputList->Add(hpy);
394 hpz = new TH1D("hpz","pz",200,-2,2);
395 hpz->GetXaxis()->SetTitle("p_{z}");
396 fOutputList->Add(hpz);
397 hpt = new TH1D("hpt","pt",100,0,2);
398 hpt->GetXaxis()->SetTitle("p_{t}");
399 fOutputList->Add(hpt);
400 hE = new TH1D("hE","E",100,0,2);
401 hE->GetXaxis()->SetTitle("E");
402 fOutputList->Add(hE);
403 hphieta = new TH2D("hphieta","track #varphi vs #eta",100,0,2*TMath::Pi(),80,-0.8,0.8);
404 hphieta->GetXaxis()->SetTitle("#varphi");
405 hphieta->GetYaxis()->SetTitle("#eta");
406 fOutputList->Add(hphieta);
407 hphieta_pid = new TH2D("hphieta_pid","PID check -- #Delta#varphi vs #Delta#eta",100,-0.3,0.3,100,-0.3,0.3);
408 hphieta_pid->GetXaxis()->SetTitle("#Delta#varphi");
409 hphieta_pid->GetYaxis()->SetTitle("#Delta#eta");
410 fOutputList->Add(hphieta_pid);
411 hpt_pid = new TH1D("hpt_pid","PID check -- #Delta p_{t}",100,-0.5,0.5);
412 hpt_pid->GetXaxis()->SetTitle("#Delta p_{t}");
413 fOutputList->Add(hpt_pid);
414 hvzcent = new TH2D("hvzcent","vz vs cent",nVzBins,vzBins,nCentBins,centBins);
415 hvzcent->GetXaxis()->SetTitle("v_{z}");
416 hvzcent->GetYaxis()->SetTitle("centrality");
417 fOutputList->Add(hvzcent);
418 hcent = new TH1D("hcent","cent",200,0,50);
419 hcent->GetXaxis()->SetTitle("centrality");
420 fOutputList->Add(hcent);
421 hcentn = new TH2D("hcentn","cent vs npions",50,0,50,100,0,2000);
422 hcentn->GetXaxis()->SetTitle("Centrality");
423 hcentn->GetYaxis()->SetTitle("Number of pions");
424 fOutputList->Add(hcentn);
425 hphistaretapair10 = new TH3D("hphistaretapair10","pair #Delta#varphi* vs #Delta#eta at r=1.0m",100,-0.15,0.15,100,-0.1,0.1,10,0,1);
426 hphistaretapair10->GetXaxis()->SetTitle("#Delta#varphi*");
427 hphistaretapair10->GetYaxis()->SetTitle("#Delta#eta");
428 hphistaretapair10->GetZaxis()->SetTitle("k_{T}");
429 fOutputList->Add(hphistaretapair10);
430 hphistaretapair16 = new TH3D("hphistaretapair16","pair #Delta#varphi* vs #Delta#eta at r=1.6m",100,-0.15,0.15,100,-0.1,0.1,10,0,1);
431 hphistaretapair16->GetXaxis()->SetTitle("#Delta#varphi*");
432 hphistaretapair16->GetYaxis()->SetTitle("#Delta#eta");
433 hphistaretapair16->GetZaxis()->SetTitle("k_{T}");
434 fOutputList->Add(hphistaretapair16);
435 hphistaretapair10a = new TH3D("hphistaretapair10a","pair #Delta#varphi* vs #Delta#eta at r=1.0m",100,-0.15,0.15,100,-0.1,0.1,10,0,1);
436 hphistaretapair10a->GetXaxis()->SetTitle("#Delta#varphi*");
437 hphistaretapair10a->GetYaxis()->SetTitle("#Delta#eta");
438 hphistaretapair10a->GetZaxis()->SetTitle("k_{T}");
439 fOutputList->Add(hphistaretapair10a);
440 hphistaretapair16a = new TH3D("hphistaretapair16a","pair #Delta#varphi* vs #Delta#eta at r=1.6m",100,-0.15,0.15,100,-0.1,0.1,10,0,1);
441 hphistaretapair16a->GetXaxis()->SetTitle("#Delta#varphi*");
442 hphistaretapair16a->GetYaxis()->SetTitle("#Delta#eta");
443 hphistaretapair16a->GetZaxis()->SetTitle("k_{T}");
444 fOutputList->Add(hphistaretapair16a);
445 hphistaretapair10b = new TH3D("hphistaretapair10b","pair #Delta#varphi* vs #Delta#eta at r=1.0m",100,-TMath::Pi(),TMath::Pi(),100,-1.6,1.6,10,0,1);
446 hphistaretapair10b->GetXaxis()->SetTitle("#Delta#varphi*");
447 hphistaretapair10b->GetYaxis()->SetTitle("#Delta#eta");
448 hphistaretapair10b->GetZaxis()->SetTitle("k_{T}");
449 fOutputList->Add(hphistaretapair10b);
450 hphistaretapair16b = new TH3D("hphistaretapair16b","pair #Delta#varphi* vs #Delta#eta at r=1.6m",100,-TMath::Pi(),TMath::Pi(),100,-1.6,1.6,10,0,1);
451 hphistaretapair16b->GetXaxis()->SetTitle("#Delta#varphi*");
452 hphistaretapair16b->GetYaxis()->SetTitle("#Delta#eta");
453 hphistaretapair16b->GetZaxis()->SetTitle("k_{T}");
454 fOutputList->Add(hphistaretapair16b);
455 hphietapair = new TH3D("hphietapair","pair #Delta#varphi vs #Delta#eta",100,-0.1,0.1,100,-0.1,0.1,10,0,1);
456 hphietapair->GetXaxis()->SetTitle("#Delta#varphi");
457 hphietapair->GetYaxis()->SetTitle("#Delta#eta");
458 hphietapair->GetZaxis()->SetTitle("k_{T}");
459 fOutputList->Add(hphietapair);
460 hphietapair2 = new TH3D("hphietapair2","pair #varphi vs #eta",100,-TMath::Pi(),TMath::Pi(),100,-1.6,1.6,10,0,1);
461 hphietapair2->GetXaxis()->SetTitle("#Delta#varphi");
462 hphietapair2->GetYaxis()->SetTitle("#eta");
463 hphietapair2->GetZaxis()->SetTitle("k_{T}");
464 fOutputList->Add(hphietapair2);
465 hpidid = new TH1D("hpidid","pid id",9,-4.5,4.5);
466 hpidid->GetXaxis()->SetTitle("track PID ID");
467 fOutputList->Add(hpidid);
468 hkt = new TH1D("hkt","k_{T}",100,0,2);
469 hkt->GetXaxis()->SetTitle("k_{T}");
470 fOutputList->Add(hkt);
471 hktcheck = new TH1D("hktcheck","k_{T} check",50,0,1);
472 hktcheck->GetXaxis()->SetTitle("k_{T}");
473 fOutputList->Add(hktcheck);
474 hkt3 = new TH3D("hkt3","kt vs pt",50,0,1,50,0,5,50,0,5);
475 hkt3->GetXaxis()->SetTitle("k_{T}");
476 hkt3->GetYaxis()->SetTitle("p_{T,1}");
477 hkt3->GetZaxis()->SetTitle("p_{T,2}");
478 fOutputList->Add(hkt3);
479 hdcaxy = new TH2D("hdcaxy","DCA xy",100,-5,5,100,-5,5);
480 hdcaxy->GetXaxis()->SetTitle("DCA x");
481 hdcaxy->GetYaxis()->SetTitle("DCA y");
482 fOutputList->Add(hdcaxy);
483 hdcaz = new TH1D("hdcaz","DCA z",100,-5,5);
484 hdcaz->GetXaxis()->SetTitle("DCA z");
485 fOutputList->Add(hdcaz);
486 hsharequal = new TH1D("hsharequal","Share Quality",102,-1.02,1.02);
487 hsharequal->GetXaxis()->SetTitle("Share Quality");
488 fOutputList->Add(hsharequal);
489 hsharefrac = new TH1D("hsharefrac","Share Fraction",100,0,1);
490 hsharefrac->GetXaxis()->SetTitle("Share Fraction");
491 fOutputList->Add(hsharefrac);
492 hsharequalmix = new TH1D("hsharequalmix","Share Quality -- mixed events",102,-1.02,1.02);
493 hsharequalmix->GetXaxis()->SetTitle("Share Quality");
494 fOutputList->Add(hsharequalmix);
495 hsharefracmix = new TH1D("hsharefracmix","Share Fraction -- mixed events",100,0,1);
496 hsharefracmix->GetXaxis()->SetTitle("Share Fraction");
497 fOutputList->Add(hsharefracmix);
498 hPsiTPC = new TH1D("hPsiTPC","TPC EP",100,-1*TMath::Pi(),TMath::Pi());
499 hPsiTPC->GetXaxis()->SetTitle("#Psi{TPC}");
500 fOutputList->Add(hPsiTPC);
501 hPsiV0A = new TH1D("hPsiV0A","V0A EP",100,-1*TMath::Pi(),TMath::Pi());
502 hPsiV0A->GetXaxis()->SetTitle("#Psi{V0A}");
503 fOutputList->Add(hPsiV0A);
504 hPsiV0C = new TH1D("hPsiV0C","V0C EP",100,-1*TMath::Pi(),TMath::Pi());
505 hPsiV0C->GetXaxis()->SetTitle("#Psi{V0C}");
506 fOutputList->Add(hPsiV0C);
507 hCheckEPA = new TH1D("hCheckEPA","Check EP V0A",100,-1*TMath::Pi(),TMath::Pi());
508 hCheckEPA->GetXaxis()->SetTitle("PsiV0A - PsiTPC");
509 fOutputList->Add(hCheckEPA);
510 hCheckEPC = new TH1D("hCheckEPC","Check EP V0C",100,-1*TMath::Pi(),TMath::Pi());
511 hCheckEPC->GetXaxis()->SetTitle("PsiV0C - PsiTPC");
512 fOutputList->Add(hCheckEPC);
513 hCheckEPmix = new TH2D("hCheckEPmix","Check EP mixed events",100,-1*TMath::Pi(),TMath::Pi(),100,-1*TMath::Pi(),TMath::Pi());
514 hCheckEPmix->GetXaxis()->SetTitle("Psi1 - Psi_mix");
515 hCheckEPmix->GetYaxis()->SetTitle("Psi1 - Psi2");
516 fOutputList->Add(hCheckEPmix);
517 hcentq = new TH2D("hcentq","qvec vs cent",100,0,100,50,0,50);
518 hcentq->GetXaxis()->SetTitle("q_{2} percentile");
519 hcentq->GetYaxis()->SetTitle("centrality");
520 fOutputList->Add(hcentq);
521 hMixedDist = new TH2D("hMixedDist", ";centrality;tracks;events", 50, 0, 50, 200, 0, fMixingTracks * 1.5);
522 fOutputList->Add(hMixedDist);
523 hQvecV0A = new TH2D("hQvecV0A","Qvector in V0A",50,0,50,200,0,5);
524 hQvecV0A->GetXaxis()->SetTitle("Centrality");
525 hQvecV0A->GetYaxis()->SetTitle("normalized Qvector");
526 fOutputList->Add(hQvecV0A);
527 hQvecV0C = new TH2D("hQvecV0C","Qvector in V0C",50,0,50,200,0,5);
528 hQvecV0C->GetXaxis()->SetTitle("Centrality");
529 hQvecV0C->GetYaxis()->SetTitle("normalized Qvector");
530 fOutputList->Add(hQvecV0C);
532 // resolution histograms
533 hresV0ATPC = new TH1D("hresV0ATPC","cent vs cos(2*(V0A-TPC))",nCentBins,centBins);
534 hresV0ATPC->GetXaxis()->SetTitle("centrality");
535 fOutputList->Add(hresV0ATPC);
536 hresV0CTPC = new TH1D("hresV0CTPC","cent vs cos(2*(V0C-TPC))",nCentBins,centBins);
537 hresV0CTPC->GetXaxis()->SetTitle("centrality");
538 fOutputList->Add(hresV0CTPC);
539 hresV0AV0C = new TH1D("hresV0AV0C","cent vs cos(2*(V0A-V0C))",nCentBins,centBins);
540 hresV0AV0C->GetXaxis()->SetTitle("centrality");
541 fOutputList->Add(hresV0AV0C);
543 hqinvcheck = new TH3F("hqinvcheck","Qinv vs kt vs cent",100,0,1,50,0,1,10,0,50);
544 hqinvcheck->GetXaxis()->SetTitle("qinv");
545 hqinvcheck->GetYaxis()->SetTitle("kt");
546 hqinvcheck->GetZaxis()->SetTitle("centrality");
547 fOutputList->Add(hqinvcheck);
549 hq = new TH3F***[nKtBins];
550 hqmix = new TH3F***[nKtBins];
551 hqinv = new TH3F***[nKtBins];
552 for(Int_t k = 0; k < nKtBins; k++)
554 hq[k] = new TH3F**[nEPBins];
555 hqmix[k] = new TH3F**[nEPBins];
556 hqinv[k] = new TH3F**[nEPBins];
557 for(Int_t e = 0; e < nEPBins; e++)
559 hq[k][e] = new TH3F*[nCentBins];
560 hqmix[k][e] = new TH3F*[nCentBins];
561 hqinv[k][e] = new TH3F*[nCentBins];
562 for(Int_t c = 0; c < nCentBins; c++)
564 hq[k][e][c] = new TH3F(Form("hq_%i_%i_%i",k,e,c),Form("hq_%i_%i_%i",k,e,c),20,-0.2,0.2,20,-0.2,0.2,20,-0.2,0.2);
565 fOutputList->Add(hq[k][e][c]);
566 hqmix[k][e][c] = new TH3F(Form("hqmix_%i_%i_%i",k,e,c),Form("hqmix_%i_%i_%i",k,e,c),20,-0.2,0.2,20,-0.2,0.2,20,-0.2,0.2);
567 fOutputList->Add(hqmix[k][e][c]);
568 hqinv[k][e][c] = new TH3F(Form("hqinv_%i_%i_%i",k,e,c),Form("hqinv_%i_%i_%i",k,e,c),20,-0.2,0.2,20,-0.2,0.2,20,-0.2,0.2);
569 fOutputList->Add(hqinv[k][e][c]);
574 // create dummy histograms which just hold the values of the kt, cent, ep bin edges
575 hktbins = new TH1F("hktbins","kt bins",nKtBins,ktBins);
576 fOutputList->Add(hktbins);
577 hcentbins = new TH1F("hcentbins","cent bins",nCentBins,centBins);
578 fOutputList->Add(hcentbins);
579 hepbins = new TH1F("hepbins","ep bins",nEPBins,epBins);
580 fOutputList->Add(hepbins);
582 Printf("************************");
583 Printf("using the %s detector for event plane determination",fEPDet ? "V0C" : "V0A");
584 Printf("using the %s detector for q-vector determination",fQPercDet ? "V0C" : "V0A");
585 Printf("************************");
587 vertex[0] = vertex[1] = vertex[2] = 0.;
590 fPoolMgr = new AliEventPoolManager*[2];
591 Int_t poolsize = 1000;
592 fPoolMgr[0] = new AliEventPoolManager(poolsize, fMixingTracks, nCentBins, centBins, nVzBins, vzBins);
593 fPoolMgr[0]->SetTargetValues(fMixingTracks, 0.1, 5); // check these values
594 fPoolMgr[1] = new AliEventPoolManager(poolsize, fMixingTracks, nCentBins, centBins, nVzBins, vzBins);
595 fPoolMgr[1]->SetTargetValues(fMixingTracks, 0.1, 5); // check these values
598 nCountMixedPairs = 0;
601 //stopwatch = new TStopwatch();
602 //stopwatch->Start();
604 PostData(1, fOutputList);
605 PostData(2, fHelperPID);
606 PostData(3, fEventCuts);
607 PostData(4, fTrackCuts);
611 //________________________________________________________________________
612 void AliAnalysisTaskFemtoESE::UserExec(Option_t *)
615 // Called for each event
617 //if(!fAODcase) {cout<<"ESDs not supported"<<endl; return;}
619 fAOD = dynamic_cast<AliAODEvent*> (InputEvent());
620 if (!fAOD) {Printf("ERROR: fAOD not available"); return;}
622 //if(!EventCut(fAOD)) return;
623 if(!EventCut()) return;
626 if(fEventCounter%1000==0) Printf("=========== Event # %i ===========",fEventCounter);
628 AliCentrality *centrality;// for AODs and ESDs
629 const AliAODVertex *primaryVertexAOD;
631 //AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
632 //AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
633 //fPIDResponse = inputHandler->GetPIDResponse();
635 fBfield = fAOD->GetMagneticField();
637 /////////////////////////////////////////////////
639 Float_t centralityPercentile=0;
641 centrality = fAOD->GetCentrality();
642 centralityPercentile = centrality->GetCentralityPercentile("V0M");
643 if(centralityPercentile <= centBins[0]) return;
644 if(centralityPercentile > centBins[nCentBins]) return;
646 primaryVertexAOD = fAOD->GetPrimaryVertex();
647 vertex[0]=primaryVertexAOD->GetX(); vertex[1]=primaryVertexAOD->GetY(); vertex[2]=primaryVertexAOD->GetZ();
648 Double_t zvtx = vertex[2];
649 if(zvtx < vzBins[0] || zvtx > vzBins[nVzBins]) return; // Z-Vertex Cut
650 //cout<<"Centrality % = " << centralityPercentile << " z-vertex = " << zvtx << endl;
652 //ProcInfo_t procInfo;
653 //gSystem->GetProcInfo(&procInfo);
654 //Printf("ResMem %ld VMem %ld", procInfo.fMemResident, procInfo.fMemVirtual);
656 //Printf("%lf %lf",stopwatch->RealTime(),stopwatch->CpuTime());
657 //stopwatch->Start();
659 // get event plane from V0's
660 if(!fEventCuts->IsSelected(fAOD,fTrackCuts)) {Printf("Error! Event not accepted by AliAODSpectraEventCuts!"); return;}
661 Double_t psiV0A = fEventCuts->GetPsiV0A();
662 Double_t psiV0C = fEventCuts->GetPsiV0C();
663 Double_t qperc = -999;
664 if(bIsLHC10h) qperc = fEventCuts->GetQvecPercentile(fQPercDet);//0: VZERO-A 1: VZERO-C
667 if(fQPercDet == 0) qperc = GetQPercLHC11h(fEventCuts->GetqV0A());
668 if(fQPercDet == 1) qperc = GetQPercLHC11h(fEventCuts->GetqV0C());
669 //Printf("q vector = %lf percentile = %lf",fEventCuts->GetqV0A(),qperc);
670 hQvecV0A->Fill(centralityPercentile,fEventCuts->GetqV0A());
671 hQvecV0C->Fill(centralityPercentile,fEventCuts->GetqV0C());
673 if(psiV0A == -999) return;
674 if(psiV0C == -999) return;
675 if(qperc < fMinQPerc || qperc > fMaxQPerc) return;
677 Double_t psiEP = psiV0A;
678 if(fEPDet==1) psiEP = psiV0C;
680 Double_t sin2phi = 0, cos2phi = 0;
682 TObjArray* tracksPos = new TObjArray();
683 tracksPos->SetOwner(kTRUE);
684 TObjArray* tracksNeg = new TObjArray();
685 tracksNeg->SetOwner(kTRUE);
687 // Track loop -- select pions
688 for (Int_t i = 0; i < fAOD->GetNumberOfTracks(); i++) {
689 AliAODTrack* aodtrack = dynamic_cast<AliAODTrack*>(fAOD->GetTrack(i));
690 if (!aodtrack) continue;
691 if(!TrackCut(aodtrack)) continue;
693 // filter bit 7 PID method...
695 for(Int_t m = 0; m < fAOD->GetNumberOfTracks(); m++) {
696 AliAODTrack* aodtrack2 = dynamic_cast<AliAODTrack*>(fAOD->GetTrack(m));
697 if (!aodtrack2) continue;
698 if(aodtrack->GetID() != (-aodtrack2->GetID() - 1)) continue;// (-aodTrack2->GetID() - 1)
699 trackPID=fHelperPID->GetParticleSpecies((AliVTrack*)aodtrack2,kTRUE);
700 hphieta_pid->Fill(aodtrack->Phi()-aodtrack2->Phi(),aodtrack->Eta()-aodtrack2->Eta());
701 hpt_pid->Fill(aodtrack->Pt()-aodtrack2->Pt());
702 //cout << aodtrack->Phi() << " " << aodtrack->Eta() << " " << aodtrack->Pt() << endl;
703 //cout << aodtrack2->Phi() << " " << aodtrack2->Eta() << " " << aodtrack2->Pt() << " " << dataID2 << endl;
706 hpidid->Fill((trackPID+1)*aodtrack->Charge());
711 AliFemtoESEBasicParticle* particle = new AliFemtoESEBasicParticle(sqrt(pow(aodtrack->P(),2)+pow(0.13957, 2)),aodtrack->Px(),aodtrack->Py(),aodtrack->Pz(),aodtrack->Charge(),aodtrack->Phi(),aodtrack->Eta());
712 particle->SetPsiEP(psiEP);
713 particle->SetTPCClusterMap(aodtrack->GetTPCClusterMap());
714 particle->SetTPCSharedMap(aodtrack->GetTPCSharedMap());
716 if(particle->Charge()>0)
717 tracksPos->Add(particle);
718 if(particle->Charge()<0)
719 tracksNeg->Add(particle);
722 hpx->Fill(particle->Px());
723 hpy->Fill(particle->Py());
724 hpz->Fill(particle->Pz());
725 hpt->Fill(particle->Pt());
726 hE->Fill(particle->E());
727 hphieta->Fill(particle->Phi(),particle->Eta());
729 // check event plane angle using tracks in the TPC
730 if(aodtrack->Pt() < 2 && aodtrack->Pt() > 0.2)
732 sin2phi += (aodtrack->Pt())*sin(2*aodtrack->Phi());
733 cos2phi += (aodtrack->Pt())*cos(2*aodtrack->Phi());
739 Int_t ntracks = tracksPos->GetEntriesFast()+tracksNeg->GetEntriesFast();
741 // get EP from TPC, just to check
742 Double_t psiTPC = 0.;
744 psiTPC = 0.5*atan2(sin2phi,cos2phi);
747 hPsiTPC->Fill(psiTPC);
748 hPsiV0A->Fill(psiV0A);
749 hPsiV0C->Fill(psiV0C);
750 Double_t dphiEP = psiTPC-psiV0A;
751 if(dphiEP>TMath::Pi()) dphiEP-=2*TMath::Pi();
752 if(dphiEP<-TMath::Pi()) dphiEP+=2*TMath::Pi();
753 hCheckEPA->Fill(dphiEP);
754 dphiEP = psiTPC-psiV0C;
755 if(dphiEP>TMath::Pi()) dphiEP-=2*TMath::Pi();
756 if(dphiEP<-TMath::Pi()) dphiEP+=2*TMath::Pi();
757 hCheckEPC->Fill(dphiEP);
760 hcentq->Fill(qperc,centralityPercentile);
762 nCountTracks += ntracks;
763 //cout << "Found " << ntracks << " pion tracks..." << endl;
765 hvzcent->Fill(zvtx,centralityPercentile);
766 hcent->Fill(centralityPercentile);
767 hcentn->Fill(centralityPercentile,ntracks);
769 // resolution histograms
770 hresV0ATPC->Fill(centralityPercentile,cos(2*(psiV0A-psiTPC)));
771 hresV0CTPC->Fill(centralityPercentile,cos(2*(psiV0C-psiTPC)));
772 hresV0AV0C->Fill(centralityPercentile,cos(2*(psiV0A-psiV0C)));
774 AliEventPool* poolPos = fPoolMgr[0]->GetEventPool(centralityPercentile,zvtx);
775 if (!poolPos) AliFatal(Form("No pool found for centrality = %f, vz = %f", centralityPercentile, zvtx));
776 AliEventPool* poolNeg = fPoolMgr[1]->GetEventPool(centralityPercentile,zvtx);
777 if (!poolNeg) AliFatal(Form("No pool found for centrality = %f, vz = %f", centralityPercentile, zvtx));
778 //if (!pool) AliFatal(Form("No pool found for centrality = %f, zVtx = %f, Psi_EP = %f", centralityPercentile, zvtx, psiEP));
779 //if(pool->IsReady()) hMixedDist->Fill(centralityPercentile, pool->NTracksInPool());
781 TrackLoop(tracksPos,poolPos,psiEP,centralityPercentile);
782 TrackLoop(tracksNeg,poolNeg,psiEP,centralityPercentile);
783 //TObjArray* clonedtracks = CloneAndReduceTrackList(tracks,psiEP);
784 poolPos->UpdatePool(tracksPos);
785 poolNeg->UpdatePool(tracksNeg);
786 //cout << "pool contains " << pool->GetCurrentNEvents() << " events and " << pool->NTracksInPool() << " tracks." << endl;
792 PostData(1, fOutputList);
793 PostData(2, fHelperPID);
794 PostData(3, fEventCuts);
795 PostData(4, fTrackCuts);
799 void AliAnalysisTaskFemtoESE::TrackLoop(TObjArray *tracks, AliEventPool *pool, Double_t psiEP, Float_t centralityPercentile)
802 Double_t qout=0, qside=0, qlong=0;
803 Double_t pVect1[4] = {0,0,0,0};
804 Double_t pVect2[4] = {0,0,0,0};
805 Int_t k, e, c; //bin indices for histograms
807 Int_t ntracks = tracks->GetEntriesFast();
809 for(Int_t j = 0; j < ntracks; j++)
811 //cout << endl << j << " ";
812 AliFemtoESEBasicParticle* track1 = (AliFemtoESEBasicParticle*)tracks->At(j);
813 pVect1[0]=track1->E();
814 pVect1[1]=track1->Px();
815 pVect1[2]=track1->Py();
816 pVect1[3]=track1->Pz();
817 //cout << pVect1[0] << " " << pVect1[1] << " " << pVect1[2] << " " << pVect1[3] << endl;
820 for(Int_t i = j+1; i < ntracks; i++)
822 AliFemtoESEBasicParticle* track2 = (AliFemtoESEBasicParticle*)tracks->At(i);
824 Double_t deltaphistar10 = DeltaPhiStar(track1,track2,1.0);
825 Double_t deltaphistar16 = DeltaPhiStar(track1,track2,1.6);
827 hphistaretapair10->Fill(deltaphistar10,track1->Eta()-track2->Eta(),kt);
828 hphistaretapair16->Fill(deltaphistar16,track1->Eta()-track2->Eta(),kt);
830 if(!PairCut(track1,track2,kFALSE)) continue;
832 hphistaretapair10a->Fill(deltaphistar10,track1->Eta()-track2->Eta(),kt);
833 hphistaretapair16a->Fill(deltaphistar16,track1->Eta()-track2->Eta(),kt);
834 hphistaretapair10b->Fill(deltaphistar10,track1->Eta()-track2->Eta(),kt);
835 hphistaretapair16b->Fill(deltaphistar16,track1->Eta()-track2->Eta(),kt);
837 pVect2[0]=track2->E();
838 pVect2[1]=track2->Px();
839 pVect2[2]=track2->Py();
840 pVect2[3]=track2->Pz();
842 //qinv = GetQinv(pVect1, pVect2); // = qinv**2 = (P1x-P2x)**2 + (P1y-P2y)**2 + (P1z-P2z)**2 - (P1t-P2t)**2
843 GetQosl(pVect1, pVect2, qout, qside, qlong); // qout, qside, qlong = components of Q=P1-P2 in the P=P1+P2 frame
844 kt = sqrt(pow(pVect1[1]+pVect2[1],2) + pow(pVect1[2]+pVect2[2],2))/2.; // = Kt = |pT1+pT2|/2
846 hkt3->Fill(kt,track1->Pt(),track2->Pt());
847 Double_t deltaphi = GetDeltaPhiEP(pVect1[1],pVect1[2],pVect2[1],pVect2[2],psiEP); // angle to event plane in correct range
848 if(fabs(qout)<0.2 && fabs(qside)<0.2 && fabs(qlong)<0.2) nCountSamePairs++;
849 if(kt < ktBins[0] || kt > ktBins[nKtBins]) continue;
850 if(!FindBin(kt,deltaphi,centralityPercentile,k,e,c)) continue;
852 hq[k][e][c]->Fill(qout,qside,qlong);
853 hqinv[k][e][c]->Fill(qout,qside,qlong,sqrt(GetQinv2(pVect1, pVect2)));
854 hqinvcheck->Fill(sqrt(GetQinv2(pVect1, pVect2)),kt,centralityPercentile);
855 Double_t dphi = track1->Phi()-track2->Phi();
856 if(dphi<-TMath::Pi()) dphi += 2*TMath::Pi();
857 if(dphi>TMath::Pi()) dphi -= 2*TMath::Pi();
858 hphietapair->Fill(dphi,track1->Eta()-track2->Eta(),kt);
859 hphietapair2->Fill(dphi,track1->Eta()-track2->Eta(),kt);
866 Int_t nMix = pool->GetCurrentNEvents();
869 for (Int_t jMix=0; jMix<nMix; jMix++)
871 TObjArray* bgTracks = pool->GetEvent(jMix);
872 Int_t ntracksmix = bgTracks->GetEntriesFast();
876 AliFemtoESEBasicParticle* tracktest = (AliFemtoESEBasicParticle*)bgTracks->UncheckedAt(0);
877 if(tracktest->Charge() != track1->Charge()){Printf("Charges don't match, there must be a problem..."); continue;}
878 fPsiEPmixtemp = tracktest->GetPsiEP();
879 Double_t dphiEPtest = fPsiEPmixtemp-psiEP;
880 while(dphiEPtest>2*TMath::Pi()) dphiEPtest-=2*TMath::Pi();
881 while(dphiEPtest<0) dphiEPtest+=2*TMath::Pi();
882 if(dphiEPtest>TMath::Pi()) dphiEPtest-=TMath::Pi();
883 if(dphiEPtest>TMath::Pi()/2.) dphiEPtest = TMath::Pi()-dphiEPtest;
884 if(dphiEPtest > TMath::Pi()/6.) continue;
885 countmix += ntracksmix;
887 fPsiEPmix = 0.5*atan2(sin(2*psiEP)+sin(2*fPsiEPmixtemp),cos(2*psiEP)+cos(2*fPsiEPmixtemp));
888 Double_t dphimix = psiEP-fPsiEPmix;
889 if(dphimix < -TMath::Pi()) dphimix += 2*TMath::Pi();
890 if(dphimix > TMath::Pi()) dphimix -= 2*TMath::Pi();
891 Double_t dphi12 = psiEP-fPsiEPmixtemp;
892 if(dphi12 < -TMath::Pi()) dphi12 += 2*TMath::Pi();
893 if(dphi12 > TMath::Pi()) dphi12 -= 2*TMath::Pi();
894 hCheckEPmix->Fill(dphimix,dphi12);
898 //cout << "mixing with " << ntracksmix << " tracks" << endl;
899 for(Int_t i = 0; i < ntracksmix; i++)
901 AliFemtoESEBasicParticle* track2 = (AliFemtoESEBasicParticle*)bgTracks->UncheckedAt(i);
903 if(!PairCut(track1,track2,kTRUE)) continue;
905 pVect2[0]=track2->E();
906 pVect2[1]=track2->Px();
907 pVect2[2]=track2->Py();
908 pVect2[3]=track2->Pz();
910 if(fPsiEPmixtemp != track2->GetPsiEP()) AliFatal("Error! Event plane angles are wrong in mixing!!");
912 //qinv = GetQinv(pVect1, pVect2); // qinv**2 = (P1x-P2x)**2 + (P1y-P2y)**2 + (P1z-P2z)**2 - (P1t-P2t)**2
913 GetQosl(pVect1, pVect2, qout, qside, qlong); // qout, qside, qlong = components of Q=P1-P2 in the P=P1+P2 frame
914 kt = sqrt(pow(pVect1[1]+pVect2[1],2) + pow(pVect1[2]+pVect2[2],2))/2.; // = Kt = |pT1+pT2|/2
915 Double_t deltaphi = GetDeltaPhiEP(pVect1[1],pVect1[2],pVect2[1],pVect2[2],fPsiEPmix); // angle to event plane in correct range
917 //Double_t weight = 1./(Double_t)nMix;
918 if(fabs(qout)<0.2 && fabs(qside)<0.2 && fabs(qlong)<0.2) nCountMixedPairs++;
919 if(kt < ktBins[0] || kt > ktBins[nKtBins]) continue;
920 if(!FindBin(kt,deltaphi,centralityPercentile,k,e,c)) continue;
921 hqmix[k][e][c]->Fill(qout,qside,qlong);
926 hMixedDist->Fill(centralityPercentile, countmix);
938 //________________________________________________________________________
939 void AliAnalysisTaskFemtoESE::Terminate(Option_t *)
942 if(ktBins) delete [] ktBins;
943 if(epBins) delete [] epBins;
944 if(centBins) delete [] centBins;
945 if(vzBins) delete [] vzBins;
946 if(qPercBinsLHC11h) delete [] qPercBinsLHC11h;
948 // Called once at the end of the query
957 //________________________________________________________________________
958 Bool_t AliAnalysisTaskFemtoESE::AcceptPair(AliChaoticityTrackStruct *first, AliChaoticityTrackStruct *second)
961 if(fabs(first->fEta-second->fEta) > fMinSepPairEta) return kTRUE;
963 // propagate through B field to r=1m
964 Float_t phi1 = first->fPhi - asin(first->fCharge*(0.1*fBfield)*0.15/first->fPt);// 0.15 for D=1m
965 if(phi1 > 2*PI) phi1 -= 2*PI;
966 if(phi1 < 0) phi1 += 2*PI;
967 Float_t phi2 = second->fPhi - asin(second->fCharge*(0.1*fBfield)*0.15/second->fPt);// 0.15 for D=1m
968 if(phi2 > 2*PI) phi2 -= 2*PI;
969 if(phi2 < 0) phi2 += 2*PI;
971 Float_t deltaphi = phi1 - phi2;
972 if(deltaphi > PI) deltaphi -= 2*PI;
973 if(deltaphi < -PI) deltaphi += 2*PI;
974 deltaphi = fabs(deltaphi);
976 if(deltaphi < fMinSepPairPhi) return kFALSE;// Min Separation
979 // propagate through B field to r=1.6m
980 phi1 = first->fPhi - asin(first->fCharge*(0.1*fBfield)*0.24/first->fPt);// mine. 0.24 for D=1.6m
981 if(phi1 > 2*PI) phi1 -= 2*PI;
982 if(phi1 < 0) phi1 += 2*PI;
983 phi2 = second->fPhi - asin(second->fCharge*(0.1*fBfield)*0.24/second->fPt);// mine. 0.24 for D=1.6m
984 if(phi2 > 2*PI) phi2 -= 2*PI;
985 if(phi2 < 0) phi2 += 2*PI;
987 deltaphi = phi1 - phi2;
988 if(deltaphi > PI) deltaphi -= 2*PI;
989 if(deltaphi < -PI) deltaphi += 2*PI;
990 deltaphi = fabs(deltaphi);
992 if(deltaphi < fMinSepPairPhi) return kFALSE;// Min Separation
998 Int_t ncl1 = first->fClusterMap.GetNbits();
999 Int_t ncl2 = second->fClusterMap.GetNbits();
1000 Int_t sumCls = 0; Int_t sumSha = 0; Int_t sumQ = 0;
1001 Double_t shfrac = 0; Double_t qfactor = 0;
1002 for(Int_t imap = 0; imap < ncl1 && imap < ncl2; imap++) {
1003 if (first->fClusterMap.TestBitNumber(imap) && second->fClusterMap.TestBitNumber(imap)) {// Both clusters
1004 if (first->fSharedMap.TestBitNumber(imap) && second->fSharedMap.TestBitNumber(imap)) { // Shared
1008 else {sumQ--; sumCls+=2;}
1010 else if (first->fClusterMap.TestBitNumber(imap) || second->fClusterMap.TestBitNumber(imap)) {// Non shared
1015 qfactor = sumQ*1.0/sumCls;
1016 shfrac = sumSha*1.0/sumCls;
1019 if(qfactor > fShareQuality || shfrac > fShareFraction) return kFALSE;
1026 //________________________________________________________________________
1027 Float_t AliAnalysisTaskFemtoESE::GamovFactor(Int_t chargeBin1, Int_t chargeBin2, Float_t qinv)
1029 Float_t arg = G_Coeff/qinv;
1031 if(chargeBin1==chargeBin2) return (exp(arg)-1)/(arg);
1032 else {return (exp(-arg)-1)/(-arg);}
1035 //________________________________________________________________________
1036 void AliAnalysisTaskFemtoESE::Shuffle(Int_t *iarr, Int_t i1, Int_t i2)
1040 for (Int_t i = i1; i < i2+1; i++) {
1041 j = (Int_t) (gRandom->Rndm() * a);
1048 //________________________________________________________________________
1049 Double_t AliAnalysisTaskFemtoESE::GetQinv2(Double_t track1[], Double_t track2[]){
1052 qinv2 = pow(track1[1]-track2[1],2) + pow(track1[2]-track2[2],2) + pow(track1[3]-track2[3],2) - pow(track1[0]-track2[0],2);
1056 //________________________________________________________________________
1057 void AliAnalysisTaskFemtoESE::GetQosl(Double_t track1[], Double_t track2[], Double_t& qout, Double_t& qside, Double_t& qlong){
1059 Double_t p0 = track1[0] + track2[0];
1060 Double_t px = track1[1] + track2[1];
1061 Double_t py = track1[2] + track2[2];
1062 Double_t pz = track1[3] + track2[3];
1064 Double_t mt = sqrt(p0*p0 - pz*pz);
1065 Double_t pt = sqrt(px*px + py*py);
1067 Double_t v0 = track1[0] - track2[0];
1068 Double_t vx = track1[1] - track2[1];
1069 Double_t vy = track1[2] - track2[2];
1070 Double_t vz = track1[3] - track2[3];
1072 if(gRandom->Rndm()<0.5)
1080 //cout << p0 << " " << px << " " << py << " " << pz << " " << v0 << " " << vx << " " << vy << " " << vz << " " << mt << " " << pt << endl;
1082 qout = (px*vx + py*vy)/pt;
1083 qside = (px*vy - py*vx)/pt;
1084 qlong = (p0*vz - pz*v0)/mt;
1087 //________________________________________________________________________
1088 Bool_t AliAnalysisTaskFemtoESE::EventCut(/*AliAODEvent* fevent*/){
1092 Bool_t isSelected1 = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kMB);
1093 Bool_t isSelected2 = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kCentral);
1094 Bool_t isSelected3 = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kSemiCentral);
1095 if(!isSelected1 && !isSelected2 && !isSelected3) {return kFALSE;}
1098 // Pile-up rejection
1099 AliAnalysisUtils *AnaUtil=new AliAnalysisUtils();
1100 if(!fPbPbcase) AnaUtil->SetUseMVPlpSelection(kTRUE);// use Multi-Vertex tool for pp and pPb
1101 else AnaUtil->SetUseMVPlpSelection(kFALSE);
1102 Bool_t pileUpCase=AnaUtil->IsPileUpEvent(fAOD);
1103 if(pileUpCase) return;
1106 primaryVertexAOD = fAOD->GetPrimaryVertex();
1107 vertex[0]=primaryVertexAOD->GetX(); vertex[1]=primaryVertexAOD->GetY(); vertex[2]=primaryVertexAOD->GetZ();
1109 if(fabs(vertex[2]) > 10) {cout<<"Zvertex Out of Range. Skip Event"<<endl; return;} // Z-Vertex Cut
1110 ((TH3D*)fOutputList->FindObject("fVertexDist"))->Fill(vertex[0], vertex[1], vertex[2]);
1112 for (Int_t i = 0; i < fAOD->GetNumberOfTracks(); i++) {
1113 AliAODTrack* aodtrack = fAOD->GetTrack(i);
1114 if (!aodtrack) continue;
1116 if(!aodtrack->TestFilterBit(BIT(fFilterBit))) continue;// AOD filterBit cut
1119 ((TH1D*)fOutputList->FindObject("fMultDist2"))->Fill(FBTracks);
1121 //if(fAOD->IsPileupFromSPD()) {cout<<"PileUpEvent. Skip Event"<<endl; return;} // Old Pile-up cut
1122 if(primaryVertexAOD->GetNContributors() < 1) {cout<<"Bad Vertex. Skip Event"<<endl; return;}
1124 ((TH1D*)fOutputList->FindObject("fMultDist3"))->Fill(FBTracks);
1126 fBfield = fAOD->GetMagneticField();
1128 for(Int_t i=0; i<fZvertexBins; i++){
1129 if( (vertex[2] >= zstart+i*zstep) && (vertex[2] < zstart+(i+1)*zstep) ){
1140 //________________________________________________________________________
1141 Bool_t AliAnalysisTaskFemtoESE::TrackCut(AliAODTrack* ftrack){
1143 if (!ftrack->TestFilterBit(fFilterBit)) return kFALSE;
1145 if(ftrack->Pt() < 0.14) return kFALSE;
1146 if(ftrack->Pt() > 1.5) return kFALSE;
1147 if(fabs(ftrack->Eta()) > 0.8) return kFALSE;
1149 if(ftrack->GetTPCNcls() < 80) return kFALSE;// TPC nCluster cut
1151 Double_t trackdca[3] = {ftrack->XAtDCA(),ftrack->YAtDCA(),ftrack->ZAtDCA()};
1152 //ftrack->XYZAtDCA(trackdca);
1153 //Double_t dcaxy = sqrt( pow(trackpos[0] - vertex[0],2) + pow(trackpos[1] - vertex[1],2));
1154 //Double_t dcaz = sqrt( pow(trackpos[2] - vertex[2],2));
1155 hdcaxy->Fill(trackdca[0],trackdca[1]);
1156 hdcaz->Fill(trackdca[2]);
1157 //if(dcaxy > 0.2) return kFALSE;
1158 //if(dcaz > 0.15) return kFALSE;
1161 //// FilterBit Overlap Check
1162 //if(fFilterBit != 7){
1163 // Bool_t goodTrackOtherFB = kFALSE;
1164 // if(fMCcase && fAOD->GetRunNumber()<=126437) goodTrackOtherFB=kTRUE;// FB7 to FB5 mapping in 10f6a MC does not work
1166 // for (Int_t j = 0; j < fAOD->GetNumberOfTracks(); j++) {
1167 // AliAODTrack* aodtrack2 = fAOD->GetTrack(randomIndex[j]);
1168 // if(!aodtrack2) continue;
1169 // if(!aodtrack2->TestFilterBit(BIT(fFilterBit))) continue;
1171 // if(-(aodtrack->GetID()+1)==aodtrack2->GetID()) {goodTrackOtherFB=kTRUE; break;}
1174 // if(!goodTrackOtherFB) continue;
1181 //________________________________________________________________________
1182 Bool_t AliAnalysisTaskFemtoESE::PairCut(AliFemtoESEBasicParticle* ftrack1, AliFemtoESEBasicParticle* ftrack2, Bool_t mix){
1184 // check for same charge
1185 if(ftrack2->Charge() != ftrack1->Charge()) return kFALSE;
1188 Double_t trackvec1[4] = {ftrack1->E(),ftrack1->Px(),ftrack1->Py(),ftrack1->Pz()};
1189 Double_t trackvec2[4] = {ftrack2->E(),ftrack2->Px(),ftrack2->Py(),ftrack2->Pz()};
1190 Double_t qinv2 = GetQinv2(trackvec1,trackvec2);
1191 if(qinv2 < 0.000025) return kFALSE; // qinv < 0.005
1193 // deltaEta x deltaPhi* cut
1194 if(fabs(ftrack1->Eta()-ftrack2->Eta()) < fMinSepPairEta)
1196 Double_t deltaphistar = DeltaPhiStar(ftrack1,ftrack2,1.0); // angular separation at r=1m
1197 deltaphistar = fabs(deltaphistar);
1198 if(deltaphistar < fMinSepPairPhi) return kFALSE;
1199 deltaphistar = DeltaPhiStar(ftrack1,ftrack2,1.6); // angular separation at r=1.6m
1200 deltaphistar = fabs(deltaphistar);
1201 if(deltaphistar < fMinSepPairPhi) return kFALSE;
1204 // share fraction & share quality cut
1205 TBits clusterMap1 = (TBits)(ftrack1->GetTPCClusterMap());
1206 TBits sharedMap1 = (TBits)(ftrack1->GetTPCSharedMap());
1207 TBits clusterMap2 = (TBits)(ftrack2->GetTPCClusterMap());
1208 TBits sharedMap2 = (TBits)(ftrack2->GetTPCSharedMap());
1210 Int_t ncl1 = clusterMap1.GetNbits();
1211 Int_t ncl2 = clusterMap2.GetNbits();
1212 Int_t sumCls = 0; Int_t sumSha = 0; Int_t sumQ = 0;
1213 Double_t shfrac = 0; Double_t qfactor = 0;
1214 for(Int_t imap = 0; imap < ncl1 && imap < ncl2; imap++)
1216 if (clusterMap1.TestBitNumber(imap) && clusterMap2.TestBitNumber(imap)) // Both clusters
1218 if (sharedMap1.TestBitNumber(imap) && sharedMap2.TestBitNumber(imap)) // Shared
1223 else {sumQ--; sumCls+=2;}
1225 else if (clusterMap1.TestBitNumber(imap) || clusterMap2.TestBitNumber(imap)) // Non shared
1233 qfactor = sumQ*1.0/sumCls;
1234 shfrac = sumSha*1.0/sumCls;
1237 // sumCls -- number of clusters in track 1 + number of clusters in track 2 (clusters in both tracks counted twice)
1238 // sumSha -- number of shared clusters (counted twice)
1243 hsharequal->Fill(qfactor);
1244 hsharefrac->Fill(shfrac);
1248 hsharequalmix->Fill(qfactor);
1249 hsharefracmix->Fill(shfrac);
1253 if(qfactor > fShareQuality || shfrac > fShareFraction) return kFALSE;
1258 Double_t AliAnalysisTaskFemtoESE::DeltaPhiStar(AliAODTrack* ftrack1, AliAODTrack* ftrack2, Double_t r)
1260 Double_t phi1 = ftrack1->Phi() - asin(0.3*ftrack1->Charge()*(0.1*fBfield)*r/(2.*ftrack1->Pt())); // magnetic field converted from kilogauss to tesla
1261 Double_t phi2 = ftrack2->Phi() - asin(0.3*ftrack2->Charge()*(0.1*fBfield)*r/(2.*ftrack2->Pt()));
1263 Double_t deltaphi = phi1 - phi2;
1264 while(deltaphi > TMath::Pi()) deltaphi -= 2*TMath::Pi();
1265 while(deltaphi < -TMath::Pi()) deltaphi += 2*TMath::Pi();
1270 /*TObjArray* AliAnalysisTaskFemtoESE::CloneAndReduceTrackList(TObjArray* tracks, Double_t psi)
1272 // clones a track list by using AliDPhiBasicParticle which uses much less memory (used for event mixing)
1274 TObjArray* tracksClone = new TObjArray;
1275 tracksClone->SetOwner(kTRUE);
1277 for (Int_t i=0; i<tracks->GetEntriesFast(); i++)
1279 AliAODTrack* particle = (AliAODTrack*) tracks->UncheckedAt(i);
1280 AliFemtoESEBasicParticle* copy = new AliFemtoESEBasicParticle(sqrt(pow(particle->P(),2)+pow(0.13957, 2)),particle->Px(),particle->Py(),particle->Pz(),particle->Charge(),particle->Phi(),particle->Eta());
1281 copy->SetPsiEP(psi);
1282 copy->SetTPCClusterMap(particle->GetTPCClusterMap());
1283 copy->SetTPCSharedMap(particle->GetTPCSharedMap());
1285 tracksClone->Add(copy);
1291 Double_t AliAnalysisTaskFemtoESE::GetDeltaPhiEP(Double_t px1, Double_t py1, Double_t px2, Double_t py2, Double_t psi)
1294 Double_t px = px1+px2;
1295 Double_t py = py1+py2;
1296 Double_t phi = atan2(py,px);
1298 Double_t dphi = phi-psi;
1299 while(dphi < epBins[0]) dphi += 2*TMath::Pi();
1300 while(dphi > epBins[nEPBins]) dphi -= 2*TMath::Pi();
1305 Bool_t AliAnalysisTaskFemtoESE::FindBin(Double_t kt, Double_t phi, Double_t cent, Int_t& a, Int_t& b, Int_t&c)
1308 for(Int_t i = 0; i < nKtBins; i++)
1310 if(kt >= ktBins[i] && kt < ktBins[i+1])
1316 if(a==-1) return kFALSE;
1318 for(Int_t i = 0; i < nEPBins; i++)
1320 if(phi >= epBins[i] && phi < epBins[i+1])
1326 if(b==-1) return kFALSE;
1328 for(Int_t i = 0; i < nCentBins; i++)
1330 if(cent >= centBins[i] && cent < centBins[i+1])
1336 if(c==-1) return kFALSE;
1343 void AliAnalysisTaskFemtoESE::SetKtBins(Int_t n, Double_t* bins)
1345 if(ktBins) delete [] ktBins;
1348 ktBins = new Double_t[nKtBins+1];
1349 for(Int_t i = 0; i < nKtBins+1; i++)
1351 Printf("Setting %i kt bins: ",nKtBins);
1352 for(Int_t i = 0; i < nKtBins+1; i++) Printf("%lf",ktBins[i]);
1354 void AliAnalysisTaskFemtoESE::SetCentBins(Int_t n, Double_t* bins)
1356 if(centBins) delete [] centBins;
1359 centBins = new Double_t[nCentBins+1];
1360 for(Int_t i = 0; i < nCentBins+1; i++)
1361 centBins[i]=bins[i];
1362 Printf("Setting %i centrality bins: ",nCentBins);
1363 for(Int_t i = 0; i < nCentBins+1; i++) Printf("%lf",centBins[i]);
1365 void AliAnalysisTaskFemtoESE::SetVzBins(Int_t n, Double_t* bins)
1367 if(vzBins) delete [] vzBins;
1370 vzBins = new Double_t[nVzBins+1];
1371 for(Int_t i = 0; i < nVzBins+1; i++)
1373 Printf("Setting %i vz bins: ",nVzBins);
1374 for(Int_t i = 0; i < nVzBins+1; i++) Printf("%lf",vzBins[i]);
1376 void AliAnalysisTaskFemtoESE::SetEPBins(Int_t n, Double_t min, Double_t max)
1378 if(epBins) delete [] epBins;
1381 epBins = new Double_t[nEPBins+1];
1382 for(Int_t y = 0; y < nEPBins+1; y++)
1383 epBins[y] = min+((max-min)/(Double_t)n)*((Double_t)y);
1384 Printf("Setting %i EP bins: ",nEPBins);
1385 for(Int_t i = 0; i < nEPBins+1; i++) Printf("%lf",epBins[i]);
1388 Double_t AliAnalysisTaskFemtoESE::GetQPercLHC11h(Double_t qvec)
1390 // preliminary attemp at calculating qvector percentile in LHC11h -- still very approximate and only works in 5% bins
1391 if(!qPercBinsLHC11h)
1393 Double_t tempArray[21] = {0.0, 0.22995, 0.33047, 0.410831, 0.480728, 0.545566, 0.606841, 0.66634, 0.725193, 0.783813, 0.843311, 0.904185, 0.96796, 1.03522, 1.10768, 1.18774, 1.27808, 1.3857, 1.52438, 1.73633, 4.95};
1394 nqPercBinsLHC11h = 21;
1395 qPercBinsLHC11h = new Double_t[nqPercBinsLHC11h];
1396 for(Int_t n = 0; n < nqPercBinsLHC11h; n++) qPercBinsLHC11h[n] = tempArray[n];
1399 for(Int_t t = 0; t < nqPercBinsLHC11h-1; t++)
1400 if(qvec > qPercBinsLHC11h[t] && qvec < qPercBinsLHC11h[t+1]) return 50.*(2*t+1)/(Double_t)(nqPercBinsLHC11h-1);
1402 if(qvec < qPercBinsLHC11h[0]) return 0.0;
1403 if(qvec > qPercBinsLHC11h[nqPercBinsLHC11h-1]) return 100.0;