X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fext%2Fjmol%2FJalviewJmolBinding.java;h=f31272ace6ff4981d3a76d7d0160d2e5894b93f3;hb=6fb502e4a8749d1d98f5442c3b8156ab47996b77;hp=257ca8c115af4edfcdaaf1aced17647255d9fa61;hpb=e644829fd3fd8f07c9dd493c0eed9ab82bc8e636;p=jalview.git diff --git a/src/jalview/ext/jmol/JalviewJmolBinding.java b/src/jalview/ext/jmol/JalviewJmolBinding.java index 257ca8c..f31272a 100644 --- a/src/jalview/ext/jmol/JalviewJmolBinding.java +++ b/src/jalview/ext/jmol/JalviewJmolBinding.java @@ -323,9 +323,55 @@ public abstract class JalviewJmolBinding implements StructureListener, public void superposeStructures(AlignmentI[] _alignment, int[] _refStructure, ColumnSelection[] _hiddenCols) { + assert (_alignment.length == _refStructure.length && _alignment.length != _hiddenCols.length); + String[] files = getPdbFile(); + // check to see if we are still waiting for Jmol files + long starttime=System.currentTimeMillis(); + boolean waiting=true; + do { + waiting=false; + for (String file:files) + { + try { + // HACK - in Jalview 2.8 this call may not be threadsafe so we catch + // every possible exception + StructureMapping[] sm = ssm.getMapping(file); + if (sm == null || sm.length == 0) + { + waiting = true; + } + } catch (Exception x) + { + waiting = true; + } catch (Error q) + { + waiting = true; + } + } + // we wait around for a reasonable time before we give up + } while (waiting && System.currentTimeMillis()<(10000+1000*files.length+starttime)); + if (waiting) + { + System.err.println("RUNTIME PROBLEM: Jmol seems to be taking a long time to process all the structures."); + return; + } StringBuffer selectioncom = new StringBuffer(); - assert (_alignment.length == _refStructure.length && _alignment.length != _hiddenCols.length); + // In principle - nSeconds specifies the speed of animation for each + // superposition - but is seems to behave weirdly, so we don't specify it. + String nSeconds = " "; + if (files.length > 10) + { + nSeconds = " 0.00001 "; + } + else + { + nSeconds = " " + (2.0 / files.length) + " "; + // if (nSeconds).substring(0,5)+" "; + } + // see JAL-1345 - should really automatically turn off the animation for + // large numbers of structures, but Jmol doesn't seem to allow that. + nSeconds = " "; // union of all aligned positions are collected together. for (int a = 0; a < _alignment.length; a++) { @@ -370,8 +416,9 @@ public abstract class JalviewJmolBinding implements StructureListener, // RACE CONDITION - getMapping only returns Jmol loaded filenames once // Jmol callback has completed. if (mapping == null || mapping.length < 1) - continue; - + { + throw new Error("Implementation error - Jmol seems to be still working on getting its data - report at http://issues.jalview.org/browse/JAL-1016"); + } int lastPos = -1; for (int s = 0; s < sequence[pdbfnum].length; s++) { @@ -436,6 +483,13 @@ public abstract class JalviewJmolBinding implements StructureListener, } } } + + // TODO: consider bailing if nmatched less than 4 because superposition + // not + // well defined. + // TODO: refactor superposable position search (above) from jmol selection + // construction (below) + String[] selcom = new String[files.length]; int nmatched = 0; // generate select statements to select regions to superimpose structures @@ -501,11 +555,6 @@ public abstract class JalviewJmolBinding implements StructureListener, } } } - // TODO: consider bailing if nmatched less than 4 because superposition - // not - // well defined. - // TODO: refactor superposable position search (above) from jmol selection - // construction (below) for (int pdbfnum = 0; pdbfnum < files.length; pdbfnum++) { if (pdbfnum == refStructure) @@ -517,7 +566,7 @@ public abstract class JalviewJmolBinding implements StructureListener, command.append(chainNames[pdbfnum]); command.append(") against reference ("); command.append(chainNames[refStructure]); - command.append(")\";\ncompare "); + command.append(")\";\ncompare "+nSeconds); command.append("{"); command.append(1 + pdbfnum); command.append(".1} {");