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;
61 //________________________________________________________________________
62 AliDielectronVarCuts::AliDielectronVarCuts(const char* name, const char* title) :
63 AliAnalysisCuts(name,title),
64 fUsedVars(new TBits(AliDielectronVarManager::kNMaxValues)),
68 fCutOnMCtruth(kFALSE),
74 for (Int_t i=0; i<AliDielectronVarManager::kNMaxValues; ++i){
78 fCutExclude[i]=kFALSE;
83 //________________________________________________________________________
84 AliDielectronVarCuts::~AliDielectronVarCuts()
89 if (fUsedVars) delete fUsedVars;
92 //________________________________________________________________________
93 Bool_t AliDielectronVarCuts::IsSelected(TObject* track)
103 if (!track) return kFALSE;
105 //If MC cut, get MC truth
107 AliVParticle *part=static_cast<AliVParticle*>(track);
108 track=AliDielectronMC::Instance()->GetMCTrackFromMCEvent(part->GetLabel());
109 if (!track) return kFALSE;
113 Double_t values[AliDielectronVarManager::kNMaxValues];
114 AliDielectronVarManager::SetFillMap(fUsedVars);
115 AliDielectronVarManager::Fill(track,values);
117 for (Int_t iCut=0; iCut<fNActiveCuts; ++iCut){
118 Int_t cut=fActiveCuts[iCut];
119 SETBIT(fSelectedCutsMask,iCut);
120 if ( !fUpperCut[iCut] && ((values[cut]<fCutMin[iCut]) || (values[cut]>fCutMax[iCut]))^fCutExclude[iCut] ) CLRBIT(fSelectedCutsMask,iCut);
121 else if ( fUpperCut[iCut]) {
122 // use a THnBase inherited cut object
123 Double_t *vals = new Double_t[fUpperCut[iCut]->GetNdimensions()];//={-1};
124 // get array of values for the corresponding dimensions using axis names
125 for(Int_t idim=0; idim<fUpperCut[iCut]->GetNdimensions(); idim++) {
126 vals[idim] = values[AliDielectronVarManager::GetValueType(fUpperCut[iCut]->GetAxis(idim)->GetName())];
127 // printf(" \t %s %.3f ",fUpperCut[iCut]->GetAxis(idim)->GetName(),vals[idim]);
129 // find bin for values (w/o creating it in case it is not filled)
130 Long_t bin = fUpperCut[iCut]->GetBin(vals,kFALSE);
131 Double_t cutMax = (bin>0 ? fUpperCut[iCut]->GetBinContent(bin) : -999. );
132 if ( ((values[cut]<fCutMin[iCut]) || (values[cut]>cutMax))^fCutExclude[iCut] ) CLRBIT(fSelectedCutsMask,iCut);
135 if ( fCutType==kAll && !TESTBIT(fSelectedCutsMask,iCut) ) return kFALSE; // option to (minor) speed improvement
138 Bool_t isSelected=(fSelectedCutsMask==fActiveCutsMask);
139 if ( fCutType==kAny ) isSelected=(fSelectedCutsMask>0);
140 SetSelected(isSelected);
144 //________________________________________________________________________
145 void AliDielectronVarCuts::AddCut(AliDielectronVarManager::ValueTypes type, Double_t min, Double_t max, Bool_t excludeRange)
148 // Set cut range and activate it
155 fCutMin[fNActiveCuts]=min;
156 fCutMax[fNActiveCuts]=max;
157 fCutExclude[fNActiveCuts]=excludeRange;
158 SETBIT(fActiveCutsMask,fNActiveCuts);
159 fActiveCuts[fNActiveCuts]=(UShort_t)type;
160 fUsedVars->SetBitNumber(type,kTRUE);
164 //________________________________________________________________________
165 void AliDielectronVarCuts::AddCut(AliDielectronVarManager::ValueTypes type, Double_t min, THnBase * const max, Bool_t excludeRange)
168 // Set cut range and activate it
170 fCutMin[fNActiveCuts]=min;
171 fCutMax[fNActiveCuts]=0.0;
172 fCutExclude[fNActiveCuts]=excludeRange;
173 SETBIT(fActiveCutsMask,fNActiveCuts);
174 fActiveCuts[fNActiveCuts]=(UShort_t)type;
175 fUsedVars->SetBitNumber(type,kTRUE);
177 fUpperCut[fNActiveCuts]=max;
178 // fill used variables into map
179 for(Int_t idim=0; idim<fUpperCut[fNActiveCuts]->GetNdimensions(); idim++) {
180 TString var(fUpperCut[fNActiveCuts]->GetAxis(idim)->GetName());
181 fUsedVars->SetBitNumber(AliDielectronVarManager::GetValueType(var.Data()), kTRUE);
186 //________________________________________________________________________
187 void AliDielectronVarCuts::Print(const Option_t* /*option*/) const
190 // Print cuts and the range
192 printf("cut ranges for '%s'\n",GetTitle());
194 printf("All Cuts have to be fulfilled\n");
196 printf("Any Cut has to be fulfilled\n");
198 for (Int_t iCut=0; iCut<fNActiveCuts; ++iCut){
199 Int_t cut=(Int_t)fActiveCuts[iCut];
200 Bool_t inverse=fCutExclude[iCut];
203 printf("Cut %02d: %f < %s < %f\n", iCut,
204 fCutMin[iCut], AliDielectronVarManager::GetValueName((Int_t)cut), fCutMax[iCut]);
206 printf("Cut %02d: !(%f < %s < %f)\n", iCut,
207 fCutMin[iCut], AliDielectronVarManager::GetValueName((Int_t)cut), fCutMax[iCut]);