Skip to content

Commit 8fa2040

Browse files
committed
add byte streaming and refactor getwfdbbytes
1 parent f8cc3f4 commit 8fa2040

File tree

6 files changed

+191
-109
lines changed

6 files changed

+191
-109
lines changed

devtests.ipynb

Lines changed: 76 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -9,37 +9,50 @@
99
},
1010
{
1111
"cell_type": "code",
12-
"execution_count": 6,
12+
"execution_count": 1,
1313
"metadata": {
1414
"collapsed": false
1515
},
16-
"outputs": [
17-
{
18-
"ename": "ImportError",
19-
"evalue": "No module named 'pandas'",
20-
"output_type": "error",
21-
"traceback": [
22-
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
23-
"\u001b[0;31mImportError\u001b[0m Traceback (most recent call last)",
24-
"\u001b[0;32m<ipython-input-6-f69d0cc5fe48>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mimport\u001b[0m \u001b[0mwfdb\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
25-
"\u001b[0;32m/home/cx1111/Projects/wfdb-python/wfdb/__init__.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0;34m.\u001b[0m\u001b[0mrecords\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mRecord\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mMultiRecord\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrdheader\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrdsamp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msrdsamp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mwrsamp\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0;34m.\u001b[0m\u001b[0mannotations\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mAnnotation\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrdann\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mwrann\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mshowanncodes\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0;34m.\u001b[0m\u001b[0mplots\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mplotrec\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
26-
"\u001b[0;32m/home/cx1111/Projects/wfdb-python/wfdb/annotations.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mnumpy\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32mimport\u001b[0m \u001b[0mpandas\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0msys\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mIPython\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdisplay\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mdisplay\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mre\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
27-
"\u001b[0;31mImportError\u001b[0m: No module named 'pandas'"
28-
]
29-
}
30-
],
16+
"outputs": [],
3117
"source": [
3218
"import wfdb"
3319
]
3420
},
3521
{
3622
"cell_type": "code",
37-
"execution_count": null,
23+
"execution_count": 1,
3824
"metadata": {
3925
"collapsed": false
4026
},
41-
"outputs": [],
27+
"outputs": [
28+
{
29+
"name": "stdout",
30+
"output_type": "stream",
31+
"text": [
32+
"filename: 03700181.dat\n",
33+
"dirname: sampledata\n",
34+
"pbdir: None\n"
35+
]
36+
},
37+
{
38+
"ename": "UnboundLocalError",
39+
"evalue": "local variable 'nbytesload' referenced before assignment",
40+
"output_type": "error",
41+
"traceback": [
42+
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
43+
"\u001b[0;31mUnboundLocalError\u001b[0m Traceback (most recent call last)",
44+
"\u001b[0;32m<ipython-input-1-e525c7926607>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mwfdb\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;31m# Testing rdsamp multiple samples per frame (and fmt 12)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0msig\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfields\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mwfdb\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msrdsamp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'sampledata/03700181'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msig\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m20\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"\\n\\n\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msig\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"\\n\\n\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
45+
"\u001b[0;32m/home/chen/Projects/wfdb-python/wfdb/records.py\u001b[0m in \u001b[0;36msrdsamp\u001b[0;34m(recordname, sampfrom, sampto, channels, pbdir)\u001b[0m\n\u001b[1;32m 862\u001b[0m \u001b[0msig\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfields\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mwfdb\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msrdsamp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'macecgdb/test01_00s'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msampfrom\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m800\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mchannels\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 863\u001b[0m \"\"\"\n\u001b[0;32m--> 864\u001b[0;31m \u001b[0mrecord\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrdsamp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrecordname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msampfrom\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msampto\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mchannels\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpbdir\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 865\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 866\u001b[0m \u001b[0msignals\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrecord\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mp_signals\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
46+
"\u001b[0;32m/home/chen/Projects/wfdb-python/wfdb/records.py\u001b[0m in \u001b[0;36mrdsamp\u001b[0;34m(recordname, sampfrom, sampto, channels, physical, pbdir, m2s)\u001b[0m\n\u001b[1;32m 695\u001b[0m record.d_signals = _signals.rdsegment(record.filename, dirname, pbdir, record.nsig, record.fmt, record.siglen, \n\u001b[1;32m 696\u001b[0m \u001b[0mrecord\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbyteoffset\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrecord\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msampsperframe\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrecord\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mskew\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 697\u001b[0;31m sampfrom, sampto, channels)\n\u001b[0m\u001b[1;32m 698\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 699\u001b[0m \u001b[0;31m# Arrange/edit the object fields to reflect user channel and/or signal range input\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
47+
"\u001b[0;32m/home/chen/Projects/wfdb-python/wfdb/_signals.py\u001b[0m in \u001b[0;36mrdsegment\u001b[0;34m(filename, dirname, pbdir, nsig, fmt, siglen, byteoffset, sampsperframe, skew, sampfrom, sampto, channels)\u001b[0m\n\u001b[1;32m 300\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mfn\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mw_filename\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 301\u001b[0m signals[:, out_datchannel[fn]] = rddat(fn, dirname, pbdir, w_fmt[fn], len(datchannel[fn]), \n\u001b[0;32m--> 302\u001b[0;31m siglen, w_byteoffset[fn], w_sampsperframe[fn], w_skew[fn], sampfrom, sampto)[:, r_w_channel[fn]]\n\u001b[0m\u001b[1;32m 303\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 304\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0msignals\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
48+
"\u001b[0;32m/home/chen/Projects/wfdb-python/wfdb/_signals.py\u001b[0m in \u001b[0;36mrddat\u001b[0;34m(filename, dirname, pbdir, fmt, nsig, siglen, byteoffset, sampsperframe, skew, sampfrom, sampto)\u001b[0m\n\u001b[1;32m 339\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 340\u001b[0m \u001b[0;31m# Read the dat file into a np array and reshape.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 341\u001b[0;31m \u001b[0msig\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnbytesread\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mprocesswfdbbytes\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilename\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdirname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpbdir\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfmt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstartbyte\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msampto\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0msampfrom\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnsig\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msampsperframe\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfloorsamp\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 342\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 343\u001b[0m \u001b[0;31m# Shift the samples in the channels with skew if any\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
49+
"\u001b[0;32m/home/chen/Projects/wfdb-python/wfdb/_signals.py\u001b[0m in \u001b[0;36mprocesswfdbbytes\u001b[0;34m(filename, dirname, pbdir, fmt, startbyte, siglen, nsig, sampsperframe, floorsamp)\u001b[0m\n\u001b[1;32m 576\u001b[0m \u001b[0mnbytesload\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnsamp\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mbytespersample\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mfmt\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 577\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 578\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0msig\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnbytesload\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 579\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 580\u001b[0m \u001b[0;31m# Read bytes from a dat file, either local or remote\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
50+
"\u001b[0;31mUnboundLocalError\u001b[0m: local variable 'nbytesload' referenced before assignment"
51+
]
52+
}
53+
],
4254
"source": [
55+
"import wfdb\n",
4356
"# Testing rdsamp multiple samples per frame (and fmt 12)\n",
4457
"sig, fields=wfdb.srdsamp('sampledata/03700181')\n",
4558
"print(sig[:20,:])\n",
@@ -50,15 +63,6 @@
5063
"print(sig[-20:,:])"
5164
]
5265
},
53-
{
54-
"cell_type": "code",
55-
"execution_count": null,
56-
"metadata": {
57-
"collapsed": true
58-
},
59-
"outputs": [],
60-
"source": []
61-
},
6266
{
6367
"cell_type": "code",
6468
"execution_count": null,
@@ -542,6 +546,51 @@
542546
"requests.HTTPError"
543547
]
544548
},
549+
{
550+
"cell_type": "code",
551+
"execution_count": 93,
552+
"metadata": {
553+
"collapsed": false
554+
},
555+
"outputs": [
556+
{
557+
"name": "stdout",
558+
"output_type": "stream",
559+
"text": [
560+
"http://physionet.org/physiobank/database/mitdb/100.dat\n",
561+
"{'Accept-Encoding': '*/*', 'Range': 'bytes=0-9'}\n",
562+
"206\n",
563+
"{'Server': 'Apache/2.2.22 (Debian) mod_auth_tkt/2.1.0 mod_auth_pgsql/2.0.3 mod_ssl/2.2.22 OpenSSL/1.0.1t', 'Date': 'Mon, 20 Mar 2017 20:58:50 GMT', 'Last-Modified': 'Thu, 30 Jul 1992 05:36:18 GMT', 'Content-Range': 'bytes 0-9/1950000', 'Accept-Ranges': 'bytes', 'Vary': 'Accept-Encoding', 'Keep-Alive': 'timeout=5, max=100', 'Content-Type': 'application/octet-stream', 'Connection': 'Keep-Alive', 'Content-Length': '10', 'ETag': '\"2b58628a-1dc130-287fdea221880\"'}\n",
564+
"{'Accept': '*/*', 'User-Agent': 'python-requests/2.12.4', 'Connection': 'keep-alive', 'Range': 'bytes=0-9', 'Accept-Encoding': '*/*'}\n",
565+
"10\n"
566+
]
567+
}
568+
],
569+
"source": [
570+
"r = streamdat('100.dat', 'mitdb', '212', 9, 0)\n",
571+
"\n",
572+
"print(r.status_code)\n",
573+
"\n",
574+
"# Header the server sent\n",
575+
"print(r.headers)\n",
576+
"\n",
577+
"# Header we sent\n",
578+
"print(r.request.headers)\n",
579+
"\n",
580+
"print(len(r.content))"
581+
]
582+
},
583+
{
584+
"cell_type": "code",
585+
"execution_count": 1,
586+
"metadata": {
587+
"collapsed": false
588+
},
589+
"outputs": [],
590+
"source": [
591+
"import wfdb"
592+
]
593+
},
545594
{
546595
"cell_type": "code",
547596
"execution_count": null,

wfdb/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@
22

33
from .records import Record, MultiRecord, rdheader, rdsamp, srdsamp, wrsamp
44
from .annotations import Annotation, rdann, wrann, showanncodes
5-
from .plots import plotrec, plotann
5+
from .plots import plotrec, plotann
6+
#from .downloads import dldatabase

wfdb/_headers.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
import re
33
import os
44
import sys
5-
import requests
65
from collections import OrderedDict
76
from calendar import monthrange
87
from . import _signals
@@ -287,7 +286,7 @@ def wrheaderfile(self, writefields):
287286

288287
# Read header file to get comment and non-comment lines
289288
def getheaderlines(recordname, pbdir):
290-
# Reading local file
289+
# Read local file
291290
if pbdir is None:
292291
with open(recordname + ".hea", 'r') as fp:
293292
# Record line followed by signal/segment lines if any
@@ -309,7 +308,7 @@ def getheaderlines(recordname, pbdir):
309308
commentlines.append(line[ci:])
310309
else:
311310
headerlines.append(line)
312-
# Reading online header file
311+
# Read online header file
313312
else:
314313
headerlines, commentlines = downloads.streamheader(recordname, pbdir)
315314

0 commit comments

Comments
 (0)