MITK-IGT
IGT Extension of MITK
Loading...
Searching...
No Matches
mitkUSTargetPlacementQualityCalculator.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
15#include "mitkDataNode.h"
16#include "mitkSurface.h"
17#include "mitkPointSet.h"
18
19#include <vtkSmartPointer.h>
20#include <vtkPolyData.h>
21#include <vtkTransformPolyDataFilter.h>
22#include <vtkCenterOfMass.h>
23#include <vtkMath.h>
24#include <vtkLinearTransform.h>
25
27: m_OptimalAngle(-1), m_CentersOfMassDistance(-1), m_MeanAngleDifference(-1)
28{
29}
30
34
36{
37 if ( m_OptimalAngle < 0 )
38 {
39 mitkThrow() << "Optimal angle must be set before call of update.";
40 }
41
42 if ( m_TargetPoints.IsNull() )
43 {
44 mitkThrow() << "Targets points must be set before call of update.";
45 }
46
47 vtkSmartPointer<vtkPolyData> targetSurface = this->GetTransformedPolydata();
48
50 centerOfMass->SetUseScalarsAsWeights(false);
51 centerOfMass->SetInputData(targetSurface);
52 centerOfMass->Update();
53
54 double targetCenter[3];
55 centerOfMass->GetCenter(targetCenter);
56
57 mitk::Point3D targetCenterPoint;
58 targetCenterPoint[0] = targetCenter[0];
59 targetCenterPoint[1] = targetCenter[1];
60 targetCenterPoint[2] = targetCenter[2];
61
62 MITK_INFO("QmitkUSAbstractNavigationStep")("QmitkUSNavigationStepPlacementPlanning")
63 << "Center of mass of the target calculated as: " << targetCenterPoint;
64
66 std::vector< itk::Vector<float, 3u> > targetsToCenterOfMassVectors;
67
68 for ( mitk::PointSet::PointsConstIterator it = m_TargetPoints->Begin();
69 it != m_TargetPoints->End(); ++it )
70 {
71 // insert all planned target points into a vtkPolyData for calculating
72 // the center of mass afterwards
73 //mitk::Point3D origin = it->GetData()->GetGeometry()->GetOrigin();
74 mitk::Point3D origin = it->Value();
75 plannedTargetsPoints->InsertNextPoint(origin[0], origin[1], origin[2]);
76
77 // define normalised vectors from each planned target point to the center
78 // of mass of the target structure
79 itk::Vector<float, 3u> vector = targetCenterPoint - origin;
80 vector.Normalize();
81 targetsToCenterOfMassVectors.push_back(vector);
82 }
83
85 plannedTargetsPointSet->SetPoints(plannedTargetsPoints);
86
87 centerOfMass->SetInputData(plannedTargetsPointSet);
88 centerOfMass->Update();
89 double plannedCenter[3];
90 centerOfMass->GetCenter(plannedCenter);
91
92 mitk::Point3D plannedTargetsCenterPoint;
93 plannedTargetsCenterPoint[0] = plannedCenter[0];
94 plannedTargetsCenterPoint[1] = plannedCenter[1];
95 plannedTargetsCenterPoint[2] = plannedCenter[2];
96
97 MITK_INFO("QmitkUSAbstractNavigationStep")("QmitkUSNavigationStepPlacementPlanning")
98 << "Center of mass of the planned target points calculated as: " << plannedTargetsCenterPoint;
99
100 m_CentersOfMassDistance = targetCenterPoint.EuclideanDistanceTo(plannedTargetsCenterPoint);
101 MITK_INFO("QmitkUSAbstractNavigationStep")("QmitkUSNavigationStepPlacementPlanning")
102 << "Distance between target center of mass and planned target points center of mass: " << m_CentersOfMassDistance;
103
104 unsigned int numberOfAngles = targetsToCenterOfMassVectors.size() * (targetsToCenterOfMassVectors.size()-1) / 2;
105
106 m_AngleDifferences.set_size(numberOfAngles);
107 unsigned int n = 0;
108
109 m_MeanAngleDifference = 0;
110 for ( unsigned int i = 0; i < targetsToCenterOfMassVectors.size(); i++ )
111 {
112 for ( unsigned int j = i+1; j < targetsToCenterOfMassVectors.size(); j++ )
113 {
114 double angleDiff = acos ( targetsToCenterOfMassVectors.at(i) * targetsToCenterOfMassVectors.at(j) ) - m_OptimalAngle;
115 if ( angleDiff < 0 ) { angleDiff = -angleDiff; }
116
117 m_AngleDifferences.put(n++, angleDiff);
118 m_MeanAngleDifference += angleDiff;
119 }
120 }
121
122 m_MeanAngleDifference /= numberOfAngles; // calculate mean
123 m_MeanAngleDifference = vtkMath::DegreesFromRadians(m_MeanAngleDifference);
124
125 MITK_INFO("QmitkUSAbstractNavigationStep")("QmitkUSNavigationStepPlacementPlanning")
126 << "Angles between the target points: " << m_AngleDifferences;
127 MITK_INFO("QmitkUSAbstractNavigationStep")("QmitkUSNavigationStepPlacementPlanning")
128 << "Mean difference of angles between the target points: " << m_MeanAngleDifference;
129}
130
132{
133 if ( m_TargetSurface.IsNull() || ! m_TargetSurface->GetVtkPolyData() )
134 {
135 mitkThrow() << "Target surface must not be null.";
136 }
137
138 // transform vtk polydata according to mitk geometry
141 transformFilter->SetInputData(0, m_TargetSurface->GetVtkPolyData());
142 transformFilter->SetTransform(m_TargetSurface->GetGeometry()->GetVtkTransform());
143 transformFilter->Update();
144
145 return transformFilter->GetOutput();
146}
void Update()
Calculates the quality metrics. This method should be called before calling the getters for the metri...