
:>"^5                 @   s   d  Z  d d l m Z d d l Z y d d l Z Wn. e k
 rb d d l m Z e d   Yn XGd d   d e  Z	 e	 d  Z
 Gd	 d
   d
 e  Z d d   Z d d   Z d d   Z e d k r d d l m Z e   d S)z>Reading information from Affymetrix CEL files version 3 and 4.    )print_functionN)MissingPythonDependencyErrorz1Install NumPy if you want to use Bio.Affy.CelFilec                   s(   e  Z d  Z d Z   f d d   Z   S)ParserErrorzAffymetrix parser error.c                s   t  t |   j |   d S)zInitialise class.N)superr   __init__)selfargs)	__class__ 5/tmp/pip-build-ww9dw3qa/biopython/Bio/Affy/CelFile.pyr      s    zParserError.__init__)__name__
__module____qualname____doc__r   r
   r
   )r	   r   r      s   r   ztYou're trying to open an Affymetrix v4 CEL file. You have to use a read binary mode, like this: open(filename, 'rb')c               @   s"   e  Z d  Z d Z d d   Z d S)Recorda  Stores the information in a cel file.

    Example usage:

    >>> from Bio.Affy import CelFile
    >>> with open("Affy/affy_v3_example.CEL", "r") as handle:
    ...     c = CelFile.read(handle)
    ...
    >>> print(c.ncols, c.nrows)
    5 5
    >>> print(c.intensities)
    [[   234.    170.  22177.    164.  22104.]
     [   188.    188.  21871.    168.  21883.]
     [   188.    193.  21455.    198.  21300.]
     [   188.    182.  21438.    188.  20945.]
     [   193.  20370.    174.  20605.    168.]]
    >>> print(c.stdevs)
    [[   24.     34.5  2669.     19.7  3661.2]
     [   29.8    29.8  2795.9    67.9  2792.4]
     [   29.8    88.7  2976.5    62.   2914.5]
     [   29.8    76.2  2759.5    49.2  2762. ]
     [   38.8  2611.8    26.6  2810.7    24.1]]
    >>> print(c.npix)
    [[25 25 25 25 25]
     [25 25 25 25 25]
     [25 25 25 25 25]
     [25 25 25 25 25]
     [25 25 25 25 25]]

    c             C   s   d |  _  d |  _ d |  _ d |  _ d |  _ d |  _ d |  _ d |  _ d |  _ d |  _	 d |  _
 d |  _ d |  _ d |  _ d |  _ d |  _ d |  _ d |  _ d |  _ d S)zInitialize class.N)versionGridCornerULGridCornerURGridCornerLRGridCornerLL	DatHeader	AlgorithmAlgorithmParametersNumberCellsintensitiesstdevsnpixnrowsncolsnmaskmask	noutliersoutliersmodified)r   r
   r
   r   r   G   s&    																		zRecord.__init__N)r   r   r   r   r   r
   r
   r
   r   r   '   s   r   c             C   s   d } zn y8 |  j  } |  j   } t j d |  j d   d } Wn/ t t f k
 r[ Yn t k
 rr t  Yn XWd y |  j	 |  Wn t k
 r Yn XX| d k r t
 |   St |   Sd S)aW  Read Affymetrix CEL file and return Record object.

    CEL files version 3 and 4 are supported, and the parser attempts version detection.

    Example Usage:

    >>> from Bio.Affy import CelFile
    >>> with open("Affy/affy_v4_example.CEL", "rb") as handle:
    ...     c = CelFile.read(handle)
    ...
    >>> c.version == 4
    True

    Nz<i   r   @   )modetellstructunpackreadAttributeError	TypeErrorUnicodeDecodeError
_modeErrorseekread_v3read_v4)handleZmagicNumberr&   positionr
   r
   r   r*   ^   s     	#
r*   c                s  t     d d d d d d g } i  } i    y8 x1 | D]) } t j d |  j d   d	 | | <q7 WWn t k
 r t  Yn X|  j | d  } | j d
 d  } xS | j d  D]B } d | k r | j d  } d j | d d     | d	 <q W| d  _	  j	 d k r#t
 d     d  _   d  _   d  _   d  _   d  _   d  _   d  _ | d  _ t   d   _ t   d   _ d  _ d  _ d  _ d  _ d  _   f d d   } | d d	  | d d	  | d d	  | d d	  d  } d) } xH t |  D]: } |  j d  } | d" k r_P| | k r=t
 d#   q=W|  j d$  }	 t j d%  }
 d! } t j  j d& t  _  t j  j d& t  _! t j  j d& t  _" |  j |  j  } xr t  j  D]a } | | | | d |  } |
 j |  \ } } } |  j  | <|  j! | <|  j" | <qW f d' d(   } |  j    _  |  j!   _! |  j"   _"  S)*a  Read verion 4 Affymetrix CEL file, returns corresponding Record object.

    Most importantly record.intensities correspond to intensities from the CEL
    file.

    record.mask and record.outliers are not set.

    Example Usage:

    >>> from Bio.Affy import CelFile
    >>> with open("Affy/affy_v4_example.CEL", "rb") as handle:
    ...     c = CelFile.read_v4(handle)
    ...
    >>> c.version == 4
    True
    >>> print("%i by %i array" % c.intensities.shape)
    5 by 5 array

    magicr   columnsZrowsZcellNoZ	headerLenz<ir$   r   asciiignore
=   NzmYou are trying to parse CEL file version 4. This file violates the structure expected from CEL file version 4r   r   r   r   r   r   r   RowsColsc                sD   t    |   } d j d | d |   } | | k r@ t |   d  S)Nz3The header {field} is expected to be 0, not {value}valuefield)intformatr   )r>   expectedactualmessage)
headersMapr
   r   raiseBadHeader   s    zread_v4.<locals>.raiseBadHeaderzAxis-invertXZAxisInvertYZOffsetXZOffsetYs    
   s   zaParse Error. The parser expects a short, undocumented binary blob terminating with ASCII EOF, x04   z< f f hZdtypec                s%   |  j    }   j   j f | _ | S)N)viewr   r   shape)arrayrH   )recordr
   r   reshape  s    zread_v4.<locals>.reshapei'  )#r   r(   r)   r*   r-   r.   decodesplitjoinr   r   r   r   r   r   r   r   r   r   r?   r   r   r   r    r!   r"   r#   rangeStructnumpyemptyfloatr   r   r   )fZ
preHeadersZpreHeadersMapnamecharheaderrE   ZsafetyValveipaddingZstructaZ
structSizebZbinaryFragmentZ	intensityr   r   rL   r
   )rD   rK   r   r1      s    	+%					r1   c       	      C   s;  t    } d } x%|  D]} | j   s+ q | d d  d k rJ d } q | d d  d k ri d } q | d d	  d
 k r d } t j | j | j f  | _ t j | j | j f  | _ t j | j | j f t  | _	 q | d d  d k r"d } t j | j | j f  | _
 q | d d  d k r_d } t j | j | j f  | _ q | d d  d k rd } t j | j | j f  | _ q | d d k rd } q | d k r| j d d  \ } } | d k r3t |  | _ q | d k r| j d d  \ } } | d k r9t |  | _ q3| d k rWt |  | _ q3| d k r| j   \ } } t |  t |  f | _ q3| d k r| j   \ } } t |  t |  f | _ q3| d k r| j   \ } } t |  t |  f | _ q3| d k rG| j   \ } } t |  t |  f | _ q3| d k rh| j d   | _ q3| d! k r| j d   | _ q3| d" k r3| j d   | _ q | d k ryd# | k rt | j d d  d  | _ q3d$ | k rq3| j   } t | d  } t | d  } t | d%  | j | | f <t | d&  | j | | f <t | d'  | j	 | | f <q | d k r
d# | k rt | j d d  d  | _ q3d$ | k rq3| j   } t | d  } t | d  } t d  | j
 | | f <q | d k rd# | k rDt | j d d  d  | _ q3d$ | k rSq3| j   } t | d  } t | d  } t d  | j | | f <q | d k r d# | k rt | j d d  d  | _ q3d$ | k rq3| j   } t | d  } t | d  } t | d%  | j | | f <q q q W| S)(a  Read version 3 Affymetrix CEL file, and return corresponding Record object.

    Example Usage:

    >>> from Bio.Affy import CelFile
    >>> with open("Affy/affy_v3_example.CEL", "r") as handle:
    ...     c = CelFile.read_v3(handle)
    ...
    >>> c.version == 3
    True

     N   z[CEL]ZCEL   z[HEADER]ZHEADER   z[INTENSITY]Z	INTENSITY   z[MASKS]ZMASKSrF   z
[OUTLIERS]ZOUTLIERSz
[MODIFIED]ZMODIFIEDr   [r9   r:   Versionr<   r;   r   r   r   r   r   z
r   r   r   Z
CellHeader      r$   )r   striprR   Zzerosr   r   r   r   r?   r   r    r"   r#   rN   r   r   r   r   r   r   r   r   r   rT   r   r!   Z	nmodified)	r2   rK   sectionlinekeywordr=   xywordsr
   r
   r   r0     s    			$!!!	" """ r0   __main__)run_doctest)r   
__future__r   r(   rR   ImportErrorZBior   
ValueErrorr   r.   objectr   r*   r1   r0   r   Z
Bio._utilsrm   r
   r
   r
   r   <module>   s"   	71w