From 525205ac24052bb6cc7d0a92f727e5fee352c54d Mon Sep 17 00:00:00 2001 From: thsa Date: Wed, 4 Dec 2024 21:38:15 +0100 Subject: [PATCH] fixed an issue with missing bonds --- .../com/actelion/research/chem/Molecule.java | 2 +- .../chem/io/pdb/converter/AminoAcids.java | 122 ++++++++++++++++++ .../converter/AminoAcidsLabeledContainer.java | 102 --------------- .../converter/ConstantsAminoAcidsLabeled.java | 48 ------- .../io/pdb/parser/ProteinSynthesizer.java | 44 +++---- .../research/chem/io/pdb/parser/Residue.java | 24 +--- .../io/pdb/parser/StructureAssembler.java | 47 ++++--- .../gui/editor/GenericEditorArea.java | 2 +- .../resources/pdb/aminoAcidsLabeled.txt | 26 ---- 9 files changed, 170 insertions(+), 247 deletions(-) create mode 100644 src/main/java/com/actelion/research/chem/io/pdb/converter/AminoAcids.java delete mode 100644 src/main/java/com/actelion/research/chem/io/pdb/converter/AminoAcidsLabeledContainer.java delete mode 100644 src/main/java/com/actelion/research/chem/io/pdb/converter/ConstantsAminoAcidsLabeled.java delete mode 100644 src/main/resources/resources/pdb/aminoAcidsLabeled.txt diff --git a/src/main/java/com/actelion/research/chem/Molecule.java b/src/main/java/com/actelion/research/chem/Molecule.java index 90d84ad2..66cff527 100644 --- a/src/main/java/com/actelion/research/chem/Molecule.java +++ b/src/main/java/com/actelion/research/chem/Molecule.java @@ -3607,7 +3607,7 @@ public void setAtomCustomLabel(int atom, String label) { label = null; else { int atomicNo = getAtomicNoFromLabel(label); - if ((atomicNo != 0 && label.equals(cAtomLabel[atomicNo])) + if ((atomicNo != 0 && atomicNo == mAtomicNo[atom]) || label.equals("?")) { setAtomicNo(atom, atomicNo); label = null; diff --git a/src/main/java/com/actelion/research/chem/io/pdb/converter/AminoAcids.java b/src/main/java/com/actelion/research/chem/io/pdb/converter/AminoAcids.java new file mode 100644 index 00000000..330dfdca --- /dev/null +++ b/src/main/java/com/actelion/research/chem/io/pdb/converter/AminoAcids.java @@ -0,0 +1,122 @@ +/* + * Copyright (c) 1997 - 2016 + * Actelion Pharmaceuticals Ltd. + * Gewerbestrasse 16 + * CH-4123 Allschwil, Switzerland + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of the the copyright holder nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * @author Modest v. Korff, Thomas Sander + */ + +package com.actelion.research.chem.io.pdb.converter; + +import com.actelion.research.chem.*; +import com.actelion.research.chem.io.pdb.parser.AtomRecord; + +import java.util.*; + +public class AminoAcids { + private static final String[][] AA_TEMPLATES = { + { "gGX`BDdwMULPGzILwXM[jD", "Alanine", "ala" }, + { "dctd@BE]ADf{UYjjihp`GzBfMvCS]Plw^OMtbK]hrwUj}tRfwnbXp", "Arginine", "arg" }, + { "diEL@BDDyInvZjZL`OtiL[lFfzaYn|^{iFLO]Hi`", "Asparagine", "asn" }, + { "diFB@BANEInvZjZLHA~eIc]`twTKMwcw]Hqa{iEL", "Aspartic Acid", "asp" }, + { "gNxhMV@aI[jihj@?SHF{ac]PinpP", "Cysteine", "Cys" }, + { "defB@BAAeInufjihr@?QdqnpZ[jEf{qyndQ{mFMO]hi`","Glutamic Acid", "glu" }, + { "deeL@BdDEInufjihp`GzLfMvCS]Plw^OMtbO]hqi{mEL", "Glutamine", "gln" }, + { "gJX`BDdvu@OtbYnpP", "Glycine", "gly" }, + { "dmwD@ByPQInvVUZjejL`OtyL[lFfzaYn|^{iFLO]Hii{mFLo]hi`", "Histidine", "his" }, + { "diFD@BADf{ejjdrU@_iRXwXMMuBw]xqn{oELO]Hq`", "Isoleucine", "ile" }, + { "diFD@BADf{Yjjhr@?RdqnpZ[jEf{q{ndTp}tcF@", "Leucine", "leu" }, + { "deeD@BdDR[mUjjjL`OtYL[lFfzaYn|^[iDV{QenkP", "Lysine", "lys" }, + { "diFD`JxPBDivzjihI@?RdAndX[oEF{QqnhR[lD", "Methionine", "met" }, + { "dcND@BADf{YU]Zj@@cHC}ASF{AinhV[oGnzQSCwRLZ^{QSKwZL[Vzm@", "Phenylalanine", "phe" }, + { "daFD@BADfyVyjjhr@?PdqnpZ[jEfzQyn|P", "Proline", "pro" }, + { "gNy`BDtf{ZjfHC}Lf[lFmuBv{q@", "Serine", "ser" }, + { "dazL@BAFR[nZjdrT`_hRXwXMMuBw]xqn{oEL", "Threonine", "thr" }, + { "foAP`@BZ@aInvYWejsfjiB@bFB@OttfF{AhwTKF{qywRJXW]Hqi]vbfUwZN[W]hqc]uZfmwUnYw]Di`", "Tryptophane", "trp" }, + { "dknL@BACR[me]]Zj@BHr@?RTqnpZ[jEf{q{ndTp}tcFgntTr}vcFunkS[hd", "Tyrosine", "tyr" }, + { "dazD@BADf{fjjL`OtIL[lFfza[n|Tw]wcF@", "Valine", "val" } + }; + + private static TreeMap sShortLabelMap; + + public static StereoMolecule getStructure(String label) { + return ensureAAMap().get(label.toLowerCase()); + } + + public static Molecule3D createResidue(String label, List atomRecordList) { + StereoMolecule mol = getStructure(label); + if (mol != null) { + Molecule3D aminoAcid = new Molecule3D(mol); + Map recordMap = new HashMap<>(); + for(AtomRecord record : atomRecordList) + recordMap.put(record.getAtomName(), record); + + for (int atom=0; atom ensureAAMap() { + if (sShortLabelMap == null) { + sShortLabelMap = new TreeMap<>(); + for (String[] template : AA_TEMPLATES) { + StereoMolecule mol = new IDCodeParserWithoutCoordinateInvention().getCompactMolecule(template[0]); + mol.setName(template[1]); + sShortLabelMap.put(template[2], mol); + } + } + return sShortLabelMap; + } +} diff --git a/src/main/java/com/actelion/research/chem/io/pdb/converter/AminoAcidsLabeledContainer.java b/src/main/java/com/actelion/research/chem/io/pdb/converter/AminoAcidsLabeledContainer.java deleted file mode 100644 index 487ca899..00000000 --- a/src/main/java/com/actelion/research/chem/io/pdb/converter/AminoAcidsLabeledContainer.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (c) 1997 - 2016 - * Actelion Pharmaceuticals Ltd. - * Gewerbestrasse 16 - * CH-4123 Allschwil, Switzerland - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of the the copyright holder nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * @author Modest v. Korff - */ - -package com.actelion.research.chem.io.pdb.converter; - -import com.actelion.research.chem.IDCodeParser; -import com.actelion.research.chem.StereoMolecule; -import com.actelion.research.util.IO; - -import java.io.InputStream; -import java.util.HashMap; -import java.util.List; - -/** - * AminoAcidsLabeledContainer - * - * The txt file was generated with com.actelion.research.chem.parsers.pdb.ProcessLabeledAminoAcids - */ -public enum AminoAcidsLabeledContainer { // enum singleton pattern; - - INSTANCE; - - public static final int AMINO_ACIDS = 20; - - private HashMap hmAbbreviation_AminoAcidLabeled; - - private AminoAcidsLabeledContainer() { - read(); - } - - private void read() { - try { - InputStream inputStream= this.getClass().getResourceAsStream(ConstantsAminoAcidsLabeled.RESOURCE_AAS_LABELED); - - List li = IO.readLines2List(inputStream); - - inputStream.close(); - - // Remove comments. - for (int i = li.size() - 1; i >= 0; i--) { - if(li.get(i).startsWith("#")){ - li.remove(i); - } - } - - IDCodeParser parser = new IDCodeParser(); - - hmAbbreviation_AminoAcidLabeled = new HashMap<>(); - for (String line : li) { - - String [] arr = line.split("\t"); - - StereoMolecule mol = parser.getCompactMolecule(arr[0], arr[1]); - - String key = arr[3].toUpperCase(); - - AminoAcidLabeled aminoAcidLabeled = new AminoAcidLabeled(mol, arr[2], key); - - hmAbbreviation_AminoAcidLabeled.put(key, aminoAcidLabeled); - - } - } - catch(Exception e) { - System.err.println("no Amino-Acid File detected!"); - } - } - - public AminoAcidLabeled get(String threeLetterCodeUpperCase) { - return hmAbbreviation_AminoAcidLabeled.get(threeLetterCodeUpperCase); - } -} diff --git a/src/main/java/com/actelion/research/chem/io/pdb/converter/ConstantsAminoAcidsLabeled.java b/src/main/java/com/actelion/research/chem/io/pdb/converter/ConstantsAminoAcidsLabeled.java deleted file mode 100644 index 26632f59..00000000 --- a/src/main/java/com/actelion/research/chem/io/pdb/converter/ConstantsAminoAcidsLabeled.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 1997 - 2016 - * Actelion Pharmaceuticals Ltd. - * Gewerbestrasse 16 - * CH-4123 Allschwil, Switzerland - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of the the copyright holder nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * @author Modest v. Korff - */ - -package com.actelion.research.chem.io.pdb.converter; - -/** - * ConstantsAminoAcidsLabeled - */ -public class ConstantsAminoAcidsLabeled { - - public static final String TAG_AAS_NAME = "Name"; - - public static final String TAG_AAS_ABBR1 = "Abbreviation1"; - - public static final String RESOURCE_AAS_LABELED = "/resources/pdb/aminoAcidsLabeled.txt"; - -} diff --git a/src/main/java/com/actelion/research/chem/io/pdb/parser/ProteinSynthesizer.java b/src/main/java/com/actelion/research/chem/io/pdb/parser/ProteinSynthesizer.java index 3dab99bd..1f658d27 100644 --- a/src/main/java/com/actelion/research/chem/io/pdb/parser/ProteinSynthesizer.java +++ b/src/main/java/com/actelion/research/chem/io/pdb/parser/ProteinSynthesizer.java @@ -6,12 +6,8 @@ public class ProteinSynthesizer { - private Molecule3D protein; - private int terminalC=-1; - - public ProteinSynthesizer() { - } - + private Molecule3D mProtein; + private int mTerminalC =-1; /** * an amino acid is added to the protein structure and a peptide coupling is performed, @@ -27,42 +23,40 @@ public boolean addResidue(Molecule3D residue) { newTerminalN = atom; if(residue.getAtomicNo(atom)==6 && residue.getAtomCustomLabel(atom)==null) newTerminalC = atom; - } - if(protein==null) { // first residue - protein = residue; - terminalC = newTerminalC; + if(mProtein ==null) { // first residue + mProtein = residue; + mTerminalC = newTerminalC; coupled = true; } - else if(newTerminalN>-1 && terminalC>-1) { //coupling should be performed - Coordinates coordsC = protein.getCoordinates(terminalC); + else if(newTerminalN>-1 && mTerminalC >-1) { //coupling should be performed + Coordinates coordsC = mProtein.getCoordinates(mTerminalC); Coordinates coordsN = residue.getCoordinates(newTerminalN); if(coordsC.distanceSquared(coordsN)=0) { - protein.deleteAtom(toDelete); - int[] atomMap = protein.addMolecule(residue); - protein.addBond(terminalC, atomMap[newTerminalN], 1); - terminalC = protein.getAllAtoms()-(residue.getAllAtoms()-newTerminalC); + mProtein.deleteAtom(toDelete); + int[] atomMap = mProtein.addMolecule(residue); + mProtein.addBond(mTerminalC, atomMap[newTerminalN], 1); + mTerminalC = mProtein.getAllAtoms()-(residue.getAllAtoms()-newTerminalC); coupled = true; } } } - protein.ensureHelperArrays(Molecule.cHelperNeighbours); + mProtein.ensureHelperArrays(Molecule.cHelperNeighbours); return coupled; } - public Molecule3D retrieveProtein() { - return protein; + public Molecule3D getProtein() { + return mProtein; } - } diff --git a/src/main/java/com/actelion/research/chem/io/pdb/parser/Residue.java b/src/main/java/com/actelion/research/chem/io/pdb/parser/Residue.java index 5817942e..bc8add12 100644 --- a/src/main/java/com/actelion/research/chem/io/pdb/parser/Residue.java +++ b/src/main/java/com/actelion/research/chem/io/pdb/parser/Residue.java @@ -36,12 +36,10 @@ import com.actelion.research.chem.Molecule; import com.actelion.research.chem.Molecule3D; -import com.actelion.research.chem.io.pdb.converter.AminoAcidsLabeledContainer; +import com.actelion.research.chem.io.pdb.converter.AminoAcids; import com.actelion.research.chem.io.pdb.converter.BondsCalculator; -import java.util.HashMap; import java.util.List; -import java.util.Map; /** * ModelGroupAtoms @@ -73,27 +71,13 @@ public boolean isTerminal() { } private Molecule3D constructFragment() { - boolean isAA = AminoAcidsLabeledContainer.INSTANCE.get(getResname()) != null; - Molecule3D fragment = isAA ? constructFragmentFromIDCode(getResname()) - : constructFragmentFromGeometry(); + Molecule3D fragment = AminoAcids.createResidue(getResname(), records); + if (fragment == null) + fragment = constructFragmentFromGeometry(); fragment.ensureHelperArrays(Molecule.cHelperNeighbours); return fragment; } - private Molecule3D constructFragmentFromIDCode(String resname) { - Molecule3D fragment; - Map recordMap = new HashMap(); - for(AtomRecord record : records) { - String atomName = record.getAtomName(); - recordMap.put(atomName,record); - } - fragment = AminoAcidsLabeledContainer.INSTANCE.get(resname).createResidue(recordMap); - if(fragment==null) { - fragment = constructFragmentFromGeometry(); - } - return fragment; - } - private Molecule3D constructFragmentFromGeometry() { Molecule3D fragment = new Molecule3D(); String altLoc = null; diff --git a/src/main/java/com/actelion/research/chem/io/pdb/parser/StructureAssembler.java b/src/main/java/com/actelion/research/chem/io/pdb/parser/StructureAssembler.java index ba290ae3..77af1646 100644 --- a/src/main/java/com/actelion/research/chem/io/pdb/parser/StructureAssembler.java +++ b/src/main/java/com/actelion/research/chem/io/pdb/parser/StructureAssembler.java @@ -69,10 +69,8 @@ private void group() { } private Molecule3D buildProtein() { - ProteinSynthesizer proteinSynthesizer = new ProteinSynthesizer(); - Map> residues_; List proteinRecords = groups.get(PROTEIN_GROUP); - residues_ = proteinRecords.stream().collect(Collectors.groupingBy(AtomRecord::getString)); + Map> residues_ = proteinRecords.stream().collect(Collectors.groupingBy(AtomRecord::getString)); List residues = residues_.values().stream().map(v -> new Residue(v, true, false)).collect(Collectors.toList()); residues.sort((c1,c2) -> { if(!c1.getChainID().equals(c2.getChainID())) //different chains @@ -85,32 +83,33 @@ private Molecule3D buildProtein() { } } }); - + + ProteinSynthesizer proteinSynthesizer = new ProteinSynthesizer(); List protMols = new ArrayList(); for(Residue residue : residues) { - Molecule3D fragment = residue.getMolecule(); - if(fragment.getAtomAmino(0).trim().equals("ACT") || fragment.getAtomAmino(0).trim().equals("LIG")) { - mols.get(LIGAND_GROUP).add(fragment); - continue; - } - else if(fragment.getAtomAmino(0).trim().equals("HOH")) { - mols.get(SOLVENT_GROUP).add(fragment); - continue; - } - boolean coupled = proteinSynthesizer.addResidue(fragment); - if(coupled) { - if(residue.isTerminal()) { - protMols.add(proteinSynthesizer.retrieveProtein()); - proteinSynthesizer = new ProteinSynthesizer(); - } - } - else { //coupling failed - protMols.add(proteinSynthesizer.retrieveProtein()); + Molecule3D fragment = residue.getMolecule(); + if(fragment.getAtomAmino(0).trim().equals("ACT") || fragment.getAtomAmino(0).trim().equals("LIG")) { + mols.get(LIGAND_GROUP).add(fragment); + continue; + } + else if(fragment.getAtomAmino(0).trim().equals("HOH")) { + mols.get(SOLVENT_GROUP).add(fragment); + continue; + } + + if(proteinSynthesizer.addResidue(fragment)) { + if(residue.isTerminal()) { + protMols.add(proteinSynthesizer.getProtein()); proteinSynthesizer = new ProteinSynthesizer(); - proteinSynthesizer.addResidue(fragment); } } - Molecule3D nextMol = proteinSynthesizer.retrieveProtein(); + else { //coupling failed + protMols.add(proteinSynthesizer.getProtein()); + proteinSynthesizer = new ProteinSynthesizer(); + proteinSynthesizer.addResidue(fragment); + } + } + Molecule3D nextMol = proteinSynthesizer.getProtein(); if(nextMol!=null && !protMols.contains(nextMol)) protMols.add(nextMol); Molecule3D protein = protMols.stream().reduce((mol1,mol2) ->{ diff --git a/src/main/java/com/actelion/research/gui/editor/GenericEditorArea.java b/src/main/java/com/actelion/research/gui/editor/GenericEditorArea.java index f8351812..51cd1a29 100644 --- a/src/main/java/com/actelion/research/gui/editor/GenericEditorArea.java +++ b/src/main/java/com/actelion/research/gui/editor/GenericEditorArea.java @@ -1903,7 +1903,7 @@ private void mousePressedButton1(GenericMouseEvent gme) { changeAtomicNo(53); break; case GenericEditorToolbar.cToolCustomAtom: - if (gme.isControlDown()) { + if (gme.isControlDown() || gme.isAltDown()) { int atom = mMol.findAtom(mX1, mY1); if (atom != -1) { showCustomAtomDialog(atom); diff --git a/src/main/resources/resources/pdb/aminoAcidsLabeled.txt b/src/main/resources/resources/pdb/aminoAcidsLabeled.txt deleted file mode 100644 index f8e37493..00000000 --- a/src/main/resources/resources/pdb/aminoAcidsLabeled.txt +++ /dev/null @@ -1,26 +0,0 @@ -# Modest v. Korff 17.04.2018 -# DWAR Idcodes for the twenty natural amino acids. -# The atoms of the resudues are labeled according to the PDB atom label. -# Example: http://ligand-expo.rcsb.org/reports/T/TYR/TYR_D3L1.gif -# For labeling the custom label in the idcode was used. -# Structure idcoordinates2D Name Abbreviation1 -gGX`BDdwMULPGzILwXM[jD !BMpLwOGyB@Lw@p Alanine Ala -dctd@BE]ADf{UYjjihp`GzBfMvCS]Plw^OMtbK]hrwUj}tRfwnbXp !Bb@J~@Hb}oe~H@hb}b@JHoX`Bo`BHoP Arginine Arg -diEL@BDDyInvZjZL`OtiL[lFfzaYn|^{iFLO]Hi` !B_g|H@s\CMpI~_p`CBCq~_p Asparagine Asn -diFB@BANEInvZjZLHA~eIc]`twTKMwcw]Hqa{iEL !Bog}p@s\CMwr~_w@C\Er~_p Aspartic Acid Asp -gNxhMV@aI[jihj@SHF{qc]PinpP !BMupw@s]\og|w@w@C Cysteine Cys -defB@BAAeInufjihr@QdqnpZ[jEf{qyndQ{mFMO]hi` !BROqHo[x@EqHDb}ROr~@Db} Glutamic Acid Glu -deeL@BdDEInufjihp`GzLfMvCS]Plw^OMtbO]hqi{mEL !BR@IH_Wx@UpIH@da}R@I~@Da} Glutamine Gln -gJX`BDdvu@OtbYnpP !BMpLwOGyB@L Glycine Gly -dmwD@ByPQInvVUZjejL`OtyL[lFfzaYn|^{iFLO]Hii{mFLo]hi` !Bo`@W@d`Bo`AHo[y_QzLXh~hoqR| Histidine His -diFD@BADf{ejjdrU@_iRXwXMMuBw]xqn{oELO]Hq` !B_g|H@s\CMpI~_p`CMpM~_p Isoleucine Ile -diFD@BADf{Yjjhr@RdqnpZ[jEf{q{ndTp}tcF@ !BRGqHWx@UwqH_Dc}_c}H_@ Leucine Leu -deeD@BdDR[mUjjjL`OtYL[lFfzaYn|^[iDV{QenkP !BR@IHOWx@UpIH@dc}R@IHT`B Lysine Lys -diFD`JxPBDivzjihI@RdAndX[oEF{QqnhR[lD !BMpLH@s\|MpLwOGyMpLH@p Methionine Met -dcND@BADf{YU]Zj@@cHC}ASF{AinhV[oGnzQSCwRLZ^{QSKwZL[Vzm@ !BO`AHF_|O`AgWSx_YuuHWSx_Oa}HWP Phenylalanine Phe -daFD@BADfyVyjjhr@PdqnpZ[jEfzQyn|P !BF]|xjqEYxsEGv^S_{x Proline Pro -gNy`BDtf{ZjfHC}Lf[lFmuBv{q@ !BRGqHWx@UwqH_Dc} Serine Ser -dazL@BAFR[nZjdrT`_hRXwXMMuBw]xqn{oEL !B_g|H@s\CMpI~_p`CMpL Threonine Thr -foAP`@BZ@aInvYWejsfjiB@bFB@OttfF{AhwTKF{qywRJXW]Hqi]vbfUwZN[W]hqc]uZfmwUnYw]Di` !Bb@I~@Ha}_c~H@ha}tEJNwuS[zfC@F\@fpB[jX@ Tryptophane Trp -dknL@BACR[me]]Zj@BHr@RTqnpZ[jEf{q{ndTp}tcFgntTr}vcFunkS[hd !Bo`AH@a\Bo`@Ww[y_E}uHw[y_oe}Hw[y_ Tyrosine Tyr -dazD@BADf{fjjL`OtIL[lFfza[n|Tw]wcF@ !B_g|H@s\CMq~_s\CB@L Valine Val \ No newline at end of file