icn3d 3.29.3 → 3.29.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 CHANGED
@@ -7972,7 +7972,7 @@ class ClickMenu {
7972
7972
  }
7973
7973
  }
7974
7974
  }
7975
- if(ic.bAddLogs && me.cfg.showcommand) {
7975
+ if((ic.bAddLogs || bAddLogs) && me.cfg.showcommand) {
7976
7976
  let finalStr = (bSetCommand) ? str : '[comment] ' + str;
7977
7977
  ic.logs.push(finalStr);
7978
7978
  // move cursor to the end, and scroll to the end
@@ -14568,6 +14568,14 @@ class Events {
14568
14568
  thisClass.setLogCmd('define coil sets | chain ' + chainid, true);
14569
14569
  });
14570
14570
 
14571
+ $(document).on("click", ".icn3d-iganchorsets", function(e) { let ic = me.icn3d;
14572
+ e.stopImmediatePropagation();
14573
+ //e.preventDefault();
14574
+ let chainid = $(this).attr('chainid');
14575
+ ic.addTrackCls.defineIgstrand(chainid, 'iganchor');
14576
+ thisClass.setLogCmd('define iganchor sets | chain ' + chainid, true);
14577
+ });
14578
+
14571
14579
  $(document).on("click", ".icn3d-igstrandsets", function(e) { let ic = me.icn3d;
14572
14580
  e.stopImmediatePropagation();
14573
14581
  //e.preventDefault();
@@ -16005,6 +16013,9 @@ class Html {
16005
16013
  //this.baseUrl = "https://structure.ncbi.nlm.nih.gov/";
16006
16014
  this.baseUrl = (window && window.location && window.location.hostname == 'structure.ncbi.nlm.nih.gov')
16007
16015
  ? "https://structure.ncbi.nlm.nih.gov/Structure/" : "https://www.ncbi.nlm.nih.gov/Structure/";
16016
+
16017
+ this.tmalignUrl = this.baseUrl + "tmalign/tmalign.cgi";
16018
+
16008
16019
  this.divStr = "<div id='" + this.icn3dui.pre;
16009
16020
  this.divNowrapStr = "<div style='white-space:nowrap'>";
16010
16021
  this.spanNowrapStr = "<span style='white-space:nowrap'>";
@@ -40620,64 +40631,78 @@ class AddTrack {
40620
40631
 
40621
40632
  if(!ic.residues.hasOwnProperty(resid) ) continue;
40622
40633
 
40623
- let refnumLabel, refnumStr;
40634
+ let refnumLabel, refnumStr, refnum;
40624
40635
  refnumLabel = ic.resid2refnum[resid];
40625
40636
  if(!refnumLabel) continue;
40626
40637
 
40627
40638
  refnumStr = ic.refnumCls.rmStrandFromRefnumlabel(refnumLabel);
40628
40639
  currStrand = refnumLabel.replace(refnumStr, '');
40640
+ refnum = parseInt(refnumStr);
40629
40641
 
40630
- if(ic.residIgLoop.hasOwnProperty(resid)) {
40631
- currType = 'igloop';
40632
- }
40642
+ if(type == 'iganchor') {
40643
+ if(refnum > 1000 && refnumStr.substr(refnumStr.length - 2, 2) == '50') {
40644
+ selectedResidues[resid] = 1;
40645
+ }
40646
+ }
40633
40647
  else {
40634
- currType = 'igstrand';
40635
- }
40648
+ if(ic.residIgLoop.hasOwnProperty(resid)) {
40649
+ currType = 'igloop';
40650
+ }
40651
+ else {
40652
+ currType = 'igstrand';
40653
+ }
40636
40654
 
40637
- if(bStart && currType != prevType && Object.keys(selectedResidues).length > 0) {
40638
- if(prevType == 'igstrand') {
40639
- ++strandCnt;
40640
- setName = 'Strand-' + prevStrand + '-' + chainid + '-' + strandCnt.toString().padStart(3, '0');
40641
- setName = setName.replace(/'/g, '`');
40642
- if(type == 'igstrand') {
40643
- ic.selectionCls.selectResidueList(selectedResidues, setName, setName, bUnion, bUpdateHighlight);
40644
- if(!bUnion) bUnion = true;
40655
+ if(bStart && currType != prevType && Object.keys(selectedResidues).length > 0) {
40656
+ if(prevType == 'igstrand') {
40657
+ ++strandCnt;
40658
+ setName = 'Strand-' + prevStrand + '-' + chainid + '-' + strandCnt.toString().padStart(3, '0');
40659
+ setName = setName.replace(/'/g, '`');
40660
+ if(type == 'igstrand') {
40661
+ ic.selectionCls.selectResidueList(selectedResidues, setName, setName, bUnion, bUpdateHighlight);
40662
+ if(!bUnion) bUnion = true;
40663
+ }
40664
+ prevStrandReal = prevStrand;
40645
40665
  }
40646
- prevStrandReal = prevStrand;
40647
- }
40648
- else if(prevType == 'igloop') {
40649
- ++loopCnt;
40650
- setName = 'Loop-' + prevStrandReal + '_' + currStrand + '-' + chainid + '-' + loopCnt.toString().padStart(3, '0');
40651
- setName = setName.replace(/'/g, '`');
40652
- if(type == 'igloop') {
40653
- ic.selectionCls.selectResidueList(selectedResidues, setName, setName, bUnion, bUpdateHighlight);
40654
- if(!bUnion) bUnion = true;
40666
+ else if(prevType == 'igloop') {
40667
+ ++loopCnt;
40668
+ setName = 'Loop-' + prevStrandReal + '_' + currStrand + '-' + chainid + '-' + loopCnt.toString().padStart(3, '0');
40669
+ setName = setName.replace(/'/g, '`');
40670
+ if(type == 'igloop') {
40671
+ ic.selectionCls.selectResidueList(selectedResidues, setName, setName, bUnion, bUpdateHighlight);
40672
+ if(!bUnion) bUnion = true;
40673
+ }
40655
40674
  }
40656
- }
40657
40675
 
40658
- selectedResidues = {};
40659
- }
40676
+ selectedResidues = {};
40677
+ }
40660
40678
 
40661
- selectedResidues[resid] = 1;
40679
+ selectedResidues[resid] = 1;
40662
40680
 
40663
- prevStrand = currStrand;
40664
- prevType = currType;
40681
+ prevStrand = currStrand;
40682
+ prevType = currType;
40665
40683
 
40666
- bStart = true;
40684
+ bStart = true;
40685
+ }
40667
40686
  } // for loop
40668
40687
 
40669
- if(prevType == 'igstrand') {
40670
- ++strandCnt;
40671
- setName = 'Strand-' + prevStrand + '-' + chainid + '-' + strandCnt.toString().padStart(3, '0');
40672
- setName = setName.replace(/'/g, '`');
40673
- if(type == 'igstrand') ic.selectionCls.selectResidueList(selectedResidues, setName, setName, bUnion, bUpdateHighlight);
40688
+ if(type == 'iganchor') {
40689
+ setName = 'Anchor-' + chainid;
40690
+ ic.selectionCls.selectResidueList(selectedResidues, setName, setName, bUnion, bUpdateHighlight);
40674
40691
  }
40675
- else if(prevType == 'igloop') {
40676
- ++loopCnt;
40677
- currStrand = 'CT';
40678
- setName = 'Loop-' + prevStrandReal + '_' + currStrand + '-' + chainid + '-' + loopCnt.toString().padStart(3, '0');
40679
- setName = setName.replace(/'/g, '`');
40680
- if(type == 'igloop') ic.selectionCls.selectResidueList(selectedResidues, setName, setName, bUnion, bUpdateHighlight);
40692
+ else {
40693
+ if(prevType == 'igstrand') {
40694
+ ++strandCnt;
40695
+ setName = 'Strand-' + prevStrand + '-' + chainid + '-' + strandCnt.toString().padStart(3, '0');
40696
+ setName = setName.replace(/'/g, '`');
40697
+ if(type == 'igstrand') ic.selectionCls.selectResidueList(selectedResidues, setName, setName, bUnion, bUpdateHighlight);
40698
+ }
40699
+ else if(prevType == 'igloop') {
40700
+ ++loopCnt;
40701
+ currStrand = 'CT';
40702
+ setName = 'Loop-' + prevStrandReal + '_' + currStrand + '-' + chainid + '-' + loopCnt.toString().padStart(3, '0');
40703
+ setName = setName.replace(/'/g, '`');
40704
+ if(type == 'igloop') ic.selectionCls.selectResidueList(selectedResidues, setName, setName, bUnion, bUpdateHighlight);
40705
+ }
40681
40706
  }
40682
40707
  }
40683
40708
 
@@ -42463,7 +42488,7 @@ class ShowAnno {
42463
42488
  + this.addButton(chnid, "icn3d-coilsets", "Coil Sets", "Define sets for each coil in this chain and add them to the menu of \"Defined Sets\"", 60, buttonStyle);
42464
42489
 
42465
42490
  if(ic.bShowRefnum && ic.chainid2refpdbname.hasOwnProperty(chnid) && ic.chainid2refpdbname[chnid].length > 0) {
42466
- chainHtml += "&nbsp;" + this.addButton(chnid, "icn3d-igstrandsets", "Ig Strand Sets", "Define sets for each Ig strand in this chain and add them to the menu of \"Defined Sets\"", 80, buttonStyle) + "&nbsp;"
42491
+ chainHtml += "&nbsp;&nbsp;&nbsp;" + this.addButton(chnid, "icn3d-iganchorsets", "Ig Anchor Set", "Define the set for all Ig anchors in this chain and add them to the menu of \"Defined Sets\"", 80, buttonStyle) + "&nbsp;" + this.addButton(chnid, "icn3d-igstrandsets", "Ig Strand Sets", "Define sets for each Ig strand in this chain and add them to the menu of \"Defined Sets\"", 80, buttonStyle) + "&nbsp;"
42467
42492
  + this.addButton(chnid, "icn3d-igloopsets", "Ig Loop Sets", "Define sets for each Ig loop in this chain and add them to the menu of \"Defined Sets\"", 80, buttonStyle);
42468
42493
  }
42469
42494
  $("#" + ic.pre + "dl_annotations").append(chainHtml);
@@ -44168,6 +44193,9 @@ class HlSeq {
44168
44193
  }
44169
44194
  });
44170
44195
 
44196
+ ic.selectionCls.saveSelectionPrep(true);
44197
+ ic.selectionCls.saveSelection(undefined, undefined, true);
44198
+
44171
44199
  //ic.residueLabelsCls.addResidueLabels(ic.hAtoms, false, 0.5);
44172
44200
  ic.hlObjectsCls.addHlObjects(); // render() is called
44173
44201
 
@@ -44251,7 +44279,10 @@ class HlSeq {
44251
44279
 
44252
44280
  if(id !== undefined) {
44253
44281
  thisClass.selectResidues(id, this);
44254
- }
44282
+
44283
+ ic.selectionCls.saveSelectionPrep(true);
44284
+ ic.selectionCls.saveSelection(undefined, undefined, true);
44285
+ }
44255
44286
  //});
44256
44287
 
44257
44288
  //ic.residueLabelsCls.addResidueLabels(ic.hAtoms, false, 0.5);
@@ -45738,9 +45769,7 @@ class LineGraph {
45738
45769
  ic.hlUpdateCls.updateHlAll();
45739
45770
  }
45740
45771
 
45741
- async showIgRefNum(template) { let ic = this.icn3d, me = ic.icn3dui;
45742
- let thisClass = this;
45743
-
45772
+ setRefPdbs() { let ic = this.icn3d; ic.icn3dui;
45744
45773
  // round 1, 16 templates
45745
45774
  ic.refpdbArray = ['1InsulinR_8guyE_human_FN3-n1', '1Endo-1,4-BetaXylanase10A_1i8aA_bacteria_n4', '1CoAtomerGamma1_1r4xA_human', '1C3_2qkiD_human_n1', '1CuZnSuperoxideDismutase_1hl5C_human', '1ASF1A_2iijA_human', '1FAB-LIGHT_5esv_C1-n2', '1CD2_1hnfA_human_C2-n2', '1NaCaExchanger_2fwuA_dog_n2', '1NaKATPaseTransporterBeta_2zxeB_spurdogshark', '1FAB-HEAVY_5esv_V-n1', '1PDL1_4z18B_human_V-n1', '1BTLA_2aw2A_human_Iset', '1LaminAC_1ifrA_human', '1CD3g_6jxrg_human_Iset', '1CD28_1yjdC_human_V', '1CD19_6al5A_human_C2orV-n1'];
45746
45775
 
@@ -45813,7 +45842,9 @@ class LineGraph {
45813
45842
  ic.refpdbHash['6JXR_d'] = ['CD3d_6jxrd_human_Iset'];
45814
45843
  ic.refpdbHash['6JXR_f'] = ['CD3e_6jxrf_human_Iset'];
45815
45844
  ic.refpdbHash['6JXR_g'] = ['CD3g_6jxrg_human_Iset'];
45845
+ }
45816
45846
 
45847
+ getPdbAjaxArray() { let ic = this.icn3d, me = ic.icn3dui;
45817
45848
  let pdbAjaxArray = [];
45818
45849
  for(let k = 0, kl = ic.refpdbArray.length; k < kl; ++k) {
45819
45850
  let urlpdb = me.htmlCls.baseUrl + "mmcifparser/mmcifparser.cgi?refpdbid=" + ic.refpdbArray[k];
@@ -45824,6 +45855,16 @@ class LineGraph {
45824
45855
  pdbAjaxArray.push(pdbAjax);
45825
45856
  }
45826
45857
 
45858
+ return pdbAjaxArray;
45859
+ }
45860
+
45861
+ async showIgRefNum(template) { let ic = this.icn3d; ic.icn3dui;
45862
+ let thisClass = this;
45863
+
45864
+ this.setRefPdbs();
45865
+
45866
+ let pdbAjaxArray = this.getPdbAjaxArray();
45867
+
45827
45868
  // try {
45828
45869
  if(!template) {
45829
45870
  //let allPromise = Promise.allSettled(pdbAjaxArray);
@@ -45851,15 +45892,13 @@ class LineGraph {
45851
45892
  let ajaxArray = [];
45852
45893
  let domainidpairArray = [];
45853
45894
 
45854
- let urltmalign = me.htmlCls.baseUrl + "tmalign/tmalign.cgi";
45855
- me.htmlCls.baseUrl + "vastdyn/vastdyn.cgi";
45895
+ let urltmalign = me.htmlCls.tmalignUrl;
45896
+ // let urlalign = me.htmlCls.baseUrl + "vastdyn/vastdyn.cgi";
45856
45897
 
45857
45898
  if(!ic.resid2domainid) ic.resid2domainid = {};
45858
45899
  //ic.resid2domainid = {};
45859
45900
  ic.domainid2pdb = {};
45860
45901
 
45861
- let minResidues = 20;
45862
-
45863
45902
  for(let i = 0, il = struArray.length; i < il; ++i) {
45864
45903
  let struct = struArray[i];
45865
45904
  let chainidArray = ic.structures[struct];
@@ -45867,79 +45906,8 @@ class LineGraph {
45867
45906
  for(let j = 0, jl = chainidArray.length; j < jl; ++j) {
45868
45907
  let chainid = chainidArray[j];
45869
45908
 
45870
- if(!ic.proteins.hasOwnProperty(ic.firstAtomObjCls.getFirstAtomObj(ic.chains[chainid]).serial)
45871
- && !ic.proteins.hasOwnProperty(ic.firstAtomObjCls.getMiddleAtomObj(ic.chains[chainid]).serial)) continue;
45872
- if(ic.chainsSeq[chainid].length < minResidues) continue; // peptide
45873
-
45874
- let currAtoms = me.hashUtilsCls.intHash(ic.chains[chainid], ic.hAtoms);
45875
- if(Object.keys(currAtoms).length == 0) continue;
45876
-
45877
- // align each 3D domain with reference structure
45878
- //let result = ic.domain3dCls.c2b_NewSplitChain(ic.chains[chainid]);
45879
- // assign ref numbers to selected residues
45880
- let result = ic.domain3dCls.c2b_NewSplitChain(currAtoms);
45881
- let subdomains = result.subdomains;
45882
- let pos2resi = result.pos2resi;
45883
-
45884
- let domainAtomsArray = [];
45885
- if(subdomains.length <= 1) {
45886
- //domainAtomsArray.push(ic.chains[chainid]);
45887
- domainAtomsArray.push(currAtoms);
45888
-
45889
- let residueArray = ic.resid2specCls.atoms2residues(Object.keys(currAtoms));
45890
-
45891
- let atomFirst = ic.firstAtomObjCls.getFirstAtomObj(currAtoms);
45892
- let atomLast = ic.firstAtomObjCls.getLastAtomObj(currAtoms);
45893
- let resiSum = atomFirst.resi + ':' + atomLast.resi;
45894
-
45895
- for(let n = 0, nl = residueArray.length; n < nl; ++n) {
45896
- let resid = residueArray[n];
45897
- ic.resid2domainid[resid] = chainid + '-0' + '_' + resiSum;
45898
-
45899
- // clear previous refnum assignment if any
45900
- if(ic.resid2refnum && ic.resid2refnum[resid]) {
45901
- delete ic.resid2refnum[resid];
45902
- }
45903
- }
45904
- }
45905
- else {
45906
- for(let k = 0, kl = subdomains.length; k < kl; ++k) {
45907
- let domainAtoms = {};
45908
- let segArray = subdomains[k];
45909
-
45910
- for(let m = 0, ml = segArray.length; m < ml; m += 2) {
45911
- let startResi = segArray[m];
45912
- let endResi = segArray[m+1];
45913
- for(let n = parseInt(startResi); n <= parseInt(endResi); ++n) {
45914
- let resid = chainid + '_' + pos2resi[n];
45915
- domainAtoms = me.hashUtilsCls.unionHash(domainAtoms, ic.residues[resid]);
45916
- //ic.resid2domainid[resid] = chainid + '-' + k;
45917
-
45918
- // clear previous refnum assignment if any
45919
- if(ic.resid2refnum && ic.resid2refnum[resid]) {
45920
- delete ic.resid2refnum[resid];
45921
- }
45922
- }
45923
- }
45924
-
45925
- domainAtomsArray.push(domainAtoms);
45926
-
45927
- let atomFirst = ic.firstAtomObjCls.getFirstAtomObj(domainAtoms);
45928
- let atomLast = ic.firstAtomObjCls.getLastAtomObj(domainAtoms);
45929
- let resiSum = atomFirst.resi + ':' + atomLast.resi;
45930
-
45931
- for(let m = 0, ml = segArray.length; m < ml; m += 2) {
45932
- let startResi = segArray[m];
45933
- let endResi = segArray[m+1];
45934
- for(let n = parseInt(startResi); n <= parseInt(endResi); ++n) {
45935
- let resid = chainid + '_' + pos2resi[n];
45936
- //domainAtoms = me.hashUtilsCls.unionHash(domainAtoms, ic.residues[resid]);
45937
- ic.resid2domainid[resid] = chainid + '-' + k + '_' + resiSum;
45938
- }
45939
- }
45940
- }
45941
- }
45942
-
45909
+ let domainAtomsArray = this.getDomainAtomsArray(chainid);
45910
+
45943
45911
  if(!ic.domainid2refpdbname) ic.domainid2refpdbname = {};
45944
45912
  if(!ic.domainid2score) ic.domainid2score = {};
45945
45913
 
@@ -46003,7 +45971,7 @@ class LineGraph {
46003
45971
  // start round2
46004
45972
  let ajaxArray = [];
46005
45973
  let domainidpairArray3 = [];
46006
- let urltmalign = me.htmlCls.baseUrl + "tmalign/tmalign.cgi";
45974
+ let urltmalign = me.htmlCls.tmalignUrl;
46007
45975
 
46008
45976
  let urlpdb = me.htmlCls.baseUrl + "mmcifparser/mmcifparser.cgi?refpdbid=" + template;
46009
45977
  let pdbAjax = me.getAjaxPromise(urlpdb, 'text');
@@ -46060,6 +46028,86 @@ class LineGraph {
46060
46028
  */
46061
46029
  }
46062
46030
 
46031
+ getDomainAtomsArray(chainid) { let ic = this.icn3d, me = ic.icn3dui;
46032
+ let domainAtomsArray = [];
46033
+
46034
+ let minResidues = 20;
46035
+
46036
+ if(!ic.proteins.hasOwnProperty(ic.firstAtomObjCls.getFirstAtomObj(ic.chains[chainid]).serial)
46037
+ && !ic.proteins.hasOwnProperty(ic.firstAtomObjCls.getMiddleAtomObj(ic.chains[chainid]).serial)) return domainAtomsArray;
46038
+ if(ic.chainsSeq[chainid].length < minResidues) return domainAtomsArray; // peptide
46039
+
46040
+ let currAtoms = me.hashUtilsCls.intHash(ic.chains[chainid], ic.hAtoms);
46041
+ if(Object.keys(currAtoms).length == 0) return domainAtomsArray;
46042
+
46043
+ // align each 3D domain with reference structure
46044
+ //let result = ic.domain3dCls.c2b_NewSplitChain(ic.chains[chainid]);
46045
+ // assign ref numbers to selected residues
46046
+ let result = ic.domain3dCls.c2b_NewSplitChain(currAtoms);
46047
+ let subdomains = result.subdomains;
46048
+ let pos2resi = result.pos2resi;
46049
+
46050
+ if(subdomains.length <= 1) {
46051
+ //domainAtomsArray.push(ic.chains[chainid]);
46052
+ domainAtomsArray.push(currAtoms);
46053
+
46054
+ let residueArray = ic.resid2specCls.atoms2residues(Object.keys(currAtoms));
46055
+
46056
+ let atomFirst = ic.firstAtomObjCls.getFirstAtomObj(currAtoms);
46057
+ let atomLast = ic.firstAtomObjCls.getLastAtomObj(currAtoms);
46058
+ let resiSum = atomFirst.resi + ':' + atomLast.resi;
46059
+
46060
+ for(let n = 0, nl = residueArray.length; n < nl; ++n) {
46061
+ let resid = residueArray[n];
46062
+ ic.resid2domainid[resid] = chainid + '-0' + '_' + resiSum;
46063
+
46064
+ // clear previous refnum assignment if any
46065
+ if(ic.resid2refnum && ic.resid2refnum[resid]) {
46066
+ delete ic.resid2refnum[resid];
46067
+ }
46068
+ }
46069
+ }
46070
+ else {
46071
+ for(let k = 0, kl = subdomains.length; k < kl; ++k) {
46072
+ let domainAtoms = {};
46073
+ let segArray = subdomains[k];
46074
+
46075
+ for(let m = 0, ml = segArray.length; m < ml; m += 2) {
46076
+ let startResi = segArray[m];
46077
+ let endResi = segArray[m+1];
46078
+ for(let n = parseInt(startResi); n <= parseInt(endResi); ++n) {
46079
+ let resid = chainid + '_' + pos2resi[n];
46080
+ domainAtoms = me.hashUtilsCls.unionHash(domainAtoms, ic.residues[resid]);
46081
+ //ic.resid2domainid[resid] = chainid + '-' + k;
46082
+
46083
+ // clear previous refnum assignment if any
46084
+ if(ic.resid2refnum && ic.resid2refnum[resid]) {
46085
+ delete ic.resid2refnum[resid];
46086
+ }
46087
+ }
46088
+ }
46089
+
46090
+ domainAtomsArray.push(domainAtoms);
46091
+
46092
+ let atomFirst = ic.firstAtomObjCls.getFirstAtomObj(domainAtoms);
46093
+ let atomLast = ic.firstAtomObjCls.getLastAtomObj(domainAtoms);
46094
+ let resiSum = atomFirst.resi + ':' + atomLast.resi;
46095
+
46096
+ for(let m = 0, ml = segArray.length; m < ml; m += 2) {
46097
+ let startResi = segArray[m];
46098
+ let endResi = segArray[m+1];
46099
+ for(let n = parseInt(startResi); n <= parseInt(endResi); ++n) {
46100
+ let resid = chainid + '_' + pos2resi[n];
46101
+ //domainAtoms = me.hashUtilsCls.unionHash(domainAtoms, ic.residues[resid]);
46102
+ ic.resid2domainid[resid] = chainid + '-' + k + '_' + resiSum;
46103
+ }
46104
+ }
46105
+ }
46106
+ }
46107
+
46108
+ return domainAtomsArray;
46109
+ }
46110
+
46063
46111
  getTemplateList(chainid) { let ic = this.icn3d; ic.icn3dui;
46064
46112
  let domainid2refpdbname = {}, domainid2score = {};
46065
46113
 
@@ -46104,13 +46152,13 @@ class LineGraph {
46104
46152
  return {'refpdbnameList': refpdbnameList, 'scoreList': scoreList, 'seqidList': seqidList, 'nresAlignList': nresAlignList};
46105
46153
  }
46106
46154
 
46107
- async parseAlignData(dataArray, domainidpairArray, bRound1) { let ic = this.icn3d, me = ic.icn3dui;
46108
- let thisClass = this;
46109
-
46155
+ parseAlignData_part1(dataArray, domainidpairArray, bRound1) { let ic = this.icn3d, me = ic.icn3dui;
46156
+ // async parseAlignData(dataArray, domainidpairArray, bRound1) { let ic = this.icn3d, me = ic.icn3dui;
46110
46157
  let tmscoreThreshold = 0.4; // 0.4; //0.5;
46158
+ //let rmsdThreshold = 10;
46111
46159
 
46112
46160
  // find the best alignment for each chain
46113
- let domainid2segs = {}, chainid2segs = {};
46161
+ let domainid2segs = {};
46114
46162
 
46115
46163
  if(!ic.chainid2refpdbname) ic.chainid2refpdbname = {};
46116
46164
  if(!ic.chainid2score) ic.chainid2score = {};
@@ -46195,12 +46243,11 @@ class LineGraph {
46195
46243
  }
46196
46244
 
46197
46245
  if(!bRound1) {
46198
- console.log("domainid: " + domainid);
46246
+ if(!me.bNode) console.log("domainid: " + domainid);
46199
46247
  }
46200
46248
 
46201
46249
  if(!domainid2segs.hasOwnProperty(domainid) || queryData[0].score >= ic.domainid2score[domainid].split('_')[0]) {
46202
46250
  ic.domainid2score[domainid] = queryData[0].score + '_' + queryData[0].frac_identical + '_' + queryData[0].num_res ;
46203
-
46204
46251
  ic.domainid2refpdbname[domainid] = refpdbname;
46205
46252
  domainid2segs[domainid] = queryData[0].segs;
46206
46253
  ic.domainid2ig2kabat[domainid] = queryData[0].ig2kabat;
@@ -46208,13 +46255,19 @@ class LineGraph {
46208
46255
  }
46209
46256
  }
46210
46257
 
46258
+ return domainid2segs;
46259
+ }
46260
+
46261
+ async parseAlignData(dataArray, domainidpairArray, bRound1) { let ic = this.icn3d, me = ic.icn3dui;
46262
+ let domainid2segs = this.parseAlignData_part1(dataArray, domainidpairArray, bRound1);
46263
+
46211
46264
  if(bRound1) {
46212
46265
  if(!me.bNode) console.log("Start round 2 alignment with the reference culsters " + JSON.stringify(ic.domainid2refpdbname));
46213
46266
 
46214
46267
  // start round2
46215
46268
  let ajaxArray = [];
46216
46269
  let domainidpairArray3 = [];
46217
- let urltmalign = me.htmlCls.baseUrl + "tmalign/tmalign.cgi";
46270
+ let urltmalign = me.htmlCls.tmalignUrl;
46218
46271
  for(let domainid in ic.domainid2refpdbname) {
46219
46272
  let pdbAjaxArray = [];
46220
46273
  let refpdbname = ic.domainid2refpdbname[domainid];
@@ -46270,12 +46323,18 @@ class LineGraph {
46270
46323
 
46271
46324
  dataArray3 = await this.promiseWithFixedJobs(ajaxArray);
46272
46325
 
46273
- await thisClass.parseAlignData(dataArray3, domainidpairArray3, false);
46326
+ await this.parseAlignData(dataArray3, domainidpairArray3, false);
46274
46327
 
46275
46328
  // end of round 2
46276
46329
  return;
46277
46330
  }
46278
46331
 
46332
+ await this.parseAlignData_part3(domainid2segs);
46333
+ }
46334
+
46335
+ async parseAlignData_part3(domainid2segs) { let ic = this.icn3d, me = ic.icn3dui;
46336
+ let chainid2segs = {};
46337
+
46279
46338
  // combine domainid into chainid
46280
46339
  let processedChainid = {};
46281
46340
 
@@ -46330,7 +46389,7 @@ class LineGraph {
46330
46389
  let message = "The reference PDB(s) for chain " + chainid + " is(are) " + refpdbnameList + ". The TM-score(s) is(are) " + scoreList + ". The sequence identitie(s) is(are) " + seqidList + ". The number of aligned residue(s) is(are) " + nresAlignList + ".";
46331
46390
  if(!me.bNode) {
46332
46391
  console.log(message);
46333
- me.htmlCls.clickMenuCls.setLogCmd(message, true);
46392
+ me.htmlCls.clickMenuCls.setLogCmd(message, false, true);
46334
46393
  }
46335
46394
  ic.refPdbList.push(message);
46336
46395
 
@@ -46354,7 +46413,7 @@ class LineGraph {
46354
46413
  //let refnum = qStart + postfix;
46355
46414
  let refnum = qStart;
46356
46415
 
46357
- let refnumLabel = thisClass.getLabelFromRefnum(refnum, prevStrand, bCd19);
46416
+ let refnumLabel = this.getLabelFromRefnum(refnum, prevStrand, bCd19);
46358
46417
  prevStrand = (refnumLabel) ? refnumLabel.replace(new RegExp(refnum,'g'), '') : undefined;
46359
46418
 
46360
46419
  ic.resid2refnum[resid] = refnumLabel;
@@ -46519,7 +46578,7 @@ class LineGraph {
46519
46578
  return (!refnumLabel) ? refnumLabel : refnumLabel.replace(/'/g, '').replace(/\*/g, '').replace(/\^/g, '').replace(/\+/g, '').replace(/\-/g, '').substr(1); // C', C''
46520
46579
  }
46521
46580
 
46522
- exportRefnum(type) { let ic = this.icn3d, me = ic.icn3dui;
46581
+ exportRefnum(type, bCalcRef) { let ic = this.icn3d, me = ic.icn3dui;
46523
46582
  let refData = '';
46524
46583
 
46525
46584
  // 1. show IgStrand ref numbers
@@ -46563,19 +46622,32 @@ class LineGraph {
46563
46622
  }
46564
46623
  }
46565
46624
 
46566
- refData += '{"ref PDB" : ' + JSON.stringify(ic.refPdbList) + ",\n";
46625
+ let bIgDomain = (ic.refPdbList.length > 0) ? 1 : 0;
46626
+
46627
+ refData += '{"Ig domain" : ' + bIgDomain + ', "ref PDB" : ' + JSON.stringify(ic.refPdbList) + ",\n";
46567
46628
 
46568
- refData += '"data": {\n';
46569
- for(let chnid in ic.chains) {
46570
- let atom = ic.firstAtomObjCls.getFirstAtomObj(ic.chains[chnid]);
46571
- if(ic.proteins.hasOwnProperty(atom.serial)) {
46572
- for(let i = 0; i < ic.chainsSeq[chnid].length; ++i) {
46573
- const resid = chnid + '_' + ic.chainsSeq[chnid][i].resi + '_' + ic.chainsSeq[chnid][i].name;
46574
- refData += '"' + resid + '": "' + resid2refnum[resid] + '",\n';
46629
+ if(bIgDomain) {
46630
+ refData += '"data": {\n';
46631
+ for(let chnid in ic.chains) {
46632
+ let atom = ic.firstAtomObjCls.getFirstAtomObj(ic.chains[chnid]);
46633
+ if(ic.proteins.hasOwnProperty(atom.serial)) {
46634
+ let bIgChain = false;
46635
+ let chainRefData = '"' + chnid + '": [\n';
46636
+ for(let i = 0; i < ic.chainsSeq[chnid].length; ++i) {
46637
+ const resid = chnid + '_' + ic.chainsSeq[chnid][i].resi + '_' + ic.chainsSeq[chnid][i].name;
46638
+ chainRefData += '{"' + resid + '": "' + resid2refnum[resid] + '"},\n';
46639
+ if(resid2refnum[resid]) bIgChain = true;
46640
+ }
46641
+ chainRefData += '],\n';
46642
+
46643
+ if(bIgChain) {
46644
+ refData += chainRefData;
46645
+ }
46646
+ }
46575
46647
  }
46648
+ refData += '}\n';
46576
46649
  }
46577
- }
46578
- refData += '}\n';
46650
+
46579
46651
  refData += '}\n';
46580
46652
  }
46581
46653
  // 2. show Kabat ref numbers
@@ -51845,7 +51917,6 @@ class MmcifParser {
51845
51917
 
51846
51918
  async downloadMmcifSymmetry(mmcifid, type) { let ic = this.icn3d, me = ic.icn3dui;
51847
51919
  // https://files.rcsb.org/header/ is not accessible in Node.js and Mac
51848
- //let url = (me.bNode) ? "https://files.rcsb.org/view/" + mmcifid + ".cif" : "https://files.rcsb.org/header/" + mmcifid + ".cif";
51849
51920
  let url = (me.bNode || me.utilsCls.isMac()) ? "https://files.rcsb.org/view/" + mmcifid + ".cif" : "https://files.rcsb.org/header/" + mmcifid + ".cif";
51850
51921
 
51851
51922
  //ic.bCid = undefined;
@@ -51853,6 +51924,7 @@ class MmcifParser {
51853
51924
 
51854
51925
  url = me.htmlCls.baseUrl + "mmcifparser/mmcifparser.cgi";
51855
51926
  let dataObj = {'mmcifheader': data1};
51927
+
51856
51928
  let data = await me.getAjaxPostPromise(url, dataObj, false, "The mmCIF data of " + mmcifid + " can not be parsed...");
51857
51929
 
51858
51930
  if(data.emd !== undefined) ic.emd = data.emd;
@@ -53769,7 +53841,7 @@ class RealignParser {
53769
53841
  realign() { let ic = this.icn3d, me = ic.icn3dui;
53770
53842
  ic.selectionCls.saveSelectionPrep();
53771
53843
 
53772
- let index = Object.keys(ic.defNames2Atoms).length;
53844
+ let index = Object.keys(ic.defNames2Atoms).length + Object.keys(ic.defNames2Residues).length + 1;
53773
53845
  let name = 'alseq_' + index;
53774
53846
 
53775
53847
  ic.selectionCls.saveSelection(name, name);
@@ -60871,6 +60943,12 @@ class ApplyCommand {
60871
60943
 
60872
60944
  ic.addTrackCls.defineSecondary(chainid, 'coil');
60873
60945
  }
60946
+ else if(commandOri.indexOf('define iganchor sets') == 0) {
60947
+ let chainStr = commandOri.split(' | ')[1];
60948
+ let chainid = chainStr.split(' ')[1];
60949
+
60950
+ ic.addTrackCls.defineIgstrand(chainid, 'iganchor');
60951
+ }
60874
60952
  else if(commandOri.indexOf('define igstrand sets') == 0) {
60875
60953
  let chainStr = commandOri.split(' | ')[1];
60876
60954
  let chainid = chainStr.split(' ')[1];
@@ -64576,28 +64654,46 @@ class Selection {
64576
64654
  ic.annotationCls.showAnnoSelectedChains();
64577
64655
  }
64578
64656
 
64579
- saveSelection(name, description) { let ic = this.icn3d, me = ic.icn3dui;
64580
- ic.selectedResidues = {};
64657
+ saveSelection(name, description, bDragSeq) { let ic = this.icn3d, me = ic.icn3dui;
64658
+ if(!bDragSeq) {
64659
+ ic.selectedResidues = {};
64581
64660
 
64582
- ic.selectedResidues = ic.firstAtomObjCls.getResiduesFromCalphaAtoms(ic.hAtoms);
64661
+ ic.selectedResidues = ic.firstAtomObjCls.getResiduesFromCalphaAtoms(ic.hAtoms);
64662
+ }
64663
+
64664
+ if(!name) {
64665
+ let index = Object.keys(ic.defNames2Atoms).length + Object.keys(ic.defNames2Residues).length + 1;
64666
+ name = 'seq_' + index;
64667
+ description = name;
64668
+ }
64583
64669
 
64584
64670
  if(Object.keys(ic.selectedResidues).length > 0) {
64585
64671
  if(ic.pk == 1) {
64586
64672
  let bAtom = true;
64587
- this.selectResidueList(ic.hAtoms, name, description,undefined, undefined, bAtom);
64673
+ this.selectResidueList(ic.hAtoms, name, description, undefined, undefined, bAtom);
64588
64674
  //ic.hlUpdateCls.updateHlAll();
64589
64675
 
64590
64676
  this.updateSelectionNameDesc();
64591
64677
 
64592
- me.htmlCls.clickMenuCls.setLogCmd('select ' + ic.resid2specCls.atoms2spec(ic.hAtoms) + ' | name ' + name, true);
64678
+ if(!bDragSeq) {
64679
+ me.htmlCls.clickMenuCls.setLogCmd('select ' + ic.resid2specCls.atoms2spec(ic.hAtoms) + ' | name ' + name, true);
64680
+ }
64681
+ else { // no names for temp selections
64682
+ me.htmlCls.clickMenuCls.setLogCmd('select ' + ic.resid2specCls.atoms2spec(ic.hAtoms), true);
64683
+ }
64593
64684
  }
64594
64685
  else {
64595
- this.selectResidueList(ic.selectedResidues, name, description);
64686
+ this.selectResidueList(ic.selectedResidues, name, description, undefined, undefined, undefined);
64596
64687
  //ic.hlUpdateCls.updateHlAll();
64597
64688
 
64598
64689
  this.updateSelectionNameDesc();
64599
64690
 
64600
- me.htmlCls.clickMenuCls.setLogCmd('select ' + ic.resid2specCls.residueids2spec(Object.keys(ic.selectedResidues)) + ' | name ' + name, true);
64691
+ if(!bDragSeq) {
64692
+ me.htmlCls.clickMenuCls.setLogCmd('select ' + ic.resid2specCls.residueids2spec(Object.keys(ic.selectedResidues)) + ' | name ' + name, true);
64693
+ }
64694
+ else { // no names for temp selections
64695
+ me.htmlCls.clickMenuCls.setLogCmd('select ' + ic.resid2specCls.residueids2spec(Object.keys(ic.selectedResidues)), true);
64696
+ }
64601
64697
  }
64602
64698
  }
64603
64699
  }
@@ -64735,7 +64831,7 @@ class Selection {
64735
64831
  }
64736
64832
  }
64737
64833
 
64738
- saveSelectionPrep() {var ic = this.icn3d, me = ic.icn3dui;
64834
+ saveSelectionPrep(bDragSeq) {var ic = this.icn3d, me = ic.icn3dui;
64739
64835
  if(!me.cfg.notebook) {
64740
64836
  if(!$('#' + ic.pre + 'dl_definedsets').hasClass('ui-dialog-content') || !$('#' + ic.pre + 'dl_definedsets').dialog( 'isOpen' )) {
64741
64837
  me.htmlCls.dialogCls.openDlg('dl_definedsets', 'Select sets');
@@ -64746,8 +64842,11 @@ class Selection {
64746
64842
  $('#' + ic.pre + 'dl_definedsets').show();
64747
64843
  $("#" + ic.pre + "atomsCustom").resizable();
64748
64844
  }
64749
- ic.bSelectResidue = false;
64750
- ic.bSelectAlignResidue = false;
64845
+
64846
+ if(!bDragSeq) {
64847
+ ic.bSelectResidue = false;
64848
+ ic.bSelectAlignResidue = false;
64849
+ }
64751
64850
  }
64752
64851
  selectOneResid(idStr, bUnchecked) {var ic = this.icn3d; ic.icn3dui;
64753
64852
  //var idStr = idArray[i]; // TYR $1KQ2.B:56@OH, $1KQ2.B:40 ASP
@@ -71384,11 +71483,17 @@ class ShareLink {
71384
71483
  //statefile += ic.commands[i] + "\n";
71385
71484
 
71386
71485
  // only output the most recent 'select saved atoms...' without " | name ..."
71387
- if(((prevCommandStr.indexOf('select saved atoms') !== -1 || prevCommandStr.indexOf('select sets') !== -1)
71388
- &&(commandStr.indexOf('select') === 0 || commandStr.indexOf('select') === 0)
71389
- && prevCommandStr.indexOf(' name ') === -1)
71390
- ||(prevCommandStr.indexOf('pickatom') !== -1 && commandStr.indexOf('pickatom') !== -1)
71391
- ) ;
71486
+ // or those select without names
71487
+ // if(((prevCommandStr.indexOf('select saved atoms') !== -1 || prevCommandStr.indexOf('select sets') !== -1)
71488
+ // &&(commandStr.indexOf('select') === 0 || commandStr.indexOf('select') === 0)
71489
+ // && prevCommandStr.indexOf(' name ') === -1)
71490
+ // ||(prevCommandStr.indexOf('pickatom') !== -1 && commandStr.indexOf('pickatom') !== -1)
71491
+ // ) {
71492
+
71493
+ if(prevCommandStr.indexOf('select') == 0 && prevCommandStr.indexOf('select prop') === -1
71494
+ && commandStr.indexOf('select') === 0 && commandStr.indexOf('select prop') === -1
71495
+ && prevCommandStr.indexOf(' name ') === -1) ;
71496
+ else if(prevCommandStr.indexOf('pickatom') !== -1 && commandStr.indexOf('pickatom') !== -1) ;
71392
71497
  // remove all "show selection" except the last one
71393
71498
  else if(prevCommandStr == 'show selection' && ic.commands.slice(i).toString().indexOf('show selection') != -1) ;
71394
71499
  else if(prevCommandStr.indexOf(toggleStr) !== -1) {
@@ -74311,7 +74416,7 @@ class iCn3DUI {
74311
74416
  //even when multiple iCn3D viewers are shown together.
74312
74417
  this.pre = this.cfg.divid + "_";
74313
74418
 
74314
- this.REVISION = '3.29.1';
74419
+ this.REVISION = '3.29.2';
74315
74420
 
74316
74421
  // In nodejs, iCn3D defines "window = {navigator: {}}"
74317
74422
  this.bNode = (Object.keys(window).length < 2) ? true : false;
@@ -74930,10 +75035,13 @@ iCn3DUI.prototype.getAjaxPostPromise = async function(url, data, beforeSend, ale
74930
75035
  resolve(data);
74931
75036
  },
74932
75037
  error : function() {
74933
- if(alertMess) var aaa = 1; //alert(alertMess);
75038
+ //if(alertMess) var aaa = 1; //alert(alertMess);
75039
+ if(alertMess) console.log(alertMess);
74934
75040
  if(logMess) console.log(logMess);
74935
75041
 
74936
- reject('error');
75042
+ // reject('error');
75043
+ // keep running the program
75044
+ resolve('error');
74937
75045
  }
74938
75046
  });
74939
75047
  });