# Copyright 2014 by Vincent Davis. All rights reserved.
# This code is part of the Biopython distribution and governed by its
# license. Please see the LICENSE file that should have been included
# as part of this package.

import unittest

try:
    import numpy
    from numpy.testing import assert_array_equal
except ImportError:
    from Bio import MissingPythonDependencyError
    raise MissingPythonDependencyError(
        "Install NumPy if you want to use Bio.Affy.CelFile")

from Bio.Affy import CelFile


class testCelFile(unittest.TestCase):
    """
    Test reading of CEL file
    """
    def test_read(self):
        version = 3
        GridCornerUL = (206, 129)
        GridCornerUR = (3570, 107)
        GridCornerLR = (3597, 3470)
        GridCornerLL = (234, 3492)
        DatHeader = '[11..65533]  1g_A9AF:CLS=3684 RWS=3684 XIN=1  YIN=1  VE=30        2.0 08/23/07 11:23:24 50205880  M10      Tgondii_SNP1.1sq          570  25356.509766  3.500000  1.5600  6'
        Algorithm = 'Percentile'
        AlgorithmParameters = 'Percentile:75;CellMargin:2;OutlierHigh:1.500;OutlierLow:1.004;AlgVersion:6.0;FixedCellSize:TRUE;FullFeatureWidth:7;FullFeatureHeight:7;IgnoreOutliersInShiftRows:FALSE;FeatureExtraction:TRUE;PoolWidthExtenstion:2;PoolHeightExtension:2;UseSubgrids:FALSE;RandomizePixels:FALSE;ErrorBasis:StdvMean;StdMult:1.000000'
        NumberCells = 25
        intensities = numpy.array([[   234.0,    170.0,  22177.0,    164.0,  22104.0],
                                        [   188.0,    188.0,  21871.0,    168.0,  21883.0],
                                        [   188.0,    193.0,  21455.0,    198.0,  21300.0],
                                        [   188.0,    182.0,  21438.0,    188.0,  20945.0],
                                        [   193.0,  20370.0,    174.0,  20605.0,    168.0]])
        stdevs = numpy.array([[   24.0, 34.5, 2669.0, 19.7, 3661.2],
                                  [   29.8, 29.8, 2795.9, 67.9, 2792.4],
                                  [   29.8, 88.7, 2976.5, 62.0, 2914.5],
                                  [   29.8, 76.2, 2759.5, 49.2, 2762.0],
                                  [   38.8, 2611.8, 26.6, 2810.7, 24.1]])
        npix = numpy.array([[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]])
        nrows = 5
        ncols = 5
        nmask = 3
        mask = numpy.array([[ 0.,  0.,  0.,  0.,  0.],
                                  [ 0.,  0.,  0.,  1.,  1.],
                                  [ 0.,  0.,  0.,  0.,  1.],
                                  [ 0.,  0.,  0.,  0.,  0.],
                                  [ 0.,  0.,  0.,  0.,  0.]])
        noutliers = 3
        outliers = [[ 0.,  0.,  0.,  0.,  0.],
                          [ 0.,  1.,  1.,  0.,  0.],
                          [ 0.,  0.,  0.,  0.,  0.],
                          [ 0.,  1.,  0.,  0.,  0.],
                          [ 0.,  0.,  0.,  0.,  0.]]
        nmodified = 3
        modified = [[ 0., 0., 0., 0.,     0.],
                         [ 0., 0., 0., 189.,   220.],
                         [ 0., 0., 0., 21775., 0.],
                         [ 0., 0., 0., 0.,     0.],
                         [ 0., 0., 0., 0.,     0.]]

        with open('./Affy/affy_v3_example.CEL') as handle:
            cel = CelFile.read(handle)
            self.assertEqual(version, cel.version)
            self.assertEqual(GridCornerUL, cel.GridCornerUL)
            self.assertEqual(GridCornerUR, cel.GridCornerUR)
            self.assertEqual(GridCornerLR, cel.GridCornerLR)
            self.assertEqual(GridCornerLL, cel.GridCornerLL)
            self.assertEqual(DatHeader, cel.DatHeader)
            self.assertEqual(Algorithm, cel.Algorithm)
            self.assertEqual(AlgorithmParameters, cel.AlgorithmParameters)
            self.assertEqual(NumberCells, cel.NumberCells)
            assert_array_equal(intensities, cel.intensities)
            assert_array_equal(stdevs, cel.stdevs)
            assert_array_equal(npix, cel.npix)
            self.assertEqual(nrows, cel.nrows)
            self.assertEqual(ncols, cel.ncols)
            self.assertEqual(nmask, cel.nmask)
            assert_array_equal(mask, cel.mask)
            self.assertEqual(noutliers, cel.noutliers)
            assert_array_equal(outliers, cel.outliers)
            self.assertEqual(nmodified, cel.nmodified)
            assert_array_equal(modified, cel.modified)

if __name__ == '__main__':
    runner = unittest.TextTestRunner(verbosity=2)
    unittest.main(testRunner=runner)
