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}")
示例#2
0
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)
示例#3
0
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}")