Skip to content

Commit

Permalink
Can follow and update plot on fly
Browse files Browse the repository at this point in the history
  • Loading branch information
Randy Sargent committed Feb 5, 2011
1 parent 62c0380 commit d482bae
Show file tree
Hide file tree
Showing 4 changed files with 112 additions and 49 deletions.
44 changes: 38 additions & 6 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,15 +1,47 @@
all: hex2binary anne-110126.zeo anne-110127.zeo anne-110128.zeo anne-110129.zeo anne-110130.zeo anne-110131.zeo anne-110201.zeo
DATE ?= 110205

%.zeo: hex/%.zeo
./hex2binary <$^ >$@
ZEOS = $(wildcard *.zeo)
CSVS = $(patsubst %.zeo,%.hypnogram.csv,$(ZEOS))

all-csv: $(CSVS)

#%.zeo: hex/%.zeo
# ./hex2binary <$^ >$@

%.hypnogram.csv: %.zeo
./raw2csv.py $^

current: anne-$(DATE).hypnogram.csv

sync:
rsync -av john-2.local:/Users/anne/education/bodytrack/zeologger/raw-data/\*.zeo .
rm *.csv
-./raw2csv.py

connect:
connect.sh anne-$(DATE).zeo

csv:
-./raw2csv.py -f anne-$(DATE).zeo

plot-follow:
echo "set datafile separator ','" > gnuplot.script
echo "set xdata time" >> gnuplot.script
echo "set timefmt '%m/%d/%Y %H:%M:%S'" >> gnuplot.script
echo "set format x '%H:%M:%S'" >> gnuplot.script
echo "plot 'anne-$(DATE).hypnogram.csv' every ::2 using 1:6" >> gnuplot.script
echo "! sleep 5" >> gnuplot.script
echo "reread" >> gnuplot.script
gnuplot gnuplot.script

plot:
./plot_hypnogram.pl hypnogram.csv
echo "set datafile separator ','" > gnuplot.script
echo "set xdata time" >> gnuplot.script
echo "set timefmt '%m/%d/%Y %H:%M:%S'" >> gnuplot.script
echo "set format x '%H:%M:%S'" >> gnuplot.script
echo "plot 'anne-$(DATE).hypnogram.csv' every ::2 using 1:6" >> gnuplot.script
gnuplot -p gnuplot.script


hex2binary: hex2binary.c
gcc -Wall hex2binary.c -o hex2binary

# plot 'anne-110202.spectrogram.csv' every ::2 using 1:6 with lines title '2-4 Hz', 'anne-110202.spectrogram.csv' every ::2 using 1:7 with lines title '4-8 Hz' smooth bezier, 'anne-110202.spectrogram.csv' every ::2 using 1:8 with lines title '8-13 Hz' smooth bezier, 'anne-110202.spectrogram.csv' every ::2 using 1:9 with lines title '11-14 Hz' smooth bezier, 'anne-110202.spectrogram.csv' every ::2 using 1:10 with lines title '13-18 Hz' smooth bezier, 'anne-110202.spectrogram.csv' every ::2 using 1:11 with lines title '18-21 Hz' smooth bezier, 'anne-110202.spectrogram.csv' every ::2 using 1:($12*10) with lines title "30-50 Hz (x10)" smooth bezier, 'anne-110202.hypnogram.csv' every ::2 using 1:($6*.1)
10 changes: 8 additions & 2 deletions TODO
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
Fix plot to include times

-----------------------------
DONE
Commandline arg to block until new data, optionally
Git setup
Figure out how to remotely cat
Commandline arg to select file
Commandline arg to block until new data, optionally
Figure out how to remotely cat
Truncate CSV output files
Different CSV output filename
4 changes: 4 additions & 0 deletions connect.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#!/bin/bash

echo Connecting to $1
ssh john-2.local tail -f -c +0 /Users/anne/education/bodytrack/zeologger/raw-data/$1 > $1
103 changes: 62 additions & 41 deletions raw2csv.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,14 @@

from glob import glob


sys.path.append("/Users/rsargent/projects/bodytrack/zeo/raw-data/raw2csv/ZeoRawData-2.0");

from ZeoRawData import BaseLink, Parser

global done
done = False

def scanPorts():
portList = []

Expand Down Expand Up @@ -63,25 +67,33 @@ def flushInput(self):
pass

class FileReader:
def __init__(self, filename):
def __init__(self, filename, follow):
self.follow = follow
self.file = open(filename, 'r')
# skip 5 lines
for i in range(5):
self.file.readline()

def read(self, num):
return self.file.read(num)
global done
ret = self.file.read(num)
while len(ret) < num:
if not self.follow:
print "Done reading"
done = True
sys.exit(0)
time.sleep(1);
self.file.seek(0,1) # seek to current location to update buffer
ret += self.file.read(num - len(ret))
return ret

def flushInput(self):
pass


class ZeoToCSV:
def __init__(self, parent=None):
samplesFileName = 'raw_samples.csv'
sgramFileName = 'spectrogram.csv'
hgramFileName = 'hypnogram.csv'
eventsFileName = 'events.csv'
def __init__(self, basename):
samplesFileName = basename + '.raw_samples.csv'
sgramFileName = basename + '.spectrogram.csv'
hgramFileName = basename + '.hypnogram.csv'
eventsFileName = basename + '.events.csv'

self.hypToHeight = {'Undefined' : 0,
'Deep' : 1,
Expand All @@ -96,39 +108,30 @@ def __init__(self, parent=None):
hgramNeedHeader = False
eventsNeedHeader = False

if not os.path.isfile(samplesFileName):
samplesNeedHeader = True

if not os.path.isfile(sgramFileName):
sgramNeedHeader = True

if not os.path.isfile(hgramFileName):
hgramNeedHeader = True

if not os.path.isfile(eventsFileName):
eventsNeedHeader = True

self.rawSamples = csv.writer(open(samplesFileName, 'a+b'), delimiter=',',
self.rawSamplesFile = open(samplesFileName, 'wb')
self.rawSamples = csv.writer(self.rawSamplesFile, delimiter=',',
quotechar='"', quoting=csv.QUOTE_MINIMAL)
self.spectrogram = csv.writer(open(sgramFileName, 'a+b'), delimiter=',',

self.spectrogramFile = open(sgramFileName, 'wb')
self.spectrogram = csv.writer(self.spectrogramFile, delimiter=',',
quotechar='"', quoting=csv.QUOTE_MINIMAL)
self.hypnogram = csv.writer(open(hgramFileName, 'a+b'), delimiter=',',

self.hypnogramFile = open(hgramFileName, 'wb')
self.hypnogram = csv.writer(self.hypnogramFile, delimiter=',',
quotechar='"', quoting=csv.QUOTE_MINIMAL)
self.eventsOut = csv.writer(open(eventsFileName, 'a+b'), delimiter=',',

self.eventsOutFile = open(eventsFileName, 'wb')
self.eventsOut = csv.writer(self.eventsOutFile, delimiter=',',
quotechar='"', quoting=csv.QUOTE_MINIMAL)

if samplesNeedHeader:
self.rawSamples.writerow(["Time Stamp","Version","SQI","Impedance","Bad Signal (Y/N)","Voltage (uV)"])
self.rawSamples.writerow(["Time Stamp","Version","SQI","Impedance","Bad Signal (Y/N)","Voltage (uV)"])

if sgramNeedHeader:
self.spectrogram.writerow(["Time Stamp","Version","SQI","Impedance","Bad Signal (Y/N)",
"2-4 Hz","4-8 Hz","8-13 Hz","11-14 Hz","13-18 Hz","18-21 Hz","30-50 Hz"])
self.spectrogram.writerow(["Time Stamp","Version","SQI","Impedance","Bad Signal (Y/N)",
"2-4 Hz","4-8 Hz","8-13 Hz","11-14 Hz","13-18 Hz","18-21 Hz","30-50 Hz"])

if hgramNeedHeader:
self.hypnogram.writerow(["Time Stamp","Version","SQI","Impedance","Bad Signal (Y/N)","State (0-4)","State (named)"])
self.hypnogram.writerow(["Time Stamp","Version","SQI","Impedance","Bad Signal (Y/N)","State (0-4)","State (named)"])

if eventsNeedHeader:
self.eventsOut.writerow(["Time Stamp","Version","Event"])
self.eventsOut.writerow(["Time Stamp","Version","Event"])

def updateSlice(self, slice):

Expand All @@ -150,19 +153,33 @@ def updateSlice(self, slice):
badSignal = 'N'
if not slice['Waveform'] == []:
self.rawSamples.writerow([timestamp,ver,sqi,imp,badSignal] + slice['Waveform'])
self.rawSamplesFile.flush()
if len(slice['FrequencyBins'].values()) == 7:
f = slice['FrequencyBins']
bins = [f['2-4'],f['4-8'],f['8-13'],f['11-14'],f['13-18'],f['18-21'],f['30-50']]
self.spectrogram.writerow([timestamp,ver,sqi,imp,badSignal] + bins)
self.spectrogramFile.flush()
if not slice['SleepStage'] == None:
stage = slice['SleepStage']
self.hypnogram.writerow([timestamp,ver,sqi,imp,badSignal] +
[self.hypToHeight[stage],str(stage)])
self.hypnogramFile.flush()

def updateEvent(self, timestamp, version, event):
self.eventsOut.writerow([timestamp,version,event])
self.eventsOutFile.flush()

if __name__ == '__main__':

follow = False
zeofile = ""

for arg in sys.argv[1:]:
if arg == "-f":
follow = True
else:
zeofile = arg

# Find ports.
# TODO: offer a command line option for selecting ports.

Expand All @@ -178,10 +195,12 @@ def updateEvent(self, timestamp, version, event):
# else:
# sys.exit("No serial ports found.")


print "Generating CSV files from " + zeofile + ", follow=", follow
# Initialize
output = ZeoToCSV()
output = ZeoToCSV(os.path.splitext(zeofile)[0])

reader = FileReader("anne-110202.zeo")
reader = FileReader(zeofile, follow)

link = BaseLink.BaseLink(reader)

Expand All @@ -194,8 +213,10 @@ def updateEvent(self, timestamp, version, event):
link.start()

# TODO: perhaps use a more forgiving key? This would require polling the keyboard without blocking.
print "Hit ctrl-C at any time to stop."
while True:
time.sleep(5)

if follow:
print "Following; hit ctrl-C at any time to stop."
while not done:
time.sleep(.2)
print "Exiting"

sys.exit()

0 comments on commit d482bae

Please sign in to comment.