Skip to content

Commit 591ab82

Browse files
authoredMar 21, 2025··
Merge pull request #75 from gosling-lang/thomcsmits/genome-track-annotation
genome track annotation
2 parents a6f6891 + b8dc520 commit 591ab82

File tree

3 files changed

+59
-4
lines changed

3 files changed

+59
-4
lines changed
 

‎package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "altgosling",
33
"author": "Thomas C. Smits",
4-
"version": "0.2.2",
4+
"version": "0.2.3",
55
"license": "MIT",
66
"homepage": "https://gosling-lang.github.io/altgosling/",
77
"type": "module",

‎src/alt-gosling-model/alt-structure/alt-from-spec.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { IsOverlaidTracks, IsOverlaidTrack, IsChannelDeep, IsChannelValue } from
1010
import { SUPPORTED_CHANNELS } from '@altgosling/schema/supported_channels';
1111

1212
import { attributeExists, attributeExistsReturn } from '../util';
13-
import { determineSpecialCases, determineOverlaidByDataCases } from './chart-types';
13+
import { determineSpecialCases, determineOverlaidByMarkCases, determineOverlaidByDataCases } from './chart-types';
1414
// @ts-expect-error no type definition
1515
import { _convertToFlatTracks, _spreadTracksByData } from 'gosling.js/utils';
1616

@@ -531,7 +531,7 @@ function altOverlaidTrack(
531531
altTrack.data = data;
532532

533533
// determine type if possible
534-
altTrack.charttype = singleTracks.map(t => t.charttype);
534+
altTrack.charttype = determineOverlaidByMarkCases(singleTracks.map(t => t.charttype));
535535

536536
// empty description, to be filled in.
537537
altTrack.description = '';

‎src/alt-gosling-model/alt-structure/chart-types.ts

+56-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ export function determineSpecialCases(altTrack: AltTrackSingle | AltTrackOverlai
88
} else {
99
_mark = altTrack.appearance.details.mark;
1010
}
11+
let _dataType = altTrack.data.details.data.type;
1112
const _genomicEncodings = altTrack.appearance.details.encodings.encodingDeepGenomic.map(o => o.name);
1213
const _quantitativeEncodings = altTrack.appearance.details.encodings.encodingDeepQuantitative.map(o => o.name);
1314
const _nominalEncodings = altTrack.appearance.details.encodings.encodingDeepNominal.map(o => o.name);
@@ -44,9 +45,18 @@ export function determineSpecialCases(altTrack: AltTrackSingle | AltTrackOverlai
4445
if (_mark === 'rect' && _genomicEncodings.includes('x') && _genomicEncodings.includes('xe') && _quantitativeEncodings.includes('color')) {
4546
return `${layoutDesc}heat map`;
4647
}
47-
if (_mark === 'rect' && _genomicEncodings.includes('x') && _genomicEncodings.includes('xe') && _nominalEncodings.includes('color')) {
48+
if (_mark === 'rect' && ['csv', 'json'].includes(_dataType) && _genomicEncodings.includes('x') && _genomicEncodings.includes('xe') && _nominalEncodings.includes('color')) {
4849
return `${layoutDesc}ideogram`;
4950
}
51+
if (_mark === 'rect' && _genomicEncodings.includes('x') && _genomicEncodings.includes('xe') && _dataType === 'beddb') {
52+
return `${layoutDesc}genomic range annotation track`;
53+
}
54+
if (_mark === 'triangleRight' && _genomicEncodings.includes('x') && !_genomicEncodings.includes('y') && _dataType === 'beddb') {
55+
return `${layoutDesc}genomic position annotation track`;
56+
}
57+
if (_mark === 'triangleLeft' && _genomicEncodings.includes('x') && !_genomicEncodings.includes('y') && _dataType === 'beddb') {
58+
return `${layoutDesc}genomic position annotation track`;
59+
}
5060
if (_mark === 'rule' && _allEncodings.includes('x') && _allEncodings.includes('y')) {
5161
return `${layoutDesc}chart with horizontal and vertical lines`;
5262
}
@@ -63,6 +73,51 @@ export function determineSpecialCases(altTrack: AltTrackSingle | AltTrackOverlai
6373
return `unknown chart`;
6474
}
6575

76+
export function determineOverlaidByMarkCases(specialCases: string[]): string[] {
77+
specialCases = [...new Set(specialCases)];
78+
79+
// special case: genome annotation track with text
80+
if (specialCases.includes('genomic range annotation track') && specialCases.includes('genomic position annotation track')) {
81+
specialCases = specialCases.filter(caseType => caseType !== 'genomic position annotation track');
82+
}
83+
84+
if (specialCases.includes('genomic range annotation track') || specialCases.includes('genomic position annotation track')) {
85+
if (specialCases.includes('chart with text')) {
86+
specialCases = specialCases.filter(caseType => caseType !== 'chart with text'
87+
).map(caseType =>
88+
caseType === 'genomic range annotation track' ? 'genomic range annotation track with text' : caseType
89+
).map(caseType =>
90+
caseType === 'genomic position annotation track' ? 'genomic position annotation track with text' : caseType
91+
);
92+
}
93+
if (specialCases.includes('chart with vertical lines')) {
94+
specialCases = specialCases.filter(caseType => caseType !== 'chart with vertical lines');
95+
}
96+
}
97+
98+
// special case: both left and right triangles
99+
if (specialCases.includes('chart with left triangles') && specialCases.includes('chart with right triangles')) {
100+
specialCases = specialCases.filter(caseType => caseType !== 'chart with left triangles');
101+
specialCases = specialCases.filter(caseType => caseType !== 'chart with right triangles');
102+
specialCases.push('chart with left and right triangles');
103+
}
104+
105+
// concatenate all the 'chart with <mark>' cases
106+
const chartsWithMark = [] as string[];
107+
for (const chart of specialCases) {
108+
if (chart.includes('chart with')) {
109+
specialCases = specialCases.filter(caseType => caseType !== chart);
110+
const mark = chart.split('chart with ')[1];
111+
chartsWithMark.push(mark);
112+
}
113+
}
114+
if (chartsWithMark.length > 0) {
115+
specialCases.push(`chart with ${arrayToString(chartsWithMark)}`);
116+
}
117+
118+
return specialCases;
119+
}
120+
66121
export function determineOverlaidByDataCases(altTrack: AltTrackOverlaidByData): string {
67122
const charttypes = [] as string[];
68123
const charttypesWithAnnotations = [] as string[];

0 commit comments

Comments
 (0)
Please sign in to comment.