From 37466cc15e098ac8c41907b279f336f9012d5e47 Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (home)" <j.wuttke@fz-juelich.de>
Date: Sat, 20 Dec 2008 18:10:56 +0100
Subject: [PATCH] completed elimination of CGrid from CScan

---
 src/edif.cpp  | 15 +++++++++++----
 src/expr.cpp  |  2 +-
 src/manip.cpp | 51 ++++++++++++++++++++++++++-------------------------
 src/opr.cpp   |  9 +++------
 src/scan.cpp  | 12 +++++-------
 src/scan.h    |  2 +-
 6 files changed, 47 insertions(+), 44 deletions(-)

diff --git a/src/edif.cpp b/src/edif.cpp
index 65e7cc0e..7d9844b2 100644
--- a/src/edif.cpp
+++ b/src/edif.cpp
@@ -913,7 +913,7 @@ void NEdif::MakeGrid(void)
 
 void NEdif::Plot(bool add)
 {
-    const COld *f;
+    COld *f;
     CList JSel;
     const CScan *J;
 	
@@ -926,9 +926,15 @@ void NEdif::Plot(bool add)
         if (!NPlot::X.R.finite()) {
             NPlot::X.R = CRange(2); // empty
             NOlm::IterateD fiter;
+            vector<double>::iterator min_el, max_el;
+            vector<double> *px;
             while((f=fiter())) {
-                for( int iv=0; iv<JSel.n(); ++iv )
-                    NPlot::X.R *= f->VS[JSel.V[iv]].x.range(NPlot::X.log);
+                for( int iv=0; iv<JSel.n(); ++iv ) {
+                    px = &( f->VS[JSel.V[iv]].x );
+                    min_el = min_element( px->begin(), px->end() );
+                    max_el = max_element( px->begin(), px->end() );
+                    NPlot::X.R *= CRange( *min_el, *max_el );
+                }
             }
             if (NPlot::X.R.empty()) {
                 cout << "x-range is empty\n";
@@ -999,7 +1005,8 @@ void NEdif::Plot(bool add)
                 for( uint i=0; i<npts; ++i )
                     S.x[i] = NPlot::X.log ?
                         NPlot::X.R.inf * exp( i*log(NPlot::X.R.sup/
-                                                    NPlot::X.R.inf)/(npts+1) ) :
+                                                    NPlot::X.R.inf)/(npts+1)
+                            ) :
                         NPlot::X.R.inf + i*(NPlot::X.R.sup-
                                             NPlot::X.R.inf)/(npts+1);
                 fc->T.tree_curve_val( &(S.y), S.x, k, j, fc->kconv );
diff --git a/src/expr.cpp b/src/expr.cpp
index c77ff740..fa29dc6c 100644
--- a/src/expr.cpp
+++ b/src/expr.cpp
@@ -224,7 +224,7 @@ void CRef::ref_val( CTOut *ret, const CContext *ctx ) const
                         strg( fd->VS[j].size() );
                 ret->preset_vd( ctx->nv );
                 if      ( var == _X )
-                    ret->vd = fd->VS[j].x.asVec();
+                    ret->vd = fd->VS[j].x;
                 else if ( var == _Y )
                     ret->vd = fd->VS[j].y;
             }
diff --git a/src/manip.cpp b/src/manip.cpp
index e5f5bd54..66248457 100644
--- a/src/manip.cpp
+++ b/src/manip.cpp
@@ -237,19 +237,15 @@ void NManip::PtsSort( void )
             vector<double> v(n);
             T->tree_vec_val( &v, k, j );
             size_t P[n];
-            double xin[n];
-            Sin->x.AsVec(xin, n);
-
             gsl_sort_index (P, &(v[0]), 1, n);
-                
             Sout = *Sin;
-            double xout[n];
+            vector<double> xout(n);
             for (i=0; i<n; ++i) {
-                xout[i] = xin[P[i]];
+                xout[i] = Sin->x[P[i]];
                 Sout.y[i] = Sin->y[P[i]];
             }
 
-            Sout.x = CGrid(xout, n);
+            Sout.x = xout;
             fout.VS.push_back(Sout);
         }
         NOlm::OloAdd(&fout);
@@ -319,7 +315,7 @@ void NManip::PtsRetainEqui(void)
             Sin = &(fin->VS[j]);
             Sout = *Sin;
 
-            Sin->x.AsVec(&x);
+            x = Sin->x;
 
             n = x.size();
             VTEST ((n<2), ("!!! not enough data points\n"));
@@ -591,7 +587,7 @@ void NManip::ScaAvge(void)
     const COld *fin; COld fout;
     CScan Sout;
     vector<double> y;
-    uint ji, jf, j, i, n, mj, nz;
+    uint ji, jf, i, n, mj, nz;
     double ym;
     string err;
     NOlm::IterateD fiter;
@@ -609,17 +605,22 @@ void NManip::ScaAvge(void)
             jf = ( iv<JSel.n()-1 ? JSel.V[iv+1] : fin->nScan() );
             Sout = fin->VS[ji];
             n = fin->VS[ji].size();
-            for (j=ji+1; j<jf; j++)
-                if (!fin->VS[j].x.compatible( fin->VS[ji].x, &err))
-                    throw "grids " + strg(j) + " and " + strg(ji) +
-                        " differ: " + err;
+            for ( uint jj=ji+1; jj<jf; jj++){
+                if ( fin->VS[jj].size() != fin->VS[ji].size() )
+                    throw "scan " + strg(jj) +
+                        " has other size than scan " + strg(ji);
+                for( uint i=0; i<fin->VS[jj].size(); ++i )
+                    if ( fin->VS[jj].x[i] != fin->VS[ji].x[i] )
+                        throw "scan " + strg(jj) + " has other x[" +
+                            strg(i) + " than scan 0";
+            }
             y.resize(n);
             for (i=0; i<n; i++){
                 mj = 0;
                 ym = 0;
-                for (j=ji; j<jf; j++) {
-                    if( skip_zero && fin->VS[j].y[i]==0 ) continue;
-                    ym += fin->VS[j].y[i];
+                for ( uint jj=ji; jj<jf; jj++) {
+                    if( skip_zero && fin->VS[jj].y[i]==0 ) continue;
+                    ym += fin->VS[jj].y[i];
                     ++mj;
                 }
                 y[i] = mj==0 ? 0 : ym/mj;
@@ -628,8 +629,8 @@ void NManip::ScaAvge(void)
             for( uint iz=0; iz<nz; ++iz ){
                 uint mz = 0;
                 double z = 0;
-                for (j=ji; j<jf; j++) {
-                    z += fin->VS[j].z[iz];
+                for (uint jj=ji+1; jj<jf; jj++) {
+                    z += fin->VS[jj].z[iz];
                     ++mz;
                 }
                 Sout.z[iz] = z/mz;
@@ -1183,12 +1184,12 @@ void NManip::ScaExeAvge( const COld *fin, COld *fout, const CList& BP )
         Sout = &(fout->VS[iv]);
         n = fin->VS[ji].size();
         for (jj=ji; jj<jf; ++jj) {
-            if (!fin->VS[jj].x.compatible(
-                    fin->VS[ji].x, &err)) {
-                printf("! grids %d and %d differ: %s\n",
-                       jj, ji, err.c_str());
-                return;
-            }
+            if ( fin->VS[jj].size() != fin->VS[ji].size() )
+                throw "scan " + strg(jj) + " has other size than scan 0";
+            for( uint i=0; i<fin->VS[jj].size(); ++i )
+            if ( fin->VS[jj].x[i] != fin->VS[ji].x[i] )
+                throw "scan " + strg(jj) + " has other x[" + strg(i) +
+                    " than scan 0";
         }
         // printf("DEBUG n=%u\n", n);
         Sout->x = fin->VS[ji].x;
@@ -1351,7 +1352,7 @@ void NManip::HistoMake(void)
             center = 0;
             S = *sin;
             nout = G.size();
-            S.x = G;
+            S.x = G.asVec();
             S.y.clear();
             S.y.resize(nout, 0.);
             for (uint i=0; i<n; i++) {
diff --git a/src/opr.cpp b/src/opr.cpp
index 48eed0ec..4f41b4a1 100644
--- a/src/opr.cpp
+++ b/src/opr.cpp
@@ -772,8 +772,7 @@ int NFunctional::Deriv(int fno, COld *fin, COld *fout)
     fout->yco.unit = fin->yco.unit + " / " + fin->xco.unit;
     fout->lDoc.push_back( "ofd" );
 
-    CGrid *xin, *xout;
-    vector<double> *yin, *yout;
+    vector<double> *xin, *yin, *yout;
     double dx;
     for (uint j=0; j<fin->VS.size(); j++) {
         xin = &(fin->VS[j].x);
@@ -796,8 +795,7 @@ int NFunctional::Integr(int fno, COld *fin, COld *fout)
     fout->yco.unit = fin->xco.unit + " * " + fin->yco.unit;
     fout->lDoc.push_back( "ofi" );
 
-    CGrid *xin;
-    vector<double> *yin, *yout;
+    vector<double> *xin, *yin, *yout;
     for (uint j=0; j<fin->VS.size(); j++) {
         xin = &(fin->VS[j].x);
         yin = &(fin->VS[j].y);
@@ -822,10 +820,9 @@ int NFunctional::Autocorr(int fno, COld *fin, COld *fout)
     fout->yco.unit = fin->yco.unit + "^2";
     fout->lDoc.push_back( "ofac" );
 
-    CGrid *xin;
     vector<double> *yin;
     for (uint j=0; j<fin->VS.size(); j++) {
-        xin = &(fin->VS[j].x);
+        //xin = &(fin->VS[j].x);
         yin = &(fin->VS[j].y);
         uint n = yin->size();
         // cout << "-> -> we have " << n << "data points\n";
diff --git a/src/scan.cpp b/src/scan.cpp
index b8401fbc..925c6bd5 100644
--- a/src/scan.cpp
+++ b/src/scan.cpp
@@ -19,14 +19,12 @@
 #include "scan.h"
 
 
-CScan::CScan(const CGrid& X_in, const vector<double>& Y_in,
+CScan::CScan(const vector<double>& X_in, const vector<double>& Y_in,
 	     const vector<double>& Z_in)
 {
-    if (X_in.size() != Y_in.size()) {
-        cout << "CScan::Make/ incompatible input vectors\n";
-        Clear();
-        return;
-    }
+    if (X_in.size() != Y_in.size())
+        throw string( "PROGRAM ERROR: cannot make scan "
+                      "from incompatible input vectors" );
     x = X_in;
     y = Y_in;
     z = Z_in;
@@ -40,7 +38,7 @@ void CScan::push_back(const double x_in, const double y_in)
 
 void CScan::erase(const uint begin, const uint end)
 {
-    x.erase(begin, end);
+    x.erase(x.begin()+begin, x.begin()+end);
     y.erase(y.begin()+begin, y.begin()+end);
 }
 
diff --git a/src/scan.h b/src/scan.h
index 9ef5bb2a..4df35355 100644
--- a/src/scan.h
+++ b/src/scan.h
@@ -5,7 +5,7 @@ class CScan {
     vector<double> z, dz;
     
     inline CScan() {};
-    CScan(const CGrid& X_in, const vector<double>& Y_in,
+    CScan(const vector<double>& X_in, const vector<double>& Y_in,
           const vector<double>& Z_in);
     
     void push_back(const double x_in, const double y_in);
-- 
GitLab