// Julian Book <Julian.Book@cern.ch> //
/*
+Class to provide some V0 selection using exactley the same cuts in ESDs as in AODs.
+It implements the PID cut class AliDielectronPID and the standard AliDielectronVarCuts for
+the configuration of leg respective pair cuts. These pair cuts are applied on the KFparticle
+build by the legs.
+Some QA cuts for the tracks are applied before the V0 pair is build. These cuts are:
+AliDielectronVarCuts dauQAcuts1;
+dauQAcuts1.AddCut(AliDielectronVarManager::kPt, 0.05, 100.0);
+dauQAcuts1.AddCut(AliDielectronVarManager::kEta, -0.9, 0.9);
+dauQAcuts1.AddCut(AliDielectronVarManager::kNclsTPC, 50.0, 160.0);
+dauQAcuts1.AddCut(AliDielectronVarManager::kTPCchi2Cl, 0.0, 4.0);
+AliDielectronTrackCuts dauQAcuts2;
+dauQAcuts2.SetRequireTPCRefit(kTRUE);
+
+
+
+Example configuration:
+
+ AliDielectronV0Cuts *gammaV0Cuts = new AliDielectronV0Cuts("IsGamma","IsGamma");
+
+ // which V0 finder you want to use
+ gammaV0Cuts->SetV0finder(kOnTheFly); // kAll(default), kOffline or kOnTheFly
+
+ // add some pdg codes (they are used then by the KF package and important for gamma conversions)
+ gammaV0Cuts->SetPdgCodes(22,11,11); // mother, daughter1 and 2
+
+ // add default PID cuts (defined in AliDielectronPID)
+ // requirement can be set to at least one(kAny) of the tracks or to both(kBoth)
+ gammaV0Cuts->SetDefaultPID(16, AliDielectronV0Cuts::kAny);
+
+ // add the pair cuts for V0 candidates
+ gammaV0Cuts->AddCut(AliDielectronVarManager::kCosPointingAngle, TMath::Cos(0.02), 1.0, kFALSE);
+ gammaV0Cuts->AddCut(AliDielectronVarManager::kChi2NDF, 0.0, 10.0, kFALSE);
+ gammaV0Cuts->AddCut(AliDielectronVarManager::kLegDist, 0.0, 0.25, kFALSE);
+ gammaV0Cuts->AddCut(AliDielectronVarManager::kR, 3.0, 90.0, kFALSE);
+ gammaV0Cuts->AddCut(AliDielectronVarManager::kPsiPair, 0.0, 0.05, kFALSE);
+ gammaV0Cuts->AddCut(AliDielectronVarManager::kM, 0.0, 0.05, kFALSE);
+ gammaV0Cuts->AddCut(AliDielectronVarManager::kArmPt, 0.0, 0.05, kFALSE);
+
+ // selection or rejection of V0 tracks
+ gammaV0Cuts->SetExcludeTracks(kTRUE);
+
+ // add the V0cuts directly to the track filter or to some cut group of it
*/
// //
#include "AliDielectronTrackCuts.h"
#include "AliDielectronPID.h"
#include "AliESDv0.h"
+#include "AliAODv0.h"
ClassImp(AliDielectronV0Cuts)
AliDielectronVarCuts(),
fV0TrackArr(0),
fExcludeTracks(kTRUE),
+ fV0finder(kAll),
fMotherPdg(0),
fNegPdg(0),
fPosPdg(0),
fPID(-1),
+ fPIDCutType(kBoth),
fOrbit(0),
fPeriod(0),
fBunchCross(0)
AliDielectronVarCuts(name,title),
fV0TrackArr(0),
fExcludeTracks(kTRUE),
+ fV0finder(kAll),
fMotherPdg(0),
fNegPdg(0),
fPosPdg(0),
fPID(-1),
+ fPIDCutType(kBoth),
fOrbit(0),
fPeriod(0),
fBunchCross(0)
// rest booleans
fV0TrackArr.ResetAllBits();
- // basic quality cut, at least one of the V0 daughters has to fullfill
+ // basic quality cut, /*at least one*/ both of the V0 daughters has to fullfill
+ // always update ::Print accordingly
AliDielectronVarCuts dauQAcuts1;
- dauQAcuts1.AddCut(AliDielectronVarManager::kPt, 0.05, 100.0);
- dauQAcuts1.AddCut(AliDielectronVarManager::kEta, -0.9, 0.9);
- dauQAcuts1.AddCut(AliDielectronVarManager::kNclsTPC, 50.0, 160.0);
+ dauQAcuts1.AddCut(AliDielectronVarManager::kNclsTPC, 70.0, 160.0);
dauQAcuts1.AddCut(AliDielectronVarManager::kTPCchi2Cl, 0.0, 4.0);
+ dauQAcuts1.AddCut(AliDielectronVarManager::kKinkIndex0, 0.0);
+ dauQAcuts1.AddCut(AliDielectronVarManager::kEta, -0.9, 0.9);
+ dauQAcuts1.AddCut(AliDielectronVarManager::kPt, 0.05, 100.0);
AliDielectronTrackCuts dauQAcuts2;
// dauQAcuts2.SetRequireITSRefit(kTRUE);
dauQAcuts2.SetRequireTPCRefit(kTRUE);
AliESDv0 *v = esdev->GetV0(iv);
if(!v) continue;
+ // check the v0 finder
+ if( v->GetOnFlyStatus() && fV0finder==AliDielectronV0Cuts::kOffline ) continue;
+ if(!v->GetOnFlyStatus() && fV0finder==AliDielectronV0Cuts::kOnTheFly ) continue;
+
// should we make use of AliESDv0Cuts::GetPdgCode() to preselect candiadtes, e.g.:
// if(fMotherPdg!=v->GetPdgCode()) continue;
continue;
}
+ // protection against LS v0s
+ if(trNeg->Charge() == trPos->Charge()) continue;
+
// PID default cuts
if(fPID>=0) {
- if( !dauPIDcuts.IsSelected(trNeg) ) continue;
- if( !dauPIDcuts.IsSelected(trPos) ) continue;
+ Bool_t selected=kFALSE;
+ selected=dauPIDcuts.IsSelected(trNeg);
+ if(fPIDCutType==kBoth) selected &= dauPIDcuts.IsSelected(trPos);
+ if(fPIDCutType==kAny) selected |= dauPIDcuts.IsSelected(trPos);
+ if(!selected) continue;
}
// basic track cuts
if( !dauQAcuts1.IsSelected(trPos) ) continue;
if(fMotherPdg==22) candidate.SetGammaTracks(trNeg, 11, trPos, 11);
- else candidate.SetTracks(trNeg, fNegPdg, trPos, fPosPdg);
+ else candidate.SetTracks(trNeg, (trNeg->Charge()<0?fNegPdg:fPosPdg), trPos, (trPos->Charge()<0?fNegPdg:fPosPdg));
// eventually take the external trackparam and build the KFparticles by hand (see AliESDv0::GetKFInfo)
// the folowing is not needed, because the daughters where used in the v0 vertex fit (I guess)
// AliKFVertex v0vtx = *v;
}
else if(ev->IsA() == AliAODEvent::Class()) {
const AliAODEvent *aodEv = static_cast<const AliAODEvent*>(ev);
+ if(!aodEv->GetV0s()) return; // protection for nano AODs
// loop over vertices
- for (Int_t ivertex=0; ivertex<aodEv->GetNumberOfVertices(); ++ivertex){
- AliAODVertex *v=aodEv->GetVertex(ivertex);
- if(v->GetType()!=AliAODVertex::kV0) continue;
- if(v->GetNDaughters()!=2) continue;
+ for (Int_t ivertex=0; ivertex<aodEv->GetNumberOfV0s(); ++ivertex){
+ AliAODv0 *v=aodEv->GetV0(ivertex);
+ if(!v) continue;
+
+ // check the v0 finder
+ if( v->GetOnFlyStatus() && fV0finder==AliDielectronV0Cuts::kOffline ) continue;
+ if(!v->GetOnFlyStatus() && fV0finder==AliDielectronV0Cuts::kOnTheFly ) continue;
AliAODTrack *trNeg=dynamic_cast<AliAODTrack*>(v->GetDaughter(0));
AliAODTrack *trPos=dynamic_cast<AliAODTrack*>(v->GetDaughter(1));
}
nV0stored++;
+ // protection against LS v0s
+ if(trNeg->Charge() == trPos->Charge()) continue;
+
// PID default cuts
if(fPID>=0) {
- if( !dauPIDcuts.IsSelected(trNeg) ) continue;
- if( !dauPIDcuts.IsSelected(trPos) ) continue;
+ Bool_t selected=kFALSE;
+ selected=dauPIDcuts.IsSelected(trNeg);
+ if(fPIDCutType==kBoth) selected &= dauPIDcuts.IsSelected(trPos);
+ if(fPIDCutType==kAny) selected |= dauPIDcuts.IsSelected(trPos);
+ if(!selected) continue;
}
// basic track cuts
if( !dauQAcuts1.IsSelected(trNeg) ) continue;
if( !dauQAcuts1.IsSelected(trPos) ) continue;
- AliKFVertex v0vtx = *v;
+ AliKFVertex v0vtx = *(v->GetSecondaryVtx());
if(fMotherPdg==22) candidate.SetGammaTracks(trNeg, 11, trPos, 11);
else candidate.SetTracks(trNeg, (trNeg->Charge()<0?fNegPdg:fPosPdg), trPos, (trPos->Charge()<0?fNegPdg:fPosPdg));
candidate.SetProductionVertex(v0vtx);
fV0TrackArr.SetBitNumber(trPos->GetID());
}
}
- //printf("there are %d V0s in the event \n",nV0stored);
+ // printf("there are %d V0s in the event \n",nV0stored);
}
else
return;
fPeriod = ev->GetPeriodNumber();
return kTRUE;
}
+
+//________________________________________________________________________
+void AliDielectronV0Cuts::Print(const Option_t* /*option*/) const
+{
+ //
+ // Print cuts and the range
+ //
+ printf(" V0 cuts:\n");
+ printf(" V0 finder mode: %s \n",(fV0finder ==kOnTheFly ? "One-The-Fly":
+ (fV0finder==kOffline ? "Offline":
+ "One-The-Fly+Offline") ) );
+ AliDielectronVarCuts::Print();
+
+ printf(" V0 daughter cuts (applied to both):\n");
+ AliDielectronVarCuts dauQAcuts1;
+ dauQAcuts1.AddCut(AliDielectronVarManager::kNclsTPC, 70.0, 160.0);
+ dauQAcuts1.AddCut(AliDielectronVarManager::kTPCchi2Cl, 0.0, 4.0);
+ dauQAcuts1.AddCut(AliDielectronVarManager::kKinkIndex0, 0.0);
+ dauQAcuts1.AddCut(AliDielectronVarManager::kEta, -0.9, 0.9);
+ dauQAcuts1.AddCut(AliDielectronVarManager::kPt, 0.05, 100.0);
+ dauQAcuts1.Print();
+ AliDielectronTrackCuts dauQAcuts2;
+ // dauQAcuts2.SetRequireITSRefit(kTRUE);
+ dauQAcuts2.SetRequireTPCRefit(kTRUE);
+ // dauQAcuts2.Print(); //TODO activate as soon as implemented
+
+ if(fPID>=0) {
+ printf(" V0 daughter PID cuts (applied to %s):\n",(fPIDCutType==kBoth?"both":"any"));
+ AliDielectronPID dauPIDcuts;
+ dauPIDcuts.SetDefaults(fPID);
+ dauPIDcuts.Print(); //TODO activate as soon as implemented
+ }
+
+}