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.: '2023-05-17T15:30:24+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.: '2023-05-17T15:30:24+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.: '2023-05-17T15:30:25+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.: '2023-05-17T15:30:25+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.19.2'}

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.19.2',
    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}
[ ]: