The goal of glyanno is to enhance the level of information and resolution for glycans through a hierarchical annotation approach. Starting from a molecule mass, glyanno calculates possible glycan compositions. Given a glycan composition, glyanno further deduces possible glycan structures. For glycan structures with generic monosaccharides (e.g., “Hex”, “HexNAc”), glyanno refines them into specific types (e.g., “Glc”, “Gal”). For structures lacking linkage information (e.g., “Gal(??-?)GalNAc(??-”), glyanno infers the most likely linkages (e.g., “Gal(b1-3)GalNAc(a1-”).
Installation
The glyanno package is not a core glycoverse package. You need to install it individually even if you have installed the meta-package glycoverse.
You can install the latest release of glyanno from r-universe (recommended):
# install.packages("pak")
pak::repo_add(glycoverse = "https://glycoverse.r-universe.dev")
pak::pkg_install("glyanno")Or from GitHub:
pak::pkg_install("glycoverse/glyanno@*release")Or install the development version (NOT recommended):
pak::pkg_install("glycoverse/glyanno")Note: Tips and troubleshooting for the meta-package glycoverse are also applicable here: Installation of glycoverse.
Role in glycoverse
Glyanno enhances the precision of glycan structures, enabling the use of rough mass spectrometry results for detailed structural analysis. For instance, the glyenzy package requires fully determined glycan structures. Users can leverage glyanno to make educated guesses from incomplete data, thereby enabling downstream analysis with glyenzy and other tools that demand high-resolution structural information.
Example
library(glyanno)
library(glyrepr)
library(glydb)
mz_to_comp(406.1325, charge = 1, adduct = "Na+")
#> # A tibble: 4 × 2
#> mz composition
#> <dbl> <comp>
#> 1 406. Gal(1)GalNAc(1)
#> 2 406. Gal(1)GlcNAc(1)
#> 3 406. Glc(1)GlcNAc(1)
#> 4 406. Man(1)GlcNAc(1)
comp_to_struc("Gal(1)GalNAc(1)")
#> # A tibble: 19 × 2
#> composition structure
#> <comp> <struct>
#> 1 Gal(1)GalNAc(1) Gal(b1-3)GalNAc(a1-
#> 2 Gal(1)GalNAc(1) Gal(b1-3)GalNAc(b1-
#> 3 Gal(1)GalNAc(1) GalNAc(a1-3)Gal(a1-
#> 4 Gal(1)GalNAc(1) Gal(a1-3)GalNAc(b1-
#> 5 Gal(1)GalNAc(1) Gal(b1-4)GalNAc(b1-
#> 6 Gal(1)GalNAc(1) GalNAc(a1-4)Gal(b1-
#> 7 Gal(1)GalNAc(1) GalNAc(a1-2)Gal(b1-
#> 8 Gal(1)GalNAc(1) GalNAc(b1-2)Gal(a1-
#> 9 Gal(1)GalNAc(1) GalNAc(b1-4)Gal(b1-
#> 10 Gal(1)GalNAc(1) Gal(a1-6)GalNAc(a1-
#> 11 Gal(1)GalNAc(1) Gal(b1-6)GalNAc(a1-
#> 12 Gal(1)GalNAc(1) GalNAc(a1-3)Gal(b1-
#> 13 Gal(1)GalNAc(1) GalNAc(b1-3)Gal(b1-
#> 14 Gal(1)GalNAc(1) Gal(b1-6)GalNAc(b1-
#> 15 Gal(1)GalNAc(1) GalNAc(b1-3)Gal(a1-
#> 16 Gal(1)GalNAc(1) GalNAc(b1-4)Gal(a1-
#> 17 Gal(1)GalNAc(1) Gal(a1-3)GalNAc(a1-
#> 18 Gal(1)GalNAc(1) GalNAc(b1-2)Gal(b1-
#> 19 Gal(1)GalNAc(1) Gal(b1-4)GalNAc(a1-
# Use custom db to narrow down the search space
my_db <- glydb_structures(species = "Homo sapiens", glycan_type = "O-GalNAc")
comp_to_struc("Gal(1)GalNAc(1)", db = my_db)
#> # A tibble: 2 × 2
#> composition structure
#> <comp> <struct>
#> 1 Gal(1)GalNAc(1) Gal(b1-3)GalNAc(a1-
#> 2 Gal(1)GalNAc(1) Gal(a1-3)GalNAc(a1-
# Use `return_best` to pick the most likely match
# Core 1 is more likely than Core 5
comp_to_struc("Gal(1)GalNAc(1)", db = my_db, return_best = TRUE)
#> # A tibble: 1 × 2
#> composition structure
#> <comp> <struct>
#> 1 Gal(1)GalNAc(1) Gal(b1-3)GalNAc(a1-