3 #include <TObjString.h>
9 #include "AliRsnCutSet.h"
10 #include "AliRsnExpression.h"
12 ClassImp ( AliRsnExpression )
14 AliRsnCutSet *AliRsnExpression::sCutSet = 0;
16 //______________________________________________________________________________
17 AliRsnExpression::AliRsnExpression ( TString exp ) :
24 // Default constructor
25 TObjArray* tokens = Tokenize ( exp );
28 AliRsnExpression* e = Expression ( *tokens, i );
30 fArg1 = e->fArg1; e->fArg1 = 0;
31 fArg2 = e->fArg2; e->fArg2 = 0;
32 fOperator = e->fOperator;
38 //______________________________________________________________________________
39 AliRsnExpression::~AliRsnExpression()
41 if ( fArg1 ) delete fArg1;
42 if ( fArg2 ) delete fArg2;
45 AliRsnExpression::AliRsnExpression ( const AliRsnExpression & exp ) : TObject ( exp ),
46 fVname ( exp.fVname ),
49 fOperator ( exp.fOperator )
52 //______________________________________________________________________________
53 AliRsnExpression& AliRsnExpression::operator= ( const AliRsnExpression& e )
55 // AliRsnExpression assignment operator.
59 TObject::operator= ( e );
62 fOperator = e.fOperator;
68 //______________________________________________________________________________
69 AliRsnExpression::AliRsnExpression ( int op, AliRsnExpression* a, AliRsnExpression* b ) :
76 // Create a new expression
79 //______________________________________________________________________________
80 AliRsnExpression::AliRsnExpression ( int op, AliRsnExpression* a ) :
87 // Create a unary expression.
90 //______________________________________________________________________________
91 Bool_t AliRsnExpression::Value ( TObjArray &vars )
93 // Evaluate the expression
94 if ( fArg2 == 0 && fVname.IsNull() )
96 AliError ( "Expression undefined." );
100 // AliDebug(AliLog::kDebug,Form("fOperator %d",fOperator));
106 return fArg1->Value ( vars ) || fArg2->Value ( vars );
109 return fArg1->Value ( vars ) && fArg2->Value ( vars );
112 return ! ( fArg2->Value ( vars ) );
116 // Int_t indexx = sCutSet->GetIndexByCutName ( fVname.Data() );
117 AliDebug(AliLog::kDebug,Form("Vname %s",fVname.Data()));
118 // return sCutSet->GetBoolValue ( indexx );
119 return sCutSet->GetBoolValue (fVname.Atoi());
123 AliError ( "Illegal operator in expression!" );
130 //______________________________________________________________________________
131 TString AliRsnExpression::Unparse() const
133 // Unparse the expression
135 TString opVals[4] = { "", "&", "|","!" };
136 if ( fArg2 == 0 && fVname.IsNull() )
138 AliError ( "Expression undefined." );
142 if ( fArg2 == 0 && !fVname.IsNull() ) return fVname;
144 if ( fArg1 == 0 && fArg2 )
146 return opVals[fOperator]+fArg2->Unparse();
148 return "("+fArg1->Unparse() +" "+opVals[fOperator]+" "+fArg2->Unparse() +")";
151 //______________________________________________________________________________
152 TObjArray* AliRsnExpression::Tokenize ( TString str ) const
154 // tokenize the expression
158 for ( Int_t i=0; i<str.Length(); i++ )
160 if ( str[i] == ' ' ) continue;
161 str1.Append ( str[i] );
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++ )
170 TObjString* val = ( TObjString* ) valtok->At ( i );
171 sumval.Append ( val->String() );
173 // get the operator tokens
174 TObjArray* optok = str1.Tokenize ( sumval.Data() );
175 // put all operator in one string
177 Int_t nopt = optok->GetEntriesFast();
178 for ( Int_t i=0; i<nopt; i++ )
180 TObjString* val1 = ( TObjString* ) optok->At ( i );
181 operators.Append ( val1->String() );
183 // add more room to be safe
184 TObjString* blank = new TObjString ( " " );
185 operators.Append ( " " );
186 valtok->AddLast ( blank );
187 // Now put var. and oper. together
188 TObjArray* tokens = new TObjArray ( valtok->GetEntriesFast() + operators.Length() );
193 TString so = operators[io];
194 int indexO = str1.Index ( so, index );
195 TString val2 = ( ( TObjString* ) valtok->At ( iv ) )->String();
196 int indexV = str1.Index ( val2, index );
197 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 )
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();
242 valt = ( TObjString* ) st.At ( i );
243 token = valt->String();
246 char ttok = ( token[0]!='|' && token[0]!='&' &&
247 token[0]!='!' && token[0]!='('&& token[0]!=')' ) ? 'w' : token[0];
252 result = new AliRsnVariableExpression ( token );
256 result = Expression ( st, i );
261 valt = ( TObjString* ) st.At ( i );
262 token = valt->String();
264 if ( token[0] != ')' )
267 AliErrorGeneral ( "AliRsnExpression::Element", "Mismatched parenthesis." );
269 result = new AliRsnExpression;
274 AliErrorGeneral ( "AliRsnExpression::Element", Form ( "Unexpected symbol on input. %s", token.Data() ) );
275 if ( result ) delete result;
276 result = new AliRsnExpression;
281 //______________________________________________________________________________
282 AliRsnExpression* AliRsnExpression::Primary ( TObjArray &st, Int_t &i )
286 Int_t nt = st.GetEntriesFast();
293 valt = ( TObjString* ) st.At ( i );
294 token = valt->String();
300 return new AliRsnExpression ( kOpNOT, Primary ( st, i ) );
303 return Element ( st, i );
307 //______________________________________________________________________________
308 AliRsnExpression* AliRsnExpression::Expression ( TObjArray &st,Int_t &i )
310 // create an expression
312 AliRsnExpression* result = 0;
313 Bool_t done = kFALSE;
317 static int stack = 0;
319 Int_t nt = st.GetEntriesFast();
321 result = Primary ( st, i );
322 // cout <<"i "<<i<< "Primary " << result->Unparse() << endl;
328 valt = ( TObjString* ) st.At ( i );
329 token = valt->String();
333 result = new AliRsnExpression ( kOpAND, result, Primary ( st, i ) );
334 // cout <<"i "<<i<< " Expression AND " << result->Unparse() << endl;
337 result = new AliRsnExpression ( kOpOR, result, Primary ( st, i ) );
338 // cout <<"i "<<i<< " Expression OR " << result->Unparse() << endl;
347 if ( stack == 0 && !token.IsNull() && token[0] == ')' )
349 AliErrorGeneral ( "AliRsnExpression::Expression", "To many closing parenthesis." );
351 result = new AliRsnExpression;
354 if ( stack == 0 && i< nt-1 )
356 AliErrorGeneral ( "AliRsnExpression::Expression", Form ( "Unexpected symbol on input. %s", token.Data() ) );
358 result = new AliRsnExpression;
363 ////////////////////////////////////////////////////////////////////////////////
365 ClassImp ( AliRsnVariableExpression )
367 //______________________________________________________________________________
368 Bool_t AliRsnVariableExpression::Value ( TObjArray& /*pgm*/)
371 // Int_t indexx = sCutSet->GetIndexByCutName ( fVname.Data() );
372 AliDebug(AliLog::kDebug,Form("Vname %s",fVname.Data()));
373 // return sCutSet->GetBoolValue ( indexx );
375 return sCutSet->GetBoolValue ( fVname.Atoi() );