The following commit has been merged in the master branch:
commit 9897b3a5dca35d668820513631b2fe9b37c33642
Author: Andrei Zavada <[email protected]>
Date:   Mon Apr 29 18:34:58 2013 +0300

    complete 7c9394f8 (propagate all sigfile::SChannel changes throughout)

diff --git a/src/expdesign/primaries.cc b/src/expdesign/primaries.cc
index dfcafbc..09c7f46 100644
--- a/src/expdesign/primaries.cc
+++ b/src/expdesign/primaries.cc
@@ -381,7 +381,7 @@ used_samplerates( sigfile::SChannel::TType type) const
                                for ( auto &E : D.second.episodes )
                                        for ( auto &F : E.sources )
                                                for ( size_t h = 0; h < 
F().n_channels(); ++h )
-                                                       if ( type == 
sigfile::SChannel::other or
+                                                       if ( type == 
sigfile::SChannel::TType::other or
                                                             type == 
F().signal_type(h) ) {
                                                                recp.push_back( 
F().samplerate(h));
                                                        }
@@ -429,7 +429,7 @@ SEpisode (sigfile::CTypedSource&& F_,
        auto& F = sources.back();
        auto HH = F().channel_list();
        printf( "CSubject::SEpisode::SEpisode( \"%s\"): %s\n",
-               F().filename(), agh::str::join(HH, ", ").c_str());
+               F().filename(), sigfile::join_channel_names(HH, ", ").c_str());
        int h = 0;
        for ( auto& H : HH )
                recordings.insert( {H, {F, h++, fft_params, swu_params, 
mc_params}});
diff --git a/src/expdesign/primaries.hh b/src/expdesign/primaries.hh
index e33f1cf..735eced 100644
--- a/src/expdesign/primaries.hh
+++ b/src/expdesign/primaries.hh
@@ -286,7 +286,7 @@ class CExpDesign {
 
     public:
       // constructor
-       typedef function<void(const char*, size_t, size_t)> 
TMsmtCollectProgressIndicatorFun;
+       typedef function<void(const string&, size_t, size_t)> 
TMsmtCollectProgressIndicatorFun;
        CExpDesign (const string& sessiondir,
                    TMsmtCollectProgressIndicatorFun progress_fun = 
progress_fun_stdout);
        ~CExpDesign ()
@@ -366,7 +366,7 @@ class CExpDesign {
        static bool is_supported_source( sigfile::CTypedSource&);
 
       // model runs
-       int setup_modrun( const char* j, const char* d, const char* h,
+       int setup_modrun( const string& j, const string& d, const string& h,
                          const SProfileParamSet&,
                          ach::CModelRun**);
        void remove_all_modruns();
@@ -382,7 +382,7 @@ class CExpDesign {
        list<string> enumerate_episodes() const;
        list<sigfile::SChannel> enumerate_all_channels() const;
        list<sigfile::SChannel> enumerate_eeg_channels() const;
-       vector<size_t> used_samplerates( sigfile::SChannel::TType type = 
sigfile::SChannel::other) const;
+       vector<size_t> used_samplerates( sigfile::SChannel::TType type = 
sigfile::SChannel::TType::other) const;
 
       // omp-enabled lists:foreach
        typedef function<void(CSubject&)>
diff --git a/src/expdesign/recording.cc b/src/expdesign/recording.cc
index 1fe7d29..3027ac1 100644
--- a/src/expdesign/recording.cc
+++ b/src/expdesign/recording.cc
@@ -30,12 +30,7 @@ CRecording (sigfile::CTypedSource& F, int sig_no,
        uc_params (nullptr),
        _status (0), // not computed
        _source (F), _sig_no (sig_no)
-{
-       // if ( F.signal_type(sig_no) == sigfile::SChannel::TType::eeg ) {
-       //      CBinnedPower::compute();
-       //      CBinnedMC::compute();
-       // }
-}
+{}
 
 
 agh::CRecording::
diff --git a/src/expdesign/tree-scanner.cc b/src/expdesign/tree-scanner.cc
index bd9634c..b9ba463 100644
--- a/src/expdesign/tree-scanner.cc
+++ b/src/expdesign/tree-scanner.cc
@@ -24,9 +24,9 @@ using namespace std;
 
 namespace {
 struct progress_fun_stdout_fo {
-       void operator() ( const char* current, size_t n, size_t i) const
+       void operator() ( const string& current, size_t n, size_t i) const
                {
-                       printf( "(%zu of %zu) %s\n", i, n, current);
+                       printf( "(%zu of %zu) %s\n", i, n, current.c_str());
                }
 };
 } // namespace
@@ -391,7 +391,7 @@ compute_profiles()
                     size_t i, size_t total)
                {
                        only_progress_fun(
-                               (string ("Compute ") + R.F().filename() + 
":"+R.F().channel_by_id(R.h())).c_str(),
+                               string ("Compute ") + R.F().filename() + 
":"+R.F().channel_by_id(R.h()).name(),
                                total, i);
                };
        TRecordingFilterFun filter =
diff --git a/src/libsigfile/channel.cc b/src/libsigfile/channel.cc
index c7c8e69..88e960b 100644
--- a/src/libsigfile/channel.cc
+++ b/src/libsigfile/channel.cc
@@ -107,6 +107,7 @@ template const char* 
SChannel::channel_s<SChannel::TType::erg>( int);
 
 
 tuple<SChannel::TType, int>
+SChannel::
 figure_type_and_name( const string& h)
 {
        for ( auto& T : _CT_ )
diff --git a/src/libsigfile/channel.hh b/src/libsigfile/channel.hh
index 9883cc4..e34281e 100644
--- a/src/libsigfile/channel.hh
+++ b/src/libsigfile/channel.hh
@@ -15,6 +15,7 @@
 #include <cstring>
 #include <tuple>
 #include <string>
+#include <sstream>
 
 #if HAVE_CONFIG_H && !defined(VERSION)
 #  include "config.h"
@@ -126,14 +127,21 @@ struct SChannel {
                        }
                }
 
-       template <TType T>
-       SChannel (int idx_)
-             : _type (T),
+       SChannel (TType type_, int idx_)
+             : _type (type_),
                _idx (idx_)
                {}
+       SChannel (TType type_, const string& custom_name_)
+             : _type (type_),
+               _idx (0),
+               _custom_name (custom_name_)
+               {}
+       SChannel () = default;
 
        TType type() const
                { return _type; }
+       const char* type_s() const
+               { return type_s(_type); }
 
        const char* name() const
                {
@@ -146,15 +154,19 @@ struct SChannel {
                        default: return _custom_name.c_str();
                        }
                }
+       const char* c_str() const
+               { return name(); }
+       int idx() const
+               { return _idx; }
 
-       bool is_fftable()
+       bool is_fftable() const
                {
                        return is_fftable( _type);
                }
     private:
-       string  _custom_name;
        TType   _type;
        int     _idx;
+       string  _custom_name;
 
     public:
        // compares by channel actual locations, antero-posteriorly
@@ -180,6 +192,20 @@ struct SChannel {
                }
 };
 
+template <typename C>
+string
+join_channel_names( const C& l, const char* sep)
+{
+       if ( l.empty() )
+               return "";
+       ostringstream recv;
+       auto I = l.begin();
+       for ( ; next(I) != l.end(); ++I )
+               recv << I->name() << sep;
+       recv << I->name();
+       return recv.str();
+}
+
 
 } // namespace sigfile
 
diff --git a/src/libsigfile/edf.cc b/src/libsigfile/edf.cc
index 6bf263d..8b566b3 100644
--- a/src/libsigfile/edf.cc
+++ b/src/libsigfile/edf.cc
@@ -129,14 +129,14 @@ CEDFFile (const string& fname_, const int flags_)
                int stst = stat( fname_.c_str(), &stat0);
                if ( stst == -1 ) {
                        _status |= TStatus::sysfail;
-                       throw runtime_error (explain_edf_status(_status));
+                       throw invalid_argument (explain_edf_status(_status));
                }
                _fsize = stat0.st_size;
        }
        _fd = open( fname_.c_str(), O_RDWR);
        if ( _fd == -1 ) {
                _status |= TStatus::sysfail;
-               throw runtime_error (explain_edf_status(_status));
+               throw invalid_argument (explain_edf_status(_status));
        }
 
       // mmap
@@ -155,7 +155,7 @@ CEDFFile (const string& fname_, const int flags_)
                if ( not (flags_ & no_field_consistency_check) ) {
                        close( _fd);
                        munmap( _mmapping, _fsize);
-                       throw runtime_error (explain_edf_status(_status));
+                       throw invalid_argument (explain_edf_status(_status));
                } else
                        fprintf( stderr, "CEDFFile::CEDFFile(\"%s\") Warning: 
parse header failed, but proceeding anyway\n", fname_.c_str());
        }
@@ -174,7 +174,7 @@ CEDFFile (const string& fname_, const int flags_)
                        close( _fd);
                        munmap( _mmapping, _fsize);
                        _status |= file_truncated;
-                       throw runtime_error (explain_edf_status(_status));
+                       throw invalid_argument (explain_edf_status(_status));
                } else if ( _fsize > expected_fsize ) {
                        _status |= trailing_junk;
                        fprintf( stderr, "CEDFFile::CEDFFile(\"%s\") Warning: 
%zu bytes of trailing junk\n",
@@ -533,8 +533,7 @@ int
 CEDFFile::
 _parse_header()
 {
-       size_t  n_channels,
-               i;
+       size_t  n_channels;
        try {
                _fld_pos = 0;
                _get_next_field( header.version_number,   8);
@@ -677,34 +676,30 @@ _parse_header()
                      // determine & validate signal types
                        for ( auto &H : channels ) {
                                _get_next_field( H.header.label, 16);
+                               string isolated_label = trim( string 
(H.header.label, 16));
 
-                               if ( 0 == strcmp( H.header.label == 
sigfile::edf_annotations_label )
-                                    H.ucd = 
sigfile::SChannel<sigfile::TType::embedded_annotation>(0);
+                               if ( isolated_label == 
sigfile::edf_annotations_label )
+                                       H.ucd = sigfile::SChannel( 
sigfile::SChannel::TType::embedded_annotation, 0);
                                else {
-                                       auto tt = agh::str::tokens( H.name, " 
");
-                                       SChannel::TType figured_type;
+                                       auto tt = agh::str::tokens( 
isolated_label, " ");
                                        // parse legacy pre 0.9 specs ("EEG F3" 
etc)
-                                       if ( tt.size() > 1 &&
-                                            (figured_type = 
SChannel::figure_signal_type(tt.front().c_str()))
-                                            != SChannel::TType::other ) {
-                                               H.signal_type = figured_type;
-                                               H.signal_type_s = tt.front();
-                                               H.name = (tt.pop_front(), 
agh::str::join( tt, " "));
-                                               if ( not 
H.name.follows_system1020() )
-                                                       _status |= 
non1020_channel;
+                                       if ( tt.size() > 1 ) {
+                                               string suggested_type = 
tt.front();
+                                               H.ucd = sigfile::SChannel 
((tt.pop_front(), agh::str::join( tt, " ")));
+                                               if ( suggested_type == 
H.ucd.type_s() )
+                                                       ; // all agree
+                                               else
+                                                       _status |= 
recognised_channel_conflicting_type;
                                        } else {
-                                               H.signal_type_s = 
SChannel::kemp_signal_types[
-                                                       H.signal_type = 
SChannel::signal_type_of_channel( H.name) ];
+                                               H.ucd = sigfile::SChannel 
(isolated_label);
 
-                                               if ( not 
H.label.follows_system1020() )
+                                               if ( H.ucd.type() == 
sigfile::SChannel::TType::eeg &&
+                                                    H.ucd.idx()  == 
sigfile::EEG::custom )
                                                        _status |= 
non1020_channel;
-                                               if ( H.signal_type == 
SChannel::TType::other )
+                                               if ( H.ucd.type() == 
SChannel::SChannel::TType::other )
                                                        _status |= 
nonkemp_signaltype;
                                        }
                                }
-
-                               H.ucd = trim( string (, 16));
-                               // includes figuring signal type and mapping to 
a canonicalised name
                        }
                        for ( auto &H : channels )
                                H.transducer_type =
@@ -813,7 +808,7 @@ _parse_header()
       // are channels unique?
        for ( auto &H : channels )
                for ( auto &J : channels ) {
-                       if ( &J != &H && J.label == H.label ) {
+                       if ( &J != &H && J.ucd == H.ucd ) {
                                _status |= dup_channels;
                                goto outer_break;
                        }
@@ -1040,6 +1035,8 @@ explain_edf_status( const int status)
                recv.emplace_back( "* File has trailing junk");
        if ( status & extra_patientid_subfields )
                recv.emplace_back( "* Extra subfields in PatientId");
+       if ( status & recognised_channel_conflicting_type )
+               recv.emplace_back( "* Explicitly specified signal type does not 
match type of known channel name");
        return join(recv, "\n");
 }
 
diff --git a/src/libsigfile/edf.hh b/src/libsigfile/edf.hh
index 265986d..bc7db0c 100644
--- a/src/libsigfile/edf.hh
+++ b/src/libsigfile/edf.hh
@@ -447,6 +447,10 @@ class CEDFFile
                        {
                                return ucd.name() == h.name();
                        }
+               bool operator==( const string& h) const
+                       {
+                               return ucd.name() == h;
+                       }
 
                list<SAnnotation>
                        annotations;
@@ -513,6 +517,7 @@ class CEDFFile
                file_truncated            = (1 << 17),
                trailing_junk             = (1 << 18),
                extra_patientid_subfields = (1 << 19),
+               recognised_channel_conflicting_type = (1 << 20),
 
                inoperable               = (bad_header
                                           | bad_version
diff --git a/src/libsigfile/source-base.hh b/src/libsigfile/source-base.hh
index 5d9be26..fbde17a 100644
--- a/src/libsigfile/source-base.hh
+++ b/src/libsigfile/source-base.hh
@@ -277,11 +277,11 @@ class CSource {
 
        // filters
        virtual SFilterPack&
-       filters( const SChannel&)                             = 0;
+       filters( const SChannel&)                     = 0;
        virtual SFilterPack&
        filters( int)                                 = 0;
        virtual const SFilterPack&
-       filters( const SChannel&)                       const = 0;
+       filters( const SChannel&)               const = 0;
        virtual const SFilterPack&
        filters( int)                           const = 0;
 
diff --git a/src/model/achermann.cc b/src/model/achermann.cc
index 056ebdf..c2eb6e9 100644
--- a/src/model/achermann.cc
+++ b/src/model/achermann.cc
@@ -72,7 +72,7 @@ operator==( const SControlParamSet &rv) const
 
 int
 agh::CExpDesign::
-setup_modrun( const char* j, const char* d, const char* h,
+setup_modrun( const string& j, const string& d, const string& h,
              const SProfileParamSet& profile_params0,
              agh::ach::CModelRun** Rpp)
 {
@@ -99,13 +99,13 @@ setup_modrun( const char* j, const char* d, const char* h,
                                . modrun_sets[profile_params0][h];
 
        } catch (invalid_argument ex) { // thrown by CProfile ctor
-               fprintf( stderr, "CExpDesign::setup_modrun( %s, %s, %s): %s\n", 
j, d, h, ex.what());
+               fprintf( stderr, "CExpDesign::setup_modrun( %s, %s, %s): %s\n", 
j.c_str(), d.c_str(), h.c_str(), ex.what());
                return -1;
        } catch (out_of_range ex) {
-               fprintf( stderr, "CExpDesign::setup_modrun( %s, %s, %s): %s\n", 
j, d, h, ex.what());
+               fprintf( stderr, "CExpDesign::setup_modrun( %s, %s, %s): %s\n", 
j.c_str(), d.c_str(), h.c_str(), ex.what());
                return -1;
        } catch (int ex) { // thrown by CModelRun ctor
-               log_message( "CExpDesign::setup_modrun( %s, %s, %s): %s\n", j, 
d, h, CProfile::explain_status(ex).c_str());
+               log_message( "CExpDesign::setup_modrun( %s, %s, %s): %s\n", 
j.c_str(), d.c_str(), h.c_str(), CProfile::explain_status(ex).c_str());
                return ex;
        }
 
diff --git a/src/tools/edfcat.cc b/src/tools/edfcat.cc
index 40fbdd4..8887b30 100644
--- a/src/tools/edfcat.cc
+++ b/src/tools/edfcat.cc
@@ -194,7 +194,7 @@ make_channel_headers_for_CEDFFile( size_t n, const char 
*fmt, size_t samplerate)
        list<pair<sigfile::SChannel, size_t>> ret;
        for ( size_t i = 0; i < n; ++i ) {
                DEF_UNIQUE_CHARP (_);
-               ret.emplace_back( (ASPRINTF( &_, fmt, i), _), samplerate);
+               ret.emplace_back( (ASPRINTF( &_, fmt, i), string (_)), 
samplerate);
        }
        return ret;
 }
diff --git a/src/tools/edfhed.cc b/src/tools/edfhed.cc
index b027dd8..3dfc650 100644
--- a/src/tools/edfhed.cc
+++ b/src/tools/edfhed.cc
@@ -101,7 +101,8 @@ struct SSettable {
                        if ( 3 == sscanf( pv, "%u:%20[a-z_]:%80s", &h, p, v) && 
h != -1 ) {
                                channel = h - 1;  // base 0
                                if ( strcmp( p, "label") == 0 ) {
-                                       if ( not 
sigfile::SChannel::channel_follows_system1020( v) )
+                                       sigfile::SChannel X (p);
+                                       if ( X.type() != 
sigfile::SChannel::TType::eeg )
                                                printf( "Note: Channel label 
\"%s\" does not follow System 10-20\n", v);
                                        which = ch_label;
                                } else if ( strcmp( p, "transducer_type") == 0 
) {
diff --git a/src/ui/mw/mainmenu_cb.cc b/src/ui/mw/mainmenu_cb.cc
index 33ad2ae..1a4ea99 100644
--- a/src/ui/mw/mainmenu_cb.cc
+++ b/src/ui/mw/mainmenu_cb.cc
@@ -181,12 +181,12 @@ iExpBasicSADetectUltradianCycles_activate_cb(
        CExpDesign::TEpisodeFilterFun filter =
                [&ED]( agh::CSubject::SEpisode& E) -> bool
        {
-               return E.recordings.find( ED.AghH()) != E.recordings.end();
+               return E.recordings.find( *ED._AghHi) != E.recordings.end();
        };
        CExpDesign::TEpisodeOpFun F =
                [&ED]( agh::CSubject::SEpisode& E)
        {
-               ED.do_detect_ultradian_cycle( E.recordings.at( ED.AghH()));
+               ED.do_detect_ultradian_cycle( E.recordings.at( *ED._AghHi));
        };
        CExpDesign::TEpisodeReportFun reporter =
                [&ED]( const agh::CJGroup&, const agh::CSubject& J, const 
string&, const agh::CSubject::SEpisode& E,
@@ -253,7 +253,7 @@ iExpGloballyDetectArtifacts_activate_cb(
                {
                        snprintf_buf(
                                "Detect artifacts in %s/%s/%s/%s:%s",
-                               ED.ED->group_of(J), J.id.c_str(), D.c_str(), 
E.name(), R.F().channel_by_id(R.h()));
+                               ED.ED->group_of(J), J.id.c_str(), D.c_str(), 
E.name(), R.F().channel_by_id(R.h()).name());
                        ED.sb_main_progress_indicator( __buf__, total, i, 
TGtkRefreshMode::gtk);
                };
        switch ( response ) {
@@ -286,7 +286,7 @@ iExpGloballyDetectArtifacts_activate_cb(
                {
                        auto& F = R.F();
                        for ( auto& H : F.channel_list() ) {
-                               auto&   af = F.artifacts(H.c_str());
+                               auto&   af = F.artifacts(H);
                                af.clear_all();
                        }
                };
@@ -363,7 +363,7 @@ iExpGloballySetFilters_activate_cb(
                                        for ( auto &E : D.second.episodes )
                                                for ( auto &F : E.sources )
                                                        for ( auto &H : 
F().channel_list() ) {
-                                                               auto& ff = 
F().filters(H.c_str());
+                                                               auto& ff = 
F().filters(H);
                                                                
ff.low_pass_cutoff = LPC;
                                                                
ff.low_pass_order = LPO;
                                                                
ff.high_pass_cutoff = HPC;
diff --git a/src/ui/mw/measurements.cc b/src/ui/mw/measurements.cc
index c1e54e0..137212c 100644
--- a/src/ui/mw/measurements.cc
+++ b/src/ui/mw/measurements.cc
@@ -218,7 +218,7 @@ draw_timeline( cairo_t *cr) const
 
                      // ultradian cycle
                        if ( _p._p.draw_nremrem_cycles ) {
-                               auto& M = E.recordings.at(_p._p.AghT());
+                               auto& M = E.recordings.at(*_p._p._AghTi);
                                if ( M.have_uc_determined() ) {
                                        agh::beersma::FUltradianCycle F 
(*M.uc_params);
                                        snprintf_buf( "T: %g  r: %g", F.T, F.r);
diff --git a/src/ui/mw/measurements_cb.cc b/src/ui/mw/measurements_cb.cc
index fc780a3..a07fcc5 100644
--- a/src/ui/mw/measurements_cb.cc
+++ b/src/ui/mw/measurements_cb.cc
@@ -178,7 +178,7 @@ iSubjectTimelineDetectUltradianCycle_activate_cb(
        auto& ED = *(SExpDesignUI*)userdata;
        agh::CSubject::SEpisode *Ep;
        if ( ED.using_subject && (Ep = ED.using_subject->using_episode) ) {
-               auto& R = Ep->recordings.at(ED.AghH());
+               auto& R = Ep->recordings.at(*ED._AghHi);
                SBusyBlock bb (ED.wMainWindow);
                ED.do_detect_ultradian_cycle( R);
        }
diff --git a/src/ui/mw/mw.cc b/src/ui/mw/mw.cc
index 1e16ddf..087e397 100644
--- a/src/ui/mw/mw.cc
+++ b/src/ui/mw/mw.cc
@@ -588,12 +588,12 @@ sb_clear() const
 
 void
 aghui::SExpDesignUI::
-sb_main_progress_indicator( const char* current,
+sb_main_progress_indicator( const string& current,
                            const size_t n, const size_t i,
                            const aghui::TGtkRefreshMode mode)
 {
        DEF_UNIQUE_CHARP (b);
-       ASPRINTF( &b, "(%zu of %zu) %s", i, n, current);
+       ASPRINTF( &b, "(%zu of %zu) %s", i, n, current.c_str());
        sb_message( b);
 
        switch ( mode ) {
diff --git a/src/ui/mw/mw.hh b/src/ui/mw/mw.hh
index 26e9914..2bb0524 100644
--- a/src/ui/mw/mw.hh
+++ b/src/ui/mw/mw.hh
@@ -178,8 +178,8 @@ class SExpDesignUI
                _AghHi, _AghTi;
        list<string>::iterator
                _AghGi, _AghDi, _AghEi;
-       const char* AghH() const { return (_AghHi != AghHH.end()) ? 
_AghHi->c_str() : "(invalid channel)"; }
-       const char* AghT() const { return (_AghTi != AghTT.end()) ? 
_AghTi->c_str() : "(invalid channel)"; }
+       const char* AghH() const { return (_AghHi != AghHH.end()) ? 
_AghHi->name() : "(invalid channel)"; }
+       const char* AghT() const { return (_AghTi != AghTT.end()) ? 
_AghTi->name() : "(invalid channel)"; }
        const char* AghG() const { return (_AghGi != AghGG.end()) ? 
_AghGi->c_str() : "(invalid group)"; }
        const char* AghD() const { return (_AghDi != AghDD.end()) ? 
_AghDi->c_str() : "(invalid session)"; }
        const char* AghE() const { return (_AghEi != AghEE.end()) ? 
_AghEi->c_str() : "(invalid episode)"; }
@@ -333,7 +333,7 @@ class SExpDesignUI
       // status bar bits
        void sb_message( const char*) const;
        void sb_clear() const;
-       void sb_main_progress_indicator( const char*, size_t n, size_t i,
+       void sb_main_progress_indicator( const string&, size_t n, size_t i,
                                         aghui::TGtkRefreshMode);
 
       // dnd
diff --git a/src/ui/mw/populate.cc b/src/ui/mw/populate.cc
index f156a29..43acff7 100644
--- a/src/ui/mw/populate.cc
+++ b/src/ui/mw/populate.cc
@@ -45,8 +45,8 @@ populate( bool do_load)
                "*     Episodes: %s\n",
                agh::str::join( AghDD, "; ").c_str(),
                agh::str::join( AghGG, "; ").c_str(),
-               agh::str::join( AghHH, "; ").c_str(),
-               agh::str::join( AghTT, "; ").c_str(),
+               sigfile::join_channel_names( AghHH, "; ").c_str(),
+               sigfile::join_channel_names( AghTT, "; ").c_str(),
                agh::str::join( AghEE, "; ").c_str());
 
        used_samplerates =
@@ -78,8 +78,9 @@ populate( bool do_load)
        }
        ED->last_used_version = VERSION;
 
-       snprintf_buf( "Smooth: %zu", smooth_profile);
-       gtk_button_set_label( (GtkButton*)eMsmtProfileSmooth, __buf__);
+       gtk_button_set_label(
+               (GtkButton*)eMsmtProfileSmooth,
+               (snprintf_buf( "Smooth: %zu", smooth_profile), __buf__));
 
        if ( AghTT.empty() )
                aghui::pop_ok_message( wMainWindow,
@@ -209,7 +210,7 @@ populate_mChannels()
                GtkTreeIter iter;
                gtk_list_store_append( mEEGChannels, &iter);
                gtk_list_store_set( mEEGChannels, &iter,
-                                   0, H.c_str(),
+                                   0, H.name(),
                                    -1);
        }
 
@@ -217,7 +218,7 @@ populate_mChannels()
                GtkTreeIter iter;
                gtk_list_store_append( mAllChannels, &iter);
                gtk_list_store_set( mAllChannels, &iter,
-                                   0, H.c_str(),
+                                   0, H.name(),
                                    -1);
        }
 
diff --git a/src/ui/mw/simulations_cb.cc b/src/ui/mw/simulations_cb.cc
index b0d4b80..2e23e2b 100644
--- a/src/ui/mw/simulations_cb.cc
+++ b/src/ui/mw/simulations_cb.cc
@@ -48,7 +48,7 @@ iSimulationsRunBatch_activate_cb(
 
        gtk_entry_set_text( ED.eBatchSetupSubjects, agh::str::join( 
ED.ED->enumerate_subjects(), "; ").c_str());
        gtk_entry_set_text( ED.eBatchSetupSessions, agh::str::join( 
ED.ED->enumerate_sessions(), "; ").c_str());
-       gtk_entry_set_text( ED.eBatchSetupChannels, agh::str::join( 
ED.ED->enumerate_eeg_channels(), "; ").c_str());
+       gtk_entry_set_text( ED.eBatchSetupChannels, 
sigfile::join_channel_names( ED.ED->enumerate_eeg_channels(), "; ").c_str());
 
       // prevent inapplicable inputs when type == mc
        switch ( ED.display_profile_type ) {
diff --git a/src/ui/sf/channel.cc b/src/ui/sf/channel.cc
index ae9d237..e4ecbc3 100644
--- a/src/ui/sf/channel.cc
+++ b/src/ui/sf/channel.cc
@@ -33,7 +33,6 @@ SChannel (agh::CRecording& r,
          size_t y0,
          int seq)
       : name (r.channel()),
-       type (r.signal_type()),
        crecording (r),
        _h (r.F().channel_id(name)),
        filters (r.F().filters(name)),
@@ -111,7 +110,7 @@ SChannel (agh::CRecording& r,
        // get_raw_profile(); // too heavy; make it on-demand
 
       // psd power and spectrum, mc
-       if ( sigfile::SChannel::signal_type_is_fftable( type) ) {
+       if ( schannel().is_fftable() ) {
              // power in a single bin
                psd.from = _p._p.active_profile_psd_freq_from;
                psd.upto = _p._p.active_profile_psd_freq_upto;
@@ -165,7 +164,7 @@ aghui::SScoringFacility::SChannel::
 get_signal_original()
 {
        signal_original =
-               crecording.F().get_signal_original( name);
+               crecording.F().get_signal_original( _h);
        // signal_original_resampled =
        //      sigproc::resample( signal_original, 0, signal_original.size(),
        //                         signal_original.size() / spp());
@@ -179,7 +178,7 @@ aghui::SScoringFacility::SChannel::
 get_signal_filtered()
 {
        signal_filtered =
-               crecording.F().get_signal_filtered( name);
+               crecording.F().get_signal_filtered( _h);
        // filtered is already zeromean as shipped
        drop_cached_signal_properties();
 }
@@ -194,7 +193,7 @@ aghui::SScoringFacility::SChannel::
 in_annotations( const double time) const
 {
        // select this channel's annotations
-       auto& annotations = crecording.F().annotations(name);
+       auto& annotations = crecording.F().annotations(_h);
        list<sigfile::SAnnotation*>
                ret;
        for ( auto &A : annotations )
diff --git a/src/ui/sf/d/patterns.cc b/src/ui/sf/d/patterns.cc
index 96965b9..f0b5993 100644
--- a/src/ui/sf/d/patterns.cc
+++ b/src/ui/sf/d/patterns.cc
@@ -274,7 +274,7 @@ update_field_check_menu_items()
        suppress_redraw = true;
        gtk_check_menu_item_set_active( iSFFDFieldDrawMatchIndex, 
draw_match_index);
 
-       if ( not sigfile::SChannel::signal_type_is_fftable( 
field_channel->type) ) {
+       if ( not field_channel->schannel().is_fftable() ) {
                field_profile_type = metrics::TType::raw;
                gtk_widget_set_visible( (GtkWidget*)iiSFFDFieldProfileTypes, 
FALSE);
        } else
diff --git a/src/ui/sf/montage.cc b/src/ui/sf/montage.cc
index 2008dcd..f796a1e 100644
--- a/src/ui/sf/montage.cc
+++ b/src/ui/sf/montage.cc
@@ -571,7 +571,7 @@ draw_page( cairo_t *cr,
        {
                int x = 15, y = y0 - 16;
 
-               snprintf_buf( "[%s] %s", 
sigfile::SChannel::kemp_signal_types[type], name.c_str());
+               snprintf_buf( "[%s] %s", schannel().type_s(), 
schannel().name());
                cairo_select_font_face( cr, "serif", CAIRO_FONT_SLANT_ITALIC, 
CAIRO_FONT_WEIGHT_BOLD);
                cairo_set_font_size( cr, 14);
 
diff --git a/src/ui/sf/sf.cc b/src/ui/sf/sf.cc
index 6d26dec..7a74c50 100644
--- a/src/ui/sf/sf.cc
+++ b/src/ui/sf/sf.cc
@@ -400,7 +400,7 @@ aghui::SScoringFacility::
 update_all_channels_profile_display_scale()
 {
        for ( auto& H : channels )
-               if ( sigfile::SChannel::signal_type_is_fftable( H.type) )
+               if ( H.schannel().is_fftable() )
                        H.update_profile_display_scales();
 }
 
diff --git a/src/ui/sf/sf.hh b/src/ui/sf/sf.hh
index 80256d5..00cbcbf 100644
--- a/src/ui/sf/sf.hh
+++ b/src/ui/sf/sf.hh
@@ -81,6 +81,9 @@ class SScoringFacility
                agh::CRecording&
                        crecording;
                int     _h;
+               const sigfile::SChannel&
+               schannel() const
+                       { return crecording.F().channel_by_id(_h); }
                sigfile::SFilterPack&
                        filters;
                list<sigfile::SAnnotation>&

-- 
Sleep experiment manager

_______________________________________________
debian-med-commit mailing list
[email protected]
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/debian-med-commit

Reply via email to