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 hcentUnweighted(0x0),
112 hphistaretapair10(0x0),
113 hphistaretapair16(0x0),
114 hphistaretapair10a(0x0),
115 hphistaretapair16a(0x0),
116 hphistaretapair10b(0x0),
117 hphistaretapair16b(0x0),
145 hMixedDistTracks(0x0),
146 hMixedDistEvents(0x0),
159 //________________________________________________________________________
161 AliAnalysisTaskFemtoESE::AliAnalysisTaskFemtoESE(const char* name) :
162 AliAnalysisTaskSE(name),
170 fSelectBit(AliVEvent::kMB),
173 fMixingTracks(10000),
178 fShareFraction(0.05),
216 hcentUnweighted(0x0),
218 hphistaretapair10(0x0),
219 hphistaretapair16(0x0),
220 hphistaretapair10a(0x0),
221 hphistaretapair16a(0x0),
222 hphistaretapair10b(0x0),
223 hphistaretapair16b(0x0),
251 hMixedDistTracks(0x0),
252 hMixedDistEvents(0x0),
264 Printf("*******************************************");
265 Printf("AliAnalysisTaskFemtoESE named %s",name);
266 Printf("*******************************************");
269 //SetEPBins(12,-TMath::Pi()/12.,2*TMath::Pi()-TMath::Pi()/12.);
270 SetEPBins(12,0,2*TMath::Pi());
271 Double_t ktBinsTemp[5] = {0.2,0.3,0.4,0.5,0.7};
272 SetKtBins(4,ktBinsTemp);
273 Double_t centBinsTemp[7] = {0,5,10,20,30,40,50};
274 SetCentBins(6,centBinsTemp);
275 Double_t vzBinsTemp[9] = {-8,-6,-4,-2,0,2,4,6,8};
276 SetVzBins(8,vzBinsTemp);
280 epBinsMix = new Double_t[nEPBinsMix1];
281 for(Int_t ee = 0; ee < nEPBinsMix1; ee++)
282 {epBinsMix[ee] = (TMath::Pi()/(Double_t)nEPBinsMix)*((Double_t)ee)-TMath::Pi()/2.;}
284 vertex[0] = vertex[1] = vertex[2] = 0.;
286 DefineInput(0, TChain::Class());
287 DefineOutput(1, TList::Class());
288 DefineOutput(2, AliHelperPID::Class());
289 DefineOutput(3, AliSpectraAODEventCuts::Class());
290 DefineOutput(4, AliSpectraAODTrackCuts::Class());
294 //________________________________________________________________________
296 AliAnalysisTaskFemtoESE::~AliAnalysisTaskFemtoESE()
300 //________________________________________________________________________
302 AliAnalysisTaskFemtoESE::AliAnalysisTaskFemtoESE(const AliAnalysisTaskFemtoESE &/*obj*/) :
311 fSelectBit(AliVEvent::kMB),
314 fMixingTracks(10000),
319 fShareFraction(0.05),
357 hcentUnweighted(0x0),
359 hphistaretapair10(0x0),
360 hphistaretapair16(0x0),
361 hphistaretapair10a(0x0),
362 hphistaretapair16a(0x0),
363 hphistaretapair10b(0x0),
364 hphistaretapair16b(0x0),
392 hMixedDistTracks(0x0),
393 hMixedDistEvents(0x0),
406 //________________________________________________________________________
407 // assignment operator
408 AliAnalysisTaskFemtoESE& AliAnalysisTaskFemtoESE::operator=(const AliAnalysisTaskFemtoESE &/*obj*/)
414 //________________________________________________________________________
415 void AliAnalysisTaskFemtoESE::UserCreateOutputObjects()
419 if (!fTrackCuts) AliFatal("Track Cuts should be set in the steering macro");
420 if (!fEventCuts) AliFatal("Event Cuts should be set in the steering macro");
421 if (!fHelperPID) AliFatal("HelperPID should be set in the steering macro");
423 fOutputList = new TList();
424 fOutputList->SetOwner();
425 fOutputList->SetName("fOutputList");
427 hpx = new TH1D("hpx","px",200,-2,2);
428 hpx->GetXaxis()->SetTitle("p_{x}");
429 fOutputList->Add(hpx);
430 hpy = new TH1D("hpy","py",200,-2,2);
431 hpy->GetXaxis()->SetTitle("p_{y}");
432 fOutputList->Add(hpy);
433 hpz = new TH1D("hpz","pz",200,-2,2);
434 hpz->GetXaxis()->SetTitle("p_{z}");
435 fOutputList->Add(hpz);
436 hpt = new TH1D("hpt","pt",100,0,2);
437 hpt->GetXaxis()->SetTitle("p_{t}");
438 fOutputList->Add(hpt);
439 hE = new TH1D("hE","E",100,0,2);
440 hE->GetXaxis()->SetTitle("E");
441 fOutputList->Add(hE);
442 hphieta = new TH2D("hphieta","track #varphi vs #eta",100,0,2*TMath::Pi(),80,-0.8,0.8);
443 hphieta->GetXaxis()->SetTitle("#varphi");
444 hphieta->GetYaxis()->SetTitle("#eta");
445 fOutputList->Add(hphieta);
446 hphieta_pid = new TH2D("hphieta_pid","PID check -- #Delta#varphi vs #Delta#eta",100,-0.3,0.3,100,-0.3,0.3);
447 hphieta_pid->GetXaxis()->SetTitle("#Delta#varphi");
448 hphieta_pid->GetYaxis()->SetTitle("#Delta#eta");
449 fOutputList->Add(hphieta_pid);
450 hpt_pid = new TH1D("hpt_pid","PID check -- #Delta p_{t}",100,-0.5,0.5);
451 hpt_pid->GetXaxis()->SetTitle("#Delta p_{t}");
452 fOutputList->Add(hpt_pid);
453 hvzcent = new TH2D("hvzcent","vz vs cent",nVzBins,vzBins,nCentBins,centBins);
454 hvzcent->GetXaxis()->SetTitle("v_{z}");
455 hvzcent->GetYaxis()->SetTitle("centrality");
456 fOutputList->Add(hvzcent);
457 hcent = new TH1D("hcent","cent",200,0,50);
458 hcent->GetXaxis()->SetTitle("centrality");
459 fOutputList->Add(hcent);
460 hcentUnweighted = new TH1D("hcentUnweighted","cent - unweighted",200,0,50);
461 hcentUnweighted->GetXaxis()->SetTitle("centrality");
462 fOutputList->Add(hcentUnweighted);
463 hcentn = new TH2D("hcentn","cent vs npions",50,0,50,100,0,2000);
464 hcentn->GetXaxis()->SetTitle("Centrality");
465 hcentn->GetYaxis()->SetTitle("Number of pions");
466 fOutputList->Add(hcentn);
467 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);
468 hphistaretapair10->GetXaxis()->SetTitle("#Delta#varphi*");
469 hphistaretapair10->GetYaxis()->SetTitle("#Delta#eta");
470 hphistaretapair10->GetZaxis()->SetTitle("k_{T}");
471 fOutputList->Add(hphistaretapair10);
472 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);
473 hphistaretapair16->GetXaxis()->SetTitle("#Delta#varphi*");
474 hphistaretapair16->GetYaxis()->SetTitle("#Delta#eta");
475 hphistaretapair16->GetZaxis()->SetTitle("k_{T}");
476 fOutputList->Add(hphistaretapair16);
477 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);
478 hphistaretapair10a->GetXaxis()->SetTitle("#Delta#varphi*");
479 hphistaretapair10a->GetYaxis()->SetTitle("#Delta#eta");
480 hphistaretapair10a->GetZaxis()->SetTitle("k_{T}");
481 fOutputList->Add(hphistaretapair10a);
482 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);
483 hphistaretapair16a->GetXaxis()->SetTitle("#Delta#varphi*");
484 hphistaretapair16a->GetYaxis()->SetTitle("#Delta#eta");
485 hphistaretapair16a->GetZaxis()->SetTitle("k_{T}");
486 fOutputList->Add(hphistaretapair16a);
487 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);
488 hphistaretapair10b->GetXaxis()->SetTitle("#Delta#varphi*");
489 hphistaretapair10b->GetYaxis()->SetTitle("#Delta#eta");
490 hphistaretapair10b->GetZaxis()->SetTitle("k_{T}");
491 fOutputList->Add(hphistaretapair10b);
492 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);
493 hphistaretapair16b->GetXaxis()->SetTitle("#Delta#varphi*");
494 hphistaretapair16b->GetYaxis()->SetTitle("#Delta#eta");
495 hphistaretapair16b->GetZaxis()->SetTitle("k_{T}");
496 fOutputList->Add(hphistaretapair16b);
497 hphietapair = new TH3D("hphietapair","pair #Delta#varphi vs #Delta#eta",100,-0.1,0.1,100,-0.1,0.1,10,0,1);
498 hphietapair->GetXaxis()->SetTitle("#Delta#varphi");
499 hphietapair->GetYaxis()->SetTitle("#Delta#eta");
500 hphietapair->GetZaxis()->SetTitle("k_{T}");
501 fOutputList->Add(hphietapair);
502 hphietapair2 = new TH3D("hphietapair2","pair #varphi vs #eta",100,-TMath::Pi(),TMath::Pi(),100,-1.6,1.6,10,0,1);
503 hphietapair2->GetXaxis()->SetTitle("#Delta#varphi");
504 hphietapair2->GetYaxis()->SetTitle("#eta");
505 hphietapair2->GetZaxis()->SetTitle("k_{T}");
506 fOutputList->Add(hphietapair2);
507 hpidid = new TH1D("hpidid","pid id",9,-4.5,4.5);
508 hpidid->GetXaxis()->SetTitle("track PID ID");
509 fOutputList->Add(hpidid);
510 hkt = new TH2D("hkt","k_{T}",nCentBins,centBins,100,0,2);
511 hkt->GetXaxis()->SetTitle("centrality");
512 hkt->GetYaxis()->SetTitle("k_{T}");
513 fOutputList->Add(hkt);
514 hktcheck = new TH1D("hktcheck","k_{T} check",50,0,1);
515 hktcheck->GetXaxis()->SetTitle("k_{T}");
516 fOutputList->Add(hktcheck);
517 hkt3 = new TH3D("hkt3","kt vs pt",50,0,1,50,0,5,50,0,5);
518 hkt3->GetXaxis()->SetTitle("k_{T}");
519 hkt3->GetYaxis()->SetTitle("p_{T,1}");
520 hkt3->GetZaxis()->SetTitle("p_{T,2}");
521 fOutputList->Add(hkt3);
522 hdcaxy = new TH2D("hdcaxy","DCA xy",100,-5,5,100,-5,5);
523 hdcaxy->GetXaxis()->SetTitle("DCA x");
524 hdcaxy->GetYaxis()->SetTitle("DCA y");
525 fOutputList->Add(hdcaxy);
526 hdcaz = new TH1D("hdcaz","DCA z",100,-5,5);
527 hdcaz->GetXaxis()->SetTitle("DCA z");
528 fOutputList->Add(hdcaz);
529 hsharequal = new TH1D("hsharequal","Share Quality",102,-1.02,1.02);
530 hsharequal->GetXaxis()->SetTitle("Share Quality");
531 fOutputList->Add(hsharequal);
532 hsharefrac = new TH1D("hsharefrac","Share Fraction",100,0,1);
533 hsharefrac->GetXaxis()->SetTitle("Share Fraction");
534 fOutputList->Add(hsharefrac);
535 hsharequalmix = new TH1D("hsharequalmix","Share Quality -- mixed events",102,-1.02,1.02);
536 hsharequalmix->GetXaxis()->SetTitle("Share Quality");
537 fOutputList->Add(hsharequalmix);
538 hsharefracmix = new TH1D("hsharefracmix","Share Fraction -- mixed events",100,0,1);
539 hsharefracmix->GetXaxis()->SetTitle("Share Fraction");
540 fOutputList->Add(hsharefracmix);
541 hPsiTPC = new TH2D("hPsiTPC","TPC EP",nCentBins,centBins,100,-1*TMath::Pi(),TMath::Pi());
542 hPsiTPC->GetXaxis()->SetTitle("Centrality");
543 hPsiTPC->GetYaxis()->SetTitle("#Psi{TPC}");
544 fOutputList->Add(hPsiTPC);
545 hPsiV0A = new TH2D("hPsiV0A","V0A EP",nCentBins,centBins,100,-1*TMath::Pi(),TMath::Pi());
546 hPsiV0A->GetXaxis()->SetTitle("Centrality");
547 hPsiV0A->GetYaxis()->SetTitle("#Psi{V0A}");
548 fOutputList->Add(hPsiV0A);
549 hPsiV0C = new TH2D("hPsiV0C","V0C EP",nCentBins,centBins,100,-1*TMath::Pi(),TMath::Pi());
550 hPsiV0C->GetXaxis()->SetTitle("Centrality");
551 hPsiV0C->GetYaxis()->SetTitle("#Psi{V0C}");
552 fOutputList->Add(hPsiV0C);
553 hShiftTPC = new TH2D("hShiftTPC","TPC shifting values",nCentBins,centBins,6,-0.5,5.5);
554 hShiftTPC->GetXaxis()->SetTitle("Centrality");
555 fOutputList->Add(hShiftTPC);
556 hShiftV0A = new TH2D("hShiftV0A","V0A shifting values",nCentBins,centBins,6,-0.5,5.5);
557 hShiftV0A->GetXaxis()->SetTitle("Centrality");
558 fOutputList->Add(hShiftV0A);
559 hShiftV0C = new TH2D("hShiftV0C","V0C shifting values",nCentBins,centBins,6,-0.5,5.5);
560 hShiftV0C->GetXaxis()->SetTitle("Centrality");
561 fOutputList->Add(hShiftV0C);
562 hPsiMix = new TH2D("hPsiMix","Mix EP",nCentBins,centBins,100,-1*TMath::Pi(),TMath::Pi());
563 hPsiMix->GetXaxis()->SetTitle("Centrality");
564 hPsiMix->GetYaxis()->SetTitle("#Psi{Mix}");
565 fOutputList->Add(hPsiMix);
566 hCheckEPA = new TH2D("hCheckEPA","Check EP V0A",nCentBins,centBins,100,-1*TMath::Pi(),TMath::Pi());
567 hCheckEPA->GetXaxis()->SetTitle("Centrality");
568 hCheckEPA->GetYaxis()->SetTitle("PsiV0A - PsiTPC");
569 fOutputList->Add(hCheckEPA);
570 hCheckEPC = new TH2D("hCheckEPC","Check EP V0C",nCentBins,centBins,100,-1*TMath::Pi(),TMath::Pi());
571 hCheckEPC->GetXaxis()->SetTitle("Centrality");
572 hCheckEPC->GetYaxis()->SetTitle("PsiV0C - PsiTPC");
573 fOutputList->Add(hCheckEPC);
574 hCheckEPmix = new TH2D("hCheckEPmix","Check EP mixed events",100,-1*TMath::Pi(),TMath::Pi(),100,-1*TMath::Pi(),TMath::Pi());
575 hCheckEPmix->GetXaxis()->SetTitle("Psi1 - Psi_mix");
576 hCheckEPmix->GetYaxis()->SetTitle("Psi1 - Psi2");
577 fOutputList->Add(hCheckEPmix);
578 hAvDphi = new TH3D("hAvDphi","average event plane angle",nEPBins,epBins,nCentBins,centBins,nKtBins,ktBins);
579 hAvDphi->GetXaxis()->SetTitle("EP bins");
580 hAvDphi->GetYaxis()->SetTitle("cent bins");
581 hAvDphi->GetZaxis()->SetTitle("kt bins");
582 fOutputList->Add(hAvDphi);
583 hNpairs = new TH3D("hNpairs","number of pairs",nEPBins,epBins,nCentBins,centBins,nKtBins,ktBins);
584 hNpairs->GetXaxis()->SetTitle("EP bins");
585 hNpairs->GetYaxis()->SetTitle("cent bins");
586 hNpairs->GetZaxis()->SetTitle("kt bins");
587 fOutputList->Add(hNpairs);
588 hPairDphi = new TH1D("hPairDphi","pairs wrt EP",100,0,2*TMath::Pi());
589 hPairDphi->GetXaxis()->SetTitle("#Delta#phi");
590 fOutputList->Add(hPairDphi);
591 hPairDphiMix = new TH1D("hPairDphiMix","mixed pairs wrt EP",100,0,2*TMath::Pi());
592 hPairDphiMix->GetXaxis()->SetTitle("#Delta#phi");
593 fOutputList->Add(hPairDphiMix);
594 hcentq = new TH2D("hcentq","qvec vs cent",100,0,100,50,0,50);
595 hcentq->GetXaxis()->SetTitle("q_{2} percentile");
596 hcentq->GetYaxis()->SetTitle("centrality");
597 fOutputList->Add(hcentq);
598 hMixedDistTracks = new TH2D("hMixedDistTracks", ";centrality;tracks", nCentBins, centBins, 200, 0, fMixingTracks * 2.);
599 fOutputList->Add(hMixedDistTracks);
600 hMixedDistEvents = new TH2D("hMixedDistEvents", ";centrality;events", nCentBins, centBins, 41, -0.5, 40.5);
601 fOutputList->Add(hMixedDistEvents);
602 hQvecV0A = new TH2D("hQvecV0A","Qvector in V0A",50,0,50,200,0,5);
603 hQvecV0A->GetXaxis()->SetTitle("Centrality");
604 hQvecV0A->GetYaxis()->SetTitle("normalized Qvector");
605 fOutputList->Add(hQvecV0A);
606 hQvecV0C = new TH2D("hQvecV0C","Qvector in V0C",50,0,50,200,0,5);
607 hQvecV0C->GetXaxis()->SetTitle("Centrality");
608 hQvecV0C->GetYaxis()->SetTitle("normalized Qvector");
609 fOutputList->Add(hQvecV0C);
611 // resolution histograms
612 hresV0ATPC = new TH1D("hresV0ATPC","cent vs cos(2*(V0A-TPC))",nCentBins,centBins);
613 hresV0ATPC->GetXaxis()->SetTitle("centrality");
614 fOutputList->Add(hresV0ATPC);
615 hresV0CTPC = new TH1D("hresV0CTPC","cent vs cos(2*(V0C-TPC))",nCentBins,centBins);
616 hresV0CTPC->GetXaxis()->SetTitle("centrality");
617 fOutputList->Add(hresV0CTPC);
618 hresV0AV0C = new TH1D("hresV0AV0C","cent vs cos(2*(V0A-V0C))",nCentBins,centBins);
619 hresV0AV0C->GetXaxis()->SetTitle("centrality");
620 fOutputList->Add(hresV0AV0C);
622 hqinvcheck = new TH3F("hqinvcheck","Qinv vs kt vs cent",100,0,1,50,0,1,10,0,50);
623 hqinvcheck->GetXaxis()->SetTitle("qinv");
624 hqinvcheck->GetYaxis()->SetTitle("kt");
625 hqinvcheck->GetZaxis()->SetTitle("centrality");
626 fOutputList->Add(hqinvcheck);
628 hq = new TH3F****[2];
629 hqmix = new TH3F****[2];
630 hqinv = new TH3F****[2];
631 for(Int_t z = 0; z < 2; z++) // charge combinations
633 hq[z] = new TH3F***[nKtBins];
634 hqmix[z] = new TH3F***[nKtBins];
635 hqinv[z] = new TH3F***[nKtBins];
636 for(Int_t k = 0; k < nKtBins; k++)
638 hq[z][k] = new TH3F**[nEPBins];
639 hqmix[z][k] = new TH3F**[nEPBins];
640 hqinv[z][k] = new TH3F**[nEPBins];
641 for(Int_t e = 0; e < nEPBins; e++)
643 hq[z][k][e] = new TH3F*[nCentBins];
644 hqmix[z][k][e] = new TH3F*[nCentBins];
645 hqinv[z][k][e] = new TH3F*[nCentBins];
646 for(Int_t c = 0; c < nCentBins; c++)
648 hq[z][k][e][c] = new TH3F(Form("hq%i_k%i_e%i_c%i",z,k,e,c),Form("hq%i_k%i_e%i_c%i",z,k,e,c),40,-0.2,0.2,40,-0.2,0.2,40,-0.2,0.2);
649 hq[z][k][e][c]->Sumw2();
650 fOutputList->Add(hq[z][k][e][c]);
651 hqmix[z][k][e][c] = new TH3F(Form("hqmix%i_k%i_e%i_c%i",z,k,e,c),Form("hqmix%i_k%i_e%i_c%i",z,k,e,c),40,-0.2,0.2,40,-0.2,0.2,40,-0.2,0.2);
652 hqmix[z][k][e][c]->Sumw2();
653 fOutputList->Add(hqmix[z][k][e][c]);
654 hqinv[z][k][e][c] = new TH3F(Form("hqinv%i_k%i_e%i_c%i",z,k,e,c),Form("hqinv%i_k%i_e%i_c%i",z,k,e,c),40,-0.2,0.2,40,-0.2,0.2,40,-0.2,0.2);
655 //hqinv[z][k][e][c]->Sumw2();
656 fOutputList->Add(hqinv[z][k][e][c]);
662 // create dummy histograms which just hold the values of the kt, cent, ep bin edges
663 hktbins = new TH1F("hktbins","kt bins",nKtBins,ktBins);
664 fOutputList->Add(hktbins);
665 hcentbins = new TH1F("hcentbins","cent bins",nCentBins,centBins);
666 fOutputList->Add(hcentbins);
667 hepbins = new TH1F("hepbins","ep bins",nEPBins,epBins);
668 fOutputList->Add(hepbins);
670 Printf("************************");
671 Printf("using the %s detector for event plane determination!",fEPDet ? "V0C" : "V0A");
672 Printf("using the %s detector for q-vector determination!",fQPercDet ? "V0C" : "V0A");
673 Printf("************************");
675 vertex[0] = vertex[1] = vertex[2] = 0.;
678 fPoolMgr = new AliEventPoolManager*[2];
679 Int_t poolsize = 1000;
680 fPoolMgr[0] = new AliEventPoolManager(poolsize, fMixingTracks, nCentBins, centBins, nVzBins, vzBins,nEPBinsMix,epBinsMix);
681 fPoolMgr[0]->SetTargetValues(fMixingTracks, 0.01, 5); // check these values
682 fPoolMgr[1] = new AliEventPoolManager(poolsize, fMixingTracks, nCentBins, centBins, nVzBins, vzBins,nEPBinsMix,epBinsMix);
683 fPoolMgr[1]->SetTargetValues(fMixingTracks, 0.01, 5); // check these values
686 nCountMixedPairs = 0;
689 //stopwatch = new TStopwatch();
690 //stopwatch->Start();
692 PostData(1, fOutputList);
693 PostData(2, fHelperPID);
694 PostData(3, fEventCuts);
695 PostData(4, fTrackCuts);
699 //________________________________________________________________________
700 void AliAnalysisTaskFemtoESE::UserExec(Option_t *)
703 // Called for each event
705 //if(!fAODcase) {cout<<"ESDs not supported"<<endl; return;}
707 fAOD = dynamic_cast<AliAODEvent*> (InputEvent());
708 if (!fAOD) {Printf("ERROR: fAOD not available"); return;}
710 //if(!EventCut(fAOD)) return;
711 if(!EventCut()) return;
714 if(fEventCounter%1000==0) Printf("=========== Event # %i ===========",fEventCounter);
716 AliCentrality *centrality;// for AODs and ESDs
717 const AliAODVertex *primaryVertexAOD;
719 //AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
720 //AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
721 //fPIDResponse = inputHandler->GetPIDResponse();
723 fBfield = fAOD->GetMagneticField();
725 /////////////////////////////////////////////////
727 Float_t centralityPercentile=0;
729 centrality = fAOD->GetCentrality();
730 centralityPercentile = centrality->GetCentralityPercentile("V0M");
731 if(centralityPercentile <= centBins[0]) return;
732 if(centralityPercentile > centBins[nCentBins]) return;
733 Double_t centWeight = GetCentralityWeight(centralityPercentile);
735 primaryVertexAOD = fAOD->GetPrimaryVertex();
736 vertex[0]=primaryVertexAOD->GetX(); vertex[1]=primaryVertexAOD->GetY(); vertex[2]=primaryVertexAOD->GetZ();
737 Double_t zvtx = vertex[2];
738 if(zvtx < vzBins[0] || zvtx > vzBins[nVzBins]) return; // Z-Vertex Cut
739 //cout<<"Centrality % = " << centralityPercentile << " z-vertex = " << zvtx << endl;
742 //Printf("%lf %lf",stopwatch->RealTime(),stopwatch->CpuTime());
743 //stopwatch->Start();
745 // get event plane from V0's
746 if(!fEventCuts->IsSelected(fAOD,fTrackCuts)) {Printf("Error! Event not accepted by AliAODSpectraEventCuts!"); return;}
747 Double_t psiV0A = fEventCuts->GetPsiV0A();
748 Double_t psiV0C = fEventCuts->GetPsiV0C();
749 Double_t qperc = -999;
750 qperc = fEventCuts->GetQvecPercentile(fQPercDet);//0: VZERO-A 1: VZERO-C // now works for both LHC10h and LHC11h (for 0-50% centrality only!)
753 //Printf("%lf %lf",qperc,GetQPercLHC11h(fEventCuts->GetqV0A()));
754 hQvecV0A->Fill(centralityPercentile,fEventCuts->GetqV0A(),centWeight);
755 hQvecV0C->Fill(centralityPercentile,fEventCuts->GetqV0C(),centWeight);
756 //Printf("q vector = %lf percentile = %lf",(fQPercDet==0 ? fEventCuts->GetqV0A() : fEventCuts->GetqV0C()),qperc);
759 if(psiV0A == -999) return;
760 if(psiV0C == -999) return;
761 if(qperc < fMinQPerc || qperc > fMaxQPerc) return;
763 //ProcInfo_t procInfo;
764 //gSystem->GetProcInfo(&procInfo);
765 //Printf("beginning of event: ResMem %ld VMem %ld", procInfo.fMemResident, procInfo.fMemVirtual);
767 Double_t psiEP = psiV0A;
768 if(fEPDet==1) psiEP = psiV0C;
770 Double_t sin2phi = 0, cos2phi = 0;
772 TObjArray* tracksPos = new TObjArray();
773 tracksPos->SetOwner(kTRUE);
774 TObjArray* tracksNeg = new TObjArray();
775 tracksNeg->SetOwner(kTRUE);
777 // Track loop -- select pions
778 for (Int_t i = 0; i < fAOD->GetNumberOfTracks(); i++) {
779 AliAODTrack* aodtrack = (AliAODTrack*)fAOD->GetTrack(i);
780 if (!aodtrack) continue;
781 if(!TrackCut(aodtrack)) continue;
783 // filter bit 7 PID method...
785 for(Int_t m = 0; m < fAOD->GetNumberOfTracks(); m++) {
786 AliAODTrack* aodtrack2 = (AliAODTrack*)fAOD->GetTrack(m);
787 if (!aodtrack2) continue;
788 if(aodtrack->GetID() != (-aodtrack2->GetID() - 1)) continue;// (-aodTrack2->GetID() - 1)
789 trackPID=fHelperPID->GetParticleSpecies((AliVTrack*)aodtrack2,kTRUE);
790 hphieta_pid->Fill(aodtrack->Phi()-aodtrack2->Phi(),aodtrack->Eta()-aodtrack2->Eta());
791 hpt_pid->Fill(aodtrack->Pt()-aodtrack2->Pt());
792 //cout << aodtrack->Phi() << " " << aodtrack->Eta() << " " << aodtrack->Pt() << endl;
793 //cout << aodtrack2->Phi() << " " << aodtrack2->Eta() << " " << aodtrack2->Pt() << " " << dataID2 << endl;
796 hpidid->Fill((trackPID+1)*aodtrack->Charge());
801 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());
802 particle->SetPsiEP(psiEP);
803 particle->SetTPCClusterMap(aodtrack->GetTPCClusterMap());
804 particle->SetTPCSharedMap(aodtrack->GetTPCSharedMap());
806 if(particle->Charge()>0)
807 tracksPos->Add(particle);
808 if(particle->Charge()<0)
809 tracksNeg->Add(particle);
812 hpx->Fill(particle->Px());
813 hpy->Fill(particle->Py());
814 hpz->Fill(particle->Pz());
815 hpt->Fill(particle->Pt());
816 hE->Fill(particle->E());
817 hphieta->Fill(particle->Phi(),particle->Eta());
819 // check event plane angle using tracks in the TPC
820 if(aodtrack->Pt() < 2 && aodtrack->Pt() > 0.2)
822 sin2phi += (aodtrack->Pt())*sin(2*aodtrack->Phi());
823 cos2phi += (aodtrack->Pt())*cos(2*aodtrack->Phi());
829 Int_t ntracks = tracksPos->GetEntriesFast()+tracksNeg->GetEntriesFast();
831 // get EP from TPC, just to check
832 Double_t psiTPC = 0.;
834 psiTPC = 0.5*atan2(sin2phi,cos2phi);
837 hPsiTPC->Fill(centralityPercentile,psiTPC,centWeight);
838 hPsiV0A->Fill(centralityPercentile,psiV0A,centWeight);
839 hPsiV0C->Fill(centralityPercentile,psiV0C,centWeight);
840 Double_t dphiEP = psiTPC-psiV0A;
841 if(dphiEP>TMath::Pi()) dphiEP-=2*TMath::Pi();
842 if(dphiEP<-TMath::Pi()) dphiEP+=2*TMath::Pi();
843 hCheckEPA->Fill(centralityPercentile,dphiEP,centWeight);
844 dphiEP = psiTPC-psiV0C;
845 if(dphiEP>TMath::Pi()) dphiEP-=2*TMath::Pi();
846 if(dphiEP<-TMath::Pi()) dphiEP+=2*TMath::Pi();
847 hCheckEPC->Fill(centralityPercentile,dphiEP,centWeight);
849 // values for EP shifting method
850 hShiftTPC->Fill(centralityPercentile,0.,cos(2*psiTPC)*centWeight);
851 hShiftTPC->Fill(centralityPercentile,1.,sin(2*psiTPC)*centWeight);
852 hShiftTPC->Fill(centralityPercentile,2.,cos(4*psiTPC)*centWeight);
853 hShiftTPC->Fill(centralityPercentile,3.,sin(4*psiTPC)*centWeight);
854 hShiftTPC->Fill(centralityPercentile,4.,cos(6*psiTPC)*centWeight);
855 hShiftTPC->Fill(centralityPercentile,5.,sin(6*psiTPC)*centWeight);
857 hShiftV0A->Fill(centralityPercentile,0.,cos(2*psiV0A)*centWeight);
858 hShiftV0A->Fill(centralityPercentile,1.,sin(2*psiV0A)*centWeight);
859 hShiftV0A->Fill(centralityPercentile,2.,cos(4*psiV0A)*centWeight);
860 hShiftV0A->Fill(centralityPercentile,3.,sin(4*psiV0A)*centWeight);
861 hShiftV0A->Fill(centralityPercentile,4.,cos(6*psiV0A)*centWeight);
862 hShiftV0A->Fill(centralityPercentile,5.,sin(6*psiV0A)*centWeight);
864 hShiftV0C->Fill(centralityPercentile,0.,cos(2*psiV0C)*centWeight);
865 hShiftV0C->Fill(centralityPercentile,1.,sin(2*psiV0C)*centWeight);
866 hShiftV0C->Fill(centralityPercentile,2.,cos(4*psiV0C)*centWeight);
867 hShiftV0C->Fill(centralityPercentile,3.,sin(4*psiV0C)*centWeight);
868 hShiftV0C->Fill(centralityPercentile,4.,cos(6*psiV0C)*centWeight);
869 hShiftV0C->Fill(centralityPercentile,5.,sin(6*psiV0C)*centWeight);
872 hcentq->Fill(qperc,centralityPercentile,centWeight);
874 nCountTracks += ntracks;
875 //cout << "Found " << ntracks << " pion tracks..." << endl;
877 hvzcent->Fill(zvtx,centralityPercentile,centWeight);
878 hcentUnweighted->Fill(centralityPercentile);
879 hcent->Fill(centralityPercentile,centWeight);
880 hcentn->Fill(centralityPercentile,ntracks,centWeight);
882 // resolution histograms
883 hresV0ATPC->Fill(centralityPercentile,cos(2*(psiV0A-psiTPC))*centWeight);
884 hresV0CTPC->Fill(centralityPercentile,cos(2*(psiV0C-psiTPC))*centWeight);
885 hresV0AV0C->Fill(centralityPercentile,cos(2*(psiV0A-psiV0C))*centWeight);
887 AliEventPool* poolPos = fPoolMgr[0]->GetEventPool(centralityPercentile,zvtx,psiEP);
888 if (!poolPos) AliFatal(Form("No pool found for centrality = %f, vz = %f, ep = %f", centralityPercentile, zvtx,psiEP));
889 //Printf("Positive pool found for centrality = %f, vz = %f, ep = %f with %i events in it", centralityPercentile, zvtx,psiEP,poolPos->GetCurrentNEvents());
890 AliEventPool* poolNeg = fPoolMgr[1]->GetEventPool(centralityPercentile,zvtx,psiEP);
891 if (!poolNeg) AliFatal(Form("No pool found for centrality = %f, vz = %f, ep = %f", centralityPercentile, zvtx,psiEP));
892 //Printf("Negative pool found for centrality = %f, vz = %f, ep = %f with %i events in it", centralityPercentile, zvtx,psiEP,poolNeg->GetCurrentNEvents());
894 TrackLoop(tracksPos,poolPos,0,psiEP,centralityPercentile);
895 TrackLoop(tracksNeg,poolNeg,1,psiEP,centralityPercentile);
896 //TObjArray* clonedtracks = CloneAndReduceTrackList(tracks,psiEP);
897 poolPos->UpdatePool(tracksPos);
898 poolNeg->UpdatePool(tracksNeg);
899 //cout << "pool contains " << pool->GetCurrentNEvents() << " events and " << pool->NTracksInPool() << " tracks." << endl;
904 //gSystem->GetProcInfo(&procInfo);
905 //Printf("end of event: ResMem %ld VMem %ld", procInfo.fMemResident, procInfo.fMemVirtual);
908 PostData(1, fOutputList);
909 PostData(2, fHelperPID);
910 PostData(3, fEventCuts);
911 PostData(4, fTrackCuts);
915 void AliAnalysisTaskFemtoESE::TrackLoop(TObjArray *tracks, AliEventPool *pool, Int_t z, Double_t psiEP, Float_t centralityPercentile)
917 // z=0 for positive charges, z=1 for negative charges
919 Double_t qout=0, qside=0, qlong=0;
920 Double_t pVect1[4] = {0,0,0,0};
921 Double_t pVect2[4] = {0,0,0,0};
922 Int_t k, e, c; //bin indices for histograms
924 Double_t centWeight = GetCentralityWeight(centralityPercentile);
926 Int_t ntracks = tracks->GetEntriesFast();
928 Int_t countMixedEvents = 0, countMixedTracks = 0;
931 for(Int_t j = 0; j < ntracks; j++)
933 //cout << endl << j << " ";
934 AliFemtoESEBasicParticle* track1 = (AliFemtoESEBasicParticle*)tracks->At(j);
935 pVect1[0]=track1->E();
936 pVect1[1]=track1->Px();
937 pVect1[2]=track1->Py();
938 pVect1[3]=track1->Pz();
939 //cout << pVect1[0] << " " << pVect1[1] << " " << pVect1[2] << " " << pVect1[3] << endl;
941 for(Int_t i = j+1; i < ntracks; i++)
943 AliFemtoESEBasicParticle* track2 = (AliFemtoESEBasicParticle*)tracks->At(i);
945 Double_t deltaphistar10 = DeltaPhiStar(track1,track2,1.0);
946 Double_t deltaphistar16 = DeltaPhiStar(track1,track2,1.6);
948 hphistaretapair10->Fill(deltaphistar10,track1->Eta()-track2->Eta(),kt);
949 hphistaretapair16->Fill(deltaphistar16,track1->Eta()-track2->Eta(),kt);
951 if(!PairCut(track1,track2,kFALSE)) continue;
953 hphistaretapair10a->Fill(deltaphistar10,track1->Eta()-track2->Eta(),kt);
954 hphistaretapair16a->Fill(deltaphistar16,track1->Eta()-track2->Eta(),kt);
955 hphistaretapair10b->Fill(deltaphistar10,track1->Eta()-track2->Eta(),kt);
956 hphistaretapair16b->Fill(deltaphistar16,track1->Eta()-track2->Eta(),kt);
958 pVect2[0]=track2->E();
959 pVect2[1]=track2->Px();
960 pVect2[2]=track2->Py();
961 pVect2[3]=track2->Pz();
963 //qinv = GetQinv(pVect1, pVect2); // = qinv**2 = (P1x-P2x)**2 + (P1y-P2y)**2 + (P1z-P2z)**2 - (P1t-P2t)**2
964 GetQosl(pVect1, pVect2, qout, qside, qlong); // qout, qside, qlong = components of Q=P1-P2 in the P=P1+P2 frame
965 kt = sqrt(pow(pVect1[1]+pVect2[1],2) + pow(pVect1[2]+pVect2[2],2))/2.; // = Kt = |pT1+pT2|/2
966 hkt->Fill(centralityPercentile,kt,centWeight);
967 hkt3->Fill(kt,track1->Pt(),track2->Pt());
968 Double_t deltaphi = GetDeltaPhiEP(pVect1[1],pVect1[2],pVect2[1],pVect2[2],psiEP); // angle to event plane in correct range
969 if(fabs(qout)<0.2 && fabs(qside)<0.2 && fabs(qlong)<0.2) nCountSamePairs++;
970 if(kt < ktBins[0] || kt > ktBins[nKtBins]) continue;
971 if(!FindBin(kt,deltaphi,centralityPercentile,k,e,c)) continue;
973 hq[z][k][e][c]->Fill(qout,qside,qlong,centWeight);
974 hqinv[z][k][e][c]->Fill(qout,qside,qlong,GetQinv(pVect1, pVect2)*centWeight);
975 hNpairs->Fill(deltaphi,centralityPercentile,kt);
976 hAvDphi->Fill(deltaphi,centralityPercentile,kt,deltaphi);
977 hPairDphi->Fill(deltaphi);
978 hqinvcheck->Fill(GetQinv(pVect1, pVect2),kt,centralityPercentile,centWeight);
979 Double_t dphi = track1->Phi()-track2->Phi();
980 if(dphi<-TMath::Pi()) dphi += 2*TMath::Pi();
981 if(dphi>TMath::Pi()) dphi -= 2*TMath::Pi();
982 hphietapair->Fill(dphi,track1->Eta()-track2->Eta(),kt);
983 hphietapair2->Fill(dphi,track1->Eta()-track2->Eta(),kt);
989 countMixedTracks = 0;
990 countMixedEvents = 0;
993 Int_t nMix = pool->GetCurrentNEvents();
995 for (Int_t jMix=0; jMix<nMix; jMix++) // loop over events in pool
997 TObjArray* bgTracks = pool->GetEvent(jMix);
998 Int_t ntracksmix = bgTracks->GetEntriesFast();
999 if(ntracksmix <= 0) continue;
1001 // compare event planes of two events
1002 AliFemtoESEBasicParticle* tracktest = (AliFemtoESEBasicParticle*)bgTracks->UncheckedAt(0);
1003 Double_t psiEPmixtemp = tracktest->GetPsiEP();
1004 /*Double_t dphiEPtest = fPsiEPmixtemp-psiEP;
1005 while(dphiEPtest>2*TMath::Pi()) dphiEPtest-=2*TMath::Pi();
1006 while(dphiEPtest<0) dphiEPtest+=2*TMath::Pi();
1007 if(dphiEPtest>TMath::Pi()) dphiEPtest-=TMath::Pi();
1008 if(dphiEPtest>TMath::Pi()/2.) dphiEPtest = TMath::Pi()-dphiEPtest;
1009 if(dphiEPtest > TMath::Pi()/6.) continue; // event planes must be within pi/6
1012 Double_t psiEPmix = 0.5*atan2(sin(2*psiEP)+sin(2*psiEPmixtemp),cos(2*psiEP)+cos(2*psiEPmixtemp));
1013 hPsiMix->Fill(centralityPercentile,psiEPmix,centWeight);
1015 Double_t dphimix = psiEP-psiEPmix;
1016 if(dphimix < -TMath::Pi()) dphimix += 2*TMath::Pi();
1017 if(dphimix > TMath::Pi()) dphimix -= 2*TMath::Pi();
1018 Double_t dphi12 = psiEP-psiEPmixtemp;
1019 if(dphi12 < -TMath::Pi()) dphi12 += 2*TMath::Pi();
1020 if(dphi12 > TMath::Pi()) dphi12 -= 2*TMath::Pi();
1021 hCheckEPmix->Fill(dphimix,dphi12);
1023 countMixedTracks += ntracksmix;
1024 countMixedEvents += 1;
1026 for(Int_t j = 0; j < ntracks; j++)
1028 //cout << endl << j << " ";
1029 AliFemtoESEBasicParticle* track1 = (AliFemtoESEBasicParticle*)tracks->At(j);
1030 pVect1[0]=track1->E();
1031 pVect1[1]=track1->Px();
1032 pVect1[2]=track1->Py();
1033 pVect1[3]=track1->Pz();
1035 for(Int_t i = 0; i < ntracksmix; i++)
1037 AliFemtoESEBasicParticle* track2 = (AliFemtoESEBasicParticle*)bgTracks->UncheckedAt(i);
1039 if(!PairCut(track1,track2,kTRUE)) continue;
1041 pVect2[0]=track2->E();
1042 pVect2[1]=track2->Px();
1043 pVect2[2]=track2->Py();
1044 pVect2[3]=track2->Pz();
1046 if(psiEPmixtemp != track2->GetPsiEP()) AliFatal("Error! Event plane angles are wrong in mixing!!");
1048 //qinv = GetQinv(pVect1, pVect2); // qinv**2 = (P1x-P2x)**2 + (P1y-P2y)**2 + (P1z-P2z)**2 - (P1t-P2t)**2
1049 GetQosl(pVect1, pVect2, qout, qside, qlong); // qout, qside, qlong = components of Q=P1-P2 in the P=P1+P2 frame
1050 kt = sqrt(pow(pVect1[1]+pVect2[1],2) + pow(pVect1[2]+pVect2[2],2))/2.; // = Kt = |pT1+pT2|/2
1051 Double_t deltaphi = GetDeltaPhiEP(pVect1[1],pVect1[2],pVect2[1],pVect2[2],psiEPmix); // angle to event plane in correct range
1053 //Double_t weight = 1./(Double_t)nMix;
1054 if(fabs(qout)<0.2 && fabs(qside)<0.2 && fabs(qlong)<0.2) nCountMixedPairs++;
1055 if(kt < ktBins[0] || kt > ktBins[nKtBins]) continue;
1056 if(!FindBin(kt,deltaphi,centralityPercentile,k,e,c)) continue;
1057 hqmix[z][k][e][c]->Fill(qout,qside,qlong,centWeight);
1059 hPairDphiMix->Fill(deltaphi);
1066 hMixedDistTracks->Fill(centralityPercentile, countMixedTracks);
1067 hMixedDistEvents->Fill(centralityPercentile, countMixedEvents);
1068 //Printf("mixed tracks: %i mixed events: %i",countMixedTracks,countMixedEvents);
1075 //________________________________________________________________________
1076 void AliAnalysisTaskFemtoESE::Terminate(Option_t *)
1079 if(ktBins) delete [] ktBins;
1080 if(epBins) delete [] epBins;
1081 if(centBins) delete [] centBins;
1082 if(vzBins) delete [] vzBins;
1083 if(qPercBinsLHC11h) delete [] qPercBinsLHC11h;
1085 // Called once at the end of the query
1094 //________________________________________________________________________
1095 Bool_t AliAnalysisTaskFemtoESE::AcceptPair(AliChaoticityTrackStruct *first, AliChaoticityTrackStruct *second)
1098 if(fabs(first->fEta-second->fEta) > fMinSepPairEta) return kTRUE;
1100 // propagate through B field to r=1m
1101 Float_t phi1 = first->fPhi - asin(first->fCharge*(0.1*fBfield)*0.15/first->fPt);// 0.15 for D=1m
1102 if(phi1 > 2*PI) phi1 -= 2*PI;
1103 if(phi1 < 0) phi1 += 2*PI;
1104 Float_t phi2 = second->fPhi - asin(second->fCharge*(0.1*fBfield)*0.15/second->fPt);// 0.15 for D=1m
1105 if(phi2 > 2*PI) phi2 -= 2*PI;
1106 if(phi2 < 0) phi2 += 2*PI;
1108 Float_t deltaphi = phi1 - phi2;
1109 if(deltaphi > PI) deltaphi -= 2*PI;
1110 if(deltaphi < -PI) deltaphi += 2*PI;
1111 deltaphi = fabs(deltaphi);
1113 if(deltaphi < fMinSepPairPhi) return kFALSE;// Min Separation
1116 // propagate through B field to r=1.6m
1117 phi1 = first->fPhi - asin(first->fCharge*(0.1*fBfield)*0.24/first->fPt);// mine. 0.24 for D=1.6m
1118 if(phi1 > 2*PI) phi1 -= 2*PI;
1119 if(phi1 < 0) phi1 += 2*PI;
1120 phi2 = second->fPhi - asin(second->fCharge*(0.1*fBfield)*0.24/second->fPt);// mine. 0.24 for D=1.6m
1121 if(phi2 > 2*PI) phi2 -= 2*PI;
1122 if(phi2 < 0) phi2 += 2*PI;
1124 deltaphi = phi1 - phi2;
1125 if(deltaphi > PI) deltaphi -= 2*PI;
1126 if(deltaphi < -PI) deltaphi += 2*PI;
1127 deltaphi = fabs(deltaphi);
1129 if(deltaphi < fMinSepPairPhi) return kFALSE;// Min Separation
1135 Int_t ncl1 = first->fClusterMap.GetNbits();
1136 Int_t ncl2 = second->fClusterMap.GetNbits();
1137 Int_t sumCls = 0; Int_t sumSha = 0; Int_t sumQ = 0;
1138 Double_t shfrac = 0; Double_t qfactor = 0;
1139 for(Int_t imap = 0; imap < ncl1 && imap < ncl2; imap++) {
1140 if (first->fClusterMap.TestBitNumber(imap) && second->fClusterMap.TestBitNumber(imap)) {// Both clusters
1141 if (first->fSharedMap.TestBitNumber(imap) && second->fSharedMap.TestBitNumber(imap)) { // Shared
1145 else {sumQ--; sumCls+=2;}
1147 else if (first->fClusterMap.TestBitNumber(imap) || second->fClusterMap.TestBitNumber(imap)) {// Non shared
1152 qfactor = sumQ*1.0/sumCls;
1153 shfrac = sumSha*1.0/sumCls;
1156 if(qfactor > fShareQuality || shfrac > fShareFraction) return kFALSE;
1163 //________________________________________________________________________
1164 Float_t AliAnalysisTaskFemtoESE::GamovFactor(Int_t chargeBin1, Int_t chargeBin2, Float_t qinv)
1166 Float_t arg = G_Coeff/qinv;
1168 if(chargeBin1==chargeBin2) return (exp(arg)-1)/(arg);
1169 else {return (exp(-arg)-1)/(-arg);}
1172 //________________________________________________________________________
1173 void AliAnalysisTaskFemtoESE::Shuffle(Int_t *iarr, Int_t i1, Int_t i2)
1177 for (Int_t i = i1; i < i2+1; i++) {
1178 j = (Int_t) (gRandom->Rndm() * a);
1185 //________________________________________________________________________
1186 Double_t AliAnalysisTaskFemtoESE::GetQinv(Double_t track1[], Double_t track2[]){
1189 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.);
1190 if(qinv2 >= 0.) return sqrt(qinv2);
1191 else return -1.*sqrt(-1.*qinv2);
1194 //________________________________________________________________________
1195 void AliAnalysisTaskFemtoESE::GetQosl(Double_t track1[], Double_t track2[], Double_t& qout, Double_t& qside, Double_t& qlong){
1197 Double_t p0 = track1[0] + track2[0];
1198 Double_t px = track1[1] + track2[1];
1199 Double_t py = track1[2] + track2[2];
1200 Double_t pz = track1[3] + track2[3];
1202 Double_t mt = sqrt(p0*p0 - pz*pz);
1203 Double_t pt = sqrt(px*px + py*py);
1205 Double_t v0 = track1[0] - track2[0];
1206 Double_t vx = track1[1] - track2[1];
1207 Double_t vy = track1[2] - track2[2];
1208 Double_t vz = track1[3] - track2[3];
1210 if(gRandom->Rndm()<0.5)
1218 //cout << p0 << " " << px << " " << py << " " << pz << " " << v0 << " " << vx << " " << vy << " " << vz << " " << mt << " " << pt << endl;
1220 qout = (px*vx + py*vy)/pt;
1221 qside = (px*vy - py*vx)/pt;
1222 qlong = (p0*vz - pz*v0)/mt;
1225 //________________________________________________________________________
1226 Bool_t AliAnalysisTaskFemtoESE::EventCut(/*AliAODEvent* fevent*/){
1230 Bool_t isSelected1 = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kMB);
1231 Bool_t isSelected2 = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kCentral);
1232 Bool_t isSelected3 = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kSemiCentral);
1233 if(!isSelected1 && !isSelected2 && !isSelected3) {return kFALSE;}
1236 // Pile-up rejection
1237 AliAnalysisUtils *AnaUtil=new AliAnalysisUtils();
1238 if(!fPbPbcase) AnaUtil->SetUseMVPlpSelection(kTRUE);// use Multi-Vertex tool for pp and pPb
1239 else AnaUtil->SetUseMVPlpSelection(kFALSE);
1240 Bool_t pileUpCase=AnaUtil->IsPileUpEvent(fAOD);
1241 if(pileUpCase) return;
1244 primaryVertexAOD = fAOD->GetPrimaryVertex();
1245 vertex[0]=primaryVertexAOD->GetX(); vertex[1]=primaryVertexAOD->GetY(); vertex[2]=primaryVertexAOD->GetZ();
1247 if(fabs(vertex[2]) > 10) {cout<<"Zvertex Out of Range. Skip Event"<<endl; return;} // Z-Vertex Cut
1248 ((TH3D*)fOutputList->FindObject("fVertexDist"))->Fill(vertex[0], vertex[1], vertex[2]);
1250 for (Int_t i = 0; i < fAOD->GetNumberOfTracks(); i++) {
1251 AliAODTrack* aodtrack = fAOD->GetTrack(i);
1252 if (!aodtrack) continue;
1254 if(!aodtrack->TestFilterBit(BIT(fFilterBit))) continue;// AOD filterBit cut
1257 ((TH1D*)fOutputList->FindObject("fMultDist2"))->Fill(FBTracks);
1259 //if(fAOD->IsPileupFromSPD()) {cout<<"PileUpEvent. Skip Event"<<endl; return;} // Old Pile-up cut
1260 if(primaryVertexAOD->GetNContributors() < 1) {cout<<"Bad Vertex. Skip Event"<<endl; return;}
1262 ((TH1D*)fOutputList->FindObject("fMultDist3"))->Fill(FBTracks);
1264 fBfield = fAOD->GetMagneticField();
1266 for(Int_t i=0; i<fZvertexBins; i++){
1267 if( (vertex[2] >= zstart+i*zstep) && (vertex[2] < zstart+(i+1)*zstep) ){
1278 //________________________________________________________________________
1279 Bool_t AliAnalysisTaskFemtoESE::TrackCut(AliAODTrack* ftrack){
1281 if (!ftrack->TestFilterBit(fFilterBit)) return kFALSE;
1283 if(ftrack->Pt() < 0.14) return kFALSE;
1284 if(ftrack->Pt() > 1.5) return kFALSE;
1285 if(fabs(ftrack->Eta()) > 0.8) return kFALSE;
1287 if(ftrack->GetTPCNcls() < 80) return kFALSE;// TPC nCluster cut
1289 Double_t trackdca[3] = {ftrack->XAtDCA(),ftrack->YAtDCA(),ftrack->ZAtDCA()};
1290 //ftrack->XYZAtDCA(trackdca);
1291 //Double_t dcaxy = sqrt( pow(trackpos[0] - vertex[0],2) + pow(trackpos[1] - vertex[1],2));
1292 //Double_t dcaz = sqrt( pow(trackpos[2] - vertex[2],2));
1293 hdcaxy->Fill(trackdca[0],trackdca[1]);
1294 hdcaz->Fill(trackdca[2]);
1295 //if(dcaxy > 0.2) return kFALSE;
1296 //if(dcaz > 0.15) return kFALSE;
1299 //// FilterBit Overlap Check
1300 //if(fFilterBit != 7){
1301 // Bool_t goodTrackOtherFB = kFALSE;
1302 // if(fMCcase && fAOD->GetRunNumber()<=126437) goodTrackOtherFB=kTRUE;// FB7 to FB5 mapping in 10f6a MC does not work
1304 // for (Int_t j = 0; j < fAOD->GetNumberOfTracks(); j++) {
1305 // AliAODTrack* aodtrack2 = fAOD->GetTrack(randomIndex[j]);
1306 // if(!aodtrack2) continue;
1307 // if(!aodtrack2->TestFilterBit(BIT(fFilterBit))) continue;
1309 // if(-(aodtrack->GetID()+1)==aodtrack2->GetID()) {goodTrackOtherFB=kTRUE; break;}
1312 // if(!goodTrackOtherFB) continue;
1319 //________________________________________________________________________
1320 Bool_t AliAnalysisTaskFemtoESE::PairCut(AliFemtoESEBasicParticle* ftrack1, AliFemtoESEBasicParticle* ftrack2, Bool_t mix){
1322 // check for same charge
1323 if(ftrack2->Charge() != ftrack1->Charge()) return kFALSE;
1326 Double_t trackvec1[4] = {ftrack1->E(),ftrack1->Px(),ftrack1->Py(),ftrack1->Pz()};
1327 Double_t trackvec2[4] = {ftrack2->E(),ftrack2->Px(),ftrack2->Py(),ftrack2->Pz()};
1328 Double_t qinv = GetQinv(trackvec1,trackvec2);
1329 if(qinv < 0.005) return kFALSE; // qinv < 0.005
1331 // deltaEta x deltaPhi* cut
1332 if(fabs(ftrack1->Eta()-ftrack2->Eta()) < fMinSepPairEta)
1334 Double_t deltaphistar = DeltaPhiStar(ftrack1,ftrack2,1.0); // angular separation at r=1m
1335 deltaphistar = fabs(deltaphistar);
1336 if(deltaphistar < fMinSepPairPhi) return kFALSE;
1337 deltaphistar = DeltaPhiStar(ftrack1,ftrack2,1.6); // angular separation at r=1.6m
1338 deltaphistar = fabs(deltaphistar);
1339 if(deltaphistar < fMinSepPairPhi) return kFALSE;
1342 // share fraction & share quality cut
1343 TBits clusterMap1 = (TBits)(ftrack1->GetTPCClusterMap());
1344 TBits sharedMap1 = (TBits)(ftrack1->GetTPCSharedMap());
1345 TBits clusterMap2 = (TBits)(ftrack2->GetTPCClusterMap());
1346 TBits sharedMap2 = (TBits)(ftrack2->GetTPCSharedMap());
1348 Int_t ncl1 = clusterMap1.GetNbits();
1349 Int_t ncl2 = clusterMap2.GetNbits();
1350 Int_t sumCls = 0; Int_t sumSha = 0; Int_t sumQ = 0;
1351 Double_t shfrac = 0; Double_t qfactor = 0;
1352 for(Int_t imap = 0; imap < ncl1 && imap < ncl2; imap++)
1354 if (clusterMap1.TestBitNumber(imap) && clusterMap2.TestBitNumber(imap)) // Both clusters
1356 if (sharedMap1.TestBitNumber(imap) && sharedMap2.TestBitNumber(imap)) // Shared
1361 else {sumQ--; sumCls+=2;}
1363 else if (clusterMap1.TestBitNumber(imap) || clusterMap2.TestBitNumber(imap)) // Non shared
1371 qfactor = sumQ*1.0/sumCls;
1372 shfrac = sumSha*1.0/sumCls;
1375 // sumCls -- number of clusters in track 1 + number of clusters in track 2 (clusters in both tracks counted twice)
1376 // sumSha -- number of shared clusters (counted twice)
1381 hsharequal->Fill(qfactor);
1382 hsharefrac->Fill(shfrac);
1386 hsharequalmix->Fill(qfactor);
1387 hsharefracmix->Fill(shfrac);
1391 if(qfactor > fShareQuality || shfrac > fShareFraction) return kFALSE;
1396 Double_t AliAnalysisTaskFemtoESE::DeltaPhiStar(AliAODTrack* ftrack1, AliAODTrack* ftrack2, Double_t r)
1398 Double_t phi1 = ftrack1->Phi() - asin(0.3*ftrack1->Charge()*(0.1*fBfield)*r/(2.*ftrack1->Pt())); // magnetic field converted from kilogauss to tesla
1399 Double_t phi2 = ftrack2->Phi() - asin(0.3*ftrack2->Charge()*(0.1*fBfield)*r/(2.*ftrack2->Pt()));
1401 Double_t deltaphi = phi1 - phi2;
1402 while(deltaphi > TMath::Pi()) deltaphi -= 2*TMath::Pi();
1403 while(deltaphi < -TMath::Pi()) deltaphi += 2*TMath::Pi();
1408 /*TObjArray* AliAnalysisTaskFemtoESE::CloneAndReduceTrackList(TObjArray* tracks, Double_t psi)
1410 // clones a track list by using AliDPhiBasicParticle which uses much less memory (used for event mixing)
1412 TObjArray* tracksClone = new TObjArray;
1413 tracksClone->SetOwner(kTRUE);
1415 for (Int_t i=0; i<tracks->GetEntriesFast(); i++)
1417 AliAODTrack* particle = (AliAODTrack*) tracks->UncheckedAt(i);
1418 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());
1419 copy->SetPsiEP(psi);
1420 copy->SetTPCClusterMap(particle->GetTPCClusterMap());
1421 copy->SetTPCSharedMap(particle->GetTPCSharedMap());
1423 tracksClone->Add(copy);
1429 Double_t AliAnalysisTaskFemtoESE::GetDeltaPhiEP(Double_t px1, Double_t py1, Double_t px2, Double_t py2, Double_t psi)
1432 Double_t px = px1+px2;
1433 Double_t py = py1+py2;
1434 Double_t phi = atan2(py,px);
1436 Double_t dphi = phi-psi;
1437 while(dphi < epBins[0]) dphi += 2*TMath::Pi();
1438 while(dphi > epBins[nEPBins]) dphi -= 2*TMath::Pi();
1443 Bool_t AliAnalysisTaskFemtoESE::FindBin(Double_t kt, Double_t phi, Double_t cent, Int_t& a, Int_t& b, Int_t&c)
1446 for(Int_t i = 0; i < nKtBins; i++)
1448 if(kt >= ktBins[i] && kt < ktBins[i+1])
1454 if(a==-1) return kFALSE;
1456 for(Int_t i = 0; i < nEPBins; i++)
1458 if(phi >= epBins[i] && phi < epBins[i+1])
1464 if(b==-1) return kFALSE;
1466 for(Int_t i = 0; i < nCentBins; i++)
1468 if(cent >= centBins[i] && cent < centBins[i+1])
1474 if(c==-1) return kFALSE;
1481 void AliAnalysisTaskFemtoESE::SetKtBins(Int_t n, Double_t* bins)
1483 if(ktBins) delete [] ktBins;
1486 ktBins = new Double_t[nKtBins+1];
1487 for(Int_t i = 0; i < nKtBins+1; i++)
1489 Printf("Setting %i kt bins: ",nKtBins);
1490 for(Int_t i = 0; i < nKtBins+1; i++) Printf("%lf",ktBins[i]);
1492 void AliAnalysisTaskFemtoESE::SetCentBins(Int_t n, Double_t* bins)
1494 if(centBins) delete [] centBins;
1497 centBins = new Double_t[nCentBins+1];
1498 for(Int_t i = 0; i < nCentBins+1; i++)
1499 centBins[i]=bins[i];
1500 Printf("Setting %i centrality bins: ",nCentBins);
1501 for(Int_t i = 0; i < nCentBins+1; i++) Printf("%lf",centBins[i]);
1503 void AliAnalysisTaskFemtoESE::SetVzBins(Int_t n, Double_t* bins)
1505 if(vzBins) delete [] vzBins;
1508 vzBins = new Double_t[nVzBins+1];
1509 for(Int_t i = 0; i < nVzBins+1; i++)
1511 Printf("Setting %i vz bins: ",nVzBins);
1512 for(Int_t i = 0; i < nVzBins+1; i++) Printf("%lf",vzBins[i]);
1514 void AliAnalysisTaskFemtoESE::SetEPBins(Int_t n, Double_t min, Double_t max)
1516 if(epBins) delete [] epBins;
1519 epBins = new Double_t[nEPBins+1];
1520 for(Int_t y = 0; y < nEPBins+1; y++)
1521 epBins[y] = min+((max-min)/(Double_t)n)*((Double_t)y);
1522 Printf("Setting %i EP bins: ",nEPBins);
1523 for(Int_t i = 0; i < nEPBins+1; i++) Printf("%lf",epBins[i]);
1526 Double_t AliAnalysisTaskFemtoESE::GetQPercLHC11h(Double_t qvec)
1528 // preliminary attemp at calculating qvector percentile in LHC11h -- still very approximate and only works in 5% bins
1529 if(!qPercBinsLHC11h)
1531 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};
1532 nqPercBinsLHC11h = 21;
1533 qPercBinsLHC11h = new Double_t[nqPercBinsLHC11h];
1534 for(Int_t n = 0; n < nqPercBinsLHC11h; n++) qPercBinsLHC11h[n] = tempArray[n];
1537 for(Int_t t = 0; t < nqPercBinsLHC11h-1; t++)
1538 if(qvec > qPercBinsLHC11h[t] && qvec < qPercBinsLHC11h[t+1]) return 50.*(2*t+1)/(Double_t)(nqPercBinsLHC11h-1);
1540 if(qvec < qPercBinsLHC11h[0]) return 0.0;
1541 if(qvec > qPercBinsLHC11h[nqPercBinsLHC11h-1]) return 100.0;
1547 /*Double_t AliAnalysisTaskFemtoESE::GetCentralityWeight(Double_t cent)
1550 // use makeCentWeighting.C to fit centrality distribution to obtain this parameterization
1551 Double_t par1 = 2.60629;
1552 Double_t par2 = 0.579333;
1553 Double_t limit1 = 8.71488;
1554 Double_t limit2 = 12.0126;
1556 if(cent < limit1) return 1./par1;
1557 if(cent > limit2) return 1./par2;
1559 Double_t slope = (par2-par1)/(limit2-limit1);
1560 Double_t b = par1-slope*limit1;
1562 return 1./(slope*cent+b);
1565 Double_t AliAnalysisTaskFemtoESE::GetCentralityWeight(Double_t cent)
1568 // use makeCentWeighting.C to fit centrality distribution to obtain this parameterization
1569 Double_t par1 = 2.60629;
1570 Double_t par2 = 0.579333;
1571 Double_t limit1 = 8.71488;
1572 Double_t limit2 = 12.0126;
1574 if(cent < limit1) return 1.;
1575 if(cent > limit2) return 1.;
1577 Double_t slope = (par2-par1)/(limit2-limit1);
1578 Double_t b = par1-slope*limit1;
1581 return par1/(slope*cent+b);
1583 return par2/(slope*cent+b);