def find_path(self, experiment_name, net_reaction): """Find a pathway from the source to the target. Args: experiment_name: a name given to this experiment. net_reaction: a Reaction describing the net reaction for the desired paths """ dirname = os.path.join('../res/pathologic/', experiment_name) logging.info('Writing output to: %s' % dirname) util._mkdir(dirname) self.html_writer.write('<a href="pathologic/' + experiment_name + '.html">' + experiment_name + '</a><br>\n') exp_html = HtmlWriter('../res/pathologic/' + experiment_name + '.html') exp_html.write("<p><h1>%s</h1>\n" % experiment_name) exp_html.insert_toggle(div_id="__parameters__", start_here=True, label='Show Parameters') f, S, compounds, reactions = self.kegg_pathologic.get_unique_cids_and_reactions() exp_html.write('<h2>Conditions:</h2>\n') exp_html.write_ul(['Optimization method: %s' % self.thermodynamic_method, 'Concentration range: %g M < C < %g M' % (self.thermo.c_range[0], self.thermo.c_range[1]), "Max Δ<sub>r</sub>G' = %.1f" % self.maximal_dG, 'pH = %g' % self.thermo.pH, 'I = %g' % self.thermo.I, 'T = %g' % self.thermo.T, 'Max no. reactions: %d' % (self.max_reactions or -1), 'Max no. solutions: %d' % (self.max_solutions or -1), 'Overall Reaction: %s' % net_reaction.to_hypertext(), '%d reactions' % len(reactions), '%d unique compounds' % len(compounds)]) exp_html.div_end() exp_html.write('</br>\n') logging.debug("All compounds:") for i, compound in enumerate(compounds): logging.debug("%05d) C%05d = %s" % (i, compound.cid, compound.name)) logging.debug("All reactions:") for i, reaction in enumerate(reactions): logging.debug("%05d) R%05d = %s" % (i, reaction.rid, str(reaction))) output_kegg_file = open(dirname + '/kegg_pathway.txt', 'w') exp_html.write('<a href="%s/kegg_pathway.txt">All solutions in KEGG format</a></br>\n' % experiment_name) # Find a solution with a minimal total flux logging.info("Preparing LP solver for the minimal total flux problem") exp_html.write('<b>Minimum flux</b>') slip = Stoichiometric_LP("Pathologic") slip.add_stoichiometric_constraints(f, S, compounds, reactions, net_reaction) slip.export("../res/pathologic/%s/%03d_lp.txt" % (experiment_name, 0)) exp_html.write(' (<a href="%s/%03d_lp.txt">LP file</a>): ' % (experiment_name, 0)) logging.info("Solving") if not slip.solve(): exp_html.write("<b>There are no solutions!</b>") logging.warning("There are no solutions. Quitting!") return logging.info("writing solution") self.write_current_solution(exp_html, slip, experiment_name) logging.info("Preparing MILP solver") milp = Stoichiometric_LP("Pathologic") milp.solution_index = 1 milp.add_stoichiometric_constraints(f, S, compounds, reactions, net_reaction) milp.add_milp_variables() if self.max_reactions is not None: milp.add_reaction_num_constraint(self.max_reactions) if self.thermodynamic_method == OptimizationMethods.LOCALIZED: milp.add_localized_dGf_constraints(self.thermo) else: milp.add_dGr_constraints(self.thermo, optimization=self.thermodynamic_method, maximal_dG=self.maximal_dG) index = 0 while (self.max_solutions is None) or (index < self.max_solutions): index += 1 # create the MILP problem to constrain the previous solutions not to reappear again. logging.info("Round %03d, solving using MILP" % (milp.solution_index)) milp.export("../res/pathologic/%s/%03d_lp.txt" % (experiment_name, milp.solution_index)) exp_html.write('<b>Solution #%d</b> (<a href="%s/%03d_lp.txt">LP file</a>): ' % (index, experiment_name, index)) if not milp.solve(): exp_html.write("<b>No solution found</b>") logging.info("No more solutions. Quitting!") break logging.info("writing solution") self.write_current_solution(exp_html, milp, experiment_name, output_kegg_file) milp.ban_current_solution() output_kegg_file.close() exp_html.close()
def analyze(prefix, thermo): kegg_file = ParsedKeggFile.FromKeggFile('../data/thermodynamics/%s.txt' % prefix) html_writer = HtmlWriter('../res/%s.html' % prefix) co2_hydration = Reaction.FromFormula("C00011 + C00001 => C00288") #pH_vec = np.arange(5, 9.001, 0.5) #pH_vec = np.array([6, 7, 8]) pH_vec = np.array([6, 7, 8]) # this needs to be fixed so that the txt file will set the pH #co2_conc_vec = np.array([1e-5, 1e-3]) co2_conc_vec = np.array([1e-5]) data_mat = [] override_bounds = {} for pH in pH_vec.flat: co2_hydration_dG0_prime = float(thermo.GetTransfromedKeggReactionEnergies([co2_hydration], pH=pH)) for co2_conc in co2_conc_vec.flat: carbonate_conc = co2_conc * np.exp(-co2_hydration_dG0_prime / (R*default_T)) #print "[CO2] = %g, [carbonate] = %g, pH = %.1f, I = %.2fM" % (co2_conc, carbonate_conc, pH, I) override_bounds[11] = (co2_conc, co2_conc) override_bounds[288] = (carbonate_conc, carbonate_conc) section_prefix = 'pH_%g_CO2_%g' % (pH, co2_conc*1000) section_title = 'pH = %g, [CO2] = %g mM' % (pH, co2_conc*1000) html_writer.write('<h1 id="%s_title">%s</h1>\n' % (section_prefix, section_title)) html_writer.write_ul(['<a href="#%s_tables">Individual result tables</a>' % section_prefix, '<a href="#%s_summary">Summary table</a>' % section_prefix, '<a href="#%s_figure">Summary figure</a>' % section_prefix]) data, labels = pareto(kegg_file, html_writer, thermo, pH=pH, section_prefix=section_prefix, balance_water=True, override_bounds=override_bounds) data_mat.append(data) data_mat = np.array(data_mat) if data_mat.shape[0] == 1: pareto_fig = plt.figure(figsize=(6, 6), dpi=90) plt.plot(data_mat[0, :, 0], data_mat[0, :, 1], '.', figure=pareto_fig) for i in xrange(data_mat.shape[1]): if data[i, 1] < 0: color = 'grey' else: color = 'black' plt.text(data_mat[0, i, 0], data_mat[0, i, 1], labels[i], ha='left', va='bottom', fontsize=8, color=color, figure=pareto_fig) plt.title(section_title, figure=pareto_fig) else: pareto_fig = plt.figure(figsize=(10, 10), dpi=90) for i in xrange(data_mat.shape[1]): plt.plot(data_mat[:, i, 0], data_mat[:, i, 1], '-', figure=pareto_fig) plt.text(data_mat[0, i, 0], data_mat[0, i, 1], '%g' % pH_vec[0], ha='center', fontsize=6, color='black', figure=pareto_fig) plt.text(data_mat[-1, i, 0], data_mat[-1, i, 1], '%g' % pH_vec[-1], ha='center', fontsize=6, color='black', figure=pareto_fig) plt.legend(labels, loc='upper right') plt.title('Pareto', figure=pareto_fig) plt.xlabel('Optimal Energetic Efficiency [kJ/mol]', figure=pareto_fig) plt.ylabel('Optimized Distributed Bottleneck [kJ/mol]', figure=pareto_fig) html_writer.write('<h2 id="%s_figure">Summary figure</h1>\n' % section_prefix) # plot the Pareto figure showing all values (including infeasible) html_writer.embed_matplotlib_figure(pareto_fig, name=prefix + '_0') # set axes to hide infeasible pathways and focus on feasible ones pareto_fig.axes[0].set_xlim(None, 0) pareto_fig.axes[0].set_ylim(0, None) html_writer.embed_matplotlib_figure(pareto_fig, name=prefix + '_1') html_writer.close()
def analyze(prefix, thermo): kegg_file = ParsedKeggFile.FromKeggFile('../data/thermodynamics/%s.txt' % prefix) html_writer = HtmlWriter('../res/%s.html' % prefix) co2_hydration = Reaction.FromFormula("C00011 + C00001 => C00288") #pH_vec = np.arange(5, 9.001, 0.5) #pH_vec = np.array([6, 7, 8]) pH_vec = np.array( [6, 7, 8]) # this needs to be fixed so that the txt file will set the pH #co2_conc_vec = np.array([1e-5, 1e-3]) co2_conc_vec = np.array([1e-5]) data_mat = [] override_bounds = {} for pH in pH_vec.flat: co2_hydration_dG0_prime = float( thermo.GetTransfromedKeggReactionEnergies([co2_hydration], pH=pH)) for co2_conc in co2_conc_vec.flat: carbonate_conc = co2_conc * np.exp(-co2_hydration_dG0_prime / (R * default_T)) #print "[CO2] = %g, [carbonate] = %g, pH = %.1f, I = %.2fM" % (co2_conc, carbonate_conc, pH, I) override_bounds[11] = (co2_conc, co2_conc) override_bounds[288] = (carbonate_conc, carbonate_conc) section_prefix = 'pH_%g_CO2_%g' % (pH, co2_conc * 1000) section_title = 'pH = %g, [CO2] = %g mM' % (pH, co2_conc * 1000) html_writer.write('<h1 id="%s_title">%s</h1>\n' % (section_prefix, section_title)) html_writer.write_ul([ '<a href="#%s_tables">Individual result tables</a>' % section_prefix, '<a href="#%s_summary">Summary table</a>' % section_prefix, '<a href="#%s_figure">Summary figure</a>' % section_prefix ]) data, labels = pareto(kegg_file, html_writer, thermo, pH=pH, section_prefix=section_prefix, balance_water=True, override_bounds=override_bounds) data_mat.append(data) data_mat = np.array(data_mat) if data_mat.shape[0] == 1: pareto_fig = plt.figure(figsize=(6, 6), dpi=90) plt.plot(data_mat[0, :, 0], data_mat[0, :, 1], '.', figure=pareto_fig) for i in xrange(data_mat.shape[1]): if data[i, 1] < 0: color = 'grey' else: color = 'black' plt.text(data_mat[0, i, 0], data_mat[0, i, 1], labels[i], ha='left', va='bottom', fontsize=8, color=color, figure=pareto_fig) plt.title(section_title, figure=pareto_fig) else: pareto_fig = plt.figure(figsize=(10, 10), dpi=90) for i in xrange(data_mat.shape[1]): plt.plot(data_mat[:, i, 0], data_mat[:, i, 1], '-', figure=pareto_fig) plt.text(data_mat[0, i, 0], data_mat[0, i, 1], '%g' % pH_vec[0], ha='center', fontsize=6, color='black', figure=pareto_fig) plt.text(data_mat[-1, i, 0], data_mat[-1, i, 1], '%g' % pH_vec[-1], ha='center', fontsize=6, color='black', figure=pareto_fig) plt.legend(labels, loc='upper right') plt.title('Pareto', figure=pareto_fig) plt.xlabel('Optimal Energetic Efficiency [kJ/mol]', figure=pareto_fig) plt.ylabel('Optimized Distributed Bottleneck [kJ/mol]', figure=pareto_fig) html_writer.write('<h2 id="%s_figure">Summary figure</h1>\n' % section_prefix) # plot the Pareto figure showing all values (including infeasible) html_writer.embed_matplotlib_figure(pareto_fig, name=prefix + '_0') # set axes to hide infeasible pathways and focus on feasible ones pareto_fig.axes[0].set_xlim(None, 0) pareto_fig.axes[0].set_ylim(0, None) html_writer.embed_matplotlib_figure(pareto_fig, name=prefix + '_1') html_writer.close()