@jbrowse/plugin-alignments 1.6.7 → 1.7.0
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.
- package/dist/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js +216 -0
- package/dist/AlignmentsFeatureDetail/index.js +63 -0
- package/dist/AlignmentsFeatureDetail/index.test.js +60 -0
- package/dist/AlignmentsTrack/index.js +37 -0
- package/dist/BamAdapter/BamAdapter.js +598 -0
- package/dist/BamAdapter/BamAdapter.test.js +177 -0
- package/dist/BamAdapter/BamSlightlyLazyFeature.d.ts +1 -10
- package/dist/BamAdapter/BamSlightlyLazyFeature.js +176 -0
- package/dist/BamAdapter/MismatchParser.d.ts +3 -5
- package/dist/BamAdapter/MismatchParser.js +384 -0
- package/dist/BamAdapter/MismatchParser.test.js +259 -0
- package/dist/BamAdapter/configSchema.js +48 -0
- package/dist/BamAdapter/index.js +36 -0
- package/dist/CramAdapter/CramAdapter.js +660 -0
- package/dist/CramAdapter/CramAdapter.test.js +138 -0
- package/dist/CramAdapter/CramSlightlyLazyFeature.d.ts +1 -2
- package/dist/CramAdapter/CramSlightlyLazyFeature.js +447 -0
- package/dist/CramAdapter/CramTestAdapters.js +234 -0
- package/dist/CramAdapter/configSchema.js +40 -0
- package/dist/CramAdapter/index.js +36 -0
- package/dist/HtsgetBamAdapter/HtsgetBamAdapter.js +97 -0
- package/dist/HtsgetBamAdapter/configSchema.js +31 -0
- package/dist/HtsgetBamAdapter/index.js +42 -0
- package/dist/LinearAlignmentsDisplay/components/AlignmentsDisplay.js +69 -0
- package/dist/LinearAlignmentsDisplay/index.js +31 -0
- package/dist/LinearAlignmentsDisplay/models/configSchema.js +25 -0
- package/dist/LinearAlignmentsDisplay/models/configSchema.test.js +83 -0
- package/dist/LinearAlignmentsDisplay/models/model.js +250 -0
- package/dist/LinearPileupDisplay/components/ColorByModifications.js +123 -0
- package/dist/LinearPileupDisplay/components/ColorByTag.js +98 -0
- package/dist/LinearPileupDisplay/components/FilterByTag.js +203 -0
- package/dist/LinearPileupDisplay/components/LinearPileupDisplayBlurb.js +32 -0
- package/dist/LinearPileupDisplay/components/SetFeatureHeight.js +99 -0
- package/dist/LinearPileupDisplay/components/SetMaxHeight.js +90 -0
- package/dist/LinearPileupDisplay/components/SortByTag.js +95 -0
- package/dist/LinearPileupDisplay/configSchema.js +47 -0
- package/dist/LinearPileupDisplay/configSchema.test.js +92 -0
- package/dist/LinearPileupDisplay/index.js +30 -0
- package/dist/LinearPileupDisplay/model.js +602 -0
- package/dist/LinearSNPCoverageDisplay/components/Tooltip.js +63 -0
- package/dist/LinearSNPCoverageDisplay/index.js +30 -0
- package/dist/LinearSNPCoverageDisplay/models/configSchema.js +57 -0
- package/dist/LinearSNPCoverageDisplay/models/configSchema.test.js +62 -0
- package/dist/LinearSNPCoverageDisplay/models/model.d.ts +2 -2
- package/dist/LinearSNPCoverageDisplay/models/model.js +237 -0
- package/dist/NestedFrequencyTable.js +152 -0
- package/dist/PileupRPC/rpcMethods.js +285 -0
- package/dist/PileupRenderer/PileupLayoutSession.js +79 -0
- package/dist/PileupRenderer/PileupRenderer.d.ts +20 -6
- package/dist/PileupRenderer/PileupRenderer.js +1220 -0
- package/dist/PileupRenderer/components/PileupRendering.js +270 -0
- package/dist/PileupRenderer/components/PileupRendering.test.js +36 -0
- package/dist/PileupRenderer/configSchema.js +72 -0
- package/dist/PileupRenderer/index.js +25 -0
- package/dist/PileupRenderer/sortUtil.js +112 -0
- package/dist/SNPCoverageAdapter/SNPCoverageAdapter.d.ts +3 -11
- package/dist/SNPCoverageAdapter/SNPCoverageAdapter.js +606 -0
- package/dist/SNPCoverageAdapter/configSchema.js +22 -0
- package/dist/SNPCoverageAdapter/index.js +45 -0
- package/dist/SNPCoverageRenderer/SNPCoverageRenderer.js +296 -0
- package/dist/SNPCoverageRenderer/configSchema.js +40 -0
- package/dist/SNPCoverageRenderer/index.js +34 -0
- package/dist/declare.d.js +1 -0
- package/dist/index.js +154 -6
- package/dist/index.test.js +26 -0
- package/dist/plugin-alignments.cjs.development.js +591 -552
- package/dist/plugin-alignments.cjs.development.js.map +1 -1
- package/dist/plugin-alignments.cjs.production.min.js +1 -1
- package/dist/plugin-alignments.cjs.production.min.js.map +1 -1
- package/dist/plugin-alignments.esm.js +594 -555
- package/dist/plugin-alignments.esm.js.map +1 -1
- package/dist/shared.js +96 -0
- package/dist/util.d.ts +4 -0
- package/dist/util.js +135 -0
- package/package.json +5 -9
- package/src/BamAdapter/BamAdapter.ts +45 -15
- package/src/BamAdapter/BamSlightlyLazyFeature.ts +11 -79
- package/src/BamAdapter/MismatchParser.test.ts +53 -297
- package/src/BamAdapter/MismatchParser.ts +54 -116
- package/src/BamAdapter/configSchema.ts +0 -4
- package/src/CramAdapter/CramAdapter.ts +42 -15
- package/src/CramAdapter/CramSlightlyLazyFeature.ts +3 -10
- package/src/LinearPileupDisplay/components/ColorByModifications.tsx +76 -80
- package/src/LinearPileupDisplay/components/ColorByTag.tsx +24 -23
- package/src/LinearPileupDisplay/components/FilterByTag.tsx +73 -68
- package/src/LinearPileupDisplay/components/SetFeatureHeight.tsx +28 -26
- package/src/LinearPileupDisplay/components/SetMaxHeight.tsx +24 -13
- package/src/LinearPileupDisplay/components/SortByTag.tsx +29 -21
- package/src/LinearPileupDisplay/model.ts +8 -22
- package/src/LinearSNPCoverageDisplay/models/model.ts +6 -36
- package/src/PileupRenderer/PileupRenderer.tsx +178 -60
- package/src/SNPCoverageAdapter/SNPCoverageAdapter.ts +189 -244
- package/src/SNPCoverageRenderer/SNPCoverageRenderer.ts +12 -11
- package/src/util.ts +25 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports["default"] = void 0;
|
|
9
|
+
|
|
10
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
11
|
+
|
|
12
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
13
|
+
|
|
14
|
+
var _react = _interopRequireDefault(require("react"));
|
|
15
|
+
|
|
16
|
+
var _mobxReact = require("mobx-react");
|
|
17
|
+
|
|
18
|
+
var _pluginWiggle = require("@jbrowse/plugin-wiggle");
|
|
19
|
+
|
|
20
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
21
|
+
var en = function en(n) {
|
|
22
|
+
return n.toLocaleString('en-US');
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
var TooltipContents = /*#__PURE__*/_react["default"].forwardRef(function (_ref, ref) {
|
|
26
|
+
var feature = _ref.feature;
|
|
27
|
+
var start = feature.get('start');
|
|
28
|
+
var end = feature.get('end');
|
|
29
|
+
var name = feature.get('refName');
|
|
30
|
+
var info = feature.get('snpinfo');
|
|
31
|
+
var loc = [name, start === end ? en(start) : "".concat(en(start), "..").concat(en(end))].filter(function (f) {
|
|
32
|
+
return !!f;
|
|
33
|
+
}).join(':');
|
|
34
|
+
var total = info === null || info === void 0 ? void 0 : info.total;
|
|
35
|
+
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
36
|
+
ref: ref
|
|
37
|
+
}, /*#__PURE__*/_react["default"].createElement("table", null, /*#__PURE__*/_react["default"].createElement("caption", null, loc), /*#__PURE__*/_react["default"].createElement("thead", null, /*#__PURE__*/_react["default"].createElement("tr", null, /*#__PURE__*/_react["default"].createElement("th", null, "Base"), /*#__PURE__*/_react["default"].createElement("th", null, "Count"), /*#__PURE__*/_react["default"].createElement("th", null, "% of Total"), /*#__PURE__*/_react["default"].createElement("th", null, "Strands"), /*#__PURE__*/_react["default"].createElement("th", null, "Source"))), /*#__PURE__*/_react["default"].createElement("tbody", null, /*#__PURE__*/_react["default"].createElement("tr", null, /*#__PURE__*/_react["default"].createElement("td", null, "Total"), /*#__PURE__*/_react["default"].createElement("td", null, total), /*#__PURE__*/_react["default"].createElement("td", null)), Object.entries(info).map(function (_ref2) {
|
|
38
|
+
var _ref3 = (0, _slicedToArray2["default"])(_ref2, 2),
|
|
39
|
+
key = _ref3[0],
|
|
40
|
+
entry = _ref3[1];
|
|
41
|
+
|
|
42
|
+
return Object.entries(entry).map(function (_ref4) {
|
|
43
|
+
var _ref5 = (0, _slicedToArray2["default"])(_ref4, 2),
|
|
44
|
+
base = _ref5[0],
|
|
45
|
+
score = _ref5[1];
|
|
46
|
+
|
|
47
|
+
var strands = score.strands;
|
|
48
|
+
return /*#__PURE__*/_react["default"].createElement("tr", {
|
|
49
|
+
key: base
|
|
50
|
+
}, /*#__PURE__*/_react["default"].createElement("td", null, base.toUpperCase()), /*#__PURE__*/_react["default"].createElement("td", null, score.total), /*#__PURE__*/_react["default"].createElement("td", null, base === 'total' || base === 'skip' ? '---' : "".concat(Math.floor(score.total / (total || score.total || 1) * 100), "%")), /*#__PURE__*/_react["default"].createElement("td", null, strands['-1'] ? "".concat(strands['-1'], "(-)") : '', strands['1'] ? "".concat(strands['1'], "(+)") : ''), /*#__PURE__*/_react["default"].createElement("td", null, key));
|
|
51
|
+
});
|
|
52
|
+
}))));
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
var SNPCoverageTooltip = (0, _mobxReact.observer)(function (props) {
|
|
56
|
+
var model = props.model;
|
|
57
|
+
var feat = model.featureUnderMouse;
|
|
58
|
+
return feat && feat.get('type') === 'skip' ? null : /*#__PURE__*/_react["default"].createElement(_pluginWiggle.Tooltip, (0, _extends2["default"])({
|
|
59
|
+
TooltipContents: TooltipContents
|
|
60
|
+
}, props));
|
|
61
|
+
});
|
|
62
|
+
var _default = SNPCoverageTooltip;
|
|
63
|
+
exports["default"] = _default;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports["default"] = register;
|
|
9
|
+
|
|
10
|
+
var _configSchema = _interopRequireDefault(require("./models/configSchema"));
|
|
11
|
+
|
|
12
|
+
var _model = _interopRequireDefault(require("./models/model"));
|
|
13
|
+
|
|
14
|
+
var _pluginWiggle = require("@jbrowse/plugin-wiggle");
|
|
15
|
+
|
|
16
|
+
var _DisplayType = _interopRequireDefault(require("@jbrowse/core/pluggableElementTypes/DisplayType"));
|
|
17
|
+
|
|
18
|
+
function register(pluginManager) {
|
|
19
|
+
pluginManager.addDisplayType(function () {
|
|
20
|
+
var configSchema = (0, _configSchema["default"])(pluginManager);
|
|
21
|
+
return new _DisplayType["default"]({
|
|
22
|
+
name: 'LinearSNPCoverageDisplay',
|
|
23
|
+
configSchema: configSchema,
|
|
24
|
+
stateModel: (0, _model["default"])(pluginManager, configSchema),
|
|
25
|
+
trackType: 'AlignmentsTrack',
|
|
26
|
+
viewType: 'LinearGenomeView',
|
|
27
|
+
ReactComponent: _pluginWiggle.LinearWiggleDisplayReactComponent
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports["default"] = SNPCoverageConfigFactory;
|
|
7
|
+
|
|
8
|
+
var _configuration = require("@jbrowse/core/configuration");
|
|
9
|
+
|
|
10
|
+
var _pluginLinearGenomeView = require("@jbrowse/plugin-linear-genome-view");
|
|
11
|
+
|
|
12
|
+
var _mobxStateTree = require("mobx-state-tree");
|
|
13
|
+
|
|
14
|
+
function SNPCoverageConfigFactory(pluginManager) {
|
|
15
|
+
var SNPCoverageRendererConfigSchema = pluginManager.getRendererType('SNPCoverageRenderer').configSchema;
|
|
16
|
+
return (0, _configuration.ConfigurationSchema)('LinearSNPCoverageDisplay', {
|
|
17
|
+
autoscale: {
|
|
18
|
+
type: 'stringEnum',
|
|
19
|
+
defaultValue: 'local',
|
|
20
|
+
model: _mobxStateTree.types.enumeration('Autoscale type', ['local']),
|
|
21
|
+
description: 'performs local autoscaling (no other options for SNP Coverage available)'
|
|
22
|
+
},
|
|
23
|
+
minScore: {
|
|
24
|
+
type: 'number',
|
|
25
|
+
defaultValue: Number.MIN_VALUE,
|
|
26
|
+
description: 'minimum value for the y-scale'
|
|
27
|
+
},
|
|
28
|
+
maxScore: {
|
|
29
|
+
type: 'number',
|
|
30
|
+
description: 'maximum value for the y-scale',
|
|
31
|
+
defaultValue: Number.MAX_VALUE
|
|
32
|
+
},
|
|
33
|
+
scaleType: {
|
|
34
|
+
type: 'stringEnum',
|
|
35
|
+
model: _mobxStateTree.types.enumeration('Scale type', ['linear', 'log']),
|
|
36
|
+
// todo zscale
|
|
37
|
+
description: 'The type of scale to use',
|
|
38
|
+
defaultValue: 'linear'
|
|
39
|
+
},
|
|
40
|
+
inverted: {
|
|
41
|
+
type: 'boolean',
|
|
42
|
+
description: 'draw upside down',
|
|
43
|
+
defaultValue: false
|
|
44
|
+
},
|
|
45
|
+
multiTicks: {
|
|
46
|
+
type: 'boolean',
|
|
47
|
+
description: 'Display multiple values for the ticks',
|
|
48
|
+
defaultValue: false
|
|
49
|
+
},
|
|
50
|
+
renderers: (0, _configuration.ConfigurationSchema)('RenderersConfiguration', {
|
|
51
|
+
SNPCoverageRenderer: SNPCoverageRendererConfigSchema
|
|
52
|
+
})
|
|
53
|
+
}, {
|
|
54
|
+
baseConfiguration: _pluginLinearGenomeView.baseLinearDisplayConfigSchema,
|
|
55
|
+
explicitlyTyped: true
|
|
56
|
+
});
|
|
57
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
6
|
+
|
|
7
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
8
|
+
|
|
9
|
+
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
|
|
10
|
+
|
|
11
|
+
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
|
|
12
|
+
|
|
13
|
+
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
|
|
14
|
+
|
|
15
|
+
var _Plugin2 = _interopRequireDefault(require("@jbrowse/core/Plugin"));
|
|
16
|
+
|
|
17
|
+
var _PluginManager = _interopRequireDefault(require("@jbrowse/core/PluginManager"));
|
|
18
|
+
|
|
19
|
+
var _SNPCoverageRenderer = _interopRequireDefault(require("../../SNPCoverageRenderer"));
|
|
20
|
+
|
|
21
|
+
var _configSchema = _interopRequireDefault(require("./configSchema"));
|
|
22
|
+
|
|
23
|
+
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
|
|
24
|
+
|
|
25
|
+
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
|
|
26
|
+
|
|
27
|
+
// mock warnings to avoid unnecessary outputs
|
|
28
|
+
beforeEach(function () {
|
|
29
|
+
jest.spyOn(console, 'warn').mockImplementation(function () {});
|
|
30
|
+
});
|
|
31
|
+
afterEach(function () {
|
|
32
|
+
console.warn.mockRestore();
|
|
33
|
+
}); // change renderer
|
|
34
|
+
|
|
35
|
+
var SNPCoverageRendererPlugin = /*#__PURE__*/function (_Plugin) {
|
|
36
|
+
(0, _inherits2["default"])(SNPCoverageRendererPlugin, _Plugin);
|
|
37
|
+
|
|
38
|
+
var _super = _createSuper(SNPCoverageRendererPlugin);
|
|
39
|
+
|
|
40
|
+
function SNPCoverageRendererPlugin() {
|
|
41
|
+
(0, _classCallCheck2["default"])(this, SNPCoverageRendererPlugin);
|
|
42
|
+
return _super.apply(this, arguments);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
(0, _createClass2["default"])(SNPCoverageRendererPlugin, [{
|
|
46
|
+
key: "install",
|
|
47
|
+
value: function install(pluginManager) {
|
|
48
|
+
(0, _SNPCoverageRenderer["default"])(pluginManager);
|
|
49
|
+
}
|
|
50
|
+
}]);
|
|
51
|
+
return SNPCoverageRendererPlugin;
|
|
52
|
+
}(_Plugin2["default"]);
|
|
53
|
+
|
|
54
|
+
test('has a type attr', function () {
|
|
55
|
+
var configSchema = (0, _configSchema["default"])(new _PluginManager["default"]([new SNPCoverageRendererPlugin()]).createPluggableElements().configure());
|
|
56
|
+
var config = configSchema.create({
|
|
57
|
+
type: 'LinearSNPCoverageDisplay',
|
|
58
|
+
displayId: 'display1',
|
|
59
|
+
name: 'SNPZonker Display'
|
|
60
|
+
});
|
|
61
|
+
expect(config.type).toEqual('LinearSNPCoverageDisplay');
|
|
62
|
+
});
|
|
@@ -26,7 +26,7 @@ declare const stateModelFactory: (pluginManager: PluginManager, configSchema: An
|
|
|
26
26
|
renderInProgress: AbortController | undefined;
|
|
27
27
|
filled: boolean;
|
|
28
28
|
reactElement: import("react").ReactElement<any, string | ((props: any) => import("react").ReactElement<any, any> | null) | (new (props: any) => import("react").Component<any, any, any>)> | undefined;
|
|
29
|
-
features: Map<string, import("@jbrowse/core/util
|
|
29
|
+
features: Map<string, import("@jbrowse/core/util").Feature> | undefined;
|
|
30
30
|
layout: any;
|
|
31
31
|
status: string;
|
|
32
32
|
error: unknown;
|
|
@@ -44,7 +44,7 @@ declare const stateModelFactory: (pluginManager: PluginManager, configSchema: An
|
|
|
44
44
|
setMessage(messageText: string): void;
|
|
45
45
|
setRendered(props: {
|
|
46
46
|
reactElement: import("react").ReactElement<any, string | ((props: any) => import("react").ReactElement<any, any> | null) | (new (props: any) => import("react").Component<any, any, any>)>;
|
|
47
|
-
features: Map<string, import("@jbrowse/core/util
|
|
47
|
+
features: Map<string, import("@jbrowse/core/util").Feature>;
|
|
48
48
|
layout: any;
|
|
49
49
|
maxHeightReached: boolean;
|
|
50
50
|
renderProps: any;
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports["default"] = void 0;
|
|
9
|
+
|
|
10
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
11
|
+
|
|
12
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
13
|
+
|
|
14
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
15
|
+
|
|
16
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
17
|
+
|
|
18
|
+
var _mobxStateTree = require("mobx-state-tree");
|
|
19
|
+
|
|
20
|
+
var _mobx = require("mobx");
|
|
21
|
+
|
|
22
|
+
var _configuration = require("@jbrowse/core/configuration");
|
|
23
|
+
|
|
24
|
+
var _pluginWiggle = require("@jbrowse/plugin-wiggle");
|
|
25
|
+
|
|
26
|
+
var _util = require("@jbrowse/core/util");
|
|
27
|
+
|
|
28
|
+
var _Tooltip = _interopRequireDefault(require("../components/Tooltip"));
|
|
29
|
+
|
|
30
|
+
var _shared = require("../../shared");
|
|
31
|
+
|
|
32
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
33
|
+
|
|
34
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
35
|
+
|
|
36
|
+
// using a map because it preserves order
|
|
37
|
+
var rendererTypes = new Map([['snpcoverage', 'SNPCoverageRenderer']]);
|
|
38
|
+
|
|
39
|
+
var stateModelFactory = function stateModelFactory(pluginManager, configSchema) {
|
|
40
|
+
return _mobxStateTree.types.compose('LinearSNPCoverageDisplay', (0, _pluginWiggle.linearWiggleDisplayModelFactory)(pluginManager, configSchema), _mobxStateTree.types.model({
|
|
41
|
+
type: _mobxStateTree.types.literal('LinearSNPCoverageDisplay'),
|
|
42
|
+
drawInterbaseCounts: _mobxStateTree.types.maybe(_mobxStateTree.types["boolean"]),
|
|
43
|
+
drawIndicators: _mobxStateTree.types.maybe(_mobxStateTree.types["boolean"]),
|
|
44
|
+
drawArcs: _mobxStateTree.types.maybe(_mobxStateTree.types["boolean"]),
|
|
45
|
+
filterBy: _mobxStateTree.types.optional(_mobxStateTree.types.model({
|
|
46
|
+
flagInclude: _mobxStateTree.types.optional(_mobxStateTree.types.number, 0),
|
|
47
|
+
flagExclude: _mobxStateTree.types.optional(_mobxStateTree.types.number, 1540),
|
|
48
|
+
readName: _mobxStateTree.types.maybe(_mobxStateTree.types.string),
|
|
49
|
+
tagFilter: _mobxStateTree.types.maybe(_mobxStateTree.types.model({
|
|
50
|
+
tag: _mobxStateTree.types.string,
|
|
51
|
+
value: _mobxStateTree.types.string
|
|
52
|
+
}))
|
|
53
|
+
}), {}),
|
|
54
|
+
colorBy: _mobxStateTree.types.maybe(_mobxStateTree.types.model({
|
|
55
|
+
type: _mobxStateTree.types.string,
|
|
56
|
+
tag: _mobxStateTree.types.maybe(_mobxStateTree.types.string)
|
|
57
|
+
}))
|
|
58
|
+
}))["volatile"](function () {
|
|
59
|
+
return {
|
|
60
|
+
modificationTagMap: _mobx.observable.map({})
|
|
61
|
+
};
|
|
62
|
+
}).actions(function (self) {
|
|
63
|
+
return {
|
|
64
|
+
setConfig: function setConfig(configuration) {
|
|
65
|
+
self.configuration = configuration;
|
|
66
|
+
},
|
|
67
|
+
setFilterBy: function setFilterBy(filter) {
|
|
68
|
+
self.filterBy = (0, _mobxStateTree.cast)(filter);
|
|
69
|
+
},
|
|
70
|
+
setColorBy: function setColorBy(colorBy) {
|
|
71
|
+
self.colorBy = (0, _mobxStateTree.cast)(colorBy);
|
|
72
|
+
},
|
|
73
|
+
updateModificationColorMap: function updateModificationColorMap(uniqueModifications) {
|
|
74
|
+
var colorPalette = ['red', 'blue', 'green', 'orange', 'purple'];
|
|
75
|
+
var i = 0;
|
|
76
|
+
uniqueModifications.forEach(function (value) {
|
|
77
|
+
if (!self.modificationTagMap.has(value)) {
|
|
78
|
+
var newColor = colorPalette[i++];
|
|
79
|
+
self.modificationTagMap.set(value, newColor);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
}).views(function (self) {
|
|
85
|
+
var superRenderProps = self.renderProps;
|
|
86
|
+
return {
|
|
87
|
+
get rendererConfig() {
|
|
88
|
+
var configBlob = (0, _configuration.getConf)(self, ['renderers', self.rendererTypeName]) || {};
|
|
89
|
+
return self.rendererType.configSchema.create(_objectSpread(_objectSpread({}, configBlob), {}, {
|
|
90
|
+
drawInterbaseCounts: self.drawInterbaseCounts === undefined ? configBlob.drawInterbaseCounts : self.drawInterbaseCounts,
|
|
91
|
+
drawIndicators: self.drawIndicators === undefined ? configBlob.drawIndicators : self.drawIndicators,
|
|
92
|
+
drawArcs: self.drawArcs === undefined ? configBlob.drawArcs : self.drawArcs
|
|
93
|
+
}), (0, _mobxStateTree.getEnv)(self));
|
|
94
|
+
},
|
|
95
|
+
|
|
96
|
+
get drawArcsSetting() {
|
|
97
|
+
return self.drawArcs !== undefined ? self.drawArcs : (0, _configuration.readConfObject)(this.rendererConfig, 'drawArcs');
|
|
98
|
+
},
|
|
99
|
+
|
|
100
|
+
get drawInterbaseCountsSetting() {
|
|
101
|
+
return self.drawInterbaseCounts !== undefined ? self.drawInterbaseCounts : (0, _configuration.readConfObject)(this.rendererConfig, 'drawInterbaseCounts');
|
|
102
|
+
},
|
|
103
|
+
|
|
104
|
+
get drawIndicatorsSetting() {
|
|
105
|
+
return self.drawIndicators !== undefined ? self.drawIndicators : (0, _configuration.readConfObject)(this.rendererConfig, 'drawIndicators');
|
|
106
|
+
},
|
|
107
|
+
|
|
108
|
+
get modificationsReady() {
|
|
109
|
+
var _self$colorBy;
|
|
110
|
+
|
|
111
|
+
return ((_self$colorBy = self.colorBy) === null || _self$colorBy === void 0 ? void 0 : _self$colorBy.type) === 'modifications' ? Object.keys(JSON.parse(JSON.stringify(self.modificationTagMap))).length > 0 : true;
|
|
112
|
+
},
|
|
113
|
+
|
|
114
|
+
renderProps: function renderProps() {
|
|
115
|
+
var superProps = superRenderProps();
|
|
116
|
+
return _objectSpread(_objectSpread({}, superProps), {}, {
|
|
117
|
+
notReady: superProps.notReady || !this.modificationsReady,
|
|
118
|
+
modificationTagMap: JSON.parse(JSON.stringify(self.modificationTagMap)),
|
|
119
|
+
// must use getSnapshot because otherwise changes to e.g. just the
|
|
120
|
+
// colorBy.type are not read
|
|
121
|
+
colorBy: self.colorBy ? (0, _mobxStateTree.getSnapshot)(self.colorBy) : undefined,
|
|
122
|
+
filterBy: self.filterBy
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
}).actions(function (self) {
|
|
127
|
+
return {
|
|
128
|
+
toggleDrawIndicators: function toggleDrawIndicators() {
|
|
129
|
+
self.drawIndicators = !self.drawIndicatorsSetting;
|
|
130
|
+
},
|
|
131
|
+
toggleDrawInterbaseCounts: function toggleDrawInterbaseCounts() {
|
|
132
|
+
self.drawInterbaseCounts = !self.drawInterbaseCountsSetting;
|
|
133
|
+
},
|
|
134
|
+
toggleDrawArcs: function toggleDrawArcs() {
|
|
135
|
+
self.drawArcs = !self.drawArcsSetting;
|
|
136
|
+
},
|
|
137
|
+
afterAttach: function afterAttach() {
|
|
138
|
+
(0, _mobxStateTree.addDisposer)(self, (0, _mobx.autorun)( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
|
|
139
|
+
var colorBy, _ref2, staticBlocks, vals;
|
|
140
|
+
|
|
141
|
+
return _regenerator["default"].wrap(function _callee$(_context) {
|
|
142
|
+
while (1) {
|
|
143
|
+
switch (_context.prev = _context.next) {
|
|
144
|
+
case 0:
|
|
145
|
+
_context.prev = 0;
|
|
146
|
+
colorBy = self.colorBy;
|
|
147
|
+
_ref2 = (0, _util.getContainingView)(self), staticBlocks = _ref2.staticBlocks;
|
|
148
|
+
|
|
149
|
+
if (!((colorBy === null || colorBy === void 0 ? void 0 : colorBy.type) === 'modifications')) {
|
|
150
|
+
_context.next = 8;
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
_context.next = 6;
|
|
155
|
+
return (0, _shared.getUniqueModificationValues)(self, (0, _configuration.getConf)(self.parentTrack, 'adapter'), colorBy, staticBlocks);
|
|
156
|
+
|
|
157
|
+
case 6:
|
|
158
|
+
vals = _context.sent;
|
|
159
|
+
self.updateModificationColorMap(vals);
|
|
160
|
+
|
|
161
|
+
case 8:
|
|
162
|
+
_context.next = 14;
|
|
163
|
+
break;
|
|
164
|
+
|
|
165
|
+
case 10:
|
|
166
|
+
_context.prev = 10;
|
|
167
|
+
_context.t0 = _context["catch"](0);
|
|
168
|
+
console.error(_context.t0);
|
|
169
|
+
self.setError(_context.t0);
|
|
170
|
+
|
|
171
|
+
case 14:
|
|
172
|
+
case "end":
|
|
173
|
+
return _context.stop();
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}, _callee, null, [[0, 10]]);
|
|
177
|
+
})), {
|
|
178
|
+
delay: 1000
|
|
179
|
+
}));
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
}).views(function (self) {
|
|
183
|
+
var superTrackMenuItems = self.trackMenuItems;
|
|
184
|
+
return {
|
|
185
|
+
get TooltipComponent() {
|
|
186
|
+
return _Tooltip["default"];
|
|
187
|
+
},
|
|
188
|
+
|
|
189
|
+
get adapterConfig() {
|
|
190
|
+
var subadapter = (0, _configuration.getConf)(self.parentTrack, 'adapter');
|
|
191
|
+
return {
|
|
192
|
+
type: 'SNPCoverageAdapter',
|
|
193
|
+
subadapter: subadapter
|
|
194
|
+
};
|
|
195
|
+
},
|
|
196
|
+
|
|
197
|
+
get rendererTypeName() {
|
|
198
|
+
return rendererTypes.get('snpcoverage');
|
|
199
|
+
},
|
|
200
|
+
|
|
201
|
+
get needsScalebar() {
|
|
202
|
+
return true;
|
|
203
|
+
},
|
|
204
|
+
|
|
205
|
+
contextMenuItems: function contextMenuItems() {
|
|
206
|
+
return [];
|
|
207
|
+
},
|
|
208
|
+
trackMenuItems: function trackMenuItems() {
|
|
209
|
+
return [].concat((0, _toConsumableArray2["default"])(superTrackMenuItems()), [{
|
|
210
|
+
label: 'Draw insertion/clipping indicators',
|
|
211
|
+
type: 'checkbox',
|
|
212
|
+
checked: self.drawIndicatorsSetting,
|
|
213
|
+
onClick: function onClick() {
|
|
214
|
+
self.toggleDrawIndicators();
|
|
215
|
+
}
|
|
216
|
+
}, {
|
|
217
|
+
label: 'Draw insertion/clipping counts',
|
|
218
|
+
type: 'checkbox',
|
|
219
|
+
checked: self.drawInterbaseCountsSetting,
|
|
220
|
+
onClick: function onClick() {
|
|
221
|
+
self.toggleDrawInterbaseCounts();
|
|
222
|
+
}
|
|
223
|
+
}, {
|
|
224
|
+
label: 'Draw arcs',
|
|
225
|
+
type: 'checkbox',
|
|
226
|
+
checked: self.drawArcsSetting,
|
|
227
|
+
onClick: function onClick() {
|
|
228
|
+
self.toggleDrawArcs();
|
|
229
|
+
}
|
|
230
|
+
}]);
|
|
231
|
+
}
|
|
232
|
+
};
|
|
233
|
+
});
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
var _default = stateModelFactory;
|
|
237
|
+
exports["default"] = _default;
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports["default"] = void 0;
|
|
9
|
+
|
|
10
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
11
|
+
|
|
12
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
13
|
+
|
|
14
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
15
|
+
|
|
16
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
17
|
+
|
|
18
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
19
|
+
|
|
20
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
21
|
+
// see perf results on object.keys vs for-in loop
|
|
22
|
+
// https://jsperf.com/object-keys-vs-hasownproperty/55
|
|
23
|
+
var NestedFrequencyTable = /*#__PURE__*/function () {
|
|
24
|
+
function NestedFrequencyTable() {
|
|
25
|
+
var initialData = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
26
|
+
(0, _classCallCheck2["default"])(this, NestedFrequencyTable);
|
|
27
|
+
(0, _defineProperty2["default"])(this, "categories", void 0);
|
|
28
|
+
this.categories = _objectSpread({}, initialData);
|
|
29
|
+
} // get the sum of all the category counts
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
(0, _createClass2["default"])(NestedFrequencyTable, [{
|
|
33
|
+
key: "total",
|
|
34
|
+
value: function total() {
|
|
35
|
+
// calculate total if necessary
|
|
36
|
+
var t = 0;
|
|
37
|
+
|
|
38
|
+
for (var k in this.categories) {
|
|
39
|
+
var v = this.categories[k];
|
|
40
|
+
t += v.total ? v.total() : v;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return t;
|
|
44
|
+
} // decrement the count for the given category
|
|
45
|
+
|
|
46
|
+
}, {
|
|
47
|
+
key: "decrement",
|
|
48
|
+
value: function decrement(slotName, amount) {
|
|
49
|
+
if (!amount) {
|
|
50
|
+
amount = 1;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (!slotName) {
|
|
54
|
+
slotName = 'default';
|
|
55
|
+
} else {
|
|
56
|
+
slotName = slotName.toString();
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (this.categories[slotName]) {
|
|
60
|
+
this.categories[slotName] = Math.max(0, this.categories[slotName] - amount);
|
|
61
|
+
return this.categories[slotName];
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return 0;
|
|
65
|
+
} // increment the count for the given category
|
|
66
|
+
|
|
67
|
+
}, {
|
|
68
|
+
key: "increment",
|
|
69
|
+
value: function increment(slotName, amount) {
|
|
70
|
+
if (!amount) {
|
|
71
|
+
amount = 1;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (!slotName) {
|
|
75
|
+
slotName = 'default';
|
|
76
|
+
} else {
|
|
77
|
+
slotName = slotName.toString();
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
this.categories[slotName] = (this.categories[slotName] || 0) + amount;
|
|
81
|
+
return this.categories[slotName];
|
|
82
|
+
} // get the value of the given category. may be a number or a
|
|
83
|
+
// frequency table.
|
|
84
|
+
|
|
85
|
+
}, {
|
|
86
|
+
key: "get",
|
|
87
|
+
value: function get(slotName) {
|
|
88
|
+
return this.categories[slotName] || 0;
|
|
89
|
+
} // get a given category as a frequency table
|
|
90
|
+
|
|
91
|
+
}, {
|
|
92
|
+
key: "getNested",
|
|
93
|
+
value: function getNested(path) {
|
|
94
|
+
if (typeof path === 'string') {
|
|
95
|
+
path = path.split('/');
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (!path.length) {
|
|
99
|
+
return this;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
var slotName = path[0].toString();
|
|
103
|
+
var slot = this.categories[slotName];
|
|
104
|
+
|
|
105
|
+
if (!slot || !slot.categories) {
|
|
106
|
+
this.categories[slotName] = new NestedFrequencyTable(slot ? {
|
|
107
|
+
"default": slot + 0
|
|
108
|
+
} : {});
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
slot = this.categories[slotName];
|
|
112
|
+
|
|
113
|
+
if (path.length > 1) {
|
|
114
|
+
return slot.getNested(path.slice(1));
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return slot;
|
|
118
|
+
}
|
|
119
|
+
}, {
|
|
120
|
+
key: "toString",
|
|
121
|
+
value: function toString() {
|
|
122
|
+
return this.total().toPrecision(6).toString().replace(/\.?0+$/, '');
|
|
123
|
+
}
|
|
124
|
+
}, {
|
|
125
|
+
key: "valueOf",
|
|
126
|
+
value: function valueOf() {
|
|
127
|
+
return this.total();
|
|
128
|
+
} // iterate through the categories and counts, call like:
|
|
129
|
+
//
|
|
130
|
+
// tbl.forEach( function( count, categoryName ) {
|
|
131
|
+
// // do something
|
|
132
|
+
// }, this );
|
|
133
|
+
//
|
|
134
|
+
|
|
135
|
+
}, {
|
|
136
|
+
key: "forEach",
|
|
137
|
+
value: function forEach(func, ctx) {
|
|
138
|
+
if (ctx) {
|
|
139
|
+
for (var slotName in this.categories) {
|
|
140
|
+
func.call(ctx, this.categories[slotName], slotName);
|
|
141
|
+
}
|
|
142
|
+
} else {
|
|
143
|
+
for (var _slotName in this.categories) {
|
|
144
|
+
func(this.categories[_slotName], _slotName);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}]);
|
|
149
|
+
return NestedFrequencyTable;
|
|
150
|
+
}();
|
|
151
|
+
|
|
152
|
+
exports["default"] = NestedFrequencyTable;
|