The following commit has been merged in the master branch:
commit 772376a7728ad62756c6484f8f245c8aed35381e
Author: Andrei Zavada <[email protected]>
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

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

Reply via email to