
I have a problem saving PDB files relative to density maps in recent versions of Chimera. When I load a PDB file and move it relative to a density map, and then try to save it relative to the density map, it does not apply the transformation to the PDB coordinates. This used to work in older versions. My workaround is to have another molecule open and save the transformed one relative to that. However, I would prefer to be able to save a transformed molecule relative to a density map. Can this be fixed? Bernard Heymann, Research Fellow Rm 1515, 50 South Dr., MSC 8025, NIAMS, NIH Bethesda MD 20892-8025 Tel. 301-451-8241, Fax. 301-480-7629

Hi Bernard, Unfortunately Chimera versions 1.2304 (Oct 2006), 1.2309 (Nov 2006), and 1.2318 (Dec 2006) were all broken -- not able to save a PDB model relative to a density map, which made it hard to save fits of atomic models into maps. This was fixed on Dec 27, 2006 but there has not been a Chimera snapshot since then. You can replace a file in your Chimera distribution chimera/share/ModelPanel/writePDBdialog.py with the one attached to this email to fix the problem in 1.2304 or newer versions. The bug report for this problem is http://www.cgl.ucsf.edu/cgi-bin/gnatsweb.pl?cmd=view&pr=3390&database=chimer... We plan on having a new Chimera snapshot this month that will include the fix. Tom # --- UCSF Chimera Copyright --- # Copyright (c) 2000 Regents of the University of California. # All rights reserved. This software provided pursuant to a # license agreement containing restrictions on its disclosure, # duplication and use. This notice must be embedded in or # attached to all copies, including partial copies, of the # software or any revisions or derivations thereof. # --- UCSF Chimera Copyright --- # # $Id: writePDBdialog.py,v 1.24 2006/12/27 22:05:52 pett Exp $ """dialog for writing models as PDB files""" from OpenSave import SaveModeless from chimera import replyobj, preferences, triggers, openModels, Molecule class WritePDBdialog(SaveModeless): keepShown = SaveModeless.default help = "UsersGuide/savemodel.html" name = "write PDB" def __init__(self): self.prefs = preferences.addCategory("write PDB dialog", preferences.HiddenCategory, optDict={"multiSavePDB": "multiple"}) self.haveTraj = False SaveModeless.__init__(self, clientPos='s', clientSticky='ewns', filters=[("PDB", "*.pdb", ".pdb")]) openModels.addAddHandler(self._modelsChange, None), openModels.addRemoveHandler(self._modelsChange, None) self._modelsChange() def configure(self, models=None, refreshList=True, selOnly=None): if models is not None: if len(models) > 1: name = "Multiple Models " elif models: name = models[0].name + " " else: name = "" self._toplevel.title("Save %sas PDB File" % name) if refreshList: self.modelList.setvalue(models) self._trajCheck() if len(models) > 1: self.multiSaveMenu.grid(row=self._msmRow, column=0, sticky='w') else: self.multiSaveMenu.grid_forget() if selOnly is not None: self.selOnlyVar.set(selOnly) def fillInUI(self, parent): SaveModeless.fillInUI(self, parent) row = 0 from chimera.widgets import MoleculeScrolledListBox, \ ModelOptionMenu self.modelList = MoleculeScrolledListBox(self.clientArea, labelpos='w', label_text="Save models:", listbox_selectmode='extended', selectioncommand=lambda: self.configure( self.modelList.getvalue(), refreshList=False)) self.modelList.grid(row=row, column=0, sticky='nsew') self.clientArea.rowconfigure(row, weight=1) self.clientArea.columnconfigure(0, weight=1) row += 1 import Tkinter, Pmw self.dispOnlyVar = Tkinter.IntVar(parent) self.dispOnlyVar.set(False) Tkinter.Checkbutton(self.clientArea, variable=self.dispOnlyVar, text="Save displayed atoms only").grid(row=row, column=0, sticky='w') row += 1 self.selOnlyVar = Tkinter.IntVar(parent) self.selOnlyVar.set(False) Tkinter.Checkbutton(self.clientArea, variable=self.selOnlyVar, text="Save selected atoms only").grid(row=row, column=0, sticky='w') row += 1 self.saveRelativeVar = Tkinter.IntVar(parent) self.saveRelativeVar.set(False) self.relativeFrame = f = Tkinter.Frame(self.clientArea) Tkinter.Checkbutton(f, variable=self.saveRelativeVar, text="Save relative to model:" ).grid(row=0, column=0, sticky='e') self.relModelMenu = ModelOptionMenu(f) self.relModelMenu.grid(row=0, column=1, sticky='w') self.saveUntransformedVar = Tkinter.IntVar(parent) self.saveUntransformedVar.set(True) self.untransformedButton = Tkinter.Checkbutton(self.clientArea, variable=self.saveUntransformedVar, text="Use untransformed coordinates") self._rfRow = row row += 1 self.frameSave = Pmw.OptionMenu(self.clientArea, labelpos='w', label_text="Save", initialitem="current frame", items=["current frame", "all frames"]) # not always shown; remember row number self._fsRow = row row += 1 from chimera import dialogs self.labelMap = { "single": "a single file", "multiple": "multiple files [appending model number]" } preferred = self.labelMap[self.prefs["multiSavePDB"]] self.multiSaveMenu = Pmw.OptionMenu(self.clientArea, labelpos='w', label_text="Save multiple models in", initialitem=preferred, items=self.labelMap.values()) # not always shown; remember row number self._msmRow = row row += 1 def map(self, *args): self.handler = triggers.addHandler("CoordSet", self._trajCheck, None) self._trajCheck() def unmap(self, *args): triggers.deleteHandler("CoordSet", self.handler) self.handler = None def Apply(self): from chimera import dialogs selOnly = self.selOnlyVar.get() paths = self.getPaths() if not paths: replyobj.error('No save location chosen.\n') return path = paths[0] models = self.modelList.getvalue() if not models: replyobj.error("No models chosen to save.\n") return if len(openModels.listIds()) > 1: if self.saveRelativeVar.get(): relModel = self.relModelMenu.getvalue() else: relModel = None else: if self.saveUntransformedVar.get(): relModel = models[0] else: relModel = None if self.haveTraj and self.frameSave.getvalue() == "all frames": allFrames=True else: allFrames=False import Midas if len(models) < 2: replyobj.status("Writing %s to %s\n" % (models[0].name, path)) Midas.write(models, relModel, path, allFrames=allFrames, dispOnly=self.dispOnlyVar.get(), selOnly=selOnly) replyobj.status("Wrote %s to %s\n" % (models[0].name, path)) return saveOpt = self.multiSaveMenu.getvalue() for key, value in self.labelMap.items(): if saveOpt == value: break self.prefs["multiSavePDB"] = key # write multiple models to multiple files if key == "multiple": if path.endswith(".pdb"): start, end = path[:-4], ".pdb" else: start, end = path, "" for m in models: modelPath = start + m.oslIdent()[1:] + end replyobj.status("Writing %s (%s) to %s\n" % (m.name, m.oslIdent(), modelPath)) Midas.write(m, relModel, modelPath, allFrames=allFrames, dispOnly=self.dispOnlyVar.get(), selOnly=selOnly) replyobj.status("Wrote %s (%s) to %s\n" % (m.name, m.oslIdent(), modelPath)) return # write multiple models to single file replyobj.status("Writing multiple models to %s\n" % path) Midas.write(models, relModel, path, allFrames=allFrames, dispOnly=self.dispOnlyVar.get(), selOnly=selOnly) replyobj.status("Wrote multiple models to %s\n" % path) def _modelsChange(self, *args): # can't query listbox, since it hangs off of same trigger if len(openModels.listIds()) > 1: self.untransformedButton.grid_forget() self.relativeFrame.grid(row=self._rfRow, column=0, sticky='w') else: self.relativeFrame.grid_forget() self.untransformedButton.grid(row=self._rfRow, column=0, sticky='w') def _trajCheck(self, *args): haveTraj = False for m in self.modelList.getvalue(): if len(m.coordSets) > 1: haveTraj = True break if haveTraj == self.haveTraj: return self.haveTraj = haveTraj if self.haveTraj: self.frameSave.grid(row=self._fsRow, column=0, sticky='w') else: self.frameSave.grid_forget() from chimera import dialogs dialogs.register(WritePDBdialog.name, WritePDBdialog)
participants (2)
-
Bernard Heymann
-
Thomas Goddard