Source code for src.obj.motif_production_trajectory_ensemble

from collections import namedtuple
import numpy as  np
import yaml
from os.path import exists
from scipy.sparse import coo_matrix, save_npz, load_npz

from .motif_production_trajectory import save_motif_production_trajectory
from .motif_production_trajectory import are_compatible_motif_production_trajectories
from .motif_production_trajectory import load_motif_production_trajectory

from ..utils.save import create_directory_path_if_not_already_existing

[docs] def MotifProductionTrajectoryEnsemble(motif_production_trajectories : list): """ Ensemble of motif production trajectories """ motif_production_trajectory = motif_production_trajectories[0] motif_production_trajectory_ensemble_properties = { 'motiflength' : motif_production_trajectory.motiflength, 'alphabet' : motif_production_trajectory.alphabet, 'maximum_ligation_window_length' : motif_production_trajectory.maximum_ligation_window_length, 'number_of_letters' : motif_production_trajectory.number_of_letters, 'unit' : motif_production_trajectory.unit, 'trajectories' : motif_production_trajectories } for motif_production_trajectory in motif_production_trajectories[1:]: assert(motif_production_trajectory.motiflength==motif_production_trajectory_ensemble_properties['motiflength']) assert(motif_production_trajectory.alphabet==motif_production_trajectory_ensemble_properties['alphabet']) assert(motif_production_trajectory.number_of_letters==motif_production_trajectory_ensemble_properties['number_of_letters']) assert motif_production_trajectory.unit==motif_production_trajectory_ensemble_properties['unit'], "Units of motif vectors need to be the same." assert(are_compatible_motif_production_trajectories(motif_production_trajectory,motif_production_trajectories[0]), "Motif trajectories not compatible.") mt = namedtuple('MotifProductionTrajectoryEnsemble', tuple(motif_production_trajectory_ensemble_properties.keys())) return mt(**motif_production_trajectory_ensemble_properties)
[docs] def isinstance_motifproductiontrajectoryensemble(obj) -> bool: is_motif_production_trajectory_ensemble = True keys = ['motiflength', 'alphabet', 'maximum_ligation_window_length', 'number_of_letters', 'unit', 'trajectories'] for key in obj._asdict().keys(): if key not in keys: print('Not a MotifProductionTrajectoryEnsemble, missing key: {}.'.format(key)) return False is_motif_production_trajectory_ensemble *= isinstance(obj, tuple) is_motif_production_trajectory_ensemble *= hasattr(obj, '_asdict') is_motif_production_trajectory_ensemble *= hasattr(obj, '_fields') return bool(is_motif_production_trajectory_ensemble)
[docs] def are_compatible_motif_production_trajectory_ensembles( trjs1 : MotifProductionTrajectoryEnsemble, trjs2 : MotifProductionTrajectoryEnsemble ) -> bool: if not isinstance_motifproductiontrajectoryensemble(trjs1): print('Object is not a MotifProductionTrajectoryEnsemble') return False if not isinstance_motifproductiontrajectoryensemble(trjs2): print('Object is not a MotifProductionTrajectoryEnsemble') return False return np.prod([are_compatible_motif_production_trajectories( trj1, trj2 ) for trj1 in trjs1.trajectories for trj2 in trjs2.trajectories])
[docs] def save_motif_production_trajectory_ensemble( archive_path : str, motif_production_trajectory_ensemble : MotifProductionTrajectoryEnsemble, file_space : bool = True ) -> None: create_directory_path_if_not_already_existing(archive_path) for trajectory_index in range(len(motif_production_trajectory_ensemble.trajectories)): current_path = archive_path+'motif_production_trajectory_{}/'.format(trajectory_index) create_directory_path_if_not_already_existing(current_path) save_motif_production_trajectory(current_path, motif_production_trajectory_ensemble.trajectories[trajectory_index] ) with open(archive_path+'motif_production_trajectory_ensemble_properties.yaml','w') as yaml_file: yaml.dump({'motiflength':motif_production_trajectory_ensemble.motiflength, 'alphabet':motif_production_trajectory_ensemble.alphabet, 'maximum_ligation_window_length' : motif_production_trajectory_ensemble.maximum_ligation_window_length, 'unit':motif_production_trajectory_ensemble.unit }, yaml_file, indent=4)
[docs] def load_motif_production_trajectory_ensemble( archive_path : str, file_sparse : bool = True ) -> MotifProductionTrajectoryEnsemble: dct_filename = archive_path+'motif_production_trajectory_ensemble_properties.yaml' motif_production_trajectories = [] trajectory_index = 0 while exists(archive_path+'motif_production_trajectory_{}/'.format(trajectory_index)): motif_production_trajectories = motif_production_trajectories + [load_motif_production_trajectory( archive_path+'motif_production_trajectory_{}/'.format(trajectory_index), file_sparse=file_sparse ),] trajectory_index += 1 return MotifProductionTrajectoryEnsemble(motif_production_trajectories)