Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
mitkNavigationDataEvaluationFilter.cpp
Go to the documentation of this file.
1 /*============================================================================
2 
3 The Medical Imaging Interaction Toolkit (MITK)
4 
5 Copyright (c) German Cancer Research Center (DKFZ)
6 All rights reserved.
7 
8 Use of this source code is governed by a 3-clause BSD license that can be
9 found in the LICENSE file.
10 
11 ============================================================================*/
12 
15 
18 {
19 }
20 
22 {
23 }
24 
26 {
27  this->CreateOutputsForAllInputs(); // make sure that we have the same number of outputs as inputs
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 
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 
229 {
231  for (unsigned int i = 0; i < pSet.size(); i++) returnValue->InsertPoint(i, pSet.at(i));
232  return returnValue;
233 }
234 
236 {
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 
249 std::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 
265 std::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 
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 
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 }
NavigationData * GetOutput(void)
return the output (output with id 0) of the filter
std::map< std::vcl_size_t, std::vector< mitk::Quaternion > > m_LoggedQuaternions
NavigationDataToNavigationDataFilter is the base class of all filters that receive NavigationDatas as...
mitk::Quaternion GetMean(std::vector< mitk::Quaternion > list)
Navigation Data.
static Pointer New()
DataCollection - Class to facilitate loading/accessing structured data.
virtual void SetDataValid(bool _arg)
sets the dataValid flag of the NavigationData object indicating if the object contains valid data ...
void CreateMembersForAllInputs()
Creates the member variables which store all the statistical data for every input.
virtual PositionType GetPosition() const
returns position of the NavigationData object
mitk::Point3D GetLoggedPosition(unsigned int i, int input)
const NavigationData * GetInput(void) const
Get the input of this filter.
void GenerateData() override
filter execute method
std::vector< mitk::Vector3D > QuaternionsToEulerAnglesGrad(std::vector< mitk::Quaternion > quaterions)
void ResetStatistic()
Resets all statistics and starts again.
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 GetLoggedOrientation(unsigned int i, int input)
vnl_quaternion< ScalarType > Quaternion
std::map< std::vcl_size_t, std::vector< mitk::Point3D > > m_LoggedPositions
mitk::PointSet::Pointer VectorToPointSet(std::vector< mitk::Point3D > pSet)
void Graft(const DataObject *data) override
Graft the data and information from one NavigationData to another.
virtual OrientationType GetOrientation() const
returns the orientation of the NavigationData object
virtual bool IsDataValid() const
returns true if the object contains valid data