JAL-1588 refactoring prior to 'save Chimera project'
[jalview.git] / src / jalview / ext / rbvi / chimera / JalviewChimeraBinding.java
index 7033ba7..cb2a9ca 100644 (file)
@@ -23,8 +23,6 @@ package jalview.ext.rbvi.chimera;
 import jalview.api.AlignmentViewPanel;
 import jalview.api.FeatureRenderer;
 import jalview.api.SequenceRenderer;
-import jalview.api.SequenceStructureBinding;
-import jalview.api.StructureSelectionManagerProvider;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.ColumnSelection;
 import jalview.datamodel.PDBEntry;
@@ -32,10 +30,11 @@ import jalview.datamodel.SequenceI;
 import jalview.io.AppletFormatAdapter;
 import jalview.schemes.ColourSchemeI;
 import jalview.schemes.ResidueProperties;
-import jalview.structure.StructureListener;
 import jalview.structure.StructureMapping;
+import jalview.structure.StructureMappingcommandSet;
 import jalview.structure.StructureSelectionManager;
-import jalview.structures.models.SequenceStructureBindingModel;
+import jalview.structures.models.AAStructureBindingModel;
+import jalview.util.Comparison;
 import jalview.util.MessageManager;
 
 import java.awt.Color;
@@ -53,11 +52,11 @@ import ext.edu.ucsf.rbvi.strucviz2.ChimeraModel;
 import ext.edu.ucsf.rbvi.strucviz2.StructureManager;
 import ext.edu.ucsf.rbvi.strucviz2.StructureManager.ModelType;
 
-public abstract class JalviewChimeraBinding extends
-        SequenceStructureBindingModel implements StructureListener,
-        SequenceStructureBinding, StructureSelectionManagerProvider
-
+public abstract class JalviewChimeraBinding extends AAStructureBindingModel
 {
+
+  private static final boolean debug = false;
+
   private static final String PHOSPHORUS = "P";
 
   private static final String ALPHACARBON = "CA";
@@ -74,13 +73,14 @@ public abstract class JalviewChimeraBinding extends
   private boolean loadingFromArchive = false;
 
   /**
-   * second flag to indicate if the jmol viewer should ignore sequence colouring
-   * events from the structure manager because the GUI is still setting up
+   * second flag to indicate if the Chimera viewer should ignore sequence
+   * colouring events from the structure manager because the GUI is still
+   * setting up
    */
   private boolean loadingFinished = true;
 
   /**
-   * state flag used to check if the Jmol viewer's paint method can be called
+   * state flag used to check if the Chimera viewer's paint method can be called
    */
   private boolean finishedInit = false;
 
@@ -108,13 +108,6 @@ public abstract class JalviewChimeraBinding extends
 
   private Map<String, String> chainFile;
 
-  /**
-   * array of target chains for sequences - tied to pdbentry and sequence[]
-   */
-  protected String[][] chains;
-
-  boolean colourBySequence = true;
-
   StringBuffer eval = new StringBuffer();
 
   public String fileLoadingError;
@@ -173,12 +166,12 @@ public abstract class JalviewChimeraBinding extends
         } catch (Error e)
         {
         }
-        // Explicitly map to the filename used by Jmol ;
+        // Explicitly map to the filename used by Chimera ;
         // pdbentry[pe].getFile(), protocol);
 
-        if (ssm != null)
+        if (getSsm() != null)
         {
-          ssm.addStructureViewerListener(this);
+          getSsm().addStructureViewerListener(this);
           // ssm.addSelectionListener(this);
           FeatureRenderer fr = getFeatureRenderer(null);
           if (fr != null)
@@ -203,53 +196,40 @@ public abstract class JalviewChimeraBinding extends
    */
   String[] modelFileNames = null;
 
-  public PDBEntry[] pdbentry;
-
-  /**
-   * datasource protocol for access to PDBEntrylatest
-   */
-  String protocol = null;
 
   StringBuffer resetLastRes = new StringBuffer();
 
-  /**
-   * sequences mapped to each pdbentry
-   */
-  public SequenceI[][] sequence;
-
-  public StructureSelectionManager ssm;
-
   private List<String> lastReply;
 
+  /**
+   * Constructor
+   * 
+   * @param ssm
+   * @param pdbentry
+   * @param sequenceIs
+   * @param chains
+   * @param protocol
+   */
   public JalviewChimeraBinding(StructureSelectionManager ssm,
           PDBEntry[] pdbentry, SequenceI[][] sequenceIs, String[][] chains,
           String protocol)
   {
-    this.ssm = ssm;
-    this.sequence = sequenceIs;
-    this.chains = chains;
-    this.pdbentry = pdbentry;
-    this.protocol = protocol;
-    if (chains == null)
-    {
-      this.chains = new String[pdbentry.length][];
-    }
+    super(ssm, pdbentry, sequenceIs, chains, protocol);
     viewer = new ChimeraManager(
             csm = new ext.edu.ucsf.rbvi.strucviz2.StructureManager(true));
-    /*
-     * viewer = JmolViewer.allocateViewer(renderPanel, new SmarterJmolAdapter(),
-     * "jalviewJmol", ap.av.applet .getDocumentBase(),
-     * ap.av.applet.getCodeBase(), "", this);
-     * 
-     * jmolpopup = JmolPopup.newJmolPopup(viewer, true, "Jmol", true);
-     */
   }
 
+  /**
+   * Constructor
+   * 
+   * @param ssm
+   * @param theViewer
+   */
   public JalviewChimeraBinding(StructureSelectionManager ssm,
-          ChimeraManager viewer2)
+          ChimeraManager theViewer)
   {
-    this.ssm = ssm;
-    viewer = viewer2;
+    super(ssm, null);
+    viewer = theViewer;
     csm = viewer.getStructureManager();
   }
 
@@ -262,34 +242,7 @@ public abstract class JalviewChimeraBinding extends
    */
   public String getViewerTitle(boolean verbose)
   {
-    if (sequence == null || pdbentry == null || sequence.length < 1
-            || pdbentry.length < 1 || sequence[0].length < 1)
-    {
-      return ("Jalview Chimera Window");
-    }
-    // TODO: give a more informative title when multiple structures are
-    // displayed.
-    StringBuilder title = new StringBuilder(64);
-    title.append("Chimera view for " + sequence[0][0].getName() + ":"
-            + pdbentry[0].getId());
-
-    if (verbose)
-    {
-      if (pdbentry[0].getProperty() != null)
-      {
-        if (pdbentry[0].getProperty().get("method") != null)
-        {
-          title.append(" Method: ");
-          title.append(pdbentry[0].getProperty().get("method"));
-        }
-        if (pdbentry[0].getProperty().get("chains") != null)
-        {
-          title.append(" Chain:");
-          title.append(pdbentry[0].getProperty().get("chains"));
-        }
-      }
-    }
-    return title.toString();
+    return getViewerTitle("Chimera", verbose);
   }
 
   /**
@@ -325,43 +278,33 @@ public abstract class JalviewChimeraBinding extends
   }
 
   /**
-   * Close down the Jalview viewer, and (optionally) the associate Chimera
+   * Close down the Jalview viewer, and (optionally) the associated Chimera
    * window.
    */
   public void closeViewer(boolean closeChimera)
   {
-    ssm.removeStructureViewerListener(this, this.getPdbFile());
+    getSsm().removeStructureViewerListener(this, this.getPdbFile());
     if (closeChimera)
     {
       viewer.exitChimera();
     }
-    // viewer.evalStringQuiet("zap");
-    // viewer.setJmolStatusListener(null);
     lastCommand = null;
     viewer = null;
     releaseUIResources();
   }
 
-  /**
-   * called by JalviewJmolbinding after closeViewer is called - release any
-   * resources and references so they can be garbage collected.
-   */
-  protected abstract void releaseUIResources();
-
   public void colourByChain()
   {
     colourBySequence = false;
-    // TODO: colour by chain should colour each chain distinctly across all
-    // visible models
-    // TODO: http://issues.jalview.org/browse/JAL-628
-    evalStateCommand("select *;color chain",false);
+    evalStateCommand("rainbow chain", false);
   }
 
   public void colourByCharge()
   {
     colourBySequence = false;
-    evalStateCommand("colour *;color white;select ASP,GLU;color red;"
-            + "select LYS,ARG;color blue;select CYS;color yellow", false);
+    evalStateCommand(
+            "color white;color red ::ASP;color red ::GLU;color blue ::LYS;color blue ::ARG;color yellow ::CYS",
+            false);
   }
 
   /**
@@ -411,7 +354,7 @@ public abstract class JalviewChimeraBinding extends
     assert (_alignment.length == _refStructure.length && _alignment.length != _hiddenCols.length);
     StringBuilder allComs = new StringBuilder(128); // Chimera superposition cmd
     String[] files = getPdbFile();
-    // check to see if we are still waiting for Jmol files
+    // check to see if we are still waiting for Chimera files
     long starttime = System.currentTimeMillis();
     boolean waiting = true;
     do
@@ -423,7 +366,7 @@ public abstract class JalviewChimeraBinding extends
         {
           // HACK - in Jalview 2.8 this call may not be threadsafe so we catch
           // every possible exception
-          StructureMapping[] sm = ssm.getMapping(file);
+          StructureMapping[] sm = getSsm().getMapping(file);
           if (sm == null || sm.length == 0)
           {
             waiting = true;
@@ -485,7 +428,7 @@ public abstract class JalviewChimeraBinding extends
       String[] atomSpec = new String[files.length];
       for (int pdbfnum = 0; pdbfnum < files.length; pdbfnum++)
       {
-        StructureMapping[] mapping = ssm.getMapping(files[pdbfnum]);
+        StructureMapping[] mapping = getSsm().getMapping(files[pdbfnum]);
         // RACE CONDITION - getMapping only returns Jmol loaded filenames once
         // Jmol callback has completed.
         if (mapping == null || mapping.length < 1)
@@ -493,12 +436,14 @@ public abstract class JalviewChimeraBinding extends
           throw new Error(MessageManager.getString("error.implementation_error_chimera_getting_data"));
         }
         int lastPos = -1;
-        for (int s = 0; s < sequence[pdbfnum].length; s++)
+        final int seqCountForPdbFile = getSequence()[pdbfnum].length;
+        for (int s = 0; s < seqCountForPdbFile; s++)
         {
           for (int sp, m = 0; m < mapping.length; m++)
           {
-            if (mapping[m].getSequence() == sequence[pdbfnum][s]
-                    && (sp = alignment.findIndex(sequence[pdbfnum][s])) > -1)
+            final SequenceI theSequence = getSequence()[pdbfnum][s];
+            if (mapping[m].getSequence() == theSequence
+                    && (sp = alignment.findIndex(theSequence)) > -1)
             {
               if (refStructure == -1)
               {
@@ -517,7 +462,7 @@ public abstract class JalviewChimeraBinding extends
                   continue;
                 }
 
-                if (jalview.util.Comparison.isGap(asp.getCharAt(r)))
+                if (Comparison.isGap(asp.getCharAt(r)))
                 {
                   // no mapping to gaps in sequence
                   continue;
@@ -551,7 +496,7 @@ public abstract class JalviewChimeraBinding extends
                       + targetC[pdbfnum];
               atomSpec[pdbfnum] = asp.getRNA() != null ? PHOSPHORUS : ALPHACARBON;
               // move on to next pdb file
-              s = sequence[pdbfnum].length;
+              s = seqCountForPdbFile;
               break;
             }
           }
@@ -664,10 +609,12 @@ public abstract class JalviewChimeraBinding extends
       }
       if (selectioncom.length() > 0)
       {
-        // TODO remove debug output
-        System.out.println("Select regions:\n" + selectioncom.toString());
-        System.out
-                .println("Superimpose command(s):\n" + command.toString());
+        if (debug)
+        {
+          System.out.println("Select regions:\n" + selectioncom.toString());
+          System.out.println("Superimpose command(s):\n"
+                  + command.toString());
+        }
         allComs.append("~display all; chain @CA|P; ribbon "
                 + selectioncom.toString() + ";"+command.toString());
         // selcom.append("; ribbons; ");
@@ -679,7 +626,10 @@ public abstract class JalviewChimeraBinding extends
       {
         selectioncom.setLength(selectioncom.length() - 1);
       }
-      System.out.println("Select regions:\n" + selectioncom.toString());
+      if (debug)
+      {
+        System.out.println("Select regions:\n" + selectioncom.toString());
+      }
       allComs.append("; ~display all; chain @CA|P; ribbon "
               + selectioncom.toString() + "; focus");
       // evalStateCommand("select *; backbone; select "+selcom.toString()+"; cartoons; center "+selcom.toString());
@@ -762,7 +712,7 @@ public abstract class JalviewChimeraBinding extends
     {
       return;
     }
-    if (ssm == null)
+    if (getSsm() == null)
     {
       return;
     }
@@ -777,22 +727,45 @@ public abstract class JalviewChimeraBinding extends
     }
     AlignmentI alignment = alignmentv.getAlignment();
 
-    for (jalview.structure.StructureMappingcommandSet cpdbbyseq : ChimeraCommands
-            .getColourBySequenceCommand(ssm, files, sequence, sr, fr,
-                    alignment))
+    for (jalview.structure.StructureMappingcommandSet cpdbbyseq : getColourBySequenceCommands(files, sr, fr, alignment))
     {
-      for (String cbyseq : cpdbbyseq.commands)
+      for (String command : cpdbbyseq.commands)
       {
-        waitForChimera();
-        evalStateCommand(cbyseq, false);
-        waitForChimera();
+        executeWhenReady(command);
       }
     }
   }
 
+  /**
+   * @param files
+   * @param sr
+   * @param fr
+   * @param alignment
+   * @return
+   */
+  protected StructureMappingcommandSet[] getColourBySequenceCommands(
+          String[] files, SequenceRenderer sr, FeatureRenderer fr,
+          AlignmentI alignment)
+  {
+    return ChimeraCommands
+            .getColourBySequenceCommand(getSsm(), files, getSequence(), sr,
+                    fr,
+                    alignment);
+  }
+
+  /**
+   * @param command
+   */
+  protected void executeWhenReady(String command)
+  {
+    waitForChimera();
+    evalStateCommand(command, false);
+    waitForChimera();
+  }
+
   private void waitForChimera()
   {
-    while (viewer.isBusy())
+    while (viewer != null && viewer.isBusy())
     {
       try {
         Thread.sleep(15);
@@ -801,30 +774,11 @@ public abstract class JalviewChimeraBinding extends
     }
   }
 
-  public boolean isColourBySequence()
-  {
-    return colourBySequence;
-  }
-
-  public void setColourBySequence(boolean colourBySequence)
-  {
-    this.colourBySequence = colourBySequence;
-  }
+  
 
   // End StructureListener
   // //////////////////////////
 
-  public float[][] functionXY(String functionName, int x, int y)
-  {
-    return null;
-  }
-
-  public float[][][] functionXYZ(String functionName, int nx, int ny, int nz)
-  {
-    // TODO Auto-generated method stub
-    return null;
-  }
-
   public Color getColour(int atomIndex, int pdbResNum, String chain,
           String pdbfile)
   {
@@ -964,8 +918,6 @@ public abstract class JalviewChimeraBinding extends
     }
   }
 
-  boolean debug = true;
-
   private void log(String message)
   {
     System.err.println("## Chimera log: " + message);
@@ -973,8 +925,8 @@ public abstract class JalviewChimeraBinding extends
 
   private void viewerCommandHistory(boolean enable)
   {
-    log("(Not yet implemented) History "
-            + ((debug || enable) ? "on" : "off"));
+    // log("(Not yet implemented) History "
+    // + ((debug || enable) ? "on" : "off"));
   }
 
   public void loadInline(String string)
@@ -1067,7 +1019,7 @@ public abstract class JalviewChimeraBinding extends
     }
     if (lastMessage == null || !lastMessage.equals(strInfo))
     {
-      ssm.mouseOverStructure(pdbResNum, chainId, pdbfilename);
+      getSsm().mouseOverStructure(pdbResNum, chainId, pdbfilename);
     }
 
     lastMessage = strInfo;
@@ -1192,13 +1144,13 @@ public abstract class JalviewChimeraBinding extends
         }
         // deregister the Jmol instance for these structures - we'll add
         // ourselves again at the end for the current structure set.
-        ssm.removeStructureViewerListener(this, oldmfn);
+        getSsm().removeStructureViewerListener(this, oldmfn);
       }
     }
 
     // register ourselves as a listener and notify the gui that it needs to
     // update itself.
-    ssm.addStructureViewerListener(this);
+    getSsm().addStructureViewerListener(this);
 
     if (notifyLoaded)
     {
@@ -1225,10 +1177,13 @@ public abstract class JalviewChimeraBinding extends
     String res;
     int index;
     Color col;
+    // Chimera expects RBG values in the range 0-1
+    final double normalise = 255D;
     viewerCommandHistory(false);
     // TODO: Switch between nucleotide or aa selection expressions
     Enumeration en = ResidueProperties.aa3Hash.keys();
-    StringBuffer command = new StringBuffer("select *;color white;");
+    StringBuilder command = new StringBuilder(128);
+    command.append("color white;");
     while (en.hasMoreElements())
     {
       res = en.nextElement().toString();
@@ -1239,53 +1194,22 @@ public abstract class JalviewChimeraBinding extends
       }
 
       col = cs.findColour(ResidueProperties.aa[index].charAt(0));
-      // TODO: need colour string function and res selection here
-      command.append("select " + res + ";color[" + col.getRed() + ","
-              + col.getGreen() + "," + col.getBlue() + "];");
+      command.append("color " + col.getRed() / normalise + ","
+              + col.getGreen() / normalise + "," + col.getBlue()
+              / normalise + " ::" + res + ";");
     }
 
     evalStateCommand(command.toString(),false);
     viewerCommandHistory(true);
   }
 
-  public void showHelp()
-  {
-    // chimera help
-    showUrl("http://jmol.sourceforge.net/docs/JmolUserGuide/", "jmolHelp");
-  }
-
-  /**
-   * open the URL somehow
-   * 
-   * @param target
-   */
-  public abstract void showUrl(String url, String target);
-
   /**
-   * called when the binding thinks the UI needs to be refreshed after a Jmol
+   * called when the binding thinks the UI needs to be refreshed after a Chimera
    * state change. this could be because structures were loaded, or because an
-   * error has occured.
+   * error has occurred.
    */
   public abstract void refreshGUI();
 
-  public void componentResized(ComponentEvent e)
-  {
-
-  }
-
-  public void componentMoved(ComponentEvent e)
-  {
-
-  }
-
-  public void componentShown(ComponentEvent e)
-  {
-  }
-
-  public void componentHidden(ComponentEvent e)
-  {
-  }
-
   public void setLoadingFromArchive(boolean loadingFromArchive)
   {
     this.loadingFromArchive = loadingFromArchive;
@@ -1293,8 +1217,8 @@ public abstract class JalviewChimeraBinding extends
 
   /**
    * 
-   * @return true if Jmol is still restoring state or loading is still going on
-   *         (see setFinsihedLoadingFromArchive)
+   * @return true if Chimeral is still restoring state or loading is still going
+   *         on (see setFinsihedLoadingFromArchive)
    */
   public boolean isLoadingFromArchive()
   {
@@ -1312,165 +1236,52 @@ public abstract class JalviewChimeraBinding extends
     loadingFinished = finishedLoading;
   }
 
-  public void setBackgroundColour(java.awt.Color col)
+  /**
+   * Send the Chimera 'background solid <color>" command.
+   * 
+   * @see https
+   *      ://www.cgl.ucsf.edu/chimera/current/docs/UsersGuide/midas/background
+   *      .html
+   * @param col
+   */
+  public void setBackgroundColour(Color col)
   {
     viewerCommandHistory(false);
-    // todo set background colour
-    viewer.sendChimeraCommand(
-            "background [" + col.getRed() + "," + col.getGreen() + ","
-                    + col.getBlue() + "];", false);
+    double normalise = 255D;
+    final String command = "background solid " + col.getRed() / normalise + ","
+            + col.getGreen() / normalise + "," + col.getBlue()
+            / normalise + ";";
+    viewer.sendChimeraCommand(command, false);
     viewerCommandHistory(true);
   }
 
   /**
-   * add structures and any known sequence associations
    * 
-   * @returns the pdb entries added to the current set.
+   * @param pdbfile
+   * @return text report of alignment between pdbfile and any associated
+   *         alignment sequences
    */
-  public synchronized PDBEntry[] addSequenceAndChain(PDBEntry[] pdbe,
-          SequenceI[][] seq, String[][] chns)
+  public String printMapping(String pdbfile)
   {
-    List<PDBEntry> v = new ArrayList<PDBEntry>();
-    List<int[]> rtn = new ArrayList<int[]>();
-    for (int i = 0; i < pdbentry.length; i++)
-    {
-      v.add(pdbentry[i]);
-    }
-    for (int i = 0; i < pdbe.length; i++)
-    {
-      int r = v.indexOf(pdbe[i]);
-      if (r == -1 || r >= pdbentry.length)
-      {
-        rtn.add(new int[]
-        { v.size(), i });
-        v.add(pdbe[i]);
-      }
-      else
-      {
-        // just make sure the sequence/chain entries are all up to date
-        addSequenceAndChain(r, seq[i], chns[i]);
-      }
-    }
-    pdbe = v.toArray(new PDBEntry[v.size()]);
-    pdbentry = pdbe;
-    if (rtn.size() > 0)
-    {
-      // expand the tied sequence[] and string[] arrays
-      SequenceI[][] sqs = new SequenceI[pdbentry.length][];
-      String[][] sch = new String[pdbentry.length][];
-      System.arraycopy(sequence, 0, sqs, 0, sequence.length);
-      System.arraycopy(chains, 0, sch, 0, this.chains.length);
-      sequence = sqs;
-      chains = sch;
-      pdbe = new PDBEntry[rtn.size()];
-      for (int r = 0; r < pdbe.length; r++)
-      {
-        int[] stri = (rtn.get(r));
-        // record the pdb file as a new addition
-        pdbe[r] = pdbentry[stri[0]];
-        // and add the new sequence/chain entries
-        addSequenceAndChain(stri[0], seq[stri[1]], chns[stri[1]]);
-      }
-    }
-    else
-    {
-      pdbe = null;
-    }
-    return pdbe;
+    return getSsm().printMapping(pdbfile);
   }
 
   /**
-   * Adds sequences to the pe'th pdbentry's sequence set.
+   * Ask Chimera to save its session to the given file. Returns true if
+   * successful, else false.
    * 
-   * @param pe
-   * @param seq
+   * @param filepath
+   * @return
    */
-  public void addSequence(int pe, SequenceI[] seq)
-  {
-    addSequenceAndChain(pe, seq, null);
-  }
-
-  private void addSequenceAndChain(int pe, SequenceI[] seq, String[] tchain)
+  public boolean saveSession(String filepath)
   {
-    if (pe < 0 || pe >= pdbentry.length)
-    {
-      throw new Error(MessageManager.formatMessage(
-              "error.implementation_error_no_pdbentry_from_index",
-              new Object[]
-              { Integer.valueOf(pe).toString() }));
-    }
-    final String nullChain = "TheNullChain";
-    List<SequenceI> s = new ArrayList<SequenceI>();
-    List<String> c = new ArrayList<String>();
-    if (chains == null)
-    {
-      chains = new String[pdbentry.length][];
-    }
-    if (sequence[pe] != null)
-    {
-      for (int i = 0; i < sequence[pe].length; i++)
-      {
-        s.add(sequence[pe][i]);
-        if (chains[pe] != null)
-        {
-          if (i < chains[pe].length)
-          {
-            c.add(chains[pe][i]);
-          }
-          else
-          {
-            c.add(nullChain);
-          }
-        }
-        else
-        {
-          if (tchain != null && tchain.length > 0)
-          {
-            c.add(nullChain);
-          }
-        }
-      }
-    }
-    for (int i = 0; i < seq.length; i++)
-    {
-      if (!s.contains(seq[i]))
-      {
-        s.add(seq[i]);
-        if (tchain != null && i < tchain.length)
-        {
-          c.add(tchain[i] == null ? nullChain : tchain[i]);
-        }
-      }
-    }
-    SequenceI[] tmp = s.toArray(new SequenceI[s.size()]);
-    sequence[pe] = tmp;
-    if (c.size() > 0)
-    {
-      String[] tch = c.toArray(new String[c.size()]);
-      for (int i = 0; i < tch.length; i++)
-      {
-        if (tch[i] == nullChain)
-        {
-          tch[i] = null;
-        }
-      }
-      chains[pe] = tch;
-    }
-    else
+    if (isChimeraRunning())
     {
-      chains[pe] = null;
+      List<String> reply = viewer.sendChimeraCommand("save " + filepath,
+              true);
+      System.out.println(reply);
     }
-  }
-
-  /**
-   * 
-   * @param pdbfile
-   * @return text report of alignment between pdbfile and any associated
-   *         alignment sequences
-   */
-  public String printMapping(String pdbfile)
-  {
-    return ssm.printMapping(pdbfile);
+    return false;
   }
 
 }