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("Argument 2 is required.");
110 // AliDebug(AliLog::kDebug,Form("fOperator %d",fOperator));
115 return fArg1->Value(vars) || fArg2->Value(vars);
118 return fArg1->Value(vars) && fArg2->Value(vars);
121 return !(fArg2->Value(vars));
124 // Int_t indexx = fgCutSet->GetIndexByCutName ( fVname.Data() );
125 AliDebug(AliLog::kDebug, Form("Vname %s", fVname.Data()));
126 // return fgCutSet->GetBoolValue ( indexx );
127 return fgCutSet->GetBoolValue(fVname.Atoi());
131 AliError("Illegal operator in expression!");
138 //______________________________________________________________________________
139 TString AliRsnExpression::Unparse() const
141 // Unparse the expression
143 TString opVals[4] = { "", "&", "|", "!" };
144 if (fArg2 == 0 && fVname.IsNull()) {
145 AliError("Expression undefined.");
149 if (fArg2 == 0 && !fVname.IsNull()) return fVname;
151 if (fArg1 == 0 && fArg2) {
152 return opVals[fOperator] + fArg2->Unparse();
154 return "(" + fArg1->Unparse() + " " + opVals[fOperator] + " " + fArg2->Unparse() + ")";
157 //______________________________________________________________________________
158 TObjArray* AliRsnExpression::Tokenize(TString str) const
160 // tokenize the expression
164 for (Int_t i = 0; i < str.Length(); i++) {
165 if (str[i] == ' ') continue;
168 // get variable tokens
169 TObjArray* valtok = str1.Tokenize("!&|()");
170 // put all variables together
171 Int_t nvt = valtok->GetEntriesFast();
173 for (Int_t i = 0; i < nvt; i++) {
174 TObjString* val = (TObjString*) valtok->At(i);
175 sumval.Append(val->String());
177 // get the operator tokens
178 TObjArray* optok = str1.Tokenize(sumval.Data());
179 // put all operator in one string
181 Int_t nopt = optok->GetEntriesFast();
182 for (Int_t i = 0; i < nopt; i++) {
183 TObjString* val1 = (TObjString*) optok->At(i);
184 operators.Append(val1->String());
186 // add more room to be safe
187 TObjString* blank = new TObjString(" ");
188 operators.Append(" ");
189 valtok->AddLast(blank);
190 // Now put var. and oper. together
191 TObjArray* tokens = new TObjArray(valtok->GetEntriesFast() + operators.Length());
195 TString so = operators[io];
196 int indexO = str1.Index(so, index);
197 TString val2 = ((TObjString*) valtok->At(iv))->String();
198 int indexV = str1.Index(val2, index);
199 if ((indexO < indexV || indexV < 0) && indexO >= 0) {
200 tokens->AddLast(new TObjString(so));
201 index += so.Length();
204 if ((indexV < indexO || indexO < 0) && indexV >= 0) {
205 tokens->AddLast(new TObjString(val2));
206 index += val2.Length();
209 if (index >= str1.Length()) break;
212 // // Debug -> Print the tokens
213 // Int_t nt = tokens->GetEntriesFast();
214 // for ( Int_t i=0; i<nt; i++ )
216 // TObjString* val3 = ( TObjString* ) tokens->At ( i );
217 // AliInfo ( Form ( "%d %s",i,val3->String().Data() ) );
228 //______________________________________________________________________________
229 AliRsnExpression* AliRsnExpression::Element(TObjArray &st, Int_t &i)
233 AliRsnExpression* result = 0;
235 Int_t nt = st.GetEntriesFast();
241 valt = (TObjString*) st.At(i);
242 token = valt->String();
245 char ttok = (token[0] != '|' && token[0] != '&' &&
246 token[0] != '!' && token[0] != '(' && token[0] != ')') ? 'w' : token[0];
249 result = new AliRsnVariableExpression(token);
253 result = Expression(st, i);
257 valt = (TObjString*) st.At(i);
258 token = valt->String();
260 if (token[0] != ')') {
262 AliErrorGeneral("AliRsnExpression::Element", "Mismatched parenthesis.");
264 result = new AliRsnExpression;
269 AliErrorGeneral("AliRsnExpression::Element", Form("Unexpected symbol on input. %s", token.Data()));
270 //if (result) delete result;
271 result = new AliRsnExpression;
276 //______________________________________________________________________________
277 AliRsnExpression* AliRsnExpression::Primary(TObjArray &st, Int_t &i)
281 Int_t nt = st.GetEntriesFast();
287 valt = (TObjString*) st.At(i);
288 token = valt->String();
293 return new AliRsnExpression(kOpNOT, Primary(st, i));
296 return Element(st, i);
300 //______________________________________________________________________________
301 AliRsnExpression* AliRsnExpression::Expression(TObjArray &st, Int_t &i)
303 // create an expression
305 AliRsnExpression* result = 0;
306 Bool_t done = kFALSE;
310 static int stack = 0;
312 Int_t nt = st.GetEntriesFast();
314 result = Primary(st, i);
315 // cout <<"i "<<i<< "Primary " << result->Unparse() << endl;
320 valt = (TObjString*) st.At(i);
321 token = valt->String();
324 result = new AliRsnExpression(kOpAND, result, Primary(st, i));
325 // cout <<"i "<<i<< " Expression AND " << result->Unparse() << endl;
328 result = new AliRsnExpression(kOpOR, result, Primary(st, i));
329 // cout <<"i "<<i<< " Expression OR " << result->Unparse() << endl;
338 if (stack == 0 && !token.IsNull() && token[0] == ')') {
339 AliErrorGeneral("AliRsnExpression::Expression", "To many closing parenthesis.");
341 result = new AliRsnExpression;
342 } else if (stack == 0 && i < nt - 1) {
343 AliErrorGeneral("AliRsnExpression::Expression", Form("Unexpected symbol on input. %s", token.Data()));
345 result = new AliRsnExpression;