aboutsummaryrefslogtreecommitdiff
path: root/tests/unit/test_heatmaps.py
blob: c0a496b3a82a81539f108faf3e3871ab3b0172bc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
"""Module contains tests for gn3.heatmaps.heatmaps"""
from unittest import TestCase
from gn3.heatmaps import (
    cluster_traits,
    get_lrs_from_chr,
    export_trait_data,
    compute_traits_order,
    retrieve_strains_and_values,
    process_traits_data_for_heatmap)

strainlist = ["B6cC3-1", "BXD1", "BXD12", "BXD16", "BXD19", "BXD2"]
trait_data = {
    "mysqlid": 36688172,
    "data": {
        "B6cC3-1": {"strain_name": "B6cC3-1", "value": 7.51879, "variance": None, "ndata": None},
        "BXD1": {"strain_name": "BXD1", "value": 7.77141, "variance": None, "ndata": None},
        "BXD12": {"strain_name": "BXD12", "value": 8.39265, "variance": None, "ndata": None},
        "BXD16": {"strain_name": "BXD16", "value": 8.17443, "variance": None, "ndata": None},
        "BXD19": {"strain_name": "BXD19", "value": 8.30401, "variance": None, "ndata": None},
        "BXD2": {"strain_name": "BXD2", "value": 7.80944, "variance": None, "ndata": None},
        "BXD21": {"strain_name": "BXD21", "value": 8.93809, "variance": None, "ndata": None},
        "BXD24": {"strain_name": "BXD24", "value": 7.99415, "variance": None, "ndata": None},
        "BXD27": {"strain_name": "BXD27", "value": 8.12177, "variance": None, "ndata": None},
        "BXD28": {"strain_name": "BXD28", "value": 7.67688, "variance": None, "ndata": None},
        "BXD32": {"strain_name": "BXD32", "value": 7.79062, "variance": None, "ndata": None},
        "BXD39": {"strain_name": "BXD39", "value": 8.27641, "variance": None, "ndata": None},
        "BXD40": {"strain_name": "BXD40", "value": 8.18012, "variance": None, "ndata": None},
        "BXD42": {"strain_name": "BXD42", "value": 7.82433, "variance": None, "ndata": None},
        "BXD6": {"strain_name": "BXD6", "value": 8.09718, "variance": None, "ndata": None},
        "BXH14": {"strain_name": "BXH14", "value": 7.97475, "variance": None, "ndata": None},
        "BXH19": {"strain_name": "BXH19", "value": 7.67223, "variance": None, "ndata": None},
        "BXH2": {"strain_name": "BXH2", "value": 7.93622, "variance": None, "ndata": None},
        "BXH22": {"strain_name": "BXH22", "value": 7.43692, "variance": None, "ndata": None},
        "BXH4": {"strain_name": "BXH4", "value": 7.96336, "variance": None, "ndata": None},
        "BXH6": {"strain_name": "BXH6", "value": 7.75132, "variance": None, "ndata": None},
        "BXH7": {"strain_name": "BXH7", "value": 8.12927, "variance": None, "ndata": None},
        "BXH8": {"strain_name": "BXH8", "value": 6.77338, "variance": None, "ndata": None},
        "BXH9": {"strain_name": "BXH9", "value": 8.03836, "variance": None, "ndata": None},
        "C3H/HeJ": {"strain_name": "C3H/HeJ", "value": 7.42795, "variance": None, "ndata": None},
        "C57BL/6J": {"strain_name": "C57BL/6J", "value": 7.50606, "variance": None, "ndata": None},
        "DBA/2J": {"strain_name": "DBA/2J", "value": 7.72588, "variance": None, "ndata": None}}}

slinked = (
    (((0, 2, 0.16381088984330505),
      ((1, 7, 0.06024619831474998), 5, 0.19179284676938602),
      0.20337048635536847),
     9,
     0.23451785425383564),
    ((3, (6, 8, 0.2140799896286565), 0.25879514152086425),
     4, 0.8968250491499363),
    0.9313185954797953)

class TestHeatmap(TestCase):
    """Class for testing heatmap computation functions"""

    def test_export_trait_data_dtype(self):
        """
        Test `export_trait_data` with different values for the `dtype` keyword
        argument
        """
        for dtype, expected in [
                ["val", (7.51879, 7.77141, 8.39265, 8.17443, 8.30401, 7.80944)],
                ["var", (None, None, None, None, None, None)],
                ["N", (None, None, None, None, None, None)],
                ["all", (7.51879, 7.77141, 8.39265, 8.17443, 8.30401, 7.80944)]]:
            with self.subTest(dtype=dtype):
                self.assertEqual(
                    export_trait_data(trait_data, strainlist, dtype=dtype),
                    expected)

    def test_export_trait_data_dtype_all_flags(self):
        """
        Test `export_trait_data` with different values for the `dtype` keyword
        argument and the different flags set up
        """
        for dtype, vflag, nflag, expected in [
                ["val", False, False,
                 (7.51879, 7.77141, 8.39265, 8.17443, 8.30401, 7.80944)],
                ["val", False, True,
                 (7.51879, 7.77141, 8.39265, 8.17443, 8.30401, 7.80944)],
                ["val", True, False,
                 (7.51879, 7.77141, 8.39265, 8.17443, 8.30401, 7.80944)],
                ["val", True, True,
                 (7.51879, 7.77141, 8.39265, 8.17443, 8.30401, 7.80944)],
                ["var", False, False, (None, None, None, None, None, None)],
                ["var", False, True, (None, None, None, None, None, None)],
                ["var", True, False, (None, None, None, None, None, None)],
                ["var", True, True, (None, None, None, None, None, None)],
                ["N", False, False, (None, None, None, None, None, None)],
                ["N", False, True, (None, None, None, None, None, None)],
                ["N", True, False, (None, None, None, None, None, None)],
                ["N", True, True, (None, None, None, None, None, None)],
                ["all", False, False,
                 (7.51879, 7.77141, 8.39265, 8.17443, 8.30401, 7.80944)],
                ["all", False, True,
                 (7.51879, None, 7.77141, None, 8.39265, None, 8.17443, None,
                  8.30401, None, 7.80944, None)],
                ["all", True, False,
                 (7.51879, None, 7.77141, None, 8.39265, None, 8.17443, None,
                  8.30401, None, 7.80944, None)],
                ["all", True, True,
                 (7.51879, None, None, 7.77141, None, None, 8.39265, None, None,
                  8.17443, None, None, 8.30401, None, None, 7.80944, None, None)]
        ]:
            with self.subTest(dtype=dtype, vflag=vflag, nflag=nflag):
                self.assertEqual(
                    export_trait_data(
                        trait_data, strainlist, dtype=dtype, var_exists=vflag,
                        n_exists=nflag),
                    expected)

    def test_cluster_traits(self):
        """
        Test that the clustering is working as expected.
        """
        traits_data_list = [
            (7.51879, 7.77141, 8.39265, 8.17443, 8.30401, 7.80944),
            (6.1427, 6.50588, 7.73705, 6.68328, 7.49293, 7.27398),
            (8.4211, 8.30581, 9.24076, 8.51173, 9.18455, 8.36077),
            (10.0904, 10.6509, 9.36716, 9.91202, 8.57444, 10.5731),
            (10.188, 9.76652, 9.54813, 9.05074, 9.52319, 9.10505),
            (6.74676, 7.01029, 7.54169, 6.48574, 7.01427, 7.26815),
            (6.39359, 6.85321, 5.78337, 7.11141, 6.22101, 6.16544),
            (6.84118, 7.08432, 7.59844, 7.08229, 7.26774, 7.24991),
            (9.45215, 10.6943, 8.64719, 10.1592, 7.75044, 8.78615),
            (7.04737, 6.87185, 7.58586, 6.92456, 6.84243, 7.36913)]
        self.assertEqual(
            cluster_traits(traits_data_list),
            ((0.0, 0.20337048635536847, 0.16381088984330505, 1.7388553629398245,
              1.5025235756329178, 0.6952839500255574, 1.271661230252733,
              0.2100487290977544, 1.4699690641062024, 0.7934461515867415),
             (0.20337048635536847, 0.0, 0.2198321044997198, 1.5753041735592204,
              1.4815755944537086, 0.26087293140686374, 1.6939790104301427,
              0.06024619831474998, 1.7430082449189215, 0.4497104244247795),
             (0.16381088984330505, 0.2198321044997198, 0.0, 1.9073926868549234,
              1.0396738891139845, 0.5278328671176757, 1.6275069061182947,
              0.2636503792482082, 1.739617877037615, 0.7127042590637039),
             (1.7388553629398245, 1.5753041735592204, 1.9073926868549234, 0.0,
              0.9936846292920328, 1.1169999189889366, 0.6007483980555253,
              1.430209221053372, 0.25879514152086425, 0.9313185954797953),
             (1.5025235756329178, 1.4815755944537086, 1.0396738891139845,
              0.9936846292920328, 0.0, 1.027827186339337, 1.1441743109173244,
              1.4122477962364253, 0.8968250491499363, 1.1683723389247052),
             (0.6952839500255574, 0.26087293140686374, 0.5278328671176757,
              1.1169999189889366, 1.027827186339337, 0.0, 1.8420471110023269,
              0.19179284676938602, 1.4875072385631605, 0.23451785425383564),
             (1.271661230252733, 1.6939790104301427, 1.6275069061182947,
              0.6007483980555253, 1.1441743109173244, 1.8420471110023269, 0.0,
              1.6540234785929928, 0.2140799896286565, 1.7413442197913358),
             (0.2100487290977544, 0.06024619831474998, 0.2636503792482082,
              1.430209221053372, 1.4122477962364253, 0.19179284676938602,
              1.6540234785929928, 0.0, 1.5225640692832796, 0.33370067057028485),
             (1.4699690641062024, 1.7430082449189215, 1.739617877037615,
              0.25879514152086425, 0.8968250491499363, 1.4875072385631605,
              0.2140799896286565, 1.5225640692832796, 0.0, 1.3256191648260216),
             (0.7934461515867415, 0.4497104244247795, 0.7127042590637039,
              0.9313185954797953, 1.1683723389247052, 0.23451785425383564,
              1.7413442197913358, 0.33370067057028485, 1.3256191648260216,
              0.0)))

    def test_compute_heatmap_order(self):
        """Test the orders."""
        self.assertEqual(
            compute_traits_order(slinked), (0, 2, 1, 7, 5, 9, 3, 6, 8, 4))

    def test_retrieve_strains_and_values(self):
        """Test retrieval of strains and values."""
        for orders, slist, tdata, expected in [
                [
                    [2],
                    ["s1", "s2", "s3", "s4"],
                    [[2, 9, 6, None, 4],
                     [7, 5, None, None, 4],
                     [9, None, 5, 4, 7],
                     [6, None, None, 4, None]],
                    [[2, ["s1", "s3", "s4"], [9, 5, 4]]]
                ],
                [
                    [3],
                    ["s1", "s2", "s3", "s4", "s5"],
                    [[2, 9, 6, None, 4],
                     [7, 5, None, None, 4],
                     [9, None, 5, 4, 7],
                     [6, None, None, 4, None]],
                    [[3, ["s1", "s4"], [6, 4]]]
                ]]:
            with self.subTest(strainlist=slist, traitdata=tdata):
                self.assertEqual(
                    retrieve_strains_and_values(orders, slist, tdata), expected)

    def test_get_lrs_from_chr(self):
        """Check that function gets correct LRS values"""
        for trait, chromosome, expected in [
                [{"chromosomes": {}}, 3, [None]],
                [{"chromosomes": {3: {"loci": [
                    {"Locus": "b", "LRS": 1.9},
                    {"Locus": "a", "LRS": 13.2},
                    {"Locus": "d", "LRS": 53.21},
                    {"Locus": "c", "LRS": 2.22}]}}},
                 3,
                 [13.2, 1.9, 2.22, 53.21]]]:
            with self.subTest(trait=trait, chromosome=chromosome):
                self.assertEqual(get_lrs_from_chr(trait, chromosome), expected)

    def test_process_traits_data_for_heatmap(self):
        """Check for correct processing of data for heatmap generation."""
        self.assertEqual(
            process_traits_data_for_heatmap(
                {"1": {
                    "ID": "T1",
                    "chromosomes": {
                        1: {"Chr": 1,
                            "loci": [
                                {
                                    "Locus": "rs31443144", "cM": 1.500, "Mb": 3.010,
                                    "LRS": 0.500, "Additive": -0.074, "pValue": 1.000
                                },
                                {
                                    "Locus": "rs6269442", "cM": 1.500, "Mb": 3.492,
                                    "LRS": 0.500, "Additive": -0.074, "pValue": 1.000
                                },
                                {
                                    "Locus": "rs32285189", "cM": 1.630, "Mb": 3.511,
                                    "LRS": 0.500, "Additive": -0.074, "pValue": 1.000
                                },
                                {
                                    "Locus": "rs258367496", "cM": 1.630, "Mb": 3.660,
                                    "LRS": 0.500, "Additive": -0.074, "pValue": 1.000
                                },
                                {
                                    "Locus": "rs32430919", "cM": 1.750, "Mb": 3.777,
                                    "LRS": 0.500, "Additive": -0.074, "pValue": 1.000
                                },
                                {
                                    "Locus": "rs36251697", "cM": 1.880, "Mb": 3.812,
                                    "LRS": 0.500, "Additive": -0.074, "pValue": 1.000
                                },
                                {
                                    "Locus": "rs30658298", "cM": 2.010, "Mb": 4.431,
                                    "LRS": 0.500, "Additive": -0.074, "pValue": 1.000
                                }]},
                        2: {"Chr": 2,
                            "loci": [
                                {
                                    "Locus": "rs51852623", "cM": 2.010, "Mb": 4.447,
                                    "LRS": 0.500, "Additive": -0.074, "pValue": 1.000
                                },
                                {
                                    "Locus": "rs31879829", "cM": 2.140, "Mb": 4.519,
                                    "LRS": 0.500, "Additive": -0.074, "pValue": 1.000
                                },
                                {
                                    "Locus": "rs36742481", "cM": 2.140, "Mb": 4.776,
                                    "LRS": 0.500, "Additive": -0.074, "pValue": 1.000
                                }]}}},
                 "2": {
                     "ID": "T1",
                     "chromosomes": {
                         1: {"Chr": 1,
                             "loci": [
                                 {
                                     "Locus": "rs31443144", "cM": 1.500, "Mb": 3.010,
                                     "LRS": 0.500, "Additive": -0.074, "pValue": 1.000
                                 },
                                 {
                                     "Locus": "rs6269442", "cM": 1.500, "Mb": 3.492,
                                     "LRS": 0.500, "Additive": -0.074, "pValue": 1.000
                                 },
                                 {
                                     "Locus": "rs32285189", "cM": 1.630, "Mb": 3.511,
                                     "LRS": 0.500, "Additive": -0.074, "pValue": 1.000
                                 },
                                 {
                                     "Locus": "rs258367496", "cM": 1.630, "Mb": 3.660,
                                     "LRS": 0.500, "Additive": -0.074, "pValue": 1.000
                                 },
                                 {
                                     "Locus": "rs32430919", "cM": 1.750, "Mb": 3.777,
                                     "LRS": 0.500, "Additive": -0.074, "pValue": 1.000
                                 },
                                 {
                                     "Locus": "rs36251697", "cM": 1.880, "Mb": 3.812,
                                     "LRS": 0.500, "Additive": -0.074, "pValue": 1.000
                                 },
                                 {
                                     "Locus": "rs30658298", "cM": 2.010, "Mb": 4.431,
                                     "LRS": 0.500, "Additive": -0.074, "pValue": 1.000
                                 }]},
                         2: {"Chr": 2,
                             "loci": [
                                 {
                                     "Locus": "rs51852623", "cM": 2.010, "Mb": 4.447,
                                     "LRS": 0.500, "Additive": -0.074, "pValue": 1.000
                                 },
                                 {
                                     "Locus": "rs31879829", "cM": 2.140, "Mb": 4.519,
                                     "LRS": 0.500, "Additive": -0.074, "pValue": 1.000
                                 },
                                 {
                                     "Locus": "rs36742481", "cM": 2.140, "Mb": 4.776,
                                     "LRS": 0.579, "Additive": -0.074, "pValue": 1.000
                                 }]}}}},
                ["2", "1"],
                [1, 2]),
            [[[0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5],
              [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]],
             [[0.5, 0.579, 0.5],
              [0.5, 0.5, 0.5]]])