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}