class TestExomeCnvPy(unittest.TestCase): """ test the Exome CNV filters """ def setUp(self): """ define a default VcfInfo object """ extra = "HGNC=OR5A1;CQ=missense_variant;CONVEX;RC50INTERNALFREQ=0.005;COMMONFORWARDS=0.000;MEANLR2=0.5;MADL2R=0.02" cnv = create_cnv('F', 'deNovo', extra_info=extra) self.var = ExomeCNV(cnv) def test_add_cns_state(self): """ test that add_cns_state() works correctly """ # meanl2r > 0 gives cns of 3 self.var.cnv.info["MEANLR2"] = "1" self.var.cnv.add_cns_state() self.assertEqual(self.var.cnv.info["CNS"], "3") self.var.cnv.info["MEANLR2"] = "0" self.var.cnv.add_cns_state() self.assertEqual(self.var.cnv.info["CNS"], "3") self.var.cnv.info["MEANLR2"] = "-0.1" self.var.cnv.add_cns_state() self.assertEqual(self.var.cnv.info["CNS"], "1") self.var.cnv.info["MEANLR2"] = "-2" self.var.cnv.add_cns_state() self.assertEqual(self.var.cnv.info["CNS"], "1") self.var.cnv.info["MEANLR2"] = "-2.1" self.var.cnv.add_cns_state() self.assertEqual(self.var.cnv.info["CNS"], "0") def test_fails_mad_ratio(self): """ test that fails_mad_ratio() works correctly """ # check that var passes when MAD ratio > 5 self.var.cnv.info["MEANLR2"] = "0.5" self.var.cnv.info["MADL2R"] = "0.02" self.assertFalse(self.var.fails_mad_ratio()) # check that var passes when MAD ratio == 5 self.var.cnv.info["MEANLR2"] = "0.1" self.var.cnv.info["MADL2R"] = "0.01" self.assertFalse(self.var.fails_mad_ratio()) # check that var fails when MAD ratio < 5 self.var.cnv.info["MEANLR2"] = "0.09" self.var.cnv.info["MADL2R"] = "0.01" self.assertTrue(self.var.fails_mad_ratio()) # check that var fails when trying to divide by zero self.var.cnv.info["MEANLR2"] = "0.2" self.var.cnv.info["MADL2R"] = "0" self.assertTrue(self.var.fails_mad_ratio()) def test_fails_meanlr2(self): """ test that fails_meanlr2() works correctly """ # below the DUP threshold self.var.cnv.genotype = 'DUP' self.var.cnv.info["MEANLR2"] = "0.399" self.assertTrue(self.var.fails_meanlr2()) # at the DUP threshold self.var.cnv.info["MEANLR2"] = "0.4" self.assertFalse(self.var.fails_meanlr2()) # above the DUP threshold self.var.cnv.info["MEANLR2"] = "0.41" self.assertFalse(self.var.fails_meanlr2()) # above the DEL threshold self.var.cnv.genotype = 'DEL' self.var.cnv.info["MEANLR2"] = "-0.4999" self.assertTrue(self.var.fails_meanlr2()) # at the DEL threshold self.var.cnv.info["MEANLR2"] = "-0.5" self.assertFalse(self.var.fails_meanlr2()) # below the DEL threshold self.var.cnv.info["MEANLR2"] = "-0.51" self.assertFalse(self.var.fails_meanlr2()) def test_fails_population_frequency(self): """ test that fails_population_frequency() works correctly """ # check that var passes when RC50INTERNALFREQ < 0.01 self.var.cnv.info["RC50INTERNALFREQ"] = "0.005" self.assertFalse(self.var.fails_population_frequency()) # check that var passes when RC50INTERNALFREQ == 0.1 self.var.cnv.info["RC50INTERNALFREQ"] = "0.01" self.assertFalse(self.var.fails_population_frequency()) # check that var fails when RC50INTERNALFREQ > 0.1 self.var.cnv.info["RC50INTERNALFREQ"] = "0.02" self.assertTrue(self.var.fails_population_frequency()) def test_fails_convex_score(self): """ test that fails_convex_score() works correctly """ # check that var passes when CONVEXSCORE > 7 self.var.cnv.info["CONVEXSCORE"] = "8" self.assertFalse(self.var.fails_convex_score()) # check that var fails when CONVEXSCORE == 7 self.var.cnv.info["CONVEXSCORE"] = "7" self.assertTrue(self.var.fails_convex_score()) # check that var fails when CONVEXSCORE < 7 self.var.cnv.info["CONVEXSCORE"] = "6" self.assertTrue(self.var.fails_convex_score()) def test_fails_commmon_forwards(self): """ test that fails_commmon_forwards() works correctly """ # check that var passes when COMMONFORWARDS < 0.8 self.var.cnv.info["COMMONFORWARDS"] = "0.0" self.assertFalse(self.var.fails_commmon_forwards()) # check that var fails when COMMONFORWARDS == 0.8 self.var.cnv.info["COMMONFORWARDS"] = "0.8" self.assertFalse(self.var.fails_commmon_forwards()) # check that var fails when COMMONFORWARDS > 0.8 self.var.cnv.info["COMMONFORWARDS"] = "0.9" self.assertTrue(self.var.fails_commmon_forwards()) def test_fails_no_exons(self): """ test that fails_no_exons() works correctly """ self.var.cnv.info["NUMBEREXONS"] = "1" self.assertFalse(self.var.fails_no_exons()) self.var.cnv.info["NUMBEREXONS"] = "0" self.assertTrue(self.var.fails_no_exons()) def test_fails_x_lr2(self): """test that fails_x_lr2() works correctly """ self.var.cnv.chrom = "X" self.var.cnv.sum_x_lr2 = "-6000" self.assertTrue(self.var.fails_x_lr2()) self.var.cnv.sum_x_lr2 = "8000" self.assertTrue(self.var.fails_x_lr2()) self.var.cnv.sum_x_lr2 = "2000" self.assertFalse(self.var.fails_x_lr2()) def test_fails_additional_filters(self): """test that fails_additional_filters() works correctly """ self.var.cnv.genotype = "DUP" self.var.cnv.format["CIFER_INHERITANCE"] = "maternal_inh" self.var.cnv.info["MEANLR2"] = "-2" self.var.cnv.info["CONVEXSCORE"] = "10" self.var.cnv.info["MADL2R"] = "0.2" self.assertFalse(self.var.fails_additional_filters()) self.var.cnv.genotype = "DEL" self.assertFalse(self.var.fails_additional_filters()) self.var.cnv.format["CIFER_INHERITANCE"] = "not_inherited" self.assertTrue(self.var.fails_additional_filters()) self.var.cnv.info["MADL2R"] = "0.1" self.assertTrue(self.var.fails_additional_filters()) self.var.cnv.info["MEANLR2"] = "-1" self.assertFalse(self.var.fails_additional_filters()) self.var.cnv.info["CONVEXSCORE"] = "20" self.assertFalse(self.var.fails_additional_filters()) def test_fails_cifer_inh(self): """test that CNVs in non-trios aren't filtered out on cifer false pos but those in trios are filtered out """ self.var.cnv.has_parents = True self.var.cnv.format["CIFER_INHERITANCE"] = "false_positive" self.assertTrue(self.var.fails_cifer_inh()) self.var.cnv.has_parents = False self.var.cnv.format["CIFER_INHERITANCE"] = "false_positive" self.assertFalse(self.var.fails_cifer_inh())