15#include <berryISelectionService.h>
16#include <berryIWorkbenchWindow.h>
23#include <qfiledialog.h>
24#include <qstringlist.h>
32#include <mitkNodePredicateDataType.h>
36#include <itksys/SystemTools.hxx>
39#include <vnl/vnl_vector.h>
43#include <vtkSmartPointer.h>
44#include <vtkLandmarkTransform.h>
66 m_Controls =
new Ui::QmitkIGTTrackingDataEvaluationViewControls;
86 m_Controls->m_ReferencePointSetComboBox->SetDataStorage(this->GetDataStorage());
87 m_Controls->m_ReferencePointSetComboBox->SetAutoSelectNewItems(
true);
88 m_Controls->m_ReferencePointSetComboBox->SetPredicate(mitk::NodePredicateDataType::New(
"PointSet"));
89 m_Controls->m_MeasurementPointSetComboBox->SetDataStorage(this->GetDataStorage());
90 m_Controls->m_MeasurementPointSetComboBox->SetAutoSelectNewItems(
true);
91 m_Controls->m_MeasurementPointSetComboBox->SetPredicate(mitk::NodePredicateDataType::New(
"PointSet"));
104 itk::Vector<double> rotationVec;
106 rotationVec[0] =
m_Controls->m_rotVecX->value();
107 rotationVec[1] =
m_Controls->m_rotVecY->value();
108 rotationVec[2] =
m_Controls->m_rotVecZ->value();
110 std::vector<mitk::HummelProtocolEvaluation::HummelProtocolDistanceError> allOrientationErrors;
111 for (std::vector<mitk::HummelProtocolEvaluation::HummelProtocolDistanceError>::size_type i = 0; i < OrientationVector.size() - 1; ++i)
114 double AngularError = fabs(AngleBetweenTwoQuaternions - 11.25);
115 std::stringstream description;
116 description <<
"Rotation Error ROT" << (i + 1) <<
" / ROT" << (i + 2);
117 allOrientationErrors.push_back({ AngularError, description.str() });
118 MITK_INFO << description.str() <<
": " << AngularError;
122 std::vector<mitk::HummelProtocolEvaluation::HummelProtocolDistanceError> orientationErrorStatistics;
124 MITK_INFO <<
"## Rotation error statistics: ##";
125 for (
auto stat : orientationErrorStatistics) { MITK_INFO << stat.description <<
": " << stat.distanceError; }
128 allOrientationErrors.insert(allOrientationErrors.end(), orientationErrorStatistics.begin(), orientationErrorStatistics.end());
129 allOrientationErrors.push_back({rotationVec[0],
"Rot Vector [x]"});
130 allOrientationErrors.push_back({rotationVec[1],
"Rot Vector [y]"});
131 allOrientationErrors.push_back({rotationVec[2],
"Rot Vector [z]"});
132 std::stringstream filenameOrientationStat;
133 filenameOrientationStat << std::string(
m_Controls->m_OutputFilename->text().toUtf8()).c_str() <<
".orientationStatistics.csv";
134 MITK_INFO <<
"Writing output to file " << filenameOrientationStat.str();
135 writeToFile(filenameOrientationStat.str(), allOrientationErrors);
140 mitk::PointSet::Pointer reference =
dynamic_cast<mitk::PointSet*
>(
m_Controls->m_ReferencePointSetComboBox->GetSelectedNode()->GetData());
141 mitk::PointSet::Pointer measurement =
dynamic_cast<mitk::PointSet*
>(
m_Controls->m_MeasurementPointSetComboBox->GetSelectedNode()->GetData());
145 for (
int i = 0; i<reference->GetSize(); i++)
147 double point[3] = { reference->GetPoint(i)[0], reference->GetPoint(i)[1], reference->GetPoint(i)[2] };
148 sourcePoints->InsertNextPoint(point);
149 double point_targets[3] = { measurement->GetPoint(i)[0], measurement->GetPoint(i)[1], measurement->GetPoint(i)[2] };
150 targetPoints->InsertNextPoint(point_targets);
154 transform->SetSourceLandmarks(sourcePoints);
155 transform->SetTargetLandmarks(targetPoints);
156 transform->SetModeToRigidBody();
157 transform->Modified();
161 MITK_INFO <<
"FRE after grid matching: " + QString::number(FRE) +
" mm";
163 itk::Matrix<float, 3, 3> rotationFloat = itk::Matrix<float, 3, 3>();
164 itk::Vector<float, 3> translationFloat = itk::Vector<float, 3>();
165 itk::Matrix<double, 3, 3> rotationDouble = itk::Matrix<double, 3, 3>();
166 itk::Vector<double, 3> translationDouble = itk::Vector<double, 3>();
169 for (
int k = 0; k<3; k++)
for (
int l = 0; l<3; l++)
171 rotationFloat[k][l] = m->GetElement(k, l);
172 rotationDouble[k][l] = m->GetElement(k, l);
175 for (
int k = 0; k<3; k++)
177 translationFloat[k] = m->GetElement(k, 3);
178 translationDouble[k] = m->GetElement(k, 3);
181 mitk::AffineTransform3D::Pointer mitkTransform = mitk::AffineTransform3D::New();
182 mitkTransform->SetMatrix(rotationDouble);
183 mitkTransform->SetOffset(translationDouble);
184 mitk::NavigationData::Pointer transformNavigationData = mitk::NavigationData::New(mitkTransform);
185 m_Controls->m_ReferencePointSetComboBox->GetSelectedNode()->GetData()->GetGeometry()->SetIndexToWorldTransform(mitkTransform);
186 m_Controls->m_ReferencePointSetComboBox->GetSelectedNode()->GetData()->GetGeometry()->Modified();
190 std::stringstream filename;
191 filename << std::string(
m_Controls->m_OutputFilename->text().toUtf8()).c_str() <<
".GridMatchingResult.csv";
192 MITK_INFO <<
"Writing output to file " << filename.str();
193 std::vector<mitk::HummelProtocolEvaluation::HummelProtocolDistanceError> FRE_Error;
194 FRE_Error.push_back({ FRE,
"FRE after grid matching [mm]" });
202 MessageBox(
"Need exactly three points as reference, aborting!");
217 mitk::NavigationDataEvaluationFilter::Pointer myEvaluationFilter = mitk::NavigationDataEvaluationFilter::New();
220 for (
unsigned int j = 0; j < myPlayer->GetNumberOfOutputs(); ++j)
221 myEvaluationFilter->SetInput(j, myPlayer->GetOutput(j));
224 for (
int j = 0; j <
m_Controls->m_NumberOfSamples->value(); ++j)
225 myEvaluationFilter->Update();
231 m_RefPoint1 = myEvaluationFilter->GetPositionMean(0);
234 m_RefPoint2 = myEvaluationFilter->GetPositionMean(0);
237 m_RefPoint3 = myEvaluationFilter->GetPositionMean(0);
255 QString outputname = QString(
m_FilenameVector.at(i).c_str()) +
"_orientationFile.csv";
264 m_CurrentWriteFile <<
"Nr;Calypso_Time;Valid_Reference;MeasureTool_Measurement-Tool[x];MeasureTool_Measurement-Tool[y];MeasureTool_Measurement-Tool[z];MeasureTool_Measurement-Tool[qx];MeasureTool_Measurement-Tool[qy];MeasureTool_Measurement-Tool[qz];MeasureTool_Measurement-Tool[qr]\n";
268 mitk::Point3D point1, point2, point3;
269 mitk::Quaternion current_orientation;
271 for (
int j = 0; !myPlayer->IsAtEnd(); j++)
274 mitk::NavigationData::Pointer currentNavData = myPlayer->GetOutput(0);
279 point1 = currentNavData->GetPosition();
283 point2 = currentNavData->GetPosition();
287 point3 = currentNavData->GetPosition();
290 if (point1[0] == 0 &&
299 ) current_orientation.fill(0);
304 double sourcepoint1[3] = { point1[0], point1[1], point1[2] };
305 double sourcepoint2[3] = { point2[0], point2[1], point2[2] };
306 double sourcepoint3[3] = { point3[0], point3[1], point3[2] };
307 sourcePoints->InsertNextPoint(sourcepoint1);
308 sourcePoints->InsertNextPoint(sourcepoint2);
309 sourcePoints->InsertNextPoint(sourcepoint3);
314 targetPoints->InsertNextPoint(targetpoint1);
315 targetPoints->InsertNextPoint(targetpoint2);
316 targetPoints->InsertNextPoint(targetpoint3);
318 transform->SetSourceLandmarks(sourcePoints);
319 transform->SetTargetLandmarks(targetPoints);
320 transform->Modified();
323 mitk::Transform::Pointer newTransform = mitk::Transform::New();
324 newTransform->SetMatrix(transform->GetMatrix());
325 current_orientation = newTransform->GetOrientation();
328 if ((j > 15) && (j < 18))
330 mitk::DataNode::Pointer newNode = mitk::DataNode::New();
331 mitk::PointSet::Pointer newPointSet = mitk::PointSet::New();
332 newPointSet->InsertPoint(0, point1);
333 newPointSet->InsertPoint(1, point2);
334 newPointSet->InsertPoint(2, point3);
336 newNode->SetName(name.toStdString().c_str());
337 newNode->SetData(newPointSet);
338 newNode->SetFloatProperty(
"pointsize", 0.1);
339 this->GetDataStorage()->Add(newNode);
366 QStringList files = QFileDialog::getOpenFileNames(
nullptr,
"Select one or more files to open",
"/",
"CSV (*.csv)");
367 if (files.isEmpty())
return;
369 for (
int i = 0; i < files.size(); i++)
371 std::string tmp = files.at(i).toStdString().c_str();
389 std::vector<mitk::HummelProtocolEvaluation::HummelProtocolDistanceError> results5cm, results15cm, results30cm, resultsAccum;
391 if (
m_Controls->m_standardVolume->isChecked())
399 else if (
m_Controls->m_smallVolume->isChecked())
404 else if (
m_Controls->m_mediumVolume->isChecked())
412 std::stringstream filename5cm;
413 filename5cm << std::string(
m_Controls->m_OutputFilename->text().toUtf8()).c_str() <<
".results5cm.csv";
414 MITK_INFO <<
"Writing output to file " << filename5cm.str();
417 std::stringstream filename15cm;
418 filename15cm << std::string(
m_Controls->m_OutputFilename->text().toUtf8()).c_str() <<
".results15cm.csv";
419 MITK_INFO <<
"Writing output to file " << filename15cm.str();
422 std::stringstream filename30cm;
423 filename30cm << std::string(
m_Controls->m_OutputFilename->text().toUtf8()).c_str() <<
".results30cm.csv";
424 MITK_INFO <<
"Writing output to file " << filename30cm.str();
427 std::stringstream filenameAccum;
428 filenameAccum << std::string(
m_Controls->m_OutputFilename->text().toUtf8()).c_str() <<
".resultsAccumDist.csv";
429 MITK_INFO <<
"Writing output to file " << filenameAccum.str();
443 std::vector<mitk::HummelProtocolEvaluation::HummelProtocolDistanceError> jitterValues;
457 mitk::NavigationDataEvaluationFilter::Pointer myEvaluationFilter = mitk::NavigationDataEvaluationFilter::New();
460 for (
unsigned int j = 0; j < myPlayer->GetNumberOfOutputs(); ++i) { myEvaluationFilter->SetInput(j, myPlayer->GetOutput(j)); }
462 if (myPlayer->GetNumberOfSnapshots() <
m_Controls->m_NumberOfSamples->value())
464 MITK_WARN <<
"Number of snapshots (" << myPlayer->GetNumberOfSnapshots() <<
") smaller than number of samples to evaluate (" <<
m_Controls->m_NumberOfSamples->value() <<
") ! Cannot proceed!";
469 for (
int j = 0; j <
m_Controls->m_NumberOfSamples->value(); j++)
470 myEvaluationFilter->Update();
473 jitterValues.push_back({ myEvaluationFilter->GetPositionErrorRMS(0),
"RMS" });
484 MITK_INFO <<
"## Jitter (RMS) statistics: ##";
485 for (
auto jitterStat : jitterStatistics) {MITK_INFO << jitterStat.description <<
": " << jitterStat.distanceError;}
488 std::stringstream filenameJitterStat;
489 filenameJitterStat << std::string(
m_Controls->m_OutputFilename->text().toUtf8()).c_str() <<
".resultsJitterStatistics.csv";
490 MITK_INFO <<
"Writing output to file " << filenameJitterStat.str();
491 writeToFile(filenameJitterStat.str(), jitterStatistics);
507 mitk::PointSet::Pointer thisPointSet = mitk::PointSet::New();
515 for (
int j = 0; j <
m_Controls->m_NumberOfSamples->value(); j++)
518 mitk::Point3D thisPoint = myPlayer->GetOutput()->GetPosition();
522 thisPointSet->InsertPoint(j, thisPoint);
526 mitk::DataNode::Pointer newNode = mitk::DataNode::New();
527 QString name = this->
m_Controls->m_prefix->text() + QString(
"PointSet_of_All_Positions_") + QString::number(i);
528 newNode->SetName(name.toStdString());
529 newNode->SetData(thisPointSet);
530 this->GetDataStorage()->Add(newNode);
538 mitk::PointSet::Pointer generatedPointSet = mitk::PointSet::New();
549 mitk::NavigationDataEvaluationFilter::Pointer myEvaluationFilter = mitk::NavigationDataEvaluationFilter::New();
552 for (
unsigned int j = 0; j < myPlayer->GetNumberOfOutputs(); ++j) { myEvaluationFilter->SetInput(j, myPlayer->GetOutput(j)); }
555 for (
int j = 0; j <
m_Controls->m_NumberOfSamples->value(); ++j) { myEvaluationFilter->Update(); }
558 mitk::Point3D meanPos = myEvaluationFilter->GetPositionMean(0);
565 generatedPointSet->InsertPoint(i, meanPos);
569 mitk::DataNode::Pointer newNode = mitk::DataNode::New();
570 QString name = this->
m_Controls->m_prefix->text() +
"PointSet_of_Mean_Positions";
571 newNode->SetName(name.toStdString());
572 newNode->SetData(generatedPointSet);
573 newNode->SetFloatProperty(
"pointsize", 5);
574 this->GetDataStorage()->Add(newNode);
591 mitk::NavigationDataEvaluationFilter::Pointer myEvaluationFilter = mitk::NavigationDataEvaluationFilter::New();
594 for (
unsigned int j = 0; j < myPlayer->GetNumberOfOutputs(); ++j) { myEvaluationFilter->SetInput(j, myPlayer->GetOutput(j)); }
597 for (
int j = 0; j <
m_Controls->m_NumberOfSamples->value(); ++j)
598 myEvaluationFilter->Update();
601 mitk::Point3D meanPos = myEvaluationFilter->GetPositionMean(0);
608 mitk::Point3D secondPoint;
609 mitk::Point3D thirdPoint;
610 mitk::Point3D fourthPoint;
612 mitk::FillVector3D(secondPoint, 2, 0, 0);
613 vnl_vector<mitk::ScalarType> secondPointTransformed = myEvaluationFilter->GetQuaternionMean(0).rotation_matrix_transpose().transpose() * secondPoint.GetVnlVector() + meanPos.GetVnlVector();
614 mitk::Point3D secondPointTransformedMITK;
615 mitk::FillVector3D(secondPointTransformedMITK, secondPointTransformed[0], secondPointTransformed[1], secondPointTransformed[2]);
617 mitk::FillVector3D(thirdPoint, 0, 4, 0);
618 vnl_vector<mitk::ScalarType> thirdPointTransformed = myEvaluationFilter->GetQuaternionMean(0).rotation_matrix_transpose().transpose() * thirdPoint.GetVnlVector() + meanPos.GetVnlVector();
619 mitk::Point3D thirdPointTransformedMITK;
620 mitk::FillVector3D(thirdPointTransformedMITK, thirdPointTransformed[0], thirdPointTransformed[1], thirdPointTransformed[2]);
622 mitk::FillVector3D(fourthPoint, 0, 0, 6);
623 vnl_vector<mitk::ScalarType> fourthPointTransformed = myEvaluationFilter->GetQuaternionMean(0).rotation_matrix_transpose().transpose() * fourthPoint.GetVnlVector() + meanPos.GetVnlVector();
624 mitk::Point3D fourthPointTransformedMITK;
625 mitk::FillVector3D(fourthPointTransformedMITK, fourthPointTransformed[0], fourthPointTransformed[1], fourthPointTransformed[2]);
627 mitk::PointSet::Pointer rotationLine = mitk::PointSet::New();
628 rotationLine->InsertPoint(0, secondPointTransformedMITK);
629 rotationLine->InsertPoint(1, meanPos);
630 rotationLine->InsertPoint(2, thirdPointTransformedMITK);
631 rotationLine->InsertPoint(3, meanPos);
632 rotationLine->InsertPoint(4, fourthPointTransformedMITK);
634 mitk::DataNode::Pointer newNode = mitk::DataNode::New();
635 QString nodeName = this->
m_Controls->m_prefix->text() +
"RotationLineNumber" + QString::number(i);
636 newNode->SetName(nodeName.toStdString());
637 newNode->SetData(rotationLine);
638 newNode->SetBoolProperty(
"show contour",
true);
639 newNode->SetFloatProperty(
"pointsize", 0.5);
640 this->GetDataStorage()->Add(newNode);
646 mitk::PointSet::Pointer generatedPointSet = mitk::PointSet::New();
647 int currentPointID = 0;
648 mitk::Point3D currentPoint;
649 mitk::FillVector3D(currentPoint, 0, 0, 0);
650 for (
int i = 0; i <
m_Controls->m_PointNumber2->value(); i++)
652 for (
int j = 0; j <
m_Controls->m_PointNumber1->value(); j++)
654 generatedPointSet->InsertPoint(currentPointID, currentPoint);
656 currentPoint[1] +=
m_Controls->m_PointDistance->value();
659 currentPoint[2] +=
m_Controls->m_PointDistance->value();
661 mitk::DataNode::Pointer newNode = mitk::DataNode::New();
662 QString nodeName =
"GroundTruthPointSet_" + QString::number(
m_Controls->m_PointNumber1->value()) +
"x" + QString::number(
m_Controls->m_PointNumber2->value()) +
"_(" + QString::number(
m_Controls->m_PointDistance->value()) +
"mm)";
663 newNode->SetName(nodeName.toStdString());
664 newNode->SetData(generatedPointSet);
665 newNode->SetFloatProperty(
"pointsize", 5);
666 this->GetDataStorage()->Add(newNode);
671 if (
m_Controls->m_ConvertSingleFile->isChecked())
673 int lines =
ConvertOneFile(this->
m_Controls->m_InputCSV->text().toStdString(), this->m_Controls->m_OutputXML->text().toStdString());
675 QString result =
"Converted one file with" + QString::number(lines) +
" data sets";
687 MessageBox(
"Error: lists do not have the same number of files!");
702 mitk::NavigationDataRecorderDeprecated::Pointer myRecorder = mitk::NavigationDataRecorderDeprecated::New();
703 myRecorder->SetFileName(outputFilename.c_str());
704 mitk::NavigationData::Pointer input = mitk::NavigationData::New();
706 myRecorder->AddNavigationData(input);
707 myRecorder->StartRecording();
708 for (std::size_t i = 0; i < myNavigationDatas.size(); ++i)
710 input->Graft(myNavigationDatas.at(i));
711 myRecorder->Update();
713 myRecorder->StopRecording();
714 return myNavigationDatas.size();
720 QString filename = QFileDialog::getOpenFileName(
nullptr, tr(
"Open Measurement Filename List"),
"/", tr(
"All Files (*.*)"));
721 if (filename.isNull())
return;
725 m_Controls->m_labelCSVtoXMLInputList->setText(
"READY");
731 QString filename = QFileDialog::getOpenFileName(
nullptr, tr(
"Open Measurement Filename List"),
"/", tr(
"All Files (*.*)"));
732 if (filename.isNull())
return;
736 m_Controls->m_labelCSVtoXMLOutputList->setText(
"READY");
742 msgBox.setText(s.c_str());
753 if (
m_Controls->m_settingPosMean->isChecked())
760 if (
m_Controls->m_settingPosStabw->isChecked())
767 if (
m_Controls->m_settingPosSampleStabw->isChecked())
774 if (
m_Controls->m_settingQuaternionMean->isChecked())
782 if (
m_Controls->m_settionQuaternionStabw->isChecked())
800 if (
m_Controls->m_settingPosErrorMinMax->isChecked())
806 if (
m_Controls->m_settingEulerMean->isChecked())
813 if (
m_Controls->m_settingEulerRMS->isChecked())
824 if (myEvaluationFilter->GetNumberOfOutputs() == 0)
m_CurrentWriteFile <<
"Error: no input \n";
828 m_CurrentWriteFile << myEvaluationFilter->GetNumberOfAnalysedNavigationData(0) <<
";";
832 if (
m_Controls->m_settingPosMean->isChecked())
839 if (
m_Controls->m_settingPosStabw->isChecked())
846 if (
m_Controls->m_settingPosSampleStabw->isChecked())
848 m_CurrentWriteFile << myEvaluationFilter->GetPositionSampleStandardDeviation(0)[0] <<
";";
849 m_CurrentWriteFile << myEvaluationFilter->GetPositionSampleStandardDeviation(0)[1] <<
";";
850 m_CurrentWriteFile << myEvaluationFilter->GetPositionSampleStandardDeviation(0)[2] <<
";";
853 if (
m_Controls->m_settingQuaternionMean->isChecked())
861 if (
m_Controls->m_settionQuaternionStabw->isChecked())
863 m_CurrentWriteFile << myEvaluationFilter->GetQuaternionStandardDeviation(0).x() <<
";";
864 m_CurrentWriteFile << myEvaluationFilter->GetQuaternionStandardDeviation(0).y() <<
";";
865 m_CurrentWriteFile << myEvaluationFilter->GetQuaternionStandardDeviation(0).z() <<
";";
866 m_CurrentWriteFile << myEvaluationFilter->GetQuaternionStandardDeviation(0).r() <<
";";
870 if (
m_Controls->m_settingPosErrorStabw->isChecked())
m_CurrentWriteFile << myEvaluationFilter->GetPositionErrorStandardDeviation(0) <<
";";
871 if (
m_Controls->m_settingPosErrorSampleStabw->isChecked())
m_CurrentWriteFile << myEvaluationFilter->GetPositionErrorSampleStandardDeviation(0) <<
";";
874 if (
m_Controls->m_settingPosErrorMinMax->isChecked())
880 if (
m_Controls->m_settingEulerMean->isChecked())
887 if (
m_Controls->m_settingEulerRMS->isChecked())
900 std::vector<mitk::Quaternion> returnValue;
902 for (
auto dataSet : allData)
905 else returnValue.push_back(dataSet->GetQuaternionMean(0));
914 std::vector<mitk::NavigationDataEvaluationFilter::Pointer> EvaluationDataCollection;
925 mitk::NavigationDataEvaluationFilter::Pointer myEvaluationFilter = mitk::NavigationDataEvaluationFilter::New();
928 for (
unsigned int j = 0; j < myPlayer->GetNumberOfOutputs(); ++j)
929 myEvaluationFilter->SetInput(j, myPlayer->GetOutput(j));
932 for (
int j = 0; j <
m_Controls->m_NumberOfSamples->value(); ++j)
933 myEvaluationFilter->Update();
935 myEvaluationFilter->SetInput(
nullptr);
937 EvaluationDataCollection.push_back(myEvaluationFilter);
940 return EvaluationDataCollection;
946 std::vector<mitk::NavigationDataEvaluationFilter::Pointer> EvaluationDataCollection =
GetAllDataFromUIList();
953 MessageBox(
"Error: Can't open output file for angle differences calculation!");
959 QString
pos1 =
"invalid";
960 QString
pos2 =
"invalid";
964 pos1 = QString::fromStdString(itksys::SystemTools::GetFilenameWithoutLastExtension(
m_FilenameVector.at(i)));
967 pos2 = QString::fromStdString(itksys::SystemTools::GetFilenameWithoutLastExtension(
m_FilenameVector.at(j)));
972 if (
m_Controls->m_DifferencesSLERP->isChecked())
981 q1 = EvaluationDataCollection.at(i)->GetQuaternionMean(0);
982 q2 = EvaluationDataCollection.at(j)->GetQuaternionMean(0);
985 itk::Vector<double> rotationVec;
987 rotationVec[0] = 10000;
1009 MITK_INFO <<
"Angle: " << angle;
1014 std::vector<mitk::NavigationData::Pointer> returnValue = std::vector<mitk::NavigationData::Pointer>();
1016 for (std::size_t i = 1; i < fileContentLineByLine.size(); ++i)
1026 std::vector<std::string> readData = std::vector<std::string>();
1030 oldLocale = setlocale(LC_ALL,
nullptr);
1034 setlocale(LC_ALL,
"C");
1038 file.open(filename.c_str(), std::ios::in);
1042 file.seekg(0L, std::ios::beg);
1046 std::getline(file, buffer);
1047 if (buffer.size() > 0) readData.push_back(buffer);
1054 setlocale(LC_ALL, oldLocale);
1061 mitk::NavigationData::Pointer returnValue = mitk::NavigationData::New();
1063 QString myLine = QString(line.c_str());
1065 QStringList myLineList = myLine.split(
';');
1067 mitk::Point3D position;
1068 mitk::Quaternion orientation;
1071 if (myLineList.at(2).toStdString() ==
"1") valid =
true;
1073 position[0] = myLineList.at(3).toDouble();
1074 position[1] = myLineList.at(4).toDouble();
1075 position[2] = myLineList.at(5).toDouble();
1077 orientation[0] = myLineList.at(6).toDouble();
1078 orientation[1] = myLineList.at(7).toDouble();
1079 orientation[2] = myLineList.at(8).toDouble();
1080 orientation[3] = myLineList.at(9).toDouble();
1082 returnValue->SetDataValid(valid);
1083 returnValue->SetPosition(position);
1084 returnValue->SetOrientation(orientation);
1091 mitk::Quaternion average;
1094 std::vector<mitk::Quaternion> quaternions = std::vector<mitk::Quaternion>();
1095 for (
int i = 0; i < evaluationFilter->GetNumberOfAnalysedNavigationData(0); i++)
1097 mitk::Quaternion currentq = evaluationFilter->GetLoggedOrientation(i, 0);
1099 quaternions.push_back(currentq);
1103 mitk::QuaternionAveraging::Pointer myAverager = mitk::QuaternionAveraging::New();
1104 average = myAverager->CalcAverage(quaternions);
1111 std::fstream currentFile;
1112 currentFile.open(filename.c_str(), std::ios::out);
1113 if (currentFile.bad()) { MITK_WARN <<
"Cannot open file, aborting!";
return; }
1114 currentFile <<
"Description" <<
";" <<
"Error[mm]" <<
"\n";
1115 for (
auto currentError : values)
1117 currentFile << currentError.description <<
";" << currentError.distanceError <<
"\n";
1119 currentFile.close();
1124 bool rightHanded =
m_Controls->m_RigthHanded->isChecked();
1125 QString separator =
m_Controls->m_SeparatorSign->text();
1126 QChar sepaSign = separator.at(0);
1128 char separatorSign = sepaSign.toLatin1();
1130 int sampleCount =
m_Controls->m_SampleCount->value();
1131 bool headerRow =
m_Controls->m_HeaderRow->isChecked();
1135 bool useQuats =
m_Controls->m_UseQuats->isChecked();
1140 int azimuth =
m_Controls->m_Azimuth->value();
1141 int elevation =
m_Controls->m_Elevation->value();
1143 bool eulersInRad =
m_Controls->m_Radiants->isChecked();
1145 int allInts[] = {xPos, yPos, zPos, qx, qy, qr, azimuth, elevation, roll};
1146 int minNumberOfColumns = (*std::max_element(allInts, allInts+9)+1);
1148 mitk::NavigationDataCSVSequentialPlayer::Pointer navDataPlayer = mitk::NavigationDataCSVSequentialPlayer::New();
1149 navDataPlayer->SetOptions(rightHanded, separatorSign, sampleCount, headerRow, xPos, yPos, zPos, useQuats,
1150 qx, qy, qz, qr, azimuth, elevation, roll, eulersInRad, minNumberOfColumns);
1151 return navDataPlayer;
std::fstream m_CurrentAngleDifferencesWriteFile
void OnCSVtoXMLLoadInputList()
void OnConvertCSVtoXMLFile()
std::vector< std::string > m_CSVtoXMLInputFilenameVector
void OnGenerateGroundTruthPointSet()
std::vector< std::string > m_FilenameVector
mitk::Point3D m_RefPoint1
int ConvertOneFile(std::string inputFilename, std::string outputFilename)
void WriteDataSet(mitk::NavigationDataEvaluationFilter::Pointer evaluationFilter, std::string dataSetName)
void OnAddToCurrentList()
~QmitkIGTTrackingDataEvaluationView() override
Ui::QmitkIGTTrackingDataEvaluationViewControls * m_Controls
void CreateQtPartControl(QWidget *parent) override
void WriteDifferenceAnglesHeader()
mitk::NavigationData::Pointer GetNavigationDataOutOfOneLine(std::string line)
std::vector< std::string > m_CSVtoXMLOutputFilenameVector
void OnGenerateRotationLines()
mitk::Point3D m_RefPoint3
std::fstream m_CurrentWriteFile
void WriteDifferenceAnglesDataSet(std::string pos1, std::string pos2, int idx1, int idx2, double angle)
void OnOrientationCalculation_CalcOrientandWriteToFile()
mitk::PointSet::Pointer m_PointSetMeanPositions
Stores the mean positions of all evaluated data.
void CalculateDifferenceAngles()
void OnCSVtoXMLLoadOutputList()
std::vector< mitk::NavigationDataEvaluationFilter::Pointer > GetAllDataFromUIList()
mitk::Point3D m_RefPoint2
void OnPerfomGridMatching()
QmitkIGTTrackingDataEvaluationView()
void OnGeneratePointSetsOfSinglePositions()
mitk::Quaternion GetSLERPAverage(mitk::NavigationDataEvaluationFilter::Pointer)
calculates the slerp average of a set of quaternions which is stored in the navigation data evaluatio...
mitk::NavigationDataCSVSequentialPlayer::Pointer ConstructNewNavigationDataPlayer()
static const std::string VIEW_ID
void writeToFile(std::string filename, std::vector< mitk::HummelProtocolEvaluation::HummelProtocolDistanceError > values)
std::vector< mitk::Quaternion > GetMeanOrientationsOfAllData(std::vector< mitk::NavigationDataEvaluationFilter::Pointer > allData, bool useSLERP=false)
std::vector< std::string > GetFileContentLineByLine(std::string filename)
std::vector< mitk::NavigationData::Pointer > GetNavigationDatasFromFile(std::string filename)
void OnOrientationCalculation_CalcRef()
void OnGeneratePointSet()
void MessageBox(std::string s)
static bool Evaluate15cmDistances(mitk::PointSet::Pointer p, HummelProtocolMeasurementVolume m, std::vector< HummelProtocolDistanceError > &Results)
static bool Evaluate30cmDistances(mitk::PointSet::Pointer p, HummelProtocolMeasurementVolume m, std::vector< HummelProtocolDistanceError > &Results)
HummelProtocolMeasurementVolume
static bool Evaluate5cmDistances(mitk::PointSet::Pointer p, HummelProtocolMeasurementVolume m, std::vector< HummelProtocolDistanceError > &Results)
static std::vector< HummelProtocolDistanceError > ComputeStatistics(std::vector< HummelProtocolDistanceError > values)
static bool EvaluateAccumulatedDistances(mitk::PointSet::Pointer p, HummelProtocolMeasurementVolume m, std::vector< HummelProtocolDistanceError > &Results)
MITKIGTBASE_EXPORT double GetAngleBetweenTwoQuaterions(mitk::Quaternion a, mitk::Quaternion b, itk::Vector< double, 3 > rotationVector)
MITKIGTBASE_EXPORT double ComputeFRE(mitk::PointSet::Pointer imageFiducials, mitk::PointSet::Pointer realWorldFiducials, vtkSmartPointer< vtkLandmarkTransform > transform=nullptr)
Computes the fiducial registration error out of two sets of fiducials. The two sets must have the sam...