ó
Ì*[c           @   s£   d  Z  d d l Z d d l Z d d l m Z m Z d d l m Z d d l	 m
 Z
 d d l m Z d d l m Z m Z d d	 d
 „ Z d e f d „  ƒ  YZ d S(   s)   
Created on 12/06/2018

@author: rjag008
iÿÿÿÿN(   t   splprept   splev(   t   Context(   t   OrderedDict(   t   Node(   t   Elementt   Elementbasisgñhãˆµøä>g:Œ0âŽyE>c         C   s7  t  |  j ƒ d k r7 |  t j d d … f }  t } n t } d } t  |  j ƒ d k rg t | ƒ ‚ n  |  j d d k s‰ t | ƒ ‚ n  |  j d d k  r« t | ƒ ‚ n  |  j d } |  d d … d f } |  d d … d f } | d \ }	 }
 | d \ } } | |	 } | |
 } | } | } | |	 } | |
 } t | | | | ƒ } | | | | } t j | d t j	 ƒ} t | | | | | k <| | } | | } t j
 | | | | ƒ } t j
 | | | | ƒ } | | | | } t j | d t j	 ƒ} | d k | | k | | <| r/| d S| Sd S(   sß  Determine if a point is on a line segment
    Input
        points: Coordinates of either
                * one point given by sequence [x, y]
                * multiple points given by list of points or Nx2 array
        line: Endpoint coordinates [[x0, y0], [x1, y1]] or
              the equivalent 2x2 numeric array with each row corresponding
              to a point.
        rtol: Relative error for how close a point must be to be accepted
        atol: Absolute error for how close a point must be to be accepted
    Output
        True or False
    Notes
    Line can be degenerate and function still works to discern coinciding
    points from non-coinciding.
    Tolerances rtol and atol are used with numpy.allclose()
    i   NsB   Argument points must be either [x, y] or an Nx[>2] array of pointsi   i    t   dtype(   t   lent   shapet   npt   newaxist   Truet   Falset	   Exceptiont   abst   zerost   boolt   sqrt(   t   pointst   linet   rtolt   atolt	   one_pointt   msgt   Nt   xt   yt   x0t   y0t   x1t   y1t   a0t   a1t	   a_normal0t	   a_normal1t   b0t   b1t	   nominatort   denominatort   is_parallelt   a0pt   a1pt   len_at   len_bt   crosst   result(    (    sL   D:\Jagir_Hussan\Research\SPARC\workspace\StomachRelease\digitiser\mapping.pyt   pointOnLine   sH    	





t
   MeshMapperc           B   s�   e  Z d  Z d d d „ Z d d d „ Z d d d „ Z d „  Z e d „ Z d	 „  Z	 d
 „  Z
 d „  Z d „  Z d „  Z d „  Z d „  Z RS(   s^   
    Map material coordinates to anatomical coordinates to region type
    and vice versa
    i2   c         C   sg   | |  _  | |  _ d d d g d d d g d d d g d d	 d	 g d d
 d g d d d g g |  _ d S(   s   
        Constructor
        i“   iç   iÿ   i¨   iÑ   i�   i¢   iÆ   i    iÚ   ih   N(   t   discrett   boundaryDiscrett   colors(   t   selfR1   R2   (    (    sL   D:\Jagir_Hussan\Research\SPARC\workspace\StomachRelease\digitiser\mapping.pyt   __init__g   s    		i   i   c         C   so   t  d ƒ |  _ |  j j ƒ  } | j | ƒ | |  _ t | d ƒ � } | j ƒ  |  _ Wd  QX|  j | | ƒ d  S(   NR0   t   r(	   R   t   contextt   getDefaultRegiont   readFilet   regiont   opent   readt   mesht   generateMaps(   R4   t   soureMeshFilet   circumferentialElementst   axialElementsR:   R=   (    (    sL   D:\Jagir_Hussan\Research\SPARC\workspace\StomachRelease\digitiser\mapping.pyt   setupByFileo   s    	c         C   s”   | |  _  d d  l } d d  l } | j d t ƒ } |  j  j | j ƒ t | j d ƒ � } | j ƒ  |  _	 Wd  QX| j
 | j ƒ |  j | | ƒ d  S(   Niÿÿÿÿt   deleteR6   (   R:   t   tempfilet   ost   NamedTemporaryFileR   t	   writeFilet   nameR;   R<   R=   t   removeR>   (   R4   t   sourceR@   RA   RD   RE   t   ofileR=   (    (    sL   D:\Jagir_Hussan\Research\SPARC\workspace\StomachRelease\digitiser\mapping.pyt   setupByRegionx   s    	c         C   sê   t  d ƒ |  _ |  j j ƒ  } | |  _ t | d ƒ �® } t j | ƒ \	 } } } } } }	 }
 } } | |  _ | |  _ | |  _	 | |  _
 | |  _ |	 |  _ |
 |  _ | |  _ | j ƒ  } | j t | ƒ ƒ | j | ƒ | |  _ Wd  QXd  S(   NR0   t   rb(   R   R7   R8   R:   R;   t   picklet   loadR1   R2   t   leftWallCoordinatest   rightWallCoordinatest   ladderCoordinatest   surfaceCoordinatest   anatomicalCoordinatest   regionMappingst   createStreaminformationRegiont    createStreamresourceMemoryBuffert   strR<   R=   (   R4   RJ   R:   t   serR1   R2   t   lbRM   t   ladderRS   RT   RU   R=   t   sir(    (    sL   D:\Jagir_Hussan\Research\SPARC\workspace\StomachRelease\digitiser\mapping.pyt   setupByPickle„   s"    	*								c   '      C   s»  t  j d d d d ƒ } d } d } | j } | j d | d f ƒ } t  j | d d ƒ\ }	 }
 t  j | d d ƒ\ } } | j d } | j d } | d d … d f } | d d … d	 f } t  j | d
 t  j ƒ} t  j | d
 t  j	 ƒ} | |	 k | | k  | |
 k | | k  } t  j
 | ƒ } | | 9} t  j | ƒ sN| d k St  j | t k ƒ d } | | } | | } | | } | | } | | } | rxô t | ƒ D]i } | d	 | } | | d d … f | | d d … f g } t | | | | ƒ } t | | <t | | <q¬Wnz xw t | ƒ D]i } | d	 | } | | d d … f | | d d … f g } t | | | | ƒ } t | | <t | | <q)WxÎ t | ƒ D]À } | d	 | } | | d d … f \ } }  | | d d … f \ }! }" | |  |" |  |! | }# |  | k  |" | k }$ |" | k  |  | k }% | |# | k  |$ |% | }& d	 | |& | |& <q£Wt  j | �  | | | <t | ƒ d k r±| j | d | d	 f ƒ d k S| d k S(   sd   
        Based on https://github.com/inasafe/python-safe/blob/master/safe/engine/polygon.py
        t   invalidt   ignoret   divideg        iÿÿÿÿt   axisi    Ni   R   i   (   R
   t   seterrR	   t   reshapet   maxt   minR   t   intt   onesR   t   logical_nott   sometruet   whereR   t   rangeR/   R   R   ('   R4   RS   t   polygont   closedt   original_numpy_settingsR   R   t   scShapeR   t   maxpxt   maxpyt   minpxt   minpyt   MR   R   R   t   insidet
   candidatest
   outsideBoxt	   insideBoxt   ixt   inCandidatest   cPointst   cInsidet   cyt   cxt   it   jt   edget   boundaryPointst   px_it   py_it   px_jt   py_jt   sigmat   seg_it   seg_jt   mask(    (    sL   D:\Jagir_Hussan\Research\SPARC\workspace\StomachRelease\digitiser\mapping.pyt   pointsInPolygon—   sf    	*






,
,

!c   .   	   C   s­  |  j  j ƒ  } | j d ƒ } | j | j ƒ } | j ƒ  } t ƒ  } | j ƒ  } x6 | j ƒ  r‰ | | t	 | j
 ƒ  ƒ d <| j ƒ  } qT W| j ƒ  }	 t j t | ƒ d f ƒ }
 xM | j ƒ  D]? \ } } |	 j | ƒ | j |	 d ƒ \ } } | |
 | d <q¾ Wt j | d d f ƒ } t j | d f ƒ } xÞ t | d ƒ D]Ì } | | } x, t | ƒ D] } | | } |
 | | | <q]Wt | j d d  d d d d ƒ\ } } t d	 g | d
 d ƒ\ } } } | d | | d  d … f <| d | d | d g | | d d  … f <q@Wt | d  d  … d  d … f j d d  d d ƒ\ } } t j | j ƒ  | j ƒ  |  j ƒ } t | | d
 d ƒ\ } } t j | | f |  _ t | d  d  … d d … f j d d  d d ƒ\ } } t j | j ƒ  | j ƒ  |  j ƒ d  d  d … } t | | d
 d ƒ\ } } t j | | f |  _ | |  _ | j d ƒ } | j  ƒ  } t ƒ  } | j ƒ  } x2 | j ƒ  r¢| | t	 | j
 ƒ  ƒ <| j ƒ  } qqWt! } t | ƒ d k r)t" } | j d ƒ } | j  ƒ  } t ƒ  } | j ƒ  } x5 | j ƒ  r%| | t	 | j
 ƒ  ƒ <| j ƒ  } qôWn  | j ƒ  }	 t j d d |  j# ƒ } t j |  j# |  j# d f ƒ } t j$ | | ƒ \ }  }! | r›d d d g }" n d d g }" x÷ t |  j# ƒ D]æ }# xÝ t |  j# ƒ D]Ì }$ t	 |  |# |$ f | ƒ }% |  |# |$ f | |% }& t	 |! |# |$ f | ƒ }' |! |# |$ f | |' }( |% |' | d }) |& |" d <|( |" d <|	 j% | |) |" ƒ | j |	 d ƒ \ } }* |* | |# |$ f <qÍWq·Wt j |  j# |  j# d f ƒ }+ xˆ t d |  j# ƒ D]t }$ |+ d  d  … |$ d d f t j& j' | d  d  … |$ d f | d  d  … |$ f d d ƒ|+ d  d  … |$ d f <qÒWxˆ t d |  j# ƒ D]t }$ |+ |$ d d  d  … d f t j& j' | |$ d d  d  … f | |$ d  d  … f d d ƒ|+ |$ d  d  … d f <q]W|+ d  d  … d  d  … d f j ƒ  }, |+ d  d  … d  d  … d f j ƒ  }- |+ d  d  … d  d  … d f |, |+ d  d  … d  d  … d f <|+ d  d  … d  d  … d f |- |+ d  d  … d  d  … d f <| |  _( |+ |  _) d  S(   Nt   coordinatesi   i   i   t   ut   sg        t   perg      à?t   deri    i   i   iÿÿÿÿgñhãˆµøä>g      ð?Ra   gwJëÿï?(*   R:   t   getFieldmodulet   findFieldByNamet   findNodesetByFieldDomainTypet   DOMAIN_TYPE_NODESt   createNodeiteratort   dictt   nextt   isValidRf   t   getIdentifiert   createFieldcacheR
   R   R   t   itemst   setNodet   evaluateRealRk   R    t   Tt   NoneR   t   linspaceRe   Rd   R2   t   c_RP   RQ   RR   t   findMeshByDimensiont   createElementiteratorR   R   R1   t   meshgridt   setMeshLocationt   linalgt   normRS   RT   (.   R4   R@   RA   t   fieldModulet   coordinatesFieldt   nodesett   nodeIteratort   nodest   nodet
   fieldCacheRŒ   t   ndt   _t   coordRR   t   cdst   at   axofft   nidt   tckR�   t   xst   yst   zst   u_newR=   t   eit   elemDictt   elemt
   threeDMesht   x2RS   t   xi1t   xi2R   R   R€   t   xpost   xi1st   ypost   xi2st   eidt   vRT   t   xmaxt   ymax(    (    sL   D:\Jagir_Hussan\Research\SPARC\workspace\StomachRelease\digitiser\mapping.pyR>   ò   s¤    	

'!/7$71			

rr%%<<
	c   )      C   sË  | } d } t  ƒ  } xœt d | d ƒ D]‡} x~t d | d ƒ D]i} | | d | } | | k r| d | d | }	 n
 | d }	 | | }
 |	 | } d d g } d d g } d d g } d d g } | d 7} | |	 |
 | g } | | | | g } x± t | ƒ D]£ \ } } | | k r”| | d d g k rJ| | | g | | <n  | | d d d g k r¨| | d d g k r¨| | | g | | <q¨q| | | g | | <qWqC Wq) Wd „  } t j t | ƒ d f ƒ } d } t j d d | ƒ } |  j j ƒ  } | j	 d ƒ } | j
 d	 ƒ } | j ƒ  } t  ƒ  } | j ƒ  } x2 | j ƒ  ru| | t | j ƒ  ƒ <| j ƒ  } qDW| j ƒ  } t j | d	 f ƒ } xÁ| j ƒ  D]³\ } }  |  d } |  d }! | | } |! d d k r¤|! d d k rÑxS t | ƒ D]E } | j | | | d d g ƒ | j | d	 ƒ \ }" }# |# | | <qûW| | ƒ | | d d f <xS t | ƒ D]E } | j | d | | d g ƒ | j | d	 ƒ \ }" }# |# | | <qkW| | ƒ | | d d f <qW|! d d k rWxS t | ƒ D]E } | j | | | d d g ƒ | j | d	 ƒ \ }" }# |# | | <qîW| | ƒ | | d d f <qWq¤q¤Wt j | d d f ƒ }$ t j | d f ƒ }% xu t | d ƒ D]c }& |& | }' xP t | ƒ D]B } |$ |& c | |' | d f 7<|% | c | |' | d f 7<q·WqšWt j | j ƒ }( x� t | d ƒ D]{ }& |& | }' xh t | ƒ D]Z } | |' | d f |$ |& |( |' | d f <| |' | d f |% | |( |' | d f <qAWq$W|( |  _ | |  _ |$ |  _ |% |  _ d  S(
   Ni    i   g        g      ð?c         S   sW   |  j  d } d } x= t d | ƒ D], } | t j j |  | |  | d ƒ } q# W| S(   Ni    g        i   (   R	   Rk   R
   R¦   R§   (   R   t   nptst   arct   k(    (    sL   D:\Jagir_Hussan\Research\SPARC\workspace\StomachRelease\digitiser\mapping.pyt	   arcLength¢  s
    *i   i   RŒ   i   (   R–   Rk   t	   enumerateR
   R   R   R    R:   R‘   R’   R¢   R£   R—   R˜   Rf   R™   Rš   R›   R¥   R�   R	   t   segmentWeightst   segmentLenthst   circumferentialLengthst   axialLengths()   R4   R@   RA   t   numberOfCircumfrentialNodest   evR¬   t   lengthElementIdxt   circumfrentialElementIdxt
   localNode1t
   localNode2t
   localNode3t
   localNode4t   l1xit   l2xit   l3xit   l4xit   ndst   xisR   R¯   RÍ   t   segmentLengthst   ndist   xdiscretR¨   R©   R=   R»   R¼   R½   R®   t   coordst   xit   xivR°   RÇ   RÑ   RÒ   R³   t   snodeRÏ   (    (    sL   D:\Jagir_Hussan\Research\SPARC\workspace\StomachRelease\digitiser\mapping.pyt    generateSegmentLengthsAndWeights~  sž    	



0 		


$
&
*2			c   )   
   C   s(  | } | } d } | j  ƒ  } | j ƒ  | j | ƒ } | j d ƒ | j t ƒ | j t ƒ | j | j ƒ | j	 d d ƒ | j	 d d ƒ | j	 d d ƒ | j d ƒ }	 |	 j d ƒ |	 j t ƒ |	 j | j ƒ |	 j	 d d ƒ |	 j	 d d ƒ | j
 | j ƒ }
 |
 j ƒ  } | j | ƒ | j |	 ƒ | j | d	 t j d ƒ | j | d	 t j d ƒ | j | d	 t j d ƒ | j |	 d	 t j d ƒ | j |	 d	 t j d ƒ | j |	 d	 t j d ƒ | j d ƒ } | j d t j ƒ } | j | ƒ } x, t d
 ƒ D] } | j | d
 d
 d ƒ qW| j ƒ  } | j t j ƒ | j | d	 | ƒ } | j |	 d	 | ƒ } | j ƒ  } d } d d d g } d | d d g } d d | d g } | d } t ƒ  } x{t | d ƒ D]i} t  | ƒ | d | d <d | d } x:t | ƒ D],} t  | ƒ | d | d <d | d } | t! j" d d | d ƒ } | t! j" d d | d ƒ } |
 j# | | ƒ } | | | <| j$ | ƒ | j% | d	 t j d | | d g ƒ |	 j% | d	 t j d | d d | d d g ƒ |	 j% | d	 t j d | ƒ |	 j% | d	 t j d | ƒ | d } qWqØW| | }  d }! | d }" x• t | ƒ D]‡ }# x~ t | ƒ D]p }$ | j& |  |! d | ƒ }% |# |" |$ d }& |& |& d |& |" |& |" d g }' |% j' | |' ƒ } |! d }! qWqlW| j( ƒ  | j) ƒ  }( | j* |( ƒ | j+ ƒ  d  S(   Ni   RŒ   i   R   i   R   t   zt   textureiÿÿÿÿi   i    g        g      ð?g      à?(,   R‘   t   beginChanget   createFieldFiniteElementt   setNamet
   setManagedR   t   setTypeCoordinatet   setCoordinateSystemTypet,   COORDINATE_SYSTEM_TYPE_RECTANGULAR_CARTESIANt   setComponentNameR“   R”   t   createNodetemplatet   defineFieldt   setValueNumberOfVersionsR   t   VALUE_LABEL_VALUEt   VALUE_LABEL_D_DS1t   VALUE_LABEL_D_DS2R¢   t   createElementbasisR   t   FUNCTION_TYPE_CUBIC_HERMITEt   createElementfieldtemplateRk   t   setFunctionNumberOfTermst   createElementtemplatet   setElementShapeTypeR   t   SHAPE_TYPE_SQUARERš   R–   t   floatR
   R   t
   createNodeRœ   t   setNodeParameterst   createElementt   setNodesByIdentifiert   defineAllFacest   createFieldsmoothingt   smootht	   endChange()   R4   R:   R@   RA   t   elementsCount1t   elementsCount2t   coordinateDimensionst   fmRŒ   Rê   R¬   t   nodetemplateR=   t   bicubicHermiteBasist   eftt   nt   elementtemplateR.   t   cachet   nodeIdentifierR   t   dx_ds1t   dx_ds2t   numberOfCircumferentialNodest   allNodest   n2t   yvt   n1t   xvt   xxt   yyR­   t   NumberOfElementst   elementIdentifiert   no2t   e2t   e1t   elementt   bnit   nodeIdentifiersR  (    (    sL   D:\Jagir_Hussan\Research\SPARC\workspace\StomachRelease\digitiser\mapping.pyt   generateFlatMeshæ  s–    

	
%2-

"
c   
      C   s&  t  t | j ƒ  ƒ ƒ } |  j j } | d | d f } t | ƒ d k r] | d d f } n  t j | d t j ƒt | ƒ |  _	 g  |  _
 x{ t | ƒ D]m \ } } |  j
 j | | ƒ | | } t | t  ƒ rã t j | ƒ } n  |  j |  j | ƒ }	 | |  j	 |	 <q˜ W|  j
 j d d d g ƒ d S(   sM   
        Region assignment is in the descending order of regionvalue
        i    i   i   R   iÿ   N(   t   listt   reversedt   keysRS   R	   R   R
   Rg   Rf   RU   R3   RÎ   t   appendt
   isinstancet   arrayR‹   (
   R4   RU   R3   t   rnmR	   t   rshapeR   t   rnt   polyt   spts(    (    sL   D:\Jagir_Hussan\Research\SPARC\workspace\StomachRelease\digitiser\mapping.pyt   assignRegionsp  s    %	
c         C   s1   t  j |  j ƒ t  j |  j ƒ t  j |  j ƒ f S(   sU   
        Return the boundary coordinates for the left, right wall and ladder
        (   R
   R,  RP   RQ   RR   (   R4   (    (    sL   D:\Jagir_Hussan\Research\SPARC\workspace\StomachRelease\digitiser\mapping.pyt   getBoundaryPoints…  s    c         C   s¶   t  | d ƒ �¡ } t |  d ƒ r` |  j |  j |  j |  j |  j |  j |  j |  j	 |  j
 g	 } n9 |  j |  j |  j |  j |  j |  j |  j d  |  j
 g	 } t j | | d ƒ Wd  QXd  S(   Nt   wbRU   i   (   R;   t   hasattrR1   R2   RP   RQ   RR   RS   RT   RU   R=   RŸ   RN   t   dump(   R4   t   filenameRY   t   sobj(    (    sL   D:\Jagir_Hussan\Research\SPARC\workspace\StomachRelease\digitiser\mapping.pyt	   serialize�  s    !c   	      C   ss  t  j |  j |  j d f d t  j ƒ} t |  d ƒ r‘ xì t |  j ƒ D]D } x; t |  j ƒ D]* } |  j |  j | | f | | | f <q\ WqF Wn” x‘ t |  j ƒ D]€ } xw t |  j ƒ D]f } |  j | | f \ } } t	 | |  j ƒ d } t	 | |  j ƒ d } d d d g | | | f <q· Wq¡ Wd d l
 m } | j | d ƒ } | j d | j ƒ } | j | d
 d ƒd  S(   Ni   R   RU   i   iÿ   iÿÿÿÿ(   t   Imaget   RGBi�  t   formatt   png(   i�  i�  (   R
   R   R1   t   uint8R5  Rk   R3   RU   RT   Rf   t   PILR:  t	   fromarrayt   resizet   BICUBICt   save(	   R4   R7  t   picR   R€   R   R   R:  t   img(    (    sL   D:\Jagir_Hussan\Research\SPARC\workspace\StomachRelease\digitiser\mapping.pyt   createImage˜  s    '/!(   t   __name__t
   __module__t   __doc__R5   RB   RL   R]   R   R‹   R>   Rè   R&  R2  R3  R9  RF  (    (    (    sL   D:\Jagir_Hussan\Research\SPARC\workspace\StomachRelease\digitiser\mapping.pyR0   a   s   		[	Œ	h	Š			(   RI  RN   t   numpyR
   t   scipy.interpolateR    R   t   opencmiss.zinc.contextR   t   collectionsR   t   opencmiss.zinc.nodeR   t   opencmiss.zinc.elementR   R   R/   t   objectR0   (    (    (    sL   D:\Jagir_Hussan\Research\SPARC\workspace\StomachRelease\digitiser\mapping.pyt   <module>   s   R