]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGDQ/dielectron/AliDielectronVarCuts.cxx
fix for TProfile3D
[u/mrichter/AliRoot.git] / PWGDQ / dielectron / AliDielectronVarCuts.cxx
1 /*************************************************************************
2 * Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
3 *                                                                        *
4 * Author: The ALICE Off-line Project.                                    *
5 * Contributors are mentioned in the code where appropriate.              *
6 *                                                                        *
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 **************************************************************************/
15
16 ///////////////////////////////////////////////////////////////////////////
17 //   Cut class providing cuts to all infomation                          //
18 //     available for the AliVParticle interface                          //                                                     //
19 //                                                                       //
20 // Authors:                                                              //
21 //   Jens Wiechula <Jens.Wiechula@cern.ch>                               //
22 /*
23
24
25
26 */
27 //                                                                       //
28 ///////////////////////////////////////////////////////////////////////////
29
30
31 #include <TH1.h>
32
33 #include "AliDielectronVarCuts.h"
34 #include "AliDielectronMC.h"
35
36 ClassImp(AliDielectronVarCuts)
37
38
39 AliDielectronVarCuts::AliDielectronVarCuts() :
40   AliAnalysisCuts(),
41   fUsedVars(new TBits(AliDielectronVarManager::kNMaxValues)),
42   fNActiveCuts(0),
43   fActiveCutsMask(0),
44   fSelectedCutsMask(0),
45   fCutOnMCtruth(kFALSE),
46   fCutType(kAll)
47 {
48   //
49   // Default costructor
50   //
51   for (Int_t i=0; i<AliDielectronVarManager::kNMaxValues; ++i){
52     fActiveCuts[i]=0;
53     fCutMin[i]=0;
54     fCutMax[i]=0;
55     fCutExclude[i]=kFALSE;
56     fUpperCut[i]=0x0;
57   }
58 }
59
60 //________________________________________________________________________
61 AliDielectronVarCuts::AliDielectronVarCuts(const char* name, const char* title) :
62   AliAnalysisCuts(name,title),
63   fUsedVars(new TBits(AliDielectronVarManager::kNMaxValues)),
64   fNActiveCuts(0),
65   fActiveCutsMask(0),
66   fSelectedCutsMask(0),
67   fCutOnMCtruth(kFALSE),
68   fCutType(kAll)
69 {
70   //
71   // Named contructor
72   //
73   for (Int_t i=0; i<AliDielectronVarManager::kNMaxValues; ++i){
74     fActiveCuts[i]=0;
75     fCutMin[i]=0;
76     fCutMax[i]=0;
77     fCutExclude[i]=kFALSE;
78     fUpperCut[i]=0x0;
79   }
80 }
81
82 //________________________________________________________________________
83 AliDielectronVarCuts::~AliDielectronVarCuts()
84 {
85   //
86   // Destructor
87   //
88   if (fUsedVars) delete fUsedVars;
89 }
90
91 //________________________________________________________________________
92 Bool_t AliDielectronVarCuts::IsSelected(TObject* track)
93 {
94   //
95   // Make cut decision
96   //
97
98   //reset
99   fSelectedCutsMask=0;
100   SetSelected(kFALSE);
101
102   if (!track) return kFALSE;
103
104   //If MC cut, get MC truth
105   if (fCutOnMCtruth){
106     AliVParticle *part=static_cast<AliVParticle*>(track);
107     track=AliDielectronMC::Instance()->GetMCTrackFromMCEvent(part->GetLabel());
108     if (!track) return kFALSE;
109   }
110
111   //Fill values
112   Double_t values[AliDielectronVarManager::kNMaxValues];
113   AliDielectronVarManager::SetFillMap(fUsedVars);
114   AliDielectronVarManager::Fill(track,values);
115
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()];
127       }
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);
130     }
131     if ( fCutType==kAll && !TESTBIT(fSelectedCutsMask,iCut) ) return kFALSE; // option to (minor) speed improvement
132   }
133
134   Bool_t isSelected=(fSelectedCutsMask==fActiveCutsMask);
135   if ( fCutType==kAny ) isSelected=(fSelectedCutsMask>0);
136   SetSelected(isSelected);
137   return isSelected;
138 }
139
140 //________________________________________________________________________
141 void AliDielectronVarCuts::AddCut(AliDielectronVarManager::ValueTypes type, Double_t min, Double_t max, Bool_t excludeRange)
142 {
143   //
144   // Set cut range and activate it
145   //
146   if (min>max){
147     Double_t tmp=min;
148     min=max;
149     max=tmp;
150   }
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);
157   ++fNActiveCuts;
158 }
159
160 //________________________________________________________________________
161 void AliDielectronVarCuts::AddCut(AliDielectronVarManager::ValueTypes type, Double_t min, TH1 * const max,  Bool_t excludeRange)
162 {
163   //
164   // Set cut range and activate it
165   //
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);
172   // cut dependencies
173   UInt_t var =0;
174   switch(max->GetDimension()) {
175   case 3:
176   case 2:
177     var=AliDielectronVarManager::GetValueType(max->GetZaxis()->GetName());
178     fUsedVars->SetBitNumber(var,kTRUE);
179     max->GetZaxis()->SetUniqueID(var);
180   case 1:
181     var=AliDielectronVarManager::GetValueType(max->GetYaxis()->GetName());
182     fUsedVars->SetBitNumber(var,kTRUE);
183     max->GetYaxis()->SetUniqueID(var);
184   /*case 1:*/
185     var=AliDielectronVarManager::GetValueType(max->GetXaxis()->GetName());
186     fUsedVars->SetBitNumber(var,kTRUE);
187     max->GetXaxis()->SetUniqueID(var);
188   }
189   fUpperCut[fNActiveCuts]=(TH1*)max->Clone("histCut");
190   fUpperCut[fNActiveCuts]->SetDirectory(0x0);
191   ++fNActiveCuts;
192 }
193
194 //________________________________________________________________________
195 void AliDielectronVarCuts::Print(const Option_t* /*option*/) const
196 {
197   //
198   // Print cuts and the range
199   //
200   printf("cut ranges for '%s'\n",GetTitle());
201   if (fCutType==kAll){
202     printf("All Cuts have to be fulfilled\n");
203   } else {
204     printf("Any Cut has to be fulfilled\n");
205   }
206   for (Int_t iCut=0; iCut<fNActiveCuts; ++iCut){
207     Int_t cut=(Int_t)fActiveCuts[iCut];
208     Bool_t inverse=fCutExclude[iCut];
209
210     if (!inverse){
211       printf("Cut %02d: %f < %s < %f\n", iCut,
212              fCutMin[iCut], AliDielectronVarManager::GetValueName((Int_t)cut), fCutMax[iCut]);
213     } else {
214       printf("Cut %02d: !(%f < %s < %f)\n", iCut,
215              fCutMin[iCut], AliDielectronVarManager::GetValueName((Int_t)cut), fCutMax[iCut]);
216     }
217   }
218 }