fixed bug introduced by resizing nph

This commit is contained in:
froejdh_e 2023-10-27 11:02:42 +02:00
parent 916ec20a1c
commit 8471ba22fb
5 changed files with 18 additions and 17 deletions

View File

@ -6,7 +6,7 @@
//clang-format off //clang-format off
typedef struct { typedef struct {
PyObject_HEAD FILE *fp; PyObject_HEAD FILE *fp;
size_t n_left; uint32_t n_left;
Py_ssize_t chunk; Py_ssize_t chunk;
} ClusterFileReader; } ClusterFileReader;
//clang-format on //clang-format on

View File

@ -1,12 +1,12 @@
#include "cluster_reader.h" #include "cluster_reader.h"
#include <assert.h> #include <assert.h>
size_t read_clusters(FILE *fp, size_t n_clusters, Cluster *buf, size_t *n_left) { size_t read_clusters(FILE *fp, size_t n_clusters, Cluster *buf, uint32_t *n_left) {
int iframe = 0; int iframe = 0;
size_t nph = *n_left; uint32_t nph = *n_left;
size_t nph_read = 0; size_t nph_read = 0;
size_t nn = *n_left; uint32_t nn = *n_left;
size_t nr = 0; size_t nr = 0;
// read photons left from previous frame // read photons left from previous frame
@ -26,8 +26,9 @@ size_t read_clusters(FILE *fp, size_t n_clusters, Cluster *buf, size_t *n_left)
// keep on reading frames and photons until reaching n_clusters // keep on reading frames and photons until reaching n_clusters
while (fread(&iframe, sizeof(iframe), 1, fp)) { while (fread(&iframe, sizeof(iframe), 1, fp)) {
// read number of clusters in frame
if (fread(&nph, sizeof(nph), 1, fp)) { if (fread(&nph, sizeof(nph), 1, fp)) {
if (nph > n_clusters - nph_read) if (nph > (n_clusters - nph_read))
nn = n_clusters - nph_read; nn = n_clusters - nph_read;
else else
nn = nph; nn = nph;
@ -45,9 +46,9 @@ size_t read_clusters(FILE *fp, size_t n_clusters, Cluster *buf, size_t *n_left)
} }
size_t read_clusters_with_cut(FILE *fp, size_t n_clusters, Cluster *buf, size_t read_clusters_with_cut(FILE *fp, size_t n_clusters, Cluster *buf,
size_t *n_left, double *noise_map, int nx, int ny) { uint32_t *n_left, double *noise_map, int nx, int ny) {
int iframe = 0; int iframe = 0;
size_t nph = *n_left; uint32_t nph = *n_left;
size_t nph_read = 0; size_t nph_read = 0;

View File

@ -5,9 +5,9 @@
#include "data_types.h" #include "data_types.h"
//Pure C implementation to read a cluster file //Pure C implementation to read a cluster file
size_t read_clusters(FILE* fp, size_t n_clusters, Cluster* buf, size_t *n_left); size_t read_clusters(FILE* fp, size_t n_clusters, Cluster* buf, uint32_t *n_left);
size_t read_clusters_with_cut(FILE* fp, size_t n_clusters, Cluster* buf, size_t *n_left, double *noise_map, int nx, int ny); size_t read_clusters_with_cut(FILE* fp, size_t n_clusters, Cluster* buf, uint32_t *n_left, double *noise_map, int nx, int ny);
int analyze_clusters(int64_t n_clusters, int32_t* cin, ClusterAnalysis *cout, int csize); int analyze_clusters(int64_t n_clusters, int32_t* cin, ClusterAnalysis *cout, int csize);

View File

@ -64,7 +64,7 @@ static PyObject *clusterize(PyObject *Py_UNUSED(self), PyObject *args) {
Py_ssize_t size = 0; Py_ssize_t size = 0;
PyObject *data_obj; PyObject *data_obj;
if (!PyArg_ParseTuple(args, "nO", &size,&data_obj)) { if (!PyArg_ParseTuple(args, "nO", &size, &data_obj)) {
PyErr_SetString( PyErr_SetString(
PyExc_TypeError, PyExc_TypeError,
"Could not parse args."); "Could not parse args.");

View File

@ -3,10 +3,10 @@ from fixtures import data_path
from creader import ClusterFileReader, clusterize from creader import ClusterFileReader, clusterize
import sys import sys
def test_references_on_clusterize(data_path): # def test_references_on_clusterize(data_path):
fname= (data_path/'beam_En700eV_-40deg_300V_10us_d0_f0_100.clust').as_posix() # fname= (data_path/'beam_En700eV_-40deg_300V_10us_d0_f0_100.clust').as_posix()
r = ClusterFileReader(fname) # r = ClusterFileReader(fname)
clusters = r.read(10) # clusters = r.read(10)
result = clusterize(clusters) # result = clusterize(clusters)
assert sys.getrefcount(clusters) == 2 #Over counts by one due to call by reference # assert sys.getrefcount(clusters) == 2 #Over counts by one due to call by reference
assert sys.getrefcount(result) == 2 # assert sys.getrefcount(result) == 2