From: Michael T H. <mic...@us...> - 2004-01-21 14:18:23
|
Update of /cvsroot/jmol/Jmol/src/org/openscience/jmol/viewer/script In directory sc8-pr-cvs1:/tmp/cvs-serv18982/src/org/openscience/jmol/viewer/script Modified Files: Eval.java Log Message: examples using bitsets inside within implementations Index: Eval.java =================================================================== RCS file: /cvsroot/jmol/Jmol/src/org/openscience/jmol/viewer/script/Eval.java,v retrieving revision 1.69 retrieving revision 1.70 diff -u -r1.69 -r1.70 --- Eval.java 21 Jan 2004 12:13:44 -0000 1.69 +++ Eval.java 21 Jan 2004 14:18:19 -0000 1.70 @@ -920,17 +920,16 @@ return lookupValue(variable, true); } - BitSet getSpecModel(int modelNumber) { + void selectModelAtoms(int modelNumber, BitSet bsResult) { Frame frame = viewer.getFrame(); - int n = viewer.getAtomCount(); - BitSet bsModel = new BitSet(n); - for (int i = n; --i >= 0; ) { - PdbAtom pdbatom = frame.getAtomAt(i).getPdbAtom(); - if (pdbatom == null) - continue; - if (pdbatom.getModelID() == modelNumber) - bsModel.set(i); - } + for (int i = viewer.getAtomCount(); --i >= 0; ) + if (frame.getAtomAt(i).getModelID() == modelNumber) + bsResult.set(i); + } + + BitSet getSpecModel(int modelNumber) { + BitSet bsModel = new BitSet(viewer.getAtomCount()); + selectModelAtoms(modelNumber, bsModel); return bsModel; } @@ -1053,14 +1052,47 @@ void withinGroup(BitSet bs, BitSet bsResult) { System.out.println("withinGroup"); + // this test will select all the even-numbered atoms + // regardless of the input set + // note that we are assuming 0-based numbering + for (int i = 0; i < viewer.getAtomCount(); i += 2) + bsResult.set(i); } void withinChain(BitSet bs, BitSet bsResult) { System.out.println("withinChain"); + // this test will use the input set + // we will select the input atom + the two neighboring atoms ... + // the one below and the one above; + // rather than call viewer.getAtomCount() each time through + // the loop, I'm going to allocate a variable to hold it. + int atomCount = viewer.getAtomCount(); + for (int i = 0; i < atomCount; ++i) { + if (bs.get(i)) { + if (i > 0) + bsResult.set(i - 1); // set the bit before + bsResult.set(i); + if (i + 1 < atomCount) + bsResult.set(i + 1); // set the bit after + } + } } void withinModel(BitSet bs, BitSet bsResult) { System.out.println("withinModel"); + // we will really implement this one + // perhaps not the most efficient, but it is simple and good enough + Frame frame = viewer.getFrame(); + int modelLast = -1; + for (int i = viewer.getAtomCount(); --i >= 0; ) { + if (bs.get(i)) { + int model = frame.getAtomAt(i).getModelID(); + if (model != modelLast) { + selectModelAtoms(model, bsResult); + modelLast = model; + } + } + } } int getResno(Atom atom) { |