mirror of
https://github.com/RosettaCommons/RFdiffusion.git
synced 2026-06-03 18:24:22 +08:00
Adding files for the soon-to-be-released RFdiffusion video tutorial (#452)
The materials were created by Diego Lopez Mateos, Matthew Hvasta, and Kush Narang for the Tutorial Hackathon track of the 2026 Megathon event.
This commit is contained in:
7313
tutorials/protein_binder_design/Part1-Diffusion/channel-toxin.pdb
Normal file
7313
tutorials/protein_binder_design/Part1-Diffusion/channel-toxin.pdb
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -0,0 +1,12 @@
|
||||
#!/bin/bash
|
||||
|
||||
script='/home/dlopezma/RFdiffusion/scripts/run_inference.py'
|
||||
|
||||
|
||||
python $script \
|
||||
inference.output_prefix=outputs-test/binder_ \
|
||||
inference.input_pdb=channel-toxin.pdb 'contigmap.contigs=[A1-110/0 B111-220/0 C221-330/0 D331-440/0 30-50/H462-463/20-50]' \
|
||||
'ppi.hotspot_res=[A68,A70,B178,B180,C288,C290,D398,D400]' \
|
||||
'potentials.guiding_potentials=["type:binder_ROG,min_dist:5,weight:10"]' potentials.guide_scale=10 potentials.guide_decay="quadratic" \
|
||||
denoiser.noise_scale_ca=0.5 denoiser.noise_scale_frame=0.5 \
|
||||
inference.num_designs=200
|
||||
@@ -0,0 +1,524 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Analyze backbone metrics for a directory of PDB files.
|
||||
|
||||
Computes, per PDB:
|
||||
1) N-term and C-term normalized end scores against an interface point
|
||||
2) Radius of gyration (Rg) for a chain + atom selection
|
||||
3) STRIDE secondary-structure percentages
|
||||
|
||||
Example:
|
||||
python analyze_backbones.py \
|
||||
--pdb-dir ./pdbs \
|
||||
--binder-chain A \
|
||||
--interface-point 0 0 -16.17 \
|
||||
--stride /path/to/stride \
|
||||
--atoms alpha-carbons \
|
||||
--output metrics.csv \
|
||||
--threads 8
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import csv
|
||||
import math
|
||||
import shutil
|
||||
import subprocess
|
||||
import sys
|
||||
from concurrent.futures import ProcessPoolExecutor, as_completed
|
||||
from pathlib import Path
|
||||
from typing import Dict, Iterable, List, Optional, Sequence, Tuple
|
||||
|
||||
import numpy as np
|
||||
|
||||
|
||||
STRIDE_CLASSES: Tuple[str, ...] = ("H", "E", "C", "T", "G", "I", "B")
|
||||
ATOM_SELECTIONS: Dict[str, Optional[set[str]]] = {
|
||||
"alpha-carbons": {"CA"},
|
||||
"backbone": {"N", "CA", "C", "O"},
|
||||
"backbone-no-carbonyl": {"N", "CA", "C"},
|
||||
"all": None, # All ATOM records in the selected chain
|
||||
}
|
||||
|
||||
OUTPUT_COLUMNS: Tuple[str, ...] = (
|
||||
"pdb_file",
|
||||
"pdb_path",
|
||||
"n_atoms_rg",
|
||||
"rg",
|
||||
"n_ca_binder",
|
||||
"nterm_sc",
|
||||
"cterm_sc",
|
||||
"pct_H",
|
||||
"pct_E",
|
||||
"pct_C",
|
||||
"pct_T",
|
||||
"pct_G",
|
||||
"pct_I",
|
||||
"pct_B",
|
||||
"pct_helix_total",
|
||||
"pct_extended_total",
|
||||
"stride_total_residues",
|
||||
"status",
|
||||
"error_message",
|
||||
)
|
||||
|
||||
|
||||
class StrideFailureError(RuntimeError):
|
||||
"""Raised when STRIDE fails and --fail-on-missing-stride is enabled."""
|
||||
|
||||
|
||||
def parse_pdb_atoms(pdb_path: Path) -> List[Tuple[str, str, str, float, float, float]]:
|
||||
"""Parse ATOM records from a PDB file.
|
||||
|
||||
Returns tuples:
|
||||
(atom_name, chain_id, residue_index, x, y, z)
|
||||
"""
|
||||
atoms: List[Tuple[str, str, str, float, float, float]] = []
|
||||
with pdb_path.open("r", encoding="utf-8", errors="replace") as handle:
|
||||
for line in handle:
|
||||
if not line.startswith("ATOM"):
|
||||
continue
|
||||
if len(line) < 54:
|
||||
continue
|
||||
|
||||
atom_name = line[12:16].strip()
|
||||
chain_id = line[21].strip()
|
||||
residue_index = line[22:26].strip()
|
||||
|
||||
try:
|
||||
x_coord = float(line[30:38])
|
||||
y_coord = float(line[38:46])
|
||||
z_coord = float(line[46:54])
|
||||
except ValueError:
|
||||
parts = line.split()
|
||||
if len(parts) < 9:
|
||||
continue
|
||||
try:
|
||||
atom_name = parts[2]
|
||||
chain_id = parts[4]
|
||||
x_coord = float(parts[6])
|
||||
y_coord = float(parts[7])
|
||||
z_coord = float(parts[8])
|
||||
except (ValueError, IndexError):
|
||||
continue
|
||||
|
||||
atoms.append((atom_name, chain_id, residue_index, x_coord, y_coord, z_coord))
|
||||
return atoms
|
||||
|
||||
|
||||
def compute_end_scores(
|
||||
binder_ca_coords: np.ndarray, interface_point: np.ndarray
|
||||
) -> Tuple[int, Optional[float], Optional[float], Optional[str]]:
|
||||
"""Compute normalized N-term and C-term scores."""
|
||||
n_ca = int(binder_ca_coords.shape[0])
|
||||
if n_ca == 0:
|
||||
return 0, None, None, "No binder-chain CA atoms found for end scores."
|
||||
|
||||
deltas = binder_ca_coords - interface_point
|
||||
squared_distances = np.sum(deltas * deltas, axis=1)
|
||||
distances = np.sqrt(squared_distances)
|
||||
rmsd_to_point = float(math.sqrt(float(np.mean(squared_distances))))
|
||||
|
||||
if rmsd_to_point == 0.0:
|
||||
return n_ca, None, None, "RMS distance to interface point is 0. End scores are undefined."
|
||||
|
||||
nterm_sc = float(distances[0] / rmsd_to_point)
|
||||
cterm_sc = float(distances[-1] / rmsd_to_point)
|
||||
return n_ca, nterm_sc, cterm_sc, None
|
||||
|
||||
|
||||
def compute_rg(rg_coords: np.ndarray) -> Tuple[int, Optional[float], Optional[str]]:
|
||||
"""Compute radius of gyration using geometric center."""
|
||||
n_atoms = int(rg_coords.shape[0])
|
||||
if n_atoms == 0:
|
||||
return 0, None, "No atoms found for requested Rg chain/atom selection."
|
||||
|
||||
center = np.mean(rg_coords, axis=0)
|
||||
squared_distances = np.sum((rg_coords - center) ** 2, axis=1)
|
||||
rg = float(math.sqrt(float(np.mean(squared_distances))))
|
||||
return n_atoms, rg, None
|
||||
|
||||
|
||||
def empty_stride_metrics() -> Dict[str, Optional[float]]:
|
||||
metrics: Dict[str, Optional[float]] = {f"pct_{ss_class}": None for ss_class in STRIDE_CLASSES}
|
||||
metrics["pct_helix_total"] = None
|
||||
metrics["pct_extended_total"] = None
|
||||
metrics["stride_total_residues"] = None
|
||||
return metrics
|
||||
|
||||
|
||||
def run_stride_and_parse(
|
||||
stride_executable: str, pdb_path: Path, timeout_seconds: int = 30
|
||||
) -> Tuple[Dict[str, Optional[float]], Optional[str]]:
|
||||
"""Run STRIDE and parse secondary-structure percentages."""
|
||||
command = [stride_executable, "-f", str(pdb_path)]
|
||||
try:
|
||||
completed = subprocess.run(
|
||||
command,
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=timeout_seconds,
|
||||
check=False,
|
||||
)
|
||||
except FileNotFoundError as exc:
|
||||
raise RuntimeError(f"STRIDE executable not found: {stride_executable}") from exc
|
||||
except subprocess.TimeoutExpired as exc:
|
||||
raise RuntimeError(f"STRIDE timed out after {timeout_seconds}s.") from exc
|
||||
|
||||
if completed.returncode != 0:
|
||||
stderr = completed.stderr.strip()
|
||||
stdout = completed.stdout.strip()
|
||||
details = stderr or stdout or f"return code {completed.returncode}"
|
||||
raise RuntimeError(f"STRIDE failed ({details}).")
|
||||
|
||||
counts = {ss_class: 0 for ss_class in STRIDE_CLASSES}
|
||||
unknown_classes: Dict[str, int] = {}
|
||||
total_residues = 0
|
||||
|
||||
for line in completed.stdout.splitlines():
|
||||
if not line.startswith("ASG"):
|
||||
continue
|
||||
columns = line.split()
|
||||
if len(columns) <= 5:
|
||||
continue
|
||||
ss_class = columns[5].upper()
|
||||
total_residues += 1
|
||||
if ss_class in counts:
|
||||
counts[ss_class] += 1
|
||||
else:
|
||||
unknown_classes[ss_class] = unknown_classes.get(ss_class, 0) + 1
|
||||
|
||||
if total_residues == 0:
|
||||
metrics = empty_stride_metrics()
|
||||
metrics["stride_total_residues"] = 0
|
||||
return metrics, "STRIDE returned zero ASG residue assignments."
|
||||
|
||||
metrics = {
|
||||
f"pct_{ss_class}": 100.0 * counts[ss_class] / total_residues for ss_class in STRIDE_CLASSES
|
||||
}
|
||||
metrics["pct_helix_total"] = metrics["pct_H"] + metrics["pct_G"] + metrics["pct_I"]
|
||||
metrics["pct_extended_total"] = metrics["pct_E"] + metrics["pct_B"]
|
||||
metrics["stride_total_residues"] = total_residues
|
||||
|
||||
warning = None
|
||||
if unknown_classes:
|
||||
unknown_repr = ",".join(f"{key}:{value}" for key, value in sorted(unknown_classes.items()))
|
||||
warning = f"Unknown STRIDE classes encountered ({unknown_repr})."
|
||||
return metrics, warning
|
||||
|
||||
|
||||
def _collect_chain_coords(
|
||||
atoms: Iterable[Tuple[str, str, str, float, float, float]],
|
||||
chain_id: str,
|
||||
atom_filter: Optional[set[str]],
|
||||
) -> np.ndarray:
|
||||
coords = []
|
||||
for atom_name, current_chain, _residue_idx, x_coord, y_coord, z_coord in atoms:
|
||||
if current_chain != chain_id:
|
||||
continue
|
||||
if atom_filter is not None and atom_name not in atom_filter:
|
||||
continue
|
||||
coords.append((x_coord, y_coord, z_coord))
|
||||
|
||||
if not coords:
|
||||
return np.empty((0, 3), dtype=float)
|
||||
return np.asarray(coords, dtype=float)
|
||||
|
||||
|
||||
def _make_base_row(pdb_path: Path) -> Dict[str, object]:
|
||||
row: Dict[str, object] = {column: None for column in OUTPUT_COLUMNS}
|
||||
row["pdb_file"] = pdb_path.name
|
||||
row["pdb_path"] = str(pdb_path.resolve())
|
||||
row["status"] = "OK"
|
||||
row["error_message"] = ""
|
||||
return row
|
||||
|
||||
|
||||
def analyze_pdb(
|
||||
pdb_path_str: str,
|
||||
binder_chain: str,
|
||||
rg_chain: str,
|
||||
atom_selection: str,
|
||||
interface_point_xyz: Sequence[float],
|
||||
stride_executable: str,
|
||||
stride_timeout: int,
|
||||
fail_on_missing_stride: bool,
|
||||
) -> Dict[str, object]:
|
||||
"""Analyze one PDB and return a row dict for output."""
|
||||
pdb_path = Path(pdb_path_str)
|
||||
row = _make_base_row(pdb_path)
|
||||
warnings: List[str] = []
|
||||
|
||||
try:
|
||||
atoms = parse_pdb_atoms(pdb_path)
|
||||
|
||||
binder_ca = _collect_chain_coords(atoms, binder_chain, {"CA"})
|
||||
n_ca_binder, nterm_sc, cterm_sc, end_warning = compute_end_scores(
|
||||
binder_ca, np.asarray(interface_point_xyz, dtype=float)
|
||||
)
|
||||
row["n_ca_binder"] = n_ca_binder
|
||||
row["nterm_sc"] = nterm_sc
|
||||
row["cterm_sc"] = cterm_sc
|
||||
if end_warning:
|
||||
warnings.append(end_warning)
|
||||
|
||||
atom_filter = ATOM_SELECTIONS[atom_selection]
|
||||
rg_coords = _collect_chain_coords(atoms, rg_chain, atom_filter)
|
||||
n_atoms_rg, rg, rg_warning = compute_rg(rg_coords)
|
||||
row["n_atoms_rg"] = n_atoms_rg
|
||||
row["rg"] = rg
|
||||
if rg_warning:
|
||||
warnings.append(rg_warning)
|
||||
|
||||
try:
|
||||
stride_metrics, stride_warning = run_stride_and_parse(
|
||||
stride_executable, pdb_path, timeout_seconds=stride_timeout
|
||||
)
|
||||
row.update(stride_metrics)
|
||||
if stride_warning:
|
||||
warnings.append(stride_warning)
|
||||
except Exception as exc:
|
||||
if fail_on_missing_stride:
|
||||
raise StrideFailureError(f"{pdb_path}: {exc}") from exc
|
||||
row.update(empty_stride_metrics())
|
||||
warnings.append(f"STRIDE failed: {exc}")
|
||||
|
||||
if warnings:
|
||||
row["status"] = "WARNING"
|
||||
row["error_message"] = "; ".join(warnings)
|
||||
else:
|
||||
row["status"] = "OK"
|
||||
row["error_message"] = ""
|
||||
return row
|
||||
|
||||
except StrideFailureError:
|
||||
raise
|
||||
except Exception as exc:
|
||||
row.update(empty_stride_metrics())
|
||||
row["status"] = "ERROR"
|
||||
row["error_message"] = str(exc)
|
||||
return row
|
||||
|
||||
|
||||
def discover_pdb_files(pdb_dir: Path, glob_pattern: str, recursive: bool) -> List[Path]:
|
||||
if recursive:
|
||||
pdb_files = [path for path in pdb_dir.rglob(glob_pattern) if path.is_file()]
|
||||
else:
|
||||
pdb_files = [path for path in pdb_dir.glob(glob_pattern) if path.is_file()]
|
||||
return sorted(path.resolve() for path in pdb_files)
|
||||
|
||||
|
||||
def _serialize_cell(value: object) -> str:
|
||||
if value is None:
|
||||
return "NA"
|
||||
if isinstance(value, float):
|
||||
if math.isnan(value) or math.isinf(value):
|
||||
return "NA"
|
||||
return f"{value:.6f}"
|
||||
return str(value)
|
||||
|
||||
|
||||
def write_output(rows: List[Dict[str, object]], output_path: Path, delimiter_name: str) -> None:
|
||||
delimiter = "," if delimiter_name == "csv" else "\t"
|
||||
rows.sort(key=lambda row: (str(row.get("pdb_file", "")), str(row.get("pdb_path", ""))))
|
||||
|
||||
output_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
with output_path.open("w", newline="", encoding="utf-8") as handle:
|
||||
writer = csv.DictWriter(handle, fieldnames=list(OUTPUT_COLUMNS), delimiter=delimiter)
|
||||
writer.writeheader()
|
||||
for row in rows:
|
||||
writer.writerow({column: _serialize_cell(row.get(column)) for column in OUTPUT_COLUMNS})
|
||||
|
||||
|
||||
def resolve_stride_executable(stride_arg: str) -> str:
|
||||
stride_path = Path(stride_arg)
|
||||
if stride_path.is_file():
|
||||
return str(stride_path.resolve())
|
||||
|
||||
found = shutil.which(stride_arg)
|
||||
if found:
|
||||
return found
|
||||
|
||||
raise FileNotFoundError(
|
||||
f"Could not resolve STRIDE executable from '{stride_arg}'. "
|
||||
"Pass an absolute path or a command available in PATH."
|
||||
)
|
||||
|
||||
|
||||
def build_parser() -> argparse.ArgumentParser:
|
||||
parser = argparse.ArgumentParser(
|
||||
description=(
|
||||
"Analyze a directory of PDB backbones and output per-PDB metrics "
|
||||
"(end scores, Rg, STRIDE secondary structure percentages)."
|
||||
),
|
||||
formatter_class=argparse.RawTextHelpFormatter,
|
||||
epilog=(
|
||||
"Example usage:\n"
|
||||
" python analyze_backbones.py \\\n"
|
||||
" --pdb-dir ./pdbs \\\n"
|
||||
" --binder-chain A \\\n"
|
||||
" --interface-point 0 0 -16.17 \\\n"
|
||||
" --stride /path/to/stride \\\n"
|
||||
" --atoms alpha-carbons \\\n"
|
||||
" --output metrics.csv \\\n"
|
||||
" --threads 8\n"
|
||||
),
|
||||
)
|
||||
|
||||
parser.add_argument("--pdb-dir", required=True, type=Path, help="Directory containing PDB files.")
|
||||
parser.add_argument(
|
||||
"--binder-chain",
|
||||
required=True,
|
||||
type=str,
|
||||
help="Chain ID used for NtermSc/CtermSc computation.",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--interface-point",
|
||||
required=True,
|
||||
nargs=3,
|
||||
type=float,
|
||||
metavar=("X", "Y", "Z"),
|
||||
help="Interface point coordinates (X Y Z).",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--stride",
|
||||
required=True,
|
||||
type=str,
|
||||
help="Path/name for STRIDE executable (used as: stride -f <pdb>).",
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
"--rg-chain",
|
||||
default=None,
|
||||
type=str,
|
||||
help="Chain ID for Rg computation (default: same as --binder-chain).",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--atoms",
|
||||
default="alpha-carbons",
|
||||
choices=tuple(ATOM_SELECTIONS.keys()),
|
||||
help=(
|
||||
"Atom selection for Rg: "
|
||||
"alpha-carbons=CA; backbone=N,CA,C,O; "
|
||||
"backbone-no-carbonyl=N,CA,C; all=all ATOM records."
|
||||
),
|
||||
)
|
||||
parser.add_argument("--output", default="metrics.csv", type=Path, help="Output CSV/TSV file path.")
|
||||
parser.add_argument(
|
||||
"--delimiter",
|
||||
default="csv",
|
||||
choices=("csv", "tsv"),
|
||||
help="Output delimiter format.",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--recursive",
|
||||
action="store_true",
|
||||
help="Recursively search for PDB files in subdirectories.",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--glob",
|
||||
default="*.pdb",
|
||||
type=str,
|
||||
help="Glob pattern for PDB discovery (default: *.pdb).",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--fail-on-missing-stride",
|
||||
action="store_true",
|
||||
help="Fail immediately if STRIDE fails for any PDB.",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--threads",
|
||||
default=1,
|
||||
type=int,
|
||||
help="Number of worker processes (ProcessPoolExecutor).",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--stride-timeout",
|
||||
default=30,
|
||||
type=int,
|
||||
help="Timeout in seconds for each STRIDE call (default: 30).",
|
||||
)
|
||||
return parser
|
||||
|
||||
|
||||
def _print_progress(done: int, total: int) -> None:
|
||||
if done % 25 == 0 or done == total:
|
||||
print(f"[{done}/{total}] analyzed", file=sys.stderr)
|
||||
|
||||
|
||||
def main() -> int:
|
||||
parser = build_parser()
|
||||
args = parser.parse_args()
|
||||
|
||||
if args.threads < 1:
|
||||
parser.error("--threads must be >= 1")
|
||||
if args.stride_timeout < 1:
|
||||
parser.error("--stride-timeout must be >= 1")
|
||||
if not args.pdb_dir.exists() or not args.pdb_dir.is_dir():
|
||||
parser.error(f"--pdb-dir does not exist or is not a directory: {args.pdb_dir}")
|
||||
|
||||
try:
|
||||
stride_executable = resolve_stride_executable(args.stride)
|
||||
except FileNotFoundError as exc:
|
||||
parser.error(str(exc))
|
||||
return 2
|
||||
|
||||
rg_chain = args.rg_chain if args.rg_chain is not None else args.binder_chain
|
||||
pdb_files = discover_pdb_files(args.pdb_dir, args.glob, args.recursive)
|
||||
if not pdb_files:
|
||||
parser.error(
|
||||
f"No PDB files found under {args.pdb_dir} using pattern '{args.glob}' "
|
||||
f"(recursive={args.recursive})."
|
||||
)
|
||||
|
||||
total = len(pdb_files)
|
||||
print(f"Discovered {total} PDB files.", file=sys.stderr)
|
||||
|
||||
task_args = [
|
||||
(
|
||||
str(pdb_path),
|
||||
args.binder_chain,
|
||||
rg_chain,
|
||||
args.atoms,
|
||||
tuple(args.interface_point),
|
||||
stride_executable,
|
||||
args.stride_timeout,
|
||||
args.fail_on_missing_stride,
|
||||
)
|
||||
for pdb_path in pdb_files
|
||||
]
|
||||
|
||||
rows: List[Dict[str, object]] = []
|
||||
try:
|
||||
if args.threads == 1:
|
||||
for index, task in enumerate(task_args, start=1):
|
||||
rows.append(analyze_pdb(*task))
|
||||
_print_progress(index, total)
|
||||
else:
|
||||
try:
|
||||
with ProcessPoolExecutor(max_workers=args.threads) as executor:
|
||||
futures = [executor.submit(analyze_pdb, *task) for task in task_args]
|
||||
for index, future in enumerate(as_completed(futures), start=1):
|
||||
rows.append(future.result())
|
||||
_print_progress(index, total)
|
||||
except PermissionError as exc:
|
||||
print(
|
||||
"WARNING: ProcessPoolExecutor is unavailable in this environment "
|
||||
f"({exc}). Falling back to serial execution.",
|
||||
file=sys.stderr,
|
||||
)
|
||||
rows = []
|
||||
for index, task in enumerate(task_args, start=1):
|
||||
rows.append(analyze_pdb(*task))
|
||||
_print_progress(index, total)
|
||||
except StrideFailureError as exc:
|
||||
print(f"ERROR: {exc}", file=sys.stderr)
|
||||
return 1
|
||||
|
||||
write_output(rows, args.output.resolve(), args.delimiter)
|
||||
print(f"Wrote {len(rows)} rows to {args.output.resolve()}", file=sys.stderr)
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
@@ -0,0 +1,259 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
filter_backbones.py
|
||||
|
||||
Filter a metrics CSV (one row per structure) by user-defined thresholds and
|
||||
copy the corresponding structure files to an output directory.
|
||||
|
||||
Typical usage:
|
||||
python filter_backbones.py \
|
||||
--metrics metrics.csv \
|
||||
--pdb-root /path/to/pdbs \
|
||||
--outdir Passing_Backbones \
|
||||
--min rg=9.5 --max rg=12.0 \
|
||||
--min pct_helix_total=70 \
|
||||
--max pct_C=15 \
|
||||
--min nterm_sc=0.9 --max nterm_sc=1.4
|
||||
|
||||
Threshold syntax:
|
||||
--min <col>=<value> keep rows where col >= value
|
||||
--max <col>=<value> keep rows where col <= value
|
||||
|
||||
You can provide multiple --min / --max flags.
|
||||
|
||||
By default, the script uses:
|
||||
- `pdb_path` if present and exists
|
||||
- otherwise `pdb_root / pdb_file`
|
||||
|
||||
It writes:
|
||||
- copies of passing structure files to --outdir
|
||||
- optionally, a filtered CSV with only passing rows.
|
||||
"""
|
||||
|
||||
import argparse
|
||||
import csv
|
||||
import os
|
||||
import shutil
|
||||
import sys
|
||||
from typing import Dict, List, Tuple, Optional
|
||||
|
||||
|
||||
def parse_threshold_kv(s: str) -> Tuple[str, float]:
|
||||
"""Parse 'col=value' into (col, float(value))."""
|
||||
if "=" not in s:
|
||||
raise argparse.ArgumentTypeError(f"Threshold must be in the form col=value, got: {s}")
|
||||
col, val = s.split("=", 1)
|
||||
col = col.strip()
|
||||
try:
|
||||
fval = float(val.strip())
|
||||
except ValueError as e:
|
||||
raise argparse.ArgumentTypeError(f"Value must be numeric in {s}") from e
|
||||
if not col:
|
||||
raise argparse.ArgumentTypeError(f"Column name is empty in {s}")
|
||||
return col, fval
|
||||
|
||||
|
||||
def safe_float(x: str) -> Optional[float]:
|
||||
"""Convert string to float; return None for empty/NA/non-numeric."""
|
||||
if x is None:
|
||||
return None
|
||||
x = str(x).strip()
|
||||
if x == "" or x.upper() in {"NA", "NAN", "NONE"}:
|
||||
return None
|
||||
try:
|
||||
return float(x)
|
||||
except ValueError:
|
||||
return None
|
||||
|
||||
|
||||
def row_passes_thresholds(
|
||||
row: Dict[str, str],
|
||||
mins: Dict[str, float],
|
||||
maxs: Dict[str, float],
|
||||
require_ok: bool = False,
|
||||
) -> Tuple[bool, str]:
|
||||
"""
|
||||
Return (passes, reason_if_failed).
|
||||
If a needed value is missing/non-numeric, row fails.
|
||||
"""
|
||||
if require_ok:
|
||||
status = (row.get("status") or "").strip().upper()
|
||||
if status != "OK":
|
||||
return False, f"status != OK ({status or 'missing'})"
|
||||
|
||||
for col, minv in mins.items():
|
||||
v = safe_float(row.get(col))
|
||||
if v is None:
|
||||
return False, f"missing/non-numeric {col}"
|
||||
if v < minv:
|
||||
return False, f"{col}={v} < min {minv}"
|
||||
|
||||
for col, maxv in maxs.items():
|
||||
v = safe_float(row.get(col))
|
||||
if v is None:
|
||||
return False, f"missing/non-numeric {col}"
|
||||
if v > maxv:
|
||||
return False, f"{col}={v} > max {maxv}"
|
||||
|
||||
return True, ""
|
||||
|
||||
|
||||
def resolve_source_path(row: Dict[str, str], pdb_root: str) -> Optional[str]:
|
||||
"""
|
||||
Prefer absolute `pdb_path` if it exists. Otherwise use pdb_root/pdb_file.
|
||||
"""
|
||||
pdb_path = (row.get("pdb_path") or "").strip()
|
||||
if pdb_path and os.path.isfile(pdb_path):
|
||||
return pdb_path
|
||||
|
||||
pdb_file = (row.get("pdb_file") or "").strip()
|
||||
if pdb_file and pdb_root:
|
||||
candidate = os.path.join(pdb_root, pdb_file)
|
||||
if os.path.isfile(candidate):
|
||||
return candidate
|
||||
|
||||
return None
|
||||
|
||||
|
||||
def main() -> int:
|
||||
parser = argparse.ArgumentParser(
|
||||
prog="filter_backbones.py",
|
||||
description="Filter a metrics CSV by thresholds and copy passing structure files to a new folder.",
|
||||
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
|
||||
)
|
||||
parser.add_argument("--metrics", required=True, help="Path to the metrics CSV.")
|
||||
parser.add_argument(
|
||||
"--pdb-root",
|
||||
default="",
|
||||
help="Folder containing the structure files. Used if pdb_path in CSV is missing or not valid.",
|
||||
)
|
||||
parser.add_argument("--outdir", default="Passing_Backbones", help="Output directory for copied files.")
|
||||
parser.add_argument(
|
||||
"--min",
|
||||
action="append",
|
||||
default=[],
|
||||
metavar="COL=VAL",
|
||||
help="Minimum threshold (keep rows where COL >= VAL). Can be provided multiple times.",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--max",
|
||||
action="append",
|
||||
default=[],
|
||||
metavar="COL=VAL",
|
||||
help="Maximum threshold (keep rows where COL <= VAL). Can be provided multiple times.",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--require-ok",
|
||||
action="store_true",
|
||||
help="Only accept rows with status == OK.",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--copy-mode",
|
||||
choices=["copy", "symlink"],
|
||||
default="copy",
|
||||
help="Copy files or create symlinks in the output directory.",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--dry-run",
|
||||
action="store_true",
|
||||
help="Do not copy anything; just print what would pass/fail.",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--filtered-csv",
|
||||
default="",
|
||||
help="Optional path to write a CSV containing only passing rows.",
|
||||
)
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
# Parse thresholds into dicts
|
||||
mins: Dict[str, float] = {}
|
||||
maxs: Dict[str, float] = {}
|
||||
|
||||
for item in args.min:
|
||||
col, val = parse_threshold_kv(item)
|
||||
mins[col] = val
|
||||
for item in args.max:
|
||||
col, val = parse_threshold_kv(item)
|
||||
maxs[col] = val
|
||||
|
||||
# Ensure outdir exists (unless dry-run)
|
||||
if not args.dry_run:
|
||||
os.makedirs(args.outdir, exist_ok=True)
|
||||
|
||||
passed_rows: List[Dict[str, str]] = []
|
||||
total = 0
|
||||
passed = 0
|
||||
missing_files = 0
|
||||
|
||||
with open(args.metrics, newline="") as f:
|
||||
reader = csv.DictReader(f)
|
||||
if not reader.fieldnames:
|
||||
print("ERROR: metrics CSV has no header.", file=sys.stderr)
|
||||
return 2
|
||||
|
||||
for row in reader:
|
||||
total += 1
|
||||
ok, reason = row_passes_thresholds(row, mins, maxs, require_ok=args.require_ok)
|
||||
if not ok:
|
||||
if args.dry_run:
|
||||
name = row.get("pdb_file") or row.get("pdb_path") or f"row{total}"
|
||||
print(f"FAIL {name}: {reason}")
|
||||
continue
|
||||
|
||||
src = resolve_source_path(row, args.pdb_root)
|
||||
if src is None:
|
||||
missing_files += 1
|
||||
if args.dry_run:
|
||||
name = row.get("pdb_file") or row.get("pdb_path") or f"row{total}"
|
||||
print(f"PASS (but missing file) {name}")
|
||||
continue
|
||||
|
||||
dst = os.path.join(args.outdir, os.path.basename(src))
|
||||
|
||||
if args.dry_run:
|
||||
print(f"PASS {os.path.basename(src)} -> {dst}")
|
||||
else:
|
||||
# Avoid overwriting silently if same name appears twice
|
||||
if os.path.exists(dst):
|
||||
# Add a suffix
|
||||
base, ext = os.path.splitext(os.path.basename(src))
|
||||
i = 2
|
||||
while True:
|
||||
candidate = os.path.join(args.outdir, f"{base}__{i}{ext}")
|
||||
if not os.path.exists(candidate):
|
||||
dst = candidate
|
||||
break
|
||||
i += 1
|
||||
|
||||
if args.copy_mode == "copy":
|
||||
shutil.copy2(src, dst)
|
||||
else:
|
||||
os.symlink(os.path.abspath(src), dst)
|
||||
|
||||
passed += 1
|
||||
passed_rows.append(row)
|
||||
|
||||
# Optional: write filtered CSV
|
||||
if args.filtered_csv:
|
||||
if args.dry_run:
|
||||
print(f"(dry-run) Would write filtered CSV to: {args.filtered_csv}")
|
||||
else:
|
||||
with open(args.filtered_csv, "w", newline="") as out_f:
|
||||
writer = csv.DictWriter(out_f, fieldnames=passed_rows[0].keys() if passed_rows else [])
|
||||
if passed_rows:
|
||||
writer.writeheader()
|
||||
writer.writerows(passed_rows)
|
||||
|
||||
print("\nSummary")
|
||||
print(f" Total rows read: {total}")
|
||||
print(f" Passed thresholds: {len(passed_rows)}")
|
||||
print(f" Files copied/symlink: {passed}")
|
||||
print(f" Missing files: {missing_files}")
|
||||
print(f" Output directory: {args.outdir}")
|
||||
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
@@ -0,0 +1,195 @@
|
||||
pdb_file,pdb_path,n_atoms_rg,rg,n_ca_binder,nterm_sc,cterm_sc,pct_H,pct_E,pct_C,pct_T,pct_G,pct_I,pct_B,pct_helix_total,pct_extended_total,stride_total_residues,status,error_message
|
||||
binder__0.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__0.pdb,65,11.440739,65,1.208963,1.708872,79.405941,0.000000,10.495050,10.099010,0.000000,0.000000,0.000000,79.405941,0.000000,505,OK,
|
||||
binder__1.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__1.pdb,65,10.570335,65,0.456962,1.305447,79.009901,0.000000,10.891089,9.504950,0.594059,0.000000,0.000000,79.603960,0.000000,505,OK,
|
||||
binder__10.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__10.pdb,74,12.469614,74,1.199012,1.243271,80.155642,0.000000,10.505837,9.338521,0.000000,0.000000,0.000000,80.155642,0.000000,514,OK,
|
||||
binder__100.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__100.pdb,91,14.372374,91,0.882592,1.395679,80.790960,0.000000,10.169492,9.039548,0.000000,0.000000,0.000000,80.790960,0.000000,531,OK,
|
||||
binder__101.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__101.pdb,82,13.958578,82,1.483017,1.259399,80.459770,0.000000,9.770115,9.770115,0.000000,0.000000,0.000000,80.459770,0.000000,522,OK,
|
||||
binder__102.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__102.pdb,88,12.150068,88,0.364829,0.760174,79.924242,0.000000,9.848485,10.227273,0.000000,0.000000,0.000000,79.924242,0.000000,528,OK,
|
||||
binder__103.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__103.pdb,81,11.555342,81,0.596236,1.042006,80.422265,0.000000,9.213052,10.364683,0.000000,0.000000,0.000000,80.422265,0.000000,521,OK,
|
||||
binder__104.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__104.pdb,76,13.859907,76,0.850355,1.858860,80.038760,0.000000,9.496124,10.465116,0.000000,0.000000,0.000000,80.038760,0.000000,516,OK,
|
||||
binder__105.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__105.pdb,81,11.538136,81,0.577873,1.283464,79.462572,0.000000,9.980806,9.788868,0.767754,0.000000,0.000000,80.230326,0.000000,521,OK,
|
||||
binder__106.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__106.pdb,75,12.714906,75,1.382847,1.748714,79.805825,0.000000,9.514563,10.679612,0.000000,0.000000,0.000000,79.805825,0.000000,515,OK,
|
||||
binder__107.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__107.pdb,96,11.990849,96,1.440216,0.699554,79.664179,0.000000,9.514925,10.261194,0.559701,0.000000,0.000000,80.223881,0.000000,536,OK,
|
||||
binder__108.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__108.pdb,69,10.528552,69,0.597537,1.023899,78.978389,0.000000,10.805501,10.216110,0.000000,0.000000,0.000000,78.978389,0.000000,509,OK,
|
||||
binder__109.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__109.pdb,96,15.382391,96,1.902797,0.780417,80.410448,0.000000,9.701493,8.955224,0.932836,0.000000,0.000000,81.343284,0.000000,536,OK,
|
||||
binder__11.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__11.pdb,81,15.423823,81,1.947594,0.953179,80.230326,0.000000,9.788868,9.980806,0.000000,0.000000,0.000000,80.230326,0.000000,521,OK,
|
||||
binder__110.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__110.pdb,73,12.301217,73,1.624234,0.881460,79.532164,0.000000,9.746589,10.136452,0.584795,0.000000,0.000000,80.116959,0.000000,513,OK,
|
||||
binder__111.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__111.pdb,81,13.064917,81,1.273191,1.054840,80.230326,0.000000,9.980806,9.788868,0.000000,0.000000,0.000000,80.230326,0.000000,521,OK,
|
||||
binder__112.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__112.pdb,66,11.652158,66,0.735635,1.513717,79.841897,0.000000,9.486166,10.671937,0.000000,0.000000,0.000000,79.841897,0.000000,506,OK,
|
||||
binder__113.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__113.pdb,91,12.512440,91,1.083776,1.292954,79.661017,0.000000,10.734463,9.039548,0.564972,0.000000,0.000000,80.225989,0.000000,531,OK,
|
||||
binder__114.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__114.pdb,80,11.677121,80,0.878299,0.875773,79.807692,0.000000,10.192308,10.000000,0.000000,0.000000,0.000000,79.807692,0.000000,520,OK,
|
||||
binder__115.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__115.pdb,92,12.229948,92,1.146564,1.030289,79.887218,0.000000,11.090226,9.022556,0.000000,0.000000,0.000000,79.887218,0.000000,532,OK,
|
||||
binder__116.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__116.pdb,67,10.234730,67,0.935921,0.747552,79.487179,0.000000,10.453649,9.467456,0.591716,0.000000,0.000000,80.078895,0.000000,507,OK,
|
||||
binder__117.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__117.pdb,67,15.372543,67,1.658400,1.720560,79.092702,0.000000,10.650888,10.256410,0.000000,0.000000,0.000000,79.092702,0.000000,507,OK,
|
||||
binder__118.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__118.pdb,81,13.202121,81,1.694858,0.514610,80.038388,0.000000,9.980806,9.980806,0.000000,0.000000,0.000000,80.038388,0.000000,521,OK,
|
||||
binder__119.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__119.pdb,72,12.163164,72,1.047828,1.586725,79.882812,0.000000,10.156250,9.960938,0.000000,0.000000,0.000000,79.882812,0.000000,512,OK,
|
||||
binder__12.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__12.pdb,90,11.373821,90,0.606328,1.132692,80.000000,0.000000,10.943396,9.056604,0.000000,0.000000,0.000000,80.000000,0.000000,530,OK,
|
||||
binder__120.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__120.pdb,89,12.584334,89,0.990795,0.956222,79.773157,0.000000,9.451796,10.207940,0.567108,0.000000,0.000000,80.340265,0.000000,529,OK,
|
||||
binder__121.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__121.pdb,80,11.734673,80,0.985105,0.914877,79.423077,0.000000,9.807692,10.769231,0.000000,0.000000,0.000000,79.423077,0.000000,520,OK,
|
||||
binder__122.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__122.pdb,85,13.642657,85,0.895116,1.627162,79.809524,0.000000,9.714286,9.904762,0.571429,0.000000,0.000000,80.380952,0.000000,525,OK,
|
||||
binder__123.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__123.pdb,76,12.728347,76,0.759733,1.718369,80.232558,0.000000,9.883721,9.883721,0.000000,0.000000,0.000000,80.232558,0.000000,516,OK,
|
||||
binder__124.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__124.pdb,85,13.849318,85,0.928141,1.550698,80.380952,0.000000,9.714286,9.904762,0.000000,0.000000,0.000000,80.380952,0.000000,525,OK,
|
||||
binder__125.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__125.pdb,80,11.468907,80,1.343899,1.508660,80.192308,0.000000,10.000000,9.807692,0.000000,0.000000,0.000000,80.192308,0.000000,520,OK,
|
||||
binder__126.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__126.pdb,69,12.118205,69,0.819677,1.806679,80.157171,0.000000,9.823183,10.019646,0.000000,0.000000,0.000000,80.157171,0.000000,509,OK,
|
||||
binder__127.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__127.pdb,66,11.873773,66,0.379319,1.621185,80.039526,0.000000,10.474308,9.486166,0.000000,0.000000,0.000000,80.039526,0.000000,506,OK,
|
||||
binder__128.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__128.pdb,65,10.053100,65,0.784700,0.562727,78.811881,0.000000,10.495050,10.693069,0.000000,0.000000,0.000000,78.811881,0.000000,505,OK,
|
||||
binder__129.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__129.pdb,76,13.016713,76,1.178201,1.318435,80.232558,0.000000,8.914729,10.852713,0.000000,0.000000,0.000000,80.232558,0.000000,516,OK,
|
||||
binder__13.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__13.pdb,74,12.861669,74,1.870969,1.002075,80.155642,0.000000,10.505837,9.338521,0.000000,0.000000,0.000000,80.155642,0.000000,514,OK,
|
||||
binder__130.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__130.pdb,65,10.321954,65,0.991581,1.005336,79.603960,0.000000,10.297030,10.099010,0.000000,0.000000,0.000000,79.603960,0.000000,505,OK,
|
||||
binder__131.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__131.pdb,86,13.437955,86,0.867965,0.629852,79.847909,0.000000,10.456274,9.695817,0.000000,0.000000,0.000000,79.847909,0.000000,526,OK,
|
||||
binder__132.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__132.pdb,70,12.665055,70,0.929634,1.757423,79.803922,0.000000,10.196078,9.411765,0.588235,0.000000,0.000000,80.392157,0.000000,510,OK,
|
||||
binder__133.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__133.pdb,79,11.479286,79,0.663421,1.070164,79.576108,0.000000,10.019268,10.404624,0.000000,0.000000,0.000000,79.576108,0.000000,519,OK,
|
||||
binder__134.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__134.pdb,89,15.000523,89,1.564897,1.405135,81.096408,0.000000,9.829868,9.073724,0.000000,0.000000,0.000000,81.096408,0.000000,529,OK,
|
||||
binder__135.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__135.pdb,62,11.260668,62,1.476494,1.187470,79.482072,0.000000,10.358566,9.561753,0.597610,0.000000,0.000000,80.079681,0.000000,502,OK,
|
||||
binder__136.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__136.pdb,84,11.754088,84,1.250004,1.497541,80.152672,0.000000,9.732824,10.114504,0.000000,0.000000,0.000000,80.152672,0.000000,524,OK,
|
||||
binder__137.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__137.pdb,97,15.512694,97,0.855076,1.529193,80.446927,0.000000,9.869646,9.683426,0.000000,0.000000,0.000000,80.446927,0.000000,537,OK,
|
||||
binder__138.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__138.pdb,96,15.283960,96,1.465543,1.499585,81.343284,0.000000,9.701493,8.955224,0.000000,0.000000,0.000000,81.343284,0.000000,536,OK,
|
||||
binder__139.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__139.pdb,77,12.475654,77,1.146081,1.493544,80.077369,0.000000,9.864603,10.058027,0.000000,0.000000,0.000000,80.077369,0.000000,517,OK,
|
||||
binder__14.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__14.pdb,76,12.613412,76,1.414906,1.408774,79.844961,0.000000,9.689922,10.465116,0.000000,0.000000,0.000000,79.844961,0.000000,516,OK,
|
||||
binder__140.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__140.pdb,76,12.555237,76,1.241664,1.257064,79.263566,0.000000,9.496124,10.465116,0.775194,0.000000,0.000000,80.038760,0.000000,516,OK,
|
||||
binder__141.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__141.pdb,78,13.036538,78,1.575718,1.293330,80.501931,0.000000,9.652510,9.845560,0.000000,0.000000,0.000000,80.501931,0.000000,518,OK,
|
||||
binder__142.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__142.pdb,74,12.756940,74,1.106141,1.644492,79.766537,0.000000,10.311284,9.338521,0.583658,0.000000,0.000000,80.350195,0.000000,514,OK,
|
||||
binder__143.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__143.pdb,90,12.066872,90,0.952131,1.018203,79.433962,0.000000,10.377358,9.056604,1.132075,0.000000,0.000000,80.566038,0.000000,530,OK,
|
||||
binder__144.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__144.pdb,99,15.508172,99,1.613075,1.293270,81.261596,0.000000,9.833024,8.905380,0.000000,0.000000,0.000000,81.261596,0.000000,539,OK,
|
||||
binder__145.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__145.pdb,82,11.387497,82,1.211000,0.891400,79.693487,0.000000,10.344828,9.961686,0.000000,0.000000,0.000000,79.693487,0.000000,522,OK,
|
||||
binder__146.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__146.pdb,70,16.234978,70,1.394189,1.870756,80.392157,0.000000,9.607843,10.000000,0.000000,0.000000,0.000000,80.392157,0.000000,510,OK,
|
||||
binder__147.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__147.pdb,74,12.621206,74,1.254628,1.484485,80.155642,0.000000,9.922179,9.922179,0.000000,0.000000,0.000000,80.155642,0.000000,514,OK,
|
||||
binder__148.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__148.pdb,63,11.121062,63,0.365520,1.588692,79.721670,0.000000,10.139165,10.139165,0.000000,0.000000,0.000000,79.721670,0.000000,503,OK,
|
||||
binder__149.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__149.pdb,74,11.392053,74,0.874451,0.659778,79.571984,0.000000,10.700389,9.727626,0.000000,0.000000,0.000000,79.571984,0.000000,514,OK,
|
||||
binder__15.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__15.pdb,98,12.930027,98,1.267407,1.110161,79.925651,0.000000,9.293680,10.780669,0.000000,0.000000,0.000000,79.925651,0.000000,538,OK,
|
||||
binder__150.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__150.pdb,83,11.650322,83,0.835247,1.206308,80.114723,0.000000,10.133843,9.751434,0.000000,0.000000,0.000000,80.114723,0.000000,523,OK,
|
||||
binder__151.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__151.pdb,64,11.669831,64,0.757482,1.688188,79.166667,0.000000,10.515873,10.317460,0.000000,0.000000,0.000000,79.166667,0.000000,504,OK,
|
||||
binder__152.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__152.pdb,66,12.203983,66,1.660252,1.246168,79.841897,0.000000,10.079051,10.079051,0.000000,0.000000,0.000000,79.841897,0.000000,506,OK,
|
||||
binder__153.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__153.pdb,72,11.988316,72,0.983151,1.247953,79.492188,0.000000,9.765625,10.742188,0.000000,0.000000,0.000000,79.492188,0.000000,512,OK,
|
||||
binder__154.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__154.pdb,75,12.951174,75,0.832094,1.688883,79.029126,0.000000,9.514563,11.456311,0.000000,0.000000,0.000000,79.029126,0.000000,515,OK,
|
||||
binder__155.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__155.pdb,81,11.322606,81,1.599641,1.415304,79.846449,0.000000,9.788868,10.364683,0.000000,0.000000,0.000000,79.846449,0.000000,521,OK,
|
||||
binder__156.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__156.pdb,55,12.698095,55,1.567785,1.598997,79.595960,0.000000,10.101010,9.696970,0.606061,0.000000,0.000000,80.202020,0.000000,495,OK,
|
||||
binder__157.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__157.pdb,84,13.790878,84,1.039222,1.634233,80.534351,0.000000,9.732824,9.732824,0.000000,0.000000,0.000000,80.534351,0.000000,524,OK,
|
||||
binder__158.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__158.pdb,89,14.213194,89,1.235038,1.226000,80.718336,0.000000,10.207940,9.073724,0.000000,0.000000,0.000000,80.718336,0.000000,529,OK,
|
||||
binder__159.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__159.pdb,83,13.623458,83,1.295159,1.528311,80.688337,0.000000,9.560229,9.751434,0.000000,0.000000,0.000000,80.688337,0.000000,523,OK,
|
||||
binder__16.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__16.pdb,76,11.337735,76,0.526479,0.918478,79.069767,0.000000,9.689922,11.240310,0.000000,0.000000,0.000000,79.069767,0.000000,516,OK,
|
||||
binder__160.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__160.pdb,62,11.227942,62,1.247732,1.405781,79.880478,0.000000,10.159363,9.960159,0.000000,0.000000,0.000000,79.880478,0.000000,502,OK,
|
||||
binder__161.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__161.pdb,81,11.308972,81,1.450027,1.337222,79.846449,0.000000,9.596929,10.556622,0.000000,0.000000,0.000000,79.846449,0.000000,521,OK,
|
||||
binder__162.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__162.pdb,90,12.173736,90,0.740034,0.770856,79.056604,0.000000,10.377358,10.566038,0.000000,0.000000,0.000000,79.056604,0.000000,530,OK,
|
||||
binder__163.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__163.pdb,69,11.815115,69,0.462527,1.604587,79.960707,0.000000,10.019646,10.019646,0.000000,0.000000,0.000000,79.960707,0.000000,509,OK,
|
||||
binder__164.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__164.pdb,82,13.176641,82,1.508520,1.309834,80.268199,0.000000,9.961686,9.770115,0.000000,0.000000,0.000000,80.268199,0.000000,522,OK,
|
||||
binder__165.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__165.pdb,96,13.191188,96,0.593278,0.962081,78.917910,0.000000,9.888060,11.194030,0.000000,0.000000,0.000000,78.917910,0.000000,536,OK,
|
||||
binder__166.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__166.pdb,92,13.044145,92,1.146713,1.410841,79.135338,0.000000,9.210526,10.338346,1.315789,0.000000,0.000000,80.451128,0.000000,532,OK,
|
||||
binder__167.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__167.pdb,71,11.945252,71,1.145346,1.594175,79.843444,0.000000,10.176125,9.980431,0.000000,0.000000,0.000000,79.843444,0.000000,511,OK,
|
||||
binder__168.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__168.pdb,77,13.190983,77,1.736108,1.258828,79.303675,0.000000,9.864603,10.831721,0.000000,0.000000,0.000000,79.303675,0.000000,517,OK,
|
||||
binder__169.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__169.pdb,69,10.726425,69,0.860785,1.260954,79.174853,0.000000,10.805501,10.019646,0.000000,0.000000,0.000000,79.174853,0.000000,509,OK,
|
||||
binder__17.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__17.pdb,73,12.308071,73,1.102044,1.572240,80.311891,0.000000,9.746589,9.941520,0.000000,0.000000,0.000000,80.311891,0.000000,513,OK,
|
||||
binder__170.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__170.pdb,61,14.192801,61,1.516961,1.751350,80.239521,0.000000,10.179641,9.580838,0.000000,0.000000,0.000000,80.239521,0.000000,501,OK,
|
||||
binder__171.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__171.pdb,78,13.669320,78,0.973181,1.922578,80.308880,0.000000,9.845560,9.845560,0.000000,0.000000,0.000000,80.308880,0.000000,518,OK,
|
||||
binder__172.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__172.pdb,67,10.527200,67,0.352979,1.011254,79.487179,0.000000,11.045365,9.467456,0.000000,0.000000,0.000000,79.487179,0.000000,507,OK,
|
||||
binder__173.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__173.pdb,57,11.183579,57,0.391752,1.697079,78.873239,0.000000,10.865191,10.261569,0.000000,0.000000,0.000000,78.873239,0.000000,497,OK,
|
||||
binder__174.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__174.pdb,71,12.160942,71,0.827229,1.542446,80.234834,0.000000,10.371820,9.393346,0.000000,0.000000,0.000000,80.234834,0.000000,511,OK,
|
||||
binder__175.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__175.pdb,84,13.495866,84,1.286644,1.470341,79.770992,0.000000,9.732824,9.923664,0.572519,0.000000,0.000000,80.343511,0.000000,524,OK,
|
||||
binder__176.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__176.pdb,79,11.669857,79,0.549580,1.111666,79.190751,0.000000,10.789981,10.019268,0.000000,0.000000,0.000000,79.190751,0.000000,519,OK,
|
||||
binder__177.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__177.pdb,70,10.898500,70,1.165567,0.562440,79.803922,0.000000,10.196078,10.000000,0.000000,0.000000,0.000000,79.803922,0.000000,510,OK,
|
||||
binder__178.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__178.pdb,64,12.126032,64,1.704870,0.758680,79.563492,0.000000,10.119048,10.317460,0.000000,0.000000,0.000000,79.563492,0.000000,504,OK,
|
||||
binder__179.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__179.pdb,77,12.764652,77,1.760113,1.011049,79.690522,0.000000,9.864603,9.864603,0.580271,0.000000,0.000000,80.270793,0.000000,517,OK,
|
||||
binder__18.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__18.pdb,74,12.586560,74,0.824265,1.615050,79.961089,0.000000,10.116732,9.922179,0.000000,0.000000,0.000000,79.961089,0.000000,514,OK,
|
||||
binder__180.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__180.pdb,67,11.680648,67,0.764395,1.721339,80.078895,0.000000,9.861933,10.059172,0.000000,0.000000,0.000000,80.078895,0.000000,507,OK,
|
||||
binder__181.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__181.pdb,89,12.204827,89,1.084271,1.146191,79.773157,0.000000,9.829868,10.396975,0.000000,0.000000,0.000000,79.773157,0.000000,529,OK,
|
||||
binder__182.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__182.pdb,67,11.832991,67,1.755101,1.098050,78.895464,0.000000,10.059172,11.045365,0.000000,0.000000,0.000000,78.895464,0.000000,507,OK,
|
||||
binder__183.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__183.pdb,61,13.904277,61,1.585850,1.765344,80.039920,0.000000,9.780439,10.179641,0.000000,0.000000,0.000000,80.039920,0.000000,501,OK,
|
||||
binder__184.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__184.pdb,77,11.373480,77,0.872562,0.634050,79.303675,0.000000,10.058027,10.638298,0.000000,0.000000,0.000000,79.303675,0.000000,517,OK,
|
||||
binder__185.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__185.pdb,81,12.070521,81,0.878894,0.512032,80.230326,0.000000,9.596929,10.172745,0.000000,0.000000,0.000000,80.230326,0.000000,521,OK,
|
||||
binder__186.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__186.pdb,69,11.725625,69,0.558192,1.579645,79.371316,0.000000,9.626719,11.001965,0.000000,0.000000,0.000000,79.371316,0.000000,509,OK,
|
||||
binder__187.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__187.pdb,79,13.010083,79,1.749346,0.840457,79.576108,0.000000,9.826590,10.019268,0.578035,0.000000,0.000000,80.154143,0.000000,519,OK,
|
||||
binder__188.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__188.pdb,69,10.673019,69,0.640081,0.563771,77.996071,0.000000,9.626719,11.198428,1.178782,0.000000,0.000000,79.174853,0.000000,509,OK,
|
||||
binder__189.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__189.pdb,84,13.977671,84,1.862460,0.962148,80.725191,0.000000,9.541985,9.732824,0.000000,0.000000,0.000000,80.725191,0.000000,524,OK,
|
||||
binder__19.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__19.pdb,89,12.345034,89,0.472836,1.084149,79.962193,0.000000,10.207940,9.829868,0.000000,0.000000,0.000000,79.962193,0.000000,529,OK,
|
||||
binder__190.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__190.pdb,73,12.200881,73,0.958320,1.665354,79.337232,0.000000,9.746589,10.916179,0.000000,0.000000,0.000000,79.337232,0.000000,513,OK,
|
||||
binder__191.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__191.pdb,90,11.329709,90,0.905380,1.291851,79.433962,0.000000,10.943396,9.622642,0.000000,0.000000,0.000000,79.433962,0.000000,530,OK,
|
||||
binder__192.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__192.pdb,80,13.045259,80,1.414766,1.230870,80.384615,0.000000,10.384615,9.230769,0.000000,0.000000,0.000000,80.384615,0.000000,520,OK,
|
||||
binder__193.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__193.pdb,85,11.975755,85,0.629867,0.892031,79.428571,0.000000,10.095238,10.476190,0.000000,0.000000,0.000000,79.428571,0.000000,525,OK,
|
||||
binder__2.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__2.pdb,58,13.649269,58,1.340512,1.724025,80.120482,0.000000,10.240964,9.638554,0.000000,0.000000,0.000000,80.120482,0.000000,498,OK,
|
||||
binder__20.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__20.pdb,73,10.929759,73,0.662978,0.460223,80.116959,0.000000,10.526316,9.356725,0.000000,0.000000,0.000000,80.116959,0.000000,513,OK,
|
||||
binder__21.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__21.pdb,91,12.252673,91,0.625427,1.273266,78.342750,0.000000,10.357815,11.299435,0.000000,0.000000,0.000000,78.342750,0.000000,531,OK,
|
||||
binder__22.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__22.pdb,66,10.785504,66,0.378896,1.508499,79.841897,0.000000,10.079051,9.486166,0.592885,0.000000,0.000000,80.434783,0.000000,506,OK,
|
||||
binder__23.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__23.pdb,72,12.320114,72,1.471681,0.952689,78.710938,0.000000,10.156250,10.156250,0.976562,0.000000,0.000000,79.687500,0.000000,512,OK,
|
||||
binder__24.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__24.pdb,80,13.296546,80,1.576710,1.051744,80.192308,0.000000,10.576923,9.230769,0.000000,0.000000,0.000000,80.192308,0.000000,520,OK,
|
||||
binder__25.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__25.pdb,73,12.355240,73,0.651027,1.545588,80.311891,0.000000,10.331384,9.356725,0.000000,0.000000,0.000000,80.311891,0.000000,513,OK,
|
||||
binder__26.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__26.pdb,66,10.211405,66,1.247927,1.157894,78.853755,0.000000,11.067194,10.079051,0.000000,0.000000,0.000000,78.853755,0.000000,506,OK,
|
||||
binder__27.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__27.pdb,86,12.192003,86,1.128631,0.988340,79.087452,0.000000,10.266160,10.646388,0.000000,0.000000,0.000000,79.087452,0.000000,526,OK,
|
||||
binder__28.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__28.pdb,68,12.036808,68,0.621693,1.713842,78.543307,0.000000,10.039370,10.826772,0.590551,0.000000,0.000000,79.133858,0.000000,508,OK,
|
||||
binder__29.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__29.pdb,75,13.525894,75,0.943997,1.840014,80.000000,0.000000,10.097087,9.902913,0.000000,0.000000,0.000000,80.000000,0.000000,515,OK,
|
||||
binder__3.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__3.pdb,74,10.939612,74,0.838366,0.921596,78.793774,0.000000,11.089494,9.338521,0.778210,0.000000,0.000000,79.571984,0.000000,514,OK,
|
||||
binder__30.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__30.pdb,96,11.999890,96,0.494450,1.524668,79.477612,0.000000,9.701493,10.820896,0.000000,0.000000,0.000000,79.477612,0.000000,536,OK,
|
||||
binder__31.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__31.pdb,77,12.541053,77,0.963180,1.564716,80.464217,0.000000,10.251451,9.284333,0.000000,0.000000,0.000000,80.464217,0.000000,517,OK,
|
||||
binder__32.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__32.pdb,84,13.852448,84,1.238974,1.687711,79.961832,0.000000,9.732824,9.732824,0.572519,0.000000,0.000000,80.534351,0.000000,524,OK,
|
||||
binder__33.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__33.pdb,72,12.399048,72,1.040232,1.523151,79.882812,0.000000,10.156250,9.960938,0.000000,0.000000,0.000000,79.882812,0.000000,512,OK,
|
||||
binder__34.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__34.pdb,75,12.868299,75,0.811734,1.781085,79.611650,0.000000,10.485437,9.320388,0.582524,0.000000,0.000000,80.194175,0.000000,515,OK,
|
||||
binder__35.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__35.pdb,77,11.106214,77,1.085816,1.062349,79.883946,0.000000,10.831721,9.284333,0.000000,0.000000,0.000000,79.883946,0.000000,517,OK,
|
||||
binder__36.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__36.pdb,94,12.399824,94,1.140161,1.006864,80.337079,0.000000,9.737828,9.925094,0.000000,0.000000,0.000000,80.337079,0.000000,534,OK,
|
||||
binder__37.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__37.pdb,72,12.994132,72,1.882612,0.811029,79.882812,0.000000,10.156250,9.960938,0.000000,0.000000,0.000000,79.882812,0.000000,512,OK,
|
||||
binder__38.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__38.pdb,98,13.146496,98,0.951868,0.899173,79.925651,0.000000,10.594796,8.921933,0.557621,0.000000,0.000000,80.483271,0.000000,538,OK,
|
||||
binder__39.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__39.pdb,91,12.280591,91,1.180446,1.079882,80.037665,0.000000,10.357815,9.039548,0.564972,0.000000,0.000000,80.602637,0.000000,531,OK,
|
||||
binder__4.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__4.pdb,58,13.333587,58,1.524403,1.658960,79.317269,0.000000,10.441767,9.638554,0.602410,0.000000,0.000000,79.919679,0.000000,498,OK,
|
||||
binder__40.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__40.pdb,97,12.000326,97,1.556796,1.243014,80.074488,0.000000,10.428305,9.497207,0.000000,0.000000,0.000000,80.074488,0.000000,537,OK,
|
||||
binder__41.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__41.pdb,73,11.015888,73,0.507100,0.895609,79.337232,0.000000,9.941520,10.721248,0.000000,0.000000,0.000000,79.337232,0.000000,513,OK,
|
||||
binder__42.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__42.pdb,69,10.838379,69,0.437000,0.922180,79.764244,0.000000,10.216110,10.019646,0.000000,0.000000,0.000000,79.764244,0.000000,509,OK,
|
||||
binder__43.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__43.pdb,79,11.383792,79,0.773469,0.680461,79.768786,0.000000,10.982659,9.248555,0.000000,0.000000,0.000000,79.768786,0.000000,519,OK,
|
||||
binder__44.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__44.pdb,80,11.604519,80,1.204398,1.203878,80.384615,0.000000,9.807692,9.807692,0.000000,0.000000,0.000000,80.384615,0.000000,520,OK,
|
||||
binder__45.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__45.pdb,89,14.561584,89,0.778868,1.622543,80.907372,0.000000,9.451796,9.640832,0.000000,0.000000,0.000000,80.907372,0.000000,529,OK,
|
||||
binder__46.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__46.pdb,56,12.667731,56,1.287441,1.565697,78.830645,0.000000,11.491935,9.677419,0.000000,0.000000,0.000000,78.830645,0.000000,496,OK,
|
||||
binder__47.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__47.pdb,90,14.636249,90,1.179501,1.488363,80.943396,0.000000,10.000000,9.056604,0.000000,0.000000,0.000000,80.943396,0.000000,530,OK,
|
||||
binder__48.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__48.pdb,71,12.403594,71,1.507160,1.567346,80.039139,0.000000,9.980431,9.980431,0.000000,0.000000,0.000000,80.039139,0.000000,511,OK,
|
||||
binder__49.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__49.pdb,70,10.691186,70,1.251590,0.943117,79.019608,0.000000,10.392157,10.588235,0.000000,0.000000,0.000000,79.019608,0.000000,510,OK,
|
||||
binder__5.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__5.pdb,90,12.360199,90,1.010829,0.585549,80.943396,0.000000,10.000000,9.056604,0.000000,0.000000,0.000000,80.943396,0.000000,530,OK,
|
||||
binder__50.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__50.pdb,93,12.861619,93,1.099559,1.198658,80.300188,0.000000,9.943715,9.756098,0.000000,0.000000,0.000000,80.300188,0.000000,533,OK,
|
||||
binder__51.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__51.pdb,98,13.334390,98,1.425311,1.345123,81.226766,0.000000,9.293680,9.479554,0.000000,0.000000,0.000000,81.226766,0.000000,538,OK,
|
||||
binder__52.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__52.pdb,75,12.819534,75,0.994759,1.564986,80.388350,0.000000,10.291262,9.320388,0.000000,0.000000,0.000000,80.388350,0.000000,515,OK,
|
||||
binder__53.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__53.pdb,80,11.835319,80,0.699387,0.639417,79.423077,0.000000,10.384615,9.615385,0.576923,0.000000,0.000000,80.000000,0.000000,520,OK,
|
||||
binder__54.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__54.pdb,78,13.257884,78,1.186889,1.626590,79.729730,0.000000,9.652510,9.845560,0.772201,0.000000,0.000000,80.501931,0.000000,518,OK,
|
||||
binder__55.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__55.pdb,80,11.449403,80,1.432565,1.361379,79.807692,0.000000,9.807692,10.384615,0.000000,0.000000,0.000000,79.807692,0.000000,520,OK,
|
||||
binder__56.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__56.pdb,69,10.900514,69,1.614291,1.107331,79.371316,0.000000,10.412574,10.216110,0.000000,0.000000,0.000000,79.371316,0.000000,509,OK,
|
||||
binder__57.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__57.pdb,66,15.148880,66,1.695046,1.638438,80.237154,0.000000,10.276680,9.486166,0.000000,0.000000,0.000000,80.237154,0.000000,506,OK,
|
||||
binder__58.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__58.pdb,76,10.912946,76,0.854154,0.958331,79.069767,0.000000,10.465116,9.883721,0.581395,0.000000,0.000000,79.651163,0.000000,516,OK,
|
||||
binder__59.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__59.pdb,95,12.979399,95,1.292061,1.292826,78.317757,0.000000,9.532710,11.401869,0.747664,0.000000,0.000000,79.065421,0.000000,535,OK,
|
||||
binder__6.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__6.pdb,64,10.644359,64,1.299035,0.919320,79.365079,0.000000,11.111111,9.523810,0.000000,0.000000,0.000000,79.365079,0.000000,504,OK,
|
||||
binder__60.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__60.pdb,63,11.095800,63,1.057419,1.732434,79.920477,0.000000,9.940358,10.139165,0.000000,0.000000,0.000000,79.920477,0.000000,503,OK,
|
||||
binder__61.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__61.pdb,81,11.706718,81,0.707699,1.408769,80.422265,0.000000,9.788868,9.788868,0.000000,0.000000,0.000000,80.422265,0.000000,521,OK,
|
||||
binder__62.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__62.pdb,75,11.310556,75,0.538049,0.497168,78.834951,0.000000,10.291262,10.097087,0.776699,0.000000,0.000000,79.611650,0.000000,515,OK,
|
||||
binder__63.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__63.pdb,55,12.964738,55,1.609461,1.646774,79.797980,0.000000,10.505051,9.696970,0.000000,0.000000,0.000000,79.797980,0.000000,495,OK,
|
||||
binder__64.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__64.pdb,71,11.121790,71,0.553747,0.958626,80.039139,0.000000,10.567515,9.393346,0.000000,0.000000,0.000000,80.039139,0.000000,511,OK,
|
||||
binder__65.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__65.pdb,93,11.830278,93,1.078093,1.595838,79.549719,0.000000,9.756098,10.694184,0.000000,0.000000,0.000000,79.549719,0.000000,533,OK,
|
||||
binder__66.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__66.pdb,81,11.635698,81,1.160792,0.861311,79.654511,0.000000,9.980806,9.788868,0.575816,0.000000,0.000000,80.230326,0.000000,521,OK,
|
||||
binder__67.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__67.pdb,86,12.162357,86,1.002941,1.162036,79.087452,0.000000,10.646388,10.266160,0.000000,0.000000,0.000000,79.087452,0.000000,526,OK,
|
||||
binder__68.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__68.pdb,67,14.798914,67,0.933846,1.997299,80.078895,0.000000,10.453649,9.467456,0.000000,0.000000,0.000000,80.078895,0.000000,507,OK,
|
||||
binder__69.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__69.pdb,80,11.776827,80,0.683639,0.992918,79.423077,0.000000,9.807692,10.192308,0.576923,0.000000,0.000000,80.000000,0.000000,520,OK,
|
||||
binder__7.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__7.pdb,68,10.549167,68,0.932942,0.547671,78.740157,0.000000,10.039370,11.220472,0.000000,0.000000,0.000000,78.740157,0.000000,508,OK,
|
||||
binder__70.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__70.pdb,65,11.478112,65,0.430256,1.664200,80.000000,0.000000,10.495050,9.504950,0.000000,0.000000,0.000000,80.000000,0.000000,505,OK,
|
||||
binder__71.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__71.pdb,79,13.103191,79,1.057051,1.623688,80.539499,0.000000,9.633911,9.826590,0.000000,0.000000,0.000000,80.539499,0.000000,519,OK,
|
||||
binder__72.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__72.pdb,65,14.760021,65,1.361511,1.603319,80.000000,0.000000,9.900990,9.504950,0.594059,0.000000,0.000000,80.594059,0.000000,505,OK,
|
||||
binder__73.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__73.pdb,62,11.057109,62,1.044082,1.740893,79.681275,0.000000,10.159363,10.159363,0.000000,0.000000,0.000000,79.681275,0.000000,502,OK,
|
||||
binder__74.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__74.pdb,83,11.891153,83,0.940739,0.620960,80.305927,0.000000,10.516252,9.177820,0.000000,0.000000,0.000000,80.305927,0.000000,523,OK,
|
||||
binder__75.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__75.pdb,76,11.011531,76,1.180404,0.945176,79.457364,0.000000,9.883721,10.658915,0.000000,0.000000,0.000000,79.457364,0.000000,516,OK,
|
||||
binder__76.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__76.pdb,62,12.123622,62,0.610424,1.891205,80.079681,0.000000,10.358566,9.561753,0.000000,0.000000,0.000000,80.079681,0.000000,502,OK,
|
||||
binder__77.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__77.pdb,80,13.227774,80,1.233513,1.323017,80.192308,0.000000,10.000000,9.807692,0.000000,0.000000,0.000000,80.192308,0.000000,520,OK,
|
||||
binder__78.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__78.pdb,86,12.471128,86,1.638402,1.510645,80.418251,0.000000,9.695817,9.885932,0.000000,0.000000,0.000000,80.418251,0.000000,526,OK,
|
||||
binder__79.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__79.pdb,81,13.247642,81,1.757627,0.691931,80.230326,0.000000,9.788868,9.980806,0.000000,0.000000,0.000000,80.230326,0.000000,521,OK,
|
||||
binder__8.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__8.pdb,66,12.182583,66,1.816216,0.722267,79.644269,0.000000,9.486166,10.869565,0.000000,0.000000,0.000000,79.644269,0.000000,506,OK,
|
||||
binder__80.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__80.pdb,77,12.767275,77,1.494856,0.782298,79.690522,0.000000,9.864603,9.864603,0.580271,0.000000,0.000000,80.270793,0.000000,517,OK,
|
||||
binder__81.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__81.pdb,85,12.120503,85,1.122062,1.105515,80.000000,0.000000,9.714286,10.285714,0.000000,0.000000,0.000000,80.000000,0.000000,525,OK,
|
||||
binder__82.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__82.pdb,91,14.581744,91,0.836780,1.751506,80.225989,0.000000,9.039548,10.734463,0.000000,0.000000,0.000000,80.225989,0.000000,531,OK,
|
||||
binder__83.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__83.pdb,88,14.320428,88,1.523431,1.100964,80.681818,0.000000,9.090909,10.227273,0.000000,0.000000,0.000000,80.681818,0.000000,528,OK,
|
||||
binder__84.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__84.pdb,74,11.218049,74,1.369165,1.394226,80.155642,0.000000,9.922179,9.922179,0.000000,0.000000,0.000000,80.155642,0.000000,514,OK,
|
||||
binder__85.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__85.pdb,81,11.207495,81,1.054231,0.800411,79.654511,0.000000,9.980806,10.364683,0.000000,0.000000,0.000000,79.654511,0.000000,521,OK,
|
||||
binder__86.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__86.pdb,96,12.757799,96,1.179903,0.963421,79.664179,0.000000,10.074627,9.701493,0.559701,0.000000,0.000000,80.223881,0.000000,536,OK,
|
||||
binder__87.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__87.pdb,77,12.820484,77,0.695279,1.592533,79.883946,0.000000,10.058027,9.284333,0.773694,0.000000,0.000000,80.657640,0.000000,517,OK,
|
||||
binder__88.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__88.pdb,93,12.671162,93,1.139570,1.147755,80.487805,0.000000,9.943715,9.568480,0.000000,0.000000,0.000000,80.487805,0.000000,533,OK,
|
||||
binder__89.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__89.pdb,78,11.325623,78,1.773748,1.361215,79.150579,0.000000,10.810811,9.266409,0.772201,0.000000,0.000000,79.922780,0.000000,518,OK,
|
||||
binder__9.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__9.pdb,74,10.921002,74,0.644766,1.017383,79.377432,0.000000,11.284047,9.338521,0.000000,0.000000,0.000000,79.377432,0.000000,514,OK,
|
||||
binder__90.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__90.pdb,91,14.490793,91,1.113399,1.658423,81.167608,0.000000,9.227872,9.604520,0.000000,0.000000,0.000000,81.167608,0.000000,531,OK,
|
||||
binder__91.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__91.pdb,86,13.963948,86,1.320878,1.409802,80.608365,0.000000,9.695817,9.695817,0.000000,0.000000,0.000000,80.608365,0.000000,526,OK,
|
||||
binder__92.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__92.pdb,69,13.327753,69,1.580629,1.614854,79.764244,0.000000,10.216110,9.430255,0.589391,0.000000,0.000000,80.353635,0.000000,509,OK,
|
||||
binder__93.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__93.pdb,69,12.025424,69,1.031348,1.622487,79.764244,0.000000,9.823183,10.412574,0.000000,0.000000,0.000000,79.764244,0.000000,509,OK,
|
||||
binder__94.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__94.pdb,82,11.717856,82,0.817207,1.115078,79.885057,0.000000,10.344828,9.770115,0.000000,0.000000,0.000000,79.885057,0.000000,522,OK,
|
||||
binder__95.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__95.pdb,93,14.736554,93,0.790171,1.660077,80.300188,0.000000,9.943715,9.756098,0.000000,0.000000,0.000000,80.300188,0.000000,533,OK,
|
||||
binder__96.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__96.pdb,74,12.204353,74,0.431443,1.571472,79.766537,0.000000,9.727626,9.922179,0.583658,0.000000,0.000000,80.350195,0.000000,514,OK,
|
||||
binder__97.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__97.pdb,88,12.131188,88,0.706130,0.410902,79.356061,0.000000,10.037879,10.606061,0.000000,0.000000,0.000000,79.356061,0.000000,528,OK,
|
||||
binder__98.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__98.pdb,73,10.926285,73,0.355261,1.141135,79.922027,0.000000,10.136452,9.941520,0.000000,0.000000,0.000000,79.922027,0.000000,513,OK,
|
||||
binder__99.pdb,/Users/dlopezmateos/Desktop/PR-Marathon/final-tutorial-materials/Part2-Backbone-analysis/outputs-test/binder__99.pdb,67,13.462641,67,1.992265,0.738934,79.684418,0.000000,10.059172,10.256410,0.000000,0.000000,0.000000,79.684418,0.000000,507,OK,
|
||||
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
82
tutorials/protein_binder_design/README.md
Normal file
82
tutorials/protein_binder_design/README.md
Normal file
@@ -0,0 +1,82 @@
|
||||
# Files for the Protein Binder Design with RFdiffusion Video Tutorial
|
||||
|
||||
This directory contains example outputs, helper scripts, and supporting materials for a video tutorial on how to use RFdiffusion to design de novo protein binders with motif scaffolding of an existing natural binder. In this tutorial, the design goal is to generate toxin-inspired pore-blocking binders for an ion channel while preserving key functional residues from a natural peptide toxin.
|
||||
|
||||
You can find the corresponding video tutorial on the [Rosetta Commons YouTube channel](https://www.youtube.com/@RosettaCommons).
|
||||
|
||||
This tutorial is based on research conducted by Diego Lopez Mateos in the Yarov-Yarovoy lab at UC Davis, as described in the following paper: [Harnessing Deep Learning Methods for Voltage-Gated Ion Channel Drug Discovery](https://journals.physiology.org/doi/full/10.1152/physiol.00029.2024).
|
||||
|
||||
## Directory Contents
|
||||
|
||||
### Part1-Diffusion
|
||||
This subdirectory contains the shell script that was used in the video tutorial to generate the designed protein binder backbones. The configuration options in this script are discussed in the video. For additional details on the syntax and parameters available in RFdiffusion, see the [RFdiffusion documentation](https://sites.google.com/omsf.io/rfdiffusion/reference-docs/configuration-options?authuser=0).
|
||||
|
||||
Also included:
|
||||
- `channel-toxin.pdb`: the relaxed, trimmed and cleaned input PDB file used for the tutorial. See [Input File Preparation](#input-file-preparation) below for more details.
|
||||
- `outputs-test`: a directory containing 10 example output PDB and TRB files.
|
||||
|
||||
### Part2-Backbone-assessment
|
||||
The subdirectory contains two analysis scripts, `analyze_backbones.py` and `filter_backbones.py`, that are used in the video to discern which generated backbones best satisfy the design criteria.
|
||||
|
||||
`analyze_backbones.py` computes backbone-level metrics such as:
|
||||
- compactness
|
||||
- terminus positioning relative to the interface
|
||||
- secondary-structure content
|
||||
|
||||
`filter_backbones.py` uses the above metrics to select only the designs that pass user-defined thresholds.
|
||||
|
||||
Also included:
|
||||
- `metrics.csv`: the data generated by `analyze_backbones.py` for the structures created in Part 1 of the tutorial.
|
||||
- `outputs-test`: a directory containing 10 example output PDB and TRB files.
|
||||
|
||||
This portion of the tutorial uses [STRIDE](https://academic.oup.com/nar/article/32/suppl_2/W500/1040640) for to analyze the backbones. See [STRIDE Installation](#stride-installation) below to learn how to obtain it on your own computing system.
|
||||
|
||||
## Input File Preparation
|
||||
This section provides a brief overview of how the tutorial input structure was prepared. The specific example shown in the video is tailored to this ion channel-toxin system, but the overall logic is broadly useful for other RFdiffusion binder-design projects. At the same time, it is important to emphasize that input preparation is not a one-size-fits-all procedure. The exact decisions made during preparation depend strongly on the biological target, the target structure being used and the design objective.
|
||||
|
||||
### 1. Structural optimization/relaxation
|
||||
|
||||
As a first step, the starting experimental structure ([PDB: 7SSZ](https://www.rcsb.org/structure/7SSZ)) containing the ion channel Kv1.3 with the pore-blocking toxin Shk was optimized using [Rosetta](https://rosettacommons.org/software/) before being used as input for RFdiffusion. Because this was a cryo-EM structure, we used an electron-density refinement workflow based on this [Rosetta tutorial](https://faculty.washington.edu/dimaio/files/rosetta_density_tutorial_aug18.pdf) to guide the relaxation step using the experimental density map. This is a useful strategy when working from cryo-EM models, since it can improve local geometry while still maintaining consistency with the experimental data.
|
||||
|
||||
### 2. Manual trimming of the structure
|
||||
|
||||
After refinement, the structure was manually trimmed in [ChimeraX](https://www.cgl.ucsf.edu/chimerax/) to retain only the regions relevant for the design task. In this specific case, this involved removing regions that were not needed for pore-blocking binder design, including the voltage-sensor domains, the intracellular portions of the channel, and the Fab attached to the toxin. The final trimmed model retained only the pore-domain region of the channel together with the toxin chain used for motif scaffolding.
|
||||
|
||||
This trimming step was done manually because it is highly target-dependent and requires some structural understanding of the system being designed against. In other applications, the exact regions to keep or remove may be very different depending on the architecture of the target, the intended binding site, and whether structural support regions need to be preserved.
|
||||
|
||||
### 3. Cleaning and renumbering the PDB
|
||||
|
||||
The final preparation step was cleaning and renumbering the PDB. This is generally useful for maintaining consistent residue numbering and removing heteroatoms or other records that may interfere with downstream tools. For this tutorial, we used the `clean_pdb.py` script distributed with Rosetta.
|
||||
|
||||
Example command:
|
||||
|
||||
```bash
|
||||
python ~/Applications/rosetta.binary.m1.release-371/main/tools/protein_tools/scripts/clean_pdb.py 7SSV-relaxed.pdb ABCDH
|
||||
```
|
||||
|
||||
In this example, ABCDH specifies the chains to retain in the cleaned structure. Running this command would generate an output file named `7SSV-relaxed_ABCDH.pdb` containing the cleaned model. Chains `A`, `B`, `C`, and `D` correspond to the four channel subunits, since the ion channel is a homotetramer, and chain `H` corresponds to the toxin chain.
|
||||
|
||||
Together, these three steps produced the final tutorial input structure: a refined, trimmed, cleaned, and renumbered channel-toxin complex suitable for RFdiffusion motif-scaffolding runs.
|
||||
|
||||
## STRIDE installation
|
||||
|
||||
The backbone-assessment part of the tutorial uses [STRIDE](https://academic.oup.com/nar/article/32/suppl_2/W500/1040640) to assign secondary structure and quantify helix, sheet, coil, and turn content in the generated backbone models. If STRIDE is not already installed on your system, one convenient option is to build it directly from the GitHub repository.
|
||||
|
||||
Example installation:
|
||||
|
||||
```bash
|
||||
git clone https://github.com/heiniglab/stride
|
||||
cd stride/
|
||||
make stride
|
||||
```
|
||||
|
||||
You can then test whether the program was built successfully by running:
|
||||
|
||||
```bash
|
||||
./stride
|
||||
```
|
||||
|
||||
If the installation completed correctly, STRIDE should print its usage information, indicating that the executable is ready to use. Depending on your system and workflow, you may also wish to add the executable to your `PATH` or call it explicitly using its full path from within your analysis scripts.
|
||||
|
||||
## Authors
|
||||
The materials in this directory were created by Diego Lopez Mateos, Matthew Hvasta, and Kush Narang for the Tutorial Hackathon track of the 2026 Megathon event hosted by Rosetta Commons. The video tutorial was edited by Austin Seamann.
|
||||
Reference in New Issue
Block a user