diff --git a/Modules/FiberDissection/Interactor/mitkStreamlineInteractor.cpp b/Modules/FiberDissection/Interactor/mitkStreamlineInteractor.cpp index bcf7c4a..1b135b6 100644 --- a/Modules/FiberDissection/Interactor/mitkStreamlineInteractor.cpp +++ b/Modules/FiberDissection/Interactor/mitkStreamlineInteractor.cpp @@ -1,322 +1,314 @@ /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ #include "mitkStreamlineInteractor.h" //#include "mitkStreamlineMapper2D.h" // MITK includes #include <mitkInteractionConst.h> #include <mitkInteractionPositionEvent.h> #include <mitkInternalEvent.h> #include <mitkLookupTableProperty.h> #include <mitkOperationEvent.h> #include <mitkRotationOperation.h> #include <mitkScaleOperation.h> #include <mitkSurface.h> #include <mitkUndoController.h> #include <mitkVtkMapper.h> // VTK includes #include <vtkCamera.h> #include <vtkInteractorObserver.h> #include <vtkInteractorStyle.h> #include <vtkMath.h> #include <vtkPointData.h> #include <vtkPolyData.h> #include <vtkRenderWindowInteractor.h> #include <vtkVector.h> #include <vtkPolyLine.h> #include <vtkVectorOperators.h> mitk::StreamlineInteractor::StreamlineInteractor() { m_ColorForHighlight[0] = 1.0; m_ColorForHighlight[1] = 0.5; m_ColorForHighlight[2] = 0.0; m_ColorForHighlight[3] = 1.0; // TODO if we want to get this configurable, the this is the recipe: // - make the 2D mapper add corresponding properties to control "enabled" and "color" // - make the interactor evaluate those properties // - in an ideal world, modify the state machine on the fly and skip mouse move handling } mitk::StreamlineInteractor::~StreamlineInteractor() { } void mitk::StreamlineInteractor::ConnectActionsAndFunctions() { // CONNECT_CONDITION("isoverstreamline", HasPickedHandle); CONNECT_FUNCTION("addnegstreamline", AddStreamlineNegBundle); CONNECT_FUNCTION("addposstreamline", AddStreamlinePosBundle); // CONNECT_FUNCTION("FeedUndoStack", FeedUndoStack); } void mitk::StreamlineInteractor::SetNegativeNode(DataNode *node) { DataInteractor::SetDataNode(node); m_NegStreamline= dynamic_cast<mitk::FiberBundle *>(node->GetData()); MITK_INFO << "Negative Node added"; } void mitk::StreamlineInteractor::SetToLabelNode(DataNode *node) { DataInteractor::SetDataNode(node); m_manStreamline = dynamic_cast<mitk::FiberBundle *>(node->GetData()); MITK_INFO << "Label node added"; } void mitk::StreamlineInteractor::SetPositiveNode(DataNode *node) { DataInteractor::SetDataNode(node); m_PosStreamline= dynamic_cast<mitk::FiberBundle *>(node->GetData()); MITK_INFO << "Positive Node added"; } void mitk::StreamlineInteractor::AddStreamlinePosBundle(StateMachineAction *, InteractionEvent *interactionEvent) { MITK_INFO << "PositiveBundle clicked"; auto positionEvent = dynamic_cast<const InteractionPositionEvent *>(interactionEvent); if (positionEvent == nullptr) { MITK_INFO << "no position"; } if (interactionEvent->GetSender()->GetMapperID() == BaseRenderer::Standard2D) { // m_PickedHandle = PickFrom2D(positionEvent); MITK_INFO << "2D"; } else { BaseRenderer *renderer = positionEvent->GetSender(); auto &picker = m_Picker[renderer]; // if (picker == nullptr) // { picker = vtkSmartPointer<vtkCellPicker>::New(); picker->SetTolerance(0.01); auto mapper = GetDataNode()->GetMapper(BaseRenderer::Standard3D); auto vtk_mapper = dynamic_cast<VtkMapper *>(mapper); if (vtk_mapper) { // doing this each time is bizarre picker->AddPickList(vtk_mapper->GetVtkProp(renderer)); picker->PickFromListOn(); } // } auto displayPosition = positionEvent->GetPointerPositionOnScreen(); picker->Pick(displayPosition[0], displayPosition[1], 0, positionEvent->GetSender()->GetVtkRenderer()); vtkIdType pickedCellID = picker->GetCellId(); if (picker->GetCellId()==-1) { MITK_INFO << "Nothing picked"; } else { vtkSmartPointer<vtkPolyData> vNewPolyData = vtkSmartPointer<vtkPolyData>::New(); vtkSmartPointer<vtkCellArray> vNewLines = vtkSmartPointer<vtkCellArray>::New(); vtkSmartPointer<vtkPoints> vNewPoints = vtkSmartPointer<vtkPoints>::New(); unsigned int counter = 0; for ( int i=0; i<m_PosStreamline->GetFiberPolyData()->GetNumberOfCells(); i++) { + vtkCell* cell = m_PosStreamline->GetFiberPolyData()->GetCell(i); auto numPoints = cell->GetNumberOfPoints(); vtkPoints* points = cell->GetPoints(); vtkSmartPointer<vtkPolyLine> container = vtkSmartPointer<vtkPolyLine>::New(); for (unsigned int j=0; j<numPoints; j++) { double p[3]; points->GetPoint(j, p); vtkIdType id = vNewPoints->InsertNextPoint(p); container->GetPointIds()->InsertNextId(id); } // weights->InsertValue(counter, fib->GetFiberWeight(i)); vNewLines->InsertNextCell(container); counter++; } vtkCell* cell = m_manStreamline->GetFiberPolyData()->GetCell(pickedCellID); auto numPoints = cell->GetNumberOfPoints(); vtkPoints* points = cell->GetPoints(); vtkSmartPointer<vtkPolyLine> container = vtkSmartPointer<vtkPolyLine>::New(); for (unsigned int j=0; j<numPoints; j++) { double p[3]; points->GetPoint(j, p); vtkIdType id = vNewPoints->InsertNextPoint(p); container->GetPointIds()->InsertNextId(id); } vNewLines->InsertNextCell(container); vNewPolyData->SetPoints(vNewPoints); vNewPolyData->SetLines(vNewLines); // m_PosStreamline = mitk::FiberBundle::New(vNewPolyData); m_PosStreamline->GetFiberPolyData()->SetPoints(vNewPoints); m_PosStreamline->GetFiberPolyData()->SetLines(vNewLines); m_PosStreamline->SetFiberColors(0, 255, 0); +// m_PosStreamline->SetFiberWeights(m_PosStreamline->GetFiberWeights()); m_manStreamline->GetFiberPolyData()->DeleteCell(pickedCellID); m_manStreamline->GetFiberPolyData()->RemoveDeletedCells(); } } + RenderingManager::GetInstance()->RequestUpdateAll(); } void mitk::StreamlineInteractor::AddStreamlineNegBundle(StateMachineAction *, InteractionEvent *interactionEvent) { MITK_INFO << "NegativeBundle clicked"; // auto positionEvent = dynamic_cast<const InteractionPositionEvent *>(interactionEvent); // if (positionEvent == nullptr) // { // return; // } // return true; auto positionEvent = dynamic_cast<const InteractionPositionEvent *>(interactionEvent); if (positionEvent == nullptr) { MITK_INFO << "no position"; } if (interactionEvent->GetSender()->GetMapperID() == BaseRenderer::Standard2D) { // m_PickedHandle = PickFrom2D(positionEvent); MITK_INFO << "2D"; } else { BaseRenderer *renderer = positionEvent->GetSender(); auto &picker = m_Picker[renderer]; // if (picker == nullptr) // { picker = vtkSmartPointer<vtkCellPicker>::New(); picker->SetTolerance(0.01); auto mapper = GetDataNode()->GetMapper(BaseRenderer::Standard3D); auto vtk_mapper = dynamic_cast<VtkMapper *>(mapper); if (vtk_mapper) { // doing this each time is bizarre picker->AddPickList(vtk_mapper->GetVtkProp(renderer)); picker->PickFromListOn(); } // } auto displayPosition = positionEvent->GetPointerPositionOnScreen(); picker->Pick(displayPosition[0], displayPosition[1], 0, positionEvent->GetSender()->GetVtkRenderer()); vtkIdType pickedCellID = picker->GetCellId(); if (picker->GetCellId()==-1) { MITK_INFO << "Nothing picked"; } else { vtkSmartPointer<vtkPolyData> vNewPolyData = vtkSmartPointer<vtkPolyData>::New(); vtkSmartPointer<vtkCellArray> vNewLines = vtkSmartPointer<vtkCellArray>::New(); vtkSmartPointer<vtkPoints> vNewPoints = vtkSmartPointer<vtkPoints>::New(); unsigned int counter = 0; for ( int i=0; i<m_NegStreamline->GetFiberPolyData()->GetNumberOfCells(); i++) { vtkCell* cell = m_NegStreamline->GetFiberPolyData()->GetCell(i); auto numPoints = cell->GetNumberOfPoints(); vtkPoints* points = cell->GetPoints(); vtkSmartPointer<vtkPolyLine> container = vtkSmartPointer<vtkPolyLine>::New(); for (unsigned int j=0; j<numPoints; j++) { double p[3]; points->GetPoint(j, p); vtkIdType id = vNewPoints->InsertNextPoint(p); container->GetPointIds()->InsertNextId(id); } // weights->InsertValue(counter, fib->GetFiberWeight(i)); vNewLines->InsertNextCell(container); counter++; } vtkCell* cell = m_manStreamline->GetFiberPolyData()->GetCell(pickedCellID); auto numPoints = cell->GetNumberOfPoints(); vtkPoints* points = cell->GetPoints(); vtkSmartPointer<vtkPolyLine> container = vtkSmartPointer<vtkPolyLine>::New(); for (unsigned int j=0; j<numPoints; j++) { double p[3]; points->GetPoint(j, p); vtkIdType id = vNewPoints->InsertNextPoint(p); container->GetPointIds()->InsertNextId(id); } vNewLines->InsertNextCell(container); vNewPolyData->SetPoints(vNewPoints); vNewPolyData->SetLines(vNewLines); // m_NegStreamline = mitk::FiberBundle::New(vNewPolyData); m_NegStreamline->GetFiberPolyData()->SetPoints(vNewPoints); m_NegStreamline->GetFiberPolyData()->SetLines(vNewLines); m_NegStreamline->SetFiberColors(255, 0, 0); m_manStreamline->GetFiberPolyData()->DeleteCell(pickedCellID); m_manStreamline->GetFiberPolyData()->RemoveDeletedCells(); } - - - - - - - - - } - - - + RenderingManager::GetInstance()->RequestUpdateAll(); } diff --git a/Modules/FiberDissection/MachineLearning/mitkStreamlineFeatureExtractor.cpp b/Modules/FiberDissection/MachineLearning/mitkStreamlineFeatureExtractor.cpp index a7afe2f..ba29f61 100644 --- a/Modules/FiberDissection/MachineLearning/mitkStreamlineFeatureExtractor.cpp +++ b/Modules/FiberDissection/MachineLearning/mitkStreamlineFeatureExtractor.cpp @@ -1,584 +1,566 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "mitkStreamlineFeatureExtractor.h" #define _USE_MATH_DEFINES #include <math.h> #include <boost/progress.hpp> #include <vnl/vnl_sparse_matrix.h> #include <mitkIOUtil.h> namespace mitk{ StreamlineFeatureExtractor::StreamlineFeatureExtractor() : m_NumPoints(20) { } StreamlineFeatureExtractor::~StreamlineFeatureExtractor() { } void StreamlineFeatureExtractor::SetTractogramPlus(const mitk::FiberBundle::Pointer &TractogramPlus) { m_TractogramPlus = TractogramPlus; } void StreamlineFeatureExtractor::SetTractogramMinus(const mitk::FiberBundle::Pointer &TractogramMinus) { m_TractogramMinus = TractogramMinus; } void StreamlineFeatureExtractor::SetTractogramTest(const mitk::FiberBundle::Pointer &TractogramTest, std::string TractogramTestName) { std::string path = "/home/r948e/E132-Projekte/Projects/2022_Peretzke_Interactive_Fiber_Dissection/mitk_diff/storage/"; path.append(TractogramTestName); m_TractogramTest= TractogramTest; - m_DistancesTestName= path.append("_distances.csv"); + auto s = std::to_string(m_NumPoints); + m_DistancesTestName= path.append("_distances" + s + ".csv"); } std::vector<vnl_matrix<float> > StreamlineFeatureExtractor::ResampleFibers(mitk::FiberBundle::Pointer tractogram) { mitk::FiberBundle::Pointer temp_fib = tractogram->GetDeepCopy(); temp_fib->ResampleToNumPoints(m_NumPoints); + MITK_INFO << "Resampling Done"; + + std::vector< vnl_matrix<float> > out_fib(temp_fib->GetFiberPolyData()->GetNumberOfCells()); +// std::vector< vnl_matrix<float> > out_fib(); + +// cv::parallel_for_(cv::Range(0, temp_fib->GetFiberPolyData()->GetNumberOfCells()), [&](const cv::Range &range) +// { +// for (int i = range.start; i < range.end; i++) +// #pragma omp parallel for +// #pragma omp parallel for num_threads(10) collapse(1) + for (int i=0; i<temp_fib->GetFiberPolyData()->GetNumberOfCells(); i++) + { + vtkCell* cell = temp_fib->GetFiberPolyData()->GetCell(i); + int numPoints = cell->GetNumberOfPoints(); + vtkPoints* points = cell->GetPoints(); - std::vector< vnl_matrix<float> > out_fib; + vnl_matrix<float> streamline; + streamline.set_size(3, m_NumPoints); + streamline.fill(0.0); - for (int i=0; i<temp_fib->GetFiberPolyData()->GetNumberOfCells(); i++) - { - vtkCell* cell = temp_fib->GetFiberPolyData()->GetCell(i); - int numPoints = cell->GetNumberOfPoints(); - vtkPoints* points = cell->GetPoints(); + for (int j=0; j<numPoints; j++) + { + double cand[3]; + points->GetPoint(j, cand); - vnl_matrix<float> streamline; - streamline.set_size(3, m_NumPoints); - streamline.fill(0.0); + vnl_vector_fixed< float, 3 > candV; + candV[0]=cand[0]; candV[1]=cand[1]; candV[2]=cand[2]; + streamline.set_column(j, candV); + } - for (int j=0; j<numPoints; j++) - { - double cand[3]; - points->GetPoint(j, cand); +// out_fib.push_back(streamline); + out_fib.at(i)=streamline; + } +// }); - vnl_vector_fixed< float, 3 > candV; - candV[0]=cand[0]; candV[1]=cand[1]; candV[2]=cand[2]; - streamline.set_column(j, candV); - } - out_fib.push_back(streamline); - } return out_fib; } std::vector<vnl_matrix<float> > StreamlineFeatureExtractor::CalculateDmdf(std::vector<vnl_matrix<float> > tractogram, std::vector<vnl_matrix<float> > prototypes) { - std::vector< vnl_matrix<float> > dist_vec; - + std::vector< vnl_matrix<float> > dist_vec(tractogram.size());// + MITK_INFO << "Start Calculating Dmdf"; + cv::parallel_for_(cv::Range(0, tractogram.size()), [&](const cv::Range &range) + { + for (int i = range.start; i < range.end; i++) +// #pragma omp parallel for - for (unsigned int i=0; i<tractogram.size(); i++) +//#pragma omp parallel for +// for (unsigned int i=0; i<tractogram.size(); i++) { vnl_matrix<float> distances; distances.set_size(1, prototypes.size()); distances.fill(0.0); for (unsigned int j=0; j<prototypes.size(); j++) { vnl_matrix<float> single_distances; single_distances.set_size(1, tractogram.at(0).cols()); single_distances.fill(0.0); vnl_matrix<float> single_distances_flip; single_distances_flip.set_size(1, tractogram.at(0).cols()); single_distances_flip.fill(0.0); for (unsigned int ik=0; ik<tractogram.at(0).cols(); ik++) { double cur_dist; double cur_dist_flip; cur_dist = sqrt(pow(tractogram.at(i).get(0,ik) - prototypes.at(j).get(0,ik), 2.0) + pow(tractogram.at(i).get(1,ik) - prototypes.at(j).get(1,ik), 2.0) + pow(tractogram.at(i).get(2,ik) - prototypes.at(j).get(2,ik), 2.0)); cur_dist_flip = sqrt(pow(tractogram.at(i).get(0,ik) - prototypes.at(j).get(0,prototypes.at(0).cols()-(ik+1)), 2.0) + pow(tractogram.at(i).get(1,ik) - prototypes.at(j).get(1,prototypes.at(0).cols()-(ik+1)), 2.0) + pow(tractogram.at(i).get(2,ik) - prototypes.at(j).get(2,prototypes.at(0).cols()-(ik+1)), 2.0)); single_distances.put(0,ik, cur_dist); single_distances_flip.put(0,ik, cur_dist_flip); } if (single_distances_flip.mean()> single_distances.mean()) { distances.put(0,j, single_distances.mean()); } else { distances.put(0,j, single_distances_flip.mean()); } } - dist_vec.push_back(distances); +// dist_vec.push_back(distances); + dist_vec.at(i) = distances; } + }); + MITK_INFO << "Done Calculation"; return dist_vec; } std::vector<std::vector<unsigned int>> StreamlineFeatureExtractor::GetData() { MITK_INFO << "Start Function Get Data"; /*Vector which saves Prediction and Fibers to label based on uncertainty*/ std::vector<std::vector<unsigned int>> index_vec; int labels_arr [m_DistancesPlus.size()+m_DistancesMinus.size()]; cv::Mat data; cv::Mat labels_arr_vec; int size_plus = 0; /*Create Trainingdata: Go through positive and negative Bundle and save distances as cv::Mat and create vector with labels*/ for ( unsigned int i=0; i<m_DistancesPlus.size(); i++) { float data_arr [m_DistancesPlus.at(0).size()]; - labels_arr[i]=2; + labels_arr[i]=1; labels_arr_vec.push_back(1); for ( unsigned int j=0; j<m_DistancesPlus.at(0).cols(); j++) { data_arr[j] = m_DistancesPlus.at(i).get(0,j); } cv::Mat curdata(1, m_DistancesPlus.at(0).size(), CV_32F, data_arr); data.push_back(curdata); size_plus++; } for ( unsigned int i=m_DistancesPlus.size(); i<m_DistancesPlus.size()+m_DistancesMinus.size(); i++) { int it = i - size_plus; float data_arr [m_DistancesMinus.at(0).size()]; - labels_arr[i]=1; + labels_arr[i]=0; labels_arr_vec.push_back(0); for ( unsigned int j=0; j<m_DistancesMinus.at(0).cols(); j++) { data_arr[j] = m_DistancesMinus.at(it).get(0,j); } cv::Mat curdata(1, m_DistancesPlus.at(0).size(), CV_32F, data_arr); data.push_back(curdata); } /*Calculate weights*/ int zerosgt = labels_arr_vec.rows - cv::countNonZero(labels_arr_vec); int onesgt = cv::countNonZero(labels_arr_vec); float plusval = labels_arr_vec.rows / (2.0 * onesgt ); float minusval = labels_arr_vec.rows / (2.0 * zerosgt ); cv::Mat newweight; newweight.push_back(minusval); newweight.push_back(plusval); MITK_INFO << "Weights"; MITK_INFO << newweight; cv::Mat labels(m_DistancesPlus.size()+m_DistancesMinus.size(), 1, CV_32S, labels_arr); +// std::ofstream myfile1; +// myfile1.open("/home/r948e/mycsv/labels.csv"); +// myfile1<< cv::format(labels, cv::Formatter::FMT_CSV) << std::endl; +// myfile1.close(); + +// std::ofstream myfile2; +// myfile2.open("/home/r948e/mycsv/features.csv"); +// myfile2<< cv::format(data, cv::Formatter::FMT_CSV) << std::endl; +// myfile2.close(); cv::Ptr<cv::ml::TrainData> m_traindata = cv::ml::TrainData::create(data, cv::ml::ROW_SAMPLE, labels); // m_traindata->setTrainTestSplitRatio(0.95, true); m_traindata->shuffleTrainTest(); - MITK_INFO << m_traindata->getTrainResponses(); - MITK_INFO << m_traindata->getTrainSamples(); MITK_INFO << m_traindata->getClassLabels(); MITK_INFO << "Start Training"; auto statistic_model = cv::ml::RTrees::create(); auto criteria = cv::TermCriteria(); criteria.type = cv::TermCriteria::MAX_ITER; // criteria.epsilon = 1e-8; - criteria.maxCount = 1000; + criteria.maxCount = 800; // statistic_model->setMaxCategories(2); statistic_model->setMaxDepth(50); - statistic_model->setMinSampleCount(m_traindata->getNTrainSamples()*0.01); - statistic_model->setMinSampleCount(3); - statistic_model->setTruncatePrunedTree(true); - statistic_model->setUse1SERule(true); +// statistic_model->setMinSampleCount(m_traindata->getNTrainSamples()*0.01); + statistic_model->setMinSampleCount(2); + statistic_model->setTruncatePrunedTree(false); + statistic_model->setUse1SERule(false); statistic_model->setUseSurrogates(false); statistic_model->setTermCriteria(criteria); statistic_model->setCVFolds(1); statistic_model->setPriors(newweight); statistic_model->train(m_traindata); - MITK_INFO << statistic_model->isClassifier(); + MITK_INFO << "Predicting"; cv::Mat dataTest; for ( unsigned int i=0; i<m_DistancesTest.size(); i++) { float data_arr [m_DistancesTest.at(0).size()]; for ( unsigned int j=0; j<m_DistancesTest.at(0).cols(); j++) { data_arr[j] = m_DistancesTest.at(i).get(0,j); } cv::Mat curdata(1, m_DistancesTest.at(0).size(), CV_32F, data_arr); dataTest.push_back(curdata); } -// MITK_INFO << "DataTest"; -// MITK_INFO << dataTest.cols; -// MITK_INFO << dataTest.rows; -// MITK_INFO << dataTest; - MITK_INFO << "________"; - std::vector<unsigned int> index; std::vector<float> e(m_DistancesTest.size()); cv::parallel_for_(cv::Range(0, m_DistancesTest.size()), [&](const cv::Range &range) { for (int i = range.start; i < range.end; i++) { - cv::Mat vote; int val = statistic_model->predict(dataTest.row(i)); - statistic_model->getVotes(dataTest.row(i), vote, 0); + if (val==1) + { + index.push_back(i); + } - float plus_prob = (vote.at<int>(1,0)*1.0)/ (vote.at<int>(1,0)+vote.at<int>(1,1)); - float neg_prob = (vote.at<int>(1,1)*1.0)/ (vote.at<int>(1,0)+vote.at<int>(1,1)); - e.at(i) = ( -plus_prob * log2(plus_prob) - neg_prob * log2(neg_prob)); + cv::Mat vote; + statistic_model->getVotes(dataTest.row(i), vote, 0); + e.at(i) = ( -(vote.at<int>(1,0)*1.0)/ (vote.at<int>(1,0)+vote.at<int>(1,1)) * log2((vote.at<int>(1,0)*1.0)/ (vote.at<int>(1,0)+vote.at<int>(1,1))) - + (vote.at<int>(1,1)*1.0)/ (vote.at<int>(1,0)+vote.at<int>(1,1))* log2((vote.at<int>(1,1)*1.0)/ (vote.at<int>(1,0)+vote.at<int>(1,1)))); + if (isnan(e.at(i))) + { + e.at(i)=0; +// MITK_INFO << e.at(i); + } if (i==1) { MITK_INFO<< val; MITK_INFO << vote; - MITK_INFO << e.at(i); - } - - if (val==2) - { - index.push_back(i); } } }); +// std::ofstream myfile3; +// myfile3.open("/home/r948e/mycsv/entropydata.csv"); -// for (unsigned int i = 0; i < m_DistancesTest.size(); i++) -// { +// for (unsigned int i = 0; i < e.size(); i++) { +// myfile3 << e.at(i) << ' '; +// } +// myfile3.close(); -// cv::Mat vote; -// val = statistic_model->predict(dataTest.row(i)); -// statistic_model->getVotes(dataTest.row(i), vote, 0); -// float plus_prob = (vote.at<int>(1,0)*1.0)/ (vote.at<int>(1,0)+vote.at<int>(1,1)); -// float neg_prob = (vote.at<int>(1,1)*1.0)/ (vote.at<int>(1,0)+vote.at<int>(1,1)); -// e.at(i) = ( -plus_prob * log2(plus_prob) - neg_prob * log2(neg_prob)); -//// pred.at(i) = val; -// if (i==1) -// { -// MITK_INFO<< val; -// MITK_INFO << vote; -// MITK_INFO << e.at(i); -// } - -// if (val==2) -// { -// index.push_back(i); -//// index.at(i) = i; -//// MITK_INFO << i; -// } -// else -// { -//// index.at(i) = 0; -//// MITK_INFO << 0; -// } - -// } - - - MITK_INFO << index.size(); - for (unsigned int i = 0; i < index.size(); i++) { - std::cout << index.at(i) << ' '; - } + MITK_INFO << "--------------"; + MITK_INFO << "Prediction vector size:"; MITK_INFO << index.size(); + MITK_INFO << "Entropy vector size:"; + MITK_INFO << e.size(); MITK_INFO << "--------------"; - MITK_INFO << e.size(); - e.erase( - std::remove(e.begin(), e.end(), 0), - e.end()); - e.shrink_to_fit(); - MITK_INFO << e.size(); + auto it = std::minmax_element(e.begin(), e.end()); int min_idx = std::distance(e.begin(), it.first); int max_idx = std::distance(e.begin(), it.second); std::cout << min_idx << ", " << max_idx << std::endl; // 1, 5 + MITK_INFO << e.at(max_idx); - MITK_INFO << "--------------"; MITK_INFO << "Start the ordering"; std::vector<unsigned int> indextolabel; std::priority_queue<std::pair<float, int>> q; - for (unsigned int i = 0; i < e.size(); ++i) { + for (unsigned int i = 0; i < e.size(); ++i) + { q.push(std::pair<float, int>(e[i], i)); - } - int k = m_DistancesTest.size(); // number of indices we need -// int k = 500; // number of indices we need - for (int i = 0; i < k; ++i) { + } + int k = m_DistancesTest.size(); // number of indices we need + for (int i = 0; i < k; ++i) + { int ki = q.top().second; -// std::cout << "index[" << i << "] = " << ki << std::endl;x indextolabel.push_back(ki); q.pop(); - } - MITK_INFO << "Done"; -// for (unsigned int i = 0; i < indextolabel.size(); i++) { -// std::cout << indextolabel.at(i) << ' '; -// } - -// MITK_INFO << statistic_model->getTermCriteria().maxCount; -// MITK_INFO << statistic_model->getTermCriteria().type; -// MITK_INFO << statistic_model->getTermCriteria().epsilon; -// statistic_model->getVotes(dataTest.row(0), vote, 0); -// statistic_model->predict(dataTest, pred); -// cv::Mat vote; -// statistic_model->getVotes(dataTest, vote, 0); -// MITK_INFO << "vote"; -// MITK_INFO << vote.rows; -// MITK_INFO << vote.cols; -// MITK_INFO << pred; -// mitke_INFO << vote; -//// MITK_INFO << vote; -// MITK_INFO << vote; - MITK_INFO << "_______"; - - -// MITK_INFO << statistic_model->getPriors(); -// MITK_INFO << statistic_model->getNodes(); - -// index.push_back(1); + } + +// std::ofstream myfile4; +// myfile4.open("/home/r948e/mycsv/indextolabel.csv"); +// for (unsigned int i = 0; i < indextolabel.size(); i++) +// { +// myfile4 << indextolabel.at(i) << ' '; +// } +// myfile4.close(); + + MITK_INFO << "Done"; + + index_vec.push_back(index); index_vec.push_back(indextolabel); return index_vec; } mitk::FiberBundle::Pointer StreamlineFeatureExtractor::CreatePrediction(std::vector<unsigned int> &index) { mitk::FiberBundle::Pointer Prediction; MITK_INFO << "Create Bundle"; vtkSmartPointer<vtkPolyData> FibersData; FibersData = vtkSmartPointer<vtkPolyData>::New(); FibersData->SetPoints(vtkSmartPointer<vtkPoints>::New()); FibersData->SetLines(vtkSmartPointer<vtkCellArray>::New()); vtkSmartPointer<vtkPolyData> vNewPolyData = vtkSmartPointer<vtkPolyData>::New(); vtkSmartPointer<vtkCellArray> vNewLines = vtkSmartPointer<vtkCellArray>::New(); vtkSmartPointer<vtkPoints> vNewPoints = vtkSmartPointer<vtkPoints>::New(); unsigned int indexSize = index.size(); unsigned int counter = 0; MITK_INFO << "Start Loop"; for (unsigned int i=0; i<indexSize; i++) { vtkCell* cell = m_TractogramTest->GetFiberPolyData()->GetCell(index[i]); auto numPoints = cell->GetNumberOfPoints(); vtkPoints* points = cell->GetPoints(); vtkSmartPointer<vtkPolyLine> container = vtkSmartPointer<vtkPolyLine>::New(); for (unsigned int j=0; j<numPoints; j++) { double p[3]; points->GetPoint(j, p); vtkIdType id = vNewPoints->InsertNextPoint(p); container->GetPointIds()->InsertNextId(id); } // weights->InsertValue(counter, fib->GetFiberWeight(i)); vNewLines->InsertNextCell(container); counter++; } MITK_INFO << "Counter"; MITK_INFO << counter; vNewPolyData->SetLines(vNewLines); vNewPolyData->SetPoints(vNewPoints); FibersData = vtkSmartPointer<vtkPolyData>::New(); FibersData->SetPoints(vtkSmartPointer<vtkPoints>::New()); FibersData->SetLines(vtkSmartPointer<vtkCellArray>::New()); FibersData->SetPoints(vNewPoints); FibersData->SetLines(vNewLines); Prediction = mitk::FiberBundle::New(vNewPolyData); // Bundle->SetFiberColors(255, 255, 255); MITK_INFO << "Cells Prediciton"; MITK_INFO << Prediction->GetFiberPolyData()->GetNumberOfCells(); MITK_INFO << "Cells Tractorgram"; MITK_INFO << m_TractogramTest->GetFiberPolyData()->GetNumberOfCells(); return Prediction; } void StreamlineFeatureExtractor::GenerateData() { MITK_INFO << "Update"; mitk::FiberBundle::Pointer inputPrototypes = mitk::IOUtil::Load<mitk::FiberBundle>("/home/r948e/E132-Projekte/Projects/2022_Peretzke_Interactive_Fiber_Dissection/mitk_diff/prototypes_599671.trk"); T_Prototypes = ResampleFibers(inputPrototypes); T_TractogramMinus= ResampleFibers(m_TractogramMinus); T_TractogramPlus= ResampleFibers(m_TractogramPlus); - + MITK_INFO << "Calculate Features"; m_DistancesMinus = CalculateDmdf(T_TractogramMinus, T_Prototypes); m_DistancesPlus = CalculateDmdf(T_TractogramPlus, T_Prototypes); + + std::ifstream f(m_DistancesTestName); if (f.good()) { MITK_INFO << "File exists"; m_DistancesTest.clear(); std::ifstream myFile(m_DistancesTestName); if(!myFile.is_open()) throw std::runtime_error("Could not open file"); std::string line; vnl_matrix<float> curline; curline.set_size(1, m_DistancesPlus.at(0).cols()); curline.fill(0.0); float val; while(std::getline(myFile, line)) { // Create a stringstream of the current line std::stringstream ss(line); // MITK_INFO << ss; // Keep track of the current column index int colIdx = 0; // Extract each integer while(ss >> val){ // // Add the current integer to the 'colIdx' column's values vector curline.put(0,colIdx, val); // // If the next token is a comma, ignore it and move on // if(ss.peek() == ',') ss.ignore(); - // // Increment the column index colIdx++; } m_DistancesTest.push_back(curline); } // Close file myFile.close(); } else { MITK_INFO << m_DistancesTestName; + MITK_INFO << "Resample Test Data"; T_TractogramTest= ResampleFibers(m_TractogramTest); + MITK_INFO << "Calculate Features of Test Data"; m_DistancesTest= CalculateDmdf(T_TractogramTest, T_Prototypes); std::ofstream myFile(m_DistancesTestName); // myFile << colname << "\n"; for(long unsigned int i = 0; i < m_DistancesTest.size(); ++i) { myFile << m_DistancesTest.at(i); } myFile.close(); } MITK_INFO << m_DistancesTest.size(); MITK_INFO << "Sizes of Plus and Minus"; MITK_INFO << m_DistancesPlus.size() + m_DistancesMinus.size(); MITK_INFO << "Size of Test Data"; MITK_INFO << m_DistancesTest.size(); MITK_INFO << "Done with Datacreation"; m_index =GetData(); } //cv::Mat StreamlineFeatureExtractor::StartAlgorithm() //{ // MITK_INFO << "Printing"; // float data_arr [10] = {1, 2.4 ,4 ,4.5 ,6 ,7, 120.5, 100, 120, 100}; // cv::Mat curdata(1, 10, CV_32F, data_arr); // float data_arr2 [10] = {10, 20.4 ,40 ,40.5 ,60 ,70, 1200.5, 1000, 1200, 1000}; // cv::Mat curdata2(1, 10, CV_32F, data_arr2); // cv::Mat data; //// cv::Mat data2; // // data.row(1) = curdata.clone(); // data.push_back(curdata); // data.push_back(curdata2); //// cv::add(curdata,data2,data2); // cout << curdata; // cout << data; //// cout << data2; // return curdata.clone(); //} } diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkInteractiveFiberDissectionView.cpp b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkInteractiveFiberDissectionView.cpp index 29400cb..6733b32 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkInteractiveFiberDissectionView.cpp +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkInteractiveFiberDissectionView.cpp @@ -1,727 +1,788 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ // Blueberry #include <berryISelectionService.h> #include <berryIWorkbenchPart.h> #include <berryIWorkbenchWindow.h> // Qmitk #include "QmitkInteractiveFiberDissectionView.h" #include <QmitkRenderWindow.h> //Pointset #include <QmitkPointListWidget.h> //Pointset #include <QMessageBox> #include <mitkNodePredicateProperty.h> #include <mitkImageCast.h> #include <mitkPointSet.h> #include <mitkImageAccessByItk.h> #include <mitkDataNodeObject.h> #include <mitkTensorImage.h> #include "mitkNodePredicateDataType.h" #include <mitkNodePredicateProperty.h> #include <mitkNodePredicateAnd.h> #include <mitkNodePredicateNot.h> #include <mitkNodePredicateOr.h> //#include <mitkStreamlineFeatureExtractor.h> #include <mitkInteractionConst.h> #include "usModuleRegistry.h" //#include <itkFiberCurvatureFilter.h> #include <itkResampleImageFilter.h> #include <itkGaussianInterpolateImageFunction.h> #include <itkImageRegionIteratorWithIndex.h> #include <itkTractsToFiberEndingsImageFilter.h> #include <itkTractDensityImageFilter.h> #include <itkImageRegion.h> #include <itkTractsToRgbaImageFilter.h> #include <itkFiberExtractionFilter.h> #include <mitkInteractionEventObserver.h> #include <vtkCellPicker.h> #include <boost/algorithm/string.hpp> #include <boost/lexical_cast.hpp> #include <vnl/vnl_sparse_matrix.h> const std::string QmitkInteractiveFiberDissectionView::VIEW_ID = "org.mitk.views.interactivefiberdissection"; const std::string id_DataManager = "org.mitk.views.datamanager"; using namespace mitk; QmitkInteractiveFiberDissectionView::QmitkInteractiveFiberDissectionView() : QmitkAbstractView() , m_Controls( 0 ) , m_IterationCounter(0) , m_RandomExtractionCounter(0) , m_StreamlineInteractor(nullptr) { } // Destructor QmitkInteractiveFiberDissectionView::~QmitkInteractiveFiberDissectionView() { //disable interactor if (m_StreamlineInteractor != nullptr) { // m_StreamlineInteractor->SetStreamlineNode(nullptr); m_StreamlineInteractor->EnableInteraction(false); } } void QmitkInteractiveFiberDissectionView::CreateQtPartControl( QWidget *parent ) { // build up qt view, unless already done if ( !m_Controls ) { // create GUI widgets from the Qt Designer's .ui file m_Controls = new Ui::QmitkInteractiveFiberDissectionViewControls; m_Controls->setupUi( parent ); m_Controls->m_selectedPointSetWidget->SetDataStorage(GetDataStorage());//pointset m_Controls->m_selectedPointSetWidget->SetNodePredicate(mitk::NodePredicateAnd::New(//pointset mitk::TNodePredicateDataType<mitk::PointSet>::New(),//pointset mitk::NodePredicateNot::New(mitk::NodePredicateOr::New(//pointset mitk::NodePredicateProperty::New("helper object"),//pointset mitk::NodePredicateProperty::New("hidden object")))));//pointset m_Controls->m_selectedPointSetWidget->SetSelectionIsOptional(true);//pointset m_Controls->m_selectedPointSetWidget->SetAutoSelectNewNodes(true);//pointset m_Controls->m_selectedPointSetWidget->SetEmptyInfo(QString("Please select a point set"));//pointset m_Controls->m_selectedPointSetWidget->SetPopUpTitel(QString("Select point set"));//pointsett + m_Controls->m_trainbundleWidget->SetDataStorage(GetDataStorage());//testdata + m_Controls->m_trainbundleWidget->SetNodePredicate(mitk::NodePredicateAnd::New(//testdata + mitk::TNodePredicateDataType<mitk::FiberBundle>::New(),//testdata + mitk::NodePredicateNot::New(mitk::NodePredicateOr::New(//testdata + mitk::NodePredicateProperty::New("helper object"),//testdata + mitk::NodePredicateProperty::New("hidden object")))));//testdatat + + m_Controls->m_trainbundleWidget->SetSelectionIsOptional(true);//testdata + m_Controls->m_trainbundleWidget->SetAutoSelectNewNodes(true);//testdat + m_Controls->m_trainbundleWidget->SetEmptyInfo(QString("Please select a point set"));//testdat + m_Controls->m_trainbundleWidget->SetPopUpTitel(QString("Select point set"));//testdat + + connect(m_Controls->m_ErazorButton, SIGNAL(toggled(bool)), this, SLOT( RemovefromBundle(bool) ) ); //need connect(m_Controls->m_StreamlineCreation, SIGNAL( clicked() ), this, SLOT( CreateStreamline())); connect(m_Controls->m_AddRandomFibers, SIGNAL( clicked() ), this, SLOT( ExtractRandomFibersFromTractogram() ) ); //need connect(m_Controls->m_TrainClassifier, SIGNAL( clicked() ), this, SLOT( StartAlgorithm( ))); connect(m_Controls->m_CreatePrediction, SIGNAL( clicked() ), this, SLOT( CreatePredictionNode( ))); connect(m_Controls->m_AddUncertainFibers, SIGNAL( clicked() ), this, SLOT( CreateUncertaintySampleNode( ))); connect(m_Controls->m_newlabeling, SIGNAL(toggled(bool)), this, SLOT( RemovefromUncertainty(bool) ) ); //need + connect(m_Controls->m_predlabeling, SIGNAL(toggled(bool)), this, SLOT( RemovefromPrediction(bool) ) ); //need + connect(m_Controls->m_addPointSetPushButton, &QPushButton::clicked,//pointset this, &QmitkInteractiveFiberDissectionView::OnAddPointSetClicked);//pointset connect(m_Controls->m_selectedPointSetWidget, &QmitkSingleNodeSelectionWidget::CurrentSelectionChanged,//pointset this, &QmitkInteractiveFiberDissectionView::OnCurrentSelectionChanged);//pointset auto renderWindowPart = this->GetRenderWindowPart();//pointset if (nullptr != renderWindowPart)//pointset this->RenderWindowPartActivated(renderWindowPart);//pointset this->OnCurrentSelectionChanged(m_Controls->m_selectedPointSetWidget->GetSelectedNodes());//pointset } UpdateGui(); } void QmitkInteractiveFiberDissectionView::SetFocus() { m_Controls->toolBoxx->setFocus(); //m_Controls->m_addPointSetPushButton->setFocus();//pointset } void QmitkInteractiveFiberDissectionView::UpdateGui() { m_Controls->m_FibLabel->setText("<font color='red'>mandatory</font>"); m_Controls->m_InputData->setTitle("Please Select Input Data"); // disable alle frames m_Controls->m_ErazorButton->setCheckable(true); m_Controls->m_ErazorButton->setEnabled(false); m_Controls->m_newlabeling->setCheckable(true); m_Controls->m_newlabeling->setEnabled(false); + m_Controls->m_predlabeling->setCheckable(true); + m_Controls->m_predlabeling->setEnabled(false); m_Controls->m_addPointSetPushButton->setEnabled(false); m_Controls->m_StreamlineCreation->setEnabled(false); m_Controls->m_TrainClassifier->setEnabled(false); m_Controls->m_CreatePrediction->setEnabled(false); m_Controls->m_CreateUncertantyMap->setEnabled(false); m_Controls->m_Numtolabel->setEnabled(false); m_Controls->m_addPointSetPushButton->setEnabled(false); m_Controls->m_AddRandomFibers->setEnabled(false); m_Controls->m_AddUncertainFibers->setEnabled(false); m_Controls->m_newlabeling->setEnabled(false); + m_Controls->m_predlabeling->setEnabled(false); bool fibSelected = !m_SelectedFB.empty(); bool multipleFibsSelected = (m_SelectedFB.size()>1); bool sthSelected = m_SelectedImageNode.IsNotNull(); bool psSelected = m_SelectedPS.IsNotNull(); // bool nfibSelected = !m_newfibersSelectedBundles.empty(); -// bool posSelected = !m_positivSelectedBundles.empty(); +// bool posSelected = !m_positivBundlesNode.empty(); bool nfibSelected = m_newfibersSelectedBundles.IsNotNull(); -// bool posSelected = !m_positivSelectedBundles.IsNotNull(); +// bool posSelected = !m_positivBundlesNode.IsNotNull(); // bool negSelected = !m_negativeSelectedBundles.IsNotNull(); - bool posSelected = this->GetDataStorage()->Exists(m_positivSelectedBundles); + bool posSelected = this->GetDataStorage()->Exists(m_positivBundlesNode); bool negSelected = this->GetDataStorage()->Exists(m_negativeSelectedBundles); bool indexSelected = !m_index.empty(); bool uncertaintySelected = this->GetDataStorage()->Exists(m_UncertaintyLabelNode); + bool predictionSelected = this->GetDataStorage()->Exists(m_PredictionNode); // toggle visibility of elements according to selected method // are fiber bundles selected? if ( fibSelected ) { m_Controls->m_FibLabel->setText(QString(m_SelectedFB.at(0)->GetName().c_str())); m_Controls->m_addPointSetPushButton->setEnabled(true); m_Controls->m_AddRandomFibers->setEnabled(true); // more than two bundles needed to join/subtract if (multipleFibsSelected) { m_Controls->m_FibLabel->setText("multiple bundles selected"); } } // is image selected if (sthSelected) { m_Controls->m_addPointSetPushButton->setEnabled(true); } if (psSelected) { m_Controls->m_StreamlineCreation->setEnabled(true); } if (nfibSelected && posSelected) { m_Controls->m_ErazorButton->setEnabled(true); } if (posSelected && negSelected) { m_Controls->m_TrainClassifier->setEnabled(true); } if (indexSelected) { m_Controls->m_CreatePrediction->setEnabled(true); m_Controls->m_AddUncertainFibers->setEnabled(true); m_Controls->m_Numtolabel->setEnabled(true); } if (uncertaintySelected) { m_Controls->m_newlabeling->setEnabled(true); } + if (predictionSelected) + { + m_Controls->m_predlabeling->setEnabled(true); + } + + } void QmitkInteractiveFiberDissectionView::OnEndInteraction() { } void QmitkInteractiveFiberDissectionView::OnAddPointSetClicked()//pointset { // ask for the name of the point set bool ok = false; QString name = QInputDialog::getText(QApplication::activeWindow(), tr("Add point set..."), tr("Enter name for the new point set"), QLineEdit::Normal, tr("PointSet").arg(++m_IterationCounter), &ok); // QString name = "PointSet"; if (!ok || name.isEmpty()) { return; } mitk::PointSet::Pointer pointSet = mitk::PointSet::New(); mitk::DataNode::Pointer pointSetNode = mitk::DataNode::New(); pointSetNode->SetData(pointSet); pointSetNode->SetProperty("name", mitk::StringProperty::New(name.toStdString())); pointSetNode->SetProperty("opacity", mitk::FloatProperty::New(1)); pointSetNode->SetColor(1.0, 1.0, 0.0); this->GetDataStorage()->Add(pointSetNode, m_SelectedImageNode); m_Controls->m_selectedPointSetWidget->SetCurrentSelectedNode(pointSetNode); } void QmitkInteractiveFiberDissectionView::OnCurrentSelectionChanged(QmitkSingleNodeSelectionWidget::NodeList /*nodes*/)//pointset { m_Controls->m_poinSetListWidget->SetPointSetNode(m_Controls->m_selectedPointSetWidget->GetSelectedNode()); m_SelectedPS = m_Controls->m_selectedPointSetWidget->GetSelectedNode(); +// m_Controls->m_trainbundleWidget->SetPointSetNode(m_Controls->m_trainbundleWidget->GetSelectedNode()); + m_trainbundle = m_Controls->m_trainbundleWidget->GetSelectedNode(); + + UpdateGui(); } void QmitkInteractiveFiberDissectionView::OnSelectionChanged(berry::IWorkbenchPart::Pointer /*part*/, const QList<mitk::DataNode::Pointer>& nodes) { m_SelectedFB.clear(); if (nodes.empty() || nodes.front().IsNull()) { m_SelectedImageNode = nullptr; } else { m_SelectedImageNode = nodes.front(); } for (auto node: nodes) { if (dynamic_cast<mitk::Image*>(node->GetData())) m_SelectedImage = dynamic_cast<mitk::Image*>(node->GetData()); else if ( dynamic_cast<mitk::FiberBundle*>(node->GetData()) ) m_SelectedFB.push_back(node); } UpdateGui(); } void QmitkInteractiveFiberDissectionView::RenderWindowPartActivated(mitk::IRenderWindowPart* renderWindowPart)//pointset { if (nullptr != m_Controls) { m_Controls->m_poinSetListWidget->AddSliceNavigationController(renderWindowPart->GetQmitkRenderWindow("axial")->GetSliceNavigationController()); m_Controls->m_poinSetListWidget->AddSliceNavigationController(renderWindowPart->GetQmitkRenderWindow("sagittal")->GetSliceNavigationController()); m_Controls->m_poinSetListWidget->AddSliceNavigationController(renderWindowPart->GetQmitkRenderWindow("coronal")->GetSliceNavigationController()); } } void QmitkInteractiveFiberDissectionView::RenderWindowPartDeactivated(mitk::IRenderWindowPart* renderWindowPart)//pointset { if (nullptr != m_Controls) { m_Controls->m_poinSetListWidget->RemoveSliceNavigationController(renderWindowPart->GetQmitkRenderWindow("axial")->GetSliceNavigationController()); m_Controls->m_poinSetListWidget->RemoveSliceNavigationController(renderWindowPart->GetQmitkRenderWindow("sagittal")->GetSliceNavigationController()); m_Controls->m_poinSetListWidget->RemoveSliceNavigationController(renderWindowPart->GetQmitkRenderWindow("coronal")->GetSliceNavigationController()); } } void QmitkInteractiveFiberDissectionView::CreateStreamline() { - if (m_positivSelectedBundles.IsNull()) + if (m_positivBundlesNode.IsNull()) { mitk::DataNode::Pointer node = mitk::DataNode::New(); m_positiveFibersData = vtkSmartPointer<vtkPolyData>::New(); m_positiveFibersData->SetPoints(vtkSmartPointer<vtkPoints>::New()); m_positiveFibersData->SetLines(vtkSmartPointer<vtkCellArray>::New()); m_positiveBundle = mitk::FiberBundle:: New(m_positiveFibersData); node->SetData( m_positiveBundle ); - m_positivSelectedBundles = node; - this->GetDataStorage()->Add(m_positivSelectedBundles); + m_positivBundlesNode = node; + this->GetDataStorage()->Add(m_positivBundlesNode); MITK_INFO << "Create Bundle"; } - if (!m_positivSelectedBundles.IsNull()) + if (!m_positivBundlesNode.IsNull()) { - this->GetDataStorage()->Remove(m_positivSelectedBundles); + + this->GetDataStorage()->Remove(m_positivBundlesNode); MITK_INFO << "Adding fibers"; + MITK_INFO << m_positiveBundle->GetFiberPolyData()->GetNumberOfCells(); + m_positiveFibersData = m_positiveBundle->GetFiberPolyData(); } - mitk::PointSet::Pointer pointSet = dynamic_cast<mitk::PointSet *>(m_SelectedPS->GetData()); - - vnl_matrix<float> streamline; - streamline.set_size(3, pointSet->GetSize()); - streamline.fill(0.0); - - - mitk::PointSet::PointsIterator begin = pointSet->Begin(); - mitk::PointSet::PointsIterator end = pointSet->End(); - unsigned int i; - mitk::PointSet::PointsContainer::Iterator it; - - for (it = begin, i = 0; it != end; ++it, ++i) - { - PointSet::PointType pt = pointSet->GetPoint(it->Index()); - vnl_vector_fixed< float, 3 > candV; - candV[0]=pt[0]; candV[1]=pt[1]; candV[2]=pt[2]; - streamline.set_column(i, candV); - } - vtkSmartPointer<vtkPolyData> vNewPolyData = vtkSmartPointer<vtkPolyData>::New(); vtkSmartPointer<vtkCellArray> vNewLines = vtkSmartPointer<vtkCellArray>::New(); vtkSmartPointer<vtkPoints> vNewPoints = vtkSmartPointer<vtkPoints>::New(); unsigned int counter = 0; for (unsigned int i=0; i<m_positiveFibersData->GetNumberOfCells(); ++i) { + MITK_INFO<< "New Line"; vtkCell* cell = m_positiveFibersData->GetCell(i); auto numPoints = cell->GetNumberOfPoints(); vtkPoints* points = cell->GetPoints(); vtkSmartPointer<vtkPolyLine> container = vtkSmartPointer<vtkPolyLine>::New(); for (unsigned int j=0; j<numPoints; ++j) { double p[3]; points->GetPoint(j, p); vtkIdType id = vNewPoints->InsertNextPoint(p); container->GetPointIds()->InsertNextId(id); } vNewLines->InsertNextCell(container); counter++; } + mitk::PointSet::Pointer pointSet = dynamic_cast<mitk::PointSet *>(m_SelectedPS->GetData()); + + + vnl_matrix<float> streamline; + streamline.set_size(3, pointSet->GetSize()); + streamline.fill(0.0); + + + mitk::PointSet::PointsIterator begin = pointSet->Begin(); + mitk::PointSet::PointsIterator end = pointSet->End(); + unsigned int i; + mitk::PointSet::PointsContainer::Iterator it; + + for (it = begin, i = 0; it != end; ++it, ++i) + { + PointSet::PointType pt = pointSet->GetPoint(it->Index()); + vnl_vector_fixed< float, 3 > candV; + candV[0]=pt[0]; candV[1]=pt[1]; candV[2]=pt[2]; + streamline.set_column(i, candV); + } + // build Fiber vtkSmartPointer<vtkPolyLine> container = vtkSmartPointer<vtkPolyLine>::New(); for (unsigned int j=0; j<streamline.cols(); j++) { double p[3]; p[0] = streamline.get(0,j); p[1] = streamline.get(1,j); p[2] = streamline.get(2,j); vtkIdType id = vNewPoints->InsertNextPoint(p); container->GetPointIds()->InsertNextId(id); } + MITK_INFO<< "Last Line from current pointset"; vNewLines->InsertNextCell(container); vNewPolyData->SetPoints(vNewPoints); vNewPolyData->SetLines(vNewLines); m_positiveFibersData = vtkSmartPointer<vtkPolyData>::New(); m_positiveFibersData->SetPoints(vtkSmartPointer<vtkPoints>::New()); m_positiveFibersData->SetLines(vtkSmartPointer<vtkCellArray>::New()); m_positiveFibersData->SetPoints(vNewPoints); m_positiveFibersData->SetLines(vNewLines); m_positiveBundle = mitk::FiberBundle::New(vNewPolyData); // m_positiveBundle->SetTrackVisHeader(dynamic_cast<mitk::Image*>(m_SelectedImageNode->GetData())->GetGeometry()); m_positiveBundle->SetFiberColors(0, 255, 0); mitk::DataNode::Pointer node = mitk::DataNode::New(); node->SetData(m_positiveBundle); node->SetName("+Bundle"); - m_positivSelectedBundles= node; + m_positivBundlesNode= node; MITK_INFO << "The + Bundle has Streamlines:"; - auto m_NegStreamline= dynamic_cast<mitk::FiberBundle *>(m_positivSelectedBundles->GetData()); + auto m_NegStreamline= dynamic_cast<mitk::FiberBundle *>(m_positivBundlesNode->GetData()); MITK_INFO << m_NegStreamline->GetFiberPolyData()->GetNumberOfCells(); - this->GetDataStorage()->Add(m_positivSelectedBundles); + this->GetDataStorage()->Add(m_positivBundlesNode); // m_Controls->m_selectedPointSetWidget->m_ToggleAddPoint->setEnabled(false); UpdateGui(); } void QmitkInteractiveFiberDissectionView::ExtractRandomFibersFromTractogram() { m_Controls->m_ErazorButton->setChecked(false); MITK_INFO << "Number of Fibers to extract from Tractogram: "; MITK_INFO << m_Controls->m_NumRandomFibers->value(); if (this->GetDataStorage()->Exists(m_newfibersSelectedBundles)) { MITK_INFO << "To Label Bundle Exists"; mitk::FiberBundle::Pointer Stack = dynamic_cast<mitk::FiberBundle *>(m_newfibersSelectedBundles->GetData()); this->GetDataStorage()->Remove(m_newfibersSelectedBundles); mitk::DataNode::Pointer node = mitk::DataNode::New(); m_newfibersFibersData = vtkSmartPointer<vtkPolyData>::New(); m_newfibersFibersData->SetPoints(vtkSmartPointer<vtkPoints>::New()); m_newfibersBundle = mitk::FiberBundle:: New(m_newfibersFibersData); m_newfibersFibersData->SetLines(vtkSmartPointer<vtkCellArray>::New()); // node->SetData( m_newfibersBundle ); // m_newfibersSelectedBundles = node ; MITK_INFO << "Create Bundle"; } mitk::FiberBundle::Pointer fib = dynamic_cast<mitk::FiberBundle*>(m_SelectedFB.at(0)->GetData()); +// mitk::FiberBundle::Pointer fib = dynamic_cast<mitk::FiberBundle *>(m_trainbundle->GetData()); vtkSmartPointer<vtkPolyData> vNewPolyData = vtkSmartPointer<vtkPolyData>::New(); vtkSmartPointer<vtkCellArray> vNewLines = vtkSmartPointer<vtkCellArray>::New(); vtkSmartPointer<vtkPoints> vNewPoints = vtkSmartPointer<vtkPoints>::New(); unsigned int counter = 0; for ( int i=m_Controls->m_NumRandomFibers->value()*m_RandomExtractionCounter; i<m_Controls->m_NumRandomFibers->value()*(m_RandomExtractionCounter+1); i++) { vtkCell* cell = fib->GetFiberPolyData()->GetCell(i); auto numPoints = cell->GetNumberOfPoints(); vtkPoints* points = cell->GetPoints(); vtkSmartPointer<vtkPolyLine> container = vtkSmartPointer<vtkPolyLine>::New(); for (unsigned int j=0; j<numPoints; j++) { double p[3]; points->GetPoint(j, p); vtkIdType id = vNewPoints->InsertNextPoint(p); container->GetPointIds()->InsertNextId(id); } // weights->InsertValue(counter, fib->GetFiberWeight(i)); vNewLines->InsertNextCell(container); counter++; } vNewPolyData->SetLines(vNewLines); vNewPolyData->SetPoints(vNewPoints); m_newfibersFibersData = vtkSmartPointer<vtkPolyData>::New(); m_newfibersFibersData->SetPoints(vtkSmartPointer<vtkPoints>::New()); m_newfibersFibersData->SetLines(vtkSmartPointer<vtkCellArray>::New()); m_newfibersFibersData->SetPoints(vNewPoints); m_newfibersFibersData->SetLines(vNewLines); m_newfibersBundle = mitk::FiberBundle::New(vNewPolyData); m_newfibersBundle->SetFiberColors(255, 255, 255); mitk::DataNode::Pointer node = mitk::DataNode::New(); node->SetData(m_newfibersBundle); node->SetName("ToLabel"); m_newfibersSelectedBundles = node; // MITK_INFO << "Number of Streamlines in first function"; // MITK_INFO << m_newfibersSelectedBundles->GetData()->GetFiberPolyData()->GetNumberOfCells(); this->GetDataStorage()->Add(m_newfibersSelectedBundles); m_RandomExtractionCounter++; UpdateGui(); } void QmitkInteractiveFiberDissectionView::RemovefromBundle( bool checked ) { if (checked) { if (m_StreamlineInteractor.IsNull()) { this->CreateStreamlineInteractor(); // if (m_negativeSelectedBundles.IsNull()) // { mitk::FiberBundle::Pointer m_negativeBundle = mitk::FiberBundle::New(); mitk::DataNode::Pointer node = mitk::DataNode::New(); node->SetName("-Bundle"); node->SetData(m_negativeBundle); m_negativeSelectedBundles = node; this->GetDataStorage()->Add(m_negativeSelectedBundles); // } -// if (m_positivSelectedBundles.IsNull()) +// if (m_positivBundlesNode.IsNull()) // { // mitk::FiberBundle::Pointer m_positiveBundle = mitk::FiberBundle::New(); // mitk::DataNode::Pointer m_positiveSelectedBundles = mitk::DataNode::New(); // m_positiveSelectedBundles->SetName("+Bundle"); // m_positiveSelectedBundles->SetData(m_positiveBundle); // this->GetDataStorage()->Add(m_positiveSelectedBundles);) // } m_StreamlineInteractor->EnableInteraction(true); m_StreamlineInteractor->SetNegativeNode(m_negativeSelectedBundles); - m_StreamlineInteractor->SetPositiveNode(m_positivSelectedBundles); + m_StreamlineInteractor->SetPositiveNode(m_positivBundlesNode); m_StreamlineInteractor->SetToLabelNode(m_newfibersSelectedBundles); } else { m_StreamlineInteractor->EnableInteraction(true); + m_StreamlineInteractor->SetPositiveNode(m_positivBundlesNode); // MITK_INFO << "Number of Streamlines"; // MITK_INFO << m_newfibersSelectedBundles->GetData()->GetFiberPolyData()->GetNumberOfCells(); m_StreamlineInteractor->SetToLabelNode(m_newfibersSelectedBundles); } } else { m_StreamlineInteractor->EnableInteraction(false); // m_StreamlineInteractor = nullptr; } UpdateGui(); } void QmitkInteractiveFiberDissectionView::CreateStreamlineInteractor() { m_StreamlineInteractor = mitk::StreamlineInteractor::New(); m_StreamlineInteractor->LoadStateMachine("Streamline3DStates.xml", us::ModuleRegistry::GetModule("MitkFiberDissection")); m_StreamlineInteractor->SetEventConfig("Streamline3DConfig.xml", us::ModuleRegistry::GetModule("MitkFiberDissection")); // m_StreamlineInteractor->SetRotationEnabled(rotationEnabled); } void QmitkInteractiveFiberDissectionView::StartAlgorithm() { + m_IterationCounter += 1; +// m_UncertaintyLabel + this->GetDataStorage()->Remove(m_UncertaintyLabelNode); + + m_Controls->m_newlabeling->setChecked(false); + m_Controls->m_predlabeling->setChecked(false); // m_traindata.clear(); clusterer.reset(); MITK_INFO << "Extract Features"; m_negativeBundle = dynamic_cast<mitk::FiberBundle*>(m_negativeSelectedBundles->GetData()); clusterer = std::make_shared<mitk::StreamlineFeatureExtractor>(); clusterer->SetTractogramPlus(m_positiveBundle); clusterer->SetTractogramMinus(m_negativeBundle); clusterer->SetTractogramTest(dynamic_cast<mitk::FiberBundle*>(m_SelectedFB.at(0)->GetData()), m_SelectedFB.at(0)->GetName()); +// clusterer->SetTractogramTest(dynamic_cast<mitk::FiberBundle*>(m_trainbundle->GetData()), m_trainbundle->GetName()); // m_distances = clusterer->get clusterer->Update(); m_index = clusterer->m_index; // m_Prediction = clusterer->CreatePrediction(m_index.at(0)); // mitk::DataNode::Pointer node = mitk::DataNode::New(); // node->SetData(m_Prediction); // node->SetName("Prediction"); // m_PredictionNode = node; // this->GetDataStorage()->Add(m_PredictionNode); // m_UncertaintyLabel = clusterer->m_UncertaintyLabel; // mitk::DataNode::Pointer node2 = mitk::DataNode::New(); // node2->SetData(m_UncertaintyLabel); // node2->SetName("UncertaintyLabels"); // m_UncertaintyLabelNode = node2; // MITK_INFO << "Number of Streamlines in first function"; // MITK_INFO << m_newfibersSelectedBundles->GetData()->GetFiberPolyData()->GetNumberOfCells(); // this->GetDataStorage()->Add(m_UncertaintyLabelNode); // this->GetDataStorage()->Add(m_PredictionNode); // clusterer->GetData(); // MITK_INFO << data.at(0); // MITK_INFO << data.at(1); // cv::Ptr<cv::ml::TrainData> m_traindata = clusterer->GetData(); // MITK_INFO << clusterer->m_labels; // MITK_INFO << data.at(1); // MITK_INFO << "Start Classification"; // clusterer->CreateClassifier(); // cv::Mat curdata = clusterer->StartAlgorithm(); // MITK_INFO << curdata; MITK_INFO << "Algorithm run succesfully"; m_Controls->m_CreatePrediction->setEnabled(true); UpdateGui(); } void QmitkInteractiveFiberDissectionView::CreatePredictionNode() { MITK_INFO << "Create Prediction"; // clusterer->SetTractogramTest(dynamic_cast<mitk::FiberBundle*>(m_SelectedFB.at(0)->GetData()), m_SelectedFB.at(0)->GetName()); m_Prediction = clusterer->CreatePrediction(m_index.at(0)); mitk::DataNode::Pointer node = mitk::DataNode::New(); node->SetData(m_Prediction); node->SetName("Prediction"); m_PredictionNode = node; this->GetDataStorage()->Add(m_PredictionNode); UpdateGui(); } void QmitkInteractiveFiberDissectionView::CreateUncertaintySampleNode() { MITK_INFO << "Create Fibers to label"; std::vector<unsigned int> myvec = m_index.at(1); myvec.resize(m_Controls->m_Numtolabel->value()); MITK_INFO << m_index.at(1).size(); MITK_INFO << myvec.size(); // clusterer->SetTractogramTest(dynamic_cast<mitk::FiberBundle*>(m_SelectedFB.at(0)->GetData()), m_SelectedFB.at(0)->GetName())); m_UncertaintyLabel = clusterer->CreatePrediction(myvec); mitk::DataNode::Pointer node = mitk::DataNode::New(); node->SetData(m_UncertaintyLabel); node->SetName("UncertaintyLabel"); m_UncertaintyLabelNode = node; this->GetDataStorage()->Add(m_UncertaintyLabelNode); UpdateGui(); } void QmitkInteractiveFiberDissectionView::RemovefromUncertainty( bool checked ) { if (checked) { m_UncertaintyLabel->SetFiberColors(255, 255, 255); - m_StreamlineInteractor->EnableInteraction(true); - m_StreamlineInteractor->SetToLabelNode(m_UncertaintyLabelNode); + m_StreamlineInteractor->EnableInteraction(true); + m_StreamlineInteractor->SetToLabelNode(m_UncertaintyLabelNode); + } + else + { + m_StreamlineInteractor->EnableInteraction(false); +// m_StreamlineInteractor = nullptr; + } + RenderingManager::GetInstance()->RequestUpdateAll(); +} + +void QmitkInteractiveFiberDissectionView::RemovefromPrediction( bool checked ) +{ + if (checked) + { + + m_Prediction->SetFiberColors(255, 255, 255); + m_StreamlineInteractor->EnableInteraction(true); + m_StreamlineInteractor->SetToLabelNode(m_PredictionNode); } else { m_StreamlineInteractor->EnableInteraction(false); // m_StreamlineInteractor = nullptr; } } diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkInteractiveFiberDissectionView.h b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkInteractiveFiberDissectionView.h index ba0fa14..a0d7775 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkInteractiveFiberDissectionView.h +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkInteractiveFiberDissectionView.h @@ -1,151 +1,152 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QmitkInteractiveFiberDissectionView_h #define QmitkInteractiveFiberDissectionView_h #include "ui_QmitkInteractiveFiberDissectionViewControls.h" #include <QInputDialog> //Pointset #include <QmitkPointListWidget.h>//Pointset #include <QmitkAbstractView.h>//Pointset #include <QmitkSingleNodeSelectionWidget.h>//Pointset #include <mitkFiberBundle.h> #include <mitkDataInteractor.h> #include <mitkIRenderWindowPartListener.h> //Pointset #include <mitkStreamlineInteractor.h> #include <mitkStreamlineFeatureExtractor.h> #include <itkCastImageFilter.h> #include <itkVTKImageImport.h> #include <itkVTKImageExport.h> #include <itkRegionOfInterestImageFilter.h> #include <vtkLinearExtrusionFilter.h> #include <vtkPolyDataToImageStencil.h> #include <vtkSelectEnclosedPoints.h> #include <vtkImageImport.h> #include <vtkImageExport.h> #include <vtkImageStencil.h> #include <vtkSmartPointer.h> #include <vtkSelection.h> #include <vtkSelectionNode.h> #include <vtkExtractSelectedThresholds.h> #include <vtkFloatArray.h> #include <vtkCellPicker.h> /*! \brief View to process fiber bundles. Supplies methods to extract fibers from the bundle, fiber resampling, mirroring, join and subtract bundles and much more. */ class QmitkInteractiveFiberDissectionView : public QmitkAbstractView, public mitk::IRenderWindowPartListener { // this is needed for all Qt objects that should have a Qt meta-object // (everything that derives from QObject and wants to have signal/slots) Q_OBJECT public: typedef itk::Image< unsigned char, 3 > ItkUCharImageType; typedef itk::Image< float, 3 > ItkFloatImageType; static const std::string VIEW_ID; QmitkInteractiveFiberDissectionView(); virtual ~QmitkInteractiveFiberDissectionView(); virtual void CreateQtPartControl(QWidget *parent) override; /// /// Sets the focus to an internal widget. /// virtual void SetFocus() override; protected slots: void RenderWindowPartActivated(mitk::IRenderWindowPart* renderWindowPart) override; //Pointset void RenderWindowPartDeactivated(mitk::IRenderWindowPart* renderWindowPart) override; //Pointset void OnAddPointSetClicked();//Pointset void CreateStreamline(); void RemovefromBundle( bool checked ); void ExtractRandomFibersFromTractogram(); void StartAlgorithm(); void CreatePredictionNode(); void CreateUncertaintySampleNode(); void RemovefromUncertainty( bool checked ); + void RemovefromPrediction( bool checked ); void UpdateGui(); ///< update button activity etc. dpending on current datamanager selection protected: void OnCurrentSelectionChanged(QmitkSingleNodeSelectionWidget::NodeList nodes);//Pointset virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList<mitk::DataNode::Pointer>& nodes) override; void OnEndInteraction(); void CreateStreamlineInteractor(); Ui::QmitkInteractiveFiberDissectionViewControls* m_Controls; int m_IterationCounter; ///< used for data node naming int m_RandomExtractionCounter; ///< used for random extracton of different Streamlines std::vector<mitk::DataNode::Pointer> m_SelectedFB; ///< selected fiber bundle nodes - + mitk::DataNode::Pointer m_trainbundle; mitk::Image::Pointer m_SelectedImage; mitk::DataNode::Pointer m_SelectedPS; mitk::DataNode::Pointer m_SelectedImageNode; mitk::FiberBundle::Pointer m_positiveBundle; mitk::FiberBundle::Pointer m_newfibersBundle; mitk::FiberBundle::Pointer m_negativeBundle; mitk::FiberBundle::Pointer m_Prediction; mitk::FiberBundle::Pointer m_UncertaintyLabel; - mitk::DataNode::Pointer m_positivSelectedBundles; + mitk::DataNode::Pointer m_positivBundlesNode; mitk::DataNode::Pointer m_newfibersSelectedBundles; mitk::DataNode::Pointer m_negativeSelectedBundles; mitk::DataNode::Pointer m_PredictionNode; mitk::DataNode::Pointer m_UncertaintyLabelNode; vtkSmartPointer<vtkPolyData> m_positiveFibersData; vtkSmartPointer<vtkPolyData> m_newfibersFibersData; vtkSmartPointer<vtkCellPicker> m_picker1; mitk::StreamlineInteractor::Pointer m_StreamlineInteractor; std::shared_ptr< mitk::StreamlineFeatureExtractor > clusterer; std::vector<std::vector<unsigned int>> m_index; }; #endif // _QMITKFIBERTRACKINGVIEW_H_INCLUDED diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkInteractiveFiberDissectionViewControls.ui b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkInteractiveFiberDissectionViewControls.ui index 2317733..5c6c709 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkInteractiveFiberDissectionViewControls.ui +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkInteractiveFiberDissectionViewControls.ui @@ -1,658 +1,662 @@ <?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>QmitkInteractiveFiberDissectionViewControls</class> <widget class="QWidget" name="QmitkInteractiveFiberDissectionViewControls"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>417</width> <height>711</height> </rect> </property> <property name="windowTitle"> <string>Form</string> </property> <property name="styleSheet"> <string>QCommandLinkButton:disabled { border: none; } QGroupBox { background-color: transparent; }</string> </property> <layout class="QGridLayout" name="gridLayout_3"> <property name="leftMargin"> <number>9</number> </property> <property name="topMargin"> <number>9</number> </property> <property name="rightMargin"> <number>9</number> </property> <property name="bottomMargin"> <number>9</number> </property> - <item row="0" column="0"> - <widget class="QGroupBox" name="m_InputData"> - <property name="title"> - <string>Please Select Input Data</string> - </property> - <layout class="QGridLayout" name="gridLayout_9"> - <property name="leftMargin"> - <number>6</number> - </property> - <property name="topMargin"> - <number>6</number> - </property> - <property name="rightMargin"> - <number>6</number> - </property> - <property name="bottomMargin"> - <number>6</number> - </property> - <item row="0" column="0"> - <widget class="QLabel" name="label_2"> - <property name="toolTip"> - <string>Input DTI</string> - </property> - <property name="text"> - <string>Fiber Bundle:</string> - </property> - </widget> - </item> - <item row="0" column="1"> - <widget class="QLabel" name="m_FibLabel"> - <property name="text"> - <string><html><head/><body><p><span style=" color:#ff0000;">mandatory</span></p></body></html></string> - </property> - <property name="wordWrap"> - <bool>true</bool> - </property> - </widget> - </item> - </layout> - </widget> - </item> <item row="1" column="0"> <widget class="QToolBox" name="toolBoxx"> <property name="enabled"> <bool>true</bool> </property> <property name="font"> <font> <bold>true</bold> </font> </property> <property name="toolTip"> <string>Label Fibers</string> </property> <property name="frameShape"> <enum>QFrame::NoFrame</enum> </property> <property name="currentIndex"> - <number>2</number> + <number>0</number> </property> <property name="tabSpacing"> <number>6</number> </property> <widget class="QWidget" name="page_3"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>399</width> - <height>492</height> + <height>464</height> </rect> </property> <attribute name="label"> <string>Fiber Creation</string> </attribute> <layout class="QGridLayout" name="gridLayout_7"> <item row="0" column="0"> <widget class="QFrame" name="frame"> <property name="frameShape"> <enum>QFrame::StyledPanel</enum> </property> <property name="frameShadow"> <enum>QFrame::Raised</enum> </property> <layout class="QGridLayout" name="gridLayout_11"> <item row="0" column="0"> <widget class="QLabel" name="m_selectedPointSetLabel"> <property name="text"> <string>Selected Streamline Pointset</string> </property> </widget> </item> <item row="2" column="1"> <spacer name="horizontalSpacer_14"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item row="4" column="0" colspan="2"> <widget class="QGroupBox" name="groupBox"> <property name="title"> <string>Streamline Points</string> </property> <layout class="QGridLayout" name="gridLayout_10"> <item row="0" column="0"> <widget class="QmitkPointListWidget" name="m_poinSetListWidget" native="true"/> </item> <item row="1" column="0"> <spacer name="verticalSpacer_7"> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>40</height> </size> </property> </spacer> </item> </layout> </widget> </item> <item row="1" column="1"> <spacer name="horizontalSpacer_13"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item row="0" column="1"> <spacer name="horizontalSpacer_12"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item row="2" column="0"> <widget class="QPushButton" name="m_addPointSetPushButton"> <property name="text"> <string>Add new Streamline Pointset</string> </property> </widget> </item> <item row="1" column="0"> <widget class="QmitkSingleNodeSelectionWidget" name="m_selectedPointSetWidget" native="true"> <property name="sizePolicy"> <sizepolicy hsizetype="Preferred" vsizetype="Minimum"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="minimumSize"> <size> <width>0</width> <height>40</height> </size> </property> </widget> </item> <item row="6" column="0"> <spacer name="verticalSpacer_3"> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>40</height> </size> </property> </spacer> </item> <item row="7" column="0"> <widget class="QPushButton" name="m_StreamlineCreation"> <property name="text"> <string>Create Streamline</string> </property> </widget> </item> </layout> </widget> </item> </layout> </widget> <widget class="QWidget" name="page_2"> <property name="enabled"> <bool>true</bool> </property> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>414</width> - <height>478</height> + <height>450</height> </rect> </property> <property name="accessibleName"> <string/> </property> <attribute name="label"> <string>Fiber Labelling</string> </attribute> <attribute name="toolTip"> <string>Dissect/Eraze Fibers by Erasion and Highlighting</string> </attribute> <layout class="QGridLayout" name="gridLayout_13"> <item row="4" column="0"> <spacer name="verticalSpacer_4"> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>40</height> </size> </property> </spacer> </item> <item row="1" column="0"> <widget class="QFrame" name="m_LabelFrame"> <property name="enabled"> <bool>true</bool> </property> <property name="cursor"> <cursorShape>ArrowCursor</cursorShape> </property> <property name="frameShape"> <enum>QFrame::NoFrame</enum> </property> <property name="frameShadow"> <enum>QFrame::Raised</enum> </property> <layout class="QGridLayout" name="gridLayout_4"> <item row="0" column="0"> <widget class="QLabel" name="label"> <property name="text"> <string>Label individual Streamlines</string> </property> </widget> </item> </layout> </widget> </item> <item row="2" column="0"> <widget class="QLabel" name="label_3"> <property name="text"> <string>Streamlines to be labeled</string> </property> </widget> </item> <item row="3" column="0"> <widget class="QFrame" name="m_ExtractionToolsFrame"> <property name="frameShape"> <enum>QFrame::StyledPanel</enum> </property> <property name="frameShadow"> <enum>QFrame::Raised</enum> </property> <layout class="QGridLayout" name="gridLayout_2"> <item row="5" column="2"> <widget class="QLabel" name="label_4"> <property name="text"> <string>Label Streamlines</string> </property> </widget> </item> <item row="5" column="3"> <widget class="QPushButton" name="m_ErazorButton"> <property name="maximumSize"> <size> <width>30</width> <height>30</height> </size> </property> <property name="text"> <string/> </property> <property name="icon"> <iconset> <normaloff>:/org.mitk.gui.qt.diffusionimaging.fiberprocessing/resources/eraze.png</normaloff>:/org.mitk.gui.qt.diffusionimaging.fiberprocessing/resources/eraze.png</iconset> </property> <property name="iconSize"> <size> <width>32</width> <height>32</height> </size> </property> <property name="flat"> <bool>true</bool> </property> </widget> </item> <item row="6" column="2"> <widget class="QLabel" name="label_6"> <property name="text"> <string>Reject: Rightclick + shift</string> </property> </widget> </item> <item row="2" column="7" colspan="3"> <spacer name="horizontalSpacer_2"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item row="2" column="2" colspan="2"> <widget class="QLabel" name="label_7"> <property name="text"> <string>Random Streamlines</string> </property> </widget> </item> <item row="7" column="3" colspan="5"> <spacer name="horizontalSpacer_8"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item row="5" column="4" colspan="5"> <spacer name="horizontalSpacer"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item row="6" column="3" colspan="6"> <spacer name="horizontalSpacer_3"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item row="2" column="6"> <widget class="QPushButton" name="m_AddRandomFibers"> <property name="text"> <string>Add</string> </property> </widget> </item> <item row="7" column="2"> <widget class="QLabel" name="label_8"> <property name="text"> <string>Accept: Rightclick + alt</string> </property> </widget> </item> <item row="8" column="2"> <spacer name="verticalSpacer_2"> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>40</height> </size> </property> </spacer> </item> <item row="2" column="4"> <widget class="QSpinBox" name="m_NumRandomFibers"> <property name="minimum"> <number>1</number> </property> <property name="maximum"> <number>2000</number> </property> <property name="value"> <number>10</number> </property> </widget> </item> </layout> </widget> </item> </layout> </widget> <widget class="QWidget" name="page_4"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>399</width> - <height>492</height> + <height>464</height> </rect> </property> <attribute name="label"> <string>Active Learning</string> </attribute> <widget class="QFrame" name="frame_2"> <property name="geometry"> <rect> <x>9</x> <y>9</y> <width>341</width> <height>391</height> </rect> </property> <property name="frameShape"> <enum>QFrame::StyledPanel</enum> </property> <property name="frameShadow"> <enum>QFrame::Raised</enum> </property> <layout class="QGridLayout" name="gridLayout_6"> <item row="2" column="3"> <spacer name="horizontalSpacer_7"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item row="0" column="3"> <spacer name="horizontalSpacer_4"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>84</width> <height>22</height> </size> </property> </spacer> </item> <item row="4" column="1"> - <widget class="QPushButton" name="pushButton"> + <widget class="QPushButton" name="m_predlabeling"> <property name="text"> <string>Pred_Label</string> </property> </widget> </item> <item row="3" column="0"> <widget class="QLabel" name="label_5"> <property name="text"> <string>To be labeled</string> </property> </widget> </item> <item row="1" column="3"> <spacer name="horizontalSpacer_5"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item row="1" column="0" colspan="3"> <widget class="QPushButton" name="m_CreatePrediction"> <property name="text"> <string>Create Prediction</string> </property> </widget> </item> <item row="2" column="0" colspan="3"> <widget class="QPushButton" name="m_CreateUncertantyMap"> <property name="text"> <string>Create Uncertanty Map</string> </property> </widget> </item> <item row="4" column="0"> <widget class="QPushButton" name="m_newlabeling"> <property name="text"> <string>Uncertainty_Label</string> </property> <property name="icon"> <iconset theme="eraze.png"> <normaloff>.</normaloff>.</iconset> </property> </widget> </item> <item row="3" column="3"> <spacer name="horizontalSpacer_6"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item row="3" column="1"> <widget class="QSpinBox" name="m_Numtolabel"> <property name="minimum"> <number>5</number> </property> <property name="maximum"> <number>500</number> </property> <property name="value"> <number>10</number> </property> </widget> </item> <item row="0" column="0" colspan="3"> <widget class="QPushButton" name="m_TrainClassifier"> <property name="text"> <string>Train Classifier</string> </property> </widget> </item> <item row="3" column="2"> <widget class="QPushButton" name="m_AddUncertainFibers"> <property name="text"> <string>Add </string> </property> </widget> </item> <item row="6" column="2"> <spacer name="verticalSpacer_6"> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>40</height> </size> </property> </spacer> </item> </layout> </widget> </widget> </widget> </item> <item row="2" column="0" rowspan="2"> <spacer name="verticalSpacer"> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Fixed</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>40</height> </size> </property> </spacer> </item> + <item row="0" column="0"> + <widget class="QGroupBox" name="m_InputData"> + <property name="title"> + <string>Please Select Input Data</string> + </property> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QLabel" name="label_2"> + <property name="toolTip"> + <string>Input DTI</string> + </property> + <property name="text"> + <string>Fiber Bundle:</string> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="m_FibLabel"> + <property name="text"> + <string><html><head/><body><p><span style=" color:#ff0000;">mandatory</span></p></body></html></string> + </property> + <property name="wordWrap"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QmitkSingleNodeSelectionWidget" name="m_trainbundleWidget" native="true"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Minimum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>0</width> + <height>40</height> + </size> + </property> + </widget> + </item> + </layout> + </widget> + </item> </layout> </widget> <customwidgets> <customwidget> <class>QmitkSingleNodeSelectionWidget</class> <extends>QWidget</extends> <header location="global">QmitkSingleNodeSelectionWidget.h</header> </customwidget> <customwidget> <class>QmitkPointListWidget</class> <extends>QWidget</extends> <header location="global">QmitkPointListWidget.h</header> </customwidget> </customwidgets> <resources/> <connections/> </ui>