Writing Containers to a tabular format

The TableWriter/TableReader sub-classes allow you to write a ctapipe.core.Container class and its meta-data to an output table. They treat the Fields in the Container as columns in the output, and automatically generate a schema. Here we will go through an example of writing out data and reading it back with Pandas, PyTables, and a ctapipe.io.TableReader:

In this example, we will use the HDF5TableWriter, which writes to HDF5 datasets using PyTables. Currently this is the only implemented TableWriter.

Caveats to think about: * vector columns in Containers can be written, but some lilbraries like Pandas can not read those (so you must use pytables or astropy to read outputs that have vector columns) * units are stored in the table metadata, but some libraries like Pandas ignore them and all other metadata

Create some example Containers

[1]:
from ctapipe.io import HDF5TableWriter
from ctapipe.core import Container, Field
from astropy import units as u
import numpy as np
[2]:
class VariousTypesContainer(Container):

    a_int = Field(int, 'some int value')
    a_float = Field(float, 'some float value with a unit', unit=u.m)
    a_bool = Field(bool, 'some bool value')
    a_np_int = Field(np.int64, 'a numpy int')
    a_np_float = Field(np.float64, 'a numpy float')
    a_np_bool = Field(np.bool_, 'np.bool')

let’s also make a dummy stream (generator) that will create a series of these containers

[3]:
def create_stream(n_event):

    data = VariousTypesContainer()
    for i in range(n_event):

        data.a_int = int(i)
        data.a_float = float(i) * u.cm # note unit conversion will happen
        data.a_bool = (i % 2) == 0
        data.a_np_int = np.int64(i)
        data.a_np_float = np.float64(i)
        data.a_np_bool = np.bool_((i % 2) == 0)

        yield data
[4]:
for data in create_stream(2):

    for key, val in data.items():

        print('{}: {}, type : {}'.format(key, val, type(val)))
a_int: 0, type : <class 'int'>
a_float: 0.0 cm, type : <class 'astropy.units.quantity.Quantity'>
a_bool: True, type : <class 'bool'>
a_np_int: 0, type : <class 'numpy.int64'>
a_np_float: 0.0, type : <class 'numpy.float64'>
a_np_bool: True, type : <class 'numpy.bool_'>
a_int: 1, type : <class 'int'>
a_float: 1.0 cm, type : <class 'astropy.units.quantity.Quantity'>
a_bool: False, type : <class 'bool'>
a_np_int: 1, type : <class 'numpy.int64'>
a_np_float: 1.0, type : <class 'numpy.float64'>
a_np_bool: False, type : <class 'numpy.bool_'>

Writing the Data (and good practices)

Always use context managers with IO classes, as they will make sure the underlying resources are properly closed in case of errors:

[5]:
try:
    with HDF5TableWriter('container.h5', group_name='data') as h5_table:

        for data in create_stream(10):

            h5_table.write('table', data)
            0/0
except Exception as err:
    print("FAILED:", err)
print('Done')

h5_table.h5file.isopen == False
FAILED: division by zero
Done
[5]:
True
[6]:
!ls container.h5
container.h5

Appending new Containers

To append some new containers we need to set the writing in append mode by using: ‘mode=a’. But let’s now first look at what happens if we don’t.

[7]:
for i in range(2):

    with HDF5TableWriter('container.h5', mode='w', group_name='data_{}'.format(i)) as h5_table:

        for data in create_stream(10):

            h5_table.write('table', data)

        print(h5_table.h5file)
container.h5 (File) ''
Last modif.: '2022-10-25T09:46:22+00:00'
Object Tree:
/ (RootGroup) ''
/data_0 (Group) ''
/data_0/table (Table(0,)fletcher32, shuffle, blosc:zstd(5)) 'Storage of VariousTypesContainer'

container.h5 (File) ''
Last modif.: '2022-10-25T09:46:22+00:00'
Object Tree:
/ (RootGroup) ''
/data_1 (Group) ''
/data_1/table (Table(0,)fletcher32, shuffle, blosc:zstd(5)) 'Storage of VariousTypesContainer'

[8]:
!rm -f container.h5

Ok so the writer destroyed the content of the file each time it opens the file. Now let’s try to append some data group to it! (using mode=’a’)

[9]:
for i in range(2):

    with HDF5TableWriter('container.h5', mode='a', group_name='data_{}'.format(i)) as h5_table:

        for data in create_stream(10):

            h5_table.write('table', data)

        print(h5_table.h5file)
container.h5 (File) ''
Last modif.: '2022-10-25T09:46:23+00:00'
Object Tree:
/ (RootGroup) ''
/data_0 (Group) ''
/data_0/table (Table(0,)fletcher32, shuffle, blosc:zstd(5)) 'Storage of VariousTypesContainer'

container.h5 (File) ''
Last modif.: '2022-10-25T09:46:23+00:00'
Object Tree:
/ (RootGroup) ''
/data_0 (Group) ''
/data_0/table (Table(10,)fletcher32, shuffle, blosc:zstd(5)) 'Storage of VariousTypesContainer'
/data_1 (Group) ''
/data_1/table (Table(0,)fletcher32, shuffle, blosc:zstd(5)) 'Storage of VariousTypesContainer'

So we can append some data groups. As long as the data group_name does not already exists. Let’s try to overwrite the data group : data_1

[10]:
try:
    with HDF5TableWriter('container.h5', mode='a', group_name='data_1') as h5_table:
        for data in create_stream(10):
            h5_table.write('table', data)
except Exception as err:
    print("Failed as expected:", err)

Good ! I cannot overwrite my data.

[11]:
print(bool(h5_table.h5file.isopen))
False

Reading the Data

Reading the whole table at once:

For this, you have several choices. Since we used the HDF5TableWriter in this example, we have at least these options avilable:

  • Pandas

  • PyTables

  • Astropy Table

For other TableWriter implementations, others may be possible (depending on format)

Reading using ctapipe.io.read_table

This is the preferred method, it returns an astropy Table and supports keeping track of units, metadata and transformations.

[12]:
from ctapipe.io import read_table


table = read_table('container.h5', '/data_0/table')
table[:5]
[12]:
Table length=5
a_inta_floata_boola_np_inta_np_floata_np_bool
m
int64float64boolint64float64bool
00.0True00.0True
10.01False11.0False
20.02True22.0True
30.03False33.0False
40.04True44.0True
[13]:
table.meta
[13]:
{'CTAPIPE_VERSION': '0.17.0'}

Reading with Pandas:

Pandas is a convenient way to read the output. HOWEVER BE WARNED that so far Pandas does not support reading the table meta-data or units for colums, so that information is lost!

[14]:
import pandas as pd

data = pd.read_hdf('container.h5', key='/data_0/table')
data.head()
[14]:
a_int a_float a_bool a_np_int a_np_float a_np_bool
0 0 0.00 True 0 0.0 True
1 1 0.01 False 1 1.0 False
2 2 0.02 True 2 2.0 True
3 3 0.03 False 3 3.0 False
4 4 0.04 True 4 4.0 True

Reading with PyTables

[15]:
import tables
h5  = tables.open_file('container.h5')
table = h5.root['data_0']['table']
table
[15]:
/data_0/table (Table(10,)fletcher32, shuffle, blosc:zstd(5)) 'Storage of VariousTypesContainer'
  description := {
  "a_int": Int64Col(shape=(), dflt=0, pos=0),
  "a_float": Float64Col(shape=(), dflt=0.0, pos=1),
  "a_bool": BoolCol(shape=(), dflt=False, pos=2),
  "a_np_int": Int64Col(shape=(), dflt=0, pos=3),
  "a_np_float": Float64Col(shape=(), dflt=0.0, pos=4),
  "a_np_bool": BoolCol(shape=(), dflt=False, pos=5)}
  byteorder := 'little'
  chunkshape := (1927,)

note that here we can still access the metadata

[16]:
table.attrs
[16]:
/data_0/table._v_attrs (AttributeSet), 31 attributes:
   [CLASS := 'TABLE',
    CTAFIELD_0_DESC := 'some int value',
    CTAFIELD_0_NAME := 'a_int',
    CTAFIELD_1_DESC := 'some float value with a unit',
    CTAFIELD_1_NAME := 'a_float',
    CTAFIELD_1_TRANSFORM := 'quantity',
    CTAFIELD_1_UNIT := 'm',
    CTAFIELD_2_DESC := 'some bool value',
    CTAFIELD_2_NAME := 'a_bool',
    CTAFIELD_3_DESC := 'a numpy int',
    CTAFIELD_3_NAME := 'a_np_int',
    CTAFIELD_4_DESC := 'a numpy float',
    CTAFIELD_4_NAME := 'a_np_float',
    CTAFIELD_5_DESC := 'np.bool',
    CTAFIELD_5_NAME := 'a_np_bool',
    CTAPIPE_VERSION := '0.17.0',
    FIELD_0_FILL := 0,
    FIELD_0_NAME := 'a_int',
    FIELD_1_FILL := 0.0,
    FIELD_1_NAME := 'a_float',
    FIELD_2_FILL := False,
    FIELD_2_NAME := 'a_bool',
    FIELD_3_FILL := 0,
    FIELD_3_NAME := 'a_np_int',
    FIELD_4_FILL := 0.0,
    FIELD_4_NAME := 'a_np_float',
    FIELD_5_FILL := False,
    FIELD_5_NAME := 'a_np_bool',
    NROWS := 10,
    TITLE := 'Storage of VariousTypesContainer',
    VERSION := '2.7']

Reading one-row-at-a-time:

Rather than using the full-table methods, if you want to read it row-by-row (e.g. to maintain compatibility with an existing event loop), you can use a TableReader instance.

The advantage here is that units and other metadata are retained and re-applied

[17]:
from ctapipe.io import HDF5TableReader

def read(mode):

    print('reading mode {}'.format(mode))

    with HDF5TableReader('container.h5', mode=mode) as h5_table:

        for group_name in ['data_0/', 'data_1/']:

            group_name = '/{}table'.format(group_name)
            print(group_name)

            for data in h5_table.read(group_name, VariousTypesContainer):

                print(data.as_dict())
[18]:
read('r')
reading mode r
/data_0/table
{'a_int': 0, 'a_float': <Quantity 0. m>, 'a_bool': True, 'a_np_int': 0, 'a_np_float': 0.0, 'a_np_bool': True}
{'a_int': 1, 'a_float': <Quantity 0.01 m>, 'a_bool': False, 'a_np_int': 1, 'a_np_float': 1.0, 'a_np_bool': False}
{'a_int': 2, 'a_float': <Quantity 0.02 m>, 'a_bool': True, 'a_np_int': 2, 'a_np_float': 2.0, 'a_np_bool': True}
{'a_int': 3, 'a_float': <Quantity 0.03 m>, 'a_bool': False, 'a_np_int': 3, 'a_np_float': 3.0, 'a_np_bool': False}
{'a_int': 4, 'a_float': <Quantity 0.04 m>, 'a_bool': True, 'a_np_int': 4, 'a_np_float': 4.0, 'a_np_bool': True}
{'a_int': 5, 'a_float': <Quantity 0.05 m>, 'a_bool': False, 'a_np_int': 5, 'a_np_float': 5.0, 'a_np_bool': False}
{'a_int': 6, 'a_float': <Quantity 0.06 m>, 'a_bool': True, 'a_np_int': 6, 'a_np_float': 6.0, 'a_np_bool': True}
{'a_int': 7, 'a_float': <Quantity 0.07 m>, 'a_bool': False, 'a_np_int': 7, 'a_np_float': 7.0, 'a_np_bool': False}
{'a_int': 8, 'a_float': <Quantity 0.08 m>, 'a_bool': True, 'a_np_int': 8, 'a_np_float': 8.0, 'a_np_bool': True}
{'a_int': 9, 'a_float': <Quantity 0.09 m>, 'a_bool': False, 'a_np_int': 9, 'a_np_float': 9.0, 'a_np_bool': False}
/data_1/table
{'a_int': 0, 'a_float': <Quantity 0. m>, 'a_bool': True, 'a_np_int': 0, 'a_np_float': 0.0, 'a_np_bool': True}
{'a_int': 1, 'a_float': <Quantity 0.01 m>, 'a_bool': False, 'a_np_int': 1, 'a_np_float': 1.0, 'a_np_bool': False}
{'a_int': 2, 'a_float': <Quantity 0.02 m>, 'a_bool': True, 'a_np_int': 2, 'a_np_float': 2.0, 'a_np_bool': True}
{'a_int': 3, 'a_float': <Quantity 0.03 m>, 'a_bool': False, 'a_np_int': 3, 'a_np_float': 3.0, 'a_np_bool': False}
{'a_int': 4, 'a_float': <Quantity 0.04 m>, 'a_bool': True, 'a_np_int': 4, 'a_np_float': 4.0, 'a_np_bool': True}
{'a_int': 5, 'a_float': <Quantity 0.05 m>, 'a_bool': False, 'a_np_int': 5, 'a_np_float': 5.0, 'a_np_bool': False}
{'a_int': 6, 'a_float': <Quantity 0.06 m>, 'a_bool': True, 'a_np_int': 6, 'a_np_float': 6.0, 'a_np_bool': True}
{'a_int': 7, 'a_float': <Quantity 0.07 m>, 'a_bool': False, 'a_np_int': 7, 'a_np_float': 7.0, 'a_np_bool': False}
{'a_int': 8, 'a_float': <Quantity 0.08 m>, 'a_bool': True, 'a_np_int': 8, 'a_np_float': 8.0, 'a_np_bool': True}
{'a_int': 9, 'a_float': <Quantity 0.09 m>, 'a_bool': False, 'a_np_int': 9, 'a_np_float': 9.0, 'a_np_bool': False}
{'a_int': 0, 'a_float': <Quantity 0. m>, 'a_bool': True, 'a_np_int': 0, 'a_np_float': 0.0, 'a_np_bool': True}
{'a_int': 1, 'a_float': <Quantity 0.01 m>, 'a_bool': False, 'a_np_int': 1, 'a_np_float': 1.0, 'a_np_bool': False}
{'a_int': 2, 'a_float': <Quantity 0.02 m>, 'a_bool': True, 'a_np_int': 2, 'a_np_float': 2.0, 'a_np_bool': True}
{'a_int': 3, 'a_float': <Quantity 0.03 m>, 'a_bool': False, 'a_np_int': 3, 'a_np_float': 3.0, 'a_np_bool': False}
{'a_int': 4, 'a_float': <Quantity 0.04 m>, 'a_bool': True, 'a_np_int': 4, 'a_np_float': 4.0, 'a_np_bool': True}
{'a_int': 5, 'a_float': <Quantity 0.05 m>, 'a_bool': False, 'a_np_int': 5, 'a_np_float': 5.0, 'a_np_bool': False}
{'a_int': 6, 'a_float': <Quantity 0.06 m>, 'a_bool': True, 'a_np_int': 6, 'a_np_float': 6.0, 'a_np_bool': True}
{'a_int': 7, 'a_float': <Quantity 0.07 m>, 'a_bool': False, 'a_np_int': 7, 'a_np_float': 7.0, 'a_np_bool': False}
{'a_int': 8, 'a_float': <Quantity 0.08 m>, 'a_bool': True, 'a_np_int': 8, 'a_np_float': 8.0, 'a_np_bool': True}
{'a_int': 9, 'a_float': <Quantity 0.09 m>, 'a_bool': False, 'a_np_int': 9, 'a_np_float': 9.0, 'a_np_bool': False}
[19]:
read('r+')
reading mode r+
/data_0/table
{'a_int': 0, 'a_float': <Quantity 0. m>, 'a_bool': True, 'a_np_int': 0, 'a_np_float': 0.0, 'a_np_bool': True}
{'a_int': 1, 'a_float': <Quantity 0.01 m>, 'a_bool': False, 'a_np_int': 1, 'a_np_float': 1.0, 'a_np_bool': False}
{'a_int': 2, 'a_float': <Quantity 0.02 m>, 'a_bool': True, 'a_np_int': 2, 'a_np_float': 2.0, 'a_np_bool': True}
{'a_int': 3, 'a_float': <Quantity 0.03 m>, 'a_bool': False, 'a_np_int': 3, 'a_np_float': 3.0, 'a_np_bool': False}
{'a_int': 4, 'a_float': <Quantity 0.04 m>, 'a_bool': True, 'a_np_int': 4, 'a_np_float': 4.0, 'a_np_bool': True}
{'a_int': 5, 'a_float': <Quantity 0.05 m>, 'a_bool': False, 'a_np_int': 5, 'a_np_float': 5.0, 'a_np_bool': False}
{'a_int': 6, 'a_float': <Quantity 0.06 m>, 'a_bool': True, 'a_np_int': 6, 'a_np_float': 6.0, 'a_np_bool': True}
{'a_int': 7, 'a_float': <Quantity 0.07 m>, 'a_bool': False, 'a_np_int': 7, 'a_np_float': 7.0, 'a_np_bool': False}
{'a_int': 8, 'a_float': <Quantity 0.08 m>, 'a_bool': True, 'a_np_int': 8, 'a_np_float': 8.0, 'a_np_bool': True}
{'a_int': 9, 'a_float': <Quantity 0.09 m>, 'a_bool': False, 'a_np_int': 9, 'a_np_float': 9.0, 'a_np_bool': False}
/data_1/table
{'a_int': 0, 'a_float': <Quantity 0. m>, 'a_bool': True, 'a_np_int': 0, 'a_np_float': 0.0, 'a_np_bool': True}
{'a_int': 1, 'a_float': <Quantity 0.01 m>, 'a_bool': False, 'a_np_int': 1, 'a_np_float': 1.0, 'a_np_bool': False}
{'a_int': 2, 'a_float': <Quantity 0.02 m>, 'a_bool': True, 'a_np_int': 2, 'a_np_float': 2.0, 'a_np_bool': True}
{'a_int': 3, 'a_float': <Quantity 0.03 m>, 'a_bool': False, 'a_np_int': 3, 'a_np_float': 3.0, 'a_np_bool': False}
{'a_int': 4, 'a_float': <Quantity 0.04 m>, 'a_bool': True, 'a_np_int': 4, 'a_np_float': 4.0, 'a_np_bool': True}
{'a_int': 5, 'a_float': <Quantity 0.05 m>, 'a_bool': False, 'a_np_int': 5, 'a_np_float': 5.0, 'a_np_bool': False}
{'a_int': 6, 'a_float': <Quantity 0.06 m>, 'a_bool': True, 'a_np_int': 6, 'a_np_float': 6.0, 'a_np_bool': True}
{'a_int': 7, 'a_float': <Quantity 0.07 m>, 'a_bool': False, 'a_np_int': 7, 'a_np_float': 7.0, 'a_np_bool': False}
{'a_int': 8, 'a_float': <Quantity 0.08 m>, 'a_bool': True, 'a_np_int': 8, 'a_np_float': 8.0, 'a_np_bool': True}
{'a_int': 9, 'a_float': <Quantity 0.09 m>, 'a_bool': False, 'a_np_int': 9, 'a_np_float': 9.0, 'a_np_bool': False}
{'a_int': 0, 'a_float': <Quantity 0. m>, 'a_bool': True, 'a_np_int': 0, 'a_np_float': 0.0, 'a_np_bool': True}
{'a_int': 1, 'a_float': <Quantity 0.01 m>, 'a_bool': False, 'a_np_int': 1, 'a_np_float': 1.0, 'a_np_bool': False}
{'a_int': 2, 'a_float': <Quantity 0.02 m>, 'a_bool': True, 'a_np_int': 2, 'a_np_float': 2.0, 'a_np_bool': True}
{'a_int': 3, 'a_float': <Quantity 0.03 m>, 'a_bool': False, 'a_np_int': 3, 'a_np_float': 3.0, 'a_np_bool': False}
{'a_int': 4, 'a_float': <Quantity 0.04 m>, 'a_bool': True, 'a_np_int': 4, 'a_np_float': 4.0, 'a_np_bool': True}
{'a_int': 5, 'a_float': <Quantity 0.05 m>, 'a_bool': False, 'a_np_int': 5, 'a_np_float': 5.0, 'a_np_bool': False}
{'a_int': 6, 'a_float': <Quantity 0.06 m>, 'a_bool': True, 'a_np_int': 6, 'a_np_float': 6.0, 'a_np_bool': True}
{'a_int': 7, 'a_float': <Quantity 0.07 m>, 'a_bool': False, 'a_np_int': 7, 'a_np_float': 7.0, 'a_np_bool': False}
{'a_int': 8, 'a_float': <Quantity 0.08 m>, 'a_bool': True, 'a_np_int': 8, 'a_np_float': 8.0, 'a_np_bool': True}
{'a_int': 9, 'a_float': <Quantity 0.09 m>, 'a_bool': False, 'a_np_int': 9, 'a_np_float': 9.0, 'a_np_bool': False}
[20]:
read('a')
reading mode a
/data_0/table
{'a_int': 0, 'a_float': <Quantity 0. m>, 'a_bool': True, 'a_np_int': 0, 'a_np_float': 0.0, 'a_np_bool': True}
{'a_int': 1, 'a_float': <Quantity 0.01 m>, 'a_bool': False, 'a_np_int': 1, 'a_np_float': 1.0, 'a_np_bool': False}
{'a_int': 2, 'a_float': <Quantity 0.02 m>, 'a_bool': True, 'a_np_int': 2, 'a_np_float': 2.0, 'a_np_bool': True}
{'a_int': 3, 'a_float': <Quantity 0.03 m>, 'a_bool': False, 'a_np_int': 3, 'a_np_float': 3.0, 'a_np_bool': False}
{'a_int': 4, 'a_float': <Quantity 0.04 m>, 'a_bool': True, 'a_np_int': 4, 'a_np_float': 4.0, 'a_np_bool': True}
{'a_int': 5, 'a_float': <Quantity 0.05 m>, 'a_bool': False, 'a_np_int': 5, 'a_np_float': 5.0, 'a_np_bool': False}
{'a_int': 6, 'a_float': <Quantity 0.06 m>, 'a_bool': True, 'a_np_int': 6, 'a_np_float': 6.0, 'a_np_bool': True}
{'a_int': 7, 'a_float': <Quantity 0.07 m>, 'a_bool': False, 'a_np_int': 7, 'a_np_float': 7.0, 'a_np_bool': False}
{'a_int': 8, 'a_float': <Quantity 0.08 m>, 'a_bool': True, 'a_np_int': 8, 'a_np_float': 8.0, 'a_np_bool': True}
{'a_int': 9, 'a_float': <Quantity 0.09 m>, 'a_bool': False, 'a_np_int': 9, 'a_np_float': 9.0, 'a_np_bool': False}
/data_1/table
{'a_int': 0, 'a_float': <Quantity 0. m>, 'a_bool': True, 'a_np_int': 0, 'a_np_float': 0.0, 'a_np_bool': True}
{'a_int': 1, 'a_float': <Quantity 0.01 m>, 'a_bool': False, 'a_np_int': 1, 'a_np_float': 1.0, 'a_np_bool': False}
{'a_int': 2, 'a_float': <Quantity 0.02 m>, 'a_bool': True, 'a_np_int': 2, 'a_np_float': 2.0, 'a_np_bool': True}
{'a_int': 3, 'a_float': <Quantity 0.03 m>, 'a_bool': False, 'a_np_int': 3, 'a_np_float': 3.0, 'a_np_bool': False}
{'a_int': 4, 'a_float': <Quantity 0.04 m>, 'a_bool': True, 'a_np_int': 4, 'a_np_float': 4.0, 'a_np_bool': True}
{'a_int': 5, 'a_float': <Quantity 0.05 m>, 'a_bool': False, 'a_np_int': 5, 'a_np_float': 5.0, 'a_np_bool': False}
{'a_int': 6, 'a_float': <Quantity 0.06 m>, 'a_bool': True, 'a_np_int': 6, 'a_np_float': 6.0, 'a_np_bool': True}
{'a_int': 7, 'a_float': <Quantity 0.07 m>, 'a_bool': False, 'a_np_int': 7, 'a_np_float': 7.0, 'a_np_bool': False}
{'a_int': 8, 'a_float': <Quantity 0.08 m>, 'a_bool': True, 'a_np_int': 8, 'a_np_float': 8.0, 'a_np_bool': True}
{'a_int': 9, 'a_float': <Quantity 0.09 m>, 'a_bool': False, 'a_np_int': 9, 'a_np_float': 9.0, 'a_np_bool': False}
{'a_int': 0, 'a_float': <Quantity 0. m>, 'a_bool': True, 'a_np_int': 0, 'a_np_float': 0.0, 'a_np_bool': True}
{'a_int': 1, 'a_float': <Quantity 0.01 m>, 'a_bool': False, 'a_np_int': 1, 'a_np_float': 1.0, 'a_np_bool': False}
{'a_int': 2, 'a_float': <Quantity 0.02 m>, 'a_bool': True, 'a_np_int': 2, 'a_np_float': 2.0, 'a_np_bool': True}
{'a_int': 3, 'a_float': <Quantity 0.03 m>, 'a_bool': False, 'a_np_int': 3, 'a_np_float': 3.0, 'a_np_bool': False}
{'a_int': 4, 'a_float': <Quantity 0.04 m>, 'a_bool': True, 'a_np_int': 4, 'a_np_float': 4.0, 'a_np_bool': True}
{'a_int': 5, 'a_float': <Quantity 0.05 m>, 'a_bool': False, 'a_np_int': 5, 'a_np_float': 5.0, 'a_np_bool': False}
{'a_int': 6, 'a_float': <Quantity 0.06 m>, 'a_bool': True, 'a_np_int': 6, 'a_np_float': 6.0, 'a_np_bool': True}
{'a_int': 7, 'a_float': <Quantity 0.07 m>, 'a_bool': False, 'a_np_int': 7, 'a_np_float': 7.0, 'a_np_bool': False}
{'a_int': 8, 'a_float': <Quantity 0.08 m>, 'a_bool': True, 'a_np_int': 8, 'a_np_float': 8.0, 'a_np_bool': True}
{'a_int': 9, 'a_float': <Quantity 0.09 m>, 'a_bool': False, 'a_np_int': 9, 'a_np_float': 9.0, 'a_np_bool': False}
[21]:
read('w')
reading mode w
/data_0/table
{'a_int': 0, 'a_float': <Quantity 0. m>, 'a_bool': True, 'a_np_int': 0, 'a_np_float': 0.0, 'a_np_bool': True}
{'a_int': 1, 'a_float': <Quantity 0.01 m>, 'a_bool': False, 'a_np_int': 1, 'a_np_float': 1.0, 'a_np_bool': False}
{'a_int': 2, 'a_float': <Quantity 0.02 m>, 'a_bool': True, 'a_np_int': 2, 'a_np_float': 2.0, 'a_np_bool': True}
{'a_int': 3, 'a_float': <Quantity 0.03 m>, 'a_bool': False, 'a_np_int': 3, 'a_np_float': 3.0, 'a_np_bool': False}
{'a_int': 4, 'a_float': <Quantity 0.04 m>, 'a_bool': True, 'a_np_int': 4, 'a_np_float': 4.0, 'a_np_bool': True}
{'a_int': 5, 'a_float': <Quantity 0.05 m>, 'a_bool': False, 'a_np_int': 5, 'a_np_float': 5.0, 'a_np_bool': False}
{'a_int': 6, 'a_float': <Quantity 0.06 m>, 'a_bool': True, 'a_np_int': 6, 'a_np_float': 6.0, 'a_np_bool': True}
{'a_int': 7, 'a_float': <Quantity 0.07 m>, 'a_bool': False, 'a_np_int': 7, 'a_np_float': 7.0, 'a_np_bool': False}
{'a_int': 8, 'a_float': <Quantity 0.08 m>, 'a_bool': True, 'a_np_int': 8, 'a_np_float': 8.0, 'a_np_bool': True}
{'a_int': 9, 'a_float': <Quantity 0.09 m>, 'a_bool': False, 'a_np_int': 9, 'a_np_float': 9.0, 'a_np_bool': False}
/data_1/table
{'a_int': 0, 'a_float': <Quantity 0. m>, 'a_bool': True, 'a_np_int': 0, 'a_np_float': 0.0, 'a_np_bool': True}
{'a_int': 1, 'a_float': <Quantity 0.01 m>, 'a_bool': False, 'a_np_int': 1, 'a_np_float': 1.0, 'a_np_bool': False}
{'a_int': 2, 'a_float': <Quantity 0.02 m>, 'a_bool': True, 'a_np_int': 2, 'a_np_float': 2.0, 'a_np_bool': True}
{'a_int': 3, 'a_float': <Quantity 0.03 m>, 'a_bool': False, 'a_np_int': 3, 'a_np_float': 3.0, 'a_np_bool': False}
{'a_int': 4, 'a_float': <Quantity 0.04 m>, 'a_bool': True, 'a_np_int': 4, 'a_np_float': 4.0, 'a_np_bool': True}
{'a_int': 5, 'a_float': <Quantity 0.05 m>, 'a_bool': False, 'a_np_int': 5, 'a_np_float': 5.0, 'a_np_bool': False}
{'a_int': 6, 'a_float': <Quantity 0.06 m>, 'a_bool': True, 'a_np_int': 6, 'a_np_float': 6.0, 'a_np_bool': True}
{'a_int': 7, 'a_float': <Quantity 0.07 m>, 'a_bool': False, 'a_np_int': 7, 'a_np_float': 7.0, 'a_np_bool': False}
{'a_int': 8, 'a_float': <Quantity 0.08 m>, 'a_bool': True, 'a_np_int': 8, 'a_np_float': 8.0, 'a_np_bool': True}
{'a_int': 9, 'a_float': <Quantity 0.09 m>, 'a_bool': False, 'a_np_int': 9, 'a_np_float': 9.0, 'a_np_bool': False}
{'a_int': 0, 'a_float': <Quantity 0. m>, 'a_bool': True, 'a_np_int': 0, 'a_np_float': 0.0, 'a_np_bool': True}
{'a_int': 1, 'a_float': <Quantity 0.01 m>, 'a_bool': False, 'a_np_int': 1, 'a_np_float': 1.0, 'a_np_bool': False}
{'a_int': 2, 'a_float': <Quantity 0.02 m>, 'a_bool': True, 'a_np_int': 2, 'a_np_float': 2.0, 'a_np_bool': True}
{'a_int': 3, 'a_float': <Quantity 0.03 m>, 'a_bool': False, 'a_np_int': 3, 'a_np_float': 3.0, 'a_np_bool': False}
{'a_int': 4, 'a_float': <Quantity 0.04 m>, 'a_bool': True, 'a_np_int': 4, 'a_np_float': 4.0, 'a_np_bool': True}
{'a_int': 5, 'a_float': <Quantity 0.05 m>, 'a_bool': False, 'a_np_int': 5, 'a_np_float': 5.0, 'a_np_bool': False}
{'a_int': 6, 'a_float': <Quantity 0.06 m>, 'a_bool': True, 'a_np_int': 6, 'a_np_float': 6.0, 'a_np_bool': True}
{'a_int': 7, 'a_float': <Quantity 0.07 m>, 'a_bool': False, 'a_np_int': 7, 'a_np_float': 7.0, 'a_np_bool': False}
{'a_int': 8, 'a_float': <Quantity 0.08 m>, 'a_bool': True, 'a_np_int': 8, 'a_np_float': 8.0, 'a_np_bool': True}
{'a_int': 9, 'a_float': <Quantity 0.09 m>, 'a_bool': False, 'a_np_int': 9, 'a_np_float': 9.0, 'a_np_bool': False}
[ ]: