]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG2/RESONANCES/AliRsnExpression.cxx
bugfix in AliRsnValue and some macros for running multiplicity-dependent analysis
[u/mrichter/AliRoot.git] / PWG2 / RESONANCES / AliRsnExpression.cxx
1 //
2 // AliRsnExpresion class is used to
3 // handle operators &|!
4 // in AliRsnCut
5 //
6 // authors: Martin Vala (martin.vala@cern.ch)
7 //          Alberto Pulvirenti (alberto.pulvirenti@ct.infn.it)
8 //
9
10 #include <TString.h>
11 #include <TObjString.h>
12 #include <TObjArray.h>
13
14 #include "AliLog.h"
15
16 #include "AliRsnVariableExpression.h"
17 #include "AliRsnExpression.h"
18
19 ClassImp(AliRsnExpression)
20
21 AliRsnCutSet *AliRsnExpression::fgCutSet = 0;
22
23 //______________________________________________________________________________
24 AliRsnExpression::AliRsnExpression(TString exp) :
25     TObject(),
26     fVname(""),
27     fArg1(0x0),
28     fArg2(0x0),
29     fOperator(0)
30 {
31   // Default constructor
32   TObjArray* tokens = Tokenize(exp);
33
34   Int_t i = -1;
35   AliRsnExpression* e = Expression(*tokens, i);
36   // Copy !!!
37   fArg1 = e->fArg1; e->fArg1 = 0;
38   fArg2 = e->fArg2; e->fArg2 = 0;
39   fOperator = e->fOperator;
40   fVname = e->fVname;
41   delete e;
42   delete tokens;
43 }
44
45 //______________________________________________________________________________
46 AliRsnExpression::~AliRsnExpression()
47 {
48   if (fArg1) delete fArg1;
49   if (fArg2) delete fArg2;
50 }
51
52 AliRsnExpression::AliRsnExpression(const AliRsnExpression & exp) : TObject(exp),
53     fVname(exp.fVname),
54     fArg1(exp.fArg1),
55     fArg2(exp.fArg2),
56     fOperator(exp.fOperator)
57 {}
58
59 //______________________________________________________________________________
60 AliRsnExpression& AliRsnExpression::operator= (const AliRsnExpression& e)
61 {
62   // AliRsnExpression assignment operator.
63
64   if (this != &e) {
65     TObject::operator= (e);
66     fArg1 = e.fArg1;
67     fArg2 = e.fArg2;
68     fOperator = e.fOperator;
69     fVname = e.fVname;
70   }
71   return *this;
72 }
73
74 //______________________________________________________________________________
75 AliRsnExpression::AliRsnExpression(int op, AliRsnExpression* a, AliRsnExpression* b) :
76     TObject(),
77     fVname(""),
78     fArg1(a),
79     fArg2(b),
80     fOperator(op)
81 {
82   // Create a new expression
83 }
84
85 //______________________________________________________________________________
86 AliRsnExpression::AliRsnExpression(int op, AliRsnExpression* a) :
87     TObject(),
88     fVname(""),
89     fArg1(0),
90     fArg2(a),
91     fOperator(op)
92 {
93   // Create a unary expression.
94 }
95
96 //______________________________________________________________________________
97 Bool_t AliRsnExpression::Value(TObjArray &vars)
98 {
99   //  Evaluate the expression
100   if (fArg2 == 0 && fVname.IsNull()) {
101     AliError("Expression undefined.");
102     return kFALSE;
103   }
104
105 //   AliDebug(AliLog::kDebug,Form("fOperator %d",fOperator));
106
107   switch (fOperator) {
108
109   case kOpOR :
110     return fArg1->Value(vars) || fArg2->Value(vars);
111
112   case kOpAND :
113     return fArg1->Value(vars) && fArg2->Value(vars);
114
115   case kOpNOT :
116     return !(fArg2->Value(vars));
117
118   case 0 : {
119 //       Int_t indexx = fgCutSet->GetIndexByCutName ( fVname.Data() );
120       AliDebug(AliLog::kDebug,Form("Vname %s",fVname.Data()));
121 //       return fgCutSet->GetBoolValue ( indexx );
122       return fgCutSet->GetBoolValue(fVname.Atoi());
123     }
124
125   default:
126     AliError("Illegal operator in expression!");
127
128   }
129   return kFALSE;
130 }
131
132
133 //______________________________________________________________________________
134 TString AliRsnExpression::Unparse() const
135 {
136   // Unparse the expression
137
138   TString opVals[4] = { "", "&", "|","!" };
139   if (fArg2 == 0 && fVname.IsNull()) {
140     AliError("Expression undefined.");
141     return "Error";
142   }
143
144   if (fArg2 == 0 && !fVname.IsNull()) return fVname;
145
146   if (fArg1 == 0 && fArg2) {
147     return opVals[fOperator]+fArg2->Unparse();
148   }
149   return "("+fArg1->Unparse() +" "+opVals[fOperator]+" "+fArg2->Unparse() +")";
150 }
151
152 //______________________________________________________________________________
153 TObjArray* AliRsnExpression::Tokenize(TString str) const
154 {
155   // tokenize the expression
156
157   // Remove spaces
158   TString str1;
159   for (Int_t i=0; i<str.Length(); i++) {
160     if (str[i] == ' ') continue;
161     str1.Append(str[i]);
162   }
163   // get variable tokens
164   TObjArray* valtok = str1.Tokenize("!&|()");
165   // put all variables together
166   Int_t nvt = valtok->GetEntriesFast();
167   TString sumval;
168   for (Int_t i=0; i<nvt; i++) {
169     TObjString* val = (TObjString*) valtok->At(i);
170     sumval.Append(val->String());
171   }
172   // get the operator tokens
173   TObjArray* optok = str1.Tokenize(sumval.Data());
174   // put all operator in one string
175   TString operators;
176   Int_t nopt = optok->GetEntriesFast();
177   for (Int_t i=0; i<nopt; i++) {
178     TObjString* val1 = (TObjString*) optok->At(i);
179     operators.Append(val1->String());
180   }
181   // add more room to be safe
182   TObjString* blank = new TObjString(" ");
183   operators.Append(" ");
184   valtok->AddLast(blank);
185   // Now put var. and oper. together
186   TObjArray* tokens = new TObjArray(valtok->GetEntriesFast() + operators.Length());
187   int io = 0,iv = 0;
188   int index = 0;
189   while (1) {
190     TString so = operators[io];
191     int indexO = str1.Index(so, index);
192     TString val2 = ((TObjString*) valtok->At(iv))->String();
193     int indexV = str1.Index(val2, index);
194     if ((indexO < indexV || indexV < 0) && indexO >=0) {
195       tokens->AddLast(new TObjString(so));
196       index += so.Length();
197       io++;
198     }
199     if ((indexV < indexO || indexO < 0) && indexV >=0) {
200       tokens->AddLast(new TObjString(val2));
201       index += val2.Length();
202       iv++;
203     }
204     if (index >= str1.Length()) break;
205   }
206
207 // //  Debug -> Print the tokens
208 //   Int_t nt = tokens->GetEntriesFast();
209 //   for ( Int_t i=0; i<nt; i++ )
210 //   {
211 //     TObjString* val3 = ( TObjString* ) tokens->At ( i );
212 //     AliInfo ( Form ( "%d %s",i,val3->String().Data() ) );
213 //   }
214 //
215 //
216   delete valtok;
217   delete optok;
218
219   return tokens;
220 }
221
222
223 //______________________________________________________________________________
224 AliRsnExpression* AliRsnExpression::Element(TObjArray &st, Int_t &i)
225 {
226   // create an element
227
228   AliRsnExpression* result = 0;
229
230   Int_t nt = st.GetEntriesFast();
231   TString token = "@";
232   TObjString* valt;
233   // next token
234   if (i < nt-1) {
235     i++;
236     valt = (TObjString*) st.At(i);
237     token = valt->String();
238   }
239   // token type
240   char ttok = (token[0]!='|' && token[0]!='&' &&
241                token[0]!='!' && token[0]!='('&& token[0]!=')') ? 'w' : token[0];
242   switch (ttok) {
243   case 'w' : {
244       result = new AliRsnVariableExpression(token);
245       break;
246     }
247   case '(' :
248     result = Expression(st, i);
249     // next token
250     if (i < nt-1) {
251       i++;
252       valt = (TObjString*) st.At(i);
253       token = valt->String();
254     }
255     if (token[0] != ')') {
256       //       i--; // push back
257       AliErrorGeneral("AliRsnExpression::Element", "Mismatched parenthesis.");
258       delete result;
259       result = new AliRsnExpression;
260     }
261     break;
262   default:
263     i--; // push back
264     AliErrorGeneral("AliRsnExpression::Element", Form("Unexpected symbol on input. %s", token.Data()));
265     if (result) delete result;
266     result = new AliRsnExpression;
267   }
268   return result;
269 }
270
271 //______________________________________________________________________________
272 AliRsnExpression* AliRsnExpression::Primary(TObjArray &st, Int_t &i)
273 {
274   // create a primary
275
276   Int_t nt = st.GetEntriesFast();
277   TString token = "@";
278   TObjString* valt;
279   // next token
280   if (i < nt-1) {
281     i++;
282     valt = (TObjString*) st.At(i);
283     token = valt->String();
284   }
285
286   switch (token[0]) {
287   case '!' :
288     return new AliRsnExpression(kOpNOT, Primary(st, i));
289   default:
290     i--; // push back
291     return Element(st, i);
292   }
293 }
294
295 //______________________________________________________________________________
296 AliRsnExpression* AliRsnExpression::Expression(TObjArray &st,Int_t &i)
297 {
298   // create an expression
299
300   AliRsnExpression* result = 0;
301   Bool_t done = kFALSE;
302   TString token;
303   TObjString* valt;
304
305   static int stack = 0;
306   stack++;
307   Int_t nt = st.GetEntriesFast();
308
309   result = Primary(st, i);
310 //   cout <<"i "<<i<< "Primary " << result->Unparse() << endl;
311   while (! done) {
312     // next token
313     if (i < nt-1) i++;
314     else break;
315     valt = (TObjString*) st.At(i);
316     token = valt->String();
317     switch (token[0]) {
318     case '&' :
319       result = new AliRsnExpression(kOpAND, result, Primary(st, i));
320 //   cout <<"i "<<i<< " Expression AND " << result->Unparse() << endl;
321       break;
322     case '|' :
323       result = new AliRsnExpression(kOpOR, result, Primary(st, i));
324 //   cout <<"i "<<i<< " Expression OR " << result->Unparse() << endl;
325       break;
326     default:
327       done = kTRUE;
328       i--; // push back
329       break;
330     }
331   }
332   stack--;
333   if (stack == 0 && !token.IsNull() && token[0] == ')') {
334     AliErrorGeneral("AliRsnExpression::Expression", "To many closing parenthesis.");
335     delete result;
336     result = new AliRsnExpression;
337   } else
338     if (stack == 0 && i< nt-1) {
339       AliErrorGeneral("AliRsnExpression::Expression", Form("Unexpected symbol on input. %s", token.Data()));
340       delete result;
341       result = new AliRsnExpression;
342     }
343   return result;
344 }