def AddNistDatabase(self, assert_decomposition=True): """ Add the observations based on equilibrium constants from the NIST database. If using non-transformed group contribution, it is required to reverse Legendre- transform the data in order to get chemical reaction energies. This methods tries to use the same pseudoisomers for each compound as the table of formation energies, in order to have less columns in the final stoichiometric matrix. """ nist = Nist() # create a dictionary from each unique reaction to the list of measured dG0' # and subtract from dG0' the formation energies of the anchored compounds for r, nist_row_data in enumerate(nist.SelectRowsFromNist()): obs_id = "NIST%03d" % r msg = "" try: if not self.transformed: dG0 = self.dissociation.ReverseTransformNistRow( nist_row_data, self.cid2nH_nMg) else: dG0 = nist_row_data.dG0_r # we are using transformed energies self.AddObservation(obs_id=obs_id, obs_type=KeggObservation.TYPE_REACTION, anchored=False, dG0=dG0, sparse=nist_row_data.reaction.sparse, url=nist_row_data.url) except MissingDissociationConstantError as e: msg = 'Cannot reverse transform NIST%03d because of' \ ' of a missing dissociation constant for C%05d' % (r, e.cid) logging.warning(msg) dG0 = None html_text = "" html_text += "<b id=%s>%s</b></br>\n" % (obs_id, obs_id) html_text += '<font size="1">\n' html_text += "NIST conditions: pH = %g, I = %g, pMg = %g, T = %g</br>\n" % \ (nist_row_data.pH, nist_row_data.I, nist_row_data.pMg, nist_row_data.T) html_text += 'NIST reference: <a href="%s">%s</a></br>\n' % \ (nist_row_data.url, nist_row_data.ref_id) html_text += 'EC = %s</br>\n' % nist_row_data.ec html_text += "Reaction: %s</br>\n" % \ nist_row_data.reaction.to_hypertext(show_cids=False) html_text += "%s = %.1f</br>\n" % \ (thermodynamic_constants.symbol_dr_G0_prime, nist_row_data.dG0_r) if dG0 is None: html_text += 'WARNING: %s</br>\n' % msg else: html_text += '%s = %.1f</br>\n' % \ (self.gibbs_symbol, dG0) html_text += '</font></br></br>\n' self.html_writer.write(html_text)
fieldnames=[ 'name', 'reaction', 'E[dG' '0] nist', 'dG' '0 iAF1260', 'dG' '0 UGCM' ], extrasaction='ignore') csv_writer.writeheader() data = [] for i in xrange(len(feist.reactions)): r = feist.reactions[i] logging.info("Reaction %s: %s" % (r.name, r.FullReactionString())) dG0_feist = feist.dG0s[i] nist_rows = nist.SelectRowsFromNist(r, check_reverse=True) dG0_list = [] for row_data in nist_rows: if pH_min < row_data.pH < pH_max: if row_data.reaction == r: dG0_list.append(row_data.dG0_r) else: dG0_list.append(-row_data.dG0_r) if len(dG0_list) > 0: dG0_nist = np.mean(dG0_list) else: dG0_nist = np.nan d = {} d['name'] = r.name d['reaction'] = r.FullReactionString()
def main(): html_writer = HtmlWriter("../res/nist/report.html") estimators = LoadAllEstimators() nist = Nist() nist.T_range = (273.15 + 24, 273.15 + 40) #nist.override_I = 0.25 #nist.override_pMg = 14.0 #nist.override_T = 298.15 html_writer.write('<p>\n') html_writer.write("Total number of reaction in NIST: %d</br>\n" % len(nist.data)) html_writer.write("Total number of reaction in range %.1fK < T < %.1fK: %d</br>\n" % \ (nist.T_range[0], nist.T_range[1], len(nist.SelectRowsFromNist()))) html_writer.write('</p>\n') reactions = {} reactions['KEGG'] = [] for reaction in Kegg.getInstance().AllReactions(): try: reaction.Balance(balance_water=True, exception_if_unknown=True) reactions['KEGG'].append(reaction) except (KeggReactionNotBalancedException, KeggParseException, OpenBabelError): pass reactions['FEIST'] = Feist.FromFiles().reactions reactions['NIST'] = nist.GetUniqueReactionSet() pairs = [] #pairs += [('hatzi_gc', 'UGC')], ('PGC', 'PRC'), ('alberty', 'PRC')] for t1, t2 in pairs: logging.info('Writing the NIST report for %s vs. %s' % (estimators[t1].name, estimators[t2].name)) html_writer.write('<p><b>%s vs. %s</b> ' % (estimators[t1].name, estimators[t2].name)) html_writer.insert_toggle(start_here=True) two_way_comparison(html_writer=html_writer, thermo1=estimators[t1], thermo2=estimators[t2], reaction_list=reactions['FEIST'], name='%s_vs_%s' % (t1, t2)) html_writer.div_end() html_writer.write('</p>') if False: estimators['alberty'].CompareOverKegg( html_writer, other=estimators['PRC'], fig_name='kegg_compare_alberty_vs_nist') rowdicts = [] rowdict = {'Method': 'Total'} for db_name, reaction_list in reactions.iteritems(): rowdict[db_name + ' coverage'] = len(reaction_list) rowdicts.append(rowdict) for name in ['UGC', 'PGC', 'PRC', 'alberty', 'merged', 'hatzi_gc']: thermo = estimators[name] logging.info('Writing the NIST report for %s' % thermo.name) html_writer.write('<p><b>%s</b> ' % thermo.name) html_writer.insert_toggle(start_here=True) num_estimations, rmse = nist.verify_results(html_writer=html_writer, thermodynamics=thermo, name=name) html_writer.div_end() html_writer.write('N = %d, RMSE = %.1f</p>\n' % (num_estimations, rmse)) logging.info('N = %d, RMSE = %.1f' % (num_estimations, rmse)) rowdict = { 'Method': thermo.name, 'RMSE (kJ/mol)': "%.1f (N=%d)" % (rmse, num_estimations) } for db_name, reaction_list in reactions.iteritems(): n_covered = thermo.CalculateCoverage(reaction_list) percent = n_covered * 100.0 / len(reaction_list) rowdict[db_name + " coverage"] = "%.1f%% (%d)" % (percent, n_covered) logging.info(db_name + " coverage = %.1f%%" % percent) rowdicts.append(rowdict) headers = ['Method', 'RMSE (kJ/mol)'] + \ [db_name + ' coverage' for db_name in reactions.keys()] html_writer.write_table(rowdicts, headers=headers)
def main(): kegg = Kegg.getInstance() options, args = MakeOpts().parse_args(sys.argv) print ('Parameters: T=%f K, pMg=%.2g, I=%.2gM' % (options.T, options.pMg, options.I)) print "reaction:", args[-1] estimators = LoadAllEstimators() plt.rcParams['legend.fontsize'] = 8 plt.rcParams['font.family'] = 'sans-serif' plt.rcParams['font.size'] = 12 plt.rcParams['lines.linewidth'] = 2 colormap = {} colormap['markers'] = (64.0/255, 111.0/255, 29.0/255, 3.0) #colormap['hatzi_gc'] = (54.0/255, 182.0/255, 202.0/255, 1.0) colormap['UGC'] = (202.0/255, 101.0/255, 54.0/255, 1.0) #colormap['alberty'] = (202.0/255, 54.0/255, 101.0/255, 1.0) colormap['PGC'] = (101.0/255, 202.0/255, 54.0/255, 1.0) fig = plt.figure(figsize=(6,6), dpi=90) fig.hold(True) if options.rid is None: reaction = GetSparseReactionInput(args[-1], kegg) else: reaction = kegg.rid2reaction(options.rid) reaction.Balance() print 'Reaction: %s' % reaction.FullReactionString() nist = Nist() nist_rows = nist.SelectRowsFromNist(reaction, check_reverse=True) pH_min = 7.0 - options.pH/2.0 pH_max = 7.0 + options.pH/2.0 if nist_rows: dG0_list = [] pH_list = [] for row_data in nist_rows: pH_list.append(row_data.pH) if row_data.reaction == reaction: dG0_list.append(row_data.dG0_r) else: dG0_list.append(-row_data.dG0_r) plt.plot(pH_list, dG0_list, marker='.', linestyle='none', label='measured data', markeredgecolor='none', markerfacecolor=colormap['markers'], markersize=5) pH_max = max(pH_list + [pH_max]) pH_min = min(pH_list + [pH_min]) pH_range = np.arange(pH_min-0.1, pH_max+0.1, 0.02) for key, thermo in estimators.iteritems(): if key not in colormap: continue print key, 'dG0 at pH=7: %.2f' % reaction.PredictReactionEnergy(thermo, pH=7.0, pMg=options.pMg, I=options.I, T=options.T) dG0 = [] for pH in pH_range: dG0.append(reaction.PredictReactionEnergy(thermo, pH=pH, pMg=options.pMg, I=options.I, T=options.T)) plt.plot(pH_range, dG0, marker='None', linestyle='solid', color=colormap[key], figure=fig, label=thermo.name) plt.xlabel('pH') plt.ylabel(r'$\Delta_r G^\circ$ [kJ/mol]') plt.title(kegg.reaction2string(reaction), fontsize=8) plt.legend(loc='lower left') if not options.output: plt.tight_layout() plt.show() else: fig.savefig(options.output, format='svg')