Changeset 2305 in Sophya


Ignore:
Timestamp:
Jan 8, 2003, 6:18:56 PM (23 years ago)
Author:
ansari
Message:

Correction bug ds PIACmd::SubstituteVar(), ajout commandes line2vec line2nt vec2var ... - Reza 08/01/2003

Location:
trunk/SophyaPI/PIext
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/SophyaPI/PIext/basexecut.cc

    r2296 r2305  
    1414#include "nobjmgr.h"
    1515#include "servnobjm.h"
     16#include "nomgadapter.h"
    1617#include "piyfxdrw.h"
    1718
     
    528529    }
    529530  }
    530 
     531// ----- Vecteur/NTuple <> Lignes/variables interpreteur
     532// Creation de vecteur depuis le contenu de la ligne
     533else if (kw == "line2vec") { 
     534  if (tokens.size() < 2) {
     535    cout << "Usage: line2vec vecname v0 v1 v2 ... " << endl; return(0);
     536    }
     537  int vsz = tokens.size()-1;
     538  Vector* v = new Vector(vsz);
     539  for(int kkv=0; kkv<vsz; kkv++)  (*v)(kkv) = atof(tokens[kkv+1].c_str());
     540  mObjMgr->AddObj(v, tokens[0]);
     541  }
     542// Remplissage de NTuple depuis la ligne
     543else if (kw == "line2nt") {
     544  if (tokens.size() < 2) {
     545    cout << "Usage: line2nt ntname col0 col1 ..." << endl; return(0);
     546  }
     547  AnyDataObj* obj;
     548  obj = mObjMgr->GetObj(tokens[0]);
     549  if(obj == NULL) {
     550    cerr << "line2nt Error , No such object " << tokens[0] << endl;
     551    return(0);
     552  }
     553  NTuple* nt = dynamic_cast<NTuple *>(obj);
     554  if(nt == NULL) {
     555    cerr << "line2nt Error " << tokens[0] << " not an NTuple ! " << endl;
     556    return(0);
     557  }
     558  if (nt->NbColumns() < 1) {
     559    cerr << "line2nt Error: NbColumns  < 1" << endl;
     560    return(0);
     561  }
     562  r_4* xnt = new r_4[ nt->NbColumns() ];
     563  int kkx;
     564  for(kkx=0; kkx<nt->NbColumns(); kkx++) {
     565    if (kkx < tokens.size()-1)  xnt[kkx] = atof(tokens[kkx+1].c_str());
     566    else xnt[kkx] = 0.;
     567  }
     568  nt->Fill(xnt);
     569  delete[] xnt;
     570
     571// Contenu du vecteur vers variable interpreteur
     572#define MAXNWORDSO2V 32768
     573else if (kw == "vec2var") { 
     574  if (tokens.size() < 2) {
     575    cout << "Usage: vec2var vecname varname [loop_param start:end:step] " << endl; return(0);
     576    }
     577  AnyDataObj* obj;
     578  obj = mObjMgr->GetObj(tokens[0]);
     579  if(obj == NULL) {
     580    cerr << "vec2var Error , No such object " << tokens[0] << endl;
     581    return(0);
     582  }
     583  Vector* v = dynamic_cast<Vector *>(obj);
     584  if(v == NULL) {
     585    cerr << "vec2var Error " << tokens[0] << " not a Vector ! " << endl;
     586    return(0);
     587  }
     588  int kks = 0;
     589  int kke = v->NElts();
     590  int kkp = 1;
     591  if (tokens.size() > 2) Services2NObjMgr::DecodeLoopParameters(tokens[2], kks, kke, kkp);
     592  if (kks < 0)  kks = 0;
     593  if (kke > v->NElts()) kke = v->NElts();
     594  if (kkp < 1) kkp = 1;
     595  int nelt = (kke-kks-1)/kkp;
     596  if (nelt > MAXNWORDSO2V) {
     597    nelt = MAXNWORDSO2V;
     598    cout << "vec2var Warning:  Only " << nelt
     599         << " elements  will be converted to string" << endl;
     600    kke = kks+nelt*kkp;
     601  }
     602  string v2str;
     603  char buff[64];
     604  for(int kkv=kks; kkv<kke; kkv+=kkp) {
     605    sprintf(buff, "%lg ", (*v)(kkv));
     606    v2str += buff;
     607  }
     608 
     609  mObjMgr->SetVar(tokens[1], v2str);
     610}
     611// Une ligne du NTuple/NTupleInterface -> variable interpreteur
     612else if ((kw == "ntline2var") || (kw == "ntcol2var")) { 
     613  if (tokens.size() < 3) {
     614    cout << "Usage: ntline/col2var objname line_number varname" << endl;
     615    return(0);
     616  }
     617  NObjMgrAdapter* oa = mObjMgr->GetObjAdapter(tokens[0]);
     618  if(oa == NULL) {
     619    cerr << "ntline/col2var Error , No such object " << tokens[0] << endl;
     620    return(0);
     621  }
     622  bool adel = false;
     623  NTupleInterface* nti = oa->GetNTupleInterface(adel);
     624  if(nti == NULL) {
     625    cerr << "ntline/col2var Error: objet" << tokens[0] << " has no NTupleInterface" << endl;
     626    return(0);
     627  }
     628
     629  if (nti->NbColumns() < 1 || nti->NbLines() < 1) {
     630    cerr << "ntline/col2var Error: NbColumns or NbLines < 1" << endl;
     631    return(0);
     632  }
     633  string v2str;
     634  char buff[64];
     635  if (kw == "ntline2var") {
     636    int numline = atoi(tokens[1].c_str());
     637    if ( (numline >= nti->NbLines()) || (numline < 0) )  {
     638      cerr << "ntline2var Error: numline" << tokens[1] << " out of bounds" << endl;
     639      return(0);
     640    }
     641    r_8* dline = nti->GetLineD(numline);
     642    for(int kkv=0; kkv<nti->NbColumns(); kkv++) {
     643      sprintf(buff, "%lg ", dline[kkv]);
     644      v2str += buff;
     645    }
     646  }
     647  else {
     648    int numcol = atoi(tokens[1].c_str());
     649    if ( (numcol >= nti->NbColumns()) || (numcol < 0) )  {
     650      cerr << "ntcol2var Error: numcol" << tokens[1] << " out of bounds" << endl;
     651      return(0);
     652    }
     653    int kks = 0;
     654    int kke = nti->NbLines();
     655    int kkp = 1;
     656    if (tokens.size() > 3) Services2NObjMgr::DecodeLoopParameters(tokens[3], kks, kke, kkp);
     657    if (kks < 0)  kks = 0;
     658    if (kke > nti->NbLines()) kke = nti->NbLines();
     659    if (kkp < 1) kkp = 1;
     660    int nelt = (kke-kks-1)/kkp;
     661    if (nelt > MAXNWORDSO2V) {
     662      nelt = MAXNWORDSO2V;
     663      cout << "ntcol2var Warning: Only " << nelt
     664           << " lines " << " will be converted to string" << endl;
     665      kke = kks+nelt*kkp;
     666    }
     667    r_8* dline;
     668    for(int kkl=kks; kkl<kke; kkl+=kkp) {
     669      dline = nti->GetLineD(kkl);
     670      sprintf(buff, "%lg ", dline[numcol]);
     671      v2str += buff;
     672    }
     673  }
     674  mObjMgr->SetVar(tokens[2], v2str);
     675  if (adel) delete nti;
     676}
     677
     678// -------------------------------------------------------
    531679// Copie d'objets
    532680else if ( (kw == "copy") || (kw == "cp") ) {
     
    13781526kw = "newvec";
    13791527usage = "Creates (and optionaly fills) a vector \n Usage: newvec name size [f(i) [dopt] ] ";
    1380 usage += "\n  Related commands: newmtx"; 
     1528usage += "\n  Related commands: newmtx line2vec"; 
    13811529mpiac->RegisterCommand(kw, usage, this, "Objects");
    13821530kw = "newmtx";
     
    13841532usage +="  Usage: newmtx name sizeX(Col) sizeY(Lines) [f(i,j) [dopt] ] ";
    13851533usage += "\n  Related commands: newvec"; 
     1534mpiac->RegisterCommand(kw, usage, this, "Objects");
     1535kw = "line2vec";
     1536usage = "Creates a vector from the line \n";
     1537usage += "  Usage: line2vec vecname v0 v1 v2 ... \n";
     1538usage += "  Related commands: newvec line2nt"; 
     1539mpiac->RegisterCommand(kw, usage, this, "Objects");
     1540kw = "line2nt";
     1541usage = "Fills (append) an NTuple from the line content \n";
     1542usage += "  Usage: line2nt ntname col0 col1 ... \n";
     1543usage += "  Related commands: newnt line2vec ntline2var ntcol2var"; 
     1544mpiac->RegisterCommand(kw, usage, this, "Objects");
     1545kw = "vec2var";
     1546usage = "Vector content to an interpreter variable varname = 'v0 v1 v2 ...' \n";
     1547usage += "  Usage: line2vec vecname varname [LoopParam start:end[:step] ]\n";
     1548usage += "  Related commands: line2vec ntline2var"; 
     1549mpiac->RegisterCommand(kw, usage, this, "Objects");
     1550kw = "ntline2var";
     1551usage = "Object NTupleInterface line to an interpreter variable \n";
     1552usage += "  Usage: ntline2var objname line_number varname \n";
     1553usage += "  Related commands: vec2var ntcol2var"; 
     1554mpiac->RegisterCommand(kw, usage, this, "Objects");
     1555kw = "ntcol2var";
     1556usage = "Object NTupleInterface column to an interpreter variable \n";
     1557usage += "  Usage: ntline2var objname column_number varname [LoopParam start:end[:step] ] \n";
     1558usage += "  Related commands: vec2var ntline2var"; 
    13861559mpiac->RegisterCommand(kw, usage, this, "Objects");
    13871560
  • trunk/SophyaPI/PIext/piacmd.cc

    r2298 r2305  
    417417cmdhgrp["All"] = 0;
    418418cmdgrpid = 1;
    419 cmdhgrp["Commands"] = 1;
     419cmdhgrp["PIACmd"] = 1;
    420420helpwin = new PIAHelpWind(app, this);
    421421helpwin->AddHelpGroup("All", 0);
    422 helpwin->AddHelpGroup("Commands", 1);
    423 
    424 string kw = "piacmd";
     422helpwin->AddHelpGroup("PIACmd", 1);
     423
     424string kw = "Interpreter";
    425425string usage;
    426426usage = ">>> (piacmd) Interpreter's keywords : \n";
     
    430430usage += "  > unset varname          # clear variable definition \n";
    431431usage += "  > rpneval varname RPNExpression # Reverse Polish Notation evaluation \n";
     432usage += "  > varname = 'string string ...' # To set a variable, $varname  \n";
     433usage += "  > varname = RPNExpression # RPN evaluation / result -> varname \n";
    432434usage += "  > echo string            # output string \n";
    433435usage += "  > echo2file filename string # Append the string to the specified file \n";
     
    453455usage += "  > helpwindow           # Displays help window \n";
    454456usage += "  > timingon  timingoff traceon  traceoff \n";
    455 string grp = "Commands";
     457string grp = "PIACmd";
     458RegisterHelp(kw, usage, grp);
     459
     460kw = "RPNEvaluator";
     461usage = " Reverse Polish Notation (HP calculator like) expression evaluation \n";
     462usage += "  >> Stack: \n";
     463usage += "     ... (4) (3) z=(2) y=(1) x=(0)=Stack.Top() \n";
     464usage += "  >> Examples:  \n";
     465usage += "  - sin(PI/6): pi 6 / sin \n";
     466usage += "  - 1*2*...*5: 1 2 3 4 5 product \n";
     467usage += "  - x = $x $y * \n";
     468usage += "  >>> Stack operations : \n";
     469usage += "      print x<>y pop push (duplicate x) \n";
     470usage += "  >>> Constants (Cst pushed to stack): \n";
     471usage += "      pi e \n";
     472usage += "  >>> Arithmetic operators (x,y) --> x@y \n";
     473usage += "      + - * / % ( (int)y % (int)x )\n";
     474usage += "  >>> F(X): x --> F(x) \n";
     475usage += "      chs sqrt sq log log10 exp  \n";
     476usage += "      fabs  floor ceil nint trunc  \n";
     477usage += "      cos sin tan acos asin atan deg2rad rad2deg \n";
     478usage += "  >>> F(X,Y): (x,y) --> F(x,y) \n";
     479usage += "      pow atan2 \n";
     480usage += "  >>> Stack sum/product/mean/sigma/sigma^2 \n";
     481usage += "      sum product mean sigma sigma2 sigmean (y->sigma x->mean) \n";
    456482RegisterHelp(kw, usage, grp);
    457483
     
    459485usage  = "> shell  command_string  # Execute  shell command\n";
    460486usage += "> cshell command_string  # Execute cshell command\n";
    461 usage += "---Exemples:\n";
     487usage += "---Examples:\n";
    462488usage += "  > shell ls\n";
    463489usage += "  > cshell echo '$LD_LIBRARY_PATH'; map2cl -h; ls\n";
     
    858884
    859885rcs = SubstituteVars(s, s2);
    860 if (rcs) return(rcs);
    861 
     886if (rcs) {
     887  cerr << "PIACmd::Interpret()/syntax error in SubstituteVars() \n"
     888       << "line: " << s << endl;
     889  return(rcs);
     890}
    862891// >>>> Separating keyword and tokens
    863892vector<string> tokens;
     
    885914  int rct = EvaluateTest(tokens, s, restst);
    886915  if (rct) {
    887     cerr << "PIACmd::Interpret() if syntax Error ! " << endl;
     916    cerr << "PIACmd::Interpret() if syntax Error ! " << "line: " << s << endl;
    888917    return(1);
    889918  }
     
    900929  int rcev = EvalRPNExpr(tokens, s);
    901930  if (rcev) {
    902     cerr << "PIACmd::Interpret() evaluation (RPN) syntax Error ! " << endl;
     931    cerr << "PIACmd::Interpret() evaluation (RPN) syntax Error ! " << "line: " << s << endl;
    903932    return(1);
    904933  }
     
    913942  }
    914943  else {
    915     cerr << "PIACmd::Interpret() No script name in defscript" << endl;
     944    cerr << "PIACmd::Interpret() No script name in defscript" << "line: " << s << endl;
    916945    return(1);
    917946  }
     
    9931022string vn, vv;
    9941023while (p < l) {
     1024  iarr = -1;
    9951025  q = s.find('$',p);
    9961026  if (q > l) break;
     
    12811311      rpnstack.top() = y/x;
    12821312    }
     1313    else if (args[k] == "%") {
     1314      if ( Check_myRPNStack_(rpnstack, x, y, line) ) return(1);
     1315      rpnstack.top() = (int)y % (int)x;
     1316    }
    12831317    // Les constantes : e , pi
    12841318    else if (args[k] == "e") {
     
    13131347      rpnstack.top() = atan(x);
    13141348    }
     1349    else if (args[k] == "chs") {
     1350      if ( Check_myRPNStack_(rpnstack, x, line) ) return(1);
     1351      rpnstack.top() = -x;
     1352    }
     1353    else if (args[k] == "sqrt") {
     1354      if ( Check_myRPNStack_(rpnstack, x, line) ) return(1);
     1355      rpnstack.top() = sqrt(x);
     1356    }
     1357    else if (args[k] == "sq") {  // x^2
     1358      if ( Check_myRPNStack_(rpnstack, x, line) ) return(1);
     1359      rpnstack.top() = x*x;
     1360    }
    13151361    else if (args[k] == "log") {
    13161362      if ( Check_myRPNStack_(rpnstack, x, line) ) return(1);
     
    13291375      rpnstack.top() = fabs(x);
    13301376    }
    1331     else if (args[k] == "chs") {
     1377    else if (args[k] == "floor") {
    13321378      if ( Check_myRPNStack_(rpnstack, x, line) ) return(1);
    1333       rpnstack.top() = -x;
     1379      rpnstack.top() = floor(x);
     1380    }
     1381    else if (args[k] == "ceil") {
     1382      if ( Check_myRPNStack_(rpnstack, x, line) ) return(1);
     1383      rpnstack.top() = ceil(x);
     1384    }
     1385    else if (args[k] == "nint") {
     1386      if ( Check_myRPNStack_(rpnstack, x, line) ) return(1);
     1387      rpnstack.top() = nint(x);
     1388    }
     1389    else if (args[k] == "trunc") {
     1390      if ( Check_myRPNStack_(rpnstack, x, line) ) return(1);
     1391      rpnstack.top() = trunc(x);
    13341392    }
    13351393    else if (args[k] == "deg2rad") {
     
    13511409    }
    13521410    // Fonction a N arguments  - Somme, produit, etc ...
    1353     else if ((args[k] == "sum") || (args[k] == "mean") ||
     1411    else if ((args[k] == "sum") || (args[k] == "mean") || (args[k] == "sigmean") ||
    13541412             (args[k] == "sigma") || (args[k] == "sigma2") ) {
    13551413      double sx, sx2;
     
    13631421        }
    13641422        double fnn = nn;
    1365         if (args[k] == "mean")  rpnstack.push(sx/fnn);
    1366         else if (args[k] == "sigma2") rpnstack.push(sx2/fnn-(x*x/(fnn*fnn)));
    1367         else rpnstack.push(sqrt(sx2/fnn-(x*x/(fnn*fnn))));
     1423        if ((args[k] == "sigma") || (args[k] == "sigmean"))
     1424          rpnstack.push(sqrt(sx2/fnn-(x*x/(fnn*fnn))));
     1425        else if ((args[k] == "mean") || (args[k] == "sigmean"))  rpnstack.push(sx/fnn);
     1426        else rpnstack.push(sx2/fnn-(x*x/(fnn*fnn)));
    13681427      }
    13691428    }
     
    13851444      if ( Check_myRPNStack_(rpnstack, x, y, line) ) return(1);
    13861445      rpnstack.top() = x;  rpnstack.push(y);
     1446    }
     1447    else if (args[k] == "pop") {
     1448      rpnstack.pop();
     1449    }
     1450    else if (args[k] == "push") {
     1451      if (rpnstack.empty()) rpnstack.push(0.);
     1452      else rpnstack.push(rpnstack.top());
    13871453    }
    13881454    // On met un nombre sur le stack
Note: See TracChangeset for help on using the changeset viewer.