From 8d5f0bcb0ea908a5f8a7808a002f716583c3fc85 Mon Sep 17 00:00:00 2001 From: Tomas Farago Date: Wed, 9 Oct 2019 08:44:33 +0200 Subject: Add axis-pos parameter to forwardproject --- src/kernels/forwardproject.cl | 7 ++++--- src/ufo-forwardproject-task.c | 22 +++++++++++++++++++++- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/kernels/forwardproject.cl b/src/kernels/forwardproject.cl index 1022ede..18a8019 100644 --- a/src/kernels/forwardproject.cl +++ b/src/kernels/forwardproject.cl @@ -24,6 +24,7 @@ constant sampler_t sampler = CLK_NORMALIZED_COORDS_FALSE | kernel void forwardproject(read_only image2d_t slice, global float *sinogram, + float axis_pos, float angle_step) { const int idx = get_global_id(0); @@ -32,9 +33,9 @@ forwardproject(read_only image2d_t slice, const float angle = idy * angle_step; /* radius of object circle */ - const float r = slice_width / 2.0f; + const float r = fmin (axis_pos, slice_width - axis_pos); /* positive/negative distance from detector center */ - const float d = idx - r; + const float d = idx - axis_pos + 0.5f; /* length of the cut through the circle */ const float l = sqrt(4.0f*r*r - 4.0f*d*d); @@ -46,7 +47,7 @@ forwardproject(read_only image2d_t slice, const float2 N = (float2) (D.y, -D.x); /* sample point in the circle traveling along N */ - float2 sample = d * D - l/2.0f * N + ((float2) (r, r)); + float2 sample = d * D - l/2.0f * N + ((float2) (axis_pos, axis_pos)); float sum = 0.0f; for (int i = 0; i < l; i++) { diff --git a/src/ufo-forwardproject-task.c b/src/ufo-forwardproject-task.c index fe200a8..c5c60cf 100644 --- a/src/ufo-forwardproject-task.c +++ b/src/ufo-forwardproject-task.c @@ -29,6 +29,7 @@ struct _UfoForwardprojectTaskPrivate { cl_kernel kernel; cl_mem slice_mem; + gfloat axis_pos; gfloat angle_step; guint num_projections; }; @@ -43,6 +44,7 @@ G_DEFINE_TYPE_WITH_CODE (UfoForwardprojectTask, ufo_forwardproject_task, UFO_TYP enum { PROP_0, + PROP_AXIS_POSITION, PROP_ANGLE_STEP, PROP_NUM_PROJECTIONS, N_PROPERTIES @@ -90,6 +92,9 @@ ufo_forwardproject_task_get_requisition (UfoTask *task, requisition->n_dims = 2; requisition->dims[0] = in_req.dims[0]; requisition->dims[1] = priv->num_projections; + if (priv->axis_pos == -G_MAXFLOAT) { + priv->axis_pos = in_req.dims[0] / 2.0f; + } } static guint @@ -134,7 +139,8 @@ ufo_forwardproject_task_process (UfoTask *task, UFO_RESOURCES_CHECK_CLERR (clSetKernelArg (priv->kernel, 0, sizeof (cl_mem), &in_mem)); UFO_RESOURCES_CHECK_CLERR (clSetKernelArg (priv->kernel, 1, sizeof (cl_mem), &out_mem)); - UFO_RESOURCES_CHECK_CLERR (clSetKernelArg (priv->kernel, 2, sizeof (gfloat), &priv->angle_step)); + UFO_RESOURCES_CHECK_CLERR (clSetKernelArg (priv->kernel, 2, sizeof (gfloat), &priv->axis_pos)); + UFO_RESOURCES_CHECK_CLERR (clSetKernelArg (priv->kernel, 3, sizeof (gfloat), &priv->angle_step)); ufo_profiler_call (profiler, cmd_queue, priv->kernel, 2, requisition->dims, NULL); @@ -150,6 +156,9 @@ ufo_forwardproject_task_set_property (GObject *object, UfoForwardprojectTaskPrivate *priv = UFO_FORWARDPROJECT_TASK_GET_PRIVATE (object); switch (property_id) { + case PROP_AXIS_POSITION: + priv->axis_pos = g_value_get_float (value); + break; case PROP_ANGLE_STEP: priv->angle_step = g_value_get_float(value); break; @@ -171,6 +180,9 @@ ufo_forwardproject_task_get_property (GObject *object, UfoForwardprojectTaskPrivate *priv = UFO_FORWARDPROJECT_TASK_GET_PRIVATE (object); switch (property_id) { + case PROP_AXIS_POSITION: + g_value_set_float (value, priv->axis_pos); + break; case PROP_ANGLE_STEP: g_value_set_float(value, priv->angle_step); break; @@ -218,6 +230,13 @@ ufo_forwardproject_task_class_init (UfoForwardprojectTaskClass *klass) gobject_class->get_property = ufo_forwardproject_task_get_property; gobject_class->finalize = ufo_forwardproject_task_finalize; + properties[PROP_AXIS_POSITION] = + g_param_spec_float ("axis-pos", + "Position of rotation axis", + "Position of rotation axis", + -G_MAXFLOAT, G_MAXFLOAT, -G_MAXFLOAT, + G_PARAM_READWRITE); + properties[PROP_ANGLE_STEP] = g_param_spec_float("angle-step", "Increment of angle in radians", @@ -245,6 +264,7 @@ ufo_forwardproject_task_init(UfoForwardprojectTask *self) { self->priv = UFO_FORWARDPROJECT_TASK_GET_PRIVATE(self); + self->priv->axis_pos = -G_MAXFLOAT; self->priv->num_projections = 256; self->priv->angle_step = 0; } -- cgit v1.2.1