* about the suitability of this software for any purpose. It is *
* provided "as is" without express or implied warranty. *
**************************************************************************/
-//#include <TBranch.h>
-//#include <TCanvas.h>
-//#include <TChain.h>
-//#include <TFile.h>
-//#include <TH1F.h>
-//#include <TH1I.h>
-//#include <TH2F.h>
+
#include <TList.h>
-//#include <TLorentzVector.h>
#include <TMath.h>
#include <TObjArray.h>
#include <TObject.h>
-//#include <TProfile.h>
-//#include <TRandom.h>
-//#include <TSystem.h>
-//#include <TTree.h>
#include <TVector3.h>
#include "AliAnalyseLeadingTrackUE.h"
-//#include "AliAnalysisTask.h"
-//#include "AliAnalysisHelperJetTasks.h"
-//#include "AliAnalysisManager.h"
#include "AliAODEvent.h"
-//#include "AliAODHandler.h"
-//#include "AliAODJet.h"
#include "AliAODMCParticle.h"
#include "AliAODTrack.h"
#include "AliESDEvent.h"
#include "AliESDtrack.h"
#include "AliESDtrackCuts.h"
-//#include "AliGenPythiaEventHeader.h"
#include "AliInputEventHandler.h"
-//#include "AliKFVertex.h"
-//#include "AliLog.h"
#include "AliMCEvent.h"
#include "AliVParticle.h"
#include "AliAODMCHeader.h"
fCheckMotherPDG(kTRUE),
fTrackEtaCut(0.8),
fTrackEtaCutMin(-1.),
+ fTrackPhiCutEvPlMin(0.),
+ fTrackPhiCutEvPlMax(0.),
fTrackPtMin(0),
fEventSelection(AliVEvent::kMB|AliVEvent::kUserDefined),
fDCAXYCut(0),
+ fSharedClusterCut(-1),
+ fCrossedRowsCut(-1),
+ fFoundFractionCut(-1),
fEsdTrackCuts(0x0),
fEsdTrackCutsExtra1(0x0),
fEsdTrackCutsExtra2(0x0),
fEsdTrackCuts->SetDCAToVertex2D(kTRUE);
fEsdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
fEsdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kOff);
+ fEsdTrackCuts->SetMaxFractionSharedTPCClusters(0.4);
// Add SPD requirement
fEsdTrackCutsExtra1 = new AliESDtrackCuts("SPD", "Require 1 cluster in SPD");
}
//-------------------------------------------------------------------
-TObjArray* AliAnalyseLeadingTrackUE::GetAcceptedParticles(TObject* obj, TObject* arrayMC, Bool_t onlyprimaries, Int_t particleSpecies, Bool_t useEtaPtCuts, Bool_t speciesOnTracks)
+TObjArray* AliAnalyseLeadingTrackUE::GetAcceptedParticles(TObject* obj, TObject* arrayMC, Bool_t onlyprimaries, Int_t particleSpecies, Bool_t useEtaPtCuts, Bool_t speciesOnTracks, Double_t evtPlane)
{
// Returns an array of particles that pass the cuts, if arrayMC is given each reconstructed particle is replaced by its corresponding MC particles, depending on the parameter onlyprimaries only for primaries
// particleSpecies: -1 all particles are returned
// 0 (pions) 1 (kaons) 2 (protons) 3 (others) particles
// speciesOnTracks if kFALSE, particleSpecies is only applied on the matched MC particle (not on the track itself)
+ // Passing down the Double_t* evtPlane (range [-pi/2,pi/2]) will apply a phi cut with respect to the eventplane between fTrackPhiCutEvPlMin and fTrackPhiCutEvPlMax. For values outside [-pi/2,pi/2], this will be ignored.
Int_t nTracks = NParticles(obj);
TObjArray* tracks = new TObjArray;
AliVParticle* part = ParticleWithCuts( obj, ipart, onlyprimaries, (speciesOnTracks) ? particleSpecies : -1);
if (!part) continue;
+ if (TMath::Abs(evtPlane)<=TMath::Pi()/2) { //evtPlane range: (-pi/2,pi/2)
+ Double_t phiPart = part->Phi(); //range: [0,2*pi)
+ if(phiPart>TMath::Pi()) phiPart-=2*TMath::Pi();
+
+ Double_t dPhi = 0; //range: [0,pi/2], i.e. the difference over the shortest angle.
+ Double_t diff = TMath::Abs(phiPart-evtPlane);
+ if(diff<=TMath::Pi()/2) dPhi = diff;
+ else if(diff<=TMath::Pi()) dPhi = TMath::Pi()-diff;
+ else dPhi = diff-TMath::Pi();
+
+ if(dPhi<fTrackPhiCutEvPlMin || dPhi>fTrackPhiCutEvPlMax) {
+ if (hasOwnership)
+ delete part;
+ continue;
+ }
+ }
+
if (useEtaPtCuts)
if (TMath::Abs(part->Eta()) > fTrackEtaCut || TMath::Abs(part->Eta()) < fTrackEtaCutMin || part->Pt() < fTrackPtMin)
{
nTracks = array->GetEntriesFast();
}else if (obj->InheritsFrom("AliAODEvent")){ // RECO AOD tracks
AliAODEvent *aodEvent = static_cast<AliAODEvent*>(obj);
- nTracks = aodEvent->GetNTracks();
+ nTracks = aodEvent->GetNumberOfTracks();
}else if (obj->InheritsFrom("AliESDEvent")){ // RECO ESD tracks
AliESDEvent *esdEvent = static_cast<AliESDEvent*>(obj);
nTracks = esdEvent->GetNumberOfTracks();
part = aodEvent->GetTrack(ipart);
// track selection cuts
- if ( !(((AliAODTrack*)part)->TestFilterBit(fFilterBit)) ) return 0;
+ if (fFilterBit != 0 && !(((AliAODTrack*)part)->TestFilterBit(fFilterBit))) return 0;
if (fTrackStatus != 0 && !CheckTrack(part)) return 0;
// DCA XY
Double_t pos[2];
Double_t covar[3];
AliAODTrack* clone = (AliAODTrack*) part->Clone();
- Bool_t success = clone->PropagateToDCA(vertex, aodEvent->GetHeader()->GetMagneticField(), 3, pos, covar);
+ Bool_t success = clone->PropagateToDCA(vertex, ((AliVAODHeader*)aodEvent->GetHeader())->GetMagneticField(), 3, pos, covar);
delete clone;
if (!success)
return 0;
if (TMath::Abs(pos[0]) > fDCAXYCut->Eval(part->Pt()))
return 0;
}
+
+ if (fSharedClusterCut >= 0)
+ {
+ Double_t frac = Double_t(((AliAODTrack*)part)->GetTPCnclsS()) / Double_t(((AliAODTrack*)part)->GetTPCncls());
+ if (frac > fSharedClusterCut)
+ return 0;
+ }
+
+ if (fCrossedRowsCut >= 0)
+ {
+ if (((AliAODTrack*) part)->GetTPCNCrossedRows() < fCrossedRowsCut)
+ return 0;
+ }
+
+ if (fFoundFractionCut >= 0)
+ {
+ UInt_t findableClusters = ((AliAODTrack*) part)->GetTPCNclsF();
+ if (findableClusters == 0)
+ return 0;
+ if (((Double_t) ((AliAODTrack*) part)->GetTPCNCrossedRows() / findableClusters) < fFoundFractionCut)
+ return 0;
+ }
// eventually only hadrons
if (fOnlyHadrons){