updated for e-h analysis
[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::SetMCEventInfo(const 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->SetMCEventInfo(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->SetMCEventInfo(obj);
170       }   
171     }
172   }
173 }
174 //_____________________________________________________________________________
175 void  AliCFManager::SetRecEventInfo(const TObject *obj) const {
176
177   //Particle level cuts
178
179   if (!fPartCutList) {
180     AliWarning("No particle cut list found");
181   }
182   else {
183     for(Int_t isel=0;isel<fNStepPart; isel++){
184       if(!fPartCutList[isel])continue;  
185       TObjArrayIter iter(fPartCutList[isel]);
186       AliCFCutBase *cut = 0;
187       while ( (cut = (AliCFCutBase*)iter.Next()) ) {
188         cut->SetRecEventInfo(obj);
189       }    
190     }
191   }
192   
193   //Event level cuts 
194   
195   if (!fEvtCutList) {
196     AliWarning("No event cut list found");
197   }
198   else {
199     for(Int_t isel=0;isel<fNStepEvt; isel++){
200       if(!fEvtCutList[isel])continue;  
201       TObjArrayIter iter(fEvtCutList[isel]);
202       AliCFCutBase *cut = 0;
203       while ( (cut = (AliCFCutBase*)iter.Next()) ) {
204         cut->SetRecEventInfo(obj);
205       }   
206     }
207   }
208 }
209
210 //_____________________________________________________________________________
211 Bool_t AliCFManager::CompareStrings(const TString  &cutname,const TString  &selcuts) const{
212   //
213   // compare two strings
214   //
215
216   if(selcuts.Contains("all"))return kTRUE;
217   if ( selcuts.CompareTo(cutname) == 0 ||
218        selcuts.BeginsWith(cutname+" ") ||
219        selcuts.EndsWith(" "+cutname) ||
220        selcuts.Contains(" "+cutname+" "))  return kTRUE; 
221   return kFALSE;
222 }
223
224
225 //_____________________________________________________________________________
226 void AliCFManager::SetEventCutsList(Int_t isel, TObjArray* array) {
227   //
228   //Setter for event-level selection cut list at selection step isel
229   //
230
231   if (!fEvtContainer) {
232     AliWarning("No event container defined, you may need to set it first!"); 
233   }
234
235   Int_t nstep = fNStepEvt;
236
237   if (!fEvtCutList) {
238     fEvtCutList = new TObjArray*[nstep] ;
239     for (Int_t i=0; i<nstep; ++i) fEvtCutList[i] = 0;
240   }
241   if (isel >= nstep) {
242     AliWarning(Form("Selection index out of Range! isel=%i, max. number of selections= %i", isel,nstep));
243     return;
244   }
245   fEvtCutList[isel] = array;
246 }
247
248 //_____________________________________________________________________________
249 void AliCFManager::SetParticleCutsList(Int_t isel, TObjArray* array) {
250   //
251   //Setter for particle-level selection cut list at selection step isel
252   //
253
254   if (!fPartContainer) {
255     AliWarning("No particle container defined, you may need to set it first!"); 
256   }
257   
258   Int_t nstep = fNStepPart ;
259   
260   if (!fPartCutList) {
261     fPartCutList = new TObjArray*[nstep] ;
262     for (Int_t istep = 0; istep < nstep; istep++)  fPartCutList[istep] = 0; 
263   }
264   
265   if (isel >= nstep) {
266     AliWarning(Form("Selection index out of Range! isel=%i, max. number of selections= %i", isel,nstep));
267     return;
268   }
269   fPartCutList[isel] = array;
270 }