7 #ifndef Tomato_OXCALCULATORT1WithSignCheck_HXX 8 #define Tomato_OXCALCULATORT1WithSignCheck_HXX 12 template<
typename MeasureType >
18 if (this->getFitter()->getMaxFunctionEvals() == 0){
23 if (this->_nDims != 2 && this->_nDims != 3){
24 throw std::runtime_error(
"CalculatorT1WithSignCheck::prepareToCalculate currently implemented only for _nDims of 2 or 3");
27 if (!this->getInvTimes()){
28 throw std::runtime_error(
"CalculatorT1WithSignCheck::prepareToCalculate InvTimes have to be provided!");
32 for (
int i = 0; i < this->getNSamples()-1; i++){
33 if (this->getInvTimes()[i] > this->getInvTimes()[i+1]){
34 throw std::runtime_error(
"CalculatorT1WithSignCheck::prepareToCalculate InvTimes have to be sorted!");
39 if (this->getSignCalculator()) {
41 this->getSignCalculator()->setNSamples(this->getNSamples());
42 this->getSignCalculator()->setInvTimes(this->getInvTimes());
43 this->getSignCalculator()->setSigMag(this->getSigMag());
44 this->getSignCalculator()->setSigPha(this->getSigPha());
45 this->getSignCalculator()->setSignal(this->_Signal);
46 this->getSignCalculator()->setSigns(this->_Signs);
48 this->getSignCalculator()->calculateSign();
51 for (
int i = 0; i < this->_nSamples; ++i){
52 this->_Signal[i] = this->_SigMag[i];
58 if (this->getStartPointCalculator()) {
59 this->getStartPointCalculator()->setNDims(this->_nDims);
60 if (!this->getStartPointCalculator()->getInputStartPoint()) {
61 if (this->_nDims == 2) {
62 MeasureType
const temp[] = {100, 1000};
63 this->getStartPointCalculator()->setInputStartPoint(temp);
64 }
else if (this->_nDims == 3) {
65 MeasureType
const temp[] = {100, 200, 1000};
66 this->getStartPointCalculator()->setInputStartPoint(temp);
69 this->getStartPointCalculator()->setNSamples(this->getNSamples());
70 this->getStartPointCalculator()->setInvTimes(this->getInvTimes());
71 this->getStartPointCalculator()->setSigMag(this->getSigMag());
72 this->getStartPointCalculator()->setSigns(this->getSigns());
73 this->getStartPointCalculator()->setCalculatedStartPoint(this->_StartPoint);
75 this->getStartPointCalculator()->calculateStartPoint();
77 for (
int i = 0; i < this->_nDims; ++i){
78 this->_StartPoint[i] = 500;
85 template<
typename MeasureType >
90 this->_Results = std::map <std::string, MeasureType>();
93 if (KWUtil::calcMeanArray(this->getNSamples(), this->getSigMag()) < this->getMeanCutOff()) {
98 if (this->prepareToCalculate() == 1) {
102 this->_Results = calculateWithSignCheck( this->getNSamples(),
110 template<
typename MeasureType >
111 std::map <std::string, MeasureType>
116 std::map <std::string, MeasureType> results;
118 MeasureType mse = 1e32;
119 MeasureType mseTemp = 1e32;
120 MeasureType *tempParameters =
new MeasureType[this->_nDims];
121 MeasureType *calculatedParameters =
new MeasureType[this->_nDims];
124 KWUtil::copyArrayToArray(this->_nDims, tempParameters, this->_StartPoint);
127 this->getModel()->setNSamples(nSamples);
128 this->getModel()->setSignal(signal);
129 this->getModel()->setInvTimes(invTimes);
132 this->getFitter()->setParameters(tempParameters);
133 this->getFitter()->setModel(this->getModel());
136 this->getFitter()->performFitting();
139 KWUtil::copyArrayToArray(this->_nDims, calculatedParameters, this->getFitter()->getParameters());
140 mse = this->getFitter()->getMse();
143 for (
int iSwap = 0; iSwap < nSamples; iSwap++) {
146 if (signs[iSwap] != 0)
continue;
150 if (invTimes[iSwap] > this->MaxTIForSignInvert)
continue;
153 signal[iSwap] = -fabs(signal[iSwap]);
156 this->getFitter()->copyToParameters(this->_StartPoint);
159 this->getFitter()->performFitting();
160 mseTemp = this->getFitter()->getMse();
165 KWUtil::copyArrayToArray(this->_nDims, calculatedParameters, this->getFitter()->getParameters());
167 timeFlip = iSwap + 1;
172 for (
int i = 0; i < nSamples; i++) signs[i] = 1;
173 for (
int i = 0; i < timeFlip; i++) signs[i] = -1;
174 for (
int i = 0; i < nSamples; i++) signal[i] = signs[i] * fabs(signal[i]);
177 int deltasCalculatedExit = 1;
178 MeasureType *fitDeltas =
new MeasureType[this->_nDims];
179 MeasureType *jacobian =
new MeasureType[nSamples*this->_nDims];
180 this->getModel()->calcLSJacobian(calculatedParameters, jacobian);
181 deltasCalculatedExit = KWUtil::calculateFitError(
189 if (mse != 1e32 && calculatedParameters[0] != 0) {
190 KWUtil::copyArrayToArray(this->_nDims, this->_ParametersAfterFitting, calculatedParameters);
191 if (this->_nDims == 2) {
192 results[
"A"] = calculatedParameters[0];
193 results[
"T1star"] = calculatedParameters[1];
194 results[
"T1"] = calculatedParameters[1];
195 results[
"R2"] = calculateR2FromModel(nSamples, invTimes, signal, calculatedParameters);
196 results[
"R2Abs"] = calculateR2AbsFromModel(nSamples, invTimes, signal, calculatedParameters);
197 results[
"ChiSqrt"] = KWUtil::getChiSqrt(mse*nSamples, nSamples);
198 results[
"LastValue"] = mse*nSamples;
199 results[
"timeFlip"] = timeFlip;
201 results[
"deltaA"] = -1;
202 results[
"deltaT1"] = -1;
203 results[
"deltaT1star"] = -1;
204 if (deltasCalculatedExit == 0) {
205 results[
"deltaA"] = fitDeltas[0];
206 results[
"deltaT1"] = fitDeltas[1];
207 results[
"deltaT1star"] = fitDeltas[1];
209 }
else if (this->_nDims == 3) {
210 results[
"T1"] = calculatedParameters[2] * (calculatedParameters[1] / calculatedParameters[0] - 1.);
211 results[
"R2"] = calculateR2FromModel(nSamples, invTimes, signal, calculatedParameters);
212 results[
"R2Abs"] = calculateR2AbsFromModel(nSamples, invTimes, signal, calculatedParameters);
213 results[
"A"] = calculatedParameters[0];
214 results[
"B"] = calculatedParameters[1];
215 results[
"T1star"] = calculatedParameters[2];
216 results[
"ChiSqrt"] = KWUtil::getChiSqrt(mse*nSamples, nSamples);
217 results[
"SNR"] = (results[
"B"] - results[
"A"]) / (results[
"ChiSqrt"] + 0.001);
218 results[
"LastValue"] = mse*nSamples;
219 results[
"timeFlip"] = timeFlip;
221 results[
"deltaA"] = -1;
222 results[
"deltaB"] = -1;
223 results[
"deltaT1star"] = -1;
224 results[
"deltaT1"] = -1;
225 if (deltasCalculatedExit == 0){
226 results[
"deltaA"] = fitDeltas[0];
227 results[
"deltaB"] = fitDeltas[1];
228 results[
"deltaT1star"] = fitDeltas[2];
230 results[
"deltaT1star"] * (results[
"B"]/results[
"A"] - 1)
231 + results[
"T1star"] * ( results[
"deltaB"]/results[
"A"]
232 + results[
"B"]*results[
"deltaA"]/(results[
"A"] * results[
"A"]) );
237 delete [] tempParameters;
238 delete [] calculatedParameters;
243 template<
typename MeasureType >
246 ::calculateR2FromModel(
int nSamples,
const MeasureType* times,
const MeasureType* signal,
const MeasureType* parameters) {
248 MeasureType *fitted =
new MeasureType[nSamples];
250 for (
int i = 0; i < nSamples; i++){
251 fitted[i] = this->_Model->calcModelValue(parameters, times[i]);
254 double result = KWUtil::calcR2cor(nSamples, fitted, signal);
260 template<
typename MeasureType >
265 MeasureType *absFitted =
new MeasureType[nSamples];
266 MeasureType *absYsignal =
new MeasureType[nSamples];
268 MeasureType A = parameters[0];
269 MeasureType B = parameters[1];
270 MeasureType T1star = parameters[2];
272 for (
int i = 0; i < nSamples; i++){
274 fitted = this->_Model->calcModelValue(parameters, invTimes[i]);
275 absFitted[i] = fabs(fitted);
276 absYsignal[i] = fabs(signal[i]);
279 double result = KWUtil::calcR2cor(nSamples, absFitted, absYsignal);
286 template<
typename MeasureType >
290 if (!this->_InvTimes) {
291 throw std::runtime_error(
"_InvTimes equals 0. Set _InvTimes");
293 return this->_InvTimes;
296 template<
typename MeasureType>
298 return _DoCalculateSDMap;
301 template<
typename MeasureType>
303 CalculatorT1WithSignCheck::_DoCalculateSDMap = doCalculateSDMap;
309 #endif //Tomato_OXCALCULATORT1WithSignCheck_HXX virtual int calculate()
Definition: OxCalculatorT1WithSignCheck.hxx:88
virtual int prepareToCalculate()
Definition: OxCalculatorT1WithSignCheck.hxx:15
void setDoCalculateSDMap(bool _DoCalculateSDMap)
Definition: OxCalculatorT1WithSignCheck.hxx:302
virtual std::map< std::string, MeasureType > calculateWithSignCheck(int nSamples, const MeasureType *invTimes, MeasureType *signal, MeasureType *signs)
Definition: OxCalculatorT1WithSignCheck.hxx:113
MeasureType calculateR2AbsFromModel(int nSamples, const MeasureType *invTimes, const MeasureType *signal, const MeasureType *parameters)
Definition: OxCalculatorT1WithSignCheck.hxx:263
Definition: OxCalculator.h:19
MeasureType calculateR2FromModel(int nSamples, const MeasureType *invTimes, const MeasureType *signal, const MeasureType *parameters)
Definition: OxCalculatorT1WithSignCheck.hxx:246
bool getDoCalculateSDMap() const
Definition: OxCalculatorT1WithSignCheck.hxx:297
const MeasureType * getInvTimes() const
Definition: OxCalculatorT1WithSignCheck.hxx:289