]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGHF/vertexingHF/AliRDHFCutsLctopKpi.cxx
Enable usage of compatibility band for PID (A. Rossi)
[u/mrichter/AliRoot.git] / PWGHF / vertexingHF / AliRDHFCutsLctopKpi.cxx
index d24db45bf98cb4012c7afabbdc3883304565a15b..bf6daa31d8009cdb1650dcf54b06d38146312199 100644 (file)
@@ -24,6 +24,9 @@
 
 #include <TDatabasePDG.h>
 #include <Riostream.h>
+#include <AliAnalysisManager.h>
+#include <AliInputEventHandler.h>
+#include <AliPIDResponse.h>
 
 #include "AliRDHFCutsLctopKpi.h"
 #include "AliAODRecoDecayHF3Prong.h"
@@ -33,6 +36,9 @@
 #include "AliKFParticle.h"
 #include "AliESDVertex.h"
 
+using std::cout;
+using std::endl;
+
 ClassImp(AliRDHFCutsLctopKpi)
 
 //--------------------------------------------------------------------------
@@ -42,7 +48,8 @@ fPidObjprot(0),
 fPidObjpion(0),
 fUseImpParProdCorrCut(kFALSE),
 fPIDStrategy(kNSigma),
-fCutsStrategy(kStandard)
+fCutsStrategy(kStandard),
+fUseSpecialCut(kFALSE)
 {
   //
   // Default Constructor
@@ -103,7 +110,8 @@ AliRDHFCutsLctopKpi::AliRDHFCutsLctopKpi(const AliRDHFCutsLctopKpi &source) :
   fPidObjpion(0x0),
   fUseImpParProdCorrCut(source.fUseImpParProdCorrCut),
   fPIDStrategy(source.fPIDStrategy),
-  fCutsStrategy(source.fCutsStrategy)
+  fCutsStrategy(source.fCutsStrategy),
+  fUseSpecialCut(source.fUseSpecialCut)
 {
   //
   // Copy constructor
@@ -163,7 +171,7 @@ void AliRDHFCutsLctopKpi::GetCutVarsForOpt(AliAODRecoDecayHF *d,Float_t *vars,In
 
   AliAODRecoDecayHF3Prong *dd = (AliAODRecoDecayHF3Prong*)d;
 
-    Int_t iter=-1;
+  Int_t iter=-1;
   if(fVarsForOpt[0]){
     iter++;
     vars[iter]=dd->InvMassLcpKpi();
@@ -250,14 +258,14 @@ Int_t AliRDHFCutsLctopKpi::IsSelected(TObject* obj,Int_t selectionLevel,AliAODEv
   //
 
   if(!fCutsRD){
-    cout<<"Cut matrice not inizialized. Exit..."<<endl;
+    AliError("Cut matrice not inizialized. Exit...\n");
     return 0;
   }
   //PrintAll();
   AliAODRecoDecayHF3Prong* d=(AliAODRecoDecayHF3Prong*)obj;
 
   if(!d){
-    cout<<"AliAODRecoDecayHF3Prong null"<<endl;
+    AliError("AliAODRecoDecayHF3Prong null \n");
     return 0;
   }
 
@@ -270,25 +278,51 @@ Int_t AliRDHFCutsLctopKpi::IsSelected(TObject* obj,Int_t selectionLevel,AliAODEv
   if(d->Pt()<fMinPtCand) return 0;
   if(d->Pt()>fMaxPtCand) return 0;
 
-  if(d->HasBadDaughters()) return 0;
+  if(fUseTrackSelectionWithFilterBits && d->HasBadDaughters()) return 0;
+
+
+  // selection on daughter tracks 
+  if(selectionLevel==AliRDHFCuts::kAll || 
+     selectionLevel==AliRDHFCuts::kTracks) {
+    if(!AreDaughtersSelected(d)) return 0;
+  }
+
 
+  // PID selection
   if(selectionLevel==AliRDHFCuts::kAll ||
      selectionLevel==AliRDHFCuts::kCandidate|| 
      selectionLevel==AliRDHFCuts::kPID) {
-     switch (fPIDStrategy) {
-      case kNSigma:
-       returnvaluePID = IsSelectedPID(d);
-    
+    switch (fPIDStrategy) {
+    case kNSigma:
+      returnvaluePID = IsSelectedPID(d);
       break;
-      case kCombined:
-       returnvaluePID = IsSelectedCombinedPID(d);
+     case kNSigmaPbPb:
+      returnvaluePID = IsSelectedNSigmaPbPb(d);
       break;
-     }
-     fIsSelectedPID=returnvaluePID;
+    case kCombined:
+      returnvaluePID = IsSelectedCombinedPID(d);
+      break;
+    case kCombinedSoft:
+      returnvaluePID = IsSelectedCombinedPIDSoft(d);
+      break;
+    case kNSigmaStrong:
+      returnvaluePID = IsSelectedPIDStrong(d);
+      break;
+    case kCombinedpPb:
+      returnvaluePID = IsSelectedCombinedPIDpPb(d);
+      break;
+    case kCombinedpPb2:
+      returnvaluePID = IsSelectedCombinedPIDpPb2(d);
+      break;
+    }
+    fIsSelectedPID=returnvaluePID;
   }
   //  if(fUsePID || selectionLevel==AliRDHFCuts::kPID) returnvaluePID = IsSelectedCombinedPID(d);   // to test!!
   if(returnvaluePID==0) return 0;
 
+
+
+
   // selection on candidate
   if(selectionLevel==AliRDHFCuts::kAll || 
      selectionLevel==AliRDHFCuts::kCandidate) {
@@ -297,7 +331,7 @@ Int_t AliRDHFCutsLctopKpi::IsSelected(TObject* obj,Int_t selectionLevel,AliAODEv
     
     Int_t ptbin=PtBin(pt);
     
-    Double_t mLcpKpi,mLcpiKp;
+    Double_t mLcpKpi=0.,mLcpiKp=0.;
     Int_t okLcpKpi=1,okLcpiKp=1;
 
     Double_t mLcPDG = TDatabasePDG::Instance()->GetParticle(4122)->Mass();
@@ -313,13 +347,18 @@ Int_t AliRDHFCutsLctopKpi::IsSelected(TObject* obj,Int_t selectionLevel,AliAODEv
 
     case kStandard:
     if(TMath::Abs(d->PtProng(1)) < fCutsRD[GetGlobalIndex(1,ptbin)] || TMath::Abs(d->Getd0Prong(1))<fCutsRD[GetGlobalIndex(3,ptbin)]) return 0;//Kaon
+    if(d->Pt()>=3. && d->PProng(1)<0.55) return 0;
+    if(fUseSpecialCut) {
+      if(TMath::Abs(d->PtProng(0)) < TMath::Abs(d->PtProng(2)) )okLcpKpi=0;
+      if(TMath::Abs(d->PtProng(2)) < TMath::Abs(d->PtProng(0)) )okLcpiKp=0;
+    }
     if((TMath::Abs(d->PtProng(0)) < fCutsRD[GetGlobalIndex(2,ptbin)]) || (TMath::Abs(d->PtProng(2)) < fCutsRD[GetGlobalIndex(12,ptbin)])) okLcpKpi=0;
     if((TMath::Abs(d->PtProng(2)) < fCutsRD[GetGlobalIndex(2,ptbin)]) || (TMath::Abs(d->PtProng(0)) < fCutsRD[GetGlobalIndex(12,ptbin)]))okLcpiKp=0;
     if(!okLcpKpi && !okLcpiKp) return 0;
     //2track cuts
     if(d->GetDist12toPrim()<fCutsRD[GetGlobalIndex(5,ptbin)]|| d->GetDist23toPrim()<fCutsRD[GetGlobalIndex(5,ptbin)]) return 0;
-    if(d->GetDist12toPrim()>1.) return 0;
-    if(d->GetDist23toPrim()>1.) return 0;
+    if(d->GetDist12toPrim()>0.5) return 0;
+    if(d->GetDist23toPrim()>0.5) return 0;
     if(fUseImpParProdCorrCut){
       if(d->Getd0Prong(0)*d->Getd0Prong(1)<0. && d->Getd0Prong(2)*d->Getd0Prong(1)<0.) return 0;
     }
@@ -374,12 +413,6 @@ Int_t AliRDHFCutsLctopKpi::IsSelected(TObject* obj,Int_t selectionLevel,AliAODEv
    
   }
 
-  // selection on daughter tracks 
-  if(selectionLevel==AliRDHFCuts::kAll || 
-     selectionLevel==AliRDHFCuts::kTracks) {
-    if(!AreDaughtersSelected(d)) return 0;
-  }
-
 
   Int_t returnvalueTot=CombinePIDCuts(returnvalue,returnvaluePID);
   return returnvalueTot;
@@ -405,31 +438,60 @@ Int_t AliRDHFCutsLctopKpi::IsSelectedPID(AliAODRecoDecayHF* obj) {
      fPidObjpion->SetMC(kTRUE);
     }
 
+   if(fPidObjprot->GetPidResponse()==0x0){
+      AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
+      AliInputEventHandler *inputHandler=(AliInputEventHandler*)mgr->GetInputEventHandler();
+      AliPIDResponse *pidResp=inputHandler->GetPIDResponse();
+      fPidObjprot->SetPidResponse(pidResp);
+    }
+    if(fPidObjpion->GetPidResponse()==0x0){
+      AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
+      AliInputEventHandler *inputHandler=(AliInputEventHandler*)mgr->GetInputEventHandler();
+      AliPIDResponse *pidResp=inputHandler->GetPIDResponse();
+      fPidObjpion->SetPidResponse(pidResp);
+    }
+    if(fPidHF->GetPidResponse()==0x0){
+      AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
+      AliInputEventHandler *inputHandler=(AliInputEventHandler*)mgr->GetInputEventHandler();
+      AliPIDResponse *pidResp=inputHandler->GetPIDResponse();
+      fPidHF->SetPidResponse(pidResp);
+    }
+
     for(Int_t i=0;i<3;i++){
      AliAODTrack *track=(AliAODTrack*)obj->GetDaughter(i);
      if(!track) return 0;
      // identify kaon
+     if(track->P()<0.55){
+      fPidHF->SetTOF(kFALSE);
+      fPidHF->SetTOFdecide(kFALSE);
+     }
      if(i==1) {
       Int_t isKaon=fPidHF->MakeRawPid(track,3); 
-      if(isKaon>=1) {
-       iskaon1=kTRUE;
-      if(fPidHF->MakeRawPid(track,2)>=1) iskaon1=kFALSE;
+      if(isKaon>=1) iskaon1=kTRUE;
+      if(track->P()<0.55){
+       fPidHF->SetTOF(kTRUE);
+       fPidHF->SetTOFdecide(kTRUE);
       }
+      
       if(!iskaon1) return 0;
      
      }else{
      //pion or proton
+    if(track->P()<1.){
+      fPidObjprot->SetTOF(kFALSE);
+      fPidObjprot->SetTOFdecide(kFALSE);
+     }
       
      Int_t isProton=fPidObjprot->MakeRawPid(track,4);
-     if(isProton>=1){
-      if(fPidHF->MakeRawPid(track,2)>=1) isProton=-1;
-      if(fPidHF->MakeRawPid(track,3)>=1) isProton=-1;
-     }
+     
 
      Int_t isPion=fPidObjpion->MakeRawPid(track,2);
-     if(fPidHF->MakeRawPid(track,3)>=1) isPion=-1;
-     if(fPidObjprot->MakeRawPid(track,4)>=1) isPion=-1;
-
+     
+     if(track->P()<1.){
+      fPidObjprot->SetTOF(kTRUE);
+      fPidObjprot->SetTOFdecide(kTRUE);
+     }
+     
 
      if(i==0) {
       if(isPion<0) ispion0=kFALSE;
@@ -453,11 +515,91 @@ Int_t AliRDHFCutsLctopKpi::IsSelectedPID(AliAODRecoDecayHF* obj) {
 
  return returnvalue;
 }
-//---------------------------------------------------------------------------
-Int_t AliRDHFCutsLctopKpi::IsSelectedCombinedPID(AliAODRecoDecayHF* obj) {
 
-  //  Printf(" -------- IsSelectedCombinedPID --------------");
+//--------------------------------------------------------------------------
+
+Int_t AliRDHFCutsLctopKpi::IsSelectedNSigmaPbPb(AliAODRecoDecayHF* obj) {
+
+
+  if(!fUsePID || !obj) return 3;
+  Int_t okLcpKpi=0,okLcpiKp=0;
+  Int_t returnvalue=0;
+  Bool_t isPeriodd=fPidHF->GetOnePad();
+  Bool_t isMC=fPidHF->GetMC();
+  Bool_t ispion0=kTRUE,ispion2=kTRUE;
+  Bool_t isproton0=kFALSE,isproton2=kFALSE;
+  Bool_t iskaon1=kFALSE;
+  if(isPeriodd) {
+    fPidObjprot->SetOnePad(kTRUE);
+    fPidObjpion->SetOnePad(kTRUE);
+  }
+  if(isMC) {
+    fPidObjprot->SetMC(kTRUE);
+    fPidObjpion->SetMC(kTRUE);
+  }
+
+  if(fPidObjprot->GetPidResponse()==0x0){
+    AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
+    AliInputEventHandler *inputHandler=(AliInputEventHandler*)mgr->GetInputEventHandler();
+    AliPIDResponse *pidResp=inputHandler->GetPIDResponse();
+    fPidObjprot->SetPidResponse(pidResp);
+  }
+  if(fPidObjpion->GetPidResponse()==0x0){
+    AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
+    AliInputEventHandler *inputHandler=(AliInputEventHandler*)mgr->GetInputEventHandler();
+    AliPIDResponse *pidResp=inputHandler->GetPIDResponse();
+    fPidObjpion->SetPidResponse(pidResp);
+  }
+  if(fPidHF->GetPidResponse()==0x0){
+    AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
+    AliInputEventHandler *inputHandler=(AliInputEventHandler*)mgr->GetInputEventHandler();
+    AliPIDResponse *pidResp=inputHandler->GetPIDResponse();
+    fPidHF->SetPidResponse(pidResp);
+  }
+
+  for(Int_t i=0;i<3;i++){
+    AliAODTrack *track=(AliAODTrack*)obj->GetDaughter(i);
+    if(!track) return 0;
+
+    if(i==1) {
+      //kaon
+      Int_t isKaon=fPidHF->MakeRawPid(track,3); 
+      if(isKaon>=1) iskaon1=kTRUE;
+      if(!iskaon1) return 0;
+    }
+
+    else {
+      //pion or proton
+      Int_t isProton=fPidObjprot->MakeRawPid(track,4);
+      Int_t isPion=fPidObjpion->MakeRawPid(track,2);
 
+      if(i==0) {
+       if(isPion<0) ispion0=kFALSE;
+       if(isProton>=1) isproton0=kTRUE;
+      }
+      if(!ispion0 && !isproton0) return 0;
+
+      if(i==2) {
+       if(isPion<0) ispion2=kFALSE;
+       if(isProton>=1) isproton2=kTRUE;
+      }
+    }
+  }
+
+  if(ispion2 && isproton0 && iskaon1) okLcpKpi=1;
+  if(ispion0 && isproton2 && iskaon1) okLcpiKp=1;
+  if(okLcpKpi) returnvalue=1; //cuts passed as Lc->pKpi
+  if(okLcpiKp) returnvalue=2; //cuts passed as Lc->piKp
+  if(okLcpKpi && okLcpiKp) returnvalue=3; //cuts passed as both pKpi and piKp
+
+  return returnvalue;
+}
+
+
+
+
+//---------------------------------------------------------------------------
+Int_t AliRDHFCutsLctopKpi::IsSelectedCombinedPID(AliAODRecoDecayHF* obj) {
     
     if(!fUsePID || !obj) {return 3;}
     Int_t okLcpKpi=0,okLcpiKp=0;
@@ -481,9 +623,18 @@ Int_t AliRDHFCutsLctopKpi::IsSelectedCombinedPID(AliAODRecoDecayHF* obj) {
     Double_t prob0[AliPID::kSPECIES];
     Double_t prob1[AliPID::kSPECIES];
     Double_t prob2[AliPID::kSPECIES];
+    if(obj->Pt()<3. && track0->P()<1.) fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC);
     fPidHF->GetPidCombined()->ComputeProbabilities(track0,fPidHF->GetPidResponse(),prob0);
+    if(obj->Pt()<3. && track0->P()<1.) fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC|AliPIDResponse::kDetTOF);
+
+   if(obj->Pt()<3. && track1->P()<0.55) fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC);
     fPidHF->GetPidCombined()->ComputeProbabilities(track1,fPidHF->GetPidResponse(),prob1);
+   if(obj->Pt()<3. && track1->P()<0.55) fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC|AliPIDResponse::kDetTOF);
+
+    if(obj->Pt()<3. && track2->P()<1.) fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC);
     fPidHF->GetPidCombined()->ComputeProbabilities(track2,fPidHF->GetPidResponse(),prob2);
+   if(obj->Pt()<3. && track2->P()<1.) fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC|AliPIDResponse::kDetTOF);
+
     if(fPIDThreshold[AliPID::kPion]>0. && fPIDThreshold[AliPID::kKaon]>0. && fPIDThreshold[AliPID::kProton]>0.){
     okLcpiKp=  (prob0[AliPID::kPion  ]>fPIDThreshold[AliPID::kPion  ])
              &&(prob1[AliPID::kKaon  ]>fPIDThreshold[AliPID::kKaon  ])
@@ -547,16 +698,20 @@ void AliRDHFCutsLctopKpi::SetStandardCutsPP2010() {
  esdTrackCuts->SetPtRange(0.3,1.e10);
  AddTrackCuts(esdTrackCuts);
 
- const Int_t nptbins=4;
+ const Int_t nptbins=8;
  const Int_t nvars=13;
  Float_t* ptbins;
  ptbins=new Float_t[nptbins+1];
  
- ptbins[0]=0.;
+ ptbins[0]=1.;
  ptbins[1]=2.;
  ptbins[2]=3.;
  ptbins[3]=4.;
- ptbins[4]=9999.;
+ ptbins[4]=5.;
+ ptbins[5]=6.;
+ ptbins[6]=8.;
+ ptbins[7]=10.;
+ ptbins[8]=20.;
 
  SetGlobalIndex(nvars,nptbins);
  SetPtBins(nptbins+1,ptbins);
@@ -568,12 +723,12 @@ void AliRDHFCutsLctopKpi::SetStandardCutsPP2010() {
  }
 
  for(Int_t ipt=0;ipt<nptbins;ipt++){
-  prodcutsval[0][ipt]=0.18;
+  prodcutsval[0][ipt]=0.13;
   prodcutsval[1][ipt]=0.4;
-  prodcutsval[2][ipt]=0.5;
+  prodcutsval[2][ipt]=0.4;
   prodcutsval[3][ipt]=0.;
   prodcutsval[4][ipt]=0.;
-  prodcutsval[5][ipt]=0.01;
+  prodcutsval[5][ipt]=0.;
   prodcutsval[6][ipt]=0.06;
   prodcutsval[7][ipt]=0.005;
   prodcutsval[8][ipt]=0.;
@@ -620,7 +775,8 @@ void AliRDHFCutsLctopKpi::SetStandardCutsPP2010() {
  SetPidprot(pidObjp);
 
  SetUsePID(kTRUE);
-
+ SetOptPileup(kTRUE);
  PrintAll();
 
  for(Int_t iiv=0;iiv<nvars;iiv++){
@@ -631,6 +787,10 @@ void AliRDHFCutsLctopKpi::SetStandardCutsPP2010() {
  delete [] ptbins;
  ptbins=NULL;
 
+ delete pidObjK;
+ pidObjK=NULL;
+ delete pidObjpi;
+ pidObjpi=NULL;
  delete pidObjp;
  pidObjp=NULL;
 
@@ -654,19 +814,24 @@ void AliRDHFCutsLctopKpi::SetStandardCutsPbPb2010() {
  esdTrackCuts->SetEtaRange(-0.8,0.8);
  esdTrackCuts->SetMaxDCAToVertexXY(1.);
  esdTrackCuts->SetMaxDCAToVertexZ(1.);
- esdTrackCuts->SetPtRange(0.8,1.e10);
+ esdTrackCuts->SetPtRange(0.49,1.e10);
  AddTrackCuts(esdTrackCuts);
 
- const Int_t nptbins=4;
+ const Int_t nptbins=8;
  const Int_t nvars=13;
  Float_t* ptbins;
  ptbins=new Float_t[nptbins+1];
  
- ptbins[0]=0.;
+ ptbins[0]=1.;
  ptbins[1]=2.;
  ptbins[2]=3.;
  ptbins[3]=4.;
- ptbins[4]=9999.;
+ ptbins[4]=5.;
+ ptbins[5]=6.;
+ ptbins[6]=8.;
+ ptbins[7]=10.;
+ ptbins[8]=99999.;
+
 
  SetGlobalIndex(nvars,nptbins);
  SetPtBins(nptbins+1,ptbins);
@@ -694,40 +859,25 @@ void AliRDHFCutsLctopKpi::SetStandardCutsPbPb2010() {
  }
  SetCuts(nvars,nptbins,prodcutsval);
 
- AliAODPidHF* pidObjK=new AliAODPidHF();
- Double_t sigmasK[5]={3.,1.,1.,3.,2.};
- pidObjK->SetSigma(sigmasK);
- pidObjK->SetAsym(kTRUE);
- pidObjK->SetMatch(1);
- pidObjK->SetTPC(kTRUE);
- pidObjK->SetTOF(kTRUE);
- pidObjK->SetITS(kTRUE);
- Double_t plimK[2]={0.5,0.8};
- pidObjK->SetPLimit(plimK,2);
-
- SetPidHF(pidObjK);
-
- AliAODPidHF* pidObjpi=new AliAODPidHF();
- pidObjpi->SetTPC(kTRUE);
- Double_t sigmaspi[5]={3.,0.,0.,0.,0.};
- pidObjpi->SetSigma(sigmaspi);
- SetPidpion(pidObjpi);
+ AliAODPidHF* pidObj=new AliAODPidHF();
+ pidObj->SetTPC(kTRUE);
+ pidObj->SetTOF(kTRUE);
+ SetPidHF(pidObj);
+ SetPidpion(pidObj);
+ SetPidprot(pidObj);
 
- AliAODPidHF* pidObjp=new AliAODPidHF();
- Double_t sigmasp[5]={3.,1.,1.,3.,2.};
- pidObjp->SetSigma(sigmasp);
- pidObjp->SetAsym(kTRUE);
- pidObjp->SetMatch(1);
- pidObjp->SetTPC(kTRUE);
- pidObjp->SetTOF(kTRUE);
- pidObjp->SetITS(kTRUE);
- Double_t plimp[2]={1.,2.};
- pidObjp->SetPLimit(plimp,2);
-
- SetPidprot(pidObjp);
 
+ // bayesian pid
+ GetPidHF()->SetUseCombined(kTRUE);
+ GetPidHF()->SetUseDefaultPriors(kTRUE);
+ GetPidHF()->SetCombDetectors(AliAODPidHF::kTPCTOF);
+ for (Int_t ispecies=0;ispecies<AliPID::kSPECIES;++ispecies){
+   SetPIDThreshold(static_cast<AliPID::EParticleType>(ispecies),0);
+ }
+ SetPIDStrategy(AliRDHFCutsLctopKpi::kCombinedpPb);
  SetUsePID(kTRUE);
 
+
  PrintAll();
 
  for(Int_t iiv=0;iiv<nvars;iiv++){
@@ -738,8 +888,8 @@ void AliRDHFCutsLctopKpi::SetStandardCutsPbPb2010() {
  delete [] ptbins;
  ptbins=NULL;
 
- delete pidObjp;
- pidObjp=NULL;
+ delete pidObj;
+ pidObj=NULL;
 
  return;
 }
@@ -790,22 +940,458 @@ void AliRDHFCutsLctopKpi::SetStandardCutsPbPb2011() {
 Bool_t AliRDHFCutsLctopKpi::IsInFiducialAcceptance(Double_t pt, Double_t y) const
 {
   //
-  //  // Checking if Dplus is in fiducial acceptance region 
+  //  // Checking if Lc is in fiducial acceptance region 
   //    //
   //
+  if(fMaxRapidityCand>-998.){
+    if(TMath::Abs(y) > fMaxRapidityCand) return kFALSE;
+    else return kTRUE;
+  }
+
   if(pt > 5.) {
     // applying cut for pt > 5 GeV
-   AliDebug(2,Form("pt of D+ = %f (> 5), cutting at |y| < 0.8",pt));
+   AliDebug(2,Form("pt of Lc = %f (> 5), cutting at |y| < 0.8",pt));
    if (TMath::Abs(y) > 0.8) return kFALSE;
   
   } else {
    // appliying smooth cut for pt < 5 GeV
    Double_t maxFiducialY = -0.2/15*pt*pt+1.9/15*pt+0.5;
    Double_t minFiducialY = 0.2/15*pt*pt-1.9/15*pt-0.5;
-  AliDebug(2,Form("pt of D+ = %f (< 5), cutting  according to the fiducial zone [%f, %f]\n",pt,minFiducialY,maxFiducialY));
+  AliDebug(2,Form("pt of Lc = %f (< 5), cutting  according to the fiducial zone [%f, %f]\n",pt,minFiducialY,maxFiducialY));
   if (y < minFiducialY || y > maxFiducialY) return kFALSE;
  }
   //
   return kTRUE;
 }
+//--------------------------------------------------------
+Int_t AliRDHFCutsLctopKpi::IsSelectedCombinedPIDSoft(AliAODRecoDecayHF* obj) {
+ if(!fUsePID || !obj) {return 3;}
+ Int_t okLcpKpi=0,okLcpiKp=0;
+ Int_t returnvalue=0;
+ AliVTrack *track0=dynamic_cast<AliVTrack*>(obj->GetDaughter(0));
+ AliVTrack *track1=dynamic_cast<AliVTrack*>(obj->GetDaughter(1));
+ AliVTrack *track2=dynamic_cast<AliVTrack*>(obj->GetDaughter(2));
+ if (!track0 || !track1 || !track2) return 0;
+ Double_t prob0[AliPID::kSPECIES];
+ Double_t prob1[AliPID::kSPECIES];
+ Double_t prob2[AliPID::kSPECIES];
+
+ Bool_t isTOF0=fPidHF->CheckTOFPIDStatus((AliAODTrack*)obj->GetDaughter(0));
+ Bool_t isTOF1=fPidHF->CheckTOFPIDStatus((AliAODTrack*)obj->GetDaughter(1));
+ Bool_t isTOF2=fPidHF->CheckTOFPIDStatus((AliAODTrack*)obj->GetDaughter(2));
+
+Bool_t isK1=kFALSE;
+ if(isTOF1){ //kaon
+  if(track1->P()<1.8) {
+    fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC|AliPIDResponse::kDetTOF);
+    if(obj->Pt()<3. && track1->P()<0.55) fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC);
+    fPidHF->GetPidCombined()->ComputeProbabilities(track1,fPidHF->GetPidResponse(),prob1);
+   
+  }else{
+    AliAODTrack *trackaod1=(AliAODTrack*)(obj->GetDaughter(1));
+    if(trackaod1->P()<0.55){
+      fPidHF->SetTOF(kFALSE);
+      fPidHF->SetTOFdecide(kFALSE);
+     }
+    Int_t isKaon=fPidHF->MakeRawPid(trackaod1,3);
+    if(isKaon>=1) isK1=kTRUE;
+    if(trackaod1->P()<0.55){
+      fPidHF->SetTOF(kTRUE);
+      fPidHF->SetTOFdecide(kTRUE);
+     }
+  }
+ }else{
+  if(track1->P()<0.8){
+    fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC);
+    fPidHF->GetPidCombined()->ComputeProbabilities(track1,fPidHF->GetPidResponse(),prob0);
+  }else{
+    AliAODTrack *trackaod1=(AliAODTrack*)(obj->GetDaughter(1));
+     if(trackaod1->P()<0.55){
+      fPidHF->SetTOF(kFALSE);
+      fPidHF->SetTOFdecide(kFALSE);
+     }
+    Int_t isKaon=fPidHF->MakeRawPid(trackaod1,3);
+    if(isKaon>=1) isK1=kTRUE;
+     if(trackaod1->P()<0.55){
+      fPidHF->SetTOF(kTRUE);
+      fPidHF->SetTOFdecide(kTRUE);
+     }
+  }
+ }
+
+ Bool_t ispi0=kFALSE;
+ Bool_t isp0=kFALSE;
+ Bool_t ispi2=kFALSE;
+ Bool_t isp2=kFALSE;
+
+ if(isTOF0){ //proton
+  if(track0->P()<2.2) {
+    fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC|AliPIDResponse::kDetTOF);
+    if(obj->Pt()<3. && track0->P()<1.) fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC);
+    fPidHF->GetPidCombined()->ComputeProbabilities(track0,fPidHF->GetPidResponse(),prob0);
+  }else{
+   AliAODTrack *trackaod0=(AliAODTrack*)(obj->GetDaughter(0));
+   if(trackaod0->P()<1.){
+      fPidObjprot->SetTOF(kFALSE);
+      fPidObjprot->SetTOFdecide(kFALSE);
+   }
+   Int_t isProton=fPidObjprot->MakeRawPid(trackaod0,4);
+   if(isProton>=1) isp0=kTRUE;
+   if(trackaod0->P()<1.){
+      fPidObjprot->SetTOF(kTRUE);
+      fPidObjprot->SetTOFdecide(kTRUE);
+   }
+  }
+ }else{
+   if(track0->P()<1.2){
+    fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC);
+    fPidHF->GetPidCombined()->ComputeProbabilities(track0,fPidHF->GetPidResponse(),prob0);
+   }else{
+    AliAODTrack *trackaod0=(AliAODTrack*)(obj->GetDaughter(0));
+    if(trackaod0->P()<1.){
+      fPidObjprot->SetTOF(kFALSE);
+      fPidObjprot->SetTOFdecide(kFALSE);
+    }
+    Int_t isProton=fPidObjprot->MakeRawPid(trackaod0,4);
+    if(isProton>=1) isp0=kTRUE;
+    if(trackaod0->P()<1.){
+      fPidObjprot->SetTOF(kTRUE);
+      fPidObjprot->SetTOFdecide(kTRUE);
+    }
+   }
+ }
+
+ if(isTOF2){ //proton
+  if(track2->P()<2.2) {
+    fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC|AliPIDResponse::kDetTOF);
+    if(obj->Pt()<3. && track2->P()<1.) fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC);
+    fPidHF->GetPidCombined()->ComputeProbabilities(track2,fPidHF->GetPidResponse(),prob2);
+  }else{
+    AliAODTrack *trackaod2=(AliAODTrack*)(obj->GetDaughter(2));
+    if(trackaod2->P()<1.){
+      fPidObjprot->SetTOF(kFALSE);
+      fPidObjprot->SetTOFdecide(kFALSE);
+    }
+   Int_t isProton=fPidObjprot->MakeRawPid(trackaod2,4);
+   if(isProton>=1) isp2=kTRUE;
+   if(trackaod2->P()<1.){
+      fPidObjprot->SetTOF(kTRUE);
+      fPidObjprot->SetTOFdecide(kTRUE);
+    }
+  }
+ }else{
+   if(track2->P()<1.2){
+    fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC);
+    fPidHF->GetPidCombined()->ComputeProbabilities(track2,fPidHF->GetPidResponse(),prob2);
+   }else{
+    AliAODTrack *trackaod2=(AliAODTrack*)(obj->GetDaughter(2));
+     if(trackaod2->P()<1.){
+      fPidObjprot->SetTOF(kFALSE);
+      fPidObjprot->SetTOFdecide(kFALSE);
+    }
+    Int_t isProton=fPidObjprot->MakeRawPid(trackaod2,4);
+    if(isProton>=1) isp2=kTRUE;
+    if(trackaod2->P()<1.){
+      fPidObjprot->SetTOF(kTRUE);
+      fPidObjprot->SetTOFdecide(kTRUE);
+    }
+   }
+ }
+  AliAODTrack *trackaod2=(AliAODTrack*)(obj->GetDaughter(2));
+  if(fPidObjpion->MakeRawPid(trackaod2,2)>=1)ispi2=kTRUE;
+  AliAODTrack *trackaod0=(AliAODTrack*)(obj->GetDaughter(2));
+  if(fPidObjpion->MakeRawPid(trackaod0,2)>=1)ispi0=kTRUE;
+
+  if(TMath::MaxElement(AliPID::kSPECIES,prob1) == prob1[AliPID::kKaon]){
+
+    if(TMath::MaxElement(AliPID::kSPECIES,prob0) == prob0[AliPID::kProton] && TMath::MaxElement(AliPID::kSPECIES,prob2) == prob2[AliPID::kPion]) okLcpKpi = 1;
+    if(TMath::MaxElement(AliPID::kSPECIES,prob2) == prob2[AliPID::kProton] && TMath::MaxElement(AliPID::kSPECIES,prob0) == prob0[AliPID::kPion]) okLcpiKp = 1;
+    }
+
+   if(!isK1 && TMath::MaxElement(AliPID::kSPECIES,prob1) == prob1[AliPID::kKaon]) isK1=kTRUE;
+    if(!ispi0 && TMath::MaxElement(AliPID::kSPECIES,prob0) == prob0[AliPID::kPion]) ispi0=kTRUE;
+    if(!ispi2 && TMath::MaxElement(AliPID::kSPECIES,prob2) == prob2[AliPID::kPion]) ispi2=kTRUE;
+    if(!isp0 && TMath::MaxElement(AliPID::kSPECIES,prob0) == prob0[AliPID::kProton]) isp0=kTRUE;
+    if(!isp2 && TMath::MaxElement(AliPID::kSPECIES,prob2) == prob2[AliPID::kProton]) isp2=kTRUE;
+    if(isK1 && ispi0 && isp2) okLcpiKp = 1;
+    if(isK1 && isp0 && ispi2) okLcpKpi = 1;
+
+   if(okLcpKpi) returnvalue=1; //cuts passed as Lc->pKpi
+    if(okLcpiKp) returnvalue=2; //cuts passed as Lc->piKp
+    if(okLcpKpi && okLcpiKp) returnvalue=3; //cuts passed as both pKpi and piKp
+
+    return returnvalue;
+
+}
+//----------------------------------------------------------
+Int_t AliRDHFCutsLctopKpi::IsSelectedPIDStrong(AliAODRecoDecayHF* obj) {
+
+
+    if(!fUsePID || !obj) return 3;
+    Int_t okLcpKpi=0,okLcpiKp=0;
+    Int_t returnvalue=0;
+    Bool_t isPeriodd=fPidHF->GetOnePad();
+    Bool_t isMC=fPidHF->GetMC();
+    Bool_t ispion0=kTRUE,ispion2=kTRUE;
+    Bool_t isproton0=kFALSE,isproton2=kFALSE;
+    Bool_t iskaon1=kFALSE;
+    if(isPeriodd) {
+     fPidObjprot->SetOnePad(kTRUE);
+     fPidObjpion->SetOnePad(kTRUE);
+    }
+    if(isMC) {
+     fPidObjprot->SetMC(kTRUE);
+     fPidObjpion->SetMC(kTRUE);
+    }
+
+    for(Int_t i=0;i<3;i++){
+     AliAODTrack *track=(AliAODTrack*)obj->GetDaughter(i);
+     if(!track) return 0;
+     // identify kaon
+     if(i==1) {
+      Int_t isKaon=fPidHF->MakeRawPid(track,3);
+      if(isKaon>=1) {
+       iskaon1=kTRUE;
+      if(fPidHF->MakeRawPid(track,2)>=1) iskaon1=kFALSE;
+      }
+      if(!iskaon1) return 0;
+     
+     }else{
+     //pion or proton
+     
+     Int_t isProton=fPidObjprot->MakeRawPid(track,4);
+     if(isProton>=1){
+      if(fPidHF->MakeRawPid(track,2)>=1) isProton=-1;
+      if(fPidHF->MakeRawPid(track,3)>=1) isProton=-1;
+     }
+
+     Int_t isPion=fPidObjpion->MakeRawPid(track,2);
+     if(fPidHF->MakeRawPid(track,3)>=1) isPion=-1;
+     if(fPidObjprot->MakeRawPid(track,4)>=1) isPion=-1;
+
+
+     if(i==0) {
+      if(isPion<0) ispion0=kFALSE;
+      if(isProton>=1) isproton0=kTRUE;
+
+     }
+      if(!ispion0 && !isproton0) return 0;
+     if(i==2) {
+      if(isPion<0) ispion2=kFALSE;
+      if(isProton>=1) isproton2=kTRUE;
+     }
+
+    }
+   }
+
+    if(ispion2 && isproton0 && iskaon1) okLcpKpi=1;
+    if(ispion0 && isproton2 && iskaon1) okLcpiKp=1;
+    if(okLcpKpi) returnvalue=1; //cuts passed as Lc->pKpi
+    if(okLcpiKp) returnvalue=2; //cuts passed as Lc->piKp
+    if(okLcpKpi && okLcpiKp) returnvalue=3; //cuts passed as both pKpi and piKp
+
+ return returnvalue;
+}
+//--------------------
+Int_t AliRDHFCutsLctopKpi::IsSelectedCombinedPIDpPb(AliAODRecoDecayHF* obj) {
+    
+    if(!fUsePID || !obj) {return 3;}
+    Int_t okLcpKpi=0,okLcpiKp=0;
+    Int_t returnvalue=0;
+   
+    Bool_t isMC=fPidHF->GetMC();
+
+    
+    if(isMC) {
+           fPidObjprot->SetMC(kTRUE);
+           fPidObjpion->SetMC(kTRUE);
+    }
+
+    AliVTrack *track0=dynamic_cast<AliVTrack*>(obj->GetDaughter(0));
+    AliVTrack *track1=dynamic_cast<AliVTrack*>(obj->GetDaughter(1));
+    AliVTrack *track2=dynamic_cast<AliVTrack*>(obj->GetDaughter(2));
+    if (!track0 || !track1 || !track2) return 0;
+    Double_t prob0[AliPID::kSPECIES];
+    Double_t prob1[AliPID::kSPECIES];
+    Double_t prob2[AliPID::kSPECIES];
+    
+    fPidHF->GetPidCombined()->ComputeProbabilities(track0,fPidHF->GetPidResponse(),prob0);
+    fPidHF->GetPidCombined()->ComputeProbabilities(track1,fPidHF->GetPidResponse(),prob1);
+    fPidHF->GetPidCombined()->ComputeProbabilities(track2,fPidHF->GetPidResponse(),prob2);
+  
+
+    if(fPIDThreshold[AliPID::kPion]>0. && fPIDThreshold[AliPID::kKaon]>0. && fPIDThreshold[AliPID::kProton]>0.){
+    okLcpiKp=  (prob0[AliPID::kPion  ]>fPIDThreshold[AliPID::kPion  ])
+             &&(prob1[AliPID::kKaon  ]>fPIDThreshold[AliPID::kKaon  ])
+             &&(prob2[AliPID::kProton]>fPIDThreshold[AliPID::kProton]);
+    okLcpKpi=  (prob0[AliPID::kProton]>fPIDThreshold[AliPID::kProton])
+             &&(prob1[AliPID::kKaon  ]>fPIDThreshold[AliPID::kKaon  ])
+             &&(prob2[AliPID::kPion  ]>fPIDThreshold[AliPID::kPion  ]);
+   }else{ 
+                   //pion or proton
+                   
+                   
+    if(TMath::MaxElement(AliPID::kSPECIES,prob1) == prob1[AliPID::kKaon]){
+    if(TMath::MaxElement(AliPID::kSPECIES,prob0) == prob0[AliPID::kProton] && TMath::MaxElement(AliPID::kSPECIES,prob2) == prob2[AliPID::kPion]) okLcpKpi = 1;  
+    if(TMath::MaxElement(AliPID::kSPECIES,prob2) == prob2[AliPID::kProton] && TMath::MaxElement(AliPID::kSPECIES,prob0) == prob0[AliPID::kPion]) okLcpiKp = 1; 
+           }
+          }
+    
+    if(okLcpKpi) returnvalue=1; //cuts passed as Lc->pKpi
+    if(okLcpiKp) returnvalue=2; //cuts passed as Lc->piKp
+    if(okLcpKpi && okLcpiKp) returnvalue=3; //cuts passed as both pKpi and piKp
+    
+    return returnvalue;
+}
+//-----------------------
+Int_t AliRDHFCutsLctopKpi::IsSelectedCombinedPIDpPb2(AliAODRecoDecayHF* obj) {
+
+  Int_t returnvalue =0;
+  Double_t thresholdK =0.7;
+  Double_t thresholdPi =0.3; //!
+  Double_t thresholdPr =0.7;
+
+  AliVTrack *track0=dynamic_cast<AliVTrack*>(obj->GetDaughter(0));
+  AliVTrack *track1=dynamic_cast<AliVTrack*>(obj->GetDaughter(1));
+  AliVTrack *track2=dynamic_cast<AliVTrack*>(obj->GetDaughter(2));
+
+  if (!track0 || !track1 || !track2) return 0;
+  Double_t prob0[AliPID::kSPECIES];
+  Double_t prob1[AliPID::kSPECIES];
+  Double_t prob2[AliPID::kSPECIES];
+
+  fPidHF->GetPidCombined()->ComputeProbabilities(track0,fPidHF->GetPidResponse(),prob0);
+  fPidHF->GetPidCombined()->ComputeProbabilities(track1,fPidHF->GetPidResponse(),prob1);
+  fPidHF->GetPidCombined()->ComputeProbabilities(track2,fPidHF->GetPidResponse(),prob2);
+
+  if(prob1[AliPID::kKaon]>thresholdK){
+    if(TMath::MaxElement(AliPID::kSPECIES,prob0)>TMath::MaxElement(AliPID::kSPECIES,prob2)){
+      if(((prob0[AliPID::kPion  ]>prob0[AliPID::kProton  ])&& prob0[AliPID::kPion]>thresholdPi) && prob2[AliPID::kProton]>thresholdPr) returnvalue=2;//piKp    
+      else if(((prob0[AliPID::kProton  ]>prob0[AliPID::kPion  ])&& prob0[AliPID::kProton]>thresholdPr) && prob2[AliPID::kPion]>thresholdPi)returnvalue =1;//pKpi
+    }
+
+    else if(TMath::MaxElement(AliPID::kSPECIES,prob0)<TMath::MaxElement(AliPID::kSPECIES,prob2)){
+      if(((prob2[AliPID::kPion  ]>prob2[AliPID::kProton  ])&& prob2[AliPID::kPion]>thresholdPi) && prob0[AliPID::kProton]>thresholdPr) returnvalue=1; //pKpi   
+      else if(((prob2[AliPID::kProton  ]>prob2[AliPID::kPion  ])&& prob2[AliPID::kProton]>thresholdPr) && prob0[AliPID::kPion]>thresholdPi)returnvalue =2;     //piKp
+    }
+
+  }
+  return returnvalue;
+
+}
+//------------------------------------------------------
+void AliRDHFCutsLctopKpi::SetStandardCutsPPb2013() {
+
+ SetName("LctopKpiProdCuts");
+ SetTitle("Production cuts for Lc analysis");
+
+ AliESDtrackCuts *esdTrackCuts = new AliESDtrackCuts("AliESDtrackCuts","default");
+ esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
+ esdTrackCuts->SetRequireTPCRefit(kTRUE);
+ esdTrackCuts->SetMinNClustersTPC(70);
+ esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
+                                          AliESDtrackCuts::kAny);
+ esdTrackCuts->SetRequireITSRefit(kTRUE);
+ esdTrackCuts->SetMinNClustersITS(4);
+ esdTrackCuts->SetMinDCAToVertexXY(0.);
+ esdTrackCuts->SetEtaRange(-0.8,0.8);
+ esdTrackCuts->SetPtRange(0.3,1.e10);
+ AddTrackCuts(esdTrackCuts);
+ const Int_t nvars=13;
+ const Int_t nptbins=9;
+ Float_t* ptbins;
+ ptbins=new Float_t[nptbins+1];
+ ptbins[0]=0.;
+ ptbins[1]=1.;
+ ptbins[2]=2.;
+ ptbins[3]=3.;
+ ptbins[4]=4.;
+ ptbins[5]=5.;
+ ptbins[6]=6.;
+ ptbins[7]=8.;
+ ptbins[8]=10.;  
+ ptbins[9]=99999.;
+
+ SetGlobalIndex(nvars,nptbins);
+ SetPtBins(nptbins+1,ptbins);
+
+ Float_t** prodcutsval;
+ prodcutsval=new Float_t*[nvars];
+ for(Int_t iv=0;iv<nvars;iv++){
+  prodcutsval[iv]=new Float_t[nptbins];
+ }
+
+ for(Int_t ipt=0;ipt<nptbins;ipt++){
+    prodcutsval[0][ipt]=0.13;
+    prodcutsval[1][ipt]=0.4;
+    prodcutsval[2][ipt]=0.4;
+    prodcutsval[3][ipt]=0.;
+    prodcutsval[4][ipt]=0.;
+    prodcutsval[5][ipt]=0.;
+    prodcutsval[6][ipt]=0.06;
+    prodcutsval[7][ipt]=0.;
+    prodcutsval[8][ipt]=0.;
+    prodcutsval[9][ipt]=0.;
+    prodcutsval[10][ipt]=0.;
+    prodcutsval[11][ipt]=0.05;
+    prodcutsval[12][ipt]=0.4;
+ }
+ SetCuts(nvars,nptbins,prodcutsval);
+
+ AliAODPidHF* pidObjK=new AliAODPidHF();
+ Double_t sigmasK[5]={3.,1.,1.,3.,2.};
+ pidObjK->SetSigma(sigmasK);
+ pidObjK->SetAsym(kTRUE);
+ pidObjK->SetMatch(1);
+ pidObjK->SetTPC(kTRUE);
+ pidObjK->SetTOF(kTRUE);
+ pidObjK->SetITS(kTRUE);
+ Double_t plimK[2]={0.5,0.8};
+ pidObjK->SetPLimit(plimK,2);
+ pidObjK->SetTOFdecide(kTRUE);
+ SetPidHF(pidObjK);
+
+ AliAODPidHF* pidObjpi=new AliAODPidHF();
+ pidObjpi->SetTPC(kTRUE);
+ Double_t sigmaspi[5]={3.,0.,0.,0.,0.};
+ pidObjpi->SetSigma(sigmaspi);
+ pidObjpi->SetTOFdecide(kTRUE);
+ SetPidpion(pidObjpi);
+
+ AliAODPidHF* pidObjp=new AliAODPidHF();
+ Double_t sigmasp[5]={3.,1.,1.,3.,2.};
+ pidObjp->SetSigma(sigmasp);
+ pidObjp->SetAsym(kTRUE);
+ pidObjp->SetMatch(1);
+ pidObjp->SetTPC(kTRUE);
+ pidObjp->SetTOF(kTRUE);
+ pidObjp->SetITS(kTRUE);
+ Double_t plimp[2]={1.,2.};
+ pidObjp->SetPLimit(plimp,2);
+ pidObjp->SetTOFdecide(kTRUE);
+
+ SetUsePID(kTRUE);
+
+ PrintAll();
+
+ for(Int_t iiv=0;iiv<nvars;iiv++){
+  delete [] prodcutsval[iiv];
+ }
+ delete [] prodcutsval;
+ prodcutsval=NULL;
+ delete [] ptbins;
+ ptbins=NULL;
+
+ delete pidObjK;
+ pidObjK=NULL;
+ delete pidObjpi;
+ pidObjpi=NULL;
+ delete pidObjp;
+ pidObjp=NULL;
+
+ return;
+}