Source code for src.obj.motif_breakage_trajectory
from collections import namedtuple
import nifty8 as ift
import numpy as np
from ..utils.transform_vectors_to_fields import transform_dicts_to_field
[docs]
def MotifBreakageTrajectory(motif_breakage_vectors : list,
times : ift.Field):
motif_breakage_vector = motif_breakage_vectors[0]
motif_breakages = [motif_breakage_vectors[ii].breakages for ii in range(len(motif_breakage_vectors))]
motif_breakage_trajectory_properties = {'motiflength' : motif_breakage_vector.motiflength,
'alphabet' : motif_breakage_vector.alphabet,
'number_of_letters' : motif_breakage_vector.number_of_letters,
'unit' : motif_breakage_vector.unit,
'times': times,
'breakages' : transform_dicts_to_field(motif_breakages, times.domain)
}
for motif_breakage_vector in motif_breakage_vectors:
assert(motif_breakage_vector.motiflength==motif_breakage_trajectory_properties['motiflength'])
assert(motif_breakage_vector.alphabet==motif_breakage_trajectory_properties['alphabet'])
assert(motif_breakage_vector.number_of_letters==motif_breakage_trajectory_properties['number_of_letters'])
assert motif_breakage_vector.unit==motif_breakage_trajectory_properties['unit'], "Units of motif breakage vectors need to be the same."
mt = namedtuple('MotifBreakageTrajectory',
tuple(motif_breakage_trajectory_properties.keys()))
return mt(**motif_breakage_trajectory_properties)
[docs]
def isinstance_motifbreakagetrajectory(obj) -> bool:
is_motif_breakage_trajectory = True
keys = ['motiflength', 'alphabet', 'number_of_letters', 'unit', 'times', 'breakages']
for key in obj._asdict().keys():
if key not in keys:
print('Not a MotifBreakageTrajectory, missing key: {}.'.format(key))
return False
is_motif_breakage_trajectory *= isinstance(obj, tuple)
is_motif_breakage_trajectory *= hasattr(obj, '_asdict')
is_motif_breakage_trajectory *= hasattr(obj, '_fields')
return bool(is_motif_breakage_trajectory)
[docs]
def are_compatible_motif_breakage_trajectories(
trj1 : MotifBreakageTrajectory,
trj2 : MotifBreakageTrajectory
) -> bool:
if not isinstance_motifbreakagetrajectory(trj1):
print('Object is not a MotifBreakageTrajectory')
return False
if not isinstance_motifbreakagetrajectory(trj2):
print('Object is not a MotifBreakageTrajectory')
return False
keys = ['motiflength', 'alphabet', 'unit', 'times']
for key in keys:
tt1 = trj1._asdict()[key]
tt2 = trj2._asdict()[key]
if isinstance(tt1, ift.Field):
tt1 = tt1.val
if isinstance(tt2, ift.Field):
tt2 = tt2.val
if not np.prod(tt1==tt2):
print('MotifBreakageTrajectories not compatible: {} mismatch.'.format(key))
return False
return True