class TestAcghCnvPy(unittest.TestCase):
    """ test the ACGH CNV filters
    """
    
    def setUp(self):
        """ define a default VcfInfo object
        """
        
        extra = 'OR5A1;CNSOLIDATE;WSCORE=0.5;CALLP=0.000;COMMONFORWARDS=0.000;MEANLR2=0.5;MADL2R=0.02;'
        cnv = create_cnv('F', 'deNovo', extra_info=extra)
        
        self.var = ACGH_CNV(cnv)
    
    def test_fails_mad_ratio(self):
        """ test that fails_mad_ratio() works correctly.
        """
        
        # check that var passes when MAD ratio >= 15
        self.var.cnv.info["MEANLR2"] = "0.3"
        self.var.cnv.info["MADL2R"] = "0.02"
        self.assertFalse(self.var.fails_mad_ratio())
        
        # check that var fails when MAD ratio < 10
        self.var.cnv.info["MEANLR2"] = "0.29"
        self.var.cnv.info["MADL2R"] = "0.03"
        self.assertTrue(self.var.fails_mad_ratio())
        
        # check that var passes when MAD ratio == 0
        self.var.cnv.info["MEANLR2"] = "0.3"
        self.var.cnv.info["MADL2R"] = float("inf")
        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())
        
        # check that var passes when the fields are NA
        self.var.cnv.info["MEANLR2"] = "0.2"
        self.var.cnv.info["MADL2R"] = "NA"
        self.assertFalse(self.var.fails_mad_ratio())
    
    def test_fails_wscore(self):
        """ test that fails_wscore() works correctly
        """
        
        # check that var passes when WSCORE > 0.45
        self.var.cnv.info["WSCORE"] = "0.45"
        self.assertFalse(self.var.fails_wscore())
        
        # check that var fails when WSCORE < 0.45
        self.var.cnv.info["WSCORE"] = "0.449"
        self.assertTrue(self.var.fails_wscore())
    
    def test_fails_callp(self):
        """ test that fails_callp() works correctly
        """
        
        # check that var passes when CALLP < 0.01
        self.var.cnv.info["CALLP"] = "0.0"
        self.assertFalse(self.var.fails_callp())
        
        # check that var passes when CALLP == 0.01
        self.var.cnv.info["CALLP"] = "0.01"
        self.assertFalse(self.var.fails_callp())
        
        # check that var fails when CALLP > 0.01
        self.var.cnv.info["CALLP"] = "0.0101"
        self.assertTrue(self.var.fails_callp())
    
    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_mean_lr2_dup(self):
        """ test that fails_mean_lr2() works correctly on duplications
        """
        
        # set the var as a duplication
        self.var.cnv.alt_alleles = ["<DUP>"]
        self.var.cnv.set_genotype()
        
        # check that dup passes with MEANLR2 > 0.4
        self.var.cnv.info["MEANLR2"] = "0.4"
        self.assertFalse(self.var.fails_meanlr2())
        
        # check that dup passes with MEANLR2 < 0.4
        self.var.cnv.info["MEANLR2"] = "0.399"
        self.assertTrue(self.var.fails_meanlr2())
    
    def test_fails_mean_lr2_del(self):
        """ test that fails_mean_lr2() works correctly on deletions
        """
        # set the var as a deletion
        self.var.cnv.alt_alleles = ["<DEL>"]
        self.var.cnv.set_genotype()
        
        # check that del passes with MEANLR2 < -0.5
        self.var.cnv.info["MEANLR2"] = "-0.5"
        self.assertFalse(self.var.fails_meanlr2())
        
        # check that del fails with MEANLR2 > -0.41
        self.var.cnv.info["MEANLR2"] = "-0.499"
        self.assertTrue(self.var.fails_meanlr2())
    
    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_frequency(self):
        """ test that fails_frequency() works correctly
        """
        
        # a low population frequency will pass
        self.var.cnv.info["ACGH_RC_FREQ50"] = "0.01"
        self.assertFalse(self.var.fails_frequency())
        
        # a high population frequency will fail
        self.var.cnv.info["ACGH_RC_FREQ50"] = "0.011"
        self.assertTrue(self.var.fails_frequency())
        
        # if population frequency information is unavailable, it should pass,
        # since this suggests the frequency is 0.
        del self.var.cnv.info["ACGH_RC_FREQ50"]
        self.assertFalse(self.var.fails_frequency())
    
    def test_fails_cifer_inh(self):
        """ test that fails_cifer_inh() works correctly
        """
        
        # CNVs annotated as not_inherited, or inherited will pass
        self.var.cnv.format["CIFER_INHERITANCE"] = "not_inherited"
        self.assertFalse(self.var.fails_cifer_inh())
        
        # CNVs annotated as false_positive will fail
        self.var.cnv.format["CIFER_INHERITANCE"] = "false_positive"
        self.assertTrue(self.var.fails_cifer_inh())
class TestAcghCnvPy(unittest.TestCase):
    """ test the ACGH CNV filters
    """
    def setUp(self):
        """ define a default VcfInfo object
        """

        chrom = "1"
        pos = "15000000"
        snp_id = "."
        ref = "A"
        alt = "<DUP>"
        filt = "PASS"

        # set up a SNV object, since SNV inherits VcfInfo
        cnv = CNV(chrom, pos, snp_id, ref, alt, filt)
        self.var = ACGH_CNV(cnv)

        info = "HGNC=TEST;HGNC_ALL=TEST,OR5A1;CQ=missense_variant;CNSOLIDATE;WSCORE=0.5;CALLP=0.000;COMMONFORWARDS=0.000;MEANLR2=0.5;MADL2R=0.02;END=16000000;SVLEN=1000000"
        format_keys = "inheritance:DP"
        sample_values = "deNovo:50"

        self.var.cnv.add_info(info)
        self.var.cnv.add_format(format_keys, sample_values)
        self.var.cnv.set_gender("F")

    def test_fails_mad_ratio(self):
        """ test that fails_mad_ratio() works correctly
        """

        # check that var passes when MAD ratio > 15
        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 == 15
        self.var.cnv.info["MEANLR2"] = "0.3"
        self.var.cnv.info["MADL2R"] = "0.02"
        self.assertFalse(self.var.fails_mad_ratio())

        # check that var fails when MAD ratio < 15
        self.var.cnv.info["MEANLR2"] = "0.2"
        self.var.cnv.info["MADL2R"] = "0.02"
        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_wscore(self):
        """ test that fails_wscore() works correctly
        """

        # check that var passes when WSCORE > 0.4
        self.var.cnv.info["WSCORE"] = "0.5"
        self.assertFalse(self.var.fails_wscore())

        # check that var passes when WSCORE == 0.4
        self.var.cnv.info["WSCORE"] = "0.4"
        self.assertFalse(self.var.fails_wscore())

        # check that var fails when WSCORE > 0.4
        self.var.cnv.info["WSCORE"] = "0.399"
        self.assertTrue(self.var.fails_wscore())

    def test_fails_callp(self):
        """ test that fails_callp() works correctly
        """

        # check that var passes when CALLP < 0.01
        self.var.cnv.info["CALLP"] = "0.0"
        self.assertFalse(self.var.fails_callp())

        # check that var passes when CALLP == 0.01
        self.var.cnv.info["CALLP"] = "0.01"
        self.assertFalse(self.var.fails_callp())

        # check that var fails when CALLP > 0.01
        self.var.cnv.info["CALLP"] = "0.0101"
        self.assertTrue(self.var.fails_callp())

    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_mean_lr2_dup(self):
        """ test that fails_mean_lr2() works correctly on duplications
        """

        # set the var as a duplication
        self.var.cnv.alt_allele = "<DUP>"
        self.var.cnv.set_genotype()

        # check that dup passes with MEANLR2 > 0.36
        self.var.cnv.info["MEANLR2"] = "0.4"
        self.assertFalse(self.var.fails_meanlr2())

        # check that dup passes with MEANLR2 == 0.36
        self.var.cnv.info["MEANLR2"] = "0.36"
        self.assertFalse(self.var.fails_meanlr2())

        # check that dup passes with MEANLR2 < 0.36
        self.var.cnv.info["MEANLR2"] = "0.359"
        self.assertTrue(self.var.fails_meanlr2())

    def test_fails_mean_lr2_del(self):
        """ test that fails_mean_lr2() works correctly on deletions
        """
        # set the var as a deletion
        self.var.cnv.alt_allele = "<DEL>"
        self.var.cnv.set_genotype()

        # check that del passes with MEANLR2 < -0.41
        self.var.cnv.info["MEANLR2"] = "-0.5"
        self.assertFalse(self.var.fails_meanlr2())

        # check that del passes with MEANLR2 == -0.41
        self.var.cnv.info["MEANLR2"] = "-0.41"
        self.assertFalse(self.var.fails_meanlr2())

        # check that del passes with MEANLR2 > -0.41
        self.var.cnv.info["MEANLR2"] = "-0.409"
        self.assertTrue(self.var.fails_meanlr2())

    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())
class TestAcghCnvPy(unittest.TestCase):
    """ test the ACGH CNV filters
    """
    def setUp(self):
        """ define a default VcfInfo object
        """

        chrom = "1"
        pos = "15000000"
        snp_id = "."
        ref = "A"
        alt = "<DUP>"
        filt = "PASS"

        # set up a SNV object, since SNV inherits VcfInfo
        cnv = CNV(chrom, pos, snp_id, ref, alt, filt)
        self.var = ACGH_CNV(cnv)

        info = "HGNC=TEST;HGNC_ALL=TEST,OR5A1;CQ=missense_variant;CNSOLIDATE;WSCORE=0.5;CALLP=0.000;COMMONFORWARDS=0.000;MEANLR2=0.5;MADL2R=0.02;END=16000000;SVLEN=1000000"
        format_keys = "inheritance:DP"
        sample_values = "deNovo:50"

        self.var.cnv.add_info(info)
        self.var.cnv.add_format(format_keys, sample_values)
        self.var.cnv.set_gender("F")

    def test_fails_mad_ratio(self):
        """ test that fails_mad_ratio() works correctly.
        """

        # check that var passes when MAD ratio > 0
        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 == 0
        self.var.cnv.info["MEANLR2"] = "0.3"
        self.var.cnv.info["MADL2R"] = float("inf")
        self.assertFalse(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_wscore(self):
        """ test that fails_wscore() works correctly
        """

        # check that var passes when WSCORE > 0.4
        self.var.cnv.info["WSCORE"] = "0.5"
        self.assertFalse(self.var.fails_wscore())

        # check that var passes when WSCORE == 0.4
        self.var.cnv.info["WSCORE"] = "0.4"
        self.assertFalse(self.var.fails_wscore())

        # check that var fails when WSCORE > 0.4
        self.var.cnv.info["WSCORE"] = "0.399"
        self.assertTrue(self.var.fails_wscore())

    def test_fails_callp(self):
        """ test that fails_callp() works correctly
        """

        # check that var passes when CALLP < 0.01
        self.var.cnv.info["CALLP"] = "0.0"
        self.assertFalse(self.var.fails_callp())

        # check that var passes when CALLP == 0.01
        self.var.cnv.info["CALLP"] = "0.01"
        self.assertFalse(self.var.fails_callp())

        # check that var fails when CALLP > 0.01
        self.var.cnv.info["CALLP"] = "0.0101"
        self.assertTrue(self.var.fails_callp())

    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_mean_lr2_dup(self):
        """ test that fails_mean_lr2() works correctly on duplications
        """

        # set the var as a duplication
        self.var.cnv.alt_allele = "<DUP>"
        self.var.cnv.set_genotype()

        # check that dup passes with MEANLR2 > 0.36
        self.var.cnv.info["MEANLR2"] = "0.4"
        self.assertFalse(self.var.fails_meanlr2())

        # check that dup passes with MEANLR2 == 0.36
        self.var.cnv.info["MEANLR2"] = "0.36"
        self.assertFalse(self.var.fails_meanlr2())

        # check that dup passes with MEANLR2 < 0.36
        self.var.cnv.info["MEANLR2"] = "0.359"
        self.assertTrue(self.var.fails_meanlr2())

    def test_fails_mean_lr2_del(self):
        """ test that fails_mean_lr2() works correctly on deletions
        """
        # set the var as a deletion
        self.var.cnv.alt_allele = "<DEL>"
        self.var.cnv.set_genotype()

        # check that del passes with MEANLR2 < -0.41
        self.var.cnv.info["MEANLR2"] = "-0.5"
        self.assertFalse(self.var.fails_meanlr2())

        # check that del passes with MEANLR2 == -0.41
        self.var.cnv.info["MEANLR2"] = "-0.41"
        self.assertFalse(self.var.fails_meanlr2())

        # check that del passes with MEANLR2 > -0.41
        self.var.cnv.info["MEANLR2"] = "-0.409"
        self.assertTrue(self.var.fails_meanlr2())

    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_frequency(self):
        """ test that fails_frequency() works correctly
        """

        # a low population frequency will pass
        self.var.cnv.info["ACGH_RC_FREQ50"] = "0.01"
        self.assertFalse(self.var.fails_frequency())

        # a high population frequency will fail
        self.var.cnv.info["ACGH_RC_FREQ50"] = "0.011"
        self.assertTrue(self.var.fails_frequency())

        # if population frequency information is unavailable, it should pass,
        # since this suggests the frequency is 0.
        del self.var.cnv.info["ACGH_RC_FREQ50"]
        self.assertFalse(self.var.fails_frequency())

    def test_fails_cifer_inh(self):
        """ test that fails_cifer_inh() works correctly
        """

        # CNVs annotated as not_inherited, or inherited will pass
        self.var.cnv.format["CIFER_INHERITANCE"] = "not_inherited"
        self.assertFalse(self.var.fails_cifer_inh())

        # CNVs annotated as false_positive will fail
        self.var.cnv.format["CIFER_INHERITANCE"] = "false_positive"
        self.assertTrue(self.var.fails_cifer_inh())
class TestAcghCnvPy(unittest.TestCase):
    """ test the ACGH CNV filters
    """
    def setUp(self):
        """ define a default VcfInfo object
        """

        extra = 'OR5A1;CNSOLIDATE;WSCORE=0.5;CALLP=0.000;COMMONFORWARDS=0.000;MEANLR2=0.5;MADL2R=0.02;'
        cnv = create_cnv('F', 'deNovo', extra_info=extra)

        self.var = ACGH_CNV(cnv)

    def test_fails_mad_ratio(self):
        """ test that fails_mad_ratio() works correctly.
        """

        # check that var passes when MAD ratio >= 15
        self.var.cnv.info["MEANLR2"] = "0.3"
        self.var.cnv.info["MADL2R"] = "0.02"
        self.assertFalse(self.var.fails_mad_ratio())

        # check that var fails when MAD ratio < 10
        self.var.cnv.info["MEANLR2"] = "0.29"
        self.var.cnv.info["MADL2R"] = "0.03"
        self.assertTrue(self.var.fails_mad_ratio())

        # check that var passes when MAD ratio == 0
        self.var.cnv.info["MEANLR2"] = "0.3"
        self.var.cnv.info["MADL2R"] = float("inf")
        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())

        # check that var passes when the fields are NA
        self.var.cnv.info["MEANLR2"] = "0.2"
        self.var.cnv.info["MADL2R"] = "NA"
        self.assertFalse(self.var.fails_mad_ratio())

    def test_fails_wscore(self):
        """ test that fails_wscore() works correctly
        """

        # check that var passes when WSCORE > 0.45
        self.var.cnv.info["WSCORE"] = "0.45"
        self.assertFalse(self.var.fails_wscore())

        # check that var fails when WSCORE < 0.45
        self.var.cnv.info["WSCORE"] = "0.449"
        self.assertTrue(self.var.fails_wscore())

    def test_fails_callp(self):
        """ test that fails_callp() works correctly
        """

        # check that var passes when CALLP < 0.01
        self.var.cnv.info["CALLP"] = "0.0"
        self.assertFalse(self.var.fails_callp())

        # check that var passes when CALLP == 0.01
        self.var.cnv.info["CALLP"] = "0.01"
        self.assertFalse(self.var.fails_callp())

        # check that var fails when CALLP > 0.01
        self.var.cnv.info["CALLP"] = "0.0101"
        self.assertTrue(self.var.fails_callp())

    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_mean_lr2_dup(self):
        """ test that fails_mean_lr2() works correctly on duplications
        """

        # set the var as a duplication
        self.var.cnv.alt_alleles = ["<DUP>"]
        self.var.cnv.set_genotype()

        # check that dup passes with MEANLR2 > 0.4
        self.var.cnv.info["MEANLR2"] = "0.4"
        self.assertFalse(self.var.fails_meanlr2())

        # check that dup passes with MEANLR2 < 0.4
        self.var.cnv.info["MEANLR2"] = "0.399"
        self.assertTrue(self.var.fails_meanlr2())

    def test_fails_mean_lr2_del(self):
        """ test that fails_mean_lr2() works correctly on deletions
        """
        # set the var as a deletion
        self.var.cnv.alt_alleles = ["<DEL>"]
        self.var.cnv.set_genotype()

        # check that del passes with MEANLR2 < -0.5
        self.var.cnv.info["MEANLR2"] = "-0.5"
        self.assertFalse(self.var.fails_meanlr2())

        # check that del fails with MEANLR2 > -0.41
        self.var.cnv.info["MEANLR2"] = "-0.499"
        self.assertTrue(self.var.fails_meanlr2())

    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_frequency(self):
        """ test that fails_frequency() works correctly
        """

        # a low population frequency will pass
        self.var.cnv.info["ACGH_RC_FREQ50"] = "0.01"
        self.assertFalse(self.var.fails_frequency())

        # a high population frequency will fail
        self.var.cnv.info["ACGH_RC_FREQ50"] = "0.011"
        self.assertTrue(self.var.fails_frequency())

        # if population frequency information is unavailable, it should pass,
        # since this suggests the frequency is 0.
        del self.var.cnv.info["ACGH_RC_FREQ50"]
        self.assertFalse(self.var.fails_frequency())

    def test_fails_cifer_inh(self):
        """ test that fails_cifer_inh() works correctly
        """

        # CNVs annotated as not_inherited, or inherited will pass
        self.var.cnv.format["CIFER_INHERITANCE"] = "not_inherited"
        self.assertFalse(self.var.fails_cifer_inh())

        # CNVs annotated as false_positive will fail
        self.var.cnv.format["CIFER_INHERITANCE"] = "false_positive"
        self.assertTrue(self.var.fails_cifer_inh())