@@ -8,6 +8,7 @@ export function determineSpecialCases(altTrack: AltTrackSingle | AltTrackOverlai
8
8
} else {
9
9
_mark = altTrack . appearance . details . mark ;
10
10
}
11
+ let _dataType = altTrack . data . details . data . type ;
11
12
const _genomicEncodings = altTrack . appearance . details . encodings . encodingDeepGenomic . map ( o => o . name ) ;
12
13
const _quantitativeEncodings = altTrack . appearance . details . encodings . encodingDeepQuantitative . map ( o => o . name ) ;
13
14
const _nominalEncodings = altTrack . appearance . details . encodings . encodingDeepNominal . map ( o => o . name ) ;
@@ -44,9 +45,18 @@ export function determineSpecialCases(altTrack: AltTrackSingle | AltTrackOverlai
44
45
if ( _mark === 'rect' && _genomicEncodings . includes ( 'x' ) && _genomicEncodings . includes ( 'xe' ) && _quantitativeEncodings . includes ( 'color' ) ) {
45
46
return `${ layoutDesc } heat map` ;
46
47
}
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' ) ) {
48
49
return `${ layoutDesc } ideogram` ;
49
50
}
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
+ }
50
60
if ( _mark === 'rule' && _allEncodings . includes ( 'x' ) && _allEncodings . includes ( 'y' ) ) {
51
61
return `${ layoutDesc } chart with horizontal and vertical lines` ;
52
62
}
@@ -63,6 +73,51 @@ export function determineSpecialCases(altTrack: AltTrackSingle | AltTrackOverlai
63
73
return `unknown chart` ;
64
74
}
65
75
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
+
66
121
export function determineOverlaidByDataCases ( altTrack : AltTrackOverlaidByData ) : string {
67
122
const charttypes = [ ] as string [ ] ;
68
123
const charttypesWithAnnotations = [ ] as string [ ] ;
0 commit comments