1 // ****************************************************************************** 2 // 3 // Title: Force Field X. 4 // Description: Force Field X - Software for Molecular Biophysics. 5 // Copyright: Copyright (c) Michael J. Schnieders 2001-2025. 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.PropertyGroup.PotentialFunctionParameter; 42 import static java.lang.Integer.parseInt; 43 import static java.lang.String.format; 44 45 import ffx.utilities.FFXProperty; 46 47 import java.util.Comparator; 48 49 /** 50 * The ChargeType class defines a partial atomic charge type. 51 * 52 * @author Michael J. Schnieders 53 * @since 1.0 54 */ 55 @FFXProperty(name = "charge", clazz = String.class, propertyGroup = PotentialFunctionParameter, description = """ 56 [1 integer and 1 real] 57 Provides a value for a single atomic partial charge electrostatic parameter. 58 The integer modifier, if positive, gives the atom type number for which the charge parameter is to be defined. 59 Note that charge parameters are given for atom types, not atom classes. If the integer modifier is negative, 60 then the parameter value to follow applies only to the individual atom whose atom number is the negative of the modifier. 61 The real number modifier gives the values of the atomic partial charge in electrons. 62 """) 63 public final class ChargeType extends BaseType implements Comparator<String> { 64 65 public static final double DEFAULT_CHG_12_SCALE = 0.0; 66 public static final double DEFAULT_CHG_13_SCALE = 0.0; 67 public static final double DEFAULT_CHG_14_SCALE = 2.0; 68 public static final double DEFAULT_CHG_15_SCALE = 1.0; 69 /** 70 * Partial atomic charge in units of electrons. 71 */ 72 public final double charge; 73 /** 74 * The atom type that uses this charge parameter. 75 */ 76 public int atomType; 77 78 /** 79 * ChargeType constructor. 80 * 81 * @param atomType int 82 * @param charge double 83 */ 84 public ChargeType(int atomType, double charge) { 85 super(CHARGE, "" + atomType); 86 this.atomType = atomType; 87 this.charge = charge; 88 } 89 90 /** 91 * Average two ChargeType instances. The atom type that defines the new type must be supplied. 92 * 93 * @param chargeType1 a {@link ffx.potential.parameters.ChargeType} object. 94 * @param chargeType2 a {@link ffx.potential.parameters.ChargeType} object. 95 * @param atomType The atom type that defines the new type. 96 * @return a {@link ffx.potential.parameters.ChargeType} object. 97 */ 98 public static ChargeType average(ChargeType chargeType1, ChargeType chargeType2, int atomType) { 99 if (chargeType1 == null || chargeType2 == null) { 100 return null; 101 } 102 double charge = (chargeType1.charge + chargeType2.charge) / 2.0; 103 return new ChargeType(atomType, charge); 104 } 105 106 /** 107 * {@inheritDoc} 108 */ 109 @Override 110 public int compare(String s1, String s2) { 111 int t1 = parseInt(s1); 112 int t2 = parseInt(s2); 113 return Integer.compare(t1, t2); 114 } 115 116 /** 117 * incrementType 118 * 119 * @param increment The amount to increment the atom type by. 120 */ 121 public void incrementType(int increment) { 122 this.atomType += increment; 123 } 124 125 /** 126 * {@inheritDoc} 127 * 128 * <p>Nicely formatted Charge type. 129 */ 130 @Override 131 public String toString() { 132 return format("charge %5d % 7.5f", atomType, charge); 133 } 134 }