diff --git a/uk/ac/sanger/artemis/components/genebuilder/GeneBuilderFrame.java b/uk/ac/sanger/artemis/components/genebuilder/GeneBuilderFrame.java index 847710b3089b4a2b0448c890a9c43b5c2f3cd737..ad4232479dc75f508114194ea27e64a58290e9cd 100644 --- a/uk/ac/sanger/artemis/components/genebuilder/GeneBuilderFrame.java +++ b/uk/ac/sanger/artemis/components/genebuilder/GeneBuilderFrame.java @@ -343,13 +343,25 @@ public class GeneBuilderFrame extends JFrame geneBuilderHash.put(chado_gene.getGeneUniqueName(), gbFrame); } } - else if(!GeneUtils.isBoundaryOK(chado_gene)) + else { - int result = JOptionPane.showConfirmDialog(this, + if(!GeneUtils.isBoundaryOK(chado_gene)) + { + int result = JOptionPane.showConfirmDialog(this, "Gene model boundary needs fixing.\nFix this now?", "Gene Boundary", JOptionPane.YES_NO_OPTION); - if(result == JOptionPane.YES_OPTION) - GeneUtils.checkGeneBoundary(chado_gene); + if(result == JOptionPane.YES_OPTION) + GeneUtils.checkGeneBoundary(chado_gene); + } + + if(!GeneUtils.isStrandOK(chado_gene)) + { + JOptionPane.showMessageDialog(this, + "All gene features should be on the same strand.\n"+ + "Check the strand of each of the features (gene,\n"+ + "transcript, CDS, polypeptide).", + "Check Strand", JOptionPane.WARNING_MESSAGE); + } } super.dispose(); diff --git a/uk/ac/sanger/artemis/components/genebuilder/GeneUtils.java b/uk/ac/sanger/artemis/components/genebuilder/GeneUtils.java index c771f0b9cac0e79649392034441095d32a7d7e27..e14ddb2f15d82a17012396c3140caad11511083f 100644 --- a/uk/ac/sanger/artemis/components/genebuilder/GeneUtils.java +++ b/uk/ac/sanger/artemis/components/genebuilder/GeneUtils.java @@ -90,8 +90,7 @@ import uk.ac.sanger.artemis.Selection; public class GeneUtils { - private static final long serialVersionUID = 1L; - private static Vector hideFeatures = new Vector(); + private static Vector<String> hideFeatures = new Vector<String>(); private static JCheckBox showObsolete = new JCheckBox("Show Obsolete Features",false); private static String nonCodingTranscripts[] = { "tRNA", "rRNA", "snRNA", "snoRNA", "ncRNA", "scRNA" }; @@ -1003,6 +1002,40 @@ public class GeneUtils chado_gene.deleteFeature(embl_feature); } } + + /** + * Check gene model strands for any inconsistencies + * @param chado_gene + * @return true is gene model ranges are correct + */ + protected static boolean isStrandOK(final ChadoCanonicalGene chado_gene) + { + boolean isRev = chado_gene.getGene().getLocation().isComplement(); + final List<Feature> transcripts = chado_gene.getTranscripts(); + + for(int i=0; i<transcripts.size(); i++) + { + final Feature transcript = (Feature)transcripts.get(i); + + if(isRev ^ transcript.getLocation().isComplement()) + return false; + + final Feature protein = + chado_gene.getProteinOfTranscript(GeneUtils.getUniqueName(transcript)); + if(protein != null && (isRev ^ protein.getLocation().isComplement())) + return false; + + final Set<Feature> children = chado_gene.getChildren(transcript); + final Iterator<Feature> it = children.iterator(); + while(it.hasNext()) + { + final Feature feature = it.next(); + if(isRev ^ feature.getLocation().isComplement()) + return false; + } + } + return true; + } /** * Check gene model boundaries for any inconsistencies