Skip to content

Commit

Permalink
Store toc mask rather than dict in segments
Browse files Browse the repository at this point in the history
  • Loading branch information
adamreeve committed Feb 25, 2020
1 parent 009ed9b commit 1c9bbee
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 24 deletions.
15 changes: 8 additions & 7 deletions nptdms/base_segment.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import numpy as np

from nptdms import types
from nptdms.common import toc_properties
from nptdms.log import log_manager


Expand All @@ -14,16 +15,16 @@ class BaseSegment(object):
"""

__slots__ = [
'position', 'num_chunks', 'ordered_objects', 'toc',
'position', 'num_chunks', 'ordered_objects', 'toc_mask',
'next_segment_offset', 'next_segment_pos',
'raw_data_offset', 'data_position', 'final_chunk_proportion',
'endianness']

def __init__(
self, position, toc, endianness, next_segment_offset,
self, position, toc_mask, endianness, next_segment_offset,
next_segment_pos, raw_data_offset, data_position):
self.position = position
self.toc = toc
self.toc_mask = toc_mask
self.endianness = endianness
self.next_segment_offset = next_segment_offset
self.next_segment_pos = next_segment_pos
Expand All @@ -45,7 +46,7 @@ def read_segment_objects(self, file, previous_segment_objects, previous_segment=
:param previous_segment: Previous segment in the file.
"""

if not self.toc["kTocMetaData"]:
if not self.toc_mask & toc_properties['kTocMetaData']:
try:
self.ordered_objects = previous_segment.ordered_objects
self._calculate_chunks()
Expand All @@ -55,7 +56,7 @@ def read_segment_objects(self, file, previous_segment_objects, previous_segment=
"kTocMetaData is not set for segment but "
"there is no previous segment")

if not self.toc["kTocNewObjList"]:
if not self.toc_mask & toc_properties['kTocNewObjList']:
# In this case, there can be a list of new objects that
# are appended, or previous objects can also be repeated
# if their properties change
Expand All @@ -75,7 +76,7 @@ def read_segment_objects(self, file, previous_segment_objects, previous_segment=
# re-using any properties from previous segments.
updating_existing = False
segment_obj = None
if not self.toc["kTocNewObjList"]:
if not self.toc_mask & toc_properties['kTocNewObjList']:
# Search for the same object from the previous segment
# object list.
for obj in self.ordered_objects:
Expand Down Expand Up @@ -108,7 +109,7 @@ def read_raw_data(self, f):
objects in this segment.
"""

if not self.toc["kTocRawData"]:
if not self.toc_mask & toc_properties['kTocRawData']:
yield DataChunk.empty()

f.seek(self.data_position)
Expand Down
23 changes: 11 additions & 12 deletions nptdms/tdms_segment.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import logging
import os
import numpy as np

Expand All @@ -7,22 +8,21 @@
BaseSegment, BaseSegmentObject, DataChunk, read_interleaved_segment_bytes, fromfile)
from nptdms.daqmx import DaqmxSegment
from nptdms.log import log_manager
from nptdms.utils import OrderedDict


log = log_manager.get_logger(__name__)


def read_segment_metadata(file, previous_segment_objects, previous_segment=None):
(position, toc, endianness, data_position, raw_data_offset,
(position, toc_mask, endianness, data_position, raw_data_offset,
next_segment_offset, next_segment_pos) = read_lead_in(file)

segment_args = (
position, toc, endianness, next_segment_offset,
position, toc_mask, endianness, next_segment_offset,
next_segment_pos, raw_data_offset, data_position)
if toc['kTocDAQmxRawData']:
if toc_mask & toc_properties['kTocDAQmxRawData']:
segment = DaqmxSegment(*segment_args)
elif toc["kTocInterleavedData"]:
elif toc_mask & toc_properties['kTocInterleavedData']:
segment = InterleavedDataSegment(*segment_args)
else:
segment = ContiguousDataSegment(*segment_args)
Expand Down Expand Up @@ -50,13 +50,12 @@ def read_lead_in(file):
# Next four bytes are table of contents mask
toc_mask = types.Int32.read(file)

toc = OrderedDict()
for prop_name, prop_mask in toc_properties.items():
prop_is_set = (toc_mask & prop_mask) != 0
toc[prop_name] = prop_is_set
log.debug("Property %s is %s", prop_name, prop_is_set)
if log.isEnabledFor(logging.DEBUG):
for prop_name, prop_mask in toc_properties.items():
prop_is_set = (toc_mask & prop_mask) != 0
log.debug("Property %s is %s", prop_name, prop_is_set)

endianness = '>' if toc['kTocBigEndian'] else '<'
endianness = '>' if (toc_mask & toc_properties['kTocBigEndian']) else '<'

# Next four bytes are version number
version = types.Int32.read(file, endianness)
Expand Down Expand Up @@ -91,7 +90,7 @@ def read_lead_in(file):
next_segment_pos = (
position + next_segment_offset + lead_size)

return (position, toc, endianness, data_position, raw_data_offset,
return (position, toc_mask, endianness, data_position, raw_data_offset,
next_segment_offset, next_segment_pos)


Expand Down
8 changes: 3 additions & 5 deletions nptdms/writer.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
"""Module for writing TDMS files"""

from collections import namedtuple
try:
from collections import OrderedDict
except ImportError:
Expand Down Expand Up @@ -95,7 +94,7 @@ def write(self, file):
metadata = self.metadata()
metadata_size = sum(len(val.bytes) for val in metadata)

toc = ["kTocMetaData", "kTocRawData", "kTocNewObjList"]
toc = ['kTocMetaData', 'kTocRawData', 'kTocNewObjList']
leadin = self.leadin(toc, metadata_size)

file.write(b''.join(val.bytes for val in leadin))
Expand Down Expand Up @@ -138,9 +137,8 @@ def leadin(self, toc, metadata_size):
leadin.append(Bytes(b'TDSm'))

toc_mask = long(0)
for toc_key, toc_val in toc_properties.items():
if toc_key in toc:
toc_mask = toc_mask | toc_val
for toc_flag in toc:
toc_mask = toc_mask | toc_properties[toc_flag]
leadin.append(Int32(toc_mask))

tdms_version = 4712
Expand Down

0 comments on commit 1c9bbee

Please sign in to comment.