
=Ic           @   s  d  Z  d d l Z d d l Z d d l m Z yD d d l m Z d d l m Z d d l	 m
 Z
 d d l m Z Wn e k
 r e d   n Xd d	 l m Z d d
 l m Z m Z d d l m Z d d l m Z m Z m Z m Z d d l m Z d d l m Z e d  Z d   Z d   Z d   Z  d   Z! d   Z" d e j# f d     YZ$ d e j# f d     YZ% d e j# f d     YZ& d e j# f d     YZ' d e j# f d     YZ( e) d k re j* d  d!  Z+ e j, d" e+  n  d S(#   s/   Tests for GenomeDiagram general functionality.
iN(   t   MissingExternalDependencyError(   t   colors(   t
   pdfmetrics(   t   TTFont(   t   cms2   Install reportlab if you want to use Bio.Graphics.(   t   SeqIO(   t
   SeqFeaturet   FeatureLocation(   t   SeqUtils(   t
   FeatureSett   GraphSett   Trackt   Diagram(   t	   GraphData(   t   ColorTranslatorc         C   s/  t  |   } | d k r. t | d d  } n t | d  } g  } d } xr | | | d k  r | | | | d | | } } }	 |  | |	 !}
 | |
  } | j | | f  | | 7} qL W| | | k r+| | } | | | | d | | } } }	 |  | |	 !}
 | |
  } | j | | f  n  | S(   s   apply_to_window(sequence, window_size, function) -> [(int, float),(int, float),...]

        o sequence      Bio.Seq.Seq object

        o window_size   Int describing the length of sequence to consider

        o step          Int describing the step to take between windows
                        (default = window_size/2)

        o function      Method or function that accepts a Bio.Seq.Seq object
                        as its sole argument and returns a single value

        Returns a list of (position, value) tuples for fragments of the passed
        sequence of length window_size (stepped by step), calculated by the
        passed function.  Returned positions are the midpoint of each window.
    i   i   i    N(   t   lent   Nonet   maxt   append(   t   sequencet   window_sizet   functiont   stept   seqlent   resultst   post   startt   middlet   endt   fragmentt   value(    (    s   test_GenomeDiagram.pyt   apply_to_window)   s&    $
$c         C   s   i  } x@ d d d d g D], } |  j  |  |  j  | j    | | <q W| j d d  | j d d  } | d k r{ d S| d | d | d | S(   s    calc_gc_content(sequence)

        o sequence  A Bio.Seq.Seq object

        Returns the % G+C content in a passed sequence
    t   At   Tt   Gt   Ci    g      ?(   t   countt   lowert   get(   R   t   dt   ntt   gc(    (    s   test_GenomeDiagram.pyt   calc_gc_content_   s    *" c         C   s   |  j  } i  } x@ d d d d g D], } |  j |  |  j | j    | | <q" W| j d d  | j d d  } | d k r d S| d | d | d | S(   s    calc_at_content(sequence)

        o sequence  A Bio.Seq.Seq object

        Returns the % A+T content in a passed sequence
    R    R!   R"   R#   i    g      ?(   t   dataR$   R%   R&   (   R   t   seqR'   R(   t   at(    (    s   test_GenomeDiagram.pyt   calc_at_contentp   s    	*" c         C   sf   |  j  d  |  j  d  } |  j  d  |  j  d  } | | d k rL d S| | t | |  Sd S(   s    calc_gc_skew(sequence)

        o sequence   A Bio.Seq.Seq object

        Returns the (G-C)/(G+C) GC skew in a passed sequence
    R"   t   gR#   t   ci    g        N(   R$   t   float(   R   R/   R0   (    (    s   test_GenomeDiagram.pyt   calc_gc_skew   s
    c         C   sf   |  j  d  |  j  d  } |  j  d  |  j  d  } | | d k rL d S| | t | |  Sd S(   s    calc_at_skew(sequence)

        o sequence   A Bio.Seq.Seq object

        Returns the (A-T)/(A+T) AT skew in a passed sequence
    R    t   aR!   t   ti    g        N(   R$   R1   (   R   R3   R4   (    (    s   test_GenomeDiagram.pyt   calc_at_skew   s
    c         C   s2   d } x% d D] } | |  j  | |  7} q W| S(   s?  Returns the total count of di-nucleotides repeats (e.g. "AA", "CC").

    This is purely for the sake of generating some non-random sequence
    based score for plotting, with no expected biological meaning.

    NOTE - Only considers same case pairs.
    NOTE - "AA" scores 1, "AAA" scores 2, "AAAA" scores 3 etc.
    i    t
   ACTGUactgu(   R$   (   R   t   totalt   letter(    (    s   test_GenomeDiagram.pyt   calc_dinucleotide_counts   s    	t	   TrackTestc           B   s   e  Z RS(    (   t   __name__t
   __module__(    (    (    s   test_GenomeDiagram.pyR:      s   t
   ColorsTestc           B   s   e  Z d    Z RS(   c         C   s   t    } | j d  | j d  k s3 t d   | j d  | j d  k s] t d   | j d  | j d  k s t d   | j d	  | j d	  k s t d
   d S(   s!   Test color translations.
        g      ?s@   Did not correctly translate colour from floating point RGB tuplei   iK   i   s9   Did not correctly translate colour from integer RGB tuplei   s=   Did not correctly translate colour from Artemis colour schemei   sB   Did not correctly translate colour from user-defined colour schemeN(   g      ?g      ?g      ?(   g      ?g      ?g      ?(   i   iK   i   (   i   iK   i   (   R   t   float1_colort	   translatet   AssertionErrort   int255_colort   artemis_colort   scheme_color(   t   selft
   translator(    (    s   test_GenomeDiagram.pyt   test_color_conversions   s    	!	!	!	!(   R;   R<   RF   (    (    (    s   test_GenomeDiagram.pyR=      s   t	   GraphTestc           B   s   e  Z d    Z d   Z RS(   c         C   s   d d d	 g |  _  d  S(
   Ni   i
   i   i   i   i(   (   i   i
   (   i   i   (   i   i(   (   R+   (   RD   (    (    s   test_GenomeDiagram.pyt   setUp   s    c         C   sO   t    } | j |  j  | j d	  | d d !d
 d g k sK t d   d S(   s   Check GraphData slicing.i
   i   i   i   i   i   s.   Unable to insert and retrieve points correctlyN(   i
   i   (   i   i   (   i
   i   (   R   t   set_dataR+   t	   add_pointR@   (   RD   t   gd(    (    s   test_GenomeDiagram.pyt   test_slicing   s
    	(   R;   R<   RH   RL   (    (    (    s   test_GenomeDiagram.pyRG      s   	t   LinearSigilsTestc           B   sD   e  Z d  Z d   Z d   Z d   Z d   Z d   Z d   Z RS(   sa   Check the different feature sigils.

    These figures are intended to be used in the Tutorial...c         C   s=   t  d d t d d d d d d d d d d d	 d |  _ d  S(
   Ns   Test Diagramt   circulart   yg{Gz?t   ytt   ybt   xt   xlt   xr(   R   t   Falset   gdd(   RD   (    (    s   test_GenomeDiagram.pyRH      s    c         K   s   |  j  j d d t |  _ |  j j   |  _ t t d d  d d 
} |  j j | d d | t t d d	  d d  } |  j j | d d
 | t t d d  d d } |  j j | d d | d  S(   Ni   t	   greytracki   i}   t   strandt   namet   Forwardi   i   t
   Strandlessi  iw  it   Reverse(
   RV   t	   new_trackRU   t   gdt_featurest   new_sett   gds_featuresR   R   t   add_featureR   (   RD   t   kwargst   feature(    (    s   test_GenomeDiagram.pyt   add_track_with_sigils   s    c         C   s   t  |  j j  } | d k r' d } n d } |  j j d d d | d t d d	 t d
 t | f d d d d d d  |  j j t j j	 d | d  d  d  S(   Ni   t	   landscapet   portraitt   formatt   lineart   orientationt
   tracklinest   pagesizei   i   t	   fragmentsi   R   i    R   i  t   Graphicss   .pdft   pdf(
   R   RV   t   trackst   drawRU   R   t   writet   ost   patht   join(   RD   RY   Ro   t   orient(    (    s   test_GenomeDiagram.pyt   finish   s    	c         C   s   |  j  d t  |  j  d t d d d d d d  |  j  d t d d d	 d
 d d d d  |  j  d t d d d	 d d d d d  |  j t |  j j  d  |  j d  d S(   s   Feature labels.t   labelt   colort   greent
   label_sizei   t   label_anglei    t   purplet   label_positionR   i   iZ   t   blueR   i   it   GD_sigil_labelsN(   Rd   t   Truet   assertEqualR   RV   Ro   Rv   (   RD   (    (    s   test_GenomeDiagram.pyt   test_labels   s    c         C   s   |  j  d d  |  j  d d d d d d  |  j  d d d d d d  |  j  d d d d	 d d
  |  j t |  j j  d  |  j d  d S(   s%   Feature arrow sigils, varying shafts.t   sigilt   ARROWRx   t   brownt   arrowshaft_heightg      ?t   tealg?t	   darkgreeng?i   t   GD_sigil_arrow_shaftsN(   Rd   R   R   RV   Ro   Rv   (   RD   (    (    s   test_GenomeDiagram.pyt   test_arrow_shafts	  s    c         C   s   |  j  d d  |  j  d d d d d d  |  j  d d d d d d  |  j  d d d d	 d d
  |  j t |  j j  d  |  j d  d S(   s$   Feature arrow sigils, varying heads.R   R   Rx   R~   t   arrowhead_lengthg      ?t   orangei   t   redi'  i   t   GD_sigil_arrowsN(   Rd   R   R   RV   Ro   Rv   (   RD   (    (    s   test_GenomeDiagram.pyt   test_arrow_heads  s    (	   R;   R<   t   __doc__RH   Rd   Rv   R   R   R   (    (    (    s   test_GenomeDiagram.pyRM      s   					t   DiagramTestc           B   s;   e  Z d  Z d   Z d   Z d   Z d   Z d   Z RS(   sK   Creating feature sets, graph sets, tracks etc individually for the diagram.c         C   sA   t  t j j d d  d  } t j | d  |  _ | j   d S(   s5   Test setup, just loads a GenBank file as a SeqRecord.t   GenBanks   NC_005816.gbt   rt   genbankN(   t   openRr   Rs   Rt   R   t   readt   recordt   close(   RD   t   handle(    (    s   test_GenomeDiagram.pyRH   $  s    c         C   s   t  d  } d	 | _ t j j d d  } x d d d	 d d g D] } y* | j | |  t so t d |   Wn t	 k
 r } n Xy' | j
 |  t s t d |   Wq@ t	 k
 r } q@ Xq@ Wd	 S(
   s?   Check how the write methods respond to output format arguments.s   Test DiagramRm   s	   error.txtt   XXXt   xxxi{   g@s+   Should have rejected %s as an output formatN(   R   R   t   drawingRr   Rs   Rt   Rq   RU   R@   t
   ValueErrort   write_to_string(   RD   RV   t   filenamet   outputt   e(    (    s   test_GenomeDiagram.pyt   test_write_arguments*  s     			c   
      C   sp  |  j  } d } d } t d d t } | j d d t d d d	 d
 d d d d d t d d } | j   } x | j D] } | j d k r qv n  | j j	 j
 | k  r qv n  | j j j
 | k r qv n  t |  d d k r d } n d } | j | d | d d d d d d d d d  t qv W| j d! d" d# d$ d% t d& d' t d( t f d) d d | d* |  t j j d+ d,  }	 | j |	 d-  t |	  j   j d. d/  | j d-  j d. d/  k st  t j j d+ d0  }	 | j |	 d1  | j d! d d% t d& d' t d' t f d | d* |  t j j d+ d2  }	 | j |	 d-  t j j d+ d3  }	 | j |	 d1  d4 S(5   s<   construct and draw SVG and PDF for just part of a SeqRecord.id  i."  s   Test DiagramRN   i   RW   RY   s   CDS Featurest   scale_largetick_intervali  t   scale_smalltick_intervalid   t   scale_formatt   SIntt   greytrack_labelst   heightg      ?t   CDSi   i    t   whiteR   t   colourR   R   R}   R   Rz   i   R{   iZ   Rw   Rg   Rh   Ri   Re   Rj   Rk   i
   i   Rl   R   Rm   s   GD_region_linear.pdft   PDFs   
s   
s   GD_region_linear.svgt   SVGs   GD_region_circular.pdfs   GD_region_circular.svgN(   R   R   RU   R]   R   R_   t   featurest   typet   locationR   t   positionR   R   Ra   Rp   R   Rr   Rs   Rt   Rq   R   R   t   replaceR   R@   (
   RD   t   genbank_entryR   R   RV   R^   R`   Rc   Rx   t   output_filename(    (    s   test_GenomeDiagram.pyt   test_partial_diagram@  sZ    					 $c         C   s  |  j  } t d  } | j d d t d d d d d d	 } | j   } xs | j D]h } | j d
 k rR t |  d d k r d } n d } | j | d | d d d d d d d t qR qR Wx d@ dA dB dC g D] \ } } } d }	 x t rt| j	 j
 | d |	 }	 |	 d" k rPn  t t |	 |	 d#  d$ d? } | j | d | d d% d& | d | d t |	 t |  7}	 q W~	 q W| j d d t d d' d t }
 |
 j d( d)  } t |  d* } | j t | j	 | t |  d+ d, d- d t j d. t j | j t | j	 | t |  d/ d, d- d t j d. t j | j d0 d1 d2 d3 d4 d d5 d6 d7 d8  t j j d9 d:  } | j | d;  | j d d8  | j d0 d< d4 t d5 d= t d= t f d< t  t j j d9 d>  } | j | d;  d? S(D   s-   Construct and draw PDF using method approach.s   Test Diagrami   RW   RY   s   CDS FeaturesR   i    R   g      ?t   genei   R~   t	   lightblueRx   R}   R   Rz   i   R   R   Rw   t   GAATTCt   EcoRIRy   t   CCCGGGt   SmaIR   t   AAGCTTt   HindIIIR   t   GGATCCt   BamHIR|   ii   RX   i
   t   label_colors   AT and GC contentR   t   graphi   s
   GC contentt   stylet   linet   altcolors
   AT contentRg   Rh   Ri   Re   Rj   Rk   t   A4Rl   i   Rm   s   GD_by_meth_linear.pdfR   RN   i   s   GD_by_meth_circular.pdfN(   R   R   Ry   (   R   R   R   (   R   R   R   (   R   R   R|   (   R   R   R]   R   R_   R   R   R   Ra   R,   t   findR   R   R   t	   new_graphR   R*   R   t
   lightgreent   darkseagreenR.   R   R   Rp   Rr   Rs   Rt   Rq   t
   move_trackRU   R   (   RD   R   RV   R^   R`   Rc   Rx   t   siteRY   t   indext	   gdt_at_gct	   gds_at_gcR   R   (    (    s   test_GenomeDiagram.pyt   test_diagram_via_methods_pdf  sn    				 		
	
c         C   s  |  j  } t d  } t d d  } t d d  } t d d  } t d d  } d } x | j D] } | j d k r | d	 7} | d
 d k r | j | d t j q | j | d t j n  | j d k r | j |  n  | j d k r	| j | d t j	 n  | j d k ra | j | d t j
 qa qa W| j d d	  | j d d	  | j d d	  | j d d	  | j d d  | j d d  | j d t j  t d d t d d d d d d d d d d }	 |	 j |  t d d d	 d d }
 |
 j |  t d d d	 d d } | j |  | j |  t |  d } t d  } t | j | t |  } | j | d d  d! d t j d" t j
 t d# d$ d% d d	 d d } | j |  t d&  } | j t | j | t |  d' d  d( d t j d" t j | j t | j | t |  d) d  d( d t j	 d" t j t d* d$ d% d d	 d d } | j |  t d+  } t |  d, } | j t | j | t |  d+ d  d- d t j d" t j	 t d+ d$ d. d t d/ t } | j |  | j | d0  | j | d1  | j |	 d2  | j |
 d3  | j | d4  | j | d5  | j d6 d7 d8 d9 d: d d; d< d7 t  t j  j! d= d>  } | j" | d?  | j d6 d@ d8 d9 d: d d; d< dA d0  t j  j! d= dB  } | j" | d?  dC S(D   s-   Construct and draw PDF using object approach.s   Test DiagramRY   s   CDS featuress   gene featurest   misc_featuress   repeat regionsi    R   i   i   Rx   R   t   misc_featuret   repeat_regionRw   t   hideRW   R   g     @R   g     @@R   i
   t   greytrack_font_colorR   R   R   s   misc features and repeatsi   s   GC skews   GC SkewR   t   barR   s   GC Skew (bar)R   g
ףp=
?s   GC and AT Contents
   GC contentR   s
   AT contents,   GC Content(green line), AT Content(red line)s   Di-nucleotide counti  t   heatg      ?t   scalei   i   i   i   i   i   Rg   RN   Ri   Re   Rj   Rk   t   A0Rm   s   GD_by_obj_circular.pdfR   Rh   Rl   s   GD_by_obj_linear.pdfN(#   R   R   R	   R   R   Ra   R   t   pinkR   R   R|   t   set_all_featuresR~   R   R   t   add_setR   R
   R   R,   R2   R   t   violetR*   R   R   R.   R9   RU   t	   add_trackRp   Rr   Rs   Rt   Rq   (   RD   R   RV   t   gdfs1t   gdfs2t   gdfs3t   gdfs4t	   cds_countRc   t   gdt1t   gdt2t   gdt3R   t   gdgs1t
   graphdata1t   gdt4t   gdgs2t   gdt5t   gdgs3t   gdt6R   (    (    s   test_GenomeDiagram.pyt   test_diagram_via_object_pdf  s    	
				
		
	
	(   R;   R<   R   RH   R   R   R   R   (    (    (    s   test_GenomeDiagram.pyR   "  s   			G	Mt   __main__t	   verbosityi   t
   testRunner(-   R   Rr   t   unittestt   BioR    t   reportlab.libR   t   reportlab.pdfbaseR   t   reportlab.pdfbase.ttfontsR   t   reportlab.lib.unitsR   t   ImportErrorR   t   Bio.SeqFeatureR   R   R   t   Bio.Graphics.GenomeDiagramR	   R
   R   R   t!   Bio.Graphics.GenomeDiagram._GraphR   t"   Bio.Graphics.GenomeDiagram._ColorsR   R   R   R*   R.   R2   R5   R9   t   TestCaseR:   R=   RG   RM   R   R;   t   TextTestRunnert   runnert   main(    (    (    s   test_GenomeDiagram.pyt   <module>   s@   "6					O -