2 // AliRsnExpresion class is used to handle operators &|! in AliRsnCut
4 // authors: Martin Vala (martin.vala@cern.ch)
5 // Alberto Pulvirenti (alberto.pulvirenti@ct.infn.it)
9 #include <TObjString.h>
10 #include <TObjArray.h>
14 #include "AliRsnVariableExpression.h"
15 #include "AliRsnExpression.h"
17 ClassImp(AliRsnExpression)
19 AliRsnCutSet *AliRsnExpression::fgCutSet = 0;
21 //______________________________________________________________________________
22 AliRsnExpression::AliRsnExpression(TString exp) :
29 // Default constructor
30 TObjArray* tokens = Tokenize(exp);
33 AliRsnExpression* e = Expression(*tokens, i);
35 fArg1 = e->fArg1; e->fArg1 = 0;
36 fArg2 = e->fArg2; e->fArg2 = 0;
37 fOperator = e->fOperator;
43 //______________________________________________________________________________
44 AliRsnExpression::~AliRsnExpression()
46 if (fArg1) delete fArg1;
47 if (fArg2) delete fArg2;
50 AliRsnExpression::AliRsnExpression(const AliRsnExpression & exp) : TObject(exp),
54 fOperator(exp.fOperator)
57 //______________________________________________________________________________
58 AliRsnExpression& AliRsnExpression::operator= (const AliRsnExpression& e)
60 // AliRsnExpression assignment operator.
63 TObject::operator= (e);
66 fOperator = e.fOperator;
72 //______________________________________________________________________________
73 AliRsnExpression::AliRsnExpression(int op, AliRsnExpression* a, AliRsnExpression* b) :
80 // Create a new expression
83 //______________________________________________________________________________
84 AliRsnExpression::AliRsnExpression(int op, AliRsnExpression* a) :
91 // Create a unary expression.
94 //______________________________________________________________________________
95 Bool_t AliRsnExpression::Value(TObjArray &vars)
97 // Evaluate the expression
98 if (fArg2 == 0 && fVname.IsNull()) {
99 AliError("Expression undefined.");
103 // AliDebug(AliLog::kDebug,Form("fOperator %d",fOperator));
108 return fArg1->Value(vars) || fArg2->Value(vars);
111 return fArg1->Value(vars) && fArg2->Value(vars);
114 return !(fArg2->Value(vars));
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());
124 AliError("Illegal operator in expression!");
131 //______________________________________________________________________________
132 TString AliRsnExpression::Unparse() const
134 // Unparse the expression
136 TString opVals[4] = { "", "&", "|","!" };
137 if (fArg2 == 0 && fVname.IsNull()) {
138 AliError("Expression undefined.");
142 if (fArg2 == 0 && !fVname.IsNull()) return fVname;
144 if (fArg1 == 0 && fArg2) {
145 return opVals[fOperator]+fArg2->Unparse();
147 return "("+fArg1->Unparse() +" "+opVals[fOperator]+" "+fArg2->Unparse() +")";
150 //______________________________________________________________________________
151 TObjArray* AliRsnExpression::Tokenize(TString str) const
153 // tokenize the expression
157 for (Int_t i=0; i<str.Length(); i++) {
158 if (str[i] == ' ') continue;
161 // get variable tokens
162 TObjArray* valtok = str1.Tokenize("!&|()");
163 // put all variables together
164 Int_t nvt = valtok->GetEntriesFast();
166 for (Int_t i=0; i<nvt; i++) {
167 TObjString* val = (TObjString*) valtok->At(i);
168 sumval.Append(val->String());
170 // get the operator tokens
171 TObjArray* optok = str1.Tokenize(sumval.Data());
172 // put all operator in one string
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());
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());
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();
197 if ((indexV < indexO || indexO < 0) && indexV >=0) {
198 tokens->AddLast(new TObjString(val2));
199 index += val2.Length();
202 if (index >= str1.Length()) break;
205 // // Debug -> Print the tokens
206 // Int_t nt = tokens->GetEntriesFast();
207 // for ( Int_t i=0; i<nt; i++ )
209 // TObjString* val3 = ( TObjString* ) tokens->At ( i );
210 // AliInfo ( Form ( "%d %s",i,val3->String().Data() ) );
221 //______________________________________________________________________________
222 AliRsnExpression* AliRsnExpression::Element(TObjArray &st, Int_t &i)
226 AliRsnExpression* result = 0;
228 Int_t nt = st.GetEntriesFast();
234 valt = (TObjString*) st.At(i);
235 token = valt->String();
238 char ttok = (token[0]!='|' && token[0]!='&' &&
239 token[0]!='!' && token[0]!='('&& token[0]!=')') ? 'w' : token[0];
242 result = new AliRsnVariableExpression(token);
246 result = Expression(st, i);
250 valt = (TObjString*) st.At(i);
251 token = valt->String();
253 if (token[0] != ')') {
255 AliErrorGeneral("AliRsnExpression::Element", "Mismatched parenthesis.");
257 result = new AliRsnExpression;
262 AliErrorGeneral("AliRsnExpression::Element", Form("Unexpected symbol on input. %s", token.Data()));
263 if (result) delete result;
264 result = new AliRsnExpression;
269 //______________________________________________________________________________
270 AliRsnExpression* AliRsnExpression::Primary(TObjArray &st, Int_t &i)
274 Int_t nt = st.GetEntriesFast();
280 valt = (TObjString*) st.At(i);
281 token = valt->String();
286 return new AliRsnExpression(kOpNOT, Primary(st, i));
289 return Element(st, i);
293 //______________________________________________________________________________
294 AliRsnExpression* AliRsnExpression::Expression(TObjArray &st,Int_t &i)
296 // create an expression
298 AliRsnExpression* result = 0;
299 Bool_t done = kFALSE;
303 static int stack = 0;
305 Int_t nt = st.GetEntriesFast();
307 result = Primary(st, i);
308 // cout <<"i "<<i<< "Primary " << result->Unparse() << endl;
313 valt = (TObjString*) st.At(i);
314 token = valt->String();
317 result = new AliRsnExpression(kOpAND, result, Primary(st, i));
318 // cout <<"i "<<i<< " Expression AND " << result->Unparse() << endl;
321 result = new AliRsnExpression(kOpOR, result, Primary(st, i));
322 // cout <<"i "<<i<< " Expression OR " << result->Unparse() << endl;
331 if (stack == 0 && !token.IsNull() && token[0] == ')') {
332 AliErrorGeneral("AliRsnExpression::Expression", "To many closing parenthesis.");
334 result = new AliRsnExpression;
336 if (stack == 0 && i< nt-1) {
337 AliErrorGeneral("AliRsnExpression::Expression", Form("Unexpected symbol on input. %s", token.Data()));
339 result = new AliRsnExpression;