Source code for pyrfume.pubchem

import json

import requests


[docs]def get_summary(cid): url = "https://pubchem.ncbi.nlm.nih.gov/rest/pug/compound/cid/%d/description/json" % cid result = requests.get(url) summary = json.loads(result.content) return summary
[docs]def parse_summary_for_odor(summary): statements = [] # keywords should include aroma but exclude aromatic (due to its special meaning in chemistry) keywords = ("odor", "odour", "smell", "aroma ", "aroma,", "aroma.", "fragrance") if "InformationList" in summary: for item in summary["InformationList"]["Information"]: if "Description" in item: for statement in item["Description"].split("."): if any([x in statement.lower() for x in keywords]): statements.append(statement.strip()) return statements
[docs]def get_physical_description(cid): url = ( "https://pubchem.ncbi.nlm.nih.gov/rest/pug_view/data/compound/%d/JSON?heading=" "Physical+Description" % cid ) result = requests.get(url) try: summary = json.loads(result.content) except UnicodeDecodeError: summary = {} return summary
[docs]def parse_physical_description_for_odor(physical_description): statements = [] try: strings = [ x["Value"]["StringWithMarkup"][0]["String"] for x in physical_description["Record"]["Section"][0]["Section"][0]["Section"][0][ "Information" ] ] except KeyError: pass else: # keywords should include aroma but exclude aromatic # (due to its special meaning in chemistry) keywords = ("odor", "odour", "smell", "aroma ", "aroma,", "aroma.", "fragrance") for string in strings: for statement in string.split("."): if any([x in statement.lower() for x in keywords]): statements.append(statement.strip()) return statements
[docs]def get_ghs_classification(cid): url = ( "https://pubchem.ncbi.nlm.nih.gov/rest/pug_view/data/compound/%d/JSON?heading=GHS" "+Classification" % cid ) result = requests.get(url) try: summary = json.loads(result.content) except UnicodeDecodeError: summary = {} return summary
GHS_CODES = { "H300": "Fatal if swallowed.", "H301": "Toxic if swallowed", "H302": "Harmful if swallowed", "H303": "May be harmful if swallowed", "H304": "May be fatal if swallowed and enters airways", "H305": "May be harmful if swallowed and enters airways", "H310": "Fatal in contact with skin", "H311": "Toxic in contact with skin", "H312": "Harmful in contact with skin", "H313": "May be harmful in contact with skin", "H314": "Causes severe skin burns and eye damage", "H315": "Causes skin irritation", "H316": "Causes mild skin irritation", "H317": "May cause an allergic skin reaction", "H318": "Causes serious eye damage", "H319": "Causes serious eye irritation", "H320": "Causes eye irritation", "H330": "Fatal if inhaled", "H331": "Toxic if inhaled", "H332": "Harmful if inhaled", "H333": "May be harmful if inhaled", "H334": "May cause allergy or asthma symptoms or breathing difficulties if inhaled", "H335": "May cause respiratory irritation", "H336": "May cause drowsiness or dizziness", "H340": "May cause genetic defects", "H341": "Suspected of causing genetic defects", "H350": "May cause cancer", "H351": "Suspected of causing cancer", "H360": "May damage fertility or the unborn child", "H361": "Suspected of damaging fertility or the unborn child", "H361d": "Suspected of damaging the unborn child", "H361e": "May damage the unborn child", "H361f": "Suspected of damaging fertility", "H361g": "may damage fertility", "H362": "May cause harm to breast-fed children", "H370": "Causes damage to organs", "H371": "May cause damage to organs", "H372": "Causes damage to organs through prolonged or repeated exposure", "H373": "May cause damage to organs through prolonged or repeated exposure", }
[docs]def parse_ghs_classification_for_odor( ghs_info, codes=("H330", "H331", "H334", "H340", "H350", "H350i", "H351", "H36", "H37"), only_percent=True, code_only=True, ): strings = [] if "Record" in ghs_info: for block in ghs_info["Record"]["Section"][0]["Section"][0]["Section"][0]["Information"]: if block["Name"] == "GHS Hazard Statements": for entry in block["Value"]["StringWithMarkup"]: string = entry["String"] for code in codes: match = (code + " (") if only_percent else code if match in string: if code_only: string = string.split(":")[0] strings.append(string) return strings