Repository 'alphafold2'
hg clone https://toolshed.g2.bx.psu.edu/repos/galaxy-australia/alphafold2

Changeset 24:31f648b7555a (2025-07-05)
Previous changeset 23:2891385d6ace (2025-04-16) Next changeset 25:c62f678e5555 (2025-07-05)
Commit message:
planemo upload for repository https://github.com/usegalaxy-au/tools-au commit 44db277529c0e189149235cf60a627193a792fba
modified:
alphafold.xml
macro_output.xml
scripts/outputs.py
scripts/validate_fasta.py
b
diff -r 2891385d6ace -r 31f648b7555a alphafold.xml
--- a/alphafold.xml Wed Apr 16 05:46:58 2025 +0000
+++ b/alphafold.xml Sat Jul 05 03:56:38 2025 +0000
[
b'@@ -17,7 +17,7 @@\n       <xref type="bio.tools">alphafold_2</xref>\n     </xrefs>\n     <requirements>\n-        <container type="docker">neoformit/alphafold:v2.3.2_2</container>\n+        <container type="docker">neoformit/alphafold:v2.3.2_0</container>\n     </requirements>\n     <required_files>\n         <include path="scripts/outputs.py" />\n@@ -52,23 +52,6 @@\n #end if\n > alphafold.fasta\n \n-## Read MSA input -------------------------------------------------------------\n-\n-#if $advanced.reuse_msa.selected and $advanced.reuse_msa.msas:\n-    #for msa in $advanced.reuse_msa.msas:\n-        #if $model_preset.selection == \'multimer\':\n-        && MSA_DIR=output/alphafold/msas/${msa.chain}/\n-        #else\n-        && MSA_DIR=output/alphafold/msas/\n-        #end if\n-        && mkdir -p \\$MSA_DIR\n-        && ln -s \'$msa.file\' ${msa.chain}.zip\n-        && unzip ${msa.chain}.zip -d \\$MSA_DIR\n-        && rm ${msa.chain}.zip\n-    #end for\n-#end if\n-\n-\n ## Env vars -------------------------------------------------------------------\n && export TF_FORCE_UNIFIED_MEMORY=1\n && export XLA_PYTHON_CLIENT_MEM_FRACTION=4.0\n@@ -78,7 +61,7 @@\n #if os.environ.get(\'PLANEMO_TESTING\'):\n     ## Run in testing mode (mocks a successful AlphaFold run by copying outputs)\n     && echo "Creating dummy outputs for model_preset=$model_preset.selection..."\n-    && bash \'$__tool_directory__/scripts/mock_alphafold.sh\' $model_preset.selection\n+    && bash \'$__tool_directory__/scripts/mock_alphafold.sh\' $model_preset\n #else:\n     ## Run AlphaFold\n     && python /app/alphafold/run_alphafold.py\n@@ -116,18 +99,15 @@\n         --pdb70_database_path \\${ALPHAFOLD_DB:-/data}/@TOOL_MINOR_VERSION@/pdb70/pdb70\n         #end if\n \n-        #if $advanced.reuse_msa.selected and $advanced.reuse_msa.msas:\n-        --use_precomputed_msas\n+        ## Galaxy-specific options --------------------------------------------\n+        ## See https://github.com/neoformit/alphafold/tree/release_2.3.2_galaxy\n+        #if $advanced.disable_amber_relax:\n+        --disable_amber_relax\n         #end if\n \n-        ## Galaxy-specific options --------------------------------------------\n-        ## See https://github.com/neoformit/alphafold/tree/release_2.3.2_galaxy\n         #if $advanced.limit_model_outputs:\n         --output_models=$limit_model_outputs\n         #end if\n-\n-        $advanced.disable_amber_relax\n-        $advanced.exit_after_msa\n         ## End Galaxy-specific options ----------------------------------------\n \n #end if\n@@ -139,10 +119,7 @@\n $outputs.pae_csv\n $outputs.plots\n $outputs.plot_msa\n-$outputs.msa\n-$advanced.exit_after_msa\n \n-#if not $advanced.exit_after_msa:\n ## HTML output\n && mkdir -p \'${ html.files_path }\'\n && cp output/alphafold/extra/alphafold.html \'${html}\'\n@@ -152,17 +129,8 @@\n ## The working directory ends up two levels deep and the visualization html page\n ## fails to load the PDB files as static assets.\n && (([ -d working ] && cp -r working/* .) || true)\n-#end if\n \n     ]]></command>\n-    <stdio>\n-        <regex\n-            match="concatenation axis must match exactly"\n-            source="stderr"\n-            level="fatal"\n-            description="This error usually indicates that you are re-using an MSA that does not match the query sequence at the specified chain (e.g. position A should match the first sequence in the FASTA file)."\n-        />\n-    </stdio>\n     <inputs>\n         <conditional name="fasta_or_text">\n             <param name="input_mode" type="select" label="Fasta Input" help="Protein sequence(s) to fold. Input can be fasta file from history, or text. Sequence must be valid IUPAC amino acid characters. We recommend submitting sequences with a maximum length of 3000AA, because run time scales exponentially with sequence length. If multiple-sequence FASTA file provided, multimer mode must be selected.">\n@@ -190,20 +158,20 @@\n         </param>\n \n         <conditional name="model_preset">\n-            <param\n+        <param\n                 name="selection"\n-  '..b'quence again (in a different multimer complex, for example). For multimer runs, a ZIP archive will be created for each protein sequence input. The datasets will be labelled as an alphabetical sequence (e.g. A, B, C, ...) corresponding to the order of the FASTA sequence input."\n-            />\n         </section>\n     </inputs>\n \n     <outputs>\n         <expand macro="output_pdb_models" />\n-        <data name="html" format="html" label="${tool.name} on ${on_string}: Visualization">\n-            <filter>not advanced[\'exit_after_msa\']</filter>\n-        </data>\n+        <data name="html" format="html" label="${tool.name} on ${on_string}: Visualization" />\n         <!-- Optional outputs -->\n         <expand macro="output_plddts" />\n         <expand macro="output_msa_plot" />\n@@ -397,7 +305,6 @@\n         <expand macro="output_plots" />\n         <expand macro="output_relax_json" />\n         <expand macro="output_timings_json" />\n-        <expand macro="output_msa" />\n     </outputs>\n \n     <tests>\n@@ -510,7 +417,7 @@\n     |\n \n \n-    **Inputs**\n+    **Input**\n \n     *Amino acid sequence*\n \n@@ -595,29 +502,6 @@\n     |\n     |\n \n-    *MSAs (optional)*\n-\n-    | A collection of multiple sequence alignments (MSAs) in ZIP format.\n-    | For each sequence in the input FASTA file, a separate ZIP archive will be created and labelled in alphabetical sequence (e.g. A, B, C) with respect to the position of the sequence in the query FASTA file.\n-    | If "MSAs only" is selected, this output will be collected automatically.\n-    |\n-    |\n-\n-    **Advanced features**\n-\n-    *Reusing MSAs*\n-\n-    | You can now re-use multiple sequence alignments (MSAs) from a previous AlphaFold run to speed up processing time. This is only useful if you wish to compute models for the same protein multiple times, for example in a one-to-many series of multimers. In these cases, the MSA for a given protein chain can be computed once and then re-used in subsequent jobs. To do this, you must begin by enabling the "Multiple sequence alignments (MSAs)" output in the "Optional outputs" section. This should result in a collection of ZIP archives being collected as an output.\n-    |\n-    | Once you have a collection of MSAs that you can re-use, you can then select "Reuse MSAs" in the "Advanced options" section. This will allow you to select the MSA ZIP archive(s) from your history. It is important that you select an MSA archive corresponding to a specific chain in your input FASTA file. If your MSA archive relates to the first chain in your FASTA file, you should select position "A". If your MSA archive relates to the second chain in your FASTA file, you should select position "B", and so on. Note that an MSA archive labelled MSA-A corresponds to the sequence order in the generating run. This does not necessarily correspond to the current run! Be sure to check the order of your sequences/chains. To avoid confusion here, you could re-label the MSA archives in your History to match the name of the protein/chain they were generated for.\n-    |\n-\n-    *MSA-only mode*\n-\n-    | To speed up generation of MSAs, you can run AlphaFold in "MSA generation only" mode, available under "Advanced options". Use this mode if you only want to obtain MSAs and don\'t want to waste time computing a model. If you have a list of MSAs that you want to generate, you can put them all into one FASTA file and submit them as an MSA-only job in multimer mode. This will result in a collection of MSA archives - one for each sequence provided. To make things less confusing when you come to reuse these MSAs, you may wish to rename each archive in the collection to match the corresponding protein/chain in your input FASTA file - this makes it easy to select the right one when you come to reuse them in a later job!\n-    |\n-    |\n-\n     **AlphaFold configuration**\n \n     | We have configured AlphaFold to run with the parameters suggested by default on `AlphaFold\'s GitHub <https://github.com/deepmind/alphafold>`_.\n'
b
diff -r 2891385d6ace -r 31f648b7555a macro_output.xml
--- a/macro_output.xml Wed Apr 16 05:46:58 2025 +0000
+++ b/macro_output.xml Sat Jul 05 03:56:38 2025 +0000
[
@@ -2,23 +2,17 @@
     <xml name="output_pdb_models">
         <data name="model5" format="pdb" from_work_dir="output/alphafold/ranked_4.pdb" label="${tool.name} on ${on_string}: PDB ranked 4">
             <filter>advanced['limit_model_outputs'] > 4</filter>
-            <filter>not advanced['exit_after_msa']</filter>
         </data>
         <data name="model4" format="pdb" from_work_dir="output/alphafold/ranked_3.pdb" label="${tool.name} on ${on_string}: PDB ranked 3">
             <filter>advanced['limit_model_outputs'] > 3</filter>
-            <filter>not advanced['exit_after_msa']</filter>
         </data>
         <data name="model3" format="pdb" from_work_dir="output/alphafold/ranked_2.pdb" label="${tool.name} on ${on_string}: PDB ranked 2">
             <filter>advanced['limit_model_outputs'] > 2</filter>
-            <filter>not advanced['exit_after_msa']</filter>
         </data>
         <data name="model2" format="pdb" from_work_dir="output/alphafold/ranked_1.pdb" label="${tool.name} on ${on_string}: PDB ranked 1">
             <filter>advanced['limit_model_outputs'] > 1</filter>
-            <filter>not advanced['exit_after_msa']</filter>
         </data>
-        <data name="model1" format="pdb" from_work_dir="output/alphafold/ranked_0.pdb" label="${tool.name} on ${on_string}: PDB ranked 0">
-            <filter>not advanced['exit_after_msa']</filter>
-        </data>
+        <data name="model1" format="pdb" from_work_dir="output/alphafold/ranked_0.pdb" label="${tool.name} on ${on_string}: PDB ranked 0"/>
     </xml>
 
     <xml name="output_pae_csv">
@@ -31,7 +25,6 @@
             <filter>outputs['pae_csv']</filter>
             <filter>model_preset != "monomer"</filter>
             <filter>advanced['limit_model_outputs'] > 4</filter>
-            <filter>not advanced['exit_after_msa']</filter>
         </data>
         <data
             name="pae_ranked_3"
@@ -42,7 +35,6 @@
             <filter>outputs['pae_csv']</filter>
             <filter>model_preset != "monomer"</filter>
             <filter>advanced['limit_model_outputs'] > 3</filter>
-            <filter>not advanced['exit_after_msa']</filter>
         </data>
         <data
             name="pae_ranked_2"
@@ -53,7 +45,6 @@
             <filter>outputs['pae_csv']</filter>
             <filter>model_preset != "monomer"</filter>
             <filter>advanced['limit_model_outputs'] > 2</filter>
-            <filter>not advanced['exit_after_msa']</filter>
         </data>
         <data
             name="pae_ranked_1"
@@ -64,7 +55,6 @@
             <filter>outputs['pae_csv']</filter>
             <filter>model_preset != "monomer"</filter>
             <filter>advanced['limit_model_outputs'] > 1</filter>
-            <filter>not advanced['exit_after_msa']</filter>
         </data>
         <data
             name="pae_ranked_0"
@@ -74,7 +64,6 @@
         >
             <filter>outputs['pae_csv']</filter>
             <filter>model_preset != "monomer"</filter>
-            <filter>not advanced['exit_after_msa']</filter>
         </data>
     </xml>
 
@@ -87,7 +76,6 @@
         >
             <filter>outputs['model_pkls']</filter>
             <filter>advanced['limit_model_outputs'] > 4</filter>
-            <filter>not advanced['exit_after_msa']</filter>
         </data>
         <data
             name="output_ranked_3_pkl"
@@ -97,7 +85,6 @@
         >
             <filter>outputs['model_pkls']</filter>
             <filter>advanced['limit_model_outputs'] > 3</filter>
-            <filter>not advanced['exit_after_msa']</filter>
         </data>
         <data
             name="output_ranked_2_pkl"
@@ -107,7 +94,6 @@
         >
             <filter>outputs['model_pkls']</filter>
             <filter>advanced['limit_model_outputs'] > 2</filter>
-            <filter>not advanced['exit_after_msa']</filter>
         </data>
         <data
             name="output_ranked_1_pkl"
@@ -117,7 +103,6 @@
         >
             <filter>outputs['model_pkls']</filter>
             <filter>advanced['limit_model_outputs'] > 1</filter>
-            <filter>not advanced['exit_after_msa']</filter>
         </data>
         <data
             name="output_ranked_0_pkl"
@@ -126,7 +111,6 @@
             label="${tool.name} on ${on_string}: ranked_0.pkl"
         >
             <filter>outputs['model_pkls']</filter>
-            <filter>not advanced['exit_after_msa']</filter>
         </data>
     </xml>
 
@@ -139,7 +123,6 @@
         >
             <filter>outputs['plots']</filter>
             <filter>advanced['limit_model_outputs'] > 4</filter>
-            <filter>not advanced['exit_after_msa']</filter>
         </data>
         <data
             name="plot_ranked_3"
@@ -149,7 +132,6 @@
         >
             <filter>outputs['plots']</filter>
             <filter>advanced['limit_model_outputs'] > 3</filter>
-            <filter>not advanced['exit_after_msa']</filter>
         </data>
         <data
             name="plot_ranked_2"
@@ -159,7 +141,6 @@
         >
             <filter>outputs['plots']</filter>
             <filter>advanced['limit_model_outputs'] > 2</filter>
-            <filter>not advanced['exit_after_msa']</filter>
         </data>
         <data
             name="plot_ranked_1"
@@ -169,7 +150,6 @@
         >
             <filter>outputs['plots']</filter>
             <filter>advanced['limit_model_outputs'] > 1</filter>
-            <filter>not advanced['exit_after_msa']</filter>
         </data>
         <data
             name="plot_ranked_0"
@@ -178,7 +158,6 @@
             label="${tool.name} on ${on_string}: pLDDT/PAE plot ranked 0"
         >
             <filter>outputs['plots']</filter>
-            <filter>not advanced['exit_after_msa']</filter>
         </data>
     </xml>
 
@@ -190,7 +169,6 @@
             label="${tool.name} on ${on_string}: Model confidence scores"
         >
             <filter>outputs['confidence_scores']</filter>
-            <filter>not advanced['exit_after_msa']</filter>
         </data>
     </xml>
 
@@ -202,7 +180,6 @@
             label="${tool.name} on ${on_string}: MSA plot"
         >
             <filter>outputs['plot_msa']</filter>
-            <filter>not advanced['exit_after_msa']</filter>
         </data>
     </xml>
 
@@ -214,7 +191,6 @@
             label="${tool.name} on ${on_string}: Per-residue confidence scores (plddts)"
         >
             <filter>outputs['plddts']</filter>
-            <filter>not advanced['exit_after_msa']</filter>
         </data>
     </xml>
 
@@ -226,7 +202,6 @@
             label="${tool.name} on ${on_string}: relax_metrics_ranked.json"
         >
             <filter>outputs['relax_json']</filter>
-            <filter>not advanced['exit_after_msa']</filter>
         </data>
     </xml>
 
@@ -238,19 +213,6 @@
             label="${tool.name} on ${on_string}: timings.json"
         >
             <filter>outputs['timings_json']</filter>
-            <filter>not advanced['exit_after_msa']</filter>
         </data>
     </xml>
-
-    <xml name="output_msa">
-        <collection name="output_msa" type="list" label="${tool.name} on ${on_string}: MSAs">
-            <discover_datasets
-                pattern="__designation_and_ext__"
-                directory="output/alphafold/extra/msas"
-                format="zip"
-                visible="false"
-            />
-            <filter>outputs['msa'] or advanced['exit_after_msa']</filter>
-        </collection>
-    </xml>
 </macros>
b
diff -r 2891385d6ace -r 31f648b7555a scripts/outputs.py
--- a/scripts/outputs.py Wed Apr 16 05:46:58 2025 +0000
+++ b/scripts/outputs.py Sat Jul 05 03:56:38 2025 +0000
[
@@ -20,11 +20,12 @@
 import os
 import pickle as pk
 import shutil
-import zipfile
-from matplotlib import pyplot as plt
 from pathlib import Path
 from typing import Dict, List
 
+from matplotlib import pyplot as plt
+
+# Output file paths
 OUTPUT_DIR = 'extra'
 OUTPUTS = {
     'model_pkl': OUTPUT_DIR + '/ranked_{rank}.pkl',
@@ -63,6 +64,7 @@
         self.workdir = None
         self.output_confidence_scores = True
         self.output_residue_scores = False
+        self.is_multimer = False
         self.parse()
 
     def parse(self) -> None:
@@ -98,16 +100,6 @@
             help="Plot multiple-sequence alignment coverage as a heatmap",
             action="store_true",
         )
-        parser.add_argument(
-            "--msa",
-            help="Collect multiple-sequence alignments as ZIP archives",
-            action="store_true",
-        )
-        parser.add_argument(
-            "--msa_only",
-            help="Alphafold generated MSA files only - skip all other outputs",
-            action="store_true",
-        )
         args = parser.parse_args()
         self.workdir = Path(args.workdir.rstrip('/'))
         self.output_residue_scores = args.confidence_scores
@@ -115,11 +107,8 @@
         self.output_model_plots = args.plot
         self.output_pae = args.pae
         self.plot_msa = args.plot_msa
-        self.collect_msas = args.msa
         self.model_preset = self._sniff_model_preset()
-        self.is_multimer = self.model_preset == PRESETS.multimer
         self.output_dir = self.workdir / OUTPUT_DIR
-        self.msa_only = args.msa_only
         os.makedirs(self.output_dir, exist_ok=True)
 
     def _sniff_model_preset(self) -> bool:
@@ -131,14 +120,13 @@
                 if '_ptm_' in path.name:
                     return PRESETS.monomer_ptm
                 return PRESETS.monomer
-        return PRESETS.monomer
 
 
 class ExecutionContext:
     """Collect file paths etc."""
     def __init__(self, settings: Settings):
         self.settings = settings
-        if settings.is_multimer:
+        if settings.model_preset == PRESETS.multimer:
             self.plddt_key = PLDDT_KEY.multimer
         else:
             self.plddt_key = PLDDT_KEY.monomer
@@ -211,7 +199,7 @@
 
     def get_plddt_for_rank(self, rank: int) -> List[float]:
         """Get pLDDT score for model instance."""
-        return self.data[self.context.plddt_key][self.data['order'][rank - 1]]
+        return self.data[self.context.plddt_key][self.data['order'][rank]]
 
     def get_rank_for_model(self, model_name: str) -> int:
         """Return 0-indexed rank for given model name.
@@ -228,7 +216,8 @@
     header = ['model', context.plddt_key]
 
     for i, path in enumerate(context.model_pkl_paths):
-        rank = int(path.name.split('model_')[-1][0])
+        model_name = 'model_' + path.stem.split('model_')[1]
+        rank = ranking.get_rank_for_model(model_name)
         scores_ls = [ranking.get_plddt_for_rank(rank)]
         with open(path, 'rb') as f:
             data = pk.load(f)
@@ -244,8 +233,9 @@
 
     with open(outfile, 'w') as f:
         f.write('\t'.join(header) + '\n')
-        for rank, score_ls in scores.items():
-            row = [f"ranked_{rank - 1}"] + [str(x) for x in score_ls]
+        for rank in sorted(scores):
+            score_ls = scores[rank]
+            row = [f"ranked_{rank}"] + [str(x) for x in score_ls]
             f.write('\t'.join(row) + '\n')
 
 
@@ -390,53 +380,6 @@
     plt.close()
 
 
-def collect_msas(settings: Settings):
-    """Collect MSA files into ZIP archive(s)."""
-
-    def zip_dir(directory: Path, is_multimer: bool, name: str):
-        chain_id = directory.with_suffix('.zip').stem
-        msa_dir = settings.output_dir / 'msas'
-        msa_dir.mkdir(exist_ok=True)
-        zip_name = (
-            f"MSA-{chain_id}-{name}.zip"
-            if is_multimer
-            else f"MSA-{name}.zip")
-        zip_path = msa_dir / zip_name
-        with zipfile.ZipFile(zip_path, 'w') as z:
-            for path in directory.glob('*'):
-                z.write(path, path.name)
-
-    print("Collecting MSA archives...")
-    chain_names = get_input_sequence_ids(
-        settings.workdir.parent.parent / 'alphafold.fasta')
-    msa_dir = settings.workdir / 'msas'
-    is_multimer = (msa_dir / 'A').exists()
-    if is_multimer:
-        msa_dirs = sorted([
-            path for path in msa_dir.glob('*')
-            if path.is_dir()
-        ])
-        for i, path in enumerate(msa_dirs):
-            zip_dir(path, is_multimer, chain_names[i])
-    else:
-        zip_dir(msa_dir, is_multimer, chain_names[0])
-
-
-def get_input_sequence_ids(fasta_file: Path) -> List[str]:
-    """Read headers from the input FASTA file.
-    Split them to get a sequence ID and truncate to 20 chars max.
-    """
-    headers = []
-    for line in fasta_file.read_text().split('\n'):
-        if line.startswith('>'):
-            seq_id = line[1:].split(' ')[0]
-            seq_id_trunc = seq_id[:20].strip()
-            if len(seq_id) > 20:
-                seq_id_trunc += '...'
-            headers.append(seq_id_trunc)
-    return headers
-
-
 def template_html(context: ExecutionContext):
     """Template HTML file.
 
@@ -456,27 +399,24 @@
 def main():
     """Parse output files and generate additional output files."""
     settings = Settings()
-    if not settings.msa_only:
-        context = ExecutionContext(settings)
-        ranking = ResultRanking(context)
-        write_confidence_scores(ranking, context)
-        rekey_relax_metrics(ranking, context)
-        template_html(context)
+    context = ExecutionContext(settings)
+    ranking = ResultRanking(context)
+    write_confidence_scores(ranking, context)
+    rekey_relax_metrics(ranking, context)
+    template_html(context)
 
-        # Optional outputs
-        if settings.output_model_pkls:
-            rename_model_pkls(ranking, context)
-        if settings.output_model_plots:
-            plddt_pae_plots(ranking, context)
-        if settings.output_pae:
-            # Only created by monomer_ptm and multimer models
-            extract_pae_to_csv(ranking, context)
-        if settings.output_residue_scores:
-            write_per_residue_scores(ranking, context)
-        if settings.plot_msa:
-            plot_msa(settings.workdir)
-    if settings.collect_msas or settings.msa_only:
-        collect_msas(settings)
+    # Optional outputs
+    if settings.output_model_pkls:
+        rename_model_pkls(ranking, context)
+    if settings.output_model_plots:
+        plddt_pae_plots(ranking, context)
+    if settings.output_pae:
+        # Only created by monomer_ptm and multimer models
+        extract_pae_to_csv(ranking, context)
+    if settings.output_residue_scores:
+        write_per_residue_scores(ranking, context)
+    if settings.plot_msa:
+        plot_msa(context.settings.workdir)
 
 
 if __name__ == '__main__':
b
diff -r 2891385d6ace -r 31f648b7555a scripts/validate_fasta.py
--- a/scripts/validate_fasta.py Wed Apr 16 05:46:58 2025 +0000
+++ b/scripts/validate_fasta.py Sat Jul 05 03:56:38 2025 +0000
[
@@ -12,7 +12,7 @@
 class Fasta:
     def __init__(self, header_str: str, seq_str: str):
         self.header = header_str
-        self.sequence = seq_str
+        self.aa_seq = seq_str
 
 
 class FastaLoader:
@@ -140,16 +140,16 @@
         """Confirm whether sequence length is valid."""
         fasta = self.fasta_list[0]
         if self.min_length:
-            if len(fasta.sequence) < self.min_length:
+            if len(fasta.aa_seq) < self.min_length:
                 raise ValueError(
                     'Error encountered validating FASTA:\n Sequence too short'
-                    f' ({len(fasta.sequence)}AA).'
+                    f' ({len(fasta.aa_seq)}AA).'
                     f' Minimum length is {self.min_length}AA.')
         if self.max_length:
-            if len(fasta.sequence) > self.max_length:
+            if len(fasta.aa_seq) > self.max_length:
                 raise ValueError(
                     'Error encountered validating FASTA:\n'
-                    f' Sequence too long ({len(fasta.sequence)}AA).'
+                    f' Sequence too long ({len(fasta.aa_seq)}AA).'
                     f' Maximum length is {self.max_length}AA.')
 
     def validate_alphabet(self):
@@ -158,7 +158,7 @@
         If not, report the offending character and its position.
         """
         fasta = self.fasta_list[0]
-        for i, char in enumerate(fasta.sequence.upper()):
+        for i, char in enumerate(fasta.aa_seq.upper()):
             if char not in self.iupac_characters:
                 raise ValueError(
                     'Error encountered validating FASTA:\n Invalid amino acid'
@@ -167,7 +167,7 @@
     def validate_x(self):
         """Check for X bases."""
         fasta = self.fasta_list[0]
-        for i, char in enumerate(fasta.sequence.upper()):
+        for i, char in enumerate(fasta.aa_seq.upper()):
             if char == 'X':
                 raise ValueError(
                     'Error encountered validating FASTA:\n Unsupported AA code'
@@ -180,14 +180,14 @@
 
     def write(self, fasta: Fasta):
         header = fasta.header
-        seq = self.format_sequence(fasta.sequence)
+        seq = self.format_sequence(fasta.aa_seq)
         sys.stdout.write(header + '\n')
         sys.stdout.write(seq)
 
-    def format_sequence(self, sequence: str):
+    def format_sequence(self, aa_seq: str):
         formatted_seq = ''
-        for i in range(0, len(sequence), self.line_wrap):
-            formatted_seq += sequence[i: i + self.line_wrap] + '\n'
+        for i in range(0, len(aa_seq), self.line_wrap):
+            formatted_seq += aa_seq[i: i + self.line_wrap] + '\n'
         return formatted_seq.upper()
 
 
@@ -214,7 +214,7 @@
         sys.stderr.write("Validated FASTA sequence(s):\n\n")
         for fas in clean_fastas:
             sys.stderr.write(fas.header + '\n')
-            sys.stderr.write(fas.sequence + '\n\n')
+            sys.stderr.write(fas.aa_seq + '\n\n')
 
     except ValueError as exc:
         sys.stderr.write(f"{exc}\n\n")