reoganization of PDB sequence fetching for sequence annotation generated by PDBFile
[jalview.git] / src / jalview / gui / SequenceFetcher.java
index cb41e6e..b4370b7 100755 (executable)
@@ -211,16 +211,31 @@ public class SequenceFetcher
     {
       StringTokenizer qset = new StringTokenizer(textfield.getText(), ";");
       String query;
+      SequenceI[] seqs = null;
       while (qset.hasMoreTokens() && ((query = qset.nextToken())!=null))
       {
-        StringBuffer respart = getPDBFile(query.toUpperCase());
-        if(respart!=null)
-          result.append(respart);
+        SequenceI[] seqparts = getPDBFile(query.toUpperCase());
+          if (seqparts!=null) {
+              if (seqs==null) {
+                  seqs = seqparts;
+              } else {
+                  SequenceI[] newseqs = new SequenceI[seqs.length+seqparts.length];
+                  int i=0;
+                  for (;i<seqs.length; i++) {
+                      newseqs[i] = seqs[i];
+                      seqs[i] = null;
+                  }
+                  for (int j=0;j<seqparts.length; i++, j++)
+                      newseqs[i] = seqparts[j];
+                  seqs=newseqs;
+              }
+              result.append("# Success for "+query.toUpperCase()+"\n");
+          }
+      }
+      if (seqs!=null && seqs.length>0) {
+          if (parseResult(new Alignment(seqs), null, null)!=null)
+              result.append("# Successfully parsed the PDB File Queries into an Alignment");
       }
-
-
-      if (result.length()>0)
-        parseResult(result.toString(), null);
     }
     else if( database.getSelectedItem().equals("PFAM"))
     {
@@ -327,9 +342,9 @@ public class SequenceFetcher
     }
   }
 
-  StringBuffer getPDBFile(String id)
+  SequenceI[] getPDBFile(String id)
   {
-    StringBuffer result = new StringBuffer();
+    Vector result = new Vector();
     String chain = null;
     if (id.indexOf(":") > -1)
     {
@@ -348,15 +363,34 @@ public class SequenceFetcher
       {
         if (chain == null ||
             ( (PDBChain) pdbfile.chains.elementAt(i)).id.
-            toUpperCase().equals(chain))
-
-          result.append("\n>PDB|" + id + "|" +
-                        ( (PDBChain) pdbfile.chains.elementAt(i)).sequence.
-                        getName() +
-                        "\n"
-                        +
-                        ( (PDBChain) pdbfile.chains.elementAt(i)).sequence.
-                        getSequenceAsString());
+            toUpperCase().equals(chain)) {
+            PDBChain pdbchain = (PDBChain) pdbfile.chains.elementAt(i);
+            // Get the Chain's Sequence - who's dataset includes any special features added from the PDB file
+            SequenceI sq = pdbchain.sequence;
+            // Specially formatted name for the PDB chain sequences retrieved from the PDB
+            sq.setName("PDB|"+id+"|"+sq.getName());
+            // Might need to add more metadata to the PDBEntry object
+            // like below
+            /*
+             * PDBEntry entry = new PDBEntry();
+            // Construct the PDBEntry
+            entry.setId(id);
+            if (entry.getProperty() == null)
+                entry.setProperty(new Hashtable());
+            entry.getProperty().put("chains",
+                        pdbchain.id
+                        + "=" + sq.getStart()
+                        + "-" + sq.getEnd()); 
+            sq.getDatasetSequence().addPDBId(entry);
+            */
+            // Add PDB DB Refs
+            // We make a DBRefEtntry because we have obtained the PDB file from a verifiable source
+            // JBPNote - PDB DBRefEntry should also carry the chain and mapping information
+            DBRefEntry dbentry = new DBRefEntry(jalview.datamodel.DBRefSource.PDB,"0",id+pdbchain.id);
+            sq.addDBRef(dbentry);
+            // and add seuqence to the retrieved set
+            result.addElement(sq.deriveSequence());
+        }
       }
     }
     catch (Exception ex) // Problem parsing PDB file
@@ -366,37 +400,53 @@ public class SequenceFetcher
                                  database.getSelectedItem(), ex);
       return null;
     }
-
-    return result;
+    SequenceI[] results = new SequenceI[result.size()];
+    for (int i=0,j=result.size();i<j; i++) {
+        results[i] = (SequenceI) result.elementAt(i);
+        result.setElementAt(null,i);
+    }
+    return results;
   }
-
   Alignment parseResult(String result, String title)
   {
-    String format = new IdentifyFile().Identify(result, "Paste");
-    Alignment al = null;
-
-    if (FormatAdapter.isValidFormat(format))
-    {
-
-      try{ al = new FormatAdapter().readFile(result.toString(), "Paste",
-                                               format);}
-      catch(Exception ex){}
+      String format = new IdentifyFile().Identify(result, "Paste");
+      Alignment sequences = null;
+      if (FormatAdapter.isValidFormat(format))
+      {
+        sequences = null;
+        try{ sequences = new FormatAdapter().readFile(result.toString(), "Paste",
+                                                 format);}
+        catch(Exception ex){}
+
+        if (sequences!=null)
+            return parseResult(sequences, title, format);
+      } else {
+              showErrorMessage("Error retrieving " + textfield.getText()
+                      + " from " + database.getSelectedItem());
+      }
 
+      return null;
+  }
+  Alignment parseResult(Alignment al, String title, String currentFileFormat) {
+    
       if (al != null && al.getHeight() > 0)
       {
         if (alignFrame == null)
         {
           AlignFrame af = new AlignFrame(al,
                                            AlignFrame.DEFAULT_WIDTH,
-                                           AlignFrame.DEFAULT_HEIGHT
-);
-          af.currentFileFormat = format;
+                                           AlignFrame.DEFAULT_HEIGHT);
+          if (currentFileFormat!=null)
+              af.currentFileFormat = currentFileFormat; // WHAT IS THE DEFAULT FORMAT FOR NON-FormatAdapter Sourced Alignments?
+          
           if(title==null)
             title = "Retrieved from " + database.getSelectedItem();
+          
           Desktop.addInternalFrame(af,
                                    title,
                                    AlignFrame.DEFAULT_WIDTH,
                                    AlignFrame.DEFAULT_HEIGHT);
+          
           af.statusBar.setText("Successfully pasted alignment file");
 
           try
@@ -410,18 +460,7 @@ public class SequenceFetcher
         {
           for (int i = 0; i < al.getHeight(); i++)
           {
-            alignFrame.viewport.alignment.addSequence(al.getSequenceAt(i));
-
-            ////////////////////////////
-            //Dataset needs extension;
-            /////////////////////////////
-            Sequence ds = new Sequence(al.getSequenceAt(i).getName(),
-                                       AlignSeq.extractGaps("-. ",
-                al.getSequenceAt(i).getSequenceAsString()),
-                                       al.getSequenceAt(i).getStart(),
-                                       al.getSequenceAt(i).getEnd());
-            al.getSequenceAt(i).setDatasetSequence(ds);
-            alignFrame.viewport.alignment.getDataset().addSequence(ds);
+            alignFrame.viewport.alignment.addSequence(al.getSequenceAt(i)); // this also creates dataset sequence entries
           }
           alignFrame.viewport.setEndSeq(alignFrame.viewport.alignment.
                                         getHeight());
@@ -429,61 +468,9 @@ public class SequenceFetcher
           alignFrame.viewport.firePropertyChange("alignment", null,
                                                  alignFrame.viewport.
                                                  getAlignment().getSequences());
-
-        }
-
-        if (database.getSelectedItem().equals("PDB"))
-        {
-          // Parse out the ids from the structured names
-          boolean errors = false;
-          for (int i = 0; i < al.getHeight(); i++)
-          {
-            PDBEntry entry = new PDBEntry();
-            com.stevesoft.pat.Regex idbits = new com.stevesoft.pat.Regex(
-                "PDB\\|([0-9A-z]{4})\\|(.)");
-            if (idbits.search(al.getSequenceAt(i).getName()))
-            {
-              String pdbid = idbits.substring(1);
-              String pdbccode = idbits.substring(2);
-              // Construct the PDBEntry
-              entry.setId(pdbid);
-              if (entry.getProperty() == null)
-                entry.setProperty(new Hashtable());
-              entry.getProperty().put("chains",
-                                      pdbccode
-                                      + "=" + al.getSequenceAt(i).getStart()
-                                      + "-" + al.getSequenceAt(i).getEnd());
-              al.getSequenceAt(i).getDatasetSequence().addPDBId(entry);
-
-              // We make a DBRefEtntry because we have obtained the PDB file from a verifiable source
-              // JBPNote - PDB DBRefEntry should also carry the chain and mapping information
-              DBRefEntry dbentry = new DBRefEntry(jalview.datamodel.DBRefSource.PDB,"0",pdbid);
-              al.getSequenceAt(i).getDatasetSequence().addDBRef(dbentry);
-            }
-            else
-            {
-              // don't add an entry for this chain, but this is probably a bug
-              // that the user should know about.
-              jalview.bin.Cache.log.warn(
-                  "No PDBEntry constructed for sequence " + i + " : " +
-                  al.getSequenceAt(i).getName());
-              errors = true;
-            }
-          }
-          if (errors)
-            jalview.bin.Cache.log.warn(
-                "Query string that resulted in PDBEntry construction failure was :\n" +
-                textfield.getText());
         }
-
       }
-      else
-        showErrorMessage("Error retrieving " + textfield.getText()
-                         + " from " + database.getSelectedItem());
-    }
-
     return al;
-
   }
 
   void showErrorMessage(final String error)