001package com.hfg.bio; 002 003import java.util.HashSet; 004import java.util.Map; 005import java.util.Set; 006 007import com.hfg.chem.Charge; 008import com.hfg.chem.Element; 009import com.hfg.chem.IonizableGroup; 010import com.hfg.chem.Molecule; 011import com.hfg.xml.XMLNode; 012import com.hfg.util.StringUtil; 013 014//------------------------------------------------------------------------------ 015/** 016 N-terminal protein group. 017 <div> 018 @author J. Alex Taylor, hairyfatguy.com 019 </div> 020 */ 021//------------------------------------------------------------------------------ 022// com.hfg XML/HTML Coding Library 023// 024// This library is free software; you can redistribute it and/or 025// modify it under the terms of the GNU Lesser General Public 026// License as published by the Free Software Foundation; either 027// version 2.1 of the License, or (at your option) any later version. 028// 029// This library is distributed in the hope that it will be useful, 030// but WITHOUT ANY WARRANTY; without even the implied warranty of 031// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 032// Lesser General Public License for more details. 033// 034// You should have received a copy of the GNU Lesser General Public 035// License along with this library; if not, write to the Free Software 036// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 037// 038// J. Alex Taylor, President, Founder, CEO, COO, CFO, OOPS hairyfatguy.com 039// jataylor@hairyfatguy.com 040//------------------------------------------------------------------------------ 041 042public class NTerminalGroup extends Molecule 043{ 044 // This declaration has to come before the public constants below. 045 private static Set<NTerminalGroup> sValues = new HashSet<>(15); 046 047 //########################################################################## 048 // PUBLIC FIELDS 049 //########################################################################## 050 051 public static final NTerminalGroup UNMODIFIED_N_TERMINUS = new NTerminalGroup("Unmodified", "<"); 052 public static final NTerminalGroup BOC_T_BUTYLOXYCARBONYL = new NTerminalGroup("Boc (t-butyloxycarbonyl)-", "Boc-"); 053 public static final NTerminalGroup CBZ_BENZYLOXYCARBONLYL = new NTerminalGroup("CBZ (Benzyloxycarbonyl)-", "CBZ-"); 054 public static final NTerminalGroup N_ACETYL = new NTerminalGroup("N-acetyl-", "N-acetyl-"); 055 public static final NTerminalGroup N_CARBAMYL = new NTerminalGroup("N-carbamyl-", "N-carbamyl-"); 056 public static final NTerminalGroup N_FORMYL = new NTerminalGroup("N-formyl-", "N-formyl-"); 057 public static final NTerminalGroup N_METHYL = new NTerminalGroup("N-methyl-", "N-methyl-"); 058 public static final NTerminalGroup N_MYRISTOYL = new NTerminalGroup("N-myristoyl-", "N-myristoyl-"); 059 public static final NTerminalGroup PYRO_GLU_N_TERM_GLU = new NTerminalGroup("Pyro-glu (N-term E)", "pyroglu-"); 060 public static final NTerminalGroup PYRO_GLU_N_TERM_GLN = new NTerminalGroup("Pyro-glu (N-term Q)", "pyroglu-"); 061 062 063 static 064 { 065 UNMODIFIED_N_TERMINUS 066 .addAtoms(Element.HYDROGEN, 1) 067 .addKa(new IonizableGroup(1.0E-8, Charge.POSITIVE)) // pKa 8.0 068 .lock() 069 .register(); 070 071 BOC_T_BUTYLOXYCARBONYL 072 .addAtoms(Element.CARBON, 5) 073 .addAtoms(Element.HYDROGEN, 9) 074 .addAtoms(Element.OXYGEN, 2) 075 .lock() 076 .register(); 077 078 CBZ_BENZYLOXYCARBONLYL 079 .addAtoms(Element.CARBON, 8) 080 .addAtoms(Element.HYDROGEN, 7) 081 .addAtoms(Element.OXYGEN, 2) 082 .lock() 083 .register(); 084 085 N_ACETYL 086 .addAtoms(Element.CARBON, 2) 087 .addAtoms(Element.HYDROGEN, 3) 088 .addAtoms(Element.OXYGEN, 1) 089 .lock() 090 .register(); 091 092 N_CARBAMYL 093 .addAtoms(Element.CARBON, 1) 094 .addAtoms(Element.HYDROGEN, 2) 095 .addAtoms(Element.NITROGEN, 1) 096 .addAtoms(Element.OXYGEN, 1) 097 .lock() 098 .register(); 099 100 N_FORMYL 101 .addAtoms(Element.CARBON, 1) 102 .addAtoms(Element.HYDROGEN, 1) 103 .addAtoms(Element.OXYGEN, 1) 104 .lock() 105 .register(); 106 107 N_METHYL 108 .addAtoms(Element.CARBON, 1) 109 .addAtoms(Element.HYDROGEN, 3) 110 .lock() 111 .register(); 112 113 N_MYRISTOYL 114 .addAtoms(Element.CARBON, 14) 115 .addAtoms(Element.HYDROGEN, 27) 116 .addAtoms(Element.OXYGEN, 1) 117 .lock() 118 .register(); 119 120 PYRO_GLU_N_TERM_GLN 121 .addAtoms(Element.HYDROGEN, -2) 122 .addAtoms(Element.NITROGEN, -1) 123 .lock() 124 .register(); 125 126 PYRO_GLU_N_TERM_GLU 127 .addAtoms(Element.HYDROGEN, -1) 128 .addAtoms(Element.OXYGEN, -1) 129 .lock() 130 .register(); 131 } 132 133 //########################################################################## 134 // PRIVATE FIELDS 135 //########################################################################## 136 137 private String mShortName; 138 139 //########################################################################## 140 // CONSTRUCTORS 141 //########################################################################## 142 143 //-------------------------------------------------------------------------- 144 public NTerminalGroup(String inName) 145 { 146 super(); 147 setName(inName); 148 } 149 150 //-------------------------------------------------------------------------- 151 private NTerminalGroup(String inName, String inShortName) 152 { 153 this(inName); 154 mShortName = inShortName; 155 } 156 157 //-------------------------------------------------------------------------- 158 public NTerminalGroup(String inName, Map inElementalComposition) 159 { 160 super(inName, inElementalComposition); 161 } 162 163 //-------------------------------------------------------------------------- 164 public NTerminalGroup(XMLNode inXML) 165 { 166 super(inXML); 167 168 if (! inXML.getTagName().equals(HfgBioXML.NTERM_TAG)) 169 { 170 throw new RuntimeException("Cannot construct an " + this.getClass().getSimpleName() + " from a " + inXML.getTagName() + " tag!"); 171 } 172 173 XMLNode sidechainKasTag = inXML.getOptionalSubtagByName(HfgBioXML.SIDECHAIN_KAS_TAG); 174 if (sidechainKasTag != null) 175 { 176 for (XMLNode subtag : sidechainKasTag.getXMLNodeSubtags()) 177 { 178 addKa(new IonizableGroup(subtag)); 179 } 180 } 181 182 183 mShortName = inXML.getAttributeValue(HfgBioXML.SHORT_NAME_ATT); 184 } 185 186 //########################################################################## 187 // PUBLIC METHODS 188 //########################################################################## 189 190 //-------------------------------------------------------------------------- 191 public static NTerminalGroup[] values() 192 { 193 return sValues.toArray(new NTerminalGroup[sValues.size()]); 194 } 195 196 //-------------------------------------------------------------------------- 197 /** 198 Returns the NTerminalGroup whose name matches the specified String. 199 @param inString the name for the NTerminalGroup to retrieve 200 @return the NTerminalGroup whose name matches the specified String 201 */ 202 public static NTerminalGroup valueOf(String inString) 203 { 204 NTerminalGroup value = null; 205 206 if (StringUtil.isSet(inString)) 207 { 208 for (NTerminalGroup group : sValues) 209 { 210 if (group.name().equalsIgnoreCase(inString)) 211 { 212 value = group; 213 break; 214 } 215 } 216 } 217 218 return value; 219 } 220 221 //-------------------------------------------------------------------------- 222 /** 223 Puts the NTerminalGroup into the Set of unique NTerminalGroups returned by NTerminalGroup.values(). 224 */ 225 public void register() 226 { 227 if (! isLocked()) 228 { 229 throw new RuntimeException("Only locked NTerminalGroups can be added to the values list!"); 230 } 231 232 sValues.add(this); 233 } 234 235 //-------------------------------------------------------------------------- 236 @Override 237 public NTerminalGroup addAtoms(Element inElement, int inNum) 238 { 239 return (NTerminalGroup) super.addAtoms(inElement, inNum); 240 } 241 242 //-------------------------------------------------------------------------- 243 @Override 244 public NTerminalGroup lock() 245 { 246 return (NTerminalGroup) super.lock(); 247 } 248 249 250 //-------------------------------------------------------------------------- 251 @Override 252 public NTerminalGroup addKa(IonizableGroup inValue) 253 { 254 return (NTerminalGroup) super.addKa(inValue); 255 } 256 257 //-------------------------------------------------------------------------- 258 public String getShortName() 259 { 260 return mShortName; 261 } 262 263 //-------------------------------------------------------------------------- 264 @Override 265 public XMLNode toXMLNode() 266 { 267 XMLNode node = super.toXMLNode(); 268 node.setTagName(HfgBioXML.NTERM_TAG); 269 270 if (StringUtil.isSet(mShortName)) node.setAttribute(HfgBioXML.SHORT_NAME_ATT, mShortName); 271 272 return node; 273 } 274 275 276}