Added hdf reader, but there still seems to be a memory leakage bug.
This commit is contained in:
parent
57d9274199
commit
62c8863a4e
5 changed files with 187 additions and 2 deletions
2
extern/limedriver
vendored
2
extern/limedriver
vendored
|
@ -1 +1 @@
|
||||||
Subproject commit 3d1c7bdf2ce95fb69f5a89b195a0f6e18496f97f
|
Subproject commit f9d86bd4dea17250d9b0267936fb99d35a4ad1fd
|
|
@ -17,7 +17,10 @@ classifiers = [
|
||||||
requires = [
|
requires = [
|
||||||
"setuptools",
|
"setuptools",
|
||||||
"wheel",
|
"wheel",
|
||||||
"Cython"
|
"Cython",
|
||||||
|
"h5py",
|
||||||
|
"numpy",
|
||||||
|
'matplotlib',
|
||||||
]
|
]
|
||||||
|
|
||||||
build-backend = "setuptools.build_meta"
|
build-backend = "setuptools.build_meta"
|
|
@ -1 +1,2 @@
|
||||||
import limedriver.binding
|
import limedriver.binding
|
||||||
|
import limedriver.hdf_reader
|
149
src/limedriver/hdf_reader.py
Normal file
149
src/limedriver/hdf_reader.py
Normal file
|
@ -0,0 +1,149 @@
|
||||||
|
import h5py
|
||||||
|
import numpy as np
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
|
||||||
|
# class for accessing data of stored HDF5 file this is from the limr program by andrin doll
|
||||||
|
class HDF():
|
||||||
|
|
||||||
|
def __init__(self, filename = ''):
|
||||||
|
|
||||||
|
# check first for the filename provided
|
||||||
|
if filename != '':
|
||||||
|
self.HDFsrc = filename
|
||||||
|
else:
|
||||||
|
self.HDFsrc = ''
|
||||||
|
|
||||||
|
# get data
|
||||||
|
self.__get_data()
|
||||||
|
|
||||||
|
# just an alias for __init__ that does load a specific file
|
||||||
|
def load(self, filename = ''):
|
||||||
|
self.__init__(filename)
|
||||||
|
|
||||||
|
# gets the data of the file
|
||||||
|
def __get_data(self):
|
||||||
|
|
||||||
|
if (self.HDFsrc == '') | (self.HDFsrc == []):
|
||||||
|
# initialize all as empty
|
||||||
|
self.tdy = []
|
||||||
|
self.tdx = []
|
||||||
|
self.attrs = []
|
||||||
|
self.parsoutp = {}
|
||||||
|
self.parvar = {}
|
||||||
|
|
||||||
|
else:
|
||||||
|
f = h5py.File(self.HDFsrc, 'r')
|
||||||
|
|
||||||
|
print("opened file")
|
||||||
|
HDFkeys = list(f.keys())
|
||||||
|
|
||||||
|
for ii, HDFkey in enumerate(HDFkeys):
|
||||||
|
if ii == 0:
|
||||||
|
# initialize data array
|
||||||
|
dsize = f[HDFkey].shape
|
||||||
|
inddim = dsize[0]
|
||||||
|
self.tdy = np.zeros((int(dsize[1]/2), int(dsize[0] * len(HDFkeys))),dtype=np.complex_)
|
||||||
|
|
||||||
|
print("initialize")
|
||||||
|
# initialize the output objects
|
||||||
|
self.attrs = [dynclass() for jj in range(len(HDFkeys))]
|
||||||
|
|
||||||
|
print("get the attribute keys")
|
||||||
|
# get the attribute keys
|
||||||
|
self.parsoutp = {}
|
||||||
|
ii_oupargs = 0
|
||||||
|
for item in f[HDFkey].attrs.items():
|
||||||
|
print(item)
|
||||||
|
itemname = item[0][5:]
|
||||||
|
itemarg = item[0][1:4]
|
||||||
|
if not ('///' in itemarg):
|
||||||
|
self.parsoutp[itemarg] = [ item[1], itemname]
|
||||||
|
else:
|
||||||
|
self.parsoutp['//'+str(ii_oupargs)] = [ item[1], itemname]
|
||||||
|
ii_oupargs+=1
|
||||||
|
|
||||||
|
print("end of loop")
|
||||||
|
|
||||||
|
print("look for vars")
|
||||||
|
# look for eventual parvar lists
|
||||||
|
self.parvar = {}
|
||||||
|
for item in f.attrs.items():
|
||||||
|
self.parvar[item[0]] = item[1]
|
||||||
|
|
||||||
|
|
||||||
|
# Get the data
|
||||||
|
data_raw = np.array(f[HDFkey])
|
||||||
|
try:
|
||||||
|
self.tdy[:,ii*inddim:(ii+1)*inddim] = np.transpose(np.float_(data_raw[:,::2])) + 1j*np.transpose(np.float_(data_raw[:,1::2]))
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
# Get the arguments
|
||||||
|
ii_oupargs = 0
|
||||||
|
for item in f[HDFkey].attrs.items():
|
||||||
|
itemname = item[0][5:]
|
||||||
|
itemarg = item[0][1:4]
|
||||||
|
if not ('///' in itemarg):
|
||||||
|
setattr(self.attrs[ii], itemarg, item[1])
|
||||||
|
else:
|
||||||
|
setattr(self.attrs[ii], '//'+str(ii_oupargs), item[1])
|
||||||
|
ii_oupargs+=1
|
||||||
|
|
||||||
|
f.close()
|
||||||
|
srate_MHz = getattr(self.attrs[0], 'sra')*1e-6
|
||||||
|
self.tdx = 1/srate_MHz*np.arange(self.tdy.shape[0])
|
||||||
|
|
||||||
|
# get an argument by matching the text description
|
||||||
|
def attr_by_txt(self, pattern):
|
||||||
|
for key in sorted(self.parsoutp):
|
||||||
|
if pattern in self.parsoutp[key][1]: # pattern match
|
||||||
|
attr = getattr(self.attrs[0], key)
|
||||||
|
try:
|
||||||
|
ouparr = np.zeros( ( len(attr), len(self.attrs)), attr.dtype)
|
||||||
|
except:
|
||||||
|
ouparr = np.zeros( ( 1, len(self.attrs)), attr.dtype)
|
||||||
|
|
||||||
|
for ii in np.arange(len(self.attrs)):
|
||||||
|
ouparr[:,ii] = getattr(self.attrs[ii], key)
|
||||||
|
return np.transpose(ouparr)
|
||||||
|
|
||||||
|
print('Problem obtaining the attribute from the description using the pattern ' + pattern + '!')
|
||||||
|
print('Valid descriptions are: ')
|
||||||
|
self.print_params()
|
||||||
|
|
||||||
|
# get an argument by key
|
||||||
|
def attr_by_key(self, key):
|
||||||
|
if key in dir(self.attrs[0]):
|
||||||
|
attr = getattr(self.attrs[0], key)
|
||||||
|
try:
|
||||||
|
ouparr = np.zeros( ( len(attr), len(self.attrs)), attr.dtype)
|
||||||
|
except:
|
||||||
|
ouparr = np.zeros( ( 1, len(self.attrs)), attr.dtype)
|
||||||
|
for ii in np.arange(len(self.attrs)):
|
||||||
|
ouparr[:,ii] = getattr(self.attrs[ii], key)
|
||||||
|
return np.transpose(ouparr)
|
||||||
|
|
||||||
|
print('Problem obtaining the attribute from key ' + key + '!')
|
||||||
|
print('Valid keys are: ')
|
||||||
|
self.print_params()
|
||||||
|
|
||||||
|
|
||||||
|
# print the arguments
|
||||||
|
def print_params(self, ouponly = False):
|
||||||
|
for key in sorted(self.parsoutp):
|
||||||
|
val = getattr(self.attrs[0], key)
|
||||||
|
if not('//' in key): # input argument?
|
||||||
|
if ouponly: continue;
|
||||||
|
|
||||||
|
print('{:<5}: {:>50} {:<25}'.format(key, val, self.parsoutp[key][1]))
|
||||||
|
|
||||||
|
def plot_dta(self):
|
||||||
|
plt.plot(self.tdx, self.tdy.real)
|
||||||
|
plt.xlabel('$t$ [$\mu$s]')
|
||||||
|
plt.ylabel('$y$ [Counts]')
|
||||||
|
plt.show()
|
||||||
|
|
||||||
|
# empty class to store dynamic attributes, basically for the attributes in HDF keys
|
||||||
|
class dynclass:
|
||||||
|
pass
|
|
@ -8,6 +8,8 @@ from libc.string cimport memcpy, strcpy
|
||||||
|
|
||||||
from libcpp.string cimport string
|
from libcpp.string cimport string
|
||||||
|
|
||||||
|
import pathlib
|
||||||
|
|
||||||
cdef extern from "limedriver.h":
|
cdef extern from "limedriver.h":
|
||||||
cdef struct LimeConfig_t:
|
cdef struct LimeConfig_t:
|
||||||
float srate
|
float srate
|
||||||
|
@ -149,8 +151,33 @@ cdef class PyLimeConfig:
|
||||||
|
|
||||||
def __dealloc__(self):
|
def __dealloc__(self):
|
||||||
if self._config is not NULL:
|
if self._config is not NULL:
|
||||||
|
free(self._config.p_frq)
|
||||||
|
free(self._config.p_dur)
|
||||||
|
free(self._config.p_dur_smp)
|
||||||
|
free(self._config.p_offs)
|
||||||
|
free(self._config.p_amp)
|
||||||
|
free(self._config.p_frq_smp)
|
||||||
|
free(self._config.p_pha)
|
||||||
|
free(self._config.p_phacyc_N)
|
||||||
|
free(self._config.p_phacyc_lev)
|
||||||
|
free(self._config.am_frq)
|
||||||
|
free(self._config.am_pha)
|
||||||
|
free(self._config.am_depth)
|
||||||
|
free(self._config.am_mode)
|
||||||
|
free(self._config.am_frq_smp)
|
||||||
|
free(self._config.fm_frq)
|
||||||
|
free(self._config.fm_pha)
|
||||||
|
free(self._config.fm_width)
|
||||||
|
free(self._config.fm_mode)
|
||||||
|
free(self._config.fm_frq_smp)
|
||||||
|
free(self._config.p_c0_en)
|
||||||
|
free(self._config.p_c1_en)
|
||||||
|
free(self._config.p_c2_en)
|
||||||
|
free(self._config.p_c3_en)
|
||||||
|
|
||||||
free(self._config)
|
free(self._config)
|
||||||
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def srate(self):
|
def srate(self):
|
||||||
return self._config.srate
|
return self._config.srate
|
||||||
|
@ -802,3 +829,8 @@ cdef class PyLimeConfig:
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
return run_experiment_from_LimeCfg(self._config[0])
|
return run_experiment_from_LimeCfg(self._config[0])
|
||||||
|
|
||||||
|
def get_path(self):
|
||||||
|
path = self.save_path + self.file_stamp + '_' + self.file_pattern + '.h5'
|
||||||
|
path = pathlib.Path(path).absolute()
|
||||||
|
return path
|
Loading…
Add table
Add a link
Reference in a new issue