MITK-IGT
IGT Extension of MITK
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
mitkToFImageCsvWriterTest.cpp
Go to the documentation of this file.
1/*============================================================================
2
3The Medical Imaging Interaction Toolkit (MITK)
4
5Copyright (c) German Cancer Research Center (DKFZ)
6All rights reserved.
7
8Use of this source code is governed by a 3-clause BSD license that can be
9found in the LICENSE file.
10
11============================================================================*/
12
13#include <mitkTestingMacros.h>
15#include <mitkImageGenerator.h>
16#include <mitkImageSliceSelector.h>
17#include "mitkImageReadAccessor.h"
18
19void CloseCsvFile(FILE* outfile)
20{
21 fclose(outfile);
22}
23
24void OpenCsvFile(FILE** outfile, std::string outfileName)
25{
26 (*outfile) = fopen( outfileName.c_str(), "r" );
27 if( !outfile )
28 {
29 MITK_ERROR << "Error opening outfile: " << outfileName;
30 throw std::logic_error("Error opening outfile.");
31 return;
32 }
33}
34
38int mitkToFImageCsvWriterTest(int /* argc */, char* /*argv*/[])
39{
40 MITK_TEST_BEGIN("ToFImageCsvWriter");
41 mitk::ToFImageCsvWriter::Pointer csvWriter = mitk::ToFImageCsvWriter::New();
42 MITK_TEST_CONDITION_REQUIRED(csvWriter.GetPointer(), "Testing initialization of test object!");
43 MITK_TEST_CONDITION_REQUIRED(csvWriter->GetExtension() == ".csv", "Testing correct initialization of member variable extension!");
44
45 srand(time(nullptr));
46
47 unsigned int dimX = 100 + rand()%100;
48 unsigned int dimY = 100 + rand()%100;
49 unsigned int pixelNumber = dimX*dimY;
50 unsigned int numOfFrames = 1 + rand()%100;
51
52 MITK_INFO<<dimX;
53 MITK_INFO<<dimY;
54 MITK_INFO<<numOfFrames;
55
56 mitk::Image::Pointer distanceImage = mitk::ImageGenerator::GenerateRandomImage<float>(dimX, dimY, numOfFrames);
57 mitk::Image::Pointer amplitudeImage = mitk::ImageGenerator::GenerateRandomImage<float>(dimX, dimY, numOfFrames);
58 mitk::Image::Pointer intensityImage = mitk::ImageGenerator::GenerateRandomImage<float>(dimX, dimY, numOfFrames);
59
60
61 std::string distanceImageFileName("distImg.csv");
62 std::string amplitudeImageFileName("amplImg.csv");
63 std::string intensityImageFileName("intImg.csv");
64
65 csvWriter->SetDistanceImageFileName(distanceImageFileName);
66 csvWriter->SetAmplitudeImageFileName(amplitudeImageFileName);
67 csvWriter->SetIntensityImageFileName(intensityImageFileName);
68 csvWriter->SetAmplitudeImageSelected(true);
69 csvWriter->SetIntensityImageSelected(true);
70
71 csvWriter->SetToFCaptureWidth(dimX);
72 csvWriter->SetToFCaptureHeight(dimY);
73 csvWriter->SetToFImageType(mitk::ToFImageWriter::ToFImageType3D);
74
75 mitk::ImageSliceSelector::Pointer distanceSelector = mitk::ImageSliceSelector::New();
76 mitk::ImageSliceSelector::Pointer amplitudeSelector = mitk::ImageSliceSelector::New();
77 mitk::ImageSliceSelector::Pointer intensitySelector = mitk::ImageSliceSelector::New();
78
79 mitk::Image::Pointer tmpDistance;
80 mitk::Image::Pointer tmpAmplitude;
81 mitk::Image::Pointer tmpIntensity;
82
83 distanceSelector->SetInput(distanceImage);
84 amplitudeSelector->SetInput(amplitudeImage);
85 intensitySelector->SetInput(intensityImage);
86
87 //buffer
88 float* distanceArray;
89 float* amplitudeArray;
90 float* intensityArray;
91
92 csvWriter->Open(); //open file/stream
93 for(unsigned int i = 0; i<numOfFrames; i++)
94 { //write values to file/stream
95 distanceSelector->SetSliceNr(i);
96 distanceSelector->Update();
97 mitk::ImageReadAccessor tmpDistAcc(distanceSelector->GetOutput());
98 distanceArray = (float*) tmpDistAcc.GetData();
99
100 amplitudeSelector->SetSliceNr(i);
101 amplitudeSelector->Update();
102 mitk::ImageReadAccessor tmpAmplAcc(amplitudeSelector->GetOutput());
103 amplitudeArray = (float*)tmpAmplAcc.GetData();
104
105 intensitySelector->SetSliceNr(i);
106 intensitySelector->Update();
107 mitk::ImageReadAccessor tmpIntenAcc(intensitySelector->GetOutput());
108 intensityArray = (float*)tmpIntenAcc.GetData();
109
110 csvWriter->Add(distanceArray, amplitudeArray, intensityArray);
111 }
112 csvWriter->Close(); //close file
113
114 FILE* distanceInfile = nullptr;
115 FILE* amplitudeInfile = nullptr;
116 FILE* intensityInfile = nullptr;
117
118 //open file again
119 OpenCsvFile(&(distanceInfile), distanceImageFileName);
120 OpenCsvFile(&(amplitudeInfile), amplitudeImageFileName);
121 OpenCsvFile(&(intensityInfile), intensityImageFileName);
122
123 float distVal = 0.0, amplVal = 0.0, intenVal = 0.0;
124 int dErr = 0, aErr = 0, iErr = 0;
125 bool readingCorrect = true;
126
127 //for all frames...
128 for(unsigned int j=0; j<numOfFrames; j++)
129 {
130 distanceSelector->SetSliceNr(j);
131 distanceSelector->Update();
132 mitk::ImageReadAccessor tmpDistAcc(distanceSelector->GetOutput());
133 distanceArray = (float*) tmpDistAcc.GetData();
134
135 amplitudeSelector->SetSliceNr(j);
136 amplitudeSelector->Update();
137 mitk::ImageReadAccessor tmpAmplAcc(amplitudeSelector->GetOutput());
138 amplitudeArray = (float*)tmpAmplAcc.GetData();
139
140 intensitySelector->SetSliceNr(j);
141 intensitySelector->Update();
142 mitk::ImageReadAccessor tmpIntenAcc(intensitySelector->GetOutput());
143 intensityArray = (float*)tmpIntenAcc.GetData();
144
145 //for all pixels
146 for(unsigned int i=0; i<pixelNumber; i++)
147 {
148 if (i==0 && j==0)
149 { //no comma at the beginning of the document
150 dErr = fscanf (distanceInfile, "%f", &distVal);
151 aErr = fscanf (amplitudeInfile, "%f", &amplVal);
152 iErr = fscanf (intensityInfile, "%f", &intenVal);
153 }
154 else
155 { //comma seperated values now
156 dErr = fscanf (distanceInfile, ",%f", &distVal);
157 aErr = fscanf (amplitudeInfile, ",%f", &amplVal);
158 iErr = fscanf (intensityInfile, ",%f", &intenVal);
159 }
160
161 //check if reading error or EOF occurs
162 if (dErr==0 || dErr==EOF)
163 {
164 MITK_TEST_CONDITION_REQUIRED((dErr!=0 && dErr!=EOF), "Testing open and read csv distance file");
165 }
166 if (aErr==0 || aErr==EOF)
167 {
168 MITK_TEST_CONDITION_REQUIRED((aErr!=0 && aErr!=EOF), "Testing open and read csv amplitude file");
169 }
170 if (iErr==0 || iErr==EOF)
171 {
172 MITK_TEST_CONDITION_REQUIRED((iErr!=0 && iErr!=EOF), "Testing open and read csv intensity file");
173 }
174
175 //compare if input == output
176 if(!mitk::Equal(distVal,distanceArray[i],0.00001) || !mitk::Equal(amplVal, amplitudeArray[i],0.00001) || !mitk::Equal(intenVal, intensityArray[i],0.00001))
177 {
178 readingCorrect = false;
179 }
180 }
181 }
182 MITK_TEST_CONDITION_REQUIRED(readingCorrect, "Testing if the output values are correct.");
183
184 //check if end of file is reached
185 dErr = fscanf (distanceInfile, ",%f", &distVal);
186 aErr = fscanf (amplitudeInfile, ",%f", &amplVal);
187 iErr = fscanf (intensityInfile, ",%f", &intenVal);
188 MITK_TEST_CONDITION_REQUIRED((dErr==EOF), "Testing EOF distance file");
189 MITK_TEST_CONDITION_REQUIRED((aErr==EOF), "Testing EOF amplitude file");
190 MITK_TEST_CONDITION_REQUIRED((iErr==EOF), "Testing EOF intensity file");
191
192 //close testing files
193 CloseCsvFile(distanceInfile);
194 CloseCsvFile(amplitudeInfile);
195 CloseCsvFile(intensityInfile);
196
197 remove( distanceImageFileName.c_str() );
198 remove( amplitudeImageFileName.c_str() );
199 remove( intensityImageFileName.c_str() );
200
201 MITK_TEST_END();
202}
203
204
void OpenCsvFile(FILE **outfile, std::string outfileName)
int mitkToFImageCsvWriterTest(int, char *[])
void CloseCsvFile(FILE *outfile)
MITKIGTBASE_EXPORT bool Equal(const mitk::NavigationData &leftHandSide, const mitk::NavigationData &rightHandSide, ScalarType eps=mitk::eps, bool verbose=false)
Equal A function comparing two navigation data objects for beeing equal in meta- and imagedata.