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.commands; 39 40 import ffx.potential.cli.PotentialCommand; 41 import ffx.potential.parameters.ForceField; 42 import ffx.potential.parsers.ForceFieldFilter; 43 import ffx.potential.parsers.OpenMMXmlFilter; 44 import ffx.utilities.FFXBinding; 45 import ffx.utilities.Keyword; 46 import org.apache.commons.configuration2.CompositeConfiguration; 47 import picocli.CommandLine.Command; 48 import picocli.CommandLine.Parameters; 49 50 import static org.apache.commons.io.FilenameUtils.getName; 51 import static org.apache.commons.io.FilenameUtils.removeExtension; 52 53 /** 54 * The FFtoXML command saves a force field as an XML file usable by OpenMM. 55 * 56 * Usage: 57 * ffxc FFtoXML <filename> 58 */ 59 @Command(name = "FFtoXML", description = " Write a force field as an XML file.") 60 public class FFtoXML extends PotentialCommand { 61 62 /** The final argument is a PRM/KEY file. */ 63 @Parameters(arity = "1", paramLabel = "file", 64 description = "The force field file.") 65 private String filename = null; 66 67 public FFtoXML() { super(); } 68 public FFtoXML(FFXBinding binding) { super(binding); } 69 public FFtoXML(String[] args) { super(args); } 70 71 @Override 72 public FFtoXML run() { 73 // Init the context and bind variables. 74 if (!init()) { 75 return this; 76 } 77 78 // Create PRM/KEY file's Force Field 79 CompositeConfiguration props = Keyword.loadProperties(null); 80 props.setProperty("parameters", filename); 81 ForceFieldFilter forceFieldFilter = new ForceFieldFilter(props); 82 ForceField forceField = forceFieldFilter.parse(); 83 84 // Use the current base directory, or update if necessary based on the given filename. 85 String saveName = getBaseDirString(filename) + removeExtension(getName(filename)); 86 87 OpenMMXmlFilter xmlFilter = new OpenMMXmlFilter(forceField, saveName); 88 try { 89 xmlFilter.toXML(); 90 } catch (Exception e) { 91 logger.severe(" Error writing XML: " + e.getMessage()); 92 } 93 94 return this; 95 } 96 }