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