Thanks! That's good to know. I've updated my code.
Cheers,
Chris.
Robert Hanson wrote:
Yes, ok. Be aware that I just modified
ModelSet.getAtomIndexFromAtomNumber(
pdbSerialNumber).
You should use instead Viewer.getAtomIndexFromAtomNumber.
In general, use methods that are not in JmolViewer completely at your
own risk. Those are subject to change at any time. Only methods in
JmolViewer are "public" in the sense that we try very hard not to
change those interface methods if at all possible. All other public
methods could change name, signature, return type, anything.
For example, you should use JmolViewer.getAtomNumber(jmolAtomIndex)
instead of viewer.getModelSet().atoms[jmolAtomIndex].getAtomNumber();
I forgot to mention that....
Bob
On Fri, Feb 27, 2009 at 7:09 AM, Chris Foley
<[email protected]>
wrote:
Thanks again for your help.
It appears that
int pdbSerialNumber =
viewer.getModelSet().atoms[jmolAtomIndex].getAtomNumber();
goes from atom index to PDB serial and
int jmolIndex =
viewer.getModelSet().getAtomIndexFromAtomNumber(pdbSerialNumber);
goes the other way around.
I also don't need all that messy reflection from my example because
ModelSet has a findNearestAtomIndex() method that is publicly
accessible. I'll have a poke around ModelSet and see what else is
there. I hadn't found it previously so thanks for pointing me in that
direction!
Cheers,
Chris.
Robert Hanson wrote:
On Thu, Feb 26, 2009 at 10:09 AM, Chris
Foley <[email protected]>
wrote:
Hi Robert,
Thanks for the reply, but unfortunately it introduces another problem.
My application offers several views of PDB files, one of which is Jmol
(others include graphs and tables). Moving the mouse over any of the
views highlights all the appropriate atoms in the other views (e.g. all
the atoms in an amino acid residue or just a single single atom on a
small molecule). Up until now I have done this by maintaining a list of
all the PDB atom serial numbers for each residue in memory.
very nice. Could be a problem with multi-model PDB files, but....
When I move the mouse over Jmol it currently uses
findNearestAtomIndex() and looks up the corresponding residue (if any).
good.
When I move the mouse over one of my other views, it correctly pulls
out the residue and I "select atomno=" for all the associated PDB atom
serials.
ok.
In light of your last email, this is obviously flawed. Does Jmol
provide a mechanism for converting between the serial numbers in the
PDB file and its own atom indexes? Thanks again for the help.
Once you have the atom Object, you can do anything with it. Most of the
methods there are public. To get a pointer to the atom set -- KEEP THIS
LOCAL!! --
Atom[] atoms = viewer.getModelSet().atoms
And once you have that, you can, for instance, just check:
int atomNo = atoms[atomIndex].getAtomNumber();
Chris.
Robert Hanson wrote:
Chris, we can't use the atomno property
to
uniquely
identify an atom, because there may be multiple models loaded, and
more than one may have, say, atomno=1. So instead we indicate an "atom
index" which is a unique number relating to the entire set of models.
These numbers start with 0. So all you need to do is
select atomindex=
instead of
select atomno=
On Thu, Feb 26, 2009 at 9:44 AM,
Chris
Foley <[email protected]>
wrote:
Hi
all,
I'm having a bit of trouble with atom indexes. I'm using mouse over
events to get the atom under the mouse cursor and then trying to select
the same atom in Jmol. In essence it's this:
int atom = findNearestAtomIndex(e.getPoint()); // e is of type
MouseEvent
evalString("select atomno=" + atom + ";");
However, the selected atom is not the same as under the mouse. Here's a
demo app so you can see what I mean (please excuse the messy use of
reflection). You will need Jmol and the 2 PDB files in the same
directory as the compiled class file to run it.
Thanks in advance for any help.
Cheers,
Chris Foley.
package JmolAtomDemo;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.lang.reflect.Method;
import javax.swing.JFrame;
import javax.swing.JPanel;
import org.jmol.adapter.smarter.SmarterJmolAdapter;
import org.jmol.viewer.Viewer;
public class JmolAtomDemo extends JPanel {
private static final long serialVersionUID = 1L;
// Oh so messy!
private static Method findNearestAtomIndex;
static {
Class<?> c = Viewer.class;
Class<?>[] findNearestAtomIndexParams = {int.class,
int.class};
try {findNearestAtomIndex =
c.getDeclaredMethod("findNearestAtomIndex", findNearestAtomIndexParams);
} catch (Exception e) {e.printStackTrace();}
findNearestAtomIndex.setAccessible(true);
}
private Viewer viewer;
public JmolAtomDemo(String pdb) {
viewer = new Viewer(this, new SmarterJmolAdapter() );
viewer.setAppletContext("",null,null,"");
viewer.openFile(pdb);
viewer.evalString("selectionHalos ON;");
addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseMoved(MouseEvent e) {
int atomIndex = findNearestAtomIndex(e.getPoint());
String script = "select atomno=" + atomIndex + ";";
System.out.println(script);
viewer.evalString(script);
}
});
} // constructor
private final Dimension currentSize = new Dimension();
private final Rectangle rectClip = new Rectangle();
@Override
public void paint(Graphics g) {
getSize(currentSize);
g.getClipBounds(rectClip);
viewer.renderScreenImage(g, currentSize, rectClip);
} // paint
public int findNearestAtomIndex(Point mousePosition) {
Integer rv = -1;
try {
rv = (Integer)findNearestAtomIndex.invoke(
viewer, mousePosition.x, mousePosition.y);
} catch (Exception e) {
e.printStackTrace();
} // try
return rv;
} // findNearestAtomIndex
public static void main(String[] args) {
JFrame frame1 = new JFrame("1NCP");
frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame1.getContentPane().add(new JmolAtomDemo("1NCP.pdb"));
frame1.setSize(300, 300);
frame1.setVisible(true);
JFrame frame2 = new JFrame("1CDH");
frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame2.getContentPane().add(new JmolAtomDemo("1cdh.pdb"));
frame2.setLocation(300, 0);
frame2.setSize(300, 300);
frame2.setVisible(true);
} // main
}
------------------------------------------------------------------------------
Open Source Business Conference (OSBC), March 24-25, 2009, San
Francisco, CA
-OSBC tackles the biggest issue in open source: Open Sourcing the
Enterprise
-Strategies to boost innovation and cut costs with open source
participation
-Receive a $600 discount off the registration fee with the source code:
SFAD
http://p.sf.net/sfu/XcvMzF8H
_______________________________________________
Jmol-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jmol-users
--
Robert M. Hanson
Professor of Chemistry
St. Olaf College
1520 St. Olaf Ave.
Northfield, MN 55057
http://www.stolaf.edu/people/hansonr
phone: 507-786-3107
If nature does not answer first what we want,
it is better to take what answer we get.
-- Josiah Willard Gibbs, Lecture XXX, Monday, February 5, 1900
------------------------------------------------------------------------------
Open Source Business Conference (OSBC), March 24-25, 2009, San
Francisco, CA
-OSBC tackles the biggest issue in open source: Open Sourcing the
Enterprise
-Strategies to boost innovation and cut costs with open source
participation
-Receive a $600 discount off the registration fee with the source code:
SFAD
http://p.sf.net/sfu/XcvMzF8H
_______________________________________________
Jmol-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jmol-users
--
Robert M. Hanson
Professor of Chemistry
St. Olaf College
1520 St. Olaf Ave.
Northfield, MN 55057
http://www.stolaf.edu/people/hansonr
phone: 507-786-3107
If nature does not answer first what we want,
it is better to take what answer we get.
-- Josiah Willard Gibbs, Lecture XXX, Monday, February 5, 1900
------------------------------------------------------------------------------
Open Source Business Conference (OSBC), March 24-25, 2009, San
Francisco, CA
-OSBC tackles the biggest issue in open source: Open Sourcing the
Enterprise
-Strategies to boost innovation and cut costs with open source
participation
-Receive a $600 discount off the registration fee with the source code:
SFAD
http://p.sf.net/sfu/XcvMzF8H
_______________________________________________
Jmol-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jmol-users
--
Robert M. Hanson
Professor of Chemistry
St. Olaf College
1520 St. Olaf Ave.
Northfield, MN 55057
http://www.stolaf.edu/people/hansonr
phone: 507-786-3107
If nature does not answer first what we want,
it is better to take what answer we get.
-- Josiah Willard Gibbs, Lecture XXX, Monday, February 5, 1900
|