Source code for src.plot.motif_concentrations

from ..domains.motif_space import _return_motif_categories
from ..obj.units import transform_unit_to_str

import numpy as np
import itertools as it
import matplotlib.pyplot as plt
from os import makedirs

general_plot_parameters = {
        'plotpath' : None,
        'plotting_time_windows' : None,
        'md_linestyle' : '--',
        'md_color' : 'blue',
        'sd_linestyle' : '-.',
        'sd_alpha' : 0.8,
        'sd_color' : 'blue',
        }
[docs] def calculate_concentration_of_a_single_particle(c_ref,number_a_monomers): return c_ref/number_a_monomers
[docs] def compute_words(letters,zeros=(0,0,0,0)): zeros = np.asarray(zeros) nol = len(letters) shape = np.asarray((nol,)*len(zeros)) shape = tuple(shape+zeros) ne = np.empty(shape, dtype=object) if zeros[0]: ne[0] = '0' for ii in range(nol): ne[ii+zeros[0]] = letters[ii] for jj in range(1,len(shape)): ne = np.swapaxes(ne,jj,0) if zeros[jj]: ne[0] += '0' for ii in range(nol): ne[ii+zeros[jj]] += letters[ii] ne = np.swapaxes(ne,jj,0) return ne
[docs] def continuations_trajectories( motif_trajectory_ensembles : list, plotting_time_windows : list = None, c_ref : float = 1., plotpath : str = './Plots/', plot_parameters : list = [{ 'linestyle' : '-', 'color' : 'b', 'alpha' : 0.3, 'label' : 'Strand', }], ) -> None: motif_trajectories( motif_trajectory_ensembles, plotting_time_windows = plotting_time_windows, c_ref = c_ref, plotpath = plotpath, plot_parameters = plot_parameters, motifs_key = _return_motif_categories(motiflength)[-2] )
[docs] def motif_trajectories( motif_trajectory_ensembles : list, alphabet : list[str] = None, plotting_time_windows : list = None, c_ref : float = 1., plotpath : str = './Plots/', plot_parameters : list = [{ 'linestyle' : '-', 'color' : 'b', 'alpha' : 0.3, 'label' : 'Strand', }], plotformats : list = ['.pdf'], ylim : list = None, motifs_key : str = _return_motif_categories()[-2], concentration_of_a_single_particle : float = None, annotations : dict = { 'X': { 'text':'a', 'xy':(0,1), 'xycoords':'axes fraction', 'xytext':(+0.5,-0.5), 'textcoords':'offset fontsize', 'verticalalignment':'top' }, 'YY':{ 'text':'b', 'xy':(0,1), 'xycoords':'axes fraction', 'xytext':(+0.5,-0.5), 'textcoords':'offset fontsize', 'verticalalignment':'top' }, 'XYX':{ 'text':'c', 'xy':(0,1), 'xycoords':'axes fraction', 'xytext':(+0.5,-0.5), 'textcoords':'offset fontsize', 'verticalalignment':'top' }, 'XXXX':{ 'text':'d', 'xy':(0,1), 'xycoords':'axes fraction', 'xytext':(+0.5,-0.5), 'textcoords':'offset fontsize', 'verticalalignment':'top' }, }, **kwargs ) -> None: makedirs(plotpath, exist_ok=True) if not isinstance(motif_trajectory_ensembles,list): motif_trajectory_ensembles = [motif_trajectory_ensembles,] if not isinstance(plot_parameters, list): plot_parameters = [plot_parameters,] if len(plot_parameters) != len(motif_trajectory_ensembles): plot_parameters = plot_parameters*len(motif_trajectory_ensembles) motiflength = motif_trajectory_ensembles[0].motiflength number_of_letters = motif_trajectory_ensembles[0].number_of_letters if motifs_key in _return_motif_categories(motiflength)[-3:]: wordlength = motiflength - int(motifs_key != _return_motif_categories()[-2]) else: wordlength = np.where(np.isin(_return_motif_categories(motiflength)[:-3],motifs_key))[0][0]+1 words = compute_words( motif_trajectory_ensembles[0].alphabet if alphabet is None else alphabet, zeros=(0,)*wordlength ) monomer_key = _return_motif_categories(motiflength)[0] motifs_list = [[motif_trajectory_ensemble.trajectories[trajectory_index] for trajectory_index in range(len(motif_trajectory_ensemble.trajectories))] for motif_trajectory_ensemble in motif_trajectory_ensembles] if concentration_of_a_single_particle is None: for ii in range(len(motif_trajectory_ensembles)): if isinstance(motif_trajectory_ensembles[ii].unit,(int,float)) and motif_trajectory_ensembles[ii].unit==1: concentration_of_a_single_particle = calculate_concentration_of_a_single_particle(c_ref, motifs_list[0][0].motifs.val[monomer_key].reshape(-1)[0]) if concentration_of_a_single_particle is None: concentration_of_a_single_particle = np.min(motifs_list[0][0].motifs.val[monomer_key].reshape(-1)) if ylim is None: ymax = [10**(np.ceil(np.log10(np.max(motifs[0].motifs[motifs_key].val))))*( 1-(concentration_of_a_single_particle-1)*(isinstance(motifs[0].unit,(int,float))) ) for motifs in motifs_list] ymax = np.nanmax(list(ymax)) if np.isnan(ymax) or np.isinf(ymax): ymax = None ylim = [concentration_of_a_single_particle/2.,ymax] if plotting_time_windows is None: plotting_time_windows = [[motif_trajectory_ensembles[0].times.val[0],motif_trajectory_ensembles[0].times.val[-1]]] for tptt in plotting_time_windows: for logt, logy in it.product(*([False,True],)*2): for motif_index in range(number_of_letters**wordlength): word = words.reshape(-1)[motif_index] for ii in range(len(motif_trajectory_ensembles)): for motif in motifs_list[ii]: if isinstance(motif_trajectory_ensembles[ii].unit,(int,float)) and motif_trajectory_ensembles[ii].unit==1: mm = motif.motifs[motifs_key].val*concentration_of_a_single_particle else: mm = motif.motifs[motifs_key].val mm = mm.reshape(len(mm),-1) plt.plot(motif.times.val, mm[:,motif_index], **plot_parameters[ii]) if word in annotations.keys(): plt.annotate(**annotations[word]) plt.title(word) plt.xscale('linear'*(1-logt)+'log'*logt) plt.yscale('linear'*(1-logy)+'log'*logy) pth = plotpath+f'{motifs_key}_trajectories_{word}_' pth +=str(tptt[0])+'-'+str(tptt[1]) pth += '_log'*logy+'_lin'*(1-logy) pth += '_log'*logt+'_lin'*(1-logt) if tptt[0] is None: tptt[0] = 10**int(np.log10(motif_trajectory_ensembles[0].times.val[0])) if tptt[1] is None: tptt[1] = np.max([motif_trajectory_ensemble.times.val[-1] for motif_trajectory_ensemble in motif_trajectory_ensembles]) if logt and tptt[0]==0.: tptt[0] = 10**int(np.log10(motif_trajectory_ensembles[0].times.val[1])) plt.xlim(*tptt) plt.ylim(ylim) plt.xlabel('Time ' + transform_unit_to_str(motif_trajectory_ensembles[0].times.domain[0].units)) plt.ylabel('Concentration $[\mathrm{mol}/\mathrm{L}]$')# + transform_unit_to_str(motifs_list[0][0].unit)) for plotformat in plotformats: plt.savefig(pth+plotformat) print(f"Saved {pth+plotformat}.") plt.close('all')