From e069fba9f48e50f946f22d456cbc77b522a5436c Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (laptop)" <j.wuttke@fz-juelich.de>
Date: Mon, 3 May 2010 00:30:01 +0200
Subject: [PATCH] mp* and ms* work. still 29 TODO's

---
 pub/src/manip.cpp  | 232 ++++++++++++++++++++++-----------------------
 pub/src/olm.cpp    |  10 +-
 pub/src/zentry.cpp |  12 +--
 pub/src/zentry.h   |   2 +-
 4 files changed, 128 insertions(+), 128 deletions(-)

diff --git a/pub/src/manip.cpp b/pub/src/manip.cpp
index c6a524dd..8ef615dc 100644
--- a/pub/src/manip.cpp
+++ b/pub/src/manip.cpp
@@ -424,6 +424,9 @@ void NManip::ScaSelect( string del_or_ret )
     }
 }
 
+
+//! Bin spectra.
+
 void NManip::ScaAvge()
 {
     NOlm::SelAssert();
@@ -507,10 +510,11 @@ void NManip::ScaAvge()
             }
         }
         ScaRemoveConstantZ( fout );
-        NOlm::OloAdd( fout );
+        NOlm::OloAdd( fout, fiter.k() );
     }
 }
 
+
 //! Merge spectra, concatenating points.
 
 void NManip::ScaJoin()
@@ -520,37 +524,39 @@ void NManip::ScaJoin()
     CList JSel;
     static string jSel = "";
     NOlm::JSelAsk( "Start groups at spectra", &jSel, &JSel );
-    vector<double> y;
-    uint ji, jf, n, nz;
-    string err;
+
     NOlm::IterateD fiter;
     POld fin;
     while( fin = fiter() ) {
-        POld fout;
-        // fout = *fin;
-        cerr << "TODO probably broken after V rewrite\n";
+        POld fout( new COld( *fin ) );
+        fout->V.clear();
         JSel.evaluate( 0, fin->nJ()-1 );
         if (JSel.V.size()<1 || JSel.V[0]!=0)
             throw string( "spectrum selection must contain 0" );
         fout->lDoc.push_back("msj " + JSel.str());
-        fout->V.clear();
-        nz = fin->nZ();
-        for(uint iv=0; iv<JSel.size(); iv++) {
+        cerr << "WARNING: z just taken from first spectrum of each group\n";
+        for ( uint iv=0; iv<JSel.size(); iv++ ) {
+            uint ji, jf;
             ji = JSel.V[iv];
             jf = ( iv<JSel.size()-1 ? JSel.V[iv+1] : fin->nJ() );
             PSpec sout( new CSpec( *(fin->VS(ji)) ) );
-            n = fin->VS(ji)->size();
+            bool with_dy = fin->VS(ji)->dy.size();
             for ( uint jj=ji+1; jj<jf; jj++){
                 for( uint i=0; i<fin->VS(jj)->size(); ++i )
-                    sout->push_xy( fin->VS(jj)->x[i], fin->VS(jj)->y[i] );
+                    if ( with_dy )
+                        sout->push_xyd( fin->VS(jj)->x[i], fin->VS(jj)->y[i],
+                                        fin->VS(jj)->dy[i]);
+                    else
+                        sout->push_xy( fin->VS(jj)->x[i], fin->VS(jj)->y[i] );
             }
             fout->V.push_back(sout);
         }
         ScaRemoveConstantZ( fout );
-        NOlm::OloAdd( fout );
+        NOlm::OloAdd( fout, fiter.k() );
     }
 }
 
+
 //! After each span, insert given number of copies.
 
 void NManip::ScaSpawn()
@@ -565,105 +571,106 @@ void NManip::ScaSpawn()
     NOlm::IterateO fiter;
     POlo fin;
     while( fin = fiter() ) {
-        POlo fout; // TODO
-        // fout = fin->copy();
-        // fout->clear();
-        fout->ZCo.push_back(CCoord("no-in-spawn", ""));
+        POlo fout( fin->new_olo() );
         fout->lDoc.push_back( "ms* " + strg(njj) );
 
+        fout->ZCo.push_back(CCoord("no-in-spawn", ""));
+
         for( uint jj=0; jj<njj; ++jj ){
             for( uint j=0; j<fin->nJ(); j++ ){
-                /* TODO PZentry E( new CZentry( fin->V[j] ) );
-                E->z.push_back( jj );
-                fout->V.push_back( E );
-                */
+                PZentry eout = fin->new_zentry( j );
+                eout->z.push_back( jj );
+                fout->V.push_back( eout );
             }
         }
-        NOlm::OloAdd(fout);
+        NOlm::OloAdd( fout, fiter.k() );
     }
 }
 
+
 //! Exchange x and z.
 
 void NManip::ScaExch()
 {
     NOlm::SelAssert();
 
-    vector<double> zcommon, xcommon;
-    uint ji, jf, j, i, ii, izco;
-    CCoord xcoin, zcoin;
-    string doc;
-
     NOlm::IterateD fiter;
     POld fin;
     while( fin = fiter() ) {
-        POld fout; // TODO = *fin;
+        POld fout( new COld (*fin ) );
         fout->V.clear();
 
-        xcoin = fin->xco;
-        izco = fin->ZCo.size() - 1;
+        uint izco = fin->ZCo.size() - 1;
         if ( izco==(uint)-1 )
             throw string( "no input z coordinate" );
-        zcoin = fin->ZCo[izco];
-
-        doc = "msx # exchanging x=" + xcoin.str() + " against z" + strg(izco)
-            + "=" + zcoin.str();
-        cout << doc+"\n";
-	
-        fout->lDoc.push_back(doc);
-        fout->xco = zcoin;
-        fout->ZCo[izco] = xcoin;
+        fout->lDoc.push_back(
+            "msx # exchanging x=" + fin->xco.str() +
+            " with z" + strg(izco) + "=" + fin->ZCo[izco].str() );
+        fout->xco = fin->ZCo[izco];
+        fout->ZCo[izco] = fin->xco;
 		
         if ( fin->nJ()<=0 )
             throw string( "no spectra in file" );
 
-        for (ji=0; ji<fin->nJ(); ) {
+        vector<double> zcommon, xcommon;
+        uint ji, jf;
+
+        for ( ji=0; ji<fin->nJ(); ) {
 
             zcommon.clear();
-            for (i=0; i<izco; ++i)
+            for ( uint i=0; i<izco; ++i)
                 zcommon.push_back(fin->V[ji]->z[i]);
 
-            for (jf=ji+1; jf<fin->nJ(); jf++)
-                for (i=0; i<izco; ++i)
+            for ( jf=ji+1; jf<fin->nJ(); jf++ )
+                for ( uint i=0; i<izco; ++i)
                     if (fin->V[jf]->z[i] != zcommon[i])
                         goto end_group;
         end_group:
 
             // build common grid:
             xcommon.clear();
-            for (j=ji; j<jf; ++j)
-                for (i=0; i<fin->VS(j)->size(); ++i)
+            for ( uint j=ji; j<jf; ++j )
+                for ( uint i=0; i<fin->VS(j)->size(); ++i )
                     xcommon.push_back( fin->VS(j)->x[i] );
-            sort(xcommon.begin(), xcommon.end());
+            sort( xcommon.begin(), xcommon.end() );
             mystd::unique(&xcommon, 1e-180, 1e-20);
 
             printf("group of spectra %u .. %u has %zu different x\n", 
                    ji, jf-1, xcommon.size());
 
-            ii = 0; // a guess
-            for(i=0; i<xcommon.size(); ++i) {
+            uint ii = 0; // a guess
+            for ( uint i=0; i<xcommon.size(); ++i ) {
                 PSpec sout( new CSpec );
+                
                 sout->z = zcommon;
                 sout->z.push_back(xcommon[i]);
 
-                for (j=ji; j<jf; ++j){
-                    if( fin->VS(j)->x[ii]!=xcommon[i] ){ // guess failed
-                        for (ii=0; ii<fin->VS(j)->size(); ++ii)
-                            if( fin->VS(j)->x[ii]==xcommon[i] )
+                for ( uint j=ji; j<jf; ++j ) {
+                    PSpec sin = fin->VS( j );
+                    bool with_dy = sin->dy.size();
+                    if( sin->x[ii]!=xcommon[i] ){ // guess failed
+                        for (ii=0; ii<sin->size(); ++ii)
+                            if( sin->x[ii]==xcommon[i] )
                                 break;
                     }
-                    if( ii<fin->VS(j)->size() )
-                        sout->push_xy( fin->V[j]->z[izco], fin->VS(j)->y[ii] );
+                    if( ii<sin->size() ){
+                        if( with_dy )
+                            sout->push_xyd( sin->z[izco], sin->y[ii],
+                                           sin->dy[ii] );
+                        else
+                            sout->push_xy( sin->z[izco], sin->y[ii] );
+                    }
                 }
-                fout->V.push_back(sout);
+                fout->V.push_back( sout );
                 ++ii;
             }
             ji = jf;
         }
-        NOlm::OloAdd( fout );
+        NOlm::OloAdd( fout, fiter.k() );
     }
 }
 
+
 //! Sort spectra according to expression.
 
 void NManip::ScaSortByExpr()
@@ -678,28 +685,25 @@ void NManip::ScaSortByExpr()
     NOlm::IterateO fiter;
     POlo fin;
     while( fin = fiter() ) {
-        uint k = fiter.k();
-
-        POld fout; // TODO fout = *fin;
-        fout->V.clear();
+        POlo fout( fin->new_olo() );
         fout->lDoc.push_back("mso "+expr);
 
         uint nj = fin->nJ();
         vector<double> v(nj);
-        size_t P[nj];
-        for (uint j=0; j<nj; j++) {
-            T->tree_point_val( &(v[j]), k, j );
-        }
+        for (uint j=0; j<nj; j++)
+            T->tree_point_val( &(v[j]), fiter.k(), j );
         
-        gsl_sort_index (P, &(v[0]), 1, nj);
+        size_t pos[nj];
+        gsl_sort_index (pos, &(v[0]), 1, nj);
                 
-        for (uint j=0; j<nj; j++) {
-            fout->V.push_back( fin->V[P[j]] );
-        }
-        NOlm::OloAdd( fout );
+        for (uint j=0; j<nj; j++)
+            fout->V.push_back( fin->new_zentry( pos[j] ) );
+
+        NOlm::OloAdd( fout, fiter.k() );
     }
 }
 
+
 //! Sort spectra according to full z vector.
 
 void NManip::ScaSortByZ()
@@ -709,26 +713,26 @@ void NManip::ScaSortByZ()
     NOlm::IterateO fiter;
     POlo fin;
     while( fin = fiter() ) {
-        /* TODO 
-        fout = *fin;
-        sort( fout.V.begin(), fout.V.end(), CompareZ );
-        NOlm::OloAdd( fout );
-        */
+        POlo fout( fin->new_olo() );
+        for (uint j=0; j<fin->nJ(); j++)
+            fout->V.push_back( fin->new_zentry( j ) );
+        sort( fout->V.begin(), fout->V.end(), CompareZ );
+        NOlm::OloAdd( fout, fiter.k() );
     }
 }
 
+
 //! Change order of z coordinates.
 
 void NManip::ZExchange()
 {
     NOlm::SelAssert();
 
-    int nzmax = 0;
-    int nzmin;
+    int nzmin, nzmax = 0;
     char mod;
     string com;
-    int num1;
-    int num2;
+    int num1, num2;
+
     NOlm::IterateO fiter;
     POlo fin;
     while( fin = fiter() ) {
@@ -776,11 +780,14 @@ void NManip::ZExchange()
                 
     fiter.reset();
     while( fin = fiter() ) {
-        POlo fout; // TODO  = *fin;
+        POlo fout( fin->new_olo() );
         fout->lDoc.push_back( com );
+        for (uint j=0; j<fin->nJ(); j++)
+            fout->V.push_back( fin->new_zentry( j ) );
+
         int nz = fout->ZCo.size();
         if      ( nz<nzmin ){
-            printf( "WARNING nz<nzmin\n" );
+            cerr << "WARNING nz<nzmin\n";
         } else if( mod=='r' ){
             for( int irot=0; irot<num1; ++irot ){
                 for( int iz=1; iz<nz; ++iz ){
@@ -815,7 +822,7 @@ void NManip::ZExchange()
                 fout->V[j]->z[num2] = fin->V[j]->z[num1];
             }
         }
-        NOlm::OloAdd( fout );
+        NOlm::OloAdd( fout, fiter.k() );
     }
 }
 
@@ -831,26 +838,28 @@ void NManip::ZDelete()
     sel = wask("Delete z coordinates (-=quit)");
     if (sel=="-" || sel=="q") return;
 	
-    IndexSet ISel;
-    IndexSetIterator II;
-    uint iz;
-
     NOlm::IterateO fiter;
     POlo fin;
     while( fin = fiter() ) {
-        POlo fout;// TODO = *fin;
+        POlo fout( fin->new_olo() );
         fout->lDoc.push_back("mz- "+sel);
 
+        for (uint j=0; j<fin->nJ(); j++)
+            fout->V.push_back( fin->new_zentry( j ) );
+
+        IndexSet ISel;
         if ( ISel.parse(sel, 0, fin->ZCo.size()) )
             throw ( "invalid selection for file " + strg( fiter.k() ) );
 
+        IndexSetIterator II;
         II.setback(ISel);
+        uint iz;
         while (II(&iz)) {
             fout->ZCo.erase(fout->ZCo.begin()+iz);
             for (uint j=0; j<fin->nJ(); j++) 
                 fout->V[j]->z.erase(fout->V[j]->z.begin()+iz);
         }
-        NOlm::OloAdd( fout );
+        NOlm::OloAdd( fout, fiter.k() );
     }
 }
 
@@ -861,38 +870,30 @@ void NManip::ScaBreak()
 {
     NOlm::SelAssert();
 
-    CCoord zco;
-    double zval;
-
-    NOlm::IterateD fiter;
-    POld fin;
+    NOlm::IterateO fiter;
+    POlo fin;
     while( fin = fiter() ) {
-        if (!(fin->ZCo.size()))
-            throw string( "invalid operation / no z coordinate" );
-        zco = fin->ZCo[0];
-        cout << ".. eliminate " << zco << "\n";
-
-/* TODO
-        COld ftmp, fout;
-        ftmp = *fin;
-        ftmp.lDoc.push_back("spectra -> files, eliminating " + zco.str());
-
-        ftmp.ZCo.erase(ftmp.ZCo.begin());
-
-        for (uint j=0; j<ftmp.nJ(); ) {
-            fout = ftmp;
-            fout->V.clear();
-            zval = ftmp.V[j]->z[0];
+        if ( !(fin->ZCo.size()) )
+            throw string( "no z coordinate" );
+        CCoord zco = fin->ZCo[0];
+
+        // intermediate file, on which output files will be based:
+        POlo ftmp( fin->new_olo() );
+        ftmp->V.clear();
+        ftmp->lDoc.push_back("spectra -> files, eliminating " + zco.str());
+        ftmp->ZCo.erase( ftmp->ZCo.begin() );
+
+        for ( uint j=0; j<fin->nJ(); ) {
+            POlo fout( ftmp->new_olo() );
+            double zval = ftmp->z(j,0);
             fout->RPar.push_back( CParam( zco, zval ) );
-            ftmp.V[j]->z.erase(ftmp.V[j]->z.begin()); // SIMPLIFY
-            fout->V.push_back( new CSpec( *(ftmp.V(j)) ) );
-            while (++j<ftmp.nJ() && ftmp.V[j]->z[0]==zval) {
-                ftmp.V[j]->z.erase(ftmp.V[j]->z.begin());
-                fout->V.push_back(ftmp.V[j]);
-            }
+            do {
+                PZentry eout( fin->new_zentry(j) );
+                eout->z.erase( eout->z.begin() );
+                fout->V.push_back( eout );
+            } while ( ++j<fin->nJ() && fin->z(j,0)==zval );
             NOlm::OloAdd( fout );
         }
-*/
     }
 }
 
@@ -901,7 +902,6 @@ void NManip::ScaBreak()
 //* manipulations on files                                                  *//
 //***************************************************************************//
 
-
 //! Merge files, concatenating spectra.
 
 void NManip::FilMerge( const string& opts )
diff --git a/pub/src/olm.cpp b/pub/src/olm.cpp
index eb218245..ccce9ad0 100644
--- a/pub/src/olm.cpp
+++ b/pub/src/olm.cpp
@@ -32,8 +32,8 @@ COld::COld( class COlc const* c )
 }
 
 uint COld::nPts( uint j ) const {
-    if (!nJ() || j>=nJ())
-        throw string( "PROGRAM ERROR: nPts called with invalid j="+strg(j) );
+    if ( !nJ() || j>=nJ() )
+        throw string( "BUG: nPts called with invalid j="+strg(j) );
     return VS(j)->size();
 }
 
@@ -41,10 +41,10 @@ uint COld::nPts( uint j ) const {
 //! Return number of points if it is the same for all spectra. Else return 0.
 
 uint COld::nPts() const {
-    if (!nJ())
-        throw string( "PROGRAM ERROR: nPts() called while nSpec=0" );
+    if ( !nJ() )
+        throw string( "BUG: nPts() called while nSpec=0" );
     uint np = VS(0)->size();
-    for (uint j=0; j<nJ(); ++j)
+    for ( uint j=0; j<nJ(); ++j )
         if (VS(j)->size()!=np) return 0;
     return np;
 }
diff --git a/pub/src/zentry.cpp b/pub/src/zentry.cpp
index e7d96b16..c8e4694f 100644
--- a/pub/src/zentry.cpp
+++ b/pub/src/zentry.cpp
@@ -22,15 +22,15 @@ void CZentry::copy_zentry( PZentry ein )
 
 //! Compare z vectors of two zentries, for use within sort routine.
 
-bool CompareZ( const CZentry& E1, const CZentry& E2 )
+bool CompareZ( const PZentry& E1, const PZentry& E2 )
 {
-    if( E1.z.size()!=E2.z.size() )
-        return false;
-    uint nz = E1.z.size();
+    if( E1->z.size()!=E2->z.size() )
+        throw string( "BUG: inconsistent z.size in CompareZ" );
+    uint nz = E1->z.size();
     for( uint iz=0; iz<nz; ++iz ){
-        if    ( E1.z[iz]>E2.z[iz] )
+        if    ( E1->z[iz] > E2->z[iz] )
             return false;
-        if    ( E1.z[iz]<E2.z[iz] )
+        if    ( E1->z[iz] < E2->z[iz] )
             return true;
     }
     return false;
diff --git a/pub/src/zentry.h b/pub/src/zentry.h
index e9fe6833..dd37fe35 100644
--- a/pub/src/zentry.h
+++ b/pub/src/zentry.h
@@ -12,6 +12,6 @@ class CZentry {
 
 typedef boost::shared_ptr<CZentry> PZentry;
 
-bool CompareZ( const CZentry& E1, const CZentry& E2 );
+bool CompareZ( const PZentry& E1, const PZentry& E2 );
 
 #endif
-- 
GitLab