* 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"
+#include "TFormula.h"
#include "AliAnalysisManager.h"
#include "AliMCEventHandler.h"
fFilterBit(16),
fTrackStatus(0),
fOnlyHadrons(kFALSE),
+ fCheckMotherPDG(kTRUE),
fTrackEtaCut(0.8),
+ fTrackEtaCutMin(-1.),
fTrackPtMin(0),
fEventSelection(AliVEvent::kMB|AliVEvent::kUserDefined),
+ fDCAXYCut(0),
+ fSharedClusterCut(-1),
+ fCrossedRowsCut(-1),
+ fFoundFractionCut(-1),
fEsdTrackCuts(0x0),
fEsdTrackCutsExtra1(0x0),
fEsdTrackCutsExtra2(0x0),
- fHelperPID(0x0)
+ fHelperPID(0x0),
+ fEventCounter(0)
{
// constructor
}
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");
AliVParticle* part = ParticleWithCuts( obj, ipart );
if (!part) continue;
// Accept leading-tracks in a limited pseudo-rapidity range
- if( TMath::Abs(part->Eta()) > fTrackEtaCut ) continue;
+ if( TMath::Abs(part->Eta()) > fTrackEtaCut || TMath::Abs(part->Eta()) < fTrackEtaCutMin ) continue;
tracks->AddLast( part );
}
// Order tracks by pT
Printf("WARNING: No mother found for particle %d:", part->GetLabel());
continue;
}
-
+
+// Printf("%d %d %d", i, part->GetLabel(), mother->GetLabel());
if (mother->GetLabel() >= maxLabel)
{
-// Printf("Removing %d with label %d", i, part->GetLabel()); part->Dump();
+// Printf("Removing %d with label %d", i, part->GetLabel()); ((AliMCParticle*)part)->Particle()->Print(); ((AliMCParticle*)mother)->Particle()->Print();
TObject* object = tracks->RemoveAt(i);
if (tracks->IsOwner())
delete object;
// 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)
-
+
Int_t nTracks = NParticles(obj);
TObjArray* tracks = new TObjArray;
if (!part) continue;
if (useEtaPtCuts)
- if (TMath::Abs(part->Eta()) > fTrackEtaCut || part->Pt() < fTrackPtMin)
+ if (TMath::Abs(part->Eta()) > fTrackEtaCut || TMath::Abs(part->Eta()) < fTrackEtaCutMin || part->Pt() < fTrackPtMin)
{
if (hasOwnership)
delete part;
continue;
}
+
+// Printf("%p %p %d Accepted %d %f %f %f", obj, arrayMC, particleSpecies, ipart, part->Eta(), part->Phi(), part->Pt());
if (arrayMC) {
Int_t label = part->GetLabel();
if (!partReconstructed) continue;
if (useEtaPtCuts)
- if (TMath::Abs(partReconstructed->Eta()) > fTrackEtaCut || partReconstructed->Pt() < fTrackPtMin)
+ if (TMath::Abs(partReconstructed->Eta()) > fTrackEtaCut || TMath::Abs(partReconstructed->Eta()) < fTrackEtaCutMin || partReconstructed->Pt() < fTrackPtMin)
{
if (hasOwnership)
delete partReconstructed;
if (particleSpecies != -1) {
// find the primary mother
AliVParticle* mother = part;
- while (!((AliAODMCParticle*)mother)->IsPhysicalPrimary())
- {
+ if(fCheckMotherPDG) {
+ while (!((AliAODMCParticle*)mother)->IsPhysicalPrimary())
+ {
if (((AliAODMCParticle*)mother)->GetMother() < 0)
{
mother = 0;
mother = (AliVParticle*) arrayMC->At(((AliAODMCParticle*)mother)->GetMother());
if (!mother)
break;
+ }
}
-
if (mother)
{
Int_t pdgCode = ((AliAODMCParticle*)mother)->GetPdgCode();
// find the primary mother
AliMCParticle* mother = (AliMCParticle*) part;
// Printf("");
- while (!mcEvent->IsPhysicalPrimary(mother->GetLabel()))
- {
+ if(fCheckMotherPDG) {
+ while (!mcEvent->IsPhysicalPrimary(mother->GetLabel()))
+ {
// Printf("pdg = %d; mother = %d", mother->PdgCode(), mother->GetMother());
if (mother->GetMother() < 0)
{
mother = (AliMCParticle*) mcEvent->GetTrack(mother->GetMother());
if (!mother)
break;
+ }
}
-
if (mother)
{
Int_t pdgCode = mother->PdgCode();
// track selection cuts
if ( !(((AliAODTrack*)part)->TestFilterBit(fFilterBit)) ) return 0;
if (fTrackStatus != 0 && !CheckTrack(part)) return 0;
+
+ // DCA XY
+ if (fDCAXYCut)
+ {
+ const AliVVertex* vertex = aodEvent->GetPrimaryVertex();
+ if (!vertex)
+ return 0;
+
+ 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);
+ delete clone;
+ if (!success)
+ return 0;
+
+// Printf("%f", ((AliAODTrack*)part)->DCA());
+// Printf("%f", pos[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){
// only charged
if (!part->Charge())return 0;
+ part->SetUniqueID(fEventCounter * 100000 + ipart);
return part;
}
TVector3 partVect(part->Px(), part->Py(), part->Pz());
Int_t region = 0;
- if( TMath::Abs(partVect.Eta()) > fTrackEtaCut ) continue;
+ if( TMath::Abs(partVect.Eta()) > fTrackEtaCut || TMath::Abs(partVect.Eta()) < fTrackEtaCutMin) continue;
// transverse regions
if (leadVect.DeltaPhi(partVect) < -k60rad && leadVect.DeltaPhi(partVect) > -k120rad )region = -1; //left
if (leadVect.DeltaPhi(partVect) > k60rad && leadVect.DeltaPhi(partVect) < k120rad ) region = 1; //right
if (name.CompareTo("PrimaryVertex") && name.CompareTo("SPDVertex"))return kFALSE;
// Select a quality vertex by number of tracks?
- if( nTracksPrim < ntracks || TMath::Abs(zVertex) > zed ) {
+ if( nTracksPrim < ntracks || TMath::Abs(zVertex) >= zed ) {
if (fDebug > 1) AliInfo(" Primary-vertex Selection: event REJECTED ...");
return kFALSE;
}
if (obj->InheritsFrom("AliMCEvent"))
{
- if (TMath::Abs(((AliMCEvent*) obj)->GetPrimaryVertex()->GetZ()) > zed)
+ if (TMath::Abs(((AliMCEvent*) obj)->GetPrimaryVertex()->GetZ()) >= zed)
{
if (fDebug > 1) AliInfo(" Primary-vertex Selection: event (based on MC) REJECTED ...");
return kFALSE;
if (obj->InheritsFrom("AliAODMCHeader"))
{
- if (TMath::Abs(((AliAODMCHeader*) obj)->GetVtxZ()) > zed)
+ if (TMath::Abs(((AliAODMCHeader*) obj)->GetVtxZ()) >= zed)
{
if (fDebug > 1) AliInfo(" Primary-vertex Selection: event (based on MC) REJECTED ...");
return kFALSE;
if (name.CompareTo("PrimaryVertex") && name.CompareTo("SPDVertex"))return kFALSE;
// Select a quality vertex by number of tracks?
- if( nTracksPrim < ntracks || TMath::Abs(zVertex) > zed ) {
+ if( nTracksPrim < ntracks || TMath::Abs(zVertex) >= zed ) {
if (fDebug > 1) AliInfo(" Primary-vertex Selection: event REJECTED ...");
return kFALSE;
}