igv 2.15.2 → 2.15.4
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/README.md +10 -10
- package/dist/igv.esm.js +381 -332
- package/dist/igv.esm.min.js +6 -6
- package/dist/igv.esm.min.js.map +1 -1
- package/dist/igv.js +381 -332
- package/dist/igv.min.js +6 -6
- package/dist/igv.min.js.map +1 -1
- package/package.json +3 -4
package/dist/igv.js
CHANGED
|
@@ -18366,7 +18366,7 @@
|
|
|
18366
18366
|
|
|
18367
18367
|
function getScopeForURL(url) {
|
|
18368
18368
|
if (isGoogleDriveURL(url)) {
|
|
18369
|
-
return "https://www.googleapis.com/auth/drive.
|
|
18369
|
+
return "https://www.googleapis.com/auth/drive.readonly"
|
|
18370
18370
|
} else if (isGoogleStorageURL(url)) {
|
|
18371
18371
|
return "https://www.googleapis.com/auth/devstorage.read_only"
|
|
18372
18372
|
} else {
|
|
@@ -18395,7 +18395,8 @@
|
|
|
18395
18395
|
const response = await fetch(endPoint);
|
|
18396
18396
|
let json = await response.json();
|
|
18397
18397
|
if (json.error && json.error.code === 404) {
|
|
18398
|
-
|
|
18398
|
+
let scope = "https://www.googleapis.com/auth/drive.readonly";
|
|
18399
|
+
const access_token = await getAccessToken(scope);
|
|
18399
18400
|
if (access_token) {
|
|
18400
18401
|
const response = await fetch(endPoint, {
|
|
18401
18402
|
headers: {
|
|
@@ -18876,29 +18877,41 @@
|
|
|
18876
18877
|
this.oauth.setToken(token, host);
|
|
18877
18878
|
}
|
|
18878
18879
|
|
|
18880
|
+
/**
|
|
18881
|
+
* Return an oauth token for the URL if we have one. This method does not force sign-in, and the token may
|
|
18882
|
+
* or may not be valid. Sign-in is triggered on request failure.
|
|
18883
|
+
* *
|
|
18884
|
+
* @param url
|
|
18885
|
+
* @returns {*}
|
|
18886
|
+
*/
|
|
18879
18887
|
getOauthToken(url) {
|
|
18880
18888
|
|
|
18881
18889
|
// Google is the default provider, don't try to parse host for google URLs
|
|
18882
18890
|
const host = isGoogleURL(url) ?
|
|
18883
18891
|
undefined :
|
|
18884
18892
|
parseUri(url).host;
|
|
18893
|
+
|
|
18894
|
+
// First check the explicit settings (i.e. token set through the API)
|
|
18885
18895
|
let token = this.oauth.getToken(host);
|
|
18886
18896
|
if (token) {
|
|
18887
18897
|
return token
|
|
18888
18898
|
} else if (host === undefined) {
|
|
18899
|
+
// Now try Google oauth tokens previously obtained. This will return undefined if google oauth is not
|
|
18900
|
+
// configured.
|
|
18889
18901
|
const googleToken = getCurrentGoogleAccessToken();
|
|
18890
18902
|
if (googleToken && googleToken.expires_at > Date.now()) {
|
|
18891
18903
|
return googleToken.access_token
|
|
18892
18904
|
}
|
|
18893
18905
|
}
|
|
18894
18906
|
}
|
|
18895
|
-
|
|
18896
18907
|
}
|
|
18897
18908
|
|
|
18898
18909
|
function isGoogleStorageSigned(url) {
|
|
18899
18910
|
return url.indexOf("X-Goog-Signature") > -1
|
|
18900
18911
|
}
|
|
18901
18912
|
|
|
18913
|
+
|
|
18914
|
+
|
|
18902
18915
|
/**
|
|
18903
18916
|
* Return a Google oAuth token, triggering a sign in if required. This method should not be called until we know
|
|
18904
18917
|
* a token is required, that is until we've tried the url and received a 401, 403, or 404.
|
|
@@ -23937,7 +23950,7 @@
|
|
|
23937
23950
|
}
|
|
23938
23951
|
};
|
|
23939
23952
|
|
|
23940
|
-
const _version = "2.15.
|
|
23953
|
+
const _version = "2.15.4";
|
|
23941
23954
|
function version() {
|
|
23942
23955
|
return _version
|
|
23943
23956
|
}
|
|
@@ -23989,7 +24002,7 @@
|
|
|
23989
24002
|
|
|
23990
24003
|
// Delay loading cytbands untils after genome initialization to use chromosome aliases (1 vs chr1, etc).
|
|
23991
24004
|
if (cytobandUrl) {
|
|
23992
|
-
genome.cytobands
|
|
24005
|
+
genome.cytobands = await loadCytobands(cytobandUrl, sequence.config, genome);
|
|
23993
24006
|
}
|
|
23994
24007
|
|
|
23995
24008
|
return genome
|
|
@@ -24091,7 +24104,7 @@
|
|
|
24091
24104
|
this.sequence = sequence;
|
|
24092
24105
|
this.chromosomeNames = sequence.chromosomeNames;
|
|
24093
24106
|
this.chromosomes = sequence.chromosomes; // An object (functions as a dictionary)
|
|
24094
|
-
this.featureDB =
|
|
24107
|
+
this.featureDB = new Map(); // Hash of name -> feature, used for search function.
|
|
24095
24108
|
|
|
24096
24109
|
this.wholeGenomeView = config.wholeGenomeView === undefined || config.wholeGenomeView;
|
|
24097
24110
|
if (this.wholeGenomeView && Object.keys(sequence.chromosomes).length > 1) {
|
|
@@ -24295,6 +24308,40 @@
|
|
|
24295
24308
|
chr = this.getChromosomeName(chr);
|
|
24296
24309
|
return this.sequence.getSequence(chr, start, end)
|
|
24297
24310
|
}
|
|
24311
|
+
|
|
24312
|
+
addFeaturesToDB(featureList, config) {
|
|
24313
|
+
|
|
24314
|
+
const insertFeature = (name, feature) => {
|
|
24315
|
+
const current = this.featureDB.get(name);
|
|
24316
|
+
if (current) {
|
|
24317
|
+
feature = (feature.end - feature.start) > (current.end - current.start) ? feature : current;
|
|
24318
|
+
|
|
24319
|
+
}
|
|
24320
|
+
this.featureDB.set(name, feature);
|
|
24321
|
+
};
|
|
24322
|
+
|
|
24323
|
+
for (let feature of featureList) {
|
|
24324
|
+
if (feature.name) {
|
|
24325
|
+
insertFeature(feature.name.toUpperCase(), feature);
|
|
24326
|
+
}
|
|
24327
|
+
if (feature.gene && feature.gene.name) {
|
|
24328
|
+
insertFeature(feature.gene.name.toUpperCase(), feature);
|
|
24329
|
+
}
|
|
24330
|
+
|
|
24331
|
+
if (config.searchableFields) {
|
|
24332
|
+
for (let f of config.searchableFields) {
|
|
24333
|
+
const value = feature.getAttributeValue(f);
|
|
24334
|
+
if (value) {
|
|
24335
|
+
if (value.indexOf(" ") > 0) {
|
|
24336
|
+
insertFeature(value.replaceAll(" ", "+").toUpperCase(), feature);
|
|
24337
|
+
} else {
|
|
24338
|
+
insertFeature(value.toUpperCase(), feature);
|
|
24339
|
+
}
|
|
24340
|
+
}
|
|
24341
|
+
}
|
|
24342
|
+
}
|
|
24343
|
+
}
|
|
24344
|
+
}
|
|
24298
24345
|
}
|
|
24299
24346
|
|
|
24300
24347
|
async function loadCytobands(cytobandUrl, config, genome) {
|
|
@@ -27022,8 +27069,6 @@
|
|
|
27022
27069
|
* THE SOFTWARE.
|
|
27023
27070
|
*/
|
|
27024
27071
|
|
|
27025
|
-
const DEFAULT_COLOR$1 = 'rgb(150,150,150)';
|
|
27026
|
-
|
|
27027
27072
|
const fixColor = (colorString) => {
|
|
27028
27073
|
if (isString$2(colorString)) {
|
|
27029
27074
|
return (colorString.indexOf(",") > 0 && !(colorString.startsWith("rgb(") || colorString.startsWith("rgba("))) ?
|
|
@@ -27042,6 +27087,15 @@
|
|
|
27042
27087
|
*/
|
|
27043
27088
|
class TrackBase {
|
|
27044
27089
|
|
|
27090
|
+
static defaults = {
|
|
27091
|
+
height: 50,
|
|
27092
|
+
color: 'rgb(0, 0, 150)',
|
|
27093
|
+
altColor: 'rgb(0, 0, 150)',
|
|
27094
|
+
autoHeight: false,
|
|
27095
|
+
visibilityWindow: undefined,
|
|
27096
|
+
supportHiDPI: true
|
|
27097
|
+
}
|
|
27098
|
+
|
|
27045
27099
|
constructor(config, browser) {
|
|
27046
27100
|
this.browser = browser;
|
|
27047
27101
|
this.init(config);
|
|
@@ -27055,15 +27109,25 @@
|
|
|
27055
27109
|
*/
|
|
27056
27110
|
init(config) {
|
|
27057
27111
|
|
|
27112
|
+
this.config = config;
|
|
27113
|
+
|
|
27058
27114
|
if (config.displayMode) {
|
|
27059
27115
|
config.displayMode = config.displayMode.toUpperCase();
|
|
27060
27116
|
}
|
|
27061
27117
|
|
|
27062
|
-
|
|
27063
|
-
|
|
27064
|
-
this.
|
|
27065
|
-
|
|
27066
|
-
|
|
27118
|
+
// Set default properties
|
|
27119
|
+
const defaults = Object.assign({}, TrackBase.defaults);
|
|
27120
|
+
if(this.constructor.defaults) {
|
|
27121
|
+
for(let key of Object.keys(this.constructor.defaults)) {
|
|
27122
|
+
defaults[key] = this.constructor.defaults[key];
|
|
27123
|
+
}
|
|
27124
|
+
}
|
|
27125
|
+
for(let key of Object.keys(defaults)) {
|
|
27126
|
+
this[key] = config.hasOwnProperty(key) ? config[key] : defaults[key];
|
|
27127
|
+
if(key === 'color' || key === 'altColor') {
|
|
27128
|
+
this[key] = fixColor(this[key]);
|
|
27129
|
+
}
|
|
27130
|
+
}
|
|
27067
27131
|
|
|
27068
27132
|
if (config.name || config.label) {
|
|
27069
27133
|
this.name = config.name || config.label;
|
|
@@ -27073,29 +27137,15 @@
|
|
|
27073
27137
|
this.name = getFilename$2(config.url);
|
|
27074
27138
|
}
|
|
27075
27139
|
|
|
27140
|
+
this.url = config.url;
|
|
27141
|
+
if(this.config.type) this.type = this.config.type;
|
|
27076
27142
|
this.id = this.config.id === undefined ? this.name : this.config.id;
|
|
27077
|
-
|
|
27078
27143
|
this.order = config.order;
|
|
27079
|
-
|
|
27080
|
-
if (config.color) this.color = fixColor(config.color);
|
|
27081
|
-
if (config.altColor) this.altColor = fixColor(config.altColor);
|
|
27082
|
-
if ("civic-ws" === config.sourceType) { // Ugly proxy for specialized track type
|
|
27083
|
-
this.defaultColor = "rgb(155,20,20)";
|
|
27084
|
-
} else {
|
|
27085
|
-
this.defaultColor = "rgb(0,0,150)";
|
|
27086
|
-
}
|
|
27087
|
-
|
|
27088
27144
|
this.autoscaleGroup = config.autoscaleGroup;
|
|
27089
|
-
|
|
27090
27145
|
this.removable = config.removable === undefined ? true : config.removable; // Defaults to true
|
|
27091
|
-
|
|
27092
|
-
this.height = config.height || 100;
|
|
27093
|
-
this.autoHeight = config.autoHeight;
|
|
27094
27146
|
this.minHeight = config.minHeight || Math.min(25, this.height);
|
|
27095
27147
|
this.maxHeight = config.maxHeight || Math.max(1000, this.height);
|
|
27096
27148
|
|
|
27097
|
-
this.visibilityWindow = config.visibilityWindow;
|
|
27098
|
-
|
|
27099
27149
|
if (config.onclick) {
|
|
27100
27150
|
this.onclick = config.onclick;
|
|
27101
27151
|
config.onclick = undefined; // functions cannot be saved in sessions, clear it here.
|
|
@@ -27152,17 +27202,18 @@
|
|
|
27152
27202
|
}
|
|
27153
27203
|
|
|
27154
27204
|
/**
|
|
27155
|
-
*
|
|
27156
|
-
*
|
|
27157
|
-
* current state. Only simple properties (string, number, boolean) are updated.
|
|
27205
|
+
* Used to create session object for bookmarking, sharing. Only simple property values (string, number, boolean)
|
|
27206
|
+
* are saved.
|
|
27158
27207
|
*/
|
|
27159
27208
|
getState() {
|
|
27160
27209
|
|
|
27210
|
+
const jsonable = (v) => !(v === undefined || typeof v === 'function' || v instanceof File || v instanceof Promise);
|
|
27211
|
+
|
|
27161
27212
|
// Create copy of config, minus transient properties (convention is name starts with '_'). Also, all
|
|
27162
27213
|
// function properties are transient as they cannot be saved in json
|
|
27163
27214
|
const state = {};
|
|
27164
27215
|
for (let key of Object.keys(this.config)) {
|
|
27165
|
-
if (!key.startsWith("_") &&
|
|
27216
|
+
if (!key.startsWith("_") && jsonable(this.config[key])) {
|
|
27166
27217
|
state[key] = this.config[key];
|
|
27167
27218
|
}
|
|
27168
27219
|
}
|
|
@@ -27176,8 +27227,18 @@
|
|
|
27176
27227
|
}
|
|
27177
27228
|
}
|
|
27178
27229
|
|
|
27179
|
-
|
|
27180
|
-
|
|
27230
|
+
// If user has changed other properties from defaults update state.
|
|
27231
|
+
const defs = TrackBase.defaults;
|
|
27232
|
+
if (this.constructor.defaults) {
|
|
27233
|
+
for (let key of Object.keys(this.constructor.defaults)) {
|
|
27234
|
+
defs[key] = this.constructor.defaults[key];
|
|
27235
|
+
}
|
|
27236
|
+
}
|
|
27237
|
+
for (let key of Object.keys(defs)) {
|
|
27238
|
+
if (undefined !== this[key] && defs[key] !== this[key]) {
|
|
27239
|
+
state[key] = this[key];
|
|
27240
|
+
}
|
|
27241
|
+
}
|
|
27181
27242
|
|
|
27182
27243
|
// Flatten dataRange if present
|
|
27183
27244
|
if (!this.autoscale && this.dataRange) {
|
|
@@ -27185,22 +27246,6 @@
|
|
|
27185
27246
|
state.max = this.dataRange.max;
|
|
27186
27247
|
}
|
|
27187
27248
|
|
|
27188
|
-
|
|
27189
|
-
// Check for non-json-if-yable properties. Perhaps we should test what can be saved.
|
|
27190
|
-
for (let key of Object.keys(state)) {
|
|
27191
|
-
const value = state[key];
|
|
27192
|
-
if (typeof value === 'function') {
|
|
27193
|
-
throw Error(`Property '${key}' of track '${this.name} is a function. Functions cannot be saved in sessions.`)
|
|
27194
|
-
}
|
|
27195
|
-
if (value instanceof File) { // Test specifically for File. Other types of File-like objects might be savable
|
|
27196
|
-
const str = `Track ${this.name} is a local file. Sessions cannot be saved with local file references.`;
|
|
27197
|
-
throw Error(str)
|
|
27198
|
-
}
|
|
27199
|
-
if (value instanceof Promise) {
|
|
27200
|
-
throw Error(`Property '${key}' of track '${this.name} is a Promise. Promises cannot be saved in sessions.`)
|
|
27201
|
-
}
|
|
27202
|
-
}
|
|
27203
|
-
|
|
27204
27249
|
return state
|
|
27205
27250
|
}
|
|
27206
27251
|
|
|
@@ -27496,7 +27541,7 @@
|
|
|
27496
27541
|
* @returns {*|string|string}
|
|
27497
27542
|
*/
|
|
27498
27543
|
getColorForFeature(f) {
|
|
27499
|
-
|
|
27544
|
+
return (typeof this.color === "function") ? this.color(feature) : this.color
|
|
27500
27545
|
}
|
|
27501
27546
|
|
|
27502
27547
|
/**
|
|
@@ -31900,6 +31945,7 @@
|
|
|
31900
31945
|
|
|
31901
31946
|
const queryableFormats = new Set(["bigwig", "bw", "bigbed", "bb", "biginteract", "biggenepred", "bignarrowpeak", "tdf"]);
|
|
31902
31947
|
|
|
31948
|
+
this.queryable = config.queryable === true; // False by default, unless explicitly set
|
|
31903
31949
|
if (config.reader) {
|
|
31904
31950
|
// Explicit reader implementation
|
|
31905
31951
|
this.reader = config.reader;
|
|
@@ -31933,6 +31979,11 @@
|
|
|
31933
31979
|
this.queryable = true;
|
|
31934
31980
|
} else ;
|
|
31935
31981
|
}
|
|
31982
|
+
|
|
31983
|
+
// Set searchable unless explicitly turned off, or track uses in indexed or otherwise queryable
|
|
31984
|
+
// feature source. queryable => features loaded on demand (by query)
|
|
31985
|
+
this.searchable = config.searchable === true || config.searchableFields || (config.searchable !== false && !this.queryable);
|
|
31986
|
+
|
|
31936
31987
|
}
|
|
31937
31988
|
|
|
31938
31989
|
async defaultVisibilityWindow() {
|
|
@@ -32073,39 +32124,13 @@
|
|
|
32073
32124
|
this.featureCache = new FeatureCache$1(features, this.genome, genomicInterval);
|
|
32074
32125
|
|
|
32075
32126
|
// If track is marked "searchable"< cache features by name -- use this with caution, memory intensive
|
|
32076
|
-
if (this.
|
|
32077
|
-
this.addFeaturesToDB(features);
|
|
32127
|
+
if (this.searchable) {
|
|
32128
|
+
this.genome.addFeaturesToDB(features, this.config);
|
|
32078
32129
|
}
|
|
32079
32130
|
} else {
|
|
32080
32131
|
this.featureCache = new FeatureCache$1([], genomicInterval); // Empty cache
|
|
32081
32132
|
}
|
|
32082
32133
|
}
|
|
32083
|
-
|
|
32084
|
-
addFeaturesToDB(featureList) {
|
|
32085
|
-
for (let feature of featureList) {
|
|
32086
|
-
if (feature.name) {
|
|
32087
|
-
this.genome.featureDB[feature.name.toUpperCase()] = feature;
|
|
32088
|
-
}
|
|
32089
|
-
if (feature.gene && feature.gene.name) {
|
|
32090
|
-
this.genome.featureDB[feature.gene.name.toUpperCase()] = feature;
|
|
32091
|
-
}
|
|
32092
|
-
|
|
32093
|
-
if (this.config.searchableFields) {
|
|
32094
|
-
for (let f of this.config.searchableFields) {
|
|
32095
|
-
const value = feature.getAttributeValue(f);
|
|
32096
|
-
if (value) {
|
|
32097
|
-
if (value.indexOf(" ") > 0) {
|
|
32098
|
-
this.genome.featureDB[value.replaceAll(" ", "+").toUpperCase()] = feature;
|
|
32099
|
-
this.genome.featureDB[value.replaceAll(" ", "%20").toUpperCase()] = feature;
|
|
32100
|
-
} else {
|
|
32101
|
-
this.genome.featureDB[value.toUpperCase()] = feature;
|
|
32102
|
-
}
|
|
32103
|
-
}
|
|
32104
|
-
}
|
|
32105
|
-
}
|
|
32106
|
-
}
|
|
32107
|
-
}
|
|
32108
|
-
|
|
32109
32134
|
}
|
|
32110
32135
|
|
|
32111
32136
|
/*
|
|
@@ -32921,7 +32946,8 @@
|
|
|
32921
32946
|
|
|
32922
32947
|
const binaryParser = new BinaryParser(data);
|
|
32923
32948
|
const chromId = binaryParser.getInt();
|
|
32924
|
-
|
|
32949
|
+
const blockStart = binaryParser.getInt();
|
|
32950
|
+
let chromStart = blockStart;
|
|
32925
32951
|
let chromEnd = binaryParser.getInt();
|
|
32926
32952
|
const itemStep = binaryParser.getInt();
|
|
32927
32953
|
const itemSpan = binaryParser.getInt();
|
|
@@ -32931,6 +32957,7 @@
|
|
|
32931
32957
|
|
|
32932
32958
|
if (chromId >= chrIdx1 && chromId <= chrIdx2) {
|
|
32933
32959
|
|
|
32960
|
+
let idx = 0;
|
|
32934
32961
|
while (itemCount-- > 0) {
|
|
32935
32962
|
let value;
|
|
32936
32963
|
switch (type) {
|
|
@@ -32946,8 +32973,9 @@
|
|
|
32946
32973
|
break
|
|
32947
32974
|
case 3: // Fixed step
|
|
32948
32975
|
value = binaryParser.getFloat();
|
|
32976
|
+
chromStart = blockStart + idx * itemStep;
|
|
32949
32977
|
chromEnd = chromStart + itemSpan;
|
|
32950
|
-
|
|
32978
|
+
idx++;
|
|
32951
32979
|
break
|
|
32952
32980
|
}
|
|
32953
32981
|
|
|
@@ -32957,8 +32985,8 @@
|
|
|
32957
32985
|
if (Number.isFinite(value)) {
|
|
32958
32986
|
const chr = chrDict[chromId];
|
|
32959
32987
|
featureArray.push({chr: chr, start: chromStart, end: chromEnd, value: value});
|
|
32960
|
-
|
|
32961
32988
|
}
|
|
32989
|
+
|
|
32962
32990
|
}
|
|
32963
32991
|
}
|
|
32964
32992
|
}
|
|
@@ -33094,6 +33122,7 @@
|
|
|
33094
33122
|
this.genome = genome;
|
|
33095
33123
|
this.format = config.format || "bigwig";
|
|
33096
33124
|
this.wgValues = {};
|
|
33125
|
+
this.queryable = true;
|
|
33097
33126
|
}
|
|
33098
33127
|
|
|
33099
33128
|
async getFeatures({chr, start, end, bpPerPixel, windowFunction}) {
|
|
@@ -33635,6 +33664,7 @@
|
|
|
33635
33664
|
this.genome = genome;
|
|
33636
33665
|
this.windowFunction = config.windowFunction || "mean";
|
|
33637
33666
|
this.reader = new TDFReader(config, genome);
|
|
33667
|
+
this.queryable = true;
|
|
33638
33668
|
}
|
|
33639
33669
|
|
|
33640
33670
|
async getFeatures({chr, start, end, bpPerPixel}) {
|
|
@@ -33844,8 +33874,8 @@
|
|
|
33844
33874
|
this.config = config;
|
|
33845
33875
|
this.genome = genome;
|
|
33846
33876
|
this.queryable = false;
|
|
33877
|
+
this.searchable = config.searchable !== false; // searchable by default
|
|
33847
33878
|
this.updateFeatures(config.features);
|
|
33848
|
-
|
|
33849
33879
|
}
|
|
33850
33880
|
|
|
33851
33881
|
updateFeatures(features) {
|
|
@@ -33855,6 +33885,10 @@
|
|
|
33855
33885
|
mapProperties(features, this.config.mappings);
|
|
33856
33886
|
}
|
|
33857
33887
|
this.featureCache = new FeatureCache$1(features, this.genome);
|
|
33888
|
+
|
|
33889
|
+
if (this.searchable || this.config.searchableFields) {
|
|
33890
|
+
this.genome.addFeaturesToDB(features, this.config);
|
|
33891
|
+
}
|
|
33858
33892
|
}
|
|
33859
33893
|
|
|
33860
33894
|
/**
|
|
@@ -40048,8 +40082,8 @@
|
|
|
40048
40082
|
|
|
40049
40083
|
// Set ctx color to a known valid color. If getColorForFeature returns an invalid color string it is ignored, and
|
|
40050
40084
|
// this default will be used.
|
|
40051
|
-
ctx.fillStyle = this.
|
|
40052
|
-
ctx.strokeStyle = this.
|
|
40085
|
+
ctx.fillStyle = this.color;
|
|
40086
|
+
ctx.strokeStyle = this.color;
|
|
40053
40087
|
|
|
40054
40088
|
const color = this.getColorForFeature(feature);
|
|
40055
40089
|
ctx.fillStyle = color;
|
|
@@ -40373,6 +40407,17 @@
|
|
|
40373
40407
|
|
|
40374
40408
|
class FeatureTrack extends TrackBase {
|
|
40375
40409
|
|
|
40410
|
+
static defaults = {
|
|
40411
|
+
type: "annotation",
|
|
40412
|
+
maxRows: 1000, // protects against pathological feature packing cases (# of rows of overlapping feaures)
|
|
40413
|
+
displayMode: "EXPANDED", // COLLAPSED | EXPANDED | SQUISHED
|
|
40414
|
+
margin: 10,
|
|
40415
|
+
featureHeight: 14,
|
|
40416
|
+
autoHeight: false,
|
|
40417
|
+
useScore: false
|
|
40418
|
+
}
|
|
40419
|
+
|
|
40420
|
+
|
|
40376
40421
|
constructor(config, browser) {
|
|
40377
40422
|
super(config, browser);
|
|
40378
40423
|
}
|
|
@@ -40380,12 +40425,8 @@
|
|
|
40380
40425
|
init(config) {
|
|
40381
40426
|
super.init(config);
|
|
40382
40427
|
|
|
40383
|
-
this.type = config.type || "annotation";
|
|
40384
40428
|
|
|
40385
|
-
//
|
|
40386
|
-
this.maxRows = config.maxRows === undefined ? 1000 : config.maxRows;
|
|
40387
|
-
|
|
40388
|
-
this.displayMode = config.displayMode || "EXPANDED"; // COLLAPSED | EXPANDED | SQUISHED
|
|
40429
|
+
// Obscure option, not common or supoorted, included for backward compatibility
|
|
40389
40430
|
this.labelDisplayMode = config.labelDisplayMode;
|
|
40390
40431
|
|
|
40391
40432
|
if (config._featureSource) {
|
|
@@ -40397,12 +40438,6 @@
|
|
|
40397
40438
|
FeatureSource(config, this.browser.genome);
|
|
40398
40439
|
}
|
|
40399
40440
|
|
|
40400
|
-
// Set default heights
|
|
40401
|
-
this.autoHeight = config.autoHeight;
|
|
40402
|
-
this.margin = config.margin === undefined ? 10 : config.margin;
|
|
40403
|
-
|
|
40404
|
-
this.featureHeight = config.featureHeight || 14;
|
|
40405
|
-
|
|
40406
40441
|
if ("FusionJuncSpan" === config.type) {
|
|
40407
40442
|
this.render = config.render || renderFusionJuncSpan;
|
|
40408
40443
|
this.squishedRowHeight = config.squishedRowHeight || 50;
|
|
@@ -40439,9 +40474,6 @@
|
|
|
40439
40474
|
}
|
|
40440
40475
|
}
|
|
40441
40476
|
}
|
|
40442
|
-
|
|
40443
|
-
//UCSC useScore option
|
|
40444
|
-
this.useScore = config.useScore;
|
|
40445
40477
|
}
|
|
40446
40478
|
|
|
40447
40479
|
async postInit() {
|
|
@@ -40805,7 +40837,7 @@
|
|
|
40805
40837
|
} else if (feature.color) {
|
|
40806
40838
|
color = feature.color; // Explicit color for feature
|
|
40807
40839
|
} else {
|
|
40808
|
-
color = this.
|
|
40840
|
+
color = this.color; // Track default
|
|
40809
40841
|
}
|
|
40810
40842
|
|
|
40811
40843
|
if (feature.alpha && feature.alpha !== 1) {
|
|
@@ -40871,21 +40903,27 @@
|
|
|
40871
40903
|
|
|
40872
40904
|
this.browser = config.browser;
|
|
40873
40905
|
|
|
40874
|
-
this.
|
|
40906
|
+
this.columnFormat = config.columnFormat;
|
|
40875
40907
|
|
|
40876
|
-
|
|
40908
|
+
this.tableRowSelectionList = [];
|
|
40877
40909
|
|
|
40878
|
-
this.
|
|
40910
|
+
this.tableDOM = domUtils.div({ class: 'igv-roi-table' });
|
|
40911
|
+
// if(config.width) {
|
|
40912
|
+
// let [ w ] = config.width.split('px')
|
|
40913
|
+
// w = parseInt(w, 10)
|
|
40914
|
+
// this.tableDOM.style.width = `${Math.min(w, 1600)}px`
|
|
40915
|
+
//
|
|
40916
|
+
// }
|
|
40879
40917
|
|
|
40880
|
-
this.
|
|
40918
|
+
config.parent.appendChild(this.tableDOM);
|
|
40881
40919
|
|
|
40882
|
-
this.
|
|
40920
|
+
this.headerDOM = config;
|
|
40883
40921
|
|
|
40884
|
-
this.
|
|
40922
|
+
this.tableColumnTitles = this.tableDOM;
|
|
40885
40923
|
|
|
40886
|
-
this.
|
|
40924
|
+
this.tableRowContainer = this.tableDOM;
|
|
40887
40925
|
|
|
40888
|
-
this.
|
|
40926
|
+
this.footerDOM = config.gotoButtonHandler;
|
|
40889
40927
|
|
|
40890
40928
|
}
|
|
40891
40929
|
|
|
@@ -40893,12 +40931,12 @@
|
|
|
40893
40931
|
|
|
40894
40932
|
// header
|
|
40895
40933
|
const dom = domUtils.div();
|
|
40896
|
-
this.
|
|
40934
|
+
this.tableDOM.appendChild(dom);
|
|
40897
40935
|
|
|
40898
40936
|
// header title
|
|
40899
40937
|
const div = domUtils.div();
|
|
40900
40938
|
dom.appendChild(div);
|
|
40901
|
-
div.
|
|
40939
|
+
div.innerHTML = headerTitle;
|
|
40902
40940
|
|
|
40903
40941
|
// table dismiss button
|
|
40904
40942
|
const dismiss = domUtils.div();
|
|
@@ -40917,46 +40955,51 @@
|
|
|
40917
40955
|
const { y:y_root } = browser.root.getBoundingClientRect();
|
|
40918
40956
|
const { y:y_parent } = parent.getBoundingClientRect();
|
|
40919
40957
|
const constraint = -(y_parent - y_root);
|
|
40920
|
-
makeDraggable(this.
|
|
40958
|
+
makeDraggable(this.tableDOM, dom, { minX:0, minY:constraint });
|
|
40921
40959
|
|
|
40922
|
-
this.
|
|
40960
|
+
this.tableDOM.style.display = 'none';
|
|
40923
40961
|
|
|
40924
40962
|
this._headerDOM = dom;
|
|
40925
40963
|
|
|
40926
40964
|
}
|
|
40927
40965
|
|
|
40928
|
-
set
|
|
40966
|
+
set tableColumnTitles(tableDOM) {
|
|
40929
40967
|
|
|
40930
|
-
const
|
|
40931
|
-
|
|
40968
|
+
const tblColumnTitles = domUtils.div({ class: 'igv-roi-table-column-titles' });
|
|
40969
|
+
tableDOM.appendChild(tblColumnTitles);
|
|
40932
40970
|
|
|
40933
|
-
for (const { label, width } of columnFormat) {
|
|
40971
|
+
for (const { label, width } of this.columnFormat) {
|
|
40934
40972
|
const col = domUtils.div();
|
|
40935
|
-
|
|
40973
|
+
tblColumnTitles.appendChild(col);
|
|
40936
40974
|
col.style.width = width;
|
|
40937
40975
|
col.innerText = label;
|
|
40938
40976
|
}
|
|
40939
40977
|
|
|
40978
|
+
this._tableColumnTitlesDOM = tblColumnTitles;
|
|
40979
|
+
|
|
40980
|
+
}
|
|
40981
|
+
|
|
40982
|
+
get tableColumnTitles() {
|
|
40983
|
+
return this._tableColumnTitlesDOM
|
|
40940
40984
|
}
|
|
40941
40985
|
|
|
40942
|
-
set
|
|
40986
|
+
set tableRowContainer(container) {
|
|
40943
40987
|
|
|
40944
|
-
const
|
|
40945
|
-
container.appendChild(
|
|
40988
|
+
const tblRowContainer = domUtils.div({ class: 'igv-roi-table-row-container' });
|
|
40989
|
+
container.appendChild(tblRowContainer);
|
|
40946
40990
|
|
|
40947
|
-
|
|
40991
|
+
this._tableRowContainerDOM = tblRowContainer;
|
|
40948
40992
|
|
|
40949
|
-
this._rowContainerDOM = dom;
|
|
40950
40993
|
}
|
|
40951
40994
|
|
|
40952
|
-
get
|
|
40953
|
-
return this.
|
|
40995
|
+
get tableRowContainer() {
|
|
40996
|
+
return this._tableRowContainerDOM
|
|
40954
40997
|
}
|
|
40955
40998
|
|
|
40956
40999
|
set footerDOM(gotoButtonHandler) {
|
|
40957
41000
|
|
|
40958
41001
|
const dom = domUtils.div();
|
|
40959
|
-
this.
|
|
41002
|
+
this.tableDOM.appendChild(dom);
|
|
40960
41003
|
|
|
40961
41004
|
// Go To Button
|
|
40962
41005
|
const gotoButton = domUtils.div({class: 'igv-roi-table-button'});
|
|
@@ -40998,7 +41041,7 @@
|
|
|
40998
41041
|
}
|
|
40999
41042
|
|
|
41000
41043
|
clearTable() {
|
|
41001
|
-
const elements = this.
|
|
41044
|
+
const elements = this.tableRowContainer.querySelectorAll('.igv-roi-table-row');
|
|
41002
41045
|
for (let el of elements) {
|
|
41003
41046
|
el.remove();
|
|
41004
41047
|
}
|
|
@@ -41010,23 +41053,23 @@
|
|
|
41010
41053
|
}
|
|
41011
41054
|
|
|
41012
41055
|
present() {
|
|
41013
|
-
this.
|
|
41056
|
+
this.tableDOM.style.left = `${ 0 }px`;
|
|
41014
41057
|
|
|
41015
41058
|
const { y:y_root } = this.browser.root.getBoundingClientRect();
|
|
41016
41059
|
const { y:y_parent } = this.config.parent.getBoundingClientRect();
|
|
41017
41060
|
|
|
41018
|
-
this.
|
|
41019
|
-
this.
|
|
41061
|
+
this.tableDOM.style.top = `${ y_root - y_parent }px`;
|
|
41062
|
+
this.tableDOM.style.display = 'flex';
|
|
41020
41063
|
}
|
|
41021
41064
|
|
|
41022
41065
|
dismiss() {
|
|
41023
|
-
this.
|
|
41066
|
+
this.tableDOM.style.display = 'none';
|
|
41024
41067
|
}
|
|
41025
41068
|
|
|
41026
41069
|
dispose() {
|
|
41027
41070
|
|
|
41028
|
-
this.
|
|
41029
|
-
this.
|
|
41071
|
+
this.tableDOM.innerHTML = '';
|
|
41072
|
+
this.tableDOM.remove();
|
|
41030
41073
|
|
|
41031
41074
|
for (const key of Object.keys(this)) {
|
|
41032
41075
|
this[key] = undefined;
|
|
@@ -41042,41 +41085,35 @@
|
|
|
41042
41085
|
|
|
41043
41086
|
constructor(config) {
|
|
41044
41087
|
|
|
41045
|
-
const cooked = Object.assign({ 'width':'
|
|
41088
|
+
const cooked = Object.assign({ 'width':'1024px' }, config);
|
|
41046
41089
|
super(cooked);
|
|
41047
41090
|
|
|
41048
41091
|
this.descriptionDOM = config;
|
|
41049
41092
|
|
|
41050
41093
|
}
|
|
41051
41094
|
|
|
41052
|
-
|
|
41053
|
-
set columnTitleDOM(columnFormat) {
|
|
41054
|
-
|
|
41055
|
-
const dom = domUtils.div({ class: 'igv-roi-table-column-titles' });
|
|
41056
|
-
this.container.appendChild(dom);
|
|
41057
|
-
|
|
41058
|
-
for (const format of columnFormat) {
|
|
41059
|
-
const col = domUtils.div();
|
|
41060
|
-
dom.appendChild(col);
|
|
41061
|
-
col.style.width = format.width || 'fit-content';
|
|
41062
|
-
col.innerText = format.label;
|
|
41063
|
-
}
|
|
41064
|
-
|
|
41065
|
-
}
|
|
41066
|
-
|
|
41067
41095
|
set descriptionDOM(config) {
|
|
41068
41096
|
|
|
41069
41097
|
if (config.description) {
|
|
41070
41098
|
|
|
41071
41099
|
let dom;
|
|
41072
41100
|
|
|
41073
|
-
|
|
41101
|
+
// BLAT result for query sequence
|
|
41074
41102
|
dom = domUtils.div({ class: 'igv-roi-table-description' });
|
|
41075
|
-
this.
|
|
41103
|
+
this.tableDOM.insertBefore(dom, this.tableColumnTitles);
|
|
41104
|
+
dom.style.height = 'auto';
|
|
41105
|
+
dom.innerHTML = `BLAT result for query sequence:`;
|
|
41106
|
+
|
|
41107
|
+
// CTAATCAtctacactggtttctactg ...
|
|
41108
|
+
dom = domUtils.div({ class: 'igv-roi-table-description' });
|
|
41109
|
+
this.tableDOM.insertBefore(dom, this.tableColumnTitles);
|
|
41110
|
+
dom.style.height = 'auto';
|
|
41111
|
+
dom.style.maxHeight = '128px';
|
|
41076
41112
|
dom.innerHTML = config.description;
|
|
41077
41113
|
|
|
41114
|
+
// Select one or more rows ...
|
|
41078
41115
|
dom = domUtils.div({ class: 'igv-roi-table-goto-explainer' });
|
|
41079
|
-
this.
|
|
41116
|
+
this.tableDOM.insertBefore(dom, this.tableColumnTitles);
|
|
41080
41117
|
dom.innerHTML = `Select one or more rows and click Go To to view the regions`;
|
|
41081
41118
|
|
|
41082
41119
|
}
|
|
@@ -41106,13 +41143,13 @@
|
|
|
41106
41143
|
|
|
41107
41144
|
renderTable(records) {
|
|
41108
41145
|
|
|
41109
|
-
Array.from(this.
|
|
41146
|
+
Array.from(this.tableRowContainer.querySelectorAll('.igv-roi-table-row')).forEach(el => el.remove());
|
|
41110
41147
|
|
|
41111
41148
|
if (records.length > 0) {
|
|
41112
41149
|
|
|
41113
41150
|
for (let record of records) {
|
|
41114
41151
|
const row = this.tableRowDOM(record);
|
|
41115
|
-
this.
|
|
41152
|
+
this.tableRowContainer.appendChild(row);
|
|
41116
41153
|
}
|
|
41117
41154
|
|
|
41118
41155
|
}
|
|
@@ -41160,7 +41197,7 @@
|
|
|
41160
41197
|
|
|
41161
41198
|
event.stopPropagation();
|
|
41162
41199
|
|
|
41163
|
-
const selectedRows = this.
|
|
41200
|
+
const selectedRows = this.tableDOM.querySelectorAll('.igv-roi-table-row-selected');
|
|
41164
41201
|
|
|
41165
41202
|
const loci = [];
|
|
41166
41203
|
for (const row of selectedRows) {
|
|
@@ -41172,7 +41209,7 @@
|
|
|
41172
41209
|
loci.push(`${ chr }:${ start }-${ end }`);
|
|
41173
41210
|
}
|
|
41174
41211
|
|
|
41175
|
-
for (const el of this.
|
|
41212
|
+
for (const el of this.tableDOM.querySelectorAll('.igv-roi-table-row')) {
|
|
41176
41213
|
el.classList.remove('igv-roi-table-row-selected');
|
|
41177
41214
|
}
|
|
41178
41215
|
|
|
@@ -41194,16 +41231,16 @@
|
|
|
41194
41231
|
&output=json
|
|
41195
41232
|
*/
|
|
41196
41233
|
|
|
41197
|
-
|
|
41198
41234
|
//const blatServer = "https://genome.ucsc.edu/cgi-bin/hgBlat"
|
|
41199
|
-
const
|
|
41235
|
+
const defaultBlatServer = "https://igv.org/services/blatUCSC.php";
|
|
41236
|
+
//const blatServer = "http://localhost:8000/blatUCSC.php"
|
|
41200
41237
|
|
|
41201
41238
|
|
|
41202
|
-
async function blat(userSeq, db) {
|
|
41239
|
+
async function blat({url, userSeq, db}) {
|
|
41203
41240
|
|
|
41204
|
-
|
|
41241
|
+
url = url || defaultBlatServer;
|
|
41205
41242
|
|
|
41206
|
-
const results = await
|
|
41243
|
+
const results = await postData(url, userSeq, db);
|
|
41207
41244
|
|
|
41208
41245
|
results.fields;
|
|
41209
41246
|
|
|
@@ -41212,8 +41249,19 @@
|
|
|
41212
41249
|
return features
|
|
41213
41250
|
}
|
|
41214
41251
|
|
|
41215
|
-
|
|
41252
|
+
async function postData(url = "", userSeq, db) {
|
|
41216
41253
|
|
|
41254
|
+
const data = new URLSearchParams();
|
|
41255
|
+
data.append("userSeq", userSeq);
|
|
41256
|
+
data.append("db", db);
|
|
41257
|
+
|
|
41258
|
+
const response = await fetch(url, { method: "post", body: data });
|
|
41259
|
+
return response.json(); // parses JSON response into native JavaScript objects
|
|
41260
|
+
}
|
|
41261
|
+
|
|
41262
|
+
const maxSequenceSize = 25000;
|
|
41263
|
+
|
|
41264
|
+
class BlatTrack extends FeatureTrack {
|
|
41217
41265
|
|
|
41218
41266
|
constructor(config, browser) {
|
|
41219
41267
|
super(config, browser);
|
|
@@ -41249,7 +41297,7 @@
|
|
|
41249
41297
|
browser: this.browser,
|
|
41250
41298
|
parent: this.browser.parent,
|
|
41251
41299
|
headerTitle: this.config.title,
|
|
41252
|
-
description:
|
|
41300
|
+
description: this.sequence,
|
|
41253
41301
|
dismissHandler: () => {
|
|
41254
41302
|
this.table.dismiss();
|
|
41255
41303
|
this.table.dispose();
|
|
@@ -41298,21 +41346,34 @@
|
|
|
41298
41346
|
|
|
41299
41347
|
async function createBlatTrack({sequence, browser, name, title}) {
|
|
41300
41348
|
|
|
41349
|
+
if (sequence.length > maxSequenceSize) {
|
|
41350
|
+
browser.alert.present(`Sequence size exceeds maximum allowed length (${sequence.length} > ${maxSequenceSize})`);
|
|
41351
|
+
return
|
|
41352
|
+
}
|
|
41353
|
+
|
|
41301
41354
|
const db = browser.genome.id; // TODO -- blat specific property
|
|
41302
41355
|
|
|
41303
|
-
const
|
|
41356
|
+
const url = browser.config["blatServerURL"];
|
|
41304
41357
|
|
|
41305
|
-
|
|
41306
|
-
|
|
41307
|
-
|
|
41308
|
-
|
|
41309
|
-
|
|
41310
|
-
|
|
41311
|
-
|
|
41358
|
+
try {
|
|
41359
|
+
|
|
41360
|
+
const features = await blat({url, userSeq: sequence, db});
|
|
41361
|
+
const trackConfig = {
|
|
41362
|
+
type: 'blat',
|
|
41363
|
+
name: name || 'blat results',
|
|
41364
|
+
title: title || 'blat results',
|
|
41365
|
+
sequence: sequence,
|
|
41366
|
+
altColor: 'rgb(176, 176, 236)',
|
|
41367
|
+
color: 'rgb(236, 176, 176)',
|
|
41368
|
+
features: features
|
|
41369
|
+
};
|
|
41312
41370
|
|
|
41313
|
-
|
|
41371
|
+
const track = await browser.loadTrack(trackConfig);
|
|
41372
|
+
track.openTableView();
|
|
41314
41373
|
|
|
41315
|
-
|
|
41374
|
+
} catch (e) {
|
|
41375
|
+
browser.alert.present(`Error performing blat search: ${e}`);
|
|
41376
|
+
}
|
|
41316
41377
|
|
|
41317
41378
|
}
|
|
41318
41379
|
|
|
@@ -41343,8 +41404,6 @@
|
|
|
41343
41404
|
|
|
41344
41405
|
const alignmentStartGap = 5;
|
|
41345
41406
|
const downsampleRowHeight = 5;
|
|
41346
|
-
const DEFAULT_COVERAGE_TRACK_HEIGHT = 50;
|
|
41347
|
-
const DEFAULT_TRACK_HEIGHT$1 = 300;
|
|
41348
41407
|
const DEFAULT_ALIGNMENT_COLOR = "rgb(185, 185, 185)";
|
|
41349
41408
|
const DEFAULT_COVERAGE_COLOR = "rgb(150, 150, 150)";
|
|
41350
41409
|
const DEFAULT_CONNECTOR_COLOR = "rgb(200, 200, 200)";
|
|
@@ -41352,35 +41411,37 @@
|
|
|
41352
41411
|
|
|
41353
41412
|
class BAMTrack extends TrackBase {
|
|
41354
41413
|
|
|
41414
|
+
static defaults = {
|
|
41415
|
+
alleleFreqThreshold: 0.2,
|
|
41416
|
+
visibilityWindow: 30000,
|
|
41417
|
+
showCoverage: true,
|
|
41418
|
+
showAlignments: true,
|
|
41419
|
+
viewAsPairs: false,
|
|
41420
|
+
pairsSupported: true,
|
|
41421
|
+
showSoftClips: false,
|
|
41422
|
+
showAllBases: false,
|
|
41423
|
+
showInsertions: true,
|
|
41424
|
+
showMismatches: true,
|
|
41425
|
+
color: DEFAULT_ALIGNMENT_COLOR,
|
|
41426
|
+
coverageColor: DEFAULT_COVERAGE_COLOR,
|
|
41427
|
+
height: 300,
|
|
41428
|
+
coverageTrackHeight: 50
|
|
41429
|
+
}
|
|
41430
|
+
|
|
41355
41431
|
constructor(config, browser) {
|
|
41356
41432
|
super(config, browser);
|
|
41357
41433
|
}
|
|
41358
41434
|
|
|
41359
41435
|
init(config) {
|
|
41360
|
-
super.init(config);
|
|
41361
|
-
this.type = "alignment";
|
|
41362
|
-
|
|
41363
|
-
if (config.alleleFreqThreshold === undefined) {
|
|
41364
|
-
config.alleleFreqThreshold = 0.2;
|
|
41365
|
-
}
|
|
41366
41436
|
|
|
41437
|
+
this.type = "alignment";
|
|
41367
41438
|
this.featureSource = new BamSource(config, this.browser);
|
|
41368
|
-
|
|
41369
|
-
this.showCoverage = config.showCoverage === undefined ? true : config.showCoverage;
|
|
41370
|
-
this.showAlignments = config.showAlignments === undefined ? true : config.showAlignments;
|
|
41371
|
-
|
|
41372
41439
|
this.coverageTrack = new CoverageTrack(config, this);
|
|
41373
41440
|
this.alignmentTrack = new AlignmentTrack(config, this);
|
|
41441
|
+
|
|
41442
|
+
super.init(config);
|
|
41443
|
+
|
|
41374
41444
|
this.alignmentTrack.setTop(this.coverageTrack, this.showCoverage);
|
|
41375
|
-
this.visibilityWindow = config.visibilityWindow || 30000;
|
|
41376
|
-
this.viewAsPairs = config.viewAsPairs;
|
|
41377
|
-
this.pairsSupported = config.pairsSupported !== false;
|
|
41378
|
-
this.showSoftClips = config.showSoftClips;
|
|
41379
|
-
this.showAllBases = config.showAllBases;
|
|
41380
|
-
this.showInsertions = false !== config.showInsertions;
|
|
41381
|
-
this.showMismatches = false !== config.showMismatches;
|
|
41382
|
-
this.color = config.color;
|
|
41383
|
-
this.coverageColor = config.coverageColor;
|
|
41384
41445
|
|
|
41385
41446
|
// The sort object can be an array in the case of multi-locus view, however if multiple sort positions
|
|
41386
41447
|
// are present for a given reference frame the last one will take precedence
|
|
@@ -41393,14 +41454,12 @@
|
|
|
41393
41454
|
}
|
|
41394
41455
|
}
|
|
41395
41456
|
|
|
41396
|
-
// Invoke height setter last to allocated to coverage and alignment tracks
|
|
41397
|
-
this.height = (config.height !== undefined ? config.height : DEFAULT_TRACK_HEIGHT$1);
|
|
41398
41457
|
}
|
|
41399
41458
|
|
|
41400
41459
|
set height(h) {
|
|
41401
41460
|
this._height = h;
|
|
41402
|
-
if (this.
|
|
41403
|
-
this.alignmentTrack.height = this.showCoverage ? h - this.
|
|
41461
|
+
if (this.showAlignments) {
|
|
41462
|
+
this.alignmentTrack.height = this.showCoverage ? h - this.coverageTrackHeight : h;
|
|
41404
41463
|
}
|
|
41405
41464
|
}
|
|
41406
41465
|
|
|
@@ -41487,16 +41546,15 @@
|
|
|
41487
41546
|
* @returns {number}
|
|
41488
41547
|
*/
|
|
41489
41548
|
computePixelHeight(alignmentContainer) {
|
|
41490
|
-
return (this.showCoverage ? this.
|
|
41491
|
-
(this.showAlignments ? this.alignmentTrack.computePixelHeight(alignmentContainer) : 0)
|
|
41492
|
-
15
|
|
41549
|
+
return (this.showCoverage ? this.coverageTrackHeight : 0) +
|
|
41550
|
+
(this.showAlignments ? this.alignmentTrack.computePixelHeight(alignmentContainer) : 0)
|
|
41493
41551
|
}
|
|
41494
41552
|
|
|
41495
41553
|
draw(options) {
|
|
41496
41554
|
|
|
41497
41555
|
IGVGraphics.fillRect(options.context, 0, options.pixelTop, options.pixelWidth, options.pixelHeight, {'fillStyle': "rgb(255, 255, 255)"});
|
|
41498
41556
|
|
|
41499
|
-
if (true === this.showCoverage && this.
|
|
41557
|
+
if (true === this.showCoverage && this.coverageTrackHeight > 0) {
|
|
41500
41558
|
this.trackView.axisCanvas.style.display = 'block';
|
|
41501
41559
|
this.coverageTrack.draw(options);
|
|
41502
41560
|
} else {
|
|
@@ -41511,12 +41569,12 @@
|
|
|
41511
41569
|
|
|
41512
41570
|
paintAxis(ctx, pixelWidth, pixelHeight) {
|
|
41513
41571
|
|
|
41514
|
-
this.coverageTrack.paintAxis(ctx, pixelWidth, this.
|
|
41572
|
+
this.coverageTrack.paintAxis(ctx, pixelWidth, this.coverageTrackHeight);
|
|
41515
41573
|
|
|
41516
41574
|
// if (this.browser.isMultiLocusMode()) {
|
|
41517
41575
|
// ctx.clearRect(0, 0, pixelWidth, pixelHeight);
|
|
41518
41576
|
// } else {
|
|
41519
|
-
// this.coverageTrack.paintAxis(ctx, pixelWidth, this.
|
|
41577
|
+
// this.coverageTrack.paintAxis(ctx, pixelWidth, this.coverageTrackHeight);
|
|
41520
41578
|
// }
|
|
41521
41579
|
}
|
|
41522
41580
|
|
|
@@ -41525,7 +41583,7 @@
|
|
|
41525
41583
|
}
|
|
41526
41584
|
|
|
41527
41585
|
popupData(clickState) {
|
|
41528
|
-
if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.
|
|
41586
|
+
if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrackHeight) {
|
|
41529
41587
|
return this.coverageTrack.popupData(clickState)
|
|
41530
41588
|
} else {
|
|
41531
41589
|
return this.alignmentTrack.popupData(clickState)
|
|
@@ -41540,7 +41598,7 @@
|
|
|
41540
41598
|
clickedFeatures(clickState) {
|
|
41541
41599
|
|
|
41542
41600
|
let clickedObject;
|
|
41543
|
-
if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.
|
|
41601
|
+
if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrackHeight) {
|
|
41544
41602
|
clickedObject = this.coverageTrack.getClickedObject(clickState);
|
|
41545
41603
|
} else {
|
|
41546
41604
|
clickedObject = this.alignmentTrack.getClickedObject(clickState);
|
|
@@ -41549,7 +41607,7 @@
|
|
|
41549
41607
|
}
|
|
41550
41608
|
|
|
41551
41609
|
hoverText(clickState) {
|
|
41552
|
-
if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.
|
|
41610
|
+
if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrackHeight) {
|
|
41553
41611
|
const clickedObject = this.coverageTrack.getClickedObject(clickState);
|
|
41554
41612
|
if (clickedObject) {
|
|
41555
41613
|
return clickedObject.hoverText()
|
|
@@ -41589,8 +41647,8 @@
|
|
|
41589
41647
|
// Show coverage / alignment options
|
|
41590
41648
|
const adjustTrackHeight = () => {
|
|
41591
41649
|
if (!this.autoHeight) {
|
|
41592
|
-
const h =
|
|
41593
|
-
(this.showCoverage ? this.
|
|
41650
|
+
const h =
|
|
41651
|
+
(this.showCoverage ? this.coverageTrackHeight : 0) +
|
|
41594
41652
|
(this.showAlignments ? this.alignmentTrack.height : 0);
|
|
41595
41653
|
this.trackView.setTrackHeight(h);
|
|
41596
41654
|
}
|
|
@@ -41904,7 +41962,6 @@
|
|
|
41904
41962
|
constructor(config, parent) {
|
|
41905
41963
|
this.parent = parent;
|
|
41906
41964
|
this.featureSource = parent.featureSource;
|
|
41907
|
-
this.height = config.coverageTrackHeight !== undefined ? config.coverageTrackHeight : DEFAULT_COVERAGE_TRACK_HEIGHT;
|
|
41908
41965
|
|
|
41909
41966
|
this.paintAxis = paintAxis;
|
|
41910
41967
|
this.top = 0;
|
|
@@ -41919,6 +41976,10 @@
|
|
|
41919
41976
|
|
|
41920
41977
|
}
|
|
41921
41978
|
|
|
41979
|
+
get height() {
|
|
41980
|
+
return this.parent.coverageTrackHeight
|
|
41981
|
+
}
|
|
41982
|
+
|
|
41922
41983
|
draw(options) {
|
|
41923
41984
|
|
|
41924
41985
|
const pixelTop = options.pixelTop;
|
|
@@ -42665,18 +42726,21 @@
|
|
|
42665
42726
|
// TODO if genome supports blat
|
|
42666
42727
|
const seqstring = clickedAlignment.seq;
|
|
42667
42728
|
if (seqstring && "*" != seqstring) {
|
|
42668
|
-
|
|
42669
|
-
|
|
42670
|
-
|
|
42671
|
-
|
|
42672
|
-
|
|
42673
|
-
|
|
42674
|
-
|
|
42675
|
-
|
|
42676
|
-
|
|
42729
|
+
|
|
42730
|
+
if (seqstring.length < maxSequenceSize) {
|
|
42731
|
+
list.push({
|
|
42732
|
+
label: 'BLAT read sequence',
|
|
42733
|
+
click: () => {
|
|
42734
|
+
const sequence = clickedAlignment.isNegativeStrand() ? reverseComplementSequence(seqstring) : seqstring;
|
|
42735
|
+
const name = `${clickedAlignment.readName} - blat`;
|
|
42736
|
+
const title = `${this.parent.name} - ${name}`;
|
|
42737
|
+
createBlatTrack({sequence, browser: this.browser, name, title});
|
|
42738
|
+
}
|
|
42739
|
+
});
|
|
42740
|
+
}
|
|
42677
42741
|
|
|
42678
42742
|
const softClips = clickedAlignment.softClippedBlocks();
|
|
42679
|
-
if (softClips.left && softClips.left.len > MINIMUM_BLAT_LENGTH) {
|
|
42743
|
+
if (softClips.left && softClips.left.len > MINIMUM_BLAT_LENGTH && softClips.left.len < maxSequenceSize) {
|
|
42680
42744
|
list.push({
|
|
42681
42745
|
label: 'BLAT left soft-clipped sequence',
|
|
42682
42746
|
click: () => {
|
|
@@ -42688,7 +42752,7 @@
|
|
|
42688
42752
|
}
|
|
42689
42753
|
});
|
|
42690
42754
|
}
|
|
42691
|
-
if (softClips.right && softClips.right.
|
|
42755
|
+
if (softClips.right && softClips.right.len > MINIMUM_BLAT_LENGTH && softClips.right.len < maxSequenceSize) {
|
|
42692
42756
|
list.push({
|
|
42693
42757
|
label: 'BLAT right soft-clipped sequence',
|
|
42694
42758
|
click: () => {
|
|
@@ -44610,25 +44674,34 @@
|
|
|
44610
44674
|
* THE SOFTWARE.
|
|
44611
44675
|
*/
|
|
44612
44676
|
|
|
44613
|
-
const DEFAULT_COLOR = "rgb(150,150,150)";
|
|
44614
|
-
|
|
44615
44677
|
class WigTrack extends TrackBase {
|
|
44616
44678
|
|
|
44679
|
+
static defaults = {
|
|
44680
|
+
height: 50,
|
|
44681
|
+
color: 'rgb(150, 150, 150)',
|
|
44682
|
+
altColor: 'rgb(150, 150, 150)',
|
|
44683
|
+
flipAxis: false,
|
|
44684
|
+
logScale: false,
|
|
44685
|
+
windowFunction: 'mean',
|
|
44686
|
+
graphType: 'bar',
|
|
44687
|
+
autoscale: true,
|
|
44688
|
+
normalize: undefined,
|
|
44689
|
+
scaleFactor: undefined
|
|
44690
|
+
}
|
|
44691
|
+
|
|
44617
44692
|
constructor(config, browser) {
|
|
44618
44693
|
super(config, browser);
|
|
44619
44694
|
}
|
|
44620
44695
|
|
|
44621
44696
|
init(config) {
|
|
44697
|
+
|
|
44622
44698
|
super.init(config);
|
|
44623
44699
|
|
|
44624
44700
|
this.type = "wig";
|
|
44625
|
-
this.height = config.height || 50;
|
|
44626
44701
|
this.featureType = 'numeric';
|
|
44627
44702
|
this.paintAxis = paintAxis;
|
|
44628
44703
|
|
|
44629
44704
|
const format = config.format ? config.format.toLowerCase() : config.format;
|
|
44630
|
-
this.flipAxis = config.flipAxis ? config.flipAxis : false;
|
|
44631
|
-
this.logScale = config.logScale ? config.logScale : false;
|
|
44632
44705
|
if (config.featureSource) {
|
|
44633
44706
|
this.featureSource = config.featureSource;
|
|
44634
44707
|
delete config.featureSource;
|
|
@@ -44640,18 +44713,16 @@
|
|
|
44640
44713
|
this.featureSource = FeatureSource(config, this.browser.genome);
|
|
44641
44714
|
}
|
|
44642
44715
|
|
|
44643
|
-
|
|
44644
|
-
|
|
44716
|
+
|
|
44717
|
+
// Override autoscale default
|
|
44718
|
+
if(config.max === undefined || config.autoscale === true) {
|
|
44719
|
+
this.autoscale = true;
|
|
44720
|
+
} else {
|
|
44645
44721
|
this.dataRange = {
|
|
44646
44722
|
min: config.min || 0,
|
|
44647
44723
|
max: config.max
|
|
44648
44724
|
};
|
|
44649
44725
|
}
|
|
44650
|
-
|
|
44651
|
-
this.windowFunction = config.windowFunction || "mean";
|
|
44652
|
-
this.graphType = config.graphType || "bar";
|
|
44653
|
-
this.normalize = config.normalize; // boolean, for use with "TDF" files
|
|
44654
|
-
this.scaleFactor = config.scaleFactor; // optional scale factor, ignored if normalize === true;
|
|
44655
44726
|
}
|
|
44656
44727
|
|
|
44657
44728
|
async postInit() {
|
|
@@ -44741,7 +44812,7 @@
|
|
|
44741
44812
|
const pixelWidth = options.pixelWidth;
|
|
44742
44813
|
options.pixelHeight;
|
|
44743
44814
|
const bpEnd = bpStart + pixelWidth * bpPerPixel + 1;
|
|
44744
|
-
const posColor = this.color ||
|
|
44815
|
+
const posColor = this.color || WigTrack.defaults.color;
|
|
44745
44816
|
|
|
44746
44817
|
let baselineColor;
|
|
44747
44818
|
if (typeof posColor === "string" && posColor.startsWith("rgb(")) {
|
|
@@ -44885,7 +44956,7 @@
|
|
|
44885
44956
|
*/
|
|
44886
44957
|
|
|
44887
44958
|
getColorForFeature(f) {
|
|
44888
|
-
let c = (f.value < 0 && this.altColor) ? this.altColor : this.color ||
|
|
44959
|
+
let c = (f.value < 0 && this.altColor) ? this.altColor : this.color || WigTrack.defaults.color;
|
|
44889
44960
|
return (typeof c === "function") ? c(f.value) : c
|
|
44890
44961
|
}
|
|
44891
44962
|
|
|
@@ -44896,20 +44967,6 @@
|
|
|
44896
44967
|
this.trackView = undefined;
|
|
44897
44968
|
}
|
|
44898
44969
|
|
|
44899
|
-
/**
|
|
44900
|
-
* Return the current state of the track. Used to create sessions and bookmarks.
|
|
44901
|
-
*
|
|
44902
|
-
* @returns {*|{}}
|
|
44903
|
-
*/
|
|
44904
|
-
getState() {
|
|
44905
|
-
|
|
44906
|
-
const config = super.getState();
|
|
44907
|
-
|
|
44908
|
-
if (this.flipAxis !== undefined) config.flipAxis = this.flipAxis;
|
|
44909
|
-
if (this.logScale !== undefined) config.logScale = this.logScale;
|
|
44910
|
-
|
|
44911
|
-
return config
|
|
44912
|
-
}
|
|
44913
44970
|
}
|
|
44914
44971
|
|
|
44915
44972
|
/**
|
|
@@ -45797,6 +45854,17 @@
|
|
|
45797
45854
|
|
|
45798
45855
|
class InteractionTrack extends TrackBase {
|
|
45799
45856
|
|
|
45857
|
+
static defaults = {
|
|
45858
|
+
height: 250,
|
|
45859
|
+
theta: Math.PI / 4,
|
|
45860
|
+
arcOrientation: true,
|
|
45861
|
+
showBlocks: true,
|
|
45862
|
+
blockHeight: 3,
|
|
45863
|
+
thickness: 1,
|
|
45864
|
+
alpha: 0.02,
|
|
45865
|
+
logScale: true,
|
|
45866
|
+
}
|
|
45867
|
+
|
|
45800
45868
|
constructor(config, browser) {
|
|
45801
45869
|
super(config, browser);
|
|
45802
45870
|
}
|
|
@@ -45804,16 +45872,10 @@
|
|
|
45804
45872
|
init(config) {
|
|
45805
45873
|
|
|
45806
45874
|
super.init(config);
|
|
45807
|
-
|
|
45875
|
+
|
|
45808
45876
|
this.sinTheta = Math.sin(this.theta);
|
|
45809
45877
|
this.cosTheta = Math.cos(this.theta);
|
|
45810
|
-
this.height = config.height || 250;
|
|
45811
45878
|
this.arcType = getArcType(config); // nested | proportional | inView | partialInView
|
|
45812
|
-
this.arcOrientation = (config.arcOrientation === undefined ? true : config.arcOrientation); // true for up, false for down
|
|
45813
|
-
this.showBlocks = config.showBlocks === undefined ? true : config.showBlocks;
|
|
45814
|
-
this.blockHeight = config.blockHeight || 3;
|
|
45815
|
-
this.thickness = config.thickness || 1;
|
|
45816
|
-
this.color = config.color;
|
|
45817
45879
|
this.alpha = config.alpha || 0.02; // was: 0.15
|
|
45818
45880
|
this.painter = {flipAxis: !this.arcOrientation, dataRange: this.dataRange, paintAxis: paintAxis};
|
|
45819
45881
|
|
|
@@ -45825,7 +45887,6 @@
|
|
|
45825
45887
|
this.valueColumn = "score";
|
|
45826
45888
|
}
|
|
45827
45889
|
|
|
45828
|
-
this.logScale = config.logScale !== false; // i.e. defaul to true (undefined => true)
|
|
45829
45890
|
if (config.max) {
|
|
45830
45891
|
this.dataRange = {
|
|
45831
45892
|
min: config.min || 0,
|
|
@@ -45850,7 +45911,7 @@
|
|
|
45850
45911
|
|
|
45851
45912
|
if (typeof this.featureSource.getHeader === "function") {
|
|
45852
45913
|
this.header = await this.featureSource.getHeader();
|
|
45853
|
-
if(this.disposed) return; // This track was removed during async load
|
|
45914
|
+
if (this.disposed) return; // This track was removed during async load
|
|
45854
45915
|
}
|
|
45855
45916
|
|
|
45856
45917
|
// Set properties from track line
|
|
@@ -45923,7 +45984,7 @@
|
|
|
45923
45984
|
feature.drawState = undefined;
|
|
45924
45985
|
|
|
45925
45986
|
let color;
|
|
45926
|
-
if(typeof this.color === 'function') {
|
|
45987
|
+
if (typeof this.color === 'function') {
|
|
45927
45988
|
color = this.color(feature);
|
|
45928
45989
|
} else {
|
|
45929
45990
|
color = this.color || feature.color || DEFAULT_ARC_COLOR;
|
|
@@ -46268,7 +46329,7 @@
|
|
|
46268
46329
|
contextMenuItemList(clickState) {
|
|
46269
46330
|
|
|
46270
46331
|
// Experimental JBrowse feature
|
|
46271
|
-
if (this.browser.circularView
|
|
46332
|
+
if (this.browser.circularView) {
|
|
46272
46333
|
const viewport = clickState.viewport;
|
|
46273
46334
|
const list = [];
|
|
46274
46335
|
|
|
@@ -46297,7 +46358,7 @@
|
|
|
46297
46358
|
|
|
46298
46359
|
// inView features are simply features that have been drawn, i.e. have a drawState
|
|
46299
46360
|
const inView = cachedFeatures.filter(f => f.drawState);
|
|
46300
|
-
if(inView.length === 0) return;
|
|
46361
|
+
if (inView.length === 0) return;
|
|
46301
46362
|
|
|
46302
46363
|
const chords = makeBedPEChords(inView);
|
|
46303
46364
|
sendChords(chords, this, refFrame, 0.5);
|
|
@@ -46333,7 +46394,7 @@
|
|
|
46333
46394
|
|
|
46334
46395
|
popupData(clickState, features) {
|
|
46335
46396
|
|
|
46336
|
-
if(features === undefined) features = this.clickedFeatures(clickState);
|
|
46397
|
+
if (features === undefined) features = this.clickedFeatures(clickState);
|
|
46337
46398
|
|
|
46338
46399
|
const data = [];
|
|
46339
46400
|
for (let feature of features) {
|
|
@@ -46357,7 +46418,7 @@
|
|
|
46357
46418
|
const columnNames = this.header.columnNames;
|
|
46358
46419
|
const stdColumns = this.header.hiccups ? 6 : 10;
|
|
46359
46420
|
for (let i = stdColumns; i < columnNames.length; i++) {
|
|
46360
|
-
if(this.header.colorColumn === i) continue;
|
|
46421
|
+
if (this.header.colorColumn === i) continue;
|
|
46361
46422
|
if (columnNames[i] === 'info') {
|
|
46362
46423
|
extractInfoColumn(data, f.extras[i - stdColumns]);
|
|
46363
46424
|
} else {
|
|
@@ -46379,7 +46440,7 @@
|
|
|
46379
46440
|
|
|
46380
46441
|
// We use the cached features rather than method to avoid async load. If the
|
|
46381
46442
|
// feature is not already loaded this won't work, but the user wouldn't be mousing over it either.
|
|
46382
|
-
const featureList =
|
|
46443
|
+
const featureList = clickState.viewport.cachedFeatures;
|
|
46383
46444
|
const candidates = [];
|
|
46384
46445
|
if (featureList) {
|
|
46385
46446
|
const proportional = (this.arcType === "proportional" || this.arcType === "inView" || this.arcType === "partialInView");
|
|
@@ -46425,26 +46486,6 @@
|
|
|
46425
46486
|
}
|
|
46426
46487
|
return candidates.map((c) => c.feature)
|
|
46427
46488
|
}
|
|
46428
|
-
|
|
46429
|
-
/**
|
|
46430
|
-
* Return the current state of the track. Used to create sessions and bookmarks.
|
|
46431
|
-
*
|
|
46432
|
-
* @returns {*|{}}
|
|
46433
|
-
*/
|
|
46434
|
-
getState() {
|
|
46435
|
-
|
|
46436
|
-
const config = super.getState();
|
|
46437
|
-
|
|
46438
|
-
// if (this.height !== undefined) config.height = this.height;
|
|
46439
|
-
if (this.arcType !== undefined) config.arcType = this.arcType;
|
|
46440
|
-
if (this.arcOrientation !== undefined) config.arcOrientation = this.arcOrientation;
|
|
46441
|
-
if (this.showBlocks !== undefined) config.showBlocks = this.showBlocks;
|
|
46442
|
-
if (this.blockHeight !== undefined) config.blockHeight = this.blockHeight;
|
|
46443
|
-
if (this.thickness !== undefined) config.thickness = this.thickness;
|
|
46444
|
-
if (this.alpha !== undefined) config.alpha = this.alpha;
|
|
46445
|
-
|
|
46446
|
-
return config
|
|
46447
|
-
}
|
|
46448
46489
|
}
|
|
46449
46490
|
|
|
46450
46491
|
function getMidpoints(feature, genome) {
|
|
@@ -46651,6 +46692,31 @@
|
|
|
46651
46692
|
|
|
46652
46693
|
class VariantTrack extends TrackBase {
|
|
46653
46694
|
|
|
46695
|
+
static defaults = {
|
|
46696
|
+
displayMode: "EXPANDED",
|
|
46697
|
+
sortDirection: "ASC",
|
|
46698
|
+
showGenotypes: true,
|
|
46699
|
+
squishedVariantHeight: 2,
|
|
46700
|
+
squishedCallHeight: 1,
|
|
46701
|
+
expandedCallHeight: 10,
|
|
46702
|
+
expandedVGap: 2,
|
|
46703
|
+
squishedVGap: 1,
|
|
46704
|
+
expandedGroupGap: 10,
|
|
46705
|
+
squishedGroupGap: 5,
|
|
46706
|
+
featureHeight: 14,
|
|
46707
|
+
noGenotypeColor: "rgb(200,180,180)",
|
|
46708
|
+
noCallColor: "rgb(225, 225, 225)",
|
|
46709
|
+
nonRefColor: "rgb(200, 200, 215)",
|
|
46710
|
+
mixedColor: "rgb(200, 220, 200)",
|
|
46711
|
+
homrefColor: "rgb(200, 200, 200)",
|
|
46712
|
+
homvarColor: "rgb(17,248,254)",
|
|
46713
|
+
hetvarColor: "rgb(34,12,253)",
|
|
46714
|
+
colorBy: undefined,
|
|
46715
|
+
visibilityWindow: undefined,
|
|
46716
|
+
labelDisplayMode: undefined,
|
|
46717
|
+
type: "variant"
|
|
46718
|
+
}
|
|
46719
|
+
|
|
46654
46720
|
constructor(config, browser) {
|
|
46655
46721
|
super(config, browser);
|
|
46656
46722
|
}
|
|
@@ -46659,41 +46725,18 @@
|
|
|
46659
46725
|
|
|
46660
46726
|
super.init(config);
|
|
46661
46727
|
|
|
46662
|
-
this.visibilityWindow = config.visibilityWindow;
|
|
46663
|
-
this.displayMode = config.displayMode || "EXPANDED"; // COLLAPSED | EXPANDED | SQUISHED
|
|
46664
|
-
this.labelDisplayMode = config.labelDisplayMode;
|
|
46665
46728
|
this.expandedVariantHeight = config.expandedVariantHeight || config.variantHeight || 10;
|
|
46666
|
-
|
|
46667
|
-
this.squishedCallHeight = config.squishedCallHeight || 1;
|
|
46668
|
-
this.expandedCallHeight = config.expandedCallHeight || 10;
|
|
46669
|
-
this.expandedVGap = config.expandedVGap !== undefined ? config.expandedVGap : 2;
|
|
46670
|
-
this.squishedVGap = config.squishedVGap !== undefined ? config.squishedVGap : 1;
|
|
46671
|
-
this.expandedGroupGap = config.expandedGroupGap || 10;
|
|
46672
|
-
this.squishedGroupGap = config.squishedGroupGap || 5;
|
|
46673
|
-
this.featureHeight = config.featureHeight || 14;
|
|
46674
|
-
this.visibilityWindow = config.visibilityWindow;
|
|
46729
|
+
|
|
46675
46730
|
this.featureSource = FeatureSource(config, this.browser.genome);
|
|
46676
|
-
|
|
46677
|
-
this.noCallColor = config.noCallColor || "rgb(225, 225, 225)";
|
|
46678
|
-
this.nonRefColor = config.nonRefColor || "rgb(200, 200, 215)";
|
|
46679
|
-
this.mixedColor = config.mixedColor || "rgb(200, 220, 200)";
|
|
46680
|
-
this.homrefColor = config.homrefColor || "rgb(200, 200, 200)";
|
|
46681
|
-
this.homvarColor = config.homvarColor || "rgb(17,248,254)";
|
|
46682
|
-
this.hetvarColor = config.hetvarColor || "rgb(34,12,253)";
|
|
46683
|
-
this.sortDirection = "ASC";
|
|
46684
|
-
this.type = config.type || "variant";
|
|
46685
|
-
|
|
46686
|
-
this.colorBy = config.colorBy; // Can be undefined => default
|
|
46731
|
+
|
|
46687
46732
|
this._initColorBy = config.colorBy;
|
|
46688
46733
|
if (config.colorTable) {
|
|
46689
46734
|
this.colorTables = new Map();
|
|
46690
46735
|
this.colorTables.set(config.colorBy, new ColorTable(config.colorTable));
|
|
46691
46736
|
}
|
|
46692
|
-
|
|
46693
46737
|
this._strokecolor = config.strokecolor;
|
|
46694
46738
|
this._context_hook = config.context_hook;
|
|
46695
46739
|
|
|
46696
|
-
this.showGenotypes = config.showGenotypes === undefined ? true : config.showGenotypes;
|
|
46697
46740
|
|
|
46698
46741
|
// The number of variant rows are computed dynamically, but start with "1" by default
|
|
46699
46742
|
this.variantRowCount(1);
|
|
@@ -46703,7 +46746,7 @@
|
|
|
46703
46746
|
async postInit() {
|
|
46704
46747
|
|
|
46705
46748
|
this.header = await this.getHeader(); // cricital, don't remove'
|
|
46706
|
-
if(this.disposed) return
|
|
46749
|
+
if (this.disposed) return // This track was removed during async load
|
|
46707
46750
|
if (undefined === this.visibilityWindow && this.config.indexed !== false) {
|
|
46708
46751
|
const fn = isFile(this.config.url) ? this.config.url.name : this.config.url;
|
|
46709
46752
|
if (isString(fn) && fn.toLowerCase().includes("gnomad")) {
|
|
@@ -46806,7 +46849,7 @@
|
|
|
46806
46849
|
this.variantBandHeight = TOP_MARGIN + rowCount * (variantHeight + vGap);
|
|
46807
46850
|
|
|
46808
46851
|
let callSets = this.callSets;
|
|
46809
|
-
if(!callSets && this._f) {
|
|
46852
|
+
if (!callSets && this._f) {
|
|
46810
46853
|
callSets = this._f.callSets; // "Complementary" variant for structural variants
|
|
46811
46854
|
}
|
|
46812
46855
|
const nCalls = this.getCallsetsLength();
|
|
@@ -46846,9 +46889,9 @@
|
|
|
46846
46889
|
|
|
46847
46890
|
//only paint stroke if a color is defined
|
|
46848
46891
|
let strokecolor = this.getVariantStrokecolor(variant);
|
|
46849
|
-
if (strokecolor){
|
|
46850
|
-
|
|
46851
|
-
|
|
46892
|
+
if (strokecolor) {
|
|
46893
|
+
context.strokeStyle = strokecolor;
|
|
46894
|
+
context.strokeRect(x, y, w, h);
|
|
46852
46895
|
}
|
|
46853
46896
|
|
|
46854
46897
|
// call hook if _context_hook fn is defined
|
|
@@ -46864,7 +46907,7 @@
|
|
|
46864
46907
|
this.sampleHeight = nVariantRows * (callHeight + vGap); // For each sample, there is a call for each variant at this position
|
|
46865
46908
|
|
|
46866
46909
|
let sampleNumber = 0;
|
|
46867
|
-
if(callSets && variant.calls) {
|
|
46910
|
+
if (callSets && variant.calls) {
|
|
46868
46911
|
for (let callSet of callSets) {
|
|
46869
46912
|
const call = variant.calls[callSet.id];
|
|
46870
46913
|
if (call) {
|
|
@@ -46940,13 +46983,12 @@
|
|
|
46940
46983
|
} else if ("MIXED" === v.type) {
|
|
46941
46984
|
variantColor = this.mixedColor;
|
|
46942
46985
|
} else {
|
|
46943
|
-
variantColor = this.
|
|
46986
|
+
variantColor = this.color;
|
|
46944
46987
|
}
|
|
46945
46988
|
return variantColor
|
|
46946
46989
|
}
|
|
46947
46990
|
|
|
46948
46991
|
|
|
46949
|
-
|
|
46950
46992
|
getVariantStrokecolor(variant) {
|
|
46951
46993
|
|
|
46952
46994
|
const v = variant._f || variant;
|
|
@@ -46962,13 +47004,13 @@
|
|
|
46962
47004
|
|
|
46963
47005
|
callContextHook(variant, context, x, y, w, h) {
|
|
46964
47006
|
if (this._context_hook) {
|
|
46965
|
-
|
|
46966
|
-
|
|
47007
|
+
if (typeof this._context_hook === "function") {
|
|
47008
|
+
const v = variant._f || variant;
|
|
46967
47009
|
|
|
46968
|
-
|
|
46969
|
-
|
|
46970
|
-
|
|
46971
|
-
|
|
47010
|
+
context.save();
|
|
47011
|
+
this._context_hook(v, context, x, y, w, h);
|
|
47012
|
+
context.restore();
|
|
47013
|
+
}
|
|
46972
47014
|
}
|
|
46973
47015
|
}
|
|
46974
47016
|
|
|
@@ -47012,7 +47054,7 @@
|
|
|
47012
47054
|
*/
|
|
47013
47055
|
popupData(clickState, featureList) {
|
|
47014
47056
|
|
|
47015
|
-
if(featureList === undefined) featureList = this.clickedFeatures(clickState);
|
|
47057
|
+
if (featureList === undefined) featureList = this.clickedFeatures(clickState);
|
|
47016
47058
|
const genomicLocation = clickState.genomicLocation;
|
|
47017
47059
|
const genomeID = this.browser.genome.id;
|
|
47018
47060
|
const sampleInformation = this.browser.sampleInformation;
|
|
@@ -47240,12 +47282,12 @@
|
|
|
47240
47282
|
sendChordsForViewport(viewport) {
|
|
47241
47283
|
const refFrame = viewport.referenceFrame;
|
|
47242
47284
|
let inView;
|
|
47243
|
-
if("all" === refFrame.chr) {
|
|
47285
|
+
if ("all" === refFrame.chr) {
|
|
47244
47286
|
const all = this.featureSource.getAllFeatures();
|
|
47245
47287
|
const arrays = Object.keys(all).map(k => all[k]);
|
|
47246
47288
|
inView = [].concat(...arrays);
|
|
47247
47289
|
} else {
|
|
47248
|
-
|
|
47290
|
+
inView = this.featureSource.featureCache.queryFeatures(refFrame.chr, refFrame.start, refFrame.end);
|
|
47249
47291
|
|
|
47250
47292
|
}
|
|
47251
47293
|
|
|
@@ -57483,7 +57525,7 @@
|
|
|
57483
57525
|
let locusObject = parseLocusString(browser, locus);
|
|
57484
57526
|
|
|
57485
57527
|
if (!locusObject) {
|
|
57486
|
-
const feature = browser.genome.featureDB
|
|
57528
|
+
const feature = browser.genome.featureDB.get(locus.toUpperCase());
|
|
57487
57529
|
if (feature) {
|
|
57488
57530
|
locusObject = {
|
|
57489
57531
|
chr: feature.chr,
|
|
@@ -59336,7 +59378,7 @@
|
|
|
59336
59378
|
|
|
59337
59379
|
renderTable(records) {
|
|
59338
59380
|
|
|
59339
|
-
Array.from(this.
|
|
59381
|
+
Array.from(this.tableRowContainer.querySelectorAll('.igv-roi-table-row')).forEach(el => el.remove());
|
|
59340
59382
|
|
|
59341
59383
|
if (records.length > 0) {
|
|
59342
59384
|
|
|
@@ -59344,7 +59386,7 @@
|
|
|
59344
59386
|
|
|
59345
59387
|
for (let record of sortedRecords) {
|
|
59346
59388
|
const row = this.tableRowDOM(record);
|
|
59347
|
-
this.
|
|
59389
|
+
this.tableRowContainer.appendChild(row);
|
|
59348
59390
|
}
|
|
59349
59391
|
|
|
59350
59392
|
}
|
|
@@ -59384,14 +59426,14 @@
|
|
|
59384
59426
|
|
|
59385
59427
|
event.stopPropagation();
|
|
59386
59428
|
|
|
59387
|
-
const selected = this.
|
|
59429
|
+
const selected = this.tableDOM.querySelectorAll('.igv-roi-table-row-selected');
|
|
59388
59430
|
const loci = [];
|
|
59389
59431
|
for (let el of selected) {
|
|
59390
59432
|
const { locus } = parseRegionKey(el.dataset.region);
|
|
59391
59433
|
loci.push(locus);
|
|
59392
59434
|
}
|
|
59393
59435
|
|
|
59394
|
-
for (let el of this.
|
|
59436
|
+
for (let el of this.tableDOM.querySelectorAll('.igv-roi-table-row')) {
|
|
59395
59437
|
el.classList.remove('igv-roi-table-row-selected');
|
|
59396
59438
|
}
|
|
59397
59439
|
|
|
@@ -60929,6 +60971,7 @@
|
|
|
60929
60971
|
|
|
60930
60972
|
updateLocusSearchWidget() {
|
|
60931
60973
|
|
|
60974
|
+
if(!this.referenceFrameList) return
|
|
60932
60975
|
const referenceFrameList = this.referenceFrameList;
|
|
60933
60976
|
|
|
60934
60977
|
// Update end position of reference frames based on pixel widths. This is hacky, but its been done here
|
|
@@ -60982,6 +61025,8 @@
|
|
|
60982
61025
|
|
|
60983
61026
|
async zoomWithScaleFactor(scaleFactor, centerBPOrUndefined, referenceFrameOrUndefined) {
|
|
60984
61027
|
|
|
61028
|
+
if(!this.referenceFrameList) return
|
|
61029
|
+
|
|
60985
61030
|
const viewportWidth = this.calculateViewportWidth(this.referenceFrameList.length);
|
|
60986
61031
|
|
|
60987
61032
|
let referenceFrames = referenceFrameOrUndefined ? [referenceFrameOrUndefined] : this.referenceFrameList;
|
|
@@ -61000,6 +61045,8 @@
|
|
|
61000
61045
|
*/
|
|
61001
61046
|
async addMultiLocusPanel(chr, start, end, referenceFrameLeft) {
|
|
61002
61047
|
|
|
61048
|
+
if(!this.referenceFrameList) return
|
|
61049
|
+
|
|
61003
61050
|
// account for reduced viewport width as a result of adding right mate pair panel
|
|
61004
61051
|
const viewportWidth = this.calculateViewportWidth(1 + this.referenceFrameList.length);
|
|
61005
61052
|
const scaleFactor = this.calculateViewportWidth(this.referenceFrameList.length) / this.calculateViewportWidth(1 + this.referenceFrameList.length);
|
|
@@ -61613,6 +61660,8 @@
|
|
|
61613
61660
|
*/
|
|
61614
61661
|
async function resize() {
|
|
61615
61662
|
|
|
61663
|
+
if(!this.referenceFrameList) return
|
|
61664
|
+
|
|
61616
61665
|
const viewportWidth = this.calculateViewportWidth(this.referenceFrameList.length);
|
|
61617
61666
|
|
|
61618
61667
|
for (let referenceFrame of this.referenceFrameList) {
|
|
@@ -62017,7 +62066,7 @@
|
|
|
62017
62066
|
|
|
62018
62067
|
function embedCSS() {
|
|
62019
62068
|
|
|
62020
|
-
var css = '.igv-navbar {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n box-sizing: border-box;\n width: 100%;\n color: #444;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n line-height: 32px;\n padding-left: 8px;\n padding-right: 8px;\n margin-top: 2px;\n margin-bottom: 6px;\n height: 32px;\n border-style: solid;\n border-radius: 3px;\n border-width: thin;\n border-color: #bfbfbf;\n background-color: #f3f3f3;\n}\n.igv-navbar .igv-navbar-left-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 32px;\n line-height: 32px;\n}\n.igv-navbar .igv-navbar-left-container .igv-logo {\n width: 34px;\n height: 32px;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-left-container .igv-current-genome {\n height: 32px;\n margin-left: 4px;\n margin-right: 4px;\n user-select: none;\n line-height: 32px;\n vertical-align: middle;\n text-align: center;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 100%;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-chromosome-select-widget-container {\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n height: 100%;\n width: 125px;\n margin-right: 4px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-chromosome-select-widget-container select {\n display: block;\n cursor: pointer;\n width: 100px;\n height: 75%;\n outline: none;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n margin-left: 8px;\n height: 22px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n width: 210px;\n height: 22px;\n line-height: 22px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container input.igv-search-input {\n cursor: text;\n width: 85%;\n height: 22px;\n line-height: 22px;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n text-align: left;\n padding-left: 8px;\n margin-right: 8px;\n outline: none;\n border-style: solid;\n border-radius: 3px;\n border-width: thin;\n border-color: #bfbfbf;\n background-color: white;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container .igv-search-icon-container {\n cursor: pointer;\n height: 16px;\n width: 16px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-windowsize-panel-container {\n margin-left: 4px;\n user-select: none;\n}\n.igv-navbar .igv-navbar-right-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 32px;\n line-height: 32px;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 100%;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container div {\n margin-left: 0;\n margin-right: 4px;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container div:last-child {\n margin-left: 0;\n margin-right: 0;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container-750 {\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget {\n color: #737373;\n font-size: 18px;\n height: 32px;\n line-height: 32px;\n margin-left: 8px;\n user-select: none;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div {\n cursor: pointer;\n margin-left: unset;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:first-child {\n height: 24px;\n width: 24px;\n margin-left: unset;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:last-child {\n height: 24px;\n width: 24px;\n margin-left: 8px;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:nth-child(even) {\n display: block;\n height: fit-content;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget input {\n display: block;\n width: 125px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget svg {\n display: block;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 {\n color: #737373;\n font-size: 18px;\n height: 32px;\n line-height: 32px;\n margin-left: 8px;\n user-select: none;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div {\n cursor: pointer;\n margin-left: unset;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:first-child {\n height: 24px;\n width: 24px;\n margin-left: unset;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:last-child {\n height: 24px;\n width: 24px;\n margin-left: 8px;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:nth-child(even) {\n width: 0;\n height: 0;\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 input {\n width: 0;\n height: 0;\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 svg {\n display: block;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-hidden {\n display: none;\n}\n\n.igv-navbar-button {\n display: block;\n box-sizing: unset;\n padding-left: 6px;\n padding-right: 6px;\n height: 18px;\n text-transform: capitalize;\n user-select: none;\n line-height: 18px;\n text-align: center;\n vertical-align: middle;\n font-family: \"Open Sans\", sans-serif;\n font-size: 11px;\n font-weight: 200;\n color: #737373;\n background-color: #f3f3f3;\n border-color: #737373;\n border-style: solid;\n border-width: thin;\n border-radius: 6px;\n}\n\n.igv-navbar-button-clicked {\n color: white;\n background-color: #737373;\n}\n\n.igv-navbar-button:hover {\n cursor: pointer;\n}\n\n.igv-zoom-in-notice-container {\n z-index: 1024;\n position: absolute;\n top: 8px;\n left: 50%;\n transform: translate(-50%, 0%);\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n background-color: white;\n}\n.igv-zoom-in-notice-container > div {\n padding-left: 4px;\n padding-right: 4px;\n padding-top: 2px;\n padding-bottom: 2px;\n width: 100%;\n height: 100%;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n color: #3f3f3f;\n}\n\n.igv-zoom-in-notice {\n position: absolute;\n top: 10px;\n left: 50%;\n}\n.igv-zoom-in-notice div {\n position: relative;\n left: -50%;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #3f3f3f;\n background-color: rgba(255, 255, 255, 0.51);\n z-index: 64;\n}\n\n.igv-container-spinner {\n position: absolute;\n top: 90%;\n left: 50%;\n transform: translate(-50%, -50%);\n z-index: 1024;\n width: 24px;\n height: 24px;\n pointer-events: none;\n color: #737373;\n}\n\n.igv-multi-locus-close-button {\n position: absolute;\n top: 2px;\n right: 0;\n padding-left: 2px;\n padding-right: 2px;\n width: 12px;\n height: 12px;\n color: #666666;\n background-color: white;\n z-index: 1000;\n}\n.igv-multi-locus-close-button > svg {\n vertical-align: top;\n}\n\n.igv-multi-locus-close-button:hover {\n cursor: pointer;\n color: #434343;\n}\n\n.igv-multi-locus-ruler-label {\n z-index: 64;\n position: absolute;\n top: 2px;\n left: 0;\n width: 100%;\n height: 12px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n}\n.igv-multi-locus-ruler-label > div {\n font-family: \"Open Sans\", sans-serif;\n font-size: 12px;\n color: rgb(16, 16, 16);\n background-color: white;\n}\n.igv-multi-locus-ruler-label > div {\n cursor: pointer;\n}\n\n.igv-multi-locus-ruler-label-square-dot {\n z-index: 64;\n position: absolute;\n left: 50%;\n top: 5%;\n transform: translate(-50%, 0%);\n background-color: white;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-multi-locus-ruler-label-square-dot > div:first-child {\n width: 14px;\n height: 14px;\n}\n.igv-multi-locus-ruler-label-square-dot > div:last-child {\n margin-left: 16px;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n color: rgb(16, 16, 16);\n}\n\n.igv-ruler-sweeper {\n display: none;\n pointer-events: none;\n position: absolute;\n top: 26px;\n bottom: 0;\n left: 0;\n width: 0;\n z-index: 99999;\n background-color: rgba(68, 134, 247, 0.25);\n}\n\n.igv-ruler-tooltip {\n pointer-events: none;\n z-index: 128;\n position: absolute;\n top: 0;\n left: 0;\n width: 1px;\n height: 32px;\n background-color: transparent;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-ruler-tooltip > div {\n pointer-events: none;\n width: 128px;\n height: auto;\n padding: 1px;\n color: #373737;\n font-size: 10px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n background-color: white;\n border-style: solid;\n border-width: thin;\n border-color: #373737;\n}\n\n.igv-track-label {\n position: absolute;\n left: 8px;\n top: 8px;\n width: auto;\n height: auto;\n max-width: 50%;\n padding-left: 4px;\n padding-right: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n text-align: center;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n border-color: #444;\n border-radius: 2px;\n border-style: solid;\n border-width: thin;\n background-color: white;\n z-index: 128;\n cursor: pointer;\n}\n\n.igv-track-label:hover,\n.igv-track-label:focus,\n.igv-track-label:active {\n background-color: #e8e8e8;\n}\n\n.igv-track-label-popup-shim {\n padding-left: 8px;\n padding-right: 8px;\n padding-top: 4px;\n}\n\n.igv-center-line {\n display: none;\n pointer-events: none;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 50%;\n transform: translateX(-50%);\n z-index: 8;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n border-left-style: dashed;\n border-left-width: thin;\n border-right-style: dashed;\n border-right-width: thin;\n}\n\n.igv-center-line-wide {\n background-color: rgba(0, 0, 0, 0);\n border-left-color: rgba(127, 127, 127, 0.51);\n border-right-color: rgba(127, 127, 127, 0.51);\n}\n\n.igv-center-line-thin {\n background-color: rgba(0, 0, 0, 0);\n border-left-color: rgba(127, 127, 127, 0.51);\n border-right-color: rgba(0, 0, 0, 0);\n}\n\n.igv-cursor-guide-horizontal {\n display: none;\n pointer-events: none;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n position: absolute;\n left: 0;\n right: 0;\n top: 50%;\n height: 1px;\n z-index: 1;\n margin-left: 50px;\n margin-right: 54px;\n border-top-style: dotted;\n border-top-width: thin;\n border-top-color: rgba(127, 127, 127, 0.76);\n}\n\n.igv-cursor-guide-vertical {\n pointer-events: none;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 50%;\n width: 1px;\n z-index: 1;\n border-left-style: dotted;\n border-left-width: thin;\n border-left-color: rgba(127, 127, 127, 0.76);\n display: none;\n}\n\n.igv-user-feedback {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 512px;\n height: 360px;\n z-index: 2048;\n background-color: white;\n border-color: #a2a2a2;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #444;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-user-feedback div:first-child {\n position: relative;\n height: 24px;\n width: 100%;\n background-color: white;\n border-bottom-color: #a2a2a2;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-user-feedback div:first-child div {\n position: absolute;\n top: 2px;\n width: 16px;\n height: 16px;\n background-color: transparent;\n}\n.igv-user-feedback div:first-child div:first-child {\n left: 8px;\n}\n.igv-user-feedback div:first-child div:last-child {\n cursor: pointer;\n right: 8px;\n}\n.igv-user-feedback div:last-child {\n width: 100%;\n height: calc(100% - 24px);\n border-width: 0;\n}\n.igv-user-feedback div:last-child div {\n width: auto;\n height: auto;\n margin: 8px;\n}\n\n.igv-generic-dialog-container {\n position: absolute;\n top: 0;\n left: 0;\n width: 300px;\n height: 200px;\n border-color: #7F7F7F;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n z-index: 2048;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n width: 100%;\n height: 24px;\n cursor: move;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header div {\n margin-right: 4px;\n margin-bottom: 2px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header div:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-generic-dialog-container .igv-generic-dialog-one-liner {\n color: #373737;\n width: 95%;\n height: 24px;\n line-height: 24px;\n text-align: left;\n margin-top: 8px;\n padding-left: 8px;\n overflow-wrap: break-word;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input {\n margin-top: 8px;\n width: 95%;\n height: 24px;\n color: #373737;\n line-height: 24px;\n padding-left: 8px;\n background-color: white;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input div {\n width: 30%;\n height: 100%;\n font-size: 16px;\n text-align: right;\n padding-right: 8px;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input input {\n display: block;\n height: 100%;\n width: 100%;\n padding-left: 4px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n color: #373737;\n text-align: left;\n outline: none;\n border-style: solid;\n border-width: thin;\n border-color: #7F7F7F;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input input {\n width: 50%;\n font-size: 16px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input {\n margin-top: 8px;\n width: calc(100% - 16px);\n height: 24px;\n color: #373737;\n line-height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input input {\n display: block;\n height: 100%;\n width: 100%;\n padding-left: 4px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n color: #373737;\n text-align: left;\n outline: none;\n border-style: solid;\n border-width: thin;\n border-color: #7F7F7F;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input input {\n font-size: 16px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel {\n width: 100%;\n height: 28px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div {\n margin-top: 32px;\n color: white;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n width: 75px;\n height: 28px;\n line-height: 28px;\n text-align: center;\n border-color: transparent;\n border-style: solid;\n border-width: thin;\n border-radius: 2px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:first-child {\n margin-left: 32px;\n margin-right: 0;\n background-color: #5ea4e0;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:last-child {\n margin-left: 0;\n margin-right: 32px;\n background-color: #c4c4c4;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:first-child:hover {\n cursor: pointer;\n background-color: #3b5c7f;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:last-child:hover {\n cursor: pointer;\n background-color: #7f7f7f;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok {\n width: 100%;\n height: 36px;\n margin-top: 32px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok div {\n width: 98px;\n height: 36px;\n line-height: 36px;\n text-align: center;\n color: white;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n border-color: white;\n border-style: solid;\n border-width: thin;\n border-radius: 4px;\n background-color: #2B81AF;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok div:hover {\n cursor: pointer;\n background-color: #25597f;\n}\n\n.igv-generic-container {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 2048;\n background-color: white;\n cursor: pointer;\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-container div:first-child {\n cursor: move;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n height: 24px;\n width: 100%;\n background-color: #dddddd;\n}\n.igv-generic-container div:first-child i {\n display: block;\n color: #5f5f5f;\n cursor: pointer;\n width: 14px;\n height: 14px;\n margin-right: 8px;\n margin-bottom: 4px;\n}\n\n.igv-menu-popup {\n position: absolute;\n top: 0;\n left: 0;\n width: max-content;\n z-index: 4096;\n cursor: pointer;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n color: #4b4b4b;\n background: white;\n border-radius: 4px;\n border-color: #7F7F7F;\n border-style: solid;\n border-width: thin;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-end;\n text-align: left;\n}\n.igv-menu-popup > div:not(:first-child) {\n width: 100%;\n}\n.igv-menu-popup > div:not(:first-child) > div {\n background: white;\n}\n.igv-menu-popup > div:not(:first-child) > div.context-menu {\n padding-left: 4px;\n padding-right: 4px;\n}\n.igv-menu-popup > div:not(:first-child) > div:last-child {\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-menu-popup > div:not(:first-child) > div:hover {\n background: #efefef;\n}\n\n.igv-menu-popup-shim {\n padding-left: 8px;\n padding-right: 8px;\n padding-bottom: 1px;\n padding-top: 1px;\n}\n\n.igv-menu-popup-header {\n position: relative;\n width: 100%;\n height: 24px;\n cursor: move;\n border-top-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-menu-popup-header div {\n margin-right: 4px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-menu-popup-header div:hover {\n cursor: pointer;\n color: #444;\n}\n\n.igv-menu-popup-check-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n width: 100%;\n height: 20px;\n margin-right: 4px;\n background-color: transparent;\n}\n.igv-menu-popup-check-container div {\n padding-top: 2px;\n padding-left: 8px;\n}\n.igv-menu-popup-check-container div:first-child {\n position: relative;\n width: 12px;\n height: 12px;\n}\n.igv-menu-popup-check-container div:first-child svg {\n position: absolute;\n width: 12px;\n height: 12px;\n}\n\n.igv-user-feedback {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 512px;\n height: 360px;\n z-index: 2048;\n background-color: white;\n border-color: #a2a2a2;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #444;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-user-feedback div:first-child {\n position: relative;\n height: 24px;\n width: 100%;\n background-color: white;\n border-bottom-color: #a2a2a2;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-user-feedback div:first-child div {\n position: absolute;\n top: 2px;\n width: 16px;\n height: 16px;\n background-color: transparent;\n}\n.igv-user-feedback div:first-child div:first-child {\n left: 8px;\n}\n.igv-user-feedback div:first-child div:last-child {\n cursor: pointer;\n right: 8px;\n}\n.igv-user-feedback div:last-child {\n width: 100%;\n height: calc(100% - 24px);\n border-width: 0;\n}\n.igv-user-feedback div:last-child div {\n width: auto;\n height: auto;\n margin: 8px;\n}\n\n.igv-loading-spinner-container {\n z-index: 1024;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 32px;\n height: 32px;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n}\n.igv-loading-spinner-container > div {\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n border-radius: 50%;\n border: 4px solid rgba(128, 128, 128, 0.5);\n border-top-color: rgb(255, 255, 255);\n animation: spin 1s ease-in-out infinite;\n -webkit-animation: spin 1s ease-in-out infinite;\n}\n\n@keyframes spin {\n to {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n@-webkit-keyframes spin {\n to {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n.igv-roi-menu-next-gen {\n position: absolute;\n z-index: 512;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n color: #4b4b4b;\n background-color: white;\n width: 192px;\n border-radius: 4px;\n border-color: #7F7F7F;\n border-style: solid;\n border-width: thin;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-menu-next-gen > div:first-child {\n height: 24px;\n border-top-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-roi-menu-next-gen > div:first-child > div {\n margin-right: 4px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-roi-menu-next-gen > div:first-child > div:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-roi-menu-next-gen > div:last-child {\n background-color: white;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: 0;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n text-align: start;\n vertical-align: middle;\n}\n.igv-roi-menu-next-gen > div:last-child > div {\n height: 24px;\n padding-left: 4px;\n border-bottom-style: solid;\n border-bottom-width: thin;\n border-bottom-color: #7f7f7f;\n}\n.igv-roi-menu-next-gen > div:last-child > div:not(:first-child):hover {\n background-color: rgba(127, 127, 127, 0.1);\n}\n.igv-roi-menu-next-gen > div:last-child div:first-child {\n font-style: italic;\n text-align: center;\n padding-right: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.igv-roi-menu-next-gen > div:last-child > div:last-child {\n border-bottom-width: 0;\n border-bottom-color: transparent;\n}\n\n.igv-roi-placeholder {\n font-style: normal;\n color: rgba(75, 75, 75, 0.6);\n}\n\n.igv-roi-table {\n position: absolute;\n z-index: 1024;\n width: fit-content;\n border-color: #7f7f7f;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: 12px;\n font-weight: 400;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n cursor: default;\n}\n.igv-roi-table > div {\n height: 24px;\n font-size: 14px;\n text-align: start;\n vertical-align: middle;\n line-height: 24px;\n}\n.igv-roi-table > div:first-child {\n border-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-top-width: 0;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n cursor: move;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n}\n.igv-roi-table > div:first-child > div:first-child {\n text-align: center;\n width: calc(100% - 4px - 12px);\n}\n.igv-roi-table > div:first-child > div:last-child {\n margin-right: 4px;\n margin-bottom: 2px;\n height: 12px;\n width: 12px;\n color: #7f7f7f;\n}\n.igv-roi-table > div:first-child > div:last-child > svg {\n display: block;\n}\n.igv-roi-table > div:first-child > div:last-child:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-roi-table > .igv-roi-table-description {\n height: fit-content;\n padding: 4px;\n margin-left: 4px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-roi-table > .igv-roi-table-goto-explainer {\n margin-left: 4px;\n color: #7F7F7F;\n font-style: italic;\n}\n.igv-roi-table > .igv-roi-table-column-titles {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n padding-right: 16px;\n background-color: white;\n border-top-color: #7f7f7f;\n border-top-style: solid;\n border-top-width: thin;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: left;\n margin-left: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n border-right-color: #7f7f7f;\n border-right-style: solid;\n border-right-width: thin;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:last-child {\n border-right: unset;\n}\n.igv-roi-table > .igv-roi-table-row-container {\n resize: both;\n overflow: scroll;\n min-height: 72px;\n height: 144px;\n max-height: 480px;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: left;\n margin-left: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n border-right-color: transparent;\n border-right-style: solid;\n border-right-width: thin;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:last-child {\n border-right: unset;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row-hover {\n background-color: rgba(0, 0, 0, 0.04);\n}\n.igv-roi-table > div:last-child {\n height: 32px;\n line-height: 32px;\n border-top-color: #7f7f7f;\n border-top-style: solid;\n border-top-width: thin;\n border-bottom-color: transparent;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-width: 0;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n\n.igv-roi-table-row-selected {\n background-color: rgba(0, 0, 0, 0.125);\n}\n\n.igv-roi-table-button {\n cursor: pointer;\n height: 20px;\n user-select: none;\n line-height: 20px;\n text-align: center;\n vertical-align: middle;\n font-family: \"Open Sans\", sans-serif;\n font-size: 13px;\n font-weight: 400;\n color: black;\n padding-left: 6px;\n padding-right: 6px;\n background-color: rgb(239, 239, 239);\n border-color: black;\n border-style: solid;\n border-width: thin;\n border-radius: 3px;\n}\n\n.igv-roi-table-button:hover {\n font-weight: 400;\n background-color: rgba(0, 0, 0, 0.13);\n}\n\n.igv-roi-region {\n z-index: 64;\n position: absolute;\n top: 0;\n bottom: 0;\n pointer-events: none;\n overflow: visible;\n margin-top: 44px;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-region > div {\n position: relative;\n width: 100%;\n height: 8px;\n pointer-events: auto;\n}\n\n.igv-roi-menu {\n position: absolute;\n z-index: 1024;\n width: 144px;\n border-color: #7f7f7f;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-menu > div:not(:last-child) {\n border-bottom-color: rgba(128, 128, 128, 0.5);\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-roi-menu > div:first-child {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-top-color: transparent;\n border-top-style: solid;\n border-top-width: 0;\n}\n.igv-roi-menu > div:last-child {\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: 0;\n}\n\n.igv-roi-menu-row {\n height: 24px;\n padding-left: 8px;\n font-size: small;\n text-align: start;\n vertical-align: middle;\n line-height: 24px;\n background-color: white;\n}\n\n.igv-roi-menu-row-edit-description {\n width: -webkit-fill-available;\n font-size: small;\n text-align: start;\n vertical-align: middle;\n background-color: white;\n padding-left: 4px;\n padding-right: 4px;\n padding-bottom: 4px;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n}\n.igv-roi-menu-row-edit-description > label {\n margin-left: 2px;\n margin-bottom: 0;\n display: block;\n width: -webkit-fill-available;\n}\n.igv-roi-menu-row-edit-description > input {\n display: block;\n margin-left: 2px;\n margin-right: 2px;\n margin-bottom: 1px;\n width: -webkit-fill-available;\n}\n\n.igv-container {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n padding-top: 4px;\n user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n}\n\n.igv-viewport {\n position: relative;\n margin-top: 5px;\n line-height: 1;\n overflow-x: hidden;\n overflow-y: hidden;\n}\n\n.igv-viewport-content {\n position: relative;\n width: 100%;\n}\n.igv-viewport-content > canvas {\n position: relative;\n display: block;\n}\n\n.igv-column-container {\n position: relative;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n width: 100%;\n}\n\n.igv-column-shim {\n width: 1px;\n margin-left: 2px;\n margin-right: 2px;\n background-color: #545453;\n}\n\n.igv-column {\n position: relative;\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n}\n\n.igv-axis-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 50px;\n}\n.igv-axis-column > div {\n margin-top: 5px;\n width: 100%;\n}\n\n.igv-sample-name-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n}\n\n.igv-scrollbar-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 14px;\n}\n.igv-scrollbar-column > div {\n position: relative;\n margin-top: 5px;\n width: 14px;\n}\n.igv-scrollbar-column > div > div {\n cursor: pointer;\n position: absolute;\n top: 0;\n left: 2px;\n width: 8px;\n border-width: 1px;\n border-style: solid;\n border-color: #c4c4c4;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n}\n.igv-scrollbar-column > div > div:hover {\n background-color: #c4c4c4;\n}\n\n.igv-track-drag-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 12px;\n background-color: white;\n}\n.igv-track-drag-column > .igv-track-drag-handle {\n z-index: 512;\n position: relative;\n cursor: pointer;\n margin-top: 5px;\n width: 100%;\n border-style: solid;\n border-width: 0;\n border-top-right-radius: 6px;\n border-bottom-right-radius: 6px;\n background-color: #c4c4c4;\n}\n.igv-track-drag-column .igv-track-drag-handle-hover {\n background-color: #787878;\n}\n.igv-track-drag-column > .igv-track-drag-shim {\n position: relative;\n margin-top: 5px;\n width: 100%;\n border-style: solid;\n border-width: 0;\n}\n\n.igv-gear-menu-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 28px;\n}\n.igv-gear-menu-column > div {\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n margin-top: 5px;\n width: 100%;\n background: white;\n}\n.igv-gear-menu-column > div > div {\n position: relative;\n margin-top: 4px;\n width: 16px;\n height: 16px;\n color: #7F7F7F;\n}\n.igv-gear-menu-column > div > div:hover {\n cursor: pointer;\n color: #444;\n}\n\n/*# sourceMappingURL=dom.css.map */\n';
|
|
62069
|
+
var css = '.igv-navbar {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n box-sizing: border-box;\n width: 100%;\n color: #444;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n line-height: 32px;\n padding-left: 8px;\n padding-right: 8px;\n margin-top: 2px;\n margin-bottom: 6px;\n height: 32px;\n border-style: solid;\n border-radius: 3px;\n border-width: thin;\n border-color: #bfbfbf;\n background-color: #f3f3f3;\n}\n.igv-navbar .igv-navbar-left-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 32px;\n line-height: 32px;\n}\n.igv-navbar .igv-navbar-left-container .igv-logo {\n width: 34px;\n height: 32px;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-left-container .igv-current-genome {\n height: 32px;\n margin-left: 4px;\n margin-right: 4px;\n user-select: none;\n line-height: 32px;\n vertical-align: middle;\n text-align: center;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 100%;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-chromosome-select-widget-container {\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n height: 100%;\n width: 125px;\n margin-right: 4px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-chromosome-select-widget-container select {\n display: block;\n cursor: pointer;\n width: 100px;\n height: 75%;\n outline: none;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n margin-left: 8px;\n height: 22px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n width: 210px;\n height: 22px;\n line-height: 22px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container input.igv-search-input {\n cursor: text;\n width: 85%;\n height: 22px;\n line-height: 22px;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n text-align: left;\n padding-left: 8px;\n margin-right: 8px;\n outline: none;\n border-style: solid;\n border-radius: 3px;\n border-width: thin;\n border-color: #bfbfbf;\n background-color: white;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container .igv-search-icon-container {\n cursor: pointer;\n height: 16px;\n width: 16px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-windowsize-panel-container {\n margin-left: 4px;\n user-select: none;\n}\n.igv-navbar .igv-navbar-right-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 32px;\n line-height: 32px;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 100%;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container div {\n margin-left: 0;\n margin-right: 4px;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container div:last-child {\n margin-left: 0;\n margin-right: 0;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container-750 {\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget {\n color: #737373;\n font-size: 18px;\n height: 32px;\n line-height: 32px;\n margin-left: 8px;\n user-select: none;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div {\n cursor: pointer;\n margin-left: unset;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:first-child {\n height: 24px;\n width: 24px;\n margin-left: unset;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:last-child {\n height: 24px;\n width: 24px;\n margin-left: 8px;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:nth-child(even) {\n display: block;\n height: fit-content;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget input {\n display: block;\n width: 125px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget svg {\n display: block;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 {\n color: #737373;\n font-size: 18px;\n height: 32px;\n line-height: 32px;\n margin-left: 8px;\n user-select: none;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div {\n cursor: pointer;\n margin-left: unset;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:first-child {\n height: 24px;\n width: 24px;\n margin-left: unset;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:last-child {\n height: 24px;\n width: 24px;\n margin-left: 8px;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:nth-child(even) {\n width: 0;\n height: 0;\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 input {\n width: 0;\n height: 0;\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 svg {\n display: block;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-hidden {\n display: none;\n}\n\n.igv-navbar-button {\n display: block;\n box-sizing: unset;\n padding-left: 6px;\n padding-right: 6px;\n height: 18px;\n text-transform: capitalize;\n user-select: none;\n line-height: 18px;\n text-align: center;\n vertical-align: middle;\n font-family: \"Open Sans\", sans-serif;\n font-size: 11px;\n font-weight: 200;\n color: #737373;\n background-color: #f3f3f3;\n border-color: #737373;\n border-style: solid;\n border-width: thin;\n border-radius: 6px;\n}\n\n.igv-navbar-button-clicked {\n color: white;\n background-color: #737373;\n}\n\n.igv-navbar-button:hover {\n cursor: pointer;\n}\n\n.igv-zoom-in-notice-container {\n z-index: 1024;\n position: absolute;\n top: 8px;\n left: 50%;\n transform: translate(-50%, 0%);\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n background-color: white;\n}\n.igv-zoom-in-notice-container > div {\n padding-left: 4px;\n padding-right: 4px;\n padding-top: 2px;\n padding-bottom: 2px;\n width: 100%;\n height: 100%;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n color: #3f3f3f;\n}\n\n.igv-zoom-in-notice {\n position: absolute;\n top: 10px;\n left: 50%;\n}\n.igv-zoom-in-notice div {\n position: relative;\n left: -50%;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #3f3f3f;\n background-color: rgba(255, 255, 255, 0.51);\n z-index: 64;\n}\n\n.igv-container-spinner {\n position: absolute;\n top: 90%;\n left: 50%;\n transform: translate(-50%, -50%);\n z-index: 1024;\n width: 24px;\n height: 24px;\n pointer-events: none;\n color: #737373;\n}\n\n.igv-multi-locus-close-button {\n position: absolute;\n top: 2px;\n right: 0;\n padding-left: 2px;\n padding-right: 2px;\n width: 12px;\n height: 12px;\n color: #666666;\n background-color: white;\n z-index: 1000;\n}\n.igv-multi-locus-close-button > svg {\n vertical-align: top;\n}\n\n.igv-multi-locus-close-button:hover {\n cursor: pointer;\n color: #434343;\n}\n\n.igv-multi-locus-ruler-label {\n z-index: 64;\n position: absolute;\n top: 2px;\n left: 0;\n width: 100%;\n height: 12px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n}\n.igv-multi-locus-ruler-label > div {\n font-family: \"Open Sans\", sans-serif;\n font-size: 12px;\n color: rgb(16, 16, 16);\n background-color: white;\n}\n.igv-multi-locus-ruler-label > div {\n cursor: pointer;\n}\n\n.igv-multi-locus-ruler-label-square-dot {\n z-index: 64;\n position: absolute;\n left: 50%;\n top: 5%;\n transform: translate(-50%, 0%);\n background-color: white;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-multi-locus-ruler-label-square-dot > div:first-child {\n width: 14px;\n height: 14px;\n}\n.igv-multi-locus-ruler-label-square-dot > div:last-child {\n margin-left: 16px;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n color: rgb(16, 16, 16);\n}\n\n.igv-ruler-sweeper {\n display: none;\n pointer-events: none;\n position: absolute;\n top: 26px;\n bottom: 0;\n left: 0;\n width: 0;\n z-index: 99999;\n background-color: rgba(68, 134, 247, 0.25);\n}\n\n.igv-ruler-tooltip {\n pointer-events: none;\n z-index: 128;\n position: absolute;\n top: 0;\n left: 0;\n width: 1px;\n height: 32px;\n background-color: transparent;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-ruler-tooltip > div {\n pointer-events: none;\n width: 128px;\n height: auto;\n padding: 1px;\n color: #373737;\n font-size: 10px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n background-color: white;\n border-style: solid;\n border-width: thin;\n border-color: #373737;\n}\n\n.igv-track-label {\n position: absolute;\n left: 8px;\n top: 8px;\n width: auto;\n height: auto;\n max-width: 50%;\n padding-left: 4px;\n padding-right: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n text-align: center;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n border-color: #444;\n border-radius: 2px;\n border-style: solid;\n border-width: thin;\n background-color: white;\n z-index: 128;\n cursor: pointer;\n}\n\n.igv-track-label:hover,\n.igv-track-label:focus,\n.igv-track-label:active {\n background-color: #e8e8e8;\n}\n\n.igv-track-label-popup-shim {\n padding-left: 8px;\n padding-right: 8px;\n padding-top: 4px;\n}\n\n.igv-center-line {\n display: none;\n pointer-events: none;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 50%;\n transform: translateX(-50%);\n z-index: 8;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n border-left-style: dashed;\n border-left-width: thin;\n border-right-style: dashed;\n border-right-width: thin;\n}\n\n.igv-center-line-wide {\n background-color: rgba(0, 0, 0, 0);\n border-left-color: rgba(127, 127, 127, 0.51);\n border-right-color: rgba(127, 127, 127, 0.51);\n}\n\n.igv-center-line-thin {\n background-color: rgba(0, 0, 0, 0);\n border-left-color: rgba(127, 127, 127, 0.51);\n border-right-color: rgba(0, 0, 0, 0);\n}\n\n.igv-cursor-guide-horizontal {\n display: none;\n pointer-events: none;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n position: absolute;\n left: 0;\n right: 0;\n top: 50%;\n height: 1px;\n z-index: 1;\n margin-left: 50px;\n margin-right: 54px;\n border-top-style: dotted;\n border-top-width: thin;\n border-top-color: rgba(127, 127, 127, 0.76);\n}\n\n.igv-cursor-guide-vertical {\n pointer-events: none;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 50%;\n width: 1px;\n z-index: 1;\n border-left-style: dotted;\n border-left-width: thin;\n border-left-color: rgba(127, 127, 127, 0.76);\n display: none;\n}\n\n.igv-user-feedback {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 512px;\n height: 360px;\n z-index: 2048;\n background-color: white;\n border-color: #a2a2a2;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #444;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-user-feedback div:first-child {\n position: relative;\n height: 24px;\n width: 100%;\n background-color: white;\n border-bottom-color: #a2a2a2;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-user-feedback div:first-child div {\n position: absolute;\n top: 2px;\n width: 16px;\n height: 16px;\n background-color: transparent;\n}\n.igv-user-feedback div:first-child div:first-child {\n left: 8px;\n}\n.igv-user-feedback div:first-child div:last-child {\n cursor: pointer;\n right: 8px;\n}\n.igv-user-feedback div:last-child {\n width: 100%;\n height: calc(100% - 24px);\n border-width: 0;\n}\n.igv-user-feedback div:last-child div {\n width: auto;\n height: auto;\n margin: 8px;\n}\n\n.igv-generic-dialog-container {\n position: absolute;\n top: 0;\n left: 0;\n width: 300px;\n height: 200px;\n border-color: #7F7F7F;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n z-index: 2048;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n width: 100%;\n height: 24px;\n cursor: move;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header div {\n margin-right: 4px;\n margin-bottom: 2px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header div:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-generic-dialog-container .igv-generic-dialog-one-liner {\n color: #373737;\n width: 95%;\n height: 24px;\n line-height: 24px;\n text-align: left;\n margin-top: 8px;\n padding-left: 8px;\n overflow-wrap: break-word;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input {\n margin-top: 8px;\n width: 95%;\n height: 24px;\n color: #373737;\n line-height: 24px;\n padding-left: 8px;\n background-color: white;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input div {\n width: 30%;\n height: 100%;\n font-size: 16px;\n text-align: right;\n padding-right: 8px;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input input {\n display: block;\n height: 100%;\n width: 100%;\n padding-left: 4px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n color: #373737;\n text-align: left;\n outline: none;\n border-style: solid;\n border-width: thin;\n border-color: #7F7F7F;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input input {\n width: 50%;\n font-size: 16px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input {\n margin-top: 8px;\n width: calc(100% - 16px);\n height: 24px;\n color: #373737;\n line-height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input input {\n display: block;\n height: 100%;\n width: 100%;\n padding-left: 4px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n color: #373737;\n text-align: left;\n outline: none;\n border-style: solid;\n border-width: thin;\n border-color: #7F7F7F;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input input {\n font-size: 16px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel {\n width: 100%;\n height: 28px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div {\n margin-top: 32px;\n color: white;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n width: 75px;\n height: 28px;\n line-height: 28px;\n text-align: center;\n border-color: transparent;\n border-style: solid;\n border-width: thin;\n border-radius: 2px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:first-child {\n margin-left: 32px;\n margin-right: 0;\n background-color: #5ea4e0;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:last-child {\n margin-left: 0;\n margin-right: 32px;\n background-color: #c4c4c4;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:first-child:hover {\n cursor: pointer;\n background-color: #3b5c7f;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:last-child:hover {\n cursor: pointer;\n background-color: #7f7f7f;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok {\n width: 100%;\n height: 36px;\n margin-top: 32px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok div {\n width: 98px;\n height: 36px;\n line-height: 36px;\n text-align: center;\n color: white;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n border-color: white;\n border-style: solid;\n border-width: thin;\n border-radius: 4px;\n background-color: #2B81AF;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok div:hover {\n cursor: pointer;\n background-color: #25597f;\n}\n\n.igv-generic-container {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 2048;\n background-color: white;\n cursor: pointer;\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-container div:first-child {\n cursor: move;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n height: 24px;\n width: 100%;\n background-color: #dddddd;\n}\n.igv-generic-container div:first-child i {\n display: block;\n color: #5f5f5f;\n cursor: pointer;\n width: 14px;\n height: 14px;\n margin-right: 8px;\n margin-bottom: 4px;\n}\n\n.igv-menu-popup {\n position: absolute;\n top: 0;\n left: 0;\n width: max-content;\n z-index: 4096;\n cursor: pointer;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n color: #4b4b4b;\n background: white;\n border-radius: 4px;\n border-color: #7F7F7F;\n border-style: solid;\n border-width: thin;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-end;\n text-align: left;\n}\n.igv-menu-popup > div:not(:first-child) {\n width: 100%;\n}\n.igv-menu-popup > div:not(:first-child) > div {\n background: white;\n}\n.igv-menu-popup > div:not(:first-child) > div.context-menu {\n padding-left: 4px;\n padding-right: 4px;\n}\n.igv-menu-popup > div:not(:first-child) > div:last-child {\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-menu-popup > div:not(:first-child) > div:hover {\n background: #efefef;\n}\n\n.igv-menu-popup-shim {\n padding-left: 8px;\n padding-right: 8px;\n padding-bottom: 1px;\n padding-top: 1px;\n}\n\n.igv-menu-popup-header {\n position: relative;\n width: 100%;\n height: 24px;\n cursor: move;\n border-top-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-menu-popup-header div {\n margin-right: 4px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-menu-popup-header div:hover {\n cursor: pointer;\n color: #444;\n}\n\n.igv-menu-popup-check-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n width: 100%;\n height: 20px;\n margin-right: 4px;\n background-color: transparent;\n}\n.igv-menu-popup-check-container div {\n padding-top: 2px;\n padding-left: 8px;\n}\n.igv-menu-popup-check-container div:first-child {\n position: relative;\n width: 12px;\n height: 12px;\n}\n.igv-menu-popup-check-container div:first-child svg {\n position: absolute;\n width: 12px;\n height: 12px;\n}\n\n.igv-user-feedback {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 512px;\n height: 360px;\n z-index: 2048;\n background-color: white;\n border-color: #a2a2a2;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #444;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-user-feedback div:first-child {\n position: relative;\n height: 24px;\n width: 100%;\n background-color: white;\n border-bottom-color: #a2a2a2;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-user-feedback div:first-child div {\n position: absolute;\n top: 2px;\n width: 16px;\n height: 16px;\n background-color: transparent;\n}\n.igv-user-feedback div:first-child div:first-child {\n left: 8px;\n}\n.igv-user-feedback div:first-child div:last-child {\n cursor: pointer;\n right: 8px;\n}\n.igv-user-feedback div:last-child {\n width: 100%;\n height: calc(100% - 24px);\n border-width: 0;\n}\n.igv-user-feedback div:last-child div {\n width: auto;\n height: auto;\n margin: 8px;\n}\n\n.igv-loading-spinner-container {\n z-index: 1024;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 32px;\n height: 32px;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n}\n.igv-loading-spinner-container > div {\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n border-radius: 50%;\n border: 4px solid rgba(128, 128, 128, 0.5);\n border-top-color: rgb(255, 255, 255);\n animation: spin 1s ease-in-out infinite;\n -webkit-animation: spin 1s ease-in-out infinite;\n}\n\n@keyframes spin {\n to {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n@-webkit-keyframes spin {\n to {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n.igv-roi-menu-next-gen {\n position: absolute;\n z-index: 512;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n color: #4b4b4b;\n background-color: white;\n width: 192px;\n border-radius: 4px;\n border-color: #7F7F7F;\n border-style: solid;\n border-width: thin;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-menu-next-gen > div:first-child {\n height: 24px;\n border-top-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-roi-menu-next-gen > div:first-child > div {\n margin-right: 4px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-roi-menu-next-gen > div:first-child > div:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-roi-menu-next-gen > div:last-child {\n background-color: white;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: 0;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n text-align: start;\n vertical-align: middle;\n}\n.igv-roi-menu-next-gen > div:last-child > div {\n height: 24px;\n padding-left: 4px;\n border-bottom-style: solid;\n border-bottom-width: thin;\n border-bottom-color: #7f7f7f;\n}\n.igv-roi-menu-next-gen > div:last-child > div:not(:first-child):hover {\n background-color: rgba(127, 127, 127, 0.1);\n}\n.igv-roi-menu-next-gen > div:last-child div:first-child {\n font-style: italic;\n text-align: center;\n padding-right: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.igv-roi-menu-next-gen > div:last-child > div:last-child {\n border-bottom-width: 0;\n border-bottom-color: transparent;\n}\n\n.igv-roi-placeholder {\n font-style: normal;\n color: rgba(75, 75, 75, 0.6);\n}\n\n.igv-roi-table {\n position: absolute;\n z-index: 1024;\n width: min-content;\n max-width: 1600px;\n border-color: #7f7f7f;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: 12px;\n font-weight: 400;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n cursor: default;\n}\n.igv-roi-table > div {\n height: 24px;\n font-size: 14px;\n text-align: start;\n vertical-align: middle;\n line-height: 24px;\n}\n.igv-roi-table > div:first-child {\n border-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-top-width: 0;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n cursor: move;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n}\n.igv-roi-table > div:first-child > div:first-child {\n text-align: center;\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n margin-left: 4px;\n margin-right: 4px;\n width: calc(100% - 4px - 12px);\n}\n.igv-roi-table > div:first-child > div:last-child {\n margin-right: 4px;\n margin-bottom: 2px;\n height: 12px;\n width: 12px;\n color: #7f7f7f;\n}\n.igv-roi-table > div:first-child > div:last-child > svg {\n display: block;\n}\n.igv-roi-table > div:first-child > div:last-child:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-roi-table > .igv-roi-table-description {\n padding: 4px;\n margin-left: 4px;\n word-break: break-all;\n overflow-y: auto;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n background-color: transparent;\n}\n.igv-roi-table > .igv-roi-table-goto-explainer {\n margin-top: 5px;\n margin-left: 4px;\n color: #7F7F7F;\n font-style: italic;\n height: 24px;\n border-top: solid lightgray;\n background-color: transparent;\n}\n.igv-roi-table > .igv-roi-table-column-titles {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n padding-right: 16px;\n background-color: white;\n border-top-color: #7f7f7f;\n border-top-style: solid;\n border-top-width: thin;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: left;\n margin-left: 4px;\n height: 24px;\n overflow: hidden;\n text-overflow: ellipsis;\n border-right-color: #7f7f7f;\n border-right-style: solid;\n border-right-width: thin;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:last-child {\n border-right: unset;\n}\n.igv-roi-table > .igv-roi-table-row-container {\n overflow: auto;\n resize: both;\n max-width: 1600px;\n height: 360px;\n background-color: transparent;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: left;\n margin-left: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n border-right-color: transparent;\n border-right-style: solid;\n border-right-width: thin;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:last-child {\n border-right: unset;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row-hover {\n background-color: rgba(0, 0, 0, 0.04);\n}\n.igv-roi-table > div:last-child {\n height: 32px;\n line-height: 32px;\n border-top-color: #7f7f7f;\n border-top-style: solid;\n border-top-width: thin;\n border-bottom-color: transparent;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-width: 0;\n background-color: #eee;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n\n.igv-roi-table-row-selected {\n background-color: rgba(0, 0, 0, 0.125);\n}\n\n.igv-roi-table-button {\n cursor: pointer;\n height: 20px;\n user-select: none;\n line-height: 20px;\n text-align: center;\n vertical-align: middle;\n font-family: \"Open Sans\", sans-serif;\n font-size: 13px;\n font-weight: 400;\n color: black;\n padding-left: 6px;\n padding-right: 6px;\n background-color: rgb(239, 239, 239);\n border-color: black;\n border-style: solid;\n border-width: thin;\n border-radius: 3px;\n}\n\n.igv-roi-table-button:hover {\n font-weight: 400;\n background-color: rgba(0, 0, 0, 0.13);\n}\n\n.igv-roi-region {\n z-index: 64;\n position: absolute;\n top: 0;\n bottom: 0;\n pointer-events: none;\n overflow: visible;\n margin-top: 44px;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-region > div {\n position: relative;\n width: 100%;\n height: 8px;\n pointer-events: auto;\n}\n\n.igv-roi-menu {\n position: absolute;\n z-index: 1024;\n width: 144px;\n border-color: #7f7f7f;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-menu > div:not(:last-child) {\n border-bottom-color: rgba(128, 128, 128, 0.5);\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-roi-menu > div:first-child {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-top-color: transparent;\n border-top-style: solid;\n border-top-width: 0;\n}\n.igv-roi-menu > div:last-child {\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: 0;\n}\n\n.igv-roi-menu-row {\n height: 24px;\n padding-left: 8px;\n font-size: small;\n text-align: start;\n vertical-align: middle;\n line-height: 24px;\n background-color: white;\n}\n\n.igv-roi-menu-row-edit-description {\n width: -webkit-fill-available;\n font-size: small;\n text-align: start;\n vertical-align: middle;\n background-color: white;\n padding-left: 4px;\n padding-right: 4px;\n padding-bottom: 4px;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n}\n.igv-roi-menu-row-edit-description > label {\n margin-left: 2px;\n margin-bottom: 0;\n display: block;\n width: -webkit-fill-available;\n}\n.igv-roi-menu-row-edit-description > input {\n display: block;\n margin-left: 2px;\n margin-right: 2px;\n margin-bottom: 1px;\n width: -webkit-fill-available;\n}\n\n.igv-container {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n padding-top: 4px;\n user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n}\n\n.igv-viewport {\n position: relative;\n margin-top: 5px;\n line-height: 1;\n overflow-x: hidden;\n overflow-y: hidden;\n}\n\n.igv-viewport-content {\n position: relative;\n width: 100%;\n}\n.igv-viewport-content > canvas {\n position: relative;\n display: block;\n}\n\n.igv-column-container {\n position: relative;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n width: 100%;\n}\n\n.igv-column-shim {\n width: 1px;\n margin-left: 2px;\n margin-right: 2px;\n background-color: #545453;\n}\n\n.igv-column {\n position: relative;\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n}\n\n.igv-axis-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 50px;\n}\n.igv-axis-column > div {\n margin-top: 5px;\n width: 100%;\n}\n\n.igv-sample-name-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n}\n\n.igv-scrollbar-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 14px;\n}\n.igv-scrollbar-column > div {\n position: relative;\n margin-top: 5px;\n width: 14px;\n}\n.igv-scrollbar-column > div > div {\n cursor: pointer;\n position: absolute;\n top: 0;\n left: 2px;\n width: 8px;\n border-width: 1px;\n border-style: solid;\n border-color: #c4c4c4;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n}\n.igv-scrollbar-column > div > div:hover {\n background-color: #c4c4c4;\n}\n\n.igv-track-drag-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 12px;\n background-color: white;\n}\n.igv-track-drag-column > .igv-track-drag-handle {\n z-index: 512;\n position: relative;\n cursor: pointer;\n margin-top: 5px;\n width: 100%;\n border-style: solid;\n border-width: 0;\n border-top-right-radius: 6px;\n border-bottom-right-radius: 6px;\n background-color: #c4c4c4;\n}\n.igv-track-drag-column .igv-track-drag-handle-hover {\n background-color: #787878;\n}\n.igv-track-drag-column > .igv-track-drag-shim {\n position: relative;\n margin-top: 5px;\n width: 100%;\n border-style: solid;\n border-width: 0;\n}\n\n.igv-gear-menu-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 28px;\n}\n.igv-gear-menu-column > div {\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n margin-top: 5px;\n width: 100%;\n background: white;\n}\n.igv-gear-menu-column > div > div {\n position: relative;\n margin-top: 4px;\n width: 16px;\n height: 16px;\n color: #7F7F7F;\n}\n.igv-gear-menu-column > div > div:hover {\n cursor: pointer;\n color: #444;\n}\n\n/*# sourceMappingURL=dom.css.map */\n';
|
|
62021
62070
|
|
|
62022
62071
|
var style = document.createElement('style');
|
|
62023
62072
|
style.setAttribute('type', 'text/css');
|