diff --git a/src/edif.cpp b/src/edif.cpp index 65e7cc0e808ee02fdb5ad687661eacf2e83d4a0c..7d9844b2d106371941328231976d09e10688ced8 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 c77ff740bdcde3e9a4d773cfaaee0a8d0d597133..fa29dc6cf1cab5f513bbb8f1ea8bfb08e3fcf62d 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 e5f5bd544c23684a0e2eeac751d5ad5c25e77c6a..6624845778cd1450037ab941692e5974fd4386b8 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 48eed0ecfb4f1fe26d875e9a0e130e657f0cb095..4f41b4a1d6183c6f998acf9e76fa8fcda51bdfa7 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 b8401fbcf850f61157f19107b3142e30a5c96531..925c6bd54ab42c87be86f42f26663c67747084d7 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 9ef5bb2aafe01af12444d7b9c74f188b161611ff..4df353554ab0fbb75fdfa36becf4b56bd1e28308 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);