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
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
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']]
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
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