CHRIS / exposure_module /exposure.py
Robert Elder
implemented OPERA melting point prediction
a26b7e6
import numpy as np
from flask import render_template, request
#from functions import *
from functions import SigFigs, Piringer, WilkeChang, SheetRelease, SheetRates, RatePlot
from polymers import Polymers
from ChemID import ResolveChemical
from . import blueprint
import rdkit
from rdkit.Chem import AllChem as Chem
# load polymer data including Ap values
polymers, Ap = Polymers()
# get additional physical properties, options are: logp, rho, mp
#get_properties = [] # don't get any; this breaks ceramics logic
#get_properties = ['logp','rho','mp'] # get all three
get_properties = ['mp'] # only get mp
# show additional physical properties
show_properties = False
# output additional info for physical properties
debug = False
# load the index page for the exposure module
@blueprint.route('/exposure', methods=['GET'])
def exposure():
return render_template('exposure_index.html', polymers=polymers)
# build the report page for the exposure module
@blueprint.route('/exposure', methods=['POST'])
def exp_post():
chemName = request.form["chemName"]
IDtype = request.form["IDtype"]
if debug:
iupac, cas, smiles, MW, LogP, LogP_origin, rho, rho_origin, mp, mp_origin, molImage, error = ResolveChemical(chemName, IDtype, debug=debug, get_properties=['logp','rho','mp'])
LogP_origin, rho_origin, mp_origin = f' ({LogP_origin})', f' ({rho_origin})', f' ({mp_origin})',
else:
LogP_origin, rho_origin, mp_origin = '','',''
iupac, cas, smiles, MW, LogP, rho, mp, molImage, error = ResolveChemical(chemName, IDtype, get_properties=get_properties)
if error > 0:
# TODO output more useful info
return render_template('chemError.html')
#MW = SigFigs(MW, 6)
if 'logp' not in get_properties:
LogP = 'Not searched'
elif LogP is np.nan or LogP is None:
LogP = 'Not found'
else:
LogP = SigFigs(LogP, 4)
if 'rho' not in get_properties:
rho = 'Not searched'
elif rho is np.nan or rho is None:
rho = 'Not found'
else:
rho = SigFigs(rho, 4)
if 'mp' not in get_properties:
mp = 'Not searched'
elif mp is np.nan or mp is None:
mp = 'Not found'
# metals/ceramics logic
mol = Chem.MolFromSmiles(smiles)
natoms = mol.GetNumAtoms()
ceramic = False
if natoms == 1 and smiles != '[C]':
# only one atom, except for carbon -> assumed metal
# return render_template('chemError.html')
return render_template('metalError.html', show_properties=show_properties, chemName=chemName, MW=MW, LogP=LogP, rho=rho, mp=mp, iupac=iupac,
cas=cas, smiles=smiles, molImage=molImage,
LogP_origin=LogP_origin, rho_origin=rho_origin, mp_origin=mp_origin)
else:
if (type(mp) is float or type(mp) is int) and mp > 1000.:
# more than one atom, or carbon -> assumed ceramic
# TODO say something about what we're doing on report? (e.g. 'detected ceramic, setting MW = 1100')
# I added something to address this, edit as needed
# We can perhaps increase the mp limit to 1000 C, just in case
MW = 1100.
ceramic = True
if MW < 100.:
return render_template('MwError.html', show_properties=show_properties, chemName=chemName, MW=MW, LogP=LogP, rho=rho, mp=mp, iupac=iupac, cas=cas, smiles=smiles, molImage=molImage,
LogP_origin=LogP_origin, rho_origin=rho_origin, mp_origin=mp_origin)
amount = float(request.form["amount"])
mass = float(request.form["mass"])
density = float(request.form["density"])
vol = mass / density
polymer = request.form["polymer"]
pIndex = (np.where(polymers == polymer)[0])[0]
area = float(request.form["area"])
exposure = request.form["exposure"]
if exposure != "limited":
time = 24.
else:
time = float(request.form["exptime"])
if exposure != "long-term":
TTC = 0.12
else:
TTC = 0.0015
assume = np.array((request.form.get("assume1") is not None, request.form.get("assume2") is not None,
request.form.get("assume3") is not None, request.form.get("assume4") is not None,
request.form.get("assume5") is not None))
if not np.isnan(Ap[pIndex]):
diff = Piringer(MW, Ap[pIndex])
else:
diff = WilkeChang(MW)
release = SheetRelease(amount, vol, area, time, diff)
MOS = TTC / release
release = SigFigs(release, 2)
MOS = SigFigs(MOS, 2)
diff = SigFigs(diff, 2)
# Generate the rate plot using matplotlib
tarray = np.arange(1., 31., 1.)
rates = SheetRates(amount, vol, area, tarray, diff)
pngImageB64String = RatePlot(tarray, rates)
return render_template('exposure_report.html', show_properties=show_properties, polymers=polymers, pIndex=pIndex, release=release,
assume=assume, area=area, vol=vol, amount=amount, diff=diff, time=time, exposure=exposure, TTC=TTC,
MOS=MOS, chemName=chemName, image=pngImageB64String, MW=MW, LogP=LogP, rho=rho, mp=mp, iupac=iupac, cas=cas, smiles=smiles, molImage=molImage,
LogP_origin=LogP_origin, rho_origin=rho_origin, mp_origin=mp_origin, ceramic=ceramic)