Package {raymolecule}


Type: Package
Title: Parse and Render Molecular Structures in 3D
Version: 0.9.0
Maintainer: Tyler Morgan-Wall <tylermw@gmail.com>
Description: Downloads and parses 'SDF' (Structural Description Format) and 'PDB' (Protein Database) files for 3D rendering.
License: GPL-3
Encoding: UTF-8
Depends: R (≥ 4.1)
Imports: rayrender (≥ 0.41.3), PeriodicTable, httr, rayvertex (≥ 0.15.0)
Suggests: testthat (≥ 3.0.0), rayimage
Config/testthat/edition: 3
URL: http://www.raymolecule.com/, https://github.com/tylermorganwall/raymolecule
BugReports: https://github.com/tylermorganwall/raymolecule/issues
Config/roxygen2/version: 8.0.0
NeedsCompilation: no
Packaged: 2026-06-25 22:07:43 UTC; tyler
Author: Tyler Morgan-Wall ORCID iD [aut, cph, cre]
Repository: CRAN
Date/Publication: 2026-06-26 05:10:02 UTC

Convert Color

Description

Convert Color

Usage

convert_color(color, as_hex = FALSE)

Arguments

color

The color to convert. Can be either a hexadecimal code, or a numeric rgb vector listing three intensities between '0' and '1'.

Value

Color vector

Examples

#none

Cross Product of two

Description

Cross Product of two

Usage

cross(a, b)

Arguments

a

Length-3 numeric vector.

b

Length-3 numeric vector.


Download a PDB Structure from RCSB

Description

Looks up a protein name in the RCSB PDB search API and downloads the best matching legacy PDB file. A 4-character PDB ID can also be supplied directly.

Usage

download_pdb(
  protein,
  out_dir = ".",
  filename = NULL,
  overwrite = FALSE,
  max_results = 10L,
  verbose = FALSE
)

Arguments

protein

Protein name or 4-character PDB ID.

out_dir

Default '"."'. Directory where the PDB file will be written.

filename

Default 'NULL'. Optional output file name. If 'NULL', the downloaded file is named with the matched PDB ID.

overwrite

Default 'FALSE'. Whether to overwrite an existing file.

max_results

Default '10L'. Maximum number of RCSB search matches to try when downloading a legacy PDB file.

verbose

Default 'FALSE'. If 'TRUE', report the matched PDB ID and destination path.

Value

Path to the downloaded PDB file.

Examples


# Start with a direct PDB ID download. A temporary directory, custom
# filename, overwrite flag, and verbose output make the file handling clear.
pdb_file = download_pdb(
  "4fsp",
  out_dir = tempdir(),
  filename = "outer-membrane-barrel.pdb",
  overwrite = TRUE,
  verbose = TRUE
)

read_pdb(pdb_file, verbose = TRUE) |>
  generate_ribbon_scene() |>
  render_model(
    pathtrace = FALSE,
    width = 800,
    height = 800,
    background = "grey12"
  )

# Protein-name lookup searches RCSB and tries up to three legacy PDB matches.
hemoglobin_file = download_pdb(
  "hemoglobin",
  out_dir = tempdir(),
  max_results = 3L
)
read_pdb(hemoglobin_file, verbose = TRUE) |>
  generate_ribbon_scene() |>
  render_model(
    pathtrace = FALSE,
    width = 800,
    height = 800,
    background = "grey12"
  )


Build Scene (atoms only)

Description

Builds a scene containing only atom spheres from a PDB or SDF model.

Usage

generate_atom_scene(
  model,
  x = 0,
  y = 0,
  z = 0,
  scale = 1,
  center = TRUE,
  material = rayrender::glossy,
  material_args = list(),
  material_vertex = material_list(type = "phong")
)

Arguments

model

Model extracted from a PDB or SDF file.

x

Default '0'. X offset, applied after centering.

y

Default '0'. Y offset, applied after centering.

z

Default '0'. Z offset, applied after centering.

scale

Default '1'. Amount to scale the inter-atom spacing.

center

Default 'TRUE'. Centers the bounding box of the model.

material

Default 'rayrender::glossy'. Optional rayrender material used to initialize the mesh material when 'material_vertex' is not supplied. Must be either 'glossy', 'diffuse', or 'dielectric'.

material_args

Default 'list()'. Named list of additional arguments passed to 'material'. Arguments supplied by raymolecule for colors and textures override entries with the same names. For example, use 'list(gloss = 0.35, reflectance = 0.12)' with 'rayrender::glossy', or 'list(sigma = 0.4)' with 'rayrender::diffuse'.

material_vertex

Default 'rayvertex::material_list()'. Mesh material. 'diffuse'/'ambient' colors and 'ambient_intensity' are determined automatically, but all other material properties can be changed.

Value

Raymesh scene containing only the atoms in a molecule/protein.

Examples


atom_model = read_sdf(get_example_molecule("benzene"))

# Start with a centered raster atom scene using the default atom colors.
atom_model |>
  generate_atom_scene() |>
  render_model(
    pathtrace = FALSE,
    width = 800,
    height = 800,
    background = "grey15"
  )

# This version shifts and scales the same atoms, then uses a diffuse mesh
# material for the spheres before pathtracing.
atom_model |>
  generate_atom_scene(
    x = -1,
    y = 0,
    z = 1,
    scale = 0.75,
    center = TRUE,
    material = rayrender::diffuse,
    material_args = list(sigma = 0.4)
  ) |>
  render_model(pathtrace = TRUE, width = 800, height = 800, samples = 32)

# The toon material changes only the raster shader. Keeping `center = TRUE`
# makes the result easy to compare to the baseline scene above.
toon_material = rayvertex::material_list(
  type = "toon_phong",
  toon_levels = 3,
  toon_outline_width = 0.08
)
caffeine_model = read_sdf(get_example_molecule("caffeine"))
caffeine_model |>
  generate_atom_scene(
    center = TRUE,
    material_vertex = toon_material
  ) |>
  render_model(
    pathtrace = FALSE,
    width = 800,
    height = 800,
    background = "grey15"
  )


Build Scene (bonds only)

Description

Builds a scene containing only bond geometry from a PDB or SDF model.

Usage

generate_bond_scene(
  model,
  x = 0,
  y = 0,
  z = 0,
  scale = 1,
  center = TRUE,
  force_single_bonds = FALSE,
  material = rayrender::glossy,
  material_args = list(),
  material_vertex = material_list(diffuse = "grey33", ambient = "grey33", type = "phong",
    ambient_intensity = 0.3)
)

Arguments

model

Model extracted from a PDB or SDF file.

x

Default '0'. X offset, applied after centering.

y

Default '0'. Y offset, applied after centering.

z

Default '0'. Z offset, applied after centering.

scale

Default '1'. Amount to scale the interatom spacing.

center

Default 'TRUE'. Centers the bounding box of the model.

force_single_bonds

Default 'FALSE'. Whether to force all bonds to show as a single connection.

material

Default 'rayrender::glossy'. Optional rayrender material used to initialize the mesh material when 'material_vertex' is not supplied. Must be either 'glossy', 'diffuse', or 'dielectric'.

material_args

Default 'list()'. Named list of additional arguments passed to 'material'. Arguments supplied by raymolecule for colors and textures override entries with the same names. For example, use 'list(gloss = 0.35, reflectance = 0.12)' with 'rayrender::glossy', or 'list(sigma = 0.4)' with 'rayrender::diffuse'.

material_vertex

Default 'material_list(diffuse="grey33",ambient="grey33",type="phong", ambient_intensity=0.3)'. Mesh material to use for the bonds.

Value

Raymesh scene containing only the connections between atoms in a molecule/protein.

Examples


bond_model = read_sdf(get_example_molecule("benzene"))

# Start with a centered bond scene using the molecule's recorded bond
# orders and default bond material.
bond_model |>
  generate_bond_scene() |>
  render_model(
    pathtrace = FALSE,
    width = 800,
    height = 800,
    background = "grey10"
  )

# This version reduces the spacing, forces every connection to a single
# bond, and lights the ligand from above and below while pathtracing.
bond_model |>
  generate_bond_scene(
    x = 0,
    y = 0,
    z = 0,
    scale = 0.7,
    center = TRUE,
    force_single_bonds = TRUE,
    material = rayrender::glossy,
    material_args = list(gloss = 0.35)
  ) |>
  render_model(
    pathtrace = TRUE,
    lights = "both",
    width = 800,
    height = 800,
    samples = 32
  )

# A custom rayvertex material changes the raster bond color and ambient
# contribution while keeping the same geometry.
bond_material = rayvertex::material_list(
  diffuse = "grey85",
  ambient = "grey25",
  type = "phong",
  ambient_intensity = 0.4
)
cinnemaldehyde_model = read_sdf(get_example_molecule("cinnemaldehyde"))
cinnemaldehyde_model |>
  generate_bond_scene(
    material_vertex = bond_material
  ) |>
  render_model(
    pathtrace = FALSE,
    width = 800,
    height = 800,
    background = "grey10"
  )


Build Scene (bonds + atoms)

Description

Builds a combined atom and bond scene from a PDB or SDF model.

Usage

generate_full_scene(
  model,
  x = 0,
  y = 0,
  z = 0,
  scale = 1,
  center = TRUE,
  force_single_bonds = FALSE,
  material = rayrender::glossy,
  material_args = list(),
  material_vertex = material_list(type = "phong")
)

Arguments

model

Model extracted from a PDB or SDF file.

x

Default '0'. X offset, applied after centering.

y

Default '0'. Y offset, applied after centering.

z

Default '0'. Z offset, applied after centering.

scale

Default '1'. Amount to scale the interatom spacing.

center

Default 'TRUE'. Centers the bounding box of the model.

force_single_bonds

Default 'FALSE'. Whether to force all bonds to show as a single connection.

material

Default 'rayrender::glossy'. Optional rayrender material used to initialize the mesh material when 'material_vertex' is not supplied. Must be either 'glossy', 'diffuse', or 'dielectric'.

material_args

Default 'list()'. Named list of additional arguments passed to 'material'. Arguments supplied by raymolecule for colors and textures override entries with the same names. For example, use 'list(gloss = 0.35, reflectance = 0.12)' with 'rayrender::glossy', or 'list(sigma = 0.4)' with 'rayrender::diffuse'.

material_vertex

Default 'rayvertex::material_list()'. Mesh material. 'diffuse'/'ambient' colors and 'ambient_intensity' are determined automatically, but all other material properties can be changed.

Value

Raymesh scene

Examples


molecule_model = read_sdf(get_example_molecule("caffeine"))

# Start with a centered raster scene that combines atom spheres and bond
# geometry using the default atom colors.
molecule_model |>
  generate_full_scene(force_single_bonds = TRUE) |>
  render_model(
    pathtrace = FALSE,
    width = 800,
    height = 800,
    background = "grey12"
  )

# This version changes the scale, keeps the model centered, and uses a
# diffuse mesh material for both atoms and bonds before pathtracing.
molecule_model |>
  generate_full_scene(
    x = 0,
    y = 0,
    z = 0,
    scale = 0.75,
    center = TRUE,
    force_single_bonds = TRUE,
    material = rayrender::diffuse,
    material_args = list(sigma = 0.3)
  ) |>
  render_model(pathtrace = TRUE, width = 800, height = 800, samples = 32)

# A toon material changes the raster shader and pass FSAA to render_model()
# so rayvertex adds anti-aliasing.
shiny_toon_material = rayvertex::material_list(
  type = "toon_phong",
  toon_levels = 3,
  toon_outline_width = 10,
  toon_outline_color = "white"
)
morphine_model = read_sdf(get_example_molecule("morphine"))
morphine_model |>
  generate_full_scene(
    material_vertex = shiny_toon_material
  ) |>
  render_model(
    fsaa = 2,
    pathtrace = FALSE,
    width = 800,
    height = 800,
    background = "grey50"
  )


Build Scene (ribbon)

Description

Generates a mesh-based protein ribbon from a PDB model parsed with [read_pdb()]. Segments with contiguous peptide-plane backbone data are rendered with a peptide-plane cartoon sweep, while incomplete backbone segments fall back to a CA-driven centripetal Catmull-Rom ribbon. The mesh is emitted as indexed watertight geometry with UV coordinates, and eligible 'SHEET' annotations are rendered with peptide-plane strand profiles and tapered C-terminal arrowheads.

Usage

generate_ribbon_scene(
  model,
  x = 0,
  y = 0,
  z = 0,
  scale = 1,
  center = TRUE,
  model_id = NA_integer_,
  ribbon_width = 2,
  ribbon_thickness = 0.25,
  cross_section_resolution = 24,
  subdivisions = 8,
  color_mode = c("chain", "uv"),
  chain_colors = NULL,
  texture = NULL,
  material = rayrender::glossy,
  material_args = list(),
  material_vertex = rayvertex::material_list(type = "phong"),
  raster_ambient_mix = 0.5,
  show_hetero_atoms = TRUE,
  show_hetero_bonds = TRUE,
  show_waters = FALSE,
  show_protein_atoms = FALSE,
  show_protein_bonds = FALSE,
  atom_scale = 1,
  bond_width = 1,
  use_vertex_normals = FALSE,
  verbose = FALSE
)

Arguments

model

Model extracted from a PDB file with [read_pdb()].

x

Default '0'. X offset, applied after centering.

y

Default '0'. Y offset, applied after centering.

z

Default '0'. Z offset, applied after centering.

scale

Default '1'. Amount to scale the ribbon geometry.

center

Default 'TRUE'. Centers the bounding box of the model.

model_id

Default 'NA_integer_'. PDB 'MODEL' identifier(s) to render. The default 'NA' renders all parsed models in the ensemble.

ribbon_width

Default '2'. Width of the ribbon cross-section.

ribbon_thickness

Default '0.25'. Thickness of the ribbon cross-section.

cross_section_resolution

Default '24'. Number of perimeter vertices used to approximate the ribbon cross-section.

subdivisions

Default '8'. Minimum number of spline samples per residue interval. Longer backbone spans are automatically refined to a smaller internal step size to avoid visible faceting.

color_mode

Either '"chain"' or '"uv"'. If omitted, single-chain proteins default to '"uv"' and multi-chain proteins default to '"chain"'.

chain_colors

Optional named vector or named list keyed by chain ID. Used when 'color_mode = "chain"'.

texture

Optional texture path. Used when 'color_mode = "uv"'. If omitted in UV mode, a built-in rainbow gradient is used.

material

Default 'rayrender::glossy'. Optional rayrender material used to initialize the mesh material when 'material_vertex' is not supplied. Must be either 'glossy', 'diffuse', or 'dielectric'.

material_args

Default 'list()'. Named list of additional arguments passed to 'material'. Arguments supplied by raymolecule for colors and textures override entries with the same names. For example, use 'list(gloss = 0.35, reflectance = 0.12)' with 'rayrender::glossy', or 'list(sigma = 0.4)' with 'rayrender::diffuse'.

material_vertex

Default 'rayvertex::material_list(type = "phong")'. Mesh material template.

raster_ambient_mix

Default '0.5'. Fraction of raster ribbon color contributed by the ambient, unlit material channel. Values closer to '0' emphasize diffuse directional lighting; values closer to '1' flatten lighting and preserve texture/color more directly.

show_hetero_atoms

Default 'TRUE'. If 'TRUE', display non-protein 'HETATM' records as bare spheres alongside the ribbon.

show_hetero_bonds

Default 'TRUE'. If 'TRUE', display bonds between shown hetero atoms as a ball-and-stick overlay alongside the ribbon.

show_waters

Default 'FALSE'. If 'TRUE', include water 'HETATM' records when 'show_hetero_atoms = TRUE' and 'show_hetero_bonds = TRUE'.

show_protein_atoms

Default 'FALSE'. If 'TRUE', display protein 'ATOM' records as small spheres alongside the ribbon.

show_protein_bonds

Default 'FALSE'. If 'TRUE', display inferred covalent bonds between protein 'ATOM' records as a thin stick overlay.

atom_scale

Default '1'. Multiplier applied to the radii of optional atom overlays.

bond_width

Default '1'. Multiplier applied to the radii of optional bond overlays.

use_vertex_normals

Default 'FALSE'. If 'TRUE', attach the ribbon mesh's swept vertex normals. If 'FALSE', scenes omit explicit vertex normals and pathtraced renders use flat face normals.

verbose

Default 'FALSE'. If 'TRUE', report the PDB name and model identifiers being rendered.

Value

Raymesh scene containing a ribbon mesh.

Examples


ribbon_file = download_pdb("2w5o", out_dir = tempdir(), overwrite = TRUE)
ribbon_model = read_pdb(ribbon_file, verbose = TRUE)

# Start with a centered raster ribbon using the default ribbon width,
# thickness, color mode, and ligand overlays.
ribbon_model |>
  generate_ribbon_scene() |>
  render_model(
    pathtrace = FALSE,
    width = 800,
    height = 800,
    background = "grey12"
  )

# This pathtraced version widens the ribbon, increases cross-section
# resolution, applies a custom UV texture, turns on atom/bond overlays, and
# uses the mesh vertex normals.
texture_file = tempfile(fileext = ".png")
grDevices::png(texture_file, width = 64, height = 8, bg = "transparent")
graphics::par(mar = c(0, 0, 0, 0))
graphics::image(
  matrix(seq(0, 1, length.out = 64), ncol = 1),
  col = grDevices::hcl.colors(64, "Spectral", rev = TRUE),
  axes = FALSE,
  xlab = "",
  ylab = ""
)
grDevices::dev.off()

ribbon_model |>
  generate_ribbon_scene(
    x = 0,
    y = 0,
    z = 0,
    scale = 1,
    center = TRUE,
    ribbon_width = 1.8,
    ribbon_thickness = 0.3,
    cross_section_resolution = 32,
    subdivisions = 10,
    color_mode = "uv",
    texture = texture_file,
    material = rayrender::diffuse,
    material_args = list(sigma = 0.2),
    show_hetero_atoms = TRUE,
    show_hetero_bonds = TRUE,
    show_waters = TRUE,
    show_protein_atoms = TRUE,
    show_protein_bonds = TRUE,
    atom_scale = 1.2,
    bond_width = 0.8,
    use_vertex_normals = TRUE,
    verbose = TRUE
  ) |>
  render_model(pathtrace = TRUE, width = 800, height = 800, samples = 128)

# Start the beta-barrel example with the default UV texture in raster mode.
# We rotate the model to match the render in the protein data bank.
barrel_model = read_pdb(download_pdb("4fsp", out_dir = tempdir()))
barrel_scene = barrel_model |>
  generate_ribbon_scene(color_mode = "uv", raster_ambient_mix = 0.7)
barrel_render = render_model(
  barrel_scene,
  pathtrace = FALSE,
  width = 500,
  height = 500,
  background = "white",
  lookfrom = c(-89.95, 66.11, -109.95),
  angle = c(-60, 270, 180),
  lookat = c(6.06, -7.62, 1.41),
  fov = 27.2,
  plot = FALSE
)

pdb_4fsp_image = rayimage::render_title(system.file(
  "extdata",
  "4fsp_assembly-1.jpeg",
  package = "raymolecule",
  mustWork = TRUE
), title_text = "Protein Data Bank Render")

ray_4fsp_image = rayimage::render_title(
  barrel_render,
  title_text = "Raymolecule Render"
)
rayimage::plot_image_grid(list(pdb_4fsp_image, ray_4fsp_image),dim=c(1,2))
# Raising the raster ambient mix gives the same barrel less directional
# lighting
barrel_model |>
  generate_ribbon_scene(
    color_mode = "uv",
    texture = NULL,
    raster_ambient_mix = 0.8
  ) |>
  render_model(
    pathtrace = FALSE,
    width = 800,
    height = 800,
    background = "grey12"
  )

# Start the multi-chain example with the automatic chain color palette.
multi_chain_model = read_pdb(download_pdb("1xn1", out_dir = tempdir()))
multi_chain_model |>
  generate_ribbon_scene(color_mode = "chain") |>
  render_model(
    pathtrace = FALSE,
    width = 800,
    height = 800,
    background = "grey80"
  )

# An explicit chain color map replaces the automatic palette without
# changing the ribbon geometry.
chain_ids = unique(multi_chain_model$residues$chain_id)
chain_ids = chain_ids[!is.na(chain_ids)]
chain_colors = stats::setNames(grDevices::rainbow(length(chain_ids)), chain_ids)
multi_chain_model |>
  generate_ribbon_scene(
    color_mode = "chain",
    chain_colors = chain_colors,
    material_vertex = rayvertex::material_list(type = "phong")
  ) |>
  render_model(
    pathtrace = FALSE,
    width = 800,
    height = 800,
    background = "grey80"
  )

# Start the NMR ensemble view by rendering every parsed model.
ensemble_model = read_pdb(download_pdb("1co1", out_dir = tempdir()))
ensemble_model |>
  generate_ribbon_scene(center = FALSE) |>
  render_model(
    pathtrace = TRUE,
    fov=26,
	 lookfrom = c(-45.95, 58.56, 79.95),
	 lookat = c(-7.19, 3.87, -1.52) ,
    width = 800,
    height = 800, samples=128,
    background = "black"
  )

# Selecting three model IDs shows a cleaner subset of the same ensemble.
ensemble_model |>
 generate_ribbon_scene(model_id = c(1L, 5L, 10L), center = FALSE) |>
 render_model(
	 pathtrace = TRUE,
    fov=26,
	 lookfrom = c(-45.95, 58.56, 79.95),
	 lookat = c(-7.19, 3.87, -1.52) ,
	 width = 800,
	 height = 800, samples=128,
	 background = "black"
 )


Get Example Molecule

Description

Loads the structure of the built-in molecules. All SDF files obtained from Pubchem. txt extension only included to pass R CHECK.

Usage

get_example_molecule(molecule)

Arguments

molecule

One of the built-in SDF files. These are "benzene", "buckyball", "caffeine", "capsaicin", "cinnemaldehyde", "geraniol", "luciferin", "morphine", "penicillin", "pfoa", "skatole", "tubocurarine_chloride".

Value

List giving the atom locations and the connections between atoms.

Examples

get_example_molecule("benzene")
get_example_molecule("cinnemaldehyde")
get_example_molecule("geraniol")

Get Molecule

Description

Loads the structure of a molecule by fetching an SDF file from Pubchem, which can be piped to generate_full_scene

Usage

get_molecule(molecule)

Arguments

molecule

A character variable of a compound name or a numeric variable of an official compound ID

Value

List giving the atom locations and the connections between atoms.

Examples



get_molecule("caffeine") |>
  generate_full_scene() |>
  render_model()


#estradiol (aka estrogen)
get_molecule(5757) |>
  generate_full_scene() |>
  render_model()


get_molecule("testosterone") |>
  generate_full_scene() |>
  render_model()


get_molecule("aspirin") |>
  generate_full_scene() |>
  render_model()


get_molecule("rutoside") |>
  generate_full_scene() |>
  render_model()


#If the 3D SDF doesn't exist, this function will pull the 2D SDF and inform the user
get_molecule("cyanocobalamin") |>
  generate_full_scene() |>
  render_model()


Create Orthonormal Basis from w (z)

Description

Create Orthonormal Basis from w (z)

Usage

onb_from_w(n)

Read PDB File

Description

Reads a legacy fixed-width PDB file and extracts atom locations, bond connections, backbone residue information, and secondary structure records. 'model$atoms' and 'model$bonds' remain compatible with the existing atom and bond scene generators. Biological assemblies can be generated from 'REMARK 350 BIOMT' transforms when requested.

Usage

read_pdb(
  filename,
  atom = TRUE,
  nsr = TRUE,
  assembly = c("asymmetric_unit", "biological"),
  assembly_id = 1L,
  verbose = FALSE
)

Arguments

filename

Path to the PDB file, or a protein name/4-character PDB ID to download from RCSB when it is not an existing file and does not end in '.pdb'.

atom

Default 'TRUE'. Whether to include standard residue 'ATOM' records in 'model$atoms'.

nsr

Default 'TRUE'. Whether to include 'HETATM' records in 'model$atoms'.

assembly

Default '"asymmetric_unit"'. Either the deposited asymmetric unit or the biological assembly generated from 'REMARK 350 BIOMT' transforms.

assembly_id

Default '1L'. Biological assembly identifier to use when 'assembly = "biological"'.

verbose

Default 'FALSE'. If 'TRUE', report parsed PDB metadata and atom/residue/model counts.

Value

List giving the parsed PDB model.

Examples


# Start with a local PDB file and the deposited asymmetric unit. Both ATOM
# and HETATM records are kept, and verbose output prints parse metadata.
pdb_file = download_pdb("2w5o", out_dir = tempdir(), overwrite = TRUE)
model = read_pdb(
  pdb_file,
  atom = TRUE,
  nsr = TRUE,
  assembly = "asymmetric_unit",
  verbose = TRUE
)

model |>
  generate_ribbon_scene() |>
  render_model(
    pathtrace = FALSE,
    width = 800,
    height = 800,
    background = "grey12"
  )

# The biological assembly applies REMARK 350 BIOMT transforms when present.
biological_model = read_pdb(
  pdb_file,
  assembly = "biological",
  assembly_id = 1L
)

# This ligand-only parse keeps HETATM records and drops standard protein
# atoms, which is useful for ligand and ion views.
ligand_file = download_pdb("5hsv", out_dir = tempdir(), overwrite = TRUE)
ligand_model = read_pdb(ligand_file, atom = FALSE, nsr = TRUE)

ligand_model |>
  generate_full_scene(force_single_bonds = TRUE) |>
  render_model(pathtrace = TRUE, width = 800, height = 800, samples = 32)

# A bare PDB ID is downloaded automatically when no matching local file is
# found. Verbose output reports the multi-model ensemble.
old_dir = setwd(tempdir())
ensemble_model = read_pdb("1co1", verbose = TRUE)
setwd(old_dir)


Read SDF File

Description

Reads an SDF file and extracts the 3D molecule model

Usage

read_sdf(filename)

Arguments

filename

Filename to the sdf file.

Value

List giving the atom locations and the connections between atoms.

Examples

#This assumes a hypothetical SDF file in your working directory:
if(file.exists("molecule.sdf")) {
  read_pdb("molecule.sdf") |>
    generate_full_scene() |>
    render_model()
}

Render Molecule Model

Description

Automatically plots the molecule with a camera position and field of view that includes the full model. For more control over the scene, pass the scene to 'rayrender::render_scene()' or 'rayvertex::rasterize_scene()' and specify the camera position manually.

Usage

render_model(
  scene,
  width = 800,
  height = 800,
  fov = NULL,
  lookat = NULL,
  lookfrom = NULL,
  angle = c(0, 0, 0),
  order_rotation = c(1, 2, 3),
  lights = "top",
  lightintensity = 80,
  pathtrace = TRUE,
  plot = TRUE,
  scene_elements = NULL,
  ...
)

Arguments

scene

Raymesh scene of molecule model.

width

Default '800'. Image width in pixels.

height

Default '800'. Image height in pixels.

fov

Default 'NULL', automatically calculated. Camera field of view.

lookat

Default 'NULL', automatically calculated as 'c(0,0,0)'. Camera target point.

lookfrom

Default 'NULL', automatically calculated from the scene bounds. Camera position.

angle

Default 'c(0,0,0)'. Degrees to rotate the model around the X, Y, and Z axes. If this is a single number, it is interpreted as 'c(0, angle, 0)' and only rotates around the Y axis.

order_rotation

Default 'c(1,2,3)'. What order to apply the rotations specified in 'angle'.

lights

Default 'top'. If 'none', removes all lights. If 'bottom', lights scene with light underneath model. If 'both', adds lights both above and below model. This can also be a matrix of light information generated with 'rayvertex'.

lightintensity

Default '80'. Light intensity for pathtraced scenes.

pathtrace

Default 'TRUE'. If 'TRUE', convert the raymesh scene to a 'rayrender' raymesh and pathtrace it. Scene-generator rayrender materials are passed to 'rayrender::raymesh_model()' with 'override_material = TRUE' when available. If 'FALSE', rasterize the raymesh scene with 'rayvertex'.

plot

Default 'TRUE'. If 'TRUE', plot the rendered image to the current graphics device. If 'FALSE', only return the rendered rayimage array.

scene_elements

Default 'NULL'. Additional backend scene elements to add after automatic camera calculation and model rotation. For 'pathtrace = TRUE', elements may be rayrender scenes or rayvertex raymesh scenes. For 'pathtrace = FALSE', elements must be rayvertex raymesh scenes.

...

Other arguments to pass to 'rayrender::render_scene()' or 'rayvertex::rasterize_scene()'. Arguments that only apply to the other backend are ignored. For pathtraced scenes, 'background' sets both 'backgroundlow' and 'backgroundhigh' in 'rayrender::render_scene()' and turns on 'ambient_light'. For raster scenes, 'background' is passed through to 'rayvertex::rasterize_scene()'.

Value

Rendered image

Examples


compact_model = read_pdb(download_pdb("6k16", out_dir = tempdir()))
compact_scene = compact_model |>
  generate_ribbon_scene(
    material = rayrender::diffuse,
    show_hetero_atoms = FALSE
  )

# Start with render_model's default camera, top lighting, and calculated FOV.
compact_scene |>
  render_model(pathtrace = TRUE, width = 800, height = 800, samples = 128)

# Use `plot = FALSE` when you want the image array without drawing it.
compact_image = compact_scene |>
  render_model(
    pathtrace = TRUE,
    width = 800,
    height = 800,
    samples = 128,
    plot = FALSE
  )

# This render uses an explicit camera, scalar Y rotation, a solid
# background, weaker top light, and rayrender sampling options. The
# camera orientation was extracted interactively in rayrender by 
# pressing the "P" key.
compact_scene |>
  render_model(
    pathtrace = TRUE,
    width = 800,
    height = 800,
    fov = 72,
    lookat = c(-1.93, 11.99, 8.47),
    lookfrom = c(-25.50, 26.52, 14.99),
    aperture = 2,
    angle = 35,
    background = "grey2",
    lights = "top",
    lightintensity = 50,
    samples = 128,
    sample_method = "sobol_blue",
    clamp_value = 10
  )

# Vector rotation and a custom rotation order show the same scene from a
# different orientation with lights above and below.
compact_scene |>
  render_model(
    pathtrace = TRUE,
    angle = c(20, 90, 90),
    lights = "both",
    fov = 28,
    samples = 128,
    sample_method = "sobol_blue"
  )

# Disable render_model's automatic lights and add your own.
tmp_exr = tempfile(fileext=".exr")
background_light = matrix(0,nrow=500,ncol=1000)
background_light[140:160, 250:270] = 700 #key
background_light[100:170, 200:300+500] = 10 #fill
rayimage::ray_write_image(background_light, tmp_exr)
#Generate a key and fill light
rayimage::plot_image(background_light)
compact_scene |>
  render_model(
    pathtrace = TRUE,
    lights = "none",
    background = "grey12",
    samples = 128,
    fov = 25,
    sample_method = "sobol_blue",
    rotate_env = 180,
    environment_light = tmp_exr
  )

# Extra rayrender scene elements can be added after the automatic camera and
# model rotation are set, which is useful for fixed reference marks.
compact_scene |>
  render_model(
    pathtrace = TRUE,
    angle = 35,
    scene_elements = rayrender::sphere(
      x = -10,
      y = -10,
      z = -10,
      radius = 0.5,
      material = rayrender::light(intensity = 15)
    ),
    samples = 128,
    sample_method = "sobol_blue"
  )

# Raster scenes use rayvertex lighting. This example passes a directional
# light matrix through render_model to rasterize_scene().
raster_scene = compact_model |>
  generate_ribbon_scene()
raster_scene |>
  render_model(
    pathtrace = FALSE,
    background = "grey12",
    lights = rayvertex::directional_light(c(0.2, 1, -1))
  )


Unit vector

Description

Unit vector

Usage

unit_vector(v)

Arguments

v

Numeric vector.