Beispiel #1
0
def test_one_object():
    """Test if generate pairs behave as suspected"""
    objects = [1]
    pairs = []
    with pytest.raises(SyntaxError):
        for pair in generate_pairs(objects):
            pairs.append(pair)
def test_one_object():
    """Test if generate pairs behave as suspected"""
    objects = [1]
    pairs = []
    with pytest.raises(SyntaxError):
        for pair in generate_pairs(objects):
            pairs.append(pair)
Beispiel #3
0
def test_generate_pairs():
    """Test if generate pairs behave as suspected"""
    objects = [1,2]
    pairs = []
    for pair in generate_pairs(objects):
        pairs.append(pair)
    
    assert pairs == [(1,2)]
def test_generate_pairs():
    """Test if generate pairs behave as suspected"""
    objects = [1, 2]
    pairs = []
    for pair in generate_pairs(objects):
        pairs.append(pair)

    assert pairs == [(1, 2)]
Beispiel #5
0
def test_generate_multiple_pairs():
    """Test if generate pairs behave as suspected"""
    objects = [1,2,3,4]
    pairs = []
    for pair in generate_pairs(objects):
        pairs.append(pair)
    
    assert len(pairs) == 6
    assert pairs[0] == (1,2)
    assert pairs[1] == (1,3)
    assert pairs[-1] == (3,4)
def test_generate_multiple_pairs():
    """Test if generate pairs behave as suspected"""
    objects = [1, 2, 3, 4]
    pairs = []
    for pair in generate_pairs(objects):
        pairs.append(pair)

    assert len(pairs) == 6
    assert pairs[0] == (1, 2)
    assert pairs[1] == (1, 3)
    assert pairs[-1] == (3, 4)
Beispiel #7
0
def check_genetic_models(variant_batch, families, phased = False, 
                         strict = False):
    """
    Check and annotate which genetic models that are followed for the variants 
    in a batch
    
    See more description in header of file or documentation.
    
    Arguments:
        variant_batch (dict): A dictionary with variant ids as keys and variant
                              dictionaries as values
        families (dict): A dictionary with family ids as keys and Family 
                        objects as values
        phased (bool): If the variants are phased
        strict (bool): If the strict mode should be used when checking the 
                       genetic models
        
    """
    # A variant batch is a dictionary on the form 
    # {variant_id:variant_dict, variant_2_id:variant_dict_2, ...}
    logger = logging.getLogger(__name__)
    intervals = variant_batch.pop('haploblocks', {})
    
    # We check the genetic models for one family at a time
    for family_id in families:
        logger.debug("Checking genetic models for family {0}".format(
            family_id
        ))
        family = families[family_id]
        individuals = family.individuals
        
        compound_candidates = []
        compound_pairs = []
        
        for variant_id in variant_batch:
            inheritance_models = {
                'XR' : False,
                'XR_dn' : False,
                'XD' : False,
                'XD_dn' : False,
                'AD' : False,
                'AD_dn' : False,
                'AR_hom' : False,
                'AR_hom_dn' : False,
                'AR_comp' : False,
                'AR_comp_dn' : False
            }
            
            variant = variant_batch[variant_id]
            # save the compound pairs for a variant in a set
            if 'compounds' in variant:
                variant['compounds'][family_id] = set()
            else:
                variant['compounds'] = {family_id : set()}
            
            # Add information of models followed:
            if 'inheritance_models' in variant:
                variant['inheritance_models'][family_id] = inheritance_models
            else:
                variant['inheritance_models'] = {family_id: inheritance_models}
                
                
            # If the variant is in a genetic region we check for compound 
            # candidates
            if variant.get('compound_candidate',True):
                
                if check_compound_candidate(variant, family, strict):
                    compound_candidates.append(variant_id)
            
            # Only check X-linked for the variants in the X-chromosome:
            # For X-linked we do not need to check the other models
            if variant['CHROM'] == 'X':
                if check_X_recessive(variant, family, strict):
                    variant['inheritance_models'][family_id]['XR'] = True
                    for individual_id in individuals:
                        individual = individuals[individual_id]
                        if individual.has_parents:
                            check_parents(
                                'X_recessive', 
                                individual_id, 
                                family, 
                                variant
                            )
            
                if check_X_dominant(variant, family, strict):
                    variant['inheritance_models'][family_id]['XD'] = True
                    for individual_id in family.individuals:
                        individual = individuals[individual_id]
                        if individual.has_parents:
                            check_parents(
                                'X_dominant', 
                                individual_id, 
                                family, 
                                variant
                            )
            # If variant is not on X:
            else:
                # Check the dominant model:
                if check_dominant(variant, family, strict):
                    variant['inheritance_models'][family_id]['AD'] = True
                    for individual_id in individuals:
                        individual = individuals[individual_id]
                        if individual.has_parents:
                            check_parents(
                                'dominant', 
                                individual_id, 
                                family, 
                                variant
                            )
                
                # Check the recessive model:
                if check_recessive(variant, family, strict):
                    variant['inheritance_models'][family_id]['AR_hom'] = True
                    for individual_id in individuals:
                        individual = individuals[individual_id]
                        if individual.has_parents:
                            check_parents(
                                'recessive', 
                                individual_id, 
                                family, 
                                variant
                            )
            
        # Now check the compound models:
            
        if len(compound_candidates) > 1:
            for pair in generate_pairs(compound_candidates):
            # If the variants in the pair belong to the same gene we check for compounds:
                variant_1 = variant_batch[pair[0]]
                variant_2 = variant_batch[pair[1]]
                # Check that the pair is in the same feature:
                if variant_1['annotation'].intersection(variant_2['annotation']):
                    if len(individuals) == 1:
                        variant_1['compounds'][family_id].add(pair[1])
                        variant_2['compounds'][family_id].add(pair[0])
                        variant_1['inheritance_models'][family_id]['AR_comp'] = True
                        variant_2['inheritance_models'][family_id]['AR_comp'] = True
                # We know from check_compound_candidates that all variants are present in all affected
                    elif check_compounds(variant_1, variant_2, family, intervals, phased):
                        parents_found = False
                        for individual_id in individuals:
                            individual = individuals[individual_id]
                            if individual.has_parents:
                                check_parents('compound', individual_id, family, variant_1, variant_2)
                                parents_found = True
                        if not parents_found:
                            variant_1['inheritance_models'][family_id]['AR_comp'] = True
                            variant_2['inheritance_models'][family_id]['AR_comp'] = True
                                
                        variant_1['compounds'][family_id].add(pair[1])
                        variant_2['compounds'][family_id].add(pair[0])
    return
Beispiel #8
0
def check_genetic_models(variant_batch, families, phased=False, strict=False):
    """
    Check and annotate which genetic models that are followed for the variants 
    in a batch
    
    See more description in header of file or documentation.
    
    Arguments:
        variant_batch (dict): A dictionary with variant ids as keys and variant
                              dictionaries as values
        families (dict): A dictionary with family ids as keys and Family 
                        objects as values
        phased (bool): If the variants are phased
        strict (bool): If the strict mode should be used when checking the 
                       genetic models
        
    """
    # A variant batch is a dictionary on the form
    # {variant_id:variant_dict, variant_2_id:variant_dict_2, ...}
    logger = logging.getLogger(__name__)
    intervals = variant_batch.pop('haploblocks', {})

    # We check the genetic models for one family at a time
    for family_id in families:
        logger.debug(
            "Checking genetic models for family {0}".format(family_id))
        family = families[family_id]
        individuals = family.individuals

        compound_candidates = []
        compound_pairs = []

        for variant_id in variant_batch:
            inheritance_models = {
                'XR': False,
                'XR_dn': False,
                'XD': False,
                'XD_dn': False,
                'AD': False,
                'AD_dn': False,
                'AR_hom': False,
                'AR_hom_dn': False,
                'AR_comp': False,
                'AR_comp_dn': False
            }

            variant = variant_batch[variant_id]
            # save the compound pairs for a variant in a set
            if 'compounds' in variant:
                variant['compounds'][family_id] = set()
            else:
                variant['compounds'] = {family_id: set()}

            # Add information of models followed:
            if 'inheritance_models' in variant:
                variant['inheritance_models'][family_id] = inheritance_models
            else:
                variant['inheritance_models'] = {family_id: inheritance_models}

            # If the variant is in a genetic region we check for compound
            # candidates
            if variant.get('compound_candidate', True):

                if check_compound_candidate(variant, family, strict):
                    compound_candidates.append(variant_id)

            # Only check X-linked for the variants in the X-chromosome:
            # For X-linked we do not need to check the other models
            if variant['CHROM'] == 'X':
                if check_X_recessive(variant, family, strict):
                    variant['inheritance_models'][family_id]['XR'] = True
                    for individual_id in individuals:
                        individual = individuals[individual_id]
                        if individual.has_parents:
                            check_parents('X_recessive',
                                          individual_id,
                                          family,
                                          variant,
                                          strict=strict)

                if check_X_dominant(variant, family, strict):
                    variant['inheritance_models'][family_id]['XD'] = True
                    for individual_id in family.individuals:
                        individual = individuals[individual_id]
                        if individual.has_parents:
                            check_parents('X_dominant',
                                          individual_id,
                                          family,
                                          variant,
                                          strict=strict)
            # If variant is not on X:
            else:
                # Check the dominant model:
                if check_dominant(variant, family, strict):
                    variant['inheritance_models'][family_id]['AD'] = True
                    for individual_id in individuals:
                        individual = individuals[individual_id]
                        if individual.has_parents:
                            check_parents('dominant',
                                          individual_id,
                                          family,
                                          variant,
                                          strict=strict)

                # Check the recessive model:
                if check_recessive(variant, family, strict):
                    variant['inheritance_models'][family_id]['AR_hom'] = True
                    for individual_id in individuals:
                        individual = individuals[individual_id]
                        if individual.has_parents:
                            check_parents('recessive',
                                          individual_id,
                                          family,
                                          variant,
                                          strict=strict)

        # Now check the compound models:

        if len(compound_candidates) > 1:
            for pair in generate_pairs(compound_candidates):
                # If the variants in the pair belong to the same gene we check for compounds:
                variant_1 = variant_batch[pair[0]]
                variant_2 = variant_batch[pair[1]]
                # Check that the pair is in the same feature:
                if variant_1['annotation'].intersection(
                        variant_2['annotation']):
                    if len(individuals) == 1:
                        variant_1['compounds'][family_id].add(pair[1])
                        variant_2['compounds'][family_id].add(pair[0])
                        variant_1['inheritance_models'][family_id][
                            'AR_comp'] = True
                        variant_2['inheritance_models'][family_id][
                            'AR_comp'] = True
                # We know from check_compound_candidates that all variants are present in all affected
                    elif check_compounds(variant_1, variant_2, family,
                                         intervals, phased):
                        parents_found = False
                        for individual_id in individuals:
                            individual = individuals[individual_id]
                            if individual.has_parents:
                                check_parents(model='compound',
                                              individual_id=individual_id,
                                              family=family,
                                              variant=variant_1,
                                              variant_2=variant_2,
                                              strict=strict)
                                parents_found = True
                        if not parents_found:
                            variant_1['inheritance_models'][family_id][
                                'AR_comp'] = True
                            variant_2['inheritance_models'][family_id][
                                'AR_comp'] = True

                        if (variant_1['inheritance_models'][family_id]
                            ['AR_comp'] or variant_1['inheritance_models']
                            [family_id]['AR_comp_dn']):

                            variant_1['compounds'][family_id].add(pair[1])

                        if (variant_2['inheritance_models'][family_id]
                            ['AR_comp'] or variant_2['inheritance_models']
                            [family_id]['AR_comp_dn']):

                            variant_2['compounds'][family_id].add(pair[0])
    return