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.openmm;
39  
40  import com.sun.jna.ptr.PointerByReference;
41  import edu.uiowa.jopenmm.OpenMM_Vec3;
42  
43  import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_LocalCoordinatesSite_create;
44  import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_LocalCoordinatesSite_create_2;
45  import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_LocalCoordinatesSite_destroy;
46  import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_LocalCoordinatesSite_getLocalPosition;
47  import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_LocalCoordinatesSite_getOriginWeights;
48  import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_LocalCoordinatesSite_getXWeights;
49  import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_LocalCoordinatesSite_getYWeights;
50  
51  /**
52   * This is a VirtualSite that computes the particle location based on a local coordinate system.
53   * The site is placed at a fixed position relative to a local coordinate system defined by
54   * other particles. This is useful for representing sites like lone pairs or pi-electron
55   * centers that have well-defined positions relative to the molecular framework.
56   * <p>
57   * The local coordinate system is defined by an origin and two direction vectors (x and y axes).
58   * Each of these is specified as a weighted average of particle positions. The z axis is taken
59   * to be the cross product of the x and y axes.
60   */
61  public class LocalCoordinatesSite extends VirtualSite {
62  
63    /**
64     * Create a LocalCoordinatesSite using weighted averages to define the coordinate system.
65     *
66     * @param originWeights The weights for computing the origin as a weighted average of particle positions.
67     * @param xWeights      The weights for computing the x direction as a weighted average of particle positions.
68     * @param yWeights      The weights for computing the y direction as a weighted average of particle positions.
69     * @param zWeights      The weights for computing the z direction as a weighted average of particle positions.
70     * @param localPosition The position of the virtual site in the local coordinate system.
71     */
72    public LocalCoordinatesSite(PointerByReference originWeights, PointerByReference xWeights,
73                                PointerByReference yWeights, PointerByReference zWeights, OpenMM_Vec3 localPosition) {
74      super(OpenMM_LocalCoordinatesSite_create(originWeights, xWeights, yWeights, zWeights, localPosition));
75    }
76  
77    /**
78     * Create a LocalCoordinatesSite using specific particles and vectors to define the coordinate system.
79     *
80     * @param particle1     The index of the first particle.
81     * @param particle2     The index of the second particle.
82     * @param particle3     The index of the third particle.
83     * @param originWeights The weights for the origin calculation.
84     * @param xdir          The x direction vector.
85     * @param ydir          The y direction vector.
86     * @param localPosition The position of the virtual site in the local coordinate system.
87     */
88    public LocalCoordinatesSite(int particle1, int particle2, int particle3, OpenMM_Vec3 originWeights,
89                                OpenMM_Vec3 xdir, OpenMM_Vec3 ydir, OpenMM_Vec3 localPosition) {
90      super(OpenMM_LocalCoordinatesSite_create_2(particle1, particle2, particle3, originWeights, xdir, ydir, localPosition));
91    }
92  
93    /**
94     * Destroy the virtual site.
95     */
96    @Override
97    public void destroy() {
98      if (pointer != null) {
99        OpenMM_LocalCoordinatesSite_destroy(pointer);
100       pointer = null;
101     }
102   }
103 
104   /**
105    * Get the position of the virtual site in the local coordinate system.
106    *
107    * @return The local position of the virtual site.
108    */
109   public OpenMM_Vec3 getLocalPosition() {
110     return OpenMM_LocalCoordinatesSite_getLocalPosition(pointer);
111   }
112 
113   /**
114    * Get the weights used for computing the origin of the local coordinate system.
115    *
116    * @param weights The weights for the origin calculation (output).
117    */
118   public void getOriginWeights(PointerByReference weights) {
119     OpenMM_LocalCoordinatesSite_getOriginWeights(pointer, weights);
120   }
121 
122   /**
123    * Get the weights used for computing the x direction of the local coordinate system.
124    *
125    * @param weights The weights for the x direction calculation (output).
126    */
127   public void getXWeights(PointerByReference weights) {
128     OpenMM_LocalCoordinatesSite_getXWeights(pointer, weights);
129   }
130 
131   /**
132    * Get the weights used for computing the y direction of the local coordinate system.
133    *
134    * @param weights The weights for the y direction calculation (output).
135    */
136   public void getYWeights(PointerByReference weights) {
137     OpenMM_LocalCoordinatesSite_getYWeights(pointer, weights);
138   }
139 }