{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Generating Geometries for Geant4\n",
"\n",
"This notebook contains code blocks used to generate sample\n",
"geometries used in Geant4 simulations."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import sys\n",
"from pathlib import Path\n",
"\n",
"try:\n",
" from fractaldna.dna_models import dnachain\n",
"except (ImportError, ModuleNotFoundError):\n",
" sys.path.append(str(Path.cwd().parent.parent.parent))\n",
" from fractaldna.dna_models import dnachain\n",
"\n",
"import numpy as np\n",
"from mayavi import mlab\n",
"\n",
"mlab.options.offscreen = True"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Single DNA Segments\n",
"\n",
"### Straight and Turned Segments for a 50nm box."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"%%capture\n",
"bp_separation = dnachain.BP_SEPARATION # 3.32Å\n",
"side_length_nm = 50 # nm\n",
"num_basepairs_straight = int(side_length_nm / (0.1 * bp_separation))\n",
"num_basepairs_turned = int((side_length_nm * np.pi / 4.0) / (0.1 * bp_separation))\n",
"\n",
"chain_straight = dnachain.DNAChain(\n",
" \"\".join(np.random.choice([\"G\", \"A\", \"T\", \"C\"], num_basepairs_straight))\n",
")\n",
"\n",
"chain_turned = dnachain.TurnedDNAChain(\n",
" \"\".join(np.random.choice([\"G\", \"A\", \"T\", \"C\"], num_basepairs_turned))\n",
")\n",
"\n",
"chain_turned_twisted = dnachain.TurnedTwistedDNAChain(\n",
" \"\".join(np.random.choice([\"G\", \"A\", \"T\", \"C\"], num_basepairs_turned))\n",
")\n",
"\n",
"chain_straight.to_frame().to_csv(\"results/50nm_straight.csv\", sep=\" \", index=False)\n",
"chain_turned.to_frame().to_csv(\"results/50nm_turn.csv\", sep=\" \", index=False)\n",
"chain_turned_twisted.to_frame().to_csv(\n",
" \"results/50nm_turn_twist.csv\", sep=\" \", index=False\n",
")\n",
"\n",
"chain_straight.to_plot().savefig(\"results/50nm_straight.png\", sep=\" \", index=False)\n",
"chain_turned.to_plot().savefig(\"results/50nm_turn.png\", sep=\" \", index=False)\n",
"chain_turned_twisted.to_plot().savefig(\n",
" \"results/50nm_turn_twist.png\", sep=\" \", index=False\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"
"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"### Multi Strand straight and turned segments"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"%%capture\n",
"bp_separation = dnachain.BP_SEPARATION # 3.32Å\n",
"side_length_nm = 50 # nm\n",
"num_basepairs_straight = int(side_length_nm / (0.1 * bp_separation))\n",
"num_basepairs_turned = int((side_length_nm * np.pi / 4.0) / (0.1 * bp_separation))\n",
"strand_separation = 100 # angstroms\n",
"\n",
"chain4_straight = dnachain.FourStrandDNAChain(\n",
" \"\".join(np.random.choice([\"G\", \"A\", \"T\", \"C\"], num_basepairs_straight)),\n",
" strand_separation,\n",
")\n",
"\n",
"chain4_turned = dnachain.FourStrandTurnedDNAChain(\n",
" \"\".join(np.random.choice([\"G\", \"A\", \"T\", \"C\"], num_basepairs_turned)),\n",
" strand_separation,\n",
")\n",
"\n",
"chain4_turned_twisted = dnachain.FourStrandTurnedDNAChain(\n",
" \"\".join(np.random.choice([\"G\", \"A\", \"T\", \"C\"], num_basepairs_turned)),\n",
" strand_separation,\n",
" twist=True,\n",
")\n",
"\n",
"chain4_straight.to_frame().to_csv(\"results/50nm_4_straight.csv\", sep=\" \", index=False)\n",
"chain4_turned.to_frame().to_csv(\"results/50nm_4_turn.csv\", sep=\" \", index=False)\n",
"chain4_turned_twisted.to_frame().to_csv(\n",
" \"results/50nm_4_turn_twist.csv\", sep=\" \", index=False\n",
")\n",
"\n",
"chain4_straight.to_plot().savefig(\"results/50nm_4_straight.png\")\n",
"chain4_turned.to_plot().savefig(\"results/50nm_4_turn.png\")\n",
"chain4_turned_twisted.to_plot().savefig(\"results/50nm_4_turn_twist.png\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"
"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"%%capture\n",
"bp_separation = dnachain.BP_SEPARATION # 3.32Å\n",
"side_length_nm = 50 # nm\n",
"num_basepairs_straight = int(side_length_nm / (0.1 * bp_separation))\n",
"num_basepairs_turned = int((side_length_nm * np.pi / 4.0) / (0.1 * bp_separation))\n",
"strand_separation_1 = 100 # angstroms\n",
"strand_separation_2 = 250 # angstroms\n",
"\n",
"chain8_straight = dnachain.EightStrandDNAChain(\n",
" \"\".join(np.random.choice([\"G\", \"A\", \"T\", \"C\"], num_basepairs_straight)),\n",
" strand_separation_1,\n",
" strand_separation_2,\n",
" turn=False,\n",
" twist=False,\n",
")\n",
"\n",
"chain8_turned = dnachain.EightStrandDNAChain(\n",
" \"\".join(np.random.choice([\"G\", \"A\", \"T\", \"C\"], num_basepairs_turned)),\n",
" strand_separation_1,\n",
" strand_separation_2,\n",
" turn=True,\n",
" twist=False,\n",
")\n",
"\n",
"chain8_turned_twisted = dnachain.EightStrandDNAChain(\n",
" \"\".join(np.random.choice([\"G\", \"A\", \"T\", \"C\"], num_basepairs_turned)),\n",
" strand_separation_1,\n",
" strand_separation_2,\n",
" turn=True,\n",
" twist=True,\n",
")\n",
"\n",
"chain8_straight.to_frame().to_csv(\n",
" \"results/50nm_8_straight.csv\",\n",
" sep=\" \",\n",
" index=False,\n",
")\n",
"chain8_turned.to_frame().to_csv(\"results/50nm_8_turn.csv\", sep=\" \", index=False)\n",
"chain8_turned_twisted.to_frame().to_csv(\n",
" \"results/50nm_8_turn_twist.csv\", sep=\" \", index=False\n",
")\n",
"\n",
"chain8_straight.to_plot().savefig(\"results/50nm_8_straight.png\")\n",
"chain8_turned.to_plot().savefig(\"results/50nm_8_turn.png\")\n",
"chain8_turned_twisted.to_plot().savefig(\"results/50nm_8_turn_twist.png\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"
"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"## Making Solenoidal DNA\n",
"\n",
"### Single Solenoids"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"side_length = 750 # angstrom\n",
"radius_solenoid = 100 # angstrom\n",
"nhistones = 38 # histones\n",
"\n",
"solenoid_straight = dnachain.Solenoid(\n",
" voxelheight=side_length, radius=radius_solenoid, nhistones=nhistones\n",
")\n",
"solenoid_turned = dnachain.TurnedSolenoid(\n",
" voxelheight=side_length, radius=radius_solenoid, nhistones=nhistones\n",
")\n",
"solenoid_turned_twisted = dnachain.TurnedSolenoid(\n",
" voxelheight=side_length, radius=radius_solenoid, nhistones=nhistones, twist=True\n",
")\n",
"\n",
"# centre around (x,y,z)=(0,0,0)\n",
"solenoid_straight.translate([0, 0, -side_length / 2.0])\n",
"solenoid_turned.translate([0, 0, -side_length / 2.0])\n",
"solenoid_turned_twisted.translate([0, 0, -side_length / 2.0])\n",
"\n",
"solenoid_straight.to_frame().to_csv(\n",
" \"results/solenoid_straight.csv\", sep=\" \", index=False\n",
")\n",
"solenoid_turned.to_frame().to_csv(\"results/solenoid_turned.csv\", sep=\" \", index=False)\n",
"solenoid_turned_twisted.to_frame().to_csv(\n",
" \"results/solenoid_turned_twisted.csv\", sep=\" \", index=False\n",
")\n",
"\n",
"plot = solenoid_straight.to_line_plot()\n",
"plot.scene.save_jpg(\"results/solenoid_straight.jpg\")\n",
"\n",
"plot = solenoid_turned.to_line_plot()\n",
"distance = 1500\n",
"mlab.view(azimuth=180, elevation=0, distance=distance, focalpoint=[0, 0, 0])\n",
"mlab.move(up=-distance, forward=distance)\n",
"mlab.pitch(90)\n",
"plot.scene.save_jpg(\"results/solenoid_turned.jpg\")\n",
"\n",
"plot = solenoid_turned_twisted.to_line_plot()\n",
"mlab.view(azimuth=180, elevation=0, distance=distance, focalpoint=[0, 0, 0])\n",
"mlab.move(up=-distance, forward=distance)\n",
"mlab.pitch(90)\n",
"plot.scene.save_jpg(\"results/solenoid_turned_twisted.jpg\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"
"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Generating multiple solenoids in a Volume\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"side_length = 1000 # angstrom\n",
"radius_solenoid = 100 # angstrom\n",
"nhistones = 51 # histones\n",
"separation = 250 # angstroms\n",
"\n",
"solenoid4_straight = dnachain.MultiSolenoidVolume(\n",
" voxelheight=side_length,\n",
" separation=separation,\n",
" radius=radius_solenoid,\n",
" nhistones=nhistones,\n",
" chains=[1, 2, 3, 4],\n",
" turn=False,\n",
" twist=False,\n",
")\n",
"\n",
"solenoid4_turned = dnachain.MultiSolenoidVolume(\n",
" voxelheight=side_length,\n",
" separation=separation,\n",
" radius=radius_solenoid,\n",
" nhistones=nhistones,\n",
" chains=[1, 2, 3, 4],\n",
" turn=True,\n",
" twist=False,\n",
")\n",
"\n",
"solenoid4_turned_twisted = dnachain.MultiSolenoidVolume(\n",
" voxelheight=side_length,\n",
" separation=separation,\n",
" radius=radius_solenoid,\n",
" nhistones=nhistones,\n",
" chains=[1, 2, 3, 4],\n",
" turn=True,\n",
" twist=True,\n",
")\n",
"\n",
"# centre around (x,y,z)=(0,0,0)\n",
"solenoid4_straight.translate([0, 0, -side_length / 2.0])\n",
"solenoid4_turned.translate([0, 0, -side_length / 2.0])\n",
"solenoid4_turned_twisted.translate([0, 0, -side_length / 2.0])\n",
"\n",
"solenoid4_straight.to_frame().to_csv(\n",
" \"results/solenoid4_straight.csv\", sep=\" \", index=False\n",
")\n",
"solenoid4_turned.to_frame().to_csv(\"results/solenoid4_turned.csv\", sep=\" \", index=False)\n",
"solenoid4_turned_twisted.to_frame().to_csv(\n",
" \"results/solenoid4_turned_twisted.csv\", sep=\" \", index=False\n",
")\n",
"\n",
"plot = solenoid4_straight.to_line_plot()\n",
"plot.scene.save_jpg(\"results/solenoid4_straight.jpg\")\n",
"\n",
"plot = solenoid4_turned.to_line_plot()\n",
"distance = 2500\n",
"mlab.view(azimuth=180, elevation=0, distance=distance, focalpoint=[0, 0, 0])\n",
"mlab.move(up=-distance, forward=distance)\n",
"mlab.pitch(90)\n",
"plot.scene.save_jpg(\"results/solenoid4_turned.jpg\")\n",
"\n",
"plot = solenoid4_turned_twisted.to_line_plot()\n",
"mlab.view(azimuth=180, elevation=0, distance=distance, focalpoint=[0, 0, 0])\n",
"mlab.move(up=-distance, forward=distance)\n",
"mlab.pitch(90)\n",
"plot.scene.save_jpg(\"results/solenoid4_turned_twisted.jpg\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"
"
]
}
],
"metadata": {
"language_info": {
"name": "python",
"pygments_lexer": "ipython3"
}
},
"nbformat": 4,
"nbformat_minor": 4
}