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
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
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)
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"}, }
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
def family3(member7): return Family.from_persons([member7])
def family2(member4, member5, member6): return Family.from_persons([member4, member5, member6])
def family1(member1, member2, member3): return Family.from_persons([member1, member2, member3])
def test_family_type_multiplex(multiplex_persons): family = Family.from_persons(multiplex_persons) assert family.family_type is FamilyType.MULTIPLEX
def test_family_type_simplex_2(simplex_persons_2): family = Family.from_persons(simplex_persons_2) assert family.family_type is FamilyType.SIMPLEX
def test_family_type_quad(quad_persons): family = Family.from_persons(quad_persons) assert family.family_type is FamilyType.QUAD
def test_family_type_trio(): family = Family.from_persons(trio_persons()) assert family.family_type is FamilyType.TRIO