[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