Skip to content

Commit 05372eb

Browse files
committed
Merge branch 'discvr-21.7' of https://github.com/BimberLab/DiscvrLabKeyModules into discvr-21.7
2 parents 6aa2678 + 0085897 commit 05372eb

File tree

15 files changed

+1013
-21
lines changed

15 files changed

+1013
-21
lines changed
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
{
2+
"configuration": {},
3+
"assembly": {
4+
"name": "hg38",
5+
"aliases": [
6+
"GRCh38"
7+
],
8+
"sequence": {
9+
"type": "ReferenceSequenceTrack",
10+
"trackId": "P6R5xbRqRr",
11+
"adapter": {
12+
"type": "BgzipFastaAdapter",
13+
"fastaLocation": {
14+
"uri": "https://jbrowse.org/genomes/GRCh38/fasta/hg38.prefix.fa.gz"
15+
},
16+
"faiLocation": {
17+
"uri": "https://jbrowse.org/genomes/GRCh38/fasta/hg38.prefix.fa.gz.fai"
18+
},
19+
"gziLocation": {
20+
"uri": "https://jbrowse.org/genomes/GRCh38/fasta/hg38.prefix.fa.gz.gzi"
21+
}
22+
}
23+
},
24+
"refNameAliases": {
25+
"adapter": {
26+
"type": "RefNameAliasAdapter",
27+
"location": {
28+
"uri": "https://s3.amazonaws.com/jbrowse.org/genomes/GRCh38/hg38_aliases.txt"
29+
}
30+
}
31+
}
32+
},
33+
"location": "1:1..248,956,422",
34+
"tracks": [
35+
{
36+
"type": "ExtendedVariantTrack",
37+
"trackId": "mgap_hg38",
38+
"name": "mgap",
39+
"assemblyNames": [
40+
"hg38"
41+
],
42+
"category": [
43+
"Annotation"
44+
],
45+
"adapter": {
46+
"type": "ExtendedVariantAdapter",
47+
"vcfGzLocation": {
48+
"uri": "<%=contextPath%>/jbrowse/mgap/mGap.v2.1.subset.vcf.gz"
49+
},
50+
"index": {
51+
"location": {
52+
"uri": "<%=contextPath%>/jbrowse/mgap/mGap.v2.1.subset.vcf.gz.tbi"
53+
}
54+
},
55+
"filters": [
56+
"AF:lt:0.001",
57+
"AC:lt:6",
58+
"IMPACT:eq:'MODERATE'"
59+
]
60+
},
61+
"displays": [
62+
{
63+
"type": "ExtendedVariantDisplay",
64+
"displayId": "mgap_hg38-ExtendedVariantDisplay",
65+
"renderer": {
66+
"type": "ExtendedVariantRenderer",
67+
}
68+
}
69+
],
70+
"metadata": {
71+
"extendedVariantDisplayConfig": [
72+
{
73+
"name": "AC, AF",
74+
"properties": [
75+
"AC",
76+
"AF",
77+
"IMPACT"
78+
]
79+
},
80+
{
81+
"name": "LF, MAF",
82+
"properties": [
83+
"LF",
84+
"MAF"
85+
]
86+
},
87+
{
88+
"name": "ERBSEG_NM, ERBSEG_CT, SX",
89+
"properties": [
90+
"ERBSEG_NM",
91+
"ERBSEG_CT",
92+
"SX"
93+
]
94+
}
95+
],
96+
"message": "\n\nAut molestiae temporibus nesciunt. Sed repellendus incidunt et. Inventore vitae tempora consequuntur maiores veritatis blanditiis voluptates explicabo.\n\nSimilique aliquid vel occaecati labore corporis adipisci provident voluptas."
97+
}
98+
}
99+
],
100+
"connections": [],
101+
"defaultSession": {
102+
"name": "Test Session",
103+
"view": {
104+
"id": "linearGenomeView",
105+
"type": "LinearGenomeView",
106+
"tracks": [
107+
{
108+
"type": "ExtendedVariantTrack",
109+
"configuration": "mgap_hg38",
110+
"displays": [
111+
{
112+
"type": "ExtendedVariantDisplay",
113+
"configuration": "mgap_hg38-ExtendedVariantDisplay"
114+
}
115+
]
116+
}
117+
]
118+
}
119+
}
120+
}
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
{
2+
"configuration": {},
3+
"assembly": {
4+
"name": "hg38",
5+
"aliases": [
6+
"GRCh38"
7+
],
8+
"sequence": {
9+
"type": "ReferenceSequenceTrack",
10+
"trackId": "P6R5xbRqRr",
11+
"adapter": {
12+
"type": "BgzipFastaAdapter",
13+
"fastaLocation": {
14+
"uri": "https://jbrowse.org/genomes/GRCh38/fasta/hg38.prefix.fa.gz"
15+
},
16+
"faiLocation": {
17+
"uri": "https://jbrowse.org/genomes/GRCh38/fasta/hg38.prefix.fa.gz.fai"
18+
},
19+
"gziLocation": {
20+
"uri": "https://jbrowse.org/genomes/GRCh38/fasta/hg38.prefix.fa.gz.gzi"
21+
}
22+
}
23+
},
24+
"refNameAliases": {
25+
"adapter": {
26+
"type": "RefNameAliasAdapter",
27+
"location": {
28+
"uri": "https://s3.amazonaws.com/jbrowse.org/genomes/GRCh38/hg38_aliases.txt"
29+
}
30+
}
31+
}
32+
},
33+
"location": "1:1..248,956,422",
34+
"tracks": [
35+
{
36+
"type": "ExtendedVariantTrack",
37+
"trackId": "mgap_hg38",
38+
"name": "mgap",
39+
"assemblyNames": [
40+
"hg38"
41+
],
42+
"category": [
43+
"Annotation"
44+
],
45+
"adapter": {
46+
"type": "ExtendedVariantAdapter",
47+
"vcfGzLocation": {
48+
"uri": "<%=contextPath%>/jbrowse/mgap/mGap.v2.1.subset.vcf.gz"
49+
},
50+
"index": {
51+
"location": {
52+
"uri": "<%=contextPath%>/jbrowse/mgap/mGap.v2.1.subset.vcf.gz.tbi"
53+
}
54+
},
55+
"filters": [
56+
"INVALID:lt:0.001",
57+
"AC:INVALID:6",
58+
"AC:lt:HIGH",
59+
"IMPACT:eq:INVALID",
60+
"IMPACT:gt:'LOW'",
61+
"IMPACT:eq:LOW",
62+
"IMPACT:eq:'HIGH'"
63+
]
64+
},
65+
"displays": [
66+
{
67+
"type": "ExtendedVariantDisplay",
68+
"displayId": "mgap_hg38-ExtendedVariantDisplay",
69+
"renderer": {
70+
"type": "ExtendedVariantRenderer",
71+
}
72+
}
73+
],
74+
"metadata": {
75+
"extendedVariantDisplayConfig": [
76+
{
77+
"name": "AC, AF",
78+
"properties": [
79+
"AC",
80+
"AF",
81+
"IMPACT"
82+
]
83+
},
84+
{
85+
"name": "LF, MAF",
86+
"properties": [
87+
"LF",
88+
"MAF"
89+
]
90+
},
91+
{
92+
"name": "ERBSEG_NM, ERBSEG_CT, SX",
93+
"properties": [
94+
"ERBSEG_NM",
95+
"ERBSEG_CT",
96+
"SX"
97+
]
98+
}
99+
],
100+
"message": "\n\nAut molestiae temporibus nesciunt. Sed repellendus incidunt et. Inventore vitae tempora consequuntur maiores veritatis blanditiis voluptates explicabo.\n\nSimilique aliquid vel occaecati labore corporis adipisci provident voluptas."
101+
}
102+
}
103+
],
104+
"connections": [],
105+
"defaultSession": {
106+
"name": "Test Session",
107+
"view": {
108+
"id": "linearGenomeView",
109+
"type": "LinearGenomeView",
110+
"tracks": [
111+
{
112+
"type": "ExtendedVariantTrack",
113+
"configuration": "mgap_hg38",
114+
"displays": [
115+
{
116+
"type": "ExtendedVariantDisplay",
117+
"configuration": "mgap_hg38-ExtendedVariantDisplay"
118+
}
119+
]
120+
}
121+
]
122+
}
123+
}
124+
}
Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,17 @@
11
import { ConfigurationSchema } from '@jbrowse/core/configuration'
22
import configSchema from '@jbrowse/plugin-variants/src/VcfTabixAdapter/configSchema'
33

4+
let EVConfigSchema = configSchema.jbrowseSchemaDefinition
5+
EVConfigSchema["filters"] =
6+
{
7+
type: 'stringArray',
8+
defaultValue: [],
9+
description:
10+
'Track filters',
11+
}
12+
413
export default ConfigurationSchema(
514
'ExtendedVariantAdapter',
6-
configSchema.jbrowseSchemaDefinition,
15+
EVConfigSchema,
716
{ explicitlyTyped: true },
817
)

jbrowse/src/client/JBrowse/Browser/plugins/ExtendedVariantPlugin/ExtendedVariantDisplay/model.js

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {getSnapshot} from 'mobx-state-tree'
1111

1212
const attributes = ['SNV', 'Insertion', 'Deletion', 'High', 'Moderate', 'Low', 'Other']
1313
const colors = ['green', 'red', 'blue', 'gray', 'goldenrod']
14+
const filterOptions = ['Impact = HIGH', 'AF > 0.2', 'None']
1415

1516
export default jbrowse => {
1617
const configSchema = jbrowse.jbrequire(configSchemaF)
@@ -38,6 +39,13 @@ export default jbrowse => {
3839
setReady(flag){
3940
self.ready = flag
4041
},
42+
setFilter(filter){
43+
try{
44+
self.renderProps().config.filters.set(filter)
45+
} catch (e){
46+
console.error(e)
47+
}
48+
},
4149
setColor(attr, color) {
4250
if (attr == "SNV"){
4351
self.colorSNV = color
@@ -79,8 +87,9 @@ export default jbrowse => {
7987
const colorLow = self.colorLow ?? 'black'
8088
const color = "jexl:get(feature,'INFO').IMPACT=='MODERATE'?'"+colorModerate+"':get(feature,'INFO').IMPACT=='HIGH'?'"+colorHigh+"':get(feature,'INFO').IMPACT=='LOW'?'"+colorLow+"':get(feature,'type')=='SNV'?'"+colorSNV+"':get(feature,'type')=='deletion'?'"+colorDeletion+"':get(feature,'type')=='insertion'?'"+colorInsertion+"':'"+colorOther+"'"
8189

82-
if (self.renderProps().config.color1.value !== color){
90+
if (self.renderProps().config.color1.value != color || self.ready == false || self.adapterConfig.filters != self.renderProps().config.filters.value){
8391
self.renderProps().config.color1.set(color)
92+
self.setFilter(self.adapterConfig.filters)
8493

8594
const { centerLineInfo } = getContainingView(self)
8695
if (!centerLineInfo) {
@@ -157,6 +166,21 @@ export default jbrowse => {
157166
.views(self => {
158167
const { renderProps: superRenderProps } = self
159168
const { trackMenuItems: superTrackMenuItems } = self
169+
const filterMenu = {
170+
label: 'Filter',
171+
icon: FilterListIcon,
172+
onClick: () => {
173+
const session = getSession(self)
174+
const track = getContainingTrack(self)
175+
const widgetId = 'Variant-' + getConf(track, 'trackId');
176+
const filterWidget = session.addWidget(
177+
'FilterWidget',
178+
widgetId,
179+
{ track: track.configuration }
180+
)
181+
session.showWidget(filterWidget)
182+
}
183+
}
160184
return {
161185
renderProps() {
162186
return {
@@ -170,7 +194,7 @@ export default jbrowse => {
170194
},
171195

172196
get composedTrackMenuItems() {
173-
return [{
197+
return [filterMenu, {
174198
label: 'Color',
175199
icon: PaletteIcon,
176200
subMenu: [...attributes.map(option => {

jbrowse/src/client/JBrowse/Browser/plugins/ExtendedVariantPlugin/ExtendedVariantRenderer/components/SvgFeatureRendering.js

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import React, { useEffect, useRef, useState, useCallback } from 'react'
1010
import FeatureGlyph from './FeatureGlyph' // FeatureGlyph copied over. Referencing original produces errors. Compare to line 11
1111
import SvgOverlay from '@jbrowse/plugin-svg/src/SvgFeatureRenderer/components/SvgOverlay' // NEW: Updated SvgOverlay to reference original file in @jbrowse. No errors produced.
1212
import { chooseGlyphComponent, layOut } from './util' // NEW: chooseGlyphComponent() in util updated to render SNVs as a diamond
13+
import { expandFilters, expandedFilterStringToObj } from '../../FilterWidget/filterUtil' // NOTE: Now dependent on FilterWidget plugin
14+
import jexl from 'jexl'
1315

1416
const renderingStyle = {
1517
position: 'relative',
@@ -124,6 +126,24 @@ function RenderedFeatureGlyph(props) {
124126
)
125127
}
126128

129+
function isDisplayed(feature, filters){
130+
if(!filters){
131+
return true
132+
}
133+
for(const filter in filters){
134+
try {
135+
const filterObj = expandedFilterStringToObj(filters[filter])
136+
if(!jexl.evalSync(filterObj["expression"], feature)){
137+
return false
138+
}
139+
} catch (e){
140+
console.error("Error in filter execution: "+e)
141+
return true
142+
}
143+
}
144+
return true
145+
}
146+
127147
RenderedFeatureGlyph.propTypes = {
128148
layout: ReactPropTypes.shape({
129149
addRect: ReactPropTypes.func.isRequired,
@@ -143,10 +163,13 @@ RenderedFeatureGlyph.propTypes = {
143163
const RenderedFeatures = observer(props => {
144164
const { features } = props
145165
const featuresRendered = []
166+
const filters = expandFilters(props.adapterConfig.filters)
146167
for (const feature of features.values()) {
147-
featuresRendered.push(
148-
<RenderedFeatureGlyph key={feature.id()} feature={feature} {...props} />,
149-
)
168+
if(isDisplayed(feature, filters)){
169+
featuresRendered.push(
170+
<RenderedFeatureGlyph key={feature.id()} feature={feature} {...props} />,
171+
)
172+
}
150173
}
151174
return <>{featuresRendered}</>
152175
})
@@ -320,7 +343,6 @@ function SvgFeatureRendering(props) {
320343
useEffect(() => {
321344
setHeight(layout.getTotalHeight())
322345
}, [layout])
323-
324346
if (exportSVG) {
325347
return (
326348
<RenderedFeatures

0 commit comments

Comments
 (0)