The following commit has been merged in the master branch:
commit 3b87b4f8039ed683022537a0599b7dea069974d2
Author: Andrei Zavada <[email protected]>
Date:   Mon Oct 1 01:40:16 2012 +0300

    fix towards accurate page count (mainly CSCourse issue)

diff --git a/ChangeLog b/ChangeLog
index 0947c4b..35b4b66 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+v. 0.7.2 (2012-..-..)
+       * Tolerate size_t division arith off-by-ones when contructing
+         profiles (just don't crash on this);
+       * Enable omp for mass profile constructions & other heavy
+         operations;
+       * Correctly do status bar updates on tree rescan;
+       * configure: don't require gcc >= 4.7.1;
+       * MF: preserve tunables when reopening a previous model run;
+       * 
+
 v. 0.7.1 (2012-09-23)
        * Apply window to taper edges before taking FFT.
        * Fix startup when user has moved last-used dir between sessions.
diff --git a/src/expdesign/recording.cc b/src/expdesign/recording.cc
index 29eb844..1bf0d29 100644
--- a/src/expdesign/recording.cc
+++ b/src/expdesign/recording.cc
@@ -101,7 +101,8 @@ CSCourse (CSubject& J, const string& d, const 
sigfile::SChannel& h,
                        }
 
                int     pa = (size_t)difftime( F.start_time(), _0at) / 
_pagesize,
-                       pz = (size_t)difftime( F.end_time(), _0at) / _pagesize;
+//                     pz = (size_t)difftime( F.end_time(), _0at) / _pagesize;
+                       pz = pa + F.length_in_seconds() / _pagesize;
              // anchor zero page, get pagesize from edf^W CBinnedPower^W 
either goes
                printf( "CSCourse::CSCourse(): adding %s of [%s, %s, %s] %zu 
pages (%d indeed) recorded %s",
                        sigfile::metric_method(params._profile_type), 
F.subject(), F.session(), F.episode(),
diff --git a/src/libsigfile/edf.hh b/src/libsigfile/edf.hh
index f802b5c..ed2c76b 100644
--- a/src/libsigfile/edf.hh
+++ b/src/libsigfile/edf.hh
@@ -109,9 +109,9 @@ class CEDFFile
                {
                        return _end_time;
                }
-       double recording_time() const // in seconds
+       time_t recording_time() const // in seconds
                {
-                       return (double) (n_data_records * data_record_size);
+                       return n_data_records * data_record_size;
                }
 
        // setters
diff --git a/src/libsigfile/edf.ii b/src/libsigfile/edf.ii
index 4680604..818f722 100644
--- a/src/libsigfile/edf.ii
+++ b/src/libsigfile/edf.ii
@@ -168,7 +168,7 @@ put_region_( A h,
        if ( unlikely (offset >= samplerate(h) * recording_time()) )
                throw range_error("CEDFFile::put_region_(): offset beyond end 
of file");
        if ( unlikely (offset + src.size() > samplerate(h) * recording_time()) 
) {
-               fprintf( stderr, "CEDFFile::put_region_(): attempt to write 
past end of file (%zu + %zu > %zu * %g)\n",
+               fprintf( stderr, "CEDFFile::put_region_(): attempt to write 
past end of file (%zu + %zu > %zu * %lu)\n",
                         offset, src.size(), samplerate(h), recording_time());
                throw range_error("CEDFFile::put_region_(): attempt to write 
past end of file");
        }
diff --git a/src/libsigfile/source-base.hh b/src/libsigfile/source-base.hh
index a005702..5b3c47f 100644
--- a/src/libsigfile/source-base.hh
+++ b/src/libsigfile/source-base.hh
@@ -201,7 +201,7 @@ class CSource_base {
       // recording time and duration
        virtual const time_t& start_time()              const = 0;
        virtual const time_t& end_time()                const = 0;
-       virtual double recording_time()                 const = 0;
+       virtual time_t recording_time()                 const = 0;
 
       // channels
        virtual size_t n_channels()                     const = 0;
diff --git a/src/libsigfile/source.cc b/src/libsigfile/source.cc
index 54a8b72..c2cc556 100644
--- a/src/libsigfile/source.cc
+++ b/src/libsigfile/source.cc
@@ -39,12 +39,12 @@ CSource (const char* fname,
        if ( flags | ~no_ancillary_files ) {
                // CHypnogram::
                CHypnogram::load( sigfile::make_fname_hypnogram(fname, 
pagesize));
-               size_t scorable_pages = _obj->recording_time() / pagesize;  // 
implicit floor
+               size_t scorable_pages = ceil( (double)_obj->recording_time() / 
pagesize);  // implicit floor
                if ( CHypnogram::pages() != scorable_pages ) {
-                       // if ( CHypnogram::length() > 0 )
-                       //      fprintf( stderr, "CEDFFile(\"%s\"): number of 
scorable pages @pagesize=%zu (%zu) "
-                       //               "differs from the number read from 
hypnogram file (%zu); discarding hypnogram\n",
-                       //               fname, pagesize, scorable_pages, 
CHypnogram::length());
+                       if ( CHypnogram::pages() > 0 )
+                               fprintf( stderr, "CSource(\"%s\"): number of 
scorable pages @pagesize=%zu (%lu / %zu = %zu) "
+                                        "differs from the number read from 
hypnogram file (%zu); adjusting hypnogram size\n",
+                                        fname, pagesize, 
_obj->recording_time(), pagesize, scorable_pages, CHypnogram::pages());
                        CHypnogram::_pages.resize( scorable_pages);
                }
        }

-- 
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