1 /**************************************************************************
2 * Copyright(c) 1998-2010, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 /////////////////////////////////////////////////////////////
20 // Class for cuts on AOD reconstructed Lc->V0+X
22 // Modified by A.De Caro - decaro@sa.infn.it
24 /////////////////////////////////////////////////////////////
26 #include <TDatabasePDG.h>
27 #include <Riostream.h>
29 #include "AliRDHFCutsLctoV0.h"
30 #include "AliAODRecoCascadeHF.h"
31 #include "AliAODTrack.h"
32 #include "AliESDtrack.h"
33 #include "AliESDVertex.h"
34 #include "AliAODVertex.h"
41 ClassImp(AliRDHFCutsLctoV0)
43 //--------------------------------------------------------------------------
44 AliRDHFCutsLctoV0::AliRDHFCutsLctoV0(const char* name, Short_t /*v0channel*/) :
53 // Default Constructor
58 TString varNames[nvars]={"inv. mass if K0S [GeV/c2]",
59 "inv. mass if Lambda [GeV/c2]",
60 "inv. mass V0 if K0S [GeV/c2]",
61 "inv. mass V0 if Lambda [GeV/c2]",
62 "pT min bachelor track [GeV/c]",
63 "pT min V0-positive track [GeV/c]",
64 "pT min V0-negative track [GeV/c]",
65 "dca cascade cut [cm]",
70 Bool_t isUpperCut[nvars]={kTRUE,
81 SetVarNames(nvars,varNames,isUpperCut);
82 Bool_t forOpt[nvars]={kFALSE,
93 SetVarsForOpt(nvars,forOpt); // It was 5: why only 5? And which ones?
95 Float_t limits[2]={0,999999999.};
113 //--------------------------------------------------------------------------
114 AliRDHFCutsLctoV0::AliRDHFCutsLctoV0(const AliRDHFCutsLctoV0 &source) :
116 fPidSelectionFlag(0),
122 fV0channel(source.fV0channel)*/
128 if (source.fPidHFV0pos) fPidHFV0pos = new AliAODPidHF(*(source.fPidHFV0pos));
129 else fPidHFV0pos = new AliAODPidHF();
130 if (source.fPidHFV0neg) fPidHFV0neg = new AliAODPidHF(*(source.fPidHFV0neg));
131 else fPidHFV0neg = new AliAODPidHF();
133 if (source.fV0daughtersCuts) fV0daughtersCuts = new AliESDtrackCuts(*(source.fV0daughtersCuts));
134 else fV0daughtersCuts = new AliESDtrackCuts();
137 //--------------------------------------------------------------------------
138 AliRDHFCutsLctoV0 &AliRDHFCutsLctoV0::operator=(const AliRDHFCutsLctoV0 &source)
141 // assignment operator
144 if (this != &source) {
146 AliRDHFCuts::operator=(source);
147 fPidSelectionFlag = source.fPidSelectionFlag;
149 fPidHFV0pos = new AliAODPidHF(*(source.fPidHFV0pos));
151 fPidHFV0neg = new AliAODPidHF(*(source.fPidHFV0neg));
153 delete fV0daughtersCuts;
154 fV0daughtersCuts = new AliESDtrackCuts(*(source.fV0daughtersCuts));
156 fV0Type = source.fV0Type;
164 //---------------------------------------------------------------------------
165 AliRDHFCutsLctoV0::~AliRDHFCutsLctoV0() {
167 // // Default Destructor
179 if (fV0daughtersCuts) {
180 delete fV0daughtersCuts;
186 //---------------------------------------------------------------------------
187 void AliRDHFCutsLctoV0::GetCutVarsForOpt(AliAODRecoDecayHF *d,Float_t *vars,Int_t nvars,Int_t *pdgdaughters) {
189 // Fills in vars the values of the variables
192 if (pdgdaughters[0]==-9999) return; // dummy
194 if (nvars!=fnVarsForOpt) {
195 printf("AliRDHFCutsLctoV0::GetCutsVarsForOpt: wrong number of variables\n");
199 AliAODRecoCascadeHF *dd = (AliAODRecoCascadeHF*)d;
201 // Get the v0 and all daughter tracks
202 AliAODTrack *bachelorTrack = (AliAODTrack*)dd->GetBachelor();
203 AliAODv0 *v0 = (AliAODv0*)dd->Getv0();
204 AliAODTrack *v0positiveTrack = (AliAODTrack*)dd->Getv0PositiveTrack();
205 AliAODTrack *v0negativeTrack = (AliAODTrack*)dd->Getv0NegativeTrack();
208 // cut on cascade mass, if K0S + p
209 if (fVarsForOpt[0]) {
211 vars[iter]=dd->InvMassLctoK0sP();
213 // cut on cascade mass, if Lambda + pi
214 if (fVarsForOpt[1]) {
216 vars[iter]=dd->InvMassLctoLambdaPi();
219 // cut on V0 mass if K0S
220 if (fVarsForOpt[2]) {
222 vars[iter]=v0->MassK0Short();
225 // cut on V0 mass if Lambda
226 // ----------------------------- pb with anti-lambda?? --------->>>>>>>>
227 if (fVarsForOpt[3]) {
229 if (bachelorTrack->Charge()==1) {
231 vars[iter]=v0->MassLambda();
232 } else if (bachelorTrack->Charge()==-1) {
234 vars[iter]=v0->MassAntiLambda();
239 // cut bachelor min pt
240 if (fVarsForOpt[4]) {
242 vars[iter]=bachelorTrack->Pt();
245 // cut on V0-positive min pt
246 if (fVarsForOpt[5]) {
248 vars[iter]=v0positiveTrack->Pt();
251 // cut on V0-negative min pt
252 if (fVarsForOpt[6]) {
254 vars[iter]=v0negativeTrack->Pt();
257 // cut on cascade dca
258 if (fVarsForOpt[7]) {
260 vars[iter]=dd->GetDCA(); // prong-to-prong DCA
264 if (fVarsForOpt[8]) {
266 vars[iter]=v0->GetDCA(); // prong-to-prong DCA
271 //---------------------------------------------------------------------------
272 Int_t AliRDHFCutsLctoV0::IsSelected(TObject* obj,Int_t selectionLevel) {
278 cout<<"Cut matrice not inizialized. Exit..."<<endl;
284 AliAODRecoCascadeHF* d = (AliAODRecoCascadeHF*)obj;
286 AliDebug(2,"AliAODRecoCascadeHF null");
290 // Get the bachelor track
291 AliAODTrack *bachelorTrack = (AliAODTrack*)d->GetBachelor();
292 if (!bachelorTrack) {
293 AliDebug(2,"No bachelor object");
298 //if ( fUseTrackSelectionWithFilterBits &&
299 //!(bachelorTrack->TestFilterMask(BIT(4))) ) return 0;
302 AliAODv0 *v0 = (AliAODv0*)d->Getv0();
304 AliDebug(2,"No v0 object");
310 // Get the V0 daughter tracks
311 AliAODTrack *v0positiveTrack = (AliAODTrack*)d->Getv0PositiveTrack();
312 AliAODTrack *v0negativeTrack = (AliAODTrack*)d->Getv0NegativeTrack();
313 if (!v0positiveTrack || !v0negativeTrack ) {
314 AliDebug(2,"No V0 daughters' objects");
318 // selection on daughter tracks
319 if (selectionLevel==AliRDHFCuts::kAll ||
320 selectionLevel==AliRDHFCuts::kTracks) {
322 if (fIsCandTrackSPDFirst && d->Pt()<fMaxPtCandTrackSPDFirst) {
323 if (!bachelorTrack->HasPointOnITSLayer(0)) return 0;
325 if (fTrackCuts && fV0daughtersCuts) {
326 AliAODVertex *vAOD = (AliAODVertex*)d->GetPrimaryVtx();
327 Double_t pos[3]; vAOD->GetXYZ(pos);
328 Double_t cov[6]; vAOD->GetCovarianceMatrix(cov);
329 const AliESDVertex vESD(pos,cov,100.,100);
330 if ( !(IsDaughterSelected(bachelorTrack,&vESD,fTrackCuts)) ||
331 !(IsDaughterSelected(v0negativeTrack,&vESD,fV0daughtersCuts)) ||
332 !(IsDaughterSelected(v0positiveTrack,&vESD,fV0daughtersCuts)) ) return 0;
334 //if (!AreDaughtersSelected(d)) return 0;
337 Bool_t okLck0sp=kTRUE, okLcLpi=kTRUE, okLcLBarpi=kTRUE;
338 Bool_t okK0spipi=kTRUE, okLppi=kTRUE, okLBarpip=kTRUE;
340 // selection on candidate
341 if (selectionLevel==AliRDHFCuts::kAll ||
342 selectionLevel==AliRDHFCuts::kCandidate) {
344 Double_t pt = d->Pt();
345 Int_t ptbin = PtBin(pt);
347 Double_t mLcPDG = TDatabasePDG::Instance()->GetParticle(4122)->Mass();
348 Double_t mk0sPDG = TDatabasePDG::Instance()->GetParticle(310)->Mass();
349 Double_t mLPDG = TDatabasePDG::Instance()->GetParticle(3122)->Mass();
352 Double_t mk0s = v0->MassK0Short();
353 Double_t mLck0sp = d->InvMassLctoK0sP();
356 Double_t mlambda = v0->MassLambda();
357 Double_t malambda = v0->MassAntiLambda();
358 Double_t mLcLpi = d->InvMassLctoLambdaPi();
360 // cut on Lc mass with K0S+p hypothesis
361 if (TMath::Abs(mLck0sp-mLcPDG)>fCutsRD[GetGlobalIndex(0,ptbin)]) {
363 AliDebug(4,Form(" cascade mass is %2.2e and does not correspond to Lambda_c into K0S+p cut",mLck0sp));
366 // cuts on the V0 mass: K0S case
367 if (TMath::Abs(mk0s-mk0sPDG)>fCutsRD[GetGlobalIndex(2,ptbin)]) {
369 AliDebug(4,Form(" V0 mass is %2.2e and does not correspond to K0S cut",mk0s));
372 // cut on Lc mass with Lambda+pi hypothesis
373 if (TMath::Abs(mLcLpi-mLcPDG)>fCutsRD[GetGlobalIndex(1,ptbin)]) {
376 AliDebug(4,Form(" cascade mass is %2.2e and does not correspond to Lambda_c into Lambda+pi cut",mLcLpi));
379 // cuts on the V0 mass: Lambda/LambdaBar case
380 if ( TMath::Abs(mlambda-mLPDG)>fCutsRD[GetGlobalIndex(3,ptbin)] ) {
382 AliDebug(4,Form(" V0 mass is %2.2e and does not correspond to LambdaBar cut",mlambda));
385 if ( TMath::Abs(malambda-mLPDG)>fCutsRD[GetGlobalIndex(3,ptbin)] ) {
387 AliDebug(4,Form(" V0 mass is %2.2e and does not correspond to LambdaBar cut",malambda));
390 okLck0sp = okLck0sp && okK0spipi;
391 okLcLpi = okLcLpi && okLppi;
392 okLcLBarpi = okLcLBarpi && okLBarpip;
394 if (!okLck0sp && !okLcLpi && !okLcLBarpi) return 0;
396 // cuts on the minimum pt of the tracks
397 if (TMath::Abs(bachelorTrack->Pt()) < fCutsRD[GetGlobalIndex(4,ptbin)]) {
398 AliDebug(4,Form(" bachelor track Pt=%2.2e > %2.2e",bachelorTrack->Pt(),fCutsRD[GetGlobalIndex(4,ptbin)]));
401 if (TMath::Abs(v0positiveTrack->Pt()) < fCutsRD[GetGlobalIndex(5,ptbin)]) {
402 AliDebug(4,Form(" V0-positive track Pt=%2.2e > %2.2e",v0positiveTrack->Pt(),fCutsRD[GetGlobalIndex(5,ptbin)]));
405 if (TMath::Abs(v0negativeTrack->Pt()) < fCutsRD[GetGlobalIndex(6,ptbin)]) {
406 AliDebug(4,Form(" V0-negative track Pt=%2.2e > %2.2e",v0negativeTrack->Pt(),fCutsRD[GetGlobalIndex(6,ptbin)]));
410 // cut on cascade dca
411 //if (TMath::Abs(d->GetDCA()) > fCutsRD[GetGlobalIndex(7,ptbin)]) {
412 if ( TMath::Abs(d->GetDCA()) > fCutsRD[GetGlobalIndex(7,ptbin)] /*|| // prong-to-prong DCA
413 TMath::Abs(d->Getd0Prong(0)) > fCutsRD[GetGlobalIndex(7,ptbin)] || // rphi impact params w.r.t. Primary Vtx
414 TMath::Abs(d->Getd0Prong(1)) > fCutsRD[GetGlobalIndex(7,ptbin)]*/ ) { // rphi impact params w.r.t. Primary Vtx
415 AliDebug(4,Form(" cascade tracks DCA don't pass the cut"));
420 //if (TMath::Abs(v0->DcaV0Daughters()) > fCutsRD[GetGlobalIndex(8,ptbin)]) { // prong-to-prong DCA
421 if ( TMath::Abs(v0->GetDCA()) > fCutsRD[GetGlobalIndex(8,ptbin)] /*|| // prong-to-prong DCA
422 TMath::Abs(v0->DcaV0ToPrimVertex()) > fCutsRD[GetGlobalIndex(8,ptbin)] || // V0-to-vertex DCA
423 TMath::Abs(v0->DcaPosToPrimVertex()) > fCutsRD[GetGlobalIndex(8,ptbin)] || // prong-to-vertex DCA
424 TMath::Abs(v0->DcaNegToPrimVertex()) > fCutsRD[GetGlobalIndex(8,ptbin)]*/ ) { // prong-to-vertex DCA
425 AliDebug(4,Form(" V0 DCA don't pass the cut"));
431 Int_t returnvalue = okLck0sp+2*okLcLBarpi+4*okLcLpi;
436 3 Lc->K0S + p AND Lc->LambdaBar + pi
438 5 Lc->K0S + p AND Lc->Lambda + pi
439 6 Lc->LambdaBar + pi AND Lc->Lambda + pi
440 7 Lc->K0S + p AND Lc->LambdaBar + pi AND Lc->Lambda + pi
443 Int_t returnvaluePID = 7;
445 // selection on candidate
446 if (selectionLevel==AliRDHFCuts::kAll ||
447 //selectionLevel==AliRDHFCuts::kCandidate ||
448 selectionLevel==AliRDHFCuts::kPID )
449 returnvaluePID = IsSelectedPID(d);
451 //if (fUsePID && returnvaluePID==0) return 0;
453 Int_t returnvalueTot = 0;
455 returnvalueTot = CombinePIDCuts(returnvalue,returnvaluePID);
457 returnvalueTot = returnvalue;
459 return returnvalueTot;
462 //---------------------------------------------------------------------------
463 Int_t AliRDHFCutsLctoV0::IsSelectedPID(AliAODRecoDecayHF* obj) {
465 // fPidHF -> PID object for bachelor
466 // fPidHFV0pos -> PID object for positive V0 daughter
467 // fPidHFV0neg -> PID object for negative V0 daughter
469 if (!fUsePID || !obj) return 7; // all hypothesis are valid
471 AliAODRecoCascadeHF *objD = (AliAODRecoCascadeHF*)obj;
473 Bool_t isPeriodd = fPidHF->GetOnePad();
474 Bool_t isMC = fPidHF->GetMC();
477 fPidHFV0pos->SetOnePad(kTRUE);
478 fPidHFV0neg->SetOnePad(kTRUE);
481 fPidHFV0neg->SetMC(kTRUE);
482 fPidHFV0pos->SetMC(kTRUE);
485 AliAODTrack *bachelor = (AliAODTrack*)objD->GetBachelor();
486 AliAODTrack *v0Pos = (AliAODTrack*)objD->Getv0PositiveTrack();
487 AliAODTrack *v0Neg = (AliAODTrack*)objD->Getv0NegativeTrack();
489 if (!bachelor || !v0Pos || !v0Neg) return 0;
491 Bool_t okLcK0Sp = kTRUE; // K0S case
492 Bool_t okLcLambdaBarPi = kTRUE; // LambdaBar case
493 Bool_t okLcLambdaPi = kTRUE; // Lambda case
495 CheckPID(bachelor,v0Neg,v0Pos,okLcK0Sp,okLcLambdaBarPi,okLcLambdaPi);
497 Int_t returnvalue = okLcK0Sp+2*okLcLambdaBarPi+4*okLcLambdaPi;
501 //-----------------------
502 void AliRDHFCutsLctoV0::CheckPID(AliAODTrack *bachelor, AliAODTrack *v0Neg, AliAODTrack *v0Pos,
503 Bool_t &isBachelorID1, Bool_t &isV0NegID2, Bool_t &isV0PosID4) {
504 // identification strategy
506 Int_t trackIDtof = -1;
507 Int_t trackIDtpc = -1;
509 switch (fPidSelectionFlag) {
514 trackIDtof = fPidHF->ApplyPidTOFRaw(bachelor,4);
515 trackIDtpc = fPidHF->ApplyPidTPCRaw(bachelor,4);
516 AliDebug(1,Form(" fPidHF->ApplyPidTOFRaw(bachelor,4)=%d fPidHF->ApplyPidTPCRaw(bachelor,4)=%d",trackIDtof,trackIDtpc));
517 isBachelorID1 = (trackIDtof==4) && (trackIDtpc==4); // K0S case
518 //Bool_t isBachelorID2 = (fPidHF->ApplyPidTPCRaw(bachelor,2)==2) && (fPidHF->ApplyPidTOFRaw(bachelor,2)==2); // LambdaBar case
519 //Bool_t isBachelorID4 = isBachelorID2; // Lambda case
522 //Bool_t isV0NegID1 = (fPidHFV0neg->ApplyPidTPCRaw(v0Neg,2)==2) && (fPidHFV0neg->ApplyPidTOFRaw(v0Neg,2)==2); // K0S case
523 trackIDtof = fPidHFV0neg->ApplyPidTOFRaw(v0Neg,4);
524 trackIDtpc = fPidHFV0neg->ApplyPidTPCRaw(v0Neg,4);
525 AliDebug(1,Form(" fPidHFV0neg->ApplyPidTOFRaw(v0Neg,4)=%d fPidHFV0neg->ApplyPidTPCRaw(v0Neg,4)=%d",trackIDtof,trackIDtpc));
526 isV0NegID2 = (trackIDtof==4) && (trackIDtpc==4); // LambdaBar case
527 //Bool_t isV0NegID4 = isV0NegID1; // Lambda case
530 //Bool_t isV0PosID1 = (fPidHFV0pos->ApplyPidTPCRaw(v0Pos,2)==2) && (fPidHFV0pos->ApplyPidTOFRaw(v0Pos,2)==2); // K0S case
531 //Bool_t isV0PosID2 = isV0PosID1; // LambdaBar case
532 trackIDtof = fPidHFV0pos->ApplyPidTOFRaw(v0Pos,4);
533 trackIDtpc = fPidHFV0pos->ApplyPidTPCRaw(v0Pos,4);
534 AliDebug(1,Form(" fPidHFV0pos->ApplyPidTOFRaw(v0Pos,4)=%d fPidHFV0pos->ApplyPidTPCRaw(v0POS,4)=%d",trackIDtof,trackIDtpc));
535 isV0PosID4 = (trackIDtof==4) && (trackIDtpc==4); // Lambda case
541 trackIDtof = fPidHF->ApplyPidTOFRaw(bachelor,4);
542 trackIDtpc = fPidHF->ApplyPidTPCRaw(bachelor,4);
543 AliDebug(1,Form(" fPidHF->ApplyPidTOFRaw(bachelor,4)=%d fPidHFV0->ApplyPidTPCRaw(bachelor,4)=%d",trackIDtof,trackIDtpc));
544 isBachelorID1 = ( trackIDtof==4 );
545 Bool_t dummy1 = ( !(fPidHF->CheckTOFPIDStatus(bachelor)) && (trackIDtpc==4) &&
546 fPidHF->IsExcluded(bachelor,2,2.,"TPC") && fPidHF->IsExcluded(bachelor,3,2.,"TPC") ); // K0S case
547 isBachelorID1 = isBachelorID1 || dummy1;
551 trackIDtof = fPidHFV0neg->ApplyPidTOFRaw(v0Neg,4);
552 trackIDtpc = fPidHFV0neg->ApplyPidTPCRaw(v0Neg,4);
553 AliDebug(1,Form(" fPidHFV0neg->ApplyPidTOFRaw(v0Neg,4)=%d fPidHFV0neg->ApplyPidTPCRaw(v0Neg,4)=%d",trackIDtof,trackIDtpc));
554 isV0NegID2 = ( trackIDtof==4 );
555 Bool_t dummy2 = ( !(fPidHFV0neg->CheckTOFPIDStatus(v0Neg)) && (trackIDtpc==4) &&
556 fPidHFV0neg->IsExcluded(v0Neg,2,2.,"TPC") && fPidHFV0neg->IsExcluded(v0Neg,3,2.,"TPC") ); // LambdaBar case
557 isV0NegID2 = isV0NegID2 || dummy2;
561 trackIDtof = fPidHFV0pos->ApplyPidTOFRaw(v0Pos,4);
562 trackIDtpc = fPidHFV0pos->ApplyPidTPCRaw(v0Pos,4);
563 AliDebug(1,Form(" fPidHFV0pos->ApplyPidTOFRaw(v0Pos,4)=%d fPidHFV0pos->ApplyPidTPCRaw(v0Pos,4)=%d",trackIDtof,trackIDtpc));
564 isV0PosID4 = ( trackIDtof==4 );
565 Bool_t dummy4 = ( !(fPidHFV0pos->CheckTOFPIDStatus(v0Pos)) && (trackIDtpc==4) &&
566 fPidHFV0pos->IsExcluded(v0Pos,2,2.,"TPC") && fPidHFV0pos->IsExcluded(v0Pos,3,2.,"TPC") ); // Lambda case
567 isV0PosID4 = isV0PosID4 || dummy4;
576 Int_t AliRDHFCutsLctoV0::CombinePIDCuts(Int_t returnvalue, Int_t returnvaluePID) const {
577 // combine PID with topological cuts
579 Int_t returnvalueTot=returnvalue&returnvaluePID;
581 return returnvalueTot;
584 //----------------------------------
585 Int_t AliRDHFCutsLctoV0::IsSelectedSingleCut(TObject* obj, Int_t selectionLevel, Int_t cutIndex) {
587 // Apply selection on single cut
591 cout<<"Cut matrice not inizialized. Exit..."<<endl;
595 AliAODRecoCascadeHF* d = (AliAODRecoCascadeHF*)obj;
597 AliDebug(2,"AliAODRecoCascadeHF null");
601 // Get the v0 and all daughter tracks
602 AliAODTrack *bachelorTrack = (AliAODTrack*)d->GetBachelor();
603 if (!bachelorTrack) {
604 AliDebug(2,"No bachelor object");
609 //if ( fUseTrackSelectionWithFilterBits &&
610 //!(bachelorTrack->TestFilterMask(BIT(4))) ) return 0;
612 AliAODv0 *v0 = (AliAODv0*)d->Getv0();
614 AliDebug(2,"No v0 object");
618 // Get the V0 daughter tracks
619 AliAODTrack *v0positiveTrack = (AliAODTrack*)d->Getv0PositiveTrack();
620 AliAODTrack *v0negativeTrack = (AliAODTrack*)d->Getv0NegativeTrack();
621 if (!v0positiveTrack || !v0negativeTrack ) {
622 AliDebug(2,"No V0 daughters' objects");
626 // selection on daughter tracks
627 if (selectionLevel==AliRDHFCuts::kAll ||
628 selectionLevel==AliRDHFCuts::kTracks) {
630 if (fIsCandTrackSPDFirst && d->Pt()<fMaxPtCandTrackSPDFirst) {
631 if (!bachelorTrack->HasPointOnITSLayer(0)) return 0;
633 if (fTrackCuts && fV0daughtersCuts) {
634 AliAODVertex *vAOD = (AliAODVertex*)d->GetPrimaryVtx();
635 Double_t pos[3]; vAOD->GetXYZ(pos);
636 Double_t cov[6]; vAOD->GetCovarianceMatrix(cov);
637 const AliESDVertex vESD(pos,cov,100.,100);
638 if ( !(IsDaughterSelected(bachelorTrack,&vESD,fTrackCuts)) ||
639 !(IsDaughterSelected(v0negativeTrack,&vESD,fV0daughtersCuts)) ||
640 !(IsDaughterSelected(v0positiveTrack,&vESD,fV0daughtersCuts)) ) return 0;
642 //if (!AreDaughtersSelected(d)) return 0;
645 Bool_t okLck0sp=kFALSE, okLcLpi=kFALSE, okLcLBarpi=kFALSE;
647 // selection on candidate
648 if (selectionLevel==AliRDHFCuts::kAll ||
649 selectionLevel==AliRDHFCuts::kCandidate) {
651 Double_t pt = d->Pt();
652 Int_t ptbin = PtBin(pt);
654 Double_t mLcPDG = TDatabasePDG::Instance()->GetParticle(4122)->Mass();
655 Double_t mk0sPDG = TDatabasePDG::Instance()->GetParticle(310)->Mass();
656 Double_t mLPDG = TDatabasePDG::Instance()->GetParticle(3122)->Mass();
659 Double_t mk0s = v0->MassK0Short();
660 Double_t mLck0sp = d->InvMassLctoK0sP();
663 Double_t mlambda = v0->MassLambda();
664 Double_t malambda = v0->MassAntiLambda();
665 Double_t mLcLpi = d->InvMassLctoLambdaPi();
669 // cut on Lc mass with K0S+p hypothesis
670 okLck0sp = TMath::Abs(mLck0sp-mLcPDG)<=fCutsRD[GetGlobalIndex(0,ptbin)];
675 // cut on Lc mass with Lambda+pi hypothesis
677 okLcLpi = TMath::Abs(mLcLpi-mLcPDG)<=fCutsRD[GetGlobalIndex(1,ptbin)];
678 okLcLBarpi = okLcLpi;
681 // cuts on the V0 mass: K0S case
682 okLck0sp = TMath::Abs(mk0s-mk0sPDG)<=fCutsRD[GetGlobalIndex(2,ptbin)];
687 // cuts on the V0 mass: Lambda/LambdaBar case
689 okLcLpi = TMath::Abs(mlambda-mLPDG)<=fCutsRD[GetGlobalIndex(3,ptbin)];
690 okLcLBarpi = TMath::Abs(malambda-mLPDG)<=fCutsRD[GetGlobalIndex(3,ptbin)];
693 // cuts on the minimum pt of bachelor
694 okLck0sp = TMath::Abs(bachelorTrack->Pt())>=fCutsRD[GetGlobalIndex(4,ptbin)];
696 okLcLBarpi = okLck0sp;
699 // cuts on the minimum pt of positive V0daughter
700 okLck0sp = TMath::Abs(v0positiveTrack->Pt())>=fCutsRD[GetGlobalIndex(5,ptbin)];
702 okLcLBarpi = okLck0sp;
705 // cuts on the minimum pt of negative V0daughter
706 okLck0sp = TMath::Abs(v0negativeTrack->Pt())>=fCutsRD[GetGlobalIndex(6,ptbin)];
708 okLcLBarpi = okLck0sp;
711 // cut on cascade dca
712 //okLck0sp = TMath::Abs(d->GetDCA(0))<=fCutsRD[GetGlobalIndex(8,ptbin)];
713 okLck0sp = TMath::Abs(d->GetDCA())<=fCutsRD[GetGlobalIndex(7,ptbin)] /*&&
714 TMath::Abs(d->Getd0Prong(0))<=fCutsRD[GetGlobalIndex(7,ptbin)] &&
715 TMath::Abs(d->Getd0Prong(1))<=fCutsRD[GetGlobalIndex(7,ptbin)]*/;
717 okLcLBarpi = okLck0sp;
721 //okLck0sp = TMath::Abs(v0->DcaV0Daughters())<=fCutsRD[GetGlobalIndex(7,ptbin)];
722 okLck0sp = TMath::Abs(v0->GetDCA())<=fCutsRD[GetGlobalIndex(8,ptbin)] /*&&
723 TMath::Abs(v0->DcaV0ToPrimVertex())<=fCutsRD[GetGlobalIndex(8,ptbin)] &&
724 TMath::Abs(v0->DcaPosToPrimVertex())<=fCutsRD[GetGlobalIndex(8,ptbin)] &&
725 TMath::Abs(v0->DcaNegToPrimVertex())<=fCutsRD[GetGlobalIndex(8,ptbin)]*/;
727 okLcLBarpi = okLck0sp;
733 Int_t returnvalue = okLck0sp+2*okLcLBarpi+4*okLcLpi;
738 3 Lc->K0S + p AND Lc->LambdaBar + pi
740 5 Lc->K0S + p AND Lc->Lambda + pi
741 6 Lc->LambdaBar + pi AND Lc->Lambda + pi
742 7 Lc->K0S + p AND Lc->LambdaBar + pi AND Lc->Lambda + pi
747 Int_t returnvaluePID = 7;
750 if (selectionLevel==AliRDHFCuts::kAll ||
751 //selectionLevel==AliRDHFCuts::kCandidate ||
752 selectionLevel==AliRDHFCuts::kPID )
753 returnvaluePID = IsSelectedPID(d);
756 Int_t returnvalueTot = 0;
758 //returnvalueTot = CombinePIDCuts(returnvalue,returnvaluePID);
760 returnvalueTot = returnvalue;
762 return returnvalueTot;
765 //----------------------------------
766 void AliRDHFCutsLctoV0::SetStandardCutsPP2010() {
768 SetName("LctoV0ProductionCuts");
769 SetTitle("Production cuts for Lc->V0+bachelor analysis");
771 AliESDtrackCuts* esdTrackCuts=new AliESDtrackCuts();
772 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
774 esdTrackCuts->SetRequireTPCRefit(kTRUE);
775 esdTrackCuts->SetRequireITSRefit(kTRUE);
776 esdTrackCuts->SetMinNClustersITS(0);//(4); // default is 5
777 esdTrackCuts->SetMinNClustersTPC(70);
778 //esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
779 // AliESDtrackCuts::kAny);
780 // default is kBoth, otherwise kAny
781 esdTrackCuts->SetMinDCAToVertexXY(0.);
782 esdTrackCuts->SetPtRange(0.3,1.e10);
783 //esdTrackCuts->SetEtaRange(-0.8,+0.8);
784 esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
785 AddTrackCuts(esdTrackCuts);
788 AliESDtrackCuts* esdTrackCutsV0daughters=new AliESDtrackCuts();
789 esdTrackCutsV0daughters->SetRequireSigmaToVertex(kFALSE);
791 esdTrackCutsV0daughters->SetRequireTPCRefit(kTRUE);
792 esdTrackCutsV0daughters->SetRequireITSRefit(kFALSE);//(kTRUE);
793 esdTrackCutsV0daughters->SetMinNClustersITS(0);//(4); // default is 5
794 esdTrackCutsV0daughters->SetMinNClustersTPC(70);
795 //esdTrackCutsV0daughters->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
796 // AliESDtrackCuts::kAny);
797 // default is kBoth, otherwise kAny
798 esdTrackCutsV0daughters->SetMinDCAToVertexXY(0.);
799 esdTrackCutsV0daughters->SetPtRange(0.,1.e10);
800 esdTrackCutsV0daughters->SetAcceptKinkDaughters(kFALSE);
801 AddTrackCutsV0daughters(esdTrackCutsV0daughters);
803 const Int_t nptbins=1;
805 ptbins=new Float_t[nptbins+1];
809 SetPtBins(nptbins+1,ptbins);
810 SetPtBins(nptbins+1,ptbins);
812 const Int_t nvars=9 ;
814 Float_t** prodcutsval;
815 prodcutsval=new Float_t*[nvars];
816 for(Int_t ic=0;ic<nvars;ic++){prodcutsval[ic]=new Float_t[nptbins];}
817 for(Int_t ipt2=0;ipt2<nptbins;ipt2++){
818 prodcutsval[0][ipt2]=1.; // inv. mass if K0S [GeV/c2]
819 prodcutsval[1][ipt2]=1.; // inv. mass if Lambda [GeV/c2]
820 prodcutsval[2][ipt2]=0.05; // inv. mass V0 if K0S [GeV/c2]
821 prodcutsval[3][ipt2]=0.05; // inv. mass V0 if Lambda [GeV/c2]
822 prodcutsval[4][ipt2]=0.3; // pT min bachelor track [GeV/c] // AOD by construction
823 prodcutsval[5][ipt2]=0.; // pT min V0-positive track [GeV/c]
824 prodcutsval[6][ipt2]=0.; // pT min V0-negative track [GeV/c]
825 prodcutsval[7][ipt2]=1000.; // dca cascade cut [cm]
826 prodcutsval[8][ipt2]=1000.; // dca V0 cut [nSigma] // it's 1.5 x offline V0s
828 SetCuts(nvars,nptbins,prodcutsval);
830 SetGlobalIndex(nvars,nptbins);
831 SetPtBins(nptbins+1,ptbins);
835 //1. bachelor: default one
836 AliAODPidHF* pidObjBachelor = new AliAODPidHF();
837 Double_t sigmasBac[5]={3.,1.,1.,3.,3.}; // 0, 1(A), 2(A) -> TPC; 3 -> TOF; 4 -> ITS
838 pidObjBachelor->SetSigma(sigmasBac);
839 pidObjBachelor->SetAsym(kFALSE);
840 pidObjBachelor->SetMatch(1);
841 pidObjBachelor->SetTPC(kTRUE);
842 pidObjBachelor->SetTOF(kTRUE);
843 pidObjBachelor->SetTOFdecide(kFALSE);
844 SetPidHF(pidObjBachelor);
847 AliAODPidHF* pidObjV0pos = new AliAODPidHF();
848 Double_t sigmasV0pos[5]={3.,1.,1.,3.,3.}; // 0, 1(A), 2(A) -> TPC; 3 -> TOF; 4 -> ITS
849 pidObjV0pos->SetSigma(sigmasV0pos);
850 pidObjV0pos->SetAsym(kFALSE);
851 pidObjV0pos->SetMatch(1);
852 pidObjV0pos->SetTPC(kTRUE);
853 pidObjV0pos->SetTOF(kTRUE);
854 pidObjV0pos->SetTOFdecide(kFALSE);
855 SetPidV0pos(pidObjV0pos);
858 AliAODPidHF* pidObjV0neg = new AliAODPidHF();
859 Double_t sigmasV0neg[5]={3.,1.,1.,3.,3.}; // 0, 1(A), 2(A) -> TPC; 3 -> TOF; 4 -> ITS
860 pidObjV0neg->SetSigma(sigmasV0neg);
861 pidObjV0neg->SetAsym(kFALSE);
862 pidObjV0neg->SetMatch(1);
863 pidObjV0neg->SetTPC(kTRUE);
864 pidObjV0neg->SetTOF(kTRUE);
865 pidObjV0neg->SetTOFdecide(kFALSE);
866 SetPidV0neg(pidObjV0neg);
868 SetUsePID(kFALSE);//(kTRUE);
872 for(Int_t iiv=0;iiv<nvars;iiv++){
873 delete [] prodcutsval[iiv];
875 delete [] prodcutsval;
881 delete pidObjBachelor;
893 void AliRDHFCutsLctoV0::SetStandardCutsPbPb2010() {
895 SetName("LctoV0ProductionCuts");
896 SetTitle("Production cuts for Lc->V0+bachelor analysis");
898 SetStandardCutsPP2010();
903 void AliRDHFCutsLctoV0::SetStandardCutsPbPb2011() {
905 // Default 2010 PbPb cut object
906 SetStandardCutsPbPb2010();
909 // Enable all 2011 PbPb run triggers
912 ResetMaskAndEnableMBTrigger();
913 EnableCentralTrigger();
914 EnableSemiCentralTrigger();
917 //-----------------------
918 Int_t AliRDHFCutsLctoV0::GetV0Type(){
920 const Int_t nvars = this->GetNVars() ;
921 //Float_t *vArray =GetCuts();
922 //fV0Type = vArray[nvars-1];
923 fV0Type = (this->GetCuts())[nvars-1];
924 //this->GetCuts(vArray);
925 TString *sVarNames=GetVarNames();
927 if(sVarNames[nvars-1].Contains("V0 type")) return (Int_t)fV0Type;
928 else {AliInfo("AliRDHFCutsLctoV0 Last variable is not the Vo type!!!"); return -999;}