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