|
"""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')}" |
|
|
|
|
|
with success_fail_catch(":key: Authenticating client"): |
|
client = Client.authenticate() |
|
|
|
|
|
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) |
|
|
|
|
|
with success_fail_catch(":brain: Processing folding job"): |
|
response = client.send_request(query, project_code) |
|
|
|
|
|
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) |
|
|