예제 #1
0
    def from_family(family: Family, add_missing_members=True):

        family_connections = FamilyConnections.from_family(
            family, add_missing_members=add_missing_members
        )

        if not family_connections:
            return [Layout._handle_broken_family_connections(family)]

        if family_connections.is_connected():
            logger.debug(
                f"building layout for connected family: {family.family_id}")
            return [Layout._build_family_layout(family, family_connections)]

        layouts = []
        for component in family_connections.connected_components():
            members = [
                m for m in family.full_members
                if m.person_id in component
            ]
            fam = Family.from_persons(members)
            fc = FamilyConnections.from_family(fam)
            # assert fc.is_connected(), fam.family_id
            layouts.append(Layout._build_family_layout(fam, fc))

        x_offset = 0.0
        for layout in layouts:
            layout.translate(x_offset, 0.0)
            bbox = layout.get_bbox()
            x_offset = bbox.max_x + IndividualWithCoordinates.SIZE + 4.0
        return layouts
예제 #2
0
    def produce_genotype(
        chrom: str,
        pos: int,
        genome: Genome,
        family: Family,
        members_with_variant: List[str],
    ) -> np.array:
        # TODO Add support for multiallelic variants
        # This method currently assumes biallelic variants

        genotype = np.zeros(shape=(2, len(family)), dtype=GENOTYPE_TYPE)

        for person_id, person in family.persons.items():

            index = family.members_index([person_id])
            has_variant = int(person_id in members_with_variant)

            ploidy = get_locus_ploidy(chrom, pos, person.sex, genome)

            if ploidy == 2:
                genotype[1, index] = has_variant
            else:
                genotype[0, index] = has_variant
                genotype[1, index] = -2  # signifies haploid genotype

        return genotype
예제 #3
0
 def _build_families(self):
     families = dict()
     families_details = self.rest_client.get_all_family_details(
         self._remote_study_id)
     for family in families_details:
         family_id = family["family_id"]
         person_jsons = family["members"]
         family_members = []
         for person_json in person_jsons:
             family_members.append(Person(**person_json))
         families[family_id] = Family.from_persons(family_members)
     self._families = FamiliesData.from_families(families)
예제 #4
0
def test_families_data_families_by_type(quad_persons,
                                        multigenerational_persons,
                                        simplex_persons, multiplex_persons):
    families_data = FamiliesData.from_families({
        "trio_family":
        Family.from_persons(trio_persons()),
        "quad_family":
        Family.from_persons(quad_persons),
        "multigenerational_family":
        Family.from_persons(multigenerational_persons),
        "simplex_family":
        Family.from_persons(simplex_persons),
        "multiplex_family":
        Family.from_persons(multiplex_persons),
    })
    assert families_data.families_by_type == {
        FamilyType.QUAD: {"quad_family"},
        FamilyType.TRIO: {"trio_family"},
        FamilyType.MULTIGENERATIONAL: {"multigenerational_family"},
        FamilyType.SIMPLEX: {"simplex_family"},
        FamilyType.MULTIPLEX: {"multiplex_family"},
    }
예제 #5
0
def test_family_type_multigenerational(role):
    persons = list(trio_persons("multigenerational"))
    persons.append(
        Person(
            **{
                "family_id": "multigenerational",
                "person_id": "grandparent",
                "sex": "U",
                "role": str(role),
                "status": 1
            }))
    family = Family.from_persons(persons)
    assert family.family_type is FamilyType.MULTIGENERATIONAL
예제 #6
0
def family3(member7):
    return Family.from_persons([member7])
예제 #7
0
def family2(member4, member5, member6):
    return Family.from_persons([member4, member5, member6])
예제 #8
0
def family1(member1, member2, member3):
    return Family.from_persons([member1, member2, member3])
예제 #9
0
def test_family_type_multiplex(multiplex_persons):
    family = Family.from_persons(multiplex_persons)
    assert family.family_type is FamilyType.MULTIPLEX
예제 #10
0
def test_family_type_simplex_2(simplex_persons_2):
    family = Family.from_persons(simplex_persons_2)
    assert family.family_type is FamilyType.SIMPLEX
예제 #11
0
def test_family_type_quad(quad_persons):
    family = Family.from_persons(quad_persons)
    assert family.family_type is FamilyType.QUAD
예제 #12
0
def test_family_type_trio():
    family = Family.from_persons(trio_persons())
    assert family.family_type is FamilyType.TRIO