sequaljs
Version:
JavaScript/TypeScript library for parsing and manipulating ProForma peptide sequence notation
126 lines (125 loc) • 6.22 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const sequence_1 = require("../sequence");
describe("ProForma 2.1: Terminal Global Modifications (Section 11.3.2)", () => {
test("should parse N-terminal global modification", () => {
const seq = sequence_1.Sequence.fromProforma("<[Acetyl]@N-term>PEPTIDE");
const globalMods = seq.globalMods;
expect(globalMods.length).toBe(1);
const mod = globalMods[0];
expect(mod.targetResidues).toEqual(["N-term"]);
expect(mod.globalModType).toBe("fixed");
});
test("should parse C-terminal global modification", () => {
const seq = sequence_1.Sequence.fromProforma("<[Amidated]@C-term>PEPTIDE");
const globalMods = seq.globalMods;
expect(globalMods.length).toBe(1);
const mod = globalMods[0];
expect(mod.targetResidues).toEqual(["C-term"]);
expect(mod.globalModType).toBe("fixed");
});
test("should parse terminal-specific modification", () => {
const seq = sequence_1.Sequence.fromProforma("<[Gln->pyro-Glu]@N-term:Q>QATPEILMCNSIGCLMG");
const globalMods = seq.globalMods;
expect(globalMods.length).toBe(1);
const mod = globalMods[0];
expect(mod.targetResidues).toEqual(["N-term:Q"]);
});
test("should parse C-terminal specific modification", () => {
const seq = sequence_1.Sequence.fromProforma("<[Oxidation]@C-term:G>PEPTIDEG");
const globalMods = seq.globalMods;
expect(globalMods.length).toBe(1);
const mod = globalMods[0];
expect(mod.targetResidues).toEqual(["C-term:G"]);
});
test("should parse mixed amino acid and terminal targets", () => {
const seq = sequence_1.Sequence.fromProforma("<[TMT6plex]@K,N-term>PEPTIDEK");
const globalMods = seq.globalMods;
expect(globalMods.length).toBe(1);
const mod = globalMods[0];
expect(mod.targetResidues).toContain("K");
expect(mod.targetResidues).toContain("N-term");
});
test("should parse multiple terminal global modifications", () => {
const seq = sequence_1.Sequence.fromProforma("<[TMT6plex]@K,N-term><[Oxidation]@M,C-term:G>MTPEILTCNSIGCLK");
const globalMods = seq.globalMods;
expect(globalMods.length).toBe(2);
const mod1 = globalMods[0];
expect(mod1.targetResidues).toContain("K");
expect(mod1.targetResidues).toContain("N-term");
const mod2 = globalMods[1];
expect(mod2.targetResidues).toContain("M");
expect(mod2.targetResidues).toContain("C-term:G");
});
test("should serialize N-terminal global modification", () => {
const original = "<[Acetyl]@N-term>PEPTIDE";
const seq = sequence_1.Sequence.fromProforma(original);
const proforma = seq.toProforma();
expect(proforma).toBe(original);
});
test("should serialize C-terminal global modification", () => {
const original = "<[Amidated]@C-term>PEPTIDE";
const seq = sequence_1.Sequence.fromProforma(original);
const proforma = seq.toProforma();
expect(proforma).toBe(original);
});
test("should serialize terminal-specific modification", () => {
const original = "<[Gln->pyro-Glu]@N-term:Q>QATPEILMCNSIGCLMG";
const seq = sequence_1.Sequence.fromProforma(original);
const proforma = seq.toProforma();
expect(proforma).toBe(original);
});
test("should round-trip terminal global modifications", () => {
const testCases = [
"<[Acetyl]@N-term>PEPTIDE",
"<[Amidated]@C-term>PEPTIDE",
"<[Gln->pyro-Glu]@N-term:Q>QATPEILMCNSIGCLMG",
"<[Oxidation]@C-term:G>PEPTIDEG",
"<[TMT6plex]@K,N-term>PEPTIDEK",
"<[TMT6plex]@K,N-term><[Oxidation]@M,C-term:G>MTPEILTCNSIGCLK",
];
for (const original of testCases) {
const seq = sequence_1.Sequence.fromProforma(original);
const proforma = seq.toProforma();
const seq2 = sequence_1.Sequence.fromProforma(proforma);
const proforma2 = seq2.toProforma();
expect(proforma).toBe(original);
expect(proforma2).toBe(original);
}
});
test("should handle N-terminal with modifications in sequence", () => {
const seq = sequence_1.Sequence.fromProforma("<[Acetyl]@N-term>PE[Phospho]PTIDE");
expect(seq.globalMods.length).toBe(1);
expect(seq.globalMods[0].targetResidues).toEqual(["N-term"]);
expect(seq.seq[1].mods.length).toBe(1);
expect(seq.seq[1].mods[0].value).toBe("Phospho");
});
test("should handle both terminals in one modification", () => {
const seq = sequence_1.Sequence.fromProforma("<[Label]@N-term,C-term>PEPTIDE");
const globalMods = seq.globalMods;
expect(globalMods.length).toBe(1);
expect(globalMods[0].targetResidues).toContain("N-term");
expect(globalMods[0].targetResidues).toContain("C-term");
});
test("should handle terminal modification with charge state", () => {
const seq = sequence_1.Sequence.fromProforma("<[Acetyl]@N-term>PEPTIDE/2");
expect(seq.globalMods.length).toBe(1);
expect(seq.globalMods[0].targetResidues).toEqual(["N-term"]);
expect(seq.charge).toBe(2);
});
test("should handle terminal modification with placement controls", () => {
const seq = sequence_1.Sequence.fromProforma("<[TMT6plex|Limit:1]@K,N-term>PEPTIDEK");
const globalMods = seq.globalMods;
expect(globalMods.length).toBe(1);
expect(globalMods[0].targetResidues).toContain("K");
expect(globalMods[0].targetResidues).toContain("N-term");
expect(globalMods[0].getLimitPerPosition()).toBe(1);
});
test("should differentiate N-term from regular N residue", () => {
const seq = sequence_1.Sequence.fromProforma("<[Acetyl]@N-term>NPEPTIDE");
const globalMods = seq.globalMods;
expect(globalMods.length).toBe(1);
expect(globalMods[0].targetResidues).toEqual(["N-term"]);
expect(globalMods[0].targetResidues).not.toContain("N");
});
});