1 /**************************************************************************
2 * Copyright(c) 1998-1999, 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 **************************************************************************/
15 ///////////////////////////////////////////////////////////////////////////
16 // The class AliCFManager is designed to handle inside the
17 // task the basic components for a particle-level correction of single
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 ///////////////////////////////////////////////////////////////////////////
28 #include "AliCFCutBase.h"
29 #include "AliCFManager.h"
31 ClassImp(AliCFManager)
33 //_____________________________________________________________________________
34 AliCFManager::AliCFManager() :
44 for(Int_t i=0;i<kNEvtSel;i++)fEvtCutList[i]=0x0;
45 for(Int_t i=0;i<kNPartSel;i++)fPartCutList[i]=0x0;
46 fhQABits=new TBits(0);
48 //_____________________________________________________________________________
49 AliCFManager::AliCFManager(Char_t* name, Char_t* title) :
58 for(Int_t i=0;i<kNEvtSel;i++)fEvtCutList[i]=0x0;
59 for(Int_t i=0;i<kNPartSel;i++)fPartCutList[i]=0x0;
60 fhQABits=new TBits(0);
62 //_____________________________________________________________________________
63 AliCFManager::AliCFManager(const AliCFManager& c) :
65 fEvtContainer(c.fEvtContainer),
66 fPartContainer(c.fPartContainer),
72 for(Int_t i=0;i<kNEvtSel;i++)fEvtCutList[i]=c.fEvtCutList[i];
73 for(Int_t i=0;i<kNPartSel;i++)fPartCutList[i]=c.fPartCutList[i];
75 //_____________________________________________________________________________
76 AliCFManager& AliCFManager::operator=(const AliCFManager& c)
79 // Assignment operator
82 TNamed::operator=(c) ;
85 this->fEvtContainer=c.fEvtContainer;
86 this->fPartContainer=c.fPartContainer;
87 this->fhQABits=c.fhQABits;
88 for(Int_t i=0;i<kNEvtSel;i++)this->fEvtCutList[i]=c.fEvtCutList[i];
89 for(Int_t i=0;i<kNPartSel;i++)this->fPartCutList[i]=c.fPartCutList[i];
93 //_____________________________________________________________________________
94 AliCFManager::~AliCFManager() {
98 if(fhQABits) delete fhQABits;
101 //_____________________________________________________________________________
102 Bool_t AliCFManager::CheckParticleCuts(Int_t isel, TObject *obj, const TString &selcuts) const {
104 // check whether object obj passes particle-level selection isel
108 AliWarning(Form("Selection index out of Range! isel=%i, max. number of selections= %i", isel,kNPartSel));
111 if(!fPartCutList[isel])return kTRUE;
112 TObjArrayIter iter(fPartCutList[isel]);
113 AliCFCutBase *cut = 0;
114 while ( (cut = (AliCFCutBase*)iter.Next()) ) {
115 TString cutName=cut->GetName();
116 Bool_t checkCut=CompareStrings(cutName,selcuts);
117 if(checkCut && !cut->IsSelected(obj)) return kFALSE;
122 //_____________________________________________________________________________
123 Bool_t AliCFManager::CheckEventCuts(Int_t isel, TObject *obj, const TString &selcuts) const{
125 // check whether object obj passes event-level selection isel
129 AliWarning(Form("Selection index out of Range! isel=%i, max. number of selections= %i", isel,kNEvtSel));
132 if(!fEvtCutList[isel])return kTRUE;
133 TObjArrayIter iter(fEvtCutList[isel]);
134 AliCFCutBase *cut = 0;
135 while ( (cut = (AliCFCutBase*)iter.Next()) ) {
136 TString cutName=cut->GetName();
137 Bool_t checkCut=CompareStrings(cutName,selcuts);
138 if(checkCut && !cut->IsSelected(obj)) return kFALSE;
143 //_____________________________________________________________________________
144 void AliCFManager::FillQABeforeParticleCuts(Int_t isel, TObject *obj) const{
146 // Fill QA histos before cuts at particle selection level isel are applied
150 AliWarning(Form("Selection index out of Range! isel=%i, max. number of selections= %i", isel,kNPartSel));
153 if(!fPartCutList[isel])return;
155 TObjArrayIter iter(fPartCutList[isel]);
156 AliCFCutBase *cut = 0;
157 while ( (cut = (AliCFCutBase*)iter.Next()) ) {
158 if(cut->IsQAOn())cut->FillHistogramsBeforeCuts(obj);
161 //_____________________________________________________________________________
162 void AliCFManager::FillQAAfterParticleCuts(Int_t isel, TObject *obj) const{
164 // Fill QA histos after cuts at particle selection level isel are applied
167 AliWarning(Form("Selection index out of Range! isel=%i, max. number of selections= %i", isel,kNPartSel));
170 if(!fPartCutList[isel])return;
172 TObjArrayIter iter(fPartCutList[isel]);
173 AliCFCutBase *cut = 0;
174 while ( (cut = (AliCFCutBase*)iter.Next()) ) {
175 if(cut->IsQAOn())cut->FillHistogramsAfterCuts(obj);
179 //_____________________________________________________________________________
180 void AliCFManager::FillQABeforeEventCuts(Int_t isel, TObject *obj) const{
182 // Fill QA histos before cuts at event selection level isel are applied
186 AliWarning(Form("Selection index out of Range! isel=%i, max. number of selections= %i", isel,kNEvtSel));
189 if(!fEvtCutList[isel])return;
191 TObjArrayIter iter(fEvtCutList[isel]);
192 AliCFCutBase *cut = 0;
193 while ( (cut = (AliCFCutBase*)iter.Next()) ) {
194 if(cut->IsQAOn())cut->FillHistogramsBeforeCuts(obj);
198 //_____________________________________________________________________________
199 void AliCFManager::FillQAAfterEventCuts(Int_t isel, TObject *obj) const{
201 // Fill QA histos after cuts at event selection level isel are applied
205 AliWarning(Form("Selection index out of Range! isel=%i, max. number of selections= %i", isel,kNEvtSel));
208 if(!fEvtCutList[isel])return;
210 TObjArrayIter iter(fEvtCutList[isel]);
211 AliCFCutBase *cut = 0;
212 while ( (cut = (AliCFCutBase*)iter.Next()) ) {
213 if(cut->IsQAOn())cut->FillHistogramsAfterCuts(obj);
217 //_____________________________________________________________________________
218 void AliCFManager::AddQAHistosToList(TList *list) const {
220 // Add to list the full list of QA histograms to be written to the output
223 for(Int_t isel=0;isel<kNPartSel; isel++){
224 if(!fPartCutList[isel])continue;
225 TObjArrayIter iter(fPartCutList[isel]);
226 AliCFCutBase *cut = 0;
227 while ( (cut = (AliCFCutBase*)iter.Next()) ) {
228 if(cut->IsQAOn())cut->AddQAHistograms(list);
232 //Event-level cuts QA
234 for(Int_t isel=0;isel<kNEvtSel; isel++){
235 if(!fEvtCutList[isel])continue;
236 TObjArrayIter iter(fEvtCutList[isel]);
237 AliCFCutBase *cut = 0;
238 while ( (cut = (AliCFCutBase*)iter.Next()) ) {
239 if(cut->IsQAOn())cut->AddQAHistograms(list);
243 //_____________________________________________________________________________
244 TBits* AliCFManager::GetQAParticleSelBits(Int_t isel, TObject *obj) {
246 // Get the full list of QA histograms to be written to the output
249 fhQABits->Clear(); //reset the list
251 //Particle-level cuts QA
253 if(fPartCutList[isel]){
254 TObjArrayIter iter(fPartCutList[isel]);
255 AliCFCutBase *cut = 0;
256 while ( (cut = (AliCFCutBase*)iter.Next()) ) {
258 TBits *qalist=new TBits(0);
259 cut->GetBitMap(obj,qalist);
260 for(UInt_t icut=0;icut<qalist->GetNbits();icut++){
261 fhQABits->SetBitNumber(icut,qalist->TestBitNumber(icut));
272 //_____________________________________________________________________________
273 void AliCFManager::SetEventInfo(TObject *obj) const {
275 //Particle level cuts
277 for(Int_t isel=0;isel<kNPartSel; isel++){
278 if(!fPartCutList[isel])continue;
279 TObjArrayIter iter(fPartCutList[isel]);
280 AliCFCutBase *cut = 0;
281 while ( (cut = (AliCFCutBase*)iter.Next()) ) {
282 cut->SetEvtInfo(obj);
288 for(Int_t isel=0;isel<kNEvtSel; isel++){
289 if(!fEvtCutList[isel])continue;
290 TObjArrayIter iter(fEvtCutList[isel]);
291 AliCFCutBase *cut = 0;
292 while ( (cut = (AliCFCutBase*)iter.Next()) ) {
293 cut->SetEvtInfo(obj);
297 //_____________________________________________________________________________
298 void AliCFManager::InitQAHistos() const {
300 //Particle level cuts
302 for(Int_t isel=0;isel<kNPartSel; isel++){
303 if(!fPartCutList[isel])continue;
304 TObjArrayIter iter(fPartCutList[isel]);
305 AliCFCutBase *cut = 0;
306 while ( (cut = (AliCFCutBase*)iter.Next()) ) {
307 if(cut->IsQAOn())cut->Init();
313 for(Int_t isel=0;isel<kNEvtSel; isel++){
314 if(!fEvtCutList[isel])continue;
315 TObjArrayIter iter(fEvtCutList[isel]);
316 AliCFCutBase *cut = 0;
317 while ( (cut = (AliCFCutBase*)iter.Next()) ) {
318 if(cut->IsQAOn())cut->Init();
323 //_____________________________________________________________________________
324 Bool_t AliCFManager::CompareStrings(const TString &cutname,const TString &selcuts) const{
326 // compare two strings
329 if(selcuts.Contains("all"))return kTRUE;
330 if ( selcuts.CompareTo(cutname) == 0 ||
331 selcuts.BeginsWith(cutname+" ") ||
332 selcuts.EndsWith(" "+cutname) ||
333 selcuts.Contains(" "+cutname+" ")) return kTRUE;