Skip to contents

If you work with N-linked glycans (N-glycans), you’re in for a treat! 🎉 These are the most extensively studied and well-characterized glycans in biology, and glymotif has specialized tools just for them.

Why N-Glycans Deserve Special Attention

N-glycans are remarkable for their structural predictability. Unlike their wild cousins (O-glycans and others), N-glycans follow strict biosynthetic rules. This constraint creates opportunities: we can describe N-glycan architecture using a standardized vocabulary that glycobiologists have developed over decades.

Think of it like describing houses in a planned community—while each house is unique, they all follow the same architectural principles. You can meaningfully ask: “How many bedrooms?” “Does it have a garage?” “What style is the roof?”

For N-glycans, the equivalent questions are:

  • What type is it? (high mannose, hybrid, complex, or paucimannose)
  • How many antenna branches?
  • Does it have a bisecting GlcNAc?
  • How many core fucoses?
  • How many arm fucoses?
  • How many terminal galactoses?

Your N-Glycan Analysis Toolkit

glymotif provides a comprehensive suite of functions for N-glycan characterization:

Classification and Structure:

  • is_n_glycan(): Confirms whether your structure is actually an N-glycan
  • n_glycan_type(): Classifies as high mannose, hybrid, complex, or paucimannose

Branching Architecture:

Fucosylation Patterns:

  • n_core_fuc(): Counts core fucoses (attached to the reducing-end GlcNAc)
  • n_arm_fuc(): Counts arm fucoses (attached to antenna GlcNAcs)

Terminal Features:

  • n_gal(): Counts total galactose residues
  • n_terminal_gal(): Counts terminal galactoses (those without sialic acid caps)

The Swiss Army Knife: describe_n_glycans() 🔧

Rather than calling each function individually, you can use describe_n_glycans() to get a complete structural profile in one go. It’s like having a comprehensive building inspection that checks everything at once:

n_glycans <- c(
  "Man(a1-3)[Man(a1-3)Man(a1-6)]Man(b1-4)GlcNAc(b1-4)GlcNAc",
  "GlcNAc(b1-2)Man(a1-3)[Man(a1-6)]Man(b1-4)GlcNAc(b1-4)[Fuc(a1-6)]GlcNAc",
  "Gal(b1-4)GlcNAc(b1-2)Man(a1-3)[Gal(b1-4)GlcNAc(b1-2)Man(a1-6)]Man(b1-4)GlcNAc(b1-4)GlcNAc"
)
describe_n_glycans(n_glycans)
#> # A tibble: 3 × 7
#>   glycan_type  bisecting n_antennae n_core_fuc n_arm_fuc n_gal n_terminal_gal
#>   <chr>        <lgl>          <int>      <int>     <int> <int>          <int>
#> 1 paucimannose FALSE             NA          0         0     0              0
#> 2 complex      FALSE              1          1         0     0              0
#> 3 complex      FALSE              2          0         0     2              2

Embracing the Messy Reality: Working with Ambiguous Data 🌪️

Here’s where glymotif truly shines—it thrives on incomplete information! ✨ In the real world of glycomics or glycoproteomics research, you rarely get perfect structural data. Mass spectrometry might only tell you “there’s a hexose here” without specifying whether it’s glucose, galactose, or mannose. Linkage information might be completely missing or uncertain.

The beauty of N-glycan analysis? 💎 The strict biosynthetic rules act as a Rosetta Stone, allowing us to decode meaning from ambiguous data.

Our functions are designed to work with minimal information requirements:

  • Generic monosaccharides: “Hex”, “HexNAc”, “dHex”, instead of specific sugars
  • Missing linkages: Those mysterious “??” annotations won’t stop the analysis
  • Uncertain positions: The algorithm makes intelligent assumptions based on N-glycan biology

Let’s see this in action with some intentionally ambiguous structures:

# These are the same N-glycans as before, but with all specificity stripped away
ambiguous_glycans <- c(
  "Hex(??-?)[Hex(??-?)Hex(??-?)]Hex(??-?)HexNAc(??-?)HexNAc",
  "HexNAc(??-?)Hex(??-?)[Hex(??-?)]Hex(??-?)HexNAc(??-?)[dHex(??-?)]HexNAc",
  "Hex(??-?)HexNAc(??-?)Hex(??-?)[Hex(??-?)HexNAc(??-?)Hex(??-?)]Hex(??-?)HexNAc(??-?)HexNAc"
)
describe_n_glycans(ambiguous_glycans)
#> # A tibble: 3 × 7
#>   glycan_type  bisecting n_antennae n_core_fuc n_arm_fuc n_gal n_terminal_gal
#>   <chr>        <lgl>          <int>      <int>     <int> <int>          <int>
#> 1 paucimannose FALSE             NA          0         0     0              0
#> 2 complex      FALSE              1          1         0     0              0
#> 3 complex      FALSE              2          0         0     2              2

Remarkable, isn’t it? 🤯 Despite the uncertainty in the input data, we get the same structural insights as before.

This tolerance for ambiguity is a game-changer for high-throughput glycomics and glycoproteomics. 🚀 Whether you’re analyzing thousands of glycopeptides from a proteomics experiment or working with automated glycan assignment from mass spectra, glymotif meets your data where it is—not where you wish it were.

Describing N-Glycans in an Experiment

There’s a seamless integration waiting for you: the add_glycan_description() function can automatically apply all the N-glycan analysis we just discussed to your entire dataset. No manual loops, no data wrangling headaches—just one function call to enrich your glycan annotations with comprehensive structural descriptions.

Here’s how it works in practice:

# Add N-glycan structural descriptions automatically
exp <- add_glycan_description(exp)

# Now your experiment object contains rich glycan annotations!
get_var_info(exp)