diff --git a/Modules/DiffusionImaging/MiniApps/CMakeLists.txt b/Modules/DiffusionImaging/MiniApps/CMakeLists.txt index a38a6bad2f..cfdc158334 100755 --- a/Modules/DiffusionImaging/MiniApps/CMakeLists.txt +++ b/Modules/DiffusionImaging/MiniApps/CMakeLists.txt @@ -1,67 +1,68 @@ OPTION(BUILD_DiffusionMiniApps "Build commandline tools for diffusion" OFF) IF(BUILD_DiffusionMiniApps OR MITK_BUILD_ALL_APPS) # include necessary modules here MITK_CHECK_MODULE(_RESULT DiffusionCore FiberTracking ) IF(_RESULT) MESSAGE("Warning: DiffusionMiniApps is missing ${_RESULT}") ELSE(_RESULT) MITK_USE_MODULE( DiffusionCore FiberTracking ) # needed include directories INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${ALL_INCLUDE_DIRECTORIES}) PROJECT( mitkDiffusionMiniApps ) # fill in the standalone executables here SET(DIFFUSIONMINIAPPS mitkDiffusionMiniApps ) # set additional files here SET(DIFFUSIONCORE_ADDITIONAL_FILES MiniAppManager.cpp FileFormatConverter.cpp TensorReconstruction.cpp QballReconstruction.cpp DiffusionIndices.cpp CopyGeometry.cpp GibbsTracking.cpp StreamlineTracking.cpp FiberProcessing.cpp LocalDirectionalFiberPlausibility.cpp #TractogramAngularError.cpp FiberDirectionExtraction.cpp PeakExtraction.cpp PeaksAngularError.cpp MultishellMethods.cpp FiberFoxProcessing.cpp ExportShImage.cpp + NetworkCreation.cpp ) # deprecated # FOREACH(tool ${DIFFUSIONMINIAPPS}) # ADD_EXECUTABLE( # ${tool} # ${tool}.cpp # ${DIFFUSIONCORE_ADDITIONAL_FILES} # ) # TARGET_LINK_LIBRARIES( # ${tool} # ${ALL_LIBRARIES} ) # ENDFOREACH(tool) mitk_create_executable(mitkDiffusionMiniApps - DEPENDS DiffusionCore FiberTracking + DEPENDS DiffusionCore FiberTracking Connectomics ) ENDIF() MITK_INSTALL_TARGETS(EXECUTABLES mitkDiffusionMiniApps ) ENDIF(BUILD_DiffusionMiniApps) diff --git a/Modules/DiffusionImaging/MiniApps/NetworkCreation.cpp b/Modules/DiffusionImaging/MiniApps/NetworkCreation.cpp new file mode 100644 index 0000000000..dd785654af --- /dev/null +++ b/Modules/DiffusionImaging/MiniApps/NetworkCreation.cpp @@ -0,0 +1,143 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical and Biological Informatics. +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 "MiniAppManager.h" + +// std includes +#include + +// CTK includes +#include "ctkCommandLineParser.h" + +// MITK includes +#include +#include +#include +#include +#include "mitkConnectomicsNetworkCreator.h" + +int NetworkCreation(int argc, char* argv[]) +{ + ctkCommandLineParser parser; + parser.setArgumentPrefix("--", "-"); + parser.addArgument("fiberImage", "f", ctkCommandLineParser::String, "input fiber image (.fib)", us::Any(), false); + parser.addArgument("parcellation", "p", ctkCommandLineParser::String, "parcellation image", us::Any(), false); + parser.addArgument("outputNetwork", "o", ctkCommandLineParser::String, "where to save the ouput (.cnf)", us::Any(), false); + + parser.addArgument("radius", "r", ctkCommandLineParser::Int, "Search radius in mm", 15, false); + parser.addArgument("centerOfMass", "com", ctkCommandLineParser::Bool, "Use center of mass for node positions", true, false); + + + map parsedArgs = parser.parseArguments(argc, argv); + if (parsedArgs.size()==0) + return EXIT_FAILURE; + + //default values + int searchRadius( 15 ); + bool centerOfMass( true ); + + // parse command line arguments + std::string fiberFilename = us::any_cast(parsedArgs["fiberImage"]); + std::string parcellationFilename = us::any_cast(parsedArgs["parcellation"]); + std::string outputFilename = us::any_cast(parsedArgs["outputNetwork"]); + + if (parsedArgs.count("radius")) + searchRadius = us::any_cast(parsedArgs["radius"]); + + + if (parsedArgs.count("centerOfMass")) + centerOfMass = us::any_cast(parsedArgs["centerOfMass"]); + + try + { + // registering Factories + RegisterDiffusionCoreObjectFactory(); + RegisterFiberTrackingObjectFactory(); + RegisterConnectomicsObjectFactory(); + + const std::string s1="", s2=""; + + // load fiber image + std::vector fiberInfile = + mitk::BaseDataIO::LoadBaseDataFromFile( fiberFilename, s1, s2, false ); + if( fiberInfile.empty() ) + { + std::string errorMessage = "Fiber Image at " + fiberFilename + " could not be read. Aborting."; + MITK_ERROR << errorMessage; + return EXIT_FAILURE; + } + mitk::BaseData* fiberBaseData = fiberInfile.at(0); + mitk::FiberBundleX* fiberBundle = dynamic_cast( fiberBaseData ); + + // load parcellation + std::vector parcellationInFile = + mitk::BaseDataIO::LoadBaseDataFromFile( parcellationFilename, s1, s2, false ); + if( parcellationInFile.empty() ) + { + std::string errorMessage = "Parcellation at " + parcellationFilename + " could not be read. Aborting."; + MITK_ERROR << errorMessage; + return EXIT_FAILURE; + } + mitk::BaseData* parcellationBaseData = parcellationInFile.at(0); + mitk::Image* parcellationImage = dynamic_cast( parcellationBaseData ); + + + + // do creation + mitk::ConnectomicsNetworkCreator::Pointer connectomicsNetworkCreator = mitk::ConnectomicsNetworkCreator::New(); + connectomicsNetworkCreator->SetSegmentation( parcellationImage ); + connectomicsNetworkCreator->SetFiberBundle( fiberBundle ); + if( centerOfMass ) + { + connectomicsNetworkCreator->CalculateCenterOfMass(); + } + connectomicsNetworkCreator->SetEndPointSearchRadius( searchRadius ); + connectomicsNetworkCreator->CreateNetworkFromFibersAndSegmentation(); + + + mitk::ConnectomicsNetwork::Pointer network = connectomicsNetworkCreator->GetNetwork(); + + MITK_INFO << "searching writer"; + mitk::CoreObjectFactory::FileWriterList fileWriters = mitk::CoreObjectFactory::GetInstance()->GetFileWriters(); + for (mitk::CoreObjectFactory::FileWriterList::iterator it = fileWriters.begin() ; it != fileWriters.end() ; ++it) + { + if ( (*it)->CanWriteBaseDataType(network.GetPointer()) ) + { + MITK_INFO << "writing"; + (*it)->SetFileName( outputFilename.c_str() ); + (*it)->DoWrite( network.GetPointer() ); + } + } + } + catch (itk::ExceptionObject e) + { + MITK_INFO << e; + return EXIT_FAILURE; + } + catch (std::exception e) + { + MITK_INFO << e.what(); + return EXIT_FAILURE; + } + catch (...) + { + MITK_INFO << "ERROR!?!"; + return EXIT_FAILURE; + } + MITK_INFO << "DONE"; + return EXIT_SUCCESS; +} +RegisterDiffusionMiniApp(NetworkCreation); diff --git a/Modules/DiffusionImaging/MiniApps/files.cmake b/Modules/DiffusionImaging/MiniApps/files.cmake index 45b39388e7..2ee013ab19 100644 --- a/Modules/DiffusionImaging/MiniApps/files.cmake +++ b/Modules/DiffusionImaging/MiniApps/files.cmake @@ -1,20 +1,21 @@ set(CPP_FILES mitkDiffusionMiniApps.cpp MiniAppManager.cpp FileFormatConverter.cpp TensorReconstruction.cpp QballReconstruction.cpp DiffusionIndices.cpp CopyGeometry.cpp GibbsTracking.cpp StreamlineTracking.cpp FiberProcessing.cpp LocalDirectionalFiberPlausibility.cpp #TractogramAngularError.cpp FiberDirectionExtraction.cpp PeakExtraction.cpp PeaksAngularError.cpp MultishellMethods.cpp FiberFoxProcessing.cpp ExportShImage.cpp + NetworkCreation.cpp )