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

Andrei Zavada johnhommer at gmail.com
Thu Jan 24 00:43:43 UTC 2013


The following commit has been merged in the master branch:
commit 772376a7728ad62756c6484f8f245c8aed35381e
Author: Andrei Zavada <johnhommer at gmail.com>
Date:   Sun Jan 13 13:36:41 2013 +0200

    patterns WIP

diff --git a/src/sigproc/patterns.cc b/src/sigproc/patterns.cc
index f4d3b62..d541c3e 100644
--- a/src/sigproc/patterns.cc
+++ b/src/sigproc/patterns.cc
@@ -14,17 +14,10 @@
 
 using namespace std;
 
-template pattern::CPattern<TFloat>::CPattern( const sigproc::SSignalRef<TFloat>&, size_t, size_t,
-					      const SPatternPPack<TFloat>&);
-template size_t pattern::CPattern<TFloat>::find( const valarray<TFloat>&,
-						 const valarray<TFloat>&,
-						 const valarray<TFloat>&,
-						 const valarray<TFloat>&,
-						 ssize_t, int);
-template size_t pattern::CPattern<TFloat>::find( const sigproc::SSignalRef<TFloat>&,
-						 ssize_t, int);
-template size_t pattern::CPattern<TFloat>::find( const valarray<TFloat>&,
-						 ssize_t, int);
+template pattern::CPattern<TFloat>::CPattern( const sigproc::SSignalRef<TFloat>&, size_t, size_t, const SPatternPPack<TFloat>&);
+template int pattern::CPattern<TFloat>::do_search( const valarray<TFloat>&, const valarray<TFloat>&, const valarray<TFloat>&, const valarray<TFloat>&, size_t);
+template int pattern::CPattern<TFloat>::do_search( const sigproc::SSignalRef<TFloat>&, size_t);
+template int pattern::CPattern<TFloat>::do_search( const valarray<TFloat>&, size_t);
 
 
 
diff --git a/src/sigproc/patterns.hh b/src/sigproc/patterns.hh
index 103f2f7..659393e 100644
--- a/src/sigproc/patterns.hh
+++ b/src/sigproc/patterns.hh
@@ -63,8 +63,7 @@ struct SPatternPPack {
 				bwf_order == rv.bwf_order &&
 				dzcdf_step == rv.dzcdf_step &&
 				dzcdf_sigma == rv.dzcdf_sigma &&
-				dzcdf_smooth == rv.dzcdf_smooth &&
-				criteria == rv.criteria;
+				dzcdf_smooth == rv.dzcdf_smooth;
 		}
 }; // keep fields in order, or edit ctor by initializer_list
 
@@ -97,14 +96,14 @@ class CPattern
 		}
 
 	int do_search( const sigproc::SSignalRef<T>& field,
-		       int inc);
+		       size_t inc);
 	int do_search( const valarray<T>& field,
-		       int inc);
+		       size_t inc);
 	int do_search( const valarray<T>& env_u,  // broken-down field
 		       const valarray<T>& env_l,
 		       const valarray<T>& target_freq,
 		       const valarray<T>& dzcdf,
-		       int inc);
+		       size_t inc);
 
 	vector<CMatch<T>>
 		diff;
diff --git a/src/sigproc/patterns.ii b/src/sigproc/patterns.ii
index 26d1961..f51ee14 100644
--- a/src/sigproc/patterns.ii
+++ b/src/sigproc/patterns.ii
@@ -10,17 +10,10 @@
  *         License:  GPL
  */
 
-extern template CPattern<TFloat>::CPattern( const sigproc::SSignalRef<TFloat>&, size_t, size_t,
-					    const SPatternPPack&);
-extern template size_t CPattern<TFloat>::find( const valarray<TFloat>&,
-					       const valarray<TFloat>&,
-					       const valarray<TFloat>&,
-					       const valarray<TFloat>&,
-					       ssize_t, int);
-extern template size_t CPattern<TFloat>::find( const sigproc::SSignalRef<TFloat>&,
-					       ssize_t, int);
-extern template size_t CPattern<TFloat>::find( const valarray<TFloat>&,
-					       ssize_t, int);
+extern template CPattern<TFloat>::CPattern( const sigproc::SSignalRef<TFloat>&, size_t, size_t, const SPatternPPack&);
+extern template int CPattern<TFloat>::do_search( const valarray<TFloat>&, const valarray<TFloat>&, const valarray<TFloat>&, const valarray<TFloat>&, size_t);
+extern template int CPattern<TFloat>::do_search( const sigproc::SSignalRef<TFloat>&, size_t);
+extern template int CPattern<TFloat>::do_search( const valarray<TFloat>&, size_t);
 
 
 template <typename T>
@@ -33,8 +26,8 @@ do_search( const valarray<T>& fenv_u,
 	   size_t inc)
 {
 	size_t fsize = ftarget_freq.size();
-	if ( inc == 0 || inc > (ssize_t)fsize ) {
-		fprintf( stderr, __FUNCTION__": bad search increment: %d\n", inc);
+	if ( inc == 0 || inc > fsize ) {
+		fprintf( stderr, "%s: bad search increment: %d\n", __FUNCTION__, inc);
 		return -1;
 	}
 
@@ -94,20 +87,20 @@ template <typename T>
 int
 CPattern<T>::
 do_search( const sigproc::SSignalRef<T>& signal,
-	   int inc)
+	   size_t inc)
 {
 	if ( signal.samplerate != samplerate )
 		throw invalid_argument( "CPattern::find( SSignalRef&): not same samplerate");
 
-	return find( signal.signal,
-		     inc);
+	return do_search( signal.signal,
+			  inc);
 }
 
 template <typename T>
 int
 CPattern<T>::
 do_search( const valarray<T>& signal,
-	   int inc)
+	   size_t inc)
 {
 	valarray<T> fenv_u, fenv_l;
 	sigproc::envelope(
@@ -127,8 +120,8 @@ do_search( const valarray<T>& signal,
 			SPatternPPack<T>::dzcdf_sigma,
 			SPatternPPack<T>::dzcdf_smooth);
 
-	return find( fenv_u, fenv_l, ftarget_freq, fdzcdf,
-		     inc);
+	return do_search( fenv_u, fenv_l, ftarget_freq, fdzcdf,
+			  inc);
 }
 
 
diff --git a/src/ui/sf/sf-construct.cc b/src/ui/sf/sf-construct.cc
index 7282f2d..07b8372 100644
--- a/src/ui/sf/sf-construct.cc
+++ b/src/ui/sf/sf-construct.cc
@@ -432,7 +432,11 @@ SScoringFacilityWidgets (SExpDesignUI& _p)
 			 // ePatternParameterA, ePatternParameterB, ePatternParameterC, ePatternParameterD
 			 } )
 		g_signal_connect( W, "value-changed",
-				  (GCallback)ePattern_any_value_changed_cb,
+				  (GCallback)ePattern_any_pattern_value_changed_cb,
+				  this);
+	for ( auto& W : {ePatternParameterA, ePatternParameterB, ePatternParameterC, ePatternParameterD} )
+		g_signal_connect( W, "value-changed",
+				  (GCallback)ePattern_any_criteria_value_changed_cb,
 				  this);
 
 	G_CONNECT_1 (wPattern, show);
diff --git a/src/ui/sf/sf-patterns.cc b/src/ui/sf/sf-patterns.cc
index e221157..c64204b 100644
--- a/src/ui/sf/sf-patterns.cc
+++ b/src/ui/sf/sf-patterns.cc
@@ -10,6 +10,7 @@
  *         License:  GPL
  */
 
+#include <tuple>
 #include <dirent.h>
 #include <sys/stat.h>
 
@@ -21,8 +22,7 @@ using namespace std;
 
 aghui::SScoringFacility::SFindDialog::
 SFindDialog (SScoringFacility& parent)
-      : Pp {2,  0., 1.5, 1,  .1, .5, 3,
-            {.2, .2, .2, .2}},
+      : Pp {2,  0., 1.5, 1,  .1, .5, 3},
 	Pp2 (Pp),
 	cpattern (nullptr),
 	increment (.05),
@@ -36,10 +36,11 @@ SFindDialog (SScoringFacility& parent)
 	W_V.reg( _p.ePatternDZCDFStep, 		&Pp.dzcdf_step);
 	W_V.reg( _p.ePatternDZCDFSigma, 	&Pp.dzcdf_sigma);
 	W_V.reg( _p.ePatternDZCDFSmooth, 	&Pp.dzcdf_smooth);
-	W_V.reg( _p.ePatternParameterA, 	&get<0>(Pp.criteria);
-	W_V.reg( _p.ePatternParameterB, 	&get<1>(Pp.criteria);
-	W_V.reg( _p.ePatternParameterC, 	&get<2>(Pp.criteria);
-	W_V.reg( _p.ePatternParameterD, 	&get<3>(Pp.criteria);
+
+	W_V.reg( _p.ePatternParameterA, 	&get<0>(criteria));
+	W_V.reg( _p.ePatternParameterB, 	&get<1>(criteria));
+	W_V.reg( _p.ePatternParameterC, 	&get<2>(criteria));
+	W_V.reg( _p.ePatternParameterD, 	&get<3>(criteria));
 }
 
 aghui::SScoringFacility::SFindDialog::
@@ -78,7 +79,7 @@ void
 aghui::SScoringFacility::SFindDialog::
 draw( cairo_t *cr)
 {
-	if ( pattern.size() == 0 ) {
+	if ( thing.size() == 0 ) {
 		set_pattern_da_width( 200);
 		aghui::cairo_put_banner( cr, da_wd, da_ht, "(no selection)");
 		enable_controls( false);
@@ -90,7 +91,7 @@ draw( cairo_t *cr)
       // ticks
 	cairo_select_font_face( cr, "sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD);
 	cairo_set_font_size( cr, 9);
-	float	seconds = (float)pattern.size() / samplerate;
+	double	seconds = (double)thing.size() / samplerate;
 	for ( size_t i8 = 0; (float)i8 / 8 < seconds; ++i8 ) {
 		_p._p.CwB[SExpDesignUI::TColour::sf_ticks].set_source_rgba( cr);
 		cairo_set_line_width( cr, (i8%8 == 0) ? 1. : (i8%4 == 0) ? .6 : .3);
@@ -113,29 +114,19 @@ draw( cairo_t *cr)
       // snippet
 	cairo_set_source_rgb( cr, 0., 0., 0.);
 	cairo_set_line_width( cr, .8);
-	aghui::cairo_draw_signal( cr, pattern, 0, pattern.size(),
+	aghui::cairo_draw_signal( cr, thing, 0, thing.size(),
 				  da_wd, 0, da_ht/3, display_scale);
 	cairo_stroke( cr);
 
 	// lines marking out context
 	cairo_set_source_rgba( cr, 0.9, 0.9, 0.9, .5);
 	cairo_set_line_width( cr, 1.);
-	cairo_rectangle( cr, 0., 0., (float)context_before / pattern.size() * da_wd, da_ht);
-	cairo_rectangle( cr, (float)(context_before + run) / pattern.size() * da_wd, 0,
-			 (float)(context_after) / pattern.size() * da_wd, da_ht);
+	cairo_rectangle( cr, 0., 0., (float)context_before / thing.size() * da_wd, da_ht);
+	cairo_rectangle( cr, (float)(context_before + run) / thing.size() * da_wd, 0,
+			 (float)(context_after) / thing.size() * da_wd, da_ht);
 	cairo_fill( cr);
 	cairo_stroke( cr);
 
-	// thing if found
-	if ( last_find != (size_t)-1 ) {
-		cairo_set_source_rgba( cr, 0.1, 0.1, 0.1, .9);
-		cairo_set_line_width( cr, .7);
-		aghui::cairo_draw_signal( cr, field_channel->signal_filtered,
-					  last_find - context_before, last_find + run + context_after,
-					  da_wd, 0, da_ht*2/3, display_scale);
-		cairo_stroke( cr);
-	}
-
 	if ( draw_details ) {
 		valarray<TFloat>
 			env_u, env_l,
@@ -143,7 +134,7 @@ draw( cairo_t *cr)
 			dzcdf;
 	      // envelope
 		{
-			if ( sigproc::envelope( {pattern, samplerate}, Pp.env_tightness,
+			if ( sigproc::envelope( {thing, samplerate}, Pp.env_tightness,
 						1./samplerate,
 						&env_l, &env_u) == 0 ) {
 				aghui::cairo_put_banner( cr, da_wd, da_ht, "Selection is too short");
@@ -170,7 +161,7 @@ draw( cairo_t *cr)
 				goto out;
 			}
 			course = exstrom::band_pass(
-				pattern, samplerate,
+				thing, samplerate,
 				Pp.bwf_ffrom, Pp.bwf_fupto, Pp.bwf_order, true);
 
 			cairo_set_source_rgba( cr, 0.3, 0.3, 0.3, .5);
@@ -194,7 +185,7 @@ draw( cairo_t *cr)
 			}
 			enable_controls( true);
 
-			dzcdf = sigproc::dzcdf( sigproc::SSignalRef<TFloat> {pattern, samplerate},
+			dzcdf = sigproc::dzcdf( sigproc::SSignalRef<TFloat> {thing, samplerate},
 						Pp.dzcdf_step, Pp.dzcdf_sigma, Pp.dzcdf_smooth);
 			float	dzcdf_display_scale = da_ht/4. / dzcdf.max();
 
@@ -208,6 +199,20 @@ draw( cairo_t *cr)
 			cairo_stroke( cr);
 		}
 	}
+
+	// report any occurrences
+	
+	//if ( last_find != (size_t)-1 ) {
+	// 	cairo_set_source_rgba( cr, 0.1, 0.1, 0.1, .9);
+	// 	cairo_set_line_width( cr, .7);
+	// 	aghui::cairo_draw_signal( cr, field_channel->signal_filtered,
+	// 				  last_find - context_before, last_find + run + context_after,
+	// 				  da_wd, 0, da_ht*2/3, display_scale);
+	// 	cairo_stroke( cr);
+	// }
+
+
+
 out:
 	;
 }
@@ -233,8 +238,8 @@ load_pattern( SScoringFacility::SChannel& field)
 		: context_pad;
 	size_t	full_sample = context_before + run + context_after;
 
-	pattern.resize( full_sample);
-	pattern = field.signal_filtered[ slice (field.selection_start - context_before,
+	thing.resize( full_sample);
+	thing = field.signal_filtered[ slice (field.selection_start - context_before,
 						full_sample, 1) ];
 				// or _p.selection_*
 	samplerate = field.samplerate();
@@ -242,8 +247,6 @@ load_pattern( SScoringFacility::SChannel& field)
 
 	set_pattern_da_width( full_sample / field.spp());
 
-	last_find = (size_t)-1;
-
 	preselect_channel( field.name);
 	preselect_entry( NULL, 0);
 	gtk_label_set_markup( _p.lPatternSimilarity, "");
@@ -284,7 +287,7 @@ load_pattern( const char *label, bool do_globally)
 			     &Pp.env_tightness,
 			     &Pp.bwf_order, &Pp.bwf_ffrom, &Pp.bwf_fupto,
 			     &Pp.dzcdf_step, &Pp.dzcdf_sigma, &Pp.dzcdf_smooth,
-			     &get<0>(Pp.criteria), &get<1>(Pp.criteria), &get<2>(Pp.criteria), &get<3>(Pp.criteria),
+			     &get<0>(criteria), &get<1>(criteria), &get<2>(criteria), &get<3>(criteria),
 			     &samplerate, &full_sample, &context_before, &context_after) == 14 ) {
 
 			thing.resize( full_sample);
@@ -363,8 +366,8 @@ save_pattern( const char *label, bool do_globally)
 			 "--DATA--\n",
 			 Pp.env_tightness, Pp.bwf_order, Pp.bwf_ffrom, Pp.bwf_fupto,
 			 Pp.dzcdf_step, Pp.dzcdf_sigma, Pp.dzcdf_smooth,
-			 tolerance[0], tolerance[1], tolerance[2], tolerance[3],
-			 samplerate, pattern.size(), context_before, context_after);
+			 get<0>(criteria), get<1>(criteria), get<2>(criteria), get<3>(criteria),
+			 samplerate, thing.size(), context_before, context_after);
 		for ( size_t i = 0; i < thing.size(); ++i )
 			fprintf( fd, "%a\n", (double)thing[i]);
 		fclose( fd);
@@ -389,21 +392,21 @@ discard_pattern( const char *label, bool do_globally)
 
 
 
-bool
+void
 aghui::SScoringFacility::SFindDialog::
 search()
 {
-	if ( field_channel && pattern.size() > 0 ) {
+	if ( field_channel && thing.size() > 0 ) {
 		if ( !(Pp == Pp2) || field_channel != field_channel_saved) {
 			Pp2 = Pp;
 			field_channel_saved = field_channel;
 		}
-		cpattern = new sigproc::CPattern<TFloat>
+		cpattern = new pattern::CPattern<TFloat>
 			({thing, field_channel->samplerate()},
 			 context_before, context_after,
 			 Pp);
-		auto found =
-		  (cpattern->find(
+		diff_line =
+		  (cpattern->do_search(
 			field_channel->signal_envelope( Pp.env_tightness).first,
 			field_channel->signal_envelope( Pp.env_tightness).second,
 			field_channel->signal_bandpass( Pp.bwf_ffrom, Pp.bwf_fupto, Pp.bwf_order),
@@ -413,12 +416,19 @@ search()
 
 		delete cpattern;
 		cpattern = nullptr;
+	}
+}
 
-		for ( size_t i = 0; i < found.size(); ++i )
-			if 
-		return last_find != (size_t)-1;
-	} else
-		return false;
+
+size_t
+aghui::SScoringFacility::SFindDialog::
+find_occurrences()
+{
+	occurrences.resize(0);
+	for ( size_t i = 0; i < diff_line.size(); ++i )
+		if ( diff_line[i].good_enough( criteria) )
+			occurrences.push_back(i);
+	return occurrences.size();
 }
 
 
diff --git a/src/ui/sf/sf-patterns_cb.cc b/src/ui/sf/sf-patterns_cb.cc
index 1d02d80..de95937 100644
--- a/src/ui/sf/sf-patterns_cb.cc
+++ b/src/ui/sf/sf-patterns_cb.cc
@@ -25,7 +25,6 @@ daPatternSelection_draw_cb( GtkWidget *wid, cairo_t *cr, gpointer userdata)
 {
 	auto& SF = *(SScoringFacility*)userdata;
 	auto& FD = SF.find_dialog;
-	FD.W_V.down();
 
 	FD.draw( cr);
 
@@ -217,11 +216,27 @@ ePatternChannel_changed_cb( GtkComboBox *combo, gpointer userdata)
 }
 
 void
-ePattern_any_value_changed_cb( GtkSpinButton *spinbutton, gpointer userdata)
+ePattern_any_pattern_value_changed_cb( GtkSpinButton *spinbutton, gpointer userdata)
 {
 	auto& SF = *(SScoringFacility*)userdata;
 	auto& FD = SF.find_dialog;
 
+	FD.W_V.down();
+	FD.search();
+	FD.find_occurrences();
+
+	gtk_widget_queue_draw( (GtkWidget*)FD._p.daPatternSelection);
+}
+
+void
+ePattern_any_criteria_value_changed_cb( GtkSpinButton *spinbutton, gpointer userdata)
+{
+	auto& SF = *(SScoringFacility*)userdata;
+	auto& FD = SF.find_dialog;
+
+	FD.W_V.down();
+	FD.find_occurrences();
+
 	gtk_widget_queue_draw( (GtkWidget*)FD._p.daPatternSelection);
 }
 
diff --git a/src/ui/sf/sf.hh b/src/ui/sf/sf.hh
index 55e9b4e..587dd79 100644
--- a/src/ui/sf/sf.hh
+++ b/src/ui/sf/sf.hh
@@ -518,9 +518,9 @@ class SScoringFacility
 		double pattern_length_essential() const;
 
 		void load_pattern( SScoringFacility::SChannel&); // load selection on this channel
-		void load_pattern( const char* name, bool globally); // load named
-		void save_pattern( const char* name, bool globally);
-		void discard_pattern( const char *label, bool globally);
+		void load_pattern( const char*, bool globally); // load named
+		void save_pattern( const char*, bool globally);
+		void discard_pattern( const char*, bool globally);
 
 	      // finding tool
 	  	pattern::SPatternPPack<TFloat>
@@ -530,10 +530,18 @@ class SScoringFacility
 			*cpattern;
 		double	increment; // in seconds
 
+		pattern::CMatch<TFloat>
+			criteria;
+		vector<pattern::CMatch<TFloat>>
+			diff_line;
+		vector<size_t>
+			occurrences;
+		void search();
+		size_t find_occurrences();
+
 		SScoringFacility::SChannel
 			*field_channel,
 			*field_channel_saved;
-		size_t search();
 
 	      // draw
 		bool	draw_details:1;
@@ -826,13 +834,13 @@ SScoringFacility::channel_y0( const T& h) const
 inline size_t
 SScoringFacility::SFindDialog::pattern_size_essential() const
 {
-	return pattern.size() - context_before - context_after;
+	return thing.size() - context_before - context_after;
 }
 
 inline double
 SScoringFacility::SFindDialog::pattern_length() const
 {
-	return (double)pattern.size() / samplerate;
+	return (double)thing.size() / samplerate;
 }
 
 inline double
diff --git a/src/ui/sf/sf_cb.hh b/src/ui/sf/sf_cb.hh
index 3e50ebe..f80961c 100644
--- a/src/ui/sf/sf_cb.hh
+++ b/src/ui/sf/sf_cb.hh
@@ -156,7 +156,8 @@ gboolean daPatternSelection_scroll_event_cb( GtkWidget*, GdkEventScroll*, gpoint
 void bPatternFind_clicked_cb( GtkButton*, gpointer);
 void bPatternSave_clicked_cb( GtkButton*, gpointer);
 void bPatternDiscard_clicked_cb( GtkButton*, gpointer);
-void ePattern_any_value_changed_cb( GtkSpinButton*, gpointer);
+void ePattern_any_pattern_value_changed_cb( GtkSpinButton*, gpointer);
+void ePattern_any_criteria_value_changed_cb( GtkSpinButton*, gpointer);
 void wPattern_show_cb( GtkWidget*, gpointer);
 void wPattern_hide_cb( GtkWidget*, gpointer);
 

-- 
Sleep experiment manager



More information about the debian-med-commit mailing list