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 **************************************************************************/
16 /////////////////////////////////////////////////////////////
18 // Class for cuts on AOD reconstructed Lc->pKpi
20 /////////////////////////////////////////////////////////////
22 #include <TDatabasePDG.h>
23 #include <Riostream.h>
25 #include "AliRDHFCutsLctoV0.h"
26 #include "AliAODRecoCascadeHF.h"
27 #include "AliAODTrack.h"
28 #include "AliESDtrack.h"
32 ClassImp(AliRDHFCutsLctoV0)
34 //--------------------------------------------------------------------------
35 AliRDHFCutsLctoV0::AliRDHFCutsLctoV0(const char* name) :
39 // Default Constructor
43 TString varNames[9]={"inv. mass if K0s [GeV]",
44 "inv. mass if Lambda [GeV]",
45 "inv. mass V0 if K0s [GeV]",
46 "inv. mass V0 if Lambda [GeV]",
47 "pT min bachelor track [GeV/c]",
48 "pT min V0-positive track [GeV/c]",
49 "pT min V0-negative track [GeV/c]",
50 "dca cascade cut (cm)",
53 Bool_t isUpperCut[9]={kTRUE,
62 SetVarNames(nvars,varNames,isUpperCut);
63 Bool_t forOpt[9]={kFALSE,
72 SetVarsForOpt(5,forOpt);
73 Float_t limits[2]={0,999999999.};
76 //--------------------------------------------------------------------------
77 AliRDHFCutsLctoV0::AliRDHFCutsLctoV0(const AliRDHFCutsLctoV0 &source) :
85 //--------------------------------------------------------------------------
86 AliRDHFCutsLctoV0 &AliRDHFCutsLctoV0::operator=(const AliRDHFCutsLctoV0 &source)
89 // assignment operator
91 if(&source == this) return *this;
93 AliRDHFCuts::operator=(source);
99 //---------------------------------------------------------------------------
100 void AliRDHFCutsLctoV0::GetCutVarsForOpt(AliAODRecoDecayHF *d,Float_t *vars,Int_t nvars,Int_t *pdgdaughters) {
102 // Fills in vars the values of the variables
105 if(nvars!=fnVarsForOpt) {
106 printf("AliRDHFCutsLctoV0::GetCutsVarsForOpt: wrong number of variables\n");
110 AliAODRecoCascadeHF *dd = (AliAODRecoCascadeHF*)d;
112 // Get the v0 and all daughter tracks
113 AliAODTrack *bachelor_track = dd->GetBachelor();
114 AliAODv0 *v0 = dd->Getv0();
115 AliAODTrack *v0positive_track = dd->Getv0PositiveTrack();
116 AliAODTrack *v0negative_track = dd->Getv0NegativeTrack();
119 // cut on cascade mass, if k0s + p
122 vars[iter]=dd->InvMassLctoK0sP();
124 // cut on cascade mass, if lambda + pi
127 vars[iter]=dd->InvMassLctoLambdaPi();
130 // cut on v0 mass if k0s
133 vars[iter]=v0->MassK0Short();
136 // cut on v0 mass if lambda
137 // ----------------------------- pb with anti-lambda?? --------->>>>>>>>
140 vars[iter]=v0->MassLambda();
143 // cut on v0-positive min pt
146 vars[iter]=v0positive_track->Pt();
149 // cut on v0-negative min pt
152 vars[iter]=v0negative_track->Pt();
155 // cut bachelor min pt
158 vars[iter]=bachelor_track->Pt();
164 vars[iter]=v0->GetDCA();
167 // cut on cascade dca
170 vars[iter]=dd->GetDCA();
175 //---------------------------------------------------------------------------
176 Int_t AliRDHFCutsLctoV0::IsSelected(TObject* obj,Int_t selectionLevel) {
182 cout<<"Cut matrice not inizialized. Exit..."<<endl;
186 AliAODRecoCascadeHF* d=(AliAODRecoCascadeHF*)obj;
189 cout<<"AliAODRecoCascadeHF null"<<endl;
194 // selection on daughter tracks
195 if(selectionLevel==AliRDHFCuts::kAll ||
196 selectionLevel==AliRDHFCuts::kTracks) {
197 if(!AreDaughtersSelected(d)) return 0;
201 // Get the v0 and all daughter tracks
202 AliAODTrack *bachelor_track = d->GetBachelor();
203 AliAODv0 *v0 = d->Getv0();
204 AliAODTrack *v0positive_track = d->Getv0PositiveTrack();
205 AliAODTrack *v0negative_track = d->Getv0NegativeTrack();
207 // // If reading ESDv0, return false
208 // if ( !d->Getv0() || !d->Getv0PositiveTrack() || !d->Getv0NegativeTrack() )
209 // { AliInfo(Form("Not adapted for ESDv0s, return false...")); return false; }
213 // selection on candidate
214 if(selectionLevel==AliRDHFCuts::kAll ||
215 selectionLevel==AliRDHFCuts::kCandidate) {
219 Int_t ptbin=PtBin(pt);
221 Double_t mLck0sp,mLcLpi;
222 Int_t okLck0sp=1,okLcLpi=1;
224 Double_t mLcPDG = TDatabasePDG::Instance()->GetParticle(4122)->Mass();
225 Double_t mk0sPDG = TDatabasePDG::Instance()->GetParticle(310)->Mass();
226 Double_t mLPDG = TDatabasePDG::Instance()->GetParticle(3122)->Mass();
229 double mk0s = v0->MassK0Short();
230 mLck0sp = d->InvMassLctoK0sP();
233 double mlambda = v0->MassLambda();
234 double malambda = v0->MassAntiLambda();
235 mLcLpi = d->InvMassLctoLambdaPi();
238 // with k0s p hypothesis
239 if(TMath::Abs(mLck0sp-mLcPDG)>fCutsRD[GetGlobalIndex(0,ptbin)]) {
241 AliDebug(4,Form(" cascade mass is %2.2e and does not correspond to lambda_c into k0s+p cut",mLck0sp));
243 // with Lambda pi hypothesis
244 if(TMath::Abs(mLcLpi-mLcPDG)>fCutsRD[GetGlobalIndex(1,ptbin)]) {
246 AliDebug(4,Form(" cascade mass is %2.2e and does not correspond to lambda_c into lambda+pi cut",mLcLpi));
249 // cuts on the v0 mass
250 if(TMath::Abs(mk0s-mk0sPDG)>fCutsRD[GetGlobalIndex(2,ptbin)]) {
252 AliDebug(4,Form(" v0 mass is %2.2e and does not correspond to k0s cut",mk0s));
254 if( TMath::Abs(mlambda-mLPDG)>fCutsRD[GetGlobalIndex(3,ptbin)] &&
255 TMath::Abs(malambda-mLPDG)>fCutsRD[GetGlobalIndex(3,ptbin)] ) {
257 AliDebug(4,Form(" v0 mass is %2.2e and does not correspond to lambda cut",mlambda));
260 if(!okLck0sp && !okLcLpi) return 0;
262 // cuts on the minimum pt of the tracks
263 if(TMath::Abs(bachelor_track->Pt()) < fCutsRD[GetGlobalIndex(4,ptbin)]) {
264 AliDebug(4,Form(" bachelor track Pt=%2.2e > %2.2e",bachelor_track->Pt(),fCutsRD[GetGlobalIndex(4,ptbin)]));
267 if(TMath::Abs(v0positive_track->Pt()) < fCutsRD[GetGlobalIndex(5,ptbin)]) {
268 AliDebug(4,Form(" v0 positive track Pt=%2.2e > %2.2e",v0positive_track->Pt(),fCutsRD[GetGlobalIndex(5,ptbin)]));
271 if(TMath::Abs(v0negative_track->Pt()) < fCutsRD[GetGlobalIndex(6,ptbin)]) {
272 AliDebug(4,Form(" v0 negative track Pt=%2.2e > %2.2e",v0negative_track->Pt(),fCutsRD[GetGlobalIndex(6,ptbin)]));
277 if(TMath::Abs(v0->DcaV0Daughters()) > fCutsRD[GetGlobalIndex(7,ptbin)]) {
278 AliDebug(4,Form(" v0 daughters DCA = %2.2e > %2.2e",v0->DcaV0Daughters(),fCutsRD[GetGlobalIndex(7,ptbin)]));
282 // cut on the cascade dca
283 if( TMath::Abs(d->GetDCA(0))>fCutsRD[GetGlobalIndex(8,ptbin)] ||
284 TMath::Abs(v0->DcaPosToPrimVertex())>fCutsRD[GetGlobalIndex(8,ptbin)] ||
285 TMath::Abs(v0->DcaNegToPrimVertex())>fCutsRD[GetGlobalIndex(8,ptbin)] ) {
286 AliDebug(4,Form(" cascade tracks DCA at primary vertex don't pass the cut"));
290 if(okLck0sp) returnvalue=1; //cuts passed as Lc -> k0s + p
291 if(okLcLpi) returnvalue=2; //cuts passed as Lc-> lambda + pi
292 if(okLck0sp && okLcLpi) returnvalue=3; //cuts passed as both Lc -> k0s + p; Lc-> lambda + pi
298 //---------------------------------------------------------------------------