Note
Go to the end to download the full example code.
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 Field``s 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#
32 import os
33
34 import numpy as np
35 import pandas as pd
36 import tables
37 from astropy import units as u
38
39 from ctapipe.core import Container, Field
40 from ctapipe.io import HDF5TableReader, HDF5TableWriter, read_table
44 class VariousTypesContainer(Container):
45 a_int = Field(int, "some int value")
46 a_float = Field(float, "some float value with a unit", unit=u.m)
47 a_bool = Field(bool, "some bool value")
48 a_np_int = Field(np.int64, "a numpy int")
49 a_np_float = Field(np.float64, "a numpy float")
50 a_np_bool = Field(np.bool_, "np.bool")
let’s also make a dummy stream (generator) that will create a series of these containers
59 def create_stream(n_event):
60 data = VariousTypesContainer()
61 for i in range(n_event):
62 data.a_int = int(i)
63 data.a_float = float(i) * u.cm # note unit conversion will happen
64 data.a_bool = (i % 2) == 0
65 data.a_np_int = np.int64(i)
66 data.a_np_float = np.float64(i)
67 data.a_np_bool = np.bool_((i % 2) == 0)
68
69 yield data
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:
89 try:
90 with HDF5TableWriter("container.h5", group_name="data") as h5_table:
91 for data in create_stream(10):
92 h5_table.write("table", data)
93 0 / 0
94 except Exception as err:
95 print("FAILED:", err)
96 print("Done")
97
98 h5_table.h5file.isopen
FAILED: division by zero
Done
0
101 print(os.listdir())
['table_writer_reader.py', 'command_line_tools.py', 'InstrumentDescription.py', 'provenance.py', 'README.rst', 'container.h5', 'mytool.provenance.log', 'config.json', 'containers.py']
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.
115 for i in range(2):
116 with HDF5TableWriter(
117 "container.h5", mode="w", group_name="data_{}".format(i)
118 ) as h5_table:
119 for data in create_stream(10):
120 h5_table.write("table", data)
121
122 print(h5_table.h5file)
container.h5 (File) ''
Last modif.: '2024-05-15T13:13:09+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.: '2024-05-15T13:13:09+00:00'
Object Tree:
/ (RootGroup) ''
/data_1 (Group) ''
/data_1/table (Table(0,)fletcher32, shuffle, blosc:zstd(5)) 'Storage of VariousTypesContainer'
125 os.remove("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’)
133 for i in range(2):
134 with HDF5TableWriter(
135 "container.h5", mode="a", group_name="data_{}".format(i)
136 ) as h5_table:
137 for data in create_stream(10):
138 h5_table.write("table", data)
139
140 print(h5_table.h5file)
container.h5 (File) ''
Last modif.: '2024-05-15T13:13:09+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.: '2024-05-15T13:13:09+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
148 try:
149 with HDF5TableWriter("container.h5", mode="a", group_name="data_1") as h5_table:
150 for data in create_stream(10):
151 h5_table.write("table", data)
152 except Exception as err:
153 print("Failed as expected:", err)
Good ! I cannot overwrite my data.
160 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 available:
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.
194 table = read_table("container.h5", "/data_0/table")
195 table[:5]
198 table.meta
{'CTAPIPE_VERSION': '0.21.1'}
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 columns, so that information is lost!
211 data = pd.read_hdf("container.h5", key="/data_0/table")
212 data.head()
Reading with PyTables#
221 h5 = tables.open_file("container.h5")
222 table = h5.root["data_0"]["table"]
223 table
/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
231 table.attrs
/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.21.1',
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']
close the file
236 h5.close()
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
255 def read(mode):
256 print("reading mode {}".format(mode))
257
258 with HDF5TableReader("container.h5", mode=mode) as h5_table:
259 for group_name in ["data_0/", "data_1/"]:
260 group_name = "/{}table".format(group_name)
261 print(group_name)
262
263 for data in h5_table.read(group_name, VariousTypesContainer):
264 print(data.as_dict())
268 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}
271 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}
274 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}
277 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}
Total running time of the script: (0 minutes 0.116 seconds)