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 // AliDebug(AliLog::kDebug,Form("fOperator %d",fOperator));
110 return fArg1->Value(vars) || fArg2->Value(vars);
113 return fArg1->Value(vars) && fArg2->Value(vars);
116 return !(fArg2->Value(vars));
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());
126 AliError("Illegal operator in expression!");
133 //______________________________________________________________________________
134 TString AliRsnExpression::Unparse() const
136 // Unparse the expression
138 TString opVals[4] = { "", "&", "|","!" };
139 if (fArg2 == 0 && fVname.IsNull()) {
140 AliError("Expression undefined.");
144 if (fArg2 == 0 && !fVname.IsNull()) return fVname;
146 if (fArg1 == 0 && fArg2) {
147 return opVals[fOperator]+fArg2->Unparse();
149 return "("+fArg1->Unparse() +" "+opVals[fOperator]+" "+fArg2->Unparse() +")";
152 //______________________________________________________________________________
153 TObjArray* AliRsnExpression::Tokenize(TString str) const
155 // tokenize the expression
159 for (Int_t i=0; i<str.Length(); i++) {
160 if (str[i] == ' ') continue;
163 // get variable tokens
164 TObjArray* valtok = str1.Tokenize("!&|()");
165 // put all variables together
166 Int_t nvt = valtok->GetEntriesFast();
168 for (Int_t i=0; i<nvt; i++) {
169 TObjString* val = (TObjString*) valtok->At(i);
170 sumval.Append(val->String());
172 // get the operator tokens
173 TObjArray* optok = str1.Tokenize(sumval.Data());
174 // put all operator in one string
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());
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());
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();
199 if ((indexV < indexO || indexO < 0) && indexV >=0) {
200 tokens->AddLast(new TObjString(val2));
201 index += val2.Length();
204 if (index >= str1.Length()) break;
207 // // Debug -> Print the tokens
208 // Int_t nt = tokens->GetEntriesFast();
209 // for ( Int_t i=0; i<nt; i++ )
211 // TObjString* val3 = ( TObjString* ) tokens->At ( i );
212 // AliInfo ( Form ( "%d %s",i,val3->String().Data() ) );
223 //______________________________________________________________________________
224 AliRsnExpression* AliRsnExpression::Element(TObjArray &st, Int_t &i)
228 AliRsnExpression* result = 0;
230 Int_t nt = st.GetEntriesFast();
236 valt = (TObjString*) st.At(i);
237 token = valt->String();
240 char ttok = (token[0]!='|' && token[0]!='&' &&
241 token[0]!='!' && token[0]!='('&& token[0]!=')') ? 'w' : token[0];
244 result = new AliRsnVariableExpression(token);
248 result = Expression(st, i);
252 valt = (TObjString*) st.At(i);
253 token = valt->String();
255 if (token[0] != ')') {
257 AliErrorGeneral("AliRsnExpression::Element", "Mismatched parenthesis.");
259 result = new AliRsnExpression;
264 AliErrorGeneral("AliRsnExpression::Element", Form("Unexpected symbol on input. %s", token.Data()));
265 if (result) delete result;
266 result = new AliRsnExpression;
271 //______________________________________________________________________________
272 AliRsnExpression* AliRsnExpression::Primary(TObjArray &st, Int_t &i)
276 Int_t nt = st.GetEntriesFast();
282 valt = (TObjString*) st.At(i);
283 token = valt->String();
288 return new AliRsnExpression(kOpNOT, Primary(st, i));
291 return Element(st, i);
295 //______________________________________________________________________________
296 AliRsnExpression* AliRsnExpression::Expression(TObjArray &st,Int_t &i)
298 // create an expression
300 AliRsnExpression* result = 0;
301 Bool_t done = kFALSE;
305 static int stack = 0;
307 Int_t nt = st.GetEntriesFast();
309 result = Primary(st, i);
310 // cout <<"i "<<i<< "Primary " << result->Unparse() << endl;
315 valt = (TObjString*) st.At(i);
316 token = valt->String();
319 result = new AliRsnExpression(kOpAND, result, Primary(st, i));
320 // cout <<"i "<<i<< " Expression AND " << result->Unparse() << endl;
323 result = new AliRsnExpression(kOpOR, result, Primary(st, i));
324 // cout <<"i "<<i<< " Expression OR " << result->Unparse() << endl;
333 if (stack == 0 && !token.IsNull() && token[0] == ')') {
334 AliErrorGeneral("AliRsnExpression::Expression", "To many closing parenthesis.");
336 result = new AliRsnExpression;
338 if (stack == 0 && i< nt-1) {
339 AliErrorGeneral("AliRsnExpression::Expression", Form("Unexpected symbol on input. %s", token.Data()));
341 result = new AliRsnExpression;