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