o
    Rŀg.\                     @   s   d Z ddlZzddlZW n ey   ddlmZ eddw G dd deZG dd dZ	dd	d
Z
dd Zdd ZedkrJddlmZ e  dS 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__ D/var/www/html/myenv/lib/python3.10/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 )RecordaS  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  z|  d}W n ty   tddw |  d}|std|dkr'td|dkr_|t| 7 }| d	kr;td
t| }|dd\}}|dkrOtd
t|}|dkr[tdt| S zt	d|}W n t
ys   tdd tjy   tddw |dkrt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.=   Version   z4Incorrect version number in Affy Version 3 CEL file.<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valuemagicNumberr
   r
   r   r,   U   sP   !

r,   c                    s  t  g d}i }i  d|d< z|D ]}td| dd ||< qW n tjy0   tdd w | |d }|d	d
}|dD ]}d|v r[|d}d|dd   |d < qC|d _	j	dkrjt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!}	t|	D ]}
| d}|d"kr n	|
|	krtd#q| d$}td%}d&}tjjtd'_tjjtd'_ tjjtd'_!| |j }tjD ]&}
||
| |
d |  }||\}}}|j|
< |j |
< |j!|
< qfd(d)}|j_|j _ |j!_!S )*N)r   columnsrowscellNo	headerLenr+   magicr*   r%   r   z"Failed to parse CEL version 4 filerB   asciiignore
r&   r'   r   z.Incorrect version number in CEL version 4 filer   r   r   r   r   r   r   rA   RowsColsc                    s0   t  |  }d|  d| }||krt|d S )NzThe header z is expected to be 0, not )r2   r   )fieldexpectedactualmessage)
headersMapr
   r   raiseBadHeader   s
   z _read_v4.<locals>.raiseBadHeaderzAxis-invertXAxisInvertYOffsetXOffsetY    i'     zaParse Error. The parser expects a short, undocumented binary blob terminating with ASCII EOF, x04   z< f f h
   )dtypec                    s   |   } j jf|_|S N)viewr   r   shape)arrayrX   )recordr
   r   reshape
  s   z_read_v4.<locals>.reshape)"r   r4   r5   r,   r7   r   decoder1   joinr   r   r   r   r   r   r   r   r   r2   r   r   r    r!   r"   r#   r$   rangeStructnpemptyfloatr   r   r   )f
preHeaderspreHeadersMapnamecharheaderr;   headlinerN   safetyValveipaddingstructa
structSizebbinaryFragment	intensityr   r   r\   r
   )rM   r[   r   r8      s   




















r8   c              	   C   s
  t  }d|_d}| D ]}|d}|sq
|drd}q
|drDd}t|j|jf|_t|j|jf|_	t|j|jft
|_q
|drWd	}t|j|jft|_q
|d
rjd}t|j|jft|_q
|dr|d}t|j|jf|_q
|drtd|dkr|dd\}}|dkrt
||_q
|dkrt
||_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rAi |_|d}|dkr|d |  \}	}
|
|jd< |	d dks J |	d dks)J |	dd d\}}t
||jd< t
||jd < ||d d  }d}|||d!  }|d d" d#ksd|d$ d%krhtd&t
|d"d$ |jd'< |d!7 }|||d!  }|d d" d(ks|d$ d%krtd)t
|d"d$ |jd*< |d!7 }|||d+  }|d d" d,ks|d- d%krtd.t
|d"d- |jd/< |d+7 }|||d+  }|d d" d0ks|d- d%krtd1t
|d"d- |jd2< |d+7 }|||d-  }|d d d3ks|d4 d%krtd5t
|dd4 |jd6< |d-7 }|||d+  }|d- d%kr6td7|d d-  }|rIt
||jd8< nd |jd8< |d+7 }|||d"  }|d%sdtd9t||jd:< |d"7 }|||d;  }|d$ d%krtd<|d d$ |jd=< |d> d%krtd?|d d$ |jd=< |d!d> |jd@< |d;7 }||d  }|dA}t|dBkrtdC |d }z| \}}W n ty   | }Y nw ||jdD< ||jdE< |dF  |jdG< |d+  }|r t
||jdH< |d$  }|rt||jdI< |d!  }|r t||jdJ< |dK  }|r0t||jdL< |dM  }|r@t
||jdN< q
|dOkrJ||_q
|dPkr|dQ}i }|D ]Q}|dd\}}|dRv rot
|||< qX|dSv r|t|||< qX|dTv r|dUkrdV}n|dWkrdX}ntdY|||< qX|dZv r|||< qXtd[||_q
|dkr|d\r|dd\}}t
||_q
|d]r|dd\}}| g d^krtd_q
| }t
|d }t
|d }t|dF |j||f< t|d |j	||f< t
|d" |j||f< q
|d	krb|d\r.|dd\}}t
||_ q
|d]rJ|dd\}}| d`dagkrItdbq
| }t
|d }t
|d }dV|j||f< q
|dkr|d\r{|dd\}}t
||_!q
|d]r|dd\}}| d`dagkrtdcq
| }t
|d }t
|d }dV|j||f< q
|dkr|d\r|dd\}}t
||_"q
|d]r|dd\}}| g ddkrtdeq
| }t
|d }t
|d }t|dF |j||f< q
|S )fNr)    z
z[HEADER]HEADERz[INTENSITY]	INTENSITYz[MASKS]MASKSz
[OUTLIERS]OUTLIERSz
[MODIFIED]MODIFIED[z+Unknown section found in version 3 CEL filer&   r'   rH   rG   r   r   r   r   r   :r   filename]z..zmin-pixel_intensityzmax-pixel_intensity	   r%   zCLS=    zDField does not start with 'CLS=' or have a blank space at position 8CLSzRWS=zDField does not start with 'RWS=' or have a blank space at position 8RWS   zXIN=   zDField does not start with 'XIN=' or have a blank space at position 6XINzYIN=zCField does not start with 'YIN=' or have a blank space at poition 6YINzVE=   zCField does not start with 'VE=' or have a blank space at position 5VEz.Field value for position 6 isn't a blank spacetemperaturez$Field doesn't end with a blank spacezlaser-power   z.Field value for position 8 isn't a blank spacez	scan-date   z/Field value for position 17 isn't a blank spacez	scan-time   zSubfields length isn't 12zscanner-typez
scanner-id   z
array-typezfilter-wavelengthz
arc-radiuszlaser-spotsizerU   z
pixel-size   zimage-orientationr   r   ;)
Percentile
CellMarginFullFeatureWidthFullFeatureHeightPoolWidthExtenstionPoolHeightExtensionNumPixelsToUseExtendPoolWidthExtendPoolHeightOutlierRatioLowPercentileOutlierRatioHighPercentileHalfCellRowsDivisorHalfCellRowsRemainder
HighCutoff	LowCutofffeatureRowsfeatureColumns)OutlierHigh
OutlierLowStdMultPercentileSpread
PairCutofffeatureWidthfeatureHeight)FixedCellSizeIgnoreOutliersInShiftRowsFeatureExtractionUseSubgridsRandomizePixelsImageCalibrationIgnoreShiftRowOutliersTRUETFALSEFzUnexpected boolean value)
AlgVersion
ErrorBasisCellIntensityCalculationTypez%Unexpected tag in AlgorithmParameterszNumberCells=zCellHeader=)XYMEANSTDVNPIXELSz=Unexpected CellHeader in INTENSITY section CEL version 3 filer   r   z<Unexpected CellHeader in MASKS section in CEL version 3 filez?Unexpected CellHeader in OUTLIERS section in CEL version 3 file)r   r   ORIGMEANz?Unexpected CellHeader in MODIFIED section in CEL version 3 file)#r   r   rstrip
startswithra   zerosr   r   r   r   r2   r   boolr!   r#   r$   r   r1   r   r   r   r   r   findr.   r0   endswithrc   lenr   r   r   r    r"   	nmodified)r9   r[   sectionr;   keyr=   xyrl   min_max_pixel_intensityr{   min_pixel_intensitymax_pixel_intensityindexrI   r   	subfieldssubfield
scanner_idscanner_type
parametersvalues	parameterwordsr
   r
   r   r3     s  














     








	

	





r3   __main__)run_doctestrW   )r   r4   numpyra   ImportErrorBior   r.   r   r   r,   r8   r3   r   
Bio._utilsr   r
   r
   r
   r   <module>   s.   
7Hy  *
