[med-svn] [SCM] aghermann branch, master, updated. c0bd21ca8eb529ade7e0c7aad22951a308a8dc8f

Andrei Zavada johnhommer at gmail.com
Wed May 1 00:09:41 UTC 2013


The following commit has been merged in the master branch:
commit fb1da0b4335d9745efe7670ab4f58b9533aa83b2
Author: Andrei Zavada <johnhommer at gmail.com>
Date:   Mon Apr 29 01:43:53 2013 +0300

    sigfile::SChannel overhaul WIP

diff --git a/src/expdesign/primaries.hh b/src/expdesign/primaries.hh
index 0e18d99..e33f1cf 100644
--- a/src/expdesign/primaries.hh
+++ b/src/expdesign/primaries.hh
@@ -156,7 +156,7 @@ class CSubject : public SSubjectId {
 			const char*
 			channel() const
 				{
-					return (_h == -1) ? "(embedded)" : _source.channel_by_id(_h);
+					return (_h == -1) ? "(embedded)" : _source.channel_by_id(_h).name();
 				}
 			agh::alg::SSpan<float>
 			page_span( size_t pagesize) const
diff --git a/src/expdesign/recording.hh b/src/expdesign/recording.hh
index 71b66fd..fe08eea 100644
--- a/src/expdesign/recording.hh
+++ b/src/expdesign/recording.hh
@@ -156,7 +156,7 @@ class CRecording {
 	const char* subject() const      {  return _source().subject().name.c_str(); }
 	const char* session() const      {  return _source().session(); }
 	const char* episode() const      {  return _source().episode(); }
-	const char* channel() const      {  return _source().channel_by_id(_sig_no); }
+	const char* channel() const      {  return _source().channel_by_id(_sig_no).name(); }
 
 	sigfile::SChannel::TType signal_type() const
 		{
diff --git a/src/libsigfile/edf.cc b/src/libsigfile/edf.cc
index a5244f9..021638c 100644
--- a/src/libsigfile/edf.cc
+++ b/src/libsigfile/edf.cc
@@ -39,9 +39,9 @@ using agh::str::tokens_trimmed;
 using sigfile::CEDFFile;
 
 template valarray<TFloat> CEDFFile::get_region_original_( int, size_t, size_t) const;
-template valarray<TFloat> CEDFFile::get_region_original_( const string&, size_t, size_t) const;
+template valarray<TFloat> CEDFFile::get_region_original_( const SChannel&, size_t, size_t) const;
 template valarray<TFloat> CEDFFile::get_region_filtered_( int, size_t, size_t) const;
-template valarray<TFloat> CEDFFile::get_region_filtered_( const string&, size_t, size_t) const;
+template valarray<TFloat> CEDFFile::get_region_filtered_( const SChannel&, size_t, size_t) const;
 template int CEDFFile::put_region_( int, const valarray<TFloat>&, size_t) const;
 template int CEDFFile::put_region_( const string&, const valarray<TFloat>&, size_t) const;
 template int CEDFFile::export_original_( int, const string&) const;
@@ -119,9 +119,6 @@ const char version_string[8]  = {'0',' ',' ',' ', ' ',' ',' ',' '};
 
 }
 
-const char* CEDFFile::SSignal::edf_annotations_label =
-	sigfile::SChannel::kemp_signal_types[sigfile::SChannel::embedded_annotation];
-
 
 CEDFFile::
 CEDFFile (const string& fname_, const int flags_)
@@ -193,7 +190,7 @@ CEDFFile (const string& fname_, const int flags_)
 	else {
 	      // 1. artifacts, per signal
 		for ( auto &H : channels ) {
-			ifstream thomas (make_fname_artifacts( H.label));
+			ifstream thomas (make_fname_artifacts( H.ucd));
 			if ( not thomas.good() )
 				continue;
 
@@ -208,7 +205,7 @@ CEDFFile (const string& fname_, const int flags_)
 
 	      // 2. annotations, per signal
 		for ( auto &H : channels ) {
-			ifstream fd (make_fname_annotations( H.label));
+			ifstream fd (make_fname_annotations( H.ucd));
 			if ( not fd.good() )
 				continue;
 			while ( fd.good() and not fd.eof() ) {
@@ -260,7 +257,7 @@ CEDFFile (const string& fname_, const int flags_)
 
 CEDFFile::
 CEDFFile (const string& fname_, const TSubtype subtype_, const int flags_,
-	  const list<pair<string, size_t>>& channels_,
+	  const list<pair<SChannel, size_t>>& channels_,
 	  const size_t data_record_size_,
 	  const size_t n_data_records_)
       : CSource (fname_, flags_),
@@ -318,8 +315,9 @@ CEDFFile (const string& fname_, const TSubtype subtype_, const int flags_,
 	for ( auto& h : channels_ ) {
 		auto& H = channels[hi];
 
+		H.ucd = h.first;
 		strncpy( H.header.label,
-			 pad( H.label = h.first, 16).c_str(), 16);
+			 pad( H.ucd.name(), 16).c_str(), 16);
 
 		strncpy( H.header.transducer_type,
 			 pad( H.transducer_type = "no transducer info", 80).c_str(), 80);
@@ -445,19 +443,19 @@ write_ancillary_files()
 {
 	for ( auto &I : channels ) {
 		if ( not I.artifacts().empty() ) {
-			ofstream thomas (make_fname_artifacts( I.label), ios_base::trunc);
+			ofstream thomas (make_fname_artifacts( I.ucd), ios_base::trunc);
 			if ( thomas.good() )
 				for ( auto &A : I.artifacts() )
 					thomas << A.a << ' ' << A.z << endl;
 		} else
-			if ( unlink( make_fname_artifacts( I.label).c_str()) ) {}
+			if ( unlink( make_fname_artifacts( I.ucd).c_str()) ) {}
 
 		if ( not I.annotations.empty() ) {
-			ofstream thomas (make_fname_annotations( I.label), ios_base::trunc);
+			ofstream thomas (make_fname_annotations( I.ucd), ios_base::trunc);
 			for ( auto &A : I.annotations )
 				thomas << (int)A.type << ' ' << A.span.a << ' ' << A.span.z << ' ' << A.label << EOA << endl;
 		} else
-			if ( unlink( make_fname_annotations( I.label).c_str()) ) {}
+			if ( unlink( make_fname_annotations( I.ucd).c_str()) ) {}
 	}
 	ofstream thomas (make_fname_filters( filename()), ios_base::trunc);
 	if ( thomas.good() )
@@ -677,9 +675,8 @@ _parse_header()
 			channels.resize( n_channels);
 
 			for ( auto &H : channels )
-				H.label =
-					trim( string (_get_next_field( H.header.label, 16), 16));
-			        // to be parsed again wrt SignalType:Channel format
+				H.ucd =	trim( string (_get_next_field( H.header.label, 16), 16));
+				// includes figuring signal type and mapping to a canonicalised name
 
 			for ( auto &H : channels )
 				H.transducer_type =
@@ -691,7 +688,7 @@ _parse_header()
 
 			for ( auto &H : channels ) {
 				_get_next_field( H.header.physical_min, 8);
-				if ( H.label == SSignal::edf_annotations_label )
+				if ( H.ucd.type() == sigfile::SChannel::TType::embedded_annotation )
 					continue;
 				if ( sscanf( H.header.physical_min, "%8lg",
 					     &H.physical_min) != 1 ) {
@@ -702,7 +699,7 @@ _parse_header()
 			}
 			for ( auto &H : channels ) {
 				_get_next_field( H.header.physical_max, 8);
-				if ( H.label == SSignal::edf_annotations_label )
+				if ( H.ucd.type() == sigfile::SChannel::TType::embedded_annotation )
 					continue;
 				if ( sscanf( H.header.physical_max, "%8lg",
 					     &H.physical_max) != 1 ) {
@@ -714,7 +711,7 @@ _parse_header()
 
 			for ( auto &H : channels ) {
 				_get_next_field( H.header.digital_min, 8);
-				if ( H.label == SSignal::edf_annotations_label )
+				if ( H.ucd.type() == sigfile::SChannel::TType::embedded_annotation )
 					continue;
 				if ( sscanf( H.header.digital_min, "%8d",
 					     &H.digital_min) != 1 ) {
@@ -725,7 +722,7 @@ _parse_header()
 			}
 			for ( auto &H : channels ) {
 				_get_next_field( H.header.digital_max, 8);
-				if ( H.label == SSignal::edf_annotations_label )
+				if ( H.ucd.type() == sigfile::SChannel::TType::embedded_annotation )
 					continue;
 				if ( sscanf( H.header.digital_max, "%8d",
 					     &H.digital_max) != 1 ) {
@@ -765,7 +762,7 @@ _parse_header()
 
       // calculate gain
 	for ( auto &H : channels )
-		if ( H.label != SSignal::edf_annotations_label ) {
+		if ( H.ucd.type() == sigfile::SChannel::TType::embedded_annotation ) {
 			if ( H.physical_max <= H.physical_min ||
 			     H.digital_max  <= H.digital_min  ) {
 				_status |= nogain;
@@ -781,10 +778,11 @@ _parse_header()
       // determine & validate signal types
 	i = 0;
 	for ( auto &H : channels ) {
-		if ( H.label == SSignal::edf_annotations_label )
-			H.signal_type = SChannel::TType::embedded_annotation;
+		if ( H.ucd.type() == sigfile::SChannel::TType::embedded_annotation )
+			;
 		else {
-			auto tt = agh::str::tokens( H.label, " ");
+			??? move this up right after SChannel ctor
+			auto tt = agh::str::tokens( H.name, " ");
 			SChannel::TType figured_type;
 			// parse legacy pre 0.9 specs ("EEG F3" etc)
 			if ( tt.size() > 1 &&
@@ -792,12 +790,12 @@ _parse_header()
 			     != SChannel::TType::other ) {
 				H.signal_type = figured_type;
 				H.signal_type_s = tt.front();
-				H.label = (tt.pop_front(), agh::str::join( tt, " "));
-				if ( not H.label.follows_system1020() )
+				H.name = (tt.pop_front(), agh::str::join( tt, " "));
+				if ( not H.name.follows_system1020() )
 					_status |= non1020_channel;
 			} else {
 				H.signal_type_s = SChannel::kemp_signal_types[
-					H.signal_type = SChannel::signal_type_of_channel( H.label) ];
+					H.signal_type = SChannel::signal_type_of_channel( H.name) ];
 
 				if ( not H.label.follows_system1020() )
 					_status |= non1020_channel;
@@ -839,7 +837,7 @@ int
 CEDFFile::
 _extract_embedded_annotations()
 {
-	auto S = find( channels.begin(), channels.end(), SSignal::edf_annotations_label);
+	auto S = find( channels.begin(), channels.end(), sigfile::edf_annotations_label);
 	if ( S == channels.end() )
 		return 0;
 	auto& AH = *S;
diff --git a/src/libsigfile/edf.hh b/src/libsigfile/edf.hh
index 49a45d6..265986d 100644
--- a/src/libsigfile/edf.hh
+++ b/src/libsigfile/edf.hh
@@ -83,7 +83,7 @@ class CEDFFile
 	CEDFFile (const string& fname, int flags = 0);
 	// create new
 	CEDFFile (const string& fname, TSubtype subtype_, int flags,
-		  const list<pair<string, size_t>>& channels,
+		  const list<pair<SChannel, size_t>>& channels,
 		  size_t data_record_size = 1,
 		  size_t n_data_records = 0);
 	CEDFFile (CEDFFile&& rv);
@@ -135,53 +135,51 @@ class CEDFFile
 		{
 			list<SChannel> ret;
 			for ( auto &H : channels )
-				ret.push_back( H.label);
+				ret.push_back( H.ucd);
 			return ret;
 		}
 	bool
-	have_channel( const string& h) const
+	have_channel( const SChannel& h) const
 		{ return find( channels.cbegin(), channels.cend(), h) != channels.cend(); }
 	int
-	channel_id( const string& h) const
+	channel_id( const SChannel& h) const
 		{
-			for ( size_t i = 0; i < channels.size(); i++ )
-				if ( channels[i].label == h )
+			for ( size_t i = 0; i < channels.size(); ++i )
+				if ( channels[i].ucd == h )
 					return i;
 			return -1;
 		}
-	const char*
+	const SChannel&
 	channel_by_id( int h) const
 		{
-			if ( likely (h < (int)channels.size()) )
-				return channels[h].label.c_str();
-			return nullptr;
+			return channels[h].ucd; // throws
 		}
 
 	SChannel::TType
 	signal_type( int h) const
-		{ return (*this)[h].signal_type; }
+		{ return (*this)[h].ucd.type(); }
 	SChannel::TType
-	signal_type( const string& h) const
-		{ return (*this)[h].signal_type; }
+	signal_type( const SChannel& h) const
+		{ return (*this)[h].ucd.type(); }
 
 	size_t
 	samplerate( int h) const
 		{ return (*this)[h].samples_per_record / data_record_size; }
 	size_t
-	samplerate( const string& h) const
+	samplerate( const SChannel& h) const
 		{ return (*this)[h].samples_per_record / data_record_size; }
 
 	list<SAnnotation>&
 	annotations( int h)
 		{ return (*this)[h].annotations; }
 	list<SAnnotation>&
-	annotations( const string& h)
+	annotations( const SChannel& h)
 		{ return (*this)[h].annotations; }
 	const list<SAnnotation>&
 	annotations( int h) const
 		{ return (*this)[h].annotations; }
 	const list<SAnnotation>&
-	annotations( const string& h) const
+	annotations( const SChannel& h) const
 		{ return (*this)[h].annotations; }
 
 	list<SAnnotation>&
@@ -196,13 +194,13 @@ class CEDFFile
 	artifacts( int h)
 		{ return (*this)[h].artifacts; }
 	SArtifacts&
-	artifacts( const string& h)
+	artifacts( const SChannel& h)
 		{ return (*this)[h].artifacts; }
 	const SArtifacts&
 	artifacts( int h) const
 		{ return (*this)[h].artifacts; }
 	const SArtifacts&
-	artifacts( const string& h) const
+	artifacts( const SChannel& h) const
 		{ return (*this)[h].artifacts; }
 
 	// filters
@@ -210,26 +208,26 @@ class CEDFFile
 	filters( int h)
 		{ return (*this)[h].filters; }
 	SFilterPack&
-	filters( const string& h)
+	filters( const SChannel& h)
 		{ return (*this)[h].filters; }
 	const SFilterPack&
 	filters( int h) const
 		{ return (*this)[h].filters; }
 	const SFilterPack&
-	filters( const string& h) const
+	filters( const SChannel& h) const
 		{ return (*this)[h].filters; }
 
 
       // signal data extractors
-	template <class Th>  // accommodates int or const string& as Th
+	template <class Th>  // accommodates int or const SChannel& as Th
 	valarray<TFloat>
 	get_region_original_( Th h, size_t smpla, size_t smplz) const;
 	valarray<TFloat>
 	get_region_original( int h, size_t smpla, size_t smplz) const
 		{ return get_region_original_<int>( h, smpla, smplz); }
 	valarray<TFloat>
-	get_region_original( const string& h, size_t smpla, size_t smplz) const
-		{ return get_region_original_<const string&>( h, smpla, smplz); }
+	get_region_original( const SChannel& h, size_t smpla, size_t smplz) const
+		{ return get_region_original_<const SChannel&>( h, smpla, smplz); }
 
 	template <class Th>
 	valarray<TFloat>
@@ -245,9 +243,9 @@ class CEDFFile
 			     float timea, float timez) const
 		{ return get_region_original_<int>( h, timea, timez); }
 	valarray<TFloat>
-	get_region_original( const string& h,
+	get_region_original( const SChannel& h,
 			     float timea, float timez) const
-		{ return get_region_original_<const string&>( h, timea, timez); }
+		{ return get_region_original_<const SChannel&>( h, timea, timez); }
 
 	template <class Th>
 	valarray<TFloat>
@@ -257,7 +255,7 @@ class CEDFFile
 	get_signal_original( int h) const
 		{ return get_signal_original_( h); }
 	valarray<TFloat>
-	get_signal_original( const string& h) const
+	get_signal_original( const SChannel& h) const
 		{ return get_signal_original_( h); }
 
 	template <class Th>
@@ -269,7 +267,7 @@ class CEDFFile
 			     size_t smpla, size_t smplz) const
 		{ return get_region_filtered_( h, smpla, smplz); }
 	valarray<TFloat>
-	get_region_filtered( const string& h,
+	get_region_filtered( const SChannel& h,
 			     size_t smpla, size_t smplz) const
 		{ return get_region_filtered_( h, smpla, smplz); }
 	template <class Th>
@@ -286,7 +284,7 @@ class CEDFFile
 			     float timea, float timez) const
 		{ return get_region_filtered_( h, timea, timez); }
 	valarray<TFloat>
-	get_region_filtered( const string& h,
+	get_region_filtered( const SChannel& h,
 			     float timea, float timez) const
 		{ return get_region_filtered_( h, timea, timez); }
 	template <class Th>
@@ -302,7 +300,7 @@ class CEDFFile
 	put_region( int h, const valarray<TFloat>& src, size_t offset) const
 		{ return put_region_( h, src, offset); }
 	int
-	put_region( const string& h, const valarray<TFloat>& src, size_t offset) const
+	put_region( const SChannel& h, const valarray<TFloat>& src, size_t offset) const
 		{ return put_region_( h, src, offset); }
 
 	template <class Th>
@@ -320,12 +318,12 @@ class CEDFFile
 	put_signal( int h, const valarray<TFloat>& src) const
 		{ return put_signal_( h, src); }
 	int
-	put_signal( const string& h, const valarray<TFloat>& src) const
+	put_signal( const SChannel& h, const valarray<TFloat>& src) const
 		{ return put_signal_( h, src); }
 
       // signal data info
 	pair<TFloat, TFloat>
-	get_real_original_signal_range( const string& h) const
+	get_real_original_signal_range( const SChannel& h) const
 		{ return get_real_original_signal_range( channel_id(h)); }
 	pair<TFloat, TFloat>
 	get_real_original_signal_range( int h) const
@@ -335,7 +333,7 @@ class CEDFFile
 		}
 
 	pair<TFloat, TFloat>
-	get_max_original_signal_range( const string& h) const
+	get_max_original_signal_range( const SChannel& h) const
 		{ return get_max_original_signal_range( channel_id(h)); }
 	pair<TFloat, TFloat>
 	get_max_original_signal_range( int h) const
@@ -343,7 +341,7 @@ class CEDFFile
 
 
 	pair<TFloat, TFloat>
-	get_real_filtered_signal_range( const string& h) const
+	get_real_filtered_signal_range( const SChannel& h) const
 		{ return get_real_filtered_signal_range( channel_id(h)); }
 	pair<TFloat, TFloat>
 	get_real_filtered_signal_range( int h) const
@@ -353,7 +351,7 @@ class CEDFFile
 		}
 
 	pair<TFloat, TFloat>
-	get_max_filtered_signal_range( const string& h) const
+	get_max_filtered_signal_range( const SChannel& h) const
 		{ return get_max_filtered_signal_range( channel_id(h)); }
 	pair<TFloat, TFloat>
 	get_max_filtered_signal_range( int h) const
@@ -374,10 +372,10 @@ class CEDFFile
 	export_filtered( int h, const string& fname) const
 		{ return export_filtered_( h, fname); }
 	int
-	export_original( const string& h, const string& fname) const
+	export_original( const SChannel& h, const string& fname) const
 		{ return export_original_( h, fname); }
 	int
-	export_filtered( const string& h, const string& fname) const
+	export_filtered( const SChannel& h, const string& fname) const
 		{ return export_filtered_( h, fname); }
 	template <class Th>
 	int export_original_( Th h, const string& fname) const;
@@ -429,12 +427,8 @@ class CEDFFile
 		};
 		SEDFSignalHeader
 	    		header;
-		string	signal_type_s; // although SChannel:: has all known types including "(unknown)", some
-				       // users will freak out and want their own
-		SChannel::TType
-			signal_type;
 		SChannel
-			label;
+			ucd; // Universal Channel Designation, епта
 		string	transducer_type,
 			physical_dim,
 			filtering_info,
@@ -449,9 +443,9 @@ class CEDFFile
 		void set_digital_range( int16_t, int16_t);
 		size_t	samples_per_record;
 
-		bool operator==( const string& h) const
+		bool operator==( const SChannel& h) const
 			{
-				return label == h;
+				return ucd.name() == h.name();
 			}
 
 		list<SAnnotation>
@@ -484,14 +478,14 @@ class CEDFFile
 				throw out_of_range ("Signal index out of range");
 			return channels[i];
 		}
-	SSignal& operator[]( const string& h)
+	SSignal& operator[]( const SChannel& h)
 		{
 			auto S = find( channels.begin(), channels.end(), h);
 			if ( S == channels.end() )
-				throw out_of_range (string ("Unknown channel ") + h);
+				throw out_of_range (string ("Unknown channel ") + h.name());
 			return *S;
 		}
-	const SSignal& operator[]( const string& h) const
+	const SSignal& operator[]( const SChannel& h) const
 		{
 			return (*const_cast<CEDFFile*>(this)) [h];
 		}
diff --git a/src/libsigfile/edf.ii b/src/libsigfile/edf.ii
index f547d45..390cd0a 100644
--- a/src/libsigfile/edf.ii
+++ b/src/libsigfile/edf.ii
@@ -11,13 +11,13 @@
 
 
 extern template valarray<TFloat> CEDFFile::get_region_original_( int, size_t, size_t) const;
-extern template valarray<TFloat> CEDFFile::get_region_original_( const string&, size_t, size_t) const;
+extern template valarray<TFloat> CEDFFile::get_region_original_( const SChannel&, size_t, size_t) const;
 extern template valarray<TFloat> CEDFFile::get_region_filtered_( int, size_t, size_t) const;
-extern template valarray<TFloat> CEDFFile::get_region_filtered_( const string&, size_t, size_t) const;
+extern template valarray<TFloat> CEDFFile::get_region_filtered_( const SChannel&, size_t, size_t) const;
 extern template int CEDFFile::put_region_( int, const valarray<TFloat>&, size_t) const;
-extern template int CEDFFile::put_region_( const string&, const valarray<TFloat>&, size_t) const;
+extern template int CEDFFile::put_region_( const SChannel&, const valarray<TFloat>&, size_t) const;
 extern template int CEDFFile::export_original_( int, const string&) const;
-extern template int CEDFFile::export_original_( const string&, const string&) const;
+extern template int CEDFFile::export_original_( const SChannel&, const string&) const;
 
 
 template <typename A>
diff --git a/src/libsigfile/source-base.hh b/src/libsigfile/source-base.hh
index 9357e89..5d9be26 100644
--- a/src/libsigfile/source-base.hh
+++ b/src/libsigfile/source-base.hh
@@ -38,14 +38,14 @@ inline string
 make_fname_artifacts( const string& _filename, const SChannel& channel)
 {
 	return agh::fs::make_fname_base( _filename, ".edf", true)
-		+ "-" + channel + ".af";
+		+ "-" + channel.name() + ".af";
 }
 
 inline string
 make_fname_annotations( const string& _filename, const SChannel& channel)
 {
 	return agh::fs::make_fname_base( _filename, ".edf", true)
-		+ "-" + channel + ".annotations";
+		+ "-" + channel.name() + ".annotations";
 }
 
 inline string
@@ -237,23 +237,23 @@ class CSource {
       // channels
 	virtual size_t n_channels()			const = 0;
 	virtual list<SChannel> channel_list()		const = 0;
-	virtual bool have_channel( const string&) 	const = 0;
-	virtual int channel_id( const string&)		const = 0;
-	virtual const char* channel_by_id( int)		const = 0;
+	virtual bool have_channel( const SChannel&) 	const = 0;
+	virtual int channel_id( const SChannel&)	const = 0;
+	virtual const SChannel& channel_by_id( int)	const = 0;
 	virtual SChannel::TType
-	signal_type( const string&)			const = 0;
+	signal_type( const SChannel&)			const = 0;
 	virtual SChannel::TType
 	signal_type( int)				const = 0;
-	virtual size_t samplerate( const string&)	const = 0;
+	virtual size_t samplerate( const SChannel&)	const = 0;
 	virtual size_t samplerate( int)			const = 0;
 
 	// the following methods are pass-through:
 	// 1. annotations
 	// (a) per-channel
 	virtual list<SAnnotation>&
-	annotations( const string&)		      = 0;
+	annotations( const SChannel&)		      = 0;
 	virtual const list<SAnnotation>&
-	annotations( const string&) const	      = 0;
+	annotations( const SChannel&) const	      = 0;
 	virtual list<SAnnotation>&
 	annotations( int)			      = 0;
 	virtual const list<SAnnotation>&
@@ -267,21 +267,21 @@ class CSource {
 
 	// artifacts
 	virtual SArtifacts&
-	artifacts( const string&)		      = 0;
+	artifacts( const SChannel&)		      = 0;
 	virtual SArtifacts&
 	artifacts( int)				      = 0;
 	virtual const SArtifacts&
-	artifacts( const string&)		const = 0;
+	artifacts( const SChannel&)		const = 0;
 	virtual const SArtifacts&
 	artifacts( int)				const = 0;
 
 	// filters
 	virtual SFilterPack&
-	filters( const string&)			      = 0;
+	filters( const SChannel&)			      = 0;
 	virtual SFilterPack&
 	filters( int)				      = 0;
 	virtual const SFilterPack&
-	filters( const string&)			const = 0;
+	filters( const SChannel&)			const = 0;
 	virtual const SFilterPack&
 	filters( int)				const = 0;
 
@@ -303,9 +303,9 @@ class CSource {
       // get samples
 	// original
 	virtual valarray<TFloat>
-	get_region_original( const string& h, size_t, size_t) const = 0;
+	get_region_original( const SChannel&, size_t, size_t) const = 0;
 	virtual valarray<TFloat>
-	get_region_original( int h, size_t, size_t) const = 0;
+	get_region_original( int, size_t, size_t) const = 0;
 
 	template <typename T>
 	valarray<TFloat>
@@ -331,7 +331,7 @@ class CSource {
 
 	// filtered
 	virtual valarray<TFloat>
-	get_region_filtered( const string& h, size_t, size_t) const = 0;
+	get_region_filtered( const SChannel& h, size_t, size_t) const = 0;
 	virtual valarray<TFloat>
 	get_region_filtered( int h, size_t, size_t) const = 0;
 
@@ -363,7 +363,7 @@ class CSource {
 		    const valarray<TFloat>& src,
 		    size_t offset)		const = 0;
 	virtual int
-	put_region( const string& h,
+	put_region( const SChannel& h,
 		    const valarray<TFloat>& src,
 		    size_t offset)		const = 0;
 
@@ -374,7 +374,7 @@ class CSource {
 			return put_region( h, src, 0);
 		}
 	int
-	put_signal( const string& h,
+	put_signal( const SChannel& h,
 		    const valarray<TFloat>& src)
 		{
 			return put_region( h, src, 0);
@@ -387,7 +387,7 @@ class CSource {
 	virtual pair<TFloat, TFloat>
 	get_real_original_signal_range( int) const = 0;
 	virtual pair<TFloat, TFloat>
-	get_real_original_signal_range( const string&) const = 0;
+	get_real_original_signal_range( const SChannel&) const = 0;
 
 	template <typename T>
 	pair<TFloat, TFloat>
@@ -395,7 +395,7 @@ class CSource {
 	virtual pair<TFloat, TFloat>
 	get_max_original_signal_range( int) const = 0;
 	virtual pair<TFloat, TFloat>
-	get_max_original_signal_range( const string&) const = 0;
+	get_max_original_signal_range( const SChannel&) const = 0;
 
 	template <typename T>
 	pair<TFloat, TFloat>
@@ -403,7 +403,7 @@ class CSource {
 	virtual pair<TFloat, TFloat>
 	get_real_filtered_signal_range( int) const = 0;
 	virtual pair<TFloat, TFloat>
-	get_real_filtered_signal_range( const string&) const = 0;
+	get_real_filtered_signal_range( const SChannel&) const = 0;
 
 	template <typename T>
 	pair<TFloat, TFloat>
@@ -411,17 +411,17 @@ class CSource {
 	virtual pair<TFloat, TFloat>
 	get_max_filtered_signal_range( int) const = 0;
 	virtual pair<TFloat, TFloat>
-	get_max_filtered_signal_range( const string&) const = 0;
+	get_max_filtered_signal_range( const SChannel&) const = 0;
 
       // export
 	virtual int
 	export_original( int, const string& fname) const = 0;
 	virtual int
-	export_original( const string&, const string& fname) const = 0;
+	export_original( const SChannel&, const string& fname) const = 0;
 	virtual int
 	export_filtered( int, const string& fname) const = 0;
 	virtual int
-	export_filtered( const string&, const string& fname) const = 0;
+	export_filtered( const SChannel&, const string& fname) const = 0;
 
       // filenames
 	string make_fname_artifacts( const SChannel& channel) const
diff --git a/src/metrics/mc.cc b/src/metrics/mc.cc
index 9d210c1..7e0e55d 100644
--- a/src/metrics/mc.cc
+++ b/src/metrics/mc.cc
@@ -76,7 +76,7 @@ fname_base() const
 	ASPRINTF( &_,
 		  "%s.%s-%lu"
 		  ":%zu-%g_%g" "_%g" "_%g_%g",
-		  _using_F().filename(), _using_F().channel_by_id(_using_sig_no),
+		  _using_F().filename(), _using_F().channel_by_id(_using_sig_no).name(),
 		  _using_F().dirty_signature( _using_sig_no),
 		  Pp.pagesize,
 		  Pp.scope,
@@ -97,7 +97,7 @@ mirror_fname() const
 		  "%s-%s-%lu"
 		  ":%zu-%g_%g" "_%g" "_%g_%g" "_%g_%g@%zu"
 		  ".mc",
-		  basename_dot.c_str(), _using_F().channel_by_id(_using_sig_no),
+		  basename_dot.c_str(), _using_F().channel_by_id(_using_sig_no).name(),
 		  _using_F().dirty_signature( _using_sig_no),
 		  Pp.pagesize,
 		  Pp.scope,
@@ -164,7 +164,7 @@ export_tsv( const string& fname) const
 		 "#Page\t",
 		 _using_F().subject().name.c_str(), _using_F().session(), _using_F().episode(),
 		 (int)strlen(asctime_)-1, asctime_,
-		 _using_F().channel_by_id(_using_sig_no),
+		 _using_F().channel_by_id(_using_sig_no).name(),
 		 pages(), Pp.pagesize, Pp.freq_from, Pp.freq_from + Pp.bandwidth * bins(), Pp.bandwidth);
 
 	for ( bin = 0; bin < _bins; ++bin, bum += Pp.bandwidth )
@@ -198,7 +198,7 @@ export_tsv( size_t bin,
 		 "## Course (%zu %zu-sec pages) in range %g-%g Hz\n",
 		 _using_F().subject().name.c_str(), _using_F().session(), _using_F().episode(),
 		 (int)strlen(asctime_)-1, asctime_,
-		 _using_F().channel_by_id(_using_sig_no),
+		 _using_F().channel_by_id(_using_sig_no).name(),
 		 pages(), Pp.pagesize, Pp.freq_from, Pp.freq_from + (bin+1) * Pp.bandwidth);
 
 	for ( size_t p = 0; p < pages(); ++p )
@@ -221,9 +221,6 @@ const size_t sssu_hist_size = 100;
 
 
 // Local Variables:
-// Local Variables:
 // Mode: c++
 // indent-tabs-mode: 8
 // End:
-// indent-tabs-mode: 8
-// End:
diff --git a/src/metrics/page-metrics-base.cc b/src/metrics/page-metrics-base.cc
index cd949b3..770c15a 100644
--- a/src/metrics/page-metrics-base.cc
+++ b/src/metrics/page-metrics-base.cc
@@ -218,7 +218,7 @@ export_tsv( const string& fname) const
 		 "#Page\t",
 		 _using_F().subject().name.c_str(), _using_F().session(), _using_F().episode(),
 		 (int)strlen(asctime_)-1, asctime_,
-		 _using_F().channel_by_id(_using_sig_no));
+		 _using_F().channel_by_id(_using_sig_no).name());
 
 	for ( bin = 0; bin < _bins; ++bin )
 		fprintf( f, "%zu%c", bin, bin+1 == _bins ? '\n' : '\t');
diff --git a/src/metrics/psd.cc b/src/metrics/psd.cc
index 50cc355..fa58057 100644
--- a/src/metrics/psd.cc
+++ b/src/metrics/psd.cc
@@ -100,7 +100,7 @@ fname_base() const
 	ASPRINTF( &_,
 		  "%s.%s-%lu"
 		  ":%zu-%g-%c%c",
-		  _using_F().filename(), _using_F().channel_by_id(_using_sig_no),
+		  _using_F().filename(), _using_F().channel_by_id(_using_sig_no).name(),
 		  _using_F().dirty_signature( _using_sig_no),
 		  Pp.pagesize, Pp.binsize,
 		  'a'+(char)Pp.welch_window_type, 'a'+(char)Pp.plan_type);
@@ -120,7 +120,7 @@ mirror_fname() const
 		  "%s.%s-%lu"
 		  ":%zu-%g-%c%c@%zu"
 		  ".psd",
-		  basename_dot.c_str(), _using_F().channel_by_id(_using_sig_no),
+		  basename_dot.c_str(), _using_F().channel_by_id(_using_sig_no).name(),
 		  _using_F().dirty_signature( _using_sig_no),
 		  Pp.pagesize, Pp.binsize,
 		  'a'+(char)Pp.welch_window_type, 'a'+(char)Pp.plan_type,
@@ -267,7 +267,7 @@ export_tsv( const string& fname) const
 		 "#Page\t",
 		 _using_F().subject().name.c_str(), _using_F().session(), _using_F().episode(),
 		 (int)strlen(asctime_)-1, asctime_,
-		 _using_F().channel_by_id(_using_sig_no),
+		 _using_F().channel_by_id(_using_sig_no).name(),
 		 pages(), Pp.pagesize, _bins*Pp.binsize, Pp.binsize);
 
 	for ( bin = 0; bin < _bins; ++bin, bum += Pp.binsize )
@@ -303,7 +303,7 @@ export_tsv( float from, float upto,
 		 "## Course (%zu %zu-sec pages) in range %g-%g Hz\n",
 		 _using_F().subject().name.c_str(), _using_F().session(), _using_F().episode(),
 		 (int)strlen(asctime_)-1, asctime_,
-		 _using_F().channel_by_id(_using_sig_no),
+		 _using_F().channel_by_id(_using_sig_no).name(),
 		 pages(), Pp.pagesize, from, upto);
 
 	valarray<TFloat> crs = course( from, upto);
diff --git a/src/metrics/swu.cc b/src/metrics/swu.cc
index efe7c26..14eeb07 100644
--- a/src/metrics/swu.cc
+++ b/src/metrics/swu.cc
@@ -66,7 +66,7 @@ fname_base() const
 	ASPRINTF( &_,
 		  "%s.%s-%lu"
 		  ":%zu-%g",
-		  _using_F().filename(), _using_F().channel_by_id(_using_sig_no),
+		  _using_F().filename(), _using_F().channel_by_id(_using_sig_no).name(),
 		  _using_F().dirty_signature( _using_sig_no),
 		  Pp.pagesize, Pp.min_upswing_duration);
 	string ret {_};
@@ -84,7 +84,7 @@ mirror_fname() const
 		  "%s.%s-%lu"
 		  ":%zu-%g@%zu"
 		  ".swu",
-		  basename_dot.c_str(), _using_F().channel_by_id(_using_sig_no),
+		  basename_dot.c_str(), _using_F().channel_by_id(_using_sig_no).name(),
 		  _using_F().dirty_signature( _using_sig_no),
 		  Pp.pagesize, Pp.min_upswing_duration,
 		  sizeof(TFloat));
@@ -157,7 +157,7 @@ export_tsv( const string& fname) const
 		 "#Page\tSWU\n",
 		 _using_F().subject().name.c_str(), _using_F().session(), _using_F().episode(),
 		 (int)strlen(asctime_)-1, asctime_,
-		 _using_F().channel_by_id(_using_sig_no),
+		 _using_F().channel_by_id(_using_sig_no).name(),
 		 pages(), Pp.pagesize);
 
 	for ( size_t p = 0; p < pages(); ++p )
diff --git a/src/tools/edfcat.cc b/src/tools/edfcat.cc
index 32d1f4b..40fbdd4 100644
--- a/src/tools/edfcat.cc
+++ b/src/tools/edfcat.cc
@@ -188,10 +188,10 @@ figure_channels( const list<string>& argv) throw (invalid_argument)
 
 
 
-list<pair<string, size_t>>
+list<pair<sigfile::SChannel, size_t>>
 make_channel_headers_for_CEDFFile( size_t n, const char *fmt, size_t samplerate)
 {
-	list<pair<string, size_t>> ret;
+	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);
@@ -366,7 +366,7 @@ exec_prune( const SOperation::SObject& obj)
 {
 	sigfile::CEDFFile F (obj.c_str(), sigfile::CTypedSource::no_ancillary_files);
 
-	list<pair<string, size_t>> selected_channels;
+	list<pair<sigfile::SChannel, size_t>> selected_channels;
 	for ( auto& select_this : obj.channels ) {
 		if ( select_this >= F.n_channels() ) {
 			DEF_UNIQUE_CHARP (_);
diff --git a/src/ui/mw/loadsave.cc b/src/ui/mw/loadsave.cc
index dc01488..960edcc 100644
--- a/src/ui/mw/loadsave.cc
+++ b/src/ui/mw/loadsave.cc
@@ -146,7 +146,7 @@ load_settings()
 	_AghDi = find( AghDD.begin(), AghDD.end(), _aghdd_placeholder);
 	if ( _AghDi == AghDD.end() )
 		_AghDi = AghDD.begin();
-	_AghTi = find( AghTT.begin(), AghTT.end(), _aghtt_placeholder);
+	_AghTi = find( AghTT.begin(), AghTT.end(), sigfile::SChannel (_aghtt_placeholder));
 	if ( _AghTi == AghTT.end() )
 		_AghTi = AghTT.begin();
 

-- 
Sleep experiment manager



More information about the debian-med-commit mailing list