Working with the Chimera Extension Manager

Chimera extensions typically can be divided into two parts: data manipulation and user interface. For example, the code in Toolbar Buttons defines a function which changes the display status of some atoms. This is the data manipulation part of that extension. The code also creates a toolbar button that invokes the function when pressed. This is the user interface part of the extension.

Data manipulation code may often be reused when building a new extension, but user interface code typically is not. Separating the parts into multiple source files simplifies reusing the data manipulation code, but complicates managing the extension as a unit. Fortunately, Python supports the package concept for just this purpose.

A Python package consists of a set of modules (.py files) stored in the same directory in the file system. One of the modules must be named, which is the initialization module that is automatically executed when the package is imported. By convention, Chimera extension packages implement the data manipulation code in Implementors of new functionality can access the data manipulation code by:

import extension

where extension is the name of the package.

The package integrates its functionality into the Chimera extension manager by including a special module named in the package, and following a particular protocol within that module. Namely, for each separate function the package wants to offer through the extension manager, a class derived from chimera.extension.EMO (Extension Management Object) must be defined in the module and an instance registered with the extension manager.

The code in Toolbar Buttons is organized in such a manner below:

Example ToolbarButtonExtension/

The contents of ToolbarButtonExtension/ is identical to the first section of code in Toolbar Buttons, with the exception that module os is not imported.

import re

import chimera

def mainchain():

MAINCHAIN = re.compile("^(N|CA|C)$", re.I)
for m in chimera.openModels.list(modelTypes=[chimera.Molecule]):
for a in m.atoms:
a.display = MAINCHAIN.match( != None


Example ToolbarButtonExtension/ derives a class from chimera.extension.EMO to define how functionality defined in may be invoked by the Chimera extension manager.

import chimera.extension

Class MainChainEMO is the derived class.
class MainChainEMO(chimera.extension.EMO):

Return the actual name of the extension.
def name(self):

return 'Backbone'

Return the short description that typically appears as balloon help or in the Tools preference category.
def description(self):

return 'display only protein backbone'

Return the categories in which this extension should appear. It is either a list or a dictionary. If it is a dictionary then the keys are the category names and the values are category-specific descriptions (and the description() method above is ignored).
def categories(self):

return ['Utilities']

Return the name of a file containing an icon that may be used on the tool bar to provide a shortcut for launching the extension.
def icon(self):

return self.path('mainchain.tiff')

Invoke the extension. Note that when this method is called, the content of "" is not available. To simplify calling functions, the EMO provides a module method that locates modules in the extension package by name; if no name is supplied, the "" module is returned.
def activate(self):

Call the mainchain function in the "" module.

Register an instance of MainChainEMO with the Chimera extension manager.

Running the Example

The example code files and ToolbarButton.tiff must be saved in a directory named ToolbarButtonExtension. To run the example, start chimera, bring up the Tools preference category (via the Preferences entry in the Favorites menu; then choosing the "Tools" preference category), use the Add button to add the directory above the ToolbarButtonExtension directory. A MainChain entry should appear under the Utilities tools category.