MITK-IGT
IGT Extension of MITK
Loading...
Searching...
No Matches
mitkNavigationDataToMessageFilterTest.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 "mitkNavigationData.h"
15
16#include "mitkTestingMacros.h"
17#include "mitkNumericTypes.h"
18#include <iostream>
19
20
21// Receiver class remembers Messages received.
22// Will tell about received Messages when asked.
24{
25 public:
26
27 MessageReceiverClass(unsigned int numberOfNavigationDatas)
28 {
29 m_ReceivedData.resize(numberOfNavigationDatas);
30 for (unsigned int i = 0; i < numberOfNavigationDatas; ++i)
31 m_ReceivedData[i] = mitk::NavigationData::New();
32
34 }
35
37 {
38 m_ReceivedData[index]->SetPosition(v);
40 }
41
43 {
44 m_ReceivedData[index]->SetOrientation(v);
46 }
47
49 {
50 m_ReceivedData[index]->SetCovErrorMatrix(v);
52 }
53
55 {
56 m_ReceivedData[index]->SetIGTTimeStamp(v);
58 }
59
60 void OnDataValidChanged(bool v, unsigned int index)
61 {
62 m_ReceivedData[index]->SetDataValid(v);
64 }
65
66 std::vector<mitk::NavigationData::Pointer> m_ReceivedData;
68};
69
73int mitkNavigationDataToMessageFilterTest(int /* argc */, char* /*argv*/[])
74{
75 MITK_TEST_BEGIN("NavigationDataToMessageFilter");
76 /* first tests with one input */
77 {
78 // let's create an object of our class
79 mitk::NavigationDataToMessageFilter::Pointer myFilter = mitk::NavigationDataToMessageFilter::New();
80
81 // first test: did this work?
82 // using MITK_TEST_CONDITION_REQUIRED makes the test stop after failure, since
83 // it makes no sense to continue without an object.
84 MITK_TEST_CONDITION_REQUIRED(myFilter.IsNotNull(),"Testing instantiation");
85
86 /* create helper objects: navigation data with position as origin, zero quaternion, zero error and data valid */
88 mitk::FillVector3D(initialPos, 1.0, 2.0, 3.0);
89 mitk::NavigationData::OrientationType initialOri(1.0, 2.0, 3.0, 4.0);
90
91 mitk::NavigationData::Pointer nd1 = mitk::NavigationData::New();
92 nd1->SetPosition(initialPos);
93 nd1->SetOrientation(initialOri);
94 nd1->SetPositionAccuracy(11.111);
95 nd1->SetIGTTimeStamp(64.46);
96 nd1->SetDataValid(true);
97
98 myFilter->SetInput(nd1);
99 MITK_TEST_CONDITION(myFilter->GetInput() == nd1, "testing Set-/GetInput()");
100
101 mitk::NavigationData* output = myFilter->GetOutput();
102 MITK_TEST_CONDITION_REQUIRED(output != nullptr, "Testing GetOutput()");
103
104
105 /* register message receiver */
106 MessageReceiverClass answers(1);
107 myFilter->AddPositionChangedListener(mitk::MessageDelegate2<MessageReceiverClass, mitk::NavigationData::PositionType, unsigned int>(&answers, &MessageReceiverClass::OnPositionChanged));
108 myFilter->AddOrientationChangedListener(mitk::MessageDelegate2<MessageReceiverClass, mitk::NavigationData::OrientationType, unsigned int>(&answers, &MessageReceiverClass::OnOrientationChanged));
109 myFilter->AddErrorChangedListener(mitk::MessageDelegate2<MessageReceiverClass, mitk::NavigationData::CovarianceMatrixType, unsigned int>(&answers, &MessageReceiverClass::OnErrorChanged));
110 myFilter->AddTimeStampChangedListener(mitk::MessageDelegate2<MessageReceiverClass, mitk::NavigationData::TimeStampType, unsigned int>(&answers, &MessageReceiverClass::OnTimeStampChanged));
111 myFilter->AddDataValidChangedListener(mitk::MessageDelegate2<MessageReceiverClass, bool, unsigned int>(&answers, &MessageReceiverClass::OnDataValidChanged));
112
113
114 output->Update(); // execute filter
115 MITK_TEST_CONDITION( mitk::Equal(answers.m_ReceivedData[0]->GetPosition(), nd1->GetPosition()), "Testing PositionChanged message");
116 MITK_TEST_CONDITION( mitk::Equal(answers.m_ReceivedData[0]->GetOrientation(), nd1->GetOrientation()), "Testing OrientationChanged message");
117 MITK_TEST_CONDITION( answers.m_ReceivedData[0]->GetCovErrorMatrix() == nd1->GetCovErrorMatrix(), "Testing ErrorChanged message");
118 MITK_TEST_CONDITION( mitk::Equal(answers.m_ReceivedData[0]->GetIGTTimeStamp(), nd1->GetIGTTimeStamp()), "Testing TimeStampChanged message");
119 MITK_TEST_CONDITION( answers.m_ReceivedData[0]->IsDataValid() == nd1->IsDataValid(), "Testing PositionChanged message");
120 MITK_TEST_CONDITION( answers.m_MessagesReceived == 5, "Correct number of messages send?");
121
122 /* change one input parameter */
123 nd1->SetDataValid(false);
124 output->Update(); // re-execute filter
125 MITK_TEST_CONDITION( answers.m_ReceivedData[0]->IsDataValid() == nd1->IsDataValid(), "Testing PositionChanged message");
126 MITK_TEST_CONDITION( answers.m_MessagesReceived == 6, "only necessary messages send?"); // only datavalid message re-send
127
128 /* changing two input parameters */
129 mitk::FillVector3D(initialPos, 11.0, 21.0, 31.0);
130 nd1->SetPosition(initialPos); // change only one parameter
131 nd1->SetIGTTimeStamp(55.55); // change only one parameter
132 output->Update(); // re-execute filter
133 MITK_TEST_CONDITION( mitk::Equal(answers.m_ReceivedData[0]->GetPosition(), nd1->GetPosition()), "Testing PositionChanged message");
134 MITK_TEST_CONDITION( mitk::Equal(answers.m_ReceivedData[0]->GetIGTTimeStamp(), nd1->GetIGTTimeStamp()), "Testing TimeStampChanged message");
135 MITK_TEST_CONDITION( answers.m_MessagesReceived == 8, "only necessary messages send?"); // only 2 new messages send
136
137 /* try to add a second input */
138 //MITK_TEST_OUTPUT_NO_ENDL( << "Exception on adding second input? --> ");
139 //mitk::NavigationData::Pointer nd2 = mitk::NavigationData::New();
140 //MITK_TEST_FOR_EXCEPTION(std::invalid_argument, myFilter->SetInput(1, nd2));
141
142 }
143 /* now test with multiple inputs */
144 {
145 MITK_TEST_OUTPUT( << "Now, perform tests with multiple inputs");
146
147 mitk::NavigationDataToMessageFilter::Pointer myFilter = mitk::NavigationDataToMessageFilter::New();
148
149 /* create helper objects: navigation data with position as origin, zero quaternion, zero error and data valid */
151 mitk::FillVector3D(initialPos, 1.0, 1.0, 1.0);
152 mitk::NavigationData::OrientationType initialOri(1.0, 1.0, 1.0, 1.0);
153
154 mitk::NavigationData::Pointer nd0 = mitk::NavigationData::New();
155 nd0->SetPosition(initialPos);
156 nd0->SetOrientation(initialOri);
157 nd0->SetPositionAccuracy(11.111);
158 nd0->SetIGTTimeStamp(64.46);
159 nd0->SetDataValid(true);
160
161 mitk::FillVector3D(initialPos, 2.0, 2.0, 2.0);
162 mitk::NavigationData::OrientationType initialOri2(1.0, 1.0, 1.0, 1.0);
163 mitk::NavigationData::Pointer nd1 = mitk::NavigationData::New();
164 nd1->SetPosition(initialPos);
165 nd1->SetOrientation(initialOri2);
166 nd1->SetPositionAccuracy(22.222);
167 nd1->SetIGTTimeStamp(222.2);
168 nd1->SetDataValid(true);
169
170 myFilter->SetInput(0, nd0);
171 myFilter->SetInput(1, nd1);
172 MITK_TEST_CONDITION(myFilter->GetInput(0) == nd0, "testing Set-/GetInput(0)");
173 MITK_TEST_CONDITION(myFilter->GetInput(1) == nd1, "testing Set-/GetInput(1)");
174
175 mitk::NavigationData* output0 = myFilter->GetOutput();
176 mitk::NavigationData* output1 = myFilter->GetOutput(1);
177 MITK_TEST_CONDITION_REQUIRED(output0 != nullptr, "Testing GetOutput()");
178 MITK_TEST_CONDITION_REQUIRED(output1 != nullptr, "Testing GetOutput(1)");
179
180 /* register message receiver */
181 MessageReceiverClass answers(2);
182 myFilter->AddPositionChangedListener(mitk::MessageDelegate2<MessageReceiverClass, mitk::NavigationData::PositionType, unsigned int>(&answers, &MessageReceiverClass::OnPositionChanged));
183 myFilter->AddOrientationChangedListener(mitk::MessageDelegate2<MessageReceiverClass, mitk::NavigationData::OrientationType, unsigned int>(&answers, &MessageReceiverClass::OnOrientationChanged));
184 myFilter->AddErrorChangedListener(mitk::MessageDelegate2<MessageReceiverClass, mitk::NavigationData::CovarianceMatrixType, unsigned int>(&answers, &MessageReceiverClass::OnErrorChanged));
185 myFilter->AddTimeStampChangedListener(mitk::MessageDelegate2<MessageReceiverClass, mitk::NavigationData::TimeStampType, unsigned int>(&answers, &MessageReceiverClass::OnTimeStampChanged));
186 myFilter->AddDataValidChangedListener(mitk::MessageDelegate2<MessageReceiverClass, bool, unsigned int>(&answers, &MessageReceiverClass::OnDataValidChanged));
187
188 output0->Update(); // execute filter. This should send messages for both inputs
189 MITK_TEST_CONDITION( mitk::Equal(answers.m_ReceivedData[0]->GetPosition(), nd0->GetPosition()), "Testing PositionChanged message");
190 MITK_TEST_CONDITION( mitk::Equal(answers.m_ReceivedData[0]->GetOrientation(), nd0->GetOrientation()), "Testing OrientationChanged message");
191 MITK_TEST_CONDITION( answers.m_ReceivedData[0]->GetCovErrorMatrix() == nd0->GetCovErrorMatrix(), "Testing ErrorChanged message");
192 MITK_TEST_CONDITION( mitk::Equal(answers.m_ReceivedData[0]->GetIGTTimeStamp(), nd0->GetIGTTimeStamp()), "Testing TimeStampChanged message");
193 MITK_TEST_CONDITION( answers.m_ReceivedData[0]->IsDataValid() == nd0->IsDataValid(), "Testing PositionChanged message");
194 MITK_TEST_CONDITION( mitk::Equal(answers.m_ReceivedData[1]->GetPosition(), nd1->GetPosition()), "Testing PositionChanged message");
195 MITK_TEST_CONDITION( mitk::Equal(answers.m_ReceivedData[1]->GetOrientation(), nd1->GetOrientation()), "Testing OrientationChanged message");
196 MITK_TEST_CONDITION( answers.m_ReceivedData[1]->GetCovErrorMatrix() == nd1->GetCovErrorMatrix(), "Testing ErrorChanged message");
197 MITK_TEST_CONDITION( mitk::Equal(answers.m_ReceivedData[1]->GetIGTTimeStamp(), nd1->GetIGTTimeStamp()), "Testing TimeStampChanged message");
198 MITK_TEST_CONDITION( answers.m_ReceivedData[1]->IsDataValid() == nd1->IsDataValid(), "Testing PositionChanged message");
199 MITK_TEST_CONDITION( answers.m_MessagesReceived == 10, "Correct number of messages send?");
200 MITK_TEST_OUTPUT( << "answers.m_MessagesReceived = " << answers.m_MessagesReceived);
201 /* change one input parameter */
202 nd0->SetDataValid(false);
203 output0->Update(); // re-execute filter
204 MITK_TEST_CONDITION( answers.m_ReceivedData[0]->IsDataValid() == nd0->IsDataValid(), "Testing PositionChanged message for input 0");
205 MITK_TEST_CONDITION( answers.m_MessagesReceived == 11, "only necessary messages send?"); // only datavalid message for input 0 re-send
206
207 /* remove one listener and check that message is not send */
208 myFilter->RemoveTimeStampChangedListener(mitk::MessageDelegate2<MessageReceiverClass, mitk::NavigationData::TimeStampType, unsigned int>(&answers, &MessageReceiverClass::OnTimeStampChanged));
209 mitk::NavigationData::TimeStampType oldValue = nd1->GetIGTTimeStamp();
210 nd1->SetIGTTimeStamp(999.9);
211 myFilter->Update();
212 MITK_TEST_CONDITION( ! mitk::Equal(answers.m_ReceivedData[1]->GetIGTTimeStamp(), nd1->GetIGTTimeStamp()), "Testing if TimeStamp message is _not_ send after RemoveListener (!= new value)");
213 MITK_TEST_CONDITION( mitk::Equal(answers.m_ReceivedData[1]->GetIGTTimeStamp(), oldValue), "Testing if TimeStamp message is _not_ send after RemoveListener (== old value)");
214 MITK_TEST_CONDITION( answers.m_MessagesReceived == 11, "no new messages send?"); // no new message send?
215 /* other messages are still send? */
216 nd1->SetDataValid(false);
217 myFilter->Update();
218 MITK_TEST_CONDITION( answers.m_ReceivedData[1]->IsDataValid() == nd1->IsDataValid(), "Other messages still send? ->Testing PositionChanged message for input 1 again");
219 MITK_TEST_CONDITION( answers.m_MessagesReceived == 12, "only necessary messages send?"); // only DataValid message for input 1 re-send
220 /* check if other output still has its old value */
221 MITK_TEST_CONDITION( answers.m_ReceivedData[0]->IsDataValid() == nd0->IsDataValid(), "Testing PositionChanged message for input 0");
222 }
223 // The end
224 MITK_TEST_END();
225}
void OnErrorChanged(mitk::NavigationData::CovarianceMatrixType v, unsigned int index)
void OnOrientationChanged(mitk::NavigationData::OrientationType v, unsigned int index)
void OnTimeStampChanged(mitk::NavigationData::TimeStampType v, unsigned int index)
void OnDataValidChanged(bool v, unsigned int index)
void OnPositionChanged(mitk::NavigationData::PositionType v, unsigned int index)
std::vector< mitk::NavigationData::Pointer > m_ReceivedData
MessageReceiverClass(unsigned int numberOfNavigationDatas)
itk::Matrix< mitk::ScalarType, 6, 6 > CovarianceMatrixType
type that holds the error characterization of the position and orientation measurements
mitk::Quaternion OrientationType
Type that holds the orientation part of the tracking data.
double TimeStampType
type that holds the time at which the data was recorded in milliseconds
mitk::Point3D PositionType
Type that holds the position part of the tracking data.
int mitkNavigationDataToMessageFilterTest(int, char *[])
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.