
    Ri@                       d Z ddlZddlZddlZddlZddlZddlZddlmZ ddlm	Z	 ddl
ZddlmZ ddlmZ ddlmZ ddlmZ  ed	d
      Z G d de      Z edd eddd
       eddd
       eddd
       eddd
       eddd
       eddd
       eddd
       edd d!
       edd"d#
       ed$d%d&
       ed'd(d)
       ed'd*d+
      g      e_         G d, d-ej.                        Z G d. d/ej0                        Z G d0 d1ej                        Z G d2 d3      Z G d4 d5e      Z G d6 d7      Z G d8 d9      Z G d: d;e      Z G d< d=      Z G d> d?e      Z  G d@ dA      Z! G dB dC      Z" G dD dEe!      Z# G dF dG      Z$ G dH dI      Z% G dJ dK      Z& G dL dM      Z' G dN dO      Z( G dP dQ      Z)y)Ra  Bio.Align support for alignment files in the bigBed format.

The bigBed format stores a series of pairwise alignments in a single indexed
binary file. Typically they are used for transcript to genome alignments. As
in the BED format, the alignment positions and alignment scores are stored,
but the aligned sequences are not.

See http://genome.ucsc.edu/goldenPath/help/bigBed.html for more information.

You are expected to use this module via the Bio.Align functions.
    N)
namedtuple)BytesIO)	Alignment)
interfaces)Seq)	SeqRecordField)as_typenamecommentc                   `     e Zd ZU dZd ed<   d Zed        Zed        Zd Z	d Z
 fdZ xZS )	AutoSQLTablezJAutoSQL table describing the columns of an (possibly extended) BED format.defaultc                 *    || _         || _        || dd y)zKCreate an AutoSQL table describing the columns of an (extended) BED format.N)r   r   )selfr   r   fieldss       H/home/agent/.friday_env/lib/python3.12/site-packages/Bio/Align/bigbed.py__init__zAutoSQLTable.__init__M   s    	Q    c                 j   |j                  d      sJ |dd j                         }|j                  dd      \  }}|dk(  sJ |j                  dd      \  }}|j                  d      sJ |j	                  dd      }|d| }||dz   d j                         }|j                  d      sJ |j                  d      sJ |dd j                         }g }|r|j                  d      }|j                  d|dz         }||dz   | }	|d| j                         }
|
j                  d	      sJ |
dd j                  dd      \  }}|j                  d
      r|j                  d      }|d| }n|}|dv sJ t        |||	      }|j                  |       ||dz   d j                         }|rt        |||      S )z?Return an AutoSQLTable initialized using the bytes object data.    N   table"();][)
intuintshortushortbyteubytefloatcharstringlstring)endswithdecodesplit
startswithfindstripindexrsplitr	   appendr   )clsdatatextwordr   ir   r   jfield_comment
definition
field_type
field_name	data_typefields                  r   
from_byteszAutoSQLTable.from_bytesS   s    }}U###CRy!ZZa(
dwZZa(
ds###IIc1q)AEG}""$s###}}S!!!Abz!

3A

3A&A QOMbq)J&&s+++%/_%;%;D!%D"J
""3'$$S)&rN	&	 !    *j-@EMM% A=&&(D5 6 D'622r   c                 F    | j                  |j                         dz         S )z@Return an AutoSQLTable initialized using the string object data.r   )r@   encode)r4   r5   s     r   from_stringzAutoSQLTable.from_string   s     ~~dkkme344r   c                    t        d | D              }t        d | D              dz   }g }|j                  d| j                  z         |j                  d| j                  z         |j                  d       | D ]C  }|j                  dz   }|j                  d| d	| d
|j                  ||j                  fz         E |j                  d       dj                  |      S )Nc              3   X   K   | ]"  }t        t        |j                               $ y wN)lenstrr
   .0r?   s     r   	<genexpr>z'AutoSQLTable.__str__.<locals>.<genexpr>   s     CUS/0Cs   (*c              3   F   K   | ]  }t        |j                          y wrF   )rG   r   rI   s     r   rK   z'AutoSQLTable.__str__.<locals>.<genexpr>   s     ;UUZZ;s   !r   z	table %s
z"%s"
z(
r   z   %-zs %-z
s    "%s"
z)
 )maxr3   r   r   r
   join)r   
type_width
name_widthlinesr?   r   s         r   __str__zAutoSQLTable.__str__   s    CdCC
;d;;a?
\DII-.X,-U 		E::#DLL
|4
|;?MMMM		 	Uwwu~r   c                 :    t        |       j                         dz   S )Nr   )rH   rB   r   s    r   	__bytes__zAutoSQLTable.__bytes__   s    4y!E))r   c                     t        |t              r0t        |   |      }t	        | j
                  | j                  |      S t        |   |      S rF   )
isinstanceslicesuper__getitem__r   r   r   )r   r8   r   	__class__s      r   r[   zAutoSQLTable.__getitem__   sC    aW(+F		4<<@@7&q))r   )__name__
__module____qualname____doc____annotations__r   classmethodr@   rC   rS   rV   r[   __classcell__r\   s   @r   r   r   H   sN    T *3 *3X 5 5(** *r   r   bedzBrowser Extensible Datar)   chromz)Reference sequence chromosome or scaffoldr"   
chromStartzStart position in chromosomechromEndzEnd position in chromosomer   zName of item.scorezScore (0-1000)zchar[1]strandz+ or - for strand
thickStartz4Start of where display should be thick (start codon)thickEndz1End of where display should be thick (stop codon)reservedz Used as itemRgb as of 2004-11-22r!   
blockCountzNumber of blockszint[blockCount]
blockSizesz#Comma separated list of block sizeschromStartsz&Start positions relative to chromStartc                   X     e Zd ZdZdZdZ	 	 	 	 	 	 	 d
 fd	Zd Zd Zd Z	d Z
d	 Z xZS )AlignmentWriterz1Alignment file writer for the bigBed file format.bigBedbc	                     |dk  s|dkD  rt        d      t        	| 	  |       || _        || _        || _        || _        || _        || _        || _	        y)a  Create an AlignmentWriter object.

        Arguments:
         - target       - output stream or file name.
         - bedN         - number of columns in the BED file.
                          This must be between 3 and 12; default value is 12.
         - declaration  - an AutoSQLTable object declaring the fields in the
                          BED file.
                          Required only if the BED file contains extra (custom)
                          fields.
                          Default value is None.
         - targets      - A list of SeqRecord objects with the chromosomes in
                          the order as they appear in the alignments. The
                          sequence contents in each SeqRecord may be undefined,
                          but the sequence length must be defined, as in this
                          example:

                          SeqRecord(Seq(None, length=248956422), id="chr1")

                          If targets is None (the default value), the alignments
                          must have an attribute .targets providing the list of
                          SeqRecord objects.
         - compress     - If True (default), compress data using zlib.
                          If False, do not compress data.
                          Use compress=False for faster searching.
         - blockSize    - Number of items to bundle in r-tree.
                          See UCSC's bedToBigBed program for more information.
                          Default value is 256.
         - itemsPerSlot - Number of data points bundled at lowest level.
                          See UCSC's bedToBigBed program for more information.
                          Use itemsPerSlot=1 for faster searching.
                          Default value is 512.
         - extraIndex   - List of strings with the names of extra columns to be
                          indexed.
                          Default value is an empty list.
              zbedN must be between 3 and 12N)

ValueErrorrZ   r   bedNdeclarationtargetscompressextraIndexNamesitemsPerSlot	blockSize)
r   targetry   rz   r{   r|   r~   r   
extraIndexr\   s
            r   r   zAlignmentWriter.__init__   s`    ^ !8tby<== 	& )("r   c           	      	   | j                   |j                   }n| j                   }t               }| j                  |_        | j                  	 |j                  d| j                   | _        | j                  }t        |      |_	        t        | j                  |      }| j                  |||      \  }}|j                  t        |j                               |j                  t        t         j                               |j#                         |_        |j                  t        |             |j#                         |_        |j                  t        t(        j                               |j#                         |_        |j                  t        |j                               |j#                         |_        t/               j                  |t1        | j2                  t        |            |       |j#                         |_        t         j7                  |      }	|j                  t        |      j9                  dt:        j<                               |j?                  t        |             | jA                  |||	|      \  }
}| jB                  r-tE        |
| jF                  tH        j                  z        |_%        nd|_%        |j#                         |_&        tO               j                  || j2                  d|jL                  |       | jQ                  |||jL                  |j4                  z
  ||	      \  }}t        |      |_)        |D ]`  }|j#                         |_*        |jV                  jY                          t/               j                  |jV                  | j2                  |       b |j[                  d       |j                  t        |             |j                  t        |             |j[                  |j&                         |j                  t        |             |j*                  |j#                         k(  sJ |j]                  |       |j[                  dt^        j`                         |jb                  j9                  dt:        j<                        }|j                  |       y# t
        $ r& t        j                  d| j                   | _        Y ww xY w)zWrite the alignments to the file stream, and return the number of alignments.

        alignments - A list or iterator returning Alignment objects
        stream     - Output file stream.
        N   r   r      )2r{   _Headerry   definedFieldCountrz   AttributeErrorr   r   rG   
fieldCount_ExtraIndicesr}   _get_chrom_usagewritebytessize_ZoomLevelstellautoSqlOffsettotalSummaryOffset_SummaryextraIndicesOffsetchromosomeTreeOffset_BPlusTreeFormatterminr   fullDataOffsetcalculate_reductionsto_bytessys	byteorder
initializewrite_alignmentsr|   rN   r~   _RegionSummaryuncompressBufSizefullIndexOffset_RTreeFormatter_write_zoom_levels
zoomLevels
fileOffsetchunkssortseektofileioSEEK_END	signature)r   stream
alignmentsr{   headerrz   extra_indiceschromUsageListaveSize
reductionsmaxBlockSizeregionszoomListtotalSumextra_indexr5   s                   r   
write_filezAlignmentWriter.write_file  s    << ((GllG#'99 #E#-#9#9+DII#F  &&,%d&:&:KH"&"7"7#
 	U6;;'(U;++,-%{{}U;'($*KKM!U8==)*$*KKM!U=--./&,kkm###CN0CDf	
 !' 55g>
S_--a?@  Z1 $ 5 5	!
g =='*d//.2E2EE(F$ ()F$!'T^^Q(>(>	
 "44""V%:%::
(  M( 	TK%+[[]K"##%!''(:(:DNNFS	T 	AU6]#U8_%F--.U8_%((FKKM999V$Ar{{#((CMM:T{ " E#/#7#7$))#D Es   R5 5+S$#S$c                 `   d}d}d}d}d}g }	d}
d}t         j                  }|D ]?  }|j                  d   j                  }|j                  d   }|j                  d   }|D ]  }|j                  |        ||kD  rt        d| d| d| d	      |d
z  }|||z
  z  }||k7  r}||kD  rt        d| d	      |r|	j                  |||f       |d
z  }|D ]  }|j                  |k(  s n t        d| d| d	      |}t        |
t        |            }
t        |      }d}||kD  rt        d| d| d| d| d	      dk\  r ||z
  }||k  r|dk  rt        d| d	      |}|}B |r|	j                  |||f       t        j                  |	dd|
 fddg      }	|dkD  r||z  }||_        |	|fS )Nr   rM   r   r   r   r   r   zend (z) before start (z) in alignment [r   r   z7alignments are not sorted by target name at alignment [zfailed to find target 'z' in target list at alignment [zend coordinate z bigger than z	 size of z at alignment [z]'z(alignments are not sorted at alignment [r   S)id=i4r   r   dtype)r   maxsize	sequencesr   coordinatesupdateMaxFieldSizerx   r3   rN   rG   nparray_len)r4   r   r{   r   r   chromId
totalBasesbedCountr   r   keySize	chromSizeminDiff	alignmentrf   startendr   r   	lastStartdiffs                        r   r   z AlignmentWriter._get_chrom_usagef  sx   
	++# -	I''*--E ))$/E''.C, :..y9:s{ C5 07GzQRS  MH#+%Ju}%<$QRZQ[[\]  "))4)*DEqLG% FyyE) %1%8WX`Waabc  gs5z2K		Y %cU-wi	{Rabjakkmn  A~y('>ax(FxjPQR  #GI[-	\ !!4)"<=ayM*M?K
 a< 8+G"
w&&r   c                    t               }t               }t        |      dk(  rd|_        d|_        ||fS | j
                  }| j                  }	| j                  }
|dz  }|j                         |d   _	        |D ]&  }|d   t        j                  z  }|	r|dz  }||k  s& n |d   }|d   j                  |       |
t        j                  z  }|	rt        ||      }nt        ||      }g }g }t        j!                  ||      }t#        |d         }|t         j$                  z  }|D ]  }t&        j(                   }|j+                  ||      }|D ]n  }|j-                  |       |j/                  |       ||z   |j0                  k  r3t3        j2                  |      }|j4                  }|j/                  |       j|z  }p  |j7                          t        |      |d   k(  sJ |d   |d   _        |j                         }||d   _        t=               j-                  |||
||       |	rt        ||      }nt        |t        j                        }|j?                  |||||
       ||fS )Nr              r   scale) r   r   rG   minValmaxValr   r|   r~   r   
dataOffsetr   r   r   _ZippedBufferedStream_BufferedStream
_RangeTreegenerater!   bbiResIncrementr   r   generate_summariesr   r3   r   copyr   flushreductionLevelindexOffsetr   reduce)r   r   outputdataSizer   r   r   r   r   
doCompressr~   maxReducedSizeinitialReductionreducedSizer   bufferr   rezoomedListtreesr   doubleReductionSizetreer   	summariessummaryrezoomedr   s                              r   r   z"AlignmentWriter._write_zoom_levels  s|    =:z?a!HO!HOj !!g IJ,,L%\N%+[[]HQK"$. 1 .v69L9LL1$K.01 $.a= V$++F3."5"55D.vt<(6GL''
CE(12E"'+*E*E"E , 33E8D	( ,GLL)NN7+22W[[@#'99W#5 ($++H5 G+,, LLNw<#3F#;;;;)9')BHQK& ++-K&1HQK###L+v .vt<(1D1DEOO.	< !!r   c                 
   | j                   }g }|j                  j                  }t        |      dk\  rt	        d| d      t        |      dk  rt	        d      |j
                  d   }|j
                  d   }||k  rt	        d| d	| d
      |dkD  rL|j                  j                  }|dk(  rd}nt        |      dkD  rt	        d| d      |j                  |       |dkD  rB	 |j                  }|dk  s|dkD  rt	        d| d      t        |      }|j                  |       |dkD  r5|j
                  d   |j
                  d   k  rd}	nd}	|j                  |	       |dkD  r'	 |j                  }
|j                  t        |
             |dkD  r	 |j                  }|
k  rt	        d|
 d| d
      |
dk7  r$|
|k  s|
|kD  rt	        d d| d| d |
 d| 
      |dk7  r$||k  s||kD  rt	        d! d| d| d |
 d| 
      |j                  t        |             |d"kD  r	 |j                  }|j                  d#      j                  d#      }t        |      dk(  rt!        d$ |D              rn'dt#        |      cxk  rd%k  rn nnt	        d&| d'      |j                  |       |d(kD  rjt%        j&                  |j
                        }t)        |dk7  d      d)k(  }|j+                  d      |   }t        |      }|j                  t        |             |d*kD  r*|j                  d#j-                  d+ D              d#z          |d,kD  rC|j
                  dd d-f      |z
  }|j                  d#j-                  d. |D              d#z          |d/kD  r|d0k7  rt	        d1| d2      |j.                  d3   }|j.                  d4   }t        |      }|t        |      k(  sJ |j                  t        |             |j                  d#j-                  |             |j                  d#j-                  d5 |D                     | j0                  |d  D ]  }|j.                  |j2                     }t5        |t              r|j                  |       >t5        |t"        t6        f      r|j                  t        |             o|j                  d#j-                  t9        t        |                    d6j-                  |      j;                         }||||fS # t        $ r d}Y w xY w# t        $ r |}
Y w xY w# t        $ r |}Y Cw xY w# t        $ r d}Y w xY w)7N   zalignment target name 'z.' is too long (must not exceed 254 characters)r   z.alignment target name cannot be blank or emptyr   r   zchromStart after chromEnd (z > r   rv   rM   .zalignment query name 'z-' is too long (must not exceed 255 charactersr   r   i  zscore (z) must be between 0 and 1000   )r   r   )r   r   +-      zthickStart (z) after thickEnd (zthickStart out of range for :z, thick:zthickEnd out of range for r   ,c              3   N   K   | ]  }d t        |      cxk  xr dk  nc   yw)r      N)r!   )rJ   colors     r   rK   z2AlignmentWriter._extract_fields.<locals>.<genexpr>0  s!     +VeAU,Ac,A,A+Vs   #%l        z?Expecting color to consist of r,g,b values from 0 to 255. Got ''	   r   
   c              3   2   K   | ]  }t        |        y wrF   rH   )rJ   r   s     r   rK   z2AlignmentWriter._extract_fields.<locals>.<genexpr>@  s     K9IK      r   c              3   2   K   | ]  }t        |        y wrF   r  )rJ   rg   s     r   rK   z2AlignmentWriter._extract_fields.<locals>.<genexpr>C  s     NJJNr  rw      zUnexpected value z for bedN in _extract_fieldsexpIds	expScoresc              3   2   K   | ]  }t        |        y wrF   r  )rJ   expScores     r   rK   z2AlignmentWriter._extract_fields.<locals>.<genexpr>M  s     H(HHr  	)ry   r   r   rG   rx   r   queryr3   ri   rH   r   rk   rl   itemRgbrstripr-   allr!   r   r   sumrN   rO   annotationsrz   r   rX   r'   maprB   )r   r   ry   rowrf   rg   rh   r   ri   rj   rk   rl   r  colorsstepsalignedro   rn   rp   r
  r  expCountr?   valuerests                            r   _extract_fieldszAlignmentWriter._extract_fields  s   yy  ##u:)%0^_  u:>MNN**40
((/j :8*C
|STUVV!8??%%DrzTS ,TF2_`  JJt!8#! 19$wug5Q%RSSE
JJu!8$$T*i.C.CE.JJJJv!8(&11
 JJs:'!8$-- j($&zl2DXJaP  ?+zH/D$6tfAj\8*T\]g\hhijrist  q=h&;x(?R$4TF!J<q
RZ[eZffghpgqr  JJs8}%!8#++ !,2237v;!#+Vv+V(V#g,2'2$YZaYbbcd  JJw!8GGI112E%1*a(A-G1g.JZJJJs:'"9JJsxxK
KKcQR"9#//3B37@:MKJJsxxN+NNQTTU"9rz #4TF:V!WXX**84F!--k:I6{Hs9~---JJs8}%JJsxx'(JJsxxHiHHI%%de, 	6E))%**5E%%

5!EC<0

3u:&

388CUO45	6 yy~$$&j(D00m "   " ('
( " $#$* " sH   'T (T, T> )U T)(T),T;:T;>UUUUc                    | j                   }d}d}d}d}	d}
g }| j                  du rt               }n
t               }d}t	        j
                  d      }d}d}t        |      }	 	 t        |      }| j                  |      \  }}}}||
k7  r|
|}|}
|dz  }d|d<   	 ||k(  r|j                         }|j                         }||kD  r|}|j                         }|j                  |       |j                  d       |j                  d       |r2|j                         }||z
  }|D ]  }|j                  ||||	        |	}||_        |du r	 ||fS d}|dk(  rt#        |      }|j%                  |       n|j&                  kD  r||_        |dz  }|D ]Q  }|d   k\  r|d	xx   dz  cc<   ||d
   z   |d<   ||d   kD  s,|d	xx   dz  cc<   |dxx   |d
   z  cc<   ||d   kD  r&S |r|D ]  }|j)                  |	        |	dz  }	|j+                  ||      }|j                  |z   dz          # t        $ r |}d}Y w xY w)zWrite alignments to the output file, and return the number of alignments.

        alignments - A list or iterator returning Alignment objects
        stream     - Output file stream.
        r   r   NTz=IIIFr   r   r   r   r   )r~   r|   _ZippedStreamr   structStructiternextr  StopIterationr   getvaluer   r   truncateaddOffsetSizeoffset_Regionr3   r   addKeysFromRowpack)r   r   r   r   r   r~   r   itemIxsectionStartIxsectionEndIxcurrentChromr   r   r   	formatterdoneregionr   rf   r   r   r  blockStartOffsetr   r5   blockEndOffsetr   r   r  s                                r   r   z AlignmentWriter.write_alignmentsY  s    ((==D "_FYF MM&)	*%
* ,	
 +/*>*>y*I'uc4L(#/!-#(LqLG()Ju%%#);;= {{},&#'L(T"A" %+[[]N .1A AI'4 #11,%*(	 &2N 04<* W$$) { %5v&vzz! 
aKF! /CJ&K1$K!&W!5CJCJ&K1$KJ#g,.J CJ&	/ #0 HK..y,GH!>>'5#6DLLu,-q  ! %s   $H1 1II)rw   NNTi   r    )r]   r^   r_   r`   fmtmoder   r   r   r   r  r   rc   rd   s   @r   rr   rr      sN    ;
CD
 8#tL\A'F<"|p1dW%r   rr   c                   P    e 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y)AlignmentIteratorzAlignment iterator for bigBed files.

    The pairwise alignments stored in the bigBed file are loaded and returned
    incrementally.  Additional alignment information is stored as attributes
    of each alignment.
    rs   rt   c           
          t         j                  |      }|j                  }|j                  }|| _        |j                  }|j
                  }|j                  }t        |      }|j                  |       t        |      j                  }	|D ]o  }
|
j                  }|j                  |       |j                  |	j                        }|	j                  |      \	  }}}}}}}}| _        |t        j                   k(  roJ  | j#                  ||      | _        |j                  |       t'        j                  |dz   |j                  d            \  }|| _        |j*                  dkD  rd| _        nd| _        |j                  |j.                         t1        |      j                  |      | _        |j                  |j4                         t        |      j                  |      | _        | j9                  |      | _        y )NQr   r   TF)r   fromfiler   r   r   r   r   r   readr   formatter_headerr   r   r   unpackr~   r   _read_autosqlrz   r   _lengthr   _compressedr   r   r{   r   r   _iterate_index_data)r   r   r   r   r   r   r   r   r   r0  	zoomLevelr   r5   r   r   nItemsstartChromId	startBase
endChromIdendBaseendFileOffset	dataCounts                         r   _read_headerzAlignmentIterator._read_header  s   !!&)$$	,,"&&
"44..y)f#I.??	! 	:I#//KKK$;;y~~.D   &
! 9 9999	:   --ff=N#}}Y_fkk!nE ##a'#D$DF//0*95::6BF**+#I.33F;	((0
r   c                 .   |j                   |j                  z
  }|j                  }|j                  | _        |j                  |j                         |j                  |      }t        j                  |      }| j                  ||| j                         |S rF   )
r   r   r   r   ry   r   r=  r   r@   _analyze_fields)r   r   r   autoSqlSizer   r5   rz   s          r   r@  zAlignmentIterator._read_autosql  s|    //&2F2FF&&
,,	F((){{;'"--d3[*dii@r   c                 .   d}t        | j                        D ].  }||   j                  }|||   k7  st        d||   d|d       ||kD  rg | _        t        ||      D ]  }||   j                  }||   j
                  }d|v r+d|v r'd}	|j                  d      \  }}
|j                         }nd}	|d	v rt        }n0|d
v rt        }n%|dk(  rt        }n|dv rt        }nt        d|z        |	r|}|fd}| j                  j                  ||g        y )N)rf   rg   rh   r   ri   rj   rk   rl   rm   rn   ro   rp   zExpected field name 'z
'; found 'r  r    r   TF)r!   r"   r#   r$   )r%   r&   r'   )r'   r(   r)   r*   zUnknown field type %sc                 x    | j                  d      j                  d      }|D cg c]
  } ||       c}S c c}w )Nr   )r  r-   )r5   item_convertervaluesr  s       r   	converterz4AlignmentIterator._analyze_fields.<locals>.converter!  s4    ![[-33C8F?EFeN51FFFs   7)rangery   r   rx   _custom_fieldsr
   r-   r0   r!   r   r'   rH   	Exceptionr3   )r   r   r   r   namesr8   r   r=   r<   
make_array_rU  rS  s                r   rO  z!AlignmentIterator._analyze_fields  sL   
 tyy! 	A!9>>DuQx >CAhM 	 ))"$D(*5 	@AJ**Jj SJ%6!
 * 0 0 5
A'--/
"
??	00!	w&!	EE	 7* DEE!*3A G &&
I'>?5	@r   c           	   #   
  K   t        j                  | j                  dz         }|j                  }| j                  }	 	 |j
                  }|d   }# t        $ r% |j                  |j                         |j                  |j                        }| j                  dkD  rt        j                  |      }|rM|j                  |d |       \  }}}	|j                  d|      dz   }
|||
 }||
d  }|||	|dt!        |      f |rM	 |j"                  }|Y y t%        |j
                        D ]  \  }}t'        |      t'        |      k(  s n t)        d      	 |j
                  |dz      }n# t*        $ r |}Y nw xY wwY /w xY ww)NIIIr   r   Failed to find child node)r   r!  r   r   r   childrenr   r   r   r=  r   rB  zlib
decompressr?  r1   rG   parent	enumerater   RuntimeError
IndexError)r   r   r0  r   noder_  r5   r   rg   rh   r8   r  rb  r1   childs                  r   rC  z AlignmentIterator._iterate_index'  s     MM$..5"89	~~yy#==8  {=  " DOO,{{4==1##a'??40D4=4D4DT%4[4Q1GZ

1d+a/AQ<D8D"J$3t9MM  ![[F~(1&//(B Hud8r%y0!H ++FGG%uqy9  & &%&  3se   <FA FB2F F F2F F E*)F *E85F 7E88F <F?F  Fc           	   #     K   t        j                  | j                  dz         }|j                  }|dz
  }|dz   }| j                  }		 	 |	j
                  }
d}|
D ]A  }|j                  |j                  f||fk  r!||f|j                  |j                  fk  r?d} n |r}	[	 |	j,                  }|y t/        |j
                        D ]  \  }}t1        |	      t1        |      k(  s n t3        d      	 |j
                  |dz      }		 # t        $ r> |j                  |	j                         |j                  |	j                        }| j                  dkD  rt!        j"                  |      }| j$                  dk(  rJ|j'                  |d |       \  }}}||k(  r||k  r||k  s||k(  r||k(  s||k(  r|||||t)        |      f nd}t)        |      }||k  ru||z   }|j'                  |||       \  }}}|}|j+                  d|      dz   }||| }|}||k7  rF||k  s||k  r||k7  rV||k7  r||k7  ra||||dt)        |      f ||k  ruY w xY w# t4        $ r |}	Y nw xY wíw)Nr]  r   TFr   r   r^  )r   r!  r   r   r   r_  
endChromIxrJ  startChromIxrH  r   r   r   r=  r   rB  r`  ra  r~   r?  rG   r1   rb  rc  r   rd  re  )r   r   chromIxr   r   r0  r   padded_start
padded_endrf  r_  visit_childrg  r5   child_chromIxchild_chromStartchild_chromEndr8   nr9   r  rb  r1   s                          r   _search_indexzAlignmentIterator._search_indexP  s     MM$..5"89	~~qy1W
yy>==f $% E((%--8G\;RR ,0B0BEOO/TT "&K  D>$-foo$> DLE5$x2e9,D ''BCC!??5195D ]  " 0DOO,{{4==1##a'??40D$$)FOFVFVUdGCM#3^ %/,s2u~7M,>!1S!8E^<S !. 0 . $ $ #D	#  AD	Aa%H%,,T!AY7 H'7  JJvq1A5#Aay(G3$"22n6M/>A (/36>U;R (),* I ! a%30P " "!D" sV   AI&	D BI&%I&4I I&EII&II&I!I& I!!I&c                     	 t        | j                        }|\  }}}}}}| j                  ||||||      S # t        $ r Y y w xY wrF   )r#  rD  r$  _create_alignment)	r   r   r  r   rg   rh   r  	dataStartdataEnds	            r   _read_next_alignmentz&AlignmentIterator._read_next_alignment  s_    	tzz"C CF?XtY%%Z4G
 	
  		s   6 	AAc                    ||dz
     dk(  sJ |||dz
   }|r |j                         j                  d      }ng }| j                  |   }| j                  dkD  r|d   }	nd }	| j                  dkD  r|d   }
nd}
| j                  dkD  rdt	        |d	         }t        j                  |d
   j                  d      j                  d      t              }t        j                  |d   j                  d      j                  d      t              }t        |      |k7  rt        dt        |      |fz        t        |      |k7  rt        dt        |      |fz        d}d}||gg}t        ||      D ]<  \  }}||k7  r|j                  ||g       |}||z  }||z  }|j                  ||g       > t        j                  |t
        j                        j                         }t        |      }n1||z
  }t        j                  d|gd|ggt
        j                        }|}|dd d fxx   |z  cc<   t!        d |      }t#        ||	      }||g}|
dk(  r||dd d f   z
  |dd d f<   ||d   k7  rt        d||d   fz        ||d   k7  rt        d||d   fz        t%        ||      }t        |      | j                  dz
  kD  rOi |_        t        || j                  dz
  d  | j(                        D ]  \  }}|\  }	} ||      |j&                  |	<   ! | j                  dk  r|S |d   }	 t+        |      }|j-                         rt	        |      }	 ||_        | j                  d	k  r|S t	        |d         |_        | j                  d
k  r|S t	        |d         |_        | j                  dk  r|S |d   |_        |S # t        $ r Y ww xY w)Nr   r   r  rv   r   r   r   r  r   r   r   r   z:Inconsistent number of block sizes (%d found, expected %d)zDInconsistent number of block start positions (%d found, expected %d)lengthr   r   r   z/Inconsistent chromStart found (%d, expected %d)r   z-Inconsistent chromEnd found (%d, expected %d)r   )r,   r-   r{   ry   r!   r   fromiterr  rG   rx   zipr3   r   intp	transposer  r   r   r   r  rW  r'   
is_integerri   rk   rl   r  )r   r   rg   rh   r  rv  rw  wordstarget_recordr   rj   rn   ro   blockStarts	tPosition	qPositionr   r   
blockStartqSizequery_sequencequery_recordrecordsr   r7   custom_fieldrU  ri   s                               r   ru  z#AlignmentIterator._create_alignment  s    GaK A%%%I!,KKM''-EEW-99q=8DD99q=1XFF99q=U1XJU1X__S%9%?%?%DcJJ++eAhooc&:&@&@&EsKK:*, P:
34  ;:- Z;'45  II%y12K),Z)E ;%	:*&&
I'>? *IY&	Y&	""Iy#9:; ((;8BBDK
OE :-I((Q	NQ	N#CRWWMKEAqDZ'T%0 D9 ,/S= %AqD(9 9K1T**A{4012  {5))?[/01  g{3	u:		A%$&I!&)%		A*@$BUBU&V >"l".i.7o	%%d+> 99>a	#%LE !E
	99>"58}	99> q]	99>!!H	  		s   &N9 9	OOc                     | j                   S rF   )rA  rU   s    r   __len__zAlignmentIterator.__len__  s    ||r   Nc           	   #     K   | j                   }|||kt        d      t        | j                        D ]  \  }}|j                  |k(  s n t        d|z        ||d}t        |      }nt        d      ||dz   }| j                  |||      }|D ]%  }|\  }}	}
}}}| j                  ||	|
|||      }| ' yw)a  Iterate over alignments overlapping the specified chromosome region..

        This method searches the index to find alignments to the specified
        chromosome that fully or partially overlap the chromosome region
        between start and end.

        Arguments:
         - chromosome - chromosome name. If None (default value), include all
           alignments.
         - start      - starting position on the chromosome. If None (default
           value), use 0 as the starting position.
         - end        - end position on the chromosome. If None (default value),
           use the length of the chromosome as the end position.

        Nz5start and end must both be None if chromosome is NonezFailed to find %s in alignmentsr   z!end must be None if start is Noner   )_streamrx   rc  r{   r   rG   rs  ru  )r   
chromosomer   r   r   rk  r   r5   r  rg   rh   r  rv  rw  r   s                  r   searchzAlignmentIterator.search  s        CO K  $-T\\#: Q99
*Q !!BZ!OPP};Ef+C$%HIIai!!&'5#> 	CFICGZ4G..XtYI O	s   AB?A4B?)NNN)r]   r^   r_   r`   r6  r7  rM  r@  rO  rC  rs  rx  ru  r  r  r5  r   r   r9  r9    sH     CD*1X1@f'#RYv
Zx*r   r9  c                        e Zd Z fdZ xZS )r  c                 J    t         |          }t        j                  |      S rF   )rZ   r%  r`  r|   )r   r5   r\   s     r   r%  z_ZippedStream.getvalueB  s    w!}}T""r   )r]   r^   r_   r%  rc   rd   s   @r   r  r  A  s    # #r   r  c                       e Zd Zd Zd Zd Zy)r   c                 >    t               | _        || _        || _        y rF   )r   r   r   r   )r   r   r   s      r   r   z_BufferedStream.__init__H  s    i	r   c                    | j                   j                         |_        t        |      }| j                  j                  |       | j                  j                         | j                  k(  rj| j                   j                  | j                  j                                | j                  j                  d       | j                  j                  d       y y Nr   )
r   r   r(  r   r   r   r   r%  r   r&  r   itemr5   s      r   r   z_BufferedStream.writeM  s    kk&&(T{$;;*KKdkk2245KKQKK  # +r   c                     | j                   j                  | j                  j                                | j                  j	                  d       | j                  j                  d       y r  )r   r   r   r%  r   r&  rU   s    r   r   z_BufferedStream.flushV  sE    $++..01Qr   N)r]   r^   r_   r   r   r   r5  r   r   r   r   G  s    
$ r   r   c                       e Zd Zd Zd Zy)r   c                    | j                   j                         |_        t        |      }| j                  j                  |       | j                  j                         | j                  k(  r}| j                   j                  t        j                  | j                  j                                      | j                  j                  d       | j                  j                  d       y y r  )r   r   r(  r   r   r   r   r`  r|   r%  r   r&  r  s      r   r   z_ZippedBufferedStream.write]  s    kk&&(T{$;;*KKdmmDKK,@,@,BCDKKQKK  # +r   c                     | j                   j                  t        j                  | j                  j                                      | j                  j                  d       | j                  j                  d       y r  )r   r   r`  r|   r   r%  r   r&  rU   s    r   r   z_ZippedBufferedStream.flushf  sN    $--(<(<(>?@Qr   N)r]   r^   r_   r   r   r5  r   r   r   r   \  s    $ r   r   c                   j    e Zd ZdZ ej
                  d      Zej                  ZdZdZ	e
d        Zd Zy)r   )r   r   r   r   r   r   r   r   r   r   r   z=IHHQQQHHQQIQl   r r   c                    |j                  d      }t        j                  |d      t        j                  k(  rd}n6t        j                  |d      t        j                  k(  rd}nt        d      t        j                  |dz         }t               }||_        |j                  }|j                  |      }|j                  |      \  }|_        |_        |_        |_        |_        |_        |_        |_        |_        |_        |t        j*                  k(  sJ |j                   }	|	d	k  s|	d
kD  rt        d|	z        |S )Nr   little)r   <big>znot a bigBed fileHHQQQHHQQIQrv   rw   z+expected between 3 and 12 columns, found %d)r=  r!   r@   r   r   rx   r   r!  r   r   r?  r   r   r   r   r   r   r   r   r   r   bbiCurrentVersion)
r4   r   magicr   r0  r   r   r5   versionr   s
             r   r<  z_Header.fromfile  s5   A>>%8>48I8III^^EU^3w7H7HHI011MM)m";<	$~~{{4  T"	
'!"$ %$%'33333"44q $5$:=@QQ  r   c                 V   t         j                  j                  t         j                  t         j                  | j
                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                        S rF   )r   r0  r+  r   r  r   r   r   r   r   r   r   r   r   r   rU   s    r   rV   z_Header.__bytes__  s      %%%%OO%%  OO""##""##
 	
r   N)r]   r^   r_   	__slots__r   r!  r0  r   r   r  rb   r<  rV   r5  r   r   r   r   l  sG    I8 o.I>>DI   D
r   r   c                   R    e Zd ZdZ ej
                  d      Zd Zd Zd Z	d Z
d Zy)	_ExtraIndex)
indexFieldmaxFieldSizer   r   	get_valuez=xxHQxxxxHxxc                    d| _         d | _        t        |      D ]  \  }}|j                  k(  s n t	        d      d |j
                  dk7  rt	        d      || _        dk(  r	d | _        y dk(  r	d | _        y fd	| _        y )
Nr   zCextraIndex field %s not a standard bed field or found in 'as' file.r)   z+Sorry for now can only index string fields.rf   c                 .    | j                   j                  S rF   )r   r   r   s    r   <lambda>z&_ExtraIndex.__init__.<locals>.<lambda>  s    y/?/?/B/B r   r   c                 .    | j                   j                  S rF   )r  r   r  s    r   r  z&_ExtraIndex.__init__.<locals>.<lambda>  s    y/A/A r   c                 "    | j                      S rF   )r  )r   r   s    r   r  z&_ExtraIndex.__init__.<locals>.<lambda>  s    y/D/DT/J r   )r  r   rc  r   rx   r
   r  r  )r   r   rz   r1   r?   s    `   r   r   z_ExtraIndex.__init__  s    %k2 	LE5zzT!	 U  ==H$JKK7?BDNV^ADNJDNr   c                 j    | j                  |      }t        |      }|| j                  kD  r|| _        y y rF   )r  rG   r  )r   r   r  r   s       r   r   z_ExtraIndex.updateMaxFieldSize  s4    y)5z$### $D $r   c                 f    | j                  |      }|j                         | j                  |   d<   y )Nr   )r  rB   r   )r   r   recordIxr  s       r   r*  z_ExtraIndex.addKeysFromRow  s)    y)(-Hf%r   c                 L    || j                   || d<   || j                   || d<   y )Nr(  r   )r   )r   r(  r   startIxendIxs        r   r'  z_ExtraIndex.addOffsetSize  s,    /5GE"8,-1GE"6*r   c                 h    d}| j                   j                  || j                  | j                        S Nr   )r0  r+  r   r  )r   indexFieldCounts     r   rV   z_ExtraIndex.__bytes__  s(    ~~""?DOOT__UUr   N)r]   r^   r_   r  r   r!  r0  r   r   r*  r'  rV   r5  r   r   r  r    s2    SIn-IK*%72Vr   r  c                   R    e Zd Z ej                  d      Zd Zed        Zd Z	d Z
y)r   z=HHQ52xc                 H    |D cg c]  }t        ||       c}| d d  y c c}w rF   )r  )r   rY  rz   r   s       r   r   z_ExtraIndices.__init__  s     >CDd;t[1DQDs   c                 |    | j                   j                  t        j                   j                  t        |       z  z   S rF   )r0  r   r  rG   rU   s    r   r   z_ExtraIndices.size  s,    ~~""[%:%:%?%?#d)%KKKr   c                     |dk(  ry | D ]G  }|j                   }t        j                  dd| fddg      }t        j                  ||      |_        I y )Nr   r   z=S)r(  =u8)r   r  r   )r  r   r   zerosr   )r   r   r   r   r   s        r   r   z_ExtraIndices.initialize  sc    q= 		AK!..G
 HHBwi.)+<oNE "$(%!@K		Ar   c                    | j                   j                  }t        |       dkD  rl|j                         |z   }| j                   j	                  |t        |       |      }|j                  |       | D ]  }|j                  t        |              y | j                   j	                  |dd      }|j                  |       y r  )r0  r   rG   r   r+  r   r   )r   r   r   r(  r5   r   s         r   r   z_ExtraIndices.tofile  s    ~~""t9q=[[]T)F>>&&tSY?DLL# 1U;/01 >>&&tQ2DLLr   N)r]   r^   r_   r   r!  r0  r   propertyr   r   r   r5  r   r   r   r     s9    i(IE L LA
r   r   c                   (    e Zd Zg dZddZd Zd Zy)
_ZoomLevel)r   r   r   r0  c                 >    t        j                  |dz         | _        y )NIxxxxQQ)r   r!  r0  r   r   s     r   r   z_ZoomLevel.__init__  s      y9'<=r   c                 x    | j                   j                  | j                  | j                  | j                        S rF   )r0  r+  r   r   r   rU   s    r   rV   z_ZoomLevel.__bytes__  s0    ~~""$2B2B
 	
r   c                     |j                  | j                  j                        }| j                  j                  |      \  }}}|dk(  rt        || _        || _        || _        y r  )r=  r0  r   r?  r$  r   r   r   )r   r   r5   r   r   r   s         r   r=  z_ZoomLevel.read$  sZ    {{4>>../26..2G2G2M/
KQ,$&r   N=)r]   r^   r_   r  r   rV   r=  r5  r   r   r  r    s    LI>

'r   r  c                   |    e Zd ZdZdZ ed      j                  j                  ez  Zd
dZd Z	d Z
ed        Zd Zy	)r   r   r  r  c                 t    t        t        j                        D cg c]  }t        |       c}| d d  y c c}w rF   )rV  r   bbiMaxZoomLevelsr  )r   r   r8   s      r   r   z_ZoomLevels.__init__3  s)    278T8T2UVQ:i(VQVs   5c                     dj                  d | D              }|t        t        j                  t	        |      z
        z  }|S )Nr   c              3   2   K   | ]  }t        |        y wrF   )r   )rJ   r  s     r   rK   z(_ZoomLevels.__bytes__.<locals>.<genexpr>7  s     5d5r  )rO   r   r   r   rG   )r   r5   s     r   rV   z_ZoomLevels.__bytes__6  s9    xx555k&&T233r   c                     t        t        j                        D ]  }	 | |   j                  |        y # t        $ r	 | |d = Y  y w xY wrF   )rV  r   r  r=  r$  )r   r   r   s      r   r=  z_ZoomLevels.read;  sR     < <= 	JZ %%f-	 ! %s   5AAc                 H   t         j                  }t        j                  |g d      }d}t	        t        |      |      }t        j                  |j                  d         j                  }t        |      D ]$  }||kD  r n|||   d<   |t         j                  z  }& |d  S )N))r   r   r   )r   r   r   r  r   )
r   r  r   r  rN   r!   iinfor   rV  r   )r4   r   r  r   minZoomresmaxIntresTrys           r   r   z _ZoomLevels.calculate_reductionsC  s    &77XXE

 #g,(***73488,- 	/FV|*-Jvw';...C		/
 '6""r   c                    |d   }t        |d         t        j                  z  }|j                  }t	               }	t        dt        j                        D ]0  }
t        |      }||k\  r n|}|j                         | |
   _	        |j                  dt        j                        }|j                  |       |D ]  }|j                  |        |j                          |j                         }|	j                  |||||       || |
   _        || |
   _        |t        j                  z  }d}d }|D ]M  }|j"                  |k7  s|j$                  kD  r(|j&                  |z   }|j"                  }|}|||<   |dz  }I|z  }O ||d = 3 | 
d = y )Nr   r   r   r   r   )r!   r   r   r   r   rV  r  rG   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r~   	zoomCount	reductionr   r0  r   rezoomCountr5   r   r   r8   r   r   currentSummarys                      r   r   z_ZoomLevels.reduceT  s   $V,	(12[5P5PP	#%	;#?#?@ 	Ji.Ki'#I*0++-D'%%a7DLL$ &W%&LLN ++-KOOIy,VT+6D(.7D+444IAG$ .??g-s1B!--)3C%ooG%,N#1IaLFA"g-N. !"7	8 r   Nr  )r]   r^   r_   r   r  r  r0  r   r   rV   r=  rb   r   r   r5  r   r   r   r   .  sQ    Oc?$$)),<<DW
 # # !r   r   c                   ^    e Zd ZdZ ej
                  d      Zej                  Zd Zd Z	d Z
y)r   
validCountr   r   sumData
sumSquaresz=Qddddc                     d| _         t        j                  | _        t        j                   | _        d| _        d| _        y Nr   r   )r  r   r   r   r   r  r  rU   s    r   r   z_Summary.__init__~  s/    kk{{lr   c                     | xj                   |z  c_         || j                  k  r|| _        || j                  kD  r|| _        | xj                  ||z  z  c_        | xj                  ||z  |z  z  c_        y rF   r  )r   r   vals      r   updatez_Summary.update  s_    4DKDKd
"39t++r   c                     | j                   j                  | j                  | j                  | j                  | j
                  | j                        S rF   )r0  r+  r  r   r   r  r  rU   s    r   rV   z_Summary.__bytes__  s<    ~~""OOKKKKLLOO
 	
r   N)r]   r^   r_   r  r   r!  r0  r   r   r  rV   r5  r   r   r   r   x  s/    KIh'I>>D,
r   r   c                       e Zd ZdZd Zy)r)  )r   r   r   r(  c                 .    || _         || _        || _        y rF   )r   r   r   )r   r   r   r   s       r   r   z_Region.__init__  s    
r   N)r]   r^   r_   r  r   r5  r   r   r)  r)    s    5Ir   r)  c                       e Zd Zej                  ej                  z   Z ej                  d      Zej                  Z	d Z
d Zd Zd Zy)r   z	=IIIIffffc                    || _         || _        || _        d| _        t	        j
                  |      | _        t	        j
                  |      | _        t	        j
                  d      | _        t	        j
                  d      | _	        d | _
        y r  )r   r   r   r  r   float32r   r   r  r  r(  )r   r   r   r   r  s        r   r   z_RegionSummary.__init__  sc    
jj'jj'zz#**S/r   c                    |j                   | _         | xj                  |j                  z  c_        t        | j                  |j                        | _        t	        | j
                  |j
                        | _        t        j                  | j                  |j                  z         | _        t        j                  | j                  |j                  z         | _	        | S rF   )
r   r  r   r   rN   r   r   r  r  r  )r   others     r   __iadd__z_RegionSummary.__iadd__  s    995+++$++u||4$++u||4zz$,,">?**T__u7G7G%GHr   c                    | xj                   |z  c_         | j                  |kD  rt        j                  |      | _        | j                  |k  rt        j                  |      | _        t        j                  | j
                  ||z  z         | _        t        j                  | j                  ||z  |z  z         | _        y rF   )r  r   r   r  r   r  r  )r   overlapr  s      r   r  z_RegionSummary.update  s    7";;**S/DK;;**S/DKzz$,,w">?**T__sSy77J%JKr   c           
          | j                   j                  | j                  | j                  | j                  | j
                  | j                  | j                  | j                  | j                        S rF   )
r0  r+  r   r   r   r  r   r   r  r  rU   s    r   rV   z_RegionSummary.__bytes__  sQ    ~~""LLJJHHOOKKKKLLOO	
 		
r   N)r]   r^   r_   r)  r  r   r   r!  r0  r   r   r  r  rV   r5  r   r   r   r     sF    !!H$6$66Ik*I>>D	L

r   r   c                        e Zd Zg dZd Zd Zy)
_RTreeNode)r_  rb  rG  rH  rI  rJ  startFileOffsetrK  c                      d | _         g | _        y rF   )rb  r_  rU   s    r   r   z_RTreeNode.__init__  s    r   c                     ||xx   dz  cc<   |dz  }|t        |      k(  ry | j                  D ]  }|j                  ||        y r  )rG   r_  calcLevelSizes)r   
levelSizeslevelrg  s       r   r  z_RTreeNode.calcLevelSizes  sM    5Q
C
O#]] 	4E  U3	4r   N)r]   r^   r_   r  r   r  r5  r   r   r  r    s    	I4r   r  c                   D    e Zd ZdZd Zed        Zd Zd Zd Z	d Z
d Zy	)
r   )rootrr  freeListstackr   r   c                 J    d | _         d| _        g | _        || _        || _        y r  )r   rr  r  r   r   )r   r   r   s      r   r   z_RangeTree.__init__  s%    	"r   c              #   2  K   t        |      }d }|D ]r  \  }}}|j                         }t        ||      }||j                  |       	 	 t	        |      }|j                  j                  |k7  rn|j                  |       8| t y # t
        $ r Y w xY wwrF   )r"  r,   r   addToCoverageDepthr#  r$  r   r   )r4   r   r   r   	chromNamer   r   r   s           r   r   z_RangeTree.generate  s     *%
	-; 	)Iw	!((*Igy1D$''	2 $Z 0I ##&&)3''	2  J	 % s*   AB
B3B	BBBBc              #     K   | j                   j                         }t        |      \  }}}| j                  }| j                  }t        ||t        ||z   |      |      }		 t        ||z
  d      }
|j                  |
|       |	j                  |k  rt        ||t        ||z   |      |      }	||	j                  kD  rt        ||	j                        t        ||	j                        z
  }|dkD  sJ |	j                  ||       |
|z  }
|	j                  }|	 t        ||t        ||z   |      |      }	||	j                  kD  r|	j                  |
|       	 t        |      \  }}}|	j                  |k  r|	 # t        $ r Y nw xY w|	 y w)Nr   r   )r   traverser#  r   r   r   r   rN   r  r   r   r$  )r   r   r   rangesr   r   r  r   r   r   r   r  s               r   r   z_RangeTree.generate_summaries  s    ##%v,sC,,NN	 y)	
 sU{A&DOOD#&{{e#(y1	 #c7;;/#eW]]2KK{"{w,(y1	 # NN4%"&v,sC {{e#; 4 !  s0   D=F FE7 "F7	F FFFc                     | j                   }|\||j                  j                  k  r|j                  }n2|j                  j                  |k  r|j
                  }n|j                  S |[y y rF   )r   r  r   leftr   right)r   r   r   ps       r   r/   z_RangeTree.find2  sR    IImaffll"FFu$GGvv mr   c                 R   t        | j                        }||j                  u rc||j                  u r"|}||_        |j                  |_        ||_        n|}|j                  |_        ||_        |j                  |_        ||_        nb||j                  u r3|}|j                  |_        ||_        |j                  |_        ||_        n!|}|j                  |_        ||_        ||_        |dk7  r2| j                  |dz
     }||j                  u r	||_        |S ||_        |S || _        |S Nr   r   )rG   r  r  r  r   )r   xyztosmidNoderb  s          r   restructurez_RangeTree.restructure<  s   $**o;AFF{&&AFF{&&&&!8ZZa(FFKK%
   '   DIr   c                    g | _         	 | j                  j                         }|j                  | _        d |_        d |_        ||_        d |_        | j                  }|	 | j                   j                  |       |j                  |j                  j                  k  r0|j                  }|v| j                   j                         }||_        nU|j                  j                  |j                  k  r0|j                  }|#| j                   j                         }||_        ny d}n	|| _	        d}||_        | xj                  dz  c_        t        | j                         dkD  r|j                  du r| j                   j                         }||j                  k(  r|j                  }n|j                  }||j                  du r=| j                  |||      }d|_        d|j                  _        d|j                  _        y d|_        d|_        t        | j                         dk(  ry d|_        |}| j                   j                         }|j                  du ry y y # t        $ r t               }Y =w xY w)NTFr   r   )r  r  popr  re  _RedBlackTreeNoder  r  r   r   r3   r   r   rr  rG   r  )r   r  r  r  colmqs          r   addz_RangeTree.add`  s   
	$!!#A GGDMII=

!!!$88qvv||+Ay JJNN,!"VVZZ4::-Ay JJNN,"#   CDIC!tzz?Q''T/JJNN$;AA95 0((Aq1A#AG#'AFFL$(AGGMtzz?a'JJNN$% ''T/ A  	$!#A	$s   I I21I2c                    |j                   d   }|j                   d   }||kD  r||}}| j                  ||      }| t        ||d      }| j                  |       y |j                  |k  r|j
                  |k\  r|j                  |k  r9t        |j                  ||j                        }||_        | j                  |       |j
                  |kD  r9t        ||j
                  |j                        }||_        | j                  |       |xj                  dz  c_        y t        | j                  j                  ||            }|}|}|D ]  }	||	j                  k  r5t        ||	j                  d      }|	j                  }| j                  |       nH||	j                  kD  r9t        |	j                  ||	j                        }||	_        | j                  |       |	j                  |k  rH|	j
                  |kD  r9t        ||	j
                  |	j                        }||	_        | j                  |       |	xj                  dz  c_        |	j
                  }
 ||k  rt        ||d      }| j                  |       y y )Nr   r   r   )r  )
r   r/   _Ranger  r   r   r  listr   traverse_range)
r   r   r   r   existingritemsser  s
             r   r  z_RangeTree.addToCoverageDepth  s    %%d+##E*3;e3E99UC(ucq)AHHQK~~&8<<3+>>>E)x~~uhllCA%*HNHHQK<<#%sHLL(,,?A#&HLHHQK!TYY55eSAB! !D4::~"1djj!4 JJTZZ"4::q$((;%&
zzC'DHHsN"3$((;#&HHMHA! q5q!QAHHQK r   N)r]   r^   r_   r  r   rb   r   r   r/   r  r  r  r5  r   r   r   r     s<    JI#  $)V"H7%r) r   r   c                       e Zd ZdZd Zd Zy)r  )r#  r   r   r  c                 .    || _         || _        || _        y rF   )r   r   r  )r   r   r   r  s       r   r   z_Range.__init__  s    
r   c                 Z    t        | j                  | j                  | j                  f      S rF   )r"  r   r   r  rU   s    r   __iter__z_Range.__iter__  s     TZZ488455r   N)r]   r^   r_   r  r   r)  r5  r   r   r  r    s    /I
6r   r  c                       e Zd ZdZd Zd Zy)r  )r  r  r   r  c              #      K   | j                   "| j                   j                         E d {    | j                   | j                  #| j                  j                         E d {    y y 7 B7 wrF   )r  r  r  r  rU   s    r   r  z_RedBlackTreeNode.traverse  s_     99 yy))+++ii::!zz**,,, " , -s!   *A3A/;A3(A1)A31A3c              #   &  K   | j                   j                  |k  r2| j                  %| j                  j                  ||      E d {    y y || j                   j                  k  r2| j
                  %| j
                  j                  ||      E d {    y y | j
                  $| j
                  j                  ||      E d {    | j                    | j                  %| j                  j                  ||      E d {    y y 7 7 x7 H7 wrF   )r  r   r  r   r   r  )r   r   r   s      r   r   z _RedBlackTreeNode.traverse_range  s     99==E!zz%::44UC@@@ &DIIOO#yy$9933E3??? % yy$9933E3???))Ozz%::44UC@@@ & A @ @ AsI   ADD	A
DD1DD=DDDDDDN)r]   r^   r_   r  r  r   r5  r   r   r  r    s    2I-Ar   r  c                   6    e Zd ZdZd	dZd Zd Zd Zd Zd Z	y)
r   ih$c                     t        j                  |dz         | _        t        j                  |dz         | _        t        j                  |dz         | _        t        j                  |dz         | _        y )NIIQIIIIQIxxxx?xHIIIIQIIIIQQ)r   r!  r>  formatter_nodeformatter_nonleafformatter_leafr  s     r   r   z_RTreeFormatter.__init__  sb     !'i/.I J %mmI,=> "(y7/B!C %mmI,@Ar   c           
         t        dg d      }t        dg d      }|j                  | j                  j                        }| j                  j	                  |      \	  }}}}}	}
}}}|t
        j                  k(  sJ | j                  }| j                  }| j                  } |d g ||	|
|d       }|}d}	 |j                  |j                        }|j	                  |      \  }}|r|j                  }t        |      D ]T  }|j                  |j                        }|j	                  |      \  }}	}
}}} ||||	|
|||      }|j                  |       V ||z  }	 |j                  }|	||k(  sJ |S t        |j                        D ]  \  }}t        |      t        |      k(  s n t!        d      	 |j                  |dz      }nt|j                  }t        |      D ]S  }|j                  |j                        }|j	                  |      \  }}	}
}} ||g ||	|
||      }|j                  |       U |}|d   }|j%                  |j&                         # t"        $ r |}Y nw xY w)NNonLeaf)rb  r_  rj  rH  ri  rJ  r   Leaf)rb  rj  rH  ri  rJ  r   r   r   r^  r   )r   r=  r>  r   r?  r   r   r3  r4  r5  r_  rV  r3   rb  rc  r   rd  re  r   r   )r   r   r7  r8  r5   r  r   	itemCountrj  rH  ri  rJ  rK  r~   r3  r4  r5  r   rf  itemsCountedisLeafcountr_  r8   r   r   rg  rb  r1   s                                r   r=  z_RTreeFormatter.read  s   
 
 {{400556 !!((.
	
11111,, 22,,tRy*gtT;;~223D*11$7MFE==u +A!;;~':':;D '--d3$!""  $!"" E OOE*'+( %![[F~+y888#(1&//(B Hud8r%y0!H ++FGG%uqy9 ==u +A!;;'8'='=>D *006$!""#$!""E OOE*%+& {KK(C L & &%& s   1I I#"I#c                    t        |      }|dk(  ry g }|d   j                  }d}d}||k  rt               }	|j                  |	       ||   }
|
j                  x|	_        |	_        |
j                  |	_        |
j                  |	_
        ||	_        d}|
}t        |dz   |      D ])  }||   }|j                  }||	j                  k7  r n	|dz  }+ |}||	_        ||dz   ||z    D ]  }|j                  |	j
                  k  r#|j                  |	_        |j                  |	_        nC|j                  |	j
                  k(  r*|j                  |	j                  k  r|j                  |	_        |j                  |	j                  kD  r#|j                  |	_        |j                  |	_
        |j                  |	j                  k(  s|j                  |	j                  kD  s|j                  |	_
         ||z  }||k  rd}	 g }|}|D ]  }	||k\  rd}t               }|	j                  |_        |	j
                  |_        |	j                  |_        |	j                  |_        |	j                  |_
        |	j                  |_        |	j                  |_        |j                  |       n|dz  }|	j
                  j
                  k  r#|	j
                  |_        |	j                  |_        nC|	j
                  |j
                  k(  r*|	j                  |j                  k  r|	j                  |_        |	j                  |j                  kD  r#|	j                  |_        |	j                  |_
        nC|	j                  |j                  k(  r*|	j                  |j                  kD  r|	j                  |_
        |j                  j                  |	       ||	_         |dz  }t        |      dk(  r	 |fS |}r  )rG   r(  r  r3   r   rG  rI  r   rH  r   rJ  r  rV  rK  rb  r_  )r   r   r#  rK  r9  r_  
nextOffsetoneSizer8   rg  	startItemendItemr9   r  
levelCountparents	slotsUsedrb  s                     r   rTreeFromChromRangeArrayz(_RTreeFormatter.rTreeFromChromRangeArray  ss   J	>1X__
)mLEOOE"aI4=4E4EEE!1'ooEO%MMEM$.E!GG1q5), +($^^
!6!661+ +
",Ea!ea'k2 -<<%"4"44)-E&&*jjEOLLE$6$664::;W&*jjEO<<%"2"22'+||E$$(HHEM\\U%5%55$((U]]:R$(HHEM- LAA )mB 
G!I! &	) !I'\F$)LLFM*/*<*<F'',F$(-(8(8F%%*]]FN-2-B-BF*+0+>+>F(NN6*NI))F,?,??.3.@.@++0??(**f.A.AA!OOf.>.>>+0??(''&*;*;;,1,<,<)).((F,=,==!MMFNN:).&&u-%?&@ !OJ7|q z!! HM r   c           
         | j                   }||k(  rd}| j                  j                  |t        |j                              }	|j                  |	       |j                  D ]r  }
|j                  |
j                  |
j                  |
j                  |
j                  |
j                  |
j                  |
j                  z
        }	|j                  |	       t |j                  t        |t        |j                        z
  | j                  j                  z               y |j                  D ]  }
| j                  |||
|dz   ||        y )NTr   )r5  r3  r+  rG   r_  r   rG  rH  rI  rJ  r  rK  r   r4  r   rWriteLeaves)r   r~   	lNodeSizer   curLevel	leafLevelr   r5  r;  r5   rg  s              r   rG  z_RTreeFormatter.rWriteLeaves  s   ,,y F&&++FC4FGDLL 	#%**&&OO$$MM))''%*?*?? T"	# LL|c$--&88D<R<R<W<WWX  !! )UHqL)Vr   c           
         |}| j                   }	||k(  rd}
| j                  j                  |
t        |j                              }|j                  |       |j                  D ]U  }|	j                  |j                  |j                  |j                  |j                  |      }|j                  |       ||z  }W |j                  t        |t        |j                        z
  | j                   j                  z               n+|j                  D ]  }| j                  ||||dz   |||      } |j                         }||k7  rt        d| d| d      |S )NFr   z!Internal error: offset mismatch (z vs r   )r4  r3  r+  rG   r_  r   rG  rH  rI  rJ  r   r   rWriteIndexLevelr   rd  )r   rb  r   childNodeSizerI  	destLevelr(  r   previous_offsetr4  r;  r5   rg  positions                 r   rL  z _RTreeFormatter.rWriteIndexLevel  s]    ! 22y F&&++FC4HIDLL 	((--&&OO$$MM T"-'	( LLy3v#774;Q;Q;V;VVW   	..!qL	 ;;=&3H:T/ARRST  r   c                    | j                  |||      \  }}| j                  j                  t        j                  |t        |      |j                  |j                  |j                  |j                  ||	      }|j                  |       |y t        j                  |t              }	|j                  |	d       | j                  j                   | j"                  j                   |z  z   }
|j%                         }t'        |dz
        D ]\  }||	|   |
z  z  }||dz
  k(  r0| j                  j                   | j(                  j                   |z  z   }
| j+                  |||
d|||       ^ |dz
  }| j-                  ||
|d||       y )Nr   )r  r   rv   )rE  r>  r+  r   r   rG   rG  rH  rI  rJ  r   r   r  r!   r  r3  r   r4  r   rV  r5  rL  rG  )r   r#  r   r~   rK  r   r   rB  r5   r  r   levelOffsetr8   rJ  s                 r   r   z_RTreeFormatter.write  su   88um
j $$))%%JNNOOLL

 	T<XXj#.
Ja0""''$*@*@*E*E	*QQkkmzA~& 	TA:a=4//KJN"**//$2E2E2J2JY2VV!!$	4A{FS		T
 N	)T4IvFr   Nr  )
r]   r^   r_   r   r   r=  rE  rG  rL  r   r5  r   r   r   r     s-    I#BJq)fQ"f8&PGr   r   c                   $    e Zd ZdZddZd Zd Zy)r   ixc                     t        j                  |dz         | _        t        j                  |dz         | _        |dz   | _        || _        y )NIIIIQxxxxxxxxr0  z{keySize}sQ)r   r!  r>  r3  fmt_nonleafr   r  s     r   r   z_BPlusTreeFormatter.__init__@  sH     !'i/.I J %mmI,=>
 %}4"r   c                    | j                   }| j                  }|j                  |j                        }|j	                  |      \  }}}}}	|t
        j                  k(  sJ | j                  }
t        j                  | j                  j                  |            }t        j                  | | d      }||j                  |z
  k(  sJ |dk(  sJ t        dddg      }g }d }	 |j                  |
j                        }|
j	                  |      \  }}|rt        |      D ]  }|j                  |j                        }|j	                  |      \  }}}|j                  d      j                         }|t!        |      k(  sJ t#        d |      }t%        ||	      }|j'                  |        n]g }t        |      D ]B  }|j                  |j                        }|j	                  |      \  }}|j'                  |       D |} |||      }	 |t!        |      |	k(  sJ |S |j(                  }	 |j+                  d
      }	 |j1                  |       p# t,        $ r |j.                  }Y nw xY wb)Nr   sIIr   Noderb  r_  r   rz  r|  r   )r   r>  r=  r   r?  r   r   r3  r   r!  rV  formatr   rV  r  r,   rG   r   r   r3   r_  r  re  rb  r   )r   r   r   r0  r5   r  r   r   valSizer9  r3  r4  r5  rZ  r{   rf  r;  r<  r8   keyr   r   r   sequencerecordr_  posrb  s                               r   r=  z_BPlusTreeFormatter.readW  sk   NN	))	{{9>>*8A8H8H8N5y'7I+55555,,"MM$*:*:*A*A'*A*RS  )WIS'AB.--7777!||&8Z"89;;~223D*11$7MFEu +A!;;~':':;D.<.C.CD.I+C)::g.557D"c'l222"4	:H&xD9FNN6*+ u )A!;;'8'='=>D077=HCOOC() FH-<w<9444"N==",,q/C KK? 6 " ';;D' s   .I I+*I+c                 Z   t         j                  }|j                  d   j                  }|j                  |z
  }t	        |      }| j
                  }|j                  |||||      }	|j                  |	       | j                  }
t        j                  | j                  j                  |            }d}||kD  r!t	        t        d||            }|dz  }||kD  r!t	        |      }|
j                  ||j                  z  z   }|
j                  ||j                  z  z   }d}|j                         }t        |dz
  dd      D ]  }||z  }||z  }t        d||      }|dk(  r|}n|}t	        |      |z  }||z   }|}|D ]  }||||z   |   }t	        |      }|j                  |
j                  ||             |D ]-  }|j                  |d   |      }	|j                  |	       ||z  }/ t!        ||z
  |j                  z        }	|j                  |	        |} d}t#        j$                  d|      D ]z  }||||z    }t	        |      }|dk(  r y |j                  |
j                  ||             |j'                  |       t!        ||z
  |j                  z        }	|j                  |	       | y )Nr   rX  r   r   Fr   T)r   r   r   itemsizerG   r>  r+  r   r3  r   r!  rV  r[  rV  r   r   r   	itertoolsr<  r   )r   r#  r   r   r   r   r\  r9  r0  r5   r3  r4  levelsbytesInIndexBlockbytesInLeafBlockr;  r   r  slotSizePernodeSizePerindicesbytesInNextLevelBlock	levelSizeendLevel	nextChildr1   blockrr  r  s                                r   r   z_BPlusTreeFormatter.write  s   '11	++f%....7*J	))	~~iGWiPT,,"MM$*:*:*A*A'*A*RS)#E!Y	:;IaKF )# J	*//)>O>T>T2TT)..U^^1KKkkm6A:q"- 	#E#U*K%	1KAy+6Gz(8%(9%G'88I"Y.H I  	#eek&9KGHJ^00;<! 7D,11$v,	JDLL&!66I7 i!m/@/E/EEFT"	# #K+	#, __Q	2 	E%%)"34EE
AAvLL,,VQ78LL )a-5>>9:DLL	r   Nr  )r]   r^   r_   r   r   r=  r   r5  r   r   r   r   =  s    I#.6p4r   r   )*r`   r   r   rc  r   r   r`  collectionsr   r   numpyr   	Bio.Alignr   r   Bio.Seqr   Bio.SeqRecordr   r	   r  r   r   rr   r9  r  r   r   r   r  r   r  r   r   r)  r   r  r   r  r  r   r   r5  r   r   <module>rt     s/  
\  	   
  "       #7:;Y*4 Y*x $	?	

 	2	

 	0	

 	hV_Ef74DEih8KLJ	

 	G	

 	6	

 	e,8JK%9	

 	%<	
Q-1 hX%j00 X%vK
44 K\#BJJ #   * O   S
 S
l*V *VZ"D "J' '4G$ GT
 
@ -
X -
`4 42X  X v	6 	6A A2PG PGf
F Fr   