Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
0e6c5f8
Allow adding genome align to non-primary genomes
xzhuo Feb 2, 2021
dc612f6
display sashimi plot for longrange tracks
xzhuo Feb 11, 2021
7807dd6
use SVG
xzhuo Feb 16, 2021
4020a9a
add hg38 to gorGor4 alignment annotation
xzhuo Feb 18, 2021
ef59ed6
add hg38 to rn6 alignment
xzhuo Feb 18, 2021
c3018b4
add rabbit genome
xzhuo Mar 1, 2021
00a2a77
Merge branch 'alignment_enhancement' of https://github.com/lidaof/eg-…
xzhuo Mar 1, 2021
2671850
update rabbit genome annotation
xzhuo Mar 1, 2021
d52024b
Merge branch 'alignment_enhancement' of https://github.com/lidaof/eg-…
xzhuo Mar 1, 2021
05eb0df
add dog and rheMac2 genome
xzhuo Mar 12, 2021
55e56a9
add dog canFam3 alignment to the mm10 genome
xzhuo Mar 22, 2021
e93af1b
add new genomes of the Schmidt 2012 CTCF paper
xzhuo Mar 29, 2021
5f222cc
adjusting sashimidisplay
xzhuo Apr 1, 2021
a39560c
packages
xzhuo Apr 13, 2021
82eb8a3
add secondary genome in progress
xzhuo Apr 19, 2021
c3a290a
genomealign only available to the primary track
xzhuo Apr 19, 2021
c67e566
finish add secondary genomes to custom tracks
xzhuo Apr 20, 2021
6a38c21
Merge branch 'alignment_enhancement' of https://github.com/lidaof/eg-…
xzhuo Apr 20, 2021
034ae73
remove console.log
xzhuo Apr 20, 2021
54cba42
multiple public hubs in progress
xzhuo Apr 23, 2021
b85dff9
remove in progress sashimi code
xzhuo Apr 23, 2021
d4dbe76
fix multiple genomealign tracks gap placement bug
xzhuo Apr 25, 2021
4a71a89
explain whey use allGaps alignfine
xzhuo Apr 25, 2021
c5f95a5
An align error caused by feature.start < end
xzhuo Apr 26, 2021
2b183f2
Merge branch 'master' of https://github.com/lidaof/eg-react into alig…
xzhuo Apr 30, 2021
6e92f8c
package
xzhuo Apr 30, 2021
cec503a
public hub in progress
xzhuo May 7, 2021
1b3211d
add secondary public hub in progress
xzhuo May 7, 2021
7a72d25
secondary public hub in progress
xzhuo May 7, 2021
a3306f2
done adding secondary public hub
xzhuo May 9, 2021
f17f328
remove sashimi test
xzhuo May 9, 2021
2181318
final touch up
xzhuo May 9, 2021
a092efb
remove console.log
xzhuo May 9, 2021
8bdb6da
move files to vizhub
xzhuo May 10, 2021
1138d50
remove monDom5 refgene from annotation.
xzhuo May 14, 2021
a42f51c
backend gene bed file
xzhuo May 14, 2021
281aa66
Keep existing metadata.genome in datahubs
xzhuo May 19, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2,325 changes: 2,325 additions & 0 deletions backend/genomeData/canFam2/canFam2.refgene.bed

Large diffs are not rendered by default.

2,325 changes: 2,325 additions & 0 deletions backend/genomeData/canFam3/canFam3.refgene.bed

Large diffs are not rendered by default.

1,239 changes: 1,239 additions & 0 deletions backend/genomeData/monDom5/monDom5.refgene.bed

Large diffs are not rendered by default.

1,750 changes: 1,750 additions & 0 deletions backend/genomeData/oryCun2/oryCun2.refgene.bed

Large diffs are not rendered by default.

6,342 changes: 6,342 additions & 0 deletions backend/genomeData/rheMac2/rheMac2.refgene.bed

Large diffs are not rendered by default.

18,448 changes: 18,448 additions & 0 deletions backend/genomeData/rn4/rn4.refgene.bed

Large diffs are not rendered by default.

21 changes: 0 additions & 21 deletions frontend/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion frontend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
"deploy": "aws s3 sync ~/eg-react/frontend/build/ s3://epigenomegateway.org/browser/ --delete",
"build-pkg": "rm -rf dist && cross-env NODE_ENV=production babel src/ --out-dir dist --extensions \".ts,.tsx,.js,.jsx\" --copy-files --ignore __tests__,spec.js,test.js,__snapshots__,umd,build,public,node_modules"
},
"dependencies": {},
"peerDependencies": {
"prop-types": "^15.6.0",
"react": "^16.3.0",
Expand Down
31 changes: 25 additions & 6 deletions frontend/src/App.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ import { RegionExpander } from "./model/RegionExpander";
import { Footer } from "./components/Footer";
import { SessionUI } from "./components/SessionUI";
import { Offline } from "react-detect-offline";
import { HELP_LINKS } from "./util";
import { HELP_LINKS, getSecondaryGenomes } from "./util";
import { getGenomeConfig } from './model/genomes/allGenomes';

import "./App.css";

Expand Down Expand Up @@ -80,19 +81,19 @@ class App extends React.PureComponent {
}

componentDidMount() {
if (this.props.genomeConfig && this.props.genomeConfig.publicHubList) {
this.setState({
publicHubs: this.props.genomeConfig.publicHubList.slice(),
});
if (this.props.genomeConfig) {
this.updateOtherPublicHubs(this.props.tracks);
}
this.initializeMetaSets(this.props.tracks);
}

UNSAFE_componentWillReceiveProps(nextProps) {
if (nextProps.genomeConfig && nextProps.genomeConfig !== this.props.genomeConfig) {
if (nextProps.genomeConfig.publicHubList) {
const publicHubs = nextProps.genomeConfig.publicHubList.slice();
publicHubs.map(x => x.genome = nextProps.genomeConfig.genome.getName());
this.setState({
publicHubs: nextProps.genomeConfig.publicHubList.slice(),
publicHubs: publicHubs,
});
} else {
// when switch genome, need reset hub as well
Expand Down Expand Up @@ -175,11 +176,13 @@ class App extends React.PureComponent {
addTracks(tracks) {
const newTracks = this.props.tracks.concat(tracks);
this.props.onTracksChanged(newTracks);
this.updateOtherPublicHubs(newTracks);
}

removeTrack(indexToRemove) {
let newTracks = this.props.tracks.filter((track, index) => index !== indexToRemove);
this.props.onTracksChanged(newTracks);
this.updateOtherPublicHubs(newTracks);
}

// toggleNavigator = () => {
Expand Down Expand Up @@ -224,6 +227,22 @@ class App extends React.PureComponent {
return grouped;
};

updateOtherPublicHubs = (tracks) => {
const { genomeConfig } = this.props;
const secondaryGenomes = getSecondaryGenomes(genomeConfig.genome.getName(), tracks);
const secondConfigs = secondaryGenomes.map(g => getGenomeConfig(g));
secondConfigs.filter(x => x.publicHubList).map(x => x.publicHubList.map(y => y.genome = x.genome.getName()));
let secondHubList = secondConfigs.filter(x => x.publicHubList).reduce((secondHubList, x) => secondHubList.concat(x.publicHubList),[]);
if (genomeConfig.publicHubList) {
const publicHubs = genomeConfig.publicHubList.slice();
publicHubs.map(x => x.genome = genomeConfig.genome.getName());
secondHubList = publicHubs.concat(secondHubList);
}
this.setState({
publicHubs: secondHubList,
});
}

render() {
const {
genomeConfig,
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/AppState.ts
Original file line number Diff line number Diff line change
Expand Up @@ -422,7 +422,7 @@ function getNextState(prevState: AppState, action: AppAction): AppState {
async function getTracksFromHubURL(url: string): Promise<any> {
const json = await new Json5Fetcher().get(url);
const hubParser = new DataHubParser();
return await hubParser.getTracksInHub(json, "URL hub", false, 0);
return await hubParser.getTracksInHub(json, "URL hub", "", false, 0);
}

/**
Expand Down
1 change: 1 addition & 0 deletions frontend/src/components/Nav.js
Original file line number Diff line number Diff line change
Expand Up @@ -310,6 +310,7 @@ class Nav extends React.Component {
customTrackSets={customTrackSets}
addedTrackSets={addedTrackSets}
addTermToMetaSets={addTermToMetaSets}
genomeConfig={genomeConfig}
/>
</ModalMenuItem>
<ModalMenuItem itemLabel="Local Tracks">
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/components/trackManagers/CustomHubAdder.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ class RemoteHubAdder extends React.Component {
const lastSlashIndex = this.state.inputUrl.lastIndexOf("/");
const hubBase = this.state.inputUrl.substring(0, lastSlashIndex).trimRight("/");
const parser = new DataHubParser(0);
const tracks = await parser.getTracksInHub(json, "Custom hub", false, 0, hubBase);
const tracks = await parser.getTracksInHub(json, "Custom hub", "", false, 0, hubBase);
if (tracks) {
this.props.onAddTracksToPool(tracks, false);
const tracksToShow = tracks.filter((track) => track.showOnHubLoad);
Expand Down
26 changes: 25 additions & 1 deletion frontend/src/components/trackManagers/CustomTrackAdder.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { Tabs, Tab } from "react-bootstrap-tabs";
import JSON5 from "json5";
// import { notify } from 'react-notify-toast';
import TrackModel from "../../model/TrackModel";
import { getSecondaryGenomes } from '../../util';
import CustomHubAdder from "./CustomHubAdder";
import FacetTable from "./FacetTable";
import { HELP_LINKS } from "../../util";
Expand Down Expand Up @@ -65,6 +66,7 @@ class CustomTrackAdder extends React.Component {
onTracksAdded: PropTypes.func,
onAddTracksToPool: PropTypes.func,
addTermToMetaSets: PropTypes.func,
genomeConfig: PropTypes.object.isRequired,
addedTrackSets: PropTypes.instanceOf(Set),
};

Expand All @@ -76,6 +78,7 @@ class CustomTrackAdder extends React.Component {
url: "",
name: "",
urlError: "",
metadata: {"genome":this.props.genomeConfig.genome.getName()},
trackAdded: false,
selectedTabIndex: 0,
options: null, // custom track options
Expand Down Expand Up @@ -112,6 +115,14 @@ class CustomTrackAdder extends React.Component {
));
}

renderGenomeOptions(allGenomes) {
return allGenomes.map(genome =>
<option key={genome} value={genome}>
{genome}
</option>
);
}

renderButtons() {
if (this.state.trackAdded) {
return (
Expand Down Expand Up @@ -144,7 +155,10 @@ class CustomTrackAdder extends React.Component {
};

renderCustomTrackAdder() {
const { type, url, name, urlError } = this.state;
const { type, url, name, metadata, urlError } = this.state;
const primaryGenome = this.props.genomeConfig.genome.getName();
var allGenomes = getSecondaryGenomes(primaryGenome, this.props.addedTracks);
allGenomes.unshift(primaryGenome);
return (
<form>
<h1>Add remote track</h1>
Expand Down Expand Up @@ -182,6 +196,16 @@ class CustomTrackAdder extends React.Component {
onChange={(event) => this.setState({ name: event.target.value })}
/>
</div>
<div className="form-group">
<label>genome</label>
<select
className="form-control"
value={metadata.genome}
onChange={(event) => this.setState({ metadata: {genome:event.target.value} })}
>
{this.renderGenomeOptions(allGenomes)}
</select>
</div>
<TrackOptionsUI onGetOptions={(value) => this.getOptions(value)} />
{this.renderButtons()}
</form>
Expand Down
4 changes: 2 additions & 2 deletions frontend/src/components/trackManagers/FacetTable.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ class FacetTable extends Component {
onTracksAdded: PropTypes.func,
addTermToMetaSets: PropTypes.func,
addedTrackSets: PropTypes.instanceOf(Set),
publicTrackSets: PropTypes.instanceOf(Set),
publicTrackSets: PropTypes.instanceOf(Set)
};

static defaultProps = {
Expand All @@ -43,7 +43,7 @@ class FacetTable extends Component {
rowHeader: "",
columnHeader: "",
showModalId: null,
metaKeys: [],
metaKeys: []
};

this.toggleHeader = this.toggleHeader.bind(this);
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/components/trackManagers/HubPane.js
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ class HubPane extends React.PureComponent {
<HubTable
onHubLoaded={this.props.onAddTracksToPool}
onTracksAdded={this.props.onTracksAdded}
publicHubs={this.props.publicHubs}
publicHubs={this.props.publicHubs}
onHubUpdated={this.props.onHubUpdated}
/>
{
Expand Down
9 changes: 9 additions & 0 deletions frontend/src/components/trackManagers/HubTable.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,11 @@ class HubTable extends React.PureComponent {
this.getAddHubCell = this.getAddHubCell.bind(this);

this.columns = [
{
Header: "Genome",
accessor: "genome",
width: 100,
},
{
Header: "Collection",
accessor: "collection",
Expand Down Expand Up @@ -84,6 +89,7 @@ class HubTable extends React.PureComponent {
const tracks = await this.hubParser.getTracksInHub(
json,
hub.name,
hub.genome,
hub.oldHubFormat,
tracksStartIndex,
hubBase
Expand Down Expand Up @@ -140,6 +146,7 @@ class HubTable extends React.PureComponent {
columns={this.columns}
minRows={Math.min(this.props.publicHubs.length, 10)}
SubComponent={(row) => {
let genome = row.original.genome;
let collectionDetails = publicHubData[row.original.collection] || <i>No details available.</i>;
let hubDetails = row.original.description ? (
<ObjectAsTable content={row.original.description} />
Expand All @@ -148,6 +155,8 @@ class HubTable extends React.PureComponent {
);
return (
<div style={{ padding: "20px" }}>
<h3>Genome</h3>
{genome}
<h3>Collection details</h3>
{collectionDetails}
<h3>Hub details</h3>
Expand Down
10 changes: 8 additions & 2 deletions frontend/src/components/trackManagers/HubTrackTable.js
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,12 @@ class HubTrackTable extends React.PureComponent {

const { rowHeader, columnHeader } = this.props;
let columns = [];
columns.push({
Header: "Genome",
id: "genome",
accessor: data => data.getMetadata("genome"),
width: 100
});
columns.push({
Header: "Name",
accessor: "name"
Expand All @@ -159,7 +165,7 @@ class HubTrackTable extends React.PureComponent {
Header: "Data hub",
accessor: "datahub"
});
if (rowHeader !== UNUSED_META_KEY) {
if (rowHeader !== UNUSED_META_KEY && rowHeader !== "genome") {
columns.push({
Header: rowHeader,
id: rowHeader.toLowerCase(),
Expand All @@ -174,7 +180,7 @@ class HubTrackTable extends React.PureComponent {
headerStyle: { flex: "100 0 auto", overflow: "visible" }
});
}
if (columnHeader !== UNUSED_META_KEY) {
if (columnHeader !== UNUSED_META_KEY && rowHeader !== "genome") {
columns.push({
Header: columnHeader,
id: columnHeader.toLowerCase(),
Expand Down
5 changes: 4 additions & 1 deletion frontend/src/model/DataHubParser.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import sampleDict from './genomes/hg19/samples.json';
import assayDict from './genomes/hg19/assays.json';

class HubParser {
getTracksInHub(parsedJson, hubName, oldHubFormat, tracksStartIndex=0, hubBase="") {
getTracksInHub(parsedJson, hubName, hubGenome, oldHubFormat, tracksStartIndex=0, hubBase="") {
let tracks = [], url, newTrack;
for (let plainObject of parsedJson.slice(tracksStartIndex)) {
if (plainObject.url) {
Expand All @@ -23,6 +23,9 @@ class HubParser {
newTrack = new TrackModel(plainObject);
}
newTrack.datahub = hubName;
if (!newTrack.metadata.genome && hubGenome !== "") { // Don't overwrite existing metadata.genome in hubs
newTrack.metadata.genome = hubGenome;
}
if (oldHubFormat) {
let assay = assayDict[newTrack.metadata.Assay] || ["unknown"];
let sample = sampleDict[newTrack.metadata.Sample] || ["unknown"];
Expand Down
8 changes: 4 additions & 4 deletions frontend/src/model/alignment/MultiAlignmentViewCalculator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ export class MultiAlignmentViewCalculator {
return recordsArray.reduce(
(multiAlign, records) => ({
...multiAlign,
[records.query]: this.alignFine(records.query, records.records, visData, primaryVisData),
[records.query]: this.alignFine(records.query, records.records, visData, primaryVisData, allGaps),
}),
{}
);
Expand Down Expand Up @@ -283,7 +283,7 @@ export class MultiAlignmentViewCalculator {
return index;
}
}
alignFine(query: string, records: AlignmentRecord[], oldVisData: ViewExpansion, visData: ViewExpansion): Alignment {
alignFine(query: string, records: AlignmentRecord[], oldVisData: ViewExpansion, visData: ViewExpansion, allGaps: Gap[]): Alignment {
// There's a lot of steps, so bear with me...
const { visRegion, visWidth } = visData;
// drawModel is derived from visData:
Expand All @@ -295,9 +295,9 @@ export class MultiAlignmentViewCalculator {
// calculate navContext and placements using oldVisData so small gaps won't seperate different features:
const navContext = oldVisData.visRegion.getNavigationContext();
const placements = this._computeContextLocations(records, oldVisData);
const primaryGaps = this._getPrimaryGenomeGaps(placements, minGapLength);
// const primaryGaps = this._getPrimaryGenomeGaps(placements, minGapLength);
const navContextBuilder = new NavContextBuilder(navContext);
navContextBuilder.setGaps(primaryGaps);
navContextBuilder.setGaps(allGaps); // Use allGaps instead of primaryGaps here so gaps between placements were also included here.
// With the draw model, we can set x spans for each placed alignment
// Adjust contextSpan and xSpan in placements using visData:
for (const placement of placements) {
Expand Down
1 change: 1 addition & 0 deletions frontend/src/model/alignment/NavContextBuilder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ export class NavContextBuilder {
resultFeatures.pop();
}

prevSplitBase = prevSplitBase > splitBase ? 0: prevSplitBase;
const leftLocus = new FeatureSegment(featureToSplit, prevSplitBase, splitBase).getLocus();
const rightLocus = new FeatureSegment(featureToSplit, splitBase).getLocus();
if (leftLocus.getLength() > 0) {
Expand Down
Loading