1 /*************************************************************************
2 * Copyright(c) 1998-2009, 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 ///////////////////////////////////////////////////////////////////////////
17 // Dielectron TrackCuts //
26 ///////////////////////////////////////////////////////////////////////////
31 #include "AliDielectronTrackCuts.h"
32 #include "AliVTrack.h"
34 ClassImp(AliDielectronTrackCuts)
36 AliDielectronTrackCuts::AliDielectronTrackCuts() :
39 fNegateV0DauterCut(kFALSE),
41 fITSclusterCutType(kOneOf),
42 fRequireITSRefit(kFALSE),
43 fRequireTPCRefit(kFALSE),
47 // Default Constructor
50 for (Int_t i = 0; i < 3; i++)
51 fCutClusterRequirementITS[i] = kOff;
55 //______________________________________________
56 AliDielectronTrackCuts::AliDielectronTrackCuts(const char* name, const char* title) :
57 AliAnalysisCuts(name, title),
59 fNegateV0DauterCut(kFALSE),
61 fITSclusterCutType(kOneOf),
62 fRequireITSRefit(kFALSE),
63 fRequireTPCRefit(kFALSE),
70 for (Int_t i = 0; i < 3; i++)
71 fCutClusterRequirementITS[i] = kOff;
75 //______________________________________________
76 AliDielectronTrackCuts::~AliDielectronTrackCuts()
84 //______________________________________________
85 Bool_t AliDielectronTrackCuts::IsSelected(TObject* track)
88 // Apply configured cuts
91 AliVTrack *vtrack=dynamic_cast<AliVTrack*>(track);
92 if (!vtrack) return kFALSE;
96 Bool_t isV0=track->TestBit(BIT(fV0DaughterCut));
97 if (fNegateV0DauterCut) isV0=!isV0;
101 //ESD track cut like ITS cluster cut
102 for (Int_t i=0;i<3;++i){
103 Bool_t layer1=TESTBIT(vtrack->GetITSClusterMap(),i*2);
104 Bool_t layer2=TESTBIT(vtrack->GetITSClusterMap(),i*2+1);
105 accept*=CheckITSClusterRequirement(fCutClusterRequirementITS[i], layer1, layer2);
108 //more flexible ITS cluster cut
109 if (fITSclusterBitMap) accept*=CheckITSClusterCut(vtrack->GetITSClusterMap());
112 if (fRequireITSRefit) accept*=(vtrack->GetStatus()&AliVTrack::kITSrefit)>0;
113 if (fRequireTPCRefit) accept*=(vtrack->GetStatus()&AliVTrack::kTPCrefit)>0;
115 if (fTPCNclRobustCut>0){
116 Int_t nclr=TMath::Nint(vtrack->GetTPCClusterInfo(2,1));
117 accept*=(nclr>fTPCNclRobustCut);
122 //______________________________________________
123 void AliDielectronTrackCuts::SetV0DaughterCut(AliPID::EParticleType type, Bool_t negate/*=kFALSE*/)
126 // Set V0 Daughter cut bit
128 const Int_t bitMap[5] = {14, -1, 15, -1, 16}; // convert the AliPID to bit positions
129 fV0DaughterCut=bitMap[type];
130 fNegateV0DauterCut=negate;
133 //____________________________________________________________________
134 Bool_t AliDielectronTrackCuts::CheckITSClusterRequirement(ITSClusterRequirement req, Bool_t clusterL1, Bool_t clusterL2) const
136 // checks if the cluster requirement is fullfilled (in this case: return kTRUE)
140 case kOff: return kTRUE;
141 case kNone: return !clusterL1 && !clusterL2;
142 case kAny: return clusterL1 || clusterL2;
143 case kFirst: return clusterL1;
144 case kOnlyFirst: return clusterL1 && !clusterL2;
145 case kSecond: return clusterL2;
146 case kOnlySecond: return clusterL2 && !clusterL1;
147 case kBoth: return clusterL1 && clusterL2;
153 //______________________________________________
154 Bool_t AliDielectronTrackCuts::CheckITSClusterCut(UChar_t itsBits) const
156 // check the its cluster cut
157 switch (fITSclusterCutType){
158 case kOneOf: return itsBits & fITSclusterBitMap;
159 case kAtLeast: return (itsBits & fITSclusterBitMap)==fITSclusterBitMap;
160 case kExact: return (itsBits==fITSclusterBitMap);