A design goal is that this hierarchy of classes, editors and viewers should be mostly invisible to researchers. The sire API is designed to create objects of these classes automatically based on what the researcher needs to do. For instance, calling the .edit() function on a view of an Atom will automatically create and return the AtomEditor of that view. Searching for all the bonds in a molecule will automatically return a SelectorBond view of all of the bonds. Because all of these views and editors hold only implicitly shared copy-on-write pointers to the underlying MoleculeData object, creating and navigating views is extremely fast and memory-efficient. This data structure architecture is primarily exposed to the researcher via a powerful molecular search engine (figure ). This is built using a custom grammar via boost::spirit , and is complemented by SMILES and SMARTS searching enabled by RDKit 14 . The search engine empowers researchers to, for example, find all bonds between carbon and nitrogen atoms in a collection of molecules (mols["bonds from element C to element N"]), find all molecules that have been given an is perturbable property, which marks them as able to be perturbed during an alchemical free energy calculation (mols["molecules with property is perturbable"]), all residues called "ASP" that contain exactly one atom called "CA" (mols["resname ASP and residues with count(atomname CA) == 1"]), or all molecules that match the SMILES string for alanine dipeptide (mols["smiles