Getting nodes#

Often it is necessary to perform actions on particular nodes, pass them into other functions, or perform more complex selections than you can with existing actions (see Selecting nodes). For that, you can use getNodes functions that return a node indexer (SBNodeIndexer, basically a list of nodes) based on the provided Node Specification Language (NSL) expression:

  • SAMSON.getNodes from the SAMSON interface, returns a node indexer for the active document.

  • SBNode.getNodes applied to a specific node, returns a node indexer with nodes descending from this node.

See also

User Guide: Node types

User Guide: Node Specification Language

Getting nodes using NSL#
# get a node indexer with all hydrogens in the active document
nodeIndexer1 = SAMSON.getNodes('Hydrogen')
# add in this node indexer all carbons in the active document
SAMSON.getNodes(nodeIndexer1, 'Carbon')

# get a node indexer with all hydrogens bonded to oxygens in the active document
nodeIndexer2 = SAMSON.getNodes('H linking O')

# get a node indexer with all nodes named "CA" that are within 5 angstrom of any sulfur atom
# in the active document
nodeIndexer3 = SAMSON.getNodes('"CA" within 5A of S')

# get a node indexer with all molecule nodes in the active document
nodeIndexer4 = SAMSON.getNodes('node.type molecule')

if len(nodeIndexer4):
    # get a node indexer with all atoms within the first molecule
    nodeIndexer5 = nodeIndexer4[0].getNodes('node.type atom')

# populate a node indexer with all residues within the molecules from nodeIndexer4
nodeIndexer6 = SBNodeIndexer()
for node in nodeIndexer4:
    node.getNodes(nodeIndexer6, 'node.type residue')

You can go through an indexer like through a list:

# get a node indexer with all atoms in the active document
nodeIndexer = SAMSON.getNodes('node.type atom')

# print the size of the node indexer
print(len(nodeIndexer))

if len(nodeIndexer):
    # prints information on the last node (atom) in the node indexer
    print(nodeIndexer[-1])

for node in nodeIndexer:
    # do something, e.g. print info on the node
    print(node)

# usage of list comprehensions:
# construct a list of x-coordinates of atoms in nanometers
atomXCoords = [atom.getX().nm for atom in nodeIndexer]

You can delete or add a node from the indexer, or check if it is present in it:

# get a node indexer with all atoms in the active document
nodeIndexer = SAMSON.getNodes('node.type atom')

if len(nodeIndexer):
    # get the 1st atom from the node indexer
    atom = nodeIndexer[0]
    # remove the atom from the node indexer
    nodeIndexer.removeNode(atom)
    # check if the node indexer has the atom
    print(nodeIndexer.hasNode(atom))
    # add atom back to the node indexer
    nodeIndexer.addNode(atom)

The next example shows a simple use of the NSL, node indexers, and how to make changes to node attributes.

# get a node indexer with all molecule nodes in the active document
moleculeIndexer = SAMSON.getNodes('node.type molecule')

if len(moleculeIndexer):
    # print info on the 1st molecule
    print(moleculeIndexer[0])
    # get atoms that are in this molecule
    atomIndexer = moleculeIndexer[0].getNodes('node.type atom')

    if len(atomIndexer):
        # get the 1st atom in node indexer
        atom = atomIndexer[0]
        # print the atom type
        print(atom.type)
        # print the atom information
        print(atom)
        # return the atom's atomic weight
        print(atom.atomicWeight)
        # select the atom: it will be highlighted
        atom.selectionFlag = True
        # get the atom's position
        atom.getPosition()
        # shift the position of the chosen atom by 100 picometers (pm) in x-direction
        atom.setX(atom.getX() + SBQuantity.pm(100))