fDebug(0),
fFilterBit(16),
fOnlyHadrons(kFALSE),
- fTrackEtaCut(0.8)
+ fTrackEtaCut(0.8),
+ fEsdTrackCuts(0x0),
+ fEsdTrackCutsSPD(0x0),
+ fEsdTrackCutsSDD(0x0)
{
// constructor
}
//____________________________________________________________________
-Bool_t AliAnalyseLeadingTrackUE::ApplyCuts(TObject* track, Int_t filterbit)
+Bool_t AliAnalyseLeadingTrackUE::ApplyCuts(TObject* track)
{
- // Reproduces the cuts of the corresponding bit in the ESD->AOD filtering
- // (see $ALICE_ROOT/ANALYSIS/macros/AddTaskESDFilter.C)
-
- AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts();
- switch (filterbit){
- /*case 16:
- // tighter cuts on primary particles for high pT tracks
- // needed as input for jetfinder
- esdTrackCuts->SetMinNClustersTPC(50);
- esdTrackCuts->SetMaxChi2PerClusterTPC(3.5);
- esdTrackCuts->SetRequireTPCRefit(kTRUE);
- esdTrackCuts->SetMaxDCAToVertexXY(2.4);
- esdTrackCuts->SetMaxDCAToVertexZ(3.2);
- esdTrackCuts->SetDCAToVertex2D(kTRUE);
- esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
- esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
- esdTrackCuts->SetRequireITSRefit(kTRUE); // additional cut
- break;
- */
-
- case 16:
- esdTrackCuts->GetStandardITSTPCTrackCuts2009(kTRUE);
- break;
-
- default:
- if (fDebug > 1) AliFatal("Set of cuts not defined");
- break;
- }
// select track according to set of cuts
- if (! esdTrackCuts->IsSelected(track) )return kFALSE;
-
+ if (! fEsdTrackCuts->IsSelected(track) )return kFALSE;
+ if (!fEsdTrackCutsSPD->IsSelected(track) && fEsdTrackCutsSDD->IsSelected(track)) return kFALSE;
+
return kTRUE;
}
+//____________________________________________________________________
+void AliAnalyseLeadingTrackUE::DefineESDCuts(Int_t /*filterbit*/){
+
+ // Reproduces the cuts of the corresponding bit in the ESD->AOD filtering
+ // (see $ALICE_ROOT/ANALYSIS/macros/AddTaskESDFilter.C)
+ fEsdTrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010();
+ fEsdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kNone);
+
+ // Add SPD requirement
+ fEsdTrackCutsSPD = new AliESDtrackCuts("SPD", "Require 1 cluster in SPD");
+ fEsdTrackCutsSPD->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kAny);
+
+ // Add SDD requirement
+ fEsdTrackCutsSDD = new AliESDtrackCuts("SDD", "Require 1 cluster in first layer SDD");
+ fEsdTrackCutsSDD->SetClusterRequirementITS(AliESDtrackCuts::kSDD,AliESDtrackCuts::kFirst);
+}
//____________________________________________________________________
}
+//-------------------------------------------------------------------
+TObjArray* AliAnalyseLeadingTrackUE::GetAcceptedParticles(TObject* obj, TObject* arrayMC, Bool_t onlyprimaries, Int_t particleSpecies)
+{
+ // 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
+
+ Int_t nTracks = NParticles(obj);
+ TObjArray* tracks = new TObjArray;
+
+ // Loop over tracks or jets
+ for (Int_t ipart=0; ipart<nTracks; ++ipart) {
+ AliVParticle* part = ParticleWithCuts( obj, ipart, onlyprimaries, particleSpecies );
+ if (!part) continue;
+
+ if (arrayMC && arrayMC->InheritsFrom("TClonesArray") && obj->InheritsFrom("AliAODEvent")) {
+ Int_t label = ((AliAODTrack*)part)->GetLabel();
+ // re-define part as the matched MC particle
+ part = (AliAODMCParticle*)ParticleWithCuts(arrayMC, TMath::Abs(label),onlyprimaries, particleSpecies);
+ if (!part)continue;
+ }
+
+ tracks->Add(part);
+ }
+
+ return tracks;
+}
+
//-------------------------------------------------------------------
TObjArray* AliAnalyseLeadingTrackUE::GetMinMaxRegion(TList *transv1, TList *transv2)
{
}else if (obj->InheritsFrom("AliESDEvent")){ // RECO ESD tracks
AliESDEvent *esdEvent = dynamic_cast<AliESDEvent*>(obj);
nTracks = esdEvent->GetNumberOfTracks();
+ }else if (obj->InheritsFrom("AliMCEvent")){ // RECO ESD tracks
+ AliMCEvent *mcEvent = dynamic_cast<AliMCEvent*>(obj);
+ nTracks = mcEvent->GetNumberOfTracks();
}else {
if (fDebug > 1) AliFatal(" Analysis type not defined !!! ");
return 0;
//-------------------------------------------------------------------
-AliVParticle* AliAnalyseLeadingTrackUE::ParticleWithCuts(TObject* obj, Int_t ipart, Bool_t onlyprimaries)
+AliVParticle* AliAnalyseLeadingTrackUE::ParticleWithCuts(TObject* obj, Int_t ipart, Bool_t onlyprimaries, Int_t particleSpecies)
{
// Returns track or MC particle at position "ipart" if passes selection criteria
+ // particleSpecies: -1 all particles are returned
+ // 0 (pions) 1 (kaons) 2 (protons) 3 (others) particles
AliVParticle *part=0;
if (obj->InheritsFrom("TClonesArray")){ // AOD-MC PARTICLE
TMath::Abs(pdgCode)==321; // Kaon
if (!isHadron) return 0;
}
+ if (particleSpecies != -1) {
+ // find the primary mother
+ AliVParticle* mother = part;
+ while (!((AliAODMCParticle*)mother)->IsPhysicalPrimary())
+ {
+ if (((AliAODMCParticle*)mother)->GetMother() < 0)
+ {
+ mother = 0;
+ break;
+ }
+
+ mother = (AliVParticle*) arrayMC->At(((AliAODMCParticle*)mother)->GetMother());
+ if (!mother)
+ break;
+ }
+
+ if (mother)
+ {
+ Int_t pdgCode = ((AliAODMCParticle*)mother)->GetPdgCode();
+ if (particleSpecies == 0 && TMath::Abs(pdgCode)!=211)
+ return 0;
+ if (particleSpecies == 1 && TMath::Abs(pdgCode)!=321)
+ return 0;
+ if (particleSpecies == 2 && TMath::Abs(pdgCode)!=2212)
+ return 0;
+ if (particleSpecies == 3 && (TMath::Abs(pdgCode)==211 || TMath::Abs(pdgCode)==321 || TMath::Abs(pdgCode)==2212))
+ return 0;
+ }
+ }
}else if (obj->InheritsFrom("TObjArray")){ // list of AliVParticle
TObjArray *array = dynamic_cast<TObjArray*>(obj);
part = esdEvent->GetTrack(ipart);
if (!part)return 0;
// track selection cuts
- if (!( ApplyCuts(part, fFilterBit)) )return 0;
+ if (!( ApplyCuts(part)) )return 0;
// only primary candidates (does not exist for ESD tracks??????)
//if ( ((AliAODTrack*)part)->IsPrimaryCandidate() )return 0;
TList *transverse2 = new TList();
TObjArray *regionParticles = new TObjArray;
+ regionParticles->SetOwner(kTRUE);
+
regionParticles->AddLast(toward);
regionParticles->AddLast(away);
regionParticles->AddLast(transverse1);
if (TMath::Abs(leadVect.DeltaPhi(partVect)) > k120rad ) region = -2; //backward
// skip leading particle
- if (leading == part)
+ if (leading == part)
continue;
if (!region)continue;
if (!(((AliInputEventHandler*)obj)->IsEventSelected()&AliVEvent::kMB))return kFALSE;
}
+ // TODO for AOD input trigger bit needs to be checked too (is stored in the AOD)
+
return kTRUE;
}