Skip to content

Commit 6c33f8e

Browse files
committed
Rm encoding
1 parent 66a6e42 commit 6c33f8e

13 files changed

Lines changed: 109 additions & 187 deletions

File tree

src/BgzipTaffyAdapter/BgzipTaffyAdapter.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import {
2222
parseRowInstructions,
2323
} from './rowInstructions'
2424
import { parseAssemblyAndChrSimple } from '../util/parseAssemblyName'
25-
import { encodeSequence } from '../util/sequenceEncoding'
2625

2726
import type { RowInstruction } from './rowInstructions'
2827
import type { IndexData, OrganismRecord } from './types'
@@ -54,7 +53,7 @@ interface TafFeature {
5453
end: number
5554
strand: number
5655
alignments: Record<string, OrganismRecord>
57-
seq: ReturnType<typeof encodeSequence>
56+
seq: string
5857
}
5958

6059
// Binary search to find the index of the first element >= target
@@ -347,20 +346,19 @@ export default class BgzipTaffyAdapter extends BaseFeatureDataAdapter {
347346

348347
const row0 = block.rows[0]!
349348
const alignments: Record<string, OrganismRecord> = {}
350-
let row0Seq: ReturnType<typeof encodeSequence> | undefined
349+
let row0Seq: string | undefined
351350

352351
for (const row of block.rows) {
353352
const { assemblyName, chr } = parseAssemblyAndChrSimple(row.sequenceName)
354-
const seq = encodeSequence(row.bases)
355353
if (row === row0) {
356-
row0Seq = seq
354+
row0Seq = row.bases
357355
}
358356
alignments[assemblyName] = {
359357
chr,
360358
start: row.start,
361359
srcSize: row.sequenceLength,
362360
strand: row.strand,
363-
seq,
361+
seq: row.bases,
364362
}
365363
}
366364

src/BgzipTaffyAdapter/types.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
import VirtualOffset from './virtualOffset'
22

3-
import type { EncodedSequence } from '../util/sequenceEncoding'
4-
53
export interface OrganismRecord {
64
chr: string
75
start: number
86
srcSize: number
97
strand: number
10-
seq: EncodedSequence
8+
seq: string
119
}
1210

1311
export interface ByteRange {

src/BigMafAdapter/BigMafAdapter.ts

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@ import { getSnapshot } from '@jbrowse/mobx-state-tree'
77
import parseNewick from '../parseNewick'
88
import { normalize } from '../util'
99
import { parseAssemblyAndChrSimple } from '../util/parseAssemblyName'
10-
import { encodeSequence } from '../util/sequenceEncoding'
1110

12-
import type { EncodedSequence } from '../util/sequenceEncoding'
1311
import type { BaseOptions } from '@jbrowse/core/data_adapters/BaseAdapter'
1412
import type { Feature, Region } from '@jbrowse/core/util'
1513

@@ -19,7 +17,7 @@ interface OrganismRecord {
1917
srcSize: number
2018
strand: number
2119
unknown: number
22-
seq: EncodedSequence
20+
seq: string
2321
}
2422
export default class BigMafAdapter extends BaseFeatureDataAdapter {
2523
public setupP?: Promise<{ adapter: BaseFeatureDataAdapter }>
@@ -70,20 +68,17 @@ export default class BigMafAdapter extends BaseFeatureDataAdapter {
7068
const maf = feature.get('mafBlock') as string
7169
const blocks = maf.split(';')
7270
const alignments = {} as Record<string, OrganismRecord>
73-
let referenceSeq: EncodedSequence | undefined
71+
let referenceSeq: string | undefined
7472

7573
for (const block of blocks) {
7674
if (block.startsWith('s')) {
7775
const parts = block.split(WHITESPACE_REGEX)
7876
const sequence = parts[6]!
7977
const organismChr = parts[1]!
8078

81-
// Encode immediately - original string can be GC'd
82-
const encodedSeq = encodeSequence(sequence)
83-
8479
// Set reference sequence from first block
8580
if (referenceSeq === undefined) {
86-
referenceSeq = encodedSeq
81+
referenceSeq = sequence
8782
}
8883

8984
const { assemblyName: org, chr } =
@@ -95,7 +90,7 @@ export default class BigMafAdapter extends BaseFeatureDataAdapter {
9590
srcSize: +parts[3]!,
9691
strand: parts[4] === '+' ? 1 : -1,
9792
unknown: +parts[5]!,
98-
seq: encodedSeq,
93+
seq: sequence,
9994
}
10095
}
10196
}

src/LinearMafRenderer/rendering/features.ts

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,7 @@ import { renderMatches } from './matches'
66
import { renderMismatches } from './mismatches'
77
import { renderText } from './text'
88

9-
import type {
10-
AlignmentRecord,
11-
EncodedSequence,
12-
GenomicRegion,
13-
RenderingContext,
14-
} from './types'
9+
import type { AlignmentRecord, GenomicRegion, RenderingContext } from './types'
1510

1611
export function processFeatureAlignment(
1712
feature: Feature,
@@ -21,11 +16,8 @@ export function processFeatureAlignment(
2116
renderingContext: RenderingContext,
2217
) {
2318
const [leftPx] = featureSpanPx(feature, region, bpPerPx)
24-
const alignments = feature.get('alignments') as Record<
25-
string,
26-
AlignmentRecord
27-
>
28-
const referenceSeq = feature.get('seq') as EncodedSequence
19+
const alignments = feature.get('alignments') as Record<string, AlignmentRecord>
20+
const referenceSeq = feature.get('seq') as string
2921

3022
for (const [sampleId, alignmentData] of Object.entries(alignments)) {
3123
const row = sampleToRowMap.get(sampleId)

src/LinearMafRenderer/rendering/gaps.ts

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
import { GAP_STROKE_OFFSET } from './types'
2-
import { CODE_GAP, getBaseCode } from '../../util/sequenceEncoding'
32

43
import type { RenderingContext } from './types'
5-
import type { EncodedSequence } from '../../util/sequenceEncoding'
64

75
export function renderGaps(
86
context: RenderingContext,
9-
alignment: EncodedSequence,
10-
seq: EncodedSequence,
7+
alignment: string,
8+
seq: string,
119
leftPx: number,
1210
rowTop: number,
1311
) {
@@ -17,13 +15,9 @@ export function renderGaps(
1715
ctx.beginPath()
1816
ctx.fillStyle = 'black'
1917

20-
for (
21-
let i = 0, genomicOffset = 0, seqLength = alignment.length;
22-
i < seqLength;
23-
i++
24-
) {
25-
if (getBaseCode(seq, i) !== CODE_GAP) {
26-
if (getBaseCode(alignment, i) === CODE_GAP) {
18+
for (let i = 0, genomicOffset = 0, seqLength = alignment.length; i < seqLength; i++) {
19+
if (seq[i] !== '-') {
20+
if (alignment[i] === '-') {
2721
const xPos = leftPx + scale * genomicOffset
2822
ctx.moveTo(xPos, rowTop + h2)
2923
ctx.lineTo(xPos + scale + GAP_STROKE_OFFSET, rowTop + h2)

src/LinearMafRenderer/rendering/insertions.ts

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,5 @@
11
import { measureText } from '@jbrowse/core/util'
22

3-
import {
4-
CODE_GAP,
5-
CODE_SPACE,
6-
decodeBaseLower,
7-
getBaseCode,
8-
} from '../../util/sequenceEncoding'
93
import { fillRect } from '../util'
104
import { addToSpatialIndex, shouldAddToSpatialIndex } from './spatialIndex'
115
import {
@@ -21,12 +15,11 @@ import {
2115
} from './types'
2216

2317
import type { RenderingContext } from './types'
24-
import type { EncodedSequence } from '../../util/sequenceEncoding'
2518

2619
export function renderInsertions(
2720
context: RenderingContext,
28-
alignment: EncodedSequence,
29-
seq: EncodedSequence,
21+
alignment: string,
22+
seq: string,
3023
leftPx: number,
3124
rowTop: number,
3225
bpPerPx: number,
@@ -36,16 +29,12 @@ export function renderInsertions(
3629
) {
3730
const { ctx, scale, h, canvasWidth, rowHeight, charHeight } = context
3831

39-
for (
40-
let i = 0, genomicOffset = 0, seqLength = alignment.length;
41-
i < seqLength;
42-
i++
43-
) {
32+
for (let i = 0, genomicOffset = 0, seqLength = alignment.length; i < seqLength; i++) {
4433
let insertionSequence = ''
45-
while (getBaseCode(seq, i) === CODE_GAP) {
46-
const alignCode = getBaseCode(alignment, i)
47-
if (alignCode !== CODE_GAP && alignCode !== CODE_SPACE) {
48-
insertionSequence += decodeBaseLower(alignment, i)
34+
while (seq[i] === '-') {
35+
const alignChar = alignment[i]!
36+
if (alignChar !== '-' && alignChar !== ' ') {
37+
insertionSequence += alignChar.toLowerCase()
4938
}
5039
i++
5140
}

src/LinearMafRenderer/rendering/mismatches.ts

Lines changed: 9 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,16 @@
1-
import {
2-
CODE_GAP,
3-
CODE_SPACE,
4-
decodeBaseLower,
5-
getBaseCode,
6-
getLowerCode,
7-
} from '../../util/sequenceEncoding'
81
import { fillRect } from '../util'
92
import { addToSpatialIndex, shouldAddToSpatialIndex } from './spatialIndex'
103
import { GAP_STROKE_OFFSET } from './types'
114

125
import type { RenderingContext } from './types'
13-
import type { EncodedSequence } from '../../util/sequenceEncoding'
146

157
/**
168
* Renders colored rectangles for mismatches and matches (when showAllLetters is true)
179
*/
1810
export function renderMismatches(
1911
context: RenderingContext,
20-
alignment: EncodedSequence,
21-
seq: EncodedSequence,
12+
alignment: string,
13+
seq: string,
2214
leftPx: number,
2315
rowTop: number,
2416
rowIndex: number,
@@ -35,22 +27,15 @@ export function renderMismatches(
3527
colorForBase,
3628
} = context
3729

38-
for (
39-
let i = 0, genomicOffset = 0, seqLength = alignment.length;
40-
i < seqLength;
41-
i++
42-
) {
43-
const alignCode = getBaseCode(alignment, i)
44-
const refCode = getBaseCode(seq, i)
45-
if (refCode !== CODE_GAP) {
46-
if (alignCode !== CODE_GAP) {
30+
for (let i = 0, genomicOffset = 0, seqLength = alignment.length; i < seqLength; i++) {
31+
const alignChar = alignment[i]!
32+
const refChar = seq[i]!
33+
if (refChar !== '-') {
34+
if (alignChar !== '-') {
4735
const xPos = leftPx + scale * genomicOffset
48-
if (
49-
getLowerCode(refCode) !== getLowerCode(alignCode) &&
50-
alignCode !== CODE_SPACE
51-
) {
36+
const base = alignChar.toLowerCase()
37+
if (refChar.toLowerCase() !== base && alignChar !== ' ') {
5238
// Mismatch
53-
const base = decodeBaseLower(alignment, i)
5439
fillRect(
5540
ctx,
5641
xPos,
@@ -74,7 +59,6 @@ export function renderMismatches(
7459
}
7560
} else if (showAllLetters) {
7661
// Match (when showing all letters)
77-
const base = decodeBaseLower(alignment, i)
7862
fillRect(
7963
ctx,
8064
xPos,

src/LinearMafRenderer/rendering/text.ts

Lines changed: 11 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,14 @@
11
import { CHAR_SIZE_WIDTH, VERTICAL_TEXT_OFFSET } from './types'
2-
import {
3-
CODE_GAP,
4-
decodeBase,
5-
decodeBaseLower,
6-
getBaseCode,
7-
getLowerCode,
8-
} from '../../util/sequenceEncoding'
92

103
import type { RenderingContext } from './types'
11-
import type { EncodedSequence } from '../../util/sequenceEncoding'
124

135
/**
146
* Renders text labels for bases when zoom level is sufficient
157
*/
168
export function renderText(
179
context: RenderingContext,
18-
alignment: EncodedSequence,
19-
seq: EncodedSequence,
10+
alignment: string,
11+
seq: string,
2012
leftPx: number,
2113
rowTop: number,
2214
) {
@@ -33,29 +25,24 @@ export function renderText(
3325
} = context
3426

3527
if (scale >= CHAR_SIZE_WIDTH) {
36-
for (
37-
let i = 0, genomicOffset = 0, seqLength = alignment.length;
38-
i < seqLength;
39-
i++
40-
) {
41-
const refCode = getBaseCode(seq, i)
42-
if (refCode !== CODE_GAP) {
28+
for (let i = 0, genomicOffset = 0, seqLength = alignment.length; i < seqLength; i++) {
29+
const refChar = seq[i]!
30+
if (refChar !== '-') {
4331
const xPos = leftPx + scale * genomicOffset
4432
const textOffset = (scale - CHAR_SIZE_WIDTH) / 2 + 1
45-
const alignCode = getBaseCode(alignment, i)
33+
const alignChar = alignment[i]!
4634
if (
47-
(showAllLetters ||
48-
getLowerCode(refCode) !== getLowerCode(alignCode)) &&
49-
alignCode !== CODE_GAP
35+
(showAllLetters || refChar.toLowerCase() !== alignChar.toLowerCase()) &&
36+
alignChar !== '-'
5037
) {
51-
const baseLower = decodeBaseLower(alignment, i)
38+
const baseLower = alignChar.toLowerCase()
5239
ctx.fillStyle = mismatchRendering
5340
? (contrastForBase[baseLower] ?? 'white')
5441
: 'black'
5542
if (rowHeight > charHeight) {
5643
const displayChar = showAsUpperCase
57-
? decodeBase(alignment, i).toUpperCase()
58-
: decodeBase(alignment, i)
44+
? alignChar.toUpperCase()
45+
: alignChar
5946
ctx.fillText(
6047
displayChar,
6148
xPos + textOffset,

src/MafTabixAdapter/MafTabixAdapter.ts

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,16 @@ import parseNewick from '../parseNewick'
1111
import { normalize } from '../util'
1212
import {
1313
parseAssemblyAndChr,
14-
selectReferenceSequence,
14+
selectReferenceSequenceString,
1515
} from '../util/parseAssemblyName'
16-
import { encodeSequence } from '../util/sequenceEncoding'
17-
18-
import type { EncodedSequence } from '../util/sequenceEncoding'
1916

2017
interface OrganismRecord {
2118
chr: string
2219
start: number
2320
srcSize: number
2421
strand: number
2522
unknown: number
26-
seq: EncodedSequence
23+
seq: string
2724
}
2825

2926
export default class MafTabixAdapter extends BaseFeatureDataAdapter {
@@ -114,7 +111,7 @@ export default class MafTabixAdapter extends BaseFeatureDataAdapter {
114111
srcSize: +srcSizeStr!,
115112
strand: strandStr === '-' ? -1 : 1,
116113
unknown: +unknownStr!,
117-
seq: encodeSequence(seq),
114+
seq,
118115
}
119116
}
120117
}
@@ -129,7 +126,7 @@ export default class MafTabixAdapter extends BaseFeatureDataAdapter {
129126
name: feature.get('name'),
130127
score: feature.get('score'),
131128
alignments,
132-
seq: selectReferenceSequence(
129+
seq: selectReferenceSequenceString(
133130
alignments,
134131
refAssemblyName,
135132
query.assemblyName,

0 commit comments

Comments
 (0)