Skip to content

Commit

Permalink
Use typescript version of @gmod/cram (#3285)
Browse files Browse the repository at this point in the history
  • Loading branch information
cmdcolin committed Oct 22, 2022
1 parent 87dc7ab commit fd08109
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 53 deletions.
2 changes: 1 addition & 1 deletion plugins/alignments/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
},
"dependencies": {
"@gmod/bam": "^1.1.15",
"@gmod/cram": "^1.6.4",
"@gmod/cram": "^1.7.1",
"@mui/icons-material": "^5.0.1",
"color": "^3.1.2",
"copy-to-clipboard": "^3.3.1",
Expand Down
53 changes: 24 additions & 29 deletions plugins/alignments/src/CramAdapter/CramAdapter.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { CraiIndex, IndexedCramFile } from '@gmod/cram'
import { CraiIndex, IndexedCramFile, CramRecord } from '@gmod/cram'
import {
BaseFeatureDataAdapter,
BaseOptions,
Expand All @@ -10,15 +10,10 @@ import { ObservableCreate } from '@jbrowse/core/util/rxjs'
import { toArray } from 'rxjs/operators'
import CramSlightlyLazyFeature from './CramSlightlyLazyFeature'

interface HeaderLine {
tag: string
value: any // eslint-disable-line @typescript-eslint/no-explicit-any
data: HeaderLine[]
}
interface Header {
idToName?: string[]
nameToId?: Record<string, number>
readGroups?: number[]
readGroups?: (string | undefined)[]
}

interface FilterBy {
Expand All @@ -33,12 +28,12 @@ export default class CramAdapter extends BaseFeatureDataAdapter {

private setupP?: Promise<{
samHeader: Header
cram: any // eslint-disable-line @typescript-eslint/no-explicit-any
cram: IndexedCramFile
sequenceAdapter: BaseSequenceAdapter
}>

private configureP?: Promise<{
cram: any // eslint-disable-line @typescript-eslint/no-explicit-any
cram: IndexedCramFile
sequenceAdapter: BaseSequenceAdapter
}>

Expand All @@ -59,11 +54,10 @@ export default class CramAdapter extends BaseFeatureDataAdapter {
}
const pm = this.pluginManager

// eslint-disable-next-line @typescript-eslint/no-explicit-any
const cram: any = new IndexedCramFile({
const cram = new IndexedCramFile({
cramFilehandle: openLocation(cramLocation, pm),
index: new CraiIndex({ filehandle: openLocation(craiLocation, pm) }),
seqFetch: this.seqFetch.bind(this),
seqFetch: (...args) => this.seqFetch(...args),
checkSequenceMD5: false,
fetchSizeLimit: 200_000_000, // just make this a large size to avoid hitting it
})
Expand Down Expand Up @@ -93,16 +87,20 @@ export default class CramAdapter extends BaseFeatureDataAdapter {

async getHeader(opts?: BaseOptions) {
const { cram } = await this.configure()
return cram.cram.getHeaderText(opts)
return cram.cram.getHeaderText()
}

private async seqFetch(seqId: number, start: number, end: number) {
private async seqFetch(
seqId: number,
start: number,
end: number,
): Promise<string> {
start -= 1 // convert from 1-based closed to interbase

const { sequenceAdapter } = await this.configure()
const refName = this.refIdToOriginalName(seqId) || this.refIdToName(seqId)
if (!refName) {
return undefined
throw new Error('unknown')
}

const seqChunks = await sequenceAdapter
Expand Down Expand Up @@ -145,7 +143,7 @@ export default class CramAdapter extends BaseFeatureDataAdapter {
const conf = await this.configure()
statusCallback('Downloading index')
const { cram } = conf
const samHeader: HeaderLine[] = await cram.cram.getSamHeader(opts?.signal)
const samHeader = await cram.cram.getSamHeader()

// use the @SQ lines in the header to figure out the
// mapping between ref ID numbers and names
Expand Down Expand Up @@ -237,7 +235,7 @@ export default class CramAdapter extends BaseFeatureDataAdapter {
this.seqIdToOriginalRefName[refId] = originalRefName
}
statusCallback('Downloading alignments')
const records = await cram.getRecordsForRange(refId, start, end, opts)
const records = await cram.getRecordsForRange(refId, start, end)
checkAbortSignal(signal)
const {
flagInclude = 0,
Expand All @@ -246,29 +244,24 @@ export default class CramAdapter extends BaseFeatureDataAdapter {
readName,
} = filterBy || {}

// eslint-disable-next-line @typescript-eslint/no-explicit-any
let filtered = records.filter((record: any) => {
let filtered = records.filter(record => {
const flags = record.flags
return (flags & flagInclude) === flagInclude && !(flags & flagExclude)
})

if (tagFilter) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
filtered = filtered.filter((record: any) => {
filtered = filtered.filter(record => {
// @ts-ignore
const val = record[tagFilter.tag]
return val === '*' ? val !== undefined : val === tagFilter.value
})
}

if (readName) {
filtered = filtered.filter(
// eslint-disable-next-line @typescript-eslint/no-explicit-any
(record: any) => record.readName === readName,
)
filtered = filtered.filter(record => record.readName === readName)
}

// eslint-disable-next-line @typescript-eslint/no-explicit-any
filtered.forEach((record: any) => {
filtered.forEach(record => {
observer.next(this.cramRecordToFeature(record))
})
statusCallback('')
Expand All @@ -278,7 +271,7 @@ export default class CramAdapter extends BaseFeatureDataAdapter {

freeResources(/* { region } */): void {}

cramRecordToFeature(record: unknown) {
cramRecordToFeature(record: CramRecord) {
return new CramSlightlyLazyFeature(record, this)
}

Expand All @@ -303,7 +296,9 @@ export default class CramAdapter extends BaseFeatureDataAdapter {
regions.map(region => {
const { refName, start, end } = region
const chrId = this.refNameToId(refName)
return cram.index.getEntriesForRange(chrId, start, end)
return chrId !== undefined
? cram.index.getEntriesForRange(chrId, start, end)
: [{ sliceBytes: 0 }]
}),
)

Expand Down
28 changes: 12 additions & 16 deletions plugins/alignments/src/CramAdapter/CramSlightlyLazyFeature.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import {
Feature,
SimpleFeatureSerialized,
} from '@jbrowse/core/util/simpleFeature'

import { CramRecord } from '@gmod/cram'
import CramAdapter from './CramAdapter'

export interface Mismatch {
Expand All @@ -20,8 +20,8 @@ export interface Mismatch {
export default class CramSlightlyLazyFeature implements Feature {
// uses parameter properties to automatically create fields on the class
// https://www.typescriptlang.org/docs/handbook/classes.html#parameter-properties
// eslint-disable-next-line @typescript-eslint/no-explicit-any
constructor(private record: any, private _store: CramAdapter) {}

constructor(private record: CramRecord, private _store: CramAdapter) {}

_get_name() {
return this.record.readName
Expand All @@ -32,7 +32,7 @@ export default class CramSlightlyLazyFeature implements Feature {
}

_get_end() {
return this.record.alignmentStart + this.record.lengthOnRef - 1
return this.record.alignmentStart + (this.record.lengthOnRef ?? 1) - 1
}

_get_cram_read_features() {
Expand Down Expand Up @@ -123,6 +123,9 @@ export default class CramSlightlyLazyFeature implements Feature {
let cigar = ''
let op = 'M'
let oplen = 0
if (!this.record._refRegion) {
return ''
}

// not sure I should access these, but...
const ref = this.record._refRegion.seq
Expand Down Expand Up @@ -280,19 +283,12 @@ export default class CramSlightlyLazyFeature implements Feature {
}

toJSON(): SimpleFeatureSerialized {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const tags: Record<string, any> = {}
this.tags().forEach((t: string) => {
const val = this.get(t)
if (val !== undefined) {
tags[t] = val
}
})

return {
...tags,
name: this.get('name'),
type: this.get('type'),
...Object.fromEntries(
this.tags()
.map(t => [t, this.get(t)])
.filter(elt => elt[1] !== undefined),
),
uniqueId: this.id(),
}
}
Expand Down
1 change: 0 additions & 1 deletion plugins/alignments/src/declare.d.ts

This file was deleted.

11 changes: 5 additions & 6 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -1571,22 +1571,21 @@
dependencies:
long "^4.0.0"

"@gmod/cram@^1.6.4":
version "1.6.4"
resolved "https://registry.yarnpkg.com/@gmod/cram/-/cram-1.6.4.tgz#4c585238ba201381f2e794785f6497b0b2c3bd1a"
integrity sha512-uj3BOukiQmL9JwJFMN7qqkvhfWMVVYhymrUA6+z6YMg3u107azw9Oxip6UEUHlVtrJhh2jyLDYgpewFLghJZew==
"@gmod/cram@^1.7.1":
version "1.7.1"
resolved "https://registry.yarnpkg.com/@gmod/cram/-/cram-1.7.1.tgz#878f31bc5c038ec789fc0513d769fad5b964a806"
integrity sha512-RylBdSTLsKrwp9S1ZDa8hrSRYFRfvDHxH12vM4KrxlIRrpvH5uajGENMigqcL+TQhN9etZeZ+pEBi+lbz8kiXQ==
dependencies:
"@gmod/binary-parser" "^1.3.5"
"@jkbonfield/htscodecs" "^0.5.1"
abortable-promise-cache "^1.2.0"
buffer-crc32 "^0.2.13"
bzip2 "^0.1.1"
cross-fetch "^3.0.0"
es6-promisify "^6.0.1"
long "^4.0.0"
md5 "^2.2.1"
pako "^1.0.4"
quick-lru "^2.0.0"
quick-lru "^4.0.1"

"@gmod/faidx@^1.0.1":
version "1.0.3"
Expand Down

0 comments on commit fd08109

Please sign in to comment.