diff --git a/Modules/DiffusionImaging/DiffusionCore/autoload/IO/mitkDiffusionImageDicomReaderService.cpp b/Modules/DiffusionImaging/DiffusionCore/autoload/IO/mitkDiffusionImageDicomReaderService.cpp index d171c51ebf..6d11906b39 100644 --- a/Modules/DiffusionImaging/DiffusionCore/autoload/IO/mitkDiffusionImageDicomReaderService.cpp +++ b/Modules/DiffusionImaging/DiffusionCore/autoload/IO/mitkDiffusionImageDicomReaderService.cpp @@ -1,297 +1,297 @@ /*=================================================================== 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. ===================================================================*/ #ifndef __mitkDiffusionImageDicomReaderService_cpp #define __mitkDiffusionImageDicomReaderService_cpp #include "mitkDiffusionImageDicomReaderService.h" #include #include // Diffusion properties #include #include #include #include #include #include #include "itksys/SystemTools.hxx" #include "itkImageFileReader.h" #include "itkMetaDataObject.h" #include "itkNrrdImageIO.h" #include "mitkCustomMimeType.h" #include "mitkDiffusionCoreIOMimeTypes.h" #include #include #include #include #include #include #include #include #include #include #include #include namespace mitk { DiffusionImageDicomReaderService:: DiffusionImageDicomReaderService(const DiffusionImageDicomReaderService & other) : AbstractFileReader(other) { } DiffusionImageDicomReaderService* DiffusionImageDicomReaderService::Clone() const { return new DiffusionImageDicomReaderService(*this); } DiffusionImageDicomReaderService:: ~DiffusionImageDicomReaderService() {} DiffusionImageDicomReaderService:: DiffusionImageDicomReaderService() : mitk::AbstractFileReader( CustomMimeType( mitk::DiffusionCoreIOMimeTypes::DWI_DICOM_MIMETYPE() ), mitk::DiffusionCoreIOMimeTypes::DWI_DICOM_MIMETYPE_DESCRIPTION() ) { Options defaultOptions; - defaultOptions["Load recoursive"] = false; + defaultOptions["Load recursive"] = false; defaultOptions["Split mosaic"] = true; this->SetDefaultOptions(defaultOptions); m_ServiceReg = this->RegisterService(); } std::vector > DiffusionImageDicomReaderService::Read() { return InternalRead(); } std::vector > DiffusionImageDicomReaderService::InternalRead() { std::vector > result_images; OutputType::Pointer outputForCache = OutputType::New(); if ( this->GetInputLocation() == "") { throw itk::ImageFileReaderException(__FILE__, __LINE__, "Sorry, the filename to be read is empty!"); } else { const std::string& locale = "C"; const std::string& currLocale = setlocale( LC_ALL, nullptr ); if ( locale.compare(currLocale)!=0 ) { try { setlocale(LC_ALL, locale.c_str()); } catch(...) { MITK_INFO << "Could not set locale " << locale; } } try { Options options = this->GetOptions(); - bool load_recoursive = us::any_cast(options["Load recoursive"]); + bool load_recursive = us::any_cast(options["Load recursive"]); bool split_mosaic = us::any_cast(options["Split mosaic"]); gdcm::Directory::FilenamesType complete_list; std::string folderName = itksys::SystemTools::GetFilenamePath( this->GetInputLocation() ); - if( load_recoursive ) + if( load_recursive ) { std::string subdir_prefix = ""; itksys::Directory rootdir; rootdir.Load( folderName.c_str() ); for( unsigned int idx=0; idxAddDistinguishingTag( mitk::DICOMTag(0x0028, 0x0010) ); // Number of Rows tagSorter->AddDistinguishingTag( mitk::DICOMTag(0x0028, 0x0011) ); // Number of Columns tagSorter->AddDistinguishingTag( mitk::DICOMTag(0x0028, 0x0030) ); // Pixel Spacing tagSorter->AddDistinguishingTag( mitk::DICOMTag(0x0018, 0x1164) ); // Imager Pixel Spacing tagSorter->AddDistinguishingTag( mitk::DICOMTag(0x0020, 0x0037) ); // Image Orientation (Patient) // TODO add tolerance parameter (l. 1572 of original code) // TODO handle as real vectors! cluster with configurable errors! tagSorter->AddDistinguishingTag( mitk::DICOMTag(0x0020, 0x000e) ); // Series Instance UID tagSorter->AddDistinguishingTag( mitk::DICOMTag(0x0018, 0x0050) ); // Slice Thickness tagSorter->AddDistinguishingTag( mitk::DICOMTag(0x0028, 0x0008) ); // Number of Frames //tagSorter->AddDistinguishingTag( mitk::DICOMTag(0x0020, 0x0052) ); // Frame of Reference UID // gdcmReader->AddSortingElement( tagSorter ); //mitk::DICOMFileReaderTestHelper::TestOutputsContainInputs( gdcmReader ); mitk::DICOMSortCriterion::ConstPointer sorting = mitk::SortByImagePositionPatient::New( // Image Position (Patient) //mitk::DICOMSortByTag::New( mitk::DICOMTag(0x0020, 0x0013), // instance number mitk::DICOMSortByTag::New( mitk::DICOMTag(0x0020, 0x0012), // aqcuisition number mitk::DICOMSortByTag::New( mitk::DICOMTag(0x0008, 0x0032), // aqcuisition time mitk::DICOMSortByTag::New( mitk::DICOMTag(0x0018, 0x1060), // trigger time mitk::DICOMSortByTag::New( mitk::DICOMTag(0x0008, 0x0018) // SOP instance UID (last resort, not really meaningful but decides clearly) ).GetPointer() ).GetPointer() ).GetPointer() ).GetPointer() // ).GetPointer() ).GetPointer(); tagSorter->SetSortCriterion( sorting ); // mosaic gdcmReader->SetResolveMosaic( split_mosaic ); gdcmReader->AddSortingElement( tagSorter ); gdcmReader->SetInputFiles( complete_list ); try { gdcmReader->AnalyzeInputFiles(); } catch( const itk::ExceptionObject &e) { MITK_ERROR << "Failed to analyze data. " << e.what(); } catch( const std::exception &se) { MITK_ERROR << "Std Exception " << se.what(); } gdcmReader->LoadImages(); for( unsigned int o = 0; o < gdcmReader->GetNumberOfOutputs(); o++ ) { mitk::Image::Pointer loaded_image = gdcmReader->GetOutput(o).GetMitkImage(); std::stringstream ss; ss << "ImportedData_" << o; StringProperty::Pointer nameProp; if (gdcmReader->GetSeriesName(o)!="-") nameProp = StringProperty::New(gdcmReader->GetSeriesName(o)); else if (gdcmReader->GetStudyName(o)!="-") nameProp = StringProperty::New(gdcmReader->GetStudyName(o)); else nameProp = StringProperty::New(folderName); loaded_image->SetProperty("name", nameProp); result_images.push_back(loaded_image.GetPointer()); } // Since we have already read the tree, we can store it in a cache variable // so that it can be assigned to the DataObject in GenerateData(); m_OutputCache = outputForCache; m_CacheTime.Modified(); try { setlocale(LC_ALL, currLocale.c_str()); } catch(...) { MITK_INFO << "Could not reset locale " << currLocale; } } catch(std::exception& e) { try { setlocale(LC_ALL, currLocale.c_str()); } catch(...) { MITK_INFO << "Could not reset locale " << currLocale; } MITK_INFO << "Std::Exception while reading file!!"; MITK_INFO << e.what(); throw itk::ImageFileReaderException(__FILE__, __LINE__, e.what()); } catch(...) { try { setlocale(LC_ALL, currLocale.c_str()); } catch(...) { MITK_INFO << "Could not reset locale " << currLocale; } MITK_INFO << "Exception while reading file!!"; throw itk::ImageFileReaderException(__FILE__, __LINE__, "Sorry, an error occurred while reading the requested vessel tree file!"); } } return result_images; } } //namespace MITK #endif diff --git a/Modules/DiffusionImaging/DiffusionIO/CMakeLists.txt b/Modules/DiffusionImaging/DiffusionIO/CMakeLists.txt index 0e85887a51..fbe023567b 100644 --- a/Modules/DiffusionImaging/DiffusionIO/CMakeLists.txt +++ b/Modules/DiffusionImaging/DiffusionIO/CMakeLists.txt @@ -1,7 +1,8 @@ MITK_CREATE_MODULE( SUBPROJECTS MITK-DTI INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR} DEPENDS MitkConnectomics MitkQuantification MitkFiberTracking AUTOLOAD_WITH MitkCore + PACKAGE_DEPENDS PUBLIC DCMTK ) diff --git a/Modules/DiffusionImaging/DiffusionIO/files.cmake b/Modules/DiffusionImaging/DiffusionIO/files.cmake index 209e2cf4ff..419593c7e3 100644 --- a/Modules/DiffusionImaging/DiffusionIO/files.cmake +++ b/Modules/DiffusionImaging/DiffusionIO/files.cmake @@ -1,38 +1,40 @@ set(CPP_FILES mitkDiffusionModuleActivator.cpp mitkNrrdTbssImageWriterFactory.cpp #mitkFiberBundleIOFactory.cpp mitkConnectomicsNetworkReader.cpp mitkConnectomicsNetworkWriter.cpp mitkConnectomicsNetworkCSVWriter.cpp mitkConnectomicsNetworkMatrixWriter.cpp mitkConnectomicsNetworkSerializer.cpp mitkConnectomicsNetworkDefinitions.cpp mitkNrrdTbssRoiImageIOFactory.cpp #mitkFiberBundleWriterFactory.cpp mitkNrrdTbssRoiImageWriterFactory.cpp mitkFiberTrackingObjectFactory.cpp mitkConnectomicsObjectFactory.cpp mitkQuantificationObjectFactory.cpp mitkNrrdTbssImageIOFactory.cpp mitkDiffusionIOMimeTypes.cpp + mitkFiberBundleDicomReader.cpp + mitkFiberBundleDicomWriter.cpp mitkFiberBundleTckReader.cpp mitkFiberBundleTrackVisReader.cpp mitkFiberBundleTrackVisWriter.cpp mitkFiberBundleVtkReader.cpp mitkFiberBundleVtkWriter.cpp mitkFiberBundleSerializer.cpp mitkFiberBundleMapper2D.cpp mitkFiberBundleMapper3D.cpp - + mitkTractographyForestReader.cpp mitkTractographyForestWriter.cpp mitkTractographyForestSerializer.cpp mitkPlanarFigureCompositeWriter.cpp mitkPlanarFigureCompositeReader.cpp mitkPlanarFigureCompositeSerializer.cpp ) diff --git a/Modules/DiffusionImaging/DiffusionIO/mitkDiffusionIOMimeTypes.cpp b/Modules/DiffusionImaging/DiffusionIO/mitkDiffusionIOMimeTypes.cpp index 3c90910355..d23a1a97b4 100644 --- a/Modules/DiffusionImaging/DiffusionIO/mitkDiffusionIOMimeTypes.cpp +++ b/Modules/DiffusionImaging/DiffusionIO/mitkDiffusionIOMimeTypes.cpp @@ -1,203 +1,250 @@ /*=================================================================== 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 "mitkDiffusionIOMimeTypes.h" #include "mitkIOMimeTypes.h" #include #include #include #include #include +#include "dcmtk/dcmtract/trctractographyresults.h" + namespace mitk { std::vector DiffusionIOMimeTypes::Get() { std::vector mimeTypes; // order matters here (descending rank for mime types) mimeTypes.push_back(FIBERBUNDLE_VTK_MIMETYPE().Clone()); mimeTypes.push_back(FIBERBUNDLE_TRK_MIMETYPE().Clone()); mimeTypes.push_back(FIBERBUNDLE_TCK_MIMETYPE().Clone()); + mimeTypes.push_back(FIBERBUNDLE_DICOM_MIMETYPE().Clone()); mimeTypes.push_back(CONNECTOMICS_MIMETYPE().Clone()); mimeTypes.push_back(TRACTOGRAPHYFOREST_MIMETYPE().Clone()); mimeTypes.push_back(PLANARFIGURECOMPOSITE_MIMETYPE().Clone()); return mimeTypes; } // Mime Types CustomMimeType DiffusionIOMimeTypes::PLANARFIGURECOMPOSITE_MIMETYPE() { CustomMimeType mimeType(PLANARFIGURECOMPOSITE_MIMETYPE_NAME()); std::string category = "Planar Figure Composite"; mimeType.SetComment("Planar Figure Composite"); mimeType.SetCategory(category); mimeType.AddExtension("pfc"); return mimeType; } CustomMimeType DiffusionIOMimeTypes::TRACTOGRAPHYFOREST_MIMETYPE() { CustomMimeType mimeType(TRACTOGRAPHYFOREST_MIMETYPE_NAME()); std::string category = "Tractography Forest"; mimeType.SetComment("Tractography Forest"); mimeType.SetCategory(category); mimeType.AddExtension("rf"); return mimeType; } CustomMimeType DiffusionIOMimeTypes::FIBERBUNDLE_VTK_MIMETYPE() { CustomMimeType mimeType(FIBERBUNDLE_VTK_MIMETYPE_NAME()); std::string category = "VTK Fibers"; mimeType.SetComment("VTK Fibers"); mimeType.SetCategory(category); mimeType.AddExtension("fib"); -// mimeType.AddExtension("vtk"); + mimeType.AddExtension("vtk"); return mimeType; } CustomMimeType DiffusionIOMimeTypes::FIBERBUNDLE_TCK_MIMETYPE() { CustomMimeType mimeType(FIBERBUNDLE_TCK_MIMETYPE_NAME()); std::string category = "MRtrix Fibers"; mimeType.SetComment("MRtrix Fibers"); mimeType.SetCategory(category); mimeType.AddExtension("tck"); return mimeType; } CustomMimeType DiffusionIOMimeTypes::FIBERBUNDLE_TRK_MIMETYPE() { CustomMimeType mimeType(FIBERBUNDLE_TRK_MIMETYPE_NAME()); std::string category = "TrackVis Fibers"; mimeType.SetComment("TrackVis Fibers"); mimeType.SetCategory(category); mimeType.AddExtension("trk"); return mimeType; } +DiffusionIOMimeTypes::FiberBundleDicomMimeType::FiberBundleDicomMimeType() + : CustomMimeType(FIBERBUNDLE_DICOM_MIMETYPE_NAME()) +{ + std::string category = "DICOM Fibers"; + this->SetCategory(category); + this->SetComment("DICOM Fibers"); + + this->AddExtension("dcm"); + this->AddExtension("DCM"); + this->AddExtension("gdcm"); + this->AddExtension("dc3"); + this->AddExtension("DC3"); + this->AddExtension("ima"); + this->AddExtension("img"); +} + +bool DiffusionIOMimeTypes::FiberBundleDicomMimeType::AppliesTo(const std::string &path) const +{ + OFCondition result; + TrcTractographyResults *trc = NULL; + result = TrcTractographyResults::loadFile(path.c_str(), trc); + if (result.bad()) + return false; + + return true; +} + +DiffusionIOMimeTypes::FiberBundleDicomMimeType* DiffusionIOMimeTypes::FiberBundleDicomMimeType::Clone() const +{ + return new FiberBundleDicomMimeType(*this); +} + + +DiffusionIOMimeTypes::FiberBundleDicomMimeType DiffusionIOMimeTypes::FIBERBUNDLE_DICOM_MIMETYPE() +{ + return FiberBundleDicomMimeType(); +} + CustomMimeType DiffusionIOMimeTypes::CONNECTOMICS_MIMETYPE() { CustomMimeType mimeType(CONNECTOMICS_MIMETYPE_NAME()); std::string category = "Connectomics Networks"; mimeType.SetComment("Connectomics Networks Files"); mimeType.SetCategory(category); mimeType.AddExtension("cnf"); return mimeType; } CustomMimeType DiffusionIOMimeTypes::CONNECTOMICS_MATRIX_MIMETYPE() { CustomMimeType mimeType(CONNECTOMICS_MATRIX_MIMETYPE_NAME()); std::string category = "Connectomics Networks export"; mimeType.SetComment("Connectomics Matrix Files"); mimeType.SetCategory(category); mimeType.AddExtension("mat"); return mimeType; } CustomMimeType DiffusionIOMimeTypes::CONNECTOMICS_LIST_MIMETYPE() { CustomMimeType mimeType(CONNECTOMICS_LIST_MIMETYPE_NAME()); std::string category = "Connectomics Networks export"; mimeType.SetComment("Connectomics Connection Lists"); mimeType.SetCategory(category); mimeType.AddExtension("txt"); return mimeType; } // Names std::string DiffusionIOMimeTypes::FIBERBUNDLE_VTK_MIMETYPE_NAME() { static std::string name = IOMimeTypes::DEFAULT_BASE_NAME() + ".FiberBundle.vtk"; return name; } std::string DiffusionIOMimeTypes::FIBERBUNDLE_TCK_MIMETYPE_NAME() { static std::string name = IOMimeTypes::DEFAULT_BASE_NAME() + ".FiberBundle.tck"; return name; } std::string DiffusionIOMimeTypes::FIBERBUNDLE_TRK_MIMETYPE_NAME() { static std::string name = IOMimeTypes::DEFAULT_BASE_NAME() + ".FiberBundle.trk"; return name; } +std::string DiffusionIOMimeTypes::FIBERBUNDLE_DICOM_MIMETYPE_NAME() +{ + static std::string name = IOMimeTypes::DEFAULT_BASE_NAME() + ".FiberBundle.dcm"; + return name; +} + std::string DiffusionIOMimeTypes::CONNECTOMICS_MIMETYPE_NAME() { static std::string name = IOMimeTypes::DEFAULT_BASE_NAME() + ".cnf"; return name; } std::string DiffusionIOMimeTypes::CONNECTOMICS_MATRIX_MIMETYPE_NAME() { static std::string name = IOMimeTypes::DEFAULT_BASE_NAME() + ".mat"; return name; } std::string DiffusionIOMimeTypes::CONNECTOMICS_LIST_MIMETYPE_NAME() { static std::string name = IOMimeTypes::DEFAULT_BASE_NAME() + ".txt"; return name; } std::string DiffusionIOMimeTypes::PLANARFIGURECOMPOSITE_MIMETYPE_NAME() { static std::string name = IOMimeTypes::DEFAULT_BASE_NAME() + ".pfc"; return name; } std::string DiffusionIOMimeTypes::TRACTOGRAPHYFOREST_MIMETYPE_NAME() { static std::string name = IOMimeTypes::DEFAULT_BASE_NAME() + ".rf"; return name; } // Descriptions std::string DiffusionIOMimeTypes::FIBERBUNDLE_MIMETYPE_DESCRIPTION() { static std::string description = "Fiberbundles"; return description; } std::string DiffusionIOMimeTypes::CONNECTOMICS_MIMETYPE_DESCRIPTION() { static std::string description = "Connectomics Networks"; return description; } std::string DiffusionIOMimeTypes::PLANARFIGURECOMPOSITE_MIMETYPE_DESCRIPTION() { static std::string description = "Planar Figure Composite"; return description; } std::string DiffusionIOMimeTypes::TRACTOGRAPHYFOREST_MIMETYPE_DESCRIPTION() { static std::string description = "Tractography Forest"; return description; } } diff --git a/Modules/DiffusionImaging/DiffusionIO/mitkDiffusionIOMimeTypes.h b/Modules/DiffusionImaging/DiffusionIO/mitkDiffusionIOMimeTypes.h index 84b63bae01..56a3be57c0 100644 --- a/Modules/DiffusionImaging/DiffusionIO/mitkDiffusionIOMimeTypes.h +++ b/Modules/DiffusionImaging/DiffusionIO/mitkDiffusionIOMimeTypes.h @@ -1,112 +1,124 @@ /*=================================================================== 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. ===================================================================*/ #ifndef MITKDIFFUSIONIOMIMETYPES_H #define MITKDIFFUSIONIOMIMETYPES_H #include "mitkCustomMimeType.h" #include namespace mitk { class DiffusionIOMimeTypes { public: class DiffusionImageNrrdMimeType : public CustomMimeType { public: DiffusionImageNrrdMimeType(); virtual bool AppliesTo(const std::string &path) const override; virtual DiffusionImageNrrdMimeType* Clone() const override; }; class DiffusionImageNiftiMimeType : public CustomMimeType { public: DiffusionImageNiftiMimeType(); virtual bool AppliesTo(const std::string &path) const override; virtual DiffusionImageNiftiMimeType* Clone() const override; }; // Get all Diffusion Mime Types static std::vector Get(); // ------------------------------ VTK formats ---------------------------------- static CustomMimeType FIBERBUNDLE_VTK_MIMETYPE(); static std::string FIBERBUNDLE_VTK_MIMETYPE_NAME(); static std::string FIBERBUNDLE_MIMETYPE_DESCRIPTION(); // ------------------------------ MRtrix formats ---------------------------------- static CustomMimeType FIBERBUNDLE_TCK_MIMETYPE(); static std::string FIBERBUNDLE_TCK_MIMETYPE_NAME(); // ------------------------------ TrackVis formats ---------------------------------- static CustomMimeType FIBERBUNDLE_TRK_MIMETYPE(); static std::string FIBERBUNDLE_TRK_MIMETYPE_NAME(); + // ------------------------------ DICOM formats ---------------------------------- + + class FiberBundleDicomMimeType : public CustomMimeType + { + public: + FiberBundleDicomMimeType(); + virtual bool AppliesTo(const std::string &path) const override; + virtual FiberBundleDicomMimeType* Clone() const override; + }; + + static FiberBundleDicomMimeType FIBERBUNDLE_DICOM_MIMETYPE(); + static std::string FIBERBUNDLE_DICOM_MIMETYPE_NAME(); // ------------------------- Image formats (ITK based) -------------------------- static DiffusionImageNrrdMimeType DWI_NRRD_MIMETYPE(); static DiffusionImageNiftiMimeType DWI_NIFTI_MIMETYPE(); static CustomMimeType DTI_MIMETYPE(); // dti, hdti static CustomMimeType QBI_MIMETYPE(); // qbi, hqbi static std::string DWI_NRRD_MIMETYPE_NAME(); static std::string DWI_NIFTI_MIMETYPE_NAME(); static std::string DTI_MIMETYPE_NAME(); static std::string QBI_MIMETYPE_NAME(); static std::string DWI_NRRD_MIMETYPE_DESCRIPTION(); static std::string DWI_NIFTI_MIMETYPE_DESCRIPTION(); static std::string DTI_MIMETYPE_DESCRIPTION(); static std::string QBI_MIMETYPE_DESCRIPTION(); // ------------------------------ MITK formats ---------------------------------- static CustomMimeType CONNECTOMICS_MIMETYPE(); // cnf static CustomMimeType CONNECTOMICS_MATRIX_MIMETYPE(); // mat static CustomMimeType CONNECTOMICS_LIST_MIMETYPE(); // txt static std::string CONNECTOMICS_MIMETYPE_NAME(); static std::string CONNECTOMICS_MATRIX_MIMETYPE_NAME(); static std::string CONNECTOMICS_LIST_MIMETYPE_NAME(); static std::string CONNECTOMICS_MIMETYPE_DESCRIPTION(); static CustomMimeType PLANARFIGURECOMPOSITE_MIMETYPE(); static std::string PLANARFIGURECOMPOSITE_MIMETYPE_NAME(); static std::string PLANARFIGURECOMPOSITE_MIMETYPE_DESCRIPTION(); static CustomMimeType TRACTOGRAPHYFOREST_MIMETYPE(); static std::string TRACTOGRAPHYFOREST_MIMETYPE_NAME(); static std::string TRACTOGRAPHYFOREST_MIMETYPE_DESCRIPTION(); private: // purposely not implemented DiffusionIOMimeTypes(); DiffusionIOMimeTypes(const DiffusionIOMimeTypes&); }; } #endif // MITKDIFFUSIONIOMIMETYPES_H diff --git a/Modules/DiffusionImaging/DiffusionIO/mitkDiffusionModuleActivator.cpp b/Modules/DiffusionImaging/DiffusionIO/mitkDiffusionModuleActivator.cpp index 4ff5c619c7..fd2b26ded4 100644 --- a/Modules/DiffusionImaging/DiffusionIO/mitkDiffusionModuleActivator.cpp +++ b/Modules/DiffusionImaging/DiffusionIO/mitkDiffusionModuleActivator.cpp @@ -1,122 +1,134 @@ /*=================================================================== 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 #include #include #include #include #include #include #include +#include #include #include +#include #include #include #include #include #include #include #include #include #include "mitkDiffusionIOMimeTypes.h" namespace mitk { /** \brief Registers services for segmentation module. */ class DiffusionModuleActivator : public us::ModuleActivator { public: void Load(us::ModuleContext* context) override { - us::ServiceProperties props; - props[ us::ServiceConstants::SERVICE_RANKING() ] = 10; - m_MimeTypes = mitk::DiffusionIOMimeTypes::Get(); for (std::vector::const_iterator mimeTypeIter = m_MimeTypes.begin(), iterEnd = m_MimeTypes.end(); mimeTypeIter != iterEnd; ++mimeTypeIter) { + us::ServiceProperties props; + mitk::CustomMimeType* mt = *mimeTypeIter; + if (mt->GetName()==mitk::DiffusionIOMimeTypes::FIBERBUNDLE_VTK_MIMETYPE_NAME()) + props[ us::ServiceConstants::SERVICE_RANKING() ] = -10; + else + props[ us::ServiceConstants::SERVICE_RANKING() ] = 10; + context->RegisterService(*mimeTypeIter, props); } m_FiberBundleVtkReader = new FiberBundleVtkReader(); m_FiberBundleTrackVisReader = new FiberBundleTrackVisReader(); m_FiberBundleTckReader = new FiberBundleTckReader(); + m_FiberBundleDicomReader = new FiberBundleDicomReader(); m_ConnectomicsNetworkReader = new ConnectomicsNetworkReader(); m_PlanarFigureCompositeReader = new PlanarFigureCompositeReader(); m_TractographyForestReader = new TractographyForestReader(); m_FiberBundleVtkWriter = new FiberBundleVtkWriter(); m_FiberBundleTrackVisWriter = new FiberBundleTrackVisWriter(); + m_FiberBundleDicomWriter = new FiberBundleDicomWriter(); m_ConnectomicsNetworkWriter = new ConnectomicsNetworkWriter(); m_ConnectomicsNetworkCSVWriter = new ConnectomicsNetworkCSVWriter(); m_ConnectomicsNetworkMatrixWriter = new ConnectomicsNetworkMatrixWriter(); m_PlanarFigureCompositeWriter = new PlanarFigureCompositeWriter(); m_TractographyForestWriter = new TractographyForestWriter(); } void Unload(us::ModuleContext*) override { for (unsigned int loop(0); loop < m_MimeTypes.size(); ++loop) { delete m_MimeTypes.at(loop); } delete m_FiberBundleVtkReader; delete m_FiberBundleTckReader; delete m_FiberBundleTrackVisReader; delete m_ConnectomicsNetworkReader; delete m_PlanarFigureCompositeReader; delete m_TractographyForestReader; + delete m_FiberBundleDicomReader; + delete m_FiberBundleDicomWriter; delete m_FiberBundleVtkWriter; delete m_FiberBundleTrackVisWriter; delete m_ConnectomicsNetworkWriter; delete m_ConnectomicsNetworkCSVWriter; delete m_ConnectomicsNetworkMatrixWriter; delete m_PlanarFigureCompositeWriter; delete m_TractographyForestWriter; } private: FiberBundleVtkReader * m_FiberBundleVtkReader; FiberBundleTckReader * m_FiberBundleTckReader; FiberBundleTrackVisReader * m_FiberBundleTrackVisReader; + FiberBundleDicomReader * m_FiberBundleDicomReader; ConnectomicsNetworkReader * m_ConnectomicsNetworkReader; PlanarFigureCompositeReader* m_PlanarFigureCompositeReader; TractographyForestReader* m_TractographyForestReader; + FiberBundleDicomWriter * m_FiberBundleDicomWriter; FiberBundleVtkWriter * m_FiberBundleVtkWriter; FiberBundleTrackVisWriter * m_FiberBundleTrackVisWriter; ConnectomicsNetworkWriter * m_ConnectomicsNetworkWriter; ConnectomicsNetworkCSVWriter * m_ConnectomicsNetworkCSVWriter; ConnectomicsNetworkMatrixWriter * m_ConnectomicsNetworkMatrixWriter; PlanarFigureCompositeWriter* m_PlanarFigureCompositeWriter; TractographyForestWriter* m_TractographyForestWriter; std::vector m_MimeTypes; }; } US_EXPORT_MODULE_ACTIVATOR(mitk::DiffusionModuleActivator) diff --git a/Modules/DiffusionImaging/DiffusionIO/mitkFiberBundleDicomReader.cpp b/Modules/DiffusionImaging/DiffusionIO/mitkFiberBundleDicomReader.cpp new file mode 100644 index 0000000000..d2b61b118a --- /dev/null +++ b/Modules/DiffusionImaging/DiffusionIO/mitkFiberBundleDicomReader.cpp @@ -0,0 +1,148 @@ +/*=================================================================== + +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 "mitkFiberBundleDicomReader.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "mitkDiffusionIOMimeTypes.h" +#include +#include + +#include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ +#include "dcmtk/dcmtract/trctractographyresults.h" +#include "dcmtk/dcmtract/trctrack.h" + + +mitk::FiberBundleDicomReader::FiberBundleDicomReader() + : mitk::AbstractFileReader( mitk::DiffusionIOMimeTypes::FIBERBUNDLE_DICOM_MIMETYPE_NAME(), "DICOM Fiber Bundle Reader" ) +{ + m_ServiceReg = this->RegisterService(); +} + +mitk::FiberBundleDicomReader::FiberBundleDicomReader(const FiberBundleDicomReader &other) + :mitk::AbstractFileReader(other) +{ +} + +mitk::FiberBundleDicomReader * mitk::FiberBundleDicomReader::Clone() const +{ + return new FiberBundleDicomReader(*this); +} + +std::vector > mitk::FiberBundleDicomReader::Read() +{ + + std::vector > output_fibs; + try + { + const std::string& locale = "C"; + const std::string& currLocale = setlocale( LC_ALL, nullptr ); + setlocale(LC_ALL, locale.c_str()); + + std::string filename = this->GetInputLocation(); + + OFCondition result; + TrcTractographyResults *trc = NULL; + result = TrcTractographyResults::loadFile(filename.c_str(), trc); + if (result.bad()) + mitkThrow() << "Unable to load Tractography Results file: " << result.text(); + + OFString val; + trc->getPatient().getPatientName(val); + MITK_INFO << "Patient Name: " << val; + trc->getStudy().getStudyInstanceUID(val); + MITK_INFO << "Study : " << val; + trc->getSeries().getSeriesInstanceUID(val); + MITK_INFO << "Series : " << val; + trc->getSOPCommon().getSOPInstanceUID(val); + MITK_INFO << "Instance : " << val; + MITK_INFO << "-------------------------------------------------------------------------"; + size_t numTrackSets = trc->getNumberOfTrackSets(); + MITK_INFO << "Track Sets (total: " << numTrackSets << ")"; + OFVector& sets = trc->getTrackSets(); + for (size_t ts = 0; ts < numTrackSets; ts++) + { + size_t numTracks = sets[ts]->getNumberOfTracks(); + MITK_INFO << " Track Set #" << ts << ": " << numTracks << " Tracks, " + << sets[ts]->getNumberOfTrackSetStatistics() << " Track Set Statistics, " + << sets[ts]->getNumberOfTrackStatistics() << " Track Statistics, " + << sets[ts]->getNumberOfMeasurements() << " Measurements "; + + vtkSmartPointer vtkNewPoints = vtkSmartPointer::New(); + vtkSmartPointer vtkNewCells = vtkSmartPointer::New(); + + for (size_t t = 0; t < numTracks; t++) + { + vtkSmartPointer container = vtkSmartPointer::New(); + TrcTrack* track = sets[ts]->getTracks()[t]; + const Float32* vals = NULL; + size_t numPoints = track->getTrackData(vals); + + for (size_t v = 0; v < numPoints; ++v) + { + vtkIdType id = vtkNewPoints->InsertNextPoint(vals[v*3],vals[v*3+1],vals[v*3+2]); + container->GetPointIds()->InsertNextId(id); + } + + vtkNewCells->InsertNextCell(container); + } + + vtkSmartPointer fiberPolyData = vtkSmartPointer::New(); + fiberPolyData->SetPoints(vtkNewPoints); + fiberPolyData->SetLines(vtkNewCells); + +// // transform polydata from RAS (MRtrix) to LPS (MITK) +// mitk::Geometry3D::Pointer geometry = mitk::Geometry3D::New(); +// vtkSmartPointer< vtkMatrix4x4 > matrix = vtkSmartPointer< vtkMatrix4x4 >::New(); +// matrix->Identity(); +// matrix->SetElement(0,0,-matrix->GetElement(0,0)); +// matrix->SetElement(1,1,-matrix->GetElement(1,1)); +// geometry->SetIndexToWorldTransformByVtkMatrix(matrix); + +// vtkSmartPointer transformFilter = vtkSmartPointer::New(); +// transformFilter->SetInputData(fiberPolyData); +// transformFilter->SetTransform(geometry->GetVtkTransform()); +// transformFilter->Update(); + + FiberBundle::Pointer fib = FiberBundle::New(fiberPolyData); + output_fibs.push_back(fib.GetPointer()); + MITK_INFO << "Fiber bundle read"; + } + delete trc; + + setlocale(LC_ALL, currLocale.c_str()); + return output_fibs; + } + catch(...) + { + throw; + } + return output_fibs; +} diff --git a/Modules/DiffusionImaging/DiffusionIO/mitkFiberBundleDicomReader.h b/Modules/DiffusionImaging/DiffusionIO/mitkFiberBundleDicomReader.h new file mode 100644 index 0000000000..754495842e --- /dev/null +++ b/Modules/DiffusionImaging/DiffusionIO/mitkFiberBundleDicomReader.h @@ -0,0 +1,52 @@ +/*=================================================================== + +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. + +===================================================================*/ + +#ifndef __mitkFiberBundleDicomReader_h +#define __mitkFiberBundleDicomReader_h + +#include +#include +#include +#include + +#include + +namespace mitk +{ + + /** \brief + */ + + class FiberBundleDicomReader : public AbstractFileReader + { + public: + + FiberBundleDicomReader(); + virtual ~FiberBundleDicomReader(){} + FiberBundleDicomReader(const FiberBundleDicomReader& other); + virtual FiberBundleDicomReader * Clone() const override; + + using mitk::AbstractFileReader::Read; + virtual std::vector > Read() override; + + private: + + us::ServiceRegistration m_ServiceReg; + }; + +} //namespace MITK + +#endif // __mitkFiberBundleReader_h diff --git a/Modules/DiffusionImaging/DiffusionIO/mitkFiberBundleDicomWriter.cpp b/Modules/DiffusionImaging/DiffusionIO/mitkFiberBundleDicomWriter.cpp new file mode 100644 index 0000000000..5663da1310 --- /dev/null +++ b/Modules/DiffusionImaging/DiffusionIO/mitkFiberBundleDicomWriter.cpp @@ -0,0 +1,133 @@ +/*=================================================================== + +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 "mitkFiberBundleDicomWriter.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include "mitkDiffusionIOMimeTypes.h" +#include +#include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ +#include "dcmtk/dcmtract/trctractographyresults.h" + +mitk::FiberBundleDicomWriter::FiberBundleDicomWriter() + : mitk::AbstractFileWriter(mitk::FiberBundle::GetStaticNameOfClass(), mitk::DiffusionIOMimeTypes::FIBERBUNDLE_DICOM_MIMETYPE_NAME(), "DICOM Fiber Bundle Writer") +{ + RegisterService(); +} + +mitk::FiberBundleDicomWriter::FiberBundleDicomWriter(const mitk::FiberBundleDicomWriter & other) + :mitk::AbstractFileWriter(other) +{} + +mitk::FiberBundleDicomWriter::~FiberBundleDicomWriter() +{} + +mitk::FiberBundleDicomWriter * mitk::FiberBundleDicomWriter::Clone() const +{ + return new mitk::FiberBundleDicomWriter(*this); +} + +void mitk::FiberBundleDicomWriter::Write() +{ + try + { + const std::string& locale = "C"; + const std::string& currLocale = setlocale( LC_ALL, nullptr ); + setlocale(LC_ALL, locale.c_str()); + + // Instance Number, Label, Description, Creator's Name + ContentIdentificationMacro id("1", "TRACTOGRAM", "Tractogram processed with MITK Diffusion", "MIC@DKFZ"); + + // Manufacturer, model name, serial number, software version(s) + IODEnhGeneralEquipmentModule::EquipmentInfo equipment("MIC@DKFZ", "dcmtract library", "0815", OFFIS_DCMTK_VERSION_STRING); + IODReferences refs; + + // We need at least one image reference this Tractography Results object is based on. + // We provide: Patient ID, Study Instance UID, Series Instance UID, SOP Instance UID, SOP Class UID + IODImageReference* ref = new IODImageReference("PAT_ID_4711", "1.2.3", "4.5.6", "7.8.9", UID_MRImageStorage); + refs.add(ref); + + OFString contentDate = boost::gregorian::to_iso_string(boost::gregorian::day_clock::universal_day()).c_str(); + OFString contentTime = boost::posix_time::to_iso_string(boost::posix_time::second_clock::universal_time()).substr(9).c_str(); + + TrcTractographyResults *trc = NULL; + TrcTractographyResults::create(id, contentDate, contentTime, equipment, refs, trc); + + // Create track set + CodeWithModifiers anatomy(""); + anatomy.set("T-A0095", "SRT", "White matter of brain and spinal cord"); + + // Every CodeSequenceMacro has: Code Value, Coding Scheme Designator, Code Meaning + CodeSequenceMacro diffusionModel("sup181_bb03", "DCM", "Single Tensor"); + CodeSequenceMacro algorithmId("sup181_ee01", "DCM", "Deterministic"); + TrcTrackSet *set = NULL; + trc->addTrackSet("First and last Track Set", "Mini description", anatomy, diffusionModel, algorithmId, set); + + // Create trackset + mitk::FiberBundle::ConstPointer fib = dynamic_cast(this->GetInput()); + vtkPolyData* poly = fib->GetFiberPolyData(); + + Uint16 cieLabColor[3]; // color the whole track with this color; we use some blue + cieLabColor[0] = 30000; // L + cieLabColor[1] = 0 ; // a + cieLabColor[2] = 0 ; // b + + for (int i=0; iGetNumFibers(); i++) + { + vtkCell* cell = poly->GetCell(i); + int numPoints = cell->GetNumberOfPoints(); + vtkPoints* points = cell->GetPoints(); + + Float32 pointData[numPoints*3]; + for(int i=0; iGetPoint(i); + + pointData[i*3] = p[0]; + pointData[i*3+1] = p[1]; + pointData[i*3+2] = p[2]; + } + + TrcTrack* track = NULL; + set->addTrack(pointData, numPoints, cieLabColor, 1 /* numColors */, track); + } + + // Frame of Reference is required; could be the same as from related MR series + trc->getFrameOfReference().setFrameOfReferenceUID("10.11.12"); + + // Set some optional data + trc->getPatient().setPatientID("4711"); + trc->getPatient().setPatientName("Doe^John"); + trc->getSeries().setSeriesDescription("This is just a test series with a single Tractography Results object inside"); + + // Save file + trc->saveFile(this->GetOutputLocation().c_str()); + delete trc; + + setlocale(LC_ALL, currLocale.c_str()); + MITK_INFO << "DICOM Fiber bundle written to " << this->GetOutputLocation(); + } + catch(...) + { + throw; + } +} diff --git a/Modules/DiffusionImaging/DiffusionIO/mitkFiberBundleDicomWriter.h b/Modules/DiffusionImaging/DiffusionIO/mitkFiberBundleDicomWriter.h new file mode 100644 index 0000000000..129133dba7 --- /dev/null +++ b/Modules/DiffusionImaging/DiffusionIO/mitkFiberBundleDicomWriter.h @@ -0,0 +1,47 @@ +/*=================================================================== + +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. + +===================================================================*/ + +#ifndef __mitkFiberBundleDicomWriter_h +#define __mitkFiberBundleDicomWriter_h + +#include +#include "mitkFiberBundle.h" + +namespace mitk +{ + +/** + * Writes fiber bundles to a DICOM file + * @ingroup Process + */ +class FiberBundleDicomWriter : public mitk::AbstractFileWriter +{ +public: + + + FiberBundleDicomWriter(); + FiberBundleDicomWriter(const FiberBundleDicomWriter & other); + virtual FiberBundleDicomWriter * Clone() const override; + virtual ~FiberBundleDicomWriter(); + + using mitk::AbstractFileWriter::Write; + virtual void Write() override; +}; + + +} // end of namespace mitk + +#endif //__mitkFiberBundleWriter_h diff --git a/Modules/DiffusionImaging/DiffusionIO/mitkFiberBundleTrackVisWriter.cpp b/Modules/DiffusionImaging/DiffusionIO/mitkFiberBundleTrackVisWriter.cpp index f6651104f1..40a7dccd5c 100644 --- a/Modules/DiffusionImaging/DiffusionIO/mitkFiberBundleTrackVisWriter.cpp +++ b/Modules/DiffusionImaging/DiffusionIO/mitkFiberBundleTrackVisWriter.cpp @@ -1,109 +1,108 @@ /*=================================================================== 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 "mitkFiberBundleTrackVisWriter.h" #include #include #include #include #include #include #include #include #include #include #include "mitkDiffusionIOMimeTypes.h" mitk::FiberBundleTrackVisWriter::FiberBundleTrackVisWriter() : mitk::AbstractFileWriter(mitk::FiberBundle::GetStaticNameOfClass(), mitk::DiffusionIOMimeTypes::FIBERBUNDLE_TRK_MIMETYPE_NAME(), "TrackVis Fiber Bundle Reader") { Options defaultOptions; defaultOptions["Save in LPS space (if unchecked, use RAS)"] = true; this->SetDefaultOptions(defaultOptions); RegisterService(); } mitk::FiberBundleTrackVisWriter::FiberBundleTrackVisWriter(const mitk::FiberBundleTrackVisWriter & other) :mitk::AbstractFileWriter(other) {} mitk::FiberBundleTrackVisWriter::~FiberBundleTrackVisWriter() {} mitk::FiberBundleTrackVisWriter * mitk::FiberBundleTrackVisWriter::Clone() const { return new mitk::FiberBundleTrackVisWriter(*this); } void mitk::FiberBundleTrackVisWriter::Write() { std::ostream* out; std::ofstream outStream; if( this->GetOutputStream() ) { out = this->GetOutputStream(); }else{ outStream.open( this->GetOutputLocation().c_str() ); out = &outStream; } if ( !out->good() ) { mitkThrow() << "Stream not good."; } try { const std::string& locale = "C"; const std::string& currLocale = setlocale( LC_ALL, nullptr ); setlocale(LC_ALL, locale.c_str()); - std::locale previousLocale(out->getloc()); std::locale I("C"); out->imbue(I); std::string filename = this->GetOutputLocation().c_str(); mitk::FiberBundle::ConstPointer input = dynamic_cast(this->GetInput()); std::string ext = itksys::SystemTools::GetFilenameLastExtension(this->GetOutputLocation().c_str()); // default extension is .fib if(ext == "") { ext = ".trk"; this->SetOutputLocation(this->GetOutputLocation() + ext); } Options options = this->GetOptions(); bool lps = us::any_cast(options["Save in LPS space (if unchecked, use RAS)"]); MITK_INFO << "Writing fiber bundle as TRK"; TrackVisFiberReader trk; trk.create(filename, input.GetPointer(), lps); trk.writeHdr(); trk.append(input.GetPointer()); setlocale(LC_ALL, currLocale.c_str()); - MITK_INFO << "Fiber bundle written"; + MITK_INFO << "TrackVis Fiber bundle written to " << filename; } catch(...) { throw; } } diff --git a/Modules/DiffusionImaging/DiffusionIO/mitkFiberBundleVtkWriter.cpp b/Modules/DiffusionImaging/DiffusionIO/mitkFiberBundleVtkWriter.cpp index f0599994c3..36f7773a82 100644 --- a/Modules/DiffusionImaging/DiffusionIO/mitkFiberBundleVtkWriter.cpp +++ b/Modules/DiffusionImaging/DiffusionIO/mitkFiberBundleVtkWriter.cpp @@ -1,172 +1,171 @@ /*=================================================================== 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 "mitkFiberBundleVtkWriter.h" #include #include #include #include #include #include #include #include #include #include #include #include "mitkDiffusionIOMimeTypes.h" mitk::FiberBundleVtkWriter::FiberBundleVtkWriter() : mitk::AbstractFileWriter(mitk::FiberBundle::GetStaticNameOfClass(), mitk::DiffusionIOMimeTypes::FIBERBUNDLE_VTK_MIMETYPE_NAME(), "VTK Fiber Bundle Writer") { Options defaultOptions; defaultOptions["Save as binary file"] = true; defaultOptions["Save as xml file (vtp style)"] = false; defaultOptions["Save color information"] = false; defaultOptions["Save fiber weights"] = true; this->SetDefaultOptions(defaultOptions); RegisterService(); } mitk::FiberBundleVtkWriter::FiberBundleVtkWriter(const mitk::FiberBundleVtkWriter & other) :mitk::AbstractFileWriter(other) {} mitk::FiberBundleVtkWriter::~FiberBundleVtkWriter() {} mitk::FiberBundleVtkWriter * mitk::FiberBundleVtkWriter::Clone() const { return new mitk::FiberBundleVtkWriter(*this); } void mitk::FiberBundleVtkWriter::Write() { std::ostream* out; std::ofstream outStream; if( this->GetOutputStream() ) { out = this->GetOutputStream(); }else{ outStream.open( this->GetOutputLocation().c_str() ); out = &outStream; } if ( !out->good() ) { mitkThrow() << "Stream not good."; } try { const std::string& locale = "C"; const std::string& currLocale = setlocale( LC_ALL, nullptr ); setlocale(LC_ALL, locale.c_str()); - std::locale previousLocale(out->getloc()); std::locale I("C"); out->imbue(I); std::string filename = this->GetOutputLocation().c_str(); mitk::FiberBundle::ConstPointer input = dynamic_cast(this->GetInput()); std::string ext = itksys::SystemTools::GetFilenameLastExtension(this->GetOutputLocation().c_str()); Options options = this->GetOptions(); vtkSmartPointer weights = nullptr; vtkSmartPointer fiberColors = nullptr; vtkSmartPointer fibPoly = input->GetFiberPolyData(); if (us::any_cast(options["Save fiber weights"])) { MITK_INFO << "Adding fiber weight information"; fibPoly->GetCellData()->AddArray(input->GetFiberWeights()); } else if (fibPoly->GetCellData()->HasArray("FIBER_WEIGHTS")) { weights = input->GetFiberWeights(); fibPoly->GetCellData()->RemoveArray("FIBER_WEIGHTS"); } if (us::any_cast(options["Save color information"])) { MITK_INFO << "Adding color information"; fibPoly->GetPointData()->AddArray(input->GetFiberColors()); } else if (fibPoly->GetPointData()->HasArray("FIBER_COLORS")) { fiberColors = input->GetFiberColors(); fibPoly->GetPointData()->RemoveArray("FIBER_COLORS"); } // default extension is .fib if(ext == "") { ext = ".fib"; this->SetOutputLocation(this->GetOutputLocation() + ext); } if (us::any_cast(options["Save as xml file (vtp style)"])) { vtkSmartPointer writer = vtkSmartPointer::New(); writer->SetInputData(fibPoly); writer->SetFileName(filename.c_str()); if (us::any_cast(options["Save as binary file"])) { MITK_INFO << "Writing fiber bundle as vtk binary file"; writer->SetDataModeToBinary(); } else { MITK_INFO << "Writing fiber bundle as vtk ascii file"; writer->SetDataModeToAscii(); } writer->Write(); } else { vtkSmartPointer writer = vtkSmartPointer::New(); writer->SetInputData(fibPoly); writer->SetFileName(filename.c_str()); if (us::any_cast(options["Save as binary file"])) { MITK_INFO << "Writing fiber bundle as vtk binary file"; writer->SetFileTypeToBinary(); } else { MITK_INFO << "Writing fiber bundle as vtk ascii file"; writer->SetFileTypeToASCII(); } writer->Write(); } // restore arrays if ( weights!=nullptr ) fibPoly->GetPointData()->AddArray(weights); if (fiberColors != nullptr) fibPoly->GetPointData()->AddArray(fiberColors); setlocale(LC_ALL, currLocale.c_str()); - MITK_INFO << "Fiber bundle written"; + MITK_INFO << "VTK Fiber bundle written to " << filename; } catch(...) { throw; } }