ATLAS Offline Software
Loading...
Searching...
No Matches
python.Node.Node Class Reference
Collaboration diagram for python.Node.Node:

Public Member Functions

 __init__ (self, name="root", flags=None, root=None)
 __setattr__ (self, name, value)
 __getattribute__ (self, name)
 __getattr__ (self, name)
 __contains__ (self, name)
 __copy__ (self)
 __delattr__ (self, name)
 __delitem__ (self, name)
 lock (self, lockstate=_LOCKED)
 unlock (self)
 lock_forever (self)
 islocked (self)
 locked (self)
 name (self)
 add (self, attr_name, value)
 addFlag (self, tag, value, flags=None)
 addNode (self, item, flags=None)
 has (self, name)
 hasFlag (self, name)
 hasNode (self, name)
 nodes (self)
 node_flags (self)
 node (self, name)
 delete (self, name)
 rename (self, name, newname)
 clone (self, name=None)
 print (self, spacer="")
 dump (self)
 cloneAndReplace (self, targetname, flagname)

Protected Member Functions

 _fail_if_locked_forever (self)
 _fail_if_locked (self)
 _loadflags (self, name)
 _addDynaFlags (self, name)
 _stragglers (self, flags, dbg="")
 _rootnode (self)
 _setrootnode (self, rootnode)
 _addFlagImpl (self, tag, value, flags=None, unlock=False)
 _addFlagUnlock (self, tag, value, flags=None)
 _addNewNode (self, str name, flags=None)
 _addNode (self, node)
 _hasFlagPath (self, name)

Protected Attributes

raise AttributeError(f) _children
return self._root._loadflags(name_root
 _lockstate = _LOCKED:

Private Attributes

raise AttributeError(f) __dict__

Detailed Description

Basic node class, so we can get all the egregious flags from a
flags object, and use, and pass round, the individual nodes, as
actual nodes without all the nonsense limitations of using the
flags directly

Definition at line 52 of file Node.py.

Constructor & Destructor Documentation

◆ __init__()

python.Node.Node.__init__ ( self,
name = "root",
flags = None,
root = None )

Definition at line 60 of file Node.py.

60 def __init__(self, name="root", flags=None, root=None ):
61 object.__setattr__(self, "_lockstate", _UNLOCKED)
62 object.__setattr__(self, "_name", name)
63 object.__setattr__(self, "_children", {})
64 object.__setattr__(self, "_flags", flags)
65 object.__setattr__(self, "_root", root)
66

Member Function Documentation

◆ __contains__()

python.Node.Node.__contains__ ( self,
name )

Definition at line 98 of file Node.py.

98 def __contains__(self, name):
99 return self.has(name)
100

◆ __copy__()

python.Node.Node.__copy__ ( self)

Definition at line 101 of file Node.py.

101 def __copy__(self):
102 return self.clone()
103

◆ __delattr__()

python.Node.Node.__delattr__ ( self,
name )

Definition at line 104 of file Node.py.

104 def __delattr__(self, name):
105 self.delete(name)
106

◆ __delitem__()

python.Node.Node.__delitem__ ( self,
name )

Definition at line 107 of file Node.py.

107 def __delitem__(self, name):
108 self.delete(name)
109

◆ __getattr__()

python.Node.Node.__getattr__ ( self,
name )
will attempt a dynamic load from flags if need be 

Definition at line 83 of file Node.py.

83 def __getattr__(self, name):
84 """ will attempt a dynamic load from flags if need be """
85 if name in self._children : return self._children[name]
86 if self._root :
87 if self._root._loadflags( f"{self.name()}.{name}" ) :
88 if name in self._children : return self._children[name]
89 if name in self._root._children : return self._root._children[name]
90 if self._root._loadflags( name ) :
91 if name in self._root._children : return self._root._children[name]
92 else:
93 if self._loadflags( name ) :
94 if name in self._children : return self._children[name]
95
96 raise AttributeError(f"no attribute {name}")
97

◆ __getattribute__()

python.Node.Node.__getattribute__ ( self,
name )

Definition at line 76 of file Node.py.

76 def __getattribute__(self, name):
77 value = object.__getattribute__(self, name)
78 if type(value).__name__ == "CfgFlag":
79 flags = object.__getattribute__(self, "_flags")
80 return value.get(flags)
81 return value
82

◆ __setattr__()

python.Node.Node.__setattr__ ( self,
name,
value )

Definition at line 67 of file Node.py.

67 def __setattr__(self, name, value):
68 self._fail_if_locked()
69 if name in self._children : raise AttributeError(f"node {name} already exists")
70 current = self.__dict__.get(name)
71 if type(current).__name__ == "CfgFlag":
72 current.set(value)
73 else:
74 object.__setattr__(self, name, value)
75
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
Definition hcg.cxx:132

◆ _addDynaFlags()

python.Node.Node._addDynaFlags ( self,
name )
protected

Definition at line 155 of file Node.py.

155 def _addDynaFlags(self, name) :
156 flags = self._flags
157 self._flags._loadDynaFlags(name)
158 return self._stragglers(flags)
159

◆ _addFlagImpl()

python.Node.Node._addFlagImpl ( self,
tag,
value,
flags = None,
unlock = False )
protected
addFlag method like that in the egregious flags 

Definition at line 182 of file Node.py.

182 def _addFlagImpl(self, tag, value, flags=None, unlock=False):
183 """ addFlag method like that in the egregious flags """
184 node = self
185 if flags is not None and self._flags is None : node._flags = flags
186 names = tag.split(".")
187 for name in names[:-1]:
188 node = node._addNewNode(name, flags )
189 if unlock : object.__setattr__( node, "_lockstate", _UNLOCKED )
190 if flags is not None : node._flags = flags
191 if names[-1] in node.__dict__ : return False
192 # just use a value at the moment, can use CfgFlag(value, type) if we really have to(
193 setattr(node, names[-1], value)
194 return True
195

◆ _addFlagUnlock()

python.Node.Node._addFlagUnlock ( self,
tag,
value,
flags = None )
protected

Definition at line 200 of file Node.py.

200 def _addFlagUnlock(self, tag, value, flags=None):
201 self._addFlagImpl( tag, value, flags, True )
202

◆ _addNewNode()

python.Node.Node._addNewNode ( self,
str name,
flags = None )
protected
add a new child node 

Definition at line 208 of file Node.py.

208 def _addNewNode(self, name : str, flags=None):
209 """ add a new child node """
210 self._fail_if_locked()
211 if name in self.__dict__: raise AttributeError(f"attribute {name} already exists")
212 rootnode = self._rootnode()
213 if name not in self._children :
214 self._children[name] = ( node := Node(name, root=rootnode) )
215 if flags is not None : node._flags = flags
216 return self._children[name]
217

◆ _addNode()

python.Node.Node._addNode ( self,
node )
protected
an en existing node as a child node 

Definition at line 218 of file Node.py.

218 def _addNode(self, node ):
219 """ an en existing node as a child node """
220 self._fail_if_locked()
221 name = node.name()
222 if name in self.__dict__: raise AttributeError(f"attribute {name} already exists")
223 rootnode = self._rootnode()
224 if name not in self._children :
225 if node._root and rootnode is not node._root :
226 raise RuntimeError(f"cannot add node {name} from a different tree")
227 self._children[node.name()] = node
228 if not node._root : node._setrootnode( rootnode )
229 return self._children[node.name()]
230
void name(const std::string &n)
Definition node.h:40

◆ _fail_if_locked()

python.Node.Node._fail_if_locked ( self)
protected

Definition at line 132 of file Node.py.

132 def _fail_if_locked(self):
133 if self._lockstate == _LOCKED : raise RuntimeError(f"Node {self._name} is locked; ")
134 if self._lockstate == _LOCKED_FOREVER : raise RuntimeError(f"Node {self._name} is permanently locked; ")
135

◆ _fail_if_locked_forever()

python.Node.Node._fail_if_locked_forever ( self)
protected

Definition at line 129 of file Node.py.

129 def _fail_if_locked_forever(self):
130 if self._lockstate == _LOCKED_FOREVER : raise RuntimeError(f"Node {self._name} is permanently locked; ")
131

◆ _hasFlagPath()

python.Node.Node._hasFlagPath ( self,
name )
protected

Definition at line 240 of file Node.py.

240 def _hasFlagPath(self, name):
241 parts = name.split('.')
242 node = self._rootnode()
243 for part in parts[:-1]:
244 if not node.hasNode(part) : return False
245 node = node.node(part)
246 return node.hasFlag(parts[-1])
247
node(node *n=0, const std::string &d="", TObject *t=0)
Definition node.h:32

◆ _loadflags()

python.Node.Node._loadflags ( self,
name )
protected
load dynamic flags - can only load flags on the root node 

Definition at line 136 of file Node.py.

136 def _loadflags(self, name ) :
137 """ load dynamic flags - can only load flags on the root node """
138
139 if self._root : return self._root._loadflags( name )
140
141 flags = self._flags
142 if flags is None : raise AttributeError(f"no attribute {name}")
143 lockstate = self._lockstate
144 object.__setattr__(self, "_lockstate", _UNLOCKED)
145 try:
146 if name in flags._loaded : return self._stragglers(flags)
147 if name in flags._dynaflags : return self._addDynaFlags(name)
148 for key in flags._dynaflags :
149 if name in key : return self._addDynaFlags(key)
150 return False
151 finally:
152 # ensure the lock state is restored if something goes wrong ...
153 if lockstate != _UNLOCKED : self.lock(lockstate)
154

◆ _rootnode()

python.Node.Node._rootnode ( self)
protected

Definition at line 166 of file Node.py.

166 def _rootnode(self):
167 if self._root : return self._root
168 return self
169

◆ _setrootnode()

python.Node.Node._setrootnode ( self,
rootnode )
protected

Definition at line 170 of file Node.py.

170 def _setrootnode(self, rootnode ):
171 if self._root is rootnode : return
172 object.__setattr__(self, "_root", rootnode )
173 for node in self.nodes() : node._setrootnode(rootnode)
174

◆ _stragglers()

python.Node.Node._stragglers ( self,
flags,
dbg = "" )
protected

Definition at line 160 of file Node.py.

160 def _stragglers(self, flags, dbg="") :
161 for key, val in self._flags._flagdict.items() :
162 if self._hasFlagPath(key) : continue
163 self._addFlagUnlock( key, val, flags )
164 return True
165

◆ add()

python.Node.Node.add ( self,
attr_name,
value )
add an attribute to this node 

Definition at line 178 of file Node.py.

178 def add(self, attr_name, value):
179 """ add an attribute to this node """
180 setattr(self, attr_name, value)
181
bool add(const std::string &hname, TKey *tobj)
Definition fastadd.cxx:55

◆ addFlag()

python.Node.Node.addFlag ( self,
tag,
value,
flags = None )

Definition at line 196 of file Node.py.

196 def addFlag(self, tag, value, flags=None):
197 if not self._addFlagImpl( tag, value, flags, False ):
198 raise KeyError(f"flag {tag} already exists")
199

◆ addNode()

python.Node.Node.addNode ( self,
item,
flags = None )

Definition at line 203 of file Node.py.

203 def addNode( self, item, flags=None):
204 if isinstance(item, Node) : return self._addNode(item)
205 if isinstance(item, str) : return self._addNewNode(item, flags)
206 raise TypeError(f"Cannot construct node from type {type(item).__name__}, value {item}")
207

◆ clone()

python.Node.Node.clone ( self,
name = None )
Return an independent copy" of this node

Definition at line 275 of file Node.py.

275 def clone(self, name=None):
276 """Return an independent copy" of this node"""
277
278 if name is not None : newnode = Node(name)
279 else: newnode = Node(self._name)
280
281 for key, value in self.__dict__.items():
282 if key in {"_name", "_children", "_lockstate", "_root" } : continue
283 setattr(newnode, key, value)
284
285 for node in self.nodes():
286 child = node.clone()
287 child._root = None
288 newnode._addNode(child)
289
290 return newnode
291
292

◆ cloneAndReplace()

python.Node.Node.cloneAndReplace ( self,
targetname,
flagname )

Definition at line 306 of file Node.py.

306 def cloneAndReplace(self, targetname, flagname ) :
307 # we really, really, should not have this ...
308 warnings.warn( "cloneAndReplace() is unnecessary for Node flags; "
309 "use the appropriate Node directly",
310 RuntimeWarning, stacklevel=2 )
311 # eventually, instead of delegation, should raise an exception ...
312 # raise RuntimeError( "cloneAndReplace() should not be used for node flags" )
313 return self._rootnode()._flags.cloneAndReplace( targetname, flagname )
314
315

◆ delete()

python.Node.Node.delete ( self,
name )

Definition at line 260 of file Node.py.

260 def delete(self, name):
261 self._fail_if_locked()
262 if name in self._children : del self._children[name]
263 elif name in self.__dict__ : object.__delattr__(self, name) # delattr( self, name )
264 else : raise AttributeError(f"Node {self._name} has no member {name}")
265

◆ dump()

python.Node.Node.dump ( self)

Definition at line 303 of file Node.py.

303 def dump(self): self.print()
304
305
void print(char *figname, TCanvas *c1)
-event-from-file

◆ has()

python.Node.Node.has ( self,
name )

Definition at line 231 of file Node.py.

231 def has(self, name ):
232 return hasattr( self, name )
233

◆ hasFlag()

python.Node.Node.hasFlag ( self,
name )

Definition at line 234 of file Node.py.

234 def hasFlag(self, name ):
235 return name in self.__dict__
236

◆ hasNode()

python.Node.Node.hasNode ( self,
name )

Definition at line 237 of file Node.py.

237 def hasNode(self, name):
238 return name in self._children
239

◆ islocked()

python.Node.Node.islocked ( self)

Definition at line 123 of file Node.py.

123 def islocked(self):
124 return self._lockstate != _UNLOCKED
125

◆ lock()

python.Node.Node.lock ( self,
lockstate = _LOCKED )

Definition at line 110 of file Node.py.

110 def lock(self, lockstate=_LOCKED):
111 for node in self.nodes() : node.lock(lockstate)
112 object.__setattr__(self, "_lockstate", lockstate)
113
virtual void lock()=0
Interface to allow an object to lock itself when made const in SG.

◆ lock_forever()

python.Node.Node.lock_forever ( self)

Definition at line 120 of file Node.py.

120 def lock_forever(self):
121 self.lock(_LOCKED_FOREVER)
122

◆ locked()

python.Node.Node.locked ( self)

Definition at line 126 of file Node.py.

126 def locked(self):
127 return self.islocked()
128

◆ name()

python.Node.Node.name ( self)

Definition at line 175 of file Node.py.

175 def name(self) :
176 return self._name
177

◆ node()

python.Node.Node.node ( self,
name )

Definition at line 256 of file Node.py.

256 def node(self, name):
257 if self.hasNode(name) : return self._children[name]
258 raise RuntimeError(f"So such child: {name}")
259
Definition node.h:24

◆ node_flags()

python.Node.Node.node_flags ( self)

Definition at line 251 of file Node.py.

251 def node_flags(self):
252 for key, value in self.__dict__.items():
253 if not key.startswith("_"):
254 yield key, getattr(self, key)
255

◆ nodes()

python.Node.Node.nodes ( self)

Definition at line 248 of file Node.py.

248 def nodes(self):
249 return self._children.values()
250

◆ print()

python.Node.Node.print ( self,
spacer = "" )

Definition at line 293 of file Node.py.

293 def print(self, spacer=""):
294 print( f"{spacer}{self._name} (Node)" )
295 if spacer=="" : spacer = "|__ "
296 else: spacer=f" {spacer}"
297 for key, value in self.__dict__.items():
298 if key in {"_name","_children","_lockstate", "_flags", "_root"} : continue
299 print( f"{spacer}{key}\t: {value}" )
300 for node in self.nodes() : node.print( spacer )
301
302

◆ rename()

python.Node.Node.rename ( self,
name,
newname )

Definition at line 266 of file Node.py.

266 def rename( self, name, newname ):
267 if newname in self._children or newname in self.__dict__ :
268 raise RuntimeError(f"name {newname} already in node")
269
270 if name in self.__dict__: setattr(self, newname, self.__dict__.pop(name) )
271 elif name in self._children :
272 self._children[newname] = ( node := self._children.pop(name) )
273 node._name = newname
274

◆ unlock()

python.Node.Node.unlock ( self)

Definition at line 114 of file Node.py.

114 def unlock(self):
115 self._fail_if_locked_forever()
116 if self._lockstate == _LOCKED:
117 object.__setattr__(self, "_lockstate", _UNLOCKED)
118 for node in self.nodes(): node.unlock()
119

Member Data Documentation

◆ __dict__

raise AttributeError(f) python.Node.Node.__dict__
private

Definition at line 211 of file Node.py.

◆ _children

raise AttributeError(f) python.Node.Node._children
protected

Definition at line 69 of file Node.py.

◆ _lockstate

python.Node.Node._lockstate = _LOCKED:
protected

Definition at line 116 of file Node.py.

◆ _root

return self._root._loadflags( name ) python.Node.Node._root
protected

Definition at line 86 of file Node.py.


The documentation for this class was generated from the following file: