Source code for src.obj.motif_trajectory_ensemble
from collections import namedtuple
import numpy as np
from numpy.testing import assert_equal
import yaml
from os.path import exists
from .motif_trajectory import are_compatible_motif_trajectories
from .motif_trajectory import save_motif_trajectory, load_motif_trajectory
from .units import transform_dict_to_unit, transform_unit_to_dict
from ..utils.save import create_directory_path_if_not_already_existing
[docs]
def MotifTrajectoryEnsemble(motif_trajectories : list):
"""
Ensemble of motif trajectories
"""
motif_trajectory = motif_trajectories[0]
motif_trajectory_ensemble_properties = {
'motiflength' : motif_trajectory.motiflength,
'alphabet' : motif_trajectory.alphabet,
'number_of_letters' : motif_trajectory.number_of_letters,
'unit' : motif_trajectory.unit,
'times' : motif_trajectory.times,
'trajectories' : motif_trajectories}
for motif_trajectory in motif_trajectories:
assert_equal(motif_trajectory.motiflength, motif_trajectory_ensemble_properties['motiflength'])
assert_equal(motif_trajectory.alphabet, motif_trajectory_ensemble_properties['alphabet'])
assert_equal(motif_trajectory.number_of_letters, motif_trajectory_ensemble_properties['number_of_letters'])
assert motif_trajectory.unit==motif_trajectory_ensemble_properties['unit'], "Units of motif vectors need to be the same."
assert(are_compatible_motif_trajectories(motif_trajectory,motif_trajectories[0]),
"Motif trajectories not compatible.")
mt = namedtuple('MotifTrajectoryEnsemble',
tuple(motif_trajectory_ensemble_properties.keys()))
return mt(**motif_trajectory_ensemble_properties)
[docs]
def isinstance_motiftrajectoryensemble(obj) -> bool:
is_motif_trajectory_ensemble = True
keys = ['motiflength', 'alphabet', 'number_of_letters', 'unit', 'trajectories', 'times']
for key in obj._asdict().keys():
if key not in keys:
print('Not a MotifTrajectoryEnsemble, missing key: {}.'.format(key))
return False
is_motif_trajectory_ensemble *= isinstance(obj, tuple)
is_motif_trajectory_ensemble *= hasattr(obj, '_asdict')
is_motif_trajectory_ensemble *= hasattr(obj, '_fields')
return bool(is_motif_trajectory_ensemble)
[docs]
def are_compatible_motif_trajectory_ensembles(trjs1 : MotifTrajectoryEnsemble, trjs2 : MotifTrajectoryEnsemble) -> bool:
if not isinstance_motiftrajectoryensemble(trjs1):
print('Object is not a MotifTrajectoryEnsemble')
return False
if not isinstance_motiftrajectoryensemble(trjs2):
print('Object is not a MotifTrajectoryEnsemble')
return False
if are_compatible_motif_trajectories(trjs1.trajectories[0],trjs2.trajectories[0]):
return True
else:
print('MotifTrajectoryEnsembles not compatible: {} mismatch.'.format(key))
[docs]
def save_motif_trajectory_ensemble(archive_path : str,
motif_trajectory_ensemble : MotifTrajectoryEnsemble
) -> None:
create_directory_path_if_not_already_existing(archive_path)
for trajectory_index in range(len(motif_trajectory_ensemble.trajectories)):
current_path = archive_path+'motif_trajectory_{}/'.format(trajectory_index)
create_directory_path_if_not_already_existing(current_path)
save_motif_trajectory(current_path,
motif_trajectory_ensemble.trajectories[trajectory_index]
)
with open(archive_path+'motif_trajectory_ensemble_properties.yaml','w') as yaml_file:
yaml.dump({'motiflength':motif_trajectory_ensemble.motiflength,
'alphabet':motif_trajectory_ensemble.alphabet,
'unit':transform_unit_to_dict(motif_trajectory_ensemble.unit)},
yaml_file,
indent=4)
[docs]
def load_motif_trajectory_ensemble(archive_path : str
) -> MotifTrajectoryEnsemble:
dct_filename = archive_path+'motif_trajectory_ensemble_properties.yaml'
motif_trajectories = []
trajectory_index = 0
while exists(archive_path+'motif_trajectory_{}/'.format(trajectory_index)):
motif_trajectories = motif_trajectories + [load_motif_trajectory(archive_path+'motif_trajectory_{}/'.format(trajectory_index)),]
trajectory_index += 1
return MotifTrajectoryEnsemble(motif_trajectories)