2026-08-02
This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
#!/usr/bin/env python
|
||||
"""
|
||||
Prepare input sequence file from fasta file in a directory for BPP.
|
||||
"""
|
||||
|
||||
import argparse
|
||||
import sys
|
||||
from pathlib import Path
|
||||
from Bio import SeqIO
|
||||
|
||||
|
||||
def get_fasta_files(input_dir: Path, ext=".fasta") -> list[Path]:
|
||||
"""
|
||||
Get a list of fasta files in the specified directory with the given extension.
|
||||
Args:
|
||||
input_dir (Path): Path to the directory containing fasta files.
|
||||
ext (str): Extension of the fasta files.
|
||||
Returns:
|
||||
list[Path]: List of Paths to the fasta files.
|
||||
"""
|
||||
files = list(input_dir.glob(f"*{ext}"))
|
||||
if not files:
|
||||
print(f"No fasta files with extension '{ext}' found in directory '{input_dir}'")
|
||||
sys.exit(1)
|
||||
return files
|
||||
|
||||
|
||||
def transform_fasta_to_bpp(fasta_file: Path):
|
||||
"""
|
||||
Transform a fasta file into BPP sequence format.
|
||||
Args:
|
||||
fasta_file (Path): Path to the input fasta file.
|
||||
Returns:
|
||||
list[str]: Lines formatted for BPP input.
|
||||
"""
|
||||
num_ind = 0
|
||||
output_lines = []
|
||||
seq_len = []
|
||||
for record in SeqIO.parse(fasta_file, "fasta"):
|
||||
ind_id = record.id
|
||||
num_ind += 1
|
||||
output_lines.append(f"^{ind_id} {str(record.seq)}\n")
|
||||
seq_len.append(len(record.seq))
|
||||
if len(set(seq_len)) != 1:
|
||||
print(f"Error: Sequences in file '{fasta_file}' have different lengths.")
|
||||
sys.exit(1)
|
||||
header = f"{num_ind} {seq_len[0]}\n"
|
||||
return [header, "\n", *output_lines, "\n"]
|
||||
|
||||
|
||||
def make_bpp_seq(input_dir: Path, output_file: Path, ext=".fasta"):
|
||||
"""
|
||||
Create a BPP formatted sequence file from fasta files in a directory.
|
||||
Args:
|
||||
input_dir (Path): Path to the directory containing fasta files.
|
||||
output_file (Path): Path to the output BPP formatted file.
|
||||
ext (str): Extension of the fasta files.
|
||||
"""
|
||||
fasta_files = get_fasta_files(input_dir, ext)
|
||||
with open(output_file, "w") as out_f:
|
||||
for fasta_file in fasta_files:
|
||||
bpp_lines = transform_fasta_to_bpp(fasta_file)
|
||||
out_f.writelines(bpp_lines)
|
||||
print(f"BPP formatted sequence file written to '{output_file}'")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(
|
||||
description="Create a BPP formatted sequence file from fasta files in a directory."
|
||||
)
|
||||
parser.add_argument(
|
||||
"input_dir", type=Path, help="Directory containing fasta files."
|
||||
)
|
||||
parser.add_argument(
|
||||
"output_file", type=Path, help="Output BPP formatted sequence file."
|
||||
)
|
||||
parser.add_argument(
|
||||
"--ext",
|
||||
type=str,
|
||||
default=".fasta",
|
||||
help="Extension of the fasta files (default: .fasta).",
|
||||
)
|
||||
args = parser.parse_args()
|
||||
make_bpp_seq(args.input_dir, args.output_file, args.ext)
|
||||
Reference in New Issue
Block a user