#define NUM_PERIODIC_TABLE_ATOM 110
#define NUM_MASS_TABLE_AMINO_ACIDS 20
#define NUM_MASS_TABLE_NUCLEIC_ACIDS 5

typedef struct {
        char Atom_Symbol[4];
        char Atom_Name[20];
        double Atom_Mass;
} ELEMENT_PERIODIC_TABLE;

extern ELEMENT_PERIODIC_TABLE periodic_table[NUM_PERIODIC_TABLE_ATOM];

ELEMENT_PERIODIC_TABLE periodic_table[NUM_PERIODIC_TABLE_ATOM] = {
       {"H",   "Hydrogen",       1.0079   },
       {"He",  "Helium",         4.0026   },
       {"Li",  "Lithium",        6.941    },
       {"Be",  "Beryllium",      9.01218  },
       {"B",   "Boron",          10.81    },
       {"C",   "Carbon",         12.011   },
       {"N",   "Nitrogen",       14.0067  },
       {"O",   "Oxygen",         15.9994  },
       {"F",   "Fluorine",       18.9984  },
       {"Ne",  "Neon",           20.179   },
       {"Na",  "Sodium",         22.98977 },
       {"Mg",  "Magnesium",      24.305   },
       {"Al",  "Aluminum",       26.98154 },
       {"Si",  "Silicon",        28.0855  },
       {"P",   "Phosphorus",     30.97376 },
       {"S",   "Sulfur",         32.06    },
       {"Cl",  "Chlorine",       35.453   },
       {"Ar",  "Argon",          39.948   },
       {"K",   "Potassium",      39.0983  },
       {"Ca",  "Calcium",        40.08    },
       {"Sc",  "Scandium",       44.9559  },
       {"Ti",  "Titanium",       47.9     },
       {"V",   "Vanadium",       50.9415  },
       {"Cr",  "Chromium",       51.996   },
       {"Mn",  "Manganese",      54.938   },
       {"Fe",  "Iron",           55.847   },
       {"Co",  "Cobalt",         58.9332  },
       {"Ni",  "Nickel",         58.7     },
       {"Cu",  "Copper",         63.546   },
       {"Zn",  "Zinc",           65.38    },
       {"Ga",  "Gallium",        69.72    },
       {"Ge",  "Germanium",      72.59    },
       {"As",  "Arsenic",        74.9216  },
       {"Se",  "Selenium",       78.96    },
       {"Br",  "Bromine",        79.904   },
       {"Kr",  "Krypton",        83.8     },
       {"Rb",  "Rubidium",       85.4678  },
       {"Sr",  "Strontium",      87.62    },
       {"Y",   "Yttrium",        88.9059  },
       {"Zr",  "Zirconium",      91.22    },
       {"Nb",  "Niobium",        92.9064  },
       {"Mo",  "Molybdenum",     95.94    },
       {"Tc",  "Technetium",     98.0     },
       {"Ru",  "Ruthenium",      101.07   },
       {"Rh",  "Rhodium",        102.9055 },
       {"Pd",  "Palladium",      106.4    },
       {"Ag",  "Silver",         107.868  },
       {"Cd",  "Cadmium",        112.41   },
       {"In",  "Indium",         114.82   },
       {"Sn",  "Tin",            118.69   },
       {"Sb",  "Antimony",       121.75   },
       {"Te",  "Tellurium",      127.6    },
       {"I",   "Iodine",         126.9045 },
       {"Xe",  "Xenon",          131.3    },
       {"Cs",  "Cesium",         132.9054 },
       {"Ba",  "Barium",         137.33   },
       {"La",  "Lanthanum",      138.9055 },
       {"Ce",  "Cerium",         140.12   },
       {"Pr",  "Praseodymium",   140.9077 },
       {"Nd",  "Neodymium",      144.24   },
       {"Pm",  "Promethium",     145.0    },
       {"Sm",  "Samarium",       150.4    },
       {"Eu",  "Europium",       151.96   },
       {"Gd",  "Gadolinium",     157.25   },
       {"Tb",  "Terbium",        158.9254 },
       {"Dy",  "Dysprosium",     162.5    },
       {"Ho",  "Holmium",        164.9304 },
       {"Er",  "Erbium",         167.26   },
       {"Tm",  "Thulium",        168.9342 },
       {"Yb",  "Ytterbium",      173.04   },
       {"Lu",  "Lutetium",       174.967  },
       {"Hf",  "Hafnium",        178.49   },
       {"Ta",  "Tantalum",       180.9479 },
       {"W",   "Tungsten",       183.85   },
       {"Re",  "Rhenium",        186.207  },
       {"Os",  "Osmium",         190.2    },
       {"Ir",  "Iridium",        192.22   },
       {"Pt",  "Platinum",       195.09   },
       {"Au",  "Gold",           196.9665 },
       {"Hg",  "Mercury",        200.59   },
       {"Tl",  "Thallium",       204.37   },
       {"Pb",  "Lead",           207.2    },
       {"Bi",  "Bismuth",        208.9804 },
       {"Po",  "Polonium",       209.0    },
       {"At",  "Astatine",       210.0    },
       {"Rn",  "Radon",          222.0    },
       {"Fr",  "Francium",       223.0197 },
       {"Ra",  "Radium",         226.0254 },
       {"Ac",  "Actinium",       227.0278 },
       {"Th",  "Thorium",        232.0381 },
       {"Pa",  "Protactinium",   231.0359 },
       {"U",   "Uranium",        238.029  },
       {"Np",  "Neptunium",      237.0482 },
       {"Pu",  "Plutonium",      244.0    },
       {"Am",  "Americium",      243.0    },
       {"Cm",  "Curium",         247.0    },
       {"Bk",  "Berkelium",      247.0    },
       {"Cf",  "Californium",    251.0    },
       {"Es",  "Einsteinium",    252.0    },
       {"Fm",  "Fermium",        257.0    },
       {"Md",  "Mendelevium",    258.0    },
       {"No",  "Nobelium",       259.0    },
       {"Lr",  "Lawrencium",     260.0    },
       {"Rf",  "Rutherfordium",  261.0    },
       {"Db",  "Dubnuim",        262.0    },
       {"Sg",  "Seaborgium",     263.0    },
       {"Bh",  "Bohrium",        262.0    },
       {"??",  "Hassium",        265.0    },
       {"Mt",  "Meitnerium",     266.0    },
       {"??",  "Element112",     277.0    }
};

typedef struct {
        char Residue_1[4];
        char Residue_3[4];
        char Residue_Name[20];
        double Residue_Mass;
        double Residue_Mass_H;
} RESIDUE_MASS_TABLE;

extern RESIDUE_MASS_TABLE mass_table_amino_acids[NUM_MASS_TABLE_AMINO_ACIDS];
extern RESIDUE_MASS_TABLE mass_table_nucleic_acids[NUM_MASS_TABLE_NUCLEIC_ACIDS];

RESIDUE_MASS_TABLE mass_table_amino_acids[NUM_MASS_TABLE_AMINO_ACIDS] = {
       {"G", "GLY", "Glycine      ", 54.03,   57.05  },
       {"A", "ALA", "Alanine      ", 66.04,   71.08  },
       {"V", "VAL", "Valine       ", 90.06,   99.13  },
       {"L", "LEU", "Leucine      ", 102.07,  113.16 },
       {"I", "ILE", "Isoleucine   ", 102.07,  113.16 },
       {"S", "SER", "Serine       ", 82.04,   87.08  },
       {"T", "THR", "Threonine    ", 94.05,   101.10 },
       {"C", "CYS", "Cysteine     ", 98.10,   103.14 },
       {"P", "PRO", "Proline      ", 90.06,   97.12  },
       {"F", "PHE", "Phenylalanine", 138.11,  147.18 },
       {"Y", "TYR", "Tyrosine     ", 154.10,  163.18 },
       {"W", "TRP", "Tryptophan   ", 176.13,  186.21 },
       {"H", "HIS", "Histidine    ", 130.09,  138.15 },
       {"D", "ASP", "Aspartic Acid", 110.05,  114.08 },
       {"N", "ASN", "Asparagine   ", 108.06,  114.10 },
       {"E", "GLU", "Glutamic Acid", 122.06,  129.12 },
       {"Q", "GLN", "Glutamine    ", 120.07,  128.13 },
       {"M", "MET", "Methionine   ", 122.12,  131.19 },
       {"K", "LYS", "Lysine       ", 116.08,  129.18 },
       {"R", "ARG", "Arginine     ", 144.09,  157.19 }
};

RESIDUE_MASS_TABLE mass_table_nucleic_acids[NUM_MASS_TABLE_NUCLEIC_ACIDS] = {
       {"A", "ADE", "Adenine      ", 301.11, 328.20 },
       {"T", "THY", "Thymine      ", 291.09, 303.19 },
       {"G", "GUA", "Guanine      ", 317.11, 344.20 },
       {"C", "CYT", "Cytosine     ", 277.09, 304.18 },
       {"U", "URA", "Uracil       ", 295.08, 305.16 }
};
