File: tutorial2.py

package info (click to toggle)
pytables 3.10.2-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 15,228 kB
  • sloc: ansic: 82,212; python: 65,296; cpp: 753; sh: 394; makefile: 100
file content (114 lines) | stat: -rw-r--r-- 3,758 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
"""This program shows the different protections that PyTables offer to the user
in order to insure a correct data injection in tables.

Example to be used in the second tutorial in the User's Guide.

"""

import numpy as np

import tables as tb

# Describe a particle record


class Particle(tb.IsDescription):
    name = tb.StringCol(itemsize=16)  # 16-character string
    lati = tb.Int32Col()  # integer
    longi = tb.Int32Col()  # integer
    pressure = tb.Float32Col(shape=(2, 3))  # array of floats
    # (single-precision)
    temperature = tb.Float64Col(shape=(2, 3))  # array of doubles
    # (double-precision)


# Native NumPy dtype instances are also accepted
Event = np.dtype(
    [
        ("name", "S16"),
        ("TDCcount", np.uint8),
        ("ADCcount", np.uint16),
        ("xcoord", np.float32),
        ("ycoord", np.float32),
    ]
)

# And dictionaries too (this defines the same structure as above)
# Event = {
#     "name"     : StringCol(itemsize=16),
#     "TDCcount" : UInt8Col(),
#     "ADCcount" : UInt16Col(),
#     "xcoord"   : Float32Col(),
#     "ycoord"   : Float32Col(),
#     }

# Open a file in "w"rite mode
fileh = tb.open_file("tutorial2.h5", mode="w")
# Get the HDF5 root group
root = fileh.root
# Create the groups:
for groupname in ("Particles", "Events"):
    group = fileh.create_group(root, groupname)
# Now, create and fill the tables in Particles group
gparticles = root.Particles
# Create 3 new tables
for tablename in ("TParticle1", "TParticle2", "TParticle3"):
    # Create a table
    table = fileh.create_table(
        "/Particles", tablename, Particle, "Particles: " + tablename
    )
    # Get the record object associated with the table:
    particle = table.row
    # Fill the table with 257 particles
    for i in range(257):
        # First, assign the values to the Particle record
        particle["name"] = "Particle: %6d" % (i)
        particle["lati"] = i
        particle["longi"] = 10 - i
        # Detectable errors start here. Play with them!
        particle["pressure"] = i * np.arange(2 * 4).reshape(2, 4)  # Incorrect
        # particle['pressure'] = i * arange(2 * 3).reshape(2, 3)  # Correct
        # End of errors
        particle["temperature"] = i**2  # Broadcasting
        # This injects the Record values
        particle.append()
    # Flush the table buffers
    table.flush()

# Now, go for Events:
for tablename in ("TEvent1", "TEvent2", "TEvent3"):
    # Create a table in Events group
    table = fileh.create_table(
        root.Events, tablename, Event, "Events: " + tablename
    )
    # Get the record object associated with the table:
    event = table.row
    # Fill the table with 257 events
    for i in range(257):
        # First, assign the values to the Event record
        event["name"] = "Event: %6d" % (i)
        event["TDCcount"] = i % (1 << 8)  # Correct range
        # Detectable errors start here. Play with them!
        event["xcoor"] = float(i**2)  # Wrong spelling
        # event['xcoord'] = float(i**2)   # Correct spelling
        event["ADCcount"] = "sss"  # Wrong type
        # event['ADCcount'] = i * 2        # Correct type
        # End of errors
        event["ycoord"] = float(i) ** 4
        # This injects the Record values
        event.append()
    # Flush the buffers
    table.flush()

# Read the records from table "/Events/TEvent3" and select some
table = root.Events.TEvent3
events = [
    particle["TDCcount"]
    for particle in table
    if particle["ADCcount"] < 20 and 4 <= particle["TDCcount"] < 15
]
print("Last record ==>", events[-1])
print("Selected values ==>", events)
print("Total selected records ==> ", len(events))
# Finally, close the file (this also will flush all the remaining buffers!)
fileh.close()