
    Ri                        d Z ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm	Z	 dd	lm
Z
 dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ  G d de      Zy)z(CircularDrawer module for GenomeDiagram.    )cos)pi)sin)ArcPath)Circle)Drawing)Group)Line)Polygon)String)colors   )_stroke_and_fill_colors)AbstractDrawer)draw_polygon)intermediate_points)
FeatureSet)GraphSetc                       e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZd Zd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z	 	 ddZ	 ddZ	 	 d dZ	 	 d!dZd Zd Z	 	 	 	 	 d"dZ	 d#dZy)$CircularDrawera  Object for drawing circular diagrams.

    Attributes:
     - tracklines    Boolean for whether to draw lines dilineating tracks
     - pagesize      Tuple describing the size of the page in pixels
     - x0            Float X co-ord for leftmost point of drawable area
     - xlim          Float X co-ord for rightmost point of drawable area
     - y0            Float Y co-ord for lowest point of drawable area
     - ylim          Float Y co-ord for topmost point of drawable area
     - pagewidth     Float pixel width of drawable area
     - pageheight    Float pixel height of drawable area
     - xcenter       Float X co-ord of center of drawable area
     - ycenter       Float Y co-ord of center of drawable area
     - start         Int, base to start drawing from
     - end           Int, base to stop drawing at
     - length        Size of sequence to be drawn
     - track_size    Float (0->1) the proportion of the track height to draw in
     - drawing       Drawing canvas
     - drawn_tracks  List of ints denoting which tracks are to be drawn
     - current_track_level   Int denoting which track is currently being drawn
     - track_offsets     Dictionary of number of pixels that each track top,
       center and bottom is offset from the base of a fragment, keyed by track
     - sweep     Float (0->1) the proportion of the circle circumference to
       use for the diagram
     - cross_track_links List of tuples each with four entries (track A,
       feature A, track B, feature B) to be linked.

    Nc                     t        j                  | |||||||||	|
|||       || _        || _        |sd| _        yd| _        y)a  Create CircularDrawer object.

        Arguments:
         - parent    Diagram object containing the data that the drawer
           draws
         - pagesize  String describing the ISO size of the image, or a tuple
           of pixels
         - orientation   String describing the required orientation of the
           final drawing ('landscape' or 'portrait')
         - x         Float (0->1) describing the relative size of the X
           margins to the page
         - y         Float (0->1) describing the relative size of the Y
           margins to the page
         - xl        Float (0->1) describing the relative size of the left X
           margin to the page (overrides x)
         - xl        Float (0->1) describing the relative size of the left X
           margin to the page (overrides x)
         - xr        Float (0->1) describing the relative size of the right X
           margin to the page (overrides x)
         - yt        Float (0->1) describing the relative size of the top Y
           margin to the page (overrides y)
         - yb        Float (0->1) describing the relative size of the lower Y
           margin to the page (overrides y)
         - start     Int, the position to begin drawing the diagram at
         - end       Int, the position to stop drawing the diagram at
         - tracklines    Boolean flag to show (or not) lines delineating tracks
           on the diagram
         - track_size    The proportion of the available track height that
           should be taken up in drawing
         - circular      Boolean flaw to show whether the passed sequence is
           circular or not
         - circle_core   The proportion of the available radius to leave
           empty at the center of a circular diagram (0 to 1).
         - cross_track_links List of tuples each with four entries (track A,
           feature A, track B, feature B) to be linked.

        g?      ?N)r   __init__
track_sizecircle_coresweep)selfparentpagesizeorientationxyxlxrytybstartend
tracklinesr   circularr   cross_track_linkss                    b/home/agent/.friday_env/lib/python3.12/site-packages/Bio/Graphics/GenomeDiagram/_CircularDrawer.pyr   zCircularDrawer.__init__C   s_    r 		
$ %&DJDJ    c                 p   t        t        | j                        d      }t        | j                        }d}i }d}t        ||dz         D ]0  }	 | j                  |   j
                  }||z  }|||z   f||<   ||z  }2 dt        | j                  | j                        z  }|d| j                  z
  z  |z  }	|| j                  z  }
i | _
        |	d| j                  z
  z  dz  }|D ]A  }||   d   |	z  |z
  |
z   }||   d   |	z  |z   |
z   }|||z
  dz  z   }|||f| j                  |<   C y# t        $ r d}Y w xY w)zInitialize track heights.

        Since tracks may not be of identical heights, the bottom and top
        radius for each track is stored in a dictionary - self.track_radii,
        keyed by track number
        r   r         ?       @N)mindrawn_tracksmaxrange_parentheight	Exception	pagewidth
pageheightr   track_radiir   )r   	bot_track	top_tracktrackunit_sum
trackunitsheightholdertracktrackheight
max_radiustrackunit_height
track_core
track_croptopbtmctrs                  r,   set_track_heightsz CircularDrawer.set_track_heights   s    D--.2	))*	
9i!m4 	(E "ll5188 [(M!-|k/I JJuK'L	( 3t~~t??
%T-=-=)=>N$"2"22
 DOO 34s: 	   	6EU#A&)99JFSCU#A&)99JFSCsc))C'*CoDU#		6    s   D''D54D5c                    t        | j                  d   | j                  d         | _        g }g }g }g }g }g }| j                  j	                         | _        | j                          | j                  j	                         D ]  }|| _        | j                  |   }| j                  |      \  }	}
|j                  |	       |j                  |
       | j                  |      \  }}|j                  |       |j                  |       |j                  s| j                  |      \  }}|j                  |       |j                  |        g }| j                  D ]'  }| j                  |      }|s|j                  |       ) |||||||g}|D ]2  }|D ]+  }|D cg c]  }| j                  j                  |       c} - 4 | j                   r| j#                          yyc c}w )z+Draw a circular diagram of the stored data.r   r   N)r   r   drawingr5   get_drawn_levelsr2   rI   current_track_leveldraw_greytrackappend
draw_trackscale
draw_scaler+   draw_cross_linkaddr)   draw_test_tracks)r   feature_elementsfeature_labelsgreytrack_bgsgreytrack_labels
scale_axesscale_labelstrack_levelr@   gbgsglabelsfeaturesflabelsaxesslabelsfeature_cross_linkscross_link_objcross_link_elementselement_groupselement_groupelement_listelements                         r,   drawzCircularDrawer.draw   s    t}}Q/q1AB
 !LL99;   <<88: 	-K'2D$LL-E //6MD'  &##G, $ 6Hg##H-!!'*{{ $ 6g!!$'##G,	- !"44 	@N"&"6"6~"F"#**+>?	@ 
 , 	HM - H:FGw!!'*GH	H ??!!#  Hs   "G!c                     g }g }t         | j                  t        | j                  i}|j	                         D ]$  } ||j
                     |      \  }}||z  }||z  }& ||fS )z7Return list of track elements and list of track labels.)r   draw_feature_setr   draw_graph_setget_sets	__class__)r   r@   track_elementstrack_labelsset_methodssetelementslabelss           r,   rP   zCircularDrawer.draw_track   sy     "4#8#8(DDWDWX>># 	#C9{3==9#>Hfh&NF"L	# |++r-   c                     g }g }|j                         D ]W  }| j                  |j                        s| j                  |j                        s:| j	                  |      \  }}||z  }||z  }Y ||fS z<Return list of feature elements and list of labels for them.)get_featuresis_in_boundsr'   r(   draw_feature)r   rs   rV   label_elementsfeaturer_   ru   s          r,   rl   zCircularDrawer.draw_feature_set  s      '') 	)G  /43D3DW[[3Q#'#4#4W#= & H, &(		)  //r-   c                 >   g }g }|j                   r||fS | j                         \  }}|j                  D ]d  \  }}||k  rt        ||      }||k  rt	        ||      }| j                  |||      \  }}	|j                  |       |	T|j                  |	       f ||fS rw   )hide_current_track_start_end	locationsr3   r1   get_feature_sigilrO   )
r   r|   rV   r{   r'   r(   locstartlocendfeature_sigillabels
             r,   rz   zCircularDrawer.draw_feature  s    <<#^33224
s ' 1 1 	-Hf~8U+HX~%F#'#9#9'8V#T M5##M2 %%e,	-  //r-   c                 6   | j                   | j                     \  }}}| j                  |      \  }}	}
| j                  |      \  }}}| j                  ||z   dz        \  }}}| j                  | j                  | j
                  | j                  | j                  d}||j                     }|j                  |d<   |j                  |d<   t        |d      r|j                  |d<   |j                  |d<    |||||||j                  j                  f|j                   |j"                  d|}|j$                  rt'        d	d	d
|j                  j)                          d
|j*                  |j,                  |j.                        }t1        |      }|j2                  r|j2                  }n|j                  j                  }|j4                  dv r'|dk7  r|dt6        z  z   }|
|	}}n|dt6        z  z   }||}}n~|j4                  dv r|dt6        z  z   }||}}n_|j4                  dv r'|dk7  r|dt6        z  z   }||}}n;|dt6        z  z   }|
|	}}n*|t6        k  r|dt6        z  z   }||}}n|dt6        z  z   }|
|	}}|dk7  r*|}|t6        k  r
|t6        z  }n=d|j8                  d	   _        n(|}|t6        k  r|t6        z  }d|j8                  d	   _        | j<                  ||z  z   }| j>                  ||z  z   }tA        |      }tC        |      }|| ||||f|_"        ||fS d}||fS )zReturn graphics for feature, and any required label for it.

        Arguments:
         - feature       Feature object
         - locstart      The start position of the feature
         - locend        The end position of the feature

           )BOXOCTOJAGGYARROWBIGARROWhead_length_ratioshaft_height_ratiourlhrefURL	hrefTitle)colorborderr    fontNamefontSize	fillColor)r'   z5'leftr/   )middlecentercentre)r(   z3'rightr(   N)#r:   rM   canvas_angle_draw_sigil_box_draw_sigil_cut_corner_box_draw_sigil_jaggy_draw_sigil_arrow_draw_sigil_big_arrowsigilarrowhead_lengtharrowshaft_heighthasattrr   namelocationstrandr   r   r   r   strip
label_font
label_sizelabel_colorr	   label_strandlabel_positionr   contents
textAnchorxcenterycenterr   r   	transform)r   r|   r   r   kwargsrG   rH   rF   
startanglestartcosstartsinendangleendcosendsinmidanglemidcosmidsindraw_methodsmethodr   r   
labelgroupr   label_anglesinvalcosvalradiusx_posy_poscoslabelsinlabels                                  r,   r   z CircularDrawer.get_feature_sigil0  s    (()A)ABS#)-):):8)D&
Hh#'#4#4V#< &&#'#4#4fx6G15L#M && ''33++++22
 gmm,&-&>&>"#'.'@'@#$ 7E" 'F9"),,F;##

 -->>

 

 == GLL&&()+ ++ ++!--E uJ## -- ))00%%)@@R<",sRx"7K%-xFF"*S2X"5K%+VFF''+II&r1!'''+AAR<"*S2X"5K%+VFF",sRx"7K%-xFFb 'r1!' )383!)8|?2%K8=J''*5 ?2%K8=J''*5LL6F?2ELL6F?2E;'H;'H	$J  j  	 J j  r-   c                    |j                   }|j                  }|j                  }|j                  }| j	                  |      s| j	                  |      sy| j	                  |      s| j	                  |      sy|| j
                  k  r| j
                  }|| j
                  k  r| j
                  }| j                  |k  r| j                  }| j                  |k  r| j                  }|j                  t        | j                  j                  j                                     }|j                  t        | j                  j                  j                                     }|J |J ||k(  rt        |j
                  &||j
                  k  ryt        ||j
                        }|j                  &|j                  |k  ryt        ||j                        }|j
                  &||j
                  k  ryt        ||j
                        }|j                  &|j                  |k  ryt        ||j                        }| j                  j!                         D ]   }| j                  |   }	|	|k(  r|}
|	|k(  s|}" 
k(  rt        | j#                  |      \  }}}| j#                  |      \  }}}| j#                  |      \  }}}| j#                  |      \  }}}| j$                  |
   \  }}}| j$                  |   \  }}}||k  r8| j'                  |||||||j(                  |j*                  |j,                  	      gS | j'                  |||||||j(                  |j*                  |j,                  	      gS )z#Draw a cross-link between features.N)startAstartBendAendBry   r'   r(   _trackAlistr5   tracksvalues_trackBNotImplementedErrorr3   r1   rL   r   r:   _draw_arc_polyr   r   flip)r   
cross_linkr   r   r   r   	trackobjA	trackobjBr\   r@   trackAtrackBstartangleA	startcosA	startsinAstartangleB	startcosB	startsinB	endangleAendcosAendsinA	endangleBendcosBendsinBbtmActrAtopAbtmBctrBtopBs                                 r,   rS   zCircularDrawer.draw_cross_link  s?   """"  (1B1B41H  (1B1B41HDJJZZFDJJZZF88d?88D88d?88D&&tDLL,?,?,F,F,H'IJ	&&tDLL,?,?,F,F,H'IJ	$$$$$$	!%%??&ioo%1F==$}}v%tY]]+D??&ioo%1F==$}}v%tY]]+D<<88: 	%KLL-E	!$	!$	% V%%,0,=,=f,E)Y	,0,=,=f,E)Y	&*&7&7&=#	7G&*&7&7&=#	7G++F3dD++F3dD$;##$$%%OO
  ##$$%%OO
 r-   c                     g }| j                   | j                  | j                  d}|j                         D ]  }| ||j                     |      z  } |g fS )zzReturn list of graph elements and list of their labels.

        Arguments:
         - set       GraphSet object

        )lineheatbar)draw_line_graphdraw_heat_graphdraw_bar_graph
get_graphsstyle)r   rs   rt   style_methodsgraphs        r,   rm   zCircularDrawer.draw_graph_set  sl      ((((&&
 ^^% 	:E2ekk2599H	: |r-   c                    g }|j                         }|d   |d   }}| j                  | j                     \  }}}d||z
  z  }	||z
  }
|
dk(  r|	}
| j                         \  }}||| }|sg S |j                  	||z   dz  }n|j                  }t        ||z
  ||z
        }|d   \  }}| j                  |      \  }}}|	||z
  z  |z  |z   }| j                  ||z  z   }| j                  ||z  z   }|D ]  \  }}| j                  |      \  }}}|	||z
  z  |z  |z   }| j                  ||z  z   }| j                  ||z  z   }|j                  t        |||||j                  |j                               ||}} |S )zsReturn line graph as list of drawable elements.

        Arguments:
         - graph     GraphData object

        r      r/   r0   )strokeColorstrokeWidth)	quartilesr:   rM   r   r   r3   r   r   r   rO   r
   poscolor	linewidth)r   r   line_elementsdata_quartilesminvalmaxvalrG   rH   rF   rA   	dataranger'   r(   datamidval
resolutionposval	lastanglelastcoslastsin	posheightlastxlastyposangleposcospossinr!   r"   s                                r,   r   zCircularDrawer.draw_line_graph"  s     *'*N1,=(()A)ABS#S3Y'VO	>#I224
sU3I <<vo,F\\F &6/Vf_>
 7S&*&7&7&<#	7G3<0:=C	y722y722 	 HC'+'8'8'=$Hff#sV|4zACGIy611Ay611A   % %	 a5E	   r-   c           
         g }|j                         }|d   |d   }}| j                  | j                     \  }}}d||z
  z  }	||z
  }
|
dk(  r|	}
|| j                  | j                   }|j
                  	||z   dz  }n|j
                  }| j                         \  }}t        |||||       }|sg S t        ||z
  ||z
        }|dk(  r|	}|D ]  \  }}}| j                  |      \  }}}| j                  |      \  }}}|	||z
  z  |z  }|dk\  r|j                  }n|j                  }|j                  | j                  |||z   |||              |S )zqReturn list of drawable elements for a bar graph.

        Arguments:
         - graph     Graph object

        r   r   r/   r0   )r   r:   rM   r'   r(   r   r   r   r3   r   r   negcolorrO   	_draw_arc)r   r   bar_elementsr  r  r  rG   rH   rF   rA   r  r  r  r'   r(   r	  pos0pos1r  	pos0anglepos0cospos0sin	pos1anglepos1cospos1sinbarvalbarcolors                              r,   r   zCircularDrawer.draw_bar_graph^  s     *'*N1,=(()A)ABS#S3Y'VO	>#ITZZ$((+ <<vo,F\\F
 224
s"5#uU3/?@I
 &6/Vf_>
?$J  $ 	OD$*.*;*;D*A'Iw*.*;*;D*A'Iw C&L1J>F{ >> >> sC&L)YQ	 r-   c                    g }|j                         }|d   |d   }}||z   dz  }| j                  | j                     \  }}}	|	|z
  }
| j                         \  }}t	        |||||       }|D ]  \  }}}| j                  |      \  }}}| j                  |      \  }}}t        j                  |j                  |j                  |||      }|j                  | j                  ||	||||              |S )ztReturn list of drawable elements for the heat graph.

        Arguments:
         - graph     Graph object

        r   r   r0   )r   )r   r:   rM   r   r   r   r   linearlyInterpolatedColorr   r  rO   r  )r   r   heat_elementsr  r  r  r  rG   rH   rF   rA   r'   r(   r  r  r  r  r  r  r  r  r  r   r   s                           r,   r   zCircularDrawer.draw_heat_graph  s     *'*N1,=6/S((()A)ABS#Ci224
s"5#uU3/?@
  $ 	OD$*.*;*;D*A'Iw*.*;*;D*A'Iw 33D
   sCItDQ	 r-   c                 |   g }g }|j                   sg g fS | j                  | j                     \  }}}||z
  }| j                         \  }}	|j                  |j
                  zt        |j                  d      }
| j                  |      \  }}}| j                  |	      \  }}}|
j                  | j                  | j                  |d|dz  t        z  z
  d|dz  t        z  z
         |j                  |
       ~
| j                  ||z  z   | j                  ||z  z   }}| j                  ||z  z   | j                  ||z  z   }}|j                  t        |||||j                               | j                  ||z  z   | j                  ||z  z   }}| j                  ||z  z   | j                  ||z  z   }}|j                  t        |||||j                               n| j                  dk  rnt        |j                  d      }
|
j                  | j                  | j                  |dd| j                  z  z
  d       |j                  |
       ~
| j                  | j                  |z   }}| j                  | j                  |z   }}|j                  t        |||||j                               d	t        z  | j                  z  }| j                  |t!        |      z  z   | j                  |t#        |      z  z   }}| j                  |t!        |      z  z   | j                  |t#        |      z  z   }}|j                  t        |||||j                               n=|j                  t%        | j                  | j                  ||j                  d             | j                         \  }}	|j&                  rV|j(                  |z  }t+        |j,                        }t/        || j                  |z  z  t+        | j
                        |      D ]T  }||k  s|	|k  r| j1                  |||||j2                        \  }}|j                  |       |D|j                  |       V |j4                  |z  }t+        |j6                        }t/        || j                  |z  z  t+        | j
                        |      D ]T  }||k  s|	|k  r| j1                  |||||j8                        \  }}|j                  |       |D|j                  |       V | j                  |      \  }}}| j                  |	      \  }}}|j:                  ru|j=                         D ]a  }|j>                  t@        u st/        d
      D ]<  }|dz  }||k  s||k  rt!        |      t#        |      }}| j                  ||z  z   | j                  ||z  z   }}| j                  ||z  z   | j                  ||z  z   }}|j                  t        |||||j                               g } g }!g }"|jC                         D ]  }#|#jE                         }$|$d   |$d   }&}%|#jF                  B|&|%z   dz  }'| j                  |%d       |!j                  |&d       |"j                  |'d       ktI        |#jF                  |%z
  |&|#jF                  z
        }(|#jF                  |(z
  }%|#jF                  |(z   }&|#jF                  }'|"j                  |'d       | j                  |%d       |!j                  |&d        ||z   dz  ||z   dz  }*})| ||f|!||f|"|)|*ffD ]u  \  }+},}-tK        dddjM                  |+      |jN                  |jP                  |j                        }d|_)        tU        |      }.|| |||,|-f|._+        |j                  |.       w ? d ||fS )z~Return list of elements in the scale and list of their labels.

        Arguments:
         - track     Track object

        Nr   r   Z      r   r   ih  )startangledegreesendangledegreesr      ges-8R?r   r   r0   z.3f;r   r   ),rQ   r:   rM   r   r'   r(   r   scale_colorr   addArcr   r   r   rO   r
   r   r   r   r   scale_ticksscale_largeticksintscale_largetick_intervalr4   	draw_tickscale_largetick_labelsscale_smallticksscale_smalltick_intervalscale_smalltick_labelsaxis_labelsrn   ro   r   r   r   r   r3   r   join
scale_fontscale_fontsizer   r	   r   )/r   r@   scale_elementsr[   rG   rH   rF   rA   r'   r(   pr   r   r   r   r   r   x0y0x1y1alphaticklentickitervaltickpostickr   rs   nangleticksintickcosgraph_label_mingraph_label_maxgraph_label_midr   r   r  r  r  diffxmidymidlimitr!   r"   r   s/                                                  r,   rR   zCircularDrawer.draw_scale  s    {{r6M (()A)ABS#Ci 224
s;;"eii&;E$5$5FA-1->->u-E*J('+'8'8'=$HffHHhnr)*j3&+, !!!$\\C(N2DLL3>4QB\\C(N2DLL3>4QB!!$r2r25CTCT"UV\\C&L0$,,v2MB\\C&L0$,,v2MB!!$r2r25CTCT"UVZZ!^E$5$5FA HH"$sTZZ'7"7 "   !!!$\\4<<##5B\\4<<##5B!!$r2r25CTCT"UVFTZZ'E\\C#e*$44dllS3u:EU6UB\\C#e*$44dllS3u:EU6UB!!$r2r25CTCT"UV !!LLLL % 1 1" 224
s ,,{:Ge<<=K
 !tzz[893txx=+ 
/ e#sg~"nnS'5%2N2Ne %%d+$ ''.
/ ,,{:Ge<<=K tzz[893txx=+ 
/ e#sg~"nnS'5%2N2Ne %%d+$ ''.
/ *.):):5)A&
Hh#'#4#4S#9 &&~~' A<==H,"1X >< !$6 6 :-E1A$+.u:s5z LL3=8 LL3=8 
 !LL3=8 LL3=8  '-- RRU=N=NO +-*,*,%(^^%5 HE(-(9I-6q\9Q<FF$||3*06/S)@ / 6 6& G / 6 6& G / 6 6& G'*%*\\F%:fu||>S(" */)<).)<). / 6 6& G / 6 6& G / 6 6& G#H$ ')2g_rBw#od,b"5,b"5,dD9, <KE1a
 %+ ! ! #).)9)9).)=)=*/*;*;%E 08E,).uJ '!( ' ' ! !4J0 )//
;/<O><A<F |++r-   c                 j   | j                  |      \  }}}| j                  ||z  z   | j                  ||z  z   }
}	| j                  ||z   |z  z   | j                  ||z   |z  z   }}t        |	|
|||j                        }|r|j
                  dk(  r:|dk\  rt        |dz        dz   }n.|dk\  rt        |dz        dz   }nt        |      }nt        |      }t        dd||j                  |j                  |j                        }|t        kD  rd	|_        t        |      }d
ddd
||f|_        ||fS d}||fS )an  Return drawing element for a tick on the scale.

        Arguments:
         - tickpos   Int, position of the tick on the sequence
         - ctr       Float, Y co-ord of the center of the track
         - ticklen   How long to draw the tick
         - track     Track, the track the tick is drawn on
         - draw_label    Boolean, write the tick label?

        r*  SInti@B z Mbpi  z Kbpr   r   r(   r   N)r   r   r   r
   r/  scale_formatstrr   r<  r=  r   r   r	   r   )r   rG  rH   rE  r@   
draw_label	tickanglerL  rK  r@  rA  rB  rC  rH  
tickstringr   r   s                    r,   r5  zCircularDrawer.draw_tick  s`    '+&7&7&@#	7Gg-t||cGm/KBLLC'MW44LLC'MW44  BB0A0AB!!V+g%!$W%7!86!AJ_!$W_!5!>J!$WJ \
))--++E 2~#( 
 uJ$%q!QB#7J  Z JZr-   c           
         | j                   D ]  }| j                  |   \  }}}| j                  j                  t	        | j
                  | j                  |t        j                  d             | j                  j                  t	        | j
                  | j                  |t        j                  d             | j                  j                  t	        | j
                  | j                  |t        j                  d              y)z8Draw blue test tracks with grene line down their center.Nr'  )
r2   r:   rK   rT   r   r   r   r   bluegreen)r   r@   rG   rH   rF   s        r,   rU   zCircularDrawer.draw_test_tracks  s     && 	E ,,U3MCcLLLLLL &" LLLLLL &" LLLLLL &")	r-   c                    g }g }|j                   sg g fS | j                  | j                     \  }}}| j                         \  }}| j	                  |      \  }	}
}| j	                  |      \  }}}|j
                  |j                  Qt        |j                  d      }|j                  | j                  |||	|t        j                  ddd                   n| j                  dk  rN|j                  | j                  ||ddt        z  | j                  z  t        j                  ddd                   nL|j                  t        | j                   | j"                  |t        j                  ddd      d||z
               |j$                  rh| j&                  |j$                  z  }t)        | j
                  | j                  |      D ]*  }t+        dd|j,                  |j.                  |j0                  |j2                        }| j	                  |      \  }}}||	k  s||k  r]| j                   ||z  z   | j"                  ||z  z   }}t5        |      }| j                  dz  t        z  || j
                  z
  z  | j&                  z  t        dz  z
  }|t        kD  rd	|_        |t        z  }t9        |      t;        |      }}|| ||||f|_        | j&                  |z
  |k  r|j                  |       - ||fS )
z;Drawing element for grey background to passed Track object.Nr'  gQ?r   r   r   )r   r   r   r   r(   )	greytrackr:   rM   r   r   r'   r(   r   r/  rO   r  r   Colorr   r   r   r   r   rY   lengthr4   r   r   greytrack_fontgreytrack_fontsizegreytrack_fontcolorr	   r   r   r   r   )r   r@   rX   rY   rG   rH   rF   r'   r(   r   r   r   r   r   r   r?  	labelstepr
  r   thetacosthetasinthetar!   r"   r   
labelanglecosAsinAs                               r,   rN   zCircularDrawer.draw_greytrack  s   r6M (()A)ABS#224
s)-):):5)A&
Hh#'#4#4S#9 && ;;"eii&;E$5$5FA  j(FLLtT4R
 ZZ!^   aR$**!4fll4t6T   LLLL &T4 >" #c		 !!u'='==ITZZ9= 8JJ"11"55#77 -1,=,=c,B)x:%E)9LL3>1LL3>1  #5\
JJNR'3+;<t{{JRRSVS  2:',E$"$J _c*od(,teT4A'F
${{Q)3$++J7588 ...r-   c                     | j                   dz  t        z  || j                  z
  z  | j                  z  }|t	        |      t        |      fS )z@Given base-pair position, return (angle, cosine, sin) (PRIVATE).r   )r   r   r'   ra  r   r   )r   baserJ  s      r,   r   zCircularDrawer.canvas_angle,  s@    

Q#tdjj'89DKKGs5z3u:..r-   c                 ^    |dk(  r|}|}	n|dk(  r|}|}	n|}|}	 | j                   ||	||fi |S )zDraw BOX sigil (PRIVATE).r   r   )r  )
r   bottomr   rF   r   r   r   r   inner_radiusouter_radiuss
             r,   r   zCircularDrawer._draw_sigil_box1  sT     Q;!LLr\!L!L!LLt~~,
H
@F
 	
r-   c           	         ||}t        ||      \  }	}t        ||z
        dkD  rt        |	|d      }
|
j                  | j                  | j
                  |d|dz  t        z  z
  d|dz  t        z  z
  d       |
j                  | j                  | j
                  |d|dz  t        z  z
  d|dz  t        z  z
  d       |
j                          |
S t        |      t        |      }}t        |      t        |      }}| j                  | j
                  }}|||z  z   |||z  z   }}|||z  z   |||z  z   }}|||z  z   |||z  z   }}|||z  z   |||z  z   }}t        ||f||f||f||fg||      S )	a  Return closed path describing an arc box (PRIVATE).

        Arguments:
         - inner_radius  Float distance of inside of arc from drawing center
         - outer_radius  Float distance of outside of arc from drawing center
         - startangle    Float angle subtended by start of arc at drawing center
           (in radians)
         - endangle      Float angle subtended by end of arc at drawing center
           (in radians)
         - color        colors.Color object for arc (overridden by backwards
           compatible argument with UK spelling, colour).

        Returns a closed path object describing an arced box corresponding to
        the passed values.  For very small angles, a simple four sided
        polygon is used.
        {Gz?r   )r   r   strokewidthr(  r)  TmoveToreverse)r   absr   r0  r   r   r   	closePathr   r   r   )r   rp  rq  r   r   r   r   colourr   strokecolorr?  r   r   r   r   r@  rA  rB  rC  x2y2x3y3x4y4s                            r,   r  zCircularDrawer._draw_arcB  s   8 E4UFCUx*$%,K5aPA
 HHhnr)*j3&+,   HHhnr)*j3&+,   KKMH "%Z#j/hH ]CMFF\\4<<B<(22B9P4PB<&00"|f7L2LB<&00"|f7L2LB<(22B9P4PB"bB8b"XBx H%QWXXr-   c                 v   | j                   | j                  }}||z
  }	||z
  }
d}|t        z  dz  }|r1|j                  ||t	        |      z  z   ||t        |      z  z          n0|j                  ||t	        |      z  z   ||t        |      z  z          |}dt        |      k  rZ|dk  rU|||	z  z   }|||
z  z   t        z  dz  }|j                  ||t	        |      z  z   ||t        |      z  z          ||z  }|dk  rU|t        z  dz  }|j                  ||t	        |      z  z   ||t        |      z  z          y)zAdd a list of points to a path object (PRIVATE).

        Assumes angles given are in degrees!

        Represents what would be a straight line on a linear diagram.
        rs  r)  r   N)r   r   r   rv  r   r   lineTory  )r   pathstart_radius
end_radiusstart_angle	end_anglemover@  rA  radius_diff
angle_diffdxar!   rs                  r,   _draw_arc_linezCircularDrawer._draw_arc_line  sI    t||B </,
"s"KK\CF22BA9N4NOKK\CF22BA9N4NO3r7?a% 1{?2 1
#33r9C?  BSVOR!c!f*_=R a% NS Bc!f,,b:A3F.FGr-   c
           	      2   t        ||      \  }}| j                  | j                  }}t        ||z
        dkD  s3t        ||z
        dkD  s"t        ||z
        dkD  st        ||z
        dkD  rt	        ||dd      }d|dz  t
        z  z
  }d|dz  t
        z  z
  }d|dz  t
        z  z
  }d|dz  t
        z  z
  }|j                  |||||dd       |	rB| j                  |||||       |j                  |||||d	       | j                  |||||       nA| j                  |||||       |j                  |||||d
	       | j                  |||||       |j                          |S t        |      t        |      }}t        |      t        |      }}t        |      t        |      }}t        |      t        |      }}|||z  z   |||z  z   }}|||z  z   |||z  z   }}|||z  z   |||z  z   } }|||z  z   |||z  z   }"}!t        ||f||f|| f|!|"fg||d      S )z&Return polygon path describing an arc.rs  r   r   r   r   strokeLineJoinrt  r(  r)  Trv  rx  rw  F)r  )r   r   r   ry  r   r   r0  r  rz  r   r   r   )#r   rp  rq  inner_startangleinner_endangleouter_startangleouter_endangler   r   r   r   r|  r@  rA  r?  i_starti_endo_starto_endinner_startcosinner_startsininner_endcosinner_endsinouter_startcosouter_startsinouter_endcosouter_endsinrB  rC  r}  r~  r  r  r  r  s#                                      r,   r   zCircularDrawer._draw_arc_poly  s    5UFCUt||B!112T9>$445<#&667$>#&667$> ' A ,s2R78G.3.34E,s2R78G.3.34EHHR\5'$PTHU##A|\5'RRugtL##A|\5'R ##A|\5%PRuguM##A|\7GTKKMH
 $%$% +N *-^)<c.>Q,L$%$% +N *-^)<c.>Q,L\N22\N22 B
 \L00\L00 B
 \L00\L00 B
 \N22\N22 B  bB8b"XBx8  r-   c
           
      F   |dk(  r|}|}n|dk(  r|}|}n|}|}t        ||      \  }}t        ||      t        ||      }}||z
  }d||z   z  }||z
  }t        d|z  d|z  |	z        }||z   }||z
  }t        dt        t        |      dz  |	z  |z  t        |dz                    }|dk  r|dz  }t	        |      t        |      }}t	        |      t        |      }}| j                  | j                  }}t        d||ddd|
}|j                  | j                  | j                  |d||z
  dz  t        z  z
  d||z   dz  t        z  z
  d	
       |j                  |||z  z   |||z  z          |j                  |||z  z   |||z  z          |j                  | j                  | j                  |d||z
  dz  t        z  z
  d||z   dz  t        z  z
  d	       |j                  |||z  z   |||z  z          |j                  |||z  z   |||z  z          |j                          |S )z4Draw OCTO sigil, box with corners cut off (PRIVATE).r   r   r/           r   r  r(  r)  Tru  rw   )r   r1   r3   ry  r   r   r   r   r   r0  r   r  rz  )r   ro  r   rF   r   r   r   r   r   cornerr   rp  rq  r|  rJ  middle_radius	boxheight
corner_lenshaft_inner_radiusshaft_outer_radiuscornerangle_deltar   r   r   r   r@  rA  r?  s                               r,   r   z)CircularDrawer._draw_sigil_cut_corner_box   s    Q;!LLr\!L!L!LL4UFCU":x8#j(:SH
:%|l:; </	y#	/F*BC
)J6)J6S^c)F2]BCPSDTU
 19# !_c*o(XHt||B 
#	

 
 	
LLLL8//36;<: 11S82=> 	 	
 	
(833R:Lx:W5WX	(833R:Lx:W5WX	LLLL8//36;<: 11S82=> 	 	
 	
(61128JV8S3ST	(61128JV8S3ST	r-   c                 n    |dk(  r|}|}	d}
n|dk(  r|}|}	d}
n|}|}	d}
 | j                   ||	||fd|
i|S )zDraw ARROW sigil (PRIVATE).r   r   r   r   r    _draw_arc_arrow)r   ro  r   rF   r   r   r   r   rp  rq  r    s              r,   r   z CircularDrawer._draw_sigil_arrowQ  st     Q;!LL!Kr\!L!L K!LL!K#t##	

 $
 
 	
r-   c                 F    |dk(  rd}nd} | j                   ||||fd|i|S )zADraw BIGARROW sigil, like ARROW but straddles the axis (PRIVATE).r   r   r   r    r  )	r   ro  r   rF   r   r   r   r   r    s	            r,   r   z$CircularDrawer._draw_sigil_big_arrowj  sC     R< K!K#t##CX
;F
JP
 	
r-   c           
      
   |
|
}t        ||      \  }}t        ||      t        ||      }}|	dk7  r|	dk7  rt        d|	d      ||z
  }d||z   z  }||z
  }||z  }|d|z  z
  }|d|z  z   }t        dt        t	        |      |z  |z  t	        |                  }|dk  r|dz  }|	dk(  r||z
  }n||z   }||k  rt        t        ||      |      }nt        t        ||      |      }||cxk  r|k  s&n ||cxk  r|k  sn t        d	|d
|d|d|      t        |      t        |      }}t        |      t        |      }}t        |      t        |      }}| j                  | j                  }}dt	        |      k\  rt	        |      t	        |      k\  r|	dk(  r1|||z  z   |||z  z   }}|||z  z   |||z  z   } }|||z  z   |||z  z   }"}!n0|||z  z   |||z  z   }}|||z  z   |||z  z   } }|||z  z   |||z  z   }"}!t        |||| |!|"g|xs ||dd      S |	dk(  rst        d||ddd|}#|#j                  | j                  | j                  |d|dz  t        z  z
  d|dz  t        z  z
  d       |#j                  | j                  | j                  |d|dz  t        z  z
  d|dz  t        z  z
  d       t	        |      dk  r[|#j                  |||z  z   |||z  z          |#j                  |||z  z   |||z  z          |#j                  |||z  z   |||z  z          n^| j                  |#||d|dz  t        z  z
  d|dz  t        z  z
         | j                  |#||d|dz  t        z  z
  d|dz  t        z  z
         |#j!                          |#S t        d||ddd|}#|#j                  | j                  | j                  |d|dz  t        z  z
  d|dz  t        z  z
  dd       |#j                  | j                  | j                  |d|dz  t        z  z
  d|dz  t        z  z
  d       t	        |      dk  r[|#j                  |||z  z   |||z  z          |#j                  |||z  z   |||z  z          |#j                  |||z  z   |||z  z          n^| j                  |#||d|dz  t        z  z
  d|dz  t        z  z
         | j                  |#||d|dz  t        z  z
  d|dz  t        z  z
         |#j!                          |#S )z%Draw an arrow along an arc (PRIVATE).r   r   zInvalid orientation z, should be 'left' or 'right'r/   r  r   r   z7Problem drawing arrow, invalid positions. Start angle: , Head angle: z, End angle: 	, Angle: r   r  r(  r)  Tru  rw  r  Fr  )r   r1   r3   
ValueErrorry  RuntimeErrorr   r   r   r   r   r   r0  r   r  r  rz  )$r   rp  rq  r   r   r   r   r   r   r    r{  r   r|  rJ  r  r  shaft_heightr  r  headangle_delta	headangler   r   headcosheadsinr   r   r@  rA  rB  rC  r}  r~  r  r  r?  s$                                       r,   r  zCircularDrawer._draw_arc_arrowv  s'     E4UFCU  #:x8#j(:SH
& [G%;&{o5RS  :%|l:; </	 #55*S<-??*S<-??S^&77-GUT
 19r!O'! ?2I"_4I!C	84jAIC	:6AI)/x/8y3VJ3V /9)XuV  !_c*o(y>3y>XHt||B#e*_!5U!C g%|h66\H=T8TB|h66\H=T8TB}v55rMF<R7RB|f44b<&;P6PB|f44b<&;P6PB}x77mh>V9VB RRR("Oe   G# '  A HH"i#o*+j3&+,   HH"i#o*+j3&+,   5zClW44b<';Q6QRmf44b=6;Q6QRlW44b<';Q6QR## !)c/B./(S.2-. ##! (S.2-.)c/B./ KKMH '  A HH"hnr)*i#o*+   HH"hnr)*i#o*+   5zClW44b<';Q6QRmh66]X=U8UVlW44b<';Q6QR## !)c/B./*s*R/0 ##! *s*R/0)c/B./ KKMHr-   c	                    |dk(  r|}
|}d}n|dk(  r|}
|}d}n|}
|}d}d}d}t        ||      \  }}t        ||      t        ||      }}||z
  }||
z
  }||k  r|dk\  sJ |rY|rWt        |t        ||z  ||z  z  |dz        z
  |      }t        |t        ||z  ||z  z  |dz        z   |      }t        ||      }nK|r%t        |t        ||z  ||z  z  |      z
  |      }|}n$|}t        |t        ||z  ||z  z  |      z   |      }||cxk  r|cxk  r|k  sn t        d|d	|d
|d|d|
      t	        |      t        |      }}t	        |      t        |      }}t	        |      t        |      }}| j                  | j                  }}t        d||ddd|	}|j                  | j                  | j                  |
d|dz  t        z  z
  d|dz  t        z  z
  d       t        |      D ]  }|j                  | j                  | j                  |
||z  |z  z   d|dz  t        z  z
  d|dz  t        z  z
         | j                  ||
||z  |z  z   |
|dz   |z  |z  z   d|dz  t        z  z
  d|dz  t        z  z
          |j                  | j                  | j                  |d|dz  t        z  z
  d|dz  t        z  z
  d       t        |      D ]  }|j                  | j                  | j                  |||z  |z  z
  d|dz  t        z  z
  d|dz  t        z  z
  d       | j                  ||||z  |z  z
  ||dz   |z  |z  z
  d|dz  t        z  z
  d|dz  t        z  z
          |j                          |S )zDraw JAGGY sigil (PRIVATE).

        Although we may in future expose the head/tail jaggy lengths, for now
        both the left and right edges are drawn jagged.
        r   r   r   r   r   r   r/   z=Problem drawing jaggy sigil, invalid positions. Start angle: z, Tail angle: r  z, End angle r  r  r(  r)  Tru  rw  r  )r   r1   r3   r  r   r   r   r   r   r0  r   r4   r  rz  )r   ro  r   rF   r   r   r   r   r   r   rp  rq  teethtail_length_ratior   r|  rJ  r6   r  	tailangler   r   r  r  r   r   r@  rA  r?  is                                 r,   r   z CircularDrawer._draw_sigil_jaggy3  sF   " Q;!LLEr\!L!LE!LLE  4UFCU":x8#j(:SH
:%,X%%1*44!2f00FUNCUS[QRI
 f00FUNCUS[QRI Iy1I3v(99Ve^LeTTI #I IS*;!;v~!NPUVVI
 Y?)?x?  *9i5R  !_c*o(y>3y>XHt||B 
#
 
 	
LLLL)c/B&')c/B&' 	 	
 u 	AHHq6zE11i#o*+j3&+, q6zE11A/%77j3&+,i#o*+	  	
LLLL)c/B&')c/B&' 	 	
 u 	AHHq6zE11hnr)*i#o*+   q6zE11A/%77hnr)*i#o*+	" 	
r-   )NA3	landscape皙?r  NNNNNNr   g      ?r   r  N)NN)F)NF)Nr/   )Ng?r/   r   N)N)__name__
__module____qualname____doc__r   rI   rj   rP   rl   rz   r   rS   rm   r   r   r   rR   r5  rU   rN   r   r   r  r  r   r   r   r   r  r   r  r-   r,   r   r   %   s   > 

#Qf#6J=$~,002!BYv,:x<|(T~,@5 nBL/\/

0 DYN LQHP WD Ob
2

& {L Pr-   r   N)r  mathr   r   r   reportlab.graphics.shapesr   r   r   r	   r
   r   r   reportlab.libr   _AbstractDrawerr   r   r   r   _FeatureSetr   	_GraphSetr   r   r  r-   r,   <module>r     sK    /    - , - + * - ,   4 + ) 0 # ^^ ^r-   