Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

unusable in NPM #1

Open
omaraltayyan opened this issue Oct 30, 2020 · 0 comments
Open

unusable in NPM #1

omaraltayyan opened this issue Oct 30, 2020 · 0 comments

Comments

@omaraltayyan
Copy link

the whole goal of making an NPM package is to use it in bundlers like webpack, the code published on NPM doesn't support this, can we modify the prot param file to accept bundling in npm?

this is the content of protparam.js that support ES6 modules

// A part of the code below fetched from https://github.com/biopython/biopython

let protein_weights = {
    "A": 89.0932,
    "C": 121.1582,
    "D": 133.1027,
    "E": 147.1293,
    "F": 165.1891,
    "G": 75.0666,
    "H": 155.1546,
    "I": 131.1729,
    "K": 146.1876,
    "L": 131.1729,
    "M": 149.2113,
    "N": 132.1179,
    "O": 255.3134,
    "P": 115.1305,
    "Q": 146.1445,
    "R": 174.201,
    "S": 105.0926,
    "T": 119.1192,
    "U": 168.0532,
    "V": 117.1463,
    "W": 204.2252,
    "Y": 181.1885
}

let monoisotopic_protein_weights = {
    "A": 89.047678,
    "C": 121.019749,
    "D": 133.037508,
    "E": 147.053158,
    "F": 165.078979,
    "G": 75.032028,
    "H": 155.069477,
    "I": 131.094629,
    "K": 146.105528,
    "L": 131.094629,
    "M": 149.051049,
    "N": 132.053492,
    "O": 255.158292,
    "P": 115.063329,
    "Q": 146.069142,
    "R": 174.111676,
    "S": 105.042593,
    "T": 119.058243,
    "U": 168.964203,
    "V": 117.078979,
    "W": 204.089878,
    "Y": 181.073893
}


// Copyright 2003 Yair Benita.  All rights reserved.
// This file is part of the Biopython distribution and governed by your
// choice of the "Biopython License Agreement" or the "BSD 3-Clause License".
// Please see the LICENSE file that should have been included as part of this
// package.
// Indices to be used with ProtParam.


// Kyte & Doolittle index of hydrophobicity
// J. Mol. Biol. 157:105-132(1982).
let kd = {
    'A': 1.8, 'R': -4.5, 'N': -3.5, 'D': -3.5, 'C': 2.5,
    'Q': -3.5, 'E': -3.5, 'G': -0.4, 'H': -3.2, 'I': 4.5,
    'L': 3.8, 'K': -3.9, 'M': 1.9, 'F': 2.8, 'P': -1.6,
    'S': -0.8, 'T': -0.7, 'W': -0.9, 'Y': -1.3, 'V': 4.2
}

// Flexibility
// Normalized flexibility parameters (B-values), average
// Vihinen M., Torkkila E., Riikonen P. Proteins. 19(2):141-9(1994).
let Flex = {
    'A': 0.984, 'C': 0.906, 'E': 1.094, 'D': 1.068,
    'G': 1.031, 'F': 0.915, 'I': 0.927, 'H': 0.950,
    'K': 1.102, 'M': 0.952, 'L': 0.935, 'N': 1.048,
    'Q': 1.037, 'P': 1.049, 'S': 1.046, 'R': 1.008,
    'T': 0.997, 'W': 0.904, 'V': 0.931, 'Y': 0.929
}

// Hydrophilicity
// 1 Hopp & Wood
// Proc. Natl. Acad. Sci. U.S.A. 78:3824-3828(1981).
let hw = {
    'A': -0.5, 'R': 3.0, 'N': 0.2, 'D': 3.0, 'C': -1.0,
    'Q': 0.2, 'E': 3.0, 'G': 0.0, 'H': -0.5, 'I': -1.8,
    'L': -1.8, 'K': 3.0, 'M': -1.3, 'F': -2.5, 'P': 0.0,
    'S': 0.3, 'T': -0.4, 'W': -3.4, 'Y': -2.3, 'V': -1.5
}

// Surface accessibility
// Vergoten G & Theophanides T, Biomolecular Structure and Dynamics,
// pg.138 (1997).
// 1 Emini Surface fractional probability
let em = {
    'A': 0.815, 'R': 1.475, 'N': 1.296, 'D': 1.283, 'C': 0.394,
    'Q': 1.348, 'E': 1.445, 'G': 0.714, 'H': 1.180, 'I': 0.603,
    'L': 0.603, 'K': 1.545, 'M': 0.714, 'F': 0.695, 'P': 1.236,
    'S': 1.115, 'T': 1.184, 'W': 0.808, 'Y': 1.089, 'V': 0.606
}

// 2 Janin Interior to surface transfer energy scale
let ja = {
    'A': 0.28, 'R': -1.14, 'N': -0.55, 'D': -0.52, 'C': 0.97,
    'Q': -0.69, 'E': -1.01, 'G': 0.43, 'H': -0.31, 'I': 0.60,
    'L': 0.60, 'K': -1.62, 'M': 0.43, 'F': 0.46, 'P': -0.42,
    'S': -0.19, 'T': -0.32, 'W': 0.29, 'Y': -0.15, 'V': 0.60
}


// A two dimensional dictionary for calculating the instability index.
// Guruprasad K., Reddy B.V.B., Pandit M.W. Protein Engineering 4:155-161(1990).
// It is based on dipeptide values; therefore, the value for the dipeptide DG
// is DIWV['D']['G'].
let DIWV = {
    'A': {
        'A': 1.0, 'C': 44.94, 'E': 1.0, 'D': -7.49,
        'G': 1.0, 'F': 1.0, 'I': 1.0, 'H': -7.49,
        'K': 1.0, 'M': 1.0, 'L': 1.0, 'N': 1.0,
        'Q': 1.0, 'P': 20.26, 'S': 1.0, 'R': 1.0,
        'T': 1.0, 'W': 1.0, 'V': 1.0, 'Y': 1.0
    },
    'C': {
        'A': 1.0, 'C': 1.0, 'E': 1.0, 'D': 20.26,
        'G': 1.0, 'F': 1.0, 'I': 1.0, 'H': 33.60,
        'K': 1.0, 'M': 33.60, 'L': 20.26, 'N': 1.0,
        'Q': -6.54, 'P': 20.26, 'S': 1.0, 'R': 1.0,
        'T': 33.60, 'W': 24.68, 'V': -6.54, 'Y': 1.0
    },
    'E': {
        'A': 1.0, 'C': 44.94, 'E': 33.60, 'D': 20.26,
        'G': 1.0, 'F': 1.0, 'I': 20.26, 'H': -6.54,
        'K': 1.0, 'M': 1.0, 'L': 1.0, 'N': 1.0,
        'Q': 20.26, 'P': 20.26, 'S': 20.26, 'R': 1.0,
        'T': 1.0, 'W': -14.03, 'V': 1.0, 'Y': 1.0
    },
    'D': {
        'A': 1.0, 'C': 1.0, 'E': 1.0, 'D': 1.0,
        'G': 1.0, 'F': -6.54, 'I': 1.0, 'H': 1.0,
        'K': -7.49, 'M': 1.0, 'L': 1.0, 'N': 1.0,
        'Q': 1.0, 'P': 1.0, 'S': 20.26, 'R': -6.54,
        'T': -14.03, 'W': 1.0, 'V': 1.0, 'Y': 1.0
    },
    'G': {
        'A': -7.49, 'C': 1.0, 'E': -6.54, 'D': 1.0,
        'G': 13.34, 'F': 1.0, 'I': -7.49, 'H': 1.0,
        'K': -7.49, 'M': 1.0, 'L': 1.0, 'N': -7.49,
        'Q': 1.0, 'P': 1.0, 'S': 1.0, 'R': 1.0,
        'T': -7.49, 'W': 13.34, 'V': 1.0, 'Y': -7.49
    },
    'F': {
        'A': 1.0, 'C': 1.0, 'E': 1.0, 'D': 13.34,
        'G': 1.0, 'F': 1.0, 'I': 1.0, 'H': 1.0,
        'K': -14.03, 'M': 1.0, 'L': 1.0, 'N': 1.0,
        'Q': 1.0, 'P': 20.26, 'S': 1.0, 'R': 1.0,
        'T': 1.0, 'W': 1.0, 'V': 1.0, 'Y': 33.601
    },
    'I': {
        'A': 1.0, 'C': 1.0, 'E': 44.94, 'D': 1.0,
        'G': 1.0, 'F': 1.0, 'I': 1.0, 'H': 13.34,
        'K': -7.49, 'M': 1.0, 'L': 20.26, 'N': 1.0,
        'Q': 1.0, 'P': -1.88, 'S': 1.0, 'R': 1.0,
        'T': 1.0, 'W': 1.0, 'V': -7.49, 'Y': 1.0
    },
    'H': {
        'A': 1.0, 'C': 1.0, 'E': 1.0, 'D': 1.0,
        'G': -9.37, 'F': -9.37, 'I': 44.94, 'H': 1.0,
        'K': 24.68, 'M': 1.0, 'L': 1.0, 'N': 24.68,
        'Q': 1.0, 'P': -1.88, 'S': 1.0, 'R': 1.0,
        'T': -6.54, 'W': -1.88, 'V': 1.0, 'Y': 44.94
    },
    'K': {
        'A': 1.0, 'C': 1.0, 'E': 1.0, 'D': 1.0,
        'G': -7.49, 'F': 1.0, 'I': -7.49, 'H': 1.0,
        'K': 1.0, 'M': 33.60, 'L': -7.49, 'N': 1.0,
        'Q': 24.64, 'P': -6.54, 'S': 1.0, 'R': 33.60,
        'T': 1.0, 'W': 1.0, 'V': -7.49, 'Y': 1.0
    },
    'M': {
        'A': 13.34, 'C': 1.0, 'E': 1.0, 'D': 1.0,
        'G': 1.0, 'F': 1.0, 'I': 1.0, 'H': 58.28,
        'K': 1.0, 'M': -1.88, 'L': 1.0, 'N': 1.0,
        'Q': -6.54, 'P': 44.94, 'S': 44.94, 'R': -6.54,
        'T': -1.88, 'W': 1.0, 'V': 1.0, 'Y': 24.68
    },
    'L': {
        'A': 1.0, 'C': 1.0, 'E': 1.0, 'D': 1.0,
        'G': 1.0, 'F': 1.0, 'I': 1.0, 'H': 1.0,
        'K': -7.49, 'M': 1.0, 'L': 1.0, 'N': 1.0,
        'Q': 33.60, 'P': 20.26, 'S': 1.0, 'R': 20.26,
        'T': 1.0, 'W': 24.68, 'V': 1.0, 'Y': 1.0
    },
    'N': {
        'A': 1.0, 'C': -1.88, 'E': 1.0, 'D': 1.0,
        'G': -14.03, 'F': -14.03, 'I': 44.94, 'H': 1.0,
        'K': 24.68, 'M': 1.0, 'L': 1.0, 'N': 1.0,
        'Q': -6.54, 'P': -1.88, 'S': 1.0, 'R': 1.0,
        'T': -7.49, 'W': -9.37, 'V': 1.0, 'Y': 1.0
    },
    'Q': {
        'A': 1.0, 'C': -6.54, 'E': 20.26, 'D': 20.26,
        'G': 1.0, 'F': -6.54, 'I': 1.0, 'H': 1.0,
        'K': 1.0, 'M': 1.0, 'L': 1.0, 'N': 1.0,
        'Q': 20.26, 'P': 20.26, 'S': 44.94, 'R': 1.0,
        'T': 1.0, 'W': 1.0, 'V': -6.54, 'Y': -6.54
    },
    'P': {
        'A': 20.26, 'C': -6.54, 'E': 18.38, 'D': -6.54,
        'G': 1.0, 'F': 20.26, 'I': 1.0, 'H': 1.0,
        'K': 1.0, 'M': -6.54, 'L': 1.0, 'N': 1.0,
        'Q': 20.26, 'P': 20.26, 'S': 20.26, 'R': -6.54,
        'T': 1.0, 'W': -1.88, 'V': 20.26, 'Y': 1.0
    },
    'S': {
        'A': 1.0, 'C': 33.60, 'E': 20.26, 'D': 1.0,
        'G': 1.0, 'F': 1.0, 'I': 1.0, 'H': 1.0,
        'K': 1.0, 'M': 1.0, 'L': 1.0, 'N': 1.0,
        'Q': 20.26, 'P': 44.94, 'S': 20.26, 'R': 20.26,
        'T': 1.0, 'W': 1.0, 'V': 1.0, 'Y': 1.0
    },
    'R': {
        'A': 1.0, 'C': 1.0, 'E': 1.0, 'D': 1.0,
        'G': -7.49, 'F': 1.0, 'I': 1.0, 'H': 20.26,
        'K': 1.0, 'M': 1.0, 'L': 1.0, 'N': 13.34,
        'Q': 20.26, 'P': 20.26, 'S': 44.94, 'R': 58.28,
        'T': 1.0, 'W': 58.28, 'V': 1.0, 'Y': -6.54
    },
    'T': {
        'A': 1.0, 'C': 1.0, 'E': 20.26, 'D': 1.0,
        'G': -7.49, 'F': 13.34, 'I': 1.0, 'H': 1.0,
        'K': 1.0, 'M': 1.0, 'L': 1.0, 'N': -14.03,
        'Q': -6.54, 'P': 1.0, 'S': 1.0, 'R': 1.0,
        'T': 1.0, 'W': -14.03, 'V': 1.0, 'Y': 1.0
    },
    'W': {
        'A': -14.03, 'C': 1.0, 'E': 1.0, 'D': 1.0,
        'G': -9.37, 'F': 1.0, 'I': 1.0, 'H': 24.68,
        'K': 1.0, 'M': 24.68, 'L': 13.34, 'N': 13.34,
        'Q': 1.0, 'P': 1.0, 'S': 1.0, 'R': 1.0,
        'T': -14.03, 'W': 1.0, 'V': -7.49, 'Y': 1.0
    },
    'V': {
        'A': 1.0, 'C': 1.0, 'E': 1.0, 'D': -14.03,
        'G': -7.49, 'F': 1.0, 'I': 1.0, 'H': 1.0,
        'K': -1.88, 'M': 1.0, 'L': 1.0, 'N': 1.0,
        'Q': 1.0, 'P': 20.26, 'S': 1.0, 'R': 1.0,
        'T': -7.49, 'W': 1.0, 'V': 1.0, 'Y': -6.54
    },
    'Y': {
        'A': 24.68, 'C': 1.0, 'E': -6.54, 'D': 24.68,
        'G': -7.49, 'F': 1.0, 'I': 1.0, 'H': 13.34,
        'K': 1.0, 'M': 44.94, 'L': 1.0, 'N': 1.0,
        'Q': 1.0, 'P': 13.34, 'S': 1.0, 'R': -15.91,
        'T': -7.49, 'W': -9.37, 'V': 1.0, 'Y': 13.34
    },
}

let protein_letters = "ACDEFGHIKLMNPQRSTVWY"

let sum = function (arr) {
    return arr.reduce(function (prev, current, i, arr) {
        return prev + current;
    });
};

export default class ProtParam {
    constructor(protein, id = '', description = '') {
        this.protein = protein.toUpperCase();
        this.amino_acids = Array.from(this.protein)
        this.id = id
        this.description = description
    }

    count_amino_acids() {
        let count_dict = {}
        for (let i in this.protein) {
            let aa = this.protein[i]
            if (count_dict[aa]) {
                count_dict[aa] += 1
            } else {
                count_dict[aa] = 1
            }
        }
        for (let i in protein_letters) {
            let aa = protein_letters[i]
            if (!count_dict[aa]) {
                count_dict[aa] = 0
            }
        }
        return count_dict
    }

    get_amino_acids_percent() {
        let count_dict = this.count_amino_acids()
        for (let aa in count_dict) {
            if (this.protein.length !== 0) {
                count_dict[aa] = count_dict[aa] / this.protein.length
            }
        }
        return count_dict
    }

    molecular_weight(circular = false, monoisotopic = false) {
        if (this.protein.length === 0) {
            return null
        }
        // circular: Is the molecule circular (has no ends)?
        // monoisotopic: Use the monoisotopic mass tables?
        if (monoisotopic) {
            let water = 18.010565
            let weight_table = monoisotopic_protein_weights
        } else {
            let water = 18.0153
            let weight_table = protein_weights
        }
        let weight = sum(this.amino_acids.map(function (aa) {
            return weight_table[aa];
        }))
        weight -= (this.protein.length - 1) * water
        if (circular) {
            weight -= water
        }
        return weight
    }

    gravy() {
        if (this.protein.length === 0) {
            return null
        }
        let total_gravy = sum(this.kd_hydrophobicity())
        return total_gravy / this.protein.length
    }

    absorbance() {
        if (this.protein.length === 0) {
            return null
        }
        // Tyr Y , Thr T, Trp W, Cys C
        let ext_Y = 1490
        let ext_W = 5500
        let ext_C = 125
        let count_dict = this.count_amino_acids()
        let extinction_coefficients = count_dict["Y"] * ext_Y + count_dict["W"] * ext_W + count_dict["C"] * ext_C
        return extinction_coefficients / this.molecular_weight()
    }

    instability_index() {
        if (this.protein.length === 0) {
            return null
        }
        let score = 0.0
        for (let i in this.amino_acids) {
            i = parseInt(i)
            if (i >= this.protein.length - 1) {
                return (10.0 / this.protein.length) * score
            }
            let this_aa = this.protein[i]
            let next_aa = this.protein[i + 1]
            let dipeptide_value = DIWV[this_aa][next_aa]
            score += dipeptide_value
        }
    }

    kd_hydrophobicity() {
        return this.amino_acids.map(function (aa) {
            return kd[aa]
        })
    }

}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant