icn3d 3.28.10 → 3.28.11

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.module.js CHANGED
@@ -7370,7 +7370,7 @@ class ClickMenu {
7370
7370
  ic.resid2specCls.selectProperty('polar');
7371
7371
  });
7372
7372
  me.myEventCls.onIds("#" + me.pre + "mn2_propBfactor", "click", function(e) { me.icn3d; //e.preventDefault();
7373
- me.htmlCls.dialogCls.openDlg('dl_propbybfactor', 'Select residue based on B-factor');
7373
+ me.htmlCls.dialogCls.openDlg('dl_propbybfactor', 'Select residue based on B-factor/pLDDT');
7374
7374
  });
7375
7375
  me.myEventCls.onIds("#" + me.pre + "mn2_propSolAcc", "click", function(e) { me.icn3d; //e.preventDefault();
7376
7376
  me.htmlCls.dialogCls.openDlg('dl_propbypercentout', 'Select residue based on the percentage of solvent accessilbe surface area');
@@ -8497,7 +8497,8 @@ class ClickMenu {
8497
8497
  // alert("The url is more than 4000 characters and may not work.");
8498
8498
  //}
8499
8499
  //else {
8500
- url = url.replace("full.html", "full2.html");
8500
+ url = url.replace("icn3d/full.html?", "icn3d/full2.html?");
8501
+ url = url.replace("icn3d/?", "icn3d/full2.html?");
8501
8502
  url += '&closepopup=1';
8502
8503
  let urlTarget = (ic.structures && Object.keys(ic.structures).length > 0) ? '_blank' : '_self';
8503
8504
  window.open(url, urlTarget);
@@ -8826,6 +8827,14 @@ class ClickMenu {
8826
8827
  let pos = str.indexOf('|||');
8827
8828
  if(pos !== -1) str = str.substr(0, pos);
8828
8829
  let transformation = {};
8830
+
8831
+ if(!ic.quaternion) {
8832
+ // reset parameters
8833
+ ic._zoomFactor = 1.0;
8834
+ ic.mouseChange = new THREE.Vector2(0,0);
8835
+ ic.quaternion = new THREE.Quaternion(0,0,0,1);
8836
+ }
8837
+
8829
8838
  transformation.factor = ic._zoomFactor;
8830
8839
  transformation.mouseChange = ic.mouseChange;
8831
8840
  transformation.quaternion = {};
@@ -9541,7 +9550,9 @@ class SetMenu {
9541
9550
 
9542
9551
  html += this.getLink('mn1_exportPdbRes', 'PDB', 1, 2);
9543
9552
  html += this.getLink('profixpdb', 'PDB with Missing Atoms', undefined, 2);
9544
- html += this.getLink('profixpdbh', 'PDB with Hydrogens', undefined, 2);
9553
+
9554
+ // the quality is not good to add hydrogen
9555
+ //html += this.getLink('profixpdbh', 'PDB with Hydrogens', undefined, 2);
9545
9556
 
9546
9557
  if(me.cfg.cid === undefined) {
9547
9558
  html += this.getLink('mn1_exportSecondary', 'Secondary Structure', undefined, 2);
@@ -10392,7 +10403,7 @@ class SetMenu {
10392
10403
 
10393
10404
  //if(me.cfg.afid) html += this.getRadio('mn4_clr', 'mn4_clrConfidence', 'AF Confidence');
10394
10405
  //if(!me.cfg.mmtfid && !me.cfg.pdbid && !me.cfg.opmid && !me.cfg.mmdbid && !me.cfg.gi && !me.cfg.uniprotid && !me.cfg.blast_rep_id && !me.cfg.cid && !me.cfg.mmcifid && !me.cfg.align && !me.cfg.chainalign) {
10395
- html += this.getRadio('mn4_clr', 'mn4_clrConfidence', 'AlphaFold<br><span style="padding-left:1.5em;">Confidence</span>', undefined, 1, 1);
10406
+ html += this.getRadio('mn4_clr', 'mn4_clrConfidence', 'pLDDT', undefined, 1, 1);
10396
10407
  //}
10397
10408
 
10398
10409
  //!!!
@@ -12713,10 +12724,10 @@ class SetDialog {
12713
12724
  html += "</div>";
12714
12725
 
12715
12726
  html += me.htmlCls.divStr + "dl_propbybfactor' class='" + dialogClass + "'>";
12716
- html += this.addNotebookTitle('dl_propbybfactor', 'Select residues basen on B-factor');
12717
- html += "<div style='width:400px'>Select residue based on B-factor. The values are in the range of 0-100.</div><br>";
12718
- html += "<b>Min B-factor</b>: " + me.htmlCls.inputTextStr + "id='" + me.pre + "minbfactor' value='0' size='10'>% <br>";
12719
- html += "<b>Max B-factor</b>: " + me.htmlCls.inputTextStr + "id='" + me.pre + "maxbfactor' value='100' size='10'>% <br>";
12727
+ html += this.addNotebookTitle('dl_propbybfactor', 'Select residues basen on B-factor/pLDDT');
12728
+ html += "<div style='width:400px'>Select residue based on B-factor/pLDDT. The values are in the range of 0-100.</div><br>";
12729
+ html += "<b>Min B-factor/pLDDT</b>: " + me.htmlCls.inputTextStr + "id='" + me.pre + "minbfactor' value='0' size='10'>% <br>";
12730
+ html += "<b>Max B-factor/pLDDT</b>: " + me.htmlCls.inputTextStr + "id='" + me.pre + "maxbfactor' value='100' size='10'>% <br>";
12720
12731
  html += "<button style='white-space:nowrap;' id='" + me.pre + "applypropbybfactor'>Apply</button><br/><br/>";
12721
12732
  html += "</div>";
12722
12733
 
@@ -16357,10 +16368,11 @@ class SetHtml {
16357
16368
 
16358
16369
  let pdbstr = '';
16359
16370
 
16360
- pdbstr += ic.saveFileCls.getAtomPDB(atomHash);
16371
+ let bMergeIntoOne = true;
16372
+ pdbstr += ic.saveFileCls.getAtomPDB(atomHash, undefined, undefined, undefined, undefined, undefined, bMergeIntoOne);
16361
16373
  pdbstr += ic.saveFileCls.getAtomPDB(ionHash, true, undefined, true);
16362
16374
 
16363
- let url = "https://www.ncbi.nlm.nih.gov/Structure/delphi/delphi.fcgi";
16375
+ let url = me.htmlCls.baseUrl + "delphi/delphi.cgi";
16364
16376
 
16365
16377
  let pdbid =(me.cfg.cid) ? me.cfg.cid : Object.keys(ic.structures).toString();
16366
16378
 
@@ -33401,7 +33413,7 @@ class Alternate {
33401
33413
  // change the display atom when alternating
33402
33414
  //Show structures one by one.
33403
33415
  alternateStructures() { let ic = this.icn3d, me = ic.icn3dui;
33404
- ic.bAlernate = true;
33416
+ ic.bAlternate = true;
33405
33417
 
33406
33418
  //ic.transformCls.zoominSelection();
33407
33419
 
@@ -33498,14 +33510,14 @@ class Alternate {
33498
33510
  ic.applyMapCls.removeEmmaps();
33499
33511
  ic.applyMapCls.applyEmmapOptions();
33500
33512
 
33501
- // disallow the alternation of DelPhi map
33513
+ // allow the alternation of DelPhi map
33502
33514
  ic.applyMapCls.removePhimaps();
33503
- // ic.applyMapCls.applyPhimapOptions();
33515
+ ic.applyMapCls.applyPhimapOptions();
33504
33516
  // should recalculate the potential
33505
33517
  //ic.loadDelphiFileBase('delphi');
33506
33518
 
33507
- // ic.applyMapCls.removeSurfaces();
33508
- // ic.applyMapCls.applyphisurfaceOptions();
33519
+ ic.applyMapCls.removeSurfaces();
33520
+ ic.applyMapCls.applyphisurfaceOptions();
33509
33521
  // should recalculate the potential
33510
33522
  //ic.loadDelphiFileBase('delphi2');
33511
33523
 
@@ -36635,7 +36647,7 @@ class SetOption {
36635
36647
 
36636
36648
  let colorLabel = colorType.substr(0, 1).toUpperCase() + colorType.substr(1);
36637
36649
  if(colorType == 'confidence') {
36638
- colorLabel = 'AlphaFold Confidence (pLDDT)';
36650
+ colorLabel = 'pLDDT';
36639
36651
  }
36640
36652
  else if(colorType == 'normalized hydrophobic') {
36641
36653
  colorLabel = 'Normalized Hydrophobicity';
@@ -36930,7 +36942,7 @@ class SetOption {
36930
36942
  "C' Strand": "6495ED",
36931
36943
  "C'' Strand": "006400",
36932
36944
  "D Strand": "00FF00",
36933
- "E Strand": "FFFF00", //"F0E68C",
36945
+ "E Strand": "F7DC6F", //"FFFF00", //"F0E68C",
36934
36946
  "F Strand": "FFA500",
36935
36947
  "G Strand": "FF0000",
36936
36948
  //"G+ Strand": "8B0000",
@@ -36958,14 +36970,14 @@ class SetOption {
36958
36970
  "<b>Protodomain 1</b>": "",
36959
36971
  "A Strand": "0000FF",
36960
36972
  "B Strand": "006400",
36961
- "C Strand": "FFFF00", //"F0E68C",
36973
+ "C Strand": "F7DC6F", //"FFFF00", //"F0E68C",
36962
36974
  "C' Strand": "FFA500",
36963
36975
  "<br><b>Linker</b>": "",
36964
36976
  "C'' Strand": "FF0000",
36965
36977
  "<br><b>Protodomain 2</b>": "",
36966
36978
  "D Strand": "0000FF",
36967
36979
  "E Strand": "006400",
36968
- "F Strand": "FFFF00", //"F0E68C",
36980
+ "F Strand": "F7DC6F", //"FFFF00", //"F0E68C",
36969
36981
  "G Strand": "FFA500",
36970
36982
  "": "",
36971
36983
  "Loop": "CCCCCC"
@@ -43125,7 +43137,7 @@ class ShowAnno {
43125
43137
  let proteinName = fullProteinName;
43126
43138
  //if(proteinName.length > 40) proteinName = proteinName.substr(0, 40) + "...";
43127
43139
  let categoryStr =(index == 0) ? "<span class='icn3d-annoLargeTitle'><b>Proteins</b>: </span><br><br>" : "";
43128
- let geneLink =(ic.chainsGene[chnid] && ic.chainsGene[chnid].geneId) ? "(Gene: <a href='https://www.ncbi.nlm.nih.gov/gene/" + ic.chainsGene[chnid].geneId + "?report=gene_table' target='_blank' title='" + ic.chainsGene[chnid].geneDesc + "'>" + ic.chainsGene[chnid].geneSymbol + "</a>)" : '';
43140
+ let geneLink =(ic.chainsGene[chnid] && ic.chainsGene[chnid].geneId && ic.chainsGene[chnid].geneDesc) ? "(Gene: <a href='https://www.ncbi.nlm.nih.gov/gene/" + ic.chainsGene[chnid].geneId + "?report=gene_table' target='_blank' title='" + ic.chainsGene[chnid].geneDesc + "'>" + ic.chainsGene[chnid].geneSymbol + "</a>)" : '';
43129
43141
  let structure = chnid.substr(0, chnid.indexOf('_'));
43130
43142
  let chainLink = (structure.length > 5) ? '<a href="https://alphafold.ebi.ac.uk/entry/' + structure + '" target="_blank">' + chnid + '</a>' : chnid;
43131
43143
  let chainHtml = "<div id='" + ic.pre + "anno_" + chnid + "' class='icn3d-annotation'>" + categoryStr
@@ -43802,7 +43814,7 @@ class ShowSeq {
43802
43814
  html += '<span>-</span>'; //'<span>-</span>';
43803
43815
  }
43804
43816
  }
43805
-
43817
+
43806
43818
  if(ic.seqStartLen && ic.seqStartLen[chnid]) html += this.insertMulGap(ic.seqEndLen[chnid], '-');
43807
43819
 
43808
43820
  html += '<span class="icn3d-residueNum"></span>';
@@ -44021,7 +44033,7 @@ class ShowSeq {
44021
44033
  html += '</div>';
44022
44034
  html2 += '</div>';
44023
44035
  html3 += '</div>';
44024
-
44036
+
44025
44037
  //if(Object.keys(ic.chains[chnid]).length > 10) {
44026
44038
  if(ic.giSeq[chnid].length > 10) {
44027
44039
  let atom = ic.firstAtomObjCls.getFirstCalphaAtomObj(ic.chains[chnid]);
@@ -44070,8 +44082,9 @@ class ShowSeq {
44070
44082
  html3 += '</div></div>';
44071
44083
  }
44072
44084
 
44073
- if(ic.bShowRefnum && ic.chainid2refpdbname.hasOwnProperty(chnid) && ic.chainid2refpdbname[chnid].length > 0) {
44085
+ if(ic.bShowRefnum && ic.chainid2refpdbname.hasOwnProperty(chnid) && ic.chainid2refpdbname[chnid].length > 0) {
44074
44086
  let result = this.showAllRefNum(giSeq, chnid);
44087
+
44075
44088
  html += result.html;
44076
44089
  html3 += result.html3;
44077
44090
  }
@@ -44083,7 +44096,7 @@ class ShowSeq {
44083
44096
  html3 += result.html3;
44084
44097
  }
44085
44098
  }
44086
-
44099
+
44087
44100
  // highlight reference numbers
44088
44101
  if(ic.bShowRefnum) {
44089
44102
  // comment out so that this process didn't change the selection
@@ -44092,7 +44105,7 @@ class ShowSeq {
44092
44105
  // commented out because it produced too many commands
44093
44106
  // let name = 'refnum_anchors';
44094
44107
  // ic.selectionCls.saveSelection(name, name);
44095
-
44108
+
44096
44109
  ic.hlUpdateCls.updateHlAll();
44097
44110
  }
44098
44111
 
@@ -44123,7 +44136,7 @@ class ShowSeq {
44123
44136
  //ic.setColorCls.setColorByOptions(ic.opts, ic.atoms);
44124
44137
  ic.setColorCls.setColorByOptions(ic.opts, ic.dAtoms);
44125
44138
 
44126
- ic.selectionCls.selectAll_base();
44139
+ //ic.selectionCls.selectAll_base();
44127
44140
  ic.hlUpdateCls.updateHlAll();
44128
44141
  //ic.drawCls.draw();
44129
44142
  ic.drawCls.draw();
@@ -44243,8 +44256,10 @@ class ShowSeq {
44243
44256
 
44244
44257
  postfix = strandPostfix + '_' + index;
44245
44258
 
44259
+ let firstTwo = parseInt(refnum.toString().substr(0, 2)); // A- strand
44260
+
44246
44261
  if(currStrand && currStrand != ' ') {
44247
- if(refnum3c.substr(0,1) != '9') {
44262
+ if(refnum3c.substr(0,1) != '9' || firstTwo == 10) {
44248
44263
  let lastTwo = parseInt(refnum.toString().substr(refnum.toString().length - 2, 2));
44249
44264
 
44250
44265
  if(currStrand != prevStrand) { // reset currCnt
@@ -44271,6 +44286,10 @@ class ShowSeq {
44271
44286
  resCntAtAnchor = 0;
44272
44287
  }
44273
44288
 
44289
+ if(firstTwo == 10) {
44290
+ strandArray[strandCnt].anchorRefnum = 0;
44291
+ }
44292
+
44274
44293
  strandArray[strandCnt].strandPostfix = strandPostfix; // a in A1250a
44275
44294
  strandArray[strandCnt].strand = currStrand; // A in A1250a
44276
44295
 
@@ -44293,6 +44312,10 @@ class ShowSeq {
44293
44312
  resCntAtAnchor = 0;
44294
44313
  }
44295
44314
 
44315
+ if(firstTwo == 10) {
44316
+ strandArray[strandCnt - 1].anchorRefnum = 0;
44317
+ }
44318
+
44296
44319
  strandArray[strandCnt - 1].endResi = currResi;
44297
44320
  strandArray[strandCnt - 1].endRefnum = refnum; // 1250a
44298
44321
  strandArray[strandCnt - 1].resCntAtAnchor = resCntAtAnchor;
@@ -44627,13 +44650,13 @@ class ShowSeq {
44627
44650
 
44628
44651
  let html = '';
44629
44652
 
44630
- if(refnumLabel && lastTwo == 50 && !bLoop) {
44653
+ if(refnumLabel && (lastTwo == 50 || refnum == 1094) && !bLoop) {
44631
44654
  // highlight the anchor residues
44632
44655
  ic.hAtomsRefnum = me.hashUtilsCls.unionHash(ic.hAtomsRefnum, ic.residues[residueid]);
44633
44656
 
44634
44657
  html += '<span ' + colorStr + ' title="' + refnumLabel + '"><b>' + refnumLabel.substr(0, 1) + '</b>' + refnumLabel.substr(1) + '</span>';
44635
44658
  }
44636
- else if(refnumLabel && lastTwo % 2 == 0 && lastTwo != 52 && !bHidelabel) { // don't show label for the first, middle, and last loop residues
44659
+ else if(refnumLabel && lastTwo % 2 == 0 && lastTwo != 52 && refnum != 1096 && !bHidelabel) { // don't show label for the first, middle, and last loop residues
44637
44660
  // e.g., 2152a
44638
44661
  lastTwoStr = isNaN(refnumStr) ? lastTwoStr + refnumStr.substr(refnumStr.length - 1, 1) : lastTwoStr;
44639
44662
  html += '<span ' + colorStr + ' title="' + refnumLabel + '">' + lastTwoStr + '</span>';
@@ -44675,7 +44698,8 @@ class ShowSeq {
44675
44698
  return '#00FF00';
44676
44699
  }
44677
44700
  else if(currStrand == "E") {
44678
- return (bText) ? "#F7DC6F" : "#FFFF00";
44701
+ //return (bText) ? "#F7DC6F" : "#FFFF00";
44702
+ return "#F7DC6F";
44679
44703
  }
44680
44704
  else if(currStrand == "F") {
44681
44705
  return '#FFA500';
@@ -44699,7 +44723,7 @@ class ShowSeq {
44699
44723
  return '#006400';
44700
44724
  }
44701
44725
  else if(currStrand == "C" || currStrand == "F") {
44702
- return "#FFFF00"; //'#F0E68C';
44726
+ return "#F7DC6F"; //"#FFFF00"; //'#F0E68C';
44703
44727
  }
44704
44728
  else if(currStrand == "C'" || (currStrand && currStrand.substr(0, 1) == "G")) {
44705
44729
  return '#FFA500';
@@ -46402,27 +46426,27 @@ class LineGraph {
46402
46426
  let thisClass = this;
46403
46427
 
46404
46428
  // round 1, 16 templates
46405
- 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', '1FAB-HEAVY_5esv_V-n1', '1PDL1_4z18B_human_V-n1', '1BTLA_2aw2A_human_Iset', '1LaminAC_1ifrA_human', '1IsdA_2iteA_bacteria', '1TCRa_6jxrm_human_C1-n2', '1CD19_6al5A_human_C2orV-n1', '1CD28_1yjdC_human_V'];
46429
+ 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'];
46406
46430
 
46407
46431
  // round 2
46408
46432
  ic.refpdbHash = {};
46409
46433
  ic.refpdbHash['1InsulinR_8guyE_human_FN3-n1'] = ['InsulinR_8guyE_human_FN3-n1', 'IL6Rb_1bquB_human_FN3-n3', 'Sidekick2_1wf5A_human_FN3-n7', 'InsulinR_8guyE_human_FN3-n2', 'Contactin1_2ee2A_human_FN3-n9', 'IL6Rb_1bquB_human_FN3-n2'];
46410
46434
  ic.refpdbHash['1Endo-1,4-BetaXylanase10A_1i8aA_bacteria_n4'] = ['Endo-1,4-BetaXylanase10A_1i8aA_bacteria_n4', 'ICOS_6x4gA_human_V'];
46411
- ic.refpdbHash['1CoAtomerGamma1_1r4xA_human'] = ['CoAtomerGamma1_1r4xA_human', 'TP34_2o6cA_bacteria', 'RBPJ_6py8C_human_Unk-n2', 'TP47_1o75A_bacteria'];
46435
+ ic.refpdbHash['1CoAtomerGamma1_1r4xA_human'] = ['CoAtomerGamma1_1r4xA_human', 'TP34_2o6cA_bacteria'];
46412
46436
  ic.refpdbHash['1C3_2qkiD_human_n1'] = ['C3_2qkiD_human_n1', 'BArrestin1_4jqiA_rat_n1', 'RBPJ_6py8C_human_Unk-n1'];
46413
46437
  ic.refpdbHash['1CuZnSuperoxideDismutase_1hl5C_human'] = ['CuZnSuperoxideDismutase_1hl5C_human', 'TEAD1_3kysC_human'];
46414
- ic.refpdbHash['1ASF1A_2iijA_human'] = ['ASF1A_2iijA_human', 'MPT63_1lmiA_bacteria'];
46438
+ ic.refpdbHash['1ASF1A_2iijA_human'] = ['ASF1A_2iijA_human', 'RBPJ_6py8C_human_Unk-n2', 'TP47_1o75A_bacteria'];
46415
46439
  ic.refpdbHash['1FAB-LIGHT_5esv_C1-n2'] = ['FAB-LIGHT_5esv_C1-n2', 'GHR_1axiB_human_FN3-n1', 'VTCN1_Q7Z7D3_human_V-n2', 'B2Microglobulin_7phrL_human_C1', 'FAB-HEAVY_5esv_C1-n2', 'MHCIa_7phrH_human_C1'];
46416
46440
  ic.refpdbHash['1CD2_1hnfA_human_C2-n2'] = ['CD2_1hnfA_human_C2-n2', 'Siglec3_5j0bB_human_C2-n2'];
46417
- ic.refpdbHash['1NaCaExchanger_2fwuA_dog_n2'] = ['NaCaExchanger_2fwuA_dog_n2', 'ORF7a_1xakA_virus', 'ECadherin_4zt1A_human_n2', 'NaKATPaseTransporterBeta_2zxeB_spurdogshark'];
46441
+ ic.refpdbHash['1NaCaExchanger_2fwuA_dog_n2'] = ['NaCaExchanger_2fwuA_dog_n2', 'ORF7a_1xakA_virus', 'ECadherin_4zt1A_human_n2'];
46442
+ ic.refpdbHash['1NaKATPaseTransporterBeta_2zxeB_spurdogshark'] = ['NaKATPaseTransporterBeta_2zxeB_spurdogshark'];
46418
46443
  ic.refpdbHash['1FAB-HEAVY_5esv_V-n1'] = ['FAB-HEAVY_5esv_V-n1', 'FAB-LIGHT_5esv_V-n1', 'VNAR_1t6vN_shark_V', 'TCRa_6jxrm_human_V-n1', 'VISTA_6oilA_human_V', 'CD8a_1cd8A_human_V', 'PD1_4zqkB_human_V'];
46419
46444
  ic.refpdbHash['1PDL1_4z18B_human_V-n1'] = ['PDL1_4z18B_human_V-n1', 'CD2_1hnfA_human_V-n1', 'LAG3_7tzgD_human_V-n1'];
46420
46445
  ic.refpdbHash['1BTLA_2aw2A_human_Iset'] = ['BTLA_2aw2A_human_Iset', 'Palladin_2dm3A_human_Iset-n1', 'Titin_4uowM_human_Unk-n152', 'LAG3_7tzgD_human_C2-n2', 'JAM1_1nbqA_human_VorIset-n2', 'Contactin1_3s97C_human_C2-n2'];
46421
- ic.refpdbHash['1LaminAC_1ifrA_human'] = ['LaminAC_1ifrA_human'];
46422
- ic.refpdbHash['1IsdA_2iteA_bacteria'] = ['IsdA_2iteA_bacteria'];
46423
- ic.refpdbHash['1TCRa_6jxrm_human_C1-n2'] = ['TCRa_6jxrm_human_C1-n2'];
46424
- ic.refpdbHash['1CD19_6al5A_human_C2orV-n1'] = ['CD19_6al5A_human_C2orV-n1'];
46425
- ic.refpdbHash['1CD28_1yjdC_human_V'] = ['CD28_1yjdC_human_V'];
46446
+ ic.refpdbHash['1LaminAC_1ifrA_human'] = ['LaminAC_1ifrA_human', 'CD3d_6jxrd_human_Iset'];
46447
+ ic.refpdbHash['1CD3g_6jxrg_human_Iset'] = ['CD3g_6jxrg_human_Iset', 'TCRa_6jxrm_human_C1-n2', 'IsdA_2iteA_bacteria'];
46448
+ ic.refpdbHash['1CD28_1yjdC_human_V'] = ['CD28_1yjdC_human_V', 'MPT63_1lmiA_bacteria', 'CD3e_6jxrf_human_Iset'];
46449
+ ic.refpdbHash['1CD19_6al5A_human_C2orV-n1'] = ['CD19_6al5A_human_C2orV-n1'];
46426
46450
 
46427
46451
  // use known ref structure
46428
46452
  ic.refpdbHash['5ESV_C'] = ['FAB-HEAVY_5esv_V-n1', 'FAB-HEAVY_5esv_C1-n2'];
@@ -46470,11 +46494,14 @@ class LineGraph {
46470
46494
  ic.refpdbHash['6A15_A'] = ['CD19_6al5A_human_C2orV-n1'];
46471
46495
  ic.refpdbHash['2QKI_D'] = ['C3_2qkiD_human_n1'];
46472
46496
  ic.refpdbHash['1YJD_C'] = ['CD28_1yjdC_human_V'];
46497
+ ic.refpdbHash['6JXR_d'] = ['CD3d_6jxrd_human_Iset'];
46498
+ ic.refpdbHash['6JXR_f'] = ['CD3e_6jxrf_human_Iset'];
46499
+ ic.refpdbHash['6JXR_g'] = ['CD3g_6jxrg_human_Iset'];
46473
46500
 
46474
46501
  let pdbAjaxArray = [];
46475
46502
  for(let k = 0, kl = ic.refpdbArray.length; k < kl; ++k) {
46476
- //let urlpdb = me.htmlCls.baseUrl + "mmcifparser/mmcifparser.cgi?refpdbid=" + ic.refpdbArray[k];
46477
- let urlpdb = me.htmlCls.baseUrl + "mmcifparser/mmcifparser.cgi?refjsonid=" + ic.refpdbArray[k];
46503
+ let urlpdb = me.htmlCls.baseUrl + "mmcifparser/mmcifparser.cgi?refpdbid=" + ic.refpdbArray[k];
46504
+ //let urlpdb = me.htmlCls.baseUrl + "mmcifparser/mmcifparser.cgi?refjsonid=" + ic.refpdbArray[k];
46478
46505
 
46479
46506
  let pdbAjax = me.getAjaxPromise(urlpdb, 'text');
46480
46507
 
@@ -46505,8 +46532,8 @@ class LineGraph {
46505
46532
  let ajaxArray = [];
46506
46533
  let domainidpairArray = [];
46507
46534
 
46508
- me.htmlCls.baseUrl + "tmalign/tmalign.cgi";
46509
- let urlalign = me.htmlCls.baseUrl + "vastdyn/vastdyn.cgi";
46535
+ let urltmalign = me.htmlCls.baseUrl + "tmalign/tmalign.cgi";
46536
+ me.htmlCls.baseUrl + "vastdyn/vastdyn.cgi";
46510
46537
 
46511
46538
  if(!ic.resid2domainid) ic.resid2domainid = {};
46512
46539
  //ic.resid2domainid = {};
@@ -46544,7 +46571,7 @@ class LineGraph {
46544
46571
 
46545
46572
  let atomFirst = ic.firstAtomObjCls.getFirstAtomObj(currAtoms);
46546
46573
  let atomLast = ic.firstAtomObjCls.getLastAtomObj(currAtoms);
46547
- let resiSum = parseInt(atomFirst.resi) + parseInt(atomLast.resi);
46574
+ let resiSum = atomFirst.resi + ':' + atomLast.resi;
46548
46575
 
46549
46576
  for(let n = 0, nl = residueArray.length; n < nl; ++n) {
46550
46577
  let resid = residueArray[n];
@@ -46580,7 +46607,7 @@ class LineGraph {
46580
46607
 
46581
46608
  let atomFirst = ic.firstAtomObjCls.getFirstAtomObj(domainAtoms);
46582
46609
  let atomLast = ic.firstAtomObjCls.getLastAtomObj(domainAtoms);
46583
- let resiSum = parseInt(atomFirst.resi) + parseInt(atomLast.resi);
46610
+ let resiSum = atomFirst.resi + ':' + atomLast.resi;
46584
46611
 
46585
46612
  for(let m = 0, ml = segArray.length; m < ml; m += 2) {
46586
46613
  let startResi = segArray[m];
@@ -46598,31 +46625,30 @@ class LineGraph {
46598
46625
 
46599
46626
  for(let k = 0, kl = domainAtomsArray.length; k < kl; ++k) {
46600
46627
  let pdb_target = ic.saveFileCls.getAtomPDB(domainAtomsArray[k], undefined, undefined, undefined, undefined, struct);
46601
- let bForceOneDomain = true;
46602
- let jsonStr_t = ic.domain3dCls.getDomainJsonForAlign(domainAtomsArray[k], bForceOneDomain);
46628
+ //let bForceOneDomain = true;
46629
+ //let jsonStr_t = ic.domain3dCls.getDomainJsonForAlign(domainAtomsArray[k], bForceOneDomain);
46603
46630
 
46604
46631
  // ig strand for any subset will have the same k, use the number of residue to separate them
46605
46632
  let atomFirst = ic.firstAtomObjCls.getFirstAtomObj(domainAtomsArray[k]);
46606
46633
  let atomLast = ic.firstAtomObjCls.getLastAtomObj(domainAtomsArray[k]);
46607
- let resiSum = parseInt(atomFirst.resi) + parseInt(atomLast.resi);
46634
+ let resiSum = atomFirst.resi + ':' + atomLast.resi;
46608
46635
  //let domainid = chainid + '-' + k + '_' + Object.keys(domainAtomsArray[k]).length;
46609
46636
  let domainid = chainid + '-' + k + '_' + resiSum;
46610
46637
  ic.domainid2pdb[domainid] = pdb_target;
46611
46638
 
46612
46639
  if(!template) {
46613
46640
  for(let index = 0, indexl = dataArray.length; index < indexl; ++index) {
46614
- // let struct2 = ic.defaultPdbId + index;
46615
- // let pdb_query = dataArray[index].value; //[0];
46616
- // let header = 'HEADER ' + struct2 + '\n';
46617
- // pdb_query = header + pdb_query;
46618
- let jsonStr_q = dataArray[index].value; //[0];
46641
+ let struct2 = ic.defaultPdbId + index;
46642
+ let pdb_query = dataArray[index].value; //[0];
46643
+ let header = 'HEADER ' + struct2 + '\n';
46644
+ pdb_query = header + pdb_query;
46645
+ //let jsonStr_q = dataArray[index].value; //[0];
46619
46646
 
46620
- // TM-align is not good when you align a full structure with the strand-only structure. VAST is better in this case.
46621
- // let dataObj = {'pdb_query': pdb_query, 'pdb_target': pdb_target, "queryid": ic.refpdbArray[index]};
46622
- // let alignAjax = me.getAjaxPostPromise(urltmalign, dataObj);
46647
+ let dataObj = {'pdb_query': pdb_query, 'pdb_target': pdb_target, "queryid": ic.refpdbArray[index]};
46648
+ let alignAjax = me.getAjaxPostPromise(urltmalign, dataObj);
46623
46649
 
46624
- let dataObj = {'domains1': jsonStr_q, 'domains2': jsonStr_t};
46625
- let alignAjax = me.getAjaxPostPromise(urlalign, dataObj);
46650
+ // let dataObj = {'domains1': jsonStr_q, 'domains2': jsonStr_t};
46651
+ // let alignAjax = me.getAjaxPostPromise(urlalign, dataObj);
46626
46652
 
46627
46653
  ajaxArray.push(alignAjax);
46628
46654
 
@@ -46644,8 +46670,8 @@ class LineGraph {
46644
46670
  // let allPromise = Promise.allSettled(ajaxArray);
46645
46671
  // dataArray2 = await allPromise;
46646
46672
 
46647
- //split arrays into chunks of 96 jobs or me.cfg.maxajax jobs
46648
- let n = (me.cfg.maxajax) ? me.cfg.maxajax : 96;
46673
+ //split arrays into chunks of 48 jobs or me.cfg.maxajax jobs
46674
+ let n = (me.cfg.maxajax) ? me.cfg.maxajax : ic.refpdbArray.length * 6;
46649
46675
 
46650
46676
  for(let i = 0, il = parseInt((ajaxArray.length - 1) / n + 1); i < il; ++i) {
46651
46677
  let currAjaxArray = [];
@@ -46752,7 +46778,6 @@ class LineGraph {
46752
46778
  let thisClass = this;
46753
46779
 
46754
46780
  let tmscoreThreshold = 0.4; // 0.4; //0.5;
46755
- let rmsdThreshold = 10;
46756
46781
 
46757
46782
  // find the best alignment for each chain
46758
46783
  let domainid2score = {}, domainid2segs = {}, chainid2segs = {};
@@ -46786,7 +46811,10 @@ class LineGraph {
46786
46811
  }
46787
46812
  }
46788
46813
  else {
46789
- if(queryData[0].super_rmsd > rmsdThreshold || queryData[0].num_res < minResidues) {
46814
+ // if(queryData[0].super_rmsd > rmsdThreshold || queryData[0].num_res < minResidues) {
46815
+ // continue;
46816
+ // }
46817
+ if(queryData[0].score < tmscoreThreshold || queryData[0].num_res < minResidues) {
46790
46818
  continue;
46791
46819
  }
46792
46820
  }
@@ -46801,7 +46829,8 @@ class LineGraph {
46801
46829
  if(!me.bNode) console.log("refpdbname " + refpdbname + " TM-score: " + queryData[0].score);
46802
46830
  }
46803
46831
  else {
46804
- if(!me.bNode) console.log("domainid: " + domainid + " refpdbname " + refpdbname + " RMSD: " + queryData[0].super_rmsd + ", num_res: " + queryData[0].num_res + ", 10/RMSD + num_res/5: " + (10 / queryData[0].super_rmsd + queryData[0].num_seg / 5).toFixed(1));
46832
+ // if(!me.bNode) console.log("domainid: " + domainid + " refpdbname " + refpdbname + " RMSD: " + queryData[0].super_rmsd + ", num_seg: " + queryData[0].num_seg + ", 10/RMSD + num_seg/5: " + (10 / queryData[0].super_rmsd + queryData[0].num_seg / 5).toFixed(1));
46833
+ if(!me.bNode) console.log("domainid: " + domainid + " refpdbname " + refpdbname + " TM-score: " + queryData[0].score);
46805
46834
  }
46806
46835
 
46807
46836
  // Ig-like domains: B (2150, 2150a, 2150b), C (3150, 3250), E (7150, 7250), F (8150, 8250) strands
@@ -46849,7 +46878,8 @@ class LineGraph {
46849
46878
  }
46850
46879
  }
46851
46880
  else {
46852
- let mixScore = 10 / queryData[0].super_rmsd + queryData[0].num_seg / 5;
46881
+ //let mixScore = 10 / queryData[0].super_rmsd + queryData[0].num_seg / 5;
46882
+ let mixScore = queryData[0].score;
46853
46883
 
46854
46884
  if(!domainid2score.hasOwnProperty(domainid) || mixScore > domainid2score[domainid]) {
46855
46885
  domainid2score[domainid] = mixScore;
@@ -46920,8 +46950,8 @@ class LineGraph {
46920
46950
  //let allPromise = Promise.allSettled(ajaxArray);
46921
46951
  //dataArray3 = await allPromise;
46922
46952
 
46923
- //split arrays into chunks of 96 jobs or me.cfg.maxajax jobs
46924
- let n = (me.cfg.maxajax) ? me.cfg.maxajax : 96;
46953
+ //split arrays into chunks of 48 jobs or me.cfg.maxajax jobs
46954
+ let n = (me.cfg.maxajax) ? me.cfg.maxajax : ic.refpdbArray.length * 6;
46925
46955
 
46926
46956
  for(let i = 0, il = parseInt((ajaxArray.length - 1) / n + 1); i < il; ++i) {
46927
46957
  let currAjaxArray = [];
@@ -47038,7 +47068,7 @@ class LineGraph {
47038
47068
  else {
47039
47069
  await ic.showAnnoCls.showAnnotations();
47040
47070
  }
47041
-
47071
+
47042
47072
  ic.annotationCls.setAnnoViewAndDisplay('detailed view');
47043
47073
  }
47044
47074
  else {
@@ -50450,7 +50480,7 @@ class ChainalignParser {
50450
50480
  //hAtoms = me.hashUtilsCls.unionHash(hAtoms, ic.chains[chainidArray[0]]);
50451
50481
  //hAtoms = me.hashUtilsCls.unionHash(hAtoms, ic.chains[chainidArray[1]]);
50452
50482
  }
50453
-
50483
+
50454
50484
  // set up the view of sequence alignment for each pair
50455
50485
  for(let mmdbidpair in mmdbidpairFinalHash) {
50456
50486
  if(ic.q_rotation !== undefined) {
@@ -50881,7 +50911,11 @@ class ChainalignParser {
50881
50911
  if(me.cfg.aligntool == 'tmalign') logStr += "; TM-score: " + align[0].score.toPrecision(4);
50882
50912
  me.htmlCls.clickMenuCls.setLogCmd(logStr, false);
50883
50913
  let html = "<br><b>Alignment RMSD</b>: " + rmsd.toPrecision(4) + " &#8491;<br>";
50884
- if(me.cfg.aligntool == 'tmalign') html += "<b>TM-score</b>: " + align[0].score.toPrecision(4) + "<br><br>";
50914
+ if(me.cfg.aligntool == 'tmalign') {
50915
+ html += "<b>TM-score</b>: " + align[0].score.toPrecision(4) + "<br><br>";
50916
+ ic.tmscore = align[0].score.toPrecision(4);
50917
+ }
50918
+
50885
50919
  $("#" + ic.pre + "dl_rmsd_html").html(html);
50886
50920
  if(!me.cfg.bSidebyside) me.htmlCls.dialogCls.openDlg('dl_rmsd', 'RMSD of alignment');
50887
50921
 
@@ -52944,7 +52978,7 @@ class PdbParser {
52944
52978
 
52945
52979
  if(me.cfg.rotate !== undefined) ic.resizeCanvasCls.rotStruc(me.cfg.rotate, true);
52946
52980
 
52947
- if(bAppend) {
52981
+ if(bAppend && !me.bNode) {
52948
52982
  // show all
52949
52983
  ic.definedSetsCls.setModeAndDisplay('all');
52950
52984
  }
@@ -55262,16 +55296,20 @@ class ParserUtils {
55262
55296
 
55263
55297
  getMissingResidues(seqArray, type, chainid) { let ic = this.icn3d, me = ic.icn3dui;
55264
55298
  ic.chainsSeq[chainid] = [];
55299
+
55300
+ // find the offset of MMDB sequence
55301
+ let offset = 0;
55265
55302
  if(type === 'mmdbid' || type === 'align') {
55266
55303
  for(let i = 0, il = seqArray.length; i < il; ++i) {
55267
55304
  if(seqArray[i][0] != 0) {
55268
- seqArray[i][0] - (i + 1);
55305
+ offset = seqArray[i][0] - (i + 1);
55269
55306
  break;
55270
55307
  }
55271
55308
  }
55272
55309
  }
55273
55310
 
55274
- let prevResi = 0;
55311
+ //let prevResi = 0;
55312
+ let prevResi = offset;
55275
55313
  for(let i = 0, il = seqArray.length; i < il; ++i) {
55276
55314
  let seqName, resiPos;
55277
55315
  // mmdbid: ["0","R","ARG"],["502","V","VAL"]; mmcifid: [1, "ARG"]; align: ["0","R","ARG"] //align: [1, "0","R","ARG"]
@@ -56160,6 +56198,7 @@ class LoadAtomData {
56160
56198
  let CSerial, prevCSerial, OSerial, prevOSerial;
56161
56199
 
56162
56200
  let biopolymerChainsHash = {};
56201
+
56163
56202
  for(let i in atoms) {
56164
56203
  ++serial;
56165
56204
 
@@ -56189,21 +56228,21 @@ class LoadAtomData {
56189
56228
  atm.chain = ic.molid2chain[molid].substr(pos + 1);
56190
56229
  }
56191
56230
  else {
56192
- let miscName = 'Misc';
56231
+ let miscName = 'Misc';
56193
56232
 
56194
- //if(atm.resn != prevResn || chainid2kind[chainNum] === 'solvent' || atm.resn === 'HOH' || atm.name == atm.elem) {
56195
- if((chainid2kind[chainNum] === 'protein' && chainid2kind[chainNum] === 'nucleotide' && atm.resi != prevResiOri)
56196
- ||(chainid2kind[chainNum] !== 'protein' && chainid2kind[chainNum] !== 'nucleotide'
56197
- &&(atm.resn.substr(0,3) != prevResn.substr(0,3) || atm.resi != prevResiOri || chainid2kind[chainNum] === 'solvent' || atm.resn === 'HOH')) ) {
56198
- ++miscCnt;
56199
- }
56233
+ //if(atm.resn != prevResn || chainid2kind[chainNum] === 'solvent' || atm.resn === 'HOH' || atm.name == atm.elem) {
56234
+ if((chainid2kind[chainNum] === 'protein' && chainid2kind[chainNum] === 'nucleotide' && atm.resi != prevResiOri)
56235
+ ||(chainid2kind[chainNum] !== 'protein' && chainid2kind[chainNum] !== 'nucleotide'
56236
+ &&(atm.resn.substr(0,3) != prevResn.substr(0,3) || atm.resi != prevResiOri || chainid2kind[chainNum] === 'solvent' || atm.resn === 'HOH')) ) {
56237
+ ++miscCnt;
56238
+ }
56200
56239
 
56201
- atm.resi_ori = atm.resi;
56202
- atm.resi = miscCnt;
56203
- bSetResi = true;
56240
+ atm.resi_ori = atm.resi;
56241
+ atm.resi = miscCnt;
56242
+ bSetResi = true;
56204
56243
 
56205
- //if all are defined in the chain section, no "Misc" should appear
56206
- atm.chain = miscName;
56244
+ //if all are defined in the chain section, no "Misc" should appear
56245
+ atm.chain = miscName;
56207
56246
  }
56208
56247
 
56209
56248
  //if(ic.mmdbid_q !== undefined && ic.mmdbid_q === ic.mmdbid_t && alignType === 'query') {
@@ -58654,10 +58693,7 @@ class LoadPDB {
58654
58693
 
58655
58694
  if(ic.atoms[oriSerial2NewSerial[from]] !== undefined) ic.atoms[oriSerial2NewSerial[from]].bonds.push(oriSerial2NewSerial[to]);
58656
58695
  }
58657
- } else if (record.substr(0,3) === 'TER') {
58658
- // Concatenation of two pdbs will have several atoms for the same serial
58659
- ++serial;
58660
- }
58696
+ } else if (record.substr(0,3) === 'TER') ;
58661
58697
  }
58662
58698
 
58663
58699
  // add the last residue set
@@ -60231,24 +60267,28 @@ class ApplyCommand {
60231
60267
  else if(command == 'rotate left') {
60232
60268
  ic.bStopRotate = false;
60233
60269
  ic.ROT_DIR = 'left';
60270
+ ic.transformCls.rotateCountMax = 6000;
60234
60271
 
60235
60272
  ic.resizeCanvasCls.rotStruc('left');
60236
60273
  }
60237
60274
  else if(command == 'rotate right') {
60238
60275
  ic.bStopRotate = false;
60239
60276
  ic.ROT_DIR = 'right';
60277
+ ic.transformCls.rotateCountMax = 6000;
60240
60278
 
60241
60279
  ic.resizeCanvasCls.rotStruc('right');
60242
60280
  }
60243
60281
  else if(command == 'rotate up') {
60244
60282
  ic.bStopRotate = false;
60245
60283
  ic.ROT_DIR = 'up';
60284
+ ic.transformCls.rotateCountMax = 6000;
60246
60285
 
60247
60286
  ic.resizeCanvasCls.rotStruc('up');
60248
60287
  }
60249
60288
  else if(command == 'rotate down') {
60250
60289
  ic.bStopRotate = false;
60251
60290
  ic.ROT_DIR = 'down';
60291
+ ic.transformCls.rotateCountMax = 6000;
60252
60292
 
60253
60293
  ic.resizeCanvasCls.rotStruc('down');
60254
60294
  }
@@ -64947,7 +64987,8 @@ class Delphi {
64947
64987
  let pdbstr = '';
64948
64988
  /// pdbstr += ic.saveFileCls.getPDBHeader();
64949
64989
 
64950
- pdbstr +=(me.cfg.cid) ? ic.saveFileCls.getAtomPDB(atomHash, true) : ic.saveFileCls.getAtomPDB(atomHash);
64990
+ let bMergeIntoOne = true;
64991
+ pdbstr +=(me.cfg.cid) ? ic.saveFileCls.getAtomPDB(atomHash, true, undefined, undefined, undefined, undefined, bMergeIntoOne) : ic.saveFileCls.getAtomPDB(atomHash, undefined, undefined, undefined, undefined, undefined, bMergeIntoOne);
64951
64992
  pdbstr += ic.saveFileCls.getAtomPDB(ionHash, true, undefined, true);
64952
64993
 
64953
64994
  return pdbstr;
@@ -65920,7 +65961,8 @@ console.log("free energy: " + energy + " kcal/mol");
65920
65961
  }
65921
65962
  else {
65922
65963
  let atoms = me.hashUtilsCls.intHash(ic.dAtoms, ic.hAtoms);
65923
- pdbStr = ic.saveFileCls.getAtomPDB(atoms);
65964
+ let bMergeIntoOne = true;
65965
+ pdbStr = ic.saveFileCls.getAtomPDB(atoms, undefined, undefined, undefined, undefined, undefined, bMergeIntoOne);
65924
65966
  }
65925
65967
 
65926
65968
  let url = me.htmlCls.baseUrl + "scap/scap.cgi";
@@ -69841,7 +69883,7 @@ class SaveFile {
69841
69883
  }
69842
69884
 
69843
69885
  //getAtomPDB: function(atomHash, bPqr, bPdb, bNoChem) { let ic = this.icn3d, me = ic.icn3dui;
69844
- getAtomPDB(atomHash, bPqr, bNoChem, bNoHeader, chainResi2pdb, pdbid) { let ic = this.icn3d, me = ic.icn3dui;
69886
+ getAtomPDB(atomHash, bPqr, bNoChem, bNoHeader, chainResi2pdb, pdbid, bMergeIntoOne) { let ic = this.icn3d, me = ic.icn3dui;
69845
69887
  let pdbStr = '';
69846
69888
 
69847
69889
  // get all phosphate groups in lipids
@@ -69994,6 +70036,7 @@ class SaveFile {
69994
70036
  let bMulStruc =(struArray.length > 1) ? true : false;
69995
70037
 
69996
70038
  let molNum = 1, prevStru = '', prevChain = '';
70039
+ let chainIndex = 0, fakeChain = '', chainNameArray = 'abcdefghijklmnopqrstuvwxyz0123456789';
69997
70040
 
69998
70041
  let addedChainResiHash = {};
69999
70042
  for(let i in atomHash) {
@@ -70004,20 +70047,22 @@ class SaveFile {
70004
70047
 
70005
70048
  //if(bMulStruc && atom.structure != prevStru) {
70006
70049
  if(atom.structure != prevStru) {
70007
- pdbStr += connStr;
70008
- connStr = '';
70050
+ if(!bMergeIntoOne || !bMulStruc) {
70051
+ pdbStr += connStr;
70052
+ connStr = '';
70009
70053
 
70010
- if(molNum > 1) pdbStr += '\nENDMDL\n';
70054
+ if(molNum > 1) pdbStr += '\nENDMDL\n';
70011
70055
 
70012
- if(bMulStruc) pdbStr += 'MODEL ' + molNum + '\n';
70056
+ if(bMulStruc) pdbStr += 'MODEL ' + molNum + '\n';
70057
+ }
70013
70058
 
70014
70059
  // add header
70015
70060
  let mutantInfo = (chainResi2pdb) ? "Mutated chain_residue " + Object.keys(chainResi2pdb) + '; ' : '';
70016
70061
  if(!bNoHeader) {
70017
70062
  //pdbStr += this.getPDBHeader(molNum - 1, stru2header, mutantInfo, pdbid);
70018
70063
 
70019
- // make sur ethe PDB ID is correct
70020
- pdbStr += this.getPDBHeader(molNum - 1, stru2header, mutantInfo, atom.structure);
70064
+ // make sure the PDB ID is correct
70065
+ if(!bMergeIntoOne || !bMulStruc) pdbStr += this.getPDBHeader(molNum - 1, stru2header, mutantInfo, atom.structure);
70021
70066
 
70022
70067
  //pdbStr += '\n'; // separate from incomplete secondary structures
70023
70068
  }
@@ -70025,6 +70070,7 @@ class SaveFile {
70025
70070
  //prevStru = atom.structure;
70026
70071
  ++molNum;
70027
70072
  }
70073
+
70028
70074
  //else {
70029
70075
  //if(atom.chain != prevChain) {
70030
70076
  if(atom.chain != prevChain && atom.structure == prevStru) {
@@ -70098,17 +70144,28 @@ class SaveFile {
70098
70144
  */
70099
70145
 
70100
70146
  line +=(resn.length <= 3) ? resn.padStart(3, ' ') : resn.substr(0, 3);
70101
- //line += ' ';
70102
- //line +=(atom.chain.length <= 1) ? atom.chain.padStart(1, ' ') : atom.chain.substr(0, 1);
70103
- if(atom.chain.length >= 2) {
70104
- let chainTmp = atom.chain.replace(/_/gi, '').substr(0, 2);
70105
- line += chainTmp;
70106
- }
70107
- else if(atom.chain.length == 1) {
70108
- line += ' ' + atom.chain.substr(0, 1);
70147
+
70148
+ if(bMergeIntoOne && molNum > 2 && (ic.proteins.hasOwnProperty(atom.serial) || ic.nucleotides.hasOwnProperty(atom.serial))) {
70149
+ if(atom.structure != prevStru || atom.chain != prevChain) {
70150
+ fakeChain = (chainIndex < 36) ? chainNameArray[chainIndex] : '?';
70151
+ ++chainIndex;
70152
+ }
70153
+
70154
+ line += ' ' + fakeChain;
70109
70155
  }
70110
- else if(atom.chain.length == 0) {
70111
- line += ' A';
70156
+ else {
70157
+ //line += ' ';
70158
+ //line +=(atom.chain.length <= 1) ? atom.chain.padStart(1, ' ') : atom.chain.substr(0, 1);
70159
+ if(atom.chain.length >= 2) {
70160
+ let chainTmp = atom.chain.replace(/_/gi, '').substr(0, 2);
70161
+ line += chainTmp;
70162
+ }
70163
+ else if(atom.chain.length == 1) {
70164
+ line += ' ' + atom.chain.substr(0, 1);
70165
+ }
70166
+ else if(atom.chain.length == 0) {
70167
+ line += ' A';
70168
+ }
70112
70169
  }
70113
70170
 
70114
70171
  let resi = atom.resi;
@@ -70204,9 +70261,11 @@ class SaveFile {
70204
70261
  prevChain = atom.chain;
70205
70262
  }
70206
70263
 
70207
- pdbStr += connStr;
70208
-
70209
- if(bMulStruc) pdbStr += '\nENDMDL\n';
70264
+ if(!bMergeIntoOne || !bMulStruc) {
70265
+ pdbStr += connStr;
70266
+
70267
+ if(bMulStruc) pdbStr += '\nENDMDL\n';
70268
+ }
70210
70269
 
70211
70270
  return pdbStr;
70212
70271
  }
@@ -73691,7 +73750,7 @@ class iCn3DUI {
73691
73750
  //even when multiple iCn3D viewers are shown together.
73692
73751
  this.pre = this.cfg.divid + "_";
73693
73752
 
73694
- this.REVISION = '3.28.3';
73753
+ this.REVISION = '3.28.4';
73695
73754
 
73696
73755
  // In nodejs, iCn3D defines "window = {navigator: {}}"
73697
73756
  this.bNode = (Object.keys(window).length < 2) ? true : false;
@@ -73898,16 +73957,17 @@ iCn3DUI.prototype.show3DStructure = async function(pdbStr) { let me = this;
73898
73957
  }
73899
73958
  }
73900
73959
 
73901
- // realign
73902
- ic.chainidArray = [chain_t].concat(chainidArray);
73903
- ic.chainidArray = ic.chainalignParserCls.addPostfixForChainids(ic.chainidArray);
73904
-
73960
+ // get the matched structures, do not include the template
73905
73961
  let mmdbafid = '';
73906
- for(let i = 0, il = ic.chainidArray.length; i < il; ++i) {
73962
+ for(let i = 0, il = chainidArray.length; i < il; ++i) {
73907
73963
  if(i > 0) mmdbafid += ',';
73908
- mmdbafid += ic.chainidArray[i].substr(0, ic.chainidArray[i].indexOf('_'));
73964
+ mmdbafid += chainidArray[i].substr(0, chainidArray[i].indexOf('_'));
73909
73965
  }
73910
73966
 
73967
+ // realign, include the template
73968
+ ic.chainidArray = [chain_t].concat(chainidArray);
73969
+ ic.chainidArray = ic.chainalignParserCls.addPostfixForChainids(ic.chainidArray);
73970
+
73911
73971
  me.htmlCls.clickMenuCls.setLogCmd('resdef ' + me.cfg.resdef, true);
73912
73972
 
73913
73973
  ic.loadCmd = 'vast_search_chainid ' + ic.chainidArray;
@@ -74123,7 +74183,7 @@ iCn3DUI.prototype.show3DStructure = async function(pdbStr) { let me = this;
74123
74183
  // ic.bNCBI = true;
74124
74184
 
74125
74185
  // remove space
74126
- me.cfg.mmdbafid = me.cfg.mmdbafid.replace(/\s+/g, '');
74186
+ me.cfg.mmdbafid = me.cfg.mmdbafid.replace(/\s+/g, '').toUpperCase();
74127
74187
 
74128
74188
  ic.bMmdbafid = true;
74129
74189
  ic.inputid = me.cfg.mmdbafid;