extended by cuts on min / max absolute and relative impact parameter
[u/mrichter/AliRoot.git] / CORRFW / AliCFManager.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, 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 // The class AliCFManager is designed to handle inside the 
17 // task the basic components for a particle-level correction of single 
18 // particle analysis
19 // The class provides methods to set lists of cuts and to loop over them 
20 // for several different selection steps to be then used for
21 // efficiency calculation.
22 // prototype version by S.Arcelli silvia.arcelli@cern.ch
23 ///////////////////////////////////////////////////////////////////////////
24 #include "AliCFCutBase.h"
25 #include "AliCFManager.h"
26
27 ClassImp(AliCFManager)
28
29 //_____________________________________________________________________________
30 AliCFManager::AliCFManager() : 
31   TNamed(),
32   fNStepEvt(0),
33   fNStepPart(0),
34   fEvtContainer(0x0),
35   fPartContainer(0x0),
36   fEvtCutList(0x0),
37   fPartCutList(0x0)
38
39   //
40   // ctor
41   //
42 }
43 //_____________________________________________________________________________
44 AliCFManager::AliCFManager(Char_t* name, Char_t* title) : 
45   TNamed(name,title),
46   fNStepEvt(0),
47   fNStepPart(0),
48   fEvtContainer(0x0),
49   fPartContainer(0x0),
50   fEvtCutList(0x0),
51   fPartCutList(0x0)
52
53    //
54    // ctor
55    //
56 }
57 //_____________________________________________________________________________
58 AliCFManager::AliCFManager(const AliCFManager& c) : 
59   TNamed(c),
60   fNStepEvt(c.fNStepEvt),
61   fNStepPart(c.fNStepPart),
62   fEvtContainer(c.fEvtContainer),
63   fPartContainer(c.fPartContainer),
64   fEvtCutList(c.fEvtCutList),
65   fPartCutList(c.fPartCutList)
66
67    //
68    //copy ctor
69    //
70 }
71 //_____________________________________________________________________________
72 AliCFManager& AliCFManager::operator=(const AliCFManager& c)
73 {
74   //
75   // Assignment operator
76   //
77   if (this != &c) {
78     TNamed::operator=(c) ;
79   }
80   
81   this->fNStepEvt=c.fNStepEvt;
82   this->fNStepPart=c.fNStepPart;
83   this->fEvtContainer=c.fEvtContainer;
84   this->fPartContainer=c.fPartContainer;
85   this->fEvtCutList=c.fEvtCutList;
86   this->fPartCutList=c.fPartCutList;
87   return *this ;
88 }
89
90 //_____________________________________________________________________________
91 AliCFManager::~AliCFManager() {
92    //
93    //dtor
94    //
95 }
96
97 //_____________________________________________________________________________
98 Bool_t AliCFManager::CheckParticleCuts(Int_t isel, TObject *obj, const TString  &selcuts) const {
99   //
100   // check whether object obj passes particle-level selection isel
101   //
102
103   if(isel>=fNStepPart){
104     AliWarning(Form("Selection index out of Range! isel=%i, max. number of selections= %i", isel,fNStepPart));
105     return kTRUE;
106   }
107   if(!fPartCutList[isel])return kTRUE;
108   TObjArrayIter iter(fPartCutList[isel]);
109   AliCFCutBase *cut = 0;
110   while ( (cut = (AliCFCutBase*)iter.Next()) ) {
111     TString cutName=cut->GetName();
112     Bool_t checkCut=CompareStrings(cutName,selcuts);
113     if(checkCut && !cut->IsSelected(obj)) return kFALSE;   
114   }
115   return kTRUE;
116 }
117
118 //_____________________________________________________________________________
119 Bool_t AliCFManager::CheckEventCuts(Int_t isel, TObject *obj, const TString  &selcuts) const{
120   //
121   // check whether object obj passes event-level selection isel
122   //
123
124   if(isel>=fNStepEvt){
125     AliWarning(Form("Selection index out of Range! isel=%i, max. number of selections= %i", isel,fNStepEvt));
126       return kTRUE;
127   }
128   if(!fEvtCutList[isel])return kTRUE;
129   TObjArrayIter iter(fEvtCutList[isel]);
130   AliCFCutBase *cut = 0;
131   while ( (cut = (AliCFCutBase*)iter.Next()) ) {
132     TString cutName=cut->GetName();
133     Bool_t checkCut=CompareStrings(cutName,selcuts);
134     if(checkCut && !cut->IsSelected(obj)) return kFALSE;   
135   }
136   return kTRUE;
137 }
138
139 //_____________________________________________________________________________
140 void  AliCFManager::SetEventInfo(TObject *obj) const {
141
142   //Particle level cuts
143
144   if (!fPartCutList) {
145     AliWarning("No particle cut list found");
146   }
147   else {
148     for(Int_t isel=0;isel<fNStepPart; isel++){
149       if(!fPartCutList[isel])continue;  
150       TObjArrayIter iter(fPartCutList[isel]);
151       AliCFCutBase *cut = 0;
152       while ( (cut = (AliCFCutBase*)iter.Next()) ) {
153         cut->SetEvtInfo(obj);
154       }    
155     }
156   }
157   
158   //Event level cuts 
159   
160   if (!fEvtCutList) {
161     AliWarning("No event cut list found");
162   }
163   else {
164     for(Int_t isel=0;isel<fNStepEvt; isel++){
165       if(!fEvtCutList[isel])continue;  
166       TObjArrayIter iter(fEvtCutList[isel]);
167       AliCFCutBase *cut = 0;
168       while ( (cut = (AliCFCutBase*)iter.Next()) ) {
169         cut->SetEvtInfo(obj);
170       }   
171     }
172   }
173 }
174
175 //_____________________________________________________________________________
176 Bool_t AliCFManager::CompareStrings(const TString  &cutname,const TString  &selcuts) const{
177   //
178   // compare two strings
179   //
180
181   if(selcuts.Contains("all"))return kTRUE;
182   if ( selcuts.CompareTo(cutname) == 0 ||
183        selcuts.BeginsWith(cutname+" ") ||
184        selcuts.EndsWith(" "+cutname) ||
185        selcuts.Contains(" "+cutname+" "))  return kTRUE; 
186   return kFALSE;
187 }
188
189
190 //_____________________________________________________________________________
191 void AliCFManager::SetEventCutsList(Int_t isel, TObjArray* array) {
192   //
193   //Setter for event-level selection cut list at selection step isel
194   //
195
196   if (!fEvtContainer) {
197     AliWarning("No event container defined, you may need to set it first!"); 
198   }
199
200   Int_t nstep = fNStepEvt;
201
202   if (!fEvtCutList) fEvtCutList = new TObjArray*[nstep] ;
203   if (isel >= nstep) {
204     AliWarning(Form("Selection index out of Range! isel=%i, max. number of selections= %i", isel,nstep));
205     return;
206   }
207   fEvtCutList[isel] = array;
208 }
209
210 //_____________________________________________________________________________
211 void AliCFManager::SetParticleCutsList(Int_t isel, TObjArray* array) {
212   //
213   //Setter for particle-level selection cut list at selection step isel
214   //
215
216   if (!fPartContainer) {
217     AliWarning("No particle container defined, you may need to set it first!"); 
218   }
219   
220   Int_t nstep = fNStepPart ;
221   
222   if (!fPartCutList) fPartCutList = new TObjArray*[nstep] ;
223   if (isel >= nstep) {
224     AliWarning(Form("Selection index out of Range! isel=%i, max. number of selections= %i", isel,nstep));
225     return;
226   }
227   fPartCutList[isel] = array;
228 }