@jbrowse/plugin-alignments 2.3.1 → 2.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/dist/BamAdapter/BamAdapter.js +2 -1
  2. package/dist/BamAdapter/BamAdapter.js.map +1 -1
  3. package/dist/CramAdapter/CramAdapter.js +3 -3
  4. package/dist/CramAdapter/CramAdapter.js.map +1 -1
  5. package/dist/LinearReadArcsDisplay/configSchema.js +8 -0
  6. package/dist/LinearReadArcsDisplay/configSchema.js.map +1 -1
  7. package/dist/LinearReadArcsDisplay/drawFeats.d.ts +1 -0
  8. package/dist/LinearReadArcsDisplay/drawFeats.js +45 -37
  9. package/dist/LinearReadArcsDisplay/drawFeats.js.map +1 -1
  10. package/dist/LinearReadArcsDisplay/model.d.ts +46 -15
  11. package/dist/LinearReadArcsDisplay/model.js +42 -0
  12. package/dist/LinearReadArcsDisplay/model.js.map +1 -1
  13. package/dist/LinearReadCloudDisplay/drawFeats.js +18 -32
  14. package/dist/LinearReadCloudDisplay/drawFeats.js.map +1 -1
  15. package/dist/LinearSNPCoverageDisplay/components/Tooltip.d.ts +1 -1
  16. package/dist/LinearSNPCoverageDisplay/components/Tooltip.js +1 -1
  17. package/dist/LinearSNPCoverageDisplay/components/Tooltip.js.map +1 -1
  18. package/dist/LinearSNPCoverageDisplay/models/model.d.ts +8 -8
  19. package/dist/PileupRPC/methods/GetGlobalValueForTag.js +3 -1
  20. package/dist/PileupRPC/methods/GetGlobalValueForTag.js.map +1 -1
  21. package/dist/PileupRPC/methods/GetReducedFeatures.js +2 -4
  22. package/dist/PileupRPC/methods/GetReducedFeatures.js.map +1 -1
  23. package/dist/PileupRPC/methods/GetVisibleModifications.js +2 -4
  24. package/dist/PileupRPC/methods/GetVisibleModifications.js.map +1 -1
  25. package/dist/SNPCoverageAdapter/SNPCoverageAdapter.js +3 -4
  26. package/dist/SNPCoverageAdapter/SNPCoverageAdapter.js.map +1 -1
  27. package/dist/util.js +3 -3
  28. package/dist/util.js.map +1 -1
  29. package/esm/BamAdapter/BamAdapter.js +2 -1
  30. package/esm/BamAdapter/BamAdapter.js.map +1 -1
  31. package/esm/CramAdapter/CramAdapter.js +3 -3
  32. package/esm/CramAdapter/CramAdapter.js.map +1 -1
  33. package/esm/LinearReadArcsDisplay/configSchema.js +8 -0
  34. package/esm/LinearReadArcsDisplay/configSchema.js.map +1 -1
  35. package/esm/LinearReadArcsDisplay/drawFeats.d.ts +1 -0
  36. package/esm/LinearReadArcsDisplay/drawFeats.js +45 -37
  37. package/esm/LinearReadArcsDisplay/drawFeats.js.map +1 -1
  38. package/esm/LinearReadArcsDisplay/model.d.ts +46 -15
  39. package/esm/LinearReadArcsDisplay/model.js +42 -0
  40. package/esm/LinearReadArcsDisplay/model.js.map +1 -1
  41. package/esm/LinearReadCloudDisplay/drawFeats.js +19 -33
  42. package/esm/LinearReadCloudDisplay/drawFeats.js.map +1 -1
  43. package/esm/LinearSNPCoverageDisplay/components/Tooltip.d.ts +1 -1
  44. package/esm/LinearSNPCoverageDisplay/components/Tooltip.js +1 -1
  45. package/esm/LinearSNPCoverageDisplay/components/Tooltip.js.map +1 -1
  46. package/esm/LinearSNPCoverageDisplay/models/model.d.ts +8 -8
  47. package/esm/PileupRPC/methods/GetGlobalValueForTag.js +3 -1
  48. package/esm/PileupRPC/methods/GetGlobalValueForTag.js.map +1 -1
  49. package/esm/PileupRPC/methods/GetReducedFeatures.js +2 -4
  50. package/esm/PileupRPC/methods/GetReducedFeatures.js.map +1 -1
  51. package/esm/PileupRPC/methods/GetVisibleModifications.js +2 -4
  52. package/esm/PileupRPC/methods/GetVisibleModifications.js.map +1 -1
  53. package/esm/SNPCoverageAdapter/SNPCoverageAdapter.js +3 -4
  54. package/esm/SNPCoverageAdapter/SNPCoverageAdapter.js.map +1 -1
  55. package/esm/util.js +3 -3
  56. package/esm/util.js.map +1 -1
  57. package/package.json +3 -3
  58. package/src/AlignmentsFeatureDetail/__snapshots__/{index.test.js.snap → index.test.tsx.snap} +0 -0
  59. package/src/AlignmentsFeatureDetail/{index.test.js → index.test.tsx} +4 -2
  60. package/src/BamAdapter/BamAdapter.test.ts +5 -4
  61. package/src/BamAdapter/BamAdapter.ts +2 -1
  62. package/src/CombinationTest.test.ts +3 -2
  63. package/src/CramAdapter/CramAdapter.test.ts +3 -2
  64. package/src/CramAdapter/CramAdapter.ts +11 -9
  65. package/src/LinearAlignmentsDisplay/models/{configSchema.test.js → configSchema.test.ts} +5 -1
  66. package/src/LinearReadArcsDisplay/configSchema.ts +10 -0
  67. package/src/LinearReadArcsDisplay/drawFeats.ts +73 -54
  68. package/src/LinearReadArcsDisplay/model.tsx +45 -0
  69. package/src/LinearReadCloudDisplay/drawFeats.ts +21 -33
  70. package/src/LinearSNPCoverageDisplay/components/Tooltip.tsx +76 -73
  71. package/src/LinearSNPCoverageDisplay/models/{configSchema.test.js → configSchema.test.ts} +3 -1
  72. package/src/PileupRPC/methods/GetGlobalValueForTag.ts +4 -1
  73. package/src/PileupRPC/methods/GetReducedFeatures.ts +4 -5
  74. package/src/PileupRPC/methods/GetVisibleModifications.ts +4 -4
  75. package/src/SNPCoverageAdapter/SNPCoverageAdapter.ts +6 -4
  76. package/src/index.test.ts +0 -1
  77. package/src/util.ts +10 -8
  78. package/src/PileupRenderer/components/PileupRendering.test.js +0 -21
  79. package/src/PileupRenderer/components/__snapshots__/PileupRendering.test.js.snap +0 -23
@@ -1 +1 @@
1
- {"version":3,"file":"GetGlobalValueForTag.js","sourceRoot":"","sources":["../../../src/PileupRPC/methods/GetGlobalValueForTag.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,8CAA8C,CAAA;AAIzE,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AACxC,OAAO,aAAa,MAAM,SAAS,CAAA;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAEnC,MAAM,CAAC,OAAO,OAAO,0BAA2B,SAAQ,aAAa;IAArE;;QACE,SAAI,GAAG,4BAA4B,CAAA;IA+BrC,CAAC;IA7BC,KAAK,CAAC,OAAO,CACX,IAOC,EACD,SAAiB;QAEjB,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,GAC9C,MAAM,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;QAElD,MAAM,WAAW,GAAG,CAClB,MAAM,UAAU,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,aAAa,CAAC,CAC/D,CAAC,WAAqC,CAAA;QAEvC,MAAM,QAAQ,GAAG,WAAW,CAAC,4BAA4B,CAAC,OAAO,CAAC,CAAA;QAClE,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,SAAS,EAAE,CAAA;QAChE,OAAO;YACL,GAAG,IAAI,GAAG,CACR,aAAa;iBACV,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;iBACpC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC;iBAC5B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CACpB;SACF,CAAA;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"GetGlobalValueForTag.js","sourceRoot":"","sources":["../../../src/PileupRPC/methods/GetGlobalValueForTag.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,8CAA8C,CAAA;AAIzE,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,MAAM,CAAA;AAErC,SAAS;AACT,OAAO,aAAa,MAAM,SAAS,CAAA;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAEnC,MAAM,CAAC,OAAO,OAAO,0BAA2B,SAAQ,aAAa;IAArE;;QACE,SAAI,GAAG,4BAA4B,CAAA;IA+BrC,CAAC;IA7BC,KAAK,CAAC,OAAO,CACX,IAOC,EACD,SAAiB;QAEjB,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,GAC9C,MAAM,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;QAElD,MAAM,WAAW,GAAG,CAClB,MAAM,UAAU,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,aAAa,CAAC,CAC/D,CAAC,WAAqC,CAAA;QAEvC,MAAM,QAAQ,GAAG,WAAW,CAAC,4BAA4B,CAAC,OAAO,CAAC,CAAA;QAClE,MAAM,aAAa,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;QACpE,OAAO;YACL,GAAG,IAAI,GAAG,CACR,aAAa;iBACV,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;iBACpC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC;iBAC5B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CACpB;SACF,CAAA;IACH,CAAC;CACF"}
@@ -1,6 +1,7 @@
1
1
  import { getAdapter } from '@jbrowse/core/data_adapters/dataAdapterCache';
2
2
  import { dedupe } from '@jbrowse/core/util';
3
3
  import { toArray } from 'rxjs/operators';
4
+ import { firstValueFrom } from 'rxjs';
4
5
  // locals
5
6
  import { filterForPairs, getInsertSizeStats } from '../util';
6
7
  import PileupBaseRPC from '../base';
@@ -15,10 +16,7 @@ export default class PileupGetReducedFeatures extends PileupBaseRPC {
15
16
  const des = await this.deserializeArguments(args, rpcDriver);
16
17
  const { adapterConfig, sessionId, regions } = des;
17
18
  const dataAdapter = (await getAdapter(this.pluginManager, sessionId, adapterConfig)).dataAdapter;
18
- const featuresArray = await dataAdapter
19
- .getFeaturesInMultipleRegions(regions, des)
20
- .pipe(toArray())
21
- .toPromise();
19
+ const featuresArray = await firstValueFrom(dataAdapter.getFeaturesInMultipleRegions(regions, des).pipe(toArray()));
22
20
  const reduced = dedupe(featuresArray.map(f => ({
23
21
  id: f.id(),
24
22
  refName: f.get('refName'),
@@ -1 +1 @@
1
- {"version":3,"file":"GetReducedFeatures.js","sourceRoot":"","sources":["../../../src/PileupRPC/methods/GetReducedFeatures.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GetReducedFeatures.js","sourceRoot":"","sources":["../../../src/PileupRPC/methods/GetReducedFeatures.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { getAdapter } from '@jbrowse/core/data_adapters/dataAdapterCache';
2
2
  import { toArray } from 'rxjs/operators';
3
+ import { firstValueFrom } from 'rxjs';
3
4
  // locals
4
5
  import { getModificationTypes } from '../../MismatchParser';
5
6
  import PileupBaseRPC from '../base';
@@ -12,10 +13,7 @@ export default class PileupGetVisibleModifications extends PileupBaseRPC {
12
13
  async execute(args, rpcDriver) {
13
14
  const { adapterConfig, sessionId, regions } = await this.deserializeArguments(args, rpcDriver);
14
15
  const dataAdapter = (await getAdapter(this.pluginManager, sessionId, adapterConfig)).dataAdapter;
15
- const featuresArray = await dataAdapter
16
- .getFeaturesInMultipleRegions(regions)
17
- .pipe(toArray())
18
- .toPromise();
16
+ const featuresArray = await firstValueFrom(dataAdapter.getFeaturesInMultipleRegions(regions).pipe(toArray()));
19
17
  const uniqueValues = new Set();
20
18
  featuresArray.forEach(f => {
21
19
  getModificationTypes(getTagAlt(f, 'MM', 'Mm') || '').forEach(t => uniqueValues.add(t));
@@ -1 +1 @@
1
- {"version":3,"file":"GetVisibleModifications.js","sourceRoot":"","sources":["../../../src/PileupRPC/methods/GetVisibleModifications.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,8CAA8C,CAAA;AAIzE,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAExC,SAAS;AACT,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,aAAa,MAAM,SAAS,CAAA;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAEtC,MAAM,CAAC,OAAO,OAAO,6BAA8B,SAAQ,aAAa;IAAxE;;QACE,SAAI,GAAG,+BAA+B,CAAA;IAgCxC,CAAC;IA9BC,KAAK,CAAC,OAAO,CACX,IAOC,EACD,SAAiB;QAEjB,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,GACzC,MAAM,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;QAClD,MAAM,WAAW,GAAG,CAClB,MAAM,UAAU,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,aAAa,CAAC,CAC/D,CAAC,WAAqC,CAAA;QAEvC,MAAM,aAAa,GAAG,MAAM,WAAW;aACpC,4BAA4B,CAAC,OAAO,CAAC;aACrC,IAAI,CAAC,OAAO,EAAE,CAAC;aACf,SAAS,EAAE,CAAA;QAEd,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAA;QACtC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YACxB,oBAAoB,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAC/D,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CACpB,CAAA;QACH,CAAC,CAAC,CAAA;QACF,OAAO,CAAC,GAAG,YAAY,CAAC,CAAA;IAC1B,CAAC;CACF"}
1
+ {"version":3,"file":"GetVisibleModifications.js","sourceRoot":"","sources":["../../../src/PileupRPC/methods/GetVisibleModifications.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,8CAA8C,CAAA;AAIzE,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,MAAM,CAAA;AAErC,SAAS;AACT,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,aAAa,MAAM,SAAS,CAAA;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAEtC,MAAM,CAAC,OAAO,OAAO,6BAA8B,SAAQ,aAAa;IAAxE;;QACE,SAAI,GAAG,+BAA+B,CAAA;IA+BxC,CAAC;IA7BC,KAAK,CAAC,OAAO,CACX,IAOC,EACD,SAAiB;QAEjB,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,GACzC,MAAM,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;QAClD,MAAM,WAAW,GAAG,CAClB,MAAM,UAAU,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,aAAa,CAAC,CAC/D,CAAC,WAAqC,CAAA;QAEvC,MAAM,aAAa,GAAG,MAAM,cAAc,CACxC,WAAW,CAAC,4BAA4B,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAClE,CAAA;QAED,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAA;QACtC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YACxB,oBAAoB,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAC/D,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CACpB,CAAA;QACH,CAAC,CAAC,CAAA;QACF,OAAO,CAAC,GAAG,YAAY,CAAC,CAAA;IAC1B,CAAC;CACF"}
@@ -2,6 +2,8 @@ import { BaseFeatureDataAdapter, } from '@jbrowse/core/data_adapters/BaseAdapter
2
2
  import SimpleFeature from '@jbrowse/core/util/simpleFeature';
3
3
  import { ObservableCreate } from '@jbrowse/core/util/rxjs';
4
4
  import { toArray } from 'rxjs/operators';
5
+ import { firstValueFrom } from 'rxjs';
6
+ // locals
5
7
  import generateCoverageBins from './generateCoverageBins';
6
8
  import { fetchSequence } from '../util';
7
9
  export default class SNPCoverageAdapter extends BaseFeatureDataAdapter {
@@ -31,10 +33,7 @@ export default class SNPCoverageAdapter extends BaseFeatureDataAdapter {
31
33
  getFeatures(region, opts = {}) {
32
34
  return ObservableCreate(async (observer) => {
33
35
  const { subadapter } = await this.configure();
34
- const feats = await subadapter
35
- .getFeatures(region, opts)
36
- .pipe(toArray())
37
- .toPromise();
36
+ const feats = await firstValueFrom(subadapter.getFeatures(region, opts).pipe(toArray()));
38
37
  const { bins, skipmap } = await generateCoverageBins(feats, region, opts, arg => this.fetchSequence(arg));
39
38
  bins.forEach((bin, index) => {
40
39
  const start = region.start + index;
@@ -1 +1 @@
1
- {"version":3,"file":"SNPCoverageAdapter.js","sourceRoot":"","sources":["../../src/SNPCoverageAdapter/SNPCoverageAdapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SNPCoverageAdapter.js","sourceRoot":"","sources":["../../src/SNPCoverageAdapter/SNPCoverageAdapter.ts"],"names":[],"mappings":"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"}
package/esm/util.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { toArray } from 'rxjs/operators';
2
+ import { firstValueFrom } from 'rxjs';
2
3
  // get tag from BAM or CRAM feature, where CRAM uses feature.get('tags') and
3
4
  // BAM does not
4
5
  export function getTag(feature, tag) {
@@ -66,14 +67,13 @@ export function getColorWGBS(strand, base) {
66
67
  export async function fetchSequence(region, adapter) {
67
68
  var _a;
68
69
  const { end, originalRefName, refName } = region;
69
- const feats = await adapter
70
+ const feats = await firstValueFrom(adapter
70
71
  .getFeatures({
71
72
  ...region,
72
73
  refName: originalRefName || refName,
73
74
  end: end + 1,
74
75
  })
75
- .pipe(toArray())
76
- .toPromise();
76
+ .pipe(toArray()));
77
77
  return (_a = feats[0]) === null || _a === void 0 ? void 0 : _a.get('seq');
78
78
  }
79
79
  // has to check underlying C-G (aka CpG) on the reference sequence
package/esm/util.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAGxC,4EAA4E;AAC5E,eAAe;AACf,MAAM,UAAU,MAAM,CAAC,OAAgB,EAAE,GAAW;IAClD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IAChC,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;AAC5C,CAAC;AAED,4EAA4E;AAC5E,0CAA0C;AAC1C,MAAM,UAAU,SAAS,CAAC,OAAgB,EAAE,GAAW,EAAE,GAAW;IAClE,OAAO,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;AACrD,CAAC;AAED,gDAAgD;AAChD,kFAAkF;AAClF,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,EAAE,EAAE;QACF,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,IAAI;QAEV,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,IAAI;QAEV,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,IAAI;QAEV,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,IAAI;KACkB;IAE9B,EAAE,EAAE;QACF,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,IAAI;QAEV,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,IAAI;QAEV,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,IAAI;QAEV,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,IAAI;KACkB;IAE9B,EAAE,EAAE;QACF,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,IAAI;QAEV,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,IAAI;QAEV,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,IAAI;QAEV,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,IAAI;KACkB;CAC/B,CAAA;AAED,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,IAAY;IACvD,IAAI,MAAM,KAAK,CAAC,EAAE;QAChB,IAAI,IAAI,KAAK,GAAG,EAAE;YAChB,OAAO,MAAM,CAAA;SACd;QACD,IAAI,IAAI,KAAK,GAAG,EAAE;YAChB,OAAO,MAAM,CAAA;SACd;KACF;SAAM,IAAI,MAAM,KAAK,CAAC,CAAC,EAAE;QACxB,IAAI,IAAI,KAAK,GAAG,EAAE;YAChB,OAAO,MAAM,CAAA;SACd;QACD,IAAI,IAAI,KAAK,GAAG,EAAE;YAChB,OAAO,MAAM,CAAA;SACd;KACF;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAuB,EACvB,OAA+B;;IAE/B,MAAM,EAAE,GAAG,EAAE,eAAe,EAAE,OAAO,EAAE,GAAG,MAAM,CAAA;IAEhD,MAAM,KAAK,GAAG,MAAM,OAAO;SACxB,WAAW,CAAC;QACX,GAAG,MAAM;QACT,OAAO,EAAE,eAAe,IAAI,OAAO;QACnC,GAAG,EAAE,GAAG,GAAG,CAAC;KACb,CAAC;SACD,IAAI,CAAC,OAAO,EAAE,CAAC;SACf,SAAS,EAAE,CAAA;IACd,OAAO,MAAA,KAAK,CAAC,CAAC,CAAC,0CAAE,GAAG,CAAC,KAAK,CAAC,CAAA;AAC7B,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,4BAA4B,CAAC,IAAa;IACxD,OAAO,IAAI,KAAK,aAAa,CAAA;AAC/B,CAAC"}
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAGxC,OAAO,EAAE,cAAc,EAAE,MAAM,MAAM,CAAA;AACrC,4EAA4E;AAC5E,eAAe;AACf,MAAM,UAAU,MAAM,CAAC,OAAgB,EAAE,GAAW;IAClD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IAChC,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;AAC5C,CAAC;AAED,4EAA4E;AAC5E,0CAA0C;AAC1C,MAAM,UAAU,SAAS,CAAC,OAAgB,EAAE,GAAW,EAAE,GAAW;IAClE,OAAO,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;AACrD,CAAC;AAED,gDAAgD;AAChD,kFAAkF;AAClF,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,EAAE,EAAE;QACF,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,IAAI;QAEV,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,IAAI;QAEV,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,IAAI;QAEV,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,IAAI;KACkB;IAE9B,EAAE,EAAE;QACF,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,IAAI;QAEV,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,IAAI;QAEV,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,IAAI;QAEV,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,IAAI;KACkB;IAE9B,EAAE,EAAE;QACF,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,IAAI;QAEV,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,IAAI;QAEV,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,IAAI;QAEV,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,IAAI;KACkB;CAC/B,CAAA;AAED,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,IAAY;IACvD,IAAI,MAAM,KAAK,CAAC,EAAE;QAChB,IAAI,IAAI,KAAK,GAAG,EAAE;YAChB,OAAO,MAAM,CAAA;SACd;QACD,IAAI,IAAI,KAAK,GAAG,EAAE;YAChB,OAAO,MAAM,CAAA;SACd;KACF;SAAM,IAAI,MAAM,KAAK,CAAC,CAAC,EAAE;QACxB,IAAI,IAAI,KAAK,GAAG,EAAE;YAChB,OAAO,MAAM,CAAA;SACd;QACD,IAAI,IAAI,KAAK,GAAG,EAAE;YAChB,OAAO,MAAM,CAAA;SACd;KACF;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAuB,EACvB,OAA+B;;IAE/B,MAAM,EAAE,GAAG,EAAE,eAAe,EAAE,OAAO,EAAE,GAAG,MAAM,CAAA;IAEhD,MAAM,KAAK,GAAG,MAAM,cAAc,CAChC,OAAO;SACJ,WAAW,CAAC;QACX,GAAG,MAAM;QACT,OAAO,EAAE,eAAe,IAAI,OAAO;QACnC,GAAG,EAAE,GAAG,GAAG,CAAC;KACb,CAAC;SACD,IAAI,CAAC,OAAO,EAAE,CAAC,CACnB,CAAA;IACD,OAAO,MAAA,KAAK,CAAC,CAAC,CAAC,0CAAE,GAAG,CAAC,KAAK,CAAC,CAAA;AAC7B,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,4BAA4B,CAAC,IAAa;IACxD,OAAO,IAAI,KAAK,aAAa,CAAA;AAC/B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jbrowse/plugin-alignments",
3
- "version": "2.3.1",
3
+ "version": "2.3.3",
4
4
  "description": "JBrowse 2 alignments adapters, tracks, etc.",
5
5
  "keywords": [
6
6
  "jbrowse",
@@ -56,7 +56,7 @@
56
56
  "mobx-react": "^7.0.0",
57
57
  "mobx-state-tree": "^5.0.0",
58
58
  "react": ">=16.8.0",
59
- "rxjs": "^6.0.0",
59
+ "rxjs": "^7.0.0",
60
60
  "tss-react": "^4.0.0"
61
61
  },
62
62
  "publishConfig": {
@@ -65,5 +65,5 @@
65
65
  "distModule": "esm/index.js",
66
66
  "srcModule": "src/index.ts",
67
67
  "module": "esm/index.js",
68
- "gitHead": "75c4cba2f50c626c62881abd5851dbf2435c2401"
68
+ "gitHead": "283e0387ccd5acc9f092cf00804d1fcac212e68d"
69
69
  }
@@ -1,13 +1,14 @@
1
+ import React from 'react'
1
2
  import { render } from '@testing-library/react'
2
3
  import { types } from 'mobx-state-tree'
3
- import React from 'react'
4
4
  import PluginManager from '@jbrowse/core/PluginManager'
5
5
  import { ConfigurationSchema } from '@jbrowse/core/configuration'
6
+
7
+ // locals
6
8
  import { stateModelFactory } from '.'
7
9
  import ReactComponent from './AlignmentsFeatureDetail'
8
10
 
9
11
  test('open up a widget', () => {
10
- console.warn = jest.fn()
11
12
  const pluginManager = new PluginManager([])
12
13
 
13
14
  const Session = types.model({
@@ -17,6 +18,7 @@ test('open up a widget', () => {
17
18
  })
18
19
  const session = Session.create(
19
20
  {
21
+ // @ts-ignore
20
22
  widget: { type: 'AlignmentsFeatureWidget' },
21
23
  },
22
24
  { pluginManager },
@@ -1,4 +1,5 @@
1
1
  import { toArray } from 'rxjs/operators'
2
+ import { firstValueFrom } from 'rxjs'
2
3
  import Adapter from './BamAdapter'
3
4
  import configSchema from './configSchema'
4
5
 
@@ -25,7 +26,7 @@ test('adapter can fetch features from volvox.bam', async () => {
25
26
  end: 20000,
26
27
  })
27
28
 
28
- const featuresArray = await features.pipe(toArray()).toPromise()
29
+ const featuresArray = await firstValueFrom(features.pipe(toArray()))
29
30
  expect(featuresArray[0].get('refName')).toBe('ctgA')
30
31
  const featuresJsonArray = featuresArray.map(f => f.toJSON())
31
32
  expect(featuresJsonArray.length).toEqual(3809)
@@ -58,7 +59,7 @@ test('adapter can fetch features from volvox.bam', async () => {
58
59
  start: 0,
59
60
  end: 20000,
60
61
  })
61
- const featuresArrayCSI = await featuresCSI.pipe(toArray()).toPromise()
62
+ const featuresArrayCSI = await firstValueFrom(featuresCSI.pipe(toArray()))
62
63
  const featuresJsonArrayCSI = featuresArrayCSI.map(f => f.toJSON())
63
64
  expect(featuresJsonArrayCSI).toEqual(featuresJsonArray)
64
65
  })
@@ -86,7 +87,7 @@ test('test usage of BamSlightlyLazyFeature toJSON (used in the widget)', async (
86
87
  start: 0,
87
88
  end: 100,
88
89
  })
89
- const featuresArray = await features.pipe(toArray()).toPromise()
90
+ const featuresArray = await firstValueFrom(features.pipe(toArray()))
90
91
  const f = featuresArray[0].toJSON()
91
92
  expect(f.refName).toBe('ctgA')
92
93
  expect(f.start).toBe(2)
@@ -117,7 +118,7 @@ test('test usage of BamSlightlyLazyFeature for extended CIGAR', async () => {
117
118
  start: 13260,
118
119
  end: 13340,
119
120
  })
120
- const featuresArray = await features.pipe(toArray()).toPromise()
121
+ const featuresArray = await firstValueFrom(features.pipe(toArray()))
121
122
  const f = featuresArray[0]
122
123
  expect(f.get('mismatches')).toMatchSnapshot()
123
124
  })
@@ -11,6 +11,7 @@ import { toArray } from 'rxjs/operators'
11
11
 
12
12
  // locals
13
13
  import BamSlightlyLazyFeature from './BamSlightlyLazyFeature'
14
+ import { firstValueFrom } from 'rxjs'
14
15
 
15
16
  interface Header {
16
17
  idToName: string[]
@@ -138,7 +139,7 @@ export default class BamAdapter extends BaseFeatureDataAdapter {
138
139
  assemblyName: '',
139
140
  })
140
141
 
141
- const seqChunks = await features.pipe(toArray()).toPromise()
142
+ const seqChunks = await firstValueFrom(features.pipe(toArray()))
142
143
 
143
144
  let sequence = ''
144
145
  seqChunks
@@ -9,6 +9,7 @@ import { SequenceAdapter } from './CramAdapter/CramTestAdapters'
9
9
 
10
10
  import cramConfigSchema from './CramAdapter/configSchema'
11
11
  import bamConfigSchema from './BamAdapter/configSchema'
12
+ import { firstValueFrom } from 'rxjs'
12
13
 
13
14
  const pluginManager = new PluginManager()
14
15
 
@@ -55,8 +56,8 @@ async function getFeats(f1: string, f2: string) {
55
56
  }
56
57
  const bamFeatures = bamAdapter.getFeatures(query)
57
58
  const cramFeatures = cramAdapter.getFeatures(query)
58
- const bamFeaturesArray = await bamFeatures.pipe(toArray()).toPromise()
59
- const cramFeaturesArray = await cramFeatures.pipe(toArray()).toPromise()
59
+ const bamFeaturesArray = await firstValueFrom(bamFeatures.pipe(toArray()))
60
+ const cramFeaturesArray = await firstValueFrom(cramFeatures.pipe(toArray()))
60
61
  return { bamFeaturesArray, cramFeaturesArray }
61
62
  }
62
63
 
@@ -1,4 +1,5 @@
1
1
  import { toArray } from 'rxjs/operators'
2
+ import { firstValueFrom } from 'rxjs'
2
3
  import { LocalFile } from 'generic-filehandle'
3
4
  import PluginManager from '@jbrowse/core/PluginManager'
4
5
  import { getSubAdapterType } from '@jbrowse/core/data_adapters/dataAdapterCache'
@@ -40,7 +41,7 @@ test('adapter can fetch features from volvox-sorted.cram', async () => {
40
41
  end: 20000,
41
42
  })
42
43
 
43
- const featuresArray = await features.pipe(toArray()).toPromise()
44
+ const featuresArray = await firstValueFrom(features.pipe(toArray()))
44
45
  expect(featuresArray[0].get('refName')).toBe('ctgA')
45
46
  const featuresJsonArray = featuresArray.map(f => f.toJSON())
46
47
  expect(featuresJsonArray.length).toEqual(3809)
@@ -74,7 +75,7 @@ test('test usage of cramSlightlyLazyFeature toJSON (used in the widget)', async
74
75
  start: 0,
75
76
  end: 100,
76
77
  })
77
- const featuresArray = await features.pipe(toArray()).toPromise()
78
+ const featuresArray = await firstValueFrom(features.pipe(toArray()))
78
79
  const f = featuresArray[0].toJSON()
79
80
  expect(f.refName).toBe('ctgA')
80
81
  expect(f.start).toBe(2)
@@ -8,6 +8,7 @@ import { checkAbortSignal, Region, Feature } from '@jbrowse/core/util'
8
8
  import { openLocation } from '@jbrowse/core/util/io'
9
9
  import { ObservableCreate } from '@jbrowse/core/util/rxjs'
10
10
  import { toArray } from 'rxjs/operators'
11
+ import { firstValueFrom } from 'rxjs'
11
12
  import CramSlightlyLazyFeature from './CramSlightlyLazyFeature'
12
13
 
13
14
  interface Header {
@@ -103,15 +104,16 @@ export default class CramAdapter extends BaseFeatureDataAdapter {
103
104
  throw new Error('unknown')
104
105
  }
105
106
 
106
- const seqChunks = await sequenceAdapter
107
- .getFeatures({
108
- refName,
109
- start,
110
- end,
111
- assemblyName: '',
112
- })
113
- .pipe(toArray())
114
- .toPromise()
107
+ const seqChunks = await firstValueFrom(
108
+ sequenceAdapter
109
+ .getFeatures({
110
+ refName,
111
+ start,
112
+ end,
113
+ assemblyName: '',
114
+ })
115
+ .pipe(toArray()),
116
+ )
115
117
 
116
118
  const sequence = seqChunks
117
119
  .sort((a, b) => a.get('start') - b.get('start'))
@@ -5,6 +5,8 @@ import {
5
5
  svgFeatureRendererConfigSchema,
6
6
  SvgFeatureRendererReactComponent,
7
7
  } from '@jbrowse/plugin-svg'
8
+
9
+ // locals
8
10
  import PileupRenderer from '../../PileupRenderer'
9
11
  import SNPCoverageRenderer from '../../SNPCoverageRenderer'
10
12
  import LinearPileupDisplay from '../../LinearPileupDisplay'
@@ -17,11 +19,13 @@ beforeEach(() => {
17
19
  })
18
20
 
19
21
  afterEach(() => {
22
+ // @ts-ignore
20
23
  console.warn.mockRestore()
21
24
  })
22
25
 
23
26
  class AlignmentsPlugin extends Plugin {
24
- install(pluginManager) {
27
+ name = 'AlignmentsPlugin'
28
+ install(pluginManager: PluginManager) {
25
29
  PileupRenderer(pluginManager)
26
30
 
27
31
  pluginManager.addRendererType(
@@ -28,6 +28,16 @@ function configSchemaF(pluginManager: PluginManager) {
28
28
  defaultValue: 1,
29
29
  },
30
30
 
31
+ /**
32
+ * #slot
33
+ */
34
+ jitter: {
35
+ type: 'number',
36
+ description:
37
+ 'jitters the x position so e.g. if many reads map to exact same x position, jittering makes it easy to see that there are many of them',
38
+ defaultValue: 0,
39
+ },
40
+
31
41
  /**
32
42
  * #slot
33
43
  */
@@ -9,6 +9,7 @@ import {
9
9
  } from '../shared/color'
10
10
  import { ChainData } from '../shared/fetchChains'
11
11
  import { featurizeSA } from '../MismatchParser'
12
+ import { Assembly } from '@jbrowse/core/assemblyManager/assembly'
12
13
 
13
14
  export function hasPairedReads(features: ChainData) {
14
15
  for (const f of features.chains.values()) {
@@ -21,6 +22,17 @@ export function hasPairedReads(features: ChainData) {
21
22
 
22
23
  type LGV = LinearGenomeViewModel
23
24
 
25
+ function jitter(n: number) {
26
+ return Math.random() * 2 * n - n
27
+ }
28
+
29
+ interface CoreFeat {
30
+ strand: number
31
+ refName: string
32
+ start: number
33
+ end: number
34
+ }
35
+
24
36
  export default async function drawFeats(
25
37
  self: {
26
38
  setLastDrawnOffsetPx: (n: number) => void
@@ -31,34 +43,48 @@ export default async function drawFeats(
31
43
  height: number
32
44
  chainData?: ChainData
33
45
  lineWidthSetting: number
46
+ jitterVal: number
34
47
  },
35
48
  ctx: CanvasRenderingContext2D,
36
49
  ) {
37
- const { chainData } = self
50
+ const {
51
+ chainData,
52
+ height,
53
+ colorBy,
54
+ drawInter,
55
+ drawLongRange,
56
+ lineWidthSetting,
57
+ jitterVal,
58
+ } = self
38
59
  if (!chainData) {
39
60
  return
40
61
  }
41
- const displayHeight = self.height
42
62
  const view = getContainingView(self) as LGV
43
63
  const { assemblyManager } = getSession(self)
44
64
  self.setLastDrawnOffsetPx(view.offsetPx)
45
- ctx.lineWidth = self.lineWidthSetting
65
+ ctx.lineWidth = lineWidthSetting
46
66
  const { chains, stats } = chainData
47
67
  const hasPaired = hasPairedReads(chainData)
48
68
  const assemblyName = view.assemblyNames[0]
49
69
  const asm = assemblyManager.get(assemblyName)
50
- const type = self.colorBy?.type || 'insertSizeAndOrientation'
70
+ const type = colorBy?.type || 'insertSizeAndOrientation'
71
+ if (!asm) {
72
+ return
73
+ }
74
+
75
+ function drawLineAtOffset(p: number, c: string) {
76
+ // draws a vertical line off to middle of nowhere if the second end not found
77
+ ctx.strokeStyle = c
78
+ ctx.beginPath()
79
+ ctx.moveTo(p, 0)
80
+ ctx.lineTo(p, height)
81
+ ctx.stroke()
82
+ }
51
83
 
52
84
  function draw(
53
- k1: {
54
- strand: number
55
- refName: string
56
- start: number
57
- end: number
58
- tlen?: number
59
- pair_orientation?: string
60
- },
61
- k2: { strand: number; refName: string; start: number; end: number },
85
+ k1: CoreFeat & { tlen?: number; pair_orientation?: string },
86
+ k2: CoreFeat,
87
+ assembly: Assembly,
62
88
  longRange?: boolean,
63
89
  ) {
64
90
  const s1 = k1.strand
@@ -68,14 +94,16 @@ export default async function drawFeats(
68
94
 
69
95
  const p1 = f1 ? k1.start : k1.end
70
96
  const p2 = hasPaired ? (f2 ? k2.start : k2.end) : f2 ? k2.end : k2.start
71
-
72
- const r1 = view.bpToPx({ refName: k1.refName, coord: p1 })
73
- const r2 = view.bpToPx({ refName: k2.refName, coord: p2 })
97
+ const ra1 = assembly.getCanonicalRefName(k1.refName)
98
+ const ra2 = assembly.getCanonicalRefName(k2.refName)
99
+ const r1 = view.bpToPx({ refName: ra1, coord: p1 })
100
+ const r2 = view.bpToPx({ refName: ra2, coord: p2 })
74
101
 
75
102
  if (r1 && r2) {
76
103
  const radius = (r2.offsetPx - r1.offsetPx) / 2
77
104
  const absrad = Math.abs(radius)
78
105
  const p = r1.offsetPx - view.offsetPx
106
+ const p2 = r2.offsetPx - view.offsetPx
79
107
 
80
108
  // bezier (used for non-long-range arcs) requires moveTo before beginPath
81
109
  // arc (used for long-range) requires moveTo after beginPath (or else a
@@ -99,9 +127,7 @@ export default async function drawFeats(
99
127
  } else if (type === 'insertSize') {
100
128
  ctx.strokeStyle = getInsertSizeColor(k1, k2, stats) || 'grey'
101
129
  } else if (type === 'gradient') {
102
- ctx.strokeStyle = `hsl(${
103
- Math.log10(Math.abs(p1 - p2)) * 10
104
- },50%,50%)`
130
+ ctx.strokeStyle = `hsl(${Math.log10(absrad) * 10},50%,50%)`
105
131
  }
106
132
  } else {
107
133
  if (type === 'orientation' || type === 'insertSizeAndOrientation') {
@@ -113,53 +139,55 @@ export default async function drawFeats(
113
139
  ctx.strokeStyle = 'grey'
114
140
  }
115
141
  } else if (type === 'gradient') {
116
- ctx.strokeStyle = `hsl(${
117
- Math.log10(Math.abs(p1 - p2)) * 10
118
- },50%,50%)`
142
+ ctx.strokeStyle = `hsl(${Math.log10(absrad) * 10},50%,50%)`
119
143
  }
120
144
  }
121
145
  }
122
146
 
123
147
  const destX = p + radius * 2
124
- const destY = Math.min(displayHeight, absrad)
148
+ const destY = Math.min(height + jitter(jitterVal), absrad)
125
149
  if (longRange) {
126
- ctx.arc(p + radius, 0, absrad, 0, Math.PI)
150
+ // avoid drawing gigantic circles that glitch out the rendering,
151
+ // instead draw vertical lines
152
+ if (absrad > 100_000) {
153
+ drawLineAtOffset(p + jitter(jitterVal), 'red')
154
+ drawLineAtOffset(p2 + jitter(jitterVal), 'red')
155
+ } else {
156
+ ctx.arc(p + radius + jitter(jitterVal), 0, absrad, 0, Math.PI)
157
+ ctx.stroke()
158
+ }
127
159
  } else {
128
- ctx.bezierCurveTo(p, destY, destX, destY, destX, 0)
160
+ ctx.bezierCurveTo(
161
+ p + jitter(jitterVal),
162
+ destY,
163
+ destX,
164
+ destY,
165
+ destX + jitter(jitterVal),
166
+ 0,
167
+ )
168
+ ctx.stroke()
129
169
  }
130
- ctx.stroke()
131
- } else if (r1 && self.drawInter) {
132
- // draws a vertical line off to middle of nowhere if the second end not found
133
- const p = r1.offsetPx - view.offsetPx
134
- ctx.strokeStyle = 'purple'
135
- ctx.beginPath()
136
- ctx.moveTo(p, 0)
137
- ctx.lineTo(p, displayHeight)
138
- ctx.stroke()
170
+ } else if (r1 && drawInter) {
171
+ drawLineAtOffset(r1.offsetPx - view.offsetPx, 'purple')
139
172
  }
140
173
  }
141
174
 
142
175
  for (let i = 0; i < chains.length; i++) {
143
176
  let chain = chains[i]
144
-
145
- if (chain.length === 1 && self.drawLongRange) {
177
+ if (chain.length === 1 && drawLongRange) {
146
178
  // singleton feature
147
179
  const f = chain[0]
148
180
 
149
181
  // special case where we look at RPOS/RNEXT
150
182
  if (hasPaired) {
151
183
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
152
- const refName = asm?.getCanonicalRefName(f.next_ref!) || f.next_ref!
184
+ const refName = f.next_ref!
153
185
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
154
186
  const coord = f.next_pos!
155
187
  draw(
156
188
  f,
157
- {
158
- refName,
159
- start: coord,
160
- end: coord,
161
- strand: f.strand,
162
- },
189
+ { refName, start: coord, end: coord, strand: f.strand },
190
+ asm,
163
191
  true,
164
192
  )
165
193
  }
@@ -171,16 +199,7 @@ export default async function drawFeats(
171
199
  for (let i = 0; i < features.length - 1; i++) {
172
200
  const f = features[i]
173
201
  const v1 = features[i + 1]
174
- draw(
175
- f,
176
- {
177
- refName: asm?.getCanonicalRefName(v1.refName) || v1.refName,
178
- start: v1.start,
179
- end: v1.end,
180
- strand: v1.strand,
181
- },
182
- true,
183
- )
202
+ draw(f, v1, asm, true)
184
203
  }
185
204
  }
186
205
  } else {
@@ -192,7 +211,7 @@ export default async function drawFeats(
192
211
  chain = chain.filter(f => !(f.flags & 2048))
193
212
  }
194
213
  for (let i = 0; i < chain.length - 1; i++) {
195
- draw(chain[i], chain[i + 1], false)
214
+ draw(chain[i], chain[i + 1], asm, false)
196
215
  }
197
216
  }
198
217
  }