fixed size read bug and added tests
This commit is contained in:
@ -61,25 +61,33 @@ static PyObject *ClusterFileReader_read(ClusterFileReader *self,
|
|||||||
|
|
||||||
const int ndim = 1;
|
const int ndim = 1;
|
||||||
Py_ssize_t size = 0;
|
Py_ssize_t size = 0;
|
||||||
PyObject *noise_obj;
|
PyObject *noise_obj = NULL;
|
||||||
if (!PyArg_ParseTuple(args, "nO", &size, &noise_obj)) {
|
PyObject *noise_array = NULL;
|
||||||
|
if (!PyArg_ParseTuple(args, "n|O", &size, &noise_obj)) {
|
||||||
PyErr_SetString(PyExc_TypeError, "Could not parse args.");
|
PyErr_SetString(PyExc_TypeError, "Could not parse args.");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
npy_intp dims[] = {size};
|
npy_intp dims[] = {size};
|
||||||
|
|
||||||
// Create two numpy arrays from the passed objects, if possible numpy will
|
// If possible numpy will
|
||||||
// use the underlying buffer, otherwise it will create a copy, for example
|
// use the underlying buffer, otherwise it will create a copy, for example
|
||||||
// if data type is different or we pass in a list. The
|
// if data type is different or we pass in a list. The
|
||||||
// NPY_ARRAY_C_CONTIGUOUS flag ensures that we have contiguous memory.
|
// NPY_ARRAY_C_CONTIGUOUS flag ensures that we have contiguous memory.
|
||||||
PyObject *noise_array =
|
|
||||||
PyArray_FROM_OTF(noise_obj, NPY_DOUBLE, NPY_ARRAY_C_CONTIGUOUS);
|
|
||||||
|
|
||||||
|
#ifdef CR_VERBOSE
|
||||||
|
printf("Getting ready to read: %lu clusters. Noise map: %p\n", size,
|
||||||
|
noise_obj);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// If the user passed a noise map we fetch a pointer to that array as well
|
||||||
int nx = 0, ny = 0;
|
int nx = 0, ny = 0;
|
||||||
double *noise_map = NULL;
|
double *noise_map = NULL;
|
||||||
|
if (noise_obj) {
|
||||||
// If parsing of a or b fails we throw an exception in Python
|
noise_array =
|
||||||
if (noise_array) {
|
PyArray_FROM_OTF(noise_obj, NPY_DOUBLE, NPY_ARRAY_C_CONTIGUOUS);
|
||||||
|
|
||||||
int ndim_noise = PyArray_NDIM((PyArrayObject *)(noise_array));
|
int ndim_noise = PyArray_NDIM((PyArrayObject *)(noise_array));
|
||||||
npy_intp *noise_shape = PyArray_SHAPE((PyArrayObject *)(noise_array));
|
npy_intp *noise_shape = PyArray_SHAPE((PyArrayObject *)(noise_array));
|
||||||
@ -126,10 +134,10 @@ static PyObject *ClusterFileReader_read(ClusterFileReader *self,
|
|||||||
// Here goes the looping, removing frame numbers etc.
|
// Here goes the looping, removing frame numbers etc.
|
||||||
int n_read = 0;
|
int n_read = 0;
|
||||||
if (noise_map)
|
if (noise_map)
|
||||||
read_clusters_with_cut(self->fp, size, buf, &self->n_left, noise_map,
|
n_read = read_clusters_with_cut(self->fp, size, buf, &self->n_left, noise_map,
|
||||||
nx, ny);
|
nx, ny);
|
||||||
else
|
else
|
||||||
read_clusters(self->fp, size, buf, &self->n_left);
|
n_read = read_clusters(self->fp, size, buf, &self->n_left);
|
||||||
|
|
||||||
if (n_read != size) {
|
if (n_read != size) {
|
||||||
// resize the array to match the number of read photons
|
// resize the array to match the number of read photons
|
||||||
|
@ -85,10 +85,33 @@ def test_read_file_with_37_frames(data_path):
|
|||||||
def test_read_file_with_37_frames_in_chunks(data_path):
|
def test_read_file_with_37_frames_in_chunks(data_path):
|
||||||
#File shoud contain 37 frames with 5 clusters each
|
#File shoud contain 37 frames with 5 clusters each
|
||||||
#Full spec in utils/write_test_data.py
|
#Full spec in utils/write_test_data.py
|
||||||
fname= (data_path/'37frames_with_5_clusters.clust').as_posix()
|
fname= data_path/'37frames_with_5_clusters.clust'
|
||||||
r = ClusterFileReader(fname)
|
r = ClusterFileReader(fname)
|
||||||
total_clusters = 0
|
total_clusters = 0
|
||||||
while (clusters:=r.read(7)).size:
|
while (clusters:=r.read(7)).size:
|
||||||
total_clusters += clusters.size
|
total_clusters += clusters.size
|
||||||
assert total_clusters == 185
|
assert total_clusters == 185
|
||||||
|
|
||||||
|
|
||||||
|
def test_read_file_with_noise_mask(data_path):
|
||||||
|
#No mask
|
||||||
|
fname= data_path/'noise_test.clust'
|
||||||
|
r = ClusterFileReader(fname)
|
||||||
|
cl = r.read(85) #file contains 70 clusters
|
||||||
|
assert cl.size == 70
|
||||||
|
|
||||||
|
#noise mask with zeros
|
||||||
|
noise_cut = np.zeros((400,400))
|
||||||
|
r = ClusterFileReader(fname)
|
||||||
|
cl = r.read(85, noise_cut)
|
||||||
|
assert cl.size == 70
|
||||||
|
|
||||||
|
#only pixel 80, 133 above noise
|
||||||
|
noise_cut[:] = 100
|
||||||
|
|
||||||
|
#TODO! Agree on orientation of noise mask!
|
||||||
|
# noise_cut[80,133] = 0
|
||||||
|
noise_cut[133,80] = 0
|
||||||
|
r = ClusterFileReader(fname)
|
||||||
|
cl = r.read(85, noise_cut)
|
||||||
|
assert cl.size == 10
|
@ -40,4 +40,21 @@ with open(path/'37frames_with_5_clusters.clust', 'wb') as f:
|
|||||||
data['data'] = np.arange(j,j+9)
|
data['data'] = np.arange(j,j+9)
|
||||||
print(data)
|
print(data)
|
||||||
data.tofile(f)
|
data.tofile(f)
|
||||||
|
|
||||||
|
#Writing out data to test noise cuts
|
||||||
|
header[1] = 7
|
||||||
|
|
||||||
|
with open(path/'noise_test.clust', 'wb') as f:
|
||||||
|
for i in range(10):
|
||||||
|
data['x'] = 50
|
||||||
|
data['y'] = 133
|
||||||
|
data['data'][:] = 50
|
||||||
|
|
||||||
|
header.tofile(f)
|
||||||
|
print(header)
|
||||||
|
header[0] += 1
|
||||||
|
|
||||||
|
for j in range(7):
|
||||||
|
print(data)
|
||||||
|
data.tofile(f)
|
||||||
|
data['x'] += 10
|
Reference in New Issue
Block a user