B
    bpL                 @   s   d Z ddlZyddlZW n* ek
rB   ddlmZ eddY nX G dd deZG dd dZdd	d
Z	dd Z
dd ZedkrddlmZ e  dS )z>Reading information from Affymetrix CEL files version 3 and 4.    N)MissingPythonDependencyErrorz1Install NumPy if you want to use Bio.Affy.CelFilec                   s    e Zd ZdZ fddZ  ZS )ParserErrorzAffymetrix parser error.c                s   t  j|  dS )zInitialise class.N)super__init__)selfargs)	__class__ /lib/python3.7/site-packages/Bio/Affy/CelFile.pyr      s    zParserError.__init__)__name__
__module____qualname____doc__r   __classcell__r	   r	   )r   r
   r      s   r   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") 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   sv   d| _ d| _d| _d| _d| _d| _d| _d| _d| _d| _	d| _
d| _d| _d| _d| _d| _d| _d| _d| _dS )zInitialize the 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   ?   s&    zRecord.__init__N)r   r   r   r   r   r	   r	   r	   r
   r      s   r   c             C   s.  y|  d}W n tk
r,   tddY nX |  d}|sDtd|dkrTtd|dkr|t| 7 }| d	kr|td
t| }|dd\}}|dkrtd
t|}|dkrtdt| S yt	d|}W n> t
k
r   tddY n" tjk
r   tddY nX |dkr&tdt| S )a  Read Affymetrix CEL file and return Record object.

    CEL files format versions 3 and 4 are supported.
    Please specify the CEL file format as 3 or 4 if known for the version
    argument. If the version number is not specified, the parser will attempt
    to detect the version from the file contents.

    The Record object returned by this function stores the intensities from
    the CEL file in record.intensities.
    Currently, record.mask and record.outliers are not set in when parsing
    version 4 CEL files.

    Example Usage:

    >>> from Bio.Affy import CelFile
    >>> with open("Affy/affy_v3_example.CEL") as handle:
    ...     record = CelFile.read(handle)
    ...
    >>> record.version == 3
    True
    >>> print("%i by %i array" % record.intensities.shape)
    5 by 5 array

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

    r   zhandle should be a file handleN   zEmpty file.s   [CELz:CEL file in version 3 format should be opened in text modez[CELz[CEL]z(Failed to parse Affy Version 3 CEL file.=   ZVersion   z4Incorrect version number in Affy Version 3 CEL file.z<iz<CEL file in version 4 format should be opened in binary modez8Failed to read magic number from Affy Version 4 CEL file)@   z1Incorrect magic number in Affy Version 4 CEL file)readAttributeError
ValueErrornextstripsplitint_read_v3structunpack	TypeErrorerror_read_v4)handler   datalinekeywordvalueZmagicNumberr	   r	   r
   r)   V   sD    !


r)   c                s  t  dddddg}i }i  d|d< y,x&|D ]}td| d	d
 ||< q,W W n  tjk
rp   tdd Y nX | |d }|dd}x>|dD ]0}d|kr|d}d|dd   |d
 < qW |d _	j	d	krt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"}x:t|D ].}| d}|d#krP ||krtd$qW | d%}	td&}
d'}tjjtd(_tjjtd(_ tjjtd(_!| |j }xZtjD ]L}||| |d |  }|
|\}}}|j|< |j |< |j!|< qTW fd)d*}|j_|j _ |j!_!S )+Nr   columnsZrowsZcellNoZ	headerLenr(   magicz<ir$   r   z"Failed to parse CEL version 4 fileasciiignore
r%   r&   z.Incorrect version number in CEL version 4 filer   r   r   r   r   r   r   RowsColsc                s0   t  |  }d|  d| }||kr,t|d S )NzThe header z is expected to be 0, not )r/   r   )fieldZexpectedZactualmessage)
headersMapr	   r
   raiseBadHeader   s    z _read_v4.<locals>.raiseBadHeaderzAxis-invertXZAxisInvertYZOffsetXZOffsetY    i'     zaParse Error. The parser expects a short, undocumented binary blob terminating with ASCII EOF, x04   z< f f h
   )Zdtypec                s   |   } j jf|_|S )N)viewr   r   shape)ZarrayrJ   )recordr	   r
   reshape  s    z_read_v4.<locals>.reshape)"r   r1   r2   r)   r4   r   decoder.   joinr   r   r   r   r   r   r   r   r   r/   r   r   r   r    r!   r"   r#   rangeZStructnumpyemptyfloatr   r   r   )fZ
preHeadersZpreHeadersMapnamecharheaderrE   ZsafetyValveiZpaddingZstructaZ
structSizebZbinaryFragmentZ	intensityr   r   rM   r	   )rD   rL   r
   r5      s    
"





















r5   c          	   C   s	  t  }d|_d}x| D ]}|d}|s.q|dr>d}q|drd}t|j|jf|_t|j|jf|_	t|j|jft
|_q|drd	}t|j|jft|_q|d
rd}t|j|jft|_q|d rd}t|j|jf|_q|drtdq|dkr\|dd\}}|dkrFt
||_	q|dkr^t
||_	q|dkr| \}}t
|t
|f|_	q|dkr| \}}t
|t
|f|_	q|dkr| \}}t
|t
|f|_	q|dkr| \}}t
|t
|f|_	q|dkri |_|d}|d |  \}	}
|
|jd< |d7 }|||d  }|d d dkstt|d dkstt
|dd |jd < |d7 }|||d  }|d d d!kst|d dkstt
|dd |jd"< |d7 }|||d#  }|d d d$ks t|d% dks2tt
|dd% |jd&< |d#7 }|||d#  }|d d d'ksvt|d% dkstt
|dd% |jd(< |d#7 }|||d%  }|d d d)kst|d* dkstt
|dd* |jd+< |d%7 }|||d#  }|d% dkst|d d%  }|rDt
||jd,< n
d |jd,< |d#7 }|||d  }|dsvtt||jd-< |d7 }|||d.  }|d dkst|d d |jd/< |d0 dkst|dd0 |jd1< |d.7 }||d  }|d2}t|d3kst|d4 }y| \}}W n tk
rJ   | }Y nX ||jd5< ||jd6< |d7 |jd8< t
|d9 |jd:< n|d;kr||_n|d<k	r|d=}i }x|D ]}|dd\}}|d>krt
|||< np|d?krt|||< nX|d@kr2|dAkrdB}n|dCkr dD}ntdE|||< n|dFkrF|||< ntdGqW ||_q|dkr0|dHr|dd\}}t
||_ n|dIr|dd\}}| dJdKdLdMdNgkr.tdOnb| }t
|d4 }t
|d }t|d7 |j||f< t|d |j	||f< t
|d |j||f< q|d	kr|dHrb|dd\}}t
||_!nf|dIr|dd\}}| dJdKgkrtdPn.| }t
|d4 }t
|d }dB|j||f< q|dkrd|dHr|dd\}}t
||_"nf|dIr4|dd\}}| dJdKgkrbtdQn.| }t
|d4 }t
|d }dB|j||f< q|dkr|dHr|dd\}}t
||_#q|dIr|dd\}}| dJdKdRgk	rtdSq| }t
|d4 }t
|d }t|d7 |j||f< qW |S )TNr'    z
z[HEADER]ZHEADERz[INTENSITY]Z	INTENSITYz[MASKS]ZMASKSz
[OUTLIERS]ZOUTLIERSz
[MODIFIED]ZMODIFIED[z+Unknown section found in version 3 CEL filer%   r&   rA   r@   r   r   r   r   r   :filename	   r$   zCLS=    ZCLSzRWS=ZRWS   zXIN=   ZXINzYIN=ZYINzVE=   ZVEtemperaturezlaser-power   z	scan-date   z	scan-timez     r   z
scanner-idzscanner-type   z
array-type   zimage-orientationr   r   ;)Z
PercentileZ
CellMarginZFullFeatureWidthZFullFeatureHeightZPoolWidthExtenstionZPoolHeightExtension)ZOutlierHighZ
OutlierLowZStdMult)ZFixedCellSizeZIgnoreOutliersInShiftRowsZFeatureExtractionZUseSubgridsZRandomizePixelsZTRUETZFALSEFzUnexpected boolean value)Z
AlgVersionZ
ErrorBasisz%Unexpected tag in AlgorithmParameterszNumberCells=zCellHeader=XYZMEANZSTDVZNPIXELSz=Unexpected CellHeader in INTENSITY section CEL version 3 filez<Unexpected CellHeader in MASKS section in CEL version 3 filez?Unexpected CellHeader in OUTLIERS section in CEL version 3 fileZORIGMEANz?Unexpected CellHeader in MODIFIED section in CEL version 3 file)$r   r   rstrip
startswithrQ   Zzerosr   r   r   r   r/   r   boolr    r"   r#   r   r.   r   r   r   r   r   findAssertionErrorr-   endswithrS   lenr+   r   r   r   r   r!   Z	nmodified)r6   rL   Zsectionr8   keyr:   xyindex_r]   rB   rd   Z	subfieldsZsubfieldZ
scanner_idZscanner_typeZ
parametersvaluesZ	parameterZwordsr	   r	   r
   r0     sl   
































r0   __main__)run_doctest)N)r   r1   rQ   ImportErrorZBior   r+   r   r   r)   r5   r0   r   Z
Bio._utilsr{   r	   r	   r	   r
   <module>   s"   
7
Hy ]