diff --git a/Modules/FiberDissection/MachineLearning/mitkStreamlineFeatureExtractor.cpp b/Modules/FiberDissection/MachineLearning/mitkStreamlineFeatureExtractor.cpp index 89558c7..b0c1fdd 100644 --- a/Modules/FiberDissection/MachineLearning/mitkStreamlineFeatureExtractor.cpp +++ b/Modules/FiberDissection/MachineLearning/mitkStreamlineFeatureExtractor.cpp @@ -1,431 +1,515 @@ /*=================================================================== 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 #include #include #include 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) + +void StreamlineFeatureExtractor::SetTractogramTest(const mitk::FiberBundle::Pointer &TractogramTest, std::string TractogramTestName) { - m_TractogramTest = TractogramTest; + 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"); } + std::vector > StreamlineFeatureExtractor::ResampleFibers(mitk::FiberBundle::Pointer tractogram) { mitk::FiberBundle::Pointer temp_fib = tractogram->GetDeepCopy(); temp_fib->ResampleToNumPoints(m_NumPoints); std::vector< vnl_matrix > out_fib; for (int i=0; iGetFiberPolyData()->GetNumberOfCells(); i++) { vtkCell* cell = temp_fib->GetFiberPolyData()->GetCell(i); int numPoints = cell->GetNumberOfPoints(); vtkPoints* points = cell->GetPoints(); vnl_matrix streamline; streamline.set_size(3, m_NumPoints); streamline.fill(0.0); for (int j=0; jGetPoint(j, cand); 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 > StreamlineFeatureExtractor::CalculateDmdf(std::vector > tractogram, std::vector > prototypes) { std::vector< vnl_matrix > dist_vec; for (unsigned int i=0; i distances; distances.set_size(1, prototypes.size()); distances.fill(0.0); for (unsigned int j=0; j single_distances; single_distances.set_size(1, tractogram.at(0).cols()); single_distances.fill(0.0); vnl_matrix 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 single_distances.mean()) { distances.put(0,j, single_distances.mean()); } else { distances.put(0,j, single_distances_flip.mean()); } } dist_vec.push_back(distances); } return dist_vec; } std::vector StreamlineFeatureExtractor::GetData() { MITK_INFO << "Start Function Ged Data"; - int labels_arr [m_DistancesPlus.size()+m_DistancesMinus.size()]; +// int labels_arr [m_DistancesPlus.size()+m_DistancesMinus.size()]; + float labels_arr [m_DistancesPlus.size()+m_DistancesMinus.size()]; cv::Mat data; + cv::Mat labels_arr_vec; int size_plus = 0; for ( unsigned int i=0; i(i,j) << ", "; + weights.push_back(plusval); + } + else { + weights.push_back(minusval); } - outputFile << endl; - } + MITK_INFO << "Weights"; + MITK_INFO << plusval; + MITK_INFO << minusval; + cv::Mat newweight; - std::fstream outputFile2; - outputFile2.open( "/home/r948e/samples.csv", std::ios::out ) ; + newweight.push_back(zerosgt); + newweight.push_back(onesgt); - for(int i=0; i(i,j) << ", "; - } - outputFile2 << endl; - } + +// cv::Mat labels(m_DistancesPlus.size()+m_DistancesMinus.size(), 1, CV_32S, labels_arr); + cv::Mat labels(m_DistancesPlus.size()+m_DistancesMinus.size(), 1, CV_32F, labels_arr); + + // } // MITK_INFO << "data"; // MITK_INFO << data; - MITK_INFO << "labels"; - MITK_INFO << labels; +// MITK_INFO << "labels"; +// MITK_INFO << labels; cv::Ptr m_traindata = cv::ml::TrainData::create(data, cv::ml::ROW_SAMPLE, labels); +// m_traindata->setTrainTestSplitRatio(1, true); m_traindata->shuffleTrainTest(); - MITK_INFO << m_traindata->getResponses(); MITK_INFO << "Start Training"; - auto random_forest = cv::ml::RTrees::create(); + auto statistic_model = cv::ml::RTrees::create(); + +//// auto criteria = cv::TermCriteria(); +//// criteria.type = cv::TermCriteria::EPS + cv::TermCriteria::MAX_ITER; +//// criteria.epsilon = 1e-8; +//// criteria.maxCount = 5000; + + statistic_model->setMaxCategories(2); + statistic_model->setMaxDepth(3); + statistic_model->setMinSampleCount(1); + statistic_model->setTruncatePrunedTree(true); + statistic_model->setUse1SERule(true); + statistic_model->setUseSurrogates(false); + statistic_model->setTermCriteria(cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::MAX_ITER, 800, 1e-6)); + statistic_model->setCVFolds(1); + statistic_model->setPriors(newweight); + + statistic_model->train(m_traindata); + +// auto logistic_regression = cv::ml::LogisticRegression::create(); -// auto criteria = cv::TermCriteria(); -// criteria.type = cv::TermCriteria::EPS + cv::TermCriteria::MAX_ITER; -// criteria.epsilon = 1e-8; -// criteria.maxCount = 5000; +// statistic_model->setLearningRate(0.001); +// statistic_model->setIterations(100); +// statistic_model->setRegularization(cv::ml::LogisticRegression::REG_L2); +// statistic_model->setTrainMethod(cv::ml::LogisticRegression::MINI_BATCH); +// statistic_model->setMiniBatchSize(100); - random_forest->setMaxCategories(2); - random_forest->setMaxDepth(50); - random_forest->setMinSampleCount(1); - random_forest->setTruncatePrunedTree(true); - random_forest->setUse1SERule(true); - random_forest->setUseSurrogates(false); - random_forest->setTermCriteria(cv::TermCriteria(5000, 800, 1e-6)); - random_forest->setCVFolds(1); - random_forest->train(m_traindata); +// statistic_model->train(m_traindata); + MITK_INFO << "Predicting"; cv::Mat dataTest; + for ( unsigned int i=0; i(i,j) << ", "; - } - outputFile3 << endl; - - } - -// parallel_for (size_t(0), m_DistancesTest.size(), [&](size_t i)) -// { -// float data_arr [m_DistancesTest.at(0).size()]; -// for (int j = 0; j < size; j++) -// { -// data_arr[j] = m_DistancesTest.at(i).get(0,j); -// } -// cv::Mat curdata(1, m_DistancesTest.at(0).size(), CV_32F, data_arr); -// MITK_INFO << curdata; -// dataTest.push_back(curdata); -// }); -// cv::Mat pred; + cv::Mat vote; + cv::Mat pred; - int val; - std::vector pred; +// int val; +// std::vector pred; std::vector index; - for (unsigned int i = 0; i < m_DistancesTest.size(); i++) - { - val = random_forest->predict(dataTest.row(i)); - pred.push_back(val); - MITK_INFO << val; - - // random_forest->getVotes(dataTest, ); - if (val==1) - { - index.push_back(i); - } - } - - +// for (unsigned int i = 0; i < m_DistancesTest.size(); i++) +// { +//// MITK_INFO << dataTest.row(i); +// val = statistic_model->predict(dataTest.row(i)); +// pred.push_back(val); + +// if (val==1) +// { +// index.push_back(i); +// } +// } + statistic_model->getTermCriteria(); + statistic_model->getVotes(dataTest, vote, 0); + statistic_model->predict(dataTest, pred); + + MITK_INFO << pred; +// mitke_INFO << vote; +//// MITK_INFO << vote;s + MITK_INFO << vote.cols; + MITK_INFO << vote.rows; + MITK_INFO << "_______"; + int one = cv::countNonZero(vote); + MITK_INFO << one; + int zerorows = vote.rows - cv::countNonZero(vote); + MITK_INFO << zerorows; + + index.push_back(1); return index; } void StreamlineFeatureExtractor::CreatePrediction(std::vector &index) { MITK_INFO << "Create Bundle"; vtkSmartPointer FibersData; FibersData = vtkSmartPointer::New(); FibersData->SetPoints(vtkSmartPointer::New()); FibersData->SetLines(vtkSmartPointer::New()); vtkSmartPointer vNewPolyData = vtkSmartPointer::New(); vtkSmartPointer vNewLines = vtkSmartPointer::New(); vtkSmartPointer vNewPoints = vtkSmartPointer::New(); unsigned int indexSize = index.size(); unsigned int counter = 0; MITK_INFO << "Start Loop"; for (unsigned int i=0; iGetFiberPolyData()->GetCell(index[i]); auto numPoints = cell->GetNumberOfPoints(); vtkPoints* points = cell->GetPoints(); vtkSmartPointer container = vtkSmartPointer::New(); for (unsigned int j=0; jGetPoint(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::New(); FibersData->SetPoints(vtkSmartPointer::New()); FibersData->SetLines(vtkSmartPointer::New()); FibersData->SetPoints(vNewPoints); FibersData->SetLines(vNewLines); m_Prediction = mitk::FiberBundle::New(vNewPolyData); // Bundle->SetFiberColors(255, 255, 255); MITK_INFO << "Cells Prediciton"; MITK_INFO << m_Prediction->GetFiberPolyData()->GetNumberOfCells(); MITK_INFO << "Cells Tractorgram"; MITK_INFO << m_TractogramTest->GetFiberPolyData()->GetNumberOfCells(); } void StreamlineFeatureExtractor::GenerateData() { MITK_INFO << "Update"; - mitk::FiberBundle::Pointer inputPrototypes = mitk::IOUtil::Load("/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); - T_TractogramTest= ResampleFibers(m_TractogramTest); - - MITK_INFO << "Calculate Features..."; - m_DistancesPlus = CalculateDmdf(T_TractogramPlus, T_Prototypes); - m_DistancesMinus = CalculateDmdf(T_TractogramMinus, T_Prototypes); - m_DistancesTest= CalculateDmdf(T_TractogramTest, T_Prototypes); - - 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"; - std::vector index =GetData(); - CreatePrediction (index); + mitk::FiberBundle::Pointer inputPrototypes = mitk::IOUtil::Load("/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); + + + + 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 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; + T_TractogramTest= ResampleFibers(m_TractogramTest); + 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"; + std::vector index =GetData(); +// CreatePrediction (index); } //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/Modules/FiberDissection/MachineLearning/mitkStreamlineFeatureExtractor.h b/Modules/FiberDissection/MachineLearning/mitkStreamlineFeatureExtractor.h index 7f41954..3069f60 100644 --- a/Modules/FiberDissection/MachineLearning/mitkStreamlineFeatureExtractor.h +++ b/Modules/FiberDissection/MachineLearning/mitkStreamlineFeatureExtractor.h @@ -1,95 +1,96 @@ /*=================================================================== 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 StreamlineFeatureExtractor_h #define StreamlineFeatureExtractor_h #include "MitkFiberDissectionExports.h" // MITK #include #include // ITK #include // VTK #include #include #include #include #include // OpenCV #include #include #include namespace mitk{ /** * \brief */ class MITKFIBERDISSECTION_EXPORT StreamlineFeatureExtractor { public: StreamlineFeatureExtractor(); ~StreamlineFeatureExtractor(); typedef itk::Image< float, 3 > FloatImageType; typedef itk::Image< unsigned char, 3 > UcharImageType; void Update(){ this->GenerateData(); } void SetTractogramPlus(const mitk::FiberBundle::Pointer &Tractogram); void SetTractogramMinus(const mitk::FiberBundle::Pointer &Tractogram); - void SetTractogramTest(const mitk::FiberBundle::Pointer &Tractogram); + void SetTractogramTest(const mitk::FiberBundle::Pointer &Tractogram, std::string TractogramTestName); void CreateClassifier(); std::vector GetData(); void CreatePrediction(std::vector &index); mitk::FiberBundle::Pointer m_Prediction; protected: void GenerateData(); std::vector< vnl_matrix > ResampleFibers(FiberBundle::Pointer tractogram); std::vector > CalculateDmdf(std::vector > tractogram, std::vector > prototypes); unsigned int m_NumPoints; mitk::FiberBundle::Pointer m_TractogramPlus; mitk::FiberBundle::Pointer m_TractogramMinus; mitk::FiberBundle::Pointer m_TractogramTest; + std::string m_DistancesTestName; std::vector > T_Prototypes; std::vector > T_TractogramPlus; std::vector > T_TractogramMinus; std::vector > T_TractogramTest; std::vector > m_DistancesPlus; std::vector > m_DistancesMinus; std::vector > m_DistancesTest; cv::Ptr m_traindata; }; } #endif 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 ae7f79a..35da9b2 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,634 +1,638 @@ /*=================================================================== 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 #include #include // Qmitk #include "QmitkInteractiveFiberDissectionView.h" #include //Pointset #include //Pointset #include #include #include #include #include #include #include #include "mitkNodePredicateDataType.h" #include #include #include #include //#include #include #include "usModuleRegistry.h" //#include #include #include #include #include #include #include #include #include #include #include #include #include #include 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::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 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_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("mandatory"); 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_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); 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 nfibSelected = m_newfibersSelectedBundles.IsNotNull(); // bool posSelected = !m_positivSelectedBundles.IsNotNull(); // bool negSelected = !m_negativeSelectedBundles.IsNotNull(); bool posSelected = this->GetDataStorage()->Exists(m_positivSelectedBundles); bool negSelected = this->GetDataStorage()->Exists(m_negativeSelectedBundles); // 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); } } 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(); UpdateGui(); } void QmitkInteractiveFiberDissectionView::OnSelectionChanged(berry::IWorkbenchPart::Pointer /*part*/, const QList& 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(node->GetData())) m_SelectedImage = dynamic_cast(node->GetData()); else if ( dynamic_cast(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()) { mitk::DataNode::Pointer node = mitk::DataNode::New(); m_positiveFibersData = vtkSmartPointer::New(); m_positiveFibersData->SetPoints(vtkSmartPointer::New()); m_positiveFibersData->SetLines(vtkSmartPointer::New()); m_positiveBundle = mitk::FiberBundle:: New(m_positiveFibersData); node->SetData( m_positiveBundle ); m_positivSelectedBundles = node; this->GetDataStorage()->Add(m_positivSelectedBundles); MITK_INFO << "Create Bundle"; } if (!m_positivSelectedBundles.IsNull()) { this->GetDataStorage()->Remove(m_positivSelectedBundles); MITK_INFO << "Adding fibers"; } mitk::PointSet::Pointer pointSet = dynamic_cast(m_SelectedPS->GetData()); vnl_matrix 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 vNewPolyData = vtkSmartPointer::New(); vtkSmartPointer vNewLines = vtkSmartPointer::New(); vtkSmartPointer vNewPoints = vtkSmartPointer::New(); unsigned int counter = 0; for (unsigned int i=0; iGetNumberOfCells(); ++i) { vtkCell* cell = m_positiveFibersData->GetCell(i); auto numPoints = cell->GetNumberOfPoints(); vtkPoints* points = cell->GetPoints(); vtkSmartPointer container = vtkSmartPointer::New(); for (unsigned int j=0; jGetPoint(j, p); vtkIdType id = vNewPoints->InsertNextPoint(p); container->GetPointIds()->InsertNextId(id); } vNewLines->InsertNextCell(container); counter++; } // build Fiber vtkSmartPointer container = vtkSmartPointer::New(); for (unsigned int j=0; jInsertNextPoint(p); container->GetPointIds()->InsertNextId(id); } vNewLines->InsertNextCell(container); vNewPolyData->SetPoints(vNewPoints); vNewPolyData->SetLines(vNewLines); m_positiveFibersData = vtkSmartPointer::New(); m_positiveFibersData->SetPoints(vtkSmartPointer::New()); m_positiveFibersData->SetLines(vtkSmartPointer::New()); m_positiveFibersData->SetPoints(vNewPoints); m_positiveFibersData->SetLines(vNewLines); m_positiveBundle = mitk::FiberBundle::New(vNewPolyData); // m_positiveBundle->SetTrackVisHeader(dynamic_cast(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; MITK_INFO << "The + Bundle has Streamlines:"; auto m_NegStreamline= dynamic_cast(m_positivSelectedBundles->GetData()); MITK_INFO << m_NegStreamline->GetFiberPolyData()->GetNumberOfCells(); this->GetDataStorage()->Add(m_positivSelectedBundles); 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(m_newfibersSelectedBundles->GetData()); this->GetDataStorage()->Remove(m_newfibersSelectedBundles); mitk::DataNode::Pointer node = mitk::DataNode::New(); m_newfibersFibersData = vtkSmartPointer::New(); m_newfibersFibersData->SetPoints(vtkSmartPointer::New()); m_newfibersBundle = mitk::FiberBundle:: New(m_newfibersFibersData); m_newfibersFibersData->SetLines(vtkSmartPointer::New()); // node->SetData( m_newfibersBundle ); // m_newfibersSelectedBundles = node ; MITK_INFO << "Create Bundle"; } mitk::FiberBundle::Pointer fib = dynamic_cast(m_SelectedFB.at(0)->GetData()); vtkSmartPointer vNewPolyData = vtkSmartPointer::New(); vtkSmartPointer vNewLines = vtkSmartPointer::New(); vtkSmartPointer vNewPoints = vtkSmartPointer::New(); unsigned int counter = 0; for ( int i=m_Controls->m_NumRandomFibers->value()*m_RandomExtractionCounter; im_NumRandomFibers->value()*(m_RandomExtractionCounter+1); i++) { vtkCell* cell = fib->GetFiberPolyData()->GetCell(i); auto numPoints = cell->GetNumberOfPoints(); vtkPoints* points = cell->GetPoints(); vtkSmartPointer container = vtkSmartPointer::New(); for (unsigned int j=0; jGetPoint(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::New(); m_newfibersFibersData->SetPoints(vtkSmartPointer::New()); m_newfibersFibersData->SetLines(vtkSmartPointer::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()) // { // 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->SetToLabelNode(m_newfibersSelectedBundles); } else { m_StreamlineInteractor->EnableInteraction(true); // 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_traindata.clear(); MITK_INFO << "Extract Features"; m_negativeBundle = dynamic_cast(m_negativeSelectedBundles->GetData()); std::shared_ptr< mitk::StreamlineFeatureExtractor > clusterer = std::make_shared(); clusterer->SetTractogramPlus(m_positiveBundle); clusterer->SetTractogramMinus(m_negativeBundle); - clusterer->SetTractogramTest(dynamic_cast(m_SelectedFB.at(0)->GetData())); + clusterer->SetTractogramTest(dynamic_cast(m_SelectedFB.at(0)->GetData()), m_SelectedFB.at(0)->GetName()); + +// m_distances = clusterer->get + clusterer->Update(); m_Prediction = clusterer->m_Prediction; mitk::DataNode::Pointer node = mitk::DataNode::New(); node->SetData(m_Prediction); node->SetName("Prediction"); m_PredictionNode = node; // MITK_INFO << "Number of Streamlines in first function"; // MITK_INFO << m_newfibersSelectedBundles->GetData()->GetFiberPolyData()->GetNumberOfCells(); this->GetDataStorage()->Add(m_PredictionNode); // clusterer->GetData(); // MITK_INFO << data.at(0); // MITK_INFO << data.at(1); // cv::Ptr 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"; + }