igv 2.15.1 → 2.15.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/igv.js CHANGED
@@ -18662,6 +18662,8 @@
18662
18662
 
18663
18663
  async _loadURL(url, options) {
18664
18664
 
18665
+ const self = this;
18666
+
18665
18667
  //console.log(`${Date.now()} ${url}`)
18666
18668
  url = mapUrl$1(url);
18667
18669
 
@@ -18751,7 +18753,7 @@
18751
18753
  // For small files a range starting at 0 can return the whole file => 200
18752
18754
  // Provide just the slice we asked for, throw out the rest quietly
18753
18755
  // If file is large warn user
18754
- if (xhr.response.length > 100000 && !this.RANGE_WARNING_GIVEN) {
18756
+ if (xhr.response.length > 100000 && !self.RANGE_WARNING_GIVEN) {
18755
18757
  alert(`Warning: Range header ignored for URL: ${url}. This can have severe performance impacts.`);
18756
18758
  }
18757
18759
  resolve(xhr.response.slice(range.start, range.start + range.size));
@@ -18780,8 +18782,9 @@
18780
18782
  xhr.onerror = function (event) {
18781
18783
  if (isGoogleURL(url) && !options.retries) {
18782
18784
  tryGoogleAuth();
18785
+ } else {
18786
+ handleError("Error accessing resource: " + url + " Status: " + xhr.status);
18783
18787
  }
18784
- handleError("Error accessing resource: " + url + " Status: " + xhr.status);
18785
18788
  };
18786
18789
 
18787
18790
  xhr.ontimeout = function (event) {
@@ -18796,7 +18799,11 @@
18796
18799
  try {
18797
18800
  xhr.send(sendData);
18798
18801
  } catch (e) {
18799
- reject(e);
18802
+ if (isGoogleURL(url) && !options.retries) {
18803
+ tryGoogleAuth();
18804
+ } else {
18805
+ handleError(e);
18806
+ }
18800
18807
  }
18801
18808
 
18802
18809
 
@@ -18813,7 +18820,7 @@
18813
18820
  const accessToken = await fetchGoogleAccessToken(url);
18814
18821
  options.retries = 1;
18815
18822
  options.oauthToken = accessToken;
18816
- const response = await this._load(url, options);
18823
+ const response = await self.load(url, options);
18817
18824
  resolve(response);
18818
18825
  } catch (e) {
18819
18826
  if (e.error) {
@@ -18959,14 +18966,16 @@
18959
18966
  */
18960
18967
  function mapUrl$1(url) {
18961
18968
 
18962
- if (url.includes("//www.dropbox.com")) {
18969
+ if (url.startsWith("https://www.dropbox.com")) {
18963
18970
  return url.replace("//www.dropbox.com", "//dl.dropboxusercontent.com")
18964
- } else if (url.includes("//drive.google.com")) {
18971
+ } else if (url.startsWith("https://drive.google.com")) {
18965
18972
  return getDriveDownloadURL(url)
18966
18973
  } else if (url.includes("//www.broadinstitute.org/igvdata")) {
18967
18974
  return url.replace("//www.broadinstitute.org/igvdata", "//data.broadinstitute.org/igvdata")
18968
18975
  } else if (url.includes("//igvdata.broadinstitute.org")) {
18969
- return url.replace("//igvdata.broadinstitute.org", "https://dn7ywbm9isq8j.cloudfront.net")
18976
+ return url.replace("//igvdata.broadinstitute.org", "//s3.amazonaws.com/igv.broadinstitute.org")
18977
+ } else if (url.includes("//igv.genepattern.org")) {
18978
+ return url.replace("//igv.genepattern.org", "//igv-genepattern-org.s3.amazonaws.com")
18970
18979
  } else if (url.startsWith("ftp://ftp.ncbi.nlm.nih.gov/geo")) {
18971
18980
  return url.replace("ftp://", "https://")
18972
18981
  } else {
@@ -23928,7 +23937,7 @@
23928
23937
  }
23929
23938
  };
23930
23939
 
23931
- const _version = "2.15.1";
23940
+ const _version = "2.15.2";
23932
23941
  function version() {
23933
23942
  return _version
23934
23943
  }
@@ -25765,15 +25774,15 @@
25765
25774
  * @param keyValueDelim
25766
25775
  * @returns {[]}
25767
25776
  */
25768
- function parseAttributeString(attributeString, keyValueDelim) {
25777
+ function parseAttributeString(attributeString, keyValueDelim, relaxed = false) {
25769
25778
  // parse 'attributes' string (see column 9 docs in https://github.com/The-Sequence-Ontology/Specifications/blob/master/gff3.md)
25770
25779
  var attributes = [];
25771
25780
  for (let kv of attributeString.split(';')) {
25772
25781
  kv = kv.trim();
25773
25782
  const idx = kv.indexOf(keyValueDelim);
25774
25783
  if (idx > 0 && idx < kv.length - 1) {
25775
- const key = kv.substring(0, idx);
25776
- let value = stripQuotes(decodeGFFAttribute(kv.substring(idx + 1).trim()));
25784
+ const key = stripQuotes(decodeGFFAttribute(kv.substring(0, idx).trim(), relaxed));
25785
+ let value = stripQuotes(decodeGFFAttribute(kv.substring(idx + 1).trim(), relaxed));
25777
25786
  attributes.push([key, value]);
25778
25787
  }
25779
25788
  }
@@ -25812,11 +25821,14 @@
25812
25821
  ["%2C", ","]
25813
25822
  ]);
25814
25823
 
25815
- function decodeGFFAttribute(str) {
25824
+ function decodeGFFAttribute(str, relaxed = false) {
25816
25825
 
25817
25826
  if (!str.includes("%")) {
25818
25827
  return str
25819
25828
  }
25829
+ if (relaxed) {
25830
+ return decodeURIComponent(str);
25831
+ }
25820
25832
  let decoded = "";
25821
25833
  for (let i = 0; i < str.length; i++) {
25822
25834
 
@@ -25874,7 +25886,7 @@
25874
25886
 
25875
25887
  // Potentially parse name field as GFF column 9 style streng.
25876
25888
  if (tokens[3].indexOf(';') > 0 && tokens[3].indexOf('=') > 0) {
25877
- const attributeKVs = parseAttributeString(tokens[3], '=');
25889
+ const attributeKVs = parseAttributeString(tokens[3], '=', true);
25878
25890
  feature.attributes = {};
25879
25891
  for (let kv of attributeKVs) {
25880
25892
  feature.attributes[kv[0]] = kv[1];
@@ -27275,6 +27287,8 @@
27275
27287
  }
27276
27288
  tracklineConfg.autoscale = false;
27277
27289
  tracklineConfg.dataRange = {min, max};
27290
+ this.viewLimitMin = min;
27291
+ this.viewLimitMax = max;
27278
27292
  }
27279
27293
  case "name":
27280
27294
  tracklineConfg[key] = properties[key];
@@ -29173,9 +29187,9 @@
29173
29187
  * @returns {boolean|boolean}
29174
29188
  */
29175
29189
  function canMerge(chunk1, chunk2) {
29176
- const gap = chunk2.minv.block - chunk1.maxv.block;
29190
+ chunk2.minv.block - chunk1.maxv.block;
29177
29191
  const sizeEstimate = chunk1.maxv.block - chunk1.minv.block;
29178
- return gap < 65000 && sizeEstimate < 5000000
29192
+ return sizeEstimate < 5000000
29179
29193
  }
29180
29194
 
29181
29195
  // Represents a CSI Bam or Tabix index
@@ -40798,8 +40812,8 @@
40798
40812
  color = IGVColor.addAlpha(color, feature.alpha);
40799
40813
  } else if (this.useScore && feature.score && !Number.isNaN(feature.score)) {
40800
40814
  // UCSC useScore option, for scores between 0-1000. See https://genome.ucsc.edu/goldenPath/help/customTrack.html#TRACK
40801
- const min = this.config.min ? this.config.min : 0; //getViewLimitMin(track);
40802
- const max = this.config.max ? this.config.max : 1000; //getViewLimitMax(track);
40815
+ const min = this.config.min ? this.config.min : this.viewLimitMin ? this.viewLimitMin : 0;
40816
+ const max = this.config.max ? this.config.max : this.viewLimitMax ? this.viewLimitMax : 1000;
40803
40817
  const alpha = getAlpha(min, max, feature.score);
40804
40818
  feature.alpha = alpha; // Avoid computing again
40805
40819
  color = IGVColor.addAlpha(color, alpha);
@@ -54168,11 +54182,13 @@
54168
54182
 
54169
54183
  // console.log(h5_obj_keys)
54170
54184
  let signal_bin = new ParseSignals(h5_obj_keys);
54171
- this.rd_bins = signal_bin.get_rd_bins();
54185
+ let rd_bins = signal_bin.get_rd_bins();
54186
+ let snp_bins = signal_bin.get_snp_bins();
54187
+ this.available_bins = [...new Set(rd_bins, snp_bins)];
54172
54188
 
54173
54189
  // let bin_size = this.bin_size
54174
- if(! this.rd_bins.includes(bin_size)){
54175
- bin_size = this.rd_bins[rd_bins.length-1];
54190
+ if(! this.available_bins.includes(bin_size)){
54191
+ bin_size = this.available_bins.at(-1);
54176
54192
  }
54177
54193
 
54178
54194
  const chr_ds = await h5_obj.get("rd_chromosomes");
@@ -54216,6 +54232,9 @@
54216
54232
  let signal_baf_1 = `snp_likelihood_${chrom}_${bin_size}_mask`;
54217
54233
  let chr_wig_bafs = await this.get_baf_signals(h5_obj, h5_obj_keys, chrom, bin_size, signal_baf_1);
54218
54234
 
54235
+ // let signal_baf_1 = `snp_i1_${chrom}_${bin_size}_mask`
54236
+ // let chr_wig_bafs = await this.get_baf_signals_v2(h5_obj, h5_obj_keys, chrom, bin_size, signal_baf_1)
54237
+
54219
54238
  wigFeatures_baf1 = wigFeatures_baf1.concat(chr_wig_bafs[0]);
54220
54239
  wigFeatures_baf2 = wigFeatures_baf2.concat(chr_wig_bafs[1]);
54221
54240
  // this.rd_call_combined(h5_obj, h5_obj_keys, chrom, bin_size, rd_stat)
@@ -54340,6 +54359,28 @@
54340
54359
  }
54341
54360
  return [chr_wig_1, chr_wig_2]
54342
54361
  }
54362
+
54363
+ async get_baf_signals_v2(h5_obj, h5_obj_keys, chrom, bin_size, signal_name){
54364
+
54365
+ /* return two list of dictionary*/
54366
+ let chr_wig_1 = [];
54367
+ let chr_wig_2 = [];
54368
+ if (h5_obj_keys.includes(signal_name)){
54369
+ let chrom_dataset = await h5_obj.get(signal_name);
54370
+ let chrom_data = await chrom_dataset.to_array(); //create_nested_array(value, shape)
54371
+ chrom_data.forEach((lh, bin_idx) => {
54372
+ if (!isNaN(lh)){
54373
+ chr_wig_1.push({chr:chrom, start: bin_idx*bin_size, end: (bin_idx+1) * bin_size, value: -2 * ( 0.5 - lh )});
54374
+ if(lh != 0.5){
54375
+ chr_wig_2.push({chr:chrom, start: bin_idx*bin_size, end: (bin_idx+1) * bin_size, value: -2 * ( 0.5 + lh )});
54376
+ }
54377
+ }
54378
+ });
54379
+ }
54380
+ console.log(chrom, chr_wig_1, chr_wig_2);
54381
+ return [chr_wig_1, chr_wig_2]
54382
+
54383
+ }
54343
54384
  }
54344
54385
 
54345
54386
  class ParseSignals{
@@ -54380,6 +54421,53 @@
54380
54421
  }
54381
54422
  }
54382
54423
 
54424
+ class GetFit {
54425
+ constructor(allBins) {
54426
+ this.allBins = allBins;
54427
+ }
54428
+ getValues() {
54429
+ const bins = Object.values(this.allBins).reduce(
54430
+ (binResult, bin) => { return binResult.concat(bin.filter(a => a.binScore > 0).map(a => a.binScore)) }, []);
54431
+ return bins
54432
+ }
54433
+ getMean(data) {
54434
+ return (data.reduce(function (a, b) { return a + b; }) / data.length);
54435
+ }
54436
+ fit_data() {
54437
+ let rd_list = this.getValues();
54438
+ let distParmas = getDistParams(rd_list);
54439
+ return distParmas
54440
+ }
54441
+
54442
+ histogram(data, bins) {
54443
+ const step = bins[1] - bins[0];
54444
+ const hist_bins = [];
54445
+
54446
+ data.forEach((value, index) => {
54447
+ bins.forEach((bin_value, bin_index) => {
54448
+ if (!hist_bins[bin_value]) {
54449
+ hist_bins[bin_value] = { count: 0 };
54450
+ }
54451
+ if (bin_value <= value && value < bin_value + step) {
54452
+ hist_bins[bin_value].count++;
54453
+ return false;
54454
+ }
54455
+ });
54456
+ });
54457
+ const dist_p = [];
54458
+ hist_bins.forEach((bin, index) => { dist_p.push(bin.count); });
54459
+ return dist_p
54460
+ }
54461
+
54462
+ }
54463
+
54464
+ function range_function(start, stop, step) {
54465
+ const data_array = Array(Math.ceil((stop - start) / step))
54466
+ .fill(start)
54467
+ .map((x, y) => x + y * step);
54468
+ return data_array;
54469
+ }
54470
+
54383
54471
  function filterOutliers(someArray) {
54384
54472
 
54385
54473
  if (someArray.length < 4)
@@ -54412,6 +54500,21 @@
54412
54500
  return [mean, std]
54413
54501
  }
54414
54502
 
54503
+ function linspace(a, b, n) {
54504
+ if (typeof n === "undefined") n = Math.max(Math.round(b - a) + 1, 1);
54505
+ if (n < 2) {
54506
+ return n === 1 ? [a] : [];
54507
+ }
54508
+ var ret = Array(n);
54509
+ n--;
54510
+ for (let i = n; i >= 0; i--) {
54511
+ ret[i] = (i * b + (n - i) * a) / n;
54512
+ }
54513
+ return ret;
54514
+ }
54515
+
54516
+ var g_utils = { range_function, getDistParams, linspace, GetFit};
54517
+
54415
54518
  /**
54416
54519
  * Evaluates the cumulative distribution function (CDF) for a Student's t distribution with degrees of freedom `v` at a value `t`.
54417
54520
  *
@@ -54556,48 +54659,507 @@
54556
54659
  return Math.log(gamma(xg))
54557
54660
  }
54558
54661
 
54559
- var t_dist = {TdistributionCDF, gamma};
54662
+ function t_test_1_sample$1(mean, m, s, n) {
54663
+ if (s == 0) s = 1;
54664
+ var t = ((mean - m) / s) * Math.sqrt(n);
54665
+ var p = 1.0 - TdistributionCDF(Math.abs(t), (n - 1));
54666
+ return p
54667
+ }
54560
54668
 
54561
- class GetFit {
54562
- constructor(allBins) {
54563
- this.allBins = allBins;
54564
- }
54565
- getValues() {
54566
- const bins = Object.values(this.allBins).reduce(
54567
- (binResult, bin) => { return binResult.concat(bin.filter(a => a.binScore > 0).map(a => a.binScore)) }, []);
54568
- return bins
54669
+ function t_test_2_samples$1(m1, s1, n1, m2, s2, n2) {
54670
+ if (s1 == 0) s1 = 1;
54671
+ if (s2 == 0) s2 = 1;
54672
+ var t = (m1 - m2) / Math.sqrt(s1 ** 2 / n1 + s2 ** 2 / n2);
54673
+ var df = ((s1 ** 2 / n1 + s2 ** 2 / n2) ** 2 * (n1 - 1) * (n2 - 1)) /
54674
+ ((s1 ** 4 * (n2 - 1)) / n1 ** 2 + (s2 ** 4 * (n1 - 1)) / n2 ** 2);
54675
+
54676
+ var p = 1.0 - TdistributionCDF(Math.abs(t), parseInt(df + 0.5));
54677
+
54678
+ return p
54679
+ }
54680
+
54681
+ var t_dist = {TdistributionCDF, gamma, t_test_1_sample: t_test_1_sample$1, t_test_2_samples: t_test_2_samples$1};
54682
+
54683
+ class CombinedCaller{
54684
+ constructor(wigFeatures, binSize) {
54685
+ this.wigFeatures = wigFeatures;
54686
+ this.binSize = binSize;
54687
+ // let fit_obj = this.get_fit()
54688
+ // this.globalMean = fit_obj.globalMean
54689
+ // this.globalStd = fit_obj.globalStd
54569
54690
  }
54570
- getMean(data) {
54571
- return (data.reduce(function (a, b) { return a + b; }) / data.length);
54691
+ get_fit(){
54692
+ var fit_info = new g_utils.GetFit(this.wigFeatures);
54693
+ var [globalMean, globalStd] = fit_info.fit_data();
54694
+
54695
+ return {globalMean:globalMean, globalStd:globalStd}
54696
+
54572
54697
  }
54573
- fit_data() {
54574
- let rd_list = this.getValues();
54575
- let distParmas = getDistParams(rd_list);
54576
- return distParmas
54698
+ async call_2d(omin=null, mcount=null, event_type="both", max_distance=0.1, baf_threshold=0, max_copy_number=10, min_cell_fraction=0.0){
54699
+
54700
+ let fit_obj = this.get_fit();
54701
+ this.globalMean = fit_obj.globalMean;
54702
+ this.globalStd = fit_obj.globalStd;
54703
+
54704
+ let overlap_min = omin==null ? 0.05 * this.binSize / 3e9: omin ;
54705
+ let min_count = mcount == null ? parseInt(this.binSize / 10000) : mcount ;
54706
+
54707
+ let gstat_rd0 = [];
54708
+ let gstat_rd_all = [];
54709
+ let gstat_rd = [];
54710
+ let gstat_error = [];
54711
+ let gstat_lh = [];
54712
+ let gstat_n = [];
54713
+
54714
+ for (const [chr, wig] of Object.entries(this.wigFeatures)) {
54715
+ let segments = [];
54716
+ let levels = [];
54717
+ let likelihoods = [];
54718
+
54719
+ wig.forEach((bin, bin_idx) => {
54720
+ if (bin.hets_count > 4 ){
54721
+
54722
+ if( bin.dp_count > min_count ){
54723
+ segments.push([bin_idx]);
54724
+ levels.push(bin.binScore);
54725
+ likelihoods.push(bin.likelihood_score);
54726
+ delete bin.likelihood_score;
54727
+
54728
+ }
54729
+ }
54730
+ });
54731
+
54732
+ let diff_level = [];
54733
+ for(let i=1; i<levels.length; i++){
54734
+ diff_level.push(Math.abs(levels[i] - levels[i-1]));
54735
+ }
54736
+ let min_flank = [0];
54737
+ for(let i=1; i<diff_level.length; i++){
54738
+ min_flank.push(Math.min(diff_level[i-1], diff_level[i]));
54739
+ }
54740
+ min_flank.push(0);
54741
+
54742
+ let error = levels.map((x, x_idx) => {return Math.sqrt(Math.sqrt(x) ** 2 + this.globalStd ** 2 + Math.pow(min_flank[x_idx]/2, 2));});
54743
+
54744
+ let overlaps = [];
54745
+
54746
+ for(let i=0; i< segments.length-1; i++){
54747
+
54748
+ let lh_overlap = 0;
54749
+ try{
54750
+ lh_overlap = likelihood_overlap(likelihoods[i], likelihoods[i+1]);
54751
+ }catch{
54752
+ console.log("Overlap failed: ", i, likelihoods[i], segments[i+1], likelihoods[i+1]);
54753
+ }
54754
+
54755
+ let rd_overlap = normal_overlap_approx(levels[i], error[i], levels[i+1], error[i+1]);
54756
+ overlaps.push(rd_overlap * lh_overlap);
54757
+
54758
+ }
54759
+
54760
+ while(overlaps.length >0) {
54761
+ overlaps = overlaps.filter(num => typeof num === "number");
54762
+
54763
+ let max_overlap = arrayMax(overlaps);
54764
+ if(isNaN(max_overlap)){
54765
+ console.log('NaN value', overlaps);
54766
+ }
54767
+ if(max_overlap < overlap_min){
54768
+ // console.log("maxoverlap ",max_overlap, "is smaller than overlap min")
54769
+ break
54770
+ }
54771
+ let i = overlaps.indexOf(max_overlap);
54772
+
54773
+ let merge_level = normal_merge(levels[i], error[i], levels[i + 1], error[i + 1]);
54774
+
54775
+ let nlh;
54776
+ let nlh_sum;
54777
+ try{
54778
+ nlh = likelihoods[i].map((l_value, l_idx) => { return l_value * likelihoods[i+1][l_idx]});
54779
+
54780
+ nlh_sum = nlh.reduce((a, c_value) => {return a + c_value});
54781
+
54782
+ }catch{
54783
+ console.log(likelihoods);
54784
+ console.log('max_overlap:', max_overlap, i, overlaps.length);
54785
+ console.log('likelihood: ', i ,likelihoods[i], likelihoods[i+1]);
54786
+ console.log('nlh: ', nlh_sum);
54787
+ }
54788
+ // nlh_sum = nlh.reduce((a, c_value) => {return a + c_value});
54789
+
54790
+ levels[i] = merge_level.nl;
54791
+ error[i] = merge_level.ne;
54792
+
54793
+ likelihoods[i] = nlh.map(function(item) { return item/nlh_sum } );
54794
+
54795
+ segments[i].push(...segments[i+1]);
54796
+
54797
+ levels.splice(i + 1, 1);
54798
+ error.splice(i + 1, 1);
54799
+ segments.splice(i + 1, 1);
54800
+ likelihoods.splice(i + 1, 1);
54801
+ overlaps.splice(i, 1);
54802
+
54803
+ if(i < overlaps.length){
54804
+
54805
+ let rd_overlap = normal_overlap_approx(levels[i], error[i], levels[i+1], error[i+1]);
54806
+ let new_overlap = rd_overlap * likelihood_overlap(likelihoods[i], likelihoods[i + 1]);
54807
+
54808
+ overlaps[i] = new_overlap;
54809
+ }
54810
+ if(i > 0){
54811
+ let new_overlap = normal_overlap_approx(levels[i - 1], error[i - 1], levels[i], error[i])
54812
+ * likelihood_overlap(likelihoods[i - 1], likelihoods[i]);
54813
+ overlaps[i - 1] = new_overlap;
54814
+ }
54815
+
54816
+ }
54817
+ let ons = -1;
54818
+ while(true){
54819
+ overlaps = [];
54820
+ for(let i=0; i< levels.length; i++){
54821
+ for(let j=i; j<levels.length; j++){
54822
+ if(segments[j][0] - segments[i].at(-1) < max_distance * (segments[i].length + segments[j].length)){
54823
+ overlaps.push(normal_overlap_approx(levels[i], error[i], levels[j], error[j]) * likelihood_overlap(likelihoods[i], likelihoods[j]));
54824
+ }
54825
+ }
54826
+ }
54827
+
54828
+ if(overlaps.length == 0){
54829
+ break
54830
+ }
54831
+ let max_overlap = arrayMax(overlaps);
54832
+ if(max_overlap < overlap_min){
54833
+ break
54834
+ }
54835
+ let i = 0;
54836
+ let j = 1;
54837
+ while (i < segments.length - 1){
54838
+ let overlap_value = normal_overlap_approx(levels[i], error[i], levels[j], error[j]) * likelihood_overlap(likelihoods[i], likelihoods[j]);
54839
+
54840
+ if((segments[j][0] - segments[i].at(-1)) < max_distance * (segments[i].length + segments[j].length) && overlap_value == max_overlap){
54841
+ let merge_level = normal_merge(levels[i], error[i], levels[i + 1], error[i + 1]);
54842
+
54843
+ levels[i] = merge_level.nl;
54844
+ error[i] = merge_level.ne;
54845
+ let nlh = likelihoods[i].map((l_value, l_idx) => { return l_value * likelihoods[i+1][l_idx]});
54846
+ let nlh_sum = nlh.reduce((a, c_value) => {return a + c_value});
54847
+ likelihoods[i] = nlh.map(function(item) { return item/nlh_sum } );
54848
+
54849
+
54850
+ segments[i].push(...segments[i+1]);
54851
+ segments[i] = segments[i].sort((a,b) => a-b);
54852
+
54853
+ levels.splice(j, 1);
54854
+ error.splice(j, 1);
54855
+ segments.splice(j, 1);
54856
+ likelihoods.splice(j, 1);
54857
+
54858
+ if(j >= segments.length){
54859
+ i += 1;
54860
+ j = i + 1;
54861
+ }
54862
+
54863
+ }else {
54864
+ j += 1;
54865
+ if(j >= segments.length){
54866
+ i += 1;
54867
+ j = i + 1;
54868
+ }
54869
+ }
54870
+ }
54871
+ if(ons == segments.length){
54872
+ break
54873
+ }
54874
+ ons = segments.length;
54875
+ }
54876
+ // console.log('final segments', segments)
54877
+
54878
+ segments.forEach((seg_value, seg_idx) => {
54879
+ let baf_info = likelihood_baf_pval(likelihoods[seg_idx]);
54880
+ if(seg_value.length > 1){
54881
+
54882
+ seg_value.forEach((bin, bin_idx) =>{
54883
+ gstat_rd_all.push(wig[bin]);
54884
+ if(baf_info.mean <= baf_threshold){
54885
+ gstat_rd0.push(wig[bin]);
54886
+ }
54887
+ wig[bin].segment_score = levels[seg_idx];
54888
+ });
54889
+ gstat_rd.push(levels[seg_idx]);
54890
+ gstat_error.push(error[seg_idx]);
54891
+ gstat_lh.push(likelihoods[seg_idx]);
54892
+
54893
+ }
54894
+
54895
+ });
54896
+
54897
+ continue
54898
+ }
54899
+
54900
+ // Third stage for call
54901
+
54902
+ // let data = gstat_rd0.lengthn == 0 ? gstat_rd_all: gstat_rd0 ;
54903
+
54904
+ let points = parseInt(1000 * (1 - min_cell_fraction));
54905
+ if(points == 0){
54906
+ points = 1;
54907
+ }
54908
+ let x = g_utils.linspace(min_cell_fraction, 1, points);
54909
+ let master_lh = {};
54910
+ let germline_lh = {};
54911
+ for(let cn=10; cn > -1; cn--){
54912
+ for(let h1=0; h1 < (cn/2+1); h1++){
54913
+ let h2 = cn - h1;
54914
+ let mrd = x.map((v, idx) => {return 1-v +v*cn/2});
54915
+ let g_mrd = cn / 2;
54916
+ let g_mbaf;
54917
+ let mbaf;
54918
+ if(cn > 0){
54919
+ g_mbaf = 0.5 - (h1 / (h1 + h2));
54920
+ mbaf = x.map((v, idx) => {return 0.5 - (1 - v + v * h1) / (2 - 2 * v + (h1 + h2) * v)});
54921
+
54922
+ }else {
54923
+ g_mbaf = 0;
54924
+ mbaf = x.map((v, idx) => {return 0*v});
54925
+ }
54926
+
54927
+ for( let ei=0; ei < gstat_rd.length; ei++){
54928
+
54929
+ let g_lh = normal(g_mrd * this.globalMean, 1, gstat_rd[ei], gstat_error[ei]) * likelihood_of_baf(gstat_lh[ei], 0.5 + g_mbaf);
54930
+ if(ei in germline_lh){
54931
+ germline_lh[ei].push([cn, h1, h2, g_lh, 1.0]);
54932
+ }else {
54933
+ germline_lh[ei] = [cn, h1, h2, g_lh, 1.0];
54934
+ }
54935
+ let slh = 0;
54936
+ let max_lh = 0;
54937
+ let max_x = 0;
54938
+ mrd.forEach((mi, idx) => {
54939
+ if(!isNaN(mbaf[idx])){
54940
+ let tmpl = normal(mi * this.globalMean, 1, gstat_rd[ei], gstat_error[ei]) * likelihood_of_baf(gstat_lh[ei], 0.5 + mbaf[idx]);
54941
+ slh += tmpl;
54942
+ if(tmpl > max_lh){
54943
+ max_lh = tmpl;
54944
+ max_x = x[idx];
54945
+ }
54946
+ }
54947
+ });
54948
+ if(ei in master_lh){
54949
+ master_lh[ei].push([cn, h1, h2, slh / x.length, max_x]);
54950
+ }else {
54951
+ master_lh[ei] = [cn, h1, h2, slh / x.length, max_x];
54952
+ }
54953
+ }
54954
+
54955
+ for( let ei=0; ei < gstat_rd.length; ei++){
54956
+ if(event_type == "germline"){
54957
+ master_lh[ei].sort((a, b) => a[3] - b[3]);
54958
+ }
54959
+ else {
54960
+ master_lh[ei].sort((a, b) => a[3] - b[3]);
54961
+ if(event_type == "both"){
54962
+
54963
+ germline_lh[ei].sort((a, b) => a[3] - b[3]);
54964
+ if(germline_lh[ei][0][3] > master_lh[ei][0][3]){
54965
+ //let tmp_list = list(filter( lambda x: x[0] != germline_lh[ei][0][0] and x[1] != germline_lh[ei][0][1], master_lh[ei]))
54966
+ let tmp_list = master_lh[ei].filter((x) => (x[0] != germline_lh[ei][0][0]) && (x[1] <= germline_lh[ei][0][1]));
54967
+ // console.log('tmp_list', tmp_list)
54968
+ // master_lh[ei] = [germline_lh[ei][0]] + tmp_list
54969
+ master_lh[ei] = [germline_lh[ei][0]].push(...tmp_list);
54970
+ }
54971
+ }
54972
+ }
54973
+ }
54974
+ for( let ei=0; ei < gstat_rd.length; ei++){
54975
+ if(master_lh[ei][0][0] > 2);
54976
+ if(master_lh[ei][0][0] < 2);
54977
+ gstat_rd[ei] / this.globalMean;
54978
+ t_dist.t_test_1_sample(this.globalMean, gstat_rd[ei], gstat_error[ei], gstat_n[ei]);
54979
+ // console.log(etype)
54980
+
54981
+ }
54982
+
54983
+
54984
+ // break
54985
+ }
54986
+
54987
+ }
54988
+
54989
+ var rawbinScore = this.formatDataStructure(this.wigFeatures, 'binScore', this.globalMean);
54990
+ var callScore = this.formatDataStructure(this.wigFeatures, 'segment_score', this.globalMean);
54991
+
54992
+ return {binScore: rawbinScore, segment_score: callScore}
54993
+
54577
54994
  }
54578
54995
 
54579
- histogram(data, bins) {
54580
- const step = bins[1] - bins[0];
54581
- const hist_bins = [];
54996
+ formatDataStructure(wigFeatures, feature_column, scaling_factor = 1) {
54997
+ const results = [];
54998
+ for (const [chr, wig] of Object.entries(wigFeatures)) {
54582
54999
 
54583
- data.forEach((value, index) => {
54584
- bins.forEach((bin_value, bin_index) => {
54585
- if (!hist_bins[bin_value]) {
54586
- hist_bins[bin_value] = { count: 0 };
55000
+ wig.forEach(sample => {
55001
+ var new_sample = { ...sample };
55002
+ if (scaling_factor != 1) {
55003
+ new_sample.value = sample[feature_column] / scaling_factor * 2;
54587
55004
  }
54588
- if (bin_value <= value && value < bin_value + step) {
54589
- hist_bins[bin_value].count++;
54590
- return false;
55005
+ results.push(new_sample);
55006
+ });
55007
+ }
55008
+
55009
+ return results
55010
+ }
55011
+
55012
+ formatDataStructure_BAF(feature_column, scaling_factor = 2) {
55013
+ const baf1 = [];
55014
+ const baf2 = [];
55015
+ for (const [chr, wig] of Object.entries(this.wigFeatures)) {
55016
+
55017
+ wig.forEach(sample => {
55018
+
55019
+ var baf1_value = { ...sample };
55020
+ var baf2_value = { ...sample };
55021
+
55022
+ let value = sample[feature_column];
55023
+ if (value != 0.5){
55024
+ baf2_value.value = -2 * (1 - value);
55025
+ baf2.push(baf2_value);
54591
55026
  }
55027
+ baf1_value.value = -2 * value;
55028
+ baf1.push(baf1_value);
55029
+
54592
55030
  });
54593
- });
54594
- const dist_p = [];
54595
- hist_bins.forEach((bin, index) => { dist_p.push(bin.count); });
54596
- return dist_p
55031
+ }
55032
+
55033
+
55034
+ return [baf1, baf2]
54597
55035
  }
55036
+ }
55037
+
55038
+ function arrayMax(arr) {
55039
+ return arr.reduce(function (p, v) {
55040
+ return ( p > v ? p : v );
55041
+ });
55042
+ }
55043
+
55044
+ /**
55045
+ * Normal distribution.
55046
+ *
55047
+ * @param {float} x - Variable.
55048
+ * @param {float} a - area
55049
+ * @param {float} x0 - Mean value
55050
+ * @param {float} sigma - Sigma
55051
+ * @returns {float} - Value of distribution in x.
55052
+ */
55053
+ function normal(x, a, x0, sigma){
55054
+
55055
+ return a * Math.exp(-1* (x - x0) ** 2 / (2 * sigma ** 2)) / Math.sqrt(2 * Math.PI) / sigma
54598
55056
 
54599
55057
  }
54600
55058
 
55059
+ /**
55060
+ * Calculates two normal distributions overlap area.
55061
+ *
55062
+ * @param {float} m1 - Mean value of the first distribution
55063
+ * @param {float} s1 - Sigma of the first distribution
55064
+ * @param {float} m2 - Mean value for second distribution
55065
+ * @param {float} s2 - Sigma of the second distribution
55066
+ *
55067
+ * @returns {float} area - Area of overlap
55068
+ */
55069
+ function normal_overlap_approx(m1, s1, m2, s2){
55070
+
55071
+ return Math.exp(-1* (m1-m2)**2/ (s1**2+s2**2))
55072
+ }
55073
+
55074
+
55075
+ /**
55076
+ * Returns overlap area of two likelihood functions.
55077
+ *
55078
+ * @param {*} lk1 - First likelihood function.
55079
+ * @param {*} lk2 - Second likelihood function.
55080
+ *
55081
+ * @returns {float} - Overlap area.
55082
+ */
55083
+ function likelihood_overlap(likelihood_1, likelihood_2){
55084
+ let sum;
55085
+ try{
55086
+ sum = likelihood_1.reduce((accumulator, currentValue, currentIndex) => {return accumulator + Math.min(currentValue, likelihood_2[currentIndex])});
55087
+ }catch{
55088
+ console.log("Failed to find likelihood overlap: ", likelihood_1, likelihood_2);
55089
+ return 0
55090
+ }
55091
+
55092
+ return sum
55093
+ }
55094
+
55095
+ /**
55096
+ * Calculates normal distribution that is product of two given normal distributions.
55097
+ *
55098
+ * @param {float} m1 - Mean value of the first distribution
55099
+ * @param {float} s1 - Sigma of the first distribution
55100
+ * @param {float} m2 - Mean value for second distribution
55101
+ * @param {float} s2 - Sigma of the second distribution
55102
+ * @returns {Object} An object representing the first distribution
55103
+ * @property {float} nl - Mean value of the first distribution
55104
+ * @property {float} ne - Sigma of the first distribution
55105
+ */
55106
+ function normal_merge(m1, s1, m2, s2){
55107
+
55108
+ if((s1 == 0) && (s2 == 0)){
55109
+ return {nl: 0.5 * (m1 + m2), ne: 0}
55110
+ }
55111
+ else {
55112
+ return {nl: (m1 * s2 * s2 + m2 * s1 * s1) / (s1 * s1 + s2 * s2), ne: Math.sqrt(s1 * s1 * s2 * s2 / (s1 * s1 + s2 * s2))}
55113
+ }
55114
+ }
55115
+
55116
+ /**
55117
+ * Calculates likelihood for given baf
55118
+ * @param {*} likelihood
55119
+ * @param {*} baf
55120
+ * @returns {float} likelihood value
55121
+ */
55122
+ function likelihood_of_baf(likelihood, baf){
55123
+
55124
+ let bin = parseInt(baf * (likelihood.length - 1));
55125
+ let fr = baf * (likelihood.length - 1) - bin;
55126
+ if(bin < likelihood.length - 1){
55127
+ return likelihood[bin] * (1 - fr) + likelihood[bin + 1] * fr
55128
+ }
55129
+ else {
55130
+ return likelihood[bin]
55131
+ }
55132
+ }
55133
+
55134
+ /**
55135
+ *
55136
+ * Calculates baf level and p-value for given likelihood function.
55137
+ *
55138
+ * @param {*} likelihood
55139
+ * @returns {Object} An object representing BAF
55140
+ * @property {float} mean BAF level (difference from 1/2)
55141
+ * @property {float} p p-value for event different than 1/2
55142
+ */
55143
+ function likelihood_baf_pval(likelihood) {
55144
+ const res = likelihood.length;
55145
+ const max_lh = Math.max(...likelihood);
55146
+ let ix = likelihood.indexOf(max_lh);
55147
+ if (ix > Math.floor(res / 2)) {
55148
+ ix = res - 1 - ix;
55149
+ }
55150
+ const b = (res / 2 - ix) / (res + 1);
55151
+
55152
+ const ix1 = Math.floor((res / 2 + ix) / 2);
55153
+ const ix2 = res - 1 - ix1;
55154
+ let p = likelihood.slice(ix1, ix2 + 1).reduce((acc, val) => acc + val, 0) / likelihood.reduce((acc, val) => acc + val, 0);
55155
+ if (ix === Math.floor(res / 2)) {
55156
+ p = 1.0;
55157
+ }
55158
+ return {mean:b, p:p};
55159
+ }
55160
+
55161
+ var combined_caller = {CombinedCaller};
55162
+
54601
55163
  function erf(x) {
54602
55164
  var m = 1.0, s = 1.0, sum = x * 1.0;
54603
55165
  for (var i = 1; i < 50; i++) {
@@ -55245,6 +55807,10 @@
55245
55807
  }
55246
55808
  }
55247
55809
 
55810
+
55811
+
55812
+ var read_depth_caller = { Partition };
55813
+
55248
55814
  class CNVpytorVCF {
55249
55815
  constructor(allVariants, binSize) {
55250
55816
  this.allVariants = allVariants;
@@ -55372,13 +55938,11 @@
55372
55938
  readDepthMeanshift(wigFeatures) {
55373
55939
 
55374
55940
  // Get global mean and standrad deviation
55375
- var fit_info = new GetFit(wigFeatures);
55941
+ var fit_info = new g_utils.GetFit(wigFeatures);
55376
55942
  var [globamMean, globalStd] = fit_info.fit_data();
55377
- // console.log('Fitter', globamMean, globalStd)
55378
-
55379
55943
 
55380
55944
  // Apply partition method
55381
- var partition = new Partition(wigFeatures, globamMean, globalStd);
55945
+ var partition = new read_depth_caller.Partition(wigFeatures, globamMean, globalStd);
55382
55946
  var partition_array = partition.meanShiftCaller();
55383
55947
  var caller_array = partition.cnv_calling();
55384
55948
 
@@ -55409,86 +55973,10 @@
55409
55973
  results.push(new_sample);
55410
55974
  });
55411
55975
  }
55412
- // console.log(feature_column, results)
55413
55976
 
55414
55977
  return results
55415
55978
  }
55416
55979
 
55417
- // function for baf likelihood calculations
55418
- async computeBAF() {
55419
- const chromosomes = Object.keys(this.allVariants);
55420
- const wigFeatures = {};
55421
- const results = [];
55422
-
55423
- for (let chr of chromosomes) {
55424
- const variants = this.allVariants[chr];
55425
- if (variants.length === 0) continue
55426
- var featureBin;
55427
- for (let snp of variants) {
55428
- featureBin = Math.max(Math.floor(snp.start / this.binSize), 0);
55429
-
55430
- if (!wigFeatures[chr]) {
55431
- wigFeatures[chr] = [];
55432
- }
55433
- if (!wigFeatures[chr][featureBin]) {
55434
- if (featureBin > 0) {
55435
- // calculating the BAF likelihood for previous bin
55436
- let previous_featureBin = featureBin - 1;
55437
- if (wigFeatures[chr][previous_featureBin]) {
55438
-
55439
- const updated_bin = this.get_max_min_score(wigFeatures[chr][previous_featureBin]);
55440
- wigFeatures[chr][previous_featureBin] = updated_bin;
55441
- results.push(wigFeatures[chr][previous_featureBin]);
55442
- }
55443
- }
55444
- wigFeatures[chr][featureBin] = {
55445
- chr,
55446
- start: featureBin * this.binSize,
55447
- end: (featureBin + 1) * this.binSize,
55448
- value: 0,
55449
- count: 0,
55450
- likelihood_score: [],
55451
- min_score: 0,
55452
- };
55453
- }
55454
- const calls = snp.calls[9];
55455
- let genotype = calls.genotype;
55456
- let ad_score = calls.info["AD"].split(',');
55457
- let ad_a = ad_score[0], ad_b = ad_score[1];
55458
-
55459
- if ((genotype[0] == 0 && genotype[1] == 1) || (genotype[0] == 1 && genotype[1] == 0)) {
55460
- //apply the beta function
55461
- if (wigFeatures[chr][featureBin].likelihood_score.length == 0) {
55462
- wigFeatures[chr][featureBin].likelihood_score = linspace(0, 1, 200).map((value, index) => {
55463
- return beta(ad_a, ad_b, value);
55464
- });
55465
- } else {
55466
- var sum = 0;
55467
-
55468
- wigFeatures[chr][featureBin].likelihood_score = linspace(0, 1, 200).map((value, index) => {
55469
- var likelihood_value = wigFeatures[chr][featureBin].likelihood_score[index] * beta(ad_a, ad_b, value);
55470
- sum = sum + likelihood_value;
55471
- return likelihood_value;
55472
- });
55473
-
55474
- wigFeatures[chr][featureBin].likelihood_score = linspace(0, 1, 200).map((value, index) => {
55475
- return wigFeatures[chr][featureBin].likelihood_score[index] / sum;
55476
- });
55477
- }
55478
- wigFeatures[chr][featureBin].count++;
55479
- }
55480
- }
55481
-
55482
- // last feature bin
55483
- const updated_bin = this.get_max_min_score(wigFeatures[chr][featureBin]);
55484
- wigFeatures[chr][featureBin] = updated_bin;
55485
- results.push(wigFeatures[chr][featureBin]);
55486
- }
55487
-
55488
- const baf2_result = this.format_BAF_likelihood(wigFeatures);
55489
- return [results, baf2_result]
55490
-
55491
- }
55492
55980
  async computeBAF_v2() {
55493
55981
 
55494
55982
  const chromosomes = Object.keys(this.allVariants);
@@ -55543,19 +56031,19 @@
55543
56031
  if ((genotype[0] == 0 && genotype[1] == 1) || (genotype[0] == 1 && genotype[1] == 0)) {
55544
56032
  //apply the beta function
55545
56033
  if (wigFeatures[chr][featureBin].likelihood_score.length == 0) {
55546
- wigFeatures[chr][featureBin].likelihood_score = linspace(0, 1, 100).map((value, index) => {
56034
+ wigFeatures[chr][featureBin].likelihood_score = g_utils.linspace(0, 1, 100).map((value, index) => {
55547
56035
  return beta(ad_a, ad_b, value);
55548
56036
  });
55549
56037
  } else {
55550
56038
  var sum = 0;
55551
56039
 
55552
- wigFeatures[chr][featureBin].likelihood_score = linspace(0, 1, 100).map((value, index) => {
56040
+ wigFeatures[chr][featureBin].likelihood_score = g_utils.linspace(0, 1, 100).map((value, index) => {
55553
56041
  var likelihood_value = wigFeatures[chr][featureBin].likelihood_score[index] * beta(ad_a, ad_b, value);
55554
56042
  sum = sum + likelihood_value;
55555
56043
  return likelihood_value;
55556
56044
  });
55557
56045
 
55558
- wigFeatures[chr][featureBin].likelihood_score = linspace(0, 1, 100).map((value, index) => {
56046
+ wigFeatures[chr][featureBin].likelihood_score = g_utils.linspace(0, 1, 100).map((value, index) => {
55559
56047
  return wigFeatures[chr][featureBin].likelihood_score[index] / sum;
55560
56048
  });
55561
56049
  }
@@ -55601,7 +56089,6 @@
55601
56089
  if (sample.likelihood_score.length > 0) {
55602
56090
  const max = Math.max(...sample.likelihood_score);
55603
56091
  const res = sample.likelihood_score.indexOf(max);
55604
- sample.likelihood_score = [];
55605
56092
  sample.value = Math.max(res / 100, 1 - res / 100);
55606
56093
  sample.min_score = Math.min(res / 100, 1 - res / 100);
55607
56094
 
@@ -55617,7 +56104,7 @@
55617
56104
 
55618
56105
  //console.log('getAllbins', bins["value"])
55619
56106
 
55620
- const fitter = new GetFit(bins);
56107
+ const fitter = new g_utils.GetFit(bins);
55621
56108
 
55622
56109
  fitter.fit_data();
55623
56110
  // dconsole.log('rd list', distParams)
@@ -55625,7 +56112,7 @@
55625
56112
  return bins
55626
56113
  }
55627
56114
 
55628
- async read_rd_baf(){
56115
+ async read_rd_baf(caller='ReadDepth'){
55629
56116
 
55630
56117
  const chromosomes = Object.keys(this.allVariants);
55631
56118
  var wigFeatures = {};
@@ -55671,13 +56158,22 @@
55671
56158
  }
55672
56159
 
55673
56160
  }
55674
-
56161
+
55675
56162
  var avgbin = this.adjust_bin_size(wigFeatures);
56163
+ var finalFeatureSet;
56164
+ if(caller == 'ReadDepth'){
56165
+ finalFeatureSet = this.readDepthMeanshift(avgbin);
56166
+ var baf = this.formatDataStructure_BAF(avgbin, 'max_likelihood');
56167
+ }else if(caller=='2D'){
56168
+
56169
+ let caller_obj = new combined_caller.CombinedCaller(avgbin, this.binSize);
56170
+ let processed_bins = await caller_obj.call_2d();
56171
+
56172
+ finalFeatureSet = [processed_bins.binScore, [], processed_bins.segment_score];
56173
+
56174
+ var baf = caller_obj.formatDataStructure_BAF('max_likelihood');
56175
+ }
55676
56176
 
55677
- let finalFeatureSet = this.readDepthMeanshift(avgbin);
55678
-
55679
- //var rawbinScore = this.formatDataStructure(avgbin, 'binScore', globamMean)
55680
- var baf = this.formatDataStructure_BAF(avgbin, 'max_likelihood');
55681
56177
 
55682
56178
  return [finalFeatureSet, baf]
55683
56179
  }
@@ -55740,19 +56236,19 @@
55740
56236
 
55741
56237
  wigFeatures[chr][j].hets.forEach((hets, hets_idx) => {
55742
56238
  if(avgbin[chr][k].likelihood_score.length == 0){
55743
- avgbin[chr][k].likelihood_score = linspace(0, 1, 100).map((value, index) => {
56239
+ avgbin[chr][k].likelihood_score = g_utils.linspace(0, 1, 100).map((value, index) => {
55744
56240
  return beta(hets.ref, hets.alt, value);
55745
56241
  });
55746
56242
  }
55747
56243
  else {
55748
56244
  var likelihood_sum = 0;
55749
- avgbin[chr][k].likelihood_score = linspace(0, 1, 100).map((value, index) => {
56245
+ avgbin[chr][k].likelihood_score = g_utils.linspace(0, 1, 100).map((value, index) => {
55750
56246
  var likelihood_value = avgbin[chr][k].likelihood_score[index] * beta(hets.ref, hets.alt, value);
55751
56247
  likelihood_sum += likelihood_value;
55752
56248
  return likelihood_value;
55753
56249
  });
55754
56250
 
55755
- avgbin[chr][k].likelihood_score = linspace(0, 1, 100).map((value, index) => {
56251
+ avgbin[chr][k].likelihood_score = g_utils.linspace(0, 1, 100).map((value, index) => {
55756
56252
  return avgbin[chr][k].likelihood_score[index] / likelihood_sum;
55757
56253
  });
55758
56254
 
@@ -55777,19 +56273,6 @@
55777
56273
  return p ** a * (1 - p) ** b + p ** b * (1 - p) ** a;
55778
56274
  }
55779
56275
 
55780
- function linspace(a, b, n) {
55781
- if (typeof n === "undefined") n = Math.max(Math.round(b - a) + 1, 1);
55782
- if (n < 2) {
55783
- return n === 1 ? [a] : [];
55784
- }
55785
- var ret = Array(n);
55786
- n--;
55787
- for (let i = n; i >= 0; i--) {
55788
- ret[i] = (i * b + (n - i) * a) / n;
55789
- }
55790
- return ret;
55791
- }
55792
-
55793
56276
  /*
55794
56277
  * The MIT License (MIT)
55795
56278
  *
@@ -55900,29 +56383,43 @@
55900
56383
  }, Object.create(null));
55901
56384
 
55902
56385
  const cnvpytor_obj = new CNVpytorVCF(allVariants, this.bin_size);
55903
- //const wigFeatures = await cnvpytor_obj.computeReadDepth()
55904
- //const bafFeatures = await cnvpytor_obj.computeBAF_v2()
55905
- const dataWigs = await cnvpytor_obj.read_rd_baf();
55906
- const wigFeatures = dataWigs[0];
55907
- const bafFeatures = dataWigs[1];
55908
56386
 
56387
+ let wigFeatures;
56388
+ let bafFeatures;
55909
56389
  this.wigFeatures_obj = {};
55910
- this.wigFeatures_obj[this.bin_size] = {
55911
- "RD_Raw": wigFeatures[0],
55912
- "RD_Raw_gc_coor": wigFeatures[1],
55913
- "ReadDepth": wigFeatures[2],
55914
- "2D": [],
55915
- "BAF1": bafFeatures[0],
55916
- "BAF2": bafFeatures[1]
55917
- };
55918
- this.rd_bins = [this.bin_size];
55919
- this.available_callers = ["ReadDepth"];
56390
+ this.wigFeatures_obj[this.bin_size] = {};
56391
+
56392
+ let dataWigs;
56393
+ if(this.config.cnv_caller == '2D'){
56394
+
56395
+ dataWigs = await cnvpytor_obj.read_rd_baf('2D');
56396
+
56397
+ wigFeatures = dataWigs[0];
56398
+ bafFeatures = dataWigs[1];
56399
+ this.wigFeatures_obj[this.bin_size]['2D'] = wigFeatures[2];
56400
+
56401
+ this.available_callers = ['2D'];
56402
+ }else {
56403
+ dataWigs = await cnvpytor_obj.read_rd_baf();
56404
+ wigFeatures = dataWigs[0];
56405
+ bafFeatures = dataWigs[1];
56406
+ this.wigFeatures_obj[this.bin_size]['ReadDepth'] = wigFeatures[2];
56407
+ this.available_callers = ['ReadDepth'];
56408
+ }
56409
+
56410
+ this.wigFeatures_obj[this.bin_size]['RD_Raw'] = wigFeatures[0];
56411
+ this.wigFeatures_obj[this.bin_size]['RD_Raw_gc_coor'] = wigFeatures[1];
56412
+ this.wigFeatures_obj[this.bin_size]['BAF1'] = bafFeatures[0];
56413
+ this.wigFeatures_obj[this.bin_size]['BAF2'] = bafFeatures[1];
56414
+
56415
+ this.available_bins = [this.bin_size];
56416
+
55920
56417
  this.set_available_callers();
55921
56418
 
55922
56419
  } else {
55923
56420
  this.cnvpytor_obj = new HDF5Reader(this.config.url, this.bin_size);
55924
56421
  this.wigFeatures_obj = await this.cnvpytor_obj.get_rd_signal(this.bin_size);
55925
- this.rd_bins = this.cnvpytor_obj.rd_bins;
56422
+ this.available_bins = this.cnvpytor_obj.available_bins;
55926
56423
  this.available_callers = this.cnvpytor_obj.callers;
55927
56424
  this.set_available_callers();
55928
56425
  }
@@ -56035,7 +56532,7 @@
56035
56532
 
56036
56533
  items.push('<hr/>');
56037
56534
  items.push("Bin Sizes");
56038
- for (let rd_bin of this.rd_bins) {
56535
+ for (let rd_bin of this.available_bins) {
56039
56536
  const checkBox = createCheckbox(rd_bin, rd_bin === this.bin_size);
56040
56537
  items.push({
56041
56538
  object: $$1(checkBox),