+/**************************************************************************
+ * Copyright(c) 1998-2010, ALICE Experiment at CERN, All rights reserved. *
+ * *
+ * Author: The ALICE Off-line Project. *
+ * Contributors are mentioned in the code where appropriate. *
+ * *
+ * Permission to use, copy, modify and distribute this software and its *
+ * documentation strictly for non-commercial purposes is hereby granted *
+ * without fee, provided that the above copyright notice appears in all *
+ * copies and that both the copyright notice and this permission notice *
+ * appear in the supporting documentation. The authors make no claims *
+ * about the suitability of this software for any purpose. It is *
+ * provided "as is" without express or implied warranty. *
+ **************************************************************************/
+
+/////////////////////////////////////////////////////////////
+//
+// Class for cuts on AOD reconstructed D+->Kpipi
+//
+// Author: R. Bala, bala@to.infn.it
+// G. Ortona, ortona@to.infn.it
+/////////////////////////////////////////////////////////////
+
+#include <TDatabasePDG.h>
+#include <Riostream.h>
+
+#include "AliRDHFCutsDplustoKpipi.h"
+#include "AliAODRecoDecayHF3Prong.h"
+#include "AliAODTrack.h"
+#include "AliESDtrack.h"
+
+ClassImp(AliRDHFCutsDplustoKpipi)
+
+//--------------------------------------------------------------------------
+AliRDHFCutsDplustoKpipi::AliRDHFCutsDplustoKpipi() :
+ AliRDHFCuts()
+{
+ //
+ // Default Constructor
+ //
+ Int_t nvars=12;
+ SetNVars(nvars);
+ TString varNames[12]={"inv. mass [GeV]",
+ "pTK [GeV/c]",
+ "pTPi [GeV/c]",
+ "d0K [cm] lower limit!",
+ "d0Pi [cm] lower limit!",
+ "dist12 (cm)",
+ "sigmavert (cm)",
+ "dist prim-sec (cm)",
+ "pM=Max{pT1,pT2,pT3} (GeV/c)",
+ "cosThetaPoint",
+ "Sum d0^2 (cm^2)",
+ "dca cut (cm)"};
+ Bool_t isUpperCut[12]={kTRUE,
+ kFALSE,
+ kFALSE,
+ kFALSE,
+ kFALSE,
+ kFALSE,
+ kTRUE,
+ kFALSE,
+ kFALSE,
+ kFALSE,
+ kFALSE,
+ kTRUE};
+ SetVarNames(nvars,varNames,isUpperCut);
+ Bool_t forOpt[12]={kTRUE,
+ kFALSE,
+ kFALSE,
+ kFALSE,
+ kFALSE,
+ kFALSE,
+ kTRUE,
+ kTRUE,
+ kTRUE,
+ kTRUE,
+ kTRUE,
+ kFALSE};
+ SetVarsForOpt(6,forOpt);
+ Float_t limits[2]={0,999999999.};
+ SetPtBins(2,limits);
+}
+//--------------------------------------------------------------------------
+AliRDHFCutsDplustoKpipi::AliRDHFCutsDplustoKpipi(const AliRDHFCutsDplustoKpipi &source) :
+ AliRDHFCuts(source)
+{
+ //
+ // Copy constructor
+ //
+
+}
+//--------------------------------------------------------------------------
+AliRDHFCutsDplustoKpipi &AliRDHFCutsDplustoKpipi::operator=(const AliRDHFCutsDplustoKpipi &source)
+{
+ //
+ // assignment operator
+ //
+ if(&source == this) return *this;
+
+ AliRDHFCuts::operator=(source);
+
+ return *this;
+}
+
+
+//---------------------------------------------------------------------------
+void AliRDHFCutsDplustoKpipi::GetCutVarsForOpt(AliAODRecoDecayHF *d,Float_t *vars,Int_t nvars,Int_t *pdgdaughters) {
+ //
+ // Fills in vars the values of the variables
+ //
+
+
+ if(nvars!=fnVarsForOpt) {
+ printf("AliRDHFCutsDplustoKpipi::GetCutsVarsForOpt: wrong number of variables\n");
+ return;
+ }
+
+ AliAODRecoDecayHF3Prong *dd = (AliAODRecoDecayHF3Prong*)d;
+ /*
+ vars[0] = dd->GetDCA();
+ if(TMath::Abs(pdgdaughters[0])==211) {
+ vars[1] = dd->CosThetaStarD0();
+ } else {
+ vars[1] = dd->CosThetaStarD0bar();
+ }
+ vars[2] = dd->Prodd0d0();
+ vars[3] = dd->CosPointingAngle();
+
+ return;
+*/
+
+ //possibile generalizzazione
+ Int_t iter=-1;
+ if(fVarsForOpt[0]){
+ iter++;
+ vars[iter]=dd->InvMassDplus();
+ }
+ if(fVarsForOpt[1]){
+ iter++;
+ for(Int_t iprong=0;iprong<3;iprong++){
+ if(TMath::Abs(pdgdaughters[iprong])==321) {
+ vars[iter]=dd->PtProng(iprong);
+ }
+ }
+ }
+ if(fVarsForOpt[2]){
+ iter++;
+ for(Int_t iprong=0;iprong<3;iprong++){
+ if(TMath::Abs(pdgdaughters[iprong])==211) {
+ vars[iter]=dd->PtProng(iprong);
+ }
+ }
+ }
+ if(fVarsForOpt[3]){
+ iter++;
+ for(Int_t iprong=0;iprong<3;iprong++){
+ if(TMath::Abs(pdgdaughters[iprong])==321) {
+ vars[iter]=dd->Getd0Prong(iprong);
+ }
+ }
+ }
+ if(fVarsForOpt[4]){
+ iter++;
+ for(Int_t iprong=0;iprong<3;iprong++){
+ if(TMath::Abs(pdgdaughters[iprong])==211) {
+ vars[iter]=dd->Getd0Prong(iprong);
+ }
+ }
+ }
+ if(fVarsForOpt[5]){
+ iter++;
+ vars[iter]=dd->GetDist12toPrim();
+ }
+ if(fVarsForOpt[6]){
+ iter++;
+ vars[iter]=dd->GetSigmaVert();
+ }
+ if(fVarsForOpt[7]){
+ iter++;
+ vars[iter] = dd->DecayLength();
+ }
+ if(fVarsForOpt[8]){
+ iter++;
+ Float_t ptmax=0;
+ for(Int_t i=0;i<3;i++){
+ if(dd->PtProng(i)>ptmax)ptmax=dd->PtProng(i);
+ }
+ vars[iter]=ptmax;
+ }
+ if(fVarsForOpt[9]){
+ iter++;
+ vars[iter]=dd->CosPointingAngle();
+ }
+ if(fVarsForOpt[10]){
+ iter++;
+ vars[iter]=dd->Getd0Prong(0)*dd->Getd0Prong(0)+dd->Getd0Prong(1)*dd->Getd0Prong(1)+dd->Getd0Prong(2)*dd->Getd0Prong(2);
+ }
+ if(fVarsForOpt[11]){
+ iter++;
+ vars[iter]=dd->GetDCA();
+ }
+ return;
+}
+//---------------------------------------------------------------------------
+Int_t AliRDHFCutsDplustoKpipi::IsSelected(TObject* obj,Int_t selectionLevel) {
+ //
+ // Apply selection
+ //
+
+ if(!fCutsRD){
+ cout<<"Cut matrice not inizialized. Exit..."<<endl;
+ return 0;
+ }
+ //PrintAll();
+ AliAODRecoDecayHF3Prong* d=(AliAODRecoDecayHF3Prong*)obj;
+
+
+ if(!d){
+ cout<<"AliAODRecoDecayHF3Prong null"<<endl;
+ return 0;
+ }
+
+
+
+ // selection on daughter tracks
+ if(selectionLevel==AliRDHFCuts::kAll ||
+ selectionLevel==AliRDHFCuts::kTracks) {
+ if(!AreDaughtersSelected(d)) return 0;
+ }
+
+ // selection on candidate
+ if(selectionLevel==AliRDHFCuts::kAll ||
+ selectionLevel==AliRDHFCuts::kCandidate) {
+
+ Double_t pt=d->Pt();
+
+ Int_t ptbin=PtBin(pt);
+
+ Double_t mDplusPDG = TDatabasePDG::Instance()->GetParticle(411)->Mass();
+ Double_t mDplus=d->InvMassDplus();
+ if(TMath::Abs(mDplus-mDplusPDG)>fCutsRD[GetGlobalIndex(0,ptbin)])return 0;
+ // if(d->PtProng(1) < fCutsRD[GetGlobalIndex(3,ptbin)] || d->PtProng(0) < fCutsRD[GetGlobalIndex(4,ptbin)]) okD0 = 0;
+ if(TMath::Abs(d->PtProng(1)) < fCutsRD[GetGlobalIndex(1,ptbin)] || TMath::Abs(d->Getd0Prong(1))<fCutsRD[GetGlobalIndex(3,ptbin)])return 0;//Kaon
+ if(TMath::Abs(d->PtProng(0)) < fCutsRD[GetGlobalIndex(2,ptbin)] || TMath::Abs(d->Getd0Prong(0))<fCutsRD[GetGlobalIndex(4,ptbin)])return 0;//Pion1
+ if(TMath::Abs(d->PtProng(2)) < fCutsRD[GetGlobalIndex(2,ptbin)] || TMath::Abs(d->Getd0Prong(2))<fCutsRD[GetGlobalIndex(4,ptbin)])return 0;//Pion2
+
+
+
+ //2track cuts
+ if(d->GetDist12toPrim()<fCutsRD[GetGlobalIndex(5,ptbin)]|| d->GetDist23toPrim()<fCutsRD[GetGlobalIndex(5,ptbin)])return 0;
+ if(d->Getd0Prong(0)*d->Getd0Prong(1)<0. && d->Getd0Prong(2)*d->Getd0Prong(1)<0.)return 0;
+
+ //sec vert
+ if(d->GetSigmaVert()>fCutsRD[GetGlobalIndex(6,ptbin)])return 0;
+
+ if(d->DecayLength()<fCutsRD[GetGlobalIndex(7,ptbin)])return 0;
+
+ if(TMath::Abs(d->PtProng(0))<fCutsRD[GetGlobalIndex(8,ptbin)] && TMath::Abs(d->PtProng(1))<fCutsRD[GetGlobalIndex(8,ptbin)] && TMath::Abs(d->PtProng(2))<fCutsRD[GetGlobalIndex(8,ptbin)])return 0;
+ if(d->CosPointingAngle()< fCutsRD[GetGlobalIndex(9,ptbin)])return 0;
+ Double_t sum2=d->Getd0Prong(0)*d->Getd0Prong(0)+d->Getd0Prong(1)*d->Getd0Prong(1)+d->Getd0Prong(2)*d->Getd0Prong(2);
+ if(sum2<fCutsRD[GetGlobalIndex(10,ptbin)])return 0;
+
+ //DCA
+ for(Int_t i=0;i<3;i++) if(d->GetDCA(i)>fCutsRD[GetGlobalIndex(11,ptbin)]) return 0;
+
+ }
+ return 1;
+}
+//---------------------------------------------------------------------------