Fix for Issue #743

The cartoon code was assuming DNA backbone atoms would always have a
certain order.  Now can deal with a partial residue at start.
This commit is contained in:
David Koes
2024-01-13 14:47:27 -05:00
parent b03407b160
commit e71629ba97
10 changed files with 2264 additions and 53 deletions

View File

@@ -1,3 +1,2 @@
{
}

55
package-lock.json generated
View File

@@ -125,15 +125,6 @@
"url": "https://opencollective.com/babel"
}
},
"node_modules/@babel/core/node_modules/semver": {
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true,
"bin": {
"semver": "bin/semver.js"
}
},
"node_modules/@babel/eslint-parser": {
"version": "7.22.15",
"resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.22.15.tgz",
@@ -152,15 +143,6 @@
"eslint": "^7.5.0 || ^8.0.0"
}
},
"node_modules/@babel/eslint-parser/node_modules/semver": {
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true,
"bin": {
"semver": "bin/semver.js"
}
},
"node_modules/@babel/generator": {
"version": "7.23.0",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz",
@@ -204,15 +186,6 @@
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-compilation-targets/node_modules/semver": {
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true,
"bin": {
"semver": "bin/semver.js"
}
},
"node_modules/@babel/helper-create-class-features-plugin": {
"version": "7.22.15",
"resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz",
@@ -236,15 +209,6 @@
"@babel/core": "^7.0.0"
}
},
"node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": {
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true,
"bin": {
"semver": "bin/semver.js"
}
},
"node_modules/@babel/helper-environment-visitor": {
"version": "7.22.20",
"resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz",
@@ -3390,7 +3354,7 @@
},
"node_modules/clean-jsdoc-theme": {
"version": "4.2.14",
"resolved": "git+ssh://git@github.com/3dmol/clean-jsdoc-theme.git#17def80a9698f7c826707f86a3bce88649236fc4",
"resolved": "git+ssh://git@github.com/3dmol/clean-jsdoc-theme.git#d925b4f89ff6d1bf3038dad04bfc202d9d6c0ec0",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -8227,7 +8191,9 @@
"license": "MIT"
},
"node_modules/nanoid": {
"version": "3.3.6",
"version": "3.3.7",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
"integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
"dev": true,
"funding": [
{
@@ -8235,7 +8201,6 @@
"url": "https://github.com/sponsors/ai"
}
],
"license": "MIT",
"bin": {
"nanoid": "bin/nanoid.cjs"
},
@@ -8790,7 +8755,9 @@
}
},
"node_modules/postcss": {
"version": "8.4.24",
"version": "8.4.33",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz",
"integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==",
"dev": true,
"funding": [
{
@@ -8806,9 +8773,8 @@
"url": "https://github.com/sponsors/ai"
}
],
"license": "MIT",
"dependencies": {
"nanoid": "^3.3.6",
"nanoid": "^3.3.7",
"picocolors": "^1.0.0",
"source-map-js": "^1.0.2"
},
@@ -9693,9 +9659,10 @@
"license": "MIT"
},
"node_modules/semver": {
"version": "6.3.0",
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
}

View File

@@ -953,7 +953,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.6"
"version": "3.10.12"
}
},
"nbformat": 4,

View File

@@ -295,10 +295,27 @@ export namespace GLDraw {
* @param {CAP} toCap = 0 for none, 1 for flat, 2 for round
*
* */
export function drawCylinder(geo: Geometry, from: any, to: any, radius: number, color: Color | Color[], fromCap:CAP = 0, toCap:CAP = 0) {
export function drawCylinder(geo: Geometry, from: any, to: any, radius: number, color: Color | Color[], fromCap:CAP|string = 0, toCap:CAP|string = 0) {
if (!from || !to)
return;
let getcap = function(c: CAP|string): CAP {
if(typeof c === "string") {
let s = <string>c;
if(s.toLowerCase() == 'flat') {
return CAP.FLAT;
} else if(s.toLowerCase() == 'round') {
return CAP.ROUND;
} else {
return CAP.NONE;
}
} else {
return <CAP>c;
}
}
fromCap = getcap(fromCap);
toCap = getcap(toCap);
// vertices
var drawcaps = toCap || fromCap;
color = color || ({ r: 0, g: 0, b: 0 } as Color);

View File

@@ -1649,9 +1649,9 @@ export interface CylinderSpec extends ShapeSpec {
/** radius */
radius?: number;
/** Place a cap at the start (none, flat or round) */
fromCap?: CAP;
fromCap?: CAP | string;
/** Place a cap at the end (none, flat or round) */
toCap?: CAP;
toCap?: CAP | string;
/** Make the cylinder dashed. */
dashed?: boolean;
/** Length of dashes (default 0.25) */

View File

@@ -1156,7 +1156,7 @@ export function drawCartoon(group, atomList, gradientrange, quality = 10) {
// reached next residue (potentially the first residue)
if (curr === undefined || curr.rescode != next.rescode || curr.resi != next.resi) {
if (baseEndPt) // draw last NA residue's base
if (baseEndPt && curr != undefined) // draw last NA residue's base
{
// start the cylinder at the midpoint between
// consecutive backbone atoms
@@ -1201,11 +1201,11 @@ export function drawCartoon(group, atomList, gradientrange, quality = 10) {
};
}
// atoms used to orient the backbone strand
else if (isAlphaCarbon(curr) && next.atom === "O" ||
else if (curr != undefined && (isAlphaCarbon(curr) && next.atom === "O" ||
inNucleicAcid && curr.atom === "P" &&
(next.atom === "OP2" || next.atom === "O2P") ||
inNucleicAcid && curr.atom.indexOf("O5") == 0 &&
next.atom.indexOf("C5") == 0) {
next.atom.indexOf("C5") == 0)) {
orientPt = new Vector3(next.x, next.y, next.z);
orientPt.resi = next.resi;
if (next.atom === "OP2" || next.atom === "O2P") // for NA 3'

View File

@@ -0,0 +1,5 @@
/* @div
<div class='viewer_3Dmoljs' style="width: 400px; height: 400px;" data-backgroundColor="white" data-href="../test_structs/dnamodel.pdb" data-style='{"cartoon":{"color":"spectrum"}}'></div>
*/

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

File diff suppressed because it is too large Load Diff