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 // Cut class providing cuts to all infomation //
18 // available for the AliVParticle interface // //
21 // Jens Wiechula <Jens.Wiechula@cern.ch> //
28 ///////////////////////////////////////////////////////////////////////////
33 #include "AliDielectronVarCuts.h"
34 #include "AliDielectronMC.h"
36 ClassImp(AliDielectronVarCuts)
39 AliDielectronVarCuts::AliDielectronVarCuts() :
41 fUsedVars(new TBits(AliDielectronVarManager::kNMaxValues)),
45 fCutOnMCtruth(kFALSE),
51 for (Int_t i=0; i<AliDielectronVarManager::kNMaxValues; ++i){
55 fCutExclude[i]=kFALSE;
60 //________________________________________________________________________
61 AliDielectronVarCuts::AliDielectronVarCuts(const char* name, const char* title) :
62 AliAnalysisCuts(name,title),
63 fUsedVars(new TBits(AliDielectronVarManager::kNMaxValues)),
67 fCutOnMCtruth(kFALSE),
73 for (Int_t i=0; i<AliDielectronVarManager::kNMaxValues; ++i){
77 fCutExclude[i]=kFALSE;
82 //________________________________________________________________________
83 AliDielectronVarCuts::~AliDielectronVarCuts()
88 if (fUsedVars) delete fUsedVars;
91 //________________________________________________________________________
92 Bool_t AliDielectronVarCuts::IsSelected(TObject* track)
102 if (!track) return kFALSE;
104 //If MC cut, get MC truth
106 AliVParticle *part=static_cast<AliVParticle*>(track);
107 track=AliDielectronMC::Instance()->GetMCTrackFromMCEvent(part->GetLabel());
108 if (!track) return kFALSE;
112 Double_t values[AliDielectronVarManager::kNMaxValues];
113 AliDielectronVarManager::SetFillMap(fUsedVars);
114 AliDielectronVarManager::Fill(track,values);
116 for (Int_t iCut=0; iCut<fNActiveCuts; ++iCut){
117 Int_t cut=fActiveCuts[iCut];
118 SETBIT(fSelectedCutsMask,iCut);
119 if ( !fUpperCut[iCut] && ((values[cut]<fCutMin[iCut]) || (values[cut]>fCutMax[iCut]))^fCutExclude[iCut] ) CLRBIT(fSelectedCutsMask,iCut);
120 else if ( fUpperCut[iCut]) {
121 // use a TH1 inherited cut object
122 Float_t x=0.,y=0.,z=0.;
123 switch (fUpperCut[iCut]->GetDimension()) {
124 case 3: z=values[fUpperCut[iCut]->GetZaxis()->GetUniqueID()];
125 case 2: y=values[fUpperCut[iCut]->GetYaxis()->GetUniqueID()];
126 case 1: x=values[fUpperCut[iCut]->GetXaxis()->GetUniqueID()];
128 Int_t bin = fUpperCut[iCut]->FindBin(x,y,z);
129 if ( ((values[cut]<fCutMin[iCut]) || (values[cut]>fUpperCut[iCut]->GetBinContent(bin)))^fCutExclude[iCut] ) CLRBIT(fSelectedCutsMask,iCut);
131 if ( fCutType==kAll && !TESTBIT(fSelectedCutsMask,iCut) ) return kFALSE; // option to (minor) speed improvement
134 Bool_t isSelected=(fSelectedCutsMask==fActiveCutsMask);
135 if ( fCutType==kAny ) isSelected=(fSelectedCutsMask>0);
136 SetSelected(isSelected);
140 //________________________________________________________________________
141 void AliDielectronVarCuts::AddCut(AliDielectronVarManager::ValueTypes type, Double_t min, Double_t max, Bool_t excludeRange)
144 // Set cut range and activate it
151 fCutMin[fNActiveCuts]=min;
152 fCutMax[fNActiveCuts]=max;
153 fCutExclude[fNActiveCuts]=excludeRange;
154 SETBIT(fActiveCutsMask,fNActiveCuts);
155 fActiveCuts[fNActiveCuts]=(UShort_t)type;
156 fUsedVars->SetBitNumber(type,kTRUE);
160 //________________________________________________________________________
161 void AliDielectronVarCuts::AddCut(AliDielectronVarManager::ValueTypes type, Double_t min, TH1 * const max, Bool_t excludeRange)
164 // Set cut range and activate it
166 fCutMin[fNActiveCuts]=min;
167 fCutMax[fNActiveCuts]=0.0;
168 fCutExclude[fNActiveCuts]=excludeRange;
169 SETBIT(fActiveCutsMask,fNActiveCuts);
170 fActiveCuts[fNActiveCuts]=(UShort_t)type;
171 fUsedVars->SetBitNumber(type,kTRUE);
174 switch(max->GetDimension()) {
177 var=AliDielectronVarManager::GetValueType(max->GetZaxis()->GetName());
178 fUsedVars->SetBitNumber(var,kTRUE);
179 max->GetZaxis()->SetUniqueID(var);
181 var=AliDielectronVarManager::GetValueType(max->GetYaxis()->GetName());
182 fUsedVars->SetBitNumber(var,kTRUE);
183 max->GetYaxis()->SetUniqueID(var);
185 var=AliDielectronVarManager::GetValueType(max->GetXaxis()->GetName());
186 fUsedVars->SetBitNumber(var,kTRUE);
187 max->GetXaxis()->SetUniqueID(var);
189 fUpperCut[fNActiveCuts]=(TH1*)max->Clone("histCut");
190 fUpperCut[fNActiveCuts]->SetDirectory(0x0);
194 //________________________________________________________________________
195 void AliDielectronVarCuts::Print(const Option_t* /*option*/) const
198 // Print cuts and the range
200 printf("cut ranges for '%s'\n",GetTitle());
202 printf("All Cuts have to be fulfilled\n");
204 printf("Any Cut has to be fulfilled\n");
206 for (Int_t iCut=0; iCut<fNActiveCuts; ++iCut){
207 Int_t cut=(Int_t)fActiveCuts[iCut];
208 Bool_t inverse=fCutExclude[iCut];
211 printf("Cut %02d: %f < %s < %f\n", iCut,
212 fCutMin[iCut], AliDielectronVarManager::GetValueName((Int_t)cut), fCutMax[iCut]);
214 printf("Cut %02d: !(%f < %s < %f)\n", iCut,
215 fCutMin[iCut], AliDielectronVarManager::GetValueName((Int_t)cut), fCutMax[iCut]);