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.xray.commands; 39 40 import ffx.algorithms.cli.AlgorithmsCommand; 41 import ffx.numerics.Potential; 42 import ffx.utilities.FFXBinding; 43 import ffx.xray.parsers.MTZFilter; 44 import picocli.CommandLine.Command; 45 import picocli.CommandLine.Option; 46 import picocli.CommandLine.Parameters; 47 48 import java.io.File; 49 import java.util.Collections; 50 import java.util.List; 51 52 /** 53 * Use AverageMTZ to provide two MTZ files and an iteration for a cumulative moving average. 54 * <br> 55 * Usage: 56 * <br> 57 * ffxc xray.AverageMTZ <filename1> <filename2> 58 */ 59 @Command(description = " Average two MTZ files.", name = "xray.AverageMTZ") 60 public class AverageMTZ extends AlgorithmsCommand { 61 62 /** 63 * -i or --iteration the current moving average iteration 64 */ 65 @Option(names = {"-i", "--iterations"}, paramLabel = "1", 66 description = "The current moving average iteration (use 1 for a \"normal\" average of two files).") 67 private int iteration = 1; 68 69 /** 70 * One or more filenames. 71 */ 72 @Parameters(arity = "2", paramLabel = "MTZ", description = "Two diffraction input files.") 73 private List<String> filenames; 74 75 /** 76 * AverageMTZ constructor. 77 */ 78 public AverageMTZ() { 79 super(); 80 } 81 82 /** 83 * AverageMTZ constructor that sets the command line arguments. 84 * @param args Command line arguments. 85 */ 86 public AverageMTZ(String[] args) { 87 super(args); 88 } 89 90 /** 91 * AverageMTZ constructor. 92 * @param binding The Binding to use. 93 */ 94 public AverageMTZ(FFXBinding binding) { 95 super(binding); 96 } 97 98 @Override 99 public AverageMTZ run() { 100 101 if (!init()) { 102 return this; 103 } 104 105 String mtzfile1; 106 String mtzfile2; 107 108 if (filenames != null && filenames.size() > 1) { 109 // Read in command line. 110 mtzfile1 = filenames.get(0); 111 mtzfile2 = filenames.get(1); 112 } else { 113 logger.info(helpString()); 114 return this; 115 } 116 117 File file1 = new File(mtzfile1); 118 if (!file1.exists()) { 119 logger.info("File: " + mtzfile1 + " not found!"); 120 return this; 121 } 122 123 File file2 = new File(mtzfile2); 124 if (!file2.exists()) { 125 logger.info("File: " + mtzfile2 + " not found!"); 126 return this; 127 } 128 129 MTZFilter mtzfilter = new MTZFilter(); 130 mtzfilter.averageFcs(file1, file2, mtzfilter.getReflectionList(file1), iteration, null); 131 132 return this; 133 } 134 135 @Override 136 public List<Potential> getPotentials() { 137 return Collections.emptyList(); 138 } 139 }