Building Glycans manually#
In this tutorial we will build a glycan manually by attaching individual sugar residues together. The best thing about this is that we can easily incorporate non-standard or modified sugars into our glycans.
[1]:
import plotly
plotly.offline.init_notebook_mode()
[2]:
import glycosylator as gl
Now let’s build the glycan with GlyCosmos ID G02259AO…
[3]:
# for reference, the glycan's IUPAC string is given by:
# (just copy/past from GlyCosmos)
iupac = "GlcNAc(b1-3)[Gal(b1-4)GlcNAc(b1-6)]Gal(b1-4)Glc"
The glycan consists of Glucose (Glc), Galactose (Gal), and N-acetyl-glucose (GlcNAc). We can get the individual sugars by just making glycans from their names.
[4]:
# let's get the sugars using their name abbreviations
glc = gl.glycan("Glc")
gal = gl.glycan("Gal")
glcnac = gl.glycan("GlcNAc")
Assembling glycans#
Now let’s start assembling them. Glycosylator is built on top of BuildAMol, a general-purpose fragment-based molecular assembly tool. We can attach molecules (glycans) together to form new and larger ones. To that end, we need to specify a linkage between the two molecules, specifying which atoms to connect and which atoms to remove while connecting. Luckily, Glycosylator (and BuildAMol) already come with a repository of linkages pre-installed, so we do not need to specify any for this
tutorial. If you find that your glycan cannot be built directly because some linkage is missing, you will need to make your own linkage, but that’s easy to do, so don’t worry about it!
[5]:
# let's first check what linkages are available
gl.available_linkages()
[5]:
[Linkage(SCK0),
Linkage(SCK1),
Linkage(LLLO),
Linkage(CERA),
Linkage(CERB),
Linkage(DAGA),
Linkage(DAGB),
Linkage(INS2A),
Linkage(INS2B),
Linkage(INS6A),
Linkage(INS6B),
Linkage(SGPA),
Linkage(TGPA),
Linkage(SGPB),
Linkage(TGPB),
Linkage(NGLA),
Linkage(11aa),
Linkage(11ab),
Linkage(11bb),
Linkage(12aa),
Linkage(12ab),
Linkage(12ba),
Linkage(12bb),
Linkage(13aa),
Linkage(13ab),
Linkage(13ba),
Linkage(13bb),
Linkage(14aa),
Linkage(14ab),
Linkage(14ba),
Linkage(14bb),
Linkage(16aa),
Linkage(16ab),
Linkage(16bb),
Linkage(16ba),
Linkage(SUCR),
Linkage(LCTL),
Linkage(AB15),
Linkage(SA23AB),
Linkage(LINK),
Linkage(ASN-glyco),
Linkage(SER-glyco),
Linkage(THR-glyco),
Linkage(23ab),
Linkage(23ba),
Linkage(11ba),
Linkage(21aa),
Linkage(21ab),
Linkage(21ba),
Linkage(21bb),
Linkage(31aa),
Linkage(31ab),
Linkage(31ba),
Linkage(31bb),
Linkage(41aa),
Linkage(41ab),
Linkage(41ba),
Linkage(41bb),
Linkage(51aa),
Linkage(51ab),
Linkage(51ba),
Linkage(51bb),
Linkage(61aa),
Linkage(61ab),
Linkage(61ba),
Linkage(61bb),
Linkage(71aa),
Linkage(71ab),
Linkage(71ba),
Linkage(71bb),
Linkage(81aa),
Linkage(81ab),
Linkage(81ba),
Linkage(81bb),
Linkage(22aa),
Linkage(22ab),
Linkage(22ba),
Linkage(22bb),
Linkage(32aa),
Linkage(32ab),
Linkage(32ba),
Linkage(32bb),
Linkage(42aa),
Linkage(42ab),
Linkage(42ba),
Linkage(42bb),
Linkage(52aa),
Linkage(52ab),
Linkage(52ba),
Linkage(52bb),
Linkage(62aa),
Linkage(62ab),
Linkage(62ba),
Linkage(62bb),
Linkage(72aa),
Linkage(72ab),
Linkage(72ba),
Linkage(72bb),
Linkage(82aa),
Linkage(82ab),
Linkage(82ba),
Linkage(82bb),
Linkage(23aa),
Linkage(23bb),
Linkage(33aa),
Linkage(33ab),
Linkage(33ba),
Linkage(33bb),
Linkage(43aa),
Linkage(43ab),
Linkage(43ba),
Linkage(43bb),
Linkage(53aa),
Linkage(53ab),
Linkage(53ba),
Linkage(53bb),
Linkage(63aa),
Linkage(63ab),
Linkage(63ba),
Linkage(63bb),
Linkage(73aa),
Linkage(73ab),
Linkage(73ba),
Linkage(73bb),
Linkage(83aa),
Linkage(83ab),
Linkage(83ba),
Linkage(83bb),
Linkage(24aa),
Linkage(24ab),
Linkage(24ba),
Linkage(24bb),
Linkage(34aa),
Linkage(34ab),
Linkage(34ba),
Linkage(34bb),
Linkage(44aa),
Linkage(44ab),
Linkage(44ba),
Linkage(44bb),
Linkage(54aa),
Linkage(54ab),
Linkage(54ba),
Linkage(54bb),
Linkage(64aa),
Linkage(64ab),
Linkage(64ba),
Linkage(64bb),
Linkage(74aa),
Linkage(74ab),
Linkage(74ba),
Linkage(74bb),
Linkage(84aa),
Linkage(84ab),
Linkage(84ba),
Linkage(84bb),
Linkage(15aa),
Linkage(15ab),
Linkage(15ba),
Linkage(15bb),
Linkage(25aa),
Linkage(25ab),
Linkage(25ba),
Linkage(25bb),
Linkage(35aa),
Linkage(35ab),
Linkage(35ba),
Linkage(35bb),
Linkage(45aa),
Linkage(45ab),
Linkage(45ba),
Linkage(45bb),
Linkage(55aa),
Linkage(55ab),
Linkage(55ba),
Linkage(55bb),
Linkage(65aa),
Linkage(65ab),
Linkage(65ba),
Linkage(65bb),
Linkage(75aa),
Linkage(75ab),
Linkage(75ba),
Linkage(75bb),
Linkage(85aa),
Linkage(85ab),
Linkage(85ba),
Linkage(85bb),
Linkage(26aa),
Linkage(26ab),
Linkage(26ba),
Linkage(26bb),
Linkage(36aa),
Linkage(36ab),
Linkage(36ba),
Linkage(36bb),
Linkage(46aa),
Linkage(46ab),
Linkage(46ba),
Linkage(46bb),
Linkage(56aa),
Linkage(56ab),
Linkage(56ba),
Linkage(56bb),
Linkage(66aa),
Linkage(66ab),
Linkage(66ba),
Linkage(66bb),
Linkage(76aa),
Linkage(76ab),
Linkage(76ba),
Linkage(76bb),
Linkage(86aa),
Linkage(86ab),
Linkage(86ba),
Linkage(86bb),
Linkage(17aa),
Linkage(17ab),
Linkage(17ba),
Linkage(17bb),
Linkage(27aa),
Linkage(27ab),
Linkage(27ba),
Linkage(27bb),
Linkage(37aa),
Linkage(37ab),
Linkage(37ba),
Linkage(37bb),
Linkage(47aa),
Linkage(47ab),
Linkage(47ba),
Linkage(47bb),
Linkage(57aa),
Linkage(57ab),
Linkage(57ba),
Linkage(57bb),
Linkage(67aa),
Linkage(67ab),
Linkage(67ba),
Linkage(67bb),
Linkage(77aa),
Linkage(77ab),
Linkage(77ba),
Linkage(77bb),
Linkage(87aa),
Linkage(87ab),
Linkage(87ba),
Linkage(87bb),
Linkage(18aa),
Linkage(18ab),
Linkage(18ba),
Linkage(18bb),
Linkage(28aa),
Linkage(28ab),
Linkage(28ba),
Linkage(28bb),
Linkage(38aa),
Linkage(38ab),
Linkage(38ba),
Linkage(38bb),
Linkage(48aa),
Linkage(48ab),
Linkage(48ba),
Linkage(48bb),
Linkage(58aa),
Linkage(58ab),
Linkage(58ba),
Linkage(58bb),
Linkage(68aa),
Linkage(68ab),
Linkage(68ba),
Linkage(68bb),
Linkage(78aa),
Linkage(78ab),
Linkage(78ba),
Linkage(78bb),
Linkage(88aa),
Linkage(88ab),
Linkage(88ba),
Linkage(88bb),
Linkage(CER-glyco),
Linkage(SPL-glyco)]
We can refer to each of these linkages by their id, e.g. "14bb" for a 1-4 beta glycosidic linkage, etc. Hence, we can connect the Galactose to the Glucose using:
[6]:
glycan = gl.connect(glc, gal, "14bb")
glycan.show3d()
/Users/noahhk/anaconda3/envs/glyco2/lib/python3.11/site-packages/plotly/express/_core.py:1985: FutureWarning:
When grouping with a length-1 list-like, you will need to pass a length-1 tuple to get_group in a future version of pandas. Pass `(name,)` instead of `name` to silence this warning.
Next, let’s add the GlcNAc to the Galactose via a 1-3 beta glycosydic linkage:
[7]:
# this time we use the method-syntax (rather than the connect function) to attach the next residue
glycan.attach(glcnac, "13bb")
glycan.show3d()
/Users/noahhk/anaconda3/envs/glyco2/lib/python3.11/site-packages/plotly/express/_core.py:1985: FutureWarning:
When grouping with a length-1 list-like, you will need to pass a length-1 tuple to get_group in a future version of pandas. Pass `(name,)` instead of `name` to silence this warning.
Now we still need attach the GlcNAc+Gal branch to the glycan. Let’s quickly do this:
[8]:
# attach at the second residue (i.e. the first one we artificially attached, Gal)
# we need to specify the residue because we do not want to add to the "end" of the glycan
# but somewhere in the middle
glycan.attach(glcnac, "16bb", at_residue=2)
# and attach the final residue
# (no need to re-define the at_residue since we're attaching to the end again)
glycan.attach(gal, "14bb")
glycan.show3d()
/Users/noahhk/anaconda3/envs/glyco2/lib/python3.11/site-packages/plotly/express/_core.py:1985: FutureWarning:
When grouping with a length-1 list-like, you will need to pass a length-1 tuple to get_group in a future version of pandas. Pass `(name,)` instead of `name` to silence this warning.
Let’s quickly see the 2D glycan tree to validate that the glycan has the right structure
[9]:
glycan.show2d()
If we are unhappy with parts of it, we can call on the optimize method to improve the conformation a little :-)
[12]:
# optimize the conformation (if we are unhappy for some reason)
# there are of course many additional options that can be passed to this method...
glycan.optimize()
glycan.show3d()
/Users/noahhk/anaconda3/envs/glyco2/lib/python3.11/site-packages/plotly/express/_core.py:1985: FutureWarning:
When grouping with a length-1 list-like, you will need to pass a length-1 tuple to get_group in a future version of pandas. Pass `(name,)` instead of `name` to silence this warning.
If we are happy now, maybe we want to use the structure for some other experiment like molecular dynamics. Let’s export the structure to a PDB file so we can use it with other software…
[13]:
glycan.to_pdb("./files/manually_built_glycan.pdb")
That’s it already! That’s how we can make glycans manually. It is certainly more effort than using a IUPAC graph, but like this we can also make modified glycans or glycan-derivatives efficiently and are not limited to what is defined in IUPAC syntax!