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> //
22 // Julian Book <Julian.Book@cern.ch> //
29 ///////////////////////////////////////////////////////////////////////////
34 #include "AliDielectronVarCuts.h"
35 #include "AliDielectronMC.h"
37 ClassImp(AliDielectronVarCuts)
40 AliDielectronVarCuts::AliDielectronVarCuts() :
42 fUsedVars(new TBits(AliDielectronVarManager::kNMaxValues)),
46 fCutOnMCtruth(kFALSE),
52 for (Int_t i=0; i<AliDielectronVarManager::kNMaxValues; ++i){
56 fCutExclude[i]=kFALSE;
62 //________________________________________________________________________
63 AliDielectronVarCuts::AliDielectronVarCuts(const char* name, const char* title) :
64 AliAnalysisCuts(name,title),
65 fUsedVars(new TBits(AliDielectronVarManager::kNMaxValues)),
69 fCutOnMCtruth(kFALSE),
75 for (Int_t i=0; i<AliDielectronVarManager::kNMaxValues; ++i){
79 fCutExclude[i]=kFALSE;
85 //________________________________________________________________________
86 AliDielectronVarCuts::~AliDielectronVarCuts()
91 if (fUsedVars) delete fUsedVars;
94 //________________________________________________________________________
95 Bool_t AliDielectronVarCuts::IsSelected(TObject* track)
105 if (!track) return kFALSE;
107 //If MC cut, get MC truth
109 AliVParticle *part=static_cast<AliVParticle*>(track);
110 track=AliDielectronMC::Instance()->GetMCTrackFromMCEvent(part->GetLabel());
111 if (!track) return kFALSE;
115 Double_t values[AliDielectronVarManager::kNMaxValues];
116 AliDielectronVarManager::SetFillMap(fUsedVars);
117 AliDielectronVarManager::Fill(track,values);
119 for (Int_t iCut=0; iCut<fNActiveCuts; ++iCut){
120 Int_t cut=fActiveCuts[iCut];
121 SETBIT(fSelectedCutsMask,iCut);
125 if ( (TESTBIT((UInt_t)values[cut],(UInt_t)fCutMin[iCut]))^(!fCutExclude[iCut]) ) CLRBIT(fSelectedCutsMask,iCut);
129 if ( !fUpperCut[iCut] && ((values[cut]<fCutMin[iCut]) || (values[cut]>fCutMax[iCut]))^fCutExclude[iCut] ) {
130 CLRBIT(fSelectedCutsMask,iCut);
132 else if ( fUpperCut[iCut]) {
133 /// use a THnBase inherited cut object //
134 Double_t *vals = new Double_t[fUpperCut[iCut]->GetNdimensions()];//={-1};
135 // get array of values for the corresponding dimensions using axis names
136 for(Int_t idim=0; idim<fUpperCut[iCut]->GetNdimensions(); idim++) {
137 vals[idim] = values[AliDielectronVarManager::GetValueType(fUpperCut[iCut]->GetAxis(idim)->GetName())];
138 // printf(" \t %s %.3f ",fUpperCut[iCut]->GetAxis(idim)->GetName(),vals[idim]);
140 // find bin for values (w/o creating it in case it is not filled)
141 Long_t bin = fUpperCut[iCut]->GetBin(vals,kFALSE);
142 Double_t cutMax = (bin>0 ? fUpperCut[iCut]->GetBinContent(bin) : -999. );
143 if ( ((values[cut]<fCutMin[iCut]) || (values[cut]>cutMax))^fCutExclude[iCut] ) CLRBIT(fSelectedCutsMask,iCut);
147 // cut type and decision
148 if ( fCutType==kAll && !TESTBIT(fSelectedCutsMask,iCut) ) return kFALSE; // option to (minor) speed improvement
151 Bool_t isSelected=(fSelectedCutsMask==fActiveCutsMask);
152 if ( fCutType==kAny ) isSelected=(fSelectedCutsMask>0);
153 SetSelected(isSelected);
157 //________________________________________________________________________
158 void AliDielectronVarCuts::AddCut(AliDielectronVarManager::ValueTypes type, Double_t min, Double_t max, Bool_t excludeRange)
161 // Set cut range and activate it
168 fCutMin[fNActiveCuts]=min;
169 fCutMax[fNActiveCuts]=max;
170 fCutExclude[fNActiveCuts]=excludeRange;
171 SETBIT(fActiveCutsMask,fNActiveCuts);
172 fActiveCuts[fNActiveCuts]=(UShort_t)type;
173 fUsedVars->SetBitNumber(type,kTRUE);
177 //________________________________________________________________________
178 void AliDielectronVarCuts::AddBitCut(AliDielectronVarManager::ValueTypes type, UInt_t bit, Bool_t excludeRange)
181 // Set cut range and activate it
183 fCutMin[fNActiveCuts]=bit;
184 fCutExclude[fNActiveCuts]=excludeRange;
185 fBitCut[fNActiveCuts]=kTRUE;
186 SETBIT(fActiveCutsMask,fNActiveCuts);
187 fActiveCuts[fNActiveCuts]=(UShort_t)type;
188 fUsedVars->SetBitNumber(type,kTRUE);
192 //________________________________________________________________________
193 void AliDielectronVarCuts::AddCut(AliDielectronVarManager::ValueTypes type, Double_t min, THnBase * const max, Bool_t excludeRange)
196 // Set cut range and activate it
198 fCutMin[fNActiveCuts]=min;
199 fCutMax[fNActiveCuts]=0.0;
200 fCutExclude[fNActiveCuts]=excludeRange;
201 SETBIT(fActiveCutsMask,fNActiveCuts);
202 fActiveCuts[fNActiveCuts]=(UShort_t)type;
203 fUsedVars->SetBitNumber(type,kTRUE);
205 fUpperCut[fNActiveCuts]=max;
206 // fill used variables into map
207 for(Int_t idim=0; idim<fUpperCut[fNActiveCuts]->GetNdimensions(); idim++) {
208 TString var(fUpperCut[fNActiveCuts]->GetAxis(idim)->GetName());
209 fUsedVars->SetBitNumber(AliDielectronVarManager::GetValueType(var.Data()), kTRUE);
214 //________________________________________________________________________
215 void AliDielectronVarCuts::Print(const Option_t* /*option*/) const
218 // Print cuts and the range
220 printf("cut ranges for '%s'\n",GetTitle());
222 printf("All Cuts have to be fulfilled\n");
224 printf("Any Cut has to be fulfilled\n");
226 for (Int_t iCut=0; iCut<fNActiveCuts; ++iCut){
227 Int_t cut=(Int_t)fActiveCuts[iCut];
228 Bool_t inverse=fCutExclude[iCut];
229 Bool_t bitcut=fBitCut[iCut];
230 Bool_t objcut=fUpperCut[iCut];
232 if(!bitcut && !objcut) {
235 printf("Cut %02d: %f < %s < %f\n", iCut,
236 fCutMin[iCut], AliDielectronVarManager::GetValueName((Int_t)cut), fCutMax[iCut]);
238 printf("Cut %02d: !(%f < %s < %f)\n", iCut,
239 fCutMin[iCut], AliDielectronVarManager::GetValueName((Int_t)cut), fCutMax[iCut]);
245 printf("Cut %02d: %s & (1ULL<<%d) \n", iCut,
246 AliDielectronVarManager::GetValueName((Int_t)cut), (UInt_t)fCutMin[iCut]);
248 printf("Cut %02d: !(%s & (1ULL<<%d)) \n", iCut,
249 AliDielectronVarManager::GetValueName((Int_t)cut), (UInt_t)fCutMin[iCut]);
253 // upper cut limit provided by object depending on 'dep'
255 for(Int_t idim=0; idim<fUpperCut[iCut]->GetNdimensions(); idim++)
256 dep+=Form("%s%s",(idim?",":""),fUpperCut[iCut]->GetAxis(idim)->GetName());
259 printf("Cut %02d: %f < %s < obj(%s)\n", iCut,
260 fCutMin[iCut], AliDielectronVarManager::GetValueName((Int_t)cut), dep.Data());
262 printf("Cut %02d: !(%f < %s < obj(%s))\n", iCut,
263 fCutMin[iCut], AliDielectronVarManager::GetValueName((Int_t)cut), dep.Data());