View Javadoc
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.crystal;
39  
40  import org.apache.commons.configuration2.CompositeConfiguration;
41  
42  import static java.lang.String.format;
43  import static org.apache.commons.math3.util.FastMath.abs;
44  
45  /**
46   * The Resolution class encapsulates the sampling limits and resolution limits for a given crystal
47   * and/or data set.
48   *
49   * @author Timothy D. Fenn
50   * @since 1.0
51   */
52  public class Resolution {
53  
54    /**
55     * The sampling limit for the data set.
56     */
57    public final double sampling;
58    /**
59     * The resolution of the data set.
60     */
61    public final double resolution;
62    /**
63     * The inverse resolution squared of the data set.
64     */
65    private final double inverseResSq;
66  
67    /**
68     * Constructor for Resolution.
69     *
70     * @param resolution a double.
71     * @param sampling   a double.
72     */
73    public Resolution(double resolution, double sampling) {
74      this.resolution = resolution;
75      this.inverseResSq = 1.0 / (resolution * resolution);
76      this.sampling = sampling;
77    }
78  
79    /**
80     * Constructor for Resolution.
81     *
82     * @param resolution a double.
83     */
84    public Resolution(double resolution) {
85      this(resolution, 1.0 / 1.5);
86    }
87  
88    /**
89     * Returns a string representation of the Resolution object, including the resolution and sampling values.
90     *
91     * @return A formatted string containing the resolution and sampling values of the object.
92     */
93    @Override
94    public String toString() {
95      return format(" Resolution: %6.3f Sampling: %6.3f", resolution, sampling);
96    }
97  
98    /**
99     * checkProperties
100    *
101    * @param properties a {@link org.apache.commons.configuration2.CompositeConfiguration} object.
102    * @param isNeutron If true, this is a neutron diffraction data set.
103    * @param defaultResolution The resolution from the reflection file.
104    * @return a {@link ffx.crystal.Resolution} object.
105    */
106   public static Resolution checkProperties(CompositeConfiguration properties,
107                                            boolean isNeutron, double defaultResolution) {
108     double resolution = properties.getDouble("resolution", defaultResolution);
109     if (isNeutron) {
110       resolution = properties.getDouble("neutron-resolution", resolution);
111     } else {
112       resolution = properties.getDouble("xray-resolution", resolution);
113     }
114     double sampling = properties.getDouble("sampling", 0.6);
115 
116     if (resolution <= 0.0) {
117       return null;
118     }
119 
120     return new Resolution(resolution, sampling);
121   }
122 
123   /**
124    * inInverseResSqRange
125    *
126    * @param res a double.
127    * @return a boolean.
128    */
129   public boolean inInverseResSqRange(double res) {
130     if (abs(res - this.inverseResSq) < 1e-8) {
131       return true;
132     } else {
133       return res < this.inverseResSq;
134     }
135   }
136 
137   /**
138    * inResolutionRange
139    *
140    * @param res a double.
141    * @return a boolean.
142    */
143   public boolean inResolutionRange(double res) {
144     if (abs(res - this.resolution) < 1e-8) {
145       return true;
146     } else {
147       return res > this.resolution;
148     }
149   }
150 
151   /**
152    * inverseResSqLimit
153    *
154    * @return a double.
155    */
156   public double inverseResSqLimit() {
157     return inverseResSq;
158   }
159 
160   /**
161    * resolutionLimit
162    *
163    * @return a double.
164    */
165   public double resolutionLimit() {
166     return resolution;
167   }
168 
169   /**
170    * samplingLimit
171    *
172    * @return a double.
173    */
174   public double samplingLimit() {
175     return sampling;
176   }
177 }