+//---------------------------------------------------------------------------
+Bool_t AliRDHFCutsLctoV0::AreLctoV0DaughtersSelected(AliAODRecoDecayHF *dd) const{
+ //
+ // Daughter tracks selection
+ //
+
+ AliAODRecoCascadeHF* d = (AliAODRecoCascadeHF*)dd;
+ if (!d) {
+ AliDebug(2,"AliAODRecoCascadeHF null");
+ return kFALSE;
+ }
+
+ if (!fTrackCuts) {
+ AliFatal("Cut object is not defined for bachelor. Candidate accepted.");
+ return kFALSE;
+ }
+
+ AliAODTrack * bachelorTrack = dynamic_cast<AliAODTrack*>(d->GetBachelor());
+ if (!bachelorTrack) return kFALSE;
+
+ if (fIsCandTrackSPDFirst && d->Pt()<fMaxPtCandTrackSPDFirst) {
+ if(!bachelorTrack->HasPointOnITSLayer(0)) return kFALSE;
+ }
+
+ if (fKinkReject != (!(fTrackCuts->GetAcceptKinkDaughters())) ) {
+ AliError(Form("Not compatible setting: fKinkReject=%1d - fTrackCuts->GetAcceptKinkDaughters()=%1d",fKinkReject, fTrackCuts->GetAcceptKinkDaughters()));
+ return kFALSE;
+ }
+
+ AliAODVertex *vAOD = d->GetPrimaryVtx();
+ Double_t pos[3]; vAOD->GetXYZ(pos);
+ Double_t cov[6]; vAOD->GetCovarianceMatrix(cov);
+ const AliESDVertex vESD(pos,cov,100.,100);
+
+ if (!IsDaughterSelected(bachelorTrack,&vESD,fTrackCuts)) return kFALSE;
+
+ if (!fV0daughtersCuts) {
+ AliFatal("Cut object is not defined for V0daughters. Candidate accepted.");
+ return kFALSE;
+ }
+
+ AliAODv0 * v0 = dynamic_cast<AliAODv0*>(d->Getv0());
+ if (!v0) return kFALSE;
+ AliAODTrack *v0positiveTrack = dynamic_cast<AliAODTrack*>(d->Getv0PositiveTrack());
+ if (!v0positiveTrack) return kFALSE;
+ AliAODTrack *v0negativeTrack = dynamic_cast<AliAODTrack*>(d->Getv0NegativeTrack());
+ if (!v0negativeTrack) return kFALSE;
+
+
+ Float_t etaMin=0, etaMax=0; fV0daughtersCuts->GetEtaRange(etaMin,etaMax);
+ if ( (v0positiveTrack->Eta()<=etaMin || v0positiveTrack->Eta()>=etaMax) ||
+ (v0negativeTrack->Eta()<=etaMin || v0negativeTrack->Eta()>=etaMax) ) return kFALSE;
+ Float_t ptMin=0, ptMax=0; fV0daughtersCuts->GetPtRange(ptMin,ptMax);
+ if ( (v0positiveTrack->Pt()<=ptMin || v0positiveTrack->Pt()>=ptMax) ||
+ (v0negativeTrack->Pt()<=ptMin || v0negativeTrack->Pt()>=ptMax) ) return kFALSE;
+
+ // Condition on nTPCclusters
+ if (fV0daughtersCuts->GetMinNClusterTPC()>0) {
+ if ( ( ( v0positiveTrack->GetTPCClusterInfo(2,1) ) < fV0daughtersCuts->GetMinNClusterTPC() ) ||
+ ( ( v0negativeTrack->GetTPCClusterInfo(2,1) ) < fV0daughtersCuts->GetMinNClusterTPC() ) ) return kFALSE;
+ }
+
+ // kTPCrefit status
+ if (v0->GetOnFlyStatus()==kFALSE) { // only for offline V0s
+ if (fV0daughtersCuts->GetRequireTPCRefit()) {
+ if( !(v0positiveTrack->GetStatus() & AliESDtrack::kTPCrefit)) return kFALSE;
+ if( !(v0negativeTrack->GetStatus() & AliESDtrack::kTPCrefit)) return kFALSE;
+ }
+ }
+ // kink condition
+ if (!fV0daughtersCuts->GetAcceptKinkDaughters()) {
+ AliAODVertex *maybeKinkPos = (AliAODVertex*)v0positiveTrack->GetProdVertex();
+ AliAODVertex *maybeKinkNeg = (AliAODVertex*)v0negativeTrack->GetProdVertex();
+ if (maybeKinkPos->GetType()==AliAODVertex::kKink ||
+ maybeKinkNeg->GetType()==AliAODVertex::kKink) return kFALSE;
+ }
+ // Findable clusters > 0 condition - from V0 analysis
+ //if( v0positiveTrack->GetTPCNclsF()<=0 || v0negativeTrack->GetTPCNclsF()<=0 ) return kFALSE;
+ /*
+ Float_t lPosTrackCrossedRows = v0positiveTrack->GetTPCClusterInfo(2,1);
+ Float_t lNegTrackCrossedRows = v0positiveTrack->GetTPCClusterInfo(2,1);
+ fTreeVariableLeastNbrCrossedRows = (Int_t) lPosTrackCrossedRows;
+ if( lNegTrackCrossedRows < fTreeVariableLeastNbrCrossedRows )
+ fTreeVariableLeastNbrCrossedRows = (Int_t) lNegTrackCrossedRows;
+ //Compute ratio Crossed Rows / Findable clusters
+ //Note: above test avoids division by zero!
+ Float_t lPosTrackCrossedRowsOverFindable = lPosTrackCrossedRows / ((double)(pTrack->GetTPCNclsF()));
+ Float_t lNegTrackCrossedRowsOverFindable = lNegTrackCrossedRows / ((double)(nTrack->GetTPCNclsF()));
+ fTreeVariableLeastRatioCrossedRowsOverFindable = lPosTrackCrossedRowsOverFindable;
+ if( lNegTrackCrossedRowsOverFindable < fTreeVariableLeastRatioCrossedRowsOverFindable )
+ fTreeVariableLeastRatioCrossedRowsOverFindable = lNegTrackCrossedRowsOverFindable;
+ //Lowest Cut Level for Ratio Crossed Rows / Findable = 0.8, set here
+ if ( fTreeVariableLeastRatioCrossedRowsOverFindable < 0.8 ) return kFALSE;
+ */
+
+ return kTRUE;
+
+}