def parameter_signatures(par, model, tspan, type_sign='production'):
    """

    :param par: parameter file path or vector of parameters
    :param model: PySB model
    :param tspan: time span
    :return: tropical signatures of input parameters
    """

    try:
        if isinstance(par, str):
            parames = hf.read_pars(par)
        else:
            parames = par
        drivers = run_tropical(model, tspan, parameters=parames, type_sign=type_sign, sp_visualize=None)
        return drivers
    except:
        print(par)
        print("".join(traceback.format_exception(*sys.exc_info())))
        raise Exception("".join(traceback.format_exception(*sys.exc_info())))
def display_all_species(cluster_parameters):
    """Saves figures of all species for each cluster of parameters

        keyword arguments:
        cluster_parameters -- list of files, where each file contains the clustered parameters
    """
    for cl in cluster_parameters:
        directory = '/home/oscar/Documents/tropical_project/' + cl
        if not os.path.exists(directory):
            os.makedirs(directory)
        for sp in range(len(model.species)):
            plt.figure()
            for idx, par in enumerate(cluster_parameters[cl]):
                params = hf.read_pars(par)
                solver.run(params)
                y = solver.y.T
                plt.plot(solver.tspan, y[sp])
            plt.title(str(model.species[sp]))
            plt.savefig(directory + '/' + str(model.species[sp]) + '.jpg', format='jpg', bbox_inches='tight', dpi=400)
            plt.close()
    return
from earm.lopez_embedded import model
from max_plus_consumption_production import run_tropical
import numpy as np
import os
import helper_functions as hf

directory = os.path.dirname(__file__)
parameters_path = os.path.join(directory, "parameters_5000")
all_parameters = hf.listdir_fullpath(parameters_path)
parameters = hf.read_pars(all_parameters[0])
t = np.linspace(0, 20000,  100)

run_tropical(model, t, parameters, diff_par=1, type_sign='consumption', sp_visualize=[6])


    def signal_signature(self, param_values, diff_par=1, type_sign='production', sp_to_visualize=None):
        if param_values is not None:
            if type(param_values) is str:
                param_values = hf.read_pars(param_values)
            # accept vector of parameter values as an argument
            if len(param_values) != len(self.model.parameters):
                print(param_values)
                raise Exception("param_values must be the same length as model.parameters")
            if not isinstance(param_values, numpy.ndarray):
                param_values = numpy.array(param_values)
        else:
            # create parameter vector from the values in the model
            param_values = numpy.array([p.value for p in self.model.parameters])

        # convert model parameters into dictionary
        param_values = dict((p.name, param_values[i]) for i, p in enumerate(self.model.parameters))

        y = self.sim.run(param_values=param_values).dataframe
        # Dictionary whose keys are species and values are the monomial signatures
        all_signatures = {}

        if type_sign == 'production':
            mon_type = 'products'
        elif type_sign == 'consumption':
            mon_type = 'reactants'
        else:
            raise Exception("type sign must be 'production' or 'consumption'")

        for sp in self.eqs_for_tropicalization:

            # reaction terms
            monomials = []

            for term in self.model.reactions_bidirectional:
                if sp in term['reactants'] and term['reversible'] is True:
                    monomials.append((-1) * term['rate'])
                elif sp in term[mon_type]:
                    monomials.append(term['rate'])

            # Dictionary whose keys are the symbolic monomials and the values are the simulation results
            mons_dict = {}
            for mon_p in monomials:
                mon_p_values = mon_p.subs(param_values)
                var_prod = [atom for atom in mon_p_values.atoms(sympy.Symbol)]  # Variables of monomial
                arg_prod = [numpy.maximum(self.mach_eps, y[str(va)]) for va in var_prod]
                f_prod = sympy.lambdify(var_prod, mon_p_values)
                prod_values = f_prod(*arg_prod)
                mons_dict[mon_p] = prod_values

            # Dataframe whose rownames are the monomials and the columns contain their values at each time point
            mons_df = pd.DataFrame(mons_dict).T

            signature_species = mons_df.apply(self.choose_max2, args=(diff_par, self.all_comb[sp], type_sign))
            all_signatures[sp] = list(signature_species)

        # self.all_sp_signatures = all_signatures

        if sp_to_visualize:
            self.visualization2(y, all_signatures, param_values, sp_to_visualize)

        return all_signatures
def display_observables(params_estimated):
    """Save a figure of the observables with different parameter values and their distributions

        keyword arguments:
        params_estimated -- list of parameter sets
    """
    fig, axApop = plt.subplots(figsize=(7, 7))
    # Construct matrix of experimental data and variance columns of interest
    exp_obs_norm = exp_data[data_names].view(float).reshape(len(exp_data), -1).T
    var_norm = exp_data[var_names].view(float).reshape(len(exp_data), -1).T
    std_norm = var_norm ** 0.5
    obs_names_disp = obs_names + ['aSmac']
    totals = obs_totals + [momp_obs_total]

    cparp_info = [0] * len(params_estimated)
    cparp_info_fraction = [0] * len(params_estimated)

    # Plot experimental data and simulation on the same axes
    colors = ('r', 'b')
    obs_range = [0, 1]
    for exp, exp_err, obs, c in zip([exp_obs_norm[1]], [std_norm[1]], [obs_range[1]], [colors[1]]):



        for idx, par in enumerate(params_estimated):
            params = hf.read_pars(par)
            # params[62] -= params[62] * 0.89
            solver.run(params)
            sim_obs = solver.yobs[obs_names_disp].view(float).reshape(len(solver.yobs), -1)
            sim_obs_norm = (sim_obs / totals).T
            cparp_info[idx] = curve_fit(sig_apop, solver.tspan, sim_obs_norm[1], p0=[100, 100, 100])[0]
            cparp_info_fraction[idx] = sim_obs_norm[1][-1]
            # axApop.plot(solver.tspan, sim_obs_norm[obs], color=c, alpha=0.5)
            axApop.plot(solver.tspan, sim_obs_norm[2], color='g', alpha=0.4)

        # axApop.plot(solver.tspan, sim_obs_norm[obs], color=c, alpha=0.5, label=obs_names[obs] + ' sim')

        # axApop.plot(solver.tspan, sim_obs_norm[obs], color=c, alpha=0.5, label=obs_names[obs] + ' sim')

        axApop.plot(solver.tspan, sim_obs_norm[2], color='g',  alpha=0.4, label='aSmac' + ' sim')
        axApop.vlines(momp_data[0], -0.05, 1.05, color='k', linestyle=':', label='aSmac' + ' data')


        # axApop.plot(exp_data['Time'], exp, color='k', marker='.', linestyle=':', label=obs_names[obs]+' data')
        # axApop.errorbar(exp_data['Time'], exp, yerr=exp_err, ecolor='k',
        #                 elinewidth=0.5, capsize=0, fmt=None)

    plt.xticks(rotation=-30)
    plt.xlabel('Time')
    plt.ylabel('Fraction')
    fig.tight_layout()

    divider = make_axes_locatable(axApop)
    axHistx = divider.append_axes("top", 1.2, pad=0.3, sharex=axApop)
    axHisty = divider.append_axes("right", 1.2, pad=0.3, sharey=axApop)
    # make some labels invisible
    plt.setp(axHistx.get_xticklabels() + axHisty.get_yticklabels(),
             visible=False)
    # now determine nice limits by hand:
    binwidth = 0.11
    binwidthx = 600
    xymax = np.max([np.max(np.fabs(solver.tspan)), np.max(np.fabs(1))])
    lim = (int(xymax / binwidth) + 1) * binwidth

    weightsx = np.ones_like(column(cparp_info, 1)) / len(column(cparp_info, 1))
    weightsy = np.ones_like(cparp_info_fraction) / len(cparp_info_fraction)

    axHisty.hist(cparp_info_fraction, orientation='horizontal', bins=np.arange(0, 1.01 + binwidth, binwidth),
                 weights=weightsy)
    axHistx.hist(column(cparp_info, 1), bins=np.arange(min(solver.tspan), max(solver.tspan) + binwidthx, binwidthx),
                 weights=weightsx)

    # axHistx.axis["bottom"].major_ticklabels.set_visible(False)
    for tl in axHistx.get_xticklabels():
        tl.set_visible(False)
    axHistx.set_yticks([0, 0.5, 1])
    # axHisty.axis["left"].major_ticklabels.set_visible(False)
    for tl in axHisty.get_yticklabels():
        tl.set_visible(False)
    axHisty.set_xticks([0, 0.5, 1])
    axApop.legend(loc=0)
    fig.savefig('/home/oscar/Documents/tropical_project/all_parameters_earm.png', format='png', dpi=400)
    return
    else:
        parameter_ic.name == 'Bcl2_0'

    sd = cv
    return lognormal(mean, sd, size)

parameters_ic = {idx: p for idx, p in enumerate(model.parameters) if p in model.parameters_initial_conditions()[1:]}

samples = 100

pso_pars = hf.listdir_fullpath('/home/oscar/Documents/tropical_project/parameters_5000')

all_pars_ic = np.zeros((len(pso_pars), len(model.parameters)))

for idx, pa in enumerate(pso_pars):
    pso_pars[idx] = hf.read_pars(pa)


repeated_parameter_values = np.repeat(pso_pars, samples, axis=0)

for idx, par in parameters_ic.items():
    repeated_parameter_values[:, idx] = sample_lognormal(par, size=samples*len(pso_pars))


def parameter_signatures(par, model, tspan):
    """

    :param par: parameter file path or vector of parameters
    :param model: PySB model
    :param tspan: time span
    :return: tropical signatures of input parameters