MITK-IGT
IGT Extension of MITK
Loading...
Searching...
No Matches
QmitkIGTTrackingSemiAutomaticMeasurementView.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// Blueberry
14#include <berryISelectionService.h>
15#include <berryIWorkbenchWindow.h>
16
17// Qmitk
19
20// Qt
21#include <QMessageBox>
22#include <qfiledialog.h>
23#include <qevent.h>
24#include <QCheckBox>
25
26// MITK
29#include <mitkLogBackend.h>
31
32// POCO
33#include <Poco/File.h>
34#include <Poco/Path.h>
35
36const std::string QmitkIGTTrackingSemiAutomaticMeasurementView::VIEW_ID = "org.mitk.views.igttrackingsemiautomaticmeasurement";
37
39 : m_Controls(nullptr)
40{
41 m_NextFile = 0;
42 m_FilenameVector = std::vector<std::string>();
43 m_Timer = new QTimer(this);
44 m_logging = false;
45 m_referenceValid = true;
46 m_tracking = false;
47 m_EvaluationFilter = mitk::NavigationDataEvaluationFilter::New();
48}
49
53
55{
56 QString LogFileName = m_Controls->m_OutputPath->text() + "_results.log";
57 mitk::LogBackend::Unregister();
58 mitk::LogBackend::SetLogFile(LogFileName.toStdString());
59 mitk::LogBackend::Register();
60
61 double RMSmean = 0;
62 for (std::size_t i = 0; i < m_RMSValues.size(); ++i)
63 {
64 MITK_INFO << "RMS at " << this->m_FilenameVector.at(i) << ": " << m_RMSValues.at(i);
65 RMSmean += m_RMSValues.at(i);
66 }
67 RMSmean /= m_RMSValues.size();
68 MITK_INFO << "RMS mean over " << m_RMSValues.size() << " values: " << RMSmean;
69
70 mitk::DataNode::Pointer newNode = mitk::DataNode::New();
71 newNode->SetName("Tracking Results");
72 newNode->SetData(this->m_MeanPoints);
73 this->GetDataStorage()->Add(newNode);
74
75 std::vector<mitk::HummelProtocolEvaluation::HummelProtocolDistanceError> results5cmDistances;
76 if (m_Controls->m_mediumVolume->isChecked())
78 else if (m_Controls->m_smallVolume->isChecked())
80 else if (m_Controls->m_standardVolume->isChecked())
82}
83
85{
86 // build up qt view, unless already done
87 if (!m_Controls)
88 {
89 // create GUI widgets from the Qt Designer's .ui file
90 m_Controls = new Ui::QmitkIGTTrackingSemiAutomaticMeasurementViewControls;
91 m_Controls->setupUi(parent);
92
93 //buttons
94 connect(m_Controls->m_LoadMeasurementToolStorage, SIGNAL(clicked()), this, SLOT(OnLoadMeasurementStorage()));
95 connect(m_Controls->m_LoadReferenceToolStorage, SIGNAL(clicked()), this, SLOT(OnLoadReferenceStorage()));
96 connect(m_Controls->m_StartTracking, SIGNAL(clicked()), this, SLOT(OnStartTracking()));
97 connect(m_Controls->m_LoadList, SIGNAL(clicked()), this, SLOT(OnMeasurementLoadFile()));
98 connect(m_Controls->m_StartNextMeasurement, SIGNAL(clicked()), this, SLOT(StartNextMeasurement()));
99 connect(m_Controls->m_ReapeatLastMeasurement, SIGNAL(clicked()), this, SLOT(RepeatLastMeasurement()));
100 connect(m_Controls->m_SetReference, SIGNAL(clicked()), this, SLOT(OnSetReference()));
101 connect(m_Controls->m_UseReferenceTrackingSystem, SIGNAL(toggled(bool)), this, SLOT(OnUseReferenceToggled(bool)));
102 connect(m_Controls->m_CreateResults, SIGNAL(clicked()), this, SLOT(CreateResults()));
103
104 //event filter
105 qApp->installEventFilter(this);
106
107 //timers
108 connect(m_Timer, SIGNAL(timeout()), this, SLOT(UpdateTimer()));
109 }
110
111 //initialize some view
112 m_Controls->m_StopTracking->setEnabled(false);
113}
114
116{
117 if (state)
118 {
119 m_Controls->m_ReferenceBox->setEnabled(true);
120 m_Controls->m_SetReference->setEnabled(true);
121 }
122
123 else
124 {
125 m_Controls->m_ReferenceBox->setEnabled(false);
126 m_Controls->m_SetReference->setEnabled(false);
127 }
128}
129
130mitk::NavigationToolStorage::Pointer QmitkIGTTrackingSemiAutomaticMeasurementView::ReadStorage(std::string file)
131{
132 mitk::NavigationToolStorage::Pointer returnValue;
133
134 //initialize tool storage
135 returnValue = mitk::NavigationToolStorage::New();
136
137 //read tool storage from disk
138 mitk::NavigationToolStorageDeserializer::Pointer myDeserializer = mitk::NavigationToolStorageDeserializer::New(GetDataStorage());
139 returnValue = myDeserializer->Deserialize(file);
140 if (returnValue.IsNull())
141 {
142 QMessageBox msgBox;
143 msgBox.setText(myDeserializer->GetErrorMessage().c_str());
144 msgBox.exec();
145
146 returnValue = nullptr;
147 }
148
149 return returnValue;
150}
151
153{
154 //initialize reference
155 m_ReferenceStartPositions = std::vector<mitk::Point3D>();
157 QString Label = "Positions At Start: ";
158 for (unsigned int i = 0; i < m_ReferenceTrackingDeviceSource->GetNumberOfOutputs(); ++i)
159 {
160 mitk::Point3D position = m_ReferenceTrackingDeviceSource->GetOutput(i)->GetPosition();
161 Label = Label + "Tool" + QString::number(i) + ":[" + QString::number(position[0]) + ":" + QString::number(position[1]) + ":" + QString::number(position[1]) + "] ";
162 m_ReferenceStartPositions.push_back(position);
163 }
164 m_Controls->m_ReferencePosAtStart->setText(Label);
165}
166
168{
169 //read in filename
170 QString filename = QFileDialog::getOpenFileName(nullptr, tr("Open Toolfile"), "/", tr("All Files (*.*)"));
171 if (filename.isNull()) return;
172
173 m_MeasurementStorage = ReadStorage(filename.toStdString());
174
175 //update label
176 Poco::Path myPath = Poco::Path(filename.toStdString()); //use this to separate filename from path
177 QString toolLabel = QString("Tool Storage: ") + QString::number(m_MeasurementStorage->GetToolCount()) + " Tools from " + myPath.getFileName().c_str();
178 m_Controls->m_MeasurementToolStorageLabel->setText(toolLabel);
179
180 //update status widget
181 m_Controls->m_ToolStatusWidget->RemoveStatusLabels();
182 m_Controls->m_ToolStatusWidget->PreShowTools(m_MeasurementStorage);
183}
184
186{
187 //read in filename
188 static QString oldFile;
189 if (oldFile.isNull()) oldFile = "/";
190 QString filename = QFileDialog::getOpenFileName(nullptr, tr("Open Toolfile"), oldFile, tr("All Files (*.*)"));
191 if (filename.isNull()) return;
192 oldFile = filename;
193
194 m_ReferenceStorage = ReadStorage(filename.toStdString());
195
196 //update label
197 Poco::Path myPath = Poco::Path(filename.toStdString()); //use this to separate filename from path
198 QString toolLabel = QString("Tool Storage: ") + QString::number(m_ReferenceStorage->GetToolCount()) + " Tools from " + myPath.getFileName().c_str();
199 m_Controls->m_ReferenceToolStorageLabel->setText(toolLabel);
200}
201
203{
204 //check if everything is ready to start tracking
205 if (m_MeasurementStorage.IsNull())
206 {
207 MessageBox("Error: No measurement tools loaded yet!");
208 return;
209 }
210 else if (m_ReferenceStorage.IsNull() && m_Controls->m_UseReferenceTrackingSystem->isChecked())
211 {
212 MessageBox("Error: No reference tools loaded yet!");
213 return;
214 }
215 else if (m_MeasurementStorage->GetToolCount() == 0)
216 {
217 MessageBox("Error: No way to track without tools!");
218 return;
219 }
220 else if (m_Controls->m_UseReferenceTrackingSystem->isChecked() && (m_ReferenceStorage->GetToolCount() == 0))
221 {
222 MessageBox("Error: No way to track without tools!");
223 return;
224 }
225
226 //build the first IGT pipeline (MEASUREMENT)
227 mitk::TrackingDeviceSourceConfigurator::Pointer myTrackingDeviceSourceFactory1 = mitk::TrackingDeviceSourceConfigurator::New(this->m_MeasurementStorage, this->m_Controls->m_MeasurementTrackingDeviceConfigurationWidget->GetTrackingDevice());
228 m_MeasurementTrackingDeviceSource = myTrackingDeviceSourceFactory1->CreateTrackingDeviceSource(this->m_MeasurementToolVisualizationFilter);
230 {
231 MessageBox(myTrackingDeviceSourceFactory1->GetErrorMessage());
232 return;
233 }
234 //connect the tool visualization widget
235 for (unsigned int i = 0; i < m_MeasurementTrackingDeviceSource->GetNumberOfOutputs(); ++i)
236 {
237 m_Controls->m_ToolStatusWidget->AddNavigationData(m_MeasurementTrackingDeviceSource->GetOutput(i));
238 m_EvaluationFilter->SetInput(i, m_MeasurementTrackingDeviceSource->GetOutput(i));
239 }
240 m_Controls->m_ToolStatusWidget->ShowStatusLabels();
241 m_Controls->m_ToolStatusWidget->SetShowPositions(true);
242 m_Controls->m_ToolStatusWidget->SetShowQuaternions(true);
243
244 //build the second IGT pipeline (REFERENCE)
245 if (m_Controls->m_UseReferenceTrackingSystem->isChecked())
246 {
247 mitk::TrackingDeviceSourceConfigurator::Pointer myTrackingDeviceSourceFactory2 = mitk::TrackingDeviceSourceConfigurator::New(this->m_ReferenceStorage, this->m_Controls->m_ReferenceDeviceConfigurationWidget->GetTrackingDevice());
248 m_ReferenceTrackingDeviceSource = myTrackingDeviceSourceFactory2->CreateTrackingDeviceSource();
250 {
251 MessageBox(myTrackingDeviceSourceFactory2->GetErrorMessage());
252 return;
253 }
254 }
255
256 //initialize tracking
257 try
258 {
260 m_MeasurementTrackingDeviceSource->StartTracking();
261 if (m_Controls->m_UseReferenceTrackingSystem->isChecked())
262 {
264 m_ReferenceTrackingDeviceSource->StartTracking();
265 }
266 }
267 catch (...)
268 {
269 MessageBox("Error while starting the tracking device!");
270 return;
271 }
272
273 //set reference
274 if (m_Controls->m_UseReferenceTrackingSystem->isChecked()) OnSetReference();
275
276 //start timer
277 m_Timer->start(1000 / (m_Controls->m_SamplingRate->value()));
278
279 m_Controls->m_StartTracking->setEnabled(false);
280 m_Controls->m_StartTracking->setEnabled(true);
281
282 m_tracking = true;
283}
284
286{
287 if (this->m_logging) FinishMeasurement();
289 m_MeasurementTrackingDeviceSource->StopTracking();
290 if (m_Controls->m_UseReferenceTrackingSystem->isChecked())
291 {
293 m_ReferenceTrackingDeviceSource->StopTracking();
294 }
295 m_Timer->stop();
296 m_Controls->m_StartTracking->setEnabled(true);
297 m_Controls->m_StartTracking->setEnabled(false);
298 m_tracking = false;
299}
300
302{
303 m_FilenameVector = std::vector<std::string>();
304 m_FilenameVector.clear();
305 m_NextFile = 0;
306
307 //read in filename
308 QString filename = QFileDialog::getOpenFileName(nullptr, tr("Open Measurement Filename List"), "/", tr("All Files (*.*)"));
309 if (filename.isNull()) return;
310
311 //define own locale
312 std::locale C("C");
313 setlocale(LC_ALL, "C");
314
315 //read file
316 std::ifstream file;
317 file.open(filename.toStdString().c_str(), std::ios::in);
318 if (file.good())
319 {
320 //read out file
321 file.seekg(0L, std::ios::beg); // move to begin of file
322 while (!file.eof())
323 {
324 std::string buffer;
325 std::getline(file, buffer); // read out file line by line
326 if (buffer.size() > 0) m_FilenameVector.push_back(buffer);
327 }
328 }
329
330 //fill list at GUI
331 m_Controls->m_MeasurementList->clear();
332 for (unsigned int i = 0; i < m_FilenameVector.size(); i++) { new QListWidgetItem(tr(m_FilenameVector.at(i).c_str()), m_Controls->m_MeasurementList); }
333
334 //update label next measurement
335 std::stringstream label;
336 label << "Next Measurement: " << m_FilenameVector.at(0);
337 m_Controls->m_NextMeasurement->setText(label.str().c_str());
338
339 //reset results files
340 m_MeanPoints = mitk::PointSet::New();
341 m_RMSValues = std::vector<double>();
342 m_EvaluationFilter = mitk::NavigationDataEvaluationFilter::New();
344}
345
347{
348 if (m_EvaluationFilter.IsNotNull() && m_logging) m_EvaluationFilter->Update();
350
351 m_Controls->m_ToolStatusWidget->Refresh();
352
353 //update reference
354 if (m_Controls->m_UseReferenceTrackingSystem->isChecked())
355 {
357 QString Label = "Current Positions: ";
358 bool distanceThresholdExceeded = false;
359 for (unsigned int i = 0; i < m_ReferenceTrackingDeviceSource->GetNumberOfOutputs(); ++i)
360 {
361 mitk::Point3D position = m_ReferenceTrackingDeviceSource->GetOutput(i)->GetPosition();
362 Label = Label + "Tool" + QString::number(i) + ":[" + QString::number(position[0]) + ":" + QString::number(position[1]) + ":" + QString::number(position[1]) + "] ";
363 if (position.EuclideanDistanceTo(m_ReferenceStartPositions.at(i)) > m_Controls->m_ReferenceThreshold->value()) distanceThresholdExceeded = true;
364 }
365 m_Controls->m_ReferenceCurrentPos->setText(Label);
366 if (distanceThresholdExceeded)
367 {
368 m_Controls->m_ReferenceOK->setText("<html><body style=\" font-family:\'MS Shell Dlg 2\'; font-size:28pt; font-weight:400; font-style:normal;\">NOT OK!</body></html>");
369 m_referenceValid = false;
370 }
371 else
372 {
373 m_Controls->m_ReferenceOK->setText("<html><body style=\" font-family:\'MS Shell Dlg 2\'; font-size:28pt; font-weight:400; font-style:normal;\">OK</body></html>");
374 m_referenceValid = true;
375 }
376 }
377
378 //update logging
379 if (m_logging)
380 {
381 //check for missing objects
382 if (m_MeasurementLoggingFilterXML.IsNull() ||
384 )
385 {
386 return;
387 }
388
389 //log/measure
392
393 if (m_Controls->m_UseReferenceTrackingSystem->isChecked() &&
394 m_ReferenceLoggingFilterXML.IsNotNull() &&
395 m_ReferenceLoggingFilterCSV.IsNotNull())
396 {
399 }
402
403 //check if all frames are logged ... if yes finish the measurement
404 if (m_loggedFrames > m_Controls->m_SamplesPerMeasurement->value()) { FinishMeasurement(); }
405
406 //update logging label
407 QString loggingLabel = "Collected Samples: " + QString::number(m_loggedFrames);
408 m_Controls->m_CollectedSamples->setText(loggingLabel);
409 }
410}
411
413{
414 if (this->m_NextFile >= static_cast<int>(m_FilenameVector.size()))
415 {
416 MessageBox("Last Measurement reached!");
417 return;
418 }
419
420 m_loggedFrames = 0;
421 m_logging = true;
422
423 //check if directory exists, if not create one
424 Poco::File myPath(std::string(m_Controls->m_OutputPath->text().toUtf8()).c_str());
425 if (!myPath.exists()) myPath.createDirectory();
426
427 QString LogFileName = m_Controls->m_OutputPath->text() + QString(m_FilenameVector.at(m_NextFile).c_str()) + ".log";
428 mitk::LogBackend::Unregister();
429 mitk::LogBackend::SetLogFile(LogFileName.toStdString());
430 mitk::LogBackend::Register();
431
432 //initialize logging filters
433 m_MeasurementLoggingFilterXML = mitk::NavigationDataRecorderDeprecated::New();
435 m_MeasurementLoggingFilterCSV = mitk::NavigationDataRecorderDeprecated::New();
439 QString MeasurementFilenameXML = m_Controls->m_OutputPath->text() + QString(m_FilenameVector.at(m_NextFile).c_str()) + ".xml";
440 QString MeasurementFilenameCSV = m_Controls->m_OutputPath->text() + QString(m_FilenameVector.at(m_NextFile).c_str()) + ".csv";
441 m_MeasurementLoggingFilterXML->SetFileName(MeasurementFilenameXML.toStdString());
442 m_MeasurementLoggingFilterCSV->SetFileName(MeasurementFilenameCSV.toStdString());
443 m_MeasurementLoggingFilterXML->SetRecordCountLimit(m_Controls->m_SamplesPerMeasurement->value());
444 m_MeasurementLoggingFilterCSV->SetRecordCountLimit(m_Controls->m_SamplesPerMeasurement->value());
445
446 if (m_Controls->m_UseReferenceTrackingSystem->isChecked())
447 {
448 m_ReferenceLoggingFilterXML = mitk::NavigationDataRecorderDeprecated::New();
450 m_ReferenceLoggingFilterCSV = mitk::NavigationDataRecorderDeprecated::New();
454 QString ReferenceFilenameXML = m_Controls->m_OutputPath->text() + "Reference_" + QString(m_FilenameVector.at(m_NextFile).c_str()) + ".xml";
455 QString ReferenceFilenameCSV = m_Controls->m_OutputPath->text() + "Reference_" + QString(m_FilenameVector.at(m_NextFile).c_str()) + ".csv";
456 m_ReferenceLoggingFilterXML->SetFileName(ReferenceFilenameXML.toStdString());
457 m_ReferenceLoggingFilterCSV->SetFileName(ReferenceFilenameCSV.toStdString());
458 m_ReferenceLoggingFilterXML->SetRecordCountLimit(m_Controls->m_SamplesPerMeasurement->value());
459 m_ReferenceLoggingFilterCSV->SetRecordCountLimit(m_Controls->m_SamplesPerMeasurement->value());
460 }
461
462 //start additional csv logging
464
465 //connect filter
466 for (unsigned int i = 0; i < m_MeasurementToolVisualizationFilter->GetNumberOfOutputs(); ++i)
467 {
470 }
471 if (m_Controls->m_UseReferenceTrackingSystem->isChecked()) for (unsigned int i = 0; i < m_ReferenceTrackingDeviceSource->GetNumberOfOutputs(); ++i)
472 {
473 m_ReferenceLoggingFilterXML->AddNavigationData(m_ReferenceTrackingDeviceSource->GetOutput(i));
474 m_ReferenceLoggingFilterCSV->AddNavigationData(m_ReferenceTrackingDeviceSource->GetOutput(i));
475 }
476
477 //start filter
478 m_MeasurementLoggingFilterXML->StartRecording();
479 m_MeasurementLoggingFilterCSV->StartRecording();
480 if (m_Controls->m_UseReferenceTrackingSystem->isChecked())
481 {
482 m_ReferenceLoggingFilterXML->StartRecording();
483 m_ReferenceLoggingFilterCSV->StartRecording();
484 }
485
486 //disable all buttons
488
489 //update label next measurement
490 std::stringstream label;
491 if ((m_NextFile + 1) >= static_cast<int>(m_FilenameVector.size())) label << "Next Measurement: <none>";
492 else label << "Next Measurement: " << m_FilenameVector.at(m_NextFile + 1);
493 m_Controls->m_NextMeasurement->setText(label.str().c_str());
494
495 //update label last measurement
496 std::stringstream label2;
497 label2 << "Last Measurement: " << m_FilenameVector.at(m_NextFile);
498 m_Controls->m_LastMeasurement->setText(label2.str().c_str());
499
500 m_NextFile++;
501}
502
508
510{
511 QMessageBox msgBox;
512 msgBox.setText(s.c_str());
513 msgBox.exec();
514}
515
517{
518 m_Controls->m_LoadList->setEnabled(false);
519 m_Controls->m_StartNextMeasurement->setEnabled(false);
520 m_Controls->m_ReapeatLastMeasurement->setEnabled(false);
521 m_Controls->m_SamplingRate->setEnabled(false);
522 m_Controls->m_SamplesPerMeasurement->setEnabled(false);
523 m_Controls->m_ReferenceThreshold->setEnabled(false);
524}
525
527{
528 m_Controls->m_LoadList->setEnabled(true);
529 m_Controls->m_StartNextMeasurement->setEnabled(true);
530 m_Controls->m_ReapeatLastMeasurement->setEnabled(true);
531 m_Controls->m_SamplingRate->setEnabled(true);
532 m_Controls->m_SamplesPerMeasurement->setEnabled(true);
533 m_Controls->m_ReferenceThreshold->setEnabled(true);
534}
535
537{
538 m_logging = false;
539
540 m_MeasurementLoggingFilterXML->StopRecording();
541 m_MeasurementLoggingFilterCSV->StopRecording();
542 if (m_Controls->m_UseReferenceTrackingSystem->isChecked())
543 {
544 m_ReferenceLoggingFilterXML->StopRecording();
545 m_ReferenceLoggingFilterCSV->StopRecording();
546 }
548
549 int id = m_NextFile - 1;
550 mitk::Point3D positionMean = m_EvaluationFilter->GetPositionMean(0);
551 MITK_INFO << "Evaluated " << m_EvaluationFilter->GetNumberOfAnalysedNavigationData(0) << " samples.";
552 double rms = m_EvaluationFilter->GetPositionErrorRMS(0);
553 MITK_INFO << "RMS: " << rms;
554 MITK_INFO << "Position Mean: " << positionMean;
555 m_MeanPoints->SetPoint(id, positionMean);
556 if (static_cast<int>(m_RMSValues.size()) <= id) m_RMSValues.push_back(rms);
557 else m_RMSValues[id] = rms;
558
559 m_EvaluationFilter->ResetStatistic();
560
562}
563
565{
566 //write logfile header
567 QString header = "Nr;MITK_Time;Valid_Reference;";
568 QString tool = QString("MeasureTool_") + QString(m_MeasurementTrackingDeviceSource->GetOutput(0)->GetName());
569 header = header + tool + "[x];" + tool + "[y];" + tool + "[z];" + tool + "[qx];" + tool + "[qy];" + tool + "[qz];" + tool + "[qr]\n";
570
571 //open logfile and write header
572 m_logFileCSV.open(std::string(m_Controls->m_OutputPath->text().toUtf8()).append("/LogFileCombined").append(filePostfix.c_str()).append(".csv").c_str(), std::ios::out);
573 m_logFileCSV << header.toStdString().c_str();
574}
575
577{
578 mitk::Point3D pos = m_MeasurementTrackingDeviceSource->GetOutput(0)->GetPosition();
579 mitk::Quaternion rot = m_MeasurementTrackingDeviceSource->GetOutput(0)->GetOrientation();
580 std::string valid = "";
581 if (m_referenceValid) valid = "true";
582 else valid = "false";
583 std::stringstream timestamp;
584 timestamp << m_MeasurementTrackingDeviceSource->GetOutput(0)->GetTimeStamp();
585 QString dataSet = QString::number(m_loggedFrames) + ";" + QString(timestamp.str().c_str()) + ";" + QString(valid.c_str()) + ";" + QString::number(pos[0]) + ";" + QString::number(pos[1]) + ";" + QString::number(pos[2]) + ";" + QString::number(rot.x()) + ";" + QString::number(rot.y()) + ";" + QString::number(rot.z()) + ";" + QString::number(rot.r()) + "\n";
586 m_logFileCSV << dataSet.toStdString();
587}
588
593
595{
596 if (ev->type() == QEvent::KeyPress)
597 {
598 QKeyEvent *k = (QKeyEvent *)ev;
599 bool down = k->key() == 16777239;
600
601 if (down && m_tracking && !m_logging)
603 }
604
605 return false;
606}
Definition diagrams_c.h:5
mitk::NavigationDataRecorderDeprecated::Pointer m_MeasurementLoggingFilterCSV
mitk::NavigationDataRecorderDeprecated::Pointer m_ReferenceLoggingFilterXML
mitk::NavigationDataObjectVisualizationFilter::Pointer m_MeasurementToolVisualizationFilter
mitk::NavigationToolStorage::Pointer ReadStorage(std::string file)
Ui::QmitkIGTTrackingSemiAutomaticMeasurementViewControls * m_Controls
mitk::NavigationDataRecorderDeprecated::Pointer m_ReferenceLoggingFilterCSV
mitk::NavigationDataRecorderDeprecated::Pointer m_MeasurementLoggingFilterXML
static bool Evaluate5cmDistances(mitk::PointSet::Pointer p, HummelProtocolMeasurementVolume m, std::vector< HummelProtocolDistanceError > &Results)