def test_by_annotator(self, new_pipegraph_no_qc):
        genome = get_human_22_fake_genome()
        start = 17750239
        df = pd.DataFrame(
            [
                {
                    "chr": "chr22",
                    "start": start,
                    "stop": start + 1000,
                },
                {
                    "chr": "chr22",
                    "start": start + 20000,
                    "stop": start + 20000 + 1000,
                },
                {
                    "chr": "chr22",
                    "start": start + 30000,
                    "stop": start + 30000 + 1000,
                },
            ]
        )
        lane1 = mbf_align.lanes.AlignedSample(
            "one",
            mbf_sampledata.get_sample_path("mbf_align/chipseq_chr22.bam"),
            genome,
            False,
            None,
        )
        lanes = {lane1.name: lane1}
        raw_data = {
            lane1.name: np.array(
                [
                    [0, 0, 0, 0],
                    [0, 0, 0, 0],
                    [0, 0, 0, 0],
                ]
            )
        }
        plot_regions = mbf_genomics.regions.GenomicRegions(
            "testregions", lambda: df, [], genome
        )

        class FakeAnno(mbf_genomics.annotator.Annotator):
            columns = ["colA"]

            def calc(self, df):
                return pd.Series([1, 3, 2])

        o = order.ByAnnotator(FakeAnno())
        ppg.JobGeneratingJob("shu", lambda: None).depends_on(
            o.get_dependencies(plot_regions, lanes)[0]
        )
        ppg.run_pipegraph()
        plot_regions._load()

        norm_data = norm.AsIs().calc(lanes, raw_data)
        res_order, clusters = o.calc(plot_regions, lanes, raw_data, norm_data)
        assert (res_order == [0, 2, 1]).all()
    def test_by_column(self, new_pipegraph_no_qc):
        genome = get_human_22_fake_genome()
        start = 17750239
        df = pd.DataFrame(
            [
                {
                    "chr": "chr22",
                    "start": start,
                    "stop": start + 1000,
                    "colA": "a",
                },
                {
                    "chr": "chr22",
                    "start": start + 20000,
                    "stop": start + 20000 + 1000,
                    "colA": "c",
                },
                {
                    "chr": "chr22",
                    "start": start + 30000,
                    "stop": start + 30000 + 1000,
                    "colA": "b",
                },
            ]
        )
        lane1 = mbf_align.lanes.AlignedSample(
            "one",
            mbf_sampledata.get_sample_path("mbf_align/chipseq_chr22.bam"),
            genome,
            False,
            None,
        )
        lanes = {lane1.name: lane1}
        o = order.ByAnnotator("colA", func=lambda x: [ord(y) for y in x])
        raw_data = {
            lane1.name: np.array(
                [
                    [0, 0, 0, 0],
                    [0, 0, 0, 0],
                    [0, 0, 0, 0],
                ]
            )
        }
        plot_regions = mbf_genomics.regions.GenomicRegions(
            "testregions", lambda: df, [], genome
        )
        ppg.JobGeneratingJob("shu", lambda: None).depends_on(plot_regions.load())
        ppg.run_pipegraph()
        plot_regions._load()

        norm_data = norm.AsIs().calc(lanes, raw_data)
        res_order, clusters = o.calc(plot_regions, lanes, raw_data, norm_data)
        assert (res_order == [0, 2, 1]).all()
    def test_smooth(self, new_pipegraph_no_qc):
        genome = get_human_22_fake_genome()
        df = pd.DataFrame(
            [
                {
                    "chr": "chr22",
                    "start": 36925 * 1000 - 1000,
                    "stop": 36925 * 1000 + 1000,
                },
                {
                    "chr": "chr22",
                    "start": 31485 * 1000 - 2000,
                    "stop": 31485 * 1000 + 2000,
                },
                {"chr": "chr22", "start": 41842 * 1000, "stop": (41842 * 1000) + 1},
            ]
        )
        plot_regions = mbf_genomics.regions.GenomicRegions(
            "testregions", lambda: df, [], genome
        )
        lane1 = mbf_align.lanes.AlignedSample(
            "one",
            mbf_sampledata.get_sample_path("mbf_align/chipseq_chr22.bam"),
            genome,
            False,
            None,
        )
        lane2 = mbf_align.lanes.AlignedSample(
            "two",
            mbf_sampledata.get_sample_path("mbf_align/chipseq_chr22.bam"),
            genome,
            False,
            None,
        )

        h = mbf_heatmap.chipseq.Heatmap(
            plot_regions,
            [lane1, lane2],
            region_strategy=regions.RegionFromCenter(1000),
            smoothing_strategy=smooth.SmoothExtendedReads(),
        )
        fn = "test.png"
        h.plot(fn, norm.AsIs(), order.FirstLaneSum())
        ppg.run_pipegraph()
        assert_image_equal(fn)
    def test_simple(self, new_pipegraph_no_qc):
        genome = get_human_22_fake_genome()
        start = 17750239
        df = pd.DataFrame(
            [
                {"chr": "chr22", "start": start, "stop": start + 1000},
                {"chr": "chr22", "start": start + 20000, "stop": start + 20000 + 1000},
                {"chr": "chr22", "start": start + 30000, "stop": start + 30000 + 1000},
            ]
        )
        plot_regions = mbf_genomics.regions.GenomicRegions(
            "testregions", lambda: df, [], genome
        )
        lane1 = mbf_align.lanes.AlignedSample(
            "one",
            mbf_sampledata.get_sample_path("mbf_align/chipseq_chr22.bam"),
            genome,
            False,
            None,
        )
        lane2 = mbf_align.lanes.AlignedSample(
            "two",
            mbf_sampledata.get_sample_path("mbf_align/chipseq_chr22.bam"),
            genome,
            False,
            None,
        )

        h = mbf_heatmap.chipseq.Heatmap(
            plot_regions,
            [lane1, lane2],
            region_strategy=regions.RegionAsIs(),
            smoothing_strategy=smooth.SmoothRaw(),
        )
        fn = "test.png"
        h.plot(fn, norm.AsIs(), order.AsIs())
        ppg.run_pipegraph()
        assert_image_equal(fn)
    def test_ithlane_max(self, new_pipegraph):
        genome = get_human_22_fake_genome()
        start = 17750239
        df = pd.DataFrame(
            [
                {"chr": "chr22", "start": start, "stop": start + 1000},
                {"chr": "chr22", "start": start + 20000, "stop": start + 20000 + 1000},
                {"chr": "chr22", "start": start + 30000, "stop": start + 30000 + 1000},
            ]
        )
        lane1 = mbf_align.lanes.AlignedSample(
            "one",
            mbf_sampledata.get_sample_path("mbf_align/chipseq_chr22.bam"),
            genome,
            False,
            None,
        )
        lane2 = mbf_align.lanes.AlignedSample(
            "two",
            mbf_sampledata.get_sample_path("mbf_align/chipseq_chr22.bam"),
            genome,
            False,
            None,
        )
        with pytest.raises(AttributeError):
            order.IthLaneMax(lane1.name)

        o = order.IthLaneMax(1)
        # raw_data = {lane1.name: smooth.SmoothRaw().calc(df, lane1)}
        raw_data = {
            lane1.name: np.array(
                [
                    [0, 0, 5, 0],
                    [2, 1, 1, 1],
                    [1, 0, 0, 0],
                ]
            )
        }

        print(raw_data)
        print(raw_data[lane1.name].max(axis=1))
        lanes = {lane1.name: lane1}
        lanes[lane2.name] = lane2
        norm_data = norm.AsIs().calc(lanes, raw_data)
        plot_regions = mbf_genomics.regions.GenomicRegions(
            "testregions", lambda: df, [], genome
        )

        with pytest.raises(KeyError):
            o.calc(
                plot_regions,
                {lane1.name: lane1, lane2.name: lane2},
                raw_data,
                norm_data,
            )

        o = order.IthLaneMax(lane2)
        with pytest.raises(KeyError):
            o.calc(plot_regions, {lane1.name: lane1}, raw_data, norm_data)

        raw_data[lane2.name] = raw_data[lane1.name].copy()
        res_order, clusters = o.calc(plot_regions, lanes, raw_data, norm_data)
        assert clusters is None
        assert (
            res_order == [2, 1, 0]
        ).all()  # remember, from top to bottom in plotting later on.

        raw_data[lane2.name] = np.array(
            [
                [0, 0, 0, 0],
                [5, 1, 1, 0],
                [1, 0, 0, 4],
            ]
        )
        o = order.IthLaneMax(0)
        res_order, clusters = o.calc(plot_regions, lanes, raw_data, norm_data)
        assert (
            res_order == [2, 1, 0]
        ).all()  # remember, from top to bottom in plotting later on.

        o = order.IthLaneMax(1)
        res_order, clusters = o.calc(plot_regions, lanes, raw_data, norm_data)

        assert (
            res_order == [0, 2, 1]
        ).all()  # remember, from top to bottom in plotting later on.