コード例 #1
0
ファイル: selecting.py プロジェクト: evonove/pymol
    def indicate(selection="(all)",_self=cmd):
        '''
DESCRIPTION

    "indicate" shows a visual representation of an atom selection.

USAGE

    indicate (selection)

PYMOL API

    cmd.count(string selection)

        '''
        r = DEFAULT_ERROR
        # preprocess selection
        selection = selector.process(selection)
        #      
        try:
            _self.lock(_self)   
            r = _cmd.select(_self._COb,"indicate","("+str(selection)+")",1,-1,'')
            if is_error(r):
                _self.delete("indicate")
            else:
                _self.enable("indicate")
        finally:
            _self.unlock(r,_self)
        if _self._raising(r,_self): raise pymol.CmdException                  
        return r
コード例 #2
0
ファイル: C2000returns.py プロジェクト: jchodera/pymol
def x(st):
   print st
   cmd.set("raise_exceptions",0)
   valu = eval(st)
   print valu
   if cmd.is_error(valu):
      cmd.set("raise_exceptions",1)
      try:
         print eval(st)
      except pymol.CmdException:
         print "CmdException raised."
      except cmd.QuietException:
         print "QuietException raised."
コード例 #3
0
 def get_session(names='',
                 partial=0,
                 quiet=1,
                 compress=-1,
                 cache=-1,
                 _self=cmd):
     session = {}
     r = DEFAULT_SUCCESS
     cache = int(cache)
     compress = int(compress)
     if cache:
         cache_opt = int(_self.get('session_cache_optimize'))
         if cache != 0:
             cache_mode = int(_self.get('cache_mode'))
             if ((cache_mode > 0) and (cache_opt != 0)) or (cache_opt == 1):
                 _self.cache('optimize')
     for a in _self._pymol._session_save_tasks:
         if a == None:
             try:
                 _self.lock(_self)
                 r = _cmd.get_session(_self._COb, session, str(names),
                                      int(partial), int(quiet))
             finally:
                 _self.unlock(r, _self)
             try:
                 session['session'] = copy.deepcopy(_self._pymol.session)
                 if cache and hasattr(_self._pymol, '_cache'):
                     session['cache'] = _self._pymol._cache
             except:
                 traceback.print_exc()
         else:
             try:
                 if is_error(apply(a, (session, ), {'_self': _self})):
                     r = DEFAULT_ERROR
             except:
                 traceback.print_exc()
                 print "Error: An error occurred when trying to generate session."
                 print "Error: The resulting session file may be incomplete."
     if is_ok(r):
         if (compress < 0):
             compress = _self.get_setting_boolean('session_compression')
         if (compress):
             import zlib
             session = zlib.compress(io.pkl.toString(session))
         return session
     elif _self._raising(r, _self):
         raise QuietException
     return r
コード例 #4
0
ファイル: querying.py プロジェクト: gratefulfrog/lib
    def get_type(name,quiet=1,_self=cmd):
        '''
DESCRIPTION

    "get_type" returns a string describing the named object or
     selection or the string "nonexistent" if the name in unknown.

PYMOL API

    cmd.get_type(string object-name)

NOTES

    Possible return values are

    "object:molecule"
    "object:map"
    "object:mesh"
    "object:slice"
    "object:surface"
    "object:measurement"
    "object:cgo"
    "object:group"
    "object:volume"
    "selection"

SEE ALSO

    get_names
        '''
        r = DEFAULT_ERROR
        try:
            _self.lock(_self)
            r = _cmd.get_type(_self._COb,str(name))
        finally:
            _self.unlock(r,_self)
        if is_error(r):
            if not quiet and _feedback(fb_module.cmd,fb_mask.errors,_self):      
                print "Cmd-Error: unrecognized name."
        elif not quiet:
            print r
        if _raising(r,_self): raise pymol.CmdException
        return r
コード例 #5
0
ファイル: exporting.py プロジェクト: aghozlane/pymol
 def get_session(names='', partial=0, quiet=1, compress=-1, cache=-1, _self=cmd):
     session = {}
     r = DEFAULT_SUCCESS
     cache = int(cache)
     compress = int(compress)
     if cache:
         cache_opt = int(_self.get('session_cache_optimize'))
         if cache != 0:
             cache_mode = int(_self.get('cache_mode'))
             if ((cache_mode > 0) and (cache_opt != 0)) or (cache_opt==1):
                 _self.cache('optimize')
     for a in _self._pymol._session_save_tasks:
         if a==None:
             try:
                 _self.lock(_self)
                 r = _cmd.get_session(_self._COb,session,str(names),
                                      int(partial),int(quiet))
             finally:
                 _self.unlock(r,_self)
             try:
                 session['session'] = copy.deepcopy(_self._pymol.session)
                 if cache and hasattr(_self._pymol,'_cache'):
                     session['cache'] = _self._pymol._cache
             except:
                 traceback.print_exc()
         else:
             try:
                 if is_error(apply(a,(session,),{'_self':_self})):
                     r = DEFAULT_ERROR
             except:
                 traceback.print_exc()
                 print "Error: An error occurred when trying to generate session."
                 print "Error: The resulting session file may be incomplete."
     if is_ok(r):
         if(compress<0):
             compress = _self.get_setting_boolean('session_compression')
         if(compress):
             import zlib
             session = zlib.compress(io.pkl.toString(session))
         return session
     elif _self._raising(r,_self):
         raise QuietException                  
     return r
コード例 #6
0
    def get_type(name, quiet=1, _self=cmd):
        '''
DESCRIPTION

    "get_type" returns a string describing the named object or
     selection or the string "nonexistent" if the name in unknown.

PYMOL API

    cmd.get_type(string object-name)

NOTES

    Possible return values are

    "object:molecule"
    "object:map"
    "object:mesh"
    "object:slice"
    "object:surface"
    "object:measurement"
    "object:cgo"
    "object:group"
    "object:volume"
    "selection"

SEE ALSO

    get_names
        '''
        r = DEFAULT_ERROR
        try:
            _self.lock(_self)
            r = _cmd.get_type(_self._COb, str(name))
        finally:
            _self.unlock(r, _self)
        if is_error(r):
            if not quiet and _feedback(fb_module.cmd, fb_mask.errors, _self):
                print "Cmd-Error: unrecognized name."
        elif not quiet:
            print r
        if _raising(r, _self): raise pymol.CmdException
        return r
コード例 #7
0
ファイル: creating.py プロジェクト: evonove/pymol
    def create(name, selection, source_state=0,
               target_state=0, discrete=0, zoom=-1, quiet=1,
               singletons=0, extract=None, copy_properties=False, _self=cmd):
        '''
DESCRIPTION

    "create" creates a new molecule object from a selection.  It can
    also be used to create states in an existing object.

USAGE

    create name, selection [,source_state [,target_state ] ]

ARGUMENTS

    name = string: name of object to create or modify

    selection = string: atoms to include in the new object

    source_state = integer: {default: 0 -- copy all states}

    target_state = integer: -1 appends after last state {default: 0}

PYMOL API

    cmd.create(string name, string selection, int state,
               int target_state, int discrete)

NOTES

    If the source and target states are zero (default), then all
    states will be copied.  Otherwise, only the indicated states will
    be copied.

SEE ALSO

    load, copy, extract
        '''
        r = DEFAULT_ERROR
        target_state = int(target_state)
        if target_state == -1:
            target_state = _self.count_states('?' + name) + 1
        if copy_properties:
            print ' Warning: properties are not supported in Open-Source PyMOL'
        # preprocess selection
        selection = selector.process(selection)
        #      
        try:
            _self.lock(_self)
            if name==None:
                name = _self.get_unused_name("obj")
            r = _cmd.create(_self._COb,str(name),"("+str(selection)+")",
                            int(source_state)-1,int(target_state)-1,
                            int(discrete),int(zoom),int(quiet),int(singletons))
        finally:
            _self.unlock(r,_self)
        if not is_error(r): # temporary inefficient implementation
            if extract not in (None, 0, '0'):
                if extract not in (1, '1'):
                    extract = selector.process(extract)
                else:
                    extract = selection
                _self.remove("(("+extract+") in (%s)) and not (%s)"%(name,name))
        if _self._raising(r,_self): raise pymol.CmdException
        return r
コード例 #8
0
    def set_key(key, fn, arg=(), kw={}, _self=cmd):
        '''
DESCRIPTION

    "set_key" binds a specific python function to a key press.

    New in PyMOL 1.6.1: second argument can also be a string in PyMOL
    command syntax.

USAGE

    set_key key, command

EXAMPLE

    set_key F1, as cartoon, polymer; as sticks, organic

PYMOL API (ONLY)

    cmd.set_key( string key, function fn, tuple arg=(), dict kw={})

PYTHON EXAMPLE

    from pymol import cmd

    def color_blue(object): cmd.color("blue",object)

    cmd.set_key( 'F1' , color_blue, ( "object1" ) )
    // would turn object1 blue when the F1 key is pressed and

    cmd.set_key( 'F2' , color_blue, ( "object2" ) )
    // would turn object2 blue when the F2 key is pressed.

    cmd.set_key( 'CTRL-C' , cmd.zoom )   
    cmd.set_key( 'ALT-A' , cmd.turn, ('x',90) )

KEYS WHICH CAN BE REDEFINED

    F1 to F12
    left, right, pgup, pgdn, home, insert
    CTRL-A to CTRL-Z 
    ALT-0 to ALT-9, ALT-A to ALT-Z

SEE ALSO

    button, alias
        '''
        r = DEFAULT_ERROR
        if isinstance(fn, basestring):
            if arg or kw:
                raise ValueError('arg and kw must be empty if fn is string')
            arg = (fn, )
            fn = cmd.do
        if key[0:5] == 'CTRL-':
            pat = key[5:]
            if len(pat) > 1:  # ctrl-special key
                if pat[0] != 'F':
                    pat = string.lower(pat)
                for a in _self.ctrl_special.keys():
                    if _self.ctrl_special[a][0] == pat:
                        _self.ctrl_special[a][1] = fn
                        _self.ctrl_special[a][2] = arg
                        _self.ctrl_special[a][3] = kw
                        r = DEFAULT_SUCCESS
            else:  # std. ctrl key
                for a in _self.ctrl.keys():
                    if a == pat:
                        _self.ctrl[a][0] = fn
                        _self.ctrl[a][1] = arg
                        _self.ctrl[a][2] = kw
                        r = DEFAULT_SUCCESS
        elif key[0:4] == 'ALT-':
            pat = key[4:]
            if len(pat) > 1:  # alt-special key
                if pat[0] != 'F':
                    pat = string.lower(pat)
                for a in _self.alt_special.keys():
                    if _self.alt_special[a][0] == pat:
                        _self.alt_special[a][1] = fn
                        _self.alt_special[a][2] = arg
                        _self.alt_special[a][3] = kw
                        r = DEFAULT_SUCCESS
            else:  # std. alt key
                pat = string.lower(pat)
                for a in _self.alt.keys():
                    if a == pat:
                        _self.alt[a][0] = fn
                        _self.alt[a][1] = arg
                        _self.alt[a][2] = kw
                        r = DEFAULT_SUCCESS
        elif key[0:5] == 'SHFT-':
            pat = key[5:]
            if len(pat) > 1:  # shft-special key
                if pat[0] != 'F':
                    pat = string.lower(pat)
                for a in _self.shft_special.keys():
                    if _self.shft_special[a][0] == pat:
                        _self.shft_special[a][1] = fn
                        _self.shft_special[a][2] = arg
                        _self.shft_special[a][3] = kw
                        r = DEFAULT_SUCCESS
        else:
            if key[0] != 'F':
                pat = string.lower(key)
            else:
                pat = key
            for a in _self.special.keys():
                if _self.special[a][0] == pat:
                    _self.special[a][1] = fn
                    _self.special[a][2] = arg
                    _self.special[a][3] = kw
                    r = DEFAULT_SUCCESS
        if is_error(r):
            print "Error: special '%s' key not found." % key
        if _self._raising(r, _self): raise pymol.CmdException
        return r
コード例 #9
0
ファイル: creating.py プロジェクト: Almad/pymol
    def create(name, selection, source_state=0,
               target_state=0, discrete=0, zoom=-1, quiet=1,
               singletons=0, extract=None, _self=cmd):
        '''
DESCRIPTION

    "create" creates a new molecule object from a selection.  It can
    also be used to create states in an existing object.

USAGE

    create name, selection [,source_state [,target_state ] ]

ARGUMENTS

    name = string: name of object to create or modify

    selection = string: atoms to include in the new object

    source_state = integer: {default: 0 -- copy all states}

    target_state = integer: {default: 0}

PYMOL API

    cmd.create(string name, string selection, int state,
               int target_state, int discrete)

NOTES

    If the source and target states are zero (default), then all
    states will be copied.  Otherwise, only the indicated states will
    be copied.

SEE ALSO

    load, copy, extract
        '''
        r = DEFAULT_ERROR      
        # preprocess selection
        selection = selector.process(selection)
        #      
        try:
            _self.lock(_self)
            if name==None:
                avoid = {}
                for obj in cmd.get_names("all"):
                    avoid[obj] = 1
                sel_cnt = _cmd.get(_self._COb,"sel_counter") 
                while 1:
                    sel_cnt = sel_cnt + 1.0
                    name = "obj%02.0f" % sel_cnt
                    if not avoid.has_key(name):
                        _cmd.legacy_set(_self._COb,"sel_counter","%1.0f" % sel_cnt)
                        break
            r = _cmd.create(_self._COb,str(name),"("+str(selection)+")",
                            int(source_state)-1,int(target_state)-1,
                            int(discrete),int(zoom),int(quiet),int(singletons))
        finally:
            _self.unlock(r,_self)
        if not is_error(r): # temporary inefficient implementation
            if extract not in (None, 0, '0'):
                if extract not in (1, '1'):
                    extract = selector.process(extract)
                else:
                    extract = selection
                _self.remove("(("+extract+") in (%s)) and not (%s)"%(name,name))
        if _self._raising(r,_self): raise pymol.CmdException                                    
        return r
コード例 #10
0
ファイル: controlling.py プロジェクト: aghozlane/pymol
    def set_key(key,fn,arg=(),kw={},_self=cmd):  
        '''
DESCRIPTION

    "set_key" binds a specific python function to a key press.

PYMOL API (ONLY)

    cmd.set_key( string key, function fn, tuple arg=(), dict kw={})

PYTHON EXAMPLE

    from pymol import cmd

    def color_blue(object): cmd.color("blue",object)

    cmd.set_key( 'F1' , color_blue, ( "object1" ) )
    // would turn object1 blue when the F1 key is pressed and

    cmd.set_key( 'F2' , color_blue, ( "object2" ) )
    // would turn object2 blue when the F2 key is pressed.

    cmd.set_key( 'CTRL-C' , cmd.zoom )   
    cmd.set_key( 'ALT-A' , cmd.turn, ('x',90) )

KEYS WHICH CAN BE REDEFINED

    F1 to F12
    left, right, pgup, pgdn, home, insert
    CTRL-A to CTRL-Z 
    ALT-0 to ALT-9, ALT-A to ALT-Z

SEE ALSO

    button
        '''
        r = DEFAULT_ERROR
        if key[0:5]=='CTRL-':
            pat=key[5:]
            if len(pat)>1: # ctrl-special key
                if pat[0]!='F':
                    pat=string.lower(pat)
                for a in _self.ctrl_special.keys():
                    if _self.ctrl_special[a][0]==pat:
                        _self.ctrl_special[a][1]=fn
                        _self.ctrl_special[a][2]=arg
                        _self.ctrl_special[a][3]=kw
                        r = DEFAULT_SUCCESS
            else: # std. ctrl key
                for a in _self.ctrl.keys():
                    if a==pat:
                        _self.ctrl[a][0]=fn
                        _self.ctrl[a][1]=arg
                        _self.ctrl[a][2]=kw
                        r = DEFAULT_SUCCESS
        elif key[0:4]=='ALT-':
            pat=key[4:]
            if len(pat)>1: # alt-special key
                if pat[0]!='F':
                    pat=string.lower(pat)
                for a in _self.alt_special.keys():
                    if _self.alt_special[a][0]==pat:
                        _self.alt_special[a][1]=fn
                        _self.alt_special[a][2]=arg
                        _self.alt_special[a][3]=kw
                        r = DEFAULT_SUCCESS
            else: # std. alt key
                pat=string.lower(pat)
                for a in _self.alt.keys():
                    if a==pat:
                        _self.alt[a][0]=fn
                        _self.alt[a][1]=arg
                        _self.alt[a][2]=kw
                        r = DEFAULT_SUCCESS
        elif key[0:5]=='SHFT-':
            pat=key[5:]
            if len(pat)>1: # shft-special key
                if pat[0]!='F':
                    pat=string.lower(pat)
                for a in _self.shft_special.keys():
                    if _self.shft_special[a][0]==pat:
                        _self.shft_special[a][1]=fn
                        _self.shft_special[a][2]=arg
                        _self.shft_special[a][3]=kw
                        r = DEFAULT_SUCCESS
        else:
            if key[0]!='F':
                pat=string.lower(key)
            else:
                pat=key
            for a in _self.special.keys():
                if _self.special[a][0]==pat:
                    _self.special[a][1]=fn
                    _self.special[a][2]=arg
                    _self.special[a][3]=kw
                    r = DEFAULT_SUCCESS
        if is_error(r):
            print "Error: special '%s' key not found."%key
        if _self._raising(r,_self): raise pymol.CmdException         
        return r
コード例 #11
0
ファイル: controlling.py プロジェクト: baoboa/pymol
    def set_key(key,fn,arg=(),kw={},_self=cmd):  
        '''
DESCRIPTION

    "set_key" binds a specific python function to a key press.

    New in PyMOL 1.6.1: second argument can also be a string in PyMOL
    command syntax.

USAGE

    set_key key, command

EXAMPLE

    set_key F1, as cartoon, polymer; as sticks, organic

PYMOL API (ONLY)

    cmd.set_key( string key, function fn, tuple arg=(), dict kw={})

PYTHON EXAMPLE

    from pymol import cmd

    def color_blue(object): cmd.color("blue",object)

    cmd.set_key( 'F1' , color_blue, ( "object1" ) )
    // would turn object1 blue when the F1 key is pressed and

    cmd.set_key( 'F2' , color_blue, ( "object2" ) )
    // would turn object2 blue when the F2 key is pressed.

    cmd.set_key( 'CTRL-C' , cmd.zoom )   
    cmd.set_key( 'ALT-A' , cmd.turn, ('x',90) )

KEYS WHICH CAN BE REDEFINED

    F1 to F12
    left, right, pgup, pgdn, home, insert
    CTRL-A to CTRL-Z 
    ALT-0 to ALT-9, ALT-A to ALT-Z

SEE ALSO

    button, alias
        '''
        r = DEFAULT_ERROR
        if isinstance(fn, basestring):
            if arg or kw:
                raise ValueError('arg and kw must be empty if fn is string')
            arg = (fn,)
            fn = cmd.do
        if key[0:5]=='CTRL-':
            pat=key[5:]
            if len(pat)>1: # ctrl-special key
                if pat[0]!='F':
                    pat=string.lower(pat)
                for a in _self.ctrl_special.keys():
                    if _self.ctrl_special[a][0]==pat:
                        _self.ctrl_special[a][1]=fn
                        _self.ctrl_special[a][2]=arg
                        _self.ctrl_special[a][3]=kw
                        r = DEFAULT_SUCCESS
            else: # std. ctrl key
                for a in _self.ctrl.keys():
                    if a==pat:
                        _self.ctrl[a][0]=fn
                        _self.ctrl[a][1]=arg
                        _self.ctrl[a][2]=kw
                        r = DEFAULT_SUCCESS
        elif key[0:4]=='ALT-':
            pat=key[4:]
            if len(pat)>1: # alt-special key
                if pat[0]!='F':
                    pat=string.lower(pat)
                for a in _self.alt_special.keys():
                    if _self.alt_special[a][0]==pat:
                        _self.alt_special[a][1]=fn
                        _self.alt_special[a][2]=arg
                        _self.alt_special[a][3]=kw
                        r = DEFAULT_SUCCESS
            else: # std. alt key
                pat=string.lower(pat)
                for a in _self.alt.keys():
                    if a==pat:
                        _self.alt[a][0]=fn
                        _self.alt[a][1]=arg
                        _self.alt[a][2]=kw
                        r = DEFAULT_SUCCESS
        elif key[0:5]=='SHFT-':
            pat=key[5:]
            if len(pat)>1: # shft-special key
                if pat[0]!='F':
                    pat=string.lower(pat)
                for a in _self.shft_special.keys():
                    if _self.shft_special[a][0]==pat:
                        _self.shft_special[a][1]=fn
                        _self.shft_special[a][2]=arg
                        _self.shft_special[a][3]=kw
                        r = DEFAULT_SUCCESS
        else:
            if key[0]!='F':
                pat=string.lower(key)
            else:
                pat=key
            for a in _self.special.keys():
                if _self.special[a][0]==pat:
                    _self.special[a][1]=fn
                    _self.special[a][2]=arg
                    _self.special[a][3]=kw
                    r = DEFAULT_SUCCESS
        if is_error(r):
            print "Error: special '%s' key not found."%key
        if _self._raising(r,_self): raise pymol.CmdException         
        return r
コード例 #12
0
ファイル: creating.py プロジェクト: jchodera/pymol
    def create(name,
               selection,
               source_state=0,
               target_state=0,
               discrete=0,
               zoom=-1,
               quiet=1,
               singletons=0,
               extract=None,
               _self=cmd):
        '''
DESCRIPTION

    "create" creates a new molecule object from a selection.  It can
    also be used to create states in an existing object.

USAGE

    create name, selection [,source_state [,target_state ] ]

ARGUMENTS

    name = string: name of object to create or modify

    selection = string: atoms to include in the new object

    source_state = integer: {default: 0 -- copy all states}

    target_state = integer: -1 appends after last state {default: 0}

PYMOL API

    cmd.create(string name, string selection, int state,
               int target_state, int discrete)

NOTES

    If the source and target states are zero (default), then all
    states will be copied.  Otherwise, only the indicated states will
    be copied.

SEE ALSO

    load, copy, extract
        '''
        r = DEFAULT_ERROR
        target_state = int(target_state)
        if target_state == -1:
            target_state = _self.count_states('?' + name) + 1
        # preprocess selection
        selection = selector.process(selection)
        #
        try:
            _self.lock(_self)
            if name == None:
                name = _self.get_unused_name("obj")
            r = _cmd.create(_self._COb, str(name), "(" + str(selection) + ")",
                            int(source_state) - 1,
                            int(target_state) - 1, int(discrete), int(zoom),
                            int(quiet), int(singletons))
        finally:
            _self.unlock(r, _self)
        if not is_error(r):  # temporary inefficient implementation
            if extract not in (None, 0, '0'):
                if extract not in (1, '1'):
                    extract = selector.process(extract)
                else:
                    extract = selection
                _self.remove("((" + extract + ") in (%s)) and not (%s)" %
                             (name, name))
        if _self._raising(r, _self): raise pymol.CmdException
        return r
コード例 #13
0
ファイル: controlling.py プロジェクト: iSimuLy/pymol
    def set_key(key, fn, arg=(), kw={}, _self=cmd):
        '''
DESCRIPTION

    "set_key" binds a specific python function to a key press.

PYMOL API (ONLY)

    cmd.set_key( string key, function fn, tuple arg=(), dict kw={})

PYTHON EXAMPLE

    from pymol import cmd

    def color_blue(object): cmd.color("blue",object)

    cmd.set_key( 'F1' , color_blue, ( "object1" ) )
    // would turn object1 blue when the F1 key is pressed and

    cmd.set_key( 'F2' , color_blue, ( "object2" ) )
    // would turn object2 blue when the F2 key is pressed.

    cmd.set_key( 'CTRL-C' , cmd.zoom )   
    cmd.set_key( 'ALT-A' , cmd.turn, ('x',90) )

KEYS WHICH CAN BE REDEFINED

    F1 to F12
    left, right, pgup, pgdn, home, insert
    CTRL-A to CTRL-Z 
    ALT-0 to ALT-9, ALT-A to ALT-Z

SEE ALSO

    button
        '''
        r = DEFAULT_ERROR
        if key[0:5] == 'CTRL-':
            pat = key[5:]
            if len(pat) > 1:  # ctrl-special key
                if pat[0] != 'F':
                    pat = string.lower(pat)
                for a in _self.ctrl_special.keys():
                    if _self.ctrl_special[a][0] == pat:
                        _self.ctrl_special[a][1] = fn
                        _self.ctrl_special[a][2] = arg
                        _self.ctrl_special[a][3] = kw
                        r = DEFAULT_SUCCESS
            else:  # std. ctrl key
                for a in _self.ctrl.keys():
                    if a == pat:
                        _self.ctrl[a][0] = fn
                        _self.ctrl[a][1] = arg
                        _self.ctrl[a][2] = kw
                        r = DEFAULT_SUCCESS
        elif key[0:4] == 'ALT-':
            pat = key[4:]
            if len(pat) > 1:  # alt-special key
                if pat[0] != 'F':
                    pat = string.lower(pat)
                for a in _self.alt_special.keys():
                    if _self.alt_special[a][0] == pat:
                        _self.alt_special[a][1] = fn
                        _self.alt_special[a][2] = arg
                        _self.alt_special[a][3] = kw
                        r = DEFAULT_SUCCESS
            else:  # std. alt key
                pat = string.lower(pat)
                for a in _self.alt.keys():
                    if a == pat:
                        _self.alt[a][0] = fn
                        _self.alt[a][1] = arg
                        _self.alt[a][2] = kw
                        r = DEFAULT_SUCCESS
        elif key[0:5] == 'SHFT-':
            pat = key[5:]
            if len(pat) > 1:  # shft-special key
                if pat[0] != 'F':
                    pat = string.lower(pat)
                for a in _self.shft_special.keys():
                    if _self.shft_special[a][0] == pat:
                        _self.shft_special[a][1] = fn
                        _self.shft_special[a][2] = arg
                        _self.shft_special[a][3] = kw
                        r = DEFAULT_SUCCESS
        else:
            if key[0] != 'F':
                pat = string.lower(key)
            else:
                pat = key
            for a in _self.special.keys():
                if _self.special[a][0] == pat:
                    _self.special[a][1] = fn
                    _self.special[a][2] = arg
                    _self.special[a][3] = kw
                    r = DEFAULT_SUCCESS
        if is_error(r):
            print "Error: special '%s' key not found." % key
        if _self._raising(r, _self): raise pymol.CmdException
        return r