jfaustin's picture
add dockerfile and folding studio cli
44459bb
"""SoloSeq folding submission command."""
from datetime import datetime
from pathlib import Path
from typing import Annotated
import typer
from rich.panel import Panel
from folding_studio.client import Client
from folding_studio.commands.utils import (
success_fail_catch_print,
success_fail_catch_spinner,
)
from folding_studio.config import FOLDING_API_KEY
from folding_studio.console import console
from folding_studio.query.soloseq import SoloSeqQuery
def soloseq(
source: Annotated[
Path,
typer.Argument(
help=(
"Path to the data source. Either a fasta file or a directory of fasta files."
),
exists=True,
),
],
project_code: Annotated[
str,
typer.Option(
help="Project code. If unknown, contact your PM or the Folding Studio team.",
envvar="FOLDING_PROJECT_CODE",
exists=True,
),
],
seed: Annotated[int, typer.Option(help="Random seed.")] = 0,
skip_relaxation: Annotated[
bool,
typer.Option(help="Skip the relaxation process."),
] = False,
subtract_plddt: Annotated[
bool,
typer.Option(help="Output (100 - pLDDT) instead of the pLDDT itself."),
] = False,
output: Annotated[
Path,
typer.Option(
help="Local path to download the result zip and query parameters to. "
"Default to 'soloseq_results'."
),
] = "soloseq_results",
force: Annotated[
bool,
typer.Option(
help=(
"Forces the download to overwrite any existing file "
"with the same name in the specified location."
)
),
] = False,
unzip: Annotated[
bool, typer.Option(help="Unzip the file after its download.")
] = False,
spinner: Annotated[
bool, typer.Option(help="Use live spinner in log output.")
] = True,
):
"""Synchronous SoloSeq folding submission"""
success_fail_catch = (
success_fail_catch_spinner if spinner else success_fail_catch_print
)
console.print(
Panel("[bold cyan]:dna: SoloSeq Folding submission [/bold cyan]", expand=False)
)
output_dir = output / f"submission_{datetime.now().strftime('%Y%m%d%H%M%S')}"
# Create a client using API key or JWT
with success_fail_catch(":key: Authenticating client"):
client = Client.authenticate()
# Define a query
with success_fail_catch(":package: Generating query"):
query_builder = (
SoloSeqQuery.from_file if source.is_file() else SoloSeqQuery.from_directory
)
query: SoloSeqQuery = query_builder(
source,
seed=seed,
skip_relaxation=skip_relaxation,
subtract_plddt=subtract_plddt,
)
query.save_parameters(output_dir)
console.print("[blue]Generated query: [/blue]")
console.print_json(data=query.payload)
# Send a request
with success_fail_catch(":brain: Processing folding job"):
response = client.send_request(query, project_code)
# Access confidence data
console.print("[blue]Confidence Data:[/blue]", end=" ")
console.print_json(data=response.confidence_data)
with success_fail_catch(
f":floppy_disk: Downloading results to `[green]{output_dir}[/green]`"
):
response.download_results(output_dir=output_dir, force=force, unzip=unzip)