2 // AliRsnExpresion class is used to
3 // handle operators &|!
6 // authors: Martin Vala (martin.vala@cern.ch)
7 // Alberto Pulvirenti (alberto.pulvirenti@ct.infn.it)
11 #include <TObjString.h>
12 #include <TObjArray.h>
16 #include "AliRsnVariableExpression.h"
17 #include "AliRsnExpression.h"
19 ClassImp(AliRsnExpression)
21 AliRsnCutSet *AliRsnExpression::fgCutSet = 0;
23 //______________________________________________________________________________
24 AliRsnExpression::AliRsnExpression(TString exp) :
31 // Default constructor
32 TObjArray *tokens = Tokenize(exp);
35 AliRsnExpression *e = Expression(*tokens, i);
37 fArg1 = e->fArg1; e->fArg1 = 0;
38 fArg2 = e->fArg2; e->fArg2 = 0;
39 fOperator = e->fOperator;
45 //______________________________________________________________________________
46 AliRsnExpression::~AliRsnExpression()
48 if (fArg1) delete fArg1;
49 if (fArg2) delete fArg2;
52 AliRsnExpression::AliRsnExpression(const AliRsnExpression &exp) : TObject(exp),
56 fOperator(exp.fOperator)
59 //______________________________________________________________________________
60 AliRsnExpression &AliRsnExpression::operator= (const AliRsnExpression &e)
62 // AliRsnExpression assignment operator.
65 TObject::operator= (e);
68 fOperator = e.fOperator;
74 //______________________________________________________________________________
75 AliRsnExpression::AliRsnExpression(int op, AliRsnExpression *a, AliRsnExpression *b) :
82 // Create a new expression
85 //______________________________________________________________________________
86 AliRsnExpression::AliRsnExpression(int op, AliRsnExpression *a) :
93 // Create a unary expression.
96 //______________________________________________________________________________
97 Bool_t AliRsnExpression::Value(TObjArray &vars)
99 // Evaluate the expression
100 if (fArg2 == 0 && fVname.IsNull()) {
101 AliError("Expression undefined.");
105 // AliError("Needed second parameter");
109 // AliDebug(AliLog::kDebug,Form("fOperator %d",fOperator));
114 return fArg1->Value(vars) || fArg2->Value(vars);
117 return fArg1->Value(vars) && fArg2->Value(vars);
120 return !(fArg2->Value(vars));
123 // Int_t indexx = fgCutSet->GetIndexByCutName ( fVname.Data() );
124 AliDebug(AliLog::kDebug, Form("Vname %s", fVname.Data()));
125 // return fgCutSet->GetBoolValue ( indexx );
126 return fgCutSet->GetBoolValue(fVname.Atoi());
130 AliError("Illegal operator in expression!");
137 //______________________________________________________________________________
138 TString AliRsnExpression::Unparse() const
140 // Unparse the expression
142 TString opVals[4] = { "", "&", "|", "!" };
143 if (fArg2 == 0 && fVname.IsNull()) {
144 AliError("Expression undefined.");
148 if (fArg2 == 0 && !fVname.IsNull()) return fVname;
150 if (fArg1 == 0 && fArg2) {
151 return opVals[fOperator] + fArg2->Unparse();
153 return "(" + fArg1->Unparse() + " " + opVals[fOperator] + " " + fArg2->Unparse() + ")";
156 //______________________________________________________________________________
157 TObjArray *AliRsnExpression::Tokenize(TString str) const
159 // tokenize the expression
163 for (Int_t i = 0; i < str.Length(); i++) {
164 if (str[i] == ' ') continue;
167 // get variable tokens
168 TObjArray *valtok = str1.Tokenize("!&|()");
169 // put all variables together
170 Int_t nvt = valtok->GetEntriesFast();
172 for (Int_t i = 0; i < nvt; i++) {
173 TObjString *val = (TObjString *) valtok->At(i);
174 sumval.Append(val->String());
176 // get the operator tokens
177 TObjArray *optok = str1.Tokenize(sumval.Data());
178 // put all operator in one string
180 Int_t nopt = optok->GetEntriesFast();
181 for (Int_t i = 0; i < nopt; i++) {
182 TObjString *val1 = (TObjString *) optok->At(i);
183 operators.Append(val1->String());
185 // add more room to be safe
186 TObjString *blank = new TObjString(" ");
187 operators.Append(" ");
188 valtok->AddLast(blank);
189 // Now put var. and oper. together
190 TObjArray *tokens = new TObjArray(valtok->GetEntriesFast() + operators.Length());
194 TString so = operators[io];
195 int indexO = str1.Index(so, index);
196 TString val2 = ((TObjString *) valtok->At(iv))->String();
197 int indexV = str1.Index(val2, index);
198 if ((indexO < indexV || indexV < 0) && indexO >= 0) {
199 tokens->AddLast(new TObjString(so));
200 index += so.Length();
203 if ((indexV < indexO || indexO < 0) && indexV >= 0) {
204 tokens->AddLast(new TObjString(val2));
205 index += val2.Length();
208 if (index >= str1.Length()) break;
211 // // Debug -> Print the tokens
212 // Int_t nt = tokens->GetEntriesFast();
213 // for ( Int_t i=0; i<nt; i++ )
215 // TObjString* val3 = ( TObjString* ) tokens->At ( i );
216 // AliInfo ( Form ( "%d %s",i,val3->String().Data() ) );
227 //______________________________________________________________________________
228 AliRsnExpression *AliRsnExpression::Element(TObjArray &st, Int_t &i)
232 AliRsnExpression *result = 0;
234 Int_t nt = st.GetEntriesFast();
240 valt = (TObjString *) st.At(i);
241 token = valt->String();
244 char ttok = (token[0] != '|' && token[0] != '&' &&
245 token[0] != '!' && token[0] != '(' && token[0] != ')') ? 'w' : token[0];
248 result = new AliRsnVariableExpression(token);
252 result = Expression(st, i);
256 valt = (TObjString *) st.At(i);
257 token = valt->String();
259 if (token[0] != ')') {
261 AliErrorGeneral("AliRsnExpression::Element", "Mismatched parenthesis.");
263 result = new AliRsnExpression;
268 AliErrorGeneral("AliRsnExpression::Element", Form("Unexpected symbol on input. %s", token.Data()));
269 //if (result) delete result;
270 result = new AliRsnExpression;
275 //______________________________________________________________________________
276 AliRsnExpression *AliRsnExpression::Primary(TObjArray &st, Int_t &i)
280 Int_t nt = st.GetEntriesFast();
286 valt = (TObjString *) st.At(i);
287 token = valt->String();
292 return new AliRsnExpression(kOpNOT, Primary(st, i));
295 return Element(st, i);
299 //______________________________________________________________________________
300 AliRsnExpression *AliRsnExpression::Expression(TObjArray &st, Int_t &i)
302 // create an expression
304 AliRsnExpression *result = 0;
305 Bool_t done = kFALSE;
309 static int stack = 0;
311 Int_t nt = st.GetEntriesFast();
313 result = Primary(st, i);
314 // cout <<"i "<<i<< "Primary " << result->Unparse() << endl;
319 valt = (TObjString *) st.At(i);
320 token = valt->String();
323 result = new AliRsnExpression(kOpAND, result, Primary(st, i));
324 // cout <<"i "<<i<< " Expression AND " << result->Unparse() << endl;
327 result = new AliRsnExpression(kOpOR, result, Primary(st, i));
328 // cout <<"i "<<i<< " Expression OR " << result->Unparse() << endl;
337 if (stack == 0 && !token.IsNull() && token[0] == ')') {
338 AliErrorGeneral("AliRsnExpression::Expression", "To many closing parenthesis.");
340 result = new AliRsnExpression;
341 } else if (stack == 0 && i < nt - 1) {
342 AliErrorGeneral("AliRsnExpression::Expression", Form("Unexpected symbol on input. %s", token.Data()));
344 result = new AliRsnExpression;