26template <
int num_param>
31 this->_is_uncalibrated =
false;
34 this->_in_correct_scale =
false;
35 this->_is_converted_to_total_counts =
false;
39template <
int num_param>
44template <
int num_param>
48 std::ifstream data_stream(input_string.c_str());
49 unsigned int starting_frame, last_frame;
51 error(
"cannot read model matrix from file.\n");
54 data_stream >> starting_frame;
55 data_stream >> last_frame;
61 min_range[2] = starting_frame;
62 max_range[1] = num_param;
63 max_range[2] = last_frame;
68 for (
unsigned int frame_num = starting_frame; frame_num <= last_frame; ++frame_num)
69 for (
int param_num = 1; param_num <= num_param; ++param_num)
70 data_stream >> input_array[param_num][frame_num];
74 this->_model_array = input_array;
78template <
int num_param>
84 if (!(this->_model_array).get_regular_range(model_array_min, model_array_max))
85 error(
"Model array has not regular range");
86 unsigned int starting_frame = model_array_min[2], last_frame = model_array_max[2];
88 std::ofstream data_stream(output_string.c_str(), std::ios::out);
91 warning(
"ModelMatrix<num_param>::write_to_file: error opening output file %s\n", output_string.c_str());
96 data_stream << starting_frame <<
" ";
97 data_stream << last_frame <<
" ";
101 for (
unsigned int frame_num = starting_frame; frame_num <= last_frame; ++frame_num)
104 for (
int param_num = 1; param_num <= num_param; ++param_num)
105 data_stream << this->_model_array[param_num][frame_num] <<
" ";
108 return Succeeded::yes;
111template <
int num_param>
113ModelMatrix<num_param>::set_model_array(
const Array<2, float>& model_array)
115 this->_model_array = model_array;
118template <
int num_param>
120ModelMatrix<num_param>::get_model_array()
const
122 return this->_model_array;
125template <
int num_param>
126const VectorWithOffset<float>
127ModelMatrix<num_param>::get_model_array_sum()
const
129 BasicCoordinate<2, int> model_array_min, model_array_max;
130 if (!(this->_model_array).get_regular_range(model_array_min, model_array_max))
131 error(
"Model array has not regular range");
132 VectorWithOffset<float>
sum(model_array_min[1], model_array_max[1]);
133 for (
int param_num = model_array_min[1]; param_num <= model_array_max[1]; ++param_num)
135 sum[param_num] = 0.F;
136 for (
int frame_num = model_array_min[2]; frame_num <= model_array_max[2]; ++frame_num)
137 sum[param_num] += this->_model_array[param_num][frame_num];
142template <
int num_param>
147 if (!(this->_model_array).get_regular_range(model_array_min, model_array_max))
148 error(
"Model array has not regular range");
150 for (
int param_num = model_array_min[1]; param_num <= model_array_max[1]; ++param_num)
151 for (
int frame_num = model_array_min[2]; frame_num <= model_array_max[2]; ++frame_num)
152 if (this->_model_array[param_num][frame_num] <= 0)
153 this->_model_array[param_num][frame_num] = threshold_value;
156template <
int num_param>
160 this->_is_uncalibrated = is_uncalibrated;
163template <
int num_param>
165ModelMatrix<num_param>::set_is_in_correct_scale(
const bool in_correct_scale)
167 this->_in_correct_scale = in_correct_scale;
170template <
int num_param>
174 if (this->_is_uncalibrated)
175 warning(
"ModelMatrix is already uncalibrated, so it will be not re-uncalibrated.");
179 if (!(this->_model_array).get_regular_range(model_array_min, model_array_max))
180 error(
"Model array has not regular range");
182 for (
int param_num = model_array_min[1]; param_num <= model_array_max[1]; ++param_num)
183 for (
int frame_num = model_array_min[2]; frame_num <= model_array_max[2]; ++frame_num)
184 this->_model_array[param_num][frame_num] /= cal_factor;
190template <
int num_param>
194 if (this->_in_correct_scale)
195 warning(
"ModelMatrix is already scaled, so it will not be re-scaled. ");
199 if (!(this->_model_array).get_regular_range(model_array_min, model_array_max))
200 error(
"Model array has not regular range");
201 for (
int param_num = model_array_min[1]; param_num <= model_array_max[1]; ++param_num)
202 for (
int frame_num = model_array_min[2]; frame_num <= model_array_max[2]; ++frame_num)
203 this->_model_array[param_num][frame_num] *= scale_factor;
205 this->_in_correct_scale =
true;
209template <
int num_param>
213 if (ModelMatrix<num_param>::_is_converted_to_total_counts ==
true)
214 warning(
"ModelMatrix is already converted to total counts, so it will not be re-converted. ");
218 if (!(this->_model_array).get_regular_range(model_array_min, model_array_max))
219 error(
"Model array has not regular range");
220 for (
int param_num = model_array_min[1]; param_num <= model_array_max[1]; ++param_num)
221 for (
int frame_num = model_array_min[2]; frame_num <= model_array_max[2]; ++frame_num)
222 this->_model_array[param_num][frame_num] *=
static_cast<float>(time_frame_definitions.get_duration(frame_num));
224 this->_is_converted_to_total_counts =
true;
228template <
int num_param>
232 this->_time_vector = time_vector;
235template <
int num_param>
236VectorWithOffset<float>
237ModelMatrix<num_param>::get_time_vector()
const
239 return this->_time_vector;
242template <
int num_param>
248 if (!this->_model_array.get_regular_range(model_array_min, model_array_max))
249 error(
"Model array has not regular range");
254 assert(dynamic_image[1].size_all() == parametric_image.
size_all());
255 assert(dynamic_image.get_time_frame_definitions().
get_num_frames() ==
static_cast<unsigned int>(model_array_max[2]));
256 assert(model_array_max[1] - model_array_min[1] + 1 == num_param);
258 const int min_k_index = dynamic_image[1].get_min_index();
259 const int max_k_index = dynamic_image[1].get_max_index();
260 for (
int k = min_k_index; k <= max_k_index; ++k)
262 const int min_j_index = dynamic_image[1][k].get_min_index();
263 const int max_j_index = dynamic_image[1][k].get_max_index();
264 for (
int j = min_j_index; j <= max_j_index; ++j)
266 const int min_i_index = dynamic_image[1][k][j].get_min_index();
267 const int max_i_index = dynamic_image[1][k][j].get_max_index();
268 for (
int i = min_i_index; i <= max_i_index; ++i)
269 for (
int param_num = model_array_min[1]; param_num <= model_array_max[1]; ++param_num)
271 float sum_over_frames = 0.F;
272 for (
int frame_num = model_array_min[2]; frame_num <= model_array_max[2]; ++frame_num)
273 sum_over_frames += this->_model_array[param_num][frame_num] * dynamic_image[frame_num][k][j][i];
274 parametric_image[k][j][i][param_num] += sum_over_frames;
280template <
int num_param>
285 std::fill(parametric_image.begin_all(), parametric_image.end_all(), 0.F);
289template <
int num_param>
295 if (!(this->_model_array).get_regular_range(model_array_min, model_array_max))
296 error(
"Model array does not have a regular range");
301 assert(dynamic_image[1].size_all() == parametric_image.
size_all());
302 assert(dynamic_image.get_time_frame_definitions().
get_num_frames() ==
static_cast<unsigned int>(model_array_max[2]));
303 assert(model_array_max[1] - model_array_min[1] + 1 == num_param);
305 const int min_k_index = dynamic_image[1].get_min_index();
306 const int max_k_index = dynamic_image[1].get_max_index();
307 for (
int k = min_k_index; k <= max_k_index; ++k)
309 const int min_j_index = dynamic_image[1][k].get_min_index();
310 const int max_j_index = dynamic_image[1][k].get_max_index();
311 for (
int j = min_j_index; j <= max_j_index; ++j)
313 const int min_i_index = dynamic_image[1][k][j].get_min_index();
314 const int max_i_index = dynamic_image[1][k][j].get_max_index();
315 for (
int i = min_i_index; i <= max_i_index; ++i)
316 for (
int frame_num = model_array_min[2]; frame_num <= model_array_max[2]; ++frame_num)
318 float sum_over_param = 0.F;
319 for (
int param_num = model_array_min[1]; param_num <= model_array_max[1]; ++param_num)
320 sum_over_param += parametric_image[k][j][i][param_num] * this->_model_array[param_num][frame_num];
321 dynamic_image[frame_num][k][j][i] = sum_over_param;
327template <
int num_param>
332 std::fill(dynamic_image.begin_all(), dynamic_image.end_all(), 0.F);
336template <
int num_param>
342 if (!(this->_model_array).get_regular_range(model_array_min, model_array_max))
343 error(
"Model array has not regular range");
346 assert(model_array_max[1] - model_array_min[1] + 1 == num_param);
350 for (
int k = min_k_index; k <= max_k_index; ++k)
354 for (
int j = min_j_index; j <= max_j_index; ++j)
358 for (
int i = min_i_index; i <= max_i_index; ++i)
360 parametric_image_out[k][j][i][1] = parametric_image[k][j][i][1] / ((this->get_model_array_sum())[2]);
361 parametric_image_out[k][j][i][2] = parametric_image[k][j][i][2] / ((this->get_model_array_sum())[1]);
This class defines multi-dimensional (numeric) arrays.
Definition Array.h:78
size_t size_all() const
return the total number of elements in this array
Definition Array.inl:262
class BasicCoordinate<int num_dimensions, typename coordT> defines num_dimensions -dimensional coordi...
Definition BasicCoordinate.h:57
Class of multiple image frames, one for each time frame Each time frame is a DiscretisedDensity<3,...
Definition DynamicDiscretisedDensity.h:46
This class defines ranges which can be 'irregular'.
Definition IndexRange.h:69
void multiply_dynamic_image_with_model(ParametricVoxelsOnCartesianGrid ¶metric_image, const DynamicDiscretisedDensity &dynamic_image) const
multiply (transpose) model-matrix with dynamic image (overwriting original content of parametric_imag...
Definition ModelMatrix.inl:282
void scale_model_matrix(const float scale_factor)
Definition ModelMatrix.inl:192
~ModelMatrix()
default destructor
Definition ModelMatrix.inl:40
void multiply_parametric_image_with_model(DynamicDiscretisedDensity &dynamic_image, const ParametricVoxelsOnCartesianGrid ¶metric_image) const
multiply model-matrix with parametric image (overwriting original content of dynamic_image)
Definition ModelMatrix.inl:329
void threshold_model_array(const float threshold_value)
Function to give the threshold_value to the all elements of the model_array which lower value than th...
Definition ModelMatrix.inl:144
void read_from_file(const std::string input_string)
Implementation to read the model matrix.
Definition ModelMatrix.inl:46
Succeeded write_to_file(const std::string output_string)
Implementation to write the model matrix to a text file.
Definition ModelMatrix.inl:80
void multiply_parametric_image_with_model_and_add_to_input(DynamicDiscretisedDensity &dynamic_image, const ParametricVoxelsOnCartesianGrid ¶metric_image) const
multiply model-matrix with parametric image and add result to original dynamic_image
Definition ModelMatrix.inl:291
void convert_to_total_frame_counts(const TimeFrameDefinitions &time_frame_definitions)
Definition ModelMatrix.inl:211
void set_is_uncalibrated(const bool is_uncalibrated)
Function to set _is_calibrated boolean true or false.
Definition ModelMatrix.inl:158
void uncalibrate(const float cal_factor)
Definition ModelMatrix.inl:172
ModelMatrix()
default constructor
Definition ModelMatrix.inl:27
void multiply_dynamic_image_with_model_and_add_to_input(ParametricVoxelsOnCartesianGrid ¶metric_image, const DynamicDiscretisedDensity &dynamic_image) const
multiply (transpose) model-matrix with dynamic image and add result to original parametric_image
Definition ModelMatrix.inl:244
void construct_single_density(SingleDiscretisedDensityType &density, const int i) const
construct a single image corresponding to the parameter with index i
a class containing an enumeration type that can be used by functions to signal successful operation o...
Definition Succeeded.h:44
Class used for storing time frame durations.
Definition TimeFrameDefinitions.h:39
unsigned int get_num_frames() const
Get number of frames.
Definition TimeFrameDefinitions.cxx:92
A templated class for vectors, but with indices starting not from 0.
Definition VectorWithOffset.h:65
Declaration of stir::error()
void error(const char *const s,...)
Print error with format string a la printf and throw exception.
Definition error.cxx:42
void warning(const char *const s,...)
Print warning with format string a la printf.
Definition warning.cxx:41
elemT sum(IterT start, IterT end, elemT init)
Compute the sum of a sequence using operator+=(), using an initial value.
Definition more_algorithms.inl:52
ParametricDiscretisedDensity< ParametricVoxelsOnCartesianGridBaseType > ParametricVoxelsOnCartesianGrid
Convenience typedef for Cartesian Voxelised Parametric Images with just two parameters.
Definition ParametricDiscretisedDensity.h:172
Declaration of stir::warning()