import os
import re
from collections import defaultdict
def parse_fasta(file_path):
sequences = []
with open(file_path, 'r') as file:
sequence = ''
header = ''
for line in file:
line = line.strip()
if line.startswith('>'):
if sequence:
weight = int(header.split('_')[-1])
if weight >= 2:
sequences.append((sequence, weight))
sequence = ''
header = line[1:]
else:
sequence += line
if sequence:
weight = int(header.split('_')[-1])
if weight >= 2:
sequences.append((sequence, weight))
return sequences
def calculate_frequencies(sequences):
position_counts = defaultdict(lambda: defaultdict(int))
total_counts = defaultdict(int)
for sequence, weight in sequences:
for i, aa in enumerate(sequence, start=1):
position_counts[i][aa] += weight
total_counts[i] += weight
frequencies = []
for position in sorted(position_counts.keys()):
for aa in position_counts[position]:
frequency = position_counts[position][aa] / total_counts[position]
frequencies.append((aa, position, frequency))
return frequencies
def write_csv(output_path, frequencies):
with open(output_path, 'w') as file:
file.write("Amino Acid,Position,Frequency\n")
for aa, position, frequency in frequencies:
file.write(f"{aa},{position},{frequency:.4f}\n")
def main():
script_dir = os.path.dirname(os.path.abspath(__file__))
fasta_files = [f for f in os.listdir(script_dir) if f.endswith('.fasta')]
for fasta_file in fasta_files:
file_path = os.path.join(script_dir, fasta_file)
sequences = parse_fasta(file_path)
frequencies = calculate_frequencies(sequences)
output_file = fasta_file.replace('.fasta', '_frequencies.csv')
output_path = os.path.join(script_dir, output_file)
write_csv(output_path, frequencies)
print(f"Processed {fasta_file} and saved results to {output_file}")
if __name__ == "__main__":
main()