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
115
116
117 | # das2py example 11:
# Reading catalogs and observing two stage node initialization
import das2
# ########################################################################### #
# Helper: print info on each catalog node
def prnCat(node):
# Print what it is and its Universal Resource Identifier
print("'%s' name: '%s', type: %s"%(
node.path, node.name, node.__class__.__name__)
)
# Looping over sub items internally triggers a call to the __iter__ method
# which will load the full node definition if needed.
for sSub in node:
sub_node = node[sSub]
print(" |- '%s' name: '%s', type: %s"%(
sSub, sub_node.name, sub_node.__class__.__name__)
)
print()
# ########################################################################### #
# Browsing directory nodes
top_node = das2.get_node(None)
prnCat(top_node)
# Lets walk down the node tree to the Galileo Ephemeris data Collection.
# Detailed node definitions are only downloaded as needed. This way GUI
# Tree controls don't have to load the entire catalog at once.
das_node = top_node['tag:das2.org,2012:']
prnCat(das_node)
site_node = das_node['site']
prnCat(site_node)
uiowa_node = site_node['uiowa']
prnCat(uiowa_node)
cas_node = uiowa_node['cassini']
prnCat(cas_node)
rpws_node = cas_node['rpws']
prnCat(rpws_node)
survey_node = rpws_node['survey']
prnCat(survey_node)
# Alternate method, let's jump down to leaf node using dictionary style access
waves_node = top_node['tag:das2.org,2012:']['site']['uiowa']['juno']['wav']['survey']
prnCat(waves_node)
# And the simplest method, getting a node using a path URI.
#
# In this case we skip loading the upper level nodes since we know what we want
# to read. Since the majority of the nodes used in daily processing are likely
# to be under the das head node, path URIs that don't start with one of the
# root paths are assumed to be a relative path under: 'tag:das2.org,2012:'
ephem_col = das2.get_node('site:/uiowa/galileo/ephemeris/jovicentric')
# ########################################################################### #
# Two stage loading and the props member
# das2 Node objects use lazy initialization. Catalog nodes contains references
# to sub-nodes. Sub-nodes can be accessed using standard python dictionary
# methods. When first obtaining a reference to a python sub-node object it
# looks to application code as if the sub-node has already been read from it's
# catalog file. In fact this is not the case. If it were, loading the root
# node would cause the entire global catalog to be pulled into memory, a
# situation to be avoided. Until a Node function is called that needs the full
# definition, the Node is defined only by the few elements given in its parent
# catalog listing. The only items that are always defined are:
#
# Node.__class__.__name__ - The python class name for the node.
# Node.path - The absolute path name of this node, typically begins with
# 'tag:das2.org,2012:'
# Node.name - The common label to use for this node in GUI controls and
# listings
# Node.props - A dictionary of any properties for this node, which initially
# is a very small set, grows quite a bit when the full node is
# loaded.
# Node.urls - The set of URLs from which this node may be loaded if required.
#
# Using lazy initialization allows GUI tree controls (for example) to only load
# the portions of the catalog that are needed without requiring management of
# two separate python objects for each node.
#
# If for some reason you need to force a full node definition in memory use the
# function:
#
# Node.load()
# To view the full set of properties for a node, use the props member
# dictionary. In the code below a node is obtained from from the Catalog
# rpws_node above. Since the parent doesn't carry a full child definition
# only a stub node is present at first
hfr_wfrm = rpws_node['hires_midfreq_waveform']
print("Stub node %s from %s:"%(hfr_wfrm.__class__.__name__, rpws_node.url))
for key in hfr_wfrm.props:
print(" %s: %s" %(key, hfr_wfrm.props[key]))
print()
# Explicitly load the full node. This isn't required unless we're dealing with
# the Node.props member directly as the various catalog API functions will
# trigger a full load as needed.
hfr_wfrm.load()
# Print the node properties again (notice the .url member of the child node)
print("Full node %s from %s:"%(hfr_wfrm.__class__.__name__, hfr_wfrm.url))
for key in hfr_wfrm.props:
print(" %s: %s" %(key, hfr_wfrm.props[key]))
print()
|