def log10_heatmap(dna_samples,
                  dna_top_average_pathways,
                  dna_top_average_data,
                  data_type="pathways"):
    merged_data = []
    metadata_pathways = []
    metadata_samples = []
    if 'metadata' in vars and vars['metadata']:
        merged_data, metadata_samples = utilities.merge_metadata(
            vars['metadata'], dna_samples,
            [[dna_top_average_pathways[i]] + dna_top_average_data[i]
             for i in range(len(dna_top_average_pathways))])
        metadata_pathways = [row.pop(0) for row in merged_data]
        # get the metadata row numbers
        metadata_rows = range(1, len(vars['metadata']))
        document.show_hclust2(metadata_samples,
                              metadata_pathways,
                              merged_data,
                              title="Top " + str(max_sets) + " " + data_type +
                              " by average abundance",
                              metadata_rows=metadata_rows)
    else:
        document.show_hclust2(dna_samples,
                              dna_top_average_pathways,
                              dna_top_average_data,
                              title="Top " + str(max_sets) + " " + data_type +
                              " by average abundance")

    return merged_data, metadata_pathways, metadata_samples
    def test_merge_metadata_values_without_names(self):
        """ Test the merge metadata function. Test values without names option."""

        metadata = [["# samples", "s1", "s2"], ["feature1", "A", "B"],
                    ["feature2", 1, 2]]
        samples = ["s1", "s2"]
        values = [[1, 2], [2, 4]]

        merged, new_samples = utilities.merge_metadata(
            metadata, samples, values, values_without_names=True)

        expected = [["feature1", "A", "B"], ["feature2", 1, 2], [1, 2], [2, 4]]
        expected_samples = ["s1", "s2"]

        self.assertEqual(merged, expected)
        self.assertEqual(new_samples, expected_samples)
    def test_merge_metadata_reorder(self):
        """ Test the merge metadata function. Test with reordering."""

        metadata = [["# samples", "s1", "s2"], ["feature1", "A", "B"],
                    ["feature2", 1, 2]]
        samples = ["s2", "s1"]
        values = [["bug1", 1, 2], ["bug2", 2, 4]]

        merged, new_samples = utilities.merge_metadata(metadata, samples,
                                                       values)

        expected = [["feature1", "A", "B"], ["feature2", 1, 2], ["bug1", 2, 1],
                    ["bug2", 4, 2]]
        expected_samples = ["s1", "s2"]

        self.assertEqual(merged, expected)
        self.assertEqual(new_samples, expected_samples)
    def test_merge_metadata_nomatch(self):
        """ Test the merge metadata function. Test with metadata not matching."""

        metadata = [["# samples", "s3"], ["feature1", "A"], ["feature2", 1]]
        samples = ["s1", "s2"]
        values = [["bug1", 1, 2], ["bug2", 2, 4]]

        # suppress warning message
        # Redirect stdout
        original_stdout = sys.stdout
        sys.stdout = open(os.devnull, "w")

        merged, new_samples = utilities.merge_metadata(metadata, samples,
                                                       values)

        # Redirect stdout
        sys.stdout = original_stdout

        expected = [["bug1", 1, 2], ["bug2", 2, 4]]

        self.assertEqual(merged, expected)
        self.assertEqual(new_samples, samples)