def get_variants_from_variant_tuples(project, variant_tuples, user=None): datastore = get_datastore(project) population_slugs = project.get_reference_population_slugs() variant_tuples_by_family_id = {} for xpos, ref, alt, family_id in variant_tuples: if family_id not in variant_tuples_by_family_id: variant_tuples_by_family_id[family_id] = [] variant_tuples_by_family_id[family_id].append((xpos, ref, alt)) variants = [] for family_id, variant_tuples in variant_tuples_by_family_id.items(): variants_for_family = datastore.get_multiple_variants( project.project_id, family_id, variant_tuples, user=user) for (xpos, ref, alt), variant in zip(variant_tuples, variants_for_family): if not variant: variant = Variant(xpos, ref, alt) get_annotator().annotate_variant(variant, population_slugs) variant.set_extra('created_variant', True) variant.set_extra('family_id', family_id) variant.set_extra('project_id', project.project_id) variants.append(variant) return variants
def get_variants_from_variant_tuples(project, variant_tuples): variants = [] for t in variant_tuples: variant = get_datastore(project.project_id).get_single_variant( project.project_id, t[3], t[0], t[1], t[2]) if not variant: variant = Variant(t[0], t[1], t[2]) get_annotator().annotate_variant( variant, project.get_reference_population_slugs()) variant.set_extra('family_id', t[3]) variant.set_extra('project_id', project.project_id) variants.append(variant) return variants
def get_variant(self, xpos, ref, alt): variant = Variant(xpos, ref, alt) self.annotate_variant(variant) return variant
def add_or_edit_variant_tags(request): family = None if 'family_id' in request.GET: project, family = get_project_and_family_for_user(request.user, request.GET) else: project = utils.get_project_for_user(request.user, request.GET) form = api_forms.VariantTagsForm(project, request.GET) if not form.is_valid(): ret = { 'is_error': True, 'error': server_utils.form_error_string(form) } return JSONResponse(ret) variant = get_datastore(project.project_id).get_single_variant( project.project_id, family.family_id, form.cleaned_data['xpos'], form.cleaned_data['ref'], form.cleaned_data['alt'], ) if not variant: variant = Variant(form.cleaned_data['xpos'], form.cleaned_data['ref'], form.cleaned_data['alt']) variant_tags_to_delete = { variant_tag.id: variant_tag for variant_tag in VariantTag.objects.filter( family=family, xpos=form.cleaned_data['xpos'], ref=form.cleaned_data['ref'], alt=form.cleaned_data['alt']) } project_tag_events = {} for project_tag in form.cleaned_data['project_tags']: # retrieve tags tag, created = VariantTag.objects.get_or_create( project_tag=project_tag, family=family, xpos=form.cleaned_data['xpos'], ref=form.cleaned_data['ref'], alt=form.cleaned_data['alt'], ) if not created: # this tag already exists so just keep it (eg. remove it from the set of tags that will be deleted) del variant_tags_to_delete[tag.id] continue # this a new tag, so update who saved it and when project_tag_events[project_tag] = "add_variant_tag" tag.user = request.user tag.date_saved = timezone.now() tag.search_url = form.cleaned_data['search_url'] tag.save() # delete the tags that are no longer checked. for variant_tag in variant_tags_to_delete.values(): project_tag_events[variant_tag.project_tag] = "delete_variant_tag" variant_tag.delete() # add the extra info after updating the tag info in the database, so that the new tag info is added to the variant JSON add_extra_info_to_variants_family(get_reference(), family, [variant,]) # log tag creation for project_tag, event_type in project_tag_events.items(): try: settings.EVENTS_COLLECTION.insert({ 'event_type': event_type, 'date': timezone.now(), 'project_id': ''.join(project.project_id), 'family_id': family.family_id, 'tag': project_tag.tag, 'title': project_tag.title, 'xpos':form.cleaned_data['xpos'], 'pos':variant.pos, 'chrom': variant.chr, 'ref':form.cleaned_data['ref'], 'alt':form.cleaned_data['alt'], 'gene_names': ", ".join(variant.extras['gene_names'].values()), 'username': request.user.username, 'email': request.user.email, 'search_url': form.cleaned_data.get('search_url'), }) except Exception as e: logging.error("Error while logging add_variant_tag event: %s" % e) return JSONResponse({ 'is_error': False, 'variant': variant.toJSON(), })