#include <TList.h>
#include <TH1F.h>
#include <TH2F.h>
+#include <THnSparse.h>
#include <TProfile.h>
#include <TFile.h>
#include <TObjString.h>
#include "AliPhysicsSelection.h"
#include "AliBackgroundSelection.h"
#include "AliESDUtils.h"
-
+#include "AliOADBContainer.h"
+#include "AliAODMCHeader.h"
+#include "AliAODTrack.h"
+#include "AliVTrack.h"
#include "AliEventplane.h"
+using std::cout;
+using std::endl;
ClassImp(AliEPSelectionTask)
//________________________________________________________________________
AliEPSelectionTask::AliEPSelectionTask():
AliAnalysisTaskSE(),
- fDebug(0),
fAnalysisInput("ESD"),
- fStatus("TPC"),
+ fTrackType("TPC"),
+ fPeriod(""),
fUseMCRP(kFALSE),
fUsePhiWeight(kFALSE),
fUsePtWeight(kFALSE),
fSaveTrackContribution(kFALSE),
+ fUserphidist(kFALSE),
+ fUsercuts(kFALSE),
+ fRunNumber(-15),
+ fAODfilterbit(1),
+ fEtaGap(0.),
+ fSplitMethod(0),
fESDtrackCuts(0),
- ftracklist(0),
- fPhiDist(0),
+ fEPContainer(0),
+ fSparseDist(0),
+ fHruns(0),
fQVector(0),
fQContributionX(0),
fQContributionY(0),
{
// Default constructor
AliInfo("Event Plane Selection enabled.");
+ for(Int_t i = 0; i < 4; ++i) {
+ fPhiDist[i] = 0;
+ }
}
//________________________________________________________________________
AliEPSelectionTask::AliEPSelectionTask(const char *name):
AliAnalysisTaskSE(name),
- fDebug(0),
fAnalysisInput("ESD"),
- fStatus("TPC"),
+ fTrackType("TPC"),
+ fPeriod(""),
fUseMCRP(kFALSE),
fUsePhiWeight(kFALSE),
fUsePtWeight(kFALSE),
fSaveTrackContribution(kFALSE),
+ fUserphidist(kFALSE),
+ fUsercuts(kFALSE),
+ fRunNumber(-15),
+ fAODfilterbit(1),
+ fEtaGap(0.),
+ fSplitMethod(0),
fESDtrackCuts(0),
- ftracklist(0),
- fPhiDist(0),
+ fEPContainer(0),
+ fSparseDist(0),
+ fHruns(0),
fQVector(0),
fQContributionX(0),
fQContributionY(0),
// Default constructor
AliInfo("Event Plane Selection enabled.");
DefineOutput(1, TList::Class());
+ for(Int_t i = 0; i < 4; i++) {
+ fPhiDist[i] = 0;
+ }
}
//________________________________________________________________________
delete fESDtrackCuts;
fESDtrackCuts = 0;
}
- if (fQVector){
- delete fQVector;
- fQVector = 0;
+ if (fUserphidist) {
+ if (fPhiDist[0]) {
+ delete fPhiDist[0];
+ fPhiDist[0] = 0;
+ }
}
- if (fQsub1){
- delete fQsub1;
- fQsub1 = 0;
+ if (fEPContainer){
+ delete fEPContainer;
+ fEPContainer = 0;
}
- if (fQsub2){
- delete fQsub2;
- fQsub2 = 0;
+ if (fPeriod.CompareTo("LHC11h")==0){
+ for(Int_t i = 0; i < 4; i++) {
+ if(fPhiDist[i]){
+ delete fPhiDist[i];
+ fPhiDist[i] = 0;
+ }
+ }
+ if(fHruns) delete fHruns;
}
}
fOutputList->Add(fHOutDiff);
PostData(1, fOutputList);
+
+
}
//________________________________________________________________________
{
// Execute analysis for current event:
if (fDebug>1) printf(" **** AliEPSelectionTask::UserExec() \n");
+
+// fRunNumber = -15;
- AliEventplane* esdEP = 0;
- TVector2 QQ1;
- TVector2 QQ2;
- Double_t fRP = 0.; // the monte carlo reaction plane angle
+ AliEventplane *esdEP;
+ TVector2 qq1;
+ TVector2 qq2;
+ Double_t fRP = 0.; // monte carlo reaction plane angle
if (fAnalysisInput.CompareTo("ESD")==0){
-
+
AliVEvent* event = InputEvent();
AliESDEvent* esd = dynamic_cast<AliESDEvent*>(event);
-
- if (fUseMCRP) {
- AliMCEvent* mcEvent = MCEvent();
- if (mcEvent && mcEvent->GenEventHeader()) {
- AliGenHijingEventHeader* headerH = dynamic_cast<AliGenHijingEventHeader*>(mcEvent->GenEventHeader());
- fRP = headerH->ReactionPlaneAngle();
+ if (esd){
+ if (!(fRunNumber == esd->GetRunNumber())) {
+ fRunNumber = esd->GetRunNumber();
+ AliInfo(Form("Changing Phi-distribution to run %d",fRunNumber));
+ SetOADBandPeriod();
+ SetPhiDist();
}
- }
- if (esd){
+
+
+ if (fUseMCRP) {
+ AliMCEvent* mcEvent = MCEvent();
+ if (mcEvent && mcEvent->GenEventHeader()) {
+ AliGenHijingEventHeader* headerH = dynamic_cast<AliGenHijingEventHeader*>(mcEvent->GenEventHeader());
+ if (headerH) fRP = headerH->ReactionPlaneAngle();
+ }
+ }
+
esdEP = esd->GetEventplane();
if (fSaveTrackContribution) {
esdEP->GetQContributionXArray()->Set(esd->GetNumberOfTracks());
esdEP->GetQContributionYArray()->Set(esd->GetNumberOfTracks());
+ esdEP->GetQContributionXArraysub1()->Set(esd->GetNumberOfTracks());
+ esdEP->GetQContributionYArraysub1()->Set(esd->GetNumberOfTracks());
+ esdEP->GetQContributionXArraysub2()->Set(esd->GetNumberOfTracks());
+ esdEP->GetQContributionYArraysub2()->Set(esd->GetNumberOfTracks());
}
- if (fStatus.CompareTo("GLOBAL")==0) ftracklist = fESDtrackCuts->GetAcceptedTracks(esd,kFALSE);
- if (fStatus.CompareTo("TPC")==0) ftracklist = fESDtrackCuts->GetAcceptedTracks(esd,kTRUE);
- const int NT = ftracklist->GetEntries();
+ TObjArray* tracklist = new TObjArray;
+ if (fTrackType.CompareTo("GLOBAL")==0) tracklist = fESDtrackCuts->GetAcceptedTracks(esd,kFALSE);
+ if (fTrackType.CompareTo("TPC")==0 && fPeriod.CompareTo("LHC10h")==0) tracklist = fESDtrackCuts->GetAcceptedTracks(esd,kTRUE);
+ else if (fTrackType.CompareTo("TPC")==0 && fPeriod.CompareTo("LHC11h")==0) tracklist = GetTracksForLHC11h(esd);
+ const int nt = tracklist->GetEntries();
- if (NT>4){
- fQVector = new TVector2(GetQ(esdEP,ftracklist));
+ if (nt>4){
+ fQVector = new TVector2(GetQ(esdEP,tracklist));
fEventplaneQ = fQVector->Phi()/2;
- GetQsub(QQ1, QQ2, ftracklist);
- fQsub1 = new TVector2(QQ1);
- fQsub2 = new TVector2(QQ2);
+ GetQsub(qq1, qq2, tracklist, esdEP);
+ fQsub1 = new TVector2(qq1);
+ fQsub2 = new TVector2(qq2);
fQsubRes = (fQsub1->Phi()/2 - fQsub2->Phi()/2);
+
esdEP->SetQVector(fQVector);
esdEP->SetEventplaneQ(fEventplaneQ);
esdEP->SetQsub(fQsub1,fQsub2);
fHOutEventplaneQ->Fill(fEventplaneQ);
fHOutsub1sub2->Fill(fQsub1->Phi()/2,fQsub2->Phi()/2);
- fHOutNTEPRes->Fill(NT,fQsubRes);
+ fHOutNTEPRes->Fill(nt,fQsubRes);
if (fUseMCRP) fHOutDiff->Fill(fEventplaneQ, fRP);
- for (int iter = 0; iter<NT;iter++){
- AliESDtrack* track = dynamic_cast<AliESDtrack*> (ftracklist->At(iter));
- float delta = track->Phi()-fEventplaneQ;
- while (delta < 0) delta += TMath::Pi();
- while (delta > TMath::Pi()) delta -= TMath::Pi();
- fHOutPTPsi->Fill(track->Pt(),delta);
- fHOutPhi->Fill(track->Phi());
- fHOutPhiCorr->Fill(track->Phi(),GetPhiWeight(track));
+ for (int iter = 0; iter<nt;iter++){
+ AliESDtrack* track = dynamic_cast<AliESDtrack*> (tracklist->At(iter));
+ if (track) {
+ float delta = track->Phi()-fEventplaneQ;
+ while (delta < 0) delta += TMath::Pi();
+ while (delta > TMath::Pi()) delta -= TMath::Pi();
+ fHOutPTPsi->Fill(track->Pt(),delta);
+ fHOutPhi->Fill(track->Phi());
+ fHOutPhiCorr->Fill(track->Phi(),GetPhiWeight(track));
+ }
}
AliESDtrack* trmax = esd->GetTrack(0);
- for (int iter = 1; iter<NT;iter++){
- AliESDtrack* track = dynamic_cast<AliESDtrack*> (ftracklist->At(iter));
- if (track->Pt() > trmax->Pt()) trmax = track;
+ for (int iter = 1; iter<nt;iter++){
+ AliESDtrack* track = dynamic_cast<AliESDtrack*> (tracklist->At(iter));
+ if (track && (track->Pt() > trmax->Pt())) trmax = track;
}
fHOutleadPTPsi->Fill(trmax->Phi(),fEventplaneQ);
}
- delete ftracklist;
+ tracklist->Clear();
+ delete tracklist;
+ tracklist = 0;
}
}
- else if (fAnalysisInput.CompareTo("AOD")==0){
- //AliAODEvent *aod = dynamic_cast<AliAODEvent*> (InputEvent());
- // to be implemented
- printf(" AOD analysis not yet implemented!!!\n\n");
- return;
+ else if (fAnalysisInput.CompareTo("AOD")==0){
+ AliVEvent* event = InputEvent();
+ AliAODEvent* aod = dynamic_cast<AliAODEvent*>(event);
+
+ if (aod){
+ if (!(fRunNumber == aod->GetRunNumber())) {
+ fRunNumber = aod->GetRunNumber();
+ AliInfo(Form("Changing Phi-distribution to run %d",fRunNumber));
+ SetOADBandPeriod();
+ SetPhiDist();
+ }
+
+ if (fUseMCRP) {
+ AliAODMCHeader *headerH = dynamic_cast<AliAODMCHeader*>(aod->GetList()->FindObject(AliAODMCHeader::StdBranchName()));
+ if (headerH) fRP = headerH->GetReactionPlaneAngle();
+ }
+
+ esdEP = aod->GetHeader()->GetEventplaneP();
+ if(!esdEP) return; // protection against missing EP branch (nanoAODs)
+ esdEP->Reset();
+
+ Int_t maxID = 0;
+ TObjArray* tracklist = GetAODTracksAndMaxID(aod,maxID);
+
+ if (fSaveTrackContribution) {
+ esdEP->GetQContributionXArray()->Set(maxID+1);
+ esdEP->GetQContributionYArray()->Set(maxID+1);
+ esdEP->GetQContributionXArraysub1()->Set(maxID+1);
+ esdEP->GetQContributionYArraysub1()->Set(maxID+1);
+ esdEP->GetQContributionXArraysub2()->Set(maxID+1);
+ esdEP->GetQContributionYArraysub2()->Set(maxID+1);
+ }
+
+ const int NT = tracklist->GetEntries();
+
+ if (NT>4){
+ fQVector = new TVector2(GetQ(esdEP,tracklist));
+ fEventplaneQ = fQVector->Phi()/2.;
+ GetQsub(qq1, qq2, tracklist, esdEP);
+ fQsub1 = new TVector2(qq1);
+ fQsub2 = new TVector2(qq2);
+ fQsubRes = (fQsub1->Phi()/2. - fQsub2->Phi()/2.);
+
+ esdEP->SetQVector(fQVector);
+ esdEP->SetEventplaneQ(fEventplaneQ);
+ esdEP->SetQsub(fQsub1,fQsub2);
+ esdEP->SetQsubRes(fQsubRes);
+
+ fHOutEventplaneQ->Fill(fEventplaneQ);
+ fHOutsub1sub2->Fill(fQsub1->Phi()/2.,fQsub2->Phi()/2.);
+ fHOutNTEPRes->Fill(NT,fQsubRes);
+
+ if (fUseMCRP) fHOutDiff->Fill(fEventplaneQ, fRP);
+
+ for (int iter = 0; iter<NT;iter++){
+ AliAODTrack* track = dynamic_cast<AliAODTrack*> (tracklist->At(iter));
+ if (track) {
+ float delta = track->Phi()-fEventplaneQ;
+ while (delta < 0) delta += TMath::Pi();
+ while (delta > TMath::Pi()) delta -= TMath::Pi();
+ fHOutPTPsi->Fill(track->Pt(),delta);
+ fHOutPhi->Fill(track->Phi());
+ fHOutPhiCorr->Fill(track->Phi(),GetPhiWeight(track));
+ }
+ }
+
+ AliAODTrack* trmax = aod->GetTrack(0);
+ for (int iter = 1; iter<NT;iter++){
+ AliAODTrack* track = dynamic_cast<AliAODTrack*> (tracklist->At(iter));
+ if (track && (track->Pt() > trmax->Pt())) trmax = track;
+ }
+ fHOutleadPTPsi->Fill(trmax->Phi(),fEventplaneQ);
+ }
+ delete tracklist;
+ tracklist = 0;
+ }
+
+
}
+
+
else {
printf(" Analysis Input not known!\n\n ");
return;
//__________________________________________________________________________
TVector2 AliEPSelectionTask::GetQ(AliEventplane* EP, TObjArray* tracklist)
{
+// Get the Q vector
TVector2 mQ;
float mQx=0, mQy=0;
- AliESDtrack* track;
+ AliVTrack* track;
Double_t weight;
+ Int_t idtemp = -1;
- int NT = tracklist->GetEntries();
+ int nt = tracklist->GetEntries();
- for (int i=0; i<NT; i++){
+ for (int i=0; i<nt; i++){
weight = 1;
- track = dynamic_cast<AliESDtrack*> (tracklist->At(i));
- weight = GetWeight(track);
+ track = dynamic_cast<AliVTrack*> (tracklist->At(i));
+ if (track) {
+ weight = GetWeight(track);
if (fSaveTrackContribution){
- EP->GetQContributionXArray()->AddAt(weight*cos(2*track->Phi()),track->GetID());
- EP->GetQContributionYArray()->AddAt(weight*sin(2*track->Phi()),track->GetID());
+ idtemp = track->GetID();
+ if ((fAnalysisInput.CompareTo("AOD")==0) && (fAODfilterbit == 128)) idtemp = idtemp*(-1) - 1;
+ EP->GetQContributionXArray()->AddAt(weight*cos(2*track->Phi()),idtemp);
+ EP->GetQContributionYArray()->AddAt(weight*sin(2*track->Phi()),idtemp);
+ }
+ mQx += (weight*cos(2*track->Phi()));
+ mQy += (weight*sin(2*track->Phi()));
}
- mQx += (weight*cos(2*track->Phi()));
- mQy += (weight*sin(2*track->Phi()));
}
mQ.Set(mQx,mQy);
return mQ;
}
//________________________________________________________________________
-void AliEPSelectionTask::GetQsub(TVector2 &Q1, TVector2 &Q2, TObjArray* tracklist)
+void AliEPSelectionTask::GetQsub(TVector2 &Q1, TVector2 &Q2, TObjArray* tracklist,AliEventplane* EP)
{
+// Get Qsub
TVector2 mQ[2];
float mQx1=0, mQy1=0, mQx2=0, mQy2=0;
Double_t weight;
- AliESDtrack* track;
- TRandom2 RN = 0;
+ AliVTrack* track;
+ TRandom2 rn = 0;
- int NT = tracklist->GetEntries();
+ int nt = tracklist->GetEntries();
int trackcounter1=0, trackcounter2=0;
-
- for (Int_t i = 0; i < NT; i++) {
- weight = 1;
- track = dynamic_cast<AliESDtrack*> (tracklist->At(i));
- weight = GetWeight(track);
+ int idtemp = 0;
+
+ if (fSplitMethod == AliEPSelectionTask::kRandom){
+
+ for (Int_t i = 0; i < nt; i++) {
+ weight = 1;
+ track = dynamic_cast<AliVTrack*> (tracklist->At(i));
+ if (!track) continue;
+ weight = GetWeight(track);
+ idtemp = track->GetID();
+ if ((fAnalysisInput.CompareTo("AOD")==0) && (fAODfilterbit == 128)) idtemp = idtemp*(-1) - 1;
- // This loop splits the track set into 2 random subsets
- if( trackcounter1 < int(NT/2.) && trackcounter2 < int(NT/2.)){
- float random = RN.Rndm();
- if(random < .5){
+ // This loop splits the track set into 2 random subsets
+ if( trackcounter1 < int(nt/2.) && trackcounter2 < int(nt/2.)){
+ float random = rn.Rndm();
+ if(random < .5){
+ mQx1 += (weight*cos(2*track->Phi()));
+ mQy1 += (weight*sin(2*track->Phi()));
+ if (fSaveTrackContribution){
+ EP->GetQContributionXArraysub1()->AddAt(weight*cos(2*track->Phi()),idtemp);
+ EP->GetQContributionYArraysub1()->AddAt(weight*sin(2*track->Phi()),idtemp);
+ }
+ trackcounter1++;
+ }
+ else {
+ mQx2 += (weight*cos(2*track->Phi()));
+ mQy2 += (weight*sin(2*track->Phi()));
+ if (fSaveTrackContribution){
+ EP->GetQContributionXArraysub2()->AddAt(weight*cos(2*track->Phi()),idtemp);
+ EP->GetQContributionYArraysub2()->AddAt(weight*sin(2*track->Phi()),idtemp);
+ }
+ trackcounter2++;
+ }
+ }
+ else if( trackcounter1 >= int(nt/2.)){
+ mQx2 += (weight*cos(2*track->Phi()));
+ mQy2 += (weight*sin(2*track->Phi()));
+ if (fSaveTrackContribution){
+ EP->GetQContributionXArraysub2()->AddAt(weight*cos(2*track->Phi()),idtemp);
+ EP->GetQContributionYArraysub2()->AddAt(weight*sin(2*track->Phi()),idtemp);
+ }
+ trackcounter2++;
+ }
+ else {
mQx1 += (weight*cos(2*track->Phi()));
mQy1 += (weight*sin(2*track->Phi()));
+ if (fSaveTrackContribution){
+ EP->GetQContributionXArraysub1()->AddAt(weight*cos(2*track->Phi()),idtemp);
+ EP->GetQContributionYArraysub1()->AddAt(weight*sin(2*track->Phi()),idtemp);
+ }
trackcounter1++;
}
- else {
+ }
+ } else if (fSplitMethod == AliEPSelectionTask::kEta) {
+
+ for (Int_t i = 0; i < nt; i++) {
+ weight = 1;
+ track = dynamic_cast<AliVTrack*> (tracklist->At(i));
+ if (!track) continue;
+ weight = GetWeight(track);
+ Double_t eta = track->Eta();
+ idtemp = track->GetID();
+ if ((fAnalysisInput.CompareTo("AOD")==0) && (fAODfilterbit == 128)) idtemp = idtemp*(-1) - 1;
+
+ if (eta > fEtaGap/2.) {
+ mQx1 += (weight*cos(2*track->Phi()));
+ mQy1 += (weight*sin(2*track->Phi()));
+ if (fSaveTrackContribution){
+ EP->GetQContributionXArraysub1()->AddAt(weight*cos(2*track->Phi()),idtemp);
+ EP->GetQContributionYArraysub1()->AddAt(weight*sin(2*track->Phi()),idtemp);
+ }
+ } else if (eta < -1.*fEtaGap/2.) {
mQx2 += (weight*cos(2*track->Phi()));
mQy2 += (weight*sin(2*track->Phi()));
- trackcounter2++;
+ if (fSaveTrackContribution){
+ EP->GetQContributionXArraysub2()->AddAt(weight*cos(2*track->Phi()),idtemp);
+ EP->GetQContributionYArraysub2()->AddAt(weight*sin(2*track->Phi()),idtemp);
+ }
}
}
- else if( trackcounter1 >= int(NT/2.)){
- mQx2 += (weight*cos(2*track->Phi()));
- mQy2 += (weight*sin(2*track->Phi()));
- trackcounter2++;
- }
- else {
- mQx1 += (weight*cos(2*track->Phi()));
- mQy1 += (weight*sin(2*track->Phi()));
- trackcounter1++;
+ } else if (fSplitMethod == AliEPSelectionTask::kCharge) {
+
+ for (Int_t i = 0; i < nt; i++) {
+ weight = 1;
+ track = dynamic_cast<AliVTrack*> (tracklist->At(i));
+ if (!track) continue;
+ weight = GetWeight(track);
+ Short_t cha = track->Charge();
+ idtemp = track->GetID();
+ if ((fAnalysisInput.CompareTo("AOD")==0) && (fAODfilterbit == 128)) idtemp = idtemp*(-1) - 1;
+
+ if (cha > 0) {
+ mQx1 += (weight*cos(2*track->Phi()));
+ mQy1 += (weight*sin(2*track->Phi()));
+ if (fSaveTrackContribution){
+ EP->GetQContributionXArraysub1()->AddAt(weight*cos(2*track->Phi()),idtemp);
+ EP->GetQContributionYArraysub1()->AddAt(weight*sin(2*track->Phi()),idtemp);
+ }
+ } else if (cha < 0) {
+ mQx2 += (weight*cos(2*track->Phi()));
+ mQy2 += (weight*sin(2*track->Phi()));
+ if (fSaveTrackContribution){
+ EP->GetQContributionXArraysub2()->AddAt(weight*cos(2*track->Phi()),idtemp);
+ EP->GetQContributionYArraysub2()->AddAt(weight*sin(2*track->Phi()),idtemp);
+ }
+ }
}
+ } else {
+ printf("plane resolution determination method not available!\n\n ");
+ return;
}
+
mQ[0].Set(mQx1,mQy1);
mQ[1].Set(mQx2,mQy2);
Q1 = mQ[0];
}
//________________________________________________________________________
-void AliEPSelectionTask::SetESDtrackCuts(TString status){
+void AliEPSelectionTask::SetPersonalESDtrackCuts(AliESDtrackCuts* trackcuts){
- fStatus = status;
- if (fStatus.CompareTo("GLOBAL")==0) fESDtrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(kTRUE);
- if (fStatus.CompareTo("TPC")==0) fESDtrackCuts = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
- fESDtrackCuts->SetPtRange(0.15,20);
- fESDtrackCuts->SetEtaRange(-0.8,0.8);
+ if(fESDtrackCuts){
+ delete fESDtrackCuts;
+ fESDtrackCuts = 0;
+ }
+ if (fAnalysisInput.CompareTo("AOD")==0){
+ AliInfo("ESD track cuts not possible for AOD analysis; please use SetPersonalAODtrackCuts(); using TPC only track cuts");
+ fUsercuts = kFALSE;
+ SetTrackType("TPC");
+ return;
+ }
+ fUsercuts = kTRUE;
+ fESDtrackCuts = trackcuts;
}
-//__________________________________________________________________________
-void AliEPSelectionTask::SetPhiDistribution(char* infilename, char* listname)
-{
- TFile f(infilename);
- TObject* list = f.Get(listname);
- fPhiDist = (TH1F*)list->FindObject("fHOutPhi");
- if (!fPhiDist) {
- cout << "Phi Distribution not found!!!" << endl;
+//________________________________________________________________________
+void AliEPSelectionTask::SetPersonalAODtrackCuts(UInt_t filterbit, Float_t etalow, Float_t etaup, Float_t ptlow, Float_t ptup, Int_t ntpc){
+
+ if(fESDtrackCuts){
+ delete fESDtrackCuts;
+ fESDtrackCuts = 0;
+ }
+ if (fAnalysisInput.CompareTo("ESD")==0){
+ AliInfo("AOD track cuts not possible for ESD analysis; please use SetPersonalESDtrackCuts(); using TPC only track cuts");
+ fUsercuts = kFALSE;
+ SetTrackType("TPC");
return;
}
-
- Bool_t emptybins;
+ fUsercuts = kTRUE;
+ fESDtrackCuts = new AliESDtrackCuts();
+ fESDtrackCuts->SetPtRange(ptlow,ptup);
+ fESDtrackCuts->SetMinNClustersTPC(ntpc);
+ fESDtrackCuts->SetEtaRange(etalow,etaup);
+ fAODfilterbit = filterbit;
+}
- int iter = 0;
- while (iter<3){
- emptybins = kFALSE;
-
- for (int i=1; i<fPhiDist->GetNbinsX(); i++){
- if (!((fPhiDist->GetBinContent(i))>0)) {
- emptybins = kTRUE;
- }
- }
- if (emptybins) {
- cout << "empty bins - rebinning!" << endl;
- fPhiDist->Rebin();
- iter++;
- }
- else iter = 3;
+//_____________________________________________________________________________
+
+void AliEPSelectionTask::SetTrackType(TString tracktype){
+ fTrackType = tracktype;
+ if (!fUsercuts) {
+ if (fTrackType.CompareTo("GLOBAL")==0){
+ fESDtrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(kTRUE);
+ fAODfilterbit = 32;
+ }
+ if (fTrackType.CompareTo("TPC")==0){
+ fESDtrackCuts = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
+ fAODfilterbit = 128;
}
-
- if (emptybins) {
- AliError("After Maximum of rebinning still empty Phi-bins!!!");
+ fESDtrackCuts->SetPtRange(0.15,20.);
+ fESDtrackCuts->SetEtaRange(-0.8,0.8);
}
- f.Close();
}
//________________________________________________________________________
-Double_t AliEPSelectionTask::GetWeight(AliESDtrack* track)
+Double_t AliEPSelectionTask::GetWeight(TObject* track1)
{
Double_t ptweight=1;
-
- if (fUsePtWeight) {
+ AliVTrack* track = dynamic_cast<AliVTrack*>(track1);
+ if (fUsePtWeight && track) {
if (track->Pt()<2) ptweight=track->Pt();
else ptweight=2;
}
}
//________________________________________________________________________
-Double_t AliEPSelectionTask::GetPhiWeight(AliESDtrack* track)
+Double_t AliEPSelectionTask::GetPhiWeight(TObject* track1)
{
Double_t phiweight=1;
+ AliVTrack* track = dynamic_cast<AliVTrack*>(track1);
+
+ TH1F *phiDist = 0x0;
+ if(track) phiDist = SelectPhiDist(track);
- if (fUsePhiWeight && fPhiDist && track) {
- Double_t nParticles = fPhiDist->Integral();
- Double_t nPhibins = fPhiDist->GetNbinsX();
+ if (fUsePhiWeight && phiDist && track) {
+ Double_t nParticles = phiDist->Integral();
+ Double_t nPhibins = phiDist->GetNbinsX();
Double_t Phi = track->Phi();
while (Phi<0) Phi += TMath::TwoPi();
while (Phi>TMath::TwoPi()) Phi -= TMath::TwoPi();
- Double_t PhiDistValue = fPhiDist->GetBinContent(1+TMath::FloorNint((track->Phi())*nPhibins/TMath::TwoPi()));
+ Double_t PhiDistValue = phiDist->GetBinContent(1+TMath::FloorNint((track->Phi())*nPhibins/TMath::TwoPi()));
if (PhiDistValue > 0) phiweight = nParticles/nPhibins/PhiDistValue;
}
return phiweight;
}
+
+//__________________________________________________________________________
+void AliEPSelectionTask::SetPhiDist()
+{
+ if(!fUserphidist && (fPeriod.CompareTo("LHC10h") == 0 || fPeriod.CompareTo("LHC11h") == 0)) { // if it's already set and custom class is required, we use the one provided by the user
+
+ if (fPeriod.CompareTo("LHC10h")==0)
+ {
+ fPhiDist[0] = (TH1F*) fEPContainer->GetObject(fRunNumber, "Default");}
+ else if(fPeriod.CompareTo("LHC11h")==0){
+ Int_t runbin=fHruns->FindBin(fRunNumber);
+ if (fHruns->GetBinContent(runbin) > 1){
+ fSparseDist->GetAxis(0)->SetRange(runbin,runbin);
+ }
+ else if(fHruns->GetBinContent(runbin) < 2){
+ fSparseDist->GetAxis(0)->SetRange(1,2901); // not calibrated run, use integrated phi-weights
+ AliInfo("Using integrated Phi-weights for this run");
+ }
+ for (Int_t i = 0; i<4 ;i++)
+ {
+ if(fPhiDist[i]){
+ delete fPhiDist[i];
+ fPhiDist[i] = 0x0;
+ }
+ if(i == 0){
+ fSparseDist->GetAxis(1)->SetRange(1,1); // neg charge
+ fSparseDist->GetAxis(2)->SetRange(1,1);} // neg eta
+ if(i == 1){
+ fSparseDist->GetAxis(1)->SetRange(2,2); // pos charge
+ fSparseDist->GetAxis(2)->SetRange(1,1);} // neg eta
+ if(i == 2){
+ fSparseDist->GetAxis(1)->SetRange(1,1); // neg charge
+ fSparseDist->GetAxis(2)->SetRange(2,2);} // pos eta
+ if(i == 3){
+ fSparseDist->GetAxis(1)->SetRange(2,2); // pos charge
+ fSparseDist->GetAxis(2)->SetRange(2,2);} // pos eta
+ fPhiDist[i] = (TH1F*)fSparseDist->Projection(3); // Projection on Phi
+ fPhiDist[i]->SetName(Form("phidist%d%d",i,fRunNumber));
+ fSparseDist->GetAxis(1)->SetRange(1,2); // reset axes
+ fSparseDist->GetAxis(2)->SetRange(1,2);
+ }
+ fSparseDist->GetAxis(0)->SetRange(1,2901);// reset run axis
+ }
+
+ if (!fPhiDist[0]) AliFatal(Form("Cannot find OADB phi distribution for run %d", fRunNumber));
+
+ }
+
+
+ if (fPeriod.CompareTo("LHC10h")==0 || fUserphidist){
+ Bool_t emptybins;
+
+ int iter = 0;
+ while (iter<3){
+ emptybins = kFALSE;
+
+ for (int i=1; i<fPhiDist[0]->GetNbinsX(); i++){
+ if (!((fPhiDist[0]->GetBinContent(i))>0)) {
+ emptybins = kTRUE;
+ }
+ }
+ if (emptybins) {
+ cout << "empty bins - rebinning!" << endl;
+ fPhiDist[0]->Rebin();
+ iter++;
+ }
+ else iter = 3;
+ }
+
+ if (emptybins) {
+ AliError("After Maximum of rebinning still empty Phi-bins!!!");
+ }
+ }
+ if (fPeriod.CompareTo("LHC10h") != 0 && fPeriod.CompareTo("LHC11h") != 0 && !fUserphidist){
+ AliInfo("No Phi-weights available. All Phi weights set to 1");
+ SetUsePhiWeight(kFALSE);
+ }
+}
+
+//__________________________________________________________________________
+void AliEPSelectionTask::SetPersonalPhiDistribution(const char* infilename, char* listname)
+{
+
+ fUserphidist = kTRUE;
+
+ TFile f(infilename);
+ TObject* list = f.Get(listname);
+ fPhiDist[0] = (TH1F*)list->FindObject("fHOutPhi");
+ if (!fPhiDist[0]) AliFatal("Phi Distribution not found!!!");
+
+ f.Close();
+}
+
+
+//_________________________________________________________________________
+TObjArray* AliEPSelectionTask::GetAODTracksAndMaxID(AliAODEvent* aod, Int_t& maxid)
+{
+ TObjArray *acctracks = new TObjArray();
+
+ AliAODTrack *tr = 0;
+ Int_t maxid1 = 0;
+ Int_t maxidtemp = -1;
+ Float_t ptlow = 0;
+ Float_t ptup = 0;
+ Float_t etalow = 0;
+ Float_t etaup = 0;
+ fESDtrackCuts->GetPtRange(ptlow,ptup);
+ fESDtrackCuts->GetEtaRange(etalow,etaup);
+ Int_t ntpc = fESDtrackCuts->GetMinNClusterTPC();
+
+ for (Int_t i = 0; i < aod->GetNumberOfTracks() ; i++){
+ tr = aod->GetTrack(i);
+ maxidtemp = tr->GetID();
+ if(maxidtemp < 0 && fAODfilterbit != 128) continue;
+ if(maxidtemp > -1 && fAODfilterbit == 128) continue;
+ if (fAODfilterbit == 128) maxidtemp = maxidtemp*(-1) - 1;
+ if (maxidtemp > maxid1) maxid1 = maxidtemp;
+ if(tr->TestFilterBit(fAODfilterbit) && tr->Pt() < ptup && tr->Pt() > ptlow && tr->Eta() < etaup && tr->Eta() > etalow && tr->GetTPCNcls() > ntpc){
+ acctracks->Add(tr);
+ }
+ }
+
+ maxid = maxid1;
+
+ return acctracks;
+
+}
+
+//_________________________________________________________________________
+void AliEPSelectionTask::SetOADBandPeriod()
+{
+ TString oadbfilename;
+
+ if (fRunNumber >= 136851 && fRunNumber <= 139515) // LHC10h
+ {fPeriod = "LHC10h";
+ if (!fUserphidist) { // if it's already set and custom class is required, we use the one provided by the user
+
+ if (fAnalysisInput.CompareTo("AOD")==0){
+ oadbfilename = (Form("%s/COMMON/EVENTPLANE/data/epphidist.aod.root", AliAnalysisManager::GetOADBPath()));
+ } else if (fAnalysisInput.CompareTo("ESD")==0){
+ oadbfilename = (Form("%s/COMMON/EVENTPLANE/data/epphidist.root", AliAnalysisManager::GetOADBPath()));
+ }
+
+ TFile foadb(oadbfilename);
+ if(!foadb.IsOpen()) AliFatal(Form("Cannot open OADB file %s", oadbfilename.Data()));
+
+ AliInfo("Using Standard OADB");
+ fEPContainer = (AliOADBContainer*) foadb.Get("epphidist");
+ if (!fEPContainer) AliFatal("Cannot fetch OADB container for EP selection");
+ foadb.Close();
+ }
+ }
+
+ if (fRunNumber >= 166529 && fRunNumber <= 170593) // LHC11h
+ {fPeriod = "LHC11h";
+ if (!fUserphidist) {
+ // if it's already set and custom class is required, we use the one provided by the user
+
+ oadbfilename = (Form("%s/COMMON/EVENTPLANE/data/epphidist2011.root", AliAnalysisManager::GetOADBPath()));
+ TFile *foadb = TFile::Open(oadbfilename);
+ if(!foadb->IsOpen()) AliFatal(Form("Cannot open OADB file %s", oadbfilename.Data()));
+
+ AliInfo("Using Standard OADB");
+ fSparseDist = (THnSparse*) foadb->Get("Default");
+ if (!fSparseDist) AliFatal("Cannot fetch OADB container for EP selection");
+ foadb->Close();
+ if(!fHruns){
+ fHruns = (TH1F*)fSparseDist->Projection(0); //projection on run axis;
+ fHruns->SetName("runsHisto");
+ }
+ }
+ }
+}
+
+//_________________________________________________________________________
+TH1F* AliEPSelectionTask::SelectPhiDist(AliVTrack *track)
+{
+ if (fPeriod.CompareTo("LHC10h")==0 || fUserphidist) return fPhiDist[0];
+ else if(fPeriod.CompareTo("LHC11h")==0)
+ {
+ if (track->Charge() < 0)
+ {
+ if(track->Eta() < 0.) return fPhiDist[0];
+ else if (track->Eta() > 0.) return fPhiDist[2];
+ }
+ else if (track->Charge() > 0)
+ {
+ if(track->Eta() < 0.) return fPhiDist[1];
+ else if (track->Eta() > 0.) return fPhiDist[3];
+ }
+
+ }
+ return 0;
+}
+
+TObjArray* AliEPSelectionTask::GetTracksForLHC11h(AliESDEvent* esd)
+{
+ // Need to do this hack beacuse only this type of TPC only tracks in AOD is available and one type of Phi-weights is used
+ TObjArray *acctracks = new TObjArray();
+ acctracks->SetOwner(kTRUE);
+
+ const AliESDVertex *vtxSPD = esd->GetPrimaryVertexSPD();
+
+ Float_t ptlow = 0;
+ Float_t ptup = 0;
+ Float_t etalow = 0;
+ Float_t etaup = 0;
+ fESDtrackCuts->GetPtRange(ptlow,ptup);
+ fESDtrackCuts->GetEtaRange(etalow,etaup);
+
+ Double_t pDCA[3] = { 0. }; // momentum at DCA
+ Double_t rDCA[3] = { 0. }; // position at DCA
+ Float_t dDCA[2] = {0.}; // DCA to the vertex d and z
+ Float_t cDCA[3] = {0.}; // covariance of impact parameters
+
+
+
+ for (Int_t i = 0; i < esd->GetNumberOfTracks() ; i++){
+
+ AliESDtrack* esdTrack = esd->GetTrack(i); //carefull do not modify it othwise need to work with a copy
+ //
+ // Track selection
+ if (!fESDtrackCuts->AcceptTrack(esdTrack)) continue;
+
+ // create a tpc only tracl
+ AliESDtrack *track = AliESDtrackCuts::GetTPCOnlyTrack(const_cast<AliESDEvent*>(esd),esdTrack->GetID());
+ if(!track) continue;
+
+ if(track->Pt()>0.)
+ {
+ // only constrain tracks above threshold
+ AliExternalTrackParam exParam;
+ // take the B-field from the ESD, no 3D fieldMap available at this point
+ Bool_t relate = false;
+ relate = track->RelateToVertexTPC(vtxSPD,esd->GetMagneticField(),kVeryBig,&exParam);
+ if(!relate){
+ delete track;
+ continue;
+ }
+ // fetch the track parameters at the DCA (unconstraint)
+ if(track->GetTPCInnerParam()){
+ track->GetTPCInnerParam()->GetPxPyPz(pDCA);
+ track->GetTPCInnerParam()->GetXYZ(rDCA);
+ }
+ // get the DCA to the vertex:
+ track->GetImpactParametersTPC(dDCA,cDCA);
+ // set the constrained parameters to the track
+ track->Set(exParam.GetX(),exParam.GetAlpha(),exParam.GetParameter(),exParam.GetCovariance());
+ }
+
+
+ Float_t eta = track->Eta();
+ Float_t pT = track->Pt();
+
+ if(pT < ptlow || pT > ptup || eta < etalow || eta > etaup){
+ delete track;
+ continue;
+ }
+
+ acctracks->Add(track);
+ }
+
+
+ return acctracks;
+
+}
+