switch to fill only events added
[u/mrichter/AliRoot.git] / ANALYSIS / AliAnalysisFilter.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 /* $Id$ */
17
18 //
19 // Manager class for filter decisions based on cuts
20 // The filter contains a list of sets of cuts.
21 // A bit field is filled in order to store the decision of each cut-set. 
22 // Author: Andreas Morsch
23 // andreas.morsch@cern.ch
24
25 #include <TObject.h>
26 #include <TList.h>
27 #include "AliAnalysisFilter.h"
28 #include "AliAnalysisCuts.h"
29
30
31 ClassImp(AliAnalysisFilter)
32
33
34 ////////////////////////////////////////////////////////////////////////
35
36 AliAnalysisFilter::AliAnalysisFilter():
37     TNamed(),
38     fCuts(0)
39 {
40   // Default constructor
41 }
42
43 AliAnalysisFilter::AliAnalysisFilter(const char* name, const char* title):
44     TNamed(name, title),
45     fCuts(new TList())
46 {
47   // Constructor
48 }
49
50 AliAnalysisFilter::AliAnalysisFilter(const AliAnalysisFilter& obj):
51     TNamed(obj),
52     fCuts(0)
53 {
54 // Copy constructor
55     fCuts = obj.fCuts;
56 }
57
58 AliAnalysisFilter::~AliAnalysisFilter()
59 {
60 // Destructor
61    if (fCuts) fCuts->Delete("slow");
62    delete fCuts;
63 }   
64
65 AliAnalysisFilter& AliAnalysisFilter::operator=(const AliAnalysisFilter& other)
66 {
67 // Assignment
68    if (&other != this) {
69            TNamed::operator=(other);
70            fCuts = other.fCuts;
71    }
72    return *this;
73    }
74    
75 UInt_t AliAnalysisFilter::IsSelected(TObject* obj)
76 {
77     //
78     // Loop over all set of cuts
79     // and store the decision
80     UInt_t result = 0;
81     UInt_t filterMask;
82     
83     TIter next(fCuts);
84     AliAnalysisCuts *cuts;
85     Int_t iCutB = 1;
86         
87     while((cuts = (AliAnalysisCuts*)next())) {
88         Bool_t acc = cuts->IsSelected(obj);
89         if ((filterMask = cuts->GetFilterMask()) > 0) {
90             acc = (acc && (filterMask == result));
91         }
92         cuts->SetSelected(acc);
93         if (acc) {result |= iCutB & 0x00ffffff;}
94         iCutB *= 2;
95     }  
96
97     return result;
98 }
99
100 UInt_t AliAnalysisFilter::IsSelected(TList* list)
101 {
102     //
103     // Loop over all set of cuts
104     // and store the decision
105     UInt_t result = 0;
106     UInt_t filterMask;
107
108     TIter next(fCuts);
109     AliAnalysisCuts *cuts;
110     Int_t iCutB = 1;
111         
112     while((cuts = (AliAnalysisCuts*)next())) {
113         Bool_t acc = cuts->IsSelected(list);
114         if ((filterMask = cuts->GetFilterMask()) > 0) {
115             acc = (acc && (filterMask & result));
116         }
117         cuts->SetSelected(acc);
118         if (acc) {result |= iCutB & 0x00ffffff;}
119         iCutB *= 2;
120     }  
121
122     return result;
123 }
124
125 void AliAnalysisFilter::Init()
126 {
127     //
128     // Loop over all set of cuts and call Init
129     TIter next(fCuts);
130     AliAnalysisCuts *cuts;
131     while((cuts = (AliAnalysisCuts*)next())) cuts->Init();
132 }
133
134 void AliAnalysisFilter::AddCuts(AliAnalysisCuts* cuts)
135 {
136     // Add a set of cuts
137     fCuts->Add(cuts);
138 }
139
140 Bool_t AliAnalysisFilter::IsSelected(char* name)
141 {
142     //
143     // Returns current result for cut with name
144     AliAnalysisCuts* cut = (AliAnalysisCuts*) (fCuts->FindObject(name));
145     if (cut) {
146       return (cut->Selected());
147     } else  {
148       return 0;
149     }
150 }