コード例 #1
0
def _get_saved_variants(variants, families, include_discovery_tags=False):
    variants = _flatten_variants(variants)

    prefetch_related_objects(families, 'project')
    hg37_family_guids = {family.guid for family in families if family.project.genome_version == GENOME_VERSION_GRCh37}

    variant_q = Q()
    variants_by_id = {}
    for variant in variants:
        variants_by_id[get_variant_key(**variant)] = variant
        variant_q |= Q(variant_id=variant['variantId'], family__guid__in=variant['familyGuids'])
        if variant['liftedOverGenomeVersion'] == GENOME_VERSION_GRCh37 and hg37_family_guids:
            variant_hg37_families = [family_guid for family_guid in variant['familyGuids'] if family_guid in hg37_family_guids]
            if variant_hg37_families:
                lifted_xpos = get_xpos(variant['liftedOverChrom'], variant['liftedOverPos'])
                variant_q |= Q(xpos=lifted_xpos, ref=variant['ref'], alt=variant['alt'], family__guid__in=variant_hg37_families)
                variants_by_id[get_variant_key(
                    xpos=lifted_xpos, ref=variant['ref'], alt=variant['alt'], genomeVersion=variant['liftedOverGenomeVersion']
                )] = variant

    saved_variants = SavedVariant.objects.filter(variant_q)

    json = get_json_for_saved_variants_with_tags(saved_variants, add_details=True)

    discovery_tags = {}
    if include_discovery_tags:
        discovery_tags, discovery_response = get_json_for_discovery_tags(variants)
        json.update(discovery_response)

    variants_to_saved_variants = {}
    for saved_variant in json['savedVariantsByGuid'].values():
        family_guids = saved_variant['familyGuids']
        searched_variant = variants_by_id.get(get_variant_key(**saved_variant))
        if not searched_variant:
            # This can occur when an hg38 family has a saved variant that did not successfully lift from hg37
            continue
        saved_variant.update(searched_variant)
        #  For saved variants only use family it was saved for, not all families in search
        saved_variant['familyGuids'] = family_guids
        json['savedVariantsByGuid'][saved_variant['variantGuid']] = saved_variant
        if searched_variant['variantId'] not in variants_to_saved_variants:
            variants_to_saved_variants[searched_variant['variantId']] = {}
        for family_guid in family_guids:
            variants_to_saved_variants[searched_variant['variantId']][family_guid] = saved_variant['variantGuid']

    for variant_id, tags in discovery_tags.items():
        searched_variant = variants_by_id.get(variant_id)
        if searched_variant:
            if not searched_variant.get('discoveryTags'):
                searched_variant['discoveryTags'] = []
            searched_variant['discoveryTags'] += [
                tag for tag in tags if tag['savedVariant']['familyGuid'] not in searched_variant['familyGuids']]

    return json, variants_to_saved_variants
コード例 #2
0
def _add_discovery_tags(variants, discovery_tags):
    for variant in variants:
        tags = discovery_tags.get(get_variant_key(**variant))
        if tags:
            if not variant.get('discoveryTags'):
                variant['discoveryTags'] = []
            variant['discoveryTags'] += tags
コード例 #3
0
ファイル: saved_variant_api.py プロジェクト: gokalpcelik/seqr
def _add_discovery_tags(variants, discovery_tags):
    for variant in variants:
        tags = discovery_tags.get(get_variant_key(**variant))
        if tags:
            if not variant.get('discoveryTags'):
                variant['discoveryTags'] = []
            variant['discoveryTags'] += [tag for tag in tags if tag['savedVariant']['familyGuid'] not in variant['familyGuids']]
コード例 #4
0
def get_json_for_discovery_tags(variants):
    from seqr.views.utils.variant_utils import get_variant_key
    response = {}
    discovery_tags = defaultdict(list)

    tag_models = VariantTag.objects.filter(
        variant_tag_type__category='CMG Discovery Tags',
        saved_variants__variant_id__in={
            variant['variantId']
            for variant in variants
        },
        saved_variants__family__project__projectcategory__name=
        ANALYST_PROJECT_CATEGORY,
    )
    if tag_models:
        discovery_tag_json = get_json_for_variant_tags(tag_models,
                                                       add_variant_guids=False)

        tag_id_map = {tag.guid: tag.id for tag in tag_models}
        variant_tag_id_map = defaultdict(list)
        variant_ids = set()
        for tag_mapping in VariantTag.saved_variants.through.objects.filter(
                varianttag_id__in=tag_id_map.values()):
            variant_tag_id_map[tag_mapping.varianttag_id].append(
                tag_mapping.savedvariant_id)
            variant_ids.add(tag_mapping.savedvariant_id)
        saved_variants_by_id = {
            var.id: var
            for var in SavedVariant.objects.filter(id__in=variant_ids).only(
                'guid', 'ref', 'alt', 'xpos', 'family_id').prefetch_related(
                    'family', 'family__project')
        }

        existing_families = set()
        for variant in variants:
            existing_families.update(variant['familyGuids'])

        families = set()
        for tag in discovery_tag_json:
            for variant_id in variant_tag_id_map[tag_id_map[tag['tagGuid']]]:
                variant = saved_variants_by_id[variant_id]
                if variant.family.guid not in existing_families:
                    families.add(variant.family)
                tag_json = {
                    'savedVariant': {
                        'variantGuid': variant.guid,
                        'familyGuid': variant.family.guid,
                        'projectGuid': variant.family.project.guid,
                    }
                }
                tag_json.update(tag)
                variant_key = get_variant_key(
                    genomeVersion=variant.family.project.genome_version,
                    xpos=variant.xpos,
                    ref=variant.ref,
                    alt=variant.alt,
                )
                discovery_tags[variant_key].append(tag_json)

        response['familiesByGuid'] = {
            f['familyGuid']: f
            for f in _get_json_for_families(list(families))
        }
    return discovery_tags, response
コード例 #5
0
ファイル: orm_to_json_utils.py プロジェクト: uwgsit/seqr
def get_json_for_saved_variants_with_tags(saved_variants,
                                          include_missing_variants=False,
                                          discovery_tags_query=None,
                                          **kwargs):

    variants_by_guid = {
        variant['variantGuid']: dict(tagGuids=[],
                                     functionalDataGuids=[],
                                     noteGuids=[],
                                     **variant)
        for variant in get_json_for_saved_variants(saved_variants, **kwargs)
    }

    missing_ids = set()
    saved_variant_id_map = {var.id: var.guid for var in saved_variants}

    variant_tag_id_map = defaultdict(list)
    for tag_mapping in VariantTag.saved_variants.through.objects.filter(
            savedvariant_id__in=saved_variant_id_map.keys()):
        variant_tag_id_map[tag_mapping.varianttag_id].append(
            tag_mapping.savedvariant_id)
    tag_models = VariantTag.objects.filter(id__in=variant_tag_id_map.keys())
    tag_id_map = {tag.guid: tag.id for tag in tag_models}

    tags = get_json_for_variant_tags(tag_models, add_variant_guids=False)
    for tag in tags:
        tag_guid = tag['tagGuid']
        tag['variantGuids'] = []
        variant_ids = variant_tag_id_map[tag_id_map[tag_guid]]
        for variant_id in variant_ids:
            variant_guid = saved_variant_id_map.get(variant_id)
            if variant_guid:
                variants_by_guid[variant_guid]['tagGuids'].append(
                    tag['tagGuid'])
                tag['variantGuids'].append(variant_guid)
            else:
                missing_ids.add(variant_id)

    variant_functional_id_map = defaultdict(list)
    for functional_mapping in VariantFunctionalData.saved_variants.through.objects.filter(
            savedvariant_id__in=saved_variant_id_map.keys()):
        variant_functional_id_map[
            functional_mapping.variantfunctionaldata_id].append(
                functional_mapping.savedvariant_id)
    functional_models = VariantFunctionalData.objects.filter(
        id__in=variant_functional_id_map.keys())
    functional_id_map = {tag.guid: tag.id for tag in functional_models}

    functional_data = get_json_for_variant_functional_data_tags(
        functional_models, add_variant_guids=False)
    for tag in functional_data:
        tag_guid = tag['tagGuid']
        tag['variantGuids'] = []
        variant_ids = variant_functional_id_map[functional_id_map[tag_guid]]
        for variant_id in variant_ids:
            variant_guid = saved_variant_id_map.get(variant_id)
            if variant_guid:
                variants_by_guid[variant_guid]['functionalDataGuids'].append(
                    tag['tagGuid'])
                tag['variantGuids'].append(variant_guid)
            else:
                missing_ids.add(variant_id)

    variant_note_id_map = defaultdict(list)
    for note_mapping in VariantNote.saved_variants.through.objects.filter(
            savedvariant_id__in=saved_variant_id_map.keys()):
        variant_note_id_map[note_mapping.variantnote_id].append(
            note_mapping.savedvariant_id)
    note_models = VariantNote.objects.filter(id__in=variant_note_id_map.keys())
    note_id_map = {note.guid: note.id for note in note_models}

    notes = get_json_for_variant_notes(note_models, add_variant_guids=False)
    for note in notes:
        note_guid = note['noteGuid']
        note['variantGuids'] = []
        variant_ids = variant_note_id_map[note_id_map[note_guid]]
        for variant_id in variant_ids:
            variant_guid = saved_variant_id_map.get(variant_id)
            if variant_guid:
                variants_by_guid[variant_guid]['noteGuids'].append(
                    note['noteGuid'])
                note['variantGuids'].append(variant_guid)
            else:
                missing_ids.add(variant_id)

    if include_missing_variants and missing_ids:
        variants_by_guid.update({
            variant['variantGuid']: dict(tagGuids=[],
                                         functionalDataGuids=[],
                                         noteGuids=[],
                                         **variant)
            for variant in get_json_for_saved_variants(
                SavedVariant.objects.filter(id__in=missing_ids), **kwargs)
        })

    response = {
        'variantTagsByGuid': {tag['tagGuid']: tag
                              for tag in tags},
        'variantNotesByGuid': {note['noteGuid']: note
                               for note in notes},
        'variantFunctionalDataByGuid':
        {tag['tagGuid']: tag
         for tag in functional_data},
        'savedVariantsByGuid': variants_by_guid,
    }

    if discovery_tags_query:
        from seqr.views.utils.variant_utils import get_variant_key

        discovery_saved_variant_by_guid = {
            var.guid: var
            for var in SavedVariant.objects.filter(discovery_tags_query).
            prefetch_related('family', 'family__project')
        }
        discovery_tags = get_json_for_variant_tags(
            VariantTag.objects.filter(
                variant_tag_type__category='CMG Discovery Tags',
                saved_variants__in=discovery_saved_variant_by_guid.values()))
        if discovery_tags:
            families = set()
            response['discoveryTags'] = defaultdict(list)
            for tag in discovery_tags:
                for variant_guid in tag.pop('variantGuids'):
                    variant = discovery_saved_variant_by_guid.get(variant_guid)
                    if variant:
                        families.add(variant.family)
                        tag_json = {
                            'savedVariant': {
                                'variantGuid': variant.guid,
                                'familyGuid': variant.family.guid,
                                'projectGuid': variant.family.project.guid,
                            }
                        }
                        tag_json.update(tag)
                        variant_key = get_variant_key(
                            genomeVersion=variant.family.project.
                            genome_version,
                            xpos=variant.xpos,
                            ref=variant.ref,
                            alt=variant.alt,
                        )
                        response['discoveryTags'][variant_key].append(tag_json)
            response['familiesByGuid'] = {
                f['familyGuid']: f
                for f in _get_json_for_families(list(families))
            }

    return response