/* $RCSfile$ * $Author$ * $Date$ * $Revision$ * * Copyright (C) 2005-2007 Christian Hoppe <chhoppe@users.sf.net> * * Contact: cdk-devel@lists.sourceforge.net * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 * of the License, or (at your option) any later version. * All we ask is that proper credit is given for our work, which includes * - but is not limited to - adding the above copyright notice to the beginning * of your source code files, and to any copyright notice that you may distribute * with programs based on this work. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * */ package org.openscience.cdk.modeling.builder3d; import java.awt.Color; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Hashtable; import java.util.List; import java.util.Map; import java.util.StringTokenizer; import java.util.Vector; import org.openscience.cdk.AtomType; import org.openscience.cdk.interfaces.IAtomType; /** * AtomType list configurator that uses the ParameterSet originally * defined in mm2.prm from tinker. This class was added to be able to port * mm2 to CDK. * * @author chhoppe * @cdk.created 2004-09-07 * @cdk.module forcefield * @cdk.githash * @cdk.keyword atom type, MM2 */ public class MM2BasedParameterSetReader { private String configFile = "org/openscience/cdk/modeling/forcefield/data/mm2.prm"; private InputStream ins = null; private Map<String, Object> parameterSet; private List<IAtomType> atomTypes; private StringTokenizer st; private String key = ""; /** * Constructor for the MM2BasedParameterSetReader object. */ public MM2BasedParameterSetReader() { parameterSet = new Hashtable<String,Object>(); atomTypes = new Vector<IAtomType>(); } public Map<String,Object> getParamterSet(){ return parameterSet; } public List<IAtomType> getAtomTypes(){ return atomTypes; } /** * Sets the file containing the config data. * * @param ins The new inputStream type InputStream */ public void setInputStream(InputStream ins) { this.ins = ins; } /** * Read a text based configuration file out of the force field mm2 file * * @exception Exception Description of the Exception */ private void setForceFieldDefinitions() throws Exception { String sid = st.nextToken(); String svalue = st.nextToken(); if (sid.equals(">bontunit")) { try { double value1 = new Double(svalue).doubleValue(); key = sid.substring(1); parameterSet.put(key, new Double(value1)); } catch (NumberFormatException nfe) { throw new IOException("VdWaalsTable.ReadvdWaals: " + "Malformed Number"); } } else if (sid.equals(">bond-cubic")) { try { double value1 = new Double(svalue).doubleValue(); key = sid.substring(1); //if (parameterSet.containsKey(key)){logger.debug("KeyError: hasKey "+key);} parameterSet.put(key, new Double(value1)); } catch (NumberFormatException nfe) { throw new IOException("VdWaalsTable.ReadvdWaals: " + "Malformed Number"); } } else if (sid.equals(">bond-quartic")) { try { double value1 = new Double(svalue).doubleValue(); key = sid.substring(1); //if (parameterSet.containsKey(key)){logger.debug("KeyError: hasKey "+key);} parameterSet.put(key, new Double(value1)); } catch (NumberFormatException nfe) { throw new IOException("VdWaalsTable.ReadvdWaals: " + "Malformed Number"); } } else if (sid.equals(">angleunit")) { try { double value1 = new Double(svalue).doubleValue(); key = sid.substring(1); //if (parameterSet.containsKey(key)){logger.debug("KeyError: hasKey "+key);} parameterSet.put(key, new Double(value1)); } catch (NumberFormatException nfe) { throw new IOException("VdWaalsTable.ReadvdWaals: " + "Malformed Number"); } } else if (sid.equals(">angle-sextic")) { try { double value1 = new Double(svalue).doubleValue(); key = sid.substring(1); //if (parameterSet.containsKey(key)){logger.debug("KeyError: hasKey "+key);} parameterSet.put(key, new Double(value1)); } catch (NumberFormatException nfe) { throw new IOException("VdWaalsTable.ReadvdWaals: " + "Malformed Number"); } } else if (sid.equals(">strbndunit")) { try { double value1 = new Double(svalue).doubleValue(); key = sid.substring(1); //if (parameterSet.containsKey(key)){logger.debug("KeyError: hasKey "+key);} parameterSet.put(key, new Double(value1)); } catch (NumberFormatException nfe) { throw new IOException("VdWaalsTable.ReadvdWaals: " + "Malformed Number"); } } else if (sid.equals(">opbendunit")) { try { double value1 = new Double(svalue).doubleValue(); key = sid.substring(1); //if (parameterSet.containsKey(key)){logger.debug("KeyError: hasKey "+key);} parameterSet.put(key, new Double(value1)); } catch (NumberFormatException nfe) { throw new IOException("VdWaalsTable.ReadvdWaals: " + "Malformed Number"); } } else if (sid.equals(">torsionunit")) { try { double value1 = new Double(svalue).doubleValue(); key = sid.substring(1); //if (parameterSet.containsKey(key)){logger.debug("KeyError: hasKey "+key);} parameterSet.put(key, new Double(value1)); } catch (NumberFormatException nfe) { throw new IOException("VdWaalsTable.ReadvdWaals: " + "Malformed Number"); } } else if (sid.equals(">vdwtype")) { key = sid.substring(1); //if (parameterSet.containsKey(key)){logger.debug("KeyError: hasKey "+key);} parameterSet.put(key, svalue); } else if (sid.equals(">radiusrule")) { key = sid.substring(1); //if (parameterSet.containsKey(key)){logger.debug("KeyError: hasKey "+key);} parameterSet.put(key, svalue); } else if (sid.equals(">radiustype")) { key = sid.substring(1); //if (parameterSet.containsKey(key)){logger.debug("KeyError: hasKey "+key);} parameterSet.put(key, svalue); } else if (sid.equals(">radiussize")) { key = sid.substring(1); //if (parameterSet.containsKey(key)){logger.debug("KeyError: hasKey "+key);} parameterSet.put(key, svalue); } else if (sid.equals(">epsilonrule")) { key = sid.substring(1); //if (parameterSet.containsKey(key)){logger.debug("KeyError: hasKey "+key);} parameterSet.put(key, svalue); } else if (sid.equals(">a-expterm")) { try { key = sid.substring(1); //if (parameterSet.containsKey(key)){logger.debug("KeyError: hasKey "+key);} parameterSet.put(key, svalue); } catch (NumberFormatException nfe) { throw new IOException("VdWaalsTable.ReadvdWaals: " + "Malformed Number"); } } else if (sid.equals("b-expterm")) { try { key = sid.substring(1); //if (parameterSet.containsKey(key)){logger.debug("KeyError: hasKey "+key);} parameterSet.put(key, svalue); } catch (NumberFormatException nfe) { throw new IOException("VdWaalsTable.ReadvdWaals: " + "Malformed Number"); } } else if (sid.equals(">c-expterm")) { try { double value1 = new Double(svalue).doubleValue(); key = sid.substring(1); //if (parameterSet.containsKey(key)){logger.debug("KeyError: hasKey "+key);} parameterSet.put(key, new Double(value1)); } catch (NumberFormatException nfe) { throw new IOException("VdWaalsTable.ReadvdWaals: " + "Malformed Number"); } } else if (sid.equals(">vdw-14-scale")) { try { double value1 = new Double(svalue).doubleValue(); key = sid.substring(1); //if (parameterSet.containsKey(key)){logger.debug("KeyError: hasKey "+key);} parameterSet.put(key, new Double(value1)); } catch (NumberFormatException nfe) { throw new IOException("VdWaalsTable.ReadvdWaals: " + "Malformed Number"); } } else if (sid.equals(">chg-14-scale")) { try { double value1 = new Double(svalue).doubleValue(); key = sid.substring(1); //if (parameterSet.containsKey(key)){logger.debug("KeyError: hasKey "+key);} parameterSet.put(key, new Double(value1)); } catch (NumberFormatException nfe) { throw new IOException("VdWaalsTable.ReadvdWaals: " + "Malformed Number"); } } else if (sid.equals(">dielectric")) { try { double value1 = new Double(svalue).doubleValue(); key = sid.substring(1); //if (parameterSet.containsKey(key)){logger.debug("KeyError: hasKey "+key);} parameterSet.put(key, new Double(value1)); } catch (NumberFormatException nfe) { throw new IOException("VdWaalsTable.ReadvdWaals: " + "Malformed Number"); } } else { } } /** * Read and stores the atom types in a vector * * @exception Exception Description of the Exception */ private void setAtomTypes() throws Exception { String name = ""; String rootType = ""; int an = 0; int rl = 255; int gl = 20; int bl = 147; int maxbond = 0; double mass = 0.0; st.nextToken(); String sid = st.nextToken(); rootType = st.nextToken(); name = st.nextToken(); String san = st.nextToken(); String sam = st.nextToken(); String smaxbond = st.nextToken(); try { mass = new Double(sam).doubleValue(); an = Integer.parseInt(san); maxbond = Integer.parseInt(smaxbond); } catch (NumberFormatException nfe) { throw new IOException("AtomTypeTable.ReadAtypes: " + "Malformed Number"); } IAtomType atomType = new AtomType(name, rootType); atomType.setAtomicNumber(an); atomType.setExactMass(mass); atomType.setFormalNeighbourCount(maxbond); atomType.setSymbol(rootType); Color co = new Color(rl, gl, bl); atomType.setProperty("org.openscience.cdk.renderer.color", co); atomType.setAtomTypeName(sid); atomTypes.add(atomType); } /** * Read vdw radius, stored into the parameter set * * @exception Exception Description of the Exception */ private void setvdWaals() throws Exception { List data = new Vector(); st.nextToken(); String sid = st.nextToken(); String sradius = st.nextToken(); String sepsi = st.nextToken(); try { double epsi = new Double(sepsi).doubleValue(); double radius = new Double(sradius).doubleValue(); data.add(new Double(radius)); data.add(new Double(epsi)); } catch (NumberFormatException nfe) { throw new IOException("VdWaalsTable.ReadvdWaals: " + "Malformed Number"); } key = "vdw" + sid; //if (parameterSet.containsKey(key)){System.out.println("KeyError: hasKey "+key);} parameterSet.put(key, data); } /** * Read vdW pair radius,stored into the parameter set * * @exception Exception Description of the Exception */ private void setvdWaalpr() throws Exception { List data = new Vector(); st.nextToken(); String sid1 = st.nextToken(); String sid2 = st.nextToken(); String value1 = st.nextToken(); String value2 = st.nextToken(); try { double va1 = new Double(value1).doubleValue(); double va2 = new Double(value2).doubleValue(); data.add(new Double(va1)); data.add(new Double(va2)); } catch (NumberFormatException nfe) { throw new IOException("VdWaalsTable.ReadvdWaalsPR:Malformed Number due to"+nfe.toString()); } key = "vdwpr" + sid1 + ";" + sid2; parameterSet.put(key, data); } /** * Sets the bond attribute stored into the parameter set * * @exception Exception Description of the Exception */ private void setBond() throws Exception { List data = new Vector(); st.nextToken(); String sid1 = st.nextToken(); String sid2 = st.nextToken(); String value1 = st.nextToken(); String value2 = st.nextToken(); try { double va1 = new Double(value1).doubleValue(); double va2 = new Double(value2).doubleValue(); data.add(new Double(va1)); data.add(new Double(va2)); } catch (NumberFormatException nfe) { throw new IOException("setBond: Malformed Number"); } key = "bond" + sid1 + ";" + sid2; parameterSet.put(key, data); } /** * Sets the bond3 attribute stored into the parameter set * * @exception Exception Description of the Exception */ private void setBond3() throws Exception { List data = new Vector(); st.nextToken(); String sid1 = st.nextToken(); String sid2 = st.nextToken(); String value1 = st.nextToken(); String value2 = st.nextToken(); try { double va1 = new Double(value1).doubleValue(); double va2 = new Double(value2).doubleValue(); data.add(new Double(va1)); data.add(new Double(va2)); } catch (NumberFormatException nfe) { throw new IOException("setBond3: Malformed Number"); } key = "bond3_" + sid1 + ";" + sid2; parameterSet.put(key, data); } /** * Sets the bond4 attribute stored into the parameter set * * @exception Exception Description of the Exception */ private void setBond4() throws Exception { List data = new Vector(); st.nextToken(); String sid1 = st.nextToken(); String sid2 = st.nextToken(); String value1 = st.nextToken(); String value2 = st.nextToken(); try { double va1 = new Double(value1).doubleValue(); double va2 = new Double(value2).doubleValue(); data.add(new Double(va1)); data.add(new Double(va2)); } catch (NumberFormatException nfe) { throw new IOException("setBond4: Malformed Number"); } key = "bond4_" + sid1 + ";" + sid2; parameterSet.put(key, data); } /** * Sets the angle attribute stored into the parameter set * * @exception Exception Description of the Exception */ private void setAngle() throws Exception { List data = new Vector(); st.nextToken(); String sid1 = st.nextToken(); String sid2 = st.nextToken(); String sid3 = st.nextToken(); String value1 = st.nextToken(); String value2 = st.nextToken(); String value3 = st.nextToken(); String value4 = st.nextToken(); try { double va1 = new Double(value1).doubleValue(); double va2 = new Double(value2).doubleValue(); double va3 = new Double(value3).doubleValue(); double va4 = new Double(value4).doubleValue(); data.add(new Double(va1)); data.add(new Double(va2)); data.add(new Double(va3)); data.add(new Double(va4)); key = "angle" + sid1 + ";" + sid2 + ";" + sid3; if (parameterSet.containsKey(key)) { data = (Vector) parameterSet.get(key); data.add(new Double(va1)); data.add(new Double(va2)); data.add(new Double(va3)); data.add(new Double(va4)); } parameterSet.put(key, data); } catch (NumberFormatException nfe) { throw new IOException("setAngle: Malformed Number"); } } /** * Sets the angle3 attribute stored into the parameter set * * @exception Exception Description of the Exception */ private void setAngle3() throws Exception { List data = new Vector(); st.nextToken(); String sid1 = st.nextToken(); String sid2 = st.nextToken(); String sid3 = st.nextToken(); String value1 = st.nextToken(); String value2 = st.nextToken(); String value3 = st.nextToken(); String value4 = st.nextToken(); try { double va1 = new Double(value1).doubleValue(); double va2 = new Double(value2).doubleValue(); double va3 = new Double(value3).doubleValue(); double va4 = new Double(value4).doubleValue(); data.add(new Double(va1)); data.add(new Double(va2)); data.add(new Double(va3)); data.add(new Double(va4)); } catch (NumberFormatException nfe) { throw new IOException("setAngle3: Malformed Number"); } key = "angle3_" + sid1 + ";" + sid2 + ";" + sid3; parameterSet.put(key, data); } /** * Sets the angle4 attribute stored into the parameter set * * @exception Exception Description of the Exception */ private void setAngle4() throws Exception { List data = new Vector(); st.nextToken(); String sid1 = st.nextToken(); String sid2 = st.nextToken(); String sid3 = st.nextToken(); String value1 = st.nextToken(); String value2 = st.nextToken(); String value3 = st.nextToken(); String value4 = st.nextToken(); try { double va1 = new Double(value1).doubleValue(); double va2 = new Double(value2).doubleValue(); double va3 = new Double(value3).doubleValue(); double va4 = new Double(value4).doubleValue(); data.add(new Double(va1)); data.add(new Double(va2)); data.add(new Double(va3)); data.add(new Double(va4)); } catch (NumberFormatException nfe) { throw new IOException("setAngle4: Malformed Number"); } key = "angle4_" + sid1 + ";" + sid2 + ";" + sid3; parameterSet.put(key, data); } /** * Sets the strBnd attribute stored into the parameter set * * @exception Exception Description of the Exception */ private void setStrBnd() throws Exception { List data = new Vector(); st.nextToken(); String sid1 = st.nextToken(); String value1 = st.nextToken(); try { double va1 = new Double(value1).doubleValue(); data.add(new Double(va1)); } catch (NumberFormatException nfe) { throw new IOException("setStrBnd: Malformed Number"); } key = "strbnd" + sid1; parameterSet.put(key, data); } /** * Sets the opBend attribute stored into the parameter set * * @exception Exception Description of the Exception */ private void setOpBend() throws Exception { List data = new Vector(); st.nextToken(); String sid1 = st.nextToken(); String sid2 = st.nextToken(); String value1 = st.nextToken(); try { double va1 = new Double(value1).doubleValue(); data.add(new Double(va1)); key = "opbend" + sid1 + ";" + sid2; if (parameterSet.containsKey(key)) { //logger.debug("KeyError: hasKey "+key); data = (Vector) parameterSet.get(key); data.add(new Double(va1)); } parameterSet.put(key, data); } catch (NumberFormatException nfe) { throw new IOException("setOpBend: Malformed Number"); } } /** * Sets the torsion attribute stored into the parameter set * * @exception Exception Description of the Exception */ private void setTorsion() throws Exception { List data = new Vector(); st.nextToken(); String sid1 = st.nextToken(); String sid2 = st.nextToken(); String sid3 = st.nextToken(); String sid4 = st.nextToken(); String value1 = st.nextToken(); st.nextToken(); st.nextToken(); String value2 = st.nextToken(); st.nextToken(); st.nextToken(); String value3 = st.nextToken(); st.nextToken(); st.nextToken(); try { double va1 = new Double(value1).doubleValue(); double va2 = new Double(value2).doubleValue(); double va3 = new Double(value3).doubleValue(); data.add(new Double(va1)); data.add(new Double(va2)); data.add(new Double(va3)); key = "torsion" + sid1 + ";" + sid2 + ";" + sid3 + ";" + sid4; if (parameterSet.containsKey(key)) { data = (Vector) parameterSet.get(key); data.add(new Double(va1)); data.add(new Double(va2)); data.add(new Double(va3)); } parameterSet.put(key, data); } catch (NumberFormatException nfe) { throw new IOException("setTorsion: Malformed Number"); } } /** * Sets the torsion4 attribute stored into the parameter set * * @exception Exception Description of the Exception */ private void setTorsion4() throws Exception { List data = new Vector(); st.nextToken(); String sid1 = st.nextToken(); String sid2 = st.nextToken(); String sid3 = st.nextToken(); String sid4 = st.nextToken(); String value1 = st.nextToken(); st.nextToken(); st.nextToken(); String value2 = st.nextToken(); st.nextToken(); st.nextToken(); String value3 = st.nextToken(); st.nextToken(); st.nextToken(); try { double va1 = new Double(value1).doubleValue(); double va2 = new Double(value2).doubleValue(); double va3 = new Double(value3).doubleValue(); data.add(new Double(va1)); data.add(new Double(va2)); data.add(new Double(va3)); } catch (NumberFormatException nfe) { throw new IOException("setTorsion4: Malformed Number"); } key = "torsion4_" + sid1 + ";" + sid2 + ";" + sid3 + ";" + sid4; parameterSet.put(key, data); } /** * Sets the charge attribute stored into the parameter set * * @exception Exception Description of the Exception */ private void setCharge() throws Exception { List data = new Vector(); st.nextToken(); String sid1 = st.nextToken(); String value1 = st.nextToken(); try { double va1 = new Double(value1).doubleValue(); data.add(new Double(va1)); } catch (NumberFormatException nfe) { throw new IOException("setCharge: Malformed Number due to "+nfe.toString()); } key = "charge" + sid1; parameterSet.put(key, data); } /** * Sets the dipole attribute stored into the parameter set * * @exception Exception Description of the Exception */ private void setDipole() throws Exception { List data = new Vector(); st.nextToken(); String sid1 = st.nextToken(); String sid2 = st.nextToken(); String value1 = st.nextToken(); String value2 = st.nextToken(); try { double va1 = new Double(value1).doubleValue(); double va2 = new Double(value2).doubleValue(); data.add(new Double(va1)); data.add(new Double(va2)); } catch (NumberFormatException nfe) { throw new IOException("setDipole: " + "Malformed Number"); } key = "dipole" + sid1 + ";" + sid2; parameterSet.put(key, data); } /** * Sets the dipole3 attribute stored into the parameter set * * @exception Exception Description of the Exception */ private void setDipole3() throws Exception { List data = new Vector(); st.nextToken(); String sid1 = st.nextToken(); String sid2 = st.nextToken(); String value1 = st.nextToken(); String value2 = st.nextToken(); try { double va1 = new Double(value1).doubleValue(); double va2 = new Double(value2).doubleValue(); data.add(new Double(va1)); data.add(new Double(va2)); } catch (NumberFormatException nfe) { throw new IOException("setDipole3: " + "Malformed Number"); } key = "dipole3_" + sid1 + ";" + sid2; parameterSet.put(key, data); } /** * Sets the piAtom attribute stored into the parameter set * * @exception Exception Description of the Exception */ private void setPiAtom() throws Exception { List data = new Vector(); st.nextToken(); String sid1 = st.nextToken(); String value1 = st.nextToken(); String value2 = st.nextToken(); String value3 = st.nextToken(); try { double va1 = new Double(value1).doubleValue(); double va2 = new Double(value2).doubleValue(); double va3 = new Double(value3).doubleValue(); data.add(new Double(va1)); data.add(new Double(va2)); data.add(new Double(va3)); } catch (NumberFormatException nfe) { throw new IOException("setPiAtom: " + "Malformed Number"); } key = "piatom" + sid1; parameterSet.put(key, data); } /** * Sets the piBond attribute stored into the parameter set * * @exception Exception Description of the Exception */ private void setPiBond() throws Exception { List data = new Vector(); st.nextToken(); String sid1 = st.nextToken(); String sid2 = st.nextToken(); String value1 = st.nextToken(); String value2 = st.nextToken(); try { double va1 = new Double(value1).doubleValue(); double va2 = new Double(value2).doubleValue(); data.add(new Double(va1)); data.add(new Double(va2)); } catch (NumberFormatException nfe) { throw new IOException("setPiBond: " + "Malformed Number"); } key = "pibond" + sid1 + ";" + sid2; parameterSet.put(key, data); } /** * The main method which parses through the force field configuration file * * @exception Exception Description of the Exception */ public void readParameterSets() throws Exception { //vdW,vdWp,bond,bond4,bond3,angle,angle4,angle3, //strbond,opbend,torsion,torsion4,charge,dipole, //dipole3,piatom,pibond,dipole3 //logger.debug("------ ReadParameterSets ------"); if (ins == null) { ins = getClass().getResourceAsStream(configFile); } if (ins == null) { throw new IOException("There was a problem getting the default stream: " + configFile); } // read the contents from file BufferedReader r = new BufferedReader(new InputStreamReader(ins), 1024); String s; int[] a = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; try { while (true) { s = r.readLine(); if (s == null) { break; } st = new StringTokenizer(s, "\t ;"); int nt = st.countTokens(); if (s.startsWith(">") & nt > 1) { setForceFieldDefinitions(); a[0]++; } else if (s.startsWith("atom") & nt <= 8) { a[0]++; setAtomTypes(); } else if (s.startsWith("vdw ") & nt <= 5) { setvdWaals(); a[1]++; } else if (s.startsWith("vdwpr ") & nt <= 6) { setvdWaalpr(); a[2]++; } else if (s.startsWith("bond ") & nt <= 7) { setBond(); a[3]++; } else if (s.startsWith("bond4 ") & nt == 5) { setBond4(); a[4]++; } else if (s.startsWith("bond3 ") & nt == 5) { setBond3(); a[5]++; } else if (s.startsWith("angle ") & nt == 8) { setAngle(); a[6]++; } else if (s.startsWith("angle4 ") & nt == 8) { setAngle4(); a[17]++; } else if (s.startsWith("angle3 ") & nt == 8) { setAngle3(); a[7]++; } else if (s.startsWith("strbnd ") & nt == 5) { setStrBnd(); a[8]++; } else if (s.startsWith("opbend ") & nt == 4) { setOpBend(); a[9]++; } else if (s.startsWith("torsion ") & nt == 14) { setTorsion(); a[10]++; } else if (s.startsWith("torsion4 ") & nt == 14) { setTorsion4(); a[11]++; } else if (s.startsWith("charge ") & nt == 3) { setCharge(); a[12]++; } else if (s.startsWith("dipole ") & nt == 5) { setDipole(); a[13]++; } else if (s.startsWith("dipole3 ") & nt == 5) { setDipole3(); a[14]++; } else if (s.startsWith("piatom ") & nt == 5) { setPiAtom(); a[15]++; } else if (s.startsWith("pibond ") & nt == 5) { setPiBond(); a[16]++; } }// end while ins.close(); } catch (IOException e) { throw new IOException("There was a problem parsing the mm2 forcefield due to:"+e.toString()); } } }