1 // ****************************************************************************** 2 // 3 // Title: Force Field X. 4 // Description: Force Field X - Software for Molecular Biophysics. 5 // Copyright: Copyright (c) Michael J. Schnieders 2001-2023. 6 // 7 // This file is part of Force Field X. 8 // 9 // Force Field X is free software; you can redistribute it and/or modify it 10 // under the terms of the GNU General Public License version 3 as published by 11 // the Free Software Foundation. 12 // 13 // Force Field X is distributed in the hope that it will be useful, but WITHOUT 14 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 15 // FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 16 // details. 17 // 18 // You should have received a copy of the GNU General Public License along with 19 // Force Field X; if not, write to the Free Software Foundation, Inc., 59 Temple 20 // Place, Suite 330, Boston, MA 02111-1307 USA 21 // 22 // Linking this library statically or dynamically with other modules is making a 23 // combined work based on this library. Thus, the terms and conditions of the 24 // GNU General Public License cover the whole combination. 25 // 26 // As a special exception, the copyright holders of this library give you 27 // permission to link this library with independent modules to produce an 28 // executable, regardless of the license terms of these independent modules, and 29 // to copy and distribute the resulting executable under terms of your choice, 30 // provided that you also meet, for each linked independent module, the terms 31 // and conditions of the license of that module. An independent module is a 32 // module which is not derived from or based on this library. If you modify this 33 // library, you may extend this exception to your version of the library, but 34 // you are not obligated to do so. If you do not wish to do so, delete this 35 // exception statement from your version. 36 // 37 // ****************************************************************************** 38 package ffx.potential.parameters; 39 40 import static ffx.potential.parameters.ForceField.ForceFieldType.CHARGE; 41 import static ffx.utilities.KeywordGroup.PotentialFunctionParameter; 42 import static java.lang.Integer.parseInt; 43 import static java.lang.String.format; 44 45 import ffx.utilities.FFXKeyword; 46 import java.util.Comparator; 47 48 /** 49 * The ChargeType class defines a partial atomic charge type. 50 * 51 * @author Michael J. Schnieders 52 * @since 1.0 53 */ 54 @FFXKeyword(name = "charge", clazz = String.class, keywordGroup = PotentialFunctionParameter, description = 55 "[1 integer and 1 real] " 56 + "Provides a value for a single atomic partial charge electrostatic parameter. " 57 + "The integer modifier, if positive, gives the atom type number for which the charge parameter is to be defined. " 58 + "Note that charge parameters are given for atom types, not atom classes. " 59 + "If the integer modifier is negative, then the parameter value to follow applies only to the individual atom whose atom number is the negative of the modifier. " 60 + "The real number modifier gives the values of the atomic partial charge in electrons.") 61 public final class ChargeType extends BaseType implements Comparator<String> { 62 63 /** Partial atomic charge in units of electrons. */ 64 public final double charge; 65 /** The atom type that uses this charge parameter. */ 66 public int atomType; 67 68 /** 69 * ChargeType constructor. 70 * 71 * @param atomType int 72 * @param charge double 73 */ 74 public ChargeType(int atomType, double charge) { 75 super(CHARGE, "" + atomType); 76 this.atomType = atomType; 77 this.charge = charge; 78 } 79 80 /** 81 * Average two ChargeType instances. The atom type that defines the new type must be supplied. 82 * 83 * @param chargeType1 a {@link ffx.potential.parameters.ChargeType} object. 84 * @param chargeType2 a {@link ffx.potential.parameters.ChargeType} object. 85 * @param atomType The atom type that defines the new type. 86 * @return a {@link ffx.potential.parameters.ChargeType} object. 87 */ 88 public static ChargeType average(ChargeType chargeType1, ChargeType chargeType2, int atomType) { 89 if (chargeType1 == null || chargeType2 == null) { 90 return null; 91 } 92 double charge = (chargeType1.charge + chargeType2.charge) / 2.0; 93 return new ChargeType(atomType, charge); 94 } 95 96 /** {@inheritDoc} */ 97 @Override 98 public int compare(String s1, String s2) { 99 int t1 = parseInt(s1); 100 int t2 = parseInt(s2); 101 return Integer.compare(t1, t2); 102 } 103 104 /** 105 * incrementType 106 * 107 * @param increment The amount to increment the atom type by. 108 */ 109 public void incrementType(int increment) { 110 this.atomType += increment; 111 } 112 113 /** 114 * {@inheritDoc} 115 * 116 * <p>Nicely formatted Charge type. 117 */ 118 @Override 119 public String toString() { 120 return format("charge %5d % 7.5f", atomType, charge); 121 } 122 }