Tomato
OxModelT1ThreeParam.hxx
Go to the documentation of this file.
1 
7 #ifndef Tomato_OXModelT1ThreeParam_HXX
8 #define Tomato_OXModelT1ThreeParam_HXX
9 
10 namespace Ox {
11 
12 
13  template< typename MeasureType >
14  MeasureType
16  ::calcModelValue(const MeasureType* parameters, MeasureType time){
17  MeasureType A = parameters[0];
18  MeasureType B = parameters[1];
19  MeasureType T1star = parameters[2];
20 
21  if (fabs(T1star) < std::numeric_limits<MeasureType>::min())
22  return A;
23 
24  return A - B * exp( -time / T1star );
25  }
26 
27  template< typename MeasureType >
28  void
30  ::calcLSResiduals(const MeasureType* parameters, MeasureType* residuals){
31 
32  unsigned int nSamples = this->_nSamples;
33 
34  for (unsigned int i = 0; i < nSamples; i++) {
35  MeasureType invTime = this->_InvTimes[i];
36  MeasureType measured = this->_Signal[i];
37  MeasureType calculated = 0;
38 
39  calculated = calcModelValue(parameters, invTime);
40 
41  residuals[i] = calculated - measured;
42 
43  }
44  }
45 
46  template< typename MeasureType >
47  void
49  ::calcLSJacobian(const MeasureType* parameters, MeasureType* jacobian){
50  int nSamples = this->_nSamples;
51 
52  //MeasureType A = parameters[0];
53  MeasureType B = parameters[1];
54  MeasureType T1star = parameters[2];
55  MeasureType invTime, myexp;
56 
57  for (int i = 0; i < nSamples; i++) {
58  invTime = this->_InvTimes[i];
59  myexp = exp(-invTime/T1star);
60 
61  // calculated in matlab (syms A B T1 t), f=A-B*exp(-t./T1); diff(f,A), diff(f,B), diff(f,T1)
62  jacobian[i*3+0] = 1.0;
63  jacobian[i*3+1] = -myexp;
64  jacobian[i*3+2] = -B * invTime * myexp / (T1star * T1star);
65  }
66  }
67 
68  template< typename MeasureType >
69  MeasureType
71  ::calcCostValue(const MeasureType* parameters){
72 
73  int nSamples = this->_nSamples;
74 
75  calcLSResiduals(parameters, this->_Residuals);
76  MeasureType result = 0;
77 
78  for (int i = 0; i < nSamples; ++i) {
79  result = result + this->_Residuals[i] * this->_Residuals[i];
80  }
81 
82  return result;
83  }
84 
85  template< typename MeasureType >
86  void
88  ::calcCostDerivative(const MeasureType* parameters, MeasureType* derivative){
89 
90  int nSamples = this->_nSamples;
91 
92  derivative[0] = 0;
93  derivative[1] = 0;
94  derivative[2] = 0;
95 
96  MeasureType measured, invTime, myexp;
97 
98  MeasureType A = parameters[0];
99  MeasureType B = parameters[1];
100  MeasureType T1star = parameters[2];
101 
102  // calculated in matlab (syms A B T1 t y), f=(A-B*exp(-t./T1)-y).^2; diff(f,A), diff(f,B), diff(f,T1)
103  for (int i = 0; i < nSamples; ++i){
104  measured = this->getSignal()[i];
105  invTime = this->getInvTimes()[i];
106  myexp = exp(-invTime/T1star);
107 
108  derivative[0] = derivative[0] + A*2 - measured*2 - myexp*B*2;;
109  derivative[1] = derivative[1] + myexp*2*(measured - A + myexp*B);
110  derivative[2] = derivative[2] + (invTime*myexp*B*2*(measured - A + myexp*B))/(T1star*T1star);
111  }
112  }
113 
114 } //namespace Ox
115 
116 
117 #endif //Tomato_OXModelT1ThreeParam_HXX
virtual void calcLSResiduals(const MeasureType *parameters, MeasureType *residuals)
Definition: OxModelT1ThreeParam.hxx:30
virtual void calcCostDerivative(const MeasureType *parameters, MeasureType *derivative)
Definition: OxModelT1ThreeParam.hxx:88
virtual MeasureType calcModelValue(const MeasureType *parameters, MeasureType time)
Definition: OxModelT1ThreeParam.hxx:16
virtual MeasureType calcCostValue(const MeasureType *parameters)
Definition: OxModelT1ThreeParam.hxx:71
virtual void calcLSJacobian(const MeasureType *parameters, MeasureType *jacobian)
Definition: OxModelT1ThreeParam.hxx:49
Definition: OxCalculator.h:19