def test_find_attc_max_In0(self):
        replicon_name = 'ESCO001.B.00018.P002'
        replicon_path = self.find_data(os.path.join('Replicons', replicon_name + '.fst'))

        topologies = Topology('circ')
        with FastaIterator(replicon_path) as sequences_db:
            sequences_db.topologies = topologies
            replicon = next(sequences_db)

        integron = Integron(replicon, self.cfg)

        integrase = pd.DataFrame({'pos_beg': [90229],
                                  'pos_end': [91242],
                                  'strand': -1,
                                  'evalue': 1.400000e-24,
                                  'type_elt': 'protein',
                                  'annotation': 'intI',
                                  'model': 'intersection_tyr_intI',
                                  'distance_2attC': np.nan
                                  },
                                 index=['ESCO001.B.00018.P002_106'],
                                 columns=self.columns)
        integrase = integrase.astype(dtype=self.dtype)
        integron.integrase = integrase
        integrons = [integron]

        max_final = find_attc_max(integrons, replicon,
                                  self.cfg.distance_threshold, self.cfg.model_attc_path,
                                  self.cfg.max_attc_size, self.cfg.min_attc_size,
                                  circular=True,
                                  out_dir=self.tmp_dir)

        exp = pd.DataFrame(columns=self.max_cols)
        exp = exp.astype(dtype=self.max_dtype)
        pdt.assert_frame_equal(max_final, exp)
    def test_integrons_report(self):
        replicon_name = "acba.007.p01.13"
        replicon_path = self.find_data(os.path.join('Replicons', replicon_name + '.fst'))
        topologies = Topology('circ')
        with FastaIterator(replicon_path) as sequences_db:
            sequences_db.topologies = topologies
            replicon = next(sequences_db)

        args = argparse.Namespace()
        cfg = Config(args)
        cfg._args.eagle_eyes = False
        cfg._args.eagle_eyes = False
        cfg._args.local_max = False

        integron = Integron(replicon, cfg)
        columns = ['pos_beg', 'pos_end', 'strand', 'evalue', 'type_elt', 'model', 'distance_2attC', 'annotation']
        dtype = {"pos_beg": 'int',
                      "pos_end": 'int',
                      "strand": 'int',
                      "evalue": 'float',
                      "type_elt": 'str',
                      "annotation": 'str',
                      "model": 'str',
                      "distance_2attC": 'float'}
        data_integrase = {"pos_beg": 55,
                          "pos_end": 1014,
                          "strand": 1,
                          "evalue": 1.900000e-25,
                          "type_elt": "protein",
                          "annotation": "intI",
                          "model": "intersection_tyr_intI",
                          "distance_2attC": np.nan}
        id_int = "ACBA.007.P01_13_1"

        integrase = pd.DataFrame(data_integrase, columns=columns, index=[id_int])
        integrase = integrase.astype(dtype=dtype)

        data_attc = {"pos_beg": [17825, 19080, 19618],
                     "pos_end": [17884, 19149, 19726],
                     "strand": [-1] * 3,
                     "evalue": [1.000000e-09, 1.000000e-04, 1.100000e-07],
                     "type_elt": ["attC"] * 3,
                     "annotation": ["attC"] * 3,
                     "model": ["attc_4"] * 3,
                     "distance_2attC": [np.nan, 1196.0, 469.0]}

        attC = pd.DataFrame(data_attc,
                            columns=columns,
                            index=['attc_00{}'.format(i) for i in range(1, 4)])
        attC = attC.astype(dtype=dtype)

        promoter = pd.DataFrame({'pos_beg': 25,
                                 'pos_end': 51,
                                 'strand': -1,
                                 'evalue': np.nan,
                                 'type_elt': 'Promoter',
                                 'annotation': 'Pc_1',
                                 'model': np.nan,
                                 'distance_2attC': np.nan
                                 },
                                index=['Pc_int1'],
                                columns=columns
                                )
        promoter = promoter.astype(dtype=dtype)

        proteins = pd.DataFrame({'pos_beg': [17375, 17886, 19090, 19721],
                                 'pos_end': [17722, 18665, 19749, 20254],
                                 'strand': [-1] * 4,
                                 'evalue': [np.nan] * 4,
                                 'type_elt': ['protein'] * 4,
                                 'annotation': ['protein'] * 4,
                                 'model': [np.nan] * 4,
                                 'distance_2attC': [np.nan] * 4
                                 },
                                index=['ACBA.007.P01_13_2{}'.format(i) for i in range(0, 4)],
                                columns=columns
                                )
        proteins = proteins.astype(dtype=dtype)

        integron.integrase = integrase
        integron.attC = attC
        integron.promoter = promoter
        integron.proteins = proteins
        report = results.integrons_report([integron])
        exp_report = pd.read_csv(
            self.find_data(os.path.join('Results_Integron_Finder_{}'.format(replicon_name),
                                        '{}.integrons'.format(replicon_name)
                                        )),
            sep="\t"
        )
        exp_report = exp_report.astype(dtype=dtype)
        pdt.assert_frame_equal(exp_report, report)
    def test_integrons_report(self):
        replicon_name = "acba.007.p01.13"
        replicon_path = self.find_data(
            os.path.join('Replicons', replicon_name + '.fst'))
        topologies = Topology('circ')
        with FastaIterator(replicon_path) as sequences_db:
            sequences_db.topologies = topologies
            replicon = next(sequences_db)

        args = argparse.Namespace()
        cfg = Config(args)
        cfg._args.eagle_eyes = False
        cfg._args.eagle_eyes = False
        cfg._args.local_max = False

        integron = Integron(replicon, cfg)
        columns = [
            'pos_beg', 'pos_end', 'strand', 'evalue', 'type_elt', 'model',
            'distance_2attC', 'annotation'
        ]
        dtype = {
            "pos_beg": 'int',
            "pos_end": 'int',
            "strand": 'int',
            "evalue": 'float',
            "type_elt": 'str',
            "annotation": 'str',
            "model": 'str',
            "distance_2attC": 'float'
        }
        data_integrase = {
            "pos_beg": 55,
            "pos_end": 1014,
            "strand": 1,
            "evalue": 1.900000e-25,
            "type_elt": "protein",
            "annotation": "intI",
            "model": "intersection_tyr_intI",
            "distance_2attC": np.nan
        }
        id_int = "ACBA.007.P01_13_1"

        integrase = pd.DataFrame(data_integrase,
                                 columns=columns,
                                 index=[id_int])
        integrase = integrase.astype(dtype=dtype)

        data_attc = {
            "pos_beg": [17825, 19080, 19618],
            "pos_end": [17884, 19149, 19726],
            "strand": [-1] * 3,
            "evalue": [1.000000e-09, 1.000000e-04, 1.100000e-07],
            "type_elt": ["attC"] * 3,
            "annotation": ["attC"] * 3,
            "model": ["attc_4"] * 3,
            "distance_2attC": [np.nan, 1196.0, 469.0]
        }

        attC = pd.DataFrame(data_attc,
                            columns=columns,
                            index=['attc_00{}'.format(i) for i in range(1, 4)])
        attC = attC.astype(dtype=dtype)

        promoter = pd.DataFrame(
            {
                'pos_beg': 25,
                'pos_end': 51,
                'strand': -1,
                'evalue': np.nan,
                'type_elt': 'Promoter',
                'annotation': 'Pc_1',
                'model': np.nan,
                'distance_2attC': np.nan
            },
            index=['Pc_int1'],
            columns=columns)
        promoter = promoter.astype(dtype=dtype)

        proteins = pd.DataFrame(
            {
                'pos_beg': [17375, 17886, 19090, 19721],
                'pos_end': [17722, 18665, 19749, 20254],
                'strand': [-1] * 4,
                'evalue': [np.nan] * 4,
                'type_elt': ['protein'] * 4,
                'annotation': ['protein'] * 4,
                'model': [np.nan] * 4,
                'distance_2attC': [np.nan] * 4
            },
            index=['ACBA.007.P01_13_2{}'.format(i) for i in range(0, 4)],
            columns=columns)
        proteins = proteins.astype(dtype=dtype)

        integron.integrase = integrase
        integron.attC = attC
        integron.promoter = promoter
        integron.proteins = proteins
        report = results.integrons_report([integron])
        exp_report = pd.read_csv(self.find_data(
            os.path.join('Results_Integron_Finder_{}'.format(replicon_name),
                         '{}.integrons'.format(replicon_name))),
                                 sep="\t")
        exp_report = exp_report.astype(dtype=dtype)
        pdt.assert_frame_equal(exp_report, report)
    def test_describe(self):
        replicon_name = "acba.007.p01.13"
        replicon_path = self.find_data(
            os.path.join('Replicons', replicon_name + '.fst'))
        topologies = Topology('lin')
        with FastaIterator(replicon_path) as sequences_db:
            sequences_db.topologies = topologies
            replicon = next(sequences_db)

        args = argparse.Namespace()
        args.eagle_eyes = False
        args.local_max = False
        cfg = Config(args)

        integron = Integron(replicon, cfg)

        data_integrase = {
            "pos_beg": 55,
            "pos_end": 1014,
            "strand": 1,
            "evalue": 1.900000e-25,
            "type_elt": "protein",
            "annotation": "intI",
            "model": "intersection_tyr_intI",
            "distance_2attC": np.nan
        }

        id_int = "ACBA.007.P01_13_1"
        integrase = pd.DataFrame(data_integrase,
                                 columns=self.columns,
                                 index=[id_int])
        integrase = integrase.astype(dtype=self.dtype)

        data_attc = {
            "pos_beg": 10,
            "pos_end": 100,
            "strand": -1,
            "evalue": 1.1e-07,
            "type_elt": "attC",
            "annotation": "attC",
            "model": "attc_4",
            "distance_2attC": np.nan
        }

        attC = pd.DataFrame(data_attc,
                            columns=self.columns,
                            index=['attc_001'])
        attC = attC.astype(dtype=self.dtype)
        promoter = pd.DataFrame(data_attc,
                                columns=self.columns,
                                index=['prom_001'])
        promoter = promoter.astype(dtype=self.dtype)
        attI = pd.DataFrame(data_attc,
                            columns=self.columns,
                            index=['attI_001'])
        attI = attI.astype(dtype=self.dtype)
        proteins = pd.DataFrame(data_attc,
                                columns=self.columns,
                                index=['prot_001'])
        proteins = proteins.astype(dtype=self.dtype)

        excp_description = pd.concat(
            [integrase, attC, promoter, attI, proteins], ignore_index=False)
        excp_description = excp_description.reset_index()
        excp_description.columns = ["element"] + list(
            excp_description.columns[1:])
        excp_description["type"] = "complete"
        excp_description["ID_replicon"] = replicon.id
        excp_description["ID_integron"] = id(
            integron)  # uniq identifier of a given Integron
        excp_description["default"] = "Yes"
        excp_description["considered_topology"] = replicon.topology
        excp_description.drop_duplicates(subset=["element"], inplace=True)

        self.cfg._args.eagle_eyes = False
        self.cfg._args.eagle_eyes = False
        integron.integrase = integrase
        integron.attC = attC
        integron.promoter = promoter
        integron.attI = attI
        integron.proteins = proteins

        recieved_description = integron.describe()
        pdt.assert_frame_equal(recieved_description, excp_description)
    def test_attI(self):
        replicon_name = 'saen.040.p01.10'
        replicon_path = self.find_data(
            os.path.join('Replicons', replicon_name + '.fst'))
        topologies = Topology('lin')
        with FastaIterator(replicon_path) as sequences_db:
            sequences_db.topologies = topologies
            replicon = next(sequences_db)

        attC = pd.DataFrame(
            {
                'pos_beg': [104651, 105162, 106018, 107567, 108423, 108743],
                'pos_end': [104710, 105221, 106087, 107626, 108482, 108832],
                'strand': [-1] * 6,
                'evalue': [
                    3.400000e-06, 7.500000e-09, 6.800000e-06, 2.800000e-07,
                    6.600000e-06, 1.800000e-04
                ],
                'type_elt': ['attC'] * 6,
                'annotation': ['attC'] * 6,
                'model': ['attc_4'] * 6,
                'distance_2attC': [np.nan, 452.0, 797.0, 1480.0, 797.0, 261.0]
            },
            index=['attc_00{}'.format(i) for i in range(1, 7)],
            columns=self.columns)
        attC = attC.astype(dtype=self.dtype)

        integrase = pd.DataFrame(
            {
                'pos_beg': 109469,
                'pos_end': 110482,
                'strand': 1,
                'evalue': 1.600000e-24,
                'type_elt': 'protein',
                'annotation': 'intI',
                'model': 'intersection_tyr_intI',
                'distance_2attC': np.nan
            },
            index=['SAEN.040.P01_10_135'],
            columns=self.columns)
        integrase = integrase.astype(dtype=self.dtype)

        ##########################################
        # test promoter with attC with integrase #
        ##########################################
        integron = Integron(replicon, self.cfg)
        integron.attC = attC
        integron.integrase = integrase

        exp_attI = pd.DataFrame(
            {
                'pos_beg': [109330],
                'pos_end': [109388],
                'strand': [-1],
                'evalue': [np.nan],
                'type_elt': 'attI',
                'annotation': 'attI_1',
                'model': 'NA',
                'distance_2attC': [np.nan]
            },
            index=['attI1'],
            columns=self.columns)
        exp_attI = exp_attI.astype(dtype=self.dtype)

        integron.add_attI()

        pdt.assert_frame_equal(exp_attI, integron.attI)

        #############################################
        # test promoter with attC without integrase #
        #############################################
        integron = Integron(replicon, self.cfg)
        integron.attC = attC

        empty_attI = pd.DataFrame(columns=self.columns)
        empty_attI = empty_attI.astype(dtype=self.dtype)

        integron.add_attI()

        pdt.assert_frame_equal(empty_attI, integron.attI)

        #############################################
        # test promoter without attC with integrase #
        #############################################
        integron = Integron(replicon, self.cfg)
        integron.integrase = integrase

        integron.add_attI()

        pdt.assert_frame_equal(exp_attI, integron.attI)
    def test_add_promoter(self):
        replicon_name = 'saen.040.p01.10'
        replicon_path = self.find_data(
            os.path.join('Replicons', replicon_name + '.fst'))
        topologies = Topology('lin')
        with FastaIterator(replicon_path) as sequences_db:
            sequences_db.topologies = topologies
            replicon = next(sequences_db)

        ## integron_finder.SIZE_REPLICON = 148711
        prot_file = os.path.join(self._data_dir, 'Proteins',
                                 '{}.prt'.format(replicon_name))

        # to test promoter we need to ad attC and integrase first
        # as add_promoter use attc and integrase
        attC = pd.DataFrame(
            {
                'pos_beg': [104651, 105162, 106018, 107567, 108423, 108743],
                'pos_end': [104710, 105221, 106087, 107626, 108482, 108832],
                'strand': [-1] * 6,
                'evalue': [
                    3.400000e-06, 7.500000e-09, 6.800000e-06, 2.800000e-07,
                    6.600000e-06, 1.800000e-04
                ],
                'type_elt': ['attC'] * 6,
                'annotation': ['attC'] * 6,
                'model': ['attc_4'] * 6,
                'distance_2attC': [np.nan, 452.0, 797.0, 1480.0, 797.0, 261.0]
            },
            index=['attc_00{}'.format(i) for i in range(1, 7)],
            columns=self.columns)
        attC = attC.astype(dtype=self.dtype)

        integrase = pd.DataFrame(
            {
                'pos_beg': 109469,
                'pos_end': 110482,
                'strand': 1,
                'evalue': 1.600000e-24,
                'type_elt': 'protein',
                'annotation': 'intI',
                'model': 'intersection_tyr_intI',
                'distance_2attC': np.nan
            },
            index=['SAEN.040.P01_10_135'],
            columns=self.columns)
        integrase = integrase.astype(dtype=self.dtype)

        ##########################################
        # test promoter with attC with integrase #
        ##########################################
        integron = Integron(replicon, self.cfg)
        integron.attC = attC
        integron.integrase = integrase

        integron.add_promoter()

        exp_promoters = pd.DataFrame(
            {
                'pos_beg': [109413, 109439],
                'pos_end': [109447, 109465],
                'strand': [1, -1],
                'evalue': [np.nan] * 2,
                'type_elt': ['Promoter'] * 2,
                'annotation': ['Pint_1', 'Pc_1'],
                'model': ['NA'] * 2,
                'distance_2attC': [np.nan] * 2
            },
            index=['P_intI1', 'Pc_int1'],
            columns=self.columns)
        exp_promoters = exp_promoters.astype(dtype=self.dtype)

        pdt.assert_frame_equal(exp_promoters, integron.promoter)

        #############################################
        # test promoter with attC without integrase #
        #############################################
        integron = Integron(replicon, self.cfg)
        integron.attC = attC
        integron.add_promoter()

        empty_promoter = pd.DataFrame(columns=self.columns)
        empty_promoter = empty_promoter.astype(dtype=self.dtype)

        pdt.assert_frame_equal(empty_promoter, integron.promoter)

        #############################################
        # test promoter without attC with integrase #
        #############################################
        integron = Integron(replicon, self.cfg)
        integron.integrase = integrase

        integron.add_promoter()

        pdt.assert_frame_equal(exp_promoters, integron.promoter)