| qubx_idealize.py.html | mathcode2html |
| Source file: qubx_idealize.py | |
| Converted: Sun Aug 7 2016 at 13:47:27 | |
| This documentation file will not reflect any later changes in the source file. |
$$\phantom{******** If you see this on the webpage then the
browser could not locate *********}$$
$$\phantom{******** jsMath/easy/load.js or the variable root
is set wrong in this file *********}$$
$$\newcommand{\vector}[1]{\left[\begin{array}{c} #1 \end{array}\right]}$$
$$\newenvironment{matrix}{\left[\begin{array}{cccccccccc}} {\end{array}\right]}$$
$$\newcommand{\A}{{\cal A}}$$
$$\newcommand{\W}{{\cal W}}$$
#/* Copyright 2008-2013 Research Foundation State University of New York */
#/* This file is part of QUB Express. */
#/* QUB Express is free software; you can redistribute it and/or modify */
#/* it under the terms of the GNU General Public License as published by */
#/* the Free Software Foundation, either version 3 of the License, or */
#/* (at your option) any later version. */
#/* QUB Express is distributed in the hope that it will be useful, */
#/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
#/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
#/* GNU General Public License for more details. */
#/* You should have received a copy of the GNU General Public License, */
#/* named LICENSE.txt, in the QUB Express program directory. If not, see */
#/* <http://www.gnu.org/licenses/>. */
import numpy
import scipy
import traceback
from qubx.fast.fast_utils import *
import qubx.fast.model
QUBX_IDLZ_METHODS = ["Threshold", "Viterbi", "SKM"]
import ctypes
try:
if 'windows' in os.platform.system().lower():
ctypes.cdll.LoadLibrary('OpenCL.dll')
maxill = ctypes.cdll.LoadLibrary('maxill_opencl.dll')
except:
try:
maxill = ctypes.cdll.LoadLibrary('maxill.dll')
except:
try:
maxill = ctypes.cdll.LoadLibrary('libmaxill_opencl.so')
except:
try:
maxill = ctypes.cdll.LoadLibrary('@executable_path/../Frameworks/libmaxill_opencl.so')
except:
try:
maxill = ctypes.cdll.LoadLibrary('libmaxill.so')
except OSError:
maxill = ctypes.cdll.LoadLibrary('@executable_path/../Frameworks/libmaxill.so')
maxill.qubx_idlz_data_create.argtypes = (c_double, c_int, c_int)
maxill.qubx_idlz_data_create.restype = c_void_p
maxill.qubx_idlz_data_reset.argtypes = (c_void_p, c_double, c_int, c_int)
maxill.qubx_idlz_data_reset.restype = None
maxill.qubx_idlz_data_free.argtypes = (c_void_p,)
maxill.qubx_idlz_data_free.restype = None
maxill.qubx_idlz_data_append_segment.argtypes = (c_void_p, c_int)
maxill.qubx_idlz_data_append_segment.restype = c_int
maxill.qubx_idlz_data_append_chunk.argtypes = (c_void_p, c_int, c_int, c_float_p,
c_int_p, c_int_pp, c_float_pp, c_double_pp)
maxill.qubx_idlz_data_append_chunk.restype = None
maxill.qubx_idlz_data_get_stimclasses.argtypes = (c_void_p, c_int_p)
maxill.qubx_idlz_data_get_stimclasses.restype = c_double_p
maxill.qubx_idlz_data_get_stimclass_frac.argtypes = (c_void_p,)
maxill.qubx_idlz_data_get_stimclass_frac.restype = c_double_p
maxill.qubx_idlz_data_get_dwellcount.argtypes = (c_void_p, c_int)
maxill.qubx_idlz_data_get_dwellcount.restype = c_int
maxill.qubx_idlz_data_get_dwells.argtypes = (c_void_p, c_int, c_int_p, c_int_p, c_int_p, c_double_p, c_double_p)
maxill.qubx_idlz_data_get_dwells.restype = c_void_p
maxill.qubx_idlz_data_get_baseline.argtypes = (c_void_p, c_int, c_int, c_int, c_float_p)
maxill.qubx_idlz_data_get_baseline.restype = c_int
class Data(object):
def __init__(self, sampling, Nstimsig, data_cap=2**16):
self.obj = maxill.qubx_idlz_data_create(sampling, Nstimsig, data_cap)
self.sampling = sampling
self.Nstimsig = Nstimsig
self.Nsig = Nstimsig + 1
self.Ndata = 0
self.seg_Ndata = []
def __del__(self):
maxill.qubx_idlz_data_free(self.obj)
def reset(self, sampling, Nstimsig, data_cap=2**16):
maxill.qubx_idlz_data_reset(self.obj, sampling, Nstimsig, data_cap)
self.sampling = sampling
self.Nstimsig = Nstimsig
self.Ndata = 0
def append_segment(self, first):
maxill.qubx_idlz_data_append_segment(self.obj, first)
self.seg_Ndata.append(0)
def append_chunk(self, seg_ix, Nd, I, dwellCounts, classeses, durationses, ampses):
dcs = numpy.array(dwellCounts, dtype='int32')
# assuming the elements of classeses and durationses are numpy.arrays of int, float, double respectively
ccs = (c_int_p*self.Nstimsig)(*[cdata(classes, c_int_p) for classes in classeses])
dds = (c_float_p*self.Nstimsig)(*[cdata(durations, c_float_p) for durations in durationses])
aas = (c_double_p*self.Nstimsig)(*[cdata(amps, c_double_p) for amps in ampses])
maxill.qubx_idlz_data_append_chunk(self.obj, seg_ix, Nd, cdata(I, c_float_p),
cdata(dcs, c_int_p), ccs, dds, aas)
if I != None:
self.Ndata += Nd
self.seg_Ndata[-1] += Nd
def get_stimclasses(self):
Nstim = c_int()
self.stimclasses = maxill.qubx_idlz_data_get_stimclasses(self.obj, byref(Nstim))
self.Nstim = Nstim.value
#self.stimclasses = numpy.frombuffer(pybuf(stimcls_p, self.Nstim*self.Nsig*sizeof(c_double)), dtype='float64', count=self.Nstim*self.Nsig).reshape((self.Nstim,self.Nsig))
return self.stimclasses
def get_stimclass_frac(self):
self.sc_frac = maxill.qubx_idlz_data_get_stimclass_frac(self.obj)
#self.sc_frac = numpy.frombuffer(pybuf(sc_frac_p, self.Nstim*sizeof(c_double)), dtype='float64', count=self.Nstim)
return self.sc_frac
def get_dwells(self, iseg):
ncls = c_int()
count = maxill.qubx_idlz_data_get_dwellcount(self.obj, iseg, byref(ncls))
if count:
ff = numpy.zeros(dtype='int32', shape=(count,))
ll = numpy.zeros(dtype='int32', shape=(count,))
cc = numpy.zeros(dtype='int32', shape=(count,))
aa = numpy.zeros(dtype='float64', shape=(ncls.value,))
ss = numpy.zeros(dtype='float64', shape=(ncls.value,))
maxill.qubx_idlz_data_get_dwells(self.obj, iseg, cdata(ff, c_int_p), cdata(ll, c_int_p), cdata(cc, c_int_p),
cdata(aa, c_double_p), cdata(ss, c_double_p))
else:
ff = ll = cc = numpy.zeros(dtype='int32', shape=(0,))
aa = ss = numpy.zeros(dtype='float64', shape=(0,))
return ff, ll, cc, aa, ss
def get_baseline(self, iseg, offset=0, count=None):
n = self.seg_Ndata[iseg] if (count is None) else count
baseline = numpy.zeros(dtype='float32', shape=(n,))
maxill.qubx_idlz_data_get_baseline(self.obj, iseg, offset, n, cdata(baseline, c_float_p))
return baseline
maxill.qubx_idlz_halfamp.argtypes = (qubx.fast.model.PModel, c_void_p, qubx.fast.model.PStimAmps)
maxill.qubx_idlz_halfamp.restype = c_int
def halfamp(model, data, ampm):
model_obj = model.obj if isinstance(model, qubx.fast.model.Model) else model
result = maxill.qubx_idlz_halfamp(model_obj, data.obj, ampm.obj)
if (0 != result):
raise Exception('qubx_idealize.halfamp error code: %d' % result)
return 0.0
maxill.qubx_idlz_skm.argtypes = (qubx.fast.model.PModel, c_void_p, qubx.fast.model.PStimAmps, qubx.fast.model.PStimRates, c_double, c_int, c_int, c_int, c_int, c_double, c_double_p)
maxill.qubx_idlz_skm.restype = c_int
def skm(model, data, ampm, ratesm, resolution=5e-2, method=1, reest_amps=True, reest_rates=False, track_baseline=False, baseline_std=1e-3):
model_obj = model.obj if isinstance(model, qubx.fast.model.Model) else model
ll = c_double()
result = maxill.qubx_idlz_skm(model_obj, data.obj, ampm.obj, ratesm.obj, resolution, int(method),
int(reest_amps), int(reest_rates), int(track_baseline), baseline_std, byref(ll))
if (0 != result) and (-10 != result):
raise Exception('qubx_idealize.skm error code: %d' % result)
return ll.value