PYSurf / SequenceLogos / FreqCalculatorN.py
FreqCalculatorN.py
Raw
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()