[projects] export baseline data for vector strength project

This commit is contained in:
Jan Grewe 2014-11-02 13:23:05 +01:00
parent 59e7904872
commit 8f5993b1d3

View File

@ -0,0 +1,115 @@
import numpy as np
import scipy.io as sp
import subprocess
import glob
import sys, os
sys.path.append(os.path.expanduser('~/code/python/pyRELACS'))
from pyRELACS.DataLoader import iload
from IPython import embed;
def read_info_file(file_name):
"""
Reads the info file and returns the stored metadata in a dictionary. The dictionary may be nested.
@param file_name: The name of the info file.
@return: dictionary, the stored information.
"""
information = []
root = {}
with open(file_name, 'r') as f:
lines = f.readlines()
for l in lines:
if not l.startswith("#"):
continue
l = l.strip("#").strip()
if len(l) == 0:
continue
if not ": " in l:
sec = {}
root[l] = sec
else:
parts = l.split(': ')
sec[parts[0].strip()] = parts[1].strip()
information.append(root)
return information
def get_zero_crossings(trace, threshold=0.0, rising_flank=True):
if rising_flank:
shifted_trace = np.hstack((0, np.squeeze(trace[0:-1])))
crossings = np.all(np.vstack((np.squeeze(trace) > threshold, shifted_trace <= threshold)), 0)
else:
shifted_trace = np.hstack((0, np.squeeze(trace[0:-1])))
crossings = np.all(np.vstack((np.squeeze(trace) < threshold, shifted_trace >= threshold)), 0)
positions = np.nonzero(crossings)[0]
return positions
def has_cell_type(cell, cell_type):
if not os.path.exists(cell + '/info.dat'):
return false
else:
info = read_info_file(cell + '/info.dat')
return info[0]['Cell']['CellType'].lower() == cell_type.lower()
def has_baseline(cell):
return os.path.exists(cell + '/basespikes1.dat')
def has_raw_traces(cell):
if os.path.exists(cell + '/trace-2.raw'):
return True
if os.path.exists(cell + '/trace-2.raw.gz'):
if subprocess.check_call(['gzip', '-d' , cell+'/trace-2.raw']) == 0:
return True
return False
def load_eod_data(cell, max_time, sample_rate):
eod = np.fromfile(cell + "/trace-2.raw", np.float32)
eod = eod[:max_time*sample_rate]
return eod
def load_spike_data(cell, max_time):
data = list(iload(cell+'/basespikes1.dat'))
if data[0][2][-1]/1000 < max_time:
return None
else:
return data[0][2][data[0][2] <= max_time]/1000
if __name__ == '__main__':
cell_type = 'p-unit'
directory = os.path.expanduser('~/data/apteronotus')
cells = glob.glob(directory + '/2012-*')
found = 0
index = 0
max_cell_count = 25
while found < max_cell_count and index < len(cells):
cell = cells[index]
print cell
if not has_cell_type(cell, cell_type):
print 'wrong type'
index += 1
continue
if not has_baseline(cell):
print 'no baseline'
index += 1
continue
if not has_raw_traces(cell):
print 'no raw trace'
index += 1
continue
spikes = load_spike_data(cell, 20)
if spikes is None:
print 'not enough baseline spikes'
index += 1
continue
eod_data = load_eod_data(cell, 20, 200000)
name = cell.split('/')[-1] + '_baseline.mat'
sp.savemat(name, {'spike_times':spikes, 'eod':eod_data})
found += 1
index += 1