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

Andrei Zavada johnhommer at gmail.com
Sun Jul 7 23:03:59 UTC 2013


The following commit has been merged in the master branch:
commit d8bab84ed864878bb02ae24295403c3575ebbf04
Author: Andrei Zavada <johnhommer at gmail.com>
Date:   Thu Jun 20 20:26:57 2013 +0300

    WIP (make pagesize double; increment profile computations in steps)

diff --git a/src/aghermann/expdesign/primaries.cc b/src/aghermann/expdesign/primaries.cc
index 272e8c0..1a75b7c 100644
--- a/src/aghermann/expdesign/primaries.cc
+++ b/src/aghermann/expdesign/primaries.cc
@@ -121,6 +121,7 @@ CExpDesign (const string& session_dir_,
 
 	load_settings();
 
+	// that's pretty important: scope is not itself exposed to the user
 	mc_params.scope = fft_params.pagesize;
 
 #ifdef _OPENMP
diff --git a/src/libmetrics/mc.cc b/src/libmetrics/mc.cc
index e0cab6c..ee46e95 100644
--- a/src/libmetrics/mc.cc
+++ b/src/libmetrics/mc.cc
@@ -23,10 +23,10 @@ using namespace std;
 
 
 metrics::mc::CProfile::
-CProfile (const sigfile::CTypedSource& F, int sig_no,
+CProfile (const sigfile::CTypedSource& F, const int sig_no,
 	  const SPPack &params)
       : metrics::CProfile (F, sig_no,
-			   params.pagesize, // acting 'pagesize' for metrics::CProfile
+			   params.pagesize, pagesize.step,
 			   params.compute_n_bins(F().samplerate(sig_no))),
 	Pp (params)
 	// *_filter's initialized at compute time
@@ -43,12 +43,11 @@ fname_base() const
 {
 	return agh::str::sasprintf(
 		  "%s.%s-%lu"
-		  ":%zu-%g_%g" "_%g" "_%g_%g",
+		  ":%g+%g-%g_%g" "_%g" "_%g_%g",
 		  _using_F().filename(), _using_F().channel_by_id(_using_sig_no).name(),
 		  _using_F().dirty_signature( _using_sig_no),
-		  Pp.pagesize,
-		  Pp.scope,
-		  Pp.iir_backpolate,
+		  Pp.pagesize, Pp.step,
+		  Pp.scope, Pp.iir_backpolate,
 		  Pp.mc_gain,
 		  Pp.f0fc, Pp.bandwidth);
 }
@@ -59,14 +58,13 @@ mirror_fname() const
 {
 	return agh::str::sasprintf(
 		  "%s-%s-%lu"
-		  ":%zu-%g_%g" "_%g" "_%g_%g" "_%g_%g@%zu"
+		  ":%g+%g-%g_%g" "_%g" "_%g_%g" "_%g_%g@%zu"
 		  ".mc",
 		  agh::fs::make_fname_base (_using_F().filename(), "", true).c_str(),
 		  _using_F().channel_by_id(_using_sig_no).name(),
 		  _using_F().dirty_signature( _using_sig_no),
-		  Pp.pagesize,
-		  Pp.scope,
-		  Pp.iir_backpolate,
+		  Pp.pagesize, Pp.step,
+		  Pp.scope, Pp.iir_backpolate,
 		  Pp.mc_gain,
 		  Pp.f0fc, Pp.bandwidth,
 		  Pp.freq_from, Pp.freq_inc,
@@ -123,12 +121,12 @@ export_tsv( const string& fname) const
 	auto sttm = _using_F().start_time();
 	char *asctime_ = asctime( localtime( &sttm));
 	fprintf( f, "## Subject: %s;  Session: %s, Episode: %s recorded %.*s;  Channel: %s\n"
-		 "## Total EEG Microcontinuity course (%zu %zu-sec pages) from %g up to %g Hz in bins of %g Hz\n"
+		 "## Total EEG Microcontinuity course (%zu %g-sec pages, step %g sec) from %g up to %g Hz in bins of %g Hz\n"
 		 "#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).name(),
-		 pages(), Pp.pagesize, Pp.freq_from, Pp.freq_from + Pp.bandwidth * bins(), Pp.bandwidth);
+		 pages(), Pp.pagesize, Pp.step, Pp.freq_from, Pp.freq_from + Pp.bandwidth * bins(), Pp.bandwidth);
 
 	for ( bin = 0; bin < _bins; ++bin, bum += Pp.bandwidth )
 		fprintf( f, "%g%c", bum, bin+1 == _bins ? '\n' : '\t');
@@ -158,11 +156,11 @@ export_tsv( size_t bin,
 	char *asctime_ = asctime( localtime( &sttm));
 	fprintf( f, "## Microcontinuity profile of\n"
 		 "## Subject: %s;  Session: %s, Episode: %s recorded %.*s;  Channel: %s\n"
-		 "## Course (%zu %zu-sec pages) in range %g-%g Hz\n",
+		 "## Course (%zu %g-sec pages, step %g sec) 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).name(),
-		 pages(), Pp.pagesize, Pp.freq_from, Pp.freq_from + (bin+1) * Pp.bandwidth);
+		 pages(), Pp.pagesize, Pp.step, Pp.freq_from, Pp.freq_from + (bin+1) * Pp.bandwidth);
 
 	for ( size_t p = 0; p < pages(); ++p )
 		fprintf( f, "%zu\t%g\n", p, nmth_bin(p, bin));
diff --git a/src/libmetrics/mc.hh b/src/libmetrics/mc.hh
index 6791507..35e123c 100644
--- a/src/libmetrics/mc.hh
+++ b/src/libmetrics/mc.hh
@@ -76,10 +76,15 @@ struct SPPack
 
 	void check() const // throws
 		{
-			if ( mc_gain < 1.0 )
-				throw invalid_argument ("mc_gain must be >= 1.0");
-			// if ( (int)(pagesize/scope) != (double)pagesize / (double)scope )
-			// 	throw invalid_argument ("Page size not a multiple of MC scope");
+#ifdef _OPENMP
+#pragma omp single
+#endif
+			{
+				if ( mc_gain < 1.0 )
+					throw invalid_argument ("mc_gain must be >= 1.0");
+				// if ( (int)(pagesize/scope) != (double)pagesize / (double)scope )
+				// 	throw invalid_argument ("Page size not a multiple of MC scope");
+			}
 		}
 
 	void reset()
diff --git a/src/libmetrics/page-metrics-base.cc b/src/libmetrics/page-metrics-base.cc
index e1faeab..767777a 100644
--- a/src/libmetrics/page-metrics-base.cc
+++ b/src/libmetrics/page-metrics-base.cc
@@ -30,7 +30,7 @@ using namespace std;
 
 metrics::CProfile::
 CProfile (const sigfile::CTypedSource& F, int sig_no,
-	  size_t pagesize, size_t bins)
+	  double pagesize, double step, size_t bins)
       : _status (0),
 	_bins (bins),
 	_signature_when_mirrored (0),
@@ -38,6 +38,7 @@ CProfile (const sigfile::CTypedSource& F, int sig_no,
 	_using_sig_no (sig_no)
 {
 	Pp.pagesize = pagesize;
+	Pp.step = step;
 }
 
 size_t
@@ -51,7 +52,7 @@ size_t
 metrics::CProfile::
 pages() const
 {
-	return _using_F().recording_time() / Pp.pagesize;
+	return _using_F().recording_time() / Pp.step;
 }
 
 
@@ -59,20 +60,27 @@ void
 metrics::SPPack::
 check() const
 {
-	for ( auto c : {4u, 20u, 30u, 60u} )
+	for ( auto c : {4., 20., 30., 60.} )
 		if ( pagesize == c )
 			return;
 #ifdef _OPENMP
 #pragma omp critical
 #endif
 	throw invalid_argument (string ("Invalid pagesize: ") + to_string(pagesize));
+
+	if ( step <= pagesize )
+		return;
+#ifdef _OPENMP
+#pragma omp critical
+#endif
+	throw invalid_argument (string ("step > pagesize: ") + to_string(step) + " > "+ to_string(pagesize));
 }
 
 void
 metrics::SPPack::
 reset()
 {
-	pagesize = 30;
+	pagesize = step = 30.;
 }
 
 
diff --git a/src/libmetrics/page-metrics-base.hh b/src/libmetrics/page-metrics-base.hh
index 61242a0..65ff15e 100644
--- a/src/libmetrics/page-metrics-base.hh
+++ b/src/libmetrics/page-metrics-base.hh
@@ -50,7 +50,8 @@ name( TType t)
 
 
 struct SPPack {
-	size_t	pagesize;
+	double	pagesize,
+		step;
 
 	SPPack ()
 		{
@@ -59,11 +60,12 @@ struct SPPack {
 
 	virtual bool same_as( const SPPack& rv) const
 		{
-			return pagesize == rv.pagesize;
+			return pagesize == rv.pagesize && step == rv.step;
 		}
 	virtual void make_same( const SPPack& rv)
 		{
 			pagesize = rv.pagesize;
+			step = rv.step;
 		}
 
 	void check() const; // throws
@@ -79,7 +81,7 @@ class CProfile {
 
     protected:
 	CProfile (const sigfile::CTypedSource&, int sig_no,
-		  size_t pagesize, size_t bins);
+		  double pagesize, double step, size_t bins);
 	CProfile (const CProfile&) = default;
     public:
 	SPPack	Pp;
diff --git a/src/libmetrics/psd.cc b/src/libmetrics/psd.cc
index eed2da7..0f062fd 100644
--- a/src/libmetrics/psd.cc
+++ b/src/libmetrics/psd.cc
@@ -42,12 +42,12 @@ metrics::psd::TFFTWPlanType
 
 
 metrics::psd::CProfile::
-CProfile (const sigfile::CTypedSource& F, int sig_no,
-	  const SPPack &fft_params)
+CProfile (const sigfile::CTypedSource& F, const int sig_no,
+	  const SPPack &params)
 	: metrics::CProfile (F, sig_no,
-			     fft_params.pagesize,
-			     fft_params.compute_n_bins(F().samplerate(sig_no))),
-	  Pp (fft_params)
+			     params.pagesize, params.step,
+			     params.compute_n_bins( F().samplerate(sig_no))),
+	  Pp (params)
 {
 	Pp.check();
 }
@@ -60,10 +60,10 @@ fname_base() const
 {
 	return agh::str::sasprintf(
 		  "%s.%s-%lu"
-		  ":%zu-%g-%c%c",
+		  ":%g+%g-%g-%c%c",
 		  _using_F().filename(), _using_F().channel_by_id(_using_sig_no).name(),
 		  _using_F().dirty_signature( _using_sig_no),
-		  Pp.pagesize, Pp.binsize,
+		  Pp.pagesize, Pp.step, Pp.binsize,
 		  'a'+(char)Pp.welch_window_type, 'a'+(char)Pp.plan_type);
 }
 
@@ -75,12 +75,12 @@ mirror_fname() const
 {
 	return agh::str::sasprintf(
 		  "%s.%s-%lu"
-		  ":%zu-%g-%c%c@%zu"
+		  ":%g+%g-%g-%c%c@%zu"
 		  ".psd",
 		  agh::fs::make_fname_base (_using_F().filename(), "", true).c_str(),
 		  _using_F().channel_by_id(_using_sig_no).name(),
 		  _using_F().dirty_signature( _using_sig_no),
-		  Pp.pagesize, Pp.binsize,
+		  Pp.pagesize, Pp.step, Pp.binsize,
 		  'a'+(char)Pp.welch_window_type, 'a'+(char)Pp.plan_type,
 		  sizeof(double));
 }
@@ -95,7 +95,8 @@ go_compute()
 	_data.resize( pages() * _bins);
 
 	size_t	sr = samplerate();
-	size_t	spp = sr * Pp.pagesize;
+	size_t	spp = sr * Pp.pagesize,
+		sps = sr * Pp.step;
 //	double	freq_max = (spp+1)/2 / sr;
 
       // 0. get signal sample; always use double not TFloat
@@ -164,7 +165,7 @@ go_compute()
 	}
 
 	for ( p = 0; p < pages(); ++p ) {
-		memcpy( fft_Ti, &S[p*spp], spp * sizeof(double));
+		memcpy( fft_Ti, &S[p * sps], spp * sizeof(double));
 		for ( size_t s = 0; s < spp; ++s )
 			fft_Ti[s] *= W[s];
 
@@ -219,12 +220,12 @@ export_tsv( const string& fname) const
 	auto sttm = _using_F().start_time();
 	char *asctime_ = asctime( localtime( &sttm));
 	fprintf( f, "## Subject: %s;  Session: %s, Episode: %s recorded %.*s;  Channel: %s\n"
-		 "## Total spectral power course (%zu %zu-sec pages) up to %g Hz in bins of %g Hz\n"
+		 "## Total spectral power course (%zu %g-sec pages, step %g sec) up to %g Hz in bins of %g Hz\n"
 		 "#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).name(),
-		 pages(), Pp.pagesize, _bins*Pp.binsize, Pp.binsize);
+		 pages(), Pp.pagesize, Pp.step, _bins*Pp.binsize, Pp.binsize);
 
 	for ( bin = 0; bin < _bins; ++bin, bum += Pp.binsize )
 		fprintf( f, "%g%c", bum, bin+1 == _bins ? '\n' : '\t');
@@ -256,11 +257,11 @@ export_tsv( float from, float upto,
 	char *asctime_ = asctime( localtime( &sttm));
 	fprintf( f, "PSD profile of\n"
 		 "## Subject: %s;  Session: %s, Episode: %s recorded %.*s;  Channel: %s\n"
-		 "## Course (%zu %zu-sec pages) in range %g-%g Hz\n",
+		 "## Course (%zu %g-sec pages, step %g) 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).name(),
-		 pages(), Pp.pagesize, from, upto);
+		 pages(), Pp.pagesize, Pp.step, from, upto);
 
 	valarray<TFloat> crs = course( from, upto);
 	for ( size_t p = 0; p < pages(); ++p )
diff --git a/src/libmetrics/psd.hh b/src/libmetrics/psd.hh
index 55eb346..0d1c15c 100644
--- a/src/libmetrics/psd.hh
+++ b/src/libmetrics/psd.hh
@@ -93,23 +93,24 @@ struct SPPack
 
 	void check() const
 		{
-			metrics::SPPack::check();
-
-			if ( welch_window_type > sigproc::TWinType::TWinType_total )
-// What was that?
-// #ifdef _OPENMP
-// #pragma omp single
-// #endif
-				throw invalid_argument ("Invalid window type");
-
-			if ( plan_type != metrics::psd::TFFTWPlanType::estimate &&
-			     plan_type != metrics::psd::TFFTWPlanType::measure )
-				throw invalid_argument ("Invalid FFTW plan type");
-
-			for ( auto c : {.1, .25, .5} )
-				if ( binsize == c )
-					return;
-			throw invalid_argument ("Invalid binsize");
+#ifdef _OPENMP
+#pragma omp single
+#endif
+			{
+				metrics::SPPack::check();
+
+				if ( welch_window_type > sigproc::TWinType::TWinType_total )
+					throw invalid_argument ("Invalid window type");
+
+				if ( plan_type != metrics::psd::TFFTWPlanType::estimate &&
+				     plan_type != metrics::psd::TFFTWPlanType::measure )
+					throw invalid_argument ("Invalid FFTW plan type");
+
+				for ( auto c : {.1, .25, .5} )
+					if ( binsize == c )
+						return;
+				throw invalid_argument ("Invalid binsize");
+			}
 		}
 
 	void reset()
diff --git a/src/libmetrics/swu.cc b/src/libmetrics/swu.cc
index 1566c76..eb5d267 100644
--- a/src/libmetrics/swu.cc
+++ b/src/libmetrics/swu.cc
@@ -24,10 +24,10 @@ using namespace std;
 
 
 metrics::swu::CProfile::
-CProfile (const sigfile::CTypedSource& F, int sig_no,
+CProfile (const sigfile::CTypedSource& F, const int sig_no,
 	  const SPPack &params)
       : metrics::CProfile (F, sig_no,
-			   params.pagesize,
+			   params.pagesize, params.step,
 			   params.compute_n_bins(F().samplerate(sig_no))),
 	Pp (params)
 {
@@ -42,10 +42,10 @@ fname_base() const
 {
 	return agh::str::sasprintf(
 		  "%s.%s-%lu"
-		  ":%zu-%g",
+		  ":%g+%g-%g",
 		  _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);
+		  Pp.pagesize, Pp.step, Pp.min_upswing_duration);
 }
 
 
@@ -55,12 +55,12 @@ mirror_fname() const
 {
 	return agh::str::sasprintf(
 		  "%s.%s-%lu"
-		  ":%zu-%g@%zu"
+		  ":%g+%g-%g@%zu"
 		  ".swu",
 		  agh::fs::make_fname_base (_using_F().filename(), "", true).c_str(),
 		  _using_F().channel_by_id(_using_sig_no).name(),
 		  _using_F().dirty_signature( _using_sig_no),
-		  Pp.pagesize, Pp.min_upswing_duration,
+		  Pp.pagesize, p.step, Pp.min_upswing_duration,
 		  sizeof(TFloat));
 }
 
@@ -75,10 +75,11 @@ go_compute()
 		_using_F().get_signal_filtered( _using_sig_no));
 
 	for ( size_t p = 0; p < pages(); ++p ) {
-		auto	a =  p    * (samplerate() * Pp.pagesize),
-			z = (p+1) * (samplerate() * Pp.pagesize);
+		auto	a = p * (samplerate() * Pp.step),
+			z = a + (samplerate() * Pp.pagesize);
 		auto	la = a, lz = a;
 		double	Q = 0.;
+
 	      // 1. upswing proper
 		// find a stretch of uninterrupted positive values
 		for ( auto i = a; i < z; ++i ) {
@@ -125,12 +126,12 @@ export_tsv( const string& fname) const
 	auto sttm = _using_F().start_time();
 	char *asctime_ = asctime( localtime( &sttm));
 	fprintf( f, "## Subject: %s;  Session: %s, Episode: %s recorded %.*s;  Channel: %s\n"
-		 "## SWU course (%zu %zu-sec pages)\n"
+		 "## SWU course (%zu %g-sec pages, step %g sec)\n"
 		 "#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).name(),
-		 pages(), Pp.pagesize);
+		 pages(), Pp.pagesize, Pp.step);
 
 	for ( size_t p = 0; p < pages(); ++p )
 		fprintf( f, "%zu\t%g\n", p, nmth_bin( p, 0));

-- 
Sleep experiment manager



More information about the debian-med-commit mailing list