MITK-IGT
IGT Extension of MITK
Loading...
Searching...
No Matches
mitkNavigationDataEvaluationFilter.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
14#include <mitkPointSetStatisticsCalculator.h>
15
20
24
26{
27 this->CreateOutputsForAllInputs(); // make sure that we have the same number of outputs as inputs
28 this->CreateMembersForAllInputs();
29
30 /* update outputs with tracking data from tools */
31 for (unsigned int i = 0; i < this->GetNumberOfOutputs(); ++i)
32 {
33 //first copy outputs to inputs
34 mitk::NavigationData* output = this->GetOutput(i);
35 assert(output);
36 const mitk::NavigationData* input = this->GetInput(i);
37 assert(input);
38 if (input->IsDataValid() == false) { output->SetDataValid(false); }
39 else { output->Graft(input); }
40
41 //then save statistics
42 if (input->IsDataValid())
43 {
44 m_LoggedPositions[i].push_back(input->GetPosition());
45 m_LoggedQuaternions[i].push_back(input->GetOrientation());
46 }
47 else
48 {
49 m_InvalidSamples[i]++;
50 }
51 }
52}
54{
55 while (this->m_LoggedPositions.size() < this->GetNumberOfInputs())
56 {
57 std::pair<std::size_t, std::vector<mitk::Point3D> > newElement(m_LoggedPositions.size(), std::vector<mitk::Point3D>());
58 m_LoggedPositions.insert(newElement);
59 }
60 while (this->m_LoggedQuaternions.size() < this->GetNumberOfInputs())
61 {
62 std::pair<std::size_t, std::vector<mitk::Quaternion> > newElement(m_LoggedQuaternions.size(), std::vector<mitk::Quaternion>());
63 m_LoggedQuaternions.insert(newElement);
64 }
65 while (this->m_InvalidSamples.size() < this->GetNumberOfInputs())
66 {
67 std::pair<std::size_t, int> newElement(m_InvalidSamples.size(), 0);
68 m_InvalidSamples.insert(newElement);
69 }
70}
71
73{
74 for (unsigned int i = 0; i < m_LoggedPositions.size(); i++) m_LoggedPositions[i] = std::vector<mitk::Point3D>();
75 for (unsigned int i = 0; i < m_LoggedQuaternions.size(); i++) m_LoggedQuaternions[i] = std::vector<mitk::Quaternion>();
76 for (unsigned int i = 0; i < m_InvalidSamples.size(); i++) m_InvalidSamples[i] = 0;
77}
78
80{
81 return this->m_LoggedPositions[input].size();
82}
83
85{
86 mitk::PointSetStatisticsCalculator::Pointer myCalculator = mitk::PointSetStatisticsCalculator::New(VectorToPointSet(m_LoggedPositions[input]));
87 return myCalculator->GetPositionMean();
88}
89
91{
92 mitk::PointSetStatisticsCalculator::Pointer myCalculator = mitk::PointSetStatisticsCalculator::New(VectorToPointSet(m_LoggedPositions[input]));
93 return myCalculator->GetPositionStandardDeviation();
94}
95
97{
98 mitk::PointSetStatisticsCalculator::Pointer myCalculator = mitk::PointSetStatisticsCalculator::New(VectorToPointSet(m_LoggedPositions[input]));
99 return myCalculator->GetPositionSampleStandardDeviation();
100}
101
103{
104 return GetMean(m_LoggedQuaternions[input]);
105}
106
108{
109 mitk::Quaternion returnValue;
110 std::vector<double> list1 = std::vector<double>();
111 std::vector<double> list2 = std::vector<double>();
112 std::vector<double> list3 = std::vector<double>();
113 std::vector<double> list4 = std::vector<double>();
114 for (unsigned int i = 0; i < m_LoggedQuaternions[input].size(); i++)
115 {
116 list1.push_back(m_LoggedQuaternions[input].at(i)[0]);
117 list2.push_back(m_LoggedQuaternions[input].at(i)[1]);
118 list3.push_back(m_LoggedQuaternions[input].at(i)[2]);
119 list4.push_back(m_LoggedQuaternions[input].at(i)[3]);
120 }
121 mitk::PointSetStatisticsCalculator::Pointer myCalculator = mitk::PointSetStatisticsCalculator::New();
122 returnValue[0] = myCalculator->GetStabw(list1);
123 returnValue[1] = myCalculator->GetStabw(list2);
124 returnValue[2] = myCalculator->GetStabw(list3);
125 returnValue[3] = myCalculator->GetStabw(list4);
126 return returnValue;
127}
128
130{
131 mitk::PointSetStatisticsCalculator::Pointer myCalculator = mitk::PointSetStatisticsCalculator::New(VectorToPointSet(QuaternionsToEulerAngles(m_LoggedQuaternions[input])));
132 mitk::Vector3D returnValue;
133 returnValue[0] = myCalculator->GetPositionMean()[0];
134 returnValue[1] = myCalculator->GetPositionMean()[1];
135 returnValue[2] = myCalculator->GetPositionMean()[2];
136 return returnValue;
137}
138
140{
141 mitk::PointSetStatisticsCalculator::Pointer myCalculator = mitk::PointSetStatisticsCalculator::New(VectorToPointSet(QuaternionsToEulerAngles(m_LoggedQuaternions[input])));
142 return myCalculator->GetPositionErrorRMS();
143}
144
146{
147 mitk::PointSetStatisticsCalculator::Pointer myCalculator = mitk::PointSetStatisticsCalculator::New(VectorToPointSet(QuaternionsToEulerAnglesGrad(m_LoggedQuaternions[input])));
148 return myCalculator->GetPositionErrorRMS();
149}
150
152{
153 mitk::PointSetStatisticsCalculator::Pointer myCalculator = mitk::PointSetStatisticsCalculator::New(VectorToPointSet(m_LoggedPositions[input]));
154 return myCalculator->GetPositionErrorMean();
155}
156
158{
159 mitk::PointSetStatisticsCalculator::Pointer myCalculator = mitk::PointSetStatisticsCalculator::New(VectorToPointSet(m_LoggedPositions[input]));
160 return myCalculator->GetPositionErrorStandardDeviation();
161}
162
164{
165 mitk::PointSetStatisticsCalculator::Pointer myCalculator = mitk::PointSetStatisticsCalculator::New(VectorToPointSet(m_LoggedPositions[input]));
166 return myCalculator->GetPositionErrorSampleStandardDeviation();
167}
168
170{
171 mitk::PointSetStatisticsCalculator::Pointer myCalculator = mitk::PointSetStatisticsCalculator::New(VectorToPointSet(m_LoggedPositions[input]));
172 return myCalculator->GetPositionErrorRMS();
173}
174
176{
177 mitk::PointSetStatisticsCalculator::Pointer myCalculator = mitk::PointSetStatisticsCalculator::New(VectorToPointSet(m_LoggedPositions[input]));
178 return myCalculator->GetPositionErrorMedian();
179}
180
182{
183 mitk::PointSetStatisticsCalculator::Pointer myCalculator = mitk::PointSetStatisticsCalculator::New(VectorToPointSet(m_LoggedPositions[input]));
184 return myCalculator->GetPositionErrorMax();
185}
186
188{
189 mitk::PointSetStatisticsCalculator::Pointer myCalculator = mitk::PointSetStatisticsCalculator::New(VectorToPointSet(m_LoggedPositions[input]));
190 return myCalculator->GetPositionErrorMin();
191}
192
194{
195 return m_InvalidSamples[input];
196}
197
199{
200 return (m_InvalidSamples[input] / (m_InvalidSamples[input] + ((double)m_LoggedPositions[input].size())))*100.0;
201}
202
203mitk::Quaternion mitk::NavigationDataEvaluationFilter::GetMean(std::vector<mitk::Quaternion> list)
204{
205 //calculate mean
206 mitk::Quaternion mean;
207 mean[0] = 0;
208 mean[1] = 0;
209 mean[2] = 0;
210 mean[3] = 0;
211
212 for (unsigned int i = 0; i < list.size(); i++)
213 {
214 mean[0] += list.at(i)[0];
215 mean[1] += list.at(i)[1];
216 mean[2] += list.at(i)[2];
217 mean[3] += list.at(i)[3];
218 }
219
220 mean[0] /= list.size();
221 mean[1] /= list.size();
222 mean[2] /= list.size();
223 mean[3] /= list.size();
224
225 return mean;
226}
227
228mitk::PointSet::Pointer mitk::NavigationDataEvaluationFilter::VectorToPointSet(std::vector<mitk::Point3D> pSet)
229{
230 mitk::PointSet::Pointer returnValue = mitk::PointSet::New();
231 for (unsigned int i = 0; i < pSet.size(); i++) returnValue->InsertPoint(i, pSet.at(i));
232 return returnValue;
233}
234
235mitk::PointSet::Pointer mitk::NavigationDataEvaluationFilter::VectorToPointSet(std::vector<mitk::Vector3D> pSet)
236{
237 mitk::PointSet::Pointer returnValue = mitk::PointSet::New();
238 for (unsigned int i = 0; i < pSet.size(); i++)
239 {
240 mitk::Point3D thisPoint;
241 thisPoint[0] = pSet.at(i)[0];
242 thisPoint[1] = pSet.at(i)[1];
243 thisPoint[2] = pSet.at(i)[2];
244 returnValue->InsertPoint(i, thisPoint);
245 }
246 return returnValue;
247}
248
249std::vector<mitk::Vector3D> mitk::NavigationDataEvaluationFilter::QuaternionsToEulerAngles(std::vector<mitk::Quaternion> quaterions)
250{
251 std::vector<mitk::Vector3D> returnValue = std::vector<mitk::Vector3D>();
252 for (unsigned int i = 0; i < quaterions.size(); i++)
253 {
254 mitk::Vector3D eulerAngles;
255 mitk::Quaternion currentQuaternion = quaterions.at(i);
256 currentQuaternion.normalize(); //must be normalized due to the documentation of the vnl method rotation_euler_angles()
257 eulerAngles[0] = currentQuaternion.rotation_euler_angles()[0];
258 eulerAngles[1] = currentQuaternion.rotation_euler_angles()[1];
259 eulerAngles[2] = currentQuaternion.rotation_euler_angles()[2];
260 returnValue.push_back(eulerAngles);
261 }
262 return returnValue;
263}
264
265std::vector<mitk::Vector3D> mitk::NavigationDataEvaluationFilter::QuaternionsToEulerAnglesGrad(std::vector<mitk::Quaternion> quaterions)
266{
267 std::vector<mitk::Vector3D> returnValue = std::vector<mitk::Vector3D>();
268 std::vector<mitk::Vector3D> eulerAnglesRadians = QuaternionsToEulerAngles(quaterions);
269 for (unsigned int i = 0; i < eulerAnglesRadians.size(); i++)
270 {
271 mitk::Vector3D currentAngles;
272 currentAngles[0] = (eulerAnglesRadians.at(i)[0] / itk::Math::pi) * 180;
273 currentAngles[1] = (eulerAnglesRadians.at(i)[1] / itk::Math::pi) * 180;
274 currentAngles[2] = (eulerAnglesRadians.at(i)[2] / itk::Math::pi) * 180;
275 returnValue.push_back(currentAngles);
276 }
277 return returnValue;
278}
279
280mitk::Point3D mitk::NavigationDataEvaluationFilter::GetLoggedPosition(unsigned int i, int input)
281{
282 mitk::Point3D returnValue;
283 if (m_LoggedPositions[input].size() <= i) returnValue.Fill(0);
284 else returnValue = m_LoggedPositions[input].at(i);
285 return returnValue;
286}
287
288mitk::Quaternion mitk::NavigationDataEvaluationFilter::GetLoggedOrientation(unsigned int i, int input)
289{
290 mitk::Quaternion returnValue;
291 if (m_LoggedQuaternions[input].size() <= i) returnValue.fill(0);
292 else returnValue = m_LoggedQuaternions[input].at(i);
293 return returnValue;
294}
void ResetStatistic()
Resets all statistics and starts again.
void CreateMembersForAllInputs()
Creates the member variables which store all the statistical data for every input.
std::vector< mitk::Vector3D > QuaternionsToEulerAnglesGrad(std::vector< mitk::Quaternion > quaterions)
mitk::Quaternion GetLoggedOrientation(unsigned int i, int input)
mitk::Point3D GetLoggedPosition(unsigned int i, int input)
std::vector< mitk::Vector3D > QuaternionsToEulerAngles(std::vector< mitk::Quaternion > quaterions)
Converts a list of quaterions to a list of euler angles (theta_x, theta_y, theta_z)
mitk::Quaternion GetMean(std::vector< mitk::Quaternion > list)
mitk::PointSet::Pointer VectorToPointSet(std::vector< mitk::Point3D > pSet)
NavigationDataToNavigationDataFilter is the base class of all filters that receive NavigationDatas as...
void Graft(const DataObject *data) override
Graft the data and information from one NavigationData to another.
virtual bool IsDataValid() const
returns true if the object contains valid data
IGT Exceptions.