def run_outofplane(QCA):
     pyramidquads = smiles.SmilesSearchTree("*~*(~*)~*",
                                            QCA,
                                            name="pyramidquads")
     outofplane = geometry.ImproperTorsionOperation(pyramidquads,
                                                    name="outofplane")
     outofplane.apply(targets=entries)
     save(outofplane)
 def run_angles( QCA):
     triples = smiles.SmilesSearchTree( "*~*~*", QCA, name="triples")
     angles = geometry.AngleOperation( triples, name="angles")
     angles.apply( targets=entries)
     save( angles)
 def run_bonds( QCA):
     pairs = smiles.SmilesSearchTree( "*~*", QCA, name="pairs")
     bonds = geometry.BondOperation( pairs, name="bonds")
     bonds.apply( targets=entries)
     save( bonds)
 def run_torsions( QCA):
     linquads = smiles.SmilesSearchTree("*~*~*~*", QCA, name="linquads")
     torsions = geometry.TorsionOperation(linquads, name="torsions")
     torsions.apply( targets=entries)
     save( torsions)
                            root_payload=client,
                            node_index=dict(),
                            db=dict())
    drop = ["Intermediates", "Hessian"]

    QCA.build_index(ds, drop=drop, keep_specs=["default"])
    save(QCA)

entries = list(QCA.node_iter_depth_first(QCA.root(), select="Entry"))
print("There are {:d} entries total".format(len(entries)))

# The general query on the dataset.
# The results respect the key, and will only return those indices if specified
# If no key is specified, then the indices are in order as they appear in the string
query = smiles.SmilesSearchTree("[#7X3:2](~[#1:1])(~[#6])~[#6:3]=[O:4]",
                                QCA,
                                name="smiles")
query.apply(targets=entries)

if True:
    # This is the torsion drive we are looking for
    # For whatever reason, the mapped indices are not respected, so need the map
    #
    # It is possible to select just a subset of the above search.
    # For example matching [2,3] will match any torsiondrive with the same
    # rotatable bond
    #
    # This is 1-indexing
    #
    # This will search for the exact torsion specified above
    # tmap = [1, 2, 3, 4]