icn3d 3.23.2 → 3.23.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/icn3d.js +213 -125
- package/icn3d.min.js +2 -2
- package/icn3d.module.js +213 -125
- package/package.json +1 -1
package/icn3d.js
CHANGED
|
@@ -10602,7 +10602,7 @@ class SetDialog {
|
|
|
10602
10602
|
|
|
10603
10603
|
html += me.htmlCls.divStr + "dl_mutation' class='" + dialogClass + "'>";
|
|
10604
10604
|
html += "<div style='width:500px'>";
|
|
10605
|
-
html += 'Please specify the mutations with a comma separated mutation list. Each mutation can be specified as "[<b>uppercase</b> PDB ID or AlphaFold UniProt ID]_[Chain
|
|
10605
|
+
html += 'Please specify the mutations with a comma separated mutation list. Each mutation can be specified as "[<b>uppercase</b> PDB ID or AlphaFold UniProt ID]_[Chain Name]_[Residue Number]_[One Letter Mutant Residue]". E.g., the mutation of N501Y in the E chain of PDB 6M0J can be specified as "6M0J_E_501_Y". For AlphaFold structures, the "Chain ID" is "A".<br/>If you load a custom structure without PDB or UniProt ID, you can open "Seq. & Annotations" window and find the chain ID such as "stru_A". The part before the underscore is the structure ID, which can be used to specify the mutation such as "stru_A_...". Remember to choose "Show Mutation in: Current Page".<br/><br/>';
|
|
10606
10606
|
html += "<div style='display:inline-block; width:110px'>Mutations: </div>" + me.htmlCls.inputTextStr + "id='" + me.pre + "mutationids' value='6M0J_E_484_K,6M0J_E_501_Y,6M0J_E_417_N' size=50><br/><br/>";
|
|
10607
10607
|
|
|
10608
10608
|
html += '<b>ID Type</b>: ';
|
|
@@ -10675,8 +10675,9 @@ class SetDialog {
|
|
|
10675
10675
|
html += "</div>";
|
|
10676
10676
|
|
|
10677
10677
|
html += me.htmlCls.divStr + "dl_mmdbafid' class='" + dialogClass + "' style='max-width:600px'>";
|
|
10678
|
-
html += "
|
|
10679
|
-
html += me.htmlCls.buttonStr + "reload_mmdbaf'>
|
|
10678
|
+
html += "List of PDB, MMDB, or AlphaFold UniProt structures: " + me.htmlCls.inputTextStr + "id='" + me.pre + "mmdbafid' placeholder='e.g., 1HHO,4N7N,P69905,P01942' size=30> <br><br>";
|
|
10679
|
+
html += "<div style='display:inline-block; width:20px'></div>" + me.htmlCls.buttonStr + "reload_mmdbaf' style='width:150px'>Load Biological Unit</button>" + me.htmlCls.buttonStr + "reload_mmdbaf_asym' style='margin-left:30px; width:250px'>Load Asymmetric Unit (All Chains)</button>" + "<br/><br/>";
|
|
10680
|
+
html += "<div style='display:inline-block; width:20px'>or</div>" + me.htmlCls.buttonStr + "reload_mmdbaf_append' style='width:150px'>Append Biological Unit</button>" + me.htmlCls.buttonStr + "reload_mmdbaf_asym_append' style='margin-left:30px; width:250px'>Append Asymmetric ; Unit (All Chains)</button>" + "<br/><br/>";
|
|
10680
10681
|
|
|
10681
10682
|
html += '<b>Note</b>: The "<b>biological unit</b>" is the <b>biochemically active form of a biomolecule</b>, <div style="width:20px; margin:6px 0 0 20px; display:inline-block;"><span id="'
|
|
10682
10683
|
+ me.pre + 'asu_bu2_expand" class="ui-icon ui-icon-plus icn3d-expand icn3d-link" style="width:15px;" title="Expand"></span><span id="'
|
|
@@ -11764,7 +11765,7 @@ class Events {
|
|
|
11764
11765
|
$("#" + me.pre + id).resizable();
|
|
11765
11766
|
}
|
|
11766
11767
|
|
|
11767
|
-
async launchMmdb(ids, bBiounit, hostUrl) { let me = this.icn3dui, ic = me.icn3d, thisClass = this;
|
|
11768
|
+
async launchMmdb(ids, bBiounit, hostUrl, bAppend) { let me = this.icn3dui, ic = me.icn3d, thisClass = this;
|
|
11768
11769
|
if(!me.cfg.notebook) dialog.dialog( "close" );
|
|
11769
11770
|
|
|
11770
11771
|
let flag = bBiounit ? 1 : 0;
|
|
@@ -11779,40 +11780,41 @@ class Events {
|
|
|
11779
11780
|
|
|
11780
11781
|
let idArray = ids.split(',');
|
|
11781
11782
|
|
|
11782
|
-
|
|
11783
|
-
|
|
11784
|
-
|
|
11785
|
-
|
|
11786
|
-
|
|
11787
|
-
|
|
11788
|
-
|
|
11789
|
-
|
|
11790
|
-
|
|
11791
|
-
|
|
11792
|
-
|
|
11793
|
-
*/
|
|
11794
|
-
|
|
11795
|
-
// single MMDB ID could show memebranes
|
|
11796
|
-
if(!ic.structures && idArray.length == 1 && (idArray[0].length == 4 || !isNaN(idArray[0])) ) {
|
|
11797
|
-
thisClass.setLogCmd("load mmdb" + flag + " " + ids, false);
|
|
11798
|
-
let urlTarget = (ic.structures && Object.keys(ic.structures).length > 0) ? '_blank' : '_self';
|
|
11799
|
-
window.open(hostUrl + '?mmdbid=' + ids + '&bu=' + flag, urlTarget);
|
|
11783
|
+
if(!bAppend) {
|
|
11784
|
+
if(idArray.length == 1 && (idArray[0].length == 4 || !isNaN(idArray[0])) ) {
|
|
11785
|
+
thisClass.setLogCmd("load mmdb" + flag + " " + ids, false);
|
|
11786
|
+
let urlTarget = (ic.structures && Object.keys(ic.structures).length > 0) ? '_blank' : '_self';
|
|
11787
|
+
window.open(hostUrl + '?mmdbid=' + ids + '&bu=' + flag, urlTarget);
|
|
11788
|
+
}
|
|
11789
|
+
else {
|
|
11790
|
+
thisClass.setLogCmd("load mmdbaf" + flag + " " + ids, false);
|
|
11791
|
+
let urlTarget = (ic.structures && Object.keys(ic.structures).length > 0) ? '_blank' : '_self';
|
|
11792
|
+
window.open(hostUrl + '?mmdbafid=' + ids + '&bu=' + flag, urlTarget);
|
|
11793
|
+
}
|
|
11800
11794
|
}
|
|
11801
11795
|
else {
|
|
11802
|
-
|
|
11803
|
-
|
|
11804
|
-
|
|
11805
|
-
|
|
11806
|
-
|
|
11807
|
-
if(me.cfg.bu == 1) {
|
|
11808
|
-
ic.loadCmd = 'load mmdbaf1 ' + me.cfg.mmdbafid;
|
|
11796
|
+
// single MMDB ID could show memebranes
|
|
11797
|
+
if(!ic.structures && idArray.length == 1 && (idArray[0].length == 4 || !isNaN(idArray[0])) ) {
|
|
11798
|
+
thisClass.setLogCmd("load mmdb" + flag + " " + ids, false);
|
|
11799
|
+
let urlTarget = (ic.structures && Object.keys(ic.structures).length > 0) ? '_blank' : '_self';
|
|
11800
|
+
window.open(hostUrl + '?mmdbid=' + ids + '&bu=' + flag, urlTarget);
|
|
11809
11801
|
}
|
|
11810
11802
|
else {
|
|
11811
|
-
|
|
11812
|
-
|
|
11813
|
-
me.htmlCls.clickMenuCls.setLogCmd(ic.loadCmd, true);
|
|
11803
|
+
me.cfg.mmdbafid = ids;
|
|
11804
|
+
me.cfg.bu = flag;
|
|
11814
11805
|
|
|
11815
|
-
|
|
11806
|
+
ic.bMmdbafid = true;
|
|
11807
|
+
ic.inputid = (ic.inputid) ? ic.inputid + me.cfg.mmdbafid : me.cfg.mmdbafid;
|
|
11808
|
+
if(me.cfg.bu == 1) {
|
|
11809
|
+
ic.loadCmd = 'load mmdbaf1 ' + me.cfg.mmdbafid;
|
|
11810
|
+
}
|
|
11811
|
+
else {
|
|
11812
|
+
ic.loadCmd = 'load mmdbaf0 ' + me.cfg.mmdbafid;
|
|
11813
|
+
}
|
|
11814
|
+
me.htmlCls.clickMenuCls.setLogCmd(ic.loadCmd, true);
|
|
11815
|
+
|
|
11816
|
+
await ic.chainalignParserCls.downloadMmdbAf(me.cfg.mmdbafid);
|
|
11817
|
+
}
|
|
11816
11818
|
}
|
|
11817
11819
|
}
|
|
11818
11820
|
|
|
@@ -12554,21 +12556,28 @@ class Events {
|
|
|
12554
12556
|
|
|
12555
12557
|
me.myEventCls.onIds("#" + me.pre + "reload_mmdbaf", "click", function(e) { me.icn3d;
|
|
12556
12558
|
e.preventDefault();
|
|
12557
|
-
|
|
12558
|
-
// remove space
|
|
12559
12559
|
let ids = $("#" + me.pre + "mmdbafid").val();
|
|
12560
|
-
|
|
12561
12560
|
thisClass.launchMmdb(ids, 1, hostUrl);
|
|
12562
12561
|
});
|
|
12563
12562
|
|
|
12564
12563
|
me.myEventCls.onIds("#" + me.pre + "reload_mmdbaf_asym", "click", function(e) { me.icn3d;
|
|
12565
12564
|
e.preventDefault();
|
|
12566
|
-
|
|
12567
|
-
// remove space
|
|
12568
12565
|
let ids = $("#" + me.pre + "mmdbafid").val();
|
|
12569
12566
|
thisClass.launchMmdb(ids, 0, hostUrl);
|
|
12570
12567
|
});
|
|
12571
12568
|
|
|
12569
|
+
me.myEventCls.onIds("#" + me.pre + "reload_mmdbaf_append", "click", function(e) { me.icn3d;
|
|
12570
|
+
e.preventDefault();
|
|
12571
|
+
let ids = $("#" + me.pre + "mmdbafid").val();
|
|
12572
|
+
thisClass.launchMmdb(ids, 1, hostUrl, true);
|
|
12573
|
+
});
|
|
12574
|
+
|
|
12575
|
+
me.myEventCls.onIds("#" + me.pre + "reload_mmdbaf_asym_append", "click", function(e) { me.icn3d;
|
|
12576
|
+
e.preventDefault();
|
|
12577
|
+
let ids = $("#" + me.pre + "mmdbafid").val();
|
|
12578
|
+
thisClass.launchMmdb(ids, 0, hostUrl, true);
|
|
12579
|
+
});
|
|
12580
|
+
|
|
12572
12581
|
me.myEventCls.onIds("#" + me.pre + "mmdbid", "keyup", function(e) { let ic = me.icn3d;
|
|
12573
12582
|
if (e.keyCode === 13) {
|
|
12574
12583
|
e.preventDefault();
|
|
@@ -41440,14 +41449,14 @@ class ShowSeq {
|
|
|
41440
41449
|
|
|
41441
41450
|
// set hash for the loops
|
|
41442
41451
|
let strand2len_start_stop = {};
|
|
41443
|
-
let prevRefnumStr, prevPostfix;
|
|
41452
|
+
let prevRefnumStr, prevPostfix, prevRefnum;
|
|
41444
41453
|
|
|
41445
41454
|
// sometimes one chain may have several Ig domains,set a index for each IgDomain
|
|
41446
|
-
let index = 1;
|
|
41455
|
+
let index = 1, prevStrandPostfix = '', bStart = false;
|
|
41447
41456
|
for(let i = 0, il = giSeq.length; i < il; ++i) {
|
|
41448
41457
|
let currResi = ic.ParserUtilsCls.getResi(chnid, i);
|
|
41449
41458
|
let residueid = chnid + '_' + currResi;
|
|
41450
|
-
if(ic.residues.hasOwnProperty(residueid)) {
|
|
41459
|
+
//if(ic.residues.hasOwnProperty(residueid)) {
|
|
41451
41460
|
refnumLabel = ic.resid2refnum[residueid];
|
|
41452
41461
|
if(refnumLabel) {
|
|
41453
41462
|
refnumStr_ori = refnumLabel.replace(/'/g, '').replace(/\*/g, '').replace(/\^/g, '').substr(1); // C', C''
|
|
@@ -41465,27 +41474,37 @@ class ShowSeq {
|
|
|
41465
41474
|
strand2len_start_stop[prevStrand + prevPostfix].len = currCnt - 1;
|
|
41466
41475
|
strand2len_start_stop[prevStrand + prevPostfix].end = refnumStr;
|
|
41467
41476
|
strand2len_start_stop[prevStrand + prevPostfix].nextStrand = currStrand;
|
|
41468
|
-
|
|
41469
|
-
console.log("end: " + residueid);
|
|
41470
41477
|
}
|
|
41471
41478
|
|
|
41479
|
+
bStart = false;
|
|
41480
|
+
|
|
41481
|
+
currCnt = 1;
|
|
41482
|
+
}
|
|
41483
|
+
|
|
41484
|
+
// sometimes insertions may happen inside a strand. Reset currCnt
|
|
41485
|
+
if(currStrand == prevStrand && refnum > 1000 && refnumStr.substr(1,1) != '9') { // strand region
|
|
41472
41486
|
currCnt = 1;
|
|
41487
|
+
|
|
41488
|
+
if(bStart && prevStrandPostfix) {
|
|
41489
|
+
delete strand2len_start_stop[prevStrandPostfix];
|
|
41490
|
+
prevStrandPostfix = '';
|
|
41491
|
+
}
|
|
41473
41492
|
}
|
|
41474
41493
|
|
|
41475
41494
|
// #9##
|
|
41476
|
-
if(prevStrand && refnum > 1000 && refnumStr.substr(1,1) == '9') { // loop region
|
|
41495
|
+
if(prevStrand && currStrand != ' ' && refnum > 1000 && refnumStr.substr(1,1) == '9') { // loop region
|
|
41477
41496
|
if(currCnt == 1) { // start of a loop
|
|
41478
41497
|
if(strand2len_start_stop.hasOwnProperty(currStrand + postfix)) { // the strand appeared in 2nd Id domain
|
|
41479
41498
|
++index;
|
|
41480
41499
|
}
|
|
41481
|
-
|
|
41482
|
-
console.log("start: " + residueid + " refnumStr: " + refnumStr);
|
|
41483
41500
|
|
|
41484
41501
|
postfix = refnumStr.replace(refnum.toString(), '') + '_' + index;
|
|
41485
41502
|
strand2len_start_stop[currStrand + postfix] = {};
|
|
41486
41503
|
|
|
41487
41504
|
strand2len_start_stop[currStrand + postfix].start = prevRefnumStr;
|
|
41488
41505
|
strand2len_start_stop[currStrand + postfix].chainid = chnid;
|
|
41506
|
+
|
|
41507
|
+
//prevStrandPostfix = currStrand + postfix;
|
|
41489
41508
|
}
|
|
41490
41509
|
refnumStr = (parseInt(currFirstDigit) * 1000 + 900 + currCnt).toString();
|
|
41491
41510
|
refnumLabel = currStrand + refnumStr;
|
|
@@ -41495,7 +41514,7 @@ class ShowSeq {
|
|
|
41495
41514
|
}
|
|
41496
41515
|
}
|
|
41497
41516
|
else {
|
|
41498
|
-
if(prevStrand && !bCustom && !kabat_or_imgt) {
|
|
41517
|
+
if(prevStrand && currStrand != ' ' && !bCustom && !kabat_or_imgt) {
|
|
41499
41518
|
if(currCnt == 1) { // start of a loop
|
|
41500
41519
|
if(strand2len_start_stop.hasOwnProperty(currStrand + postfix)) { // the strand appeared in 2nd Id domain
|
|
41501
41520
|
++index;
|
|
@@ -41508,8 +41527,11 @@ class ShowSeq {
|
|
|
41508
41527
|
|
|
41509
41528
|
strand2len_start_stop[currStrand + postfix].start = prevRefnumStr;
|
|
41510
41529
|
strand2len_start_stop[currStrand + postfix].chainid = chnid;
|
|
41511
|
-
}
|
|
41512
41530
|
|
|
41531
|
+
prevStrandPostfix = currStrand + postfix;
|
|
41532
|
+
bStart = true;
|
|
41533
|
+
}
|
|
41534
|
+
|
|
41513
41535
|
// no ref num
|
|
41514
41536
|
refnumStr = (parseInt(currFirstDigit) * 1000 + 900 + currCnt).toString();
|
|
41515
41537
|
refnumLabel = currStrand + refnumStr;
|
|
@@ -41518,8 +41540,9 @@ class ShowSeq {
|
|
|
41518
41540
|
}
|
|
41519
41541
|
|
|
41520
41542
|
prevRefnumStr = refnumStr;
|
|
41543
|
+
prevRefnum = refnum;
|
|
41521
41544
|
prevPostfix = postfix;
|
|
41522
|
-
}
|
|
41545
|
+
//}
|
|
41523
41546
|
|
|
41524
41547
|
prevStrand = currStrand;
|
|
41525
41548
|
}
|
|
@@ -41528,11 +41551,13 @@ class ShowSeq {
|
|
|
41528
41551
|
strand2len_start_stop[prevStrand + prevPostfix].end = prevRefnumStr;
|
|
41529
41552
|
//strand2len_start_stop[prevStrand].nextStrand = undefined;
|
|
41530
41553
|
}
|
|
41531
|
-
|
|
41554
|
+
|
|
41532
41555
|
let refnumLabelNoPostfix;
|
|
41533
41556
|
// sometimes one chain may have several Ig domains,set a index for each IgDomain
|
|
41534
41557
|
index = 1;
|
|
41535
|
-
|
|
41558
|
+
prevStrandPostfix = '';
|
|
41559
|
+
bStart = false;
|
|
41560
|
+
let appearedStrands = {}, currStrand_ori, bShowRefnum = true;
|
|
41536
41561
|
for(let i = 0, il = giSeq.length; i < il; ++i) {
|
|
41537
41562
|
bLoop = false;
|
|
41538
41563
|
|
|
@@ -41541,12 +41566,12 @@ class ShowSeq {
|
|
|
41541
41566
|
let currResi = ic.ParserUtilsCls.getResi(chnid, i);
|
|
41542
41567
|
let residueid = chnid + '_' + currResi;
|
|
41543
41568
|
let domainid = (bCustom) ? 0 : ic.resid2domainid[residueid];
|
|
41544
|
-
if(!ic.residues.hasOwnProperty(residueid)) {
|
|
41545
|
-
|
|
41546
|
-
}
|
|
41547
|
-
else {
|
|
41569
|
+
//if(!ic.residues.hasOwnProperty(residueid)) {
|
|
41570
|
+
// html += '<span></span>';
|
|
41571
|
+
//}
|
|
41572
|
+
//else {
|
|
41548
41573
|
refnumLabel = ic.resid2refnum[residueid];
|
|
41549
|
-
let
|
|
41574
|
+
let bHidelabel = false;
|
|
41550
41575
|
|
|
41551
41576
|
if(refnumLabel) {
|
|
41552
41577
|
refnumStr_ori = refnumLabel.replace(/'/g, '').replace(/\*/g, '').replace(/\^/g, '').substr(1); // C', C''
|
|
@@ -41557,7 +41582,8 @@ class ShowSeq {
|
|
|
41557
41582
|
|
|
41558
41583
|
refnumLabelNoPostfix = currStrand + parseInt(refnumStr_ori);
|
|
41559
41584
|
|
|
41560
|
-
if(
|
|
41585
|
+
if(currStrand_ori != prevStrand) { // reset currCnt
|
|
41586
|
+
bStart = false;
|
|
41561
41587
|
currCnt = 1;
|
|
41562
41588
|
}
|
|
41563
41589
|
|
|
@@ -41575,30 +41601,44 @@ class ShowSeq {
|
|
|
41575
41601
|
refnum = parseInt(refnumStr);
|
|
41576
41602
|
postfix = refnumStr.replace(refnum.toString(), '') + '_' + index;
|
|
41577
41603
|
|
|
41604
|
+
// sometimes insertions may happen inside a strand. Reset currCnt
|
|
41605
|
+
if(currStrand_ori == prevStrand && refnum > 1000 && refnumStr.substr(1,1) != '9') { // strand region
|
|
41606
|
+
currCnt = 1;
|
|
41607
|
+
|
|
41608
|
+
if(bStart && prevStrandPostfix) {
|
|
41609
|
+
--index;
|
|
41610
|
+
prevStrandPostfix = '';
|
|
41611
|
+
}
|
|
41612
|
+
}
|
|
41613
|
+
|
|
41578
41614
|
// #9##
|
|
41579
41615
|
if(prevStrand && refnum > 1000 && refnumStr.substr(1,1) == '9') { // loop region
|
|
41580
41616
|
bLoop = true;
|
|
41581
41617
|
|
|
41582
41618
|
if(currCnt == 1) { // start of a loop
|
|
41583
|
-
if(appearedStrands.hasOwnProperty(
|
|
41619
|
+
if(appearedStrands.hasOwnProperty(currStrand_ori + postfix)) { // the strand appeared in 2nd Id domain
|
|
41584
41620
|
++index;
|
|
41585
41621
|
postfix = refnumStr.replace(refnum.toString(), '') + '_' + index;
|
|
41586
41622
|
}
|
|
41587
41623
|
|
|
41588
|
-
appearedStrands[
|
|
41624
|
+
appearedStrands[currStrand_ori + postfix] = 1;
|
|
41589
41625
|
}
|
|
41590
41626
|
|
|
41591
|
-
let result = this.getAdjustedRefnum(strand2len_start_stop,
|
|
41592
|
-
|
|
41627
|
+
let result = this.getAdjustedRefnum(strand2len_start_stop, currStrand_ori, currCnt, currFirstDigit, postfix, prevRefnum);
|
|
41628
|
+
|
|
41629
|
+
refnum = result.refnum;
|
|
41630
|
+
bShowRefnum = result.bShowRefnum;
|
|
41593
41631
|
refnumStr = result.refnumStr;
|
|
41594
41632
|
refnumLabel = result.refnumLabel;
|
|
41595
41633
|
refnumLabelNoPostfix = result.refnumLabelNoPostfix;
|
|
41596
41634
|
|
|
41597
|
-
|
|
41635
|
+
bHidelabel = result.bHidelabel;
|
|
41598
41636
|
currStrand = refnumLabel.replace(new RegExp(refnumStr,'g'), '');
|
|
41599
41637
|
|
|
41600
41638
|
++currCnt;
|
|
41601
41639
|
}
|
|
41640
|
+
|
|
41641
|
+
prevRefnum = refnum;
|
|
41602
41642
|
}
|
|
41603
41643
|
|
|
41604
41644
|
if(bCustom) {
|
|
@@ -41636,40 +41676,59 @@ class ShowSeq {
|
|
|
41636
41676
|
}
|
|
41637
41677
|
}
|
|
41638
41678
|
else {
|
|
41639
|
-
|
|
41679
|
+
if(bShowRefnum && currStrand != ' ') {
|
|
41680
|
+
html += this.getRefnumHtml(residueid, refnumStr, refnumStr_ori, refnumLabel, currStrand, bLoop, bHidelabel);
|
|
41681
|
+
}
|
|
41682
|
+
else {
|
|
41683
|
+
html += '<span></span>';
|
|
41684
|
+
}
|
|
41640
41685
|
}
|
|
41641
41686
|
}
|
|
41642
41687
|
else {
|
|
41643
41688
|
let atom = ic.firstAtomObjCls.getFirstAtomObj(ic.residues[residueid]);
|
|
41644
41689
|
|
|
41645
41690
|
// skip non-protein residues
|
|
41646
|
-
|
|
41691
|
+
// after G strand and before A strand, just use the mapped reference number
|
|
41692
|
+
if((!atom || ic.proteins.hasOwnProperty(atom.serial)) && prevStrand && !bCustom && !kabat_or_imgt
|
|
41693
|
+
&& (!currStrand_ori || currStrand_ori.substr(0,1) != 'G')) {
|
|
41647
41694
|
// no ref num
|
|
41648
41695
|
bLoop = true;
|
|
41649
41696
|
|
|
41650
41697
|
if(currCnt == 1) { // start of a loop
|
|
41651
|
-
if(appearedStrands.hasOwnProperty(
|
|
41698
|
+
if(appearedStrands.hasOwnProperty(currStrand_ori + postfix)) { // the strand appeared in 2nd Id domain
|
|
41652
41699
|
++index;
|
|
41653
41700
|
}
|
|
41654
41701
|
|
|
41655
41702
|
postfix = refnumStr.replace(refnum.toString(), '') + '_' + index;
|
|
41656
41703
|
|
|
41657
|
-
appearedStrands[
|
|
41704
|
+
appearedStrands[currStrand_ori + postfix] = 1;
|
|
41705
|
+
|
|
41706
|
+
bStart = true;
|
|
41707
|
+
prevStrandPostfix = currStrand_ori + postfix;
|
|
41658
41708
|
}
|
|
41659
41709
|
|
|
41660
41710
|
// use previous postfix
|
|
41661
|
-
let result = this.getAdjustedRefnum(strand2len_start_stop,
|
|
41662
|
-
|
|
41711
|
+
let result = this.getAdjustedRefnum(strand2len_start_stop, currStrand_ori, currCnt, currFirstDigit, postfix, prevRefnum);
|
|
41712
|
+
|
|
41713
|
+
refnum = result.refnum;
|
|
41714
|
+
bShowRefnum = result.bShowRefnum;
|
|
41663
41715
|
refnumStr = result.refnumStr;
|
|
41664
41716
|
refnumLabel = result.refnumLabel;
|
|
41665
41717
|
refnumLabelNoPostfix = result.refnumLabelNoPostfix;
|
|
41666
41718
|
|
|
41667
|
-
|
|
41719
|
+
prevRefnum = refnum;
|
|
41720
|
+
|
|
41721
|
+
bHidelabel = result.bHidelabel;
|
|
41668
41722
|
currStrand = refnumLabel.replace(new RegExp(refnumStr,'g'), '');
|
|
41669
41723
|
|
|
41670
41724
|
++currCnt;
|
|
41671
41725
|
|
|
41672
|
-
|
|
41726
|
+
if(bShowRefnum && currStrand != ' ') {
|
|
41727
|
+
html += this.getRefnumHtml(residueid, refnumStr, refnumStr_ori, refnumLabel, currStrand, bLoop, bHidelabel);
|
|
41728
|
+
}
|
|
41729
|
+
else {
|
|
41730
|
+
html += '<span></span>';
|
|
41731
|
+
}
|
|
41673
41732
|
}
|
|
41674
41733
|
else {
|
|
41675
41734
|
html += '<span></span>';
|
|
@@ -41693,7 +41752,7 @@ class ShowSeq {
|
|
|
41693
41752
|
// remove the postfix when comparing interactions
|
|
41694
41753
|
//ic.chainsMapping[chnid][residueid] = refnumLabel;
|
|
41695
41754
|
ic.chainsMapping[chnid][residueid] = refnumLabelNoPostfix;
|
|
41696
|
-
}
|
|
41755
|
+
//}
|
|
41697
41756
|
|
|
41698
41757
|
prevStrand = currStrand_ori; //currStrand;
|
|
41699
41758
|
}
|
|
@@ -41708,10 +41767,11 @@ class ShowSeq {
|
|
|
41708
41767
|
return {html: html, html3: html3}
|
|
41709
41768
|
}
|
|
41710
41769
|
|
|
41711
|
-
getAdjustedRefnum(strand2len_start_stop, currStrand, currCnt, currFirstDigit, postfix) { let ic = this.icn3d; ic.icn3dui;
|
|
41712
|
-
let refnumStr, refnumLabel, refnumLabelNoPostfix;
|
|
41770
|
+
getAdjustedRefnum(strand2len_start_stop, currStrand, currCnt, currFirstDigit, postfix, prevRefnum) { let ic = this.icn3d; ic.icn3dui;
|
|
41771
|
+
let refnum, refnumStr, refnumLabel, refnumLabelNoPostfix;
|
|
41713
41772
|
|
|
41714
|
-
let
|
|
41773
|
+
let bHidelabel = false; // do not show the label
|
|
41774
|
+
let bShowRefnum = true;
|
|
41715
41775
|
|
|
41716
41776
|
if(strand2len_start_stop[currStrand + postfix]) {
|
|
41717
41777
|
let start = parseInt(strand2len_start_stop[currStrand + postfix].start);
|
|
@@ -41723,7 +41783,6 @@ class ShowSeq {
|
|
|
41723
41783
|
let len = strand2len_start_stop[currStrand + postfix].len;
|
|
41724
41784
|
let halfLen = (strand2len_start_stop[currStrand + postfix].nextStrand) ? parseInt(len / 2.0 + 0.5) : len;
|
|
41725
41785
|
|
|
41726
|
-
let refnum;
|
|
41727
41786
|
if(currCnt <= halfLen) {
|
|
41728
41787
|
refnum = start + currCnt;
|
|
41729
41788
|
refnumStr = refnum + postfixStart;
|
|
@@ -41738,28 +41797,42 @@ class ShowSeq {
|
|
|
41738
41797
|
|
|
41739
41798
|
refnumLabelNoPostfix = currStrand + refnum;
|
|
41740
41799
|
|
|
41741
|
-
if(currCnt == 0 || currCnt == halfLen || currCnt == halfLen + 1 || currCnt == end - 1) {
|
|
41742
|
-
|
|
41800
|
+
//if(currCnt == 0 || currCnt == halfLen || currCnt == halfLen + 1 || currCnt == end - 1) {
|
|
41801
|
+
// if(currCnt == 1 || currCnt == halfLen || currCnt == halfLen + 1 || currCnt == end - 1) {
|
|
41802
|
+
// bHidelabel = true;
|
|
41803
|
+
// }
|
|
41804
|
+
if(currCnt == 1 || currCnt == end - 1) {
|
|
41805
|
+
bHidelabel = true;
|
|
41806
|
+
}
|
|
41807
|
+
|
|
41808
|
+
if(currCnt == 1 && start != prevRefnum) { // skip insertions
|
|
41809
|
+
bShowRefnum = false;
|
|
41810
|
+
|
|
41811
|
+
refnum = 0;
|
|
41812
|
+
refnumStr = '';
|
|
41813
|
+
refnumLabel = '';
|
|
41814
|
+
refnumLabelNoPostfix = '';
|
|
41743
41815
|
}
|
|
41744
41816
|
}
|
|
41745
41817
|
else {
|
|
41746
41818
|
// refnumStr = (parseInt(currFirstDigit) * 1000 + 900 + currCnt).toString();
|
|
41747
41819
|
// refnumLabel = currStrand + refnumStr;
|
|
41748
41820
|
|
|
41821
|
+
refnum = 0;
|
|
41749
41822
|
refnumStr = '';
|
|
41750
41823
|
refnumLabel = '';
|
|
41751
41824
|
refnumLabelNoPostfix = '';
|
|
41752
41825
|
|
|
41753
|
-
|
|
41826
|
+
bHidelabel = true;
|
|
41754
41827
|
}
|
|
41755
41828
|
|
|
41756
|
-
return {refnumStr: refnumStr, refnumLabel: refnumLabel, refnumLabelNoPostfix: refnumLabelNoPostfix,
|
|
41829
|
+
return {refnum: refnum, refnumStr: refnumStr, refnumLabel: refnumLabel, refnumLabelNoPostfix: refnumLabelNoPostfix, bHidelabel: bHidelabel, bShowRefnum: bShowRefnum};
|
|
41757
41830
|
}
|
|
41758
41831
|
|
|
41759
|
-
getRefnumHtml(residueid, refnumStr, refnumStr_ori, refnumLabel, currStrand, bLoop,
|
|
41832
|
+
getRefnumHtml(residueid, refnumStr, refnumStr_ori, refnumLabel, currStrand, bLoop, bHidelabel) { let ic = this.icn3d, me = ic.icn3dui;
|
|
41760
41833
|
let refnum = parseInt(refnumStr).toString();
|
|
41761
41834
|
let color = this.getRefnumColor(currStrand);
|
|
41762
|
-
let colorStr = 'style="color:' + color + '"';
|
|
41835
|
+
let colorStr = (!bLoop) ? 'style="color:' + color + '; text-decoration: underline overline;"' : 'style="color:' + color + '"';
|
|
41763
41836
|
|
|
41764
41837
|
let lastTwo = parseInt(refnum.substr(refnum.length - 2, 2));
|
|
41765
41838
|
parseInt(refnum.substr(refnum.length - 3, 3));
|
|
@@ -41772,7 +41845,7 @@ class ShowSeq {
|
|
|
41772
41845
|
|
|
41773
41846
|
html += '<span ' + colorStr + ' title="' + refnumLabel + '"><b>' + refnumLabel.substr(0, 1) + '</b>' + refnumLabel.substr(1) + '</span>';
|
|
41774
41847
|
}
|
|
41775
|
-
else if(lastTwo % 2 == 0 && lastTwo != 52 && !
|
|
41848
|
+
else if(lastTwo % 2 == 0 && lastTwo != 52 && !bHidelabel) { // don't show label for the first, middle, and last loop residues
|
|
41776
41849
|
// e.g., 2152a
|
|
41777
41850
|
let lastTwoStr = isNaN(refnumStr) ? lastTwo + refnumStr.substr(refnumStr.length - 1, 1) : lastTwo;
|
|
41778
41851
|
html += '<span ' + colorStr + ' title="' + refnumLabel + '">' + lastTwoStr + '</span>';
|
|
@@ -41786,43 +41859,43 @@ class ShowSeq {
|
|
|
41786
41859
|
|
|
41787
41860
|
getRefnumColor(currStrand) { let ic = this.icn3d; ic.icn3dui;
|
|
41788
41861
|
if(currStrand == "A^") { // deep sky blue
|
|
41789
|
-
return '#00BFFF';
|
|
41862
|
+
return '#9900ff'; //'#00BFFF';
|
|
41790
41863
|
}
|
|
41791
41864
|
else if(currStrand == "A") { // blue
|
|
41792
|
-
return '#0000FF';
|
|
41865
|
+
return '#9900ff'; //'#0000FF';
|
|
41793
41866
|
}
|
|
41794
41867
|
else if(currStrand == "A*") { // sky blue
|
|
41795
|
-
return '#87CEEB';
|
|
41868
|
+
return '#9900ff'; //'#87CEEB';
|
|
41796
41869
|
}
|
|
41797
41870
|
else if(currStrand == "A'") { // steel blue
|
|
41798
|
-
return '#4682B4';
|
|
41871
|
+
return '#9900ff'; //'#4682B4';
|
|
41799
41872
|
}
|
|
41800
41873
|
else if(currStrand == "B") { // cyan
|
|
41801
|
-
return '#00FFFF';
|
|
41874
|
+
return '#4a86e8'; //'#00FFFF';
|
|
41802
41875
|
}
|
|
41803
41876
|
else if(currStrand == "C") { // green
|
|
41804
|
-
return '#00FF00';
|
|
41877
|
+
return '#76d6ff'; //'#00FF00';
|
|
41805
41878
|
}
|
|
41806
41879
|
else if(currStrand == "C'") { // yellow
|
|
41807
|
-
return '#FFFF00';
|
|
41880
|
+
return '#00b050'; //'#FFFF00';
|
|
41808
41881
|
}
|
|
41809
41882
|
else if(currStrand == "C''") { // orange
|
|
41810
|
-
return '#FFA500';
|
|
41883
|
+
return '#00ff00'; //'#FFA500';
|
|
41811
41884
|
}
|
|
41812
41885
|
else if(currStrand == "D") { // brown
|
|
41813
|
-
return '#A52A2A';
|
|
41886
|
+
return '#fffb00'; //'#A52A2A';
|
|
41814
41887
|
}
|
|
41815
41888
|
else if(currStrand == "E") { // pink
|
|
41816
|
-
return '#FFC0CB';
|
|
41889
|
+
return '#ffd966'; //'#FFC0CB';
|
|
41817
41890
|
}
|
|
41818
41891
|
else if(currStrand == "F") { // magenta
|
|
41819
|
-
return '#FF00FF';
|
|
41892
|
+
return '#ff9900'; //'#FF00FF';
|
|
41820
41893
|
}
|
|
41821
41894
|
else if(currStrand == "G") { // red
|
|
41822
|
-
return '#FF0000';
|
|
41895
|
+
return '#ff2600'; //'#FF0000';
|
|
41823
41896
|
}
|
|
41824
41897
|
else if(currStrand == "G*") { // salmon
|
|
41825
|
-
return '#FA8072';
|
|
41898
|
+
return '#ff2600'; //'#FA8072';
|
|
41826
41899
|
}
|
|
41827
41900
|
else {
|
|
41828
41901
|
return '#000';
|
|
@@ -43187,6 +43260,8 @@ class LineGraph {
|
|
|
43187
43260
|
drawGraphPerType(bCommonDiff, structureArray, bScatterplot, nodeArray1, nodeArray2, linkArray, name2node, heightFinal, height, textHeight, len1Split, r, gap, marginY) { let ic = this.icn3d; ic.icn3dui;
|
|
43188
43261
|
let html = "";
|
|
43189
43262
|
|
|
43263
|
+
let bMutation = structureArray.length == 2 && structureArray[1].replace(structureArray[0], '') == '2';
|
|
43264
|
+
|
|
43190
43265
|
// draw common interaction
|
|
43191
43266
|
let label, postfix;
|
|
43192
43267
|
if(bCommonDiff == 0) {
|
|
@@ -43203,11 +43278,21 @@ class LineGraph {
|
|
|
43203
43278
|
}
|
|
43204
43279
|
|
|
43205
43280
|
for(let i = 0, il = structureArray.length; i < il; ++i) {
|
|
43281
|
+
let labelFinal = label;
|
|
43282
|
+
if(bMutation) {
|
|
43283
|
+
if(i == 0) {
|
|
43284
|
+
labelFinal += "Wild Type ";
|
|
43285
|
+
}
|
|
43286
|
+
else if(i == 1) {
|
|
43287
|
+
labelFinal += "Mutant ";
|
|
43288
|
+
}
|
|
43289
|
+
}
|
|
43290
|
+
|
|
43206
43291
|
if(bScatterplot) {
|
|
43207
|
-
html += this.drawScatterplot_base(nodeArray1[i], nodeArray2[i], linkArray[i], name2node, heightFinal, undefined,
|
|
43292
|
+
html += this.drawScatterplot_base(nodeArray1[i], nodeArray2[i], linkArray[i], name2node, heightFinal, undefined, labelFinal + structureArray[i], textHeight);
|
|
43208
43293
|
height =(len1Split[i] + 1) *(r + gap) + 2 * marginY + textHeight;
|
|
43209
43294
|
} else {
|
|
43210
|
-
html += this.drawLineGraph_base(nodeArray1[i], nodeArray2[i], linkArray[i], name2node, heightFinal,
|
|
43295
|
+
html += this.drawLineGraph_base(nodeArray1[i], nodeArray2[i], linkArray[i], name2node, heightFinal, labelFinal + structureArray[i], textHeight);
|
|
43211
43296
|
}
|
|
43212
43297
|
heightFinal += height;
|
|
43213
43298
|
|
|
@@ -54055,6 +54140,16 @@ class LoadPDB {
|
|
|
54055
54140
|
this.icn3d = icn3d;
|
|
54056
54141
|
}
|
|
54057
54142
|
|
|
54143
|
+
getStructureId(id, moleculeNum, bMutation) { let ic = this.icn3d; ic.icn3dui;
|
|
54144
|
+
let structure = id;
|
|
54145
|
+
|
|
54146
|
+
if(id == ic.defaultPdbId || bMutation) { // bMutation: side chain prediction
|
|
54147
|
+
structure = (moleculeNum === 1) ? id : id + moleculeNum.toString();
|
|
54148
|
+
}
|
|
54149
|
+
|
|
54150
|
+
return structure;
|
|
54151
|
+
}
|
|
54152
|
+
|
|
54058
54153
|
// modified from iview (http://istar.cse.cuhk.edu.hk/iview/)
|
|
54059
54154
|
//This PDB parser feeds the viewer with the content of a PDB file, pdbData.
|
|
54060
54155
|
loadPDB(src, pdbid, bOpm, bVector, bMutation, bAppend, type, bLastQuery) { let ic = this.icn3d, me = ic.icn3dui;
|
|
@@ -54137,12 +54232,7 @@ class LoadPDB {
|
|
|
54137
54232
|
}
|
|
54138
54233
|
}
|
|
54139
54234
|
|
|
54140
|
-
structure = id;
|
|
54141
|
-
|
|
54142
|
-
if(id == ic.defaultPdbId || bMutation) { // bMutation: side chain prediction
|
|
54143
|
-
//if(id == ic.defaultPdbId) {
|
|
54144
|
-
structure = (moleculeNum === 1) ? id : id + moleculeNum.toString();
|
|
54145
|
-
}
|
|
54235
|
+
structure = this.getStructureId(id, moleculeNum, bMutation);
|
|
54146
54236
|
|
|
54147
54237
|
ic.molTitle = '';
|
|
54148
54238
|
|
|
@@ -54257,12 +54347,7 @@ class LoadPDB {
|
|
|
54257
54347
|
++moleculeNum;
|
|
54258
54348
|
id = ic.defaultPdbId;
|
|
54259
54349
|
|
|
54260
|
-
structure = id;
|
|
54261
|
-
|
|
54262
|
-
if(id == ic.defaultPdbId || bMutation) { // bMutation: side chain prediction
|
|
54263
|
-
//if(id == ic.defaultPdbId) {
|
|
54264
|
-
structure = (moleculeNum === 1) ? id : id + moleculeNum.toString();
|
|
54265
|
-
}
|
|
54350
|
+
structure = this.getStructureId(id, moleculeNum, bMutation);
|
|
54266
54351
|
|
|
54267
54352
|
//helices = [];
|
|
54268
54353
|
//sheets = [];
|
|
@@ -54281,12 +54366,7 @@ class LoadPDB {
|
|
|
54281
54366
|
ic.pmid = line.substr(19).trim();
|
|
54282
54367
|
}
|
|
54283
54368
|
} else if (record === 'ATOM ' || record === 'HETATM') {
|
|
54284
|
-
structure = id;
|
|
54285
|
-
|
|
54286
|
-
if(id == ic.defaultPdbId || bMutation) { // bMutation: side chain prediction
|
|
54287
|
-
//if(id == ic.defaultPdbId) {
|
|
54288
|
-
structure = (moleculeNum === 1) ? id : id + moleculeNum.toString();
|
|
54289
|
-
}
|
|
54369
|
+
structure = this.getStructureId(id, moleculeNum, bMutation);
|
|
54290
54370
|
|
|
54291
54371
|
let alt = line.substr(16, 1);
|
|
54292
54372
|
//if (alt !== " " && alt !== "A") continue;
|
|
@@ -59180,7 +59260,7 @@ class SelectByCommand {
|
|
|
59180
59260
|
let residArray = [];
|
|
59181
59261
|
|
|
59182
59262
|
if(bRefnum) {
|
|
59183
|
-
let residArrayTmp = ic.refnum2residArray[k];
|
|
59263
|
+
let residArrayTmp = (ic.refnum2residArray[k]) ? ic.refnum2residArray[k] : [];
|
|
59184
59264
|
for(let m = 0, ml = residArrayTmp.length; m < ml; ++m) {
|
|
59185
59265
|
let residueId = residArrayTmp[m];
|
|
59186
59266
|
if(residueId.substr(0, residueId.lastIndexOf('_')) == molecule_chain) {
|
|
@@ -61620,12 +61700,12 @@ if(!me.bNode) {
|
|
|
61620
61700
|
}
|
|
61621
61701
|
|
|
61622
61702
|
let prevStrand;
|
|
61703
|
+
let bCd19 = ic.chainid2index[chainid].length == 1 && ic.refpdbArray[ic.chainid2index[chainid][0]] == '6al5_cd19';
|
|
61623
61704
|
for(let i = 0, il = segArray.length; i < il; ++i) {
|
|
61624
61705
|
let seg = segArray[i];
|
|
61625
61706
|
let qStart = seg.q_start;
|
|
61626
61707
|
parseInt(seg.q_start);
|
|
61627
|
-
|
|
61628
|
-
if(isNaN(seg.q_start)) postfix = seg.q_start.substr(seg.q_start.length - 1, 1);
|
|
61708
|
+
if(isNaN(seg.q_start)) seg.q_start.substr(seg.q_start.length - 1, 1);
|
|
61629
61709
|
|
|
61630
61710
|
// one item in "seq"
|
|
61631
61711
|
// q_start and q_end are numbers, but saved in string
|
|
@@ -61636,9 +61716,10 @@ if(!me.bNode) {
|
|
|
61636
61716
|
|
|
61637
61717
|
let resid = chainid + '_' + seg.t_start;
|
|
61638
61718
|
//let refnum = qStartInt.toString() + postfix;
|
|
61639
|
-
let refnum = qStart + postfix;
|
|
61719
|
+
//let refnum = qStart + postfix;
|
|
61720
|
+
let refnum = qStart;
|
|
61640
61721
|
|
|
61641
|
-
let refnumLabel = thisClass.getLabelFromRefnum(refnum, prevStrand);
|
|
61722
|
+
let refnumLabel = thisClass.getLabelFromRefnum(refnum, prevStrand, bCd19);
|
|
61642
61723
|
prevStrand = refnumLabel.replace(new RegExp(refnum,'g'), '');
|
|
61643
61724
|
|
|
61644
61725
|
ic.resid2refnum[resid] = refnumLabel;
|
|
@@ -61673,7 +61754,7 @@ if(!me.bNode) {
|
|
|
61673
61754
|
}
|
|
61674
61755
|
}
|
|
61675
61756
|
|
|
61676
|
-
getLabelFromRefnum(oriRefnum, prevStrand) { let ic = this.icn3d; ic.icn3dui;
|
|
61757
|
+
getLabelFromRefnum(oriRefnum, prevStrand, bCd19) { let ic = this.icn3d; ic.icn3dui;
|
|
61677
61758
|
let refnum = parseInt(oriRefnum);
|
|
61678
61759
|
|
|
61679
61760
|
// A^: 1xx or 2xx
|
|
@@ -61691,7 +61772,10 @@ if(!me.bNode) {
|
|
|
61691
61772
|
// G*: 94xx
|
|
61692
61773
|
|
|
61693
61774
|
if(refnum < 100) return " " + oriRefnum;
|
|
61694
|
-
else if(refnum >= 100 && refnum < 1000)
|
|
61775
|
+
else if(refnum >= 100 && refnum < 1000) {
|
|
61776
|
+
if(bCd19) return " " + oriRefnum;
|
|
61777
|
+
else return "A^" + oriRefnum;
|
|
61778
|
+
}
|
|
61695
61779
|
else if(refnum >= 1000 && refnum < 1200) return "A" + oriRefnum;
|
|
61696
61780
|
else if(refnum >= 1200 && refnum < 1300) return "A'" + oriRefnum;
|
|
61697
61781
|
else if(refnum >= 1300 && refnum < 1400) return "A*" + oriRefnum;
|
|
@@ -61873,7 +61957,7 @@ class Scap {
|
|
|
61873
61957
|
|
|
61874
61958
|
let data;
|
|
61875
61959
|
|
|
61876
|
-
try {
|
|
61960
|
+
// try {
|
|
61877
61961
|
data = await me.getAjaxPostPromise(url, dataObj, true, undefined, undefined, undefined, 'text');
|
|
61878
61962
|
|
|
61879
61963
|
let pos = data.indexOf('\n');
|
|
@@ -61963,8 +62047,10 @@ console.log("free energy: " + energy + " kcal/mol");
|
|
|
61963
62047
|
|
|
61964
62048
|
let atomWT = ic.firstAtomObjCls.getFirstAtomObj(ic.residues[resid]);
|
|
61965
62049
|
|
|
61966
|
-
|
|
61967
|
-
|
|
62050
|
+
if(atomWT) {
|
|
62051
|
+
ic.atoms[serial].color = atomWT.color;
|
|
62052
|
+
ic.atomPrevColors[serial] = atomWT.color;
|
|
62053
|
+
}
|
|
61968
62054
|
}
|
|
61969
62055
|
|
|
61970
62056
|
let chainid = atom.structure + '_' + atom.chain;
|
|
@@ -62030,6 +62116,7 @@ console.log("free energy: " + energy + " kcal/mol");
|
|
|
62030
62116
|
// expand the toolbar
|
|
62031
62117
|
let id = ic.pre + 'selection';
|
|
62032
62118
|
$("#" + id).show();
|
|
62119
|
+
/*
|
|
62033
62120
|
}
|
|
62034
62121
|
catch(err) {
|
|
62035
62122
|
var aaa = 1; //alert("There are some problems in predicting the side chain of the mutant...");
|
|
@@ -62039,6 +62126,7 @@ console.log("free energy: " + energy + " kcal/mol");
|
|
|
62039
62126
|
/// if(ic.deferredScap !== undefined) ic.deferredScap.resolve();
|
|
62040
62127
|
return;
|
|
62041
62128
|
}
|
|
62129
|
+
*/
|
|
62042
62130
|
}
|
|
62043
62131
|
|
|
62044
62132
|
async exportPdbProfix(bHydrogen, pdb, snpStr) { let ic = this.icn3d, me = ic.icn3dui;
|