icn3d 3.19.1 → 3.19.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/icn3d.js CHANGED
@@ -4085,6 +4085,57 @@ class ParasCls {
4085
4085
  'GLN': this.thr().setHSL(1/3.0, 1, 0.5 + 0.5 * (0.58 + 1.85)/2.5)
4086
4086
  };
4087
4087
 
4088
+ this.hydrophobicValues = {
4089
+ // charged residues
4090
+ ' G': 3, ' A': 3, ' T': 3,
4091
+ ' C': 3, ' U': 3, ' DG': 3,
4092
+ ' DA': 3, ' DT': 3, ' DC': 3,
4093
+ ' DU': 3, 'G': 3, 'A': 3,
4094
+ 'T': 3, 'C': 3, 'U': 3,
4095
+ 'DG': 3, 'DA': 3, 'DT': 3,
4096
+ 'DC': 3, 'DU': 3, 'ARG': 1,
4097
+ 'LYS': 1, 'ASP': 3, 'GLU': 3,
4098
+ 'HIS': 2,
4099
+
4100
+ // + 0.81)/(1.14 + 0.81)),
4101
+ // hydrophobic
4102
+ // https://en.m.wikipedia.org/wiki/Hydrophobicity_scales#Wimley%E2%80%93White_whole_residue_hydrophobicity_scales
4103
+ // 0.65 ~ -1.85: white ~ green
4104
+ 'TRP': -1.85,
4105
+ 'PHE': -1.13,
4106
+ 'TYR': -0.94,
4107
+ 'LEU': -0.56,
4108
+ 'ILE': -0.31,
4109
+ 'CYS': -0.24,
4110
+ 'MET': -0.23,
4111
+
4112
+ // polar
4113
+ 'GLY': 0.01,
4114
+ 'VAL': 0.07,
4115
+ 'SER': 0.13,
4116
+ 'THR': 0.14,
4117
+ 'ALA': 0.17,
4118
+ 'ASN': 0.42,
4119
+ 'PRO': 0.45,
4120
+ 'GLN': 0.58
4121
+ };
4122
+
4123
+ this.residueAbbrev = {
4124
+ ALA: "A (Ala)", ARG: "R (Arg)", ASN: "N (Asn)",
4125
+ ASP: "D (Asp)", CYS: "C (Cys)", GLN: "Q (Gln)",
4126
+ GLU: "E (Glu)", GLY: "G (Gly)", HIS: "H (His)",
4127
+ ILE: "I (Ile)", LEU: "L (Leu)", LYS: "K (Lys)",
4128
+ MET: "M (Met)", PHE: "F (Phe)", PRO: "P (Pro)",
4129
+ SER: "S (Ser)", THR: "T (Thr)", TRP: "W (Trp)",
4130
+ TYR: "Y (Tyr)", VAL: "V (Val)",
4131
+ //ASX: "B (Asx)", GLX: "Z (Glx)",
4132
+ ASX: "X (Asx)", GLX: "X (Glx)",
4133
+ 'G': "Guanine", 'A': "Adenine",
4134
+ 'T': "Thymine", 'C': "Cytosine", 'U': "Uracil",
4135
+ 'DG': "deoxy-Guanine", 'DA': "deoxy-Adenine", 'DT': "deoxy-Thymine",
4136
+ 'DC': "deoxy-Cytosine", 'DU': 'deoxy-Uracil'
4137
+ };
4138
+
4088
4139
  this.ssColors = {
4089
4140
  helix: this.thr(0xFF0000),
4090
4141
  sheet: this.thr(0x008000),
@@ -6031,7 +6082,8 @@ class FirstAtomObj {
6031
6082
  for(let i in atomsHash) {
6032
6083
  if((ic.atoms[i].name == 'CA' && ic.proteins.hasOwnProperty(i)) || !ic.proteins.hasOwnProperty(i)) {
6033
6084
  let residueid = ic.atoms[i].structure + '_' + ic.atoms[i].chain + '_' + ic.atoms[i].resi;
6034
- residuesHash[residueid] = 1;
6085
+ //residuesHash[residueid] = 1;
6086
+ residuesHash[residueid] = ic.atoms[i].resn;
6035
6087
  }
6036
6088
  }
6037
6089
 
@@ -8398,11 +8450,11 @@ class Cylinder {
8398
8450
  if (atom.ss === 'sheet') beta[atom.serial] = atom;
8399
8451
  if (atom.name !== 'CA') continue;
8400
8452
  if (atom.ss === 'helix' && atom.ssend) {
8401
- if (start !== null && currentChain === atom.chain && currentResi < atom.resi) {
8453
+ if (start !== null && currentChain === atom.chain && parseInt(currentResi) < parseInt(atom.resi)) {
8402
8454
  if(bHighlight === 1 || bHighlight === 2) {
8403
8455
  this.createCylinder(start.coord, atom.coord, radius, ic.hColor, bHighlight);
8404
8456
  }
8405
- else {
8457
+ else {
8406
8458
  this.createCylinder(start.coord, atom.coord, radius, atom.color);
8407
8459
  }
8408
8460
  }
@@ -11938,7 +11990,8 @@ class ShareLink {
11938
11990
  if(ic.bAfMem) {
11939
11991
  paraHash['afmem'] = 'on';
11940
11992
  }
11941
- else {
11993
+ //else {
11994
+ else if(me.cfg.afid || (Object.keys(ic.structures).length == 1 && Object.keys(ic.structures)[0].length > 5) ) {
11942
11995
  paraHash['afmem'] = 'off';
11943
11996
  }
11944
11997
 
@@ -12028,16 +12081,16 @@ class ShareLink {
12028
12081
  else if(prevCommandStr.indexOf(toggleStr) !== -1) {
12029
12082
  ++cntToggle;
12030
12083
  }
12031
- // adding this section will remove the first command!!!
12032
- // else if(i === start + 1) {
12033
- // //tmpUrl += prevCommandStr;
12034
-
12035
- // if(!(inparaWithoutCommand !== undefined && ic.inputid)) {
12036
- // tmpUrl += prevCommandStr;
12037
- // }
12084
+ else if(i === start + 1) {
12085
+ //tmpUrl += prevCommandStr;
12086
+
12087
+ //if(!(inparaWithoutCommand !== undefined && ic.inputid)) {
12088
+ if(prevCommandStr.substr(0, 4) !== 'load') {
12089
+ tmpUrl += prevCommandStr;
12090
+ }
12038
12091
 
12039
- // //statefile += prevCommandStr + "\n";
12040
- // }
12092
+ //statefile += prevCommandStr + "\n";
12093
+ }
12041
12094
  else {
12042
12095
  tmpUrl += (tmpUrl) ? '; ' + prevCommandStr : prevCommandStr;
12043
12096
  //statefile += prevCommandStr + "\n";
@@ -16545,6 +16598,14 @@ class ViewInterPairs {
16545
16598
  bHbond, bSaltbridge, bInteraction, bHalogen, bPication, bPistacking, contactDist) { let ic = this.icn3d, me = ic.icn3dui;
16546
16599
  let bondCnt;
16547
16600
 
16601
+ // reset
16602
+ ic.hbondpnts = [];
16603
+ ic.saltbridgepnts = [];
16604
+ ic.contactpnts = [];
16605
+ ic.halogenpnts = [];
16606
+ ic.picationpnts = [];
16607
+ ic.pistackingpnts = [];
16608
+
16548
16609
  // type: view, save, forcegraph
16549
16610
  ic.bRender = false;
16550
16611
  let hAtoms = {};
@@ -17029,7 +17090,7 @@ class ViewInterPairs {
17029
17090
  html += '<br><table class="icn3d-sticky" align=center border=1 cellpadding=10 cellspacing=0><thead>';
17030
17091
  html += '<tr><th rowspan=2>Residue</th><th rowspan=2># Hydrogen<br>Bond</th><th rowspan=2># Salt Bridge<br>/Ionic Interaction</th><th rowspan=2># Contact</th>';
17031
17092
  html += '<th rowspan=2># Halogen<br>Bond</th><th rowspan=2># &pi;-Cation</th><th rowspan=2># &pi;-Stacking</th>';
17032
- html += '<th>Hydrogen Bond</th><th>Salt Bridge/Ionic Interaction</th><th>Contact</th>';
17093
+ html += '<th>Hydrogen Bond (backbone atoms: @CA, @N, @C, @O)</th><th>Salt Bridge/Ionic Interaction</th><th>Contact</th>';
17033
17094
  html += '<th>Halogen Bond</th><th>&pi;-Cation</th><th>&pi;-Stacking</th></tr>';
17034
17095
  html += '<tr>';
17035
17096
  let tmpStr = '<td><table width="100%" class="icn3d-border"><tr><td>Atom1</td><td>Atom2</td><td>Distance(&#8491;)</td><td>Highlight in 3D</td></tr></table></td>';
@@ -17198,7 +17259,7 @@ class ViewInterPairs {
17198
17259
  }
17199
17260
  }
17200
17261
  let text = '<div style="text-align:center"><br><b>' + cnt
17201
- + ' hydrogen bond pairs</b>:</div><br>';
17262
+ + ' hydrogen bond pairs</b> (backbone atoms: @CA, @N, @C, @O):</div><br>';
17202
17263
  if(cnt > 0) {
17203
17264
  text += '<br><table align=center border=1 cellpadding=10 cellspacing=0>'
17204
17265
  + '<tr><th>Atom 1</th><th>Atom 2</th><th>Distance(&#8491;)</th>';
@@ -22720,8 +22781,10 @@ class Dssp {
22720
22781
 
22721
22782
  let ajaxArray = [];
22722
22783
 
22723
- //let url = me.htmlCls.baseUrl + "mmcifparser/mmcifparser.cgi";
22724
- let url = "/Structure/mmcifparser/mmcifparser.cgi";
22784
+ let url = (window && window.location && window.location.hostname.indexOf('ncbi.nlm.nih.gov') != -1) ? "/Structure/mmcifparser/mmcifparser.cgi" :
22785
+ me.htmlCls.baseUrl + "mmcifparser/mmcifparser.cgi";
22786
+ //let url = "https://www.ncbi.nlm.nih.gov/Structure/mmcifparser/mmcifparser.cgi";
22787
+
22725
22788
  for(let i = 0, il = struArray.length; i < il; ++i) {
22726
22789
  let pdbStr = '';
22727
22790
  /// pdbStr += ic.saveFileCls.getPDBHeader(i);
@@ -24609,6 +24672,7 @@ class RealignParser {
24609
24672
  let lastStruResi = '';
24610
24673
  for(let serial in ic.hAtoms) {
24611
24674
  let atom = ic.atoms[serial];
24675
+ let chainid = atom.structure + '_' + atom.chain;
24612
24676
  if((ic.proteins.hasOwnProperty(serial) && atom.name == "CA")
24613
24677
  ||(ic.nucleotides.hasOwnProperty(serial) &&(atom.name == "O3'" || atom.name == "O3*")) ) {
24614
24678
  if(atom.structure + '_' + atom.resi == lastStruResi) continue; // e.g., Alt A and B
@@ -24618,11 +24682,11 @@ class RealignParser {
24618
24682
  }
24619
24683
  structHash[atom.structure].push(atom.coord.clone());
24620
24684
 
24621
- if(!ic.realignResid.hasOwnProperty(atom.structure)) {
24622
- ic.realignResid[atom.structure] = [];
24685
+ if(!ic.realignResid.hasOwnProperty(chainid)) {
24686
+ ic.realignResid[chainid] = [];
24623
24687
  }
24624
24688
 
24625
- ic.realignResid[atom.structure].push({'resid': atom.structure + '_' + atom.chain + '_' + atom.resi, 'resn': me.utilsCls.residueName2Abbr(atom.resn.substr(0, 3)).substr(0, 1)});
24689
+ ic.realignResid[chainid].push({'resid': chainid + '_' + atom.resi, 'resn': me.utilsCls.residueName2Abbr(atom.resn.substr(0, 3)).substr(0, 1)});
24626
24690
 
24627
24691
  struct2chain[atom.structure] = atom.structure + '_' + atom.chain;
24628
24692
 
@@ -24698,12 +24762,12 @@ class RealignParser {
24698
24762
  let residArray1 = struct2resid[chainpair][toStruct];
24699
24763
  let residArray2 = struct2resid[chainpair][fromStruct];
24700
24764
 
24701
- ic.realignResid[toStruct] = [];
24702
- ic.realignResid[fromStruct] = [];
24765
+ ic.realignResid[chainTo] = [];
24766
+ ic.realignResid[chainFrom] = [];
24703
24767
 
24704
24768
  for(let i = 0, il = seq1.length; i < il; ++i) {
24705
- ic.realignResid[toStruct].push({'resid':residArray1[i], 'resn':seq1[i]});
24706
- ic.realignResid[fromStruct].push({'resid':residArray2[i], 'resn':seq2[i]});
24769
+ ic.realignResid[chainTo].push({'resid':residArray1[i], 'resn':seq1[i]});
24770
+ ic.realignResid[chainFrom].push({'resid':residArray2[i], 'resn':seq2[i]});
24707
24771
  }
24708
24772
 
24709
24773
  let bChainAlign = true;
@@ -24748,6 +24812,7 @@ class RealignParser {
24748
24812
  let toStruct = chainidArray[0].substr(0, chainidArray[0].indexOf('_')); //.toUpperCase();
24749
24813
  if(!bRealign) toStruct = toStruct.toUpperCase();
24750
24814
 
24815
+
24751
24816
  let hAtoms = {};
24752
24817
 
24753
24818
  ic.realignResid = {};
@@ -24772,7 +24837,7 @@ class RealignParser {
24772
24837
 
24773
24838
  chainidArray[0] = chainTo;
24774
24839
  chainidArray[index + 1] = chainFrom;
24775
-
24840
+ /*
24776
24841
  let seq1 = struct2SeqHash[toStruct];
24777
24842
  let seq2 = struct2SeqHash[fromStruct];
24778
24843
 
@@ -24781,6 +24846,15 @@ class RealignParser {
24781
24846
 
24782
24847
  let residArray1 = struct2resid[toStruct];
24783
24848
  let residArray2 = struct2resid[fromStruct];
24849
+ */
24850
+ let seq1 = struct2SeqHash[chainTo];
24851
+ let seq2 = struct2SeqHash[chainFrom];
24852
+
24853
+ let coord1 = struct2CoorHash[chainTo];
24854
+ let coord2 = struct2CoorHash[chainFrom];
24855
+
24856
+ let residArray1 = struct2resid[chainTo];
24857
+ let residArray2 = struct2resid[chainFrom];
24784
24858
 
24785
24859
  let query, target;
24786
24860
 
@@ -24799,8 +24873,8 @@ class RealignParser {
24799
24873
 
24800
24874
  let seqto = '', seqfrom = '';
24801
24875
 
24802
- ic.realignResid[toStruct] = [];
24803
- ic.realignResid[fromStruct] = [];
24876
+ ic.realignResid[chainTo] = [];
24877
+ ic.realignResid[chainFrom] = [];
24804
24878
 
24805
24879
  let segArray = target.segs;
24806
24880
  for(let i = 0, il = segArray.length; i < il; ++i) {
@@ -24820,8 +24894,8 @@ class RealignParser {
24820
24894
 
24821
24895
  // one chaincould be longer than the other
24822
24896
  if(j == 0 ||(prevChain1 == chainid1 && prevChain2 == chainid2) ||(prevChain1 != chainid1 && prevChain2 != chainid2)) {
24823
- ic.realignResid[toStruct].push({'resid':residArray1[j + seg.orifrom], 'resn':seq1[j + seg.orifrom]});
24824
- ic.realignResid[fromStruct].push({'resid':residArray2[j + seg.from], 'resn':seq2[j + seg.from]});
24897
+ ic.realignResid[chainTo].push({'resid':residArray1[j + seg.orifrom], 'resn':seq1[j + seg.orifrom]});
24898
+ ic.realignResid[chainFrom].push({'resid':residArray2[j + seg.from], 'resn':seq2[j + seg.from]});
24825
24899
  }
24826
24900
 
24827
24901
  prevChain1 = chainid1;
@@ -24833,6 +24907,8 @@ class RealignParser {
24833
24907
  //let chainFrom = chainidArray[index + 1];
24834
24908
 
24835
24909
  let bChainAlign = true;
24910
+
24911
+
24836
24912
  let result = ic.ParserUtilsCls.alignCoords(coordsFrom, coordsTo, fromStruct, undefined, chainTo, chainFrom, index + 1, bChainAlign);
24837
24913
  hAtoms = me.hashUtilsCls.unionHash(hAtoms, result.hAtoms);
24838
24914
 
@@ -25070,12 +25146,18 @@ class RealignParser {
25070
25146
  //return;
25071
25147
  continue;
25072
25148
  }
25073
-
25149
+ /*
25074
25150
  if(!struct2SeqHash.hasOwnProperty(mmdbid) && !bPredefined) {
25075
25151
  struct2SeqHash[mmdbid] = '';
25076
25152
  struct2CoorHash[mmdbid] = [];
25077
25153
  struct2resid[mmdbid] = [];
25078
25154
  }
25155
+ */
25156
+ if(!struct2SeqHash.hasOwnProperty(chainid) && !bPredefined) {
25157
+ struct2SeqHash[chainid] = '';
25158
+ struct2CoorHash[chainid] = [];
25159
+ struct2resid[chainid] = [];
25160
+ }
25079
25161
 
25080
25162
  if(bPredefined) {
25081
25163
  base = parseInt(ic.chainsSeq[chainid][0].resi);
@@ -25134,6 +25216,7 @@ class RealignParser {
25134
25216
  }
25135
25217
  }
25136
25218
  else {
25219
+ /*
25137
25220
  if(i == 0) { // master
25138
25221
  base = parseInt(ic.chainsSeq[chainid][0].resi);
25139
25222
 
@@ -25208,6 +25291,78 @@ class RealignParser {
25208
25291
 
25209
25292
  ajaxArray.push(queryAjax);
25210
25293
  }
25294
+ */
25295
+ if(i == 0) { // master
25296
+ base = parseInt(ic.chainsSeq[chainid][0].resi);
25297
+
25298
+ resiArray = [];
25299
+ if(bRealign) {
25300
+ //resiArray = [resRange];
25301
+ let residHash = ic.firstAtomObjCls.getResiduesFromAtoms(ic.hAtoms);
25302
+ for(var resid in residHash) {
25303
+ let resi = resid.substr(resid.lastIndexOf('_') + 1);
25304
+
25305
+ let chainidTmp = resid.substr(0, resid.lastIndexOf('_'));
25306
+ if(chainidTmp == chainid) resiArray.push(resi);
25307
+ }
25308
+ }
25309
+ else if(me.cfg.resnum) {
25310
+ resiArray = me.cfg.resnum.split(",");
25311
+ }
25312
+
25313
+ //if(!bPredefined) {
25314
+ result = thisClass.getSeqCoorResid(resiArray, chainid, base);
25315
+ struct2SeqHash[chainid] += result.seq;
25316
+ struct2CoorHash[chainid] = struct2CoorHash[chainid].concat(result.coor);
25317
+ struct2resid[chainid] = struct2resid[chainid].concat(result.resid);
25318
+ //}
25319
+ }
25320
+ else {
25321
+ // if selected both chains
25322
+ let bSelectedBoth = false;
25323
+ if(bRealign) {
25324
+ //resiArray = [resRange];
25325
+ let residHash = ic.firstAtomObjCls.getResiduesFromAtoms(ic.hAtoms);
25326
+ for(var resid in residHash) {
25327
+ //let resi = resid.substr(resid.lastIndexOf('_') + 1);
25328
+ let chainidTmp = resid.substr(0, resid.lastIndexOf('_'));
25329
+ if(chainidTmp == chainid) {
25330
+ bSelectedBoth = true;
25331
+
25332
+ let resn = ic.firstAtomObjCls.getFirstAtomObj(ic.residues[resid]).resn;
25333
+ struct2SeqHash[chainid] += me.utilsCls.residueName2Abbr(resn);
25334
+
25335
+ struct2CoorHash[chainid] = struct2CoorHash[chainid].concat(this.getResCoorArray(resid));
25336
+
25337
+ struct2resid[chainid].push(resid);
25338
+ }
25339
+ }
25340
+ }
25341
+
25342
+ if(!bSelectedBoth) {
25343
+ for(let j = 0, jl = ic.chainsSeq[chainid].length; j < jl; ++j) {
25344
+ struct2SeqHash[chainid] += ic.chainsSeq[chainid][j].name;
25345
+ let resid = chainid + '_' + ic.chainsSeq[chainid][j].resi;
25346
+
25347
+ struct2CoorHash[chainid] = struct2CoorHash[chainid].concat(this.getResCoorArray(resid));
25348
+
25349
+ struct2resid[chainid].push(resid);
25350
+ }
25351
+ }
25352
+
25353
+ let seq1 = struct2SeqHash[chainid_t];
25354
+ let seq2 = struct2SeqHash[chainid];
25355
+
25356
+ let queryAjax = $.ajax({
25357
+ url: url,
25358
+ type: 'POST',
25359
+ data : {'targets': seq1, 'queries': seq2},
25360
+ dataType: 'jsonp',
25361
+ cache: true
25362
+ });
25363
+
25364
+ ajaxArray.push(queryAjax);
25365
+ }
25211
25366
  }
25212
25367
  } // for
25213
25368
 
@@ -31334,7 +31489,7 @@ class AddTrack {
31334
31489
 
31335
31490
  thisClass.showNewTrack(chainid, title, result.text, undefined, undefined, 'custom', undefined, undefined, result.fromArray, result.toArray);
31336
31491
 
31337
- me.htmlCls.clickMenuCls.setLogCmd("add track | chainid " + chainid + " | title " + title + " | text " + text + " | type custom", true);
31492
+ me.htmlCls.clickMenuCls.setLogCmd("add track | chainid " + chainid + " | title " + title + " | text " + thisClass.simplifyText(text) + " | type custom", true);
31338
31493
  });
31339
31494
 
31340
31495
  // current selection
@@ -31783,6 +31938,9 @@ class AddTrack {
31783
31938
  let out = ''; // 1-based text positions
31784
31939
  let bFoundText = false;
31785
31940
 
31941
+ // replace 'undefined' to space
31942
+ text = text.replace(/undefined/g, ' ');
31943
+
31786
31944
  let i, il, prevEmptyPos = -1;
31787
31945
  for(i = 0, il = text.length; i < il; ++i) {
31788
31946
  if(text[i] == '-' || text[i] == ' ') {
@@ -33810,19 +33968,19 @@ class ApplyCommand {
33810
33968
  let para = p1Array[0];
33811
33969
  let value = parseFloat(p1Array[1]);
33812
33970
 
33813
- if(para == 'linerad') ic.lineRadius = value;
33814
- if(para == 'coilrad') ic.coilWidth = value;
33815
- if(para == 'stickrad') ic.cylinderRadius = value;
33816
- if(para == 'crosslinkrad') ic.crosslinkRadius = value;
33817
- if(para == 'tracerad') ic.traceRadius = value;
33818
- if(para == 'ballscale') ic.dotSphereScale = value;
33819
-
33820
- if(para == 'ribbonthick') ic.ribbonthickness = value;
33821
- if(para == 'proteinwidth') ic.helixSheetWidth = value;
33822
- if(para == 'nucleotidewidth') ic.nucleicAcidWidth = value;
33971
+ if(para == 'linerad' && !isNaN(value)) ic.lineRadius = value;
33972
+ if(para == 'coilrad' && !isNaN(value)) ic.coilWidth = value;
33973
+ if(para == 'stickrad' && !isNaN(value)) ic.cylinderRadius = value;
33974
+ if(para == 'crosslinkrad' && !isNaN(value)) ic.crosslinkRadius = value;
33975
+ if(para == 'tracerad' && !isNaN(value)) ic.traceRadius = value;
33976
+ if(para == 'ballscale' && !isNaN(value)) ic.dotSphereScale = value;
33823
33977
 
33824
- ic.drawCls.draw();
33978
+ if(para == 'ribbonthick' && !isNaN(value)) ic.ribbonthickness = value;
33979
+ if(para == 'proteinwidth' && !isNaN(value)) ic.helixSheetWidth = value;
33980
+ if(para == 'nucleotidewidth' && !isNaN(value)) ic.nucleicAcidWidth = value;
33825
33981
  }
33982
+
33983
+ ic.drawCls.draw();
33826
33984
  }
33827
33985
  else if(commandOri.indexOf('set light') == 0) {
33828
33986
  let paraArray = command.split(' | ');
@@ -33836,9 +33994,9 @@ class ApplyCommand {
33836
33994
  if(para == 'light1') ic.light1 = value;
33837
33995
  if(para == 'light2') ic.light2 = value;
33838
33996
  if(para == 'light3') ic.light3 = value;
33839
-
33840
- ic.drawCls.draw();
33841
33997
  }
33998
+
33999
+ ic.drawCls.draw();
33842
34000
  }
33843
34001
  else if(commandOri.indexOf('set shininess') == 0) {
33844
34002
  let pos = command.lastIndexOf(' ');
@@ -34474,6 +34632,9 @@ class ApplyCommand {
34474
34632
 
34475
34633
  ic.resid2specCls.selectProperty(property, from, to);
34476
34634
  }
34635
+ else if(command.indexOf('select each residue') !== -1) {
34636
+ ic.selectionCls.saveEachResiInSel();
34637
+ }
34477
34638
  else if(command.indexOf('select') == 0 && command.indexOf('name') !== -1) {
34478
34639
  let paraArray = commandOri.split(' | '); // atom names might be case-sensitive
34479
34640
 
@@ -36503,7 +36664,7 @@ class SetSeqAlign {
36503
36664
  if(ic.alnChainsSeq[chainid1]) {
36504
36665
  for(let j = 0, jl = ic.alnChainsSeq[chainid1].length; j < jl; ++j) {
36505
36666
  //add gap before the mapping region
36506
- if(parseInt(ic.alnChainsSeq[chainid1][j].resi) == resi_t) {
36667
+ if(parseInt(ic.alnChainsSeq[chainid1][j].resi) == parseInt(resi_t)) {
36507
36668
  pos_t = j;
36508
36669
  break;
36509
36670
  }
@@ -36686,7 +36847,7 @@ class SetSeqAlign {
36686
36847
  result = this.getTemplatePosFromOriPos(chainid1, start1, end1, bRealign);
36687
36848
  pos1 = result.pos1;
36688
36849
  pos2 = result.pos2;
36689
-
36850
+
36690
36851
  let k = 0;
36691
36852
  for(let j = pos1; j <= pos2; ++j) {
36692
36853
  // inherit the gaps from the template
@@ -36710,7 +36871,7 @@ class SetSeqAlign {
36710
36871
  ++k;
36711
36872
  }
36712
36873
  }
36713
-
36874
+
36714
36875
  prevIndex1 = end1;
36715
36876
  prevIndex2 = end2;
36716
36877
  }
@@ -36730,13 +36891,13 @@ class SetSeqAlign {
36730
36891
  //var chainid_t = ic.chainidArray[0];
36731
36892
 
36732
36893
  // let structureArray = Object.keys(ic.structures);
36733
- let structure1 = chainid_t.substr(0, chainid_t.indexOf('_')); //structureArray[0];
36734
- let structure2 = chainid.substr(0, chainid.indexOf('_')); //structureArray[1];
36894
+ // let structure1 = chainid_t.substr(0, chainid_t.indexOf('_')); //structureArray[0];
36895
+ // let structure2 = chainid.substr(0, chainid.indexOf('_')); //structureArray[1];
36735
36896
 
36736
- if(structure1 == structure2) structure2 += me.htmlCls.postfix;
36897
+ // if(structure1 == structure2) structure2 += me.htmlCls.postfix;
36737
36898
 
36738
- ic.conservedName1 = structure1 + '_cons';
36739
- ic.conservedName2 = structure2 + '_cons';
36899
+ ic.conservedName1 = chainid_t + '_cons';
36900
+ ic.conservedName2 = chainid + '_cons';
36740
36901
 
36741
36902
  ic.consHash1 = {};
36742
36903
  ic.consHash2 = {};
@@ -36763,15 +36924,15 @@ class SetSeqAlign {
36763
36924
  if(!ic.chainsMapping[chainid_t]) ic.chainsMapping[chainid_t] = {};
36764
36925
  if(!ic.chainsMapping[chainid]) ic.chainsMapping[chainid] = {};
36765
36926
 
36766
- for(let i = 0, il = ic.realignResid[structure1].length; i < il; ++i) {
36767
- let resObject1 = ic.realignResid[structure1][i];
36927
+ for(let i = 0, il = ic.realignResid[chainid_t].length; i < il; ++i) {
36928
+ let resObject1 = ic.realignResid[chainid_t][i];
36768
36929
  let pos1 = resObject1.resid.lastIndexOf('_');
36769
36930
  let chainid1 = resObject1.resid.substr(0, pos1);
36770
36931
  let resi1 = resObject1.resid.substr(pos1 + 1);
36771
36932
  resObject1.resi = resi1;
36772
36933
  resObject1.aligned = true;
36773
36934
 
36774
- let resObject2 = ic.realignResid[structure2][i];
36935
+ let resObject2 = ic.realignResid[chainid][i];
36775
36936
  let pos2 = resObject2.resid.lastIndexOf('_');
36776
36937
  let chainid2 = resObject2.resid.substr(0, pos2);
36777
36938
  let resi2 = resObject2.resid.substr(pos2 + 1);
@@ -37029,8 +37190,8 @@ class ParserUtils {
37029
37190
  }
37030
37191
 
37031
37192
  getQtStartEndFromRealignResid(chainid_t, chainid_q) { let ic = this.icn3d; ic.icn3dui;
37032
- let struct_t = chainid_t.substr(0, chainid_t.indexOf('_'));
37033
- let struct_q = chainid_q.substr(0, chainid_q.indexOf('_'));
37193
+ chainid_t.substr(0, chainid_t.indexOf('_'));
37194
+ chainid_q.substr(0, chainid_q.indexOf('_'));
37034
37195
 
37035
37196
  let qt_start_end = [];
37036
37197
 
@@ -37046,11 +37207,11 @@ class ParserUtils {
37046
37207
  resi2pos_q[resi] = i + 1;
37047
37208
  }
37048
37209
 
37049
- for(let i = 0, il = ic.realignResid[struct_t].length; i < il && i < ic.realignResid[struct_q].length; ++i) {
37050
- let resid_t = ic.realignResid[struct_t][i].resid;
37210
+ for(let i = 0, il = ic.realignResid[chainid_t].length; i < il && i < ic.realignResid[chainid_q].length; ++i) {
37211
+ let resid_t = ic.realignResid[chainid_t][i].resid;
37051
37212
  let pos_t = resid_t.lastIndexOf('_');
37052
37213
  let resi_t = parseInt(resid_t.substr(pos_t + 1));
37053
- let resid_q = ic.realignResid[struct_q][i].resid;
37214
+ let resid_q = ic.realignResid[chainid_q][i].resid;
37054
37215
  let pos_q = resid_q.lastIndexOf('_');
37055
37216
  let resi_q = parseInt(resid_q.substr(pos_q + 1));
37056
37217
 
@@ -37994,7 +38155,7 @@ class MmcifParser {
37994
38155
  }
37995
38156
 
37996
38157
  // not all listed residues are considered missing, e.g., PDB ID 4OR2, only the firts four residues are considered missing
37997
- if(!isNaN(resi) &&(prevMissingChain == '' ||(chain != prevMissingChain) ||(chain == prevMissingChain && resi > maxMissingResi)) ) {
38158
+ if(!isNaN(resi) &&(prevMissingChain == '' ||(chain != prevMissingChain) ||(chain == prevMissingChain && parseInt(resi) > maxMissingResi)) ) {
37998
38159
  ic.chainMissingResidueArray[chainNum].push(resObject);
37999
38160
 
38000
38161
  maxMissingResi = resi;
@@ -43341,6 +43502,22 @@ class Selection {
43341
43502
  }
43342
43503
  }
43343
43504
 
43505
+ saveEachResiInSel() { let ic = this.icn3d; ic.icn3dui;
43506
+ ic.selectionCls.saveSelectionPrep();
43507
+
43508
+ ic.selectedResidues = {};
43509
+
43510
+ ic.selectedResidues = ic.firstAtomObjCls.getResiduesFromCalphaAtoms(ic.hAtoms);
43511
+
43512
+ for(let resid in ic.selectedResidues) {
43513
+ let eachResidueHash = {};
43514
+ eachResidueHash[resid] = 1;
43515
+ let name = resid + '_' + ic.selectedResidues[resid];
43516
+
43517
+ this.selectResidueList(eachResidueHash, name, name);
43518
+ }
43519
+ }
43520
+
43344
43521
  removeSelection() { let ic = this.icn3d; ic.icn3dui;
43345
43522
  if(!ic.bAnnotations) {
43346
43523
  ic.hlUpdateCls.removeSeqChainBkgd();
@@ -44627,14 +44804,16 @@ class ApplyDisplay {
44627
44804
  let coilWidth = parseFloat(me.htmlCls.setHtmlCls.getCookie('coilWidth'));
44628
44805
  let cylinderRadius = parseFloat(me.htmlCls.setHtmlCls.getCookie('cylinderRadius'));
44629
44806
  let clRad = me.htmlCls.setHtmlCls.getCookie('crosslinkRadius');
44630
- let crosslinkRadius = (!isNaN(clRad)) ? parseFloat(clRad) : ic.crosslinkRadius;
44807
+ let crosslinkRadius = (clRad && !isNaN(clRad)) ? parseFloat(clRad) : ic.crosslinkRadius;
44631
44808
  let traceRadius = parseFloat(me.htmlCls.setHtmlCls.getCookie('traceRadius'));
44632
44809
  let dotSphereScale = parseFloat(me.htmlCls.setHtmlCls.getCookie('dotSphereScale'));
44633
44810
  let ribbonthickness = parseFloat(me.htmlCls.setHtmlCls.getCookie('ribbonthickness'));
44634
44811
  let helixSheetWidth = parseFloat(me.htmlCls.setHtmlCls.getCookie('helixSheetWidth'));
44635
44812
  let nucleicAcidWidth = parseFloat(me.htmlCls.setHtmlCls.getCookie('nucleicAcidWidth'));
44636
44813
 
44637
- if(ic.lineRadius != lineRadius || ic.coilWidth != coilWidth || ic.cylinderRadius != cylinderRadius || ic.crosslinkRadius != crosslinkRadius || ic.traceRadius != traceRadius || ic.dotSphereScale != dotSphereScale || ic.ribbonthickness != ribbonthickness || ic.helixSheetWidth != helixSheetWidth || ic.nucleicAcidWidth != nucleicAcidWidth) {
44814
+ if(!ic.bSetThicknessOnce && (ic.lineRadius != lineRadius || ic.coilWidth != coilWidth || ic.cylinderRadius != cylinderRadius || ic.crosslinkRadius != crosslinkRadius || ic.traceRadius != traceRadius || ic.dotSphereScale != dotSphereScale || ic.ribbonthickness != ribbonthickness || ic.helixSheetWidth != helixSheetWidth || ic.nucleicAcidWidth != nucleicAcidWidth) ) {
44815
+ ic.bSetThicknessOnce = true;
44816
+
44638
44817
  me.htmlCls.clickMenuCls.setLogCmd('set thickness | linerad ' + lineRadius + ' | coilrad ' + coilWidth + ' | stickrad ' + cylinderRadius + ' | crosslinkrad ' + crosslinkRadius + ' | tracerad ' + traceRadius + ' | ribbonthick ' + ribbonthickness + ' | proteinwidth ' + helixSheetWidth + ' | nucleotidewidth ' + nucleicAcidWidth + ' | ballscale ' + dotSphereScale, true);
44639
44818
  }
44640
44819
 
@@ -54134,8 +54313,19 @@ class SaveFile {
54134
54313
  if(!isNaN(resi) && atom.chain.length > 3 && !isNaN(atom.chain.substr(3)) ) { // such as: chain = NAG2, resi=1 => chain = NAG, resi=2
54135
54314
  resi = resi - 1 + parseInt(atom.chain.substr(3));
54136
54315
  }
54137
- line +=(resi.toString().length <= 4) ? resi.toString().padStart(4, ' ') : resi.toString().substr(0, 4);
54138
- line += ' '.padStart(4, ' ');
54316
+ let resiInt = parseInt(resi);
54317
+ line +=(resiInt.toString().length <= 4) ? resiInt.toString().padStart(4, ' ') : resiInt.toString().substr(0, 4);
54318
+ //line += ' '.padStart(4, ' ');
54319
+ // insert
54320
+ let lastChar = resi.toString().substr(resi.toString().length - 1, 1);
54321
+ if(isNaN(lastChar)) {
54322
+ line += lastChar;
54323
+ }
54324
+ else {
54325
+ line += ' ';
54326
+ }
54327
+ line += ' '.padStart(3, ' ');
54328
+
54139
54329
  line += atom.coord.x.toFixed(3).toString().padStart(8, ' ');
54140
54330
  line += atom.coord.y.toFixed(3).toString().padStart(8, ' ');
54141
54331
  line += atom.coord.z.toFixed(3).toString().padStart(8, ' ');
@@ -55332,15 +55522,19 @@ class ClickMenu {
55332
55522
  thisClass.setLogCmd('defined sets', true);
55333
55523
  //thisClass.setLogCmd('window defined sets', true);
55334
55524
  });
55335
- me.myEventCls.onIds("#" + me.pre + "setOr", "click", function(e) { let ic = me.icn3d; e.preventDefault();
55336
- ic.setOperation = 'or';
55525
+ $(document).on("click", "#" + me.pre + "setOr", function(e) { let ic = me.icn3d;
55526
+ e.stopImmediatePropagation();
55527
+ ic.setOperation = 'or';
55337
55528
  });
55338
- me.myEventCls.onIds("#" + me.pre + "setAnd", "click", function(e) { let ic = me.icn3d; e.preventDefault();
55339
- ic.setOperation = 'and';
55529
+ $(document).on("click", "#" + me.pre + "setAnd", function(e) { let ic = me.icn3d;
55530
+ e.stopImmediatePropagation();
55531
+ ic.setOperation = 'and';
55340
55532
  });
55341
- me.myEventCls.onIds("#" + me.pre + "setNot", "click", function(e) { let ic = me.icn3d; e.preventDefault();
55342
- ic.setOperation = 'not';
55533
+ $(document).on("click", "#" + me.pre + "setNot", function(e) { let ic = me.icn3d;
55534
+ e.stopImmediatePropagation();
55535
+ ic.setOperation = 'not';
55343
55536
  });
55537
+
55344
55538
  // },
55345
55539
  // clkMn2_pkNo: function() {
55346
55540
  me.myEventCls.onIds("#" + me.pre + "mn2_pkNo", "click", function(e) { let ic = me.icn3d; e.preventDefault();
@@ -57700,6 +57894,7 @@ class SetMenu {
57700
57894
 
57701
57895
  html += me.htmlCls.setHtmlCls.getLink('mn2_saveselection', 'Save Selection', 1, 1);
57702
57896
  html += me.htmlCls.setHtmlCls.getLink('clearall', 'Clear Selection', undefined, 1);
57897
+ html += me.htmlCls.setHtmlCls.getLink('mn2_saveresidue', 'Save Res. in Sel.', 1, 1);
57703
57898
 
57704
57899
  html += me.htmlCls.setHtmlCls.getMenuSep();
57705
57900
 
@@ -58099,7 +58294,7 @@ class SetMenu {
58099
58294
  html += "<ul>";
58100
58295
  html += me.htmlCls.setHtmlCls.getLink('mn5_elecmap2fofc', '2Fo-Fc Map', undefined, 2);
58101
58296
  html += me.htmlCls.setHtmlCls.getLink('mn5_elecmapfofc', 'Fo-Fc Map', undefined, 2);
58102
- html += me.htmlCls.setHtmlCls.getLinkWrapper('mn5_elecmapNo', 'Remove Map', 'mapWrapper2', undefined, undefined, 2);
58297
+ html += me.htmlCls.setHtmlCls.getLinkWrapper('mn5_elecmapNo', 'Remove Map', 'mapWrapper2', undefined, 2);
58103
58298
 
58104
58299
  html += "</ul>";
58105
58300
  html += "</li>";
@@ -59770,7 +59965,7 @@ class SetDialog {
59770
59965
 
59771
59966
  html += me.htmlCls.divStr + "dl_mutation' class='" + dialogClass + "'>";
59772
59967
  html += "<div style='width:500px'>";
59773
- html += 'Please specify the mutations with a comma separated mutation list. Each mutation can be specified as "[PDB ID or AlphaFold UniProt ID]_[Chain ID]_[Residue Number]_[One Letter Mutatnt 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/><br/>';
59968
+ 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 ID]_[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/><br/>';
59774
59969
  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/>";
59775
59970
 
59776
59971
  // html += "<b>Data Source</b>: <select id='" + me.pre + "idsource'>";
@@ -60877,8 +61072,8 @@ class Events {
60877
61072
  }
60878
61073
 
60879
61074
  setPredefinedMenu(id) { let me = this.icn3dui, ic = me.icn3d;
60880
- if(Object.keys(ic.structures).length < 2) {
60881
- var aaa = 1; //alert("At least two structures are required for alignment...");
61075
+ if(Object.keys(ic.chains).length < 2) {
61076
+ var aaa = 1; //alert("At least two chains are required for alignment...");
60882
61077
  return;
60883
61078
  }
60884
61079
  if(ic.bSetChainsAdvancedMenu === undefined || !ic.bSetChainsAdvancedMenu) {
@@ -60898,14 +61093,14 @@ class Events {
60898
61093
  launchMmdb(ids, bBiounit, hostUrl) { let me = this.icn3dui; me.icn3d;
60899
61094
  let flag = bBiounit ? '1' : '0';
60900
61095
 
60901
- ids = ids.replace(/,/g, ' ').replace(/\s+/g, ' ').trim();
61096
+ ids = ids.replace(/,/g, ' ').replace(/\s+/g, ',').trim();
60902
61097
 
60903
61098
  if(!ids) {
60904
61099
  var aaa = 1; //alert("Please enter a list of PDB IDs or AlphaFold UniProt IDs...");
60905
61100
  return;
60906
61101
  }
60907
61102
 
60908
- let idArray = ids.split(' ');
61103
+ let idArray = ids.split(',');
60909
61104
  if(idArray.length == 1 && (idArray[0].length == 4 || !isNaN(idArray[0])) ) {
60910
61105
  me.htmlCls.clickMenuCls.setLogCmd("load mmdb" + flag + " " + ids, false);
60911
61106
  window.open(hostUrl + '?mmdbid=' + ids + '&bu=' + flag, '_blank');
@@ -61065,8 +61260,8 @@ class Events {
61065
61260
  });
61066
61261
 
61067
61262
  me.myEventCls.onIds("#" + me.pre + "realignSelection", "click", function(e) { let ic = me.icn3d;
61068
- if(Object.keys(ic.structures).length < 2) {
61069
- var aaa = 1; //alert("At least two structures are required for alignment...");
61263
+ if(Object.keys(ic.chains).length < 2) {
61264
+ var aaa = 1; //alert("At least two chains are required for alignment...");
61070
61265
  return;
61071
61266
  }
61072
61267
 
@@ -63042,6 +63237,16 @@ class Events {
63042
63237
  //var description = $("#" + me.pre + "seq_command_desc2").val();
63043
63238
  ic.selectionCls.saveSelection(name, name);
63044
63239
  });
63240
+
63241
+ me.myEventCls.onIds("#" + me.pre + "mn2_saveresidue", "click", function(e) { let ic = me.icn3d;
63242
+ e.stopImmediatePropagation();
63243
+ if(!me.cfg.notebook) dialog.dialog( "close" );
63244
+
63245
+ ic.selectionCls.saveEachResiInSel();
63246
+
63247
+ me.htmlCls.clickMenuCls.setLogCmd('select each residue', true);
63248
+ });
63249
+
63045
63250
  // },
63046
63251
  // clickAlignSeqSaveSelection: function() {
63047
63252
  me.myEventCls.onIds("#" + me.pre + "alignseq_saveselection", "click", function(e) { let ic = me.icn3d;
@@ -64850,6 +65055,9 @@ class Alternate {
64850
65055
  else if(colorType == 'normalized hydrophobic') {
64851
65056
  colorLabel = 'Normalized Hydrophobicity';
64852
65057
  }
65058
+ else if(colorType == 'hydrophobic') {
65059
+ colorLabel = 'Hydrophobicity';
65060
+ }
64853
65061
 
64854
65062
  let html = "Color by <b>" + colorLabel + "</b><br><br>";
64855
65063
 
@@ -64871,35 +65079,55 @@ class Alternate {
64871
65079
  html += this.getColorLegendForCharge(ic.hAtoms);
64872
65080
  }
64873
65081
  //else if (ic.legendClick == 4){
64874
- else if (colorType == 'normalized hydrophobic') {
64875
- let resSet = this.getRes2color(ic.hAtoms);
65082
+ else if (colorType == 'normalized hydrophobic' || colorType == 'hydrophobic') {
65083
+ let bOriResn = true;
65084
+ let resSet = this.getRes2color(ic.hAtoms, bOriResn);
64876
65085
 
64877
65086
  // polar first - most to least
64878
65087
  // create hydrophobic table
64879
65088
  var items = Object.keys(resSet).map(
64880
- (key) => { return [key, Object.keys(resSet[key])[0]]
65089
+ //(key) => { return [key, Object.keys(resSet[key])[0]]
65090
+ (key) => { return [key, me.parasCls.hydrophobicValues[key]]
64881
65091
  });
64882
65092
 
65093
+ // items.sort(
65094
+ // (first, second) => {
65095
+ // return ((parseInt(second[1].substring(2,4), 16) - parseInt(second[1].substring(4,6), 16)) - (parseInt(first[1].substring(2,4), 16) - parseInt(first[1].substring(4,6), 16)));
65096
+ // }
65097
+ // );
65098
+
64883
65099
  items.sort(
64884
65100
  (first, second) => {
64885
- return ((parseInt(second[1].substring(2,4), 16) - parseInt(second[1].substring(4,6), 16)) - (parseInt(first[1].substring(2,4), 16) - parseInt(first[1].substring(4,6), 16))) }
65101
+ return parseFloat(first[1]) - parseFloat(second[1]);
65102
+ }
64886
65103
  );
64887
65104
 
64888
65105
  var keys = items.map(
64889
- (e) => { return [e[0], e[1]]
65106
+ //(e) => { return [e[0], e[1]]
65107
+ (e) => { return [e[0], Object.keys(resSet[e[0]])[0]]
64890
65108
  });
64891
65109
 
64892
65110
  html += "<div>";
64893
65111
 
64894
- html += "Dark green (W, F, Y, L, I, C, M): Hydrophobic<br>";
64895
- html += "Light green (G, V, S, T, A, N, P, Q): Polar<br>";
64896
- html += "Grey: Charged, not hydrophobic<br><br>";
65112
+ if(colorType == 'normalized hydrophobic') {
65113
+ html += "Dark green (W, F, Y, L, I, C, M): Hydrophobic<br>";
65114
+ html += "Light green (G, V, S, T, A, N, P, Q): Polar<br>";
65115
+ html += "Grey: Charged, not hydrophobic<br><br>";
65116
+ }
65117
+ else {
65118
+ html += "Green (W, F, Y, L, I, C, M): Hydrophobic<br>";
65119
+ html += "Yellow (G, V, S, T, A, N, P, Q): Polar<br>";
65120
+ html += "Red: Negatively Charged<br>";
65121
+ html += "Blue: Positively Charged<br><br>";
65122
+ }
64897
65123
 
64898
65124
  let cnt = 0;
64899
65125
  for (let key of keys) {
65126
+ if(!me.parasCls.residueAbbrev[key[0]]) continue;
65127
+
64900
65128
  html += "<div style='display:inline-block; width:100px'>";
64901
65129
  html += "<div style='width: 10px; height: 10px; background-color:#" + key[1] + "; border: 0px;display:inline-block;' ></div> ";
64902
- html += key[0] + "</div>";
65130
+ html += me.parasCls.residueAbbrev[key[0]] + "</div>";
64903
65131
 
64904
65132
  if(cnt % 4 == 3) html += "<br>";
64905
65133
 
@@ -64963,31 +65191,15 @@ class Alternate {
64963
65191
  return html;
64964
65192
  }
64965
65193
 
64966
- getRes2color(atomHash) { let ic = this.icn3d; ic.icn3dui;
65194
+ getRes2color(atomHash, bOriResn) { let ic = this.icn3d, me = ic.icn3dui;
64967
65195
  let resSet = {};
64968
65196
 
64969
- const residueAbbrev = {
64970
- ALA: "A (Ala)", ARG: "R (Arg)", ASN: "N (Asn)",
64971
- ASP: "D (Asp)", CYS: "C (Cys)", GLN: "Q (Gln)",
64972
- GLU: "E (Glu)", GLY: "G (Gly)", HIS: "H (His)",
64973
- ILE: "I (Ile)", LEU: "L (Leu)", LYS: "K (Lys)",
64974
- MET: "M (Met)", PHE: "F (Phe)", PRO: "P (Pro)",
64975
- SER: "S (Ser)", THR: "T (Thr)", TRP: "W (Trp)",
64976
- TYR: "Y (Tyr)", VAL: "V (Val)",
64977
- //ASX: "B (Asx)", GLX: "Z (Glx)",
64978
- ASX: "X (Asx)", GLX: "X (Glx)",
64979
- 'G': "Guanine", 'A': "Adenine",
64980
- 'T': "Thymine", 'C': "Cytosine", 'U': "Uracil",
64981
- 'DG': "deoxy-Guanine", 'DA': "deoxy-Adenine", 'DT': "deoxy-Thymine",
64982
- 'DC': "deoxy-Cytosine", 'DU': 'deoxy-Uracil'
64983
- };
64984
-
64985
65197
  let residueHash = ic.firstAtomObjCls.getResiduesFromAtoms(atomHash);
64986
65198
  for(let resid in residueHash){
64987
65199
  let atomHash = ic.residues[resid];
64988
65200
 
64989
65201
  let atom = ic.firstAtomObjCls.getFirstAtomObj(atomHash);
64990
- let resiLabel = residueAbbrev[atom.resn];
65202
+ let resiLabel = (bOriResn) ? atom.resn : me.parasCls.residueAbbrev[atom.resn];
64991
65203
  let temp = (atom === undefined || atom.color === undefined || atom.color.getHexString().toUpperCase() === 'FFFFFF') ? 'DDDDDD' : atom.color.getHexString();
64992
65204
 
64993
65205
  if (resiLabel != undefined){
@@ -67696,7 +67908,6 @@ class Vastplus {
67696
67908
  let subdomains = result.subdomains;
67697
67909
 
67698
67910
  let domainAtomsArray = [];
67699
-
67700
67911
  if(subdomains.length <= 1) {
67701
67912
  domainAtomsArray.push(ic.chains[chainid]);
67702
67913
 
@@ -69239,6 +69450,8 @@ class iCn3D {
69239
69450
  this.midValue = 50;
69240
69451
  this.endValue = 100;
69241
69452
 
69453
+ this.crosslinkRadius = 0.4;
69454
+
69242
69455
  // classes
69243
69456
  this.sceneCls = new Scene(this);
69244
69457
  this.cameraCls = new Camera(this);
@@ -69585,7 +69798,7 @@ class iCn3DUI {
69585
69798
  //even when multiple iCn3D viewers are shown together.
69586
69799
  this.pre = this.cfg.divid + "_";
69587
69800
 
69588
- this.REVISION = '3.19.0';
69801
+ this.REVISION = '3.19.1';
69589
69802
 
69590
69803
  // In nodejs, iCn3D defines "window = {navigator: {}}"
69591
69804
  this.bNode = (Object.keys(window).length < 2) ? true : false;