view x/static/js/6391.aabba4a1.chunk.js.map @ 125:49f3d3878413 draft

planemo upload for repository https://github.com/galaxyproject/tools-iuc/tree/master/tools/jbrowse2 commit 5ea1f9c1eef1de76232e69aa6d34cda77d90d566
author fubar
date Sat, 05 Oct 2024 23:58:05 +0000
parents
children
line wrap: on
line source

{"version":3,"file":"static/js/6391.aabba4a1.chunk.js","mappings":"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","sources":["../../../plugins/alignments/src/CramAdapter/CramSlightlyLazyFeature.ts","../../../plugins/alignments/src/CramAdapter/util.ts","../../../plugins/alignments/src/CramAdapter/CramAdapter.ts"],"sourcesContent":["import {\n  Feature,\n  SimpleFeatureSerialized,\n} from '@jbrowse/core/util/simpleFeature'\nimport { CramRecord } from '@gmod/cram'\n\n// locals\nimport CramAdapter from './CramAdapter'\nimport { readFeaturesToCIGAR, readFeaturesToMismatches } from './util'\n\nexport default class CramSlightlyLazyFeature implements Feature {\n  // uses parameter properties to automatically create fields on the class\n  // https://www.typescriptlang.org/docs/handbook/classes.html#parameter-properties\n  constructor(\n    private record: CramRecord,\n    private _store: CramAdapter,\n  ) {}\n\n  _get_name() {\n    return this.record.readName\n  }\n\n  _get_start() {\n    return this.record.alignmentStart - 1\n  }\n\n  _get_end() {\n    return this.record.alignmentStart + (this.record.lengthOnRef ?? 1) - 1\n  }\n\n  _get_cram_read_features() {\n    return this.record.readFeatures\n  }\n\n  _get_type() {\n    return 'match'\n  }\n\n  _get_score() {\n    return this.record.mappingQuality\n  }\n\n  _get_flags() {\n    return this.record.flags\n  }\n\n  _get_strand() {\n    return this.record.isReverseComplemented() ? -1 : 1\n  }\n\n  _read_group_id() {\n    return this._store.samHeader.readGroups?.[this.record.readGroupId]\n  }\n\n  _get_qual() {\n    return (this.record.qualityScores || []).join(' ')\n  }\n\n  qualRaw() {\n    return this.record.qualityScores\n  }\n\n  _get_refName() {\n    return this._store.refIdToName(this.record.sequenceId)\n  }\n\n  _get_is_paired() {\n    return !!this.record.mate\n  }\n\n  _get_pair_orientation() {\n    return this.record.isPaired() ? this.record.getPairOrientation() : undefined\n  }\n\n  _get_template_length() {\n    return this.record.templateLength || this.record.templateSize\n  }\n\n  _get_next_ref() {\n    return this.record.mate\n      ? this._store.refIdToName(this.record.mate.sequenceId)\n      : undefined\n  }\n\n  _get_next_segment_position() {\n    return this.record.mate\n      ? `${this._store.refIdToName(this.record.mate.sequenceId)}:${\n          this.record.mate.alignmentStart\n        }`\n      : undefined\n  }\n\n  _get_next_pos() {\n    return this.record.mate?.alignmentStart\n  }\n\n  _get_tags() {\n    const RG = this._read_group_id()\n    const { tags } = this.record\n    // avoids a tag copy if no RG, but just copy if there is one\n    return RG !== undefined ? { ...tags, RG } : tags\n  }\n\n  _get_seq() {\n    return this.record.getReadBases()\n  }\n\n  // generate a CIGAR, based on code from jkbonfield\n  _get_CIGAR() {\n    return readFeaturesToCIGAR(\n      this.record.readFeatures,\n      this.record.alignmentStart,\n      this.record.readLength,\n      this.record._refRegion,\n    )\n  }\n\n  tags() {\n    return Object.getOwnPropertyNames(CramSlightlyLazyFeature.prototype)\n      .filter(\n        prop =>\n          prop.startsWith('_get_') &&\n          prop !== '_get_mismatches' &&\n          prop !== '_get_cram_read_features',\n      )\n      .map(methodName => methodName.replace('_get_', ''))\n  }\n\n  id() {\n    return `${this._store.id}-${this.record.uniqueId}`\n  }\n\n  get(field: string) {\n    const methodName = `_get_${field}`\n    // @ts-expect-error\n    if (this[methodName]) {\n      // @ts-expect-error\n      return this[methodName]()\n    }\n    return undefined\n  }\n\n  parent() {\n    return undefined\n  }\n\n  children() {\n    return undefined\n  }\n\n  set() {}\n\n  pairedFeature() {\n    return false\n  }\n\n  _get_clipPos() {\n    const mismatches = this.get('mismatches')\n    if (mismatches.length) {\n      const record =\n        this.get('strand') === -1 ? mismatches.at(-1) : mismatches[0]\n      const { type, cliplen } = record\n      if (type === 'softclip' || type === 'hardclip') {\n        return cliplen\n      }\n    }\n    return 0\n  }\n\n  toJSON(): SimpleFeatureSerialized {\n    return {\n      ...Object.fromEntries(\n        this.tags()\n          .map(t => [t, this.get(t)])\n          .filter(elt => elt[1] !== undefined),\n      ),\n      uniqueId: this.id(),\n    }\n  }\n\n  _get_mismatches() {\n    const readFeatures = this.record.readFeatures\n    const qual = this.qualRaw()\n    const start = this.get('start')\n    return readFeaturesToMismatches(readFeatures, start, qual)\n  }\n}\n","import { CramRecord } from '@gmod/cram'\n\ntype ReadFeatures = CramRecord['readFeatures']\n\nexport interface Mismatch {\n  qual?: number\n  start: number\n  length: number\n  type: string\n  base: string | undefined\n  altbase?: string\n  seq?: string\n  cliplen?: number\n}\n\nexport function readFeaturesToMismatches(\n  readFeatures: ReadFeatures,\n  start: number,\n  qual?: number[] | null,\n) {\n  if (!readFeatures) {\n    return []\n  }\n  const mismatches: Mismatch[] = new Array(readFeatures.length)\n  let j = 0\n  let insLen = 0\n  let refPos = 0\n  let sublen = 0\n  let lastPos = start\n\n  for (const { refPos: p, code, pos, data, sub, ref } of readFeatures) {\n    sublen = refPos - lastPos\n    lastPos = refPos\n\n    if (sublen && insLen > 0) {\n      mismatches[j++] = {\n        start: refPos,\n        type: 'insertion',\n        base: `${insLen}`,\n        length: 0,\n      }\n      insLen = 0\n    }\n    refPos = p - 1 - start\n\n    if (code === 'X') {\n      // substitution\n      mismatches[j++] = {\n        start: refPos,\n        length: 1,\n        base: sub,\n        qual: qual?.[pos - 1],\n        altbase: ref?.toUpperCase(),\n        type: 'mismatch',\n      }\n    } else if (code === 'I') {\n      // insertion\n      mismatches[j++] = {\n        start: refPos,\n        type: 'insertion',\n        base: `${data.length}`,\n        length: 0,\n      }\n    } else if (code === 'N') {\n      // reference skip\n      mismatches[j++] = {\n        type: 'skip',\n        length: data,\n        start: refPos,\n        base: 'N',\n      }\n    } else if (code === 'S') {\n      // soft clip\n      const len = data.length\n      mismatches[j++] = {\n        start: refPos,\n        type: 'softclip',\n        base: `S${len}`,\n        cliplen: len,\n        length: 1,\n      }\n    } else if (code === 'P') {\n      // padding\n    } else if (code === 'H') {\n      // hard clip\n      const len = data\n      mismatches[j++] = {\n        start: refPos,\n        type: 'hardclip',\n        base: `H${len}`,\n        cliplen: len,\n        length: 1,\n      }\n    } else if (code === 'D') {\n      // deletion\n      mismatches[j++] = {\n        type: 'deletion',\n        length: data,\n        start: refPos,\n        base: '*',\n      }\n    } else if (code === 'b') {\n      // stretch of bases\n    } else if (code === 'q') {\n      // stretch of qual scores\n    } else if (code === 'B') {\n      // a pair of [base, qual]\n    } else if (code === 'i') {\n      // single-base insertion, we collect these if there are multiple in a row\n      // into a single insertion entry\n      insLen++\n    } else if (code === 'Q') {\n      // single quality value\n    }\n  }\n\n  if (sublen && insLen > 0) {\n    mismatches[j++] = {\n      start: refPos,\n      type: 'insertion',\n      base: `${insLen}`,\n      length: 0,\n    }\n    insLen = 0\n  }\n\n  return mismatches.slice(0, j)\n}\n\nexport function readFeaturesToCIGAR(\n  readFeatures: ReadFeatures,\n  alignmentStart: number,\n  readLen: number,\n  refRegion?: { seq: string; start: number },\n) {\n  let seq = ''\n  let cigar = ''\n  let op = 'M'\n  let oplen = 0\n  if (!refRegion) {\n    return ''\n  }\n\n  // not sure I should access these, but...\n  const ref = refRegion.seq\n  const refStart = refRegion.start\n  let lastPos = alignmentStart\n  let sublen = 0\n  let insLen = 0\n  if (readFeatures !== undefined) {\n    for (const { code, refPos, sub, data } of readFeatures) {\n      sublen = refPos - lastPos\n      seq += ref.slice(lastPos - refStart, refPos - refStart)\n      lastPos = refPos\n\n      if (insLen > 0 && sublen) {\n        cigar += `${insLen}I`\n        insLen = 0\n      }\n      if (oplen && op !== 'M') {\n        cigar += `${oplen}${op}`\n        oplen = 0\n      }\n      if (sublen) {\n        op = 'M'\n        oplen += sublen\n      }\n\n      if (code === 'b') {\n        // An array of bases stored verbatim\n        const ret = data.split(',')\n        const added = String.fromCharCode(...ret)\n        seq += added\n        lastPos += added.length\n        oplen += added.length\n      } else if (code === 'B') {\n        // Single base (+ qual score)\n        seq += sub\n        lastPos++\n        oplen++\n      } else if (code === 'X') {\n        // Substitution\n        seq += sub\n        lastPos++\n        oplen++\n      } else if (code === 'D' || code === 'N') {\n        // Deletion or Ref Skip\n        lastPos += data\n        if (oplen) {\n          cigar += `${oplen}${op}`\n        }\n        cigar += data + code\n        oplen = 0\n      } else if (code === 'I' || code === 'S') {\n        // Insertion or soft-clip\n        seq += data\n        if (oplen) {\n          cigar += `${oplen}${op}`\n        }\n        cigar += data.length + code\n        oplen = 0\n      } else if (code === 'i') {\n        // Single base insertion\n        // seq += data\n        if (oplen) {\n          cigar += `${oplen}${op}`\n        }\n        insLen++\n        seq += data\n        oplen = 0\n      } else if (code === 'P') {\n        // Padding\n        if (oplen) {\n          cigar += `${oplen}${op}`\n        }\n        cigar += `${data}P`\n      } else if (code === 'H') {\n        // Hard clip\n        if (oplen) {\n          cigar += `${oplen}${op}`\n        }\n        cigar += `${data}H`\n        oplen = 0\n      } // else q or Q\n    }\n  } else {\n    sublen = readLen - seq.length\n  }\n  if (seq.length !== readLen) {\n    sublen = readLen - seq.length\n    seq += ref.slice(lastPos - refStart, lastPos - refStart + sublen)\n\n    if (oplen && op !== 'M') {\n      cigar += `${oplen}${op}`\n      oplen = 0\n    }\n    op = 'M'\n    oplen += sublen\n  }\n  if (sublen && insLen > 0) {\n    cigar += `${insLen}I`\n  }\n  if (oplen) {\n    cigar += `${oplen}${op}`\n  }\n\n  return cigar\n}\n","import { CraiIndex, IndexedCramFile, CramRecord } from '@gmod/cram'\nimport {\n  BaseFeatureDataAdapter,\n  BaseOptions,\n  BaseSequenceAdapter,\n} from '@jbrowse/core/data_adapters/BaseAdapter'\nimport {\n  checkAbortSignal,\n  Region,\n  Feature,\n  updateStatus,\n  toLocale,\n} from '@jbrowse/core/util'\nimport { openLocation } from '@jbrowse/core/util/io'\nimport { ObservableCreate } from '@jbrowse/core/util/rxjs'\nimport { toArray } from 'rxjs/operators'\nimport { firstValueFrom } from 'rxjs'\n\n// locals\nimport CramSlightlyLazyFeature from './CramSlightlyLazyFeature'\nimport { IFilter } from '../shared'\n\ninterface Header {\n  idToName?: string[]\n  nameToId?: Record<string, number>\n  readGroups?: (string | undefined)[]\n}\n\nexport default class CramAdapter extends BaseFeatureDataAdapter {\n  samHeader: Header = {}\n\n  private setupP?: Promise<{\n    samHeader: Header\n    cram: IndexedCramFile\n    sequenceAdapter: BaseSequenceAdapter\n  }>\n\n  private configureP?: Promise<{\n    cram: IndexedCramFile\n    sequenceAdapter: BaseSequenceAdapter\n  }>\n\n  // maps a refname to an id\n  private seqIdToRefName: string[] | undefined\n\n  // maps a seqId to original refname, passed specially to render args, to a seqid\n  private seqIdToOriginalRefName: string[] = []\n\n  public async configurePre() {\n    const cramLocation = this.getConf('cramLocation')\n    const craiLocation = this.getConf('craiLocation')\n    const pm = this.pluginManager\n\n    const cram = new IndexedCramFile({\n      cramFilehandle: openLocation(cramLocation, pm),\n      index: new CraiIndex({ filehandle: openLocation(craiLocation, pm) }),\n      seqFetch: (...args) => this.seqFetch(...args),\n      checkSequenceMD5: false,\n    })\n\n    if (!this.getSubAdapter) {\n      throw new Error('Error getting subadapter')\n    }\n\n    const seqConf = this.getConf('sequenceAdapter')\n    if (!seqConf) {\n      throw new Error('no sequenceAdapter supplied to CramAdapter config')\n    }\n    const subadapter = await this.getSubAdapter(seqConf)\n\n    return {\n      cram,\n      sequenceAdapter: subadapter.dataAdapter as BaseSequenceAdapter,\n    }\n  }\n\n  public async configure() {\n    if (!this.configureP) {\n      this.configureP = this.configurePre().catch((e: unknown) => {\n        this.configureP = undefined\n        throw e\n      })\n    }\n    return this.configureP\n  }\n\n  async getHeader(_opts?: BaseOptions) {\n    const { cram } = await this.configure()\n    return cram.cram.getHeaderText()\n  }\n\n  private async seqFetch(\n    seqId: number,\n    start: number,\n    end: number,\n  ): Promise<string> {\n    start -= 1 // convert from 1-based closed to interbase\n\n    const { sequenceAdapter } = await this.configure()\n    const refName = this.refIdToOriginalName(seqId) || this.refIdToName(seqId)\n    if (!refName) {\n      throw new Error('unknown')\n    }\n\n    const seqChunks = await firstValueFrom(\n      sequenceAdapter\n        .getFeatures({\n          refName,\n          start,\n          end,\n          assemblyName: '',\n        })\n        .pipe(toArray()),\n    )\n\n    const sequence = seqChunks\n      .sort((a, b) => a.get('start') - b.get('start'))\n      .map(chunk => {\n        const chunkStart = chunk.get('start')\n        const chunkEnd = chunk.get('end')\n        const trimStart = Math.max(start - chunkStart, 0)\n        const trimEnd = Math.min(end - chunkStart, chunkEnd - chunkStart)\n        const trimLength = trimEnd - trimStart\n        const chunkSeq = chunk.get('seq') || chunk.get('residues')\n        return chunkSeq.slice(trimStart, trimStart + trimLength)\n      })\n      .join('')\n\n    const qlen = end - start\n    if (sequence.length !== qlen) {\n      throw new Error(\n        `fetching ${refName}:${toLocale(\n          start - 1,\n        )}-${toLocale(end)} returned ${toLocale(sequence.length)} bases, should have returned ${toLocale(\n          qlen,\n        )}`,\n      )\n    }\n    return sequence\n  }\n\n  private async setupPre(opts?: BaseOptions) {\n    const { statusCallback = () => {} } = opts || {}\n    return updateStatus('Downloading index', statusCallback, async () => {\n      const conf = await this.configure()\n      const { cram } = conf\n      const samHeader = await cram.cram.getSamHeader()\n\n      // use the @SQ lines in the header to figure out the\n      // mapping between ref ID numbers and names\n      const idToName: string[] = []\n      const nameToId: Record<string, number> = {}\n      samHeader\n        .filter(l => l.tag === 'SQ')\n        .forEach((sqLine, refId) => {\n          const SN = sqLine.data.find(item => item.tag === 'SN')\n          if (SN) {\n            const refName = SN.value\n            nameToId[refName] = refId\n            idToName[refId] = refName\n          }\n        })\n\n      const readGroups = samHeader\n        .filter(l => l.tag === 'RG')\n        .map(rgLine => rgLine.data.find(item => item.tag === 'ID')?.value)\n\n      const data = { idToName, nameToId, readGroups }\n      this.samHeader = data\n      return { samHeader: data, ...conf }\n    })\n  }\n\n  private async setup(opts?: BaseOptions) {\n    if (!this.setupP) {\n      this.setupP = this.setupPre(opts).catch((e: unknown) => {\n        this.setupP = undefined\n        throw e\n      })\n    }\n    return this.setupP\n  }\n\n  async getRefNames(opts?: BaseOptions) {\n    const { samHeader } = await this.setup(opts)\n    if (!samHeader.idToName) {\n      throw new Error('CRAM file has no header lines')\n    }\n    return samHeader.idToName\n  }\n\n  // use info from the SAM header if possible, but fall back to using\n  // the ref seq order from when the browser's refseqs were loaded\n  refNameToId(refName: string) {\n    if (this.samHeader.nameToId) {\n      return this.samHeader.nameToId[refName]\n    }\n    if (this.seqIdToRefName) {\n      return this.seqIdToRefName.indexOf(refName)\n    }\n    return undefined\n  }\n\n  // use info from the SAM header if possible, but fall back to using\n  // the ref seq order from when the browser's refseqs were loaded\n  refIdToName(refId: number) {\n    return this.samHeader.idToName?.[refId] || this.seqIdToRefName?.[refId]\n  }\n\n  refIdToOriginalName(refId: number) {\n    return this.seqIdToOriginalRefName[refId]\n  }\n\n  getFeatures(\n    region: Region & { originalRefName?: string },\n    opts?: BaseOptions & {\n      filterBy: IFilter\n    },\n  ) {\n    const { signal, filterBy, statusCallback = () => {} } = opts || {}\n    const { refName, start, end, originalRefName } = region\n\n    return ObservableCreate<Feature>(async observer => {\n      const { cram, samHeader } = await this.setup(opts)\n\n      const refId = this.refNameToId(refName)\n      if (refId === undefined) {\n        console.warn('Unknown refName', refName)\n        observer.complete()\n        return\n      }\n\n      if (originalRefName) {\n        this.seqIdToOriginalRefName[refId] = originalRefName\n      }\n      const records = await updateStatus(\n        'Downloading alignments',\n        statusCallback,\n        () => cram.getRecordsForRange(refId, start, end),\n      )\n      checkAbortSignal(signal)\n      await updateStatus('Processing alignments', statusCallback, () => {\n        const {\n          flagInclude = 0,\n          flagExclude = 0,\n          tagFilter,\n          readName,\n        } = filterBy || {}\n\n        for (const record of records) {\n          const flags = record.flags\n          if ((flags & flagInclude) !== flagInclude && !(flags & flagExclude)) {\n            continue\n          }\n\n          if (tagFilter) {\n            const readVal =\n              tagFilter.tag === 'RG'\n                ? samHeader.readGroups?.[record.readGroupId]\n                : record.tags[tagFilter.tag]\n            const filterVal = tagFilter.value\n            if (\n              filterVal === '*'\n                ? readVal !== undefined\n                : `${readVal}` !== `${filterVal}`\n            ) {\n              continue\n            }\n          }\n\n          if (readName && record.readName !== readName) {\n            continue\n          }\n          observer.next(this.cramRecordToFeature(record))\n        }\n\n        observer.complete()\n      })\n    }, signal)\n  }\n\n  freeResources(/* { region } */): void {}\n\n  cramRecordToFeature(record: CramRecord) {\n    return new CramSlightlyLazyFeature(record, this)\n  }\n\n  // we return the configured fetchSizeLimit, and the bytes for the region\n  async getMultiRegionFeatureDensityStats(\n    regions: Region[],\n    opts?: BaseOptions,\n  ) {\n    const bytes = await this.bytesForRegions(regions, opts)\n    const fetchSizeLimit = this.getConf('fetchSizeLimit')\n    return {\n      bytes,\n      fetchSizeLimit,\n    }\n  }\n\n  /**\n   * get the approximate number of bytes queried from the file for the given\n   * query regions\n   * @param regions - list of query regions\n   */\n  private async bytesForRegions(regions: Region[], _opts?: BaseOptions) {\n    const { cram } = await this.configure()\n    const blockResults = await Promise.all(\n      regions.map(region => {\n        const { refName, start, end } = region\n        const chrId = this.refNameToId(refName)\n        return chrId !== undefined\n          ? cram.index.getEntriesForRange(chrId, start, end)\n          : [{ sliceBytes: 0 }]\n      }),\n    )\n\n    return blockResults.flat().reduce((a, b) => a + b.sliceBytes, 0)\n  }\n}\n"],"names":["CramSlightlyLazyFeature","constructor","record","_store","_get_name","this","readName","_get_start","alignmentStart","_get_end","lengthOnRef","_get_cram_read_features","readFeatures","_get_type","_get_score","mappingQuality","_get_flags","flags","_get_strand","isReverseComplemented","_read_group_id","samHeader","readGroups","readGroupId","_get_qual","qualityScores","join","qualRaw","_get_refName","refIdToName","sequenceId","_get_is_paired","mate","_get_pair_orientation","isPaired","getPairOrientation","undefined","_get_template_length","templateLength","templateSize","_get_next_ref","_get_next_segment_position","_get_next_pos","_get_tags","RG","tags","_get_seq","getReadBases","_get_CIGAR","readLen","refRegion","seq","cigar","op","oplen","ref","refStart","start","lastPos","sublen","insLen","code","refPos","sub","data","slice","ret","split","added","String","fromCharCode","length","readFeaturesToCIGAR","readLength","_refRegion","Object","getOwnPropertyNames","prototype","filter","prop","startsWith","map","methodName","replace","id","uniqueId","get","field","parent","children","set","pairedFeature","_get_clipPos","mismatches","at","type","cliplen","toJSON","fromEntries","t","elt","_get_mismatches","qual","Array","j","p","pos","base","altbase","toUpperCase","len","readFeaturesToMismatches","CramAdapter","BaseFeatureDataAdapter","seqIdToOriginalRefName","configurePre","cramLocation","getConf","craiLocation","pm","pluginManager","cram","IndexedCramFile","cramFilehandle","openLocation","index","CraiIndex","filehandle","seqFetch","args","checkSequenceMD5","getSubAdapter","Error","seqConf","sequenceAdapter","dataAdapter","configure","configureP","catch","e","getHeader","_opts","getHeaderText","seqId","end","refName","refIdToOriginalName","sequence","firstValueFrom","getFeatures","assemblyName","pipe","toArray","sort","a","b","chunk","chunkStart","chunkEnd","trimStart","Math","max","trimLength","min","qlen","toLocale","setupPre","opts","statusCallback","updateStatus","async","conf","getSamHeader","idToName","nameToId","l","tag","forEach","sqLine","refId","SN","find","item","value","rgLine","setup","setupP","getRefNames","refNameToId","seqIdToRefName","indexOf","region","signal","filterBy","originalRefName","ObservableCreate","console","warn","observer","complete","records","getRecordsForRange","checkAbortSignal","flagInclude","flagExclude","tagFilter","readVal","filterVal","next","cramRecordToFeature","freeResources","getMultiRegionFeatureDensityStats","regions","bytes","bytesForRegions","fetchSizeLimit","Promise","all","chrId","getEntriesForRange","sliceBytes","flat","reduce"],"sourceRoot":""}