[med-svn] [SCM] aghermann branch, master, updated. 06bda7dfaa687aaf0708a024d192024e2cd58421
Andrei Zavada
johnhommer at gmail.com
Thu Jan 24 00:43:54 UTC 2013
The following commit has been merged in the master branch:
commit cd03f45712951faf782a197cfa6449e3a24cd16f
Author: Andrei Zavada <johnhommer at gmail.com>
Date: Mon Jan 21 02:04:56 2013 +0200
separate dir for patterns
diff --git a/configure.ac b/configure.ac
index 2bdf1dd..ea9d174 100644
--- a/configure.ac
+++ b/configure.ac
@@ -196,6 +196,7 @@ AC_OUTPUT([
src/Makefile
src/sigproc/Makefile
src/libsigfile/Makefile
+ src/patterns/Makefile
src/metrics/Makefile
src/ica/Makefile
src/common/Makefile
diff --git a/src/Makefile.am b/src/Makefile.am
index 29cc54c..1e2726f 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,7 +1,8 @@
SUBDIRS := \
common sigproc ica libsigfile \
metrics \
- expdesign model \
+ expdesign \
+ patterns model \
ui \
tools
@@ -24,6 +25,7 @@ aghermann_LDADD := \
ui/mf/liba.a \
ui/liba.a \
model/liba.a \
+ patterns/liba.a \
metrics/liba.a \
libsigfile/liba.a \
sigproc/liba.a \
diff --git a/src/patterns/Makefile.am b/src/patterns/Makefile.am
new file mode 100644
index 0000000..57659ac
--- /dev/null
+++ b/src/patterns/Makefile.am
@@ -0,0 +1,20 @@
+AM_CXXFLAGS := \
+ -Wall -std=c++11 -fno-rtti \
+ -I$(top_srcdir)/src
+
+noinst_LIBRARIES := liba.a
+
+liba_a_SOURCES := \
+ patterns.cc patterns.hh patterns.ii
+
+if DO_PCH
+BUILT_SOURCES := \
+ patterns.hh.gch
+%.hh.gch: %.hh
+ $(CXXCOMPILE) -c $<
+CLEANFILES := \
+ $(BUILT_SOURCES)
+endif
+
+EXTRA_DIST := \
+ patterns.ii
diff --git a/src/patterns/patterns.cc b/src/patterns/patterns.cc
new file mode 100644
index 0000000..48277e5
--- /dev/null
+++ b/src/patterns/patterns.cc
@@ -0,0 +1,180 @@
+// ;-*-C++-*-
+/*
+ * File name: patterns/patterns.cc
+ * Project: Aghermann
+ * Author: Andrei Zavada <johnhommer at gmail.com>
+ * Initial version: 2013-01-09
+ *
+ * Purpose: CPatternTool explicit pattern instantiations be
+ * here, also loading patterns
+ *
+ * License: GPL
+ */
+
+#include <cstring>
+#include <dirent.h>
+#include <sys/stat.h>
+#include "common/fs.hh"
+#include "patterns.hh"
+
+using namespace std;
+
+template pattern::CPatternTool<TFloat>::CPatternTool( const sigproc::SSignalRef<TFloat>&, size_t, size_t, const SPatternPPack<TFloat>&);
+template int pattern::CPatternTool<TFloat>::do_search( const valarray<TFloat>&, const valarray<TFloat>&, const valarray<TFloat>&, const valarray<TFloat>&, size_t);
+template int pattern::CPatternTool<TFloat>::do_search( const sigproc::SSignalRef<TFloat>&, size_t);
+template int pattern::CPatternTool<TFloat>::do_search( const valarray<TFloat>&, size_t);
+
+
+
+inline namespace {
+int
+scandir_filter( const struct dirent *e)
+{
+ return strcmp( e->d_name, ".") && strcmp( e->d_name, "..");
+}
+}
+
+
+namespace pattern {
+
+
+template <>
+SPattern<TFloat>
+load_pattern( const char* fname) throw(invalid_argument)
+{
+ SPattern<TFloat>
+ P;
+
+ DEF_UNIQUE_CHARP (buf);
+ FILE *fd = fopen( fname, "r");
+ if ( fd ) {
+ size_t full_sample;
+ if ( fscanf( fd,
+ (sizeof(TFloat) == sizeof(float))
+ ? "%lg %u %lg %lg %lg %lg %u"
+ " %g %g %g %g"
+ " %zu %zu %zu %zu\n"
+ "--DATA--\n"
+ :
+ "%lg %u %lg %lg %lg %lg %u"
+ " %lg %lg %lg %lg"
+ " %zu %zu %zu %zu\n"
+ "--DATA--\n"
+ ,
+ &P.Pp.env_scope,
+ &P.Pp.bwf_order, &P.Pp.bwf_ffrom, &P.Pp.bwf_fupto,
+ &P.Pp.dzcdf_step, &P.Pp.dzcdf_sigma, &P.Pp.dzcdf_smooth,
+ &get<0>(P.criteria), &get<1>(P.criteria), &get<2>(P.criteria), &get<3>(P.criteria),
+ &P.samplerate, &P.context_before, &P.context_after,
+ &full_sample) == 14 ) {
+
+ P.thing.resize( full_sample);
+ for ( size_t i = 0; i < full_sample; ++i ) {
+ double d;
+ if ( fscanf( fd, "%la", &d) != 1 ) {
+ ASPRINTF( &buf, "load_pattern(\"%s\"): short read at sample %zu; "
+ "removing file", fname, i);
+ fprintf( stderr, "%s\n", buf);
+ P.thing.resize( 0);
+ fclose( fd);
+ unlink( fname);
+ throw invalid_argument (buf);
+ } else
+ P.thing[i] = d;
+ }
+
+ } else {
+ P.thing.resize( 0);
+ ASPRINTF( &buf, "load_pattern(\"%s\"): bad header, so removing file", fname);
+ fprintf( stderr, "%s\n", buf);
+ P.thing.resize( 0);
+ fclose( fd);
+ unlink( fname);
+ throw invalid_argument (buf);
+ }
+
+ fclose( fd);
+
+ } else {
+ ASPRINTF( &buf, "Failed to open pattern %s", fname);
+ fprintf( stderr, "%s\n", buf);
+ throw invalid_argument (buf);
+ }
+
+ P.saved = true;
+ return P;
+}
+
+
+template <>
+int
+save_pattern( SPattern<TFloat>& P, const char* fname)
+{
+ if ( agh::fs::mkdir_with_parents( agh::fs::dirname(fname)) ) {
+ fprintf( stderr, "save_pattern(\"%s\"): mkdir failed\n", fname);
+ return -1;
+ }
+
+ FILE *fd = fopen( fname, "w");
+ try {
+ if ( !fd )
+ throw -2;
+
+ if ( fprintf( fd,
+ "%g %u %g %g %g %g %u %g %g %g %g\n"
+ "%zu %zu %zu %zu\n"
+ "--DATA--\n",
+ P.Pp.env_scope,
+ P.Pp.bwf_order, P.Pp.bwf_ffrom, P.Pp.bwf_fupto,
+ P.Pp.dzcdf_step, P.Pp.dzcdf_sigma, P.Pp.dzcdf_smooth,
+ get<0>(P.criteria), get<1>(P.criteria), get<2>(P.criteria), get<3>(P.criteria),
+ P.samplerate, P.context_before, P.context_after,
+ P.thing.size()) < 1 ) {
+ fprintf( stderr, "save_pattern(\"%s\"): write failed\n", fname);
+ throw -3;
+ }
+
+ for ( size_t i = 0; i < P.thing.size(); ++i )
+ if ( fprintf( fd, "%a\n", (double)P.thing[i]) < 1 ) {
+ fprintf( stderr, "save_pattern(\"%s\"): write failed\n", fname);
+ throw -3;
+ }
+ fclose( fd);
+
+ return 0;
+
+ } catch (int ret) {
+ if ( fd )
+ fclose( fd);
+ return ret;
+ }
+}
+
+
+
+
+template <>
+list<pattern::SPattern<TFloat>>
+load_patterns_from_location<TFloat>( const string& loc, pattern::TOrigin origin)
+{
+ list<SPattern<TFloat>>
+ ret;
+
+ struct dirent **eps;
+ size_t total = scandir( loc.c_str(), &eps, scandir_filter, alphasort);
+
+ for ( size_t i = 0; i < total; ++i ) {
+ ret.push_back(
+ load_pattern<TFloat>( eps[i]->d_name));
+ ret.back().origin = origin;
+ free( eps[i]);
+ }
+ free( (void*)eps);
+
+ return ret;
+}
+
+
+} // namespace pattern
+
+// eof
diff --git a/src/sigproc/patterns.hh b/src/patterns/patterns.hh
similarity index 70%
rename from src/sigproc/patterns.hh
rename to src/patterns/patterns.hh
index 726c098..2674b35 100644
--- a/src/sigproc/patterns.hh
+++ b/src/patterns/patterns.hh
@@ -13,12 +13,13 @@
#ifndef _SIGPROC_PATTERNS_H
#define _SIGPROC_PATTERNS_H
+#include <stdexcept>
#include <tuple>
#include <vector>
#include <gsl/gsl_math.h>
-#include "sigproc.hh"
+#include "sigproc/sigproc.hh"
#if HAVE_CONFIG_H && !defined(VERSION)
# include "config.h"
@@ -70,9 +71,9 @@ struct SPatternPPack {
template <typename T>
-class CPattern
+class CPatternTool
: public SPatternPPack<T> {
- DELETE_DEFAULT_METHODS (CPattern);
+ DELETE_DEFAULT_METHODS (CPatternTool);
public:
// the complete pattern signature is made of:
@@ -81,9 +82,9 @@ class CPattern
// (c) target frequency (band-passed);
// (d) instantaneous frequency at fine intervals;
- CPattern (const sigproc::SSignalRef<T>& thing,
- size_t ctx_before_, size_t ctx_after_,
- const SPatternPPack<T>& Pp_)
+ CPatternTool (const sigproc::SSignalRef<T>& thing,
+ size_t ctx_before_, size_t ctx_after_,
+ const SPatternPPack<T>& Pp_)
: SPatternPPack<T> (Pp_),
penv (thing),
ptarget_freq (thing),
@@ -134,9 +135,63 @@ class CPattern
double crit_dzcdf_unity;
};
+
+
+enum TOrigin { subject, experiment, user, system };
+
+template <typename T>
+struct SPattern {
+ string name;
+
+ TOrigin origin;
+
+ bool saved;
+
+ valarray<T>
+ thing;
+ size_t samplerate;
+ size_t context_before,
+ context_after;
+ static const size_t
+ context_pad = 100;
+ size_t pattern_size_essential() const
+ {
+ return thing.size() - context_before - context_after;
+ }
+
+ double pattern_length() const // in seconds
+ {
+ return (double)thing.size() / samplerate;
+ }
+
+ double pattern_length_essential() const
+ {
+ return (double)pattern_size_essential() / samplerate;
+ }
+
+ SPatternPPack<TFloat>
+ Pp;
+ CMatch<T>
+ criteria;
+};
+
+
+template <typename T>
+list<SPattern<T>>
+load_patterns_from_location( const string&, TOrigin);
+
+template <typename T>
+SPattern<T>
+load_pattern( const char*) throw(invalid_argument);
+
+template <typename T>
+int
+save_pattern( SPattern<T>&, const char*);
+
#include "patterns.ii"
-} // namespace sigproc
+
+} // namespace pattern
#endif
diff --git a/src/sigproc/patterns.ii b/src/patterns/patterns.ii
similarity index 85%
rename from src/sigproc/patterns.ii
rename to src/patterns/patterns.ii
index 2bb7ecd..a951d5f 100644
--- a/src/sigproc/patterns.ii
+++ b/src/patterns/patterns.ii
@@ -1,6 +1,6 @@
// ;-*-C++-*-
/*
- * File name: sigproc/patterns.ii
+ * File name: patterns/patterns.ii
* Project: Aghermann
* Author: Andrei Zavada <johnhommer at gmail.com>
* Initial version: 2013-01-09
@@ -10,15 +10,15 @@
* License: GPL
*/
-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);
+extern template CPatternTool<TFloat>::CPatternTool( const sigproc::SSignalRef<TFloat>&, size_t, size_t, const SPatternPPack&);
+extern template int CPatternTool<TFloat>::do_search( const valarray<TFloat>&, const valarray<TFloat>&, const valarray<TFloat>&, const valarray<TFloat>&, size_t);
+extern template int CPatternTool<TFloat>::do_search( const sigproc::SSignalRef<TFloat>&, size_t);
+extern template int CPatternTool<TFloat>::do_search( const valarray<TFloat>&, size_t);
template <typename T>
int
-CPattern<T>::
+CPatternTool<T>::
do_search( const valarray<T>& fenv_l,
const valarray<T>& fenv_u,
const valarray<T>& ftarget_freq,
@@ -80,7 +80,7 @@ do_search( const valarray<T>& fenv_l,
template <typename T>
int
-CPattern<T>::
+CPatternTool<T>::
do_search( const sigproc::SSignalRef<T>& signal,
size_t inc)
{
@@ -93,7 +93,7 @@ do_search( const sigproc::SSignalRef<T>& signal,
template <typename T>
int
-CPattern<T>::
+CPatternTool<T>::
do_search( const valarray<T>& signal,
size_t inc)
{
diff --git a/src/sigproc/Makefile.am b/src/sigproc/Makefile.am
index ec567da..ef55ba0 100644
--- a/src/sigproc/Makefile.am
+++ b/src/sigproc/Makefile.am
@@ -8,7 +8,6 @@ liba_a_SOURCES := \
exstrom.cc exstrom.hh \
ext-filters.cc ext-filters.hh ext-filters.ii \
sigproc.cc sigproc.hh sigproc.ii \
- patterns.cc patterns.hh patterns.ii \
winfun.cc winfun.hh
if DO_PCH
@@ -16,8 +15,7 @@ BUILT_SOURCES := \
ext-filters.hh.gch \
exstrom.hh.gch \
winfun.hh.gch \
- sigproc.hh.gch \
- patterns.hh.gch
+ sigproc.hh.gch
%.hh.gch: %.hh
$(CXXCOMPILE) -c $<
CLEANFILES := \
@@ -25,4 +23,5 @@ CLEANFILES := \
endif
EXTRA_DIST := \
- sigproc.ii
+ sigproc.ii \
+ ext-filters.ii
diff --git a/src/sigproc/patterns.cc b/src/sigproc/patterns.cc
deleted file mode 100644
index d541c3e..0000000
--- a/src/sigproc/patterns.cc
+++ /dev/null
@@ -1,24 +0,0 @@
-// ;-*-C++-*-
-/*
- * File name: sigproc/patterns.cc
- * Project: Aghermann
- * Author: Andrei Zavada <johnhommer at gmail.com>
- * Initial version: 2013-01-09
- *
- * Purpose: CPattern explicit pattern instantiations be here
- *
- * License: GPL
- */
-
-#include "patterns.hh"
-
-using namespace std;
-
-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);
-
-
-
-// eof
--
Sleep experiment manager
More information about the debian-med-commit
mailing list