Tomato
OxTestImage.hxx
Go to the documentation of this file.
1 
7 #ifndef Tomato_OXTESTImage_HXX
8 #define Tomato_OXTESTImage_HXX
9 
10 #include "CmakeConfigForTomato.h"
11 
12 #ifdef USE_YAML
13 
14 namespace Ox {
15 
16  template< typename MeasureType >
17  TestImage<MeasureType>
18  ::TestImage(int nRows, int nCols, std::vector <std::string> filesPaths, std::vector<int> invTimesOrder){
19  init(nRows, nCols, filesPaths, invTimesOrder);
20  }
21 
22  template< typename MeasureType >
23  TestImage<MeasureType>
24  ::TestImage(int nRows, int nCols, std::vector <std::string> filesPaths){
25  std::vector<int> invTimesOrder;
26  init(nRows, nCols, filesPaths, invTimesOrder);
27  }
28 
29  template< typename MeasureType >
30  int
31  TestImage<MeasureType>
32  ::init(int nRows, int nCols, std::vector <std::string> filesPaths, std::vector<int> invTimesOrder) {
33  _nCols = nCols;
34  _nRows = nRows;
35  size_t nTissues = filesPaths.size();
36  std::vector< TestData <MeasureType> > TestDataVector; // vector with TestData objects
37 
38  // I do want to have less 'tissues' (TestData objects) than Columns, just for the sake of simplicity
39  if (nTissues > _nCols){
40  throw std::runtime_error("Give me more nCols or less tissues");
41  }
42 
43  // populate TestDataVector
44  for (size_t i = 0; i < nTissues; ++i){
45  TestDataVector.push_back(TestData<MeasureType>((char*)filesPaths.at(i).c_str()));
46  }
47 
48  // check if invTimes are equal
49  for (size_t i = 1; i < nTissues; ++i){
50  if(!(TestDataVector.at(i).getInvTimes() == TestDataVector.at(i-1).getInvTimes())){
51  throw std::runtime_error("InvTimes are different");
52  }
53  }
54  std::vector<MeasureType> invTimesWithoutOrder = TestDataVector.at(0).getInvTimes();
55  _nSamples = (int)invTimesWithoutOrder.size();
56 
57  if (invTimesOrder.empty()){
58  // _invTimes = 1,2,3, ... , nSamples
59  invTimesOrder = std::vector<int>(_nSamples);
60  for (int i = 0; i < _nSamples; ++i){
61  invTimesOrder.at(i) = i;
62  }
63  }
64 
65  if (invTimesOrder.size() != (size_t)_nSamples){
66  throw std::runtime_error("invTimesOrder size is different than the input files nSamples");
67  }
68 
69  _invTimes = std::vector <MeasureType>(_nSamples);
70  for (int i = 0; i < _nSamples; ++i){
71  _invTimes.at(i) = invTimesWithoutOrder.at(invTimesOrder.at(i));
72  }
73 
74  _invTimesOrder = invTimesOrder;
75 
76  // allocate memory
77  _imageMag = new MeasureType[_nCols*_nRows*_nSamples];
78  _imagePha = new MeasureType[_nCols*_nRows*_nSamples];
79  _imageResultsMolli = new MeasureType[_nRows*_nCols*3];
80  _imageResultsShmolli = new MeasureType[_nRows*_nCols*3];
81 
82  // how to divide the memory?
83  std::vector<int> ranges = KWUtil::bounds<int>((int)nTissues, _nCols);
84 
85 // std::cout << std::endl;
86 // std::cout << std::endl;
87 // for (int i = 0; i < ranges.size(); ++i ){
88 // std::cout << ranges[i] << std::endl;
89 // }
90 
91  // fill memory
92  for (int iSample = 0; iSample < _nSamples; ++iSample){
93  //for (int iCol = 0; iCol < _nCols; ++iCol) {
94  for (int iRow = 0; iRow < _nRows; ++iRow) {
95  for (int iTissue = 0; iTissue < ranges.size()-1; ++iTissue) {
96  //for (int iRow = ranges[iTissue]; iRow < ranges[iTissue+1]; ++iRow) {
97  for (int iCol = ranges[iTissue]; iCol < ranges[iTissue+1]; ++iCol) {
98  int invTimesIdx = _invTimesOrder.at(iSample);
99  //int index = iSample * (nRows * nCols) + iCol * nRows + iRow;
100  int index = iSample * (nRows * nCols) + iRow * nCols + iCol;
101  _imageMag[index] = TestDataVector.at(iTissue).getSignalMagPtr()[invTimesIdx];
102  _imagePha[index] = TestDataVector.at(iTissue).getSignalPhaPtr()[invTimesIdx];
103  }
104  }
105  }
106  }
107 
108  for (int iDim = 0; iDim < 3; ++iDim){
109  //for (int iCol = 0; iCol < _nCols; ++iCol) {
110  for (int iRow = 0; iRow < _nRows; ++iRow) {
111  for (int iTissue = 0; iTissue < ranges.size()-1; ++iTissue) {
112  //for (int iRow = ranges[iTissue]; iRow < ranges[iTissue+1]; ++iRow) {
113  for (int iCol = ranges[iTissue]; iCol < ranges[iTissue+1]; ++iCol) {
114  //int index = iDim * (nRows * nCols) + iCol * nRows + iRow;
115  int index = iDim * (nRows * nCols) + iRow * nCols + iCol;
116  _imageResultsMolli[index] = TestDataVector.at(iTissue).getResultsMolliPtr()[iDim];
117  _imageResultsShmolli[index] = TestDataVector.at(iTissue).getResultsShmolliPtr()[iDim];
118  }
119  }
120  }
121  }
122  return 0; // EXIT_SUCCESS
123  }
124 
125  template< typename MeasureType >
126  TestImage<MeasureType>
127  ::~TestImage(){
128  delete [] _imageMag;
129  delete [] _imagePha;
130  delete [] _imageResultsMolli;
131  delete [] _imageResultsShmolli;
132 
133  }
134  template< typename MeasureType >
135  std::vector<MeasureType>
136  TestImage<MeasureType>
137  ::getInvTimes() const {
138  return _invTimes;
139  }
140 
141  template< typename MeasureType >
142  MeasureType *
143  TestImage<MeasureType>
144  ::getInvTimesPtr() {
145  return &_invTimes.at(0);
146  }
147 
148 
149  template< typename MeasureType >
150  MeasureType *
151  TestImage<MeasureType>
152  ::getImageMagPtr() const {
153  return _imageMag;
154  }
155 
156  template< typename MeasureType >
157  MeasureType *
158  TestImage<MeasureType>
159  ::getImagePhaPtr() const {
160  return _imagePha;
161  }
162 
163  template< typename MeasureType >
164  MeasureType *
165  TestImage<MeasureType>
166  ::getImageResultsMolliPtr() const {
167  return _imageResultsMolli;
168  }
169 
170  template< typename MeasureType >
171  MeasureType *
172  TestImage<MeasureType>
173  ::getImageResultsShmolliPtr() const {
174  return _imageResultsShmolli;
175  }
176 
177 } // namespace Ox
178 
179 #endif // USE_YAML
180 #endif //Tomato_OXTESTImage_HXX
Definition: OxCalculator.h:19