MeVisLabToolboxReference
MeVisLab/Standard/Sources/ML/MLVesselGraph/mlGraph.h
Go to the documentation of this file.
00001 // **InsertLicense** code
00011 #ifndef __mlGraph_H
00012 #define __mlGraph_H
00013 
00014 // Include dll-specific settings.
00015 #include "mlVesselGraphSystem.h"
00016 
00017 // ThirdParty/System includes
00018 #include "mlSystemWarningsDisable.h"
00019 #include <boost/iterator/transform_iterator.hpp>
00020 #include <boost/shared_ptr.hpp>
00021 #include <map>
00022 #include "mlSystemWarningsRestore.h"
00023 
00024 // ML includes
00025 #include "mlBase.h"
00026 #include "mlImageVector.h"
00027 #include "mlSubImageBoxd.h"
00028 #include "mlVector3.h"
00029 
00030 // MLVesselGraph includes
00031 #include "Properties/mlPropertyManager.h"
00032 
00033 // Be sure that all your modules are part of the ml. So collisions
00034 // with names in system files or other libraries are minimized.
00035 ML_START_NAMESPACE
00036 
00037 // Forward-declarations
00038 class GraphAction;
00039 class VesselEdge;
00040 class VesselNode;
00041 
00042 
00059 class VESSELGRAPH_EXPORT Graph : public Base
00060 {
00061 
00062 friend class GraphAnalyser;
00063 friend class SaveTreeData;
00064 friend class LoadTreeData;
00065 public:
00066 
00069   enum {node,edge};
00070 
00072   enum ActionType{
00073      NoAction =0, // Not changed.
00074      LabelGraph,  // Skeleton label values changed.
00075      EditGraph,   // Skeleton label colors changed.
00076      ModifyRoots, // Roots modified: graph is redirected
00077      ModifyNodesEdges, // Remove/Insert edges, insert nodes
00078      NewGraph,         // Everything new
00079      NumActionTypes    //
00080   };
00081 
00082   //----------------------------------------------------------
00084 
00085   //----------------------------------------------------------
00087   Graph();
00088 
00090   Graph( const Graph& g, bool reorder=false );
00091 
00093   Graph( const Graph& g, const VesselNode* root, bool reorder=false );
00094 
00096   Graph( const Graph& g, const std::vector<const VesselNode*> &roots, bool reorder=false );
00097 
00099   Graph( Graph& g, int clusterId, bool reorder=false);
00100 
00102   virtual Graph* deepCopy() const { return new Graph(*this); };
00103   
00105   virtual ~Graph();
00107 
00108   //------------------------------------------------------
00110 
00111   //------------------------------------------------------
00114   static bool hasVesselVoxels;
00116 
00117   //---------------------------------------------------------
00119 
00120   //---------------------------------------------------------
00121 
00123   VesselEdge* createEdge(VesselNode* predNode, VesselNode* succNode, MLint useId=-1);
00125   VesselEdge* createEdge(MLint predNodeId, MLint succNodeId, MLint useId=-1);
00126 
00128   VesselNode* createNode(const Vector3& pos=Vector3(0), MLint useId=-1);
00130   VesselNode* createNode(const ImageVector& pos, MLint useId=-1) { return this->createNode(Vector3(pos.x, pos.y, pos.z), useId); };
00131 
00133   void insertRoot(VesselNode* node);
00134 
00136 
00137 
00138   //---------------------------------------------------------
00140 
00141   //---------------------------------------------------------
00142 
00144   void addGraph(const Graph& g) {
00145     std::map<const VesselNode*, VesselNode*> nodeMapping;
00146     std::map<const VesselEdge*, VesselEdge*> edgeMapping;
00147     std::map<const VesselNode*, VesselNode*> rootMapping;
00148     this->addGraph(g, nodeMapping, edgeMapping, rootMapping);
00149   }
00150 
00154   void addGraph(const Graph& g, std::map<const VesselNode*, VesselNode*>& nodeMapping, std::map<const VesselEdge*, VesselEdge*>& edgeMapping, std::map<const VesselNode*, VesselNode*>& rootMapping);
00155 
00157   void addSubtrees(const std::vector<const VesselNode*>& roots);
00158 
00161   void copyParts(const std::vector<const VesselNode*>& nodes, const std::vector<const VesselEdge*>& edges, const std::vector<const VesselNode*>& roots) {
00162     std::map<const VesselNode*, VesselNode*> nodeMapping;
00163     std::map<const VesselEdge*, VesselEdge*> edgeMapping;
00164     std::map<const VesselNode*, VesselNode*> rootMapping;
00165     this->copyParts(nodes, edges, roots, nodeMapping, edgeMapping, rootMapping);
00166   }
00167 
00171   void copyParts(const std::vector<const VesselNode*>& nodes, const std::vector<const VesselEdge*>& edges, const std::vector<const VesselNode*>& roots, std::map<const VesselNode*, VesselNode*>& nodeMapping, std::map<const VesselEdge*, VesselEdge*>& edgeMapping, std::map<const VesselNode*, VesselNode*>& rootMapping);
00172 
00174 
00175   //--------------------------------------------------------
00177 
00178   //--------------------------------------------------------
00180   bool removeEdge(VesselEdge* edge, bool removeEmptyNodes=true);
00182   bool removeNode(VesselNode* node);
00184   void removeRoot(VesselNode* r);
00186   void clearRoots();
00188   void clearGraph();
00190 
00191 
00193   typedef std::map<MLint, VesselNode*> NodeMap;
00195   typedef boost::function< VesselNode* (const NodeMap::value_type &) > NodeAccess;
00197   typedef boost::function< const VesselNode* (const NodeMap::value_type &) > ConstNodeAccess;
00199   typedef boost::transform_iterator<NodeAccess, NodeMap::iterator> NodeIterator;
00201   typedef boost::transform_iterator<ConstNodeAccess, NodeMap::const_iterator> ConstNodeIterator;
00202 
00204   typedef std::map<MLint, VesselEdge*> EdgeMap;
00206   typedef boost::function< VesselEdge* (const EdgeMap::value_type &) > EdgeAccess;
00208   typedef boost::function< const VesselEdge* (const EdgeMap::value_type &) > ConstEdgeAccess;
00210   typedef boost::transform_iterator<EdgeAccess, EdgeMap::iterator> EdgeIterator;
00212   typedef boost::transform_iterator<ConstEdgeAccess, EdgeMap::const_iterator> ConstEdgeIterator;
00213 
00214   //---------------------------------------------------------
00216 
00217   //--------------------------------------------------------
00218 
00220   NodeIterator beginNode() { return boost::make_transform_iterator( _nodes.begin(), &getSecond< VesselNode*, NodeMap::value_type > ); }
00222   NodeIterator endNode  () { return boost::make_transform_iterator( _nodes.end(), &getSecond< VesselNode*, NodeMap::value_type > ); }
00223 
00225   ConstNodeIterator beginNode() const { return boost::make_transform_iterator( _nodes.begin(), &getSecond< const VesselNode*, NodeMap::value_type > ); }
00227   ConstNodeIterator endNode  () const { return boost::make_transform_iterator( _nodes.end(), &getSecond< const VesselNode*, NodeMap::value_type > ); }
00228 
00230   EdgeIterator beginEdge() { return boost::make_transform_iterator( _edges.begin(), &getSecond< VesselEdge*, EdgeMap::value_type > ); }
00232   EdgeIterator endEdge  () { return boost::make_transform_iterator( _edges.end(), &getSecond< VesselEdge*, EdgeMap::value_type > ); }
00233 
00235   ConstEdgeIterator beginEdge() const { return boost::make_transform_iterator( _edges.begin(), &getSecond< const VesselEdge*, EdgeMap::value_type > ); }
00237   ConstEdgeIterator endEdge  () const { return boost::make_transform_iterator( _edges.end(), &getSecond< const VesselEdge*, EdgeMap::value_type > ); }
00238 
00240   NodeIterator beginRoot() { return boost::make_transform_iterator( _roots.begin(), &getSecond< VesselNode*, NodeMap::value_type > ); }
00242   NodeIterator endRoot  () { return boost::make_transform_iterator( _roots.end(), &getSecond< VesselNode*, NodeMap::value_type > ); }
00243 
00245   ConstNodeIterator beginRoot() const { return boost::make_transform_iterator( _roots.begin(), &getSecond< const VesselNode*, NodeMap::value_type > ); }
00247   ConstNodeIterator endRoot  () const { return boost::make_transform_iterator( _roots.end(), &getSecond< const VesselNode*, NodeMap::value_type > ); }
00248 
00250   size_t numNodes() const {return _nodes.size();};
00252   size_t numEdges() const {return _edges.size();};
00254   size_t numRoots() const {return _roots.size();};
00255 
00257   const VesselNode* getIdNode(MLint id) const;
00259   VesselNode* getIdNode(MLint id);
00261   const VesselEdge* getIdEdge(MLint id) const;
00263   VesselEdge* getIdEdge(MLint id);
00264 
00266   const VesselNode* getNode(Vector3 pos) const;
00268   VesselNode* getNode(Vector3 pos);
00270   const VesselEdge* getEdge(Vector3 pos) const;
00272   VesselEdge* getEdge(Vector3 pos);
00274   const VesselNode* getRoot(Vector3 pos) const;
00276   VesselNode* getRoot(Vector3 pos);
00277 
00280   const VesselNode* getNode(size_t index) const;
00283   VesselNode* getNode(size_t index);
00284 
00287   const VesselEdge* getEdge(size_t index) const;
00290   VesselEdge* getEdge(size_t index);
00291 
00294   const VesselNode* getRoot(size_t index) const;
00297   VesselNode* getRoot(size_t index);
00298 
00300   size_t getIndex(const VesselNode* node) const;
00302   size_t getIndex(const VesselEdge* edge) const;
00304 
00305 
00307 
00308 
00309   PropertyManager::Pointer getNodePropertyManager() { return _nodePropertyManager; }
00310   PropertyManager::ConstPointer getNodePropertyManager() const { return _nodePropertyManager; }
00311 
00313   PropertyManager::Pointer getEdgePropertyManager() { return _edgePropertyManager; }
00314   PropertyManager::ConstPointer getEdgePropertyManager() const { return _edgePropertyManager; }
00315 
00317   PropertyManager::Pointer getSkeletonPropertyManager() { return _skeletonPropertyManager; }
00318   PropertyManager::ConstPointer getSkeletonPropertyManager() const { return _skeletonPropertyManager; }
00320 
00321   //---------------------------------------------------------
00323 
00324   //---------------------------------------------------------
00325   void transform(const Matrix4& m);
00326 
00328   void setToWorldMatrix(const Matrix4 *m);
00330   void setToWorldMatrix(const Matrix4 &m);
00332   const Matrix4 *getToWorldMatrix() const;
00334   void getToWorldMatrix(float *mat) const;
00336   Matrix4 getToVoxelMatrix() const;
00337 
00339   void setToWorld(void)  {_isWorld=true;}
00341   void setToVoxel(void)  {_isWorld=false;}
00343   bool isWorld()         const {return _isWorld;}
00345   void worldVoxelConvert();
00348   void convertToVoxel(void);
00351   void convertToWorld(void);
00352 
00354   void    setImgExt(ImageVector v)  {_imgExt = v;}
00355   ImageVector  getImgExt()      const {return _imgExt;}
00356   int     extX()           const {return _imgExt.x;}
00357   int     extY()           const {return _imgExt.y;}
00358   int     extZ()           const {return _imgExt.z;}
00359 
00360   void    setVoxelExt(Vector3 v) {_voxelExt = v;}
00361   Vector3    getVoxelExt()  const {return _voxelExt;}
00363 
00364   int getNumCluster() const { return _numCluster; }
00365 
00366   bool   getFlag()            const { return _bFlag;}
00367   void   setFlag(bool bFlag)  { _bFlag = bFlag;}
00368 
00371   void closeSkeletonGaps();
00372 
00376   MLint  splitEdge (MLint edgeID, size_t skeletonIndex);
00377   bool   mergeEdges(VesselEdge* parent, VesselEdge* child);
00378 
00379   void clampToImage();
00380   
00381   //-------------------------------------------------------
00383 
00384   //-------------------------------------------------------
00387   virtual void addStateToTree(TreeNode* parent) const;
00389   ML_SET_ADDSTATE_VERSION(3);
00391   virtual void readStateFromTree(TreeNode* parent);
00392 
00395   int getVersion( void ) { return _version; }
00397   void setCurrentVersion( void ) { _version = getAddStateVersion(); }
00399   void setVersion( int version ) { _version = version; }
00401 
00402   //--------------------------------------------------------
00404 
00405   //--------------------------------------------------------
00407   Graph &operator = (const  Graph& g);
00408   //Allocate new graph with same properties as this (slowly).
00409   Graph *newGraph(bool bXml=true) const;
00410   //friend void copyVessels(Graph &copy,const Graph &source);
00412 
00413   //---------------------------------------------------------
00415 
00416   //---------------------------------------------------------
00419   int separateGraph();
00420 
00441   bool directGraph(float FloodThresh);
00442 
00446   void stripCycles();
00447 
00450   void setRootIdToAllChildren();
00451   
00455   void purifyGraph();
00457 
00458   //------------------------------------------------------
00460 
00461   //------------------------------------------------------
00463   SubImageBoxd getBoundingBox() const;
00465 
00466   //------------------------------------------------------
00468 
00469   //------------------------------------------------------
00470   void         setAction( ActionType action, std::string sender );
00471   ActionType   getActionValue(void) const;
00472   void         setActionValue( ActionType action );
00473   void         setActionCallBack( GraphAction *cbObj );
00475 
00476   //-----------------------------------------------------------
00478 
00479 
00480   static double getMinSkeletonLabel( void ) { return MIN_SKELETON_LABEL; }
00481   static double getMaxSkeletonLabel( void ) { return MAX_SKELETON_LABEL; }
00483 
00484 #ifdef ML_DEPRECATED
00485   ML_DEPRECATED static Graph* skeletonGraphFromBase( Base* a_base );
00486 #endif
00487   
00488 protected:
00489   template <typename ResultType, typename ParameterType>
00490   static ResultType getSecond(const ParameterType& p) { return p.second; }
00491 
00493   bool _bFlag;
00494 
00496   bool    _isWorld;
00498   Matrix4    _toWorldMatrix;
00500   ImageVector  _imgExt;
00502   Vector3  _voxelExt;
00503 
00505   std::map<MLint, VesselNode*> _nodes;
00506   std::map<MLint, VesselEdge*> _edges;
00507   std::map<MLint, VesselNode*> _roots;
00508 
00511   int _numCluster;
00512 
00513 private:
00516   int _version;
00517 
00518   PropertyManager::Pointer _nodePropertyManager;
00519   PropertyManager::Pointer _edgePropertyManager;
00520   PropertyManager::Pointer _skeletonPropertyManager;
00521 
00522   //------------------------------------------------------
00524 
00525   //------------------------------------------------------
00526    ActionType   _action;
00527    GraphAction *_actionCBObject;
00529 
00530   MLint nextNodeId() { return _nodes.empty() ? 1 : _nodes.rbegin()->first + 1; };
00531   MLint nextEdgeId() { return _edges.empty() ? 1 : _edges.rbegin()->first + 1; };
00532   MLint nextRootId() { return _roots.empty() ? 1 : _roots.rbegin()->first + 1; };
00533 
00536   void _setRootIdToChildren(int rootId, VesselNode* node, VesselEdge* predEdge);
00537   
00538   //-----------------------------------------------------------
00540 
00541 
00542   static double MIN_SKELETON_LABEL;
00543   static double MAX_SKELETON_LABEL;
00545 
00548   void reorderItems();
00549 
00550   bool _isContainedInImageExtent(const Vector3& pos, const Matrix4& toVoxelMatrix);
00551 
00552   ML_CLASS_HEADER(Graph);
00553 };
00554 
00555 ML_END_NAMESPACE
00556 
00557 
00558 #endif