From: Robert H. <ha...@st...> - 2012-06-22 20:50:11
|
Yes, x.sort(1) is the way to go. x = [ ] Var atoms = {*} for (var i = atoms.size; i > 0; --i) { x[i] = [atoms[i].atomIndex,atoms[i].vdw] } x = x.sort(2) On Fri, Jun 22, 2012 at 9:10 AM, Alexander Rose <ale...@we... > wrote: > Hi, > > I would like to sort an atom selection by some atom property. I can do > 'var x = {1}.vdw.all; x.sort; print x;' but then I loose the link to actual > atoms. I know what the 3rd smallest vdw radius is but not to which atom(s) > it belongs. > > I know that I could use a loop in Jmol-script but that takes too long for > proteins or ribosomes, try e.g. the tests at the end. Wait... I tried a 2nd > implementation that reuses a large enough array and also gets the > properties at once. So my ideas below for new functions are not that > pressing. But I still think them a valuable addition. What is your opinion? > > Sounds useful. Can you think of a reasonable syntax? > ----- > > If there is no way to do it, I would suggest the following. There is > already fast way to sort an array of arrays with > 'array.sort(columnIndexOfNestedArray)'. So how to get an array of arrays > like 'x = [[vdw1, atomindex1], [vdw2, atomindex2], ...]' which could be > sorted with 'x.sort(1)'. Then, how to get an array of the sorted (by the > vdw radius) atomindex. I suggest two variations of the array methods > add/sub: 'array.add(APPEND, array2)' and 'array.sub(PLUCK, columnIndex)'. > Array.add(APPEND, array) would do: 'a1 = [1,2,3]; a2 = [4,5,6]; a3 = > a1.add(APPEND, a2); print a3 => [[1,4],[2,5],[3,6]]' and 'print > a3.add(APPEND, a1) => [[1,4,1],[2,5,2],[3,6,3]]'. Array.sub(PLUCK, > columnIndex) would do 'print a3.sub(PLUCK, 2) => [4,5,6]'. > > @Bob I'm thinking about adding these myself, would you second the syntax I > outlined above? Alternatively we could add new functions 'array.append' and > 'array.pluck'. Is it sufficient to add the new tokens to script.Token.java > and handle the occurrence of the new tokens in > script.ScriptMathProcessor.java::evaluateList()? > > > Best > Alexander > > > > > 1VQK.pdb (91602 atoms) > > load =1vqk; > var x = {*}.vdw.all; x.sort; print "sort done"; # instantly done > > # very slow > function property_list(sele){ > var arr = []; > for( a in sele ){ > arr |= [[ a.atomindex, a.vdw ]]; > } > print "done"; > } > #property_list( {*} ); > > > # much faster, ok for most structures > function property_list2(sele){ > var arr = sele.atomindex.all; > var prop = sele.vdw.all > var n = arr.length > for( var i=1; i<=n; ++i ){ > arr[i] = [ arr[i], prop[i] ]; > } > print "done2"; > #print arr; > } > property_list2( {*} ); > > > ------------------------------------------------------------------------------ > Live Security Virtual Conference > Exclusive live event will cover all the ways today's security and > threat landscape has changed and how IT managers can respond. Discussions > will include endpoint security, mobile security and the latest in malware > threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/ > _______________________________________________ > Jmol-users mailing list > Jmo...@li... > https://lists.sourceforge.net/lists/listinfo/jmol-users > -- Robert M. Hanson Larson-Anderson Professor of Chemistry Chair, Chemistry Department St. Olaf College Northfield, MN http://www.stolaf.edu/people/hansonr 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 |