Index: trunk/MagicSoft/Mars/mdata/MDataChain.cc
===================================================================
--- trunk/MagicSoft/Mars/mdata/MDataChain.cc	(revision 1348)
+++ trunk/MagicSoft/Mars/mdata/MDataChain.cc	(revision 1353)
@@ -163,5 +163,5 @@
     int l = txt.Length();
     for (int i = 0; i<l; i++)
-        if (!isalnum(txt[i]) && txt[i]!='.')
+        if (!isalnum(txt[i]) && txt[i]!='.' && txt[i]!='-')
             return i;
 
@@ -208,4 +208,6 @@
     if (txt=="exp")   return kEExp;
     if (txt=="pow10") return kEPow10;
+    if (txt=="sgn")   return kESgn;
+    if (txt[0]=='-')  return kENegative;
 
     return kENoop;
@@ -276,5 +278,5 @@
             {
                 //
-                // Check for the type of the conditional
+                // Check for the type of the symbol
                 //
                 char is = txt[0];
@@ -283,6 +285,6 @@
                 //
                 // If no filter is available or the available filter
-                // is of a different conditional we have to create a new
-                // filter list with the new conditional
+                // is of a different symbols we have to create a new
+                // data list with the new symbol
                 //
                 if (/*!member0->InheritsFrom(MDataMember::Class()) ||*/ type!=is)
@@ -301,8 +303,14 @@
             }
 
-            *fLog << err << dbginf << "Syntax Error: First argument of condition missing." << endl;
-            if (member0)
-                delete member0;
-            return NULL;
+            if (txt[0]!='-' && txt[0]!='+')
+            {
+                *fLog << err << dbginf << "Syntax Error: First argument of symbol '";
+                *fLog << txt[0] << "' missing." << endl;
+                if (member0)
+                    delete member0;
+                return NULL;
+            }
+
+            // FALLTHROU
 
         case '0':
@@ -316,4 +324,5 @@
         case '8':
         case '9':
+            if (txt[0]!='-' || isdigit(txt[1]) || txt[1]=='.')
             {
                 char *end;
@@ -330,6 +339,8 @@
 
                 newmember = new MDataValue(num);
-            }
-            break;
+                break;
+            }
+
+            // FALLTHROUH
 
         default:
@@ -365,5 +376,5 @@
 
             Int_t first = GetBracket(txt);
-            TString sub = txt(1, first-1);
+            TString sub = op==kENegative ? text.Remove(0,1) + txt : txt(1, first-1);
             txt.Remove(0, first+1);
 
@@ -407,20 +418,22 @@
     switch (fOperatorType)
     {
-    case kEAbs:   return fabs(val);
-    case kELog:   return log(val);
-    case kELog10: return log10(val);
-    case kESin:   return sin(val);
-    case kECos:   return cos(val);
-    case kETan:   return tan(val);
-    case kESinH:  return sinh(val);
-    case kECosH:  return cosh(val);
-    case kETanH:  return tanh(val);
-    case kEASin:  return asin(val);
-    case kEACos:  return acos(val);
-    case kEATan:  return atan(val);
-    case kESqrt:  return sqrt(val);
-    case kEExp:   return exp(val);
-    case kEPow10: return pow(10, val);
-    case kENoop:  return val;
+    case kEAbs:      return fabs(val);
+    case kELog:      return log(val);
+    case kELog10:    return log10(val);
+    case kESin:      return sin(val);
+    case kECos:      return cos(val);
+    case kETan:      return tan(val);
+    case kESinH:     return sinh(val);
+    case kECosH:     return cosh(val);
+    case kETanH:     return tanh(val);
+    case kEASin:     return asin(val);
+    case kEACos:     return acos(val);
+    case kEATan:     return atan(val);
+    case kESqrt:     return sqrt(val);
+    case kEExp:      return exp(val);
+    case kEPow10:    return pow(10, val);
+    case kESgn:      return val<0 ? -1 : 1;
+    case kENegative: return -val;
+    case kENoop:     return val;
     }
 
@@ -436,19 +449,21 @@
     switch (fOperatorType)
     {
-    case kEAbs:   *fLog << "abs"   << flush; break;
-    case kELog:   *fLog << "log"   << flush; break;
-    case kELog10: *fLog << "log10" << flush; break;
-    case kESin:   *fLog << "sin"   << flush; break;
-    case kECos:   *fLog << "cos"   << flush; break;
-    case kETan:   *fLog << "tan"   << flush; break;
-    case kESinH:  *fLog << "sinh"  << flush; break;
-    case kECosH:  *fLog << "cosh"  << flush; break;
-    case kETanH:  *fLog << "tanh"  << flush; break;
-    case kEASin:  *fLog << "asin"  << flush; break;
-    case kEACos:  *fLog << "acos"  << flush; break;
-    case kEATan:  *fLog << "atan"  << flush; break;
-    case kESqrt:  *fLog << "sqrt"  << flush; break;
-    case kEExp:   *fLog << "exp"   << flush; break;
-    case kEPow10: *fLog << "pow10" << flush; break;
+    case kEAbs:      *fLog << "abs"   << flush; break;
+    case kELog:      *fLog << "log"   << flush; break;
+    case kELog10:    *fLog << "log10" << flush; break;
+    case kESin:      *fLog << "sin"   << flush; break;
+    case kECos:      *fLog << "cos"   << flush; break;
+    case kETan:      *fLog << "tan"   << flush; break;
+    case kESinH:     *fLog << "sinh"  << flush; break;
+    case kECosH:     *fLog << "cosh"  << flush; break;
+    case kETanH:     *fLog << "tanh"  << flush; break;
+    case kEASin:     *fLog << "asin"  << flush; break;
+    case kEACos:     *fLog << "acos"  << flush; break;
+    case kEATan:     *fLog << "atan"  << flush; break;
+    case kESqrt:     *fLog << "sqrt"  << flush; break;
+    case kEExp:      *fLog << "exp"   << flush; break;
+    case kEPow10:    *fLog << "pow10" << flush; break;
+    case kESgn:      *fLog << "sgn"   << flush; break;
+    case kENegative: *fLog << "-" << flush; break;
     case kENoop:
         break;
Index: trunk/MagicSoft/Mars/mdata/MDataChain.h
===================================================================
--- trunk/MagicSoft/Mars/mdata/MDataChain.h	(revision 1348)
+++ trunk/MagicSoft/Mars/mdata/MDataChain.h	(revision 1353)
@@ -35,5 +35,7 @@
         kESqrt,
         kEPow10,
-        kEExp
+        kEExp,
+        kESgn,
+        kENegative
     } OperatorType_t;
 
