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"
33 #include "AliAODTrack.h"
35 ClassImp(AliDielectronTrackCuts)
37 AliDielectronTrackCuts::AliDielectronTrackCuts() :
40 fNegateV0DauterCut(kFALSE),
42 fITSclusterCutType(kOneOf),
43 fRequireITSRefit(kFALSE),
44 fRequireTPCRefit(kFALSE),
46 fAODFilterBit(kSwitchOff),
50 // Default Constructor
53 for (Int_t i = 0; i < 3; i++)
54 fCutClusterRequirementITS[i] = kOff;
58 //______________________________________________
59 AliDielectronTrackCuts::AliDielectronTrackCuts(const char* name, const char* title) :
60 AliAnalysisCuts(name, title),
62 fNegateV0DauterCut(kFALSE),
64 fITSclusterCutType(kOneOf),
65 fRequireITSRefit(kFALSE),
66 fRequireTPCRefit(kFALSE),
68 fAODFilterBit(kSwitchOff),
75 for (Int_t i = 0; i < 3; i++)
76 fCutClusterRequirementITS[i] = kOff;
80 //______________________________________________
81 AliDielectronTrackCuts::~AliDielectronTrackCuts()
89 //______________________________________________
90 Bool_t AliDielectronTrackCuts::IsSelected(TObject* track)
93 // Apply configured cuts
96 AliVTrack *vtrack=dynamic_cast<AliVTrack*>(track);
97 if (!vtrack) return kFALSE;
100 if (fV0DaughterCut) {
101 Bool_t isV0=track->TestBit(BIT(fV0DaughterCut));
102 if (fNegateV0DauterCut) isV0=!isV0;
106 //ESD track cut like ITS cluster cut
107 for (Int_t i=0;i<3;++i){
108 Bool_t layer1=TESTBIT(vtrack->GetITSClusterMap(),i*2);
109 Bool_t layer2=TESTBIT(vtrack->GetITSClusterMap(),i*2+1);
110 accept*=CheckITSClusterRequirement(fCutClusterRequirementITS[i], layer1, layer2);
113 //more flexible ITS cluster cut
114 if (fITSclusterBitMap) accept*=CheckITSClusterCut(vtrack->GetITSClusterMap());
116 //different its cluster cut
117 if (fWaiveITSNcls > -1) {
119 Int_t requiredNcls = 7;
120 for(Int_t i=5; i>=0; i--) {
121 if(TESTBIT(vtrack->GetITSClusterMap(),i)) {
123 requiredNcls=6-fWaiveITSNcls-i;
126 accept*=(requiredNcls<=nITScls);
130 if (fRequireITSRefit) accept*=(vtrack->GetStatus()&AliVTrack::kITSrefit)>0;
131 if (fRequireTPCRefit) accept*=(vtrack->GetStatus()&AliVTrack::kTPCrefit)>0;
133 if (fTPCNclRobustCut>0){
134 Int_t nclr=TMath::Nint(vtrack->GetTPCClusterInfo(2,1));
135 accept*=(nclr>fTPCNclRobustCut);
138 // use filter bit to speed up the AOD analysis (track pre-filter)
139 // relevant filter bits are:
140 // kTPCqual==1 -> TPC quality cuts
141 // kTPCqualSPDany==4 -> + SPD any
142 // kTPCqualSPDanyPIDele==8 -> + nSigmaTPCele +-3 (inclusion)
143 if (track->IsA()==AliAODTrack::Class() && fAODFilterBit!=kSwitchOff) {
144 accept*=((AliAODTrack*)track)->TestFilterBit(fAODFilterBit);
150 //______________________________________________
151 void AliDielectronTrackCuts::SetV0DaughterCut(AliPID::EParticleType type, Bool_t negate/*=kFALSE*/)
154 // Set V0 Daughter cut bit
156 const Int_t bitMap[5] = {14, -1, 15, -1, 16}; // convert the AliPID to bit positions
157 fV0DaughterCut=bitMap[type];
158 fNegateV0DauterCut=negate;
161 //____________________________________________________________________
162 Bool_t AliDielectronTrackCuts::CheckITSClusterRequirement(ITSClusterRequirement req, Bool_t clusterL1, Bool_t clusterL2) const
164 // checks if the cluster requirement is fullfilled (in this case: return kTRUE)
168 case kOff: return kTRUE;
169 case kNone: return !clusterL1 && !clusterL2;
170 case kAny: return clusterL1 || clusterL2;
171 case kFirst: return clusterL1;
172 case kOnlyFirst: return clusterL1 && !clusterL2;
173 case kSecond: return clusterL2;
174 case kOnlySecond: return clusterL2 && !clusterL1;
175 case kBoth: return clusterL1 && clusterL2;
181 //______________________________________________
182 Bool_t AliDielectronTrackCuts::CheckITSClusterCut(UChar_t itsBits) const
184 // check the its cluster cut
185 switch (fITSclusterCutType){
186 case kOneOf: return itsBits & fITSclusterBitMap;
187 case kAtLeast: return (itsBits & fITSclusterBitMap)==fITSclusterBitMap;
188 case kExact: return (itsBits==fITSclusterBitMap);