7 #ifndef Tomato_OxImageCalculator_HXX     8 #define Tomato_OxImageCalculator_HXX    12     template<
typename MeasureType>
    13     ImageCalculator<MeasureType>
    24         _imageResultsArray = 0; 
    30     template<
typename MeasureType>
    32     ImageCalculator<MeasureType>
    33     ::setUseThreads(
bool useThreads) {
    34         ImageCalculator::_useThreads = useThreads;
    37     template<
typename MeasureType>
    39     ImageCalculator<MeasureType>
    40     ::setNCols(
int nCols) {
    41         ImageCalculator::_nCols = nCols;
    44     template<
typename MeasureType>
    46     ImageCalculator<MeasureType>
    47     ::setNRows(
int nRows) {
    48         ImageCalculator::_nRows = nRows;
    51     template<
typename MeasureType>
    53     ImageCalculator<MeasureType>
    54     ::setNSamples(
int nSamples) {
    55         ImageCalculator::_nSamples = nSamples;
    58     template<
typename MeasureType>
    60     ImageCalculator<MeasureType>
    61     ::setInvTimes(
const MeasureType *invTimes) {
    62         ImageCalculator::_invTimes = invTimes;
    65     template<
typename MeasureType>
    67     ImageCalculator<MeasureType>
    68     ::setEchoTimes(
const MeasureType *echoTimes) {
    69         ImageCalculator::_echoTimes = echoTimes;
    72     template<
typename MeasureType>
    74     ImageCalculator<MeasureType>
    75     ::setImageMag(
const MeasureType *imageMag) {
    76         ImageCalculator::_imageMag = imageMag;
    79     template<
typename MeasureType>
    81     ImageCalculator<MeasureType>
    82     ::setImagePha(
const MeasureType *imagePha) {
    83         ImageCalculator::_imagePha = imagePha;
    86     template<
typename MeasureType>
    88     ImageCalculator<MeasureType>
    89     ::setImageResultsArray(MeasureType *imageResultsArray) {
    90         ImageCalculator::_imageResultsArray = imageResultsArray;
    93     template<
typename MeasureType>
    95     ImageCalculator<MeasureType>
    96     ::setCalculator(Calculator <MeasureType> *calculator) {
    97         ImageCalculator::_calculator = calculator;
   100     template<
typename MeasureType>
   102     ImageCalculator<MeasureType>
   103     ::getImageResultsArray()
 const {
   104         return _imageResultsArray;
   107     template<
typename MeasureType>
   109     ImageCalculator<MeasureType>
   114             int posStop = _nCols * _nRows;
   115             calculateOneThread(posStart, posStop);
   118 #ifndef TOMATO_USES_CXX_STANDARD_98   121             std::vector<std::thread> threads;
   122             unsigned concurentThreadsSupported = std::thread::hardware_concurrency();
   125                 _nThreads = concurentThreadsSupported;
   129             std::vector<int> limits = KWUtil::bounds<MeasureType>(concurentThreadsSupported, _nCols * _nRows);
   132             for (
unsigned i = 0; i < concurentThreadsSupported; ++i){
   133                 threads.push_back(std::thread(&ImageCalculator<MeasureType>::calculateOneThread, 
this, limits[i], limits[i+1]));
   137             for(
auto &t : threads){
   141             throw std::runtime_error(
"Threads not supported in Tomato with C++98");
   147     template<
typename MeasureType>
   149     ImageCalculator<MeasureType>
   150     ::calculateOneThread(
int posStart, 
int posStop){
   157         if (_calculator->getModel()) {
   161         if (_calculator->getFitter()) {
   165         if (_calculator->getSignCalculator()){
   166             signCalculator = _calculator->getSignCalculator()->
newByCloning();
   169         if (_calculator->getStartPointCalculator()) {
   170             startPointCalculator = _calculator->getStartPointCalculator()->
newByCloning();
   174         if (model) calculator->setModel(model);
   175         if (fitter) calculator->setFitter(fitter);
   176         if (signCalculator) calculator->setSignCalculator(signCalculator);
   177         if (startPointCalculator) calculator->setStartPointCalculator(startPointCalculator);
   180         calculator->setInvTimes(_invTimes);
   181         calculator->setEchoTimes(_echoTimes);
   183         for (
int pos = posStart; pos < posStop; ++pos) {
   185             MeasureType *sigMag = 
new MeasureType[_nSamples];
   186             MeasureType *sigPha = 
new MeasureType[_nSamples];
   188             for (
int iSample = 0; iSample < _nSamples; ++iSample) {
   189                 sigMag[iSample] = _imageMag[iSample * (_nCols * _nRows) + pos];
   190                 if (_imagePha) sigPha[iSample] = _imagePha[iSample * (_nCols * _nRows) + pos];
   193             calculator->setSigMag(sigMag);
   194             if(_imagePha) calculator->setSigPha(sigPha);
   199             if (_imageResultsArray) {
   200                 for (
int iDim = 0; iDim < calculator->
getNDims(); iDim++){
   201                     _imageResultsArray[iDim * (_nCols * _nRows) + pos] = calculator->getParametersAfterFitting()[iDim];
   206             if (_imageResultsMap) {
   208                 typename std::map<std::string, MeasureType*>::iterator it;
   209                 for ( it = _imageResultsMap->begin(); it != _imageResultsMap->end(); it++ ){
   210                     it->second[pos] = calculator->getResults()[it->first];
   221         delete signCalculator;
   222         delete startPointCalculator;
   227     template<
typename MeasureType>
   228     void ImageCalculator<MeasureType>::setImageResultsMap(std::map<std::string, MeasureType *> *imageResultsMap) {
   229         _imageResultsMap = imageResultsMap;
   232     template<
typename MeasureType>
   233     std::map<std::string, MeasureType *> *ImageCalculator<MeasureType>::getImageResultsMap()
 const {
   234         return _imageResultsMap;
   237     template<
typename MeasureType>
   238     void ImageCalculator<MeasureType>::setNThreads(
int nThreads) {
   239         _nThreads = nThreads;
   242     template<
typename MeasureType>
   243     bool ImageCalculator<MeasureType>::isUseThreads()
 const {
   247     template<
typename MeasureType>
   248     unsigned ImageCalculator<MeasureType>::getNThreads()
 const {
   254 #endif //Tomato_OxImageCalculator_H virtual SignCalculator< MeasureType > * newByCloning()=0
 
virtual int getNDims() const 
Definition: OxCalculator.hxx:153
 
Container for a model function, cost function and Least-Squares function. And derivatives. 
Definition: OxModel.h:26
 
Definition: OxCalculator.h:28
 
virtual Model< MeasureType > * newByCloning()=0
 
Definition: OxSignCalculator.h:21
 
virtual StartPointCalculator< MeasureType > * newByCloning()=0
 
Definition: OxStartPointCalculator.h:21
 
virtual int calculate()=0
 
virtual Fitter< MeasureType > * newByCloning()=0
 
Definition: OxFitter.h:22
 
virtual Calculator< MeasureType > * newByCloning()=0
 
Definition: OxCalculator.h:19
 
virtual void setNSamples(int _nSamples)
Definition: OxCalculator.hxx:240