JAL-2016 push getFeatureColourScheme(source) into SequenceFetcher
[jalview.git] / src / jalview / gui / AlignFrame.java
index 433afba..b48a750 100644 (file)
@@ -32,7 +32,7 @@ import jalview.api.AlignViewControllerI;
 import jalview.api.AlignViewportI;
 import jalview.api.AlignmentViewPanel;
 import jalview.api.FeatureSettingsControllerI;
-import jalview.api.FeatureSettingsI;
+import jalview.api.FeatureSettingsModelI;
 import jalview.api.SplitContainerI;
 import jalview.api.ViewStyleI;
 import jalview.api.analysis.ScoreModelI;
@@ -54,6 +54,7 @@ import jalview.datamodel.AlignmentI;
 import jalview.datamodel.AlignmentOrder;
 import jalview.datamodel.AlignmentView;
 import jalview.datamodel.ColumnSelection;
+import jalview.datamodel.DBRefSource;
 import jalview.datamodel.HiddenSequences;
 import jalview.datamodel.PDBEntry;
 import jalview.datamodel.SeqCigar;
@@ -99,7 +100,6 @@ import jalview.ws.SequenceFetcher;
 import jalview.ws.jws1.Discoverer;
 import jalview.ws.jws2.Jws2Discoverer;
 import jalview.ws.jws2.jabaws2.Jws2Instance;
-import jalview.ws.seqfetcher.ASequenceFetcher;
 import jalview.ws.seqfetcher.DbSourceProxy;
 
 import java.awt.BorderLayout;
@@ -4732,35 +4732,14 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
           if (xrefs != null)
           {
             /*
-             * figure out colour scheme if any to apply to features
+             * get display scheme (if any) to apply to features
              */
-            ASequenceFetcher sftch = new SequenceFetcher();
-            List<DbSourceProxy> proxies = sftch.getSourceProxy(source);
-            FeatureSettingsI featureColourScheme = null;
-            for (DbSourceProxy proxy : proxies)
-            {
-              FeatureSettingsI preferredColours = proxy
-                      .getFeatureColourScheme();
-              if (preferredColours != null)
-              {
-                featureColourScheme = preferredColours;
-                break;
-              }
-            }
-            Alignment al = makeCrossReferencesAlignment(
+            FeatureSettingsModelI featureColourScheme = new SequenceFetcher()
+                    .getFeatureColourScheme(source);
+
+            AlignmentI al = makeCrossReferencesAlignment(
                     alignment.getDataset(), xrefs);
 
-            /*
-             * Copy dna-to-protein mappings to new alignment
-             */
-            // TODO 1: no mappings are set up for EMBL product
-            // TODO 2: if they were, should add them to protein alignment, not
-            // dna
-            // List<AlignedCodonFrame> cf = xrefs.getCodonFrames();
-            // for (AlignedCodonFrame acf : cf)
-            // {
-            // al.addCodonFrame(acf);
-            // }
             AlignFrame newFrame = new AlignFrame(al, DEFAULT_WIDTH,
                     DEFAULT_HEIGHT);
             String newtitle = String.format("%s %s %s",
@@ -4785,6 +4764,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
               {
                 copyAlignment = AlignmentUtils.makeCdsAlignment(
                         sequenceSelection, cf, alignment);
+                if (copyAlignment.getHeight() == 0)
+                {
+                  System.err.println("Failed to make CDS alignment");
+                }
                 al.getCodonFrames().clear();
                 al.getCodonFrames().addAll(cf);
               }
@@ -4809,56 +4792,69 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
                 copyAlignment.addSequence(peer);
               }
 
-              /*
-               * align protein to dna
-               */
-              if (dna)
+              if (copyAlignment.getHeight() > 0)
               {
-                al.alignAs(copyAlignment);
-              }
-              else
-              {
-                copyAlignment.alignAs(al);
-              }
-
-              AlignFrame copyThis = new AlignFrame(copyAlignment,
-                      AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT);
-              copyThis.setTitle(AlignFrame.this.getTitle());
-
-              boolean showSequenceFeatures = viewport
-                      .isShowSequenceFeatures();
-              newFrame.setShowSeqFeatures(showSequenceFeatures);
-              copyThis.setShowSeqFeatures(showSequenceFeatures);
-              FeatureRenderer myFeatureStyling = alignPanel.getSeqPanel().seqCanvas
-                      .getFeatureRenderer();
-
-              /*
-               * copy feature rendering settings to split frame
-               */
-              newFrame.alignPanel.getSeqPanel().seqCanvas
-                      .getFeatureRenderer().transferSettings(
-                              myFeatureStyling);
-              copyThis.alignPanel.getSeqPanel().seqCanvas
-                      .getFeatureRenderer().transferSettings(
-                              myFeatureStyling);
+                /*
+                 * align protein to dna
+                 */
+                // FIXME what if the dna is not aligned :-O
+                if (dna)
+                {
+                  al.alignAs(copyAlignment);
+                }
+                else
+                {
+                  /*
+                   * align cdna to protein - currently only if 
+                   * fetching and aligning Ensembl transcripts!
+                   */
+                  if (DBRefSource.ENSEMBL.equalsIgnoreCase(source))
+                  {
+                    copyAlignment.alignAs(al);
+                  }
+                }
 
-              /*
-               * apply 'database source' feature configuration
-               * if any was found
-               */
-              newFrame.getViewport()
-                      .applyFeaturesStyle(featureColourScheme);
-              copyThis.getViewport()
-                      .applyFeaturesStyle(featureColourScheme);
-
-              SplitFrame sf = new SplitFrame(dna ? copyThis : newFrame,
-                      dna ? newFrame : copyThis);
-              newFrame.setVisible(true);
-              copyThis.setVisible(true);
-              String linkedTitle = MessageManager
-                      .getString("label.linked_view_title");
-              Desktop.addInternalFrame(sf, linkedTitle, -1, -1);
-              sf.adjustDivider();
+                AlignFrame copyThis = new AlignFrame(copyAlignment,
+                        AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT);
+                copyThis.setTitle(AlignFrame.this.getTitle());
+
+                boolean showSequenceFeatures = viewport
+                        .isShowSequenceFeatures();
+                newFrame.setShowSeqFeatures(showSequenceFeatures);
+                copyThis.setShowSeqFeatures(showSequenceFeatures);
+                FeatureRenderer myFeatureStyling = alignPanel.getSeqPanel().seqCanvas
+                        .getFeatureRenderer();
+
+                /*
+                 * copy feature rendering settings to split frame
+                 */
+                newFrame.alignPanel.getSeqPanel().seqCanvas
+                        .getFeatureRenderer().transferSettings(
+                                myFeatureStyling);
+                copyThis.alignPanel.getSeqPanel().seqCanvas
+                        .getFeatureRenderer().transferSettings(
+                                myFeatureStyling);
+
+                /*
+                 * apply 'database source' feature configuration
+                 * if any was found
+                 */
+                // TODO is this the feature colouring for the original
+                // alignment or the fetched xrefs? either could be Ensembl
+                newFrame.getViewport().applyFeaturesStyle(
+                        featureColourScheme);
+                copyThis.getViewport().applyFeaturesStyle(
+                        featureColourScheme);
+
+                SplitFrame sf = new SplitFrame(dna ? copyThis : newFrame,
+                        dna ? newFrame : copyThis);
+                newFrame.setVisible(true);
+                copyThis.setVisible(true);
+                String linkedTitle = MessageManager
+                        .getString("label.linked_view_title");
+                Desktop.addInternalFrame(sf, linkedTitle, -1, -1);
+                sf.adjustDivider();
+              }
             }
             else
             {
@@ -4889,31 +4885,45 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       }
 
       /**
-       * Makes an alignment containing the given sequences; the sequences are
-       * added to the given alignment dataset, and the dataset is set on (shared
-       * by) the new alignment
+       * Makes an alignment containing the given sequences. If this is of the
+       * same type as the given dataset (nucleotide/protein), then the new
+       * alignment shares the same dataset, and its dataset sequences are added
+       * to it. Otherwise a new dataset sequence is created for the
+       * cross-references.
        * 
        * @param dataset
        * @param seqs
        * @return
        */
-      protected Alignment makeCrossReferencesAlignment(Alignment dataset,
-              Alignment seqs)
+      protected AlignmentI makeCrossReferencesAlignment(AlignmentI dataset,
+              AlignmentI seqs)
       {
+        boolean sameType = dataset.isNucleotide() == seqs.isNucleotide();
+
         SequenceI[] sprods = new SequenceI[seqs.getHeight()];
         for (int s = 0; s < sprods.length; s++)
         {
           sprods[s] = (seqs.getSequenceAt(s)).deriveSequence();
-          if (dataset.getSequences() == null
-                  || !dataset.getSequences().contains(
-                          sprods[s].getDatasetSequence()))
+          if (sameType)
           {
-            dataset.addSequence(sprods[s].getDatasetSequence());
+            if (dataset.getSequences() == null
+                    || !dataset.getSequences().contains(
+                            sprods[s].getDatasetSequence()))
+            {
+              dataset.addSequence(sprods[s].getDatasetSequence());
+            }
           }
           sprods[s].updatePDBIds();
         }
         Alignment al = new Alignment(sprods);
-        al.setDataset(dataset);
+        if (sameType)
+        {
+          al.setDataset((Alignment) dataset);
+        }
+        else
+        {
+          al.createDatasetAlignment();
+        }
         return al;
       }