def add_variants_task(req): """Perform the actual task of adding variants to the database after receiving an add request Accepts: req(flask.request): POST request received by server """ db = current_app.db req_data = req.json dataset_id = req_data.get("dataset_id") samples = req_data.get("samples", []) assembly = req_data.get("assemblyId") filter_intervals = None genes = req_data.get("genes") if genes: filter_intervals = compute_filter_intervals(req_data) vcf_obj = extract_variants( vcf_file=req_data.get("vcf_path"), samples=samples, filter=filter_intervals ) nr_variants = count_variants(vcf_obj) vcf_obj = extract_variants( vcf_file=req_data.get("vcf_path"), samples=samples, filter=filter_intervals ) added = variants_loader( database=db, vcf_obj=vcf_obj, samples=set(samples), assembly=assembly, dataset_id=dataset_id, nr_variants=nr_variants, ) if added > 0: # Update dataset object accordingly update_dataset(database=db, dataset_id=dataset_id, samples=samples, add=True) LOG.info(f"Number of inserted variants for samples:{samples}:{added}")
def variants(ds, sample): """Remove variants for one or more samples of a dataset""" click.confirm( f"Deleting variants for sample {sample}, dataset '{ds}'. Do you want to continue?", abort=True, ) # Make sure dataset exists and contains the provided sample(s) dataset = current_app.db["dataset"].find_one({"_id": ds}) if dataset is None: click.echo(f"Couldn't find any dataset with id '{ds}' in the database") raise click.Abort() for s in sample: if s not in dataset.get("samples", []): click.echo(f"Couldn't find any sample '{s}' in the sample list of dataset 'dataset'") raise click.Abort() updated, removed = delete_variants(current_app.db, ds, sample) click.echo(f"Number of variants updated:{updated}, removed:{removed}") if updated + removed > 0: # remove sample(s) from dataset update_dataset(database=current_app.db, dataset_id=ds, samples=list(sample), add=False)
def variants(ds, vcf, sample, panel): """Add variants from a VCF file to a dataset""" # make sure dataset id corresponds to a dataset in the database dataset = current_app.db["dataset"].find_one({"_id": ds}) if dataset is None: click.echo(f"Couldn't find any dataset with id '{ds}' in the database") raise click.Abort() # Check if required sample(s) are contained in the VCF vcf_samples = get_vcf_samples(vcf) if not all(samplen in vcf_samples for samplen in sample): click.echo( f"One or more provided sample was not found in the VCF file. Valida samples are: { ','.join(vcf_samples)}" ) raise click.Abort() custom_samples = set(sample) # set of samples provided by users filter_intervals = None if len(panel) > 0: # create BedTool panel with genomic intervals to filter VCF with filter_intervals = merge_intervals(list(panel)) vcf_obj = extract_variants(vcf_file=vcf, samples=custom_samples, filter=filter_intervals) if vcf_obj is None: raise click.Abort() nr_variants = count_variants(vcf_obj) if nr_variants == 0: click.echo("Provided VCF file doesn't contain any variant") raise click.Abort() vcf_obj = extract_variants(vcf_file=vcf, samples=custom_samples, filter=filter_intervals) # ADD variants added = add_variants( database=current_app.db, vcf_obj=vcf_obj, samples=custom_samples, assembly=dataset["assembly_id"], dataset_id=ds, nr_variants=nr_variants, ) click.echo(f"{added} variants loaded into the database") if added > 0: # Update dataset object accordingly update_dataset(database=current_app.db, dataset_id=ds, samples=custom_samples, add=True)
def delete_variants_task(req): """Perform the actual task of removing variants from the database after receiving an delete request Accepts: req(flask.request): POST request received by server """ db = current_app.db req_data = req.json dataset_id = req_data.get("dataset_id") samples = req_data.get("samples") updated, removed = variant_deleter(db, dataset_id, samples) if updated + removed > 0: update_dataset(database=db, dataset_id=dataset_id, samples=samples, add=False) LOG.info(f"Number of updated variants:{updated}. Number of deleted variants:{removed}")