Skip to content

Commit

Permalink
added direction serialization to the software
Browse files Browse the repository at this point in the history
  • Loading branch information
grinner committed May 21, 2018
1 parent c13a2d1 commit 6591029
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 14 deletions.
12 changes: 11 additions & 1 deletion cadnano/fileio/v3decode.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@
)
from cadnano.objectinstance import ObjectInstance
from cadnano.cntypes import (
DocT
DocT,
Vec3T
)

def decode(document: DocT, obj: dict, emit_signals: bool = True):
Expand Down Expand Up @@ -134,6 +135,7 @@ def decodePart( document: DocT,
vh_id_list = part_dict.get('vh_list')
vh_props = part_dict.get('virtual_helices')
origins = part_dict.get('origins', [])
directions = part_dict.get('directions', [])
keys = list(vh_props.keys())

if len(origins) == 0:
Expand All @@ -142,10 +144,12 @@ def decodePart( document: DocT,
if not is_lattice or len(origins[0]) == 3:
for id_num, size in vh_id_list:
x, y, z = origins[id_num]
direction = directions[id_num]
vh_props['eulerZ'][id_num] = 0.5*(360./10.5)
vals = [vh_props[k][id_num] for k in keys]
part.createVirtualHelix(x, y, z, size,
id_num=id_num,
direction=direction,
properties=(keys, vals),
safe=False,
use_undostack=False)
Expand Down Expand Up @@ -272,6 +276,7 @@ def importToPart( part_instance : ObjectInstance,
id_num_offset += 1
vh_id_list = copy_dict['vh_list']
origins = copy_dict['origins']
directions = copy_dict['directions']
vh_props = copy_dict['virtual_helices']
name_suffix = ".%d"

Expand All @@ -289,7 +294,11 @@ def importToPart( part_instance : ObjectInstance,

for i, pair in enumerate(vh_id_list):
id_num, size = pair

''' using `i` because we could be using a subset of all virtual
helices in a part'''
x, y, z = origins[i]
the_dir: Vec3T = directions[i]

if offset is not None:
x += offx
Expand Down Expand Up @@ -318,6 +327,7 @@ def importToPart( part_instance : ObjectInstance,

did_create = part.createVirtualHelix(x, y, z, size,
id_num=new_id_num,
direction=the_dir,
properties=(fixed_keys, fixed_vals),
safe=use_undostack,
use_undostack=use_undostack)
Expand Down
26 changes: 19 additions & 7 deletions cadnano/fileio/v3encode.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,13 +47,20 @@ def encodePart(part: PartT) -> dict:
group_props = part.getModelProperties().copy()

if not group_props.get('is_lattice', True):
vh_props, origins = part.helixPropertiesAndOrigins()
vh_props, origins, directions = part.helixProperties()
group_props['virtual_helices'] = vh_props
group_props['origins'] = origins
group_props['directions'] = directions
else:
vh_props, origins = part.helixPropertiesAndOrigins()
vh_props, origins, directions = part.helixProperties()
group_props['virtual_helices'] = vh_props
group_props['origins'] = origins
group_props['directions'] = directions

# print("ORIGINS")
# print(group_props['origins'])
# print("DIRECTIONS")
# print(group_props['directions'])

xover_list = []
strand_list = []
Expand Down Expand Up @@ -98,13 +105,15 @@ def reEmitPart(part: PartT):
group_props = part.getModelProperties().copy()

if not group_props.get('is_lattice', True):
vh_props, origins = part.helixPropertiesAndOrigins()
vh_props, origins, directions = part.helixProperties()
group_props['virtual_helices'] = vh_props
group_props['origins'] = origins
group_props['directions'] = directions
else:
vh_props, origins = part.helixPropertiesAndOrigins()
vh_props, origins, directions = part.helixProperties()
group_props['virtual_helices'] = vh_props
group_props['origins'] = origins
group_props['directions'] = directions

xover_list = []
threshold = 2.1*part.radius()
Expand Down Expand Up @@ -152,7 +161,8 @@ def reEmitPart(part: PartT):
# end def


def encodePartList(part_instance: ObjectInstance, vh_group_list: List[int]) -> dict:
def encodePartList( part_instance: ObjectInstance,
vh_group_list: List[int]) -> dict:
""" Used for copying and pasting
TODO: unify encodePart and encodePartList
Expand All @@ -178,13 +188,15 @@ def encodePartList(part_instance: ObjectInstance, vh_group_list: List[int]) -> d
assert('grid_type' in group_props)

if not group_props.get('is_lattice', True):
vh_props, origins = part.helixPropertiesAndOrigins()
vh_props, origins, directions = part.helixProperties()
group_props['virtual_helices'] = vh_props
group_props['origins'] = origins
group_props['directions'] = directions
else:
vh_props, origins = part.helixPropertiesAndOrigins(vh_group_list)
vh_props, origins, directions = part.helixProperties(vh_group_list)
group_props['virtual_helices'] = vh_props
group_props['origins'] = origins
group_props['directions'] = directions

xover_list = []
strand_list = []
Expand Down
14 changes: 8 additions & 6 deletions cadnano/part/nucleicacidpart.py
Original file line number Diff line number Diff line change
Expand Up @@ -1307,8 +1307,8 @@ def getVirtualHelixProperties(self, id_num: int,
return props.item() if isinstance(props, (np.float64, np.int64, np.bool_)) else props
# end

def helixPropertiesAndOrigins(self,
id_num_list: List[int] = None) -> Tuple[dict, np.ndarray]:
def helixProperties(self,
id_num_list: List[int] = None) -> Tuple[dict, np.ndarray, np.ndarray]:
"""
Args:
id_num_list (list): optional, of :obj:`int` list of virtual
Expand All @@ -1324,18 +1324,20 @@ def helixPropertiesAndOrigins(self,
ValueError:
"""
if id_num_list is None:
lim = max(self._highest_even_id_num_used + 2,
self._highest_odd_id_num_used + 2)
lim = max(self._highest_even_id_num_used + 1,
self._highest_odd_id_num_used + 1)
props = self.vh_properties.iloc[:lim]
props = props.to_dict(orient='list')
origins = self._origin_pts[:lim]
return props, origins
directions = self.directions[:lim]
return props, origins, directions
elif isinstance(id_num_list, list):
# select by list of indices
props = self.vh_properties.iloc[id_num_list].reset_index(drop=True)
props = props.to_dict(orient='list')
origins = self._origin_pts[id_num_list]
return props, origins
directions = self.getDirections(id_num_list)
return props, origins, directions
else:
raise ValueError("id_num_list bad type: {}".format(type(id_num_list)))
# end def
Expand Down

0 comments on commit 6591029

Please sign in to comment.