Source code for ipfx.x_to_nwb.hr_treenode

"""
Wrapper class around the native struct
"""
import struct
from ipfx.x_to_nwb.hr_struct import Struct


[docs]class TreeNode(Struct): """Struct that also represents a node in the tree. """ def __init__(self, fh, endianess, record_types, level_sizes, level=0): self.level = level self.children = [] if self.level == 0: levels = struct.unpack(endianess + 'i', fh.read(4))[0] # read size of each level (one int per level) level_sizes = [] for _ in range(levels): size = struct.unpack(endianess + 'i', fh.read(4))[0] level_sizes.append(size) # The record structure in the file may differ from our expected # structure due to version differences, so we read the required number # of bytes, and then pad or truncate before unpacking the record. This # will probably result in corrupt data in some situations.. realsize = level_sizes[level] structsize = self.size() data = fh.read(realsize) diff = structsize - realsize if diff > 0: data = data + b'\0'*diff else: data = data[:structsize] # initialize struct data Struct.__init__(self, data, endianess) # next read the number of children nchild = struct.unpack(endianess + 'i', fh.read(4))[0] level += 1 if level >= len(record_types): return child_rectype = record_types[level] for _ in range(nchild): self.children.append(child_rectype(fh, endianess, record_types, level_sizes, level)) def __getitem__(self, i): return self.children[i] def __len__(self): return len(self.children) def __iter__(self): return self.children.__iter__() def __str__(self, indent=0): # Return a string describing this structure ind = ' '*indent srep = Struct.__str__(self, indent)[:-1] # exclude final parentheses srep += ind srep += ' children = %d,\n' % len(self) srep += ind srep += ')' return srep