File:Dna-SNP.svg
Original file (SVG file, nominally 520 × 333 pixels, file size: 1.15 MB)
This file is from Wikimedia Commons and may be used by other projects. The description on its file description page there is shown below.
Summary
| DescriptionDna-SNP.svg |
English: A Single Nucleotide Polymorphism is a change of a nucleotide at a single base-pair location on DNA. Created using OpenSCAD v2021.01 and Inkscape v1.0.2. |
| Date | |
| Source | Own work |
| Author | David Eccles (Gringer) |
Construction process
This file was derived from a 3D model of DNA, converted to SVG and coloured using David Eccles' STL2SVG script:
type=orig; ~/scripts/stl2svg.pl ./DNA_linear_complete_helix1.stl:330 ./DNA_linear_complete_helix2.stl:200 ./DNA_linear_complete_${type}_A.stl:140 ./DNA_linear_complete_${type}_C.stl:250 ./DNA_linear_complete_${type}_G.stl:90 ./DNA_linear_complete_${type}_T.stl:30 > out_${type}.svg
type=mut; ~/scripts/stl2svg.pl ./DNA_linear_complete_helix1.stl:330 ./DNA_linear_complete_helix2.stl:200 ./DNA_linear_complete_${type}_A.stl:140 ./DNA_linear_complete_${type}_C.stl:250 ./DNA_linear_complete_${type}_G.stl:90 ./DNA_linear_complete_${type}_T.stl:30 > out_${type}.svg
The DNA models were then combined and annotated using Inkscape. The DNA backbone for the model is a pentagon extruded over a sine wave using David Eccles' guided path extrude script. The model source file (in OpenSCAD format) is shown below:
use <guided_extrude.scad>;
hl = 100; // helix length
hp = 33.2; // helix pitch [in angstroms]
hr = 10; // helix radius [in angstroms]
bbr = 1.5; // backbone radius
loops = hl / hp;
// random bases
//bases = rands(0, 4, ceil(360 * loops / 34.3),1);
// *GRINGENE* -- TAA GGN MGN ATH AAY GGN GAR AAY GAR TGA
// -- TAA GGC AGG ATC AAC GGC GAG AAC GAG TGA
// A = 0; G = 1; C = 2; T = 3
// [different from my usual order,
// to simplify the 3D model logic]
bases = [3,3,3, 1,1,2, 0,1,1, 0,3,2, 0,0,2,
1,1,2, 1,0,1, 0,0,2, 1,0,1, 3,1,0];
bAng = atan2(sin(120) - sin(0), cos(120) - cos(0));
drawMode = "all";
module lineTo(x1, x2){
hull(){
translate(x1) sphere(r=0.25, $fn=5);
translate(x2) sphere(r=0.25, $fn=5);
}
}
backbone_profile = [for(th = [0:72:359]) [bbr*cos(th),
bbr*sin(th)*1]];
inc = floor($t * 30);
thf = ($t * 30) - inc;
h1limit = (360 * loops);
h1jump = (360 * loops);
helix_1 = [for(th = [(thf*34.3):(34.3/2):h1jump])
[hr * cos(th), hr * sin(th), hl * th / (360 * loops)]];
helix_2 = [for(th = [120:(34.3/2):(360 * loops+120)])
[hr * cos(th), hr * sin(th), hl * (th-120) / (360 * loops)]];
module purine(){
linear_extrude(height=0.75, center=true){
// average hydrogen bond length in water: 1.97 A
// https://en.wikipedia.org/wiki/Hydrogen_bond#Structural_details
translate([-0.985,0])
// scale: average of C-C and C=C bond length
scale(1.435) translate([-2,0]) rotate(12) rotate(18){
rotate(-30) translate([1,0]) circle(r=1, $fn=6);
color("blue")
rotate(36) translate([-1 / (2*sin(36)),0])
circle(r=1 / (2*sin(36)), $fn=5);
}
}
}
module pyrimidine(){
linear_extrude(height=0.75, center=true){
// average hydrogen bond length in water: 1.97 A
// https://en.wikipedia.org/wiki/Hydrogen_bond#Structural_details
translate([-0.985,0])
scale(1.435) translate([-2, 0]) translate([1,0])
circle(r=1, $fn=6);
}
}
$vpt = [0, 0, 0];
//$vpr = [310, 105, 10];
$vpr = [0, 0, 0];
rotate([310, 105, 130]) translate([0,0,-hl/2]) {
if(drawMode == "all" || drawMode == "helix1") color("lightblue")
mapExtrude("vertCylinder", backbone_profile, helix_1);
if(drawMode == "all" || drawMode == "helix2") color("pink")
mapExtrude("vertCylinder", backbone_profile, helix_2);
for(thb = [inc:(360 * loops / 34.3 + inc)]) {
thi = thb-inc;
th = (thi-thf) * 34.3;
thisBase = bases[floor(thb%30)];
doPur = (thisBase < 2);
// base bond has a -1.2° angle;
// not quite sure how to implement that
baseFrac = (doPur ? 0.55 : 0.45);
baseFInv = 1 - baseFrac;
translate([0,0,hl * th / (360 * loops)]) rotate([-1.2,0,0]){
if(drawMode == "all" || drawMode == "helix2") color("pink")
lineTo([hr * cos(th)*(baseFrac-0.15) +
hr * cos(th+120) * (baseFrac+0.15),
hr * sin(th)*(baseFrac-0.15) +
hr * sin(th+120) * (baseFrac+0.15)],
[hr * cos(th+120), hr * sin(th+120)]);
if(th < (h1jump))
if(drawMode == "all" || drawMode == "helix1") color("lightblue")
lineTo([hr * cos(th), hr * sin(th)],
[hr * cos(th)*(baseFrac+0.15) +
hr * cos(th+120) * (baseFrac-0.15),
hr * sin(th)*(baseFrac+0.15) +
hr * sin(th+120) * (baseFrac-0.15)]);
if(drawMode == "all" ||
(drawMode == "A" && thisBase == 0) ||
(drawMode == "G" && thisBase == 1) ||
(drawMode == "C" && thisBase == 2) ||
(drawMode == "T" && thisBase == 3)
)
color((thisBase < 1) ? "green" :
(thisBase < 2) ? "gold" :
(thisBase < 3) ? "blue" :
"red")
translate([hr * cos(th)*baseFrac + hr * cos(th+120) * baseFInv,
hr * sin(th)*baseFrac + hr * sin(th+120) * baseFInv])
rotate(180 + bAng + th) if(doPur) {
purine(); } else { pyrimidine(); };
if(drawMode == "all" ||
(drawMode == "A" && thisBase == 3) ||
(drawMode == "G" && thisBase == 2) ||
(drawMode == "C" && thisBase == 1) ||
(drawMode == "T" && thisBase == 0)
)
if(th < (h1jump))
color((thisBase < 1) ? "red" :
(thisBase < 2) ? "blue" :
(thisBase < 3) ? "gold" :
"green")
translate([hr * cos(th)*baseFrac + hr * cos(th+120) * baseFInv,
hr * sin(th)*baseFrac + hr * sin(th+120) * baseFInv])
rotate(bAng+th) if(doPur) {
pyrimidine(); } else { purine(); };
}
}
if(drawMode == "all" || drawMode == "helix1") color("lightblue") {
translate(helix_1[len(helix_1)-1]) sphere(r=bbr, $fn=5);
translate(helix_1[0]) sphere(r=bbr, $fn=5);
}
if(drawMode == "all" || drawMode == "helix2") color("pink") {
translate(helix_2[0]) sphere(r=bbr, $fn=5);
translate(helix_2[len(helix_2)-1]) sphere(r=bbr, $fn=5);
}
}
Licensing
| Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation Licence, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the licence is included in the section entitled GNU Free Documentation Licence.http://www.gnu.org/copyleft/fdl.htmlGFDLGNU Free Documentation Licensetruetrue |
- You are free:
- to share – to copy, distribute and transmit the work
- to remix – to adapt the work
- Under the following conditions:
- attribution – You must give appropriate credit, provide a link to the licence, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.
Captions
Items portrayed in this file
depicts
18 December 2014
image/svg+xml
1,203,312 byte
333 pixel
520 pixel
80e2618911371d2da8252d8edc5d36cf8c929c94
File history
Click on a date/time to view the file as it appeared at that time.
| Date/Time | Thumbnail | Dimensions | User | Comment | |
|---|---|---|---|---|---|
| current | 18:37, 8 May 2021 | 520 × 333 (1.15 MB) | wikimediacommons>Gringer | Update to slightly more accurate 3D model, showing base rings |
File usage
The following page uses this file:
Metadata
This file contains additional information, probably added from the digital camera or scanner used to create or digitise it.
If the file has been modified from its original state, some details may not fully reflect the modified file.
| Width | 520 |
|---|---|
| Height | 332.93881 |