diff --git a/client/apollo/css/webapollo_track_styles.css b/client/apollo/css/webapollo_track_styles.css index ec02a71bc5..fa75b6a07a 100644 --- a/client/apollo/css/webapollo_track_styles.css +++ b/client/apollo/css/webapollo_track_styles.css @@ -321,6 +321,13 @@ div.annot-sequence { top: 10%; } +.black-80pct, +.plus-black-80pct, +.minus-black-80pct { + background-color: #222; + height: 80%; + top: 10%; +} .brightgreen-80pct, .plus-brightgreen-80pct, diff --git a/client/apollo/js/SequenceOntologyUtils.js b/client/apollo/js/SequenceOntologyUtils.js index 9bc1b1fc81..644a40bbac 100644 --- a/client/apollo/js/SequenceOntologyUtils.js +++ b/client/apollo/js/SequenceOntologyUtils.js @@ -22,6 +22,7 @@ SequenceOntologyUtils.neverHasCDS = { alignment: true, repeat: true, repeat_region: true, + terminator: true, transposable_element: true }; @@ -40,6 +41,7 @@ SequenceOntologyUtils.neverHasExons = { alignment: true, repeat: true, repeat_region: true, + terminator: true, transposable_element: true }; diff --git a/client/apollo/js/View/Track/DraggableHTMLFeatures.js b/client/apollo/js/View/Track/DraggableHTMLFeatures.js index d856a3368b..b5a79e402a 100644 --- a/client/apollo/js/View/Track/DraggableHTMLFeatures.js +++ b/client/apollo/js/View/Track/DraggableHTMLFeatures.js @@ -1276,6 +1276,15 @@ var draggableTrack = declare( HTMLFeatureTrack, atrack.createGenericOneLevelAnnotations(selFeats, "repeat_region", true); }) })); + createAnnotationMenu.addChild(new dijitMenuItem( { + label: "terminator", + onClick: dojo.hitch(this, function() { + var selection = this.selectionManager.getSelection(); + var selFeats = this.selectionManager.getSelectedFeatures(); + this.selectionManager.clearSelection(); + atrack.createGenericOneLevelAnnotations(selFeats, "terminator", true); + }) + })); createAnnotationMenu.addChild(new dijitMenuItem( { label: "transposable_element", onClick: dojo.hitch(this, function() { diff --git a/client/apollo/js/View/Track/WebApolloCanvasFeatures.js b/client/apollo/js/View/Track/WebApolloCanvasFeatures.js index 1b13c4e87d..b800846c2a 100644 --- a/client/apollo/js/View/Track/WebApolloCanvasFeatures.js +++ b/client/apollo/js/View/Track/WebApolloCanvasFeatures.js @@ -112,6 +112,13 @@ return declare( CanvasFeaturesTrack, atrack.createGenericOneLevelAnnotations([this.feature], "repeat_region", true); } }, + { + "label" : "terminator", + "action" : function() { + var atrack=thisB.webapollo.getAnnotTrack(); + atrack.createGenericOneLevelAnnotations([this.feature], "terminator", true); + } + }, { "label" : "transposable element", "action" : function() { diff --git a/client/apollo/json/annot.json b/client/apollo/json/annot.json index 624636d6f9..76b53903b9 100644 --- a/client/apollo/json/annot.json +++ b/client/apollo/json/annot.json @@ -22,6 +22,10 @@ }, "arrowheadClass" : "annot-arrowhead", "alternateClasses" : { + "terminator" : { + "renderClassName" : "black-80pct annot-apollo", + "className" : "black-80pct" + }, "transposable_element" : { "renderClassName" : "blue-ibeam-render annot-apollo", "className" : "blue-ibeam" diff --git a/grails-app/controllers/org/bbop/apollo/AnnotatorController.groovy b/grails-app/controllers/org/bbop/apollo/AnnotatorController.groovy index 503263dcfc..ea4e7f6bb9 100644 --- a/grails-app/controllers/org/bbop/apollo/AnnotatorController.groovy +++ b/grails-app/controllers/org/bbop/apollo/AnnotatorController.groovy @@ -314,6 +314,8 @@ class AnnotatorController { break case "repeat_region": viewableTypes.add(RepeatRegion.class.canonicalName) break + case "terminator": viewableTypes.add(Terminator.class.canonicalName) + break case "transposable_element": viewableTypes.add(TransposableElement.class.canonicalName) break case "sequence_alteration": viewableTypes.add(SequenceAlteration.class.canonicalName) diff --git a/grails-app/domain/org/bbop/apollo/Terminator.groovy b/grails-app/domain/org/bbop/apollo/Terminator.groovy new file mode 100644 index 0000000000..74f832bc62 --- /dev/null +++ b/grails-app/domain/org/bbop/apollo/Terminator.groovy @@ -0,0 +1,9 @@ +package org.bbop.apollo + +class Terminator extends BiologicalRegion{ + static constraints = { + } + static String cvTerm = "Terminator" + static String ontologyId = "SO:0000141" + static String alternateCvTerm = "terminator" +} diff --git a/grails-app/services/org/bbop/apollo/ChadoHandlerService.groovy b/grails-app/services/org/bbop/apollo/ChadoHandlerService.groovy index 0df28118bf..994757e5b2 100644 --- a/grails-app/services/org/bbop/apollo/ChadoHandlerService.groovy +++ b/grails-app/services/org/bbop/apollo/ChadoHandlerService.groovy @@ -36,7 +36,7 @@ class ChadoHandlerService { private static final String SEQUENCE_ONTOLOGY = "sequence" private static final String RELATIONSHIP_ONTOLOGY = "relationship" private static final String FEATURE_PROPERTY = "feature_property" - private static final def topLevelFeatureTypes = [Gene.cvTerm, Pseudogene.cvTerm, TransposableElement.cvTerm, RepeatRegion.cvTerm, + private static final def topLevelFeatureTypes = [Gene.cvTerm, Pseudogene.cvTerm, Terminator.cvTerm, TransposableElement.cvTerm, RepeatRegion.cvTerm, InsertionArtifact.cvTerm, DeletionArtifact.cvTerm, SubstitutionArtifact.cvTerm] private static final ontologyDb = ["SO", "GO", "RO"] Map chadoOrganismsMap = new HashMap() diff --git a/grails-app/services/org/bbop/apollo/FeatureService.groovy b/grails-app/services/org/bbop/apollo/FeatureService.groovy index 08ce5da929..57c21e6cd1 100644 --- a/grails-app/services/org/bbop/apollo/FeatureService.groovy +++ b/grails-app/services/org/bbop/apollo/FeatureService.groovy @@ -36,7 +36,7 @@ class FeatureService { public static final String MANUALLY_DISSOCIATE_TRANSCRIPT_FROM_GENE = "Manually dissociate transcript from gene" public static final def rnaFeatureTypes = [MRNA.cvTerm, MiRNA.cvTerm, NcRNA.cvTerm, RRNA.cvTerm, SnRNA.cvTerm, SnoRNA.cvTerm, TRNA.cvTerm, Transcript.cvTerm] - public static final def singletonFeatureTypes = [RepeatRegion.cvTerm, TransposableElement.cvTerm] + public static final def singletonFeatureTypes = [RepeatRegion.cvTerm, TransposableElement.cvTerm,Terminator.cvTerm] @Timed @Transactional @@ -1527,6 +1527,7 @@ public void setTranslationEnd(Transcript transcript, int translationEnd) { case Pseudogene.ontologyId: return new Pseudogene() case Transcript.ontologyId: return new Transcript() case TransposableElement.ontologyId: return new TransposableElement() + case Terminator.ontologyId: return new Terminator() case RepeatRegion.ontologyId: return new RepeatRegion() case InsertionArtifact.ontologyId: return new InsertionArtifact() case DeletionArtifact.ontologyId: return new DeletionArtifact() @@ -1570,6 +1571,8 @@ public void setTranslationEnd(Transcript transcript, int translationEnd) { case Pseudogene.cvTerm.toUpperCase(): return Pseudogene.ontologyId case TransposableElement.alternateCvTerm.toUpperCase(): case TransposableElement.cvTerm.toUpperCase(): return TransposableElement.ontologyId + case Terminator.alternateCvTerm.toUpperCase(): + case Terminator.cvTerm.toUpperCase(): return Terminator.ontologyId case RepeatRegion.alternateCvTerm.toUpperCase(): case RepeatRegion.cvTerm.toUpperCase(): return RepeatRegion.ontologyId case InsertionArtifact.cvTerm.toUpperCase(): return InsertionArtifact.ontologyId diff --git a/grails-app/services/org/bbop/apollo/FeatureTypeService.groovy b/grails-app/services/org/bbop/apollo/FeatureTypeService.groovy index c5d1fc004f..99d3dff010 100644 --- a/grails-app/services/org/bbop/apollo/FeatureTypeService.groovy +++ b/grails-app/services/org/bbop/apollo/FeatureTypeService.groovy @@ -1,7 +1,6 @@ package org.bbop.apollo import grails.transaction.Transactional -import org.bbop.apollo.gwt.shared.FeatureStringEnum @Transactional class FeatureTypeService { @@ -29,6 +28,8 @@ class FeatureTypeService { createFeatureTypeForFeature(NcRNA.class,NcRNA.cvTerm) createFeatureTypeForFeature(RRNA.class,RRNA.cvTerm) createFeatureTypeForFeature(RepeatRegion.class,RepeatRegion.cvTerm) + createFeatureTypeForFeature(Terminator.class,Terminator.alternateCvTerm) createFeatureTypeForFeature(TransposableElement.class,TransposableElement.cvTerm) + return true } } diff --git a/grails-app/services/org/bbop/apollo/RequestHandlingService.groovy b/grails-app/services/org/bbop/apollo/RequestHandlingService.groovy index cef08a86c7..27cb8552b2 100644 --- a/grails-app/services/org/bbop/apollo/RequestHandlingService.groovy +++ b/grails-app/services/org/bbop/apollo/RequestHandlingService.groovy @@ -46,6 +46,7 @@ class RequestHandlingService { public static final List viewableAnnotationFeatureList = [ RepeatRegion.class.name, + Terminator.class.name, TransposableElement.class.name ] public static final List viewableAnnotationTranscriptParentList = [ @@ -2339,7 +2340,7 @@ class RequestHandlingService { User user = permissionService.getCurrentUser(inputObject) JSONObject featureContainer = createJSONFeatureContainer() - def singletonFeatureTypes = [RepeatRegion.cvTerm, TransposableElement.cvTerm] + def singletonFeatureTypes = [RepeatRegion.cvTerm, TransposableElement.cvTerm, Terminator.cvTerm] def rnaFeatureTypes = [MRNA.cvTerm, MiRNA.cvTerm, NcRNA.cvTerm, RRNA.cvTerm, SnRNA.cvTerm, SnoRNA.cvTerm, TRNA.cvTerm, Transcript.cvTerm] for (int i = 0; i < features.length(); i++) { diff --git a/src/gwt/org/bbop/apollo/gwt/client/AnnotatorPanel.java b/src/gwt/org/bbop/apollo/gwt/client/AnnotatorPanel.java index 7837c05977..c5cee0aae3 100644 --- a/src/gwt/org/bbop/apollo/gwt/client/AnnotatorPanel.java +++ b/src/gwt/org/bbop/apollo/gwt/client/AnnotatorPanel.java @@ -428,6 +428,7 @@ private void initializeTypes() { typeList.addItem("Gene"); typeList.addItem("Pseudogene"); typeList.addItem("Transposable Element", "transposable_element"); + typeList.addItem("Terminator", "terminator"); typeList.addItem("Repeat Region", "repeat_region"); typeList.addItem("Variant", "sequence_alteration"); } @@ -481,6 +482,7 @@ private static void updateAnnotationInfo(AnnotationInfo annotationInfo) { tabPanel.getTabWidget(3).getParent().setVisible(false); tabPanel.getTabWidget(4).getParent().setVisible(false); break; + case "terminator": case "transposable_element": case "repeat_region": repeatRegionDetailPanel.updateData(annotationInfo); @@ -606,6 +608,8 @@ public String getValue(AnnotationInfo annotationInfo) { String type = annotationInfo.getType(); switch (type) { + case "terminator": + return "term elem"; case "repeat_region": return "repeat rgn"; case "transposable_element": @@ -764,7 +768,7 @@ public void displayTranscript(int geneIndex, String uniqueName) { public void displayFeature(int featureIndex) { AnnotationInfo annotationInfo = dataGrid.getVisibleItem(Math.abs(dataGrid.getVisibleRange().getStart() - featureIndex)); String type = annotationInfo.getType(); - if (type.equals("transposable_element") || type.equals("repeat_region")) { + if (type.equals("transposable_element") || type.equals("repeat_region") || type.equals("terminator")) { // do nothing } else { exonDetailPanel.updateData(annotationInfo);