CASToR  3.1
Tomographic Reconstruction (PET/SPECT/CT)
iLinearSpectralModel.cc
Go to the documentation of this file.
1 /*
2 This file is part of CASToR.
3 
4  CASToR is free software: you can redistribute it and/or modify it under the
5  terms of the GNU General Public License as published by the Free Software
6  Foundation, either version 3 of the License, or (at your option) any later
7  version.
8 
9  CASToR is distributed in the hope that it will be useful, but WITHOUT ANY
10  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11  FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
12  details.
13 
14  You should have received a copy of the GNU General Public License along with
15  CASToR (in file GNU_GPL.TXT). If not, see <http://www.gnu.org/licenses/>.
16 
17 Copyright 2017-2020 all CASToR contributors listed below:
18 
19  --> Didier BENOIT, Claude COMTAT, Marina FILIPOVIC, Thibaut MERLIN, Mael MILLARDET, Simon STUTE, Valentin VIELZEUF, Zacharias CHALAMPALAKIS
20 
21 This is CASToR version 3.1.
22 */
23 
30 #include "iLinearSpectralModel.hh"
31 #include "cmath"
32 #include "math.h"
33 
34 
35 
36 // =====================================================================
37 // ---------------------------------------------------------------------
38 // ---------------------------------------------------------------------
39 // =====================================================================
40 /*
41  \fn iDynamicModelTemplate
42  \brief Constructor of iDynamicModelTemplate. Simply set all data members to default values.
43 */
45 {
46  // --- Parameters inherited from vDynamicModel class --- //
47 
48  m_nbTimeBF = -1; // Number of basis functions in the model un-initialised
49 
50  // Negative initialization of specific model values
51  m_fast_exp = -1;
52  m_slow_exp = -1;
56  mp_spectral_bank=NULL;
57 
58  // Initialize number of additional basis functions to 0;
60 
61 }
62 
63 
64 
65 
66 // =====================================================================
67 // ---------------------------------------------------------------------
68 // ---------------------------------------------------------------------
69 // =====================================================================
70 /*
71  \fn ~iDynamicModelTemplate
72  \brief Destructor of iDynamicModelTemplate
73 */
75 {
76 
77 }
78 
79 
80 // =====================================================================
81 // ---------------------------------------------------------------------
82 // ---------------------------------------------------------------------
83 // =====================================================================
84 /*
85  \fn ShowHelpModelSpecific
86  \brief Print out specific help about the implementation of the model
87  and its initialization
88 */
90 {
91  cout << "-- This class implements the Spectral Model : " << endl;
92  cout << "-- first introduced by J. Cunningham et al. then used in PET reconstruction for temporal regularisation by Andrew Reader et al " << endl;
93  cout << "-- It is used to model radiotracer dynamic behaviour with a set of decaying exponential functions ( exp(-β*t) ) " << endl;
94  cout << "-- The decaying exponential coefficients β are logarithmically equally spaced within the selected range of values " << endl;
95  cout << " All decaying exponentials are convolved with the interpolated Arterial Input Curve, before being discretised to the duration of the reconstruction frames " << endl;
96  cout << endl;
97  cout << " The model must be initialized using a ASCII file with the following keywords and information :" << endl;
98  cout << " As this class inherits from the iLinearModel class, the following parameters must be declared inside the couple of the following specific tags: " << endl;
99  cout << " - DYNAMIC FRAMING/ENDDF " << endl;
100  cout << " - The ASCII file must contain the following keywords :" << endl;
101  cout << " 'AIC_input_file: path/to/file' (mandatory) The file containing the sampled Arterial Input Function " << endl;
102  cout << " The file must contain the following information in successive lines, separated by ',' " << endl;
103  cout << " -> AIC_number_of_points: " << endl;
104  cout << " -> AIC_time_points: " << endl;
105  cout << " -> AIC_data_points: " << endl;
106  cout << " -> AIC_units: 'seconds' or 'minutes' " << endl;
107  cout << " The following options are required for the specification of the spectral functions. "<< endl;
108  cout << " As in the spectral analysis method, the spectral functions are convolved with the interpolated Input Curve. "<< endl;
109  cout << " By default a function which is the interpolated Input Curve is added in the dataset (equivalent to convolution of the IC with a dirac function)" << endl;
110  cout << " The spectral functions created will be logarithmically spaced within the selected range " << endl;
111  cout << " Number_spectral_functions: x (mandatory) The number of spectral functions" << endl;
112  cout << " Fastest_rate: x (mandatory) The rate (1/min) for the fastest decaying exponential " << endl;
113  cout << " Slowest_rate: x (mandatory) The rate (1/min) for the slowest decaying exponential" << endl;
114  cout << " Full_trapping_basis_function: 1 or 0 (optional) Option to say whether we want to include a basis function to model full trapping of tracer (1) or not (0 by default) " << endl;
115  cout << " Blood_fraction_basis_function: 1 or 0 (optional) Option to say whether we want to include a basis function to model the blood fraction of the tracer (1) or not (0 by default) " << endl;
116  cout << " In this implementation and for the blood fraction it is assumed that the whole blood input curve and plasma input curve are the same (no change due to metabolism) " << endl;
117  cout << endl;
118  cout << " 'Parametric_image_init: path ' (optional) path to an interfile image to be used as initialization for the parametric images." << endl;
119  cout << endl;
120  cout << " -> Optimisation_method : x (mandatory) optimization method available options: " << endl;
121  cout << " x=0: Direct ( Implementation of basis functions side by system matrix in each tomographic iterative loop " << endl;
122  cout << " x=1: Nested EM " << endl;
123  cout << " x=2: Iterative non-negative Least-Square " << endl;
124  cout << " (C.L. Lawson and R.J. Hanson, Solving Least Squares Problems)" << endl;
125  cout << endl;
126 
127  // Print general help for all dynamic models
128  ShowHelp();
129 
130 }
131 
132 
133 // =====================================================================
134 // ---------------------------------------------------------------------
135 // ---------------------------------------------------------------------
136 // =====================================================================
137 /*
138  \fn ReadAndCheckConfigurationFileSpecific
139  \brief This function is used to read options from a configuration file.
140  \return 0 if success, other value otherwise.
141 */
143 {
144  if(m_verbose >=3) Cout("iLinearSpectralModel::ReadAndCheckConfigurationFileSpecific ..."<< endl);
145 
146  // ===================================================================
147  // Implement here the reading of any options specific to this dynamic model
148  // (i.e : parameters or path to deformation files), through a configuration file
149  // The ReadDataASCIIFile() functions could be helpful to recover data from a file
150  // (check other dynamicModels for examples)
151  // ===================================================================
152 
153  // Apply the Generic linear Checks for all Linear Models
155  {
156  Cerr("***** iLinearSpectralModel::ReadAndCheckConfigurationFileSpecific -> Error while trying to read and check generic configuration for linear models " << m_fileOptions << endl);
157  return 1;
158  }
159 
160  // The file will be fully processed in the Initialize() function
161  ifstream in_file(m_fileOptions.c_str(), ios::in);
162 
163  if(in_file)
164  {
165  // Number of requested basis/spectral functions
166  if( ReadDataASCIIFile(m_fileOptions, "Number_spectral_functions", &m_spectral_bank_size, 1, KEYWORD_MANDATORY) == 1)
167  {
168  Cerr("***** iLinearModel::ReadAndCheckConfigurationFileSpecific -> Error while trying to read 'Number_spectral_functions' flag in " << m_fileOptions << endl);
169  return 1;
170  }
171 
172 
173  // Is trapping basis function requested ?
174  int full_trapping_basis_input =-1 ;
175  if( ReadDataASCIIFile(m_fileOptions, "Full_trapping_basis_function", &full_trapping_basis_input, 1, KEYWORD_OPTIONAL) == 1)
176  {
177  Cerr("***** iLinearModel::ReadAndCheckConfigurationFileSpecific -> Error while trying to read 'Full_trapping_basis_function' flag in " << m_fileOptions << endl);
178  return 1;
179  }
180  if (full_trapping_basis_input>0) m_full_trapping_basis_flag = true;
181 
182  // Is blood fraction basis function requested ?
183  int blood_fraction_basis_input =-1 ;
184  if( ReadDataASCIIFile(m_fileOptions, "Blood_fraction_basis_function", &blood_fraction_basis_input, 1, KEYWORD_OPTIONAL) == 1)
185  {
186  Cerr("***** iLinearModel::ReadAndCheckConfigurationFileSpecific -> Error while trying to read 'Blood_fraction_basis_function' flag in " << m_fileOptions << endl);
187  return 1;
188  }
189  if (blood_fraction_basis_input>0) m_blood_fraction_fasis_flag = true;
190 
191  // Set model parameters and number of basis functions equal to the number of basis functions (including the additional)
192  // Add another basis function if the trapping basis flag has been provided
194  // Add another basis function if the blood fraction flag has been provided
196 
199 
200  // Parameters for spectral Model -> Lower, Upper decay rate constants
201  if( ReadDataASCIIFile(m_fileOptions, "Fastest_rate", &m_fast_exp, 1, KEYWORD_MANDATORY) == 1)
202  {
203  Cerr("***** iLinearSpectralModel::ReadAndCheckConfigurationFileSpecific -> Error while trying to read 'Fastest_rate' flag in " << m_fileOptions << endl);
204  return 1;
205  }
206  // Make rate units to 1/sec
207  m_fast_exp/=60. ;
208 
209  if( ReadDataASCIIFile(m_fileOptions, "Slowest_rate", &m_slow_exp, 1, KEYWORD_MANDATORY) == 1)
210  {
211  Cerr("***** iLinearSpectralModel::ReadAndCheckConfigurationFileSpecific -> Error while trying to read 'Slowest_rate' flag in " << m_fileOptions << endl);
212  return 1;
213  }
214  // Make rate units to 1/sec
215  m_slow_exp/=60. ;
216  }
217  else
218  {
219  Cerr("***** iLinearPatlakModel::ReadAndCheckConfigurationFileSpecific -> Error while trying to read configuration file at: " << m_fileOptions << endl);
220  return 1;
221  }
222 
223 
224 return 0;
225 }
226 
227 // =====================================================================
228 // ---------------------------------------------------------------------
229 // ---------------------------------------------------------------------
230 // =====================================================================
231 /*
232  \fn ReadAndCheckOptionsList
233  \param a_optionsList : a list of parameters separated by commas
234  \brief This function is used to read parameters from a string.
235  \return 0 if success, other value otherwise.
236 */
238 {
239  if(m_verbose >=3) Cout("iLinearSpectralModel::ReadAndCheckConfigurationFileSpecific ..."<< endl);
240 
241  // Must be initialized with configuration file
242  Cerr("***** iLinearSpectralModel::ReadAndCheckOptionsList -> This model needs to use a file for its initialization. Use help for more info !" << endl);
243  return 1;
244 
245  // ===================================================================
246  // Implement here the reading of any options specific to this deformation model,
247  // through a list of options separated by commas
248  // The ReadStringOption() function could be helpful to parse the list of parameters in an array
249  // ===================================================================
250 
251  // Just recover the string here, it will be processed in the Initialize() function
252  //m_listOptions = a_listOptions;
253 
254  // Normal end
255  //return 0;
256 }
257 
258 
259 // =====================================================================
260 // ---------------------------------------------------------------------
261 // ---------------------------------------------------------------------
262 // =====================================================================
263 /*
264  \fn CheckSpecificParameters
265  \brief This function is used to check whether all member variables
266  have been correctly initialized or not.
267  \return 0 if success, positive value otherwise.
268 */
270 {
271  // ===================================================================
272  // Implement here checks over parameters which should be read using either
273  // ReadAndCheckConfigurationFile() and ReadAndCheckOptionsList() functions
274  // ===================================================================
275 
276  // Perform generic checks that apply for the Linear Models
278  {
279  Cerr("***** iLinearPatlakModel::CheckSpecificParameters -> A problem occurred while checking specific parameters ! " << endl);
280  return 1;
281  }
282 
283 
284  // Normal end
285  return 0;
286 }
287 
288 // =====================================================================
289 // ---------------------------------------------------------------------
290 // ---------------------------------------------------------------------
291 // =====================================================================
292 /*
293  \fn InitializeSpecific
294  \brief This function is used to initialize the model parametric images and basis functions
295  \return 0 if success, other value otherwise.
296 */
298 {
299  if (!m_checked)
300  {
301  Cerr("***** iLinearSpectralModel::InitializeSpecific() -> Must call CheckParameters functions before Initialize() !" << endl);
302  return 1;
303  }
304 
305 
306  if(m_verbose >=2) Cout("iLinearSpectralModel::InitializeSpecific ..."<< endl);
307  // Run generic Initialization for all Linear Models
309  {
310  Cerr("***** iLinearSpectralModel::InitializeSpecific() -> Error while performing generic initialisations for linear models !" << endl);
311  return 1;
312  }
313 
314  // Assumption of framing set equally to all bed position at the moment !!
315  int bed = 0;
316 
318  {
319  // --- Calculation of φ0 function for estimation of the tracer trapping ( if included ) -------------------------- //
320 
321  // Get pointer to interpolated Arterial Input Curve
323  // Calculation of the 'Intagrated Time' integral in the discrete level with the trapezoidal method
324  // For uniform spacing that is $ \frac{\Delta T}{2} ( f(x_0) + \sum_{k=0}^{N-1} f(x_k) + f(x_N)) $
325  HPFLTNB *a_IntegAICY = (HPFLTNB *) malloc(
326  (mp_ID->GetFrameTimeStopInMs(bed, mp_ID->GetNbTimeFrames() - 1)) * sizeof(HPFLTNB));
327  HPFLTNB RunningSum = 0;
328  HPFLTNB halfDeltaT = (0.001 / 2);
329  // First value of integration over the AIC will be the first value of the AIC * DeltaT
330  a_IntegAICY[0] = a_AICIntrpY[0] * 0.001;
331  // Then iterate though all the other points using the trapezoidal function for uniform spacing
332  for (uint32_t i = 1; i < (mp_ID->GetFrameTimeStopInMs(bed, mp_ID->GetNbTimeFrames() - 1)); i++)
333  {
334  RunningSum += a_AICIntrpY[i - 1];
335  a_IntegAICY[i] = (a_AICIntrpY[0] + 2 * RunningSum + a_AICIntrpY[i]) * halfDeltaT;
336  }
337 
338  // Calculate first basis function - Integration of sampled integral of AIC over each frame and division by duration-//
339  for (int fr = 0; fr < mp_ID->GetNbTimeFrames(); fr++)
340  {
341  RunningSum = 0;
342  // iteration over all the datapoints within the frame
343  for (uint32_t i = mp_ID->GetFrameTimeStartInMs(bed, fr) + 1; i < (mp_ID->GetFrameTimeStopInMs(bed, fr)); i++)
344  {
345  RunningSum += a_IntegAICY[i];
346  }
347  m2p_nestedModelTimeBasisFunctions[0][fr] = (FLTNB) ((a_IntegAICY[mp_ID->GetFrameTimeStartInMs(bed, fr)] +
348  2 * RunningSum +
349  a_IntegAICY[mp_ID->GetFrameTimeStopInMs(bed, fr)]) *
350  halfDeltaT);
352  ((FLTNB) (mp_ID->GetFrameTimeStopInMs(bed, fr) - mp_ID->GetFrameTimeStartInMs(bed, fr))) / 1000;
353  }
354  // Clear Integrated TAC from memory
355  delete (a_IntegAICY);
356  }
357 
358  // --- Calculation of spectral functions φ1 .. φN-1-------------------------------------------------------- //
359  // Allocate spectral bank
361  // Calculate the spectral coefficients to be equally spaced in a log scale
362  HPFLTNB ln_slow_rate = log(m_slow_exp);
363  HPFLTNB ln_fast_rate = log(m_fast_exp);
364  HPFLTNB step = (ln_fast_rate - ln_slow_rate) / (HPFLTNB) (m_spectral_bank_size - 1);
365  for (int b = 0; b < m_spectral_bank_size; b++) mp_spectral_bank[b] = ln_slow_rate + step * b;
366  // Get spectral coefficients back to scale from log scale
367  for (int b = 0; b < m_spectral_bank_size; b++) mp_spectral_bank[b] = exp(mp_spectral_bank[b]);
368 
369  // --- Sample the exponential over the requested frames duration --------------------------------------------- //
370  if(m_verbose >=3) Cout( " iLinearSpectralModel::InitializeSpecific() -> Sampling exponential functions" << endl);
371 
372  // Calculated total samples for interval of 0.1 seconds
373  int total_samples =
374  (int) ((((float) mp_ID->GetFrameTimeStopInMs(bed, mp_ID->GetNbTimeFrames() - 1)) / 1000.) * 10);
375 
376  HPFLTNB** spectral_exp = (HPFLTNB **) malloc((m_spectral_bank_size) * sizeof(HPFLTNB*));
377  for (int ex = 0; ex < m_spectral_bank_size; ex++)
378  {
379  spectral_exp[ex] = (HPFLTNB*) malloc(total_samples * sizeof(HPFLTNB));
380  }
381 
382  // Evaluating exponents over total time. Scaling time for 0.1 second intervals
383  for (int ex = 0; ex < m_spectral_bank_size; ex++)
384  {
385  for (int i = 0; i < total_samples; i++)
386  {
387  spectral_exp[ex][i] = (FLTNB) exp(-0.1 * mp_spectral_bank[ex] * i);
388  }
389  }
390  // --- Get Interpolated AIC and convolve with every spectral function ----------------------------------------- //
391 
392  // Allocate memory for the convolved spectral functions.
393  HPFLTNB** ConvSpectralFunctions = (HPFLTNB **) malloc((m_spectral_bank_size) * sizeof(HPFLTNB*));
394  for (int ex = 0; ex < m_spectral_bank_size; ex++)
395  {
396  ConvSpectralFunctions[ex] = (HPFLTNB*) malloc(total_samples * sizeof(HPFLTNB));
397  }
398  // Get Downsampled AIF and get it into a_AICIntrpYDown
400  HPFLTNB *a_AICIntrpYDown = mp_ArterialInputCurve->GetDownsampledAIC();
401  // For every function perform the convolution ! use of multithreading for each spectral function convolution
402  int ex;
403  #pragma omp parallel for private(ex) schedule(static, 1)
404  for (ex = 0; ex < m_spectral_bank_size; ex++)
405  {
406  // Double loop for convolution of AICIntrpY with a sampled exponential function
407  for (int i = 0; i <= total_samples; i++)
408  {
409  for (int j = i; j <= total_samples; j++)
410  {
411  ConvSpectralFunctions[ex][j] += (a_AICIntrpYDown[i] * spectral_exp[ex][j - i]);
412  }
413  // Normalise each value with the size of each step
414  ConvSpectralFunctions[ex][i] *= 0.1;
415  // Check and remove negative values - might occur if multiplication results to lower/higher values than double !!
416  if ( ConvSpectralFunctions[ex][i] <0 )
417  {
418  Cout(" Negative spectral function value detected at " << i << ", with value: "<< ConvSpectralFunctions[ex][i] <<
419  " -> Setting value to zero "<< endl);
420  ConvSpectralFunctions[ex][i] = 0 ;
421  }
422  if (std::isnan(ConvSpectralFunctions[ex][i]))
423  {
424  Cout(" NaN spectral function value detected at " << i << "--> Setting value to zero "<< endl);
425  ConvSpectralFunctions[ex][i] = 0 ;
426  }
427  }
428  }
429  // --- Average convolved basis functions into the study frames
430  // If full trapping BF set, then start spectral functions index 1 as φ1 ; else from index 0 as φ0.
431  int bf_index_start = (m_full_trapping_basis_flag==true) ? 1 : 0 ;
432  // Average functions over frames to calculate Basis Functions
433  HPFLTNB RunningSum = 0 ;
434  HPFLTNB halfDeltaT = (0.1/2);
435  // Loop over all spectral functions
436  for (int ex = 0; ex < m_spectral_bank_size; ex++)
437  {
438  // Loop over frames to get the sum of the values within each frame
439  for (int fr = 0; fr < mp_ID->GetNbTimeFrames(); fr++)
440  {
441  RunningSum = 0 ;
442  // iteration over all the datapoints within the frame
443  for (uint32_t i = (mp_ID->GetFrameTimeStartInMs(bed, fr)/100)+1 ;i <(mp_ID->GetFrameTimeStopInMs(bed, fr)/100);i++)
444  {
445  RunningSum+=ConvSpectralFunctions[ex][i];
446  }
447  // Calculate integral using the trapezoidal method
448  m2p_nestedModelTimeBasisFunctions[ex+bf_index_start][fr] = (FLTNB) ((ConvSpectralFunctions[ex][(mp_ID->GetFrameTimeStartInMs(bed, fr) / 100)] +
449  2 * RunningSum + ConvSpectralFunctions[ex][(mp_ID->GetFrameTimeStopInMs(bed, fr) / 100)]) * halfDeltaT);
450  // Average for the frame duration
451  m2p_nestedModelTimeBasisFunctions[ex+bf_index_start][fr] /= (FLTNB)((mp_ID->GetFrameTimeStopInMs(bed, fr)) - (mp_ID->GetFrameTimeStartInMs(bed, fr)))/1000 ;
452  }
453  }
454  // Clear memory from ConvSpectralFunctions
455  for (int ex = 0; ex < m_spectral_bank_size; ex++)
456  if (ConvSpectralFunctions[ex]) delete[] ConvSpectralFunctions[ex];
457  if (ConvSpectralFunctions) delete[] ConvSpectralFunctions;
458 
459  // If blood fraction BF set, set it to the φN coefficient
461  {
462  // Get pointer to interpolated Arterial Input Curve
464  // --- Calculation of functions φN for estimation of blood fraction ------------------------------------------- //
465  halfDeltaT = (0.001 / 2);
466  for (int fr = 0; fr < mp_ID->GetNbTimeFrames(); fr++)
467  {
468  RunningSum = 0;
469  // iteration over all the datapoints within the frame
470  for (uint32_t i = (mp_ID->GetFrameTimeStartInMs(bed, fr)) + 1; i < (mp_ID->GetFrameTimeStopInMs(bed, fr)); i++)
471  {
472  RunningSum += a_AICIntrpY[i];
473  }
474  // Calculate integral using the trapezoidal method
476  (a_AICIntrpY[(mp_ID->GetFrameTimeStartInMs(bed, fr))] +
477  2 * RunningSum + a_AICIntrpY[(mp_ID->GetFrameTimeStopInMs(bed, fr))]) * halfDeltaT);
478  // Average for the frame duration
480  (FLTNB) ((mp_ID->GetFrameTimeStopInMs(bed, fr)) - (mp_ID->GetFrameTimeStartInMs(bed, fr))) / 1000;
481  }
482  }
483 
484  // Print the basis functions
486 
487  // Normal end
488  m_initialized = true;
489  return 0;
490 }
int Downsample()
This function downsamples the interpolated arterial input function Currently needed to speed up convo...
int ReadAndCheckOptionsList(string a_listOptions)
This function is used to read parameters from a string.
#define FLTNB
Definition: gVariables.hh:81
iLinearSpectralModel()
Constructor of iLinearSpectralModel. Simply set all data members to default values.
#define HPFLTNB
Definition: gVariables.hh:83
oArterialInputCurve * mp_ArterialInputCurve
void ShowHelp()
This function is used to print out general help about dynamic models.
int InitializeSpecific()
This function is used to initialize the model parametric images and basis functions.
HPFLTNB * GetDownsampledAIC()
Set the framing of the reconstruction for the AIC object.
uint32_t GetFrameTimeStartInMs(int a_bed, int a_frame)
Get the frame time start for the given bed, in milliseconds as a uint32_t.
oImageDimensionsAndQuantification * mp_ID
int InitializeSpecificToAllLinearModels()
This function is used to initialize the parametric images and basis functions for all Linear Models...
This class implements a general linear dynamic model applied between the images of a dynamic acquisit...
Definition: iLinearModel.hh:62
string m_fileOptions
Declaration of class iLinearSpectralModel.
void ShowBasisFunctions()
This function is used to print the basis functions.
#define Cerr(MESSAGE)
int CheckSpecificParametersForAllLinearModels()
This function is used to check parameters for all Linear Models. .
int ReadDataASCIIFile(const string &a_file, const string &a_keyword, T *ap_return, int a_nbElts, bool a_mandatoryFlag)
Look for "a_nbElts" elts in the "a_file" file matching the "a_keyword" string passed as parameter a...
Definition: gOptions.cc:129
~iLinearSpectralModel()
Destructor of iLinearSpectralModel.
FLTNB ** m2p_nestedModelTimeBasisFunctions
#define KEYWORD_MANDATORY
Definition: gOptions.hh:47
#define KEYWORD_OPTIONAL
Definition: gOptions.hh:49
int GetNbTimeFrames()
Get the number of time frames.
int CheckSpecificParameters()
This function is used to check whether all member variables have been correctly initialized or not...
#define Cout(MESSAGE)
int ReadAndCheckConfigurationFileSpecific()
This function is used to read options from a configuration file, specific to this model...
int ReadAndCheckConfigurationFileSpecificToAllLinearModels()
This function is used to read parameters that are generic for all Linear Models. ...
void ShowHelpModelSpecific()
This function is used to print out specific help about the dynamic model and its options. It is pure virtual so must be implemented by children.
HPFLTNB * GetInterpolatedAIC()
Set the framing of the reconstruction for the AIC object.
uint32_t GetFrameTimeStopInMs(int a_bed, int a_frame)
Get the frame time stop for the given bed, in milliseconds as a uint32_t.