diff --git a/Modules/DiffusionImaging/IODataStructures/FiberBundleX/mitkFiberBundleX.cpp b/Modules/DiffusionImaging/IODataStructures/FiberBundleX/mitkFiberBundleX.cpp index 14862f9e19..15fc1577fc 100644 --- a/Modules/DiffusionImaging/IODataStructures/FiberBundleX/mitkFiberBundleX.cpp +++ b/Modules/DiffusionImaging/IODataStructures/FiberBundleX/mitkFiberBundleX.cpp @@ -1,143 +1,165 @@ /*========================================================================= - + Program: Medical Imaging & Interaction Toolkit Language: C++ Date: $Date: 2010-03-31 16:40:27 +0200 (Mi, 31 Mrz 2010) $ Version: $Revision: 21975 $ - + Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. See MITKCopyright.txt or http://www.mitk.org/copyright.html for details. - + This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notices for more information. - + =========================================================================*/ #include "mitkFiberBundleX.h" #include #include // baptize array names const char* mitk::FiberBundleX::COLORCODING_ORIENTATION_BASED = "Color_Orient"; const char* mitk::FiberBundleX::COLORCODING_FA_BASED = "Color_FA"; mitk::FiberBundleX::FiberBundleX() { - - - + + + } mitk::FiberBundleX::~FiberBundleX() { - + } /* === main input method ==== * set computed fibers from tractography algorithms */ void mitk::FiberBundleX::SetFibers(vtkSmartPointer fiberPD) { m_OriginalFiberPolyData = fiberPD; } - + /* === main output method === * return fiberbundle as vtkPolyData * Depending on processing of input fibers, this method returns * the latest processed fibers. */ vtkPolyData* mitk::FiberBundleX::GetFibers() { vtkPolyData* returningFibers = m_FiberPolyData; if (returningFibers == NULL) { returningFibers = m_OriginalFiberPolyData; } return returningFibers; } /* * return original set of fiberdata */ vtkPolyData* mitk::FiberBundleX::GetOriginalFibers() { return m_OriginalFiberPolyData; } /*============================================== *++++ PROCESSING WITH FIBER INFORMATION +++++++ =============================================*/ void mitk::FiberBundleX::DoColorCodingOrientationbased() { /* === decide which polydata to choose === * usually you call this method when u received fresh fibers from an tracking algorithm. * In this case the variable m_OriginalFiberPolyData will act as source for creating color * information for each point. However, if u process on fibers and forgot calling colorcoding * before calling any other method (e.g. linesmoothing), then - for performance reason - it makes * sense not to process on the "original" pointset, but on the smoothed one (well, this might lack * in performance anyway ;-) ). * * It might occur that u call this method again - u must be drunk then - but this algorithm takes * care of ur incapability by checking if there already exists a color array for orientation based * color information */ - vtkPolyData* fiberSource; //this variable provides the source where operations actually process on - if ( m_FiberPolyData.GetPointer() == NULL ) + //these variables are needed for some intelligence in handling colorarrays and already smoothed structures + bool isSmoothedFibOK = true; + bool isOriginalFibOK = true; + + // if there already exists a smoothed fiberbundle, then check if color array is OK + if ( m_FiberPolyData.GetPointer() != NULL ) + { + if ( m_FiberPolyData->GetPointData()->HasArray(COLORCODING_ORIENTATION_BASED) ) + { // validate if points match + if ( m_FiberPolyData->GetNumberOfPoints() != m_FiberPolyData->GetPointData()->GetArray(COLORCODING_ORIENTATION_BASED)->GetNumberOfTuples() ) + { + isSmoothedFibOK = false; + MITK_INFO << "NUMBER OF POINTS DOES NOT MATCH COLOR INFORMATION in m_FiberPolyData, ARRAY: " << COLORCODING_ORIENTATION_BASED ; + } + } + /*else { + // there exists a smoothed datastructure but no orientationbased color information is given + // IT IS RECOMMENDED TO RECONSTRUCT THIS DATASTRUCTURE AGAIN + } */ + + } //else there exists NO smoothed fibers, which means there exists also no color array which implies that fiber and color relation is OK :-) + + + //check if color array in original fiber dataset is valid + if ( m_OriginalFiberPolyData != NULL ) { - fiberSource = m_OriginalFiberPolyData; - // check if color array already exists - if (fiberSource->GetPointData()->HasArray(COLORCODING_ORIENTATION_BASED)) + if ( m_OriginalFiberPolyData->GetPointData()->HasArray(COLORCODING_ORIENTATION_BASED) ) { // validate input, number of items must match number of points - if (fiberSource->GetNumberOfPoints() == fiberSource->GetPointData()->GetArray(COLORCODING_ORIENTATION_BASED)->GetNumberOfTuples()) + if ( m_OriginalFiberPolyData->GetNumberOfPoints() != m_OriginalFiberPolyData->GetPointData()->GetArray(COLORCODING_ORIENTATION_BASED)->GetNumberOfTuples() ) { - return; // looks like everything is fine, we have already defined a color for each fiberpoint + isOriginalFibOK = false; + MITK_INFO << "NUMBER OF POINTS DOES NOT MATCH COLOR INFORMATION in m_OriginalFiberPolyData, ARRAY: " << COLORCODING_ORIENTATION_BASED; } } - - } else if (m_FiberPolyData->GetPointData()->HasArray(COLORCODING_ORIENTATION_BASED) ) { - fiberSource = m_FiberPolyData; + + } else { + MITK_INFO << "NO FIBERS FROM TRACTOGRAPHY PASSED TO mitkFiberBundleX yet!! no colorcoding can be processed!"; + return; } - //colors and alpha value for each single point, RGBA = 4 components vtkUnsignedCharArray *colorsT = vtkUnsignedCharArray::New(); colorsT->SetNumberOfComponents(4); - colorsT->SetName("ColorcodingOrient"); + colorsT->SetName(COLORCODING_ORIENTATION_BASED); } /* ESSENTIAL IMPLEMENTATION OF SUPERCLASS METHODS */ void mitk::FiberBundleX::UpdateOutputInformation() { - + } void mitk::FiberBundleX::SetRequestedRegionToLargestPossibleRegion() { - + } bool mitk::FiberBundleX::RequestedRegionIsOutsideOfTheBufferedRegion() { return false; } bool mitk::FiberBundleX::VerifyRequestedRegion() { return true; } void mitk::FiberBundleX::SetRequestedRegion( itk::DataObject *data ) { - + } \ No newline at end of file diff --git a/Modules/DiffusionImaging/IODataStructures/FiberBundleX/mitkFiberBundleX.h b/Modules/DiffusionImaging/IODataStructures/FiberBundleX/mitkFiberBundleX.h index d92086291f..f07dedc80d 100644 --- a/Modules/DiffusionImaging/IODataStructures/FiberBundleX/mitkFiberBundleX.h +++ b/Modules/DiffusionImaging/IODataStructures/FiberBundleX/mitkFiberBundleX.h @@ -1,100 +1,101 @@ /*========================================================================= Program: Medical Imaging & Interaction Toolkit Module: $RCSfile$ Language: C++ Date: $Date$ Version: $Revision: 11989 $ Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. See MITKCopyright.txt or http://www.mitk.org/copyright.html for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notices for more information. =========================================================================*/ #ifndef _MITK_FiberBundleX_H #define _MITK_FiberBundleX_H //includes for MITK datastructure #include "mitkBaseData.h" #include "MitkDiffusionImagingExports.h" //includes storing fiberdata #include //may be replaced by class precompile argument #include // may be replaced by class #include // my be replaced by class namespace mitk { /** * \brief Base Class for Fiber Bundles; */ class MitkDiffusionImaging_EXPORT FiberBundleX : public BaseData { public: // names of certain arrays (e.g colorcodings, etc.) static const char* COLORCODING_ORIENTATION_BASED; static const char* COLORCODING_FA_BASED; /* friend classes wanna access typedefs ContainerPointType, ContainerTractType, ContainerType */ friend class FiberBundleXWriter; friend class FiberBundleXReader; // ======virtual methods must have====== virtual void UpdateOutputInformation(); virtual void SetRequestedRegionToLargestPossibleRegion(); virtual bool RequestedRegionIsOutsideOfTheBufferedRegion(); virtual bool VerifyRequestedRegion(); virtual void SetRequestedRegion( itk::DataObject *data ); //======================================= mitkClassMacro( FiberBundleX, BaseData ); itkNewMacro( Self ); // import fiber result from tractography algorithms void SetFibers(vtkSmartPointer); // return original computed fibers ... actually there is no smartpointer needed because original fibers are passed from the tractography filter vtkPolyData* GetOriginalFibers(); // return processed fibers vtkPolyData* GetFibers(); // return vertex polydata vtkPolyData* GetVertices(); void DoColorCodingOrientationbased(); protected: FiberBundleX(); virtual ~FiberBundleX(); private: // The following polydata variables are used for fiber- and pointbased representation of the tractography results. As VTK suggests, one vtkPolyData is used to manage vertices and the other for polylines. // FiberPolyData stores all brain fibers using polylines (in world coordinates) - // this variable hosts the original fiber data + // this variable hosts the smoothed fiber data, this data we generate, therefore a smartpointer structure is recommended vtkSmartPointer m_FiberPolyData; - // this variable hosts the smoothed fiber data, no smartpointer needed + // this variable hosts the original fiber data, no smartpointer needed because who or whatever passes this data to FiberBundleX should use vtkSmartPointer structure + vtkPolyData* m_OriginalFiberPolyData; // VertexPolyData stores all original points as vertices computed by tracking algorithms vtkSmartPointer m_VertexPolyData; }; } // namespace mitk #endif /* _MITK_FiberBundleX_H */