def get_GL_tab(self): self.gltab = QtGui.QWidget() gltab = self.gltab gltab.vbl = QtGui.QVBoxLayout(self.gltab ) gltab.vbl.setMargin(0) gltab.vbl.setSpacing(6) gltab.vbl.setObjectName("Main") self.hbl_color = QtGui.QHBoxLayout() self.hbl_color.setMargin(0) self.hbl_color.setSpacing(6) gltab.vbl.addLayout(self.hbl_color) self.color_label = QtGui.QLabel() self.color_label.setText('Material') self.hbl_color.addWidget(self.color_label) self.cbb = QtGui.QComboBox(gltab) self.hbl_color.addWidget(self.cbb) self.glcontrast = ValSlider(gltab,(1.0,5.0),"GLShd:") self.glcontrast.setObjectName("GLShade") self.glcontrast.setValue(1.0) gltab.vbl.addWidget(self.glcontrast) self.glbrightness = ValSlider(gltab,(-1.0,0.0),"GLBst:") self.glbrightness.setObjectName("GLBoost") self.glbrightness.setValue(0.1) self.glbrightness.setValue(0.0) gltab.vbl.addWidget(self.glbrightness) return gltab
def get_texture_tab(self): if ( self.texturetab == None ): self.texturetab = QtGui.QWidget() texturetab = self.texturetab texturetab.vbl = QtGui.QVBoxLayout(self.texturetab) texturetab.vbl.setMargin(0) texturetab.vbl.setSpacing(6) texturetab.vbl.setObjectName("Main") self.contrast = ValSlider(texturetab,(0.0,20.0),"Cont:") self.contrast.setObjectName("contrast") self.contrast.setValue(10.0) texturetab.vbl.addWidget(self.contrast) self.bright = ValSlider(texturetab,(-5.0,5.0),"Brt:") self.bright.setObjectName("bright") self.bright.setValue(0.1) self.bright.setValue(0.0) texturetab.vbl.addWidget(self.bright) #self.glcontrast = ValSlider(texturetab,(1.0,5.0),"GLShd:") #self.glcontrast.setObjectName("GLShade") #self.glcontrast.setValue(1.0) #texturetab.vbl.addWidget(self.glcontrast) #self.glbrightness = ValSlider(texturetab,(-1.0,0.0),"GLBst:") #self.glbrightness.setObjectName("GLBoost") #self.glbrightness.setValue(0.1) #self.glbrightness.setValue(0.0) #texturetab.vbl.addWidget(self.glbrightness) return self.texturetab
def get_texture_tab(self): if (self.texturetab == None): self.texturetab = QtGui.QWidget() texturetab = self.texturetab texturetab.vbl = QtGui.QVBoxLayout(self.texturetab) texturetab.vbl.setMargin(0) texturetab.vbl.setSpacing(6) texturetab.vbl.setObjectName("Main") self.contrast = ValSlider(texturetab, (0.0, 20.0), "Cont:") self.contrast.setObjectName("contrast") self.contrast.setValue(10.0) texturetab.vbl.addWidget(self.contrast) self.bright = ValSlider(texturetab, (-5.0, 5.0), "Brt:") self.bright.setObjectName("bright") self.bright.setValue(0.1) self.bright.setValue(0.0) texturetab.vbl.addWidget(self.bright) #self.glcontrast = ValSlider(texturetab,(1.0,5.0),"GLShd:") #self.glcontrast.setObjectName("GLShade") #self.glcontrast.setValue(1.0) #texturetab.vbl.addWidget(self.glcontrast) #self.glbrightness = ValSlider(texturetab,(-1.0,0.0),"GLBst:") #self.glbrightness.setObjectName("GLBoost") #self.glbrightness.setValue(0.1) #self.glbrightness.setValue(0.0) #texturetab.vbl.addWidget(self.glbrightness) return self.texturetab
def get_widget(self): if self.widget == None: from PyQt4 import QtCore, QtGui, Qt self.widget = QtGui.QWidget() vbl = QtGui.QVBoxLayout(self.widget) vbl.setMargin(0) vbl.setSpacing(6) vbl.setObjectName("vbl") hbl = QtGui.QHBoxLayout() hbl.addWidget(QtGui.QLabel("Erase Radius:")) from valslider import ValSlider self.erase_rad_edit = ValSlider(None, (0.0, 1000.0), "") self.erase_rad_edit.setValue(int(self.erase_radius)) self.erase_rad_edit.setEnabled(True) hbl.addWidget(self.erase_rad_edit) self.unerase = QtGui.QCheckBox("Unerase") self.unerase.setChecked(False) vbl.addLayout(hbl) vbl.addWidget(self.unerase) QtCore.QObject.connect(self.erase_rad_edit, QtCore.SIGNAL("sliderReleased"), self.new_erase_radius) QtCore.QObject.connect(self.unerase, QtCore.SIGNAL("clicked(bool)"), self.unerase_checked) return self.widget
def get_main_tab(self): if (self.maintab == None): self.maintab = QtGui.QWidget() maintab = self.maintab maintab.vbl = QtGui.QVBoxLayout(self.maintab) maintab.vbl.setMargin(0) maintab.vbl.setSpacing(6) maintab.vbl.setObjectName("Main") self.thr = ValSlider(maintab, (0.0, 4.0), "Thr:") self.thr.setObjectName("thr") self.thr.setValue(0.5) maintab.vbl.addWidget(self.thr) self.hbl_smp = QtGui.QHBoxLayout() self.hbl_smp.setMargin(0) self.hbl_smp.setSpacing(6) self.hbl_smp.setObjectName("Sample") maintab.vbl.addLayout(self.hbl_smp) self.smp_label = QtGui.QLabel() self.smp_label.setText('Sample Level') self.hbl_smp.addWidget(self.smp_label) self.smp = QtGui.QSpinBox(maintab) self.smp.setValue(1) self.hbl_smp.addWidget(self.smp) self.rotation_sliders.addWidgets(maintab.vbl) return self.maintab
def get_GL_tab(self): self.gltab = QtGui.QWidget() gltab = self.gltab gltab.vbl = QtGui.QVBoxLayout(self.gltab ) gltab.vbl.setMargin(0) gltab.vbl.setSpacing(6) gltab.vbl.setObjectName("GL") self.glcontrast = ValSlider(gltab,(1.0,5.0),"GLShd:") self.glcontrast.setObjectName("GLShade") self.glcontrast.setValue(1.0) gltab.vbl.addWidget(self.glcontrast) self.glbrightness = ValSlider(gltab,(-1.0,0.0),"GLBst:") self.glbrightness.setObjectName("GLBoost") self.glbrightness.setValue(0.1) self.glbrightness.setValue(0.0) gltab.vbl.addWidget(self.glbrightness) self.material_tab_widget = QtGui.QTabWidget() self.ambient_tab = self.get_RGB_tab("ambient") self.material_tab_widget.addTab(self.ambient_tab, "Ambient") self.diffuse_tab = self.get_RGB_tab("diffuse") self.material_tab_widget.addTab(self.diffuse_tab, "Diffuse") self.specular_tab = self.get_RGB_tab("specular") self.material_tab_widget.addTab(self.specular_tab, "Specular") self.emission_tab = self.get_RGB_tab("emission") self.material_tab_widget.addTab(self.emission_tab, "Emission") gltab.vbl.addWidget(self.material_tab_widget) self.shininess = ValSlider(gltab,(0,128),"Shininess:") self.shininess.setObjectName("Shininess") self.shininess.setValue(64) gltab.vbl.addWidget(self.shininess) self.hbl_color = QtGui.QHBoxLayout() self.hbl_color.setMargin(0) self.hbl_color.setSpacing(6) self.hbl_color.setObjectName("Material") gltab.vbl.addLayout(self.hbl_color) self.color_label = QtGui.QLabel() self.color_label.setText('Material') self.hbl_color.addWidget(self.color_label) self.cbb = QtGui.QComboBox(gltab) self.hbl_color.addWidget(self.cbb) return gltab
class ErasingPanel: # copied for ideas for the morph panel def __init__(self, target, erase_radius=128): self.busy = True self.erase_radius = erase_radius self.target = weakref.ref(target) self.erase_rad_edit = None self.widget = None self.busy = False def set_erase_radius(self, erase_rad_edit): self.busy = True self.erase_radius = erase_rad_edit if self.erase_rad_edit != None: self.erase_rad_edit.setValue(erase_rad_edit) self.busy = False def get_widget(self): if self.widget == None: from PyQt4 import QtCore, QtGui, Qt self.widget = QtGui.QWidget() vbl = QtGui.QVBoxLayout(self.widget) vbl.setMargin(0) vbl.setSpacing(6) vbl.setObjectName("vbl") hbl = QtGui.QHBoxLayout() hbl.addWidget(QtGui.QLabel("Erase Radius:")) from valslider import ValSlider self.erase_rad_edit = ValSlider(None, (0.0, 1000.0), "") self.erase_rad_edit.setValue(int(self.erase_radius)) self.erase_rad_edit.setEnabled(True) hbl.addWidget(self.erase_rad_edit) self.unerase = QtGui.QCheckBox("Unerase") self.unerase.setChecked(False) vbl.addLayout(hbl) vbl.addWidget(self.unerase) QtCore.QObject.connect(self.erase_rad_edit, QtCore.SIGNAL("sliderReleased"), self.new_erase_radius) QtCore.QObject.connect(self.unerase, QtCore.SIGNAL("clicked(bool)"), self.unerase_checked) return self.widget def new_erase_radius(self, erase_rad_edit): if self.busy: return self.target().set_erase_radius(erase_rad_edit) def unerase_checked(self, val): if self.busy: return self.target().toggle_unerase(val)
def get_main_tab(self): self.maintab = QtGui.QWidget() maintab = self.maintab maintab.vbl = QtGui.QVBoxLayout(self.maintab) maintab.vbl.setMargin(0) maintab.vbl.setSpacing(6) maintab.vbl.setObjectName("Main") self.hbl_slice = QtGui.QHBoxLayout() self.hbl_slice.setMargin(0) self.hbl_slice.setSpacing(6) self.hbl_slice.setObjectName("Axis") maintab.vbl.addLayout(self.hbl_slice) self.slice = ValSlider(maintab,(0.0,10.0),"Slice:") self.slice.setObjectName("slice") self.slice.setValue(1.0) self.hbl_slice.addWidget(self.slice) self.axisCombo = QtGui.QComboBox(maintab) self.axisCombo.addItem(' z ') self.axisCombo.addItem(' y ') self.axisCombo.addItem(' x ') self.axisCombo.addItem(' track ') self.hbl_slice.addWidget(self.axisCombo) self.contrast = ValSlider(maintab,(0.0,20.0),"Cont:") self.contrast.setObjectName("contrast") self.contrast.setValue(1.0) maintab.vbl.addWidget(self.contrast) self.bright = ValSlider(maintab,(-5.0,5.0),"Brt:") self.bright.setObjectName("bright") self.bright.setValue(0.1) self.bright.setValue(0.0) maintab.vbl.addWidget(self.bright) self.glcontrast = ValSlider(maintab,(1.0,5.0),"GLShd:") self.glcontrast.setObjectName("GLShade") self.glcontrast.setValue(1.0) maintab.vbl.addWidget(self.glcontrast) self.glbrightness = ValSlider(maintab,(-1.0,0.0),"GLBst:") self.glbrightness.setObjectName("GLBoost") self.glbrightness.setValue(0.1) self.glbrightness.setValue(0.0) maintab.vbl.addWidget(self.glbrightness) self.transform_panel.addWidgets(maintab.vbl) return maintab
def get_main_tab(self): self.maintab = QtGui.QWidget() maintab = self.maintab maintab.vbl = QtGui.QVBoxLayout(self.maintab) maintab.vbl.setMargin(0) maintab.vbl.setSpacing(6) maintab.vbl.setObjectName("Main") self.hbl_slice = QtGui.QHBoxLayout() self.hbl_slice.setMargin(0) self.hbl_slice.setSpacing(6) self.hbl_slice.setObjectName("Axis") maintab.vbl.addLayout(self.hbl_slice) self.slice = ValSlider(maintab, (0.0, 10.0), "Slice:") self.slice.setObjectName("slice") self.slice.setValue(1.0) self.hbl_slice.addWidget(self.slice) self.axisCombo = QtGui.QComboBox(maintab) self.axisCombo.addItem(' z ') self.axisCombo.addItem(' y ') self.axisCombo.addItem(' x ') self.axisCombo.addItem(' track ') self.hbl_slice.addWidget(self.axisCombo) self.contrast = ValSlider(maintab, (0.0, 20.0), "Cont:") self.contrast.setObjectName("contrast") self.contrast.setValue(1.0) maintab.vbl.addWidget(self.contrast) self.bright = ValSlider(maintab, (-5.0, 5.0), "Brt:") self.bright.setObjectName("bright") self.bright.setValue(0.1) self.bright.setValue(0.0) maintab.vbl.addWidget(self.bright) self.glcontrast = ValSlider(maintab, (1.0, 5.0), "GLShd:") self.glcontrast.setObjectName("GLShade") self.glcontrast.setValue(1.0) maintab.vbl.addWidget(self.glcontrast) self.glbrightness = ValSlider(maintab, (-1.0, 0.0), "GLBst:") self.glbrightness.setObjectName("GLBoost") self.glbrightness.setValue(0.1) self.glbrightness.setValue(0.0) maintab.vbl.addWidget(self.glbrightness) self.transform_panel.addWidgets(maintab.vbl) return maintab
class ErasingPanel: # copied for ideas for the morph panel def __init__(self,target,erase_radius=128): self.busy = True self.erase_radius = erase_radius self.target = weakref.ref(target) self.erase_rad_edit = None self.widget = None self.busy = False def set_erase_radius(self, erase_rad_edit): self.busy=True self.erase_radius = erase_rad_edit if self.erase_rad_edit != None: self.erase_rad_edit.setValue(erase_rad_edit) self.busy=False def get_widget(self): if self.widget == None: from PyQt4 import QtCore, QtGui, Qt self.widget = QtGui.QWidget() vbl = QtGui.QVBoxLayout(self.widget) vbl.setMargin(0) vbl.setSpacing(6) vbl.setObjectName("vbl") hbl = QtGui.QHBoxLayout() hbl.addWidget(QtGui.QLabel("Erase Radius:")) from valslider import ValSlider self.erase_rad_edit = ValSlider(None,(0.0,1000.0),"") self.erase_rad_edit.setValue(int(self.erase_radius)) self.erase_rad_edit.setEnabled(True) hbl.addWidget(self.erase_rad_edit) self.unerase = QtGui.QCheckBox("Unerase") self.unerase.setChecked(False) vbl.addLayout(hbl) vbl.addWidget(self.unerase) QtCore.QObject.connect(self.erase_rad_edit,QtCore.SIGNAL("sliderReleased"),self.new_erase_radius) QtCore.QObject.connect(self.unerase,QtCore.SIGNAL("clicked(bool)"),self.unerase_checked) return self.widget def new_erase_radius(self, erase_rad_edit): if self.busy: return self.target().set_erase_radius(erase_rad_edit) def unerase_checked(self,val): if self.busy: return self.target().toggle_unerase(val)
def __init__(self,target) : QtGui.QWidget.__init__(self,None) self.target=target self.vboxlayout = QtGui.QVBoxLayout(self) self.vboxlayout.setMargin(0) self.vboxlayout.setSpacing(6) self.vboxlayout.setObjectName("vboxlayout") self.hist = ImgHistogram(self) self.hist.setObjectName("hist") self.vboxlayout.addWidget(self.hist) self.scale = ValSlider(self,(0.1,5.0),"Mag:") self.scale.setObjectName("scale") self.scale.setValue(1.0) self.vboxlayout.addWidget(self.scale) self.mins = ValSlider(self,label="Min:") self.mins.setObjectName("mins") self.vboxlayout.addWidget(self.mins) self.combo = QtGui.QComboBox(self) for i in range(0,10): self.combo.addItem(str(i)) self.vboxlayout.addWidget(self.combo) self.maxs = ValSlider(self,label="Max:") self.maxs.setObjectName("maxs") self.vboxlayout.addWidget(self.maxs) self.brts = ValSlider(self,(-1.0,1.0),"Brt:") self.brts.setObjectName("brts") self.vboxlayout.addWidget(self.brts) self.conts = ValSlider(self,(0.0,1.0),"Cont:") self.conts.setObjectName("conts") self.vboxlayout.addWidget(self.conts) self.lowlim=0 self.highlim=1.0 self.busy=0 QtCore.QObject.connect(self.scale, QtCore.SIGNAL("valueChanged"), target.set_scale) QtCore.QObject.connect(self.mins, QtCore.SIGNAL("valueChanged"), self.newMin) QtCore.QObject.connect(self.maxs, QtCore.SIGNAL("valueChanged"), self.newMax) QtCore.QObject.connect(self.brts, QtCore.SIGNAL("valueChanged"), self.newBrt) QtCore.QObject.connect(self.conts, QtCore.SIGNAL("valueChanged"), self.newCont) QtCore.QObject.connect(self.combo, QtCore.SIGNAL("currentIndexChanged(QString)"), self.setCombo)
def set_src(self, val): t3d = self.get_current_rotation() if (self.n3_showing): self.parent().get_transform_layout().removeWidget(self.n3) self.n3.deleteLater() self.n3_showing = False self.az.setRange(-360, 360) self.alt.setRange(-180, 180) self.phi.setRange(-360, 660) if (self.src_map[str(val)] == "spider"): self.az.setLabel('phi') self.alt.setLabel('theta') self.phi.setLabel('psi') elif (self.src_map[str(val)] == "eman"): self.az.setLabel('az') self.alt.setLabel('alt') self.phi.setLabel('phi') elif (self.src_map[str(val)] == "imagic"): self.az.setLabel('alpha') self.alt.setLabel('beta') self.phi.setLabel('gamma') elif (self.src_map[str(val)] == "xyz"): self.az.setLabel('xtilt') self.alt.setLabel('ytilt') self.phi.setLabel('ztilt') elif (self.src_map[str(val)] == "mrc"): self.az.setLabel('phi') self.alt.setLabel('theta') self.phi.setLabel('omega') elif (self.src_map[str(val)] == "spin"): self.az.setLabel('omega') self.alt.setRange(-1, 1) self.phi.setRange(-1, 1) self.alt.setLabel('n1') self.phi.setLabel('n2') self.n3 = ValSlider(self.parent(), (-360.0, 360.0), "n3", -1) self.n3.setRange(-1, 1) self.n3.setObjectName("n3") self.parent().get_transform_layout().addWidget(self.n3) QtCore.QObject.connect(self.n3, QtCore.SIGNAL("valueChanged"), self.slider_rotate) self.n3_showing = True self.current_src = self.src_map[str(val)] self.update_rotations(t3d)
def set_src(self, val): t3d = self.get_current_rotation() if (self.n3_showing) : self.vbl.removeWidget(self.n3) self.n3.deleteLater() self.n3_showing = False self.az.setRange(-360,360) self.alt.setRange(-180,180) self.phi.setRange(-360,660) if ( self.src_map[str(val)] == EULER_SPIDER ): self.az.setLabel('phi') self.alt.setLabel('theta') self.phi.setLabel('psi') elif ( self.src_map[str(val)] == EULER_EMAN ): self.az.setLabel('az') self.alt.setLabel('alt') self.phi.setLabel('phi') elif ( self.src_map[str(val)] == EULER_IMAGIC ): self.az.setLabel('alpha') self.alt.setLabel('beta') self.phi.setLabel('gamma') elif ( self.src_map[str(val)] == EULER_XYZ ): self.az.setLabel('xtilt') self.alt.setLabel('ytilt') self.phi.setLabel('ztilt') elif ( self.src_map[str(val)] == EULER_MRC ): self.az.setLabel('phi') self.alt.setLabel('theta') self.phi.setLabel('omega') elif ( self.src_map[str(val)] == EULER_SPIN ): self.az.setLabel('omega') self.alt.setRange(-1,1) self.phi.setRange(-1,1) self.alt.setLabel('n1') self.phi.setLabel('n2') self.n3 = ValSlider(self,(-360.0,360.0),"n3",-1) self.n3.setRange(-1,1) self.n3.setObjectName("n3") self.vbl.addWidget(self.n3) QtCore.QObject.connect(self.n3, QtCore.SIGNAL("valueChanged"), self.slider_rotate) self.n3_showing = True self.current_src = self.src_map[str(val)] self.update_rotations(t3d)
def get_main_tab(self): if ( self.maintab == None ): self.maintab = QtGui.QWidget() maintab = self.maintab maintab.vbl = QtGui.QVBoxLayout(self.maintab) maintab.vbl.setMargin(0) maintab.vbl.setSpacing(6) maintab.vbl.setObjectName("Main") self.thr = ValSlider(maintab,(0.0,4.0),"Thr:") self.thr.setObjectName("thr") self.thr.setValue(0.5) maintab.vbl.addWidget(self.thr) self.hbl_smp = QtGui.QHBoxLayout() self.hbl_smp.setMargin(0) self.hbl_smp.setSpacing(6) self.hbl_smp.setObjectName("Sample") maintab.vbl.addLayout(self.hbl_smp) self.smp_label = QtGui.QLabel() self.smp_label.setText('Sample Level') self.hbl_smp.addWidget(self.smp_label) self.smp = QtGui.QSpinBox(maintab) self.smp.setValue(1) self.hbl_smp.addWidget(self.smp) self.rotation_sliders.addWidgets(maintab.vbl) return self.maintab
def get_widget(self): if self.widget == None: from PyQt4 import QtCore, QtGui, Qt self.widget = QtGui.QWidget() vbl = QtGui.QVBoxLayout(self.widget) vbl.setMargin(0) vbl.setSpacing(6) vbl.setObjectName("vbl") hbl = QtGui.QHBoxLayout() hbl.addWidget(QtGui.QLabel("Erase Radius:")) from valslider import ValSlider self.erase_rad_edit = ValSlider(None,(0.0,1000.0),"") self.erase_rad_edit.setValue(int(self.erase_radius)) self.erase_rad_edit.setEnabled(True) hbl.addWidget(self.erase_rad_edit) self.unerase = QtGui.QCheckBox("Unerase") self.unerase.setChecked(False) vbl.addLayout(hbl) vbl.addWidget(self.unerase) QtCore.QObject.connect(self.erase_rad_edit,QtCore.SIGNAL("sliderReleased"),self.new_erase_radius) QtCore.QObject.connect(self.unerase,QtCore.SIGNAL("clicked(bool)"),self.unerase_checked) return self.widget
def addControls(self, gridbox): """ Construct all the widgets in this Item Inspector """ super(EMInspectorControlShape, self).addControls(gridbox) colorframe = QtGui.QFrame() colorframe.setFrameShape(QtGui.QFrame.StyledPanel) colorvbox = QtGui.QVBoxLayout() lfont = QtGui.QFont() lfont.setBold(True) colorlabel = QtGui.QLabel("Color",colorframe) colorlabel.setFont(lfont) colorlabel.setAlignment(QtCore.Qt.AlignCenter) # These boxes are a pain maybe I should use a Grid? cdialoghbox = QtGui.QHBoxLayout() cabox = QtGui.QHBoxLayout() self.ambcolorbox = EMQTColorWidget(parent=colorframe) cabox.addWidget(self.ambcolorbox) cabox.setAlignment(QtCore.Qt.AlignCenter) cdbox = QtGui.QHBoxLayout() self.diffusecolorbox = EMQTColorWidget(parent=colorframe) cdbox.addWidget(self.diffusecolorbox) cdbox.setAlignment(QtCore.Qt.AlignCenter) csbox = QtGui.QHBoxLayout() self.specularcolorbox = EMQTColorWidget(parent=colorframe) csbox.addWidget(self.specularcolorbox) csbox.setAlignment(QtCore.Qt.AlignCenter) cdialoghbox.addLayout(cabox) cdialoghbox.addLayout(cdbox) cdialoghbox.addLayout(csbox) colorhbox = QtGui.QHBoxLayout() self.ambient = QtGui.QLabel("Ambient", colorframe) self.ambient.setAlignment(QtCore.Qt.AlignCenter) self.diffuse = QtGui.QLabel("Diffuse", colorframe) self.diffuse.setAlignment(QtCore.Qt.AlignCenter) self.specular = QtGui.QLabel("Specular", colorframe) self.specular.setAlignment(QtCore.Qt.AlignCenter) colorhbox.addWidget(self.ambient) colorhbox.addWidget(self.diffuse) colorhbox.addWidget(self.specular) self.shininess = ValSlider(colorframe, (0.0, 50.0), "Shine") self.shininess.setValue(self.item3d().shininess) colorvbox.addWidget(colorlabel) colorvbox.addLayout(cdialoghbox) colorvbox.addLayout(colorhbox) colorvbox.addWidget(self.shininess) colorframe.setLayout(colorvbox) colorframe.setMaximumWidth(350) gridbox.addWidget(colorframe, 3, 0, 1, 1) # Set to default, but do not run if being inherited if type(self) == EMInspectorControlShape: self.updateItemControls() QtCore.QObject.connect(self.ambcolorbox,QtCore.SIGNAL("newcolor(QColor)"),self._on_ambient_color) QtCore.QObject.connect(self.diffusecolorbox,QtCore.SIGNAL("newcolor(QColor)"),self._on_diffuse_color) QtCore.QObject.connect(self.specularcolorbox,QtCore.SIGNAL("newcolor(QColor)"),self._on_specular_color) QtCore.QObject.connect(self.shininess,QtCore.SIGNAL("valueChanged"),self._on_shininess)
def get_main_tab(self): self.maintab = QtGui.QWidget() maintab = self.maintab maintab.vbl = QtGui.QVBoxLayout(self.maintab) maintab.vbl.setMargin(0) maintab.vbl.setSpacing(6) maintab.vbl.setObjectName("Main") self.contrast = ValSlider(maintab,(0.0,20.0),"Cont:") self.contrast.setObjectName("contrast") self.contrast.setValue(1.0) maintab.vbl.addWidget(self.contrast) self.bright = ValSlider(maintab,(-5.0,5.0),"Brt:") self.bright.setObjectName("bright") self.bright.setValue(0.1) self.bright.setValue(0.0) maintab.vbl.addWidget(self.bright) self.hbl_smp = QtGui.QHBoxLayout() self.hbl_smp.setMargin(0) self.hbl_smp.setSpacing(6) self.hbl_smp.setObjectName("Texture Oversampling") maintab.vbl.addLayout(self.hbl_smp) self.smp_label = QtGui.QLabel() self.smp_label.setText('Texture Oversampling') self.hbl_smp.addWidget(self.smp_label) self.smp = QtGui.QSpinBox(maintab) self.smp.setMaximum(10) self.smp.setMinimum(1) self.smp.setValue(1) self.hbl_smp.addWidget(self.smp) self.lowlim=0 self.highlim=1.0 self.busy=0 self.rotation_sliders.addWidgets(maintab.vbl) return maintab
def get_GL_tab(self): self.gltab = QtGui.QWidget() gltab = self.gltab gltab.vbl = QtGui.QVBoxLayout(self.gltab ) gltab.vbl.setMargin(0) gltab.vbl.setSpacing(6) gltab.vbl.setObjectName("Main") self.glcontrast = ValSlider(gltab,(1.0,5.0),"GLShd:") self.glcontrast.setObjectName("GLShade") self.glcontrast.setValue(1.0) gltab.vbl.addWidget(self.glcontrast) self.glbrightness = ValSlider(gltab,(-1.0,0.0),"GLBst:") self.glbrightness.setObjectName("GLBoost") self.glbrightness.setValue(0.1) self.glbrightness.setValue(0.0) gltab.vbl.addWidget(self.glbrightness) return gltab
def get_bgRGB_tab(self): self.bgRGBtab = QtGui.QWidget() bgRGBtab = self.bgRGBtab bgRGBtab.vbl2 = QtGui.QVBoxLayout(self.bgRGBtab) bgRGBtab.vbl2.setMargin(0) bgRGBtab.vbl2.setSpacing(6) bgRGBtab.vbl2.setObjectName("BG RGB") self.hbl2 = QtGui.QHBoxLayout() self.bgR = ValSlider(self,(0,1),"R:") self.bgR.setObjectName("R") self.bgR.setValue(0.5) self.hbl2.addWidget(self.bgR) bgRGBtab.vbl2.addLayout(self.hbl2) self.hbl2 = QtGui.QHBoxLayout() self.bgG = ValSlider(self,(0,1),"G:") self.bgG.setObjectName("G") self.bgG.setValue(0.5) self.hbl2.addWidget(self.bgG) bgRGBtab.vbl2.addLayout(self.hbl2) self.hbl2 = QtGui.QHBoxLayout() self.bgB = ValSlider(self,(0,1),"B:") self.bgB.setObjectName("B") self.bgB.setValue(0.5) self.hbl2.addWidget(self.bgB) bgRGBtab.vbl2.addLayout(self.hbl2) self.hbl2 = QtGui.QHBoxLayout() self.bg_a = ValSlider(self,(0,1),"Alpha:") self.bg_a.setObjectName("Alpha") self.bg_a.setValue(1.0) self.hbl2.addWidget(self.bg_a) bgRGBtab.vbl2.addLayout(self.hbl2) return bgRGBtab
def set_src(self, val): t3d = self.get_current_rotation() if (self.n3_showing) : self.parent().get_transform_layout().removeWidget(self.n3) self.n3.deleteLater() self.n3_showing = False self.az.setRange(-360,360) self.alt.setRange(-180,180) self.phi.setRange(-360,660) if ( self.src_map[str(val)] == "spider" ): self.az.setLabel('phi') self.alt.setLabel('theta') self.phi.setLabel('psi') elif ( self.src_map[str(val)] == "eman" ): self.az.setLabel('az') self.alt.setLabel('alt') self.phi.setLabel('phi') elif ( self.src_map[str(val)] == "imagic"): self.az.setLabel('alpha') self.alt.setLabel('beta') self.phi.setLabel('gamma') elif ( self.src_map[str(val)] == "xyz"): self.az.setLabel('xtilt') self.alt.setLabel('ytilt') self.phi.setLabel('ztilt') elif ( self.src_map[str(val)] == "mrc" ): self.az.setLabel('phi') self.alt.setLabel('theta') self.phi.setLabel('omega') elif ( self.src_map[str(val)] == "spin" ): self.az.setLabel('Omega') self.alt.setRange(-1,1) self.phi.setRange(-1,1) self.alt.setLabel('n1') self.phi.setLabel('n2') self.n3 = ValSlider(self.parent(),(-360.0,360.0),"n3",-1) self.n3.setRange(-1,1) self.n3.setObjectName("n3") self.parent().get_transform_layout().addWidget(self.n3) QtCore.QObject.connect(self.n3, QtCore.SIGNAL("valueChanged"), self.slider_rotate) self.n3_showing = True self.current_src = self.src_map[str(val)] self.update_rotations(t3d)
def set_src(self, val): t3d = self.get_current_rotation() if (self.n3_showing) : self.vbl.removeWidget(self.n3) self.n3.deleteLater() self.n3_showing = False self.az.setRange(-360,360) self.alt.setRange(-180,180) self.phi.setRange(-360,660) if ( self.src_map[str(val)] == EULER_SPIDER ): self.az.setLabel('phi') self.alt.setLabel('theta') self.phi.setLabel('psi') elif ( self.src_map[str(val)] == EULER_EMAN ): self.az.setLabel('az') self.alt.setLabel('alt') self.phi.setLabel('phi') elif ( self.src_map[str(val)] == EULER_IMAGIC ): self.az.setLabel('alpha') self.alt.setLabel('beta') self.phi.setLabel('gamma') elif ( self.src_map[str(val)] == EULER_XYZ ): self.az.setLabel('xtilt') self.alt.setLabel('ytilt') self.phi.setLabel('ztilt') elif ( self.src_map[str(val)] == EULER_MRC ): self.az.setLabel('phi') self.alt.setLabel('theta') self.phi.setLabel('omega') elif ( self.src_map[str(val)] == EULER_SPIN ): self.az.setLabel('Omega') self.alt.setRange(-1,1) self.phi.setRange(-1,1) self.alt.setLabel('n1') self.phi.setLabel('n2') self.n3 = ValSlider(self,(-360.0,360.0),"n3",-1) self.n3.setRange(-1,1) self.n3.setObjectName("n3") self.vbl.addWidget(self.n3) QtCore.QObject.connect(self.n3, QtCore.SIGNAL("valueChanged"), self.slider_rotate) self.n3_showing = True self.current_src = self.src_map[str(val)] self.update_rotations(t3d)
def get_GL_tab(self): self.gltab = QtGui.QWidget() gltab = self.gltab gltab.vbl = QtGui.QVBoxLayout(self.gltab) gltab.vbl.setMargin(0) gltab.vbl.setSpacing(6) gltab.vbl.setObjectName("GL") self.glcontrast = ValSlider(gltab, (1.0, 5.0), "GLShd:") self.glcontrast.setObjectName("GLShade") self.glcontrast.setValue(1.0) gltab.vbl.addWidget(self.glcontrast) self.glbrightness = ValSlider(gltab, (-1.0, 0.0), "GLBst:") self.glbrightness.setObjectName("GLBoost") self.glbrightness.setValue(0.1) self.glbrightness.setValue(0.0) gltab.vbl.addWidget(self.glbrightness) self.material_tab_widget = QtGui.QTabWidget() self.ambient_tab = self.get_RGB_tab("ambient") self.material_tab_widget.addTab(self.ambient_tab, "Ambient") self.diffuse_tab = self.get_RGB_tab("diffuse") self.material_tab_widget.addTab(self.diffuse_tab, "Diffuse") self.specular_tab = self.get_RGB_tab("specular") self.material_tab_widget.addTab(self.specular_tab, "Specular") self.emission_tab = self.get_RGB_tab("emission") self.material_tab_widget.addTab(self.emission_tab, "Emission") gltab.vbl.addWidget(self.material_tab_widget) self.shininess = ValSlider(gltab, (0, 128), "Shininess:") self.shininess.setObjectName("Shininess") self.shininess.setValue(64) gltab.vbl.addWidget(self.shininess) self.hbl_color = QtGui.QHBoxLayout() self.hbl_color.setMargin(0) self.hbl_color.setSpacing(6) self.hbl_color.setObjectName("Material") gltab.vbl.addLayout(self.hbl_color) self.color_label = QtGui.QLabel() self.color_label.setText('Material') self.hbl_color.addWidget(self.color_label) self.cbb = QtGui.QComboBox(gltab) self.hbl_color.addWidget(self.cbb) return gltab
def get_bgRGB_tab(self): self.bgRGBtab = QtGui.QWidget() bgRGBtab = self.bgRGBtab bgRGBtab.vbl2 = QtGui.QVBoxLayout(self.bgRGBtab) bgRGBtab.vbl2.setMargin(0) bgRGBtab.vbl2.setSpacing(6) bgRGBtab.vbl2.setObjectName("BG RGB") self.hbl2 = QtGui.QHBoxLayout() self.bgR = ValSlider(self, (0, 1), "R:") self.bgR.setObjectName("R") self.bgR.setValue(0.5) self.hbl2.addWidget(self.bgR) bgRGBtab.vbl2.addLayout(self.hbl2) self.hbl2 = QtGui.QHBoxLayout() self.bgG = ValSlider(self, (0, 1), "G:") self.bgG.setObjectName("G") self.bgG.setValue(0.5) self.hbl2.addWidget(self.bgG) bgRGBtab.vbl2.addLayout(self.hbl2) self.hbl2 = QtGui.QHBoxLayout() self.bgB = ValSlider(self, (0, 1), "B:") self.bgB.setObjectName("B") self.bgB.setValue(0.5) self.hbl2.addWidget(self.bgB) bgRGBtab.vbl2.addLayout(self.hbl2) self.hbl2 = QtGui.QHBoxLayout() self.bg_a = ValSlider(self, (0, 1), "Alpha:") self.bg_a.setObjectName("Alpha") self.bg_a.setValue(1.0) self.hbl2.addWidget(self.bg_a) bgRGBtab.vbl2.addLayout(self.hbl2) return bgRGBtab
class EMIsoInspector(QtGui.QWidget): def __init__(self,target,enable_browse=False) : QtGui.QWidget.__init__(self,None) self.setWindowIcon(QtGui.QIcon(get_image_directory() +"desktop.png")) self.target=weakref.ref(target) self.rotation_sliders = EMTransformPanel(target,self) self.vbl = QtGui.QVBoxLayout(self) self.vbl.setMargin(0) self.vbl.setSpacing(6) self.vbl.setObjectName("vbl") self.mrcChanged = False #added by Muthu if enable_browse: hblbrowse = QtGui.QHBoxLayout() self.mrc_text = QtGui.QLineEdit() hblbrowse.addWidget(self.mrc_text) self.mrc_browse = QtGui.QPushButton("Browse") hblbrowse.addWidget(self.mrc_browse) self.vbl.addLayout(hblbrowse) QtCore.QObject.connect(self.mrc_text, QtCore.SIGNAL("textEdited(const QString&)"), self.on_mrc_text_change) #added by Muthu QtCore.QObject.connect(self.mrc_browse, QtCore.SIGNAL("clicked(bool)"), self.on_mrc_browse) # added by Muthu self.hbl = QtGui.QHBoxLayout() self.hbl.setMargin(0) self.hbl.setSpacing(6) self.hbl.setObjectName("hbl") self.vbl.addLayout(self.hbl) self.hist = ImgHistogram(self) self.hist.setObjectName("hist") self.hbl.addWidget(self.hist) self.vbl2 = QtGui.QVBoxLayout() self.vbl2.setMargin(0) self.vbl2.setSpacing(6) self.vbl2.setObjectName("vbl2") self.hbl.addLayout(self.vbl2) self.wiretog = QtGui.QPushButton("Wire") self.wiretog.setCheckable(1) self.vbl2.addWidget(self.wiretog) self.lighttog = QtGui.QPushButton("Light") self.lighttog.setCheckable(1) self.vbl2.addWidget(self.lighttog) self.cubetog = QtGui.QPushButton("Cube") self.cubetog.setCheckable(1) self.vbl2.addWidget(self.cubetog) self.texturetog = QtGui.QPushButton("Texture") self.texturetog.setCheckable(1) self.vbl2.addWidget(self.texturetog) self.texture = False self.tabwidget = QtGui.QTabWidget() self.maintab = None self.tabwidget.addTab(self.get_main_tab(), "Main") self.texturetab = None self.tabwidget.addTab(self.get_GL_tab(),"GL") self.tabwidget.addTab(self.get_texture_tab(),"Texture") self.get_texture_tab().setEnabled(False) self.vbl.addWidget(self.tabwidget) self.n3_showing = False QtCore.QObject.connect(self.thr, QtCore.SIGNAL("valueChanged"), self.on_threshold_slider) QtCore.QObject.connect(self.contrast, QtCore.SIGNAL("valueChanged"), target.set_contrast) QtCore.QObject.connect(self.bright, QtCore.SIGNAL("valueChanged"), target.set_brightness) QtCore.QObject.connect(self.cbb, QtCore.SIGNAL("currentIndexChanged(QString)"), self.set_material) QtCore.QObject.connect(self.smp, QtCore.SIGNAL("valueChanged(int)"), target.set_sample) QtCore.QObject.connect(self.wiretog, QtCore.SIGNAL("toggled(bool)"), target.toggle_wire) QtCore.QObject.connect(self.lighttog, QtCore.SIGNAL("toggled(bool)"), target.toggle_light) QtCore.QObject.connect(self.texturetog, QtCore.SIGNAL("toggled(bool)"), self.toggle_texture) QtCore.QObject.connect(self.cubetog, QtCore.SIGNAL("toggled(bool)"), target.toggle_cube) QtCore.QObject.connect(self.glcontrast, QtCore.SIGNAL("valueChanged"), target.set_GL_contrast) QtCore.QObject.connect(self.glbrightness, QtCore.SIGNAL("valueChanged"), target.set_GL_brightness) QtCore.QObject.connect(self.ambient_tab.r, QtCore.SIGNAL("valueChanged"), self.update_material) QtCore.QObject.connect(self.ambient_tab.g, QtCore.SIGNAL("valueChanged"), self.update_material) QtCore.QObject.connect(self.ambient_tab.b, QtCore.SIGNAL("valueChanged"), self.update_material) QtCore.QObject.connect(self.diffuse_tab.r, QtCore.SIGNAL("valueChanged"), self.update_material) QtCore.QObject.connect(self.diffuse_tab.g, QtCore.SIGNAL("valueChanged"), self.update_material) QtCore.QObject.connect(self.diffuse_tab.b, QtCore.SIGNAL("valueChanged"), self.update_material) QtCore.QObject.connect(self.specular_tab.r, QtCore.SIGNAL("valueChanged"), self.update_material) QtCore.QObject.connect(self.specular_tab.g, QtCore.SIGNAL("valueChanged"), self.update_material) QtCore.QObject.connect(self.specular_tab.b, QtCore.SIGNAL("valueChanged"), self.update_material) QtCore.QObject.connect(self.emission_tab.r, QtCore.SIGNAL("valueChanged"), self.update_material) QtCore.QObject.connect(self.emission_tab.g, QtCore.SIGNAL("valueChanged"), self.update_material) QtCore.QObject.connect(self.emission_tab.b, QtCore.SIGNAL("valueChanged"), self.update_material) QtCore.QObject.connect(self.shininess, QtCore.SIGNAL("valueChanged"), self.update_material) def on_mrc_text_change(self,text): #if enable_browse, added by muthu print "Use the Browse button to update the mrc file" def on_mrc_browse(self): #if enable_browse, added by muthu import os self.mrcfileName = QtGui.QFileDialog.getOpenFileName(self, "open file", os.getcwd(), "Text files (*.mrc)") if (self.mrcfileName == ""): return mrcData = EMData(str(self.mrcfileName)) self.target().set_data(mrcData) self.mrc_text.setText(self.mrcfileName) self.mrcChanged = True self.target().updateGL() def update_rotations(self,t3d): self.rotation_sliders.update_rotations(t3d) def set_scale(self,val): self.rotation_sliders.set_scale(val) def set_xy_trans(self, x, y): self.rotation_sliders.set_xy_trans(x,y) def set_xyz_trans(self,x,y,z): self.rotation_sliders.set_xyz_trans(x,y,z) def get_transform_layout(self): return self.maintab.vbl def update_material(self): self.target().isocolor = "custom" custom = {} custom["ambient"] = [self.ambient_tab.r.getValue(), self.ambient_tab.g.getValue(), self.ambient_tab.b.getValue(),1.0] custom["diffuse"] = [self.diffuse_tab.r.getValue(), self.diffuse_tab.g.getValue(), self.diffuse_tab.b.getValue(),1.0] custom["specular"] = [self.specular_tab.r.getValue(), self.specular_tab.g.getValue(), self.specular_tab.b.getValue(),1.0] custom["emission"] = [self.emission_tab.r.getValue(), self.emission_tab.g.getValue(), self.emission_tab.b.getValue(),1.0] custom["shininess"] = self.shininess.getValue() self.target().colors["custom"] = custom n = self.cbb.findText(QtCore.QString("custom")) if n < 0: return self.cbb.setCurrentIndex(n) self.target().updateGL() def set_material(self,color): self.target().set_material(color) material = self.target().get_material() self.ambient_tab.r.setValue(material["ambient"][0]) self.ambient_tab.g.setValue(material["ambient"][1]) self.ambient_tab.b.setValue(material["ambient"][2]) self.diffuse_tab.r.setValue(material["diffuse"][0]) self.diffuse_tab.g.setValue(material["diffuse"][1]) self.diffuse_tab.b.setValue(material["diffuse"][2]) self.specular_tab.r.setValue(material["specular"][0]) self.specular_tab.g.setValue(material["specular"][1]) self.specular_tab.b.setValue(material["specular"][2]) self.emission_tab.r.setValue(material["emission"][0]) self.emission_tab.g.setValue(material["emission"][1]) self.emission_tab.b.setValue(material["emission"][2]) self.shininess.setValue(material["shininess"]) def get_RGB_tab(self, name=""): return get_RGB_tab(self,name) #rgbtab = QtGui.QWidget(self) #rgbtab.vbl = QtGui.QVBoxLayout(rgbtab) #rgbtab.vbl.setMargin(0) #rgbtab.vbl.setSpacing(6) #rgbtab.vbl.setObjectName(name) #rgbtab.r = ValSlider(rgbtab,(0.0,1.0),"R:") #rgbtab.r.setObjectName("R") #rgbtab.r.setValue(0.5) #rgbtab.vbl.addWidget(rgbtab.r) #rgbtab.g = ValSlider(rgbtab,(0.0,1.0),"G:") #rgbtab.g.setObjectName("G") #rgbtab.g.setValue(0.5) #rgbtab.vbl.addWidget(rgbtab.g) #rgbtab.b = ValSlider(rgbtab,(0.0,1.0),"B:") #rgbtab.b.setObjectName("B") #rgbtab.b.setValue(0.5) #rgbtab.vbl.addWidget(rgbtab.b) #return rgbtab def get_GL_tab(self): self.gltab = QtGui.QWidget() gltab = self.gltab gltab.vbl = QtGui.QVBoxLayout(self.gltab ) gltab.vbl.setMargin(0) gltab.vbl.setSpacing(6) gltab.vbl.setObjectName("GL") self.glcontrast = ValSlider(gltab,(1.0,5.0),"GLShd:") self.glcontrast.setObjectName("GLShade") self.glcontrast.setValue(1.0) gltab.vbl.addWidget(self.glcontrast) self.glbrightness = ValSlider(gltab,(-1.0,0.0),"GLBst:") self.glbrightness.setObjectName("GLBoost") self.glbrightness.setValue(0.1) self.glbrightness.setValue(0.0) gltab.vbl.addWidget(self.glbrightness) self.material_tab_widget = QtGui.QTabWidget() self.ambient_tab = self.get_RGB_tab("ambient") self.material_tab_widget.addTab(self.ambient_tab, "Ambient") self.diffuse_tab = self.get_RGB_tab("diffuse") self.material_tab_widget.addTab(self.diffuse_tab, "Diffuse") self.specular_tab = self.get_RGB_tab("specular") self.material_tab_widget.addTab(self.specular_tab, "Specular") self.emission_tab = self.get_RGB_tab("emission") self.material_tab_widget.addTab(self.emission_tab, "Emission") gltab.vbl.addWidget(self.material_tab_widget) self.shininess = ValSlider(gltab,(0,128),"Shininess:") self.shininess.setObjectName("Shininess") self.shininess.setValue(64) gltab.vbl.addWidget(self.shininess) self.hbl_color = QtGui.QHBoxLayout() self.hbl_color.setMargin(0) self.hbl_color.setSpacing(6) self.hbl_color.setObjectName("Material") gltab.vbl.addLayout(self.hbl_color) self.color_label = QtGui.QLabel() self.color_label.setText('Material') self.hbl_color.addWidget(self.color_label) self.cbb = QtGui.QComboBox(gltab) self.hbl_color.addWidget(self.cbb) return gltab def toggle_texture(self): self.texture = not self.texture self.target().toggle_texture() self.get_texture_tab().setEnabled(self.texture) def get_texture_tab(self): if ( self.texturetab == None ): self.texturetab = QtGui.QWidget() texturetab = self.texturetab texturetab.vbl = QtGui.QVBoxLayout(self.texturetab) texturetab.vbl.setMargin(0) texturetab.vbl.setSpacing(6) texturetab.vbl.setObjectName("Main") self.contrast = ValSlider(texturetab,(0.0,20.0),"Cont:") self.contrast.setObjectName("contrast") self.contrast.setValue(10.0) texturetab.vbl.addWidget(self.contrast) self.bright = ValSlider(texturetab,(-5.0,5.0),"Brt:") self.bright.setObjectName("bright") self.bright.setValue(0.1) self.bright.setValue(0.0) texturetab.vbl.addWidget(self.bright) #self.glcontrast = ValSlider(texturetab,(1.0,5.0),"GLShd:") #self.glcontrast.setObjectName("GLShade") #self.glcontrast.setValue(1.0) #texturetab.vbl.addWidget(self.glcontrast) #self.glbrightness = ValSlider(texturetab,(-1.0,0.0),"GLBst:") #self.glbrightness.setObjectName("GLBoost") #self.glbrightness.setValue(0.1) #self.glbrightness.setValue(0.0) #texturetab.vbl.addWidget(self.glbrightness) return self.texturetab def get_main_tab(self): if ( self.maintab == None ): self.maintab = QtGui.QWidget() maintab = self.maintab maintab.vbl = QtGui.QVBoxLayout(self.maintab) maintab.vbl.setMargin(0) maintab.vbl.setSpacing(6) maintab.vbl.setObjectName("Main") self.thr = ValSlider(maintab,(0.0,4.0),"Thr:") self.thr.setObjectName("thr") self.thr.setValue(0.5) maintab.vbl.addWidget(self.thr) self.hbl_smp = QtGui.QHBoxLayout() self.hbl_smp.setMargin(0) self.hbl_smp.setSpacing(6) self.hbl_smp.setObjectName("Sample") maintab.vbl.addLayout(self.hbl_smp) self.smp_label = QtGui.QLabel() self.smp_label.setText('Sample Level') self.hbl_smp.addWidget(self.smp_label) self.smp = QtGui.QSpinBox(maintab) self.smp.setValue(1) self.hbl_smp.addWidget(self.smp) self.rotation_sliders.addWidgets(maintab.vbl) return self.maintab def set_sampling_range(self,range): self.smp.setMinimum(1) self.smp.setMaximum(1+range-1) def slider_rotate(self): self.target().load_rotation(self.get_current_rotation()) def set_materials(self,colors,current_color): a = 0 for i in colors: self.cbb.addItem(i) if ( i == current_color): self.cbb.setCurrentIndex(a) a += 1 def on_threshold_slider(self,val): self.target().set_threshold(val) self.bright.setValue(-val,True) def set_thresholds(self,low,high,val): self.thr.setRange(low,high) self.thr.setValue(val, True) self.bright.setValue(-val,True) def set_sample(self,low,high,val): self.smp.setRange(int(low),int(high)) self.smp.setValue(val, True) def set_hist(self,hist,minden,maxden): self.hist.set_data(hist,minden,maxden)
class EMFontInspector(QtGui.QWidget, EMLightsInspectorBase): def __init__(self, target): QtGui.QWidget.__init__(self, None) EMLightsInspectorBase.__init__(self) self.target = weakref.ref(target) self.transform_panel = EMTransformPanel(target, self) self.transform_vbl = None # This will eventually be a vertical box layout for the transform panel self.init_fonts() self.vbl = QtGui.QVBoxLayout(self) self.vbl.setMargin(0) self.vbl.setSpacing(6) self.vbl.setObjectName("vbl") self.hbl = QtGui.QHBoxLayout() self.hbl.setMargin(0) self.hbl.setSpacing(6) self.hbl.setObjectName("hbl") self.vbl.addLayout(self.hbl) self.vbl2 = QtGui.QVBoxLayout() self.vbl2.setMargin(0) self.vbl2.setSpacing(6) self.vbl2.setObjectName("vbl2") self.hbl.addLayout(self.vbl2) self.wiretog = QtGui.QPushButton("Wire") self.wiretog.setCheckable(1) self.vbl2.addWidget(self.wiretog) self.lighttog = QtGui.QPushButton("Light") self.lighttog.setCheckable(1) self.vbl2.addWidget(self.lighttog) self.tabwidget2 = QtGui.QTabWidget() self.maintab = None self.tabwidget2.addTab(self.get_main_tab(), "Main") #self.tabwidget2.addTab(self.get_GL_tab(),"GL") self.tabwidget2.addTab(self.get_format_tab(), "Formatting") self.tabwidget2.addTab(self.get_light_tab(), "Lights") self.vbl.addWidget(self.tabwidget2) self.n3_showing = False QtCore.QObject.connect(self.cbb, QtCore.SIGNAL("currentIndexChanged(QString)"), target.setColor) QtCore.QObject.connect(self.wiretog, QtCore.SIGNAL("toggled(bool)"), target.toggle_wire) QtCore.QObject.connect(self.lighttog, QtCore.SIGNAL("toggled(bool)"), target.toggle_light) QtCore.QObject.connect(self.glcontrast, QtCore.SIGNAL("valueChanged"), target.set_GL_contrast) QtCore.QObject.connect(self.glbrightness, QtCore.SIGNAL("valueChanged"), target.set_GL_brightness) QtCore.QObject.connect( self.combo, QtCore.SIGNAL("currentIndexChanged (const QString&)"), self.on_combo_change) QtCore.QObject.connect(self.text, QtCore.SIGNAL("textChanged(const QString&)"), self.on_text_change) QtCore.QObject.connect(self.lspacing, QtCore.SIGNAL("valueChanged"), self.set_GL_lspacing) QtCore.QObject.connect(self.length, QtCore.SIGNAL("valueChanged"), self.set_GL_length) QtCore.QObject.connect(self.tsize, QtCore.SIGNAL("valueChanged(int)"), self.set_GL_tsize) QtCore.QObject.connect( self.Dfont, QtCore.SIGNAL("currentIndexChanged (const QString&)"), self.on_Dfont_change) QtCore.QObject.connect(self.bgR, QtCore.SIGNAL("valueChanged"), self.set_GL_bgR) QtCore.QObject.connect(self.bgG, QtCore.SIGNAL("valueChanged"), self.set_GL_bgG) QtCore.QObject.connect(self.bgB, QtCore.SIGNAL("valueChanged"), self.set_GL_bgB) QtCore.QObject.connect(self.bg_a, QtCore.SIGNAL("valueChanged"), self.set_GL_bg_a) def get_transform_layout(self): return self.transform_vbl def set_GL_bgR(self, bgR): self.target().set_bg_r(bgR) self.target().updateGL() def set_GL_bgG(self, bgG): self.target().set_bg_g(bgG) self.target().updateGL() def set_GL_bgB(self, bgB): self.target().set_bg_b(bgB) self.target().updateGL() def set_GL_bg_a(self, bg_a): self.target().set_bg_a(bg_a) self.target().updateGL() def init_fonts(self): self.d = {} self.l = [] platform = get_platform() if platform == "Linux": f_dir = "/usr/share/fonts/" elif platform == "Windows" or platform == "win32": f_dir = ":/windows/fonts/" elif platform in ["Apple", "Darwin"]: f_dir = "/Library/Fonts/" else: raise RuntimeError("Platform %s is not supported" % platform) for root, dirs, files in os.walk(f_dir): for name in files: if name.find("ttf") != -1: filename = os.path.join(root, name) self.d[name] = filename self.l.extend([name]) return self.l, self.d def on_Dfont_change(self, Dfont): self.target().font_renderer.set_font_file_name(self.d[str(Dfont)]) self.target().updateGL() def set_GL_lspacing(self, lspacing): self.target().set_lspacing(lspacing) #THE FOLLOWING IF STATEMENT DOES IS NOT EFFECTIVE if len(self.target().render_string.split("\n")) != 1: self.lspacing.setEnabled(True) else: self.lspacing.setEnabled(False) self.target().updateGL() def set_GL_length(self, length): self.target().font_renderer.set_depth(int(length)) self.target().updateGL() def set_GL_tsize(self, tsize): self.target().font_renderer.set_face_size(tsize) self.target().updateGL() def on_text_change(self, text): try: evalt = str(eval(str(text))) self.target().set_render_string(evalt) except: self.target().set_render_string(str(text)) if len(self.target().render_string.split("\n")) != 1: self.lspacing.setEnabled(True) else: self.lspacing.setEnabled(False) self.target().updateGL() def on_combo_change(self, mode): d = {} d["Extrude"] = FTGLFontMode.EXTRUDE d["Pixmap"] = FTGLFontMode.PIXMAP d["Bitmap"] = FTGLFontMode.BITMAP d["Polygon"] = FTGLFontMode.POLYGON d["Outline"] = FTGLFontMode.OUTLINE d["Texture"] = FTGLFontMode.TEXTURE self.target().font_renderer.set_font_mode(d[str(mode)]) if mode == "Extrude": self.length.setEnabled(True) else: self.length.setEnabled(False) self.target().updateGL() def update_rotations(self, t3d): self.transform_panel.update_rotations(t3d) def set_scale(self, val): self.transform_panel.set_scale(val) def set_xy_trans(self, x, y): self.transform_panel.set_xy_trans(x, y) def set_xyz_trans(self, x, y, z): self.transform_panel.set_xyz_trans(x, y, z) def get_GL_tab(self): self.gltab = QtGui.QWidget() gltab = self.gltab gltab.vbl = QtGui.QVBoxLayout(self.gltab) gltab.vbl.setMargin(0) gltab.vbl.setSpacing(6) gltab.vbl.setObjectName("Main") self.glcontrast = ValSlider(gltab, (1.0, 5.0), "GLShd:") self.glcontrast.setObjectName("GLShade") self.glcontrast.setValue(1.0) gltab.vbl.addWidget(self.glcontrast) self.glbrightness = ValSlider(gltab, (-1.0, 0.0), "GLBst:") self.glbrightness.setObjectName("GLBoost") self.glbrightness.setValue(0.1) self.glbrightness.setValue(0.0) gltab.vbl.addWidget(self.glbrightness) return gltab def get_main_tab(self): if (self.maintab == None): self.maintab = QtGui.QWidget() maintab = self.maintab maintab.vbl = QtGui.QVBoxLayout(self.maintab) maintab.vbl.setMargin(0) maintab.vbl.setSpacing(6) maintab.vbl.setObjectName("Main") self.transform_vbl = QtGui.QVBoxLayout() self.transform_panel.addWidgets(self.transform_vbl) maintab.vbl.addLayout(self.transform_vbl) self.glwidget = QtGui.QTabWidget() self.glwidget.addTab(self.get_GL_tab(), "GL") maintab.vbl.addWidget(self.glwidget) return maintab def get_format_tab(self): self.formattab = QtGui.QWidget() formattab = self.formattab formattab.vbl = QtGui.QVBoxLayout(self.formattab) formattab.vbl.setMargin(0) formattab.vbl.setSpacing(6) formattab.vbl.setObjectName("Format") self.hbl1 = QtGui.QHBoxLayout() self.text = QtGui.QLineEdit() self.text.setText("hello world") text_label = QtGui.QLabel("Enter Text:", self) text_label.setToolTip( "Enters quotes to evaluate new line e.g. \"hello\\nworld\". Evaluates numerical expressions e.g. 9*9 (with out quotes)" ) self.hbl1.addWidget(text_label) self.hbl1.addWidget(self.text) formattab.vbl.addLayout(self.hbl1) self.hbl1 = QtGui.QHBoxLayout() self.Dfont = QtGui.QComboBox() for k in self.l: self.Dfont.addItem(k) self.hbl1.addWidget(QtGui.QLabel("Fonts:", self)) self.hbl1.addWidget(self.Dfont) formattab.vbl.addLayout(self.hbl1) self.hbl1 = QtGui.QHBoxLayout() self.tsize = QtGui.QSpinBox() self.tsize.setRange(0, 500) self.tsize.setValue(32) self.hbl1.addWidget(QtGui.QLabel("Size:", self), Qt.AlignLeft) self.hbl1.addWidget(self.tsize, Qt.AlignRight) self.combo = QtGui.QComboBox() self.items = [ "Extrude", "Pixmap", "Bitmap", "Polygon", "Outline", "Texture" ] for k in self.items: self.combo.addItem(k) self.hbl1.addWidget(QtGui.QLabel("Style:", self), Qt.AlignLeft) self.hbl1.addWidget(self.combo, Qt.AlignRight) formattab.vbl.addLayout(self.hbl1) self.hbl1 = QtGui.QHBoxLayout() self.lspacing = ValSlider(self, (-100.0, 100.0), "Line Spacing:") self.lspacing.setObjectName("Length") self.lspacing.setValue(75.0) self.lspacing.setEnabled(False) self.hbl1.addWidget(self.lspacing) formattab.vbl.addLayout(self.hbl1) self.hbl1 = QtGui.QHBoxLayout() self.length = ValSlider(self, (0.0, 500.0), "Length:") self.length.setObjectName("Length") self.length.setValue(75.0) self.hbl1.addWidget(self.length) formattab.vbl.addLayout(self.hbl1) self.hbl1 = QtGui.QHBoxLayout() self.cbb = QtGui.QComboBox() self.hbl1.addWidget(QtGui.QLabel("Material:", self)) self.hbl1.addWidget(self.cbb) formattab.vbl.addLayout(self.hbl1) self.hbl1 = QtGui.QHBoxLayout() self.bgtabwidget = QtGui.QTabWidget() self.maintab = None self.bgtabwidget.addTab(self.get_bgRGB_tab(), "BG RGB") self.hbl1.addWidget(self.bgtabwidget) self.n3_showing = False formattab.vbl.addLayout(self.hbl1) return formattab def get_bgRGB_tab(self): self.bgRGBtab = QtGui.QWidget() bgRGBtab = self.bgRGBtab bgRGBtab.vbl2 = QtGui.QVBoxLayout(self.bgRGBtab) bgRGBtab.vbl2.setMargin(0) bgRGBtab.vbl2.setSpacing(6) bgRGBtab.vbl2.setObjectName("BG RGB") self.hbl2 = QtGui.QHBoxLayout() self.bgR = ValSlider(self, (0, 1), "R:") self.bgR.setObjectName("R") self.bgR.setValue(0.5) self.hbl2.addWidget(self.bgR) bgRGBtab.vbl2.addLayout(self.hbl2) self.hbl2 = QtGui.QHBoxLayout() self.bgG = ValSlider(self, (0, 1), "G:") self.bgG.setObjectName("G") self.bgG.setValue(0.5) self.hbl2.addWidget(self.bgG) bgRGBtab.vbl2.addLayout(self.hbl2) self.hbl2 = QtGui.QHBoxLayout() self.bgB = ValSlider(self, (0, 1), "B:") self.bgB.setObjectName("B") self.bgB.setValue(0.5) self.hbl2.addWidget(self.bgB) bgRGBtab.vbl2.addLayout(self.hbl2) self.hbl2 = QtGui.QHBoxLayout() self.bg_a = ValSlider(self, (0, 1), "Alpha:") self.bg_a.setObjectName("Alpha") self.bg_a.setValue(1.0) self.hbl2.addWidget(self.bg_a) bgRGBtab.vbl2.addLayout(self.hbl2) return bgRGBtab # def slider_rotate(self): # self.target.load_rotation(self.get_current_rotation()) # def set_xy_trans(self, x, y): # self.x_trans.setValue(x) # self.y_trans.setValue(y) # def set_translate_scale(self, xscale,yscale,zscale): # self.x_trans.setSingleStep(xscale) # self.y_trans.setSingleStep(yscale) # self.z_trans.setSingleStep(zscale) # def update_rotations(self,t3d): # rot = t3d.get_rotation(self.src_map[str(self.src.itemText(self.src.currentIndex()))]) # # convention = self.src.currentText() # if ( self.src_map[str(convention)] == EULER_SPIN ): # self.n3.setValue(rot[self.n3.getLabel()],True) # # self.az.setValue(rot[self.az.getLabel()],True) # self.alt.setValue(rot[self.alt.getLabel()],True) # self.phi.setValue(rot[self.phi.getLabel()],True) # def slider_rotate(self): # self.target.load_rotation(self.get_current_rotation()) # def get_current_rotation(self): # convention = self.src.currentText() # rot = {} # if ( self.current_src == EULER_SPIN ): # rot[self.az.getLabel()] = self.az.getValue() # # n1 = self.alt.getValue() # n2 = self.phi.getValue() # n3 = self.n3.getValue() # # norm = sqrt(n1*n1 + n2*n2 + n3*n3) # # n1 /= norm # n2 /= norm # n3 /= norm # # rot[self.alt.getLabel()] = n1 # rot[self.phi.getLabel()] = n2 # rot[self.n3.getLabel()] = n3 # # else: # rot[self.az.getLabel()] = self.az.getValue() # rot[self.alt.getLabel()] = self.alt.getValue() # rot[self.phi.getLabel()] = self.phi.getValue() # # return Transform(self.current_src, rot) def setColors(self, colors, current_color): a = 0 for i in colors: self.cbb.addItem(i) if (i == current_color): self.cbb.setCurrentIndex(a) a += 1
def __init__(self,app,maxshift,invert=False,seqali=False,tiltstep=2.0): self.app=app self.maxshift=maxshift self.seqali=seqali self.invert=invert self.tiltstep=tiltstep # the control panel QtGui.QWidget.__init__(self,None) self.gbl = QtGui.QGridLayout(self) self.gbl.setMargin(0) self.gbl.setSpacing(6) self.gbl.setObjectName("hbl") # action buttons self.bcenalign=QtGui.QPushButton("Center Align") self.bprojalign=QtGui.QPushButton("Proj. Realign") self.btiltaxis=QtGui.QPushButton("Tilt Axis") self.btiltaxisval=QtGui.QLineEdit("90.0") self.bsavedata=QtGui.QPushButton("Save Data") self.breconst=QtGui.QPushButton("3D Normal") self.sbmode=QtGui.QSpinBox(self) self.sbmode.setRange(0,2) self.sbmode.setValue(0) self.bmagict=QtGui.QPushButton("3D Tomofill") self.bmagics=QtGui.QPushButton("3D Sph") self.bmagicc=QtGui.QPushButton("3D Cyl") self.vslpfilt=ValSlider(self,(0,.5),"Filter",0.5,50) self.gbl.addWidget(self.bcenalign,0,0) self.gbl.addWidget(self.bprojalign,0,1) self.gbl.addWidget(self.btiltaxis,0,2) self.gbl.addWidget(self.btiltaxisval,0,3) # self.gbl.addWidget(self.bsavedata,0,3) self.gbl.addWidget(self.breconst,1,0) self.gbl.addWidget(self.sbmode,2,0,1,1) self.gbl.addWidget(self.vslpfilt,3,0,1,4) self.gbl.addWidget(self.bmagict,1,1) self.gbl.addWidget(self.bmagics,1,2) self.gbl.addWidget(self.bmagicc,1,3) QtCore.QObject.connect(self.bcenalign,QtCore.SIGNAL("clicked(bool)"),self.do_cenalign) QtCore.QObject.connect(self.bprojalign,QtCore.SIGNAL("clicked(bool)"),self.do_projalign) QtCore.QObject.connect(self.btiltaxis,QtCore.SIGNAL("clicked(bool)"),self.do_tiltaxis) QtCore.QObject.connect(self.bsavedata,QtCore.SIGNAL("clicked(bool)"),self.do_savedata) QtCore.QObject.connect(self.breconst,QtCore.SIGNAL("clicked(bool)"),self.do_reconst) QtCore.QObject.connect(self.bmagict,QtCore.SIGNAL("clicked(bool)"),self.do_magict) QtCore.QObject.connect(self.bmagics,QtCore.SIGNAL("clicked(bool)"),self.do_magics) QtCore.QObject.connect(self.bmagicc,QtCore.SIGNAL("clicked(bool)"),self.do_magicc) QtCore.QObject.connect(self.vslpfilt,QtCore.SIGNAL("valueChanged"),self.do_filter) # the single image display widget self.im2d = EMImage2DWidget(application=app,winid="tomotrackbox.big") self.imboxed = EMImage2DWidget(application=app,winid="tomotrackbox.small") self.improj = EMImage2DWidget(application=app,winid="tomotrackbox.proj") self.imslice = EMImage2DWidget(application=app,winid="tomotrackbox.3dslice") self.imvol = EMImage3DModule(application=app,winid="tomotrackbox.3d") # get some signals from the window. QtCore.QObject.connect(self.im2d,QtCore.SIGNAL("mousedown"),self.down) QtCore.QObject.connect(self.im2d,QtCore.SIGNAL("mousedrag"),self.drag) QtCore.QObject.connect(self.im2d,QtCore.SIGNAL("mouseup"),self.up) QtCore.QObject.connect(self.im2d,QtCore.SIGNAL("increment_list_data"),self.change_tilt) self.imagefile=None self.imageparm=None self.tiltshapes=None self.curtilt=0 self.oldtilt=self.curtilt self.map3d=None self.downloc=None self.downadjloc=None self.show() self.im2d.show()
def __init__(self, application, apix=1.0, voltage=300.0, cs=4.1, ac=10.0, samples=256): """CTF simulation dialog """ try: from emimage2d import EMImage2DWidget except: print "Cannot import EMAN image GUI objects (EMImage2DWidget)" sys.exit(1) try: from emplot2d import EMPlot2DWidget except: print "Cannot import EMAN plot GUI objects (is matplotlib installed?)" sys.exit(1) self.app = weakref.ref(application) self.df_voltage = voltage self.df_apix = apix self.df_cs = cs self.df_ac = ac self.df_samples = samples self.img = None QtGui.QWidget.__init__(self, None) self.setWindowIcon(QtGui.QIcon(get_image_directory() + "ctf.png")) self.data = [] self.curset = 0 self.plotmode = 0 self.guiim = EMImage2DWidget(application=self.app()) self.guiiminit = True # a flag that's used to auto resize the first time the gui's set_data function is called self.guiplot = EMPlot2DWidget(application=self.app()) # self.guirealim=EMImage2DWidget(application=self.app()) # This will show the original particle images # self.guirealim.connect(self.guirealim,QtCore.SIGNAL("keypress"),self.realimgkey) self.guiim.connect(self.guiim, QtCore.SIGNAL("mousedown"), self.imgmousedown) self.guiim.connect(self.guiim, QtCore.SIGNAL("mousedrag"), self.imgmousedrag) self.guiim.connect(self.guiim, QtCore.SIGNAL("mouseup"), self.imgmouseup) self.guiplot.connect(self.guiplot, QtCore.SIGNAL("mousedown"), self.plotmousedown) self.guiim.mmode = "app" # This object is itself a widget we need to set up self.hbl = QtGui.QHBoxLayout(self) self.hbl.setMargin(0) self.hbl.setSpacing(6) self.hbl.setObjectName("hbl") # plot list and plot mode combobox self.vbl2 = QtGui.QVBoxLayout() self.setlist = MyListWidget(self) self.setlist.setSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Expanding) self.vbl2.addWidget(self.setlist) self.splotmode = QtGui.QComboBox(self) self.splotmode.addItem("Amplitude") self.splotmode.addItem("Intensity") self.splotmode.addItem("Int w sum") self.splotmode.addItem("Amp w sum") self.vbl2.addWidget(self.splotmode) self.hbl.addLayout(self.vbl2) # ValSliders for CTF parameters self.vbl = QtGui.QVBoxLayout() self.vbl.setMargin(0) self.vbl.setSpacing(6) self.vbl.setObjectName("vbl") self.hbl.addLayout(self.vbl) #self.samp = ValSlider(self,(0,5.0),"Amp:",0) #self.vbl.addWidget(self.samp) self.imginfo = QtGui.QLabel("Info", self) self.vbl.addWidget(self.imginfo) self.sdefocus = ValSlider(self, (0, 5), "Defocus:", 0, 90) self.vbl.addWidget(self.sdefocus) self.sbfactor = ValSlider(self, (0, 1600), "B factor:", 0, 90) self.vbl.addWidget(self.sbfactor) self.sdfdiff = ValSlider(self, (0, 1), "DF Diff:", 0, 90) self.vbl.addWidget(self.sdfdiff) self.sdfang = ValSlider(self, (0, 180), "Df Angle:", 0, 90) self.vbl.addWidget(self.sdfang) self.sampcont = ValSlider(self, (0, 100), "% AC", 0, 90) self.vbl.addWidget(self.sampcont) self.sapix = ValSlider(self, (.2, 10), "A/Pix:", 2, 90) self.vbl.addWidget(self.sapix) self.svoltage = ValSlider(self, (0, 1000), "Voltage (kV):", 0, 90) self.vbl.addWidget(self.svoltage) self.scs = ValSlider(self, (0, 5), "Cs (mm):", 0, 90) self.vbl.addWidget(self.scs) self.ssamples = ValSlider(self, (32, 1024), "# Samples:", 0, 90) self.ssamples.setIntonly(True) self.vbl.addWidget(self.ssamples) self.hbl_buttons = QtGui.QHBoxLayout() self.newbut = QtGui.QPushButton("New") self.hbl_buttons.addWidget(self.newbut) self.vbl.addLayout(self.hbl_buttons) self.on_new_but() QtCore.QObject.connect(self.sdefocus, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.sbfactor, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.sdfdiff, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.sdfang, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.sapix, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.sampcont, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.svoltage, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.scs, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.ssamples, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.setlist, QtCore.SIGNAL("currentRowChanged(int)"), self.newSet) QtCore.QObject.connect(self.setlist, QtCore.SIGNAL("keypress"), self.listkey) QtCore.QObject.connect(self.splotmode, QtCore.SIGNAL("currentIndexChanged(int)"), self.newPlotMode) QtCore.QObject.connect(self.newbut, QtCore.SIGNAL("clicked(bool)"), self.on_new_but) self.resize( 720, 380 ) # figured these values out by printing the width and height in resize event E2loadappwin("e2ctfsim", "main", self) E2loadappwin("e2ctfsim", "image", self.guiim.qt_parent) # E2loadappwin("e2ctf","realimage",self.guirealim.qt_parent) E2loadappwin("e2ctfsim", "plot", self.guiplot.qt_parent) self.setWindowTitle("CTF")
def addRotationWidgets(self): """ Add alll the widgets for the various EMAN2 rotation conventions """ EMANwidget = QtGui.QWidget() Imagicwidget = QtGui.QWidget() Spiderwidget = QtGui.QWidget() MRCwidget = QtGui.QWidget() XYZwidget = QtGui.QWidget() spinwidget = QtGui.QWidget() sgirotwidget = QtGui.QWidget() quaternionwidget = QtGui.QWidget() # EMAN emanbox = QtGui.QVBoxLayout() self.emanazslider = ValSlider(EMANwidget, (0.0, 360.0), " Az", rounding = 1) self.emanaltslider = ValSlider(EMANwidget, (0.0, 180.0), "Alt", rounding = 1) self.emanphislider = ValSlider(EMANwidget, (0.0, 360.0), "Phi", rounding = 1) emanbox.addWidget(self.emanazslider) emanbox.addWidget(self.emanaltslider) emanbox.addWidget(self.emanphislider) EMANwidget.setLayout(emanbox) # Imagic imagicbox = QtGui.QVBoxLayout() self.imagicgammaslider = ValSlider(Imagicwidget, (0.0, 360.0), "Gamma", rounding = 1) self.imagicbetaslider = ValSlider(Imagicwidget, (0.0, 180.0), " Beta", rounding = 1) self.imagicalphaslider = ValSlider(Imagicwidget, (0.0, 360.0), " Alpha", rounding = 1) imagicbox.addWidget(self.imagicgammaslider) imagicbox.addWidget(self.imagicbetaslider) imagicbox.addWidget(self.imagicalphaslider) Imagicwidget.setLayout(imagicbox) # Spider spiderbox = QtGui.QVBoxLayout() self.spiderpsislider = ValSlider(Spiderwidget, (0.0, 360.0), " Psi", rounding = 1) self.spiderthetaslider = ValSlider(Spiderwidget, (0.0, 180.0), "Theta", rounding = 1) self.spiderphislider = ValSlider(Spiderwidget, (0.0, 360.0), " Phi", rounding = 1) spiderbox.addWidget(self.spiderpsislider) spiderbox.addWidget(self.spiderthetaslider) spiderbox.addWidget(self.spiderphislider) Spiderwidget.setLayout(spiderbox) # MRC mrcbox = QtGui.QVBoxLayout() self.mrcpsislider = ValSlider(MRCwidget, (0.0, 360.0), " Psi", rounding = 1) self.mrcthetaslider = ValSlider(MRCwidget, (0.0, 180.0), " Theta", rounding = 1) self.mrcomegaslider = ValSlider(MRCwidget, (0.0, 360.0), "Omega", rounding = 1) mrcbox.addWidget(self.mrcpsislider) mrcbox.addWidget(self.mrcthetaslider) mrcbox.addWidget(self.mrcomegaslider) MRCwidget.setLayout(mrcbox) # XYZ xyzbox = QtGui.QVBoxLayout() self.xyzzslider = ValSlider(XYZwidget, (0.0, 360.0), "Z", rounding = 1) self.xyzyslider = ValSlider(XYZwidget, (0.0, 180.0), "Y", rounding = 1) self.xyzxslider = ValSlider(XYZwidget, (0.0, 360.0), "X", rounding = 1) xyzbox.addWidget(self.xyzzslider) xyzbox.addWidget(self.xyzyslider) xyzbox.addWidget(self.xyzxslider) XYZwidget.setLayout(xyzbox) # spin spinbox = QtGui.QVBoxLayout() self.spinomegaslider = ValSlider(spinwidget, (0.0, 180.0), "Omega", rounding = 1) self.spinn1slider = ValSlider(spinwidget, (0.0, 1.0), " N1", rounding = 4) self.spinn2slider = ValSlider(spinwidget, (0.0, 1.0), " N2", rounding = 4) self.spinn3slider = ValSlider(spinwidget, (0.0, 1.0), " N3", rounding = 4) spinbox.addWidget(self.spinomegaslider) spinbox.addWidget(self.spinn1slider) spinbox.addWidget(self.spinn2slider) spinbox.addWidget(self.spinn3slider) spinwidget.setLayout(spinbox) # sgirot sgirotbox = QtGui.QVBoxLayout() self.sgirotqslider = ValSlider(sgirotwidget, (0.0, 180.0), " Q", rounding = 1) self.sgirotn1slider = ValSlider(sgirotwidget, (0.0, 1.0), "N1", rounding = 4) self.sgirotn2slider = ValSlider(sgirotwidget, (0.0, 1.0), "N2", rounding = 4) self.sgirotn3slider = ValSlider(sgirotwidget, (0.0, 1.0), "N3", rounding = 4) sgirotbox.addWidget(self.sgirotqslider) sgirotbox.addWidget(self.sgirotn1slider) sgirotbox.addWidget(self.sgirotn2slider) sgirotbox.addWidget(self.sgirotn3slider) sgirotwidget.setLayout(sgirotbox) # quaternion quaternionbox = QtGui.QVBoxLayout() self.quaternione0slider = ValSlider(quaternionwidget, (0.0, 1.0), "E0", rounding = 4) self.quaternione1slider = ValSlider(quaternionwidget, (0.0, 1.0), "E1", rounding = 4) self.quaternione2slider = ValSlider(quaternionwidget, (0.0, 1.0), "E2", rounding = 4) self.quaternione3slider = ValSlider(quaternionwidget, (0.0, 1.0), "E3", rounding = 4) quaternionbox.addWidget(self.quaternione0slider) quaternionbox.addWidget(self.quaternione1slider) quaternionbox.addWidget(self.quaternione2slider) quaternionbox.addWidget(self.quaternione3slider) quaternionwidget.setLayout(quaternionbox) # Add widgets to the stack self.rotstackedwidget.addWidget(EMANwidget) self.rotstackedwidget.addWidget(Imagicwidget) self.rotstackedwidget.addWidget(Spiderwidget) self.rotstackedwidget.addWidget(MRCwidget) self.rotstackedwidget.addWidget(XYZwidget) self.rotstackedwidget.addWidget(spinwidget) self.rotstackedwidget.addWidget(sgirotwidget) self.rotstackedwidget.addWidget(quaternionwidget) # add choices to combobox self.rotcombobox.addItem("EMAN") self.rotcombobox.addItem("Imagic") self.rotcombobox.addItem("Spider") self.rotcombobox.addItem("MRC") self.rotcombobox.addItem("XYZ") self.rotcombobox.addItem("spin") self.rotcombobox.addItem("sgirot") self.rotcombobox.addItem("quaternion") # Signal for all sliders QtCore.QObject.connect(self.rotcombobox, QtCore.SIGNAL("activated(int)"), self._rotcombobox_changed) QtCore.QObject.connect(self.emanazslider,QtCore.SIGNAL("valueChanged"),self._on_EMAN_rotation) QtCore.QObject.connect(self.emanaltslider,QtCore.SIGNAL("valueChanged"),self._on_EMAN_rotation) QtCore.QObject.connect(self.emanphislider,QtCore.SIGNAL("valueChanged"),self._on_EMAN_rotation) QtCore.QObject.connect(self.imagicgammaslider,QtCore.SIGNAL("valueChanged"),self._on_Imagic_rotation) QtCore.QObject.connect(self.imagicbetaslider,QtCore.SIGNAL("valueChanged"),self._on_Imagic_rotation) QtCore.QObject.connect(self.imagicalphaslider,QtCore.SIGNAL("valueChanged"),self._on_Imagic_rotation) QtCore.QObject.connect(self.spiderpsislider,QtCore.SIGNAL("valueChanged"),self._on_Spider_rotation) QtCore.QObject.connect(self.spiderthetaslider,QtCore.SIGNAL("valueChanged"),self._on_Spider_rotation) QtCore.QObject.connect(self.spiderphislider,QtCore.SIGNAL("valueChanged"),self._on_Spider_rotation) QtCore.QObject.connect(self.mrcpsislider,QtCore.SIGNAL("valueChanged"),self._on_MRC_rotation) QtCore.QObject.connect(self.mrcthetaslider,QtCore.SIGNAL("valueChanged"),self._on_MRC_rotation) QtCore.QObject.connect(self.mrcomegaslider,QtCore.SIGNAL("valueChanged"),self._on_MRC_rotation) QtCore.QObject.connect(self.xyzzslider,QtCore.SIGNAL("valueChanged"),self._on_XYZ_rotation) QtCore.QObject.connect(self.xyzyslider,QtCore.SIGNAL("valueChanged"),self._on_XYZ_rotation) QtCore.QObject.connect(self.xyzxslider,QtCore.SIGNAL("valueChanged"),self._on_XYZ_rotation) QtCore.QObject.connect(self.spinomegaslider,QtCore.SIGNAL("valueChanged"),self._on_spin_rotation) QtCore.QObject.connect(self.spinn1slider,QtCore.SIGNAL("valueChanged"),self._on_spin_rotation) QtCore.QObject.connect(self.spinn2slider,QtCore.SIGNAL("valueChanged"),self._on_spin_rotation) QtCore.QObject.connect(self.spinn3slider,QtCore.SIGNAL("valueChanged"),self._on_spin_rotation) QtCore.QObject.connect(self.sgirotqslider,QtCore.SIGNAL("valueChanged"),self._on_sgirot_rotation) QtCore.QObject.connect(self.sgirotn1slider,QtCore.SIGNAL("valueChanged"),self._on_sgirot_rotation) QtCore.QObject.connect(self.sgirotn2slider,QtCore.SIGNAL("valueChanged"),self._on_sgirot_rotation) QtCore.QObject.connect(self.sgirotn3slider,QtCore.SIGNAL("valueChanged"),self._on_sgirot_rotation) QtCore.QObject.connect(self.quaternione0slider,QtCore.SIGNAL("valueChanged"),self._on_quaternion_rotation) QtCore.QObject.connect(self.quaternione1slider,QtCore.SIGNAL("valueChanged"),self._on_quaternion_rotation) QtCore.QObject.connect(self.quaternione2slider,QtCore.SIGNAL("valueChanged"),self._on_quaternion_rotation) QtCore.QObject.connect(self.quaternione3slider,QtCore.SIGNAL("valueChanged"),self._on_quaternion_rotation)
def __init__(self, app): self.app = app QtGui.QWidget.__init__(self, None) self.synthplot = EMPlot2DWidget(self.app) self.synthplot.show() # overall layout self.vbl1 = QtGui.QVBoxLayout() self.setLayout(self.vbl1) # First row contains general purpose controls self.hbl1 = QtGui.QHBoxLayout() self.vbl1.addLayout(self.hbl1) self.vcell = ValBox(self, (0, 128.0), "Cell:", 64) self.hbl1.addWidget(self.vcell) self.vncells = ValBox(self, (0, 128.0), "n Cells:", 1) self.hbl1.addWidget(self.vncells) self.voversamp = ValBox(self, (0, 128.0), "Oversample:", 1) self.hbl1.addWidget(self.voversamp) self.targfn = None self.vnsin = ValBox(self, (1, 64), "# Sin:", 16) self.vnsin.intonly = 1 self.hbl1.addWidget(self.vnsin) self.cbshowall = QtGui.QCheckBox("Show All") self.hbl1.addWidget(self.cbshowall) self.cbshifted = QtGui.QCheckBox("Shifted") self.hbl1.addWidget(self.cbshifted) self.cbtargfn = QtGui.QComboBox(self) self.cbtargfn.addItem("None") self.cbtargfn.addItem("triangle") self.cbtargfn.addItem("square") self.cbtargfn.addItem("square imp") self.cbtargfn.addItem("delta") self.cbtargfn.addItem("noise") self.cbtargfn.addItem("saw") self.cbtargfn.addItem("sin") self.cbtargfn.addItem("modsin") self.cbtargfn.addItem("modsin2") self.cbtargfn.addItem("modsin3") self.cbtargfn.addItem("sin low") self.cbtargfn.addItem("doubledelta") self.cbtargfn.addItem("sin bad f") self.cbtargfn.addItem("sin bad f2") self.hbl1.addWidget(self.cbtargfn) # Widget containing valsliders self.wapsliders = QtGui.QWidget(self) # self.wapsliders.setMinimumSize(800,640) self.gblap = QtGui.QGridLayout() self.gblap.setSizeConstraint(QtGui.QLayout.SetMinAndMaxSize) self.gblap.setColumnMinimumWidth(0, 250) self.gblap.setColumnMinimumWidth(1, 250) self.wapsliders.setLayout(self.gblap) # ScrollArea providing view on slider container widget self.wapsarea = QtGui.QScrollArea(self) self.wapsarea.setWidgetResizable(True) self.wapsarea.setWidget(self.wapsliders) self.vbl1.addWidget(self.wapsarea) QtCore.QObject.connect(self.vcell, QtCore.SIGNAL("valueChanged"), self.recompute) QtCore.QObject.connect(self.vncells, QtCore.SIGNAL("valueChanged"), self.recompute) QtCore.QObject.connect(self.voversamp, QtCore.SIGNAL("valueChanged"), self.recompute) QtCore.QObject.connect(self.vnsin, QtCore.SIGNAL("valueChanged"), self.nsinchange) QtCore.QObject.connect(self.cbshowall, QtCore.SIGNAL("stateChanged(int)"), self.recompute) QtCore.QObject.connect(self.cbshifted, QtCore.SIGNAL("stateChanged(int)"), self.recompute) QtCore.QObject.connect(self.cbtargfn, QtCore.SIGNAL("activated(int)"), self.newtargfn) self.wamp = [] self.wpha = [] self.curves = [] self.xvals = [] for i in range(65): self.wamp.append(ValSlider(self, (0.0, 1.0), "%2d:" % i, 0.0)) self.gblap.addWidget(self.wamp[-1], i, 0) QtCore.QObject.connect(self.wamp[-1], QtCore.SIGNAL("valueChanged"), self.recompute) self.wpha.append(ValSlider(self, (-180.0, 180.0), "%2d:" % i, 0.0)) self.gblap.addWidget(self.wpha[-1], i, 1) QtCore.QObject.connect(self.wpha[-1], QtCore.SIGNAL("valueChanged"), self.recompute) self.curves.append(EMData(64, 1)) if self.cbshowall.isChecked(): self.synthplot self.total = EMData(64, 1) self.nsinchange()
def get_main_tab(self): if ( self.maintab == None ): self.maintab = QtGui.QWidget() maintab = self.maintab maintab.vbl = QtGui.QVBoxLayout(self.maintab) maintab.vbl.setMargin(0) maintab.vbl.setSpacing(6) maintab.vbl.setObjectName("Main") self.scale = ValSlider(maintab,(0.01,30.0),"Zoom:") self.scale.setObjectName("scale") self.scale.setValue(1.0) maintab.vbl.addWidget(self.scale) self.hbl_color = QtGui.QHBoxLayout() self.hbl_color.setMargin(0) self.hbl_color.setSpacing(6) self.hbl_color.setObjectName("Material") maintab.vbl.addLayout(self.hbl_color) self.color_label = QtGui.QLabel() self.color_label.setText('Material') self.hbl_color.addWidget(self.color_label) self.cbb = QtGui.QComboBox(maintab) self.hbl_color.addWidget(self.cbb) self.hbl_trans = QtGui.QHBoxLayout() self.hbl_trans.setMargin(0) self.hbl_trans.setSpacing(6) self.hbl_trans.setObjectName("Trans") maintab.vbl.addLayout(self.hbl_trans) self.x_label = QtGui.QLabel() self.x_label.setText('x') self.hbl_trans.addWidget(self.x_label) self.x_trans = QtGui.QDoubleSpinBox(self) self.x_trans.setMinimum(-10000) self.x_trans.setMaximum(10000) self.x_trans.setValue(0.0) self.hbl_trans.addWidget(self.x_trans) self.y_label = QtGui.QLabel() self.y_label.setText('y') self.hbl_trans.addWidget(self.y_label) self.y_trans = QtGui.QDoubleSpinBox(maintab) self.y_trans.setMinimum(-10000) self.y_trans.setMaximum(10000) self.y_trans.setValue(0.0) self.hbl_trans.addWidget(self.y_trans) self.z_label = QtGui.QLabel() self.z_label.setText('z') self.hbl_trans.addWidget(self.z_label) self.z_trans = QtGui.QDoubleSpinBox(maintab) self.z_trans.setMinimum(-10000) self.z_trans.setMaximum(10000) self.z_trans.setValue(0.0) self.hbl_trans.addWidget(self.z_trans) self.hbl_src = QtGui.QHBoxLayout() self.hbl_src.setMargin(0) self.hbl_src.setSpacing(6) self.hbl_src.setObjectName("hbl") maintab.vbl.addLayout(self.hbl_src) self.label_src = QtGui.QLabel() self.label_src.setText('Rotation Convention') self.hbl_src.addWidget(self.label_src) self.src = QtGui.QComboBox(maintab) self.load_src_options(self.src) self.hbl_src.addWidget(self.src) # set default value -1 ensures that the val slider is updated the first time it is created self.az = ValSlider(self,(-360.0,360.0),"az",-1) self.az.setObjectName("az") maintab.vbl.addWidget(self.az) self.alt = ValSlider(self,(-180.0,180.0),"alt",-1) self.alt.setObjectName("alt") maintab.vbl.addWidget(self.alt) self.phi = ValSlider(self,(-360.0,360.0),"phi",-1) self.phi.setObjectName("phi") maintab.vbl.addWidget(self.phi) self.current_src = EULER_EMAN return self.maintab
class EMItem3DInspector(QtGui.QTabWidget): """ Class to make the EMItem GUI controls """ def __init__(self, name, item3d): QtGui.QTabWidget.__init__(self) self.item3d = weakref.ref(item3d) self.name = name self.inspector = None self.transfromboxmaxheight = 400 # This might be problematic self.addTabs() def setInspector(self, inspector): """ This is a reference back to the main inspector, which holds all the item inspectors""" self.inspector = weakref.ref(inspector) def addTabs(self): """ Add a tab for each 'column' """ tabwidget = QtGui.QWidget() gridbox = QtGui.QGridLayout() EMItem3DInspector.addControls(self, gridbox) tabwidget.setLayout(gridbox) self.addTab(tabwidget, "basic") def addControls(self, gridbox): """ Construct all the widgets in this Item Inspector """ # selection box and label font = QtGui.QFont() font.setBold(True) label = QtGui.QLabel(self.name, self) label.setFont(font) label.setAlignment(QtCore.Qt.AlignCenter) gridbox.addWidget(label, 0, 0, 1, 1) databox = QtGui.QHBoxLayout() self.boundingbox = None if self.item3d().boundingboxsize: self.boundingbox = QtGui.QLabel( "Size: " + self.item3d().boundingboxsize, self) databox.addWidget(self.boundingbox) gridbox.addLayout(databox, 1, 0, 1, 1) # angluar controls xformframe = QtGui.QFrame() xformframe.setFrameShape(QtGui.QFrame.StyledPanel) xformbox = QtGui.QGridLayout() xformlabel = QtGui.QLabel("Transformation", xformframe) xformlabel.setFont(font) xformlabel.setAlignment(QtCore.Qt.AlignCenter) xformbox.addWidget(xformlabel, 0, 0, 1, 2) # Rotations self.rotcombobox = QtGui.QComboBox() xformbox.addWidget(self.rotcombobox, 1, 0, 1, 2) self.rotstackedwidget = QtGui.QStackedWidget() self.addRotationWidgets() xformbox.addWidget(self.rotstackedwidget, 2, 0, 1, 2) #translations txlabel = QtGui.QLabel("TX", xformframe) txlabel.setAlignment(QtCore.Qt.AlignCenter) xformbox.addWidget(txlabel, 3, 0, 1, 1) tylabel = QtGui.QLabel("TY", xformframe) tylabel.setAlignment(QtCore.Qt.AlignCenter) xformbox.addWidget(tylabel, 3, 1, 1, 1) self.tx = EMSpinWidget(0.0, 1.0) self.ty = EMSpinWidget(0.0, 1.0) xformbox.addWidget(self.tx, 4, 0, 1, 1) xformbox.addWidget(self.ty, 4, 1, 1, 1) tzlabel = QtGui.QLabel("TZ", xformframe) tzlabel.setAlignment(QtCore.Qt.AlignCenter) xformbox.addWidget(tzlabel, 5, 0, 1, 1) zoomlabel = QtGui.QLabel("Zoom", xformframe) zoomlabel.setAlignment(QtCore.Qt.AlignCenter) xformbox.addWidget(zoomlabel, 5, 1, 1, 1) self.tz = EMSpinWidget(0.0, 1.0) self.zoom = EMSpinWidget(1.0, 0.1, postivemode=True, wheelstep=0.1) xformbox.addWidget(self.tz, 6, 0, 1, 1) xformbox.addWidget(self.zoom, 6, 1, 1, 1) self.resetbuttontx = QtGui.QPushButton("Reset Tx") self.resetbuttonrot = QtGui.QPushButton("Reset Rot") xformbox.addWidget(self.resetbuttontx, 7, 0, 1, 1) xformbox.addWidget(self.resetbuttonrot, 7, 1, 1, 1) xformframe.setLayout(xformbox) xformframe.setMaximumWidth(350) xformframe.setMaximumHeight(self.transfromboxmaxheight) xformframe.setLayout(xformbox) gridbox.addWidget(xformframe, 2, 0, 1, 1) # set to default, but run only as a base class if type(self) == EMItem3DInspector: self.updateItemControls() QtCore.QObject.connect(self.tx, QtCore.SIGNAL("valueChanged(int)"), self._on_translation) QtCore.QObject.connect(self.ty, QtCore.SIGNAL("valueChanged(int)"), self._on_translation) QtCore.QObject.connect(self.tz, QtCore.SIGNAL("valueChanged(int)"), self._on_translation) QtCore.QObject.connect(self.zoom, QtCore.SIGNAL("valueChanged(int)"), self._on_scale) QtCore.QObject.connect(self.resetbuttontx, QtCore.SIGNAL("clicked()"), self._on_resettx) QtCore.QObject.connect(self.resetbuttonrot, QtCore.SIGNAL("clicked()"), self._on_resetrot) def _on_translation(self, value): """ Need to contain the right coords. And do translation in the correct corrd system """ tt = t = Transform({ "tx": self.tx.getValue(), "ty": self.ty.getValue(), "tz": self.tz.getValue() }) tp = self.item3d().getParentMatrixProduct() if tp: tt = tp.inverse() * t self.item3d().getTransform().set_trans(tt.get_trans()) self.inspector().updateSceneGraph() def _on_scale(self, value): self.item3d().getTransform().set_scale(self.zoom.getValue()) self.inspector().updateSceneGraph() def _on_resettx(self): self.item3d().getTransform().set_trans(0.0, 0.0, 0.0) self.updateItemControls() self.inspector().updateSceneGraph() def _on_resetrot(self): self.item3d().getTransform().set_rotation({ "type": "eman", "az": 0.0, "alt": 0.0, "phi": 0.0 }) self.updateItemControls() self.inspector().updateSceneGraph() def _isRotNaN(self, rot1, rot2, rot3): """ Better check to make sure get_rotation did not return Nan, so to prevent a crash """ if rot1 != rot1: return True if rot2 != rot2: return True if rot3 != rot3: return True return False def updateItemControls(self): """ Updates this item inspector. Function is called by the item it observes""" # Translation update stdtransfrom = self.item3d().getTransformStdCoord() translation = stdtransfrom.get_trans() self.tx.setValue(translation[0]) self.ty.setValue(translation[1]) self.tz.setValue(translation[2]) # Rotation update rotation = stdtransfrom.get_rotation( str(self.rotcombobox.currentText())) is_identity = stdtransfrom.is_rot_identity() comboboxidx = self.rotcombobox.currentIndex() if comboboxidx == 0: if self._isRotNaN(rotation["az"], rotation["alt"], rotation["phi"]): return self.emanazslider.setValue(rotation["az"], quiet=1) self.emanaltslider.setValue(rotation["alt"], quiet=1) self.emanphislider.setValue(rotation["phi"], quiet=1) if comboboxidx == 1: if self._isRotNaN(rotation["gamma"], rotation["beta"], rotation["alpha"]): return self.imagicgammaslider.setValue(rotation["gamma"], quiet=1) self.imagicbetaslider.setValue(rotation["beta"], quiet=1) self.imagicalphaslider.setValue(rotation["alpha"], quiet=1) if comboboxidx == 2: if self._isRotNaN(rotation["psi"], rotation["theta"], rotation["phi"]): return self.spiderpsislider.setValue(rotation["psi"], quiet=1) self.spiderthetaslider.setValue(rotation["theta"], quiet=1) self.spiderphislider.setValue(rotation["phi"], quiet=1) if comboboxidx == 3: if self._isRotNaN(rotation["phi"], rotation["theta"], rotation["omega"]): return self.mrcpsislider.setValue(rotation["phi"], quiet=1) self.mrcthetaslider.setValue(rotation["theta"], quiet=1) self.mrcomegaslider.setValue(rotation["omega"], quiet=1) if comboboxidx == 4: if self._isRotNaN(rotation["ztilt"], rotation["ytilt"], rotation["xtilt"]): return self.xyzzslider.setValue(rotation["ztilt"], quiet=1) self.xyzyslider.setValue(rotation["ytilt"], quiet=1) self.xyzxslider.setValue(rotation["xtilt"], quiet=1) if comboboxidx == 5: if self._isRotNaN(rotation["n1"], rotation["n2"], rotation["n3"]): return if is_identity and self.spinn1slider.getValue( ) == 0.0 and self.spinn2slider.getValue( ) == 0.0 and self.spinn3slider.getValue() == 0.0: self.spinomegaslider.setValue(0.0, quiet=1) self.spinn1slider.setValue(0.0, quiet=1) self.spinn2slider.setValue(0.0, quiet=1) self.spinn3slider.setValue(1.0, quiet=1) else: self.spinomegaslider.setValue(rotation["omega"], quiet=1) # Don't change slider if reult is Nan if rotation["n1"] == rotation["n1"]: self.spinn1slider.setValue(rotation["n1"], quiet=1) if rotation["n2"] == rotation["n2"]: self.spinn2slider.setValue(rotation["n2"], quiet=1) if rotation["n3"] == rotation["n3"]: self.spinn3slider.setValue(rotation["n3"], quiet=1) if comboboxidx == 6: if self._isRotNaN(rotation["n1"], rotation["n2"], rotation["n3"]): return if is_identity and self.spinn1slider.getValue( ) == 0.0 and self.spinn2slider.getValue( ) == 0.0 and self.spinn3slider.getValue() == 0.0: self.spinomegaslider.setValue(0.0, quiet=1) self.sgirotn1slider.setValue(0.0, quiet=1) self.sgirotn2slider.setValue(0.0, quiet=1) self.sgirotn3slider.setValue(1.0, quiet=1) else: self.spinomegaslider.setValue(rotation["q"], quiet=1) # Don't change slider if reult is Nan if rotation["n1"] == rotation["n1"]: self.sgirotn1slider.setValue(rotation["n1"], quiet=1) if rotation["n2"] == rotation["n2"]: self.sgirotn2slider.setValue(rotation["n2"], quiet=1) if rotation["n3"] == rotation["n3"]: self.sgirotn3slider.setValue(rotation["n3"], quiet=1) if comboboxidx == 7: if self._isRotNaN(rotation["e1"], rotation["e2"], rotation["e3"]): return if is_identity: self.quaternione0slider.setValue(1.0, quiet=1) self.quaternione1slider.setValue(0.0, quiet=1) self.quaternione2slider.setValue(0.0, quiet=1) self.quaternione3slider.setValue(0.0, quiet=1) else: self.quaternione0slider.setValue(rotation["e0"], quiet=1) self.quaternione1slider.setValue(rotation["e1"], quiet=1) self.quaternione2slider.setValue(rotation["e2"], quiet=1) self.quaternione3slider.setValue(rotation["e3"], quiet=1) # Scaling update self.zoom.setValue(self.item3d().getTransform().get_scale()) def updateMetaData(self): """ I didn't want to put this in update b/c this data doesn't change very often, and I don't want to waste CPU Its a judgement call really, less coupling vs. more efficiency """ if self.boundingbox: self.boundingbox.setText("Size: " + self.item3d().boundingboxsize) def addRotationWidgets(self): """ Add alll the widgets for the various EMAN2 rotation conventions """ EMANwidget = QtGui.QWidget() Imagicwidget = QtGui.QWidget() Spiderwidget = QtGui.QWidget() MRCwidget = QtGui.QWidget() XYZwidget = QtGui.QWidget() spinwidget = QtGui.QWidget() sgirotwidget = QtGui.QWidget() quaternionwidget = QtGui.QWidget() # EMAN emanbox = QtGui.QVBoxLayout() self.emanazslider = ValSlider(EMANwidget, (0.0, 360.0), " Az", rounding=1) self.emanaltslider = ValSlider(EMANwidget, (0.0, 180.0), "Alt", rounding=1) self.emanphislider = ValSlider(EMANwidget, (0.0, 360.0), "Phi", rounding=1) emanbox.addWidget(self.emanazslider) emanbox.addWidget(self.emanaltslider) emanbox.addWidget(self.emanphislider) EMANwidget.setLayout(emanbox) # Imagic imagicbox = QtGui.QVBoxLayout() self.imagicgammaslider = ValSlider(Imagicwidget, (0.0, 360.0), "Gamma", rounding=1) self.imagicbetaslider = ValSlider(Imagicwidget, (0.0, 180.0), " Beta", rounding=1) self.imagicalphaslider = ValSlider(Imagicwidget, (0.0, 360.0), " Alpha", rounding=1) imagicbox.addWidget(self.imagicgammaslider) imagicbox.addWidget(self.imagicbetaslider) imagicbox.addWidget(self.imagicalphaslider) Imagicwidget.setLayout(imagicbox) # Spider spiderbox = QtGui.QVBoxLayout() self.spiderpsislider = ValSlider(Spiderwidget, (0.0, 360.0), " Psi", rounding=1) self.spiderthetaslider = ValSlider(Spiderwidget, (0.0, 180.0), "Theta", rounding=1) self.spiderphislider = ValSlider(Spiderwidget, (0.0, 360.0), " Phi", rounding=1) spiderbox.addWidget(self.spiderpsislider) spiderbox.addWidget(self.spiderthetaslider) spiderbox.addWidget(self.spiderphislider) Spiderwidget.setLayout(spiderbox) # MRC mrcbox = QtGui.QVBoxLayout() self.mrcpsislider = ValSlider(MRCwidget, (0.0, 360.0), " Psi", rounding=1) self.mrcthetaslider = ValSlider(MRCwidget, (0.0, 180.0), " Theta", rounding=1) self.mrcomegaslider = ValSlider(MRCwidget, (0.0, 360.0), "Omega", rounding=1) mrcbox.addWidget(self.mrcpsislider) mrcbox.addWidget(self.mrcthetaslider) mrcbox.addWidget(self.mrcomegaslider) MRCwidget.setLayout(mrcbox) # XYZ xyzbox = QtGui.QVBoxLayout() self.xyzzslider = ValSlider(XYZwidget, (0.0, 360.0), "Z", rounding=1) self.xyzyslider = ValSlider(XYZwidget, (0.0, 180.0), "Y", rounding=1) self.xyzxslider = ValSlider(XYZwidget, (0.0, 360.0), "X", rounding=1) xyzbox.addWidget(self.xyzzslider) xyzbox.addWidget(self.xyzyslider) xyzbox.addWidget(self.xyzxslider) XYZwidget.setLayout(xyzbox) # spin spinbox = QtGui.QVBoxLayout() self.spinomegaslider = ValSlider(spinwidget, (0.0, 180.0), "Omega", rounding=1) self.spinn1slider = ValSlider(spinwidget, (0.0, 1.0), " N1", rounding=4) self.spinn2slider = ValSlider(spinwidget, (0.0, 1.0), " N2", rounding=4) self.spinn3slider = ValSlider(spinwidget, (0.0, 1.0), " N3", rounding=4) spinbox.addWidget(self.spinomegaslider) spinbox.addWidget(self.spinn1slider) spinbox.addWidget(self.spinn2slider) spinbox.addWidget(self.spinn3slider) spinwidget.setLayout(spinbox) # sgirot sgirotbox = QtGui.QVBoxLayout() self.sgirotqslider = ValSlider(sgirotwidget, (0.0, 180.0), " Q", rounding=1) self.sgirotn1slider = ValSlider(sgirotwidget, (0.0, 1.0), "N1", rounding=4) self.sgirotn2slider = ValSlider(sgirotwidget, (0.0, 1.0), "N2", rounding=4) self.sgirotn3slider = ValSlider(sgirotwidget, (0.0, 1.0), "N3", rounding=4) sgirotbox.addWidget(self.sgirotqslider) sgirotbox.addWidget(self.sgirotn1slider) sgirotbox.addWidget(self.sgirotn2slider) sgirotbox.addWidget(self.sgirotn3slider) sgirotwidget.setLayout(sgirotbox) # quaternion quaternionbox = QtGui.QVBoxLayout() self.quaternione0slider = ValSlider(quaternionwidget, (0.0, 1.0), "E0", rounding=4) self.quaternione1slider = ValSlider(quaternionwidget, (0.0, 1.0), "E1", rounding=4) self.quaternione2slider = ValSlider(quaternionwidget, (0.0, 1.0), "E2", rounding=4) self.quaternione3slider = ValSlider(quaternionwidget, (0.0, 1.0), "E3", rounding=4) quaternionbox.addWidget(self.quaternione0slider) quaternionbox.addWidget(self.quaternione1slider) quaternionbox.addWidget(self.quaternione2slider) quaternionbox.addWidget(self.quaternione3slider) quaternionwidget.setLayout(quaternionbox) # Add widgets to the stack self.rotstackedwidget.addWidget(EMANwidget) self.rotstackedwidget.addWidget(Imagicwidget) self.rotstackedwidget.addWidget(Spiderwidget) self.rotstackedwidget.addWidget(MRCwidget) self.rotstackedwidget.addWidget(XYZwidget) self.rotstackedwidget.addWidget(spinwidget) self.rotstackedwidget.addWidget(sgirotwidget) self.rotstackedwidget.addWidget(quaternionwidget) # add choices to combobox self.rotcombobox.addItem("EMAN") self.rotcombobox.addItem("Imagic") self.rotcombobox.addItem("Spider") self.rotcombobox.addItem("MRC") self.rotcombobox.addItem("XYZ") self.rotcombobox.addItem("spin") self.rotcombobox.addItem("sgirot") self.rotcombobox.addItem("quaternion") # Signal for all sliders QtCore.QObject.connect(self.rotcombobox, QtCore.SIGNAL("activated(int)"), self._rotcombobox_changed) QtCore.QObject.connect(self.emanazslider, QtCore.SIGNAL("valueChanged"), self._on_EMAN_rotation) QtCore.QObject.connect(self.emanaltslider, QtCore.SIGNAL("valueChanged"), self._on_EMAN_rotation) QtCore.QObject.connect(self.emanphislider, QtCore.SIGNAL("valueChanged"), self._on_EMAN_rotation) QtCore.QObject.connect(self.imagicgammaslider, QtCore.SIGNAL("valueChanged"), self._on_Imagic_rotation) QtCore.QObject.connect(self.imagicbetaslider, QtCore.SIGNAL("valueChanged"), self._on_Imagic_rotation) QtCore.QObject.connect(self.imagicalphaslider, QtCore.SIGNAL("valueChanged"), self._on_Imagic_rotation) QtCore.QObject.connect(self.spiderpsislider, QtCore.SIGNAL("valueChanged"), self._on_Spider_rotation) QtCore.QObject.connect(self.spiderthetaslider, QtCore.SIGNAL("valueChanged"), self._on_Spider_rotation) QtCore.QObject.connect(self.spiderphislider, QtCore.SIGNAL("valueChanged"), self._on_Spider_rotation) QtCore.QObject.connect(self.mrcpsislider, QtCore.SIGNAL("valueChanged"), self._on_MRC_rotation) QtCore.QObject.connect(self.mrcthetaslider, QtCore.SIGNAL("valueChanged"), self._on_MRC_rotation) QtCore.QObject.connect(self.mrcomegaslider, QtCore.SIGNAL("valueChanged"), self._on_MRC_rotation) QtCore.QObject.connect(self.xyzzslider, QtCore.SIGNAL("valueChanged"), self._on_XYZ_rotation) QtCore.QObject.connect(self.xyzyslider, QtCore.SIGNAL("valueChanged"), self._on_XYZ_rotation) QtCore.QObject.connect(self.xyzxslider, QtCore.SIGNAL("valueChanged"), self._on_XYZ_rotation) QtCore.QObject.connect(self.spinomegaslider, QtCore.SIGNAL("valueChanged"), self._on_spin_rotation) QtCore.QObject.connect(self.spinn1slider, QtCore.SIGNAL("valueChanged"), self._on_spin_rotation) QtCore.QObject.connect(self.spinn2slider, QtCore.SIGNAL("valueChanged"), self._on_spin_rotation) QtCore.QObject.connect(self.spinn3slider, QtCore.SIGNAL("valueChanged"), self._on_spin_rotation) QtCore.QObject.connect(self.sgirotqslider, QtCore.SIGNAL("valueChanged"), self._on_sgirot_rotation) QtCore.QObject.connect(self.sgirotn1slider, QtCore.SIGNAL("valueChanged"), self._on_sgirot_rotation) QtCore.QObject.connect(self.sgirotn2slider, QtCore.SIGNAL("valueChanged"), self._on_sgirot_rotation) QtCore.QObject.connect(self.sgirotn3slider, QtCore.SIGNAL("valueChanged"), self._on_sgirot_rotation) QtCore.QObject.connect(self.quaternione0slider, QtCore.SIGNAL("valueChanged"), self._on_quaternion_rotation) QtCore.QObject.connect(self.quaternione1slider, QtCore.SIGNAL("valueChanged"), self._on_quaternion_rotation) QtCore.QObject.connect(self.quaternione2slider, QtCore.SIGNAL("valueChanged"), self._on_quaternion_rotation) QtCore.QObject.connect(self.quaternione3slider, QtCore.SIGNAL("valueChanged"), self._on_quaternion_rotation) def _rotcombobox_changed(self, idx): self.rotstackedwidget.setCurrentIndex(idx) self.updateItemControls() def _on_EMAN_rotation(self, value): self._set_rotation_std_coords( Transform({ "type": "eman", "az": self.emanazslider.getValue(), "alt": self.emanaltslider.getValue(), "phi": self.emanphislider.getValue() })) self.inspector().updateSceneGraph() def _on_Imagic_rotation(self, value): self._set_rotation_std_coords( Transform({ "type": "imagic", "gamma": self.imagicgammaslider.getValue(), "beta": self.imagicbetaslider.getValue(), "alpha": self.imagicalphaslider.getValue() })) self.inspector().updateSceneGraph() def _on_Spider_rotation(self, value): self._set_rotation_std_coords( Transform({ "type": "spider", "psi": self.spiderpsislider.getValue(), "theta": self.spiderthetaslider.getValue(), "phi": self.spiderphislider.getValue() })) self.inspector().updateSceneGraph() def _on_MRC_rotation(self, value): self._set_rotation_std_coords( Transform({ "type": "mrc", "phi": self.mrcpsislider.getValue(), "theta": self.mrcthetaslider.getValue(), "omega": self.mrcomegaslider.getValue() })) self.inspector().updateSceneGraph() def _on_XYZ_rotation(self, value): self._set_rotation_std_coords( Transform({ "type": "xyz", "ztilt": self.xyzzslider.getValue(), "ytilt": self.xyzyslider.getValue(), "xtilt": self.xyzxslider.getValue() })) self.inspector().updateSceneGraph() def _on_spin_rotation(self, value): v = Vec3f(self.spinn1slider.getValue(), self.spinn2slider.getValue(), self.spinn3slider.getValue()) v.normalize() self._set_rotation_std_coords( Transform({ "type": "spin", "omega": self.spinomegaslider.getValue(), "n1": v[0], "n2": v[1], "n3": v[2] })) self.inspector().updateSceneGraph() def _on_sgirot_rotation(self, value): v = Vec3f(self.sgirotn1slider.getValue(), self.sgirotn2slider.getValue(), self.sgirotn3slider.getValue()) v.normalize() self._set_rotation_std_coords( Transform({ "type": "sgirot", "q": self.sgirotqslider.getValue(), "n1": v[0], "n2": v[1], "n3": v[2] })) self.inspector().updateSceneGraph() def _on_quaternion_rotation(self, value): v = Vec4f(self.quaternione0slider.getValue(), self.quaternione1slider.getValue(), self.quaternione2slider.getValue(), self.quaternione3slider.getValue()) v.normalize() self._set_rotation_std_coords( Transform({ "type": "quaternion", "e0": v[0], "e1": v[1], "e2": v[2], "e3": v[3] })) self.inspector().updateSceneGraph() def _set_rotation_std_coords(self, rotation): """ This function sets the rotation as if there were no preceeding ones, otherwise a rot around Z could be arounf y,x, etc. Works by transforming local coords into global corrds""" tt = rotation tp = self.item3d().getParentMatrixProduct() if tp: tt = tp.inverse() * rotation self.item3d().getTransform().set_rotation(tt.get_rotation())
class TrackerControl(QtGui.QWidget): def __init__(self, app, maxshift, invert=False, seqali=False, tiltstep=2.0): self.app = app self.maxshift = maxshift self.seqali = seqali self.invert = invert self.tiltstep = tiltstep # the control panel QtGui.QWidget.__init__(self, None) self.gbl = QtGui.QGridLayout(self) self.gbl.setMargin(0) self.gbl.setSpacing(6) self.gbl.setObjectName("hbl") # action buttons self.bcenalign = QtGui.QPushButton("Center Align") self.bprojalign = QtGui.QPushButton("Proj. Realign") self.btiltaxis = QtGui.QPushButton("Tilt Axis") self.btiltaxisval = QtGui.QLineEdit("90.0") self.bsavedata = QtGui.QPushButton("Save Data") self.breconst = QtGui.QPushButton("3D Normal") self.sbmode = QtGui.QSpinBox(self) self.sbmode.setRange(0, 2) self.sbmode.setValue(0) self.bmagict = QtGui.QPushButton("3D Tomofill") self.bmagics = QtGui.QPushButton("3D Sph") self.bmagicc = QtGui.QPushButton("3D Cyl") self.vslpfilt = ValSlider(self, (0, .5), "Filter", 0.5, 50) self.gbl.addWidget(self.bcenalign, 0, 0) self.gbl.addWidget(self.bprojalign, 0, 1) self.gbl.addWidget(self.btiltaxis, 0, 2) self.gbl.addWidget(self.btiltaxisval, 0, 3) # self.gbl.addWidget(self.bsavedata,0,3) self.gbl.addWidget(self.breconst, 1, 0) self.gbl.addWidget(self.sbmode, 2, 0, 1, 1) self.gbl.addWidget(self.vslpfilt, 3, 0, 1, 4) self.gbl.addWidget(self.bmagict, 1, 1) self.gbl.addWidget(self.bmagics, 1, 2) self.gbl.addWidget(self.bmagicc, 1, 3) QtCore.QObject.connect(self.bcenalign, QtCore.SIGNAL("clicked(bool)"), self.do_cenalign) QtCore.QObject.connect(self.bprojalign, QtCore.SIGNAL("clicked(bool)"), self.do_projalign) QtCore.QObject.connect(self.btiltaxis, QtCore.SIGNAL("clicked(bool)"), self.do_tiltaxis) QtCore.QObject.connect(self.bsavedata, QtCore.SIGNAL("clicked(bool)"), self.do_savedata) QtCore.QObject.connect(self.breconst, QtCore.SIGNAL("clicked(bool)"), self.do_reconst) QtCore.QObject.connect(self.bmagict, QtCore.SIGNAL("clicked(bool)"), self.do_magict) QtCore.QObject.connect(self.bmagics, QtCore.SIGNAL("clicked(bool)"), self.do_magics) QtCore.QObject.connect(self.bmagicc, QtCore.SIGNAL("clicked(bool)"), self.do_magicc) QtCore.QObject.connect(self.vslpfilt, QtCore.SIGNAL("valueChanged"), self.do_filter) # the single image display widget self.im2d = EMImage2DWidget(application=app, winid="tomotrackbox.big") self.imboxed = EMImage2DWidget(application=app, winid="tomotrackbox.small") self.improj = EMImage2DWidget(application=app, winid="tomotrackbox.proj") self.imslice = EMImage2DWidget(application=app, winid="tomotrackbox.3dslice") self.imvol = EMImage3DModule(application=app, winid="tomotrackbox.3d") # get some signals from the window. QtCore.QObject.connect(self.im2d, QtCore.SIGNAL("mousedown"), self.down) QtCore.QObject.connect(self.im2d, QtCore.SIGNAL("mousedrag"), self.drag) QtCore.QObject.connect(self.im2d, QtCore.SIGNAL("mouseup"), self.up) QtCore.QObject.connect(self.im2d, QtCore.SIGNAL("increment_list_data"), self.change_tilt) self.imagefile = None self.imageparm = None self.tiltshapes = None self.curtilt = 0 self.oldtilt = self.curtilt self.map3d = None self.downloc = None self.downadjloc = None self.show() self.im2d.show() def closeEvent(self, event): self.im2d.closeEvent(QtGui.QCloseEvent()) self.imboxed.closeEvent(QtGui.QCloseEvent()) self.improj.closeEvent(QtGui.QCloseEvent()) self.imslice.closeEvent(QtGui.QCloseEvent()) self.imvol.closeEvent(QtGui.QCloseEvent()) event.accept() def do_cenalign(self, x=0): """In response to the center align button. Just a wrapper""" self.cenalign_stack() self.update_stack() def do_projalign(self, x=0): """In response to the projection align button. Just a wrapper""" self.projection_align(self.tiltstep) self.update_stack() # self.do_reconst() def do_tiltaxis(self): """In response to the tilt axis button. Just a wrapper""" self.tilt_axis() def do_reconst(self, x=0): """In response to the normal reconstruction button. Just a wrapper""" stack = self.get_boxed_stack() mode = self.sbmode.value() self.map3d = self.reconstruct(stack, self.tiltstep, mode) self.update_3d() def do_magict(self, x): """In response to tomographic filling reconstruction button. Just a wrapper""" stack = self.get_boxed_stack() # self.map3d=self.reconstruct_ca(stack[5:-4],0.5) # init=self.reconstruct_ca(stack[5:-4],0.5) mode = self.sbmode.value() self.map3d = self.reconstruct_wedgefill(stack, self.tiltstep, mode) self.update_3d() def do_magics(self, x): """In response to the 3D Sph button. Just a wrapper""" return def do_magicc(self, x): """In response to the 3D cyl button. Just a wrapper""" return def do_filter(self, v): """In response to the filter ValSlider""" if self.map3d == None: return self.lpfilt = v self.update_3d() def do_savedata(self): "" def update_3d(self): if self.map3d == None: return self.filt3d = self.map3d.process( "filter.lowpass.gauss", {"cutoff_abs": self.vslpfilt.getValue()}) self.imvol.set_data(self.filt3d) self.imvol.show() self.imvol.updateGL() sz = self.map3d["nx"] xsum = self.filt3d.process("misc.directional_sum", {"axis": "x"}) xsum.set_size(sz, sz, 1) ysum = self.filt3d.process("misc.directional_sum", {"axis": "y"}) ysum.set_size(sz, sz, 1) zsum = self.filt3d.process("misc.directional_sum", {"axis": "z"}) zsum.set_size(sz, sz, 1) self.improj.set_data([zsum, ysum, xsum]) self.improj.show() self.improj.updateGL() self.imslice.set_data(self.filt3d) self.imslice.show() self.imslice.updateGL() def update_stack(self): stack = self.get_boxed_stack() self.imboxed.set_data(stack) self.imboxed.show() self.imboxed.updateGL() def set_image(self, fsp): """Takes an ali file to process""" self.imageparm = EMData(fsp, 0, True).get_attr_dict() print "%d slices at %d x %d" % ( self.imageparm["nz"], self.imageparm["nx"], self.imageparm["ny"]) self.imagefile = fsp self.curtilt = self.imageparm["nz"] / 2 self.tiltshapes = [None for i in range(self.imageparm["nz"])] self.update_tilt() def update_tilt(self): if self.imagefile == None: return self.curimg = EMData( self.imagefile, 0, False, Region(0, 0, self.curtilt, self.imageparm["nx"], self.imageparm["ny"], 1)) if self.invert: self.curimg.mult(-1.0) self.im2d.set_data(self.curimg) s = EMShape( ["scrlabel", .7, .3, 0, 20.0, 20.0, "%d" % self.curtilt, 200.0, 1]) self.im2d.add_shape("tilt", s) if self.tiltshapes[self.curtilt] != None: self.im2d.add_shape("finalbox", self.tiltshapes[self.curtilt]) s0 = self.tiltshapes[self.oldtilt].getShape() s1 = self.tiltshapes[self.curtilt].getShape() dx = s0[4] - s1[4] dy = s0[5] - s1[5] self.im2d.set_origin(self.im2d.origin[0] - dx, self.im2d.origin[1] - dy) self.oldtilt = self.curtilt self.im2d.updateGL() def change_tilt(self, direc): """When the user presses the up or down arrow""" self.oldtilt = self.curtilt self.curtilt += direc if self.curtilt < 0: self.curtilt = 0 if self.curtilt >= self.imageparm["nz"]: self.curtilt = self.imageparm["nz"] - 1 self.update_tilt() def down(self, event, lc): """The event contains the x,y coordinates in window space, lc are the coordinates in image space""" if event.buttons() & Qt.LeftButton: if event.modifiers() & Qt.ShiftModifier: self.downadjloc = ( lc, self.tiltshapes[self.curtilt].getShape()[4:8]) else: self.downloc = lc def drag(self, event, lc): if self.downloc != None: dx = abs(lc[0] - self.downloc[0]) dy = abs(lc[1] - self.downloc[1]) dx = max(dx, dy) # Make box square dx = good_size(dx * 2) / 2 # use only good sizes dy = dx s = EMShape([ "rectpoint", 0, .7, 0, self.downloc[0] - dx, self.downloc[1] - dy, self.downloc[0] + dx, self.downloc[1] + dy, 1 ]) self.im2d.add_shape("box", s) s = EMShape([ "scrlabel", .7, .7, 0, 20.0, 20.0, "%d (%d x %d)" % (self.curtilt, dx * 2, dy * 2), 200.0, 1 ]) self.im2d.add_shape("tilt", s) elif self.downadjloc != None: dx = (lc[0] - self.downadjloc[0][0]) dy = (lc[1] - self.downadjloc[0][1]) s = self.tiltshapes[self.curtilt].getShape()[:] s[4] = self.downadjloc[1][0] + dx s[5] = self.downadjloc[1][1] + dy s[6] = self.downadjloc[1][2] + dx s[7] = self.downadjloc[1][3] + dy self.im2d.add_shape("box", EMShape(s)) self.im2d.updateGL() def up(self, event, lc): if self.downloc != None: dx = abs(lc[0] - self.downloc[0]) dy = abs(lc[1] - self.downloc[1]) dx = max(dx, dy) # Make box square dx = good_size(dx * 2) / 2 # use only good sizes dy = dx s = EMShape([ "rectpoint", .7, .2, 0, self.downloc[0] - dx, self.downloc[1] - dy, self.downloc[0] + dx, self.downloc[1] + dy, 1 ]) self.im2d.del_shape("box") if hypot(lc[0] - self.downloc[0], lc[1] - self.downloc[1]) > 5: self.tiltshapes = [None for i in range(self.imageparm["nz"])] self.find_boxes(s) self.update_tilt() self.downloc = None elif self.downadjloc != None: dx = (lc[0] - self.downadjloc[0][0]) dy = (lc[1] - self.downadjloc[0][1]) s = self.tiltshapes[self.curtilt].getShape()[:] s[4] = self.downadjloc[1][0] + dx s[5] = self.downadjloc[1][1] + dy s[6] = self.downadjloc[1][2] + dx s[7] = self.downadjloc[1][3] + dy self.tiltshapes[self.curtilt] = EMShape(s) self.im2d.add_shape("finalbox", self.tiltshapes[self.curtilt]) self.im2d.del_shape("box") self.update_tilt() self.update_stack() self.downadjloc = None def get_boxed_stack(self): stack = [] for i in range(self.imageparm["nz"]): refshape = self.tiltshapes[i].getShape() img = EMData( self.imagefile, 0, False, Region(refshape[4], refshape[5], i, refshape[6] - refshape[4], refshape[7] - refshape[5], 1)) img["ptcl_source_coord"] = (int((refshape[6] + refshape[4]) / 2.0), int((refshape[7] + refshape[5]) / 2.0), i) img["ptcl_source_image"] = str(self.imagefile) if self.invert: img.mult(-1.0) img.process_inplace("normalize.edgemean") stack.append(img) return stack def cenalign_stack(self): """This will perform an iterative centering process on a stack of particle images, centering each on the average. It will modify the current stack of boxing parameters in-place""" for it in range(5): stack = self.get_boxed_stack() # Average the stack, and center it av = stack[0].copy() for im in stack[1:]: av.add(im) av.process_inplace("filter.lowpass.gauss", {"cutoff_abs": .1}) av.process_inplace("filter.highpass.gauss", {"cutoff_abs": .02}) av.process_inplace("xform.centeracf") #display((av,av2)) # align to the average for i, im in enumerate(stack): im.process_inplace("filter.lowpass.gauss", {"cutoff_abs": .1}) im.process_inplace("filter.highpass.gauss", {"cutoff_abs": .02}) ali = im.align("translational", av) trans = ali["xform.align2d"].get_trans() shape = self.tiltshapes[i] shape.translate(-trans[0], -trans[1]) # Update the stack display stack = self.get_boxed_stack() self.imboxed.set_data(stack) def reconstruct_wedgefill(self, stack, angstep, mode=2): """Fills the missing wedge with the average of the slices""" print "Making 3D tomofill" taxis = float(self.btiltaxisval.text()) boxsize = stack[0]["nx"] pad = Util.calc_best_fft_size(int(boxsize * 1.5)) # average all of the slices together av = stack[0].copy() for p in stack[1:]: av += p av.del_attr("xform.projection") av.mult(1.0 / (len(stack))) av = av.get_clip( Region(-(pad - boxsize) / 2, -(pad - boxsize) / 2, pad, pad)) for i, p in enumerate(stack): p["alt"] = (i - len(stack) / 2) * angstep # Determine a good angular step for filling Fourier space fullsamp = 360.0 / (boxsize * pi) if angstep / fullsamp > 2.0: samp = 1.0 / (floor(angstep / fullsamp)) else: samp = angstep print "Subsampling = %1.2f" % samp # Now the reconstruction recon = Reconstructors.get( "fourier", { "sym": "c1", "size": (pad, pad, pad), "mode": reconmodes[mode], "verbose": True }) recon.setup() for ri in range(5): print "Iteration ", ri for a in [ i * samp for i in range(-int(90.0 / samp), int(90.0 / samp) + 1) ]: for ii in range(len(stack) - 1): if stack[ii]["alt"] <= a and stack[ii + 1]["alt"] > a: break else: ii = -1 if a < stack[0]["alt"]: p = av #frac=0.5*(a-stack[0]["alt"])/(-90.0-stack[0]["alt"]) ## a bit wierd. At the ends (missing wedge) we use the average over all tilts. This could be improved #p=stack[0].get_clip(Region(-(pad-boxsize)/2,-(pad-boxsize)/2,pad,pad))*(1.0-frac)+stack[-1].get_clip(Region(-(pad-boxsize)/2,-(pad-boxsize)/2,pad,pad))*frac # print a," avg ",frac,stack[0]["alt"] elif ii == -1: p = av #frac=0.5*(a-stack[-1]["alt"])/(90.0-stack[-1]["alt"])+.5 ## a bit wierd. At the ends (missing wedge) we use the average over all tilts. This could be improved #p=stack[-1].get_clip(Region(-(pad-boxsize)/2,-(pad-boxsize)/2,pad,pad))*(1.0-frac)+stack[0].get_clip(Region(-(pad-boxsize)/2,-(pad-boxsize)/2,pad,pad))*frac # print a," avg ",frac else: # We average slices in real space, producing a rotational 'smearing' effect frac = (a - stack[ii]["alt"]) / angstep p = stack[ii].get_clip( Region(-(pad - boxsize) / 2, -(pad - boxsize) / 2, pad, pad)) * (1.0 - frac) + stack[ii + 1].get_clip( Region(-(pad - boxsize) / 2, -(pad - boxsize) / 2, pad, pad)) * frac # print a,ii,ii+1,stack[ii]["alt"],frac xf = Transform({ "type": "eman", "alt": a, "az": -taxis, "phi": taxis }) p["xform.projection"] = xf if ri % 2 == 1: recon.determine_slice_agreement(p, xf, 1) else: recon.insert_slice(p, xf) ret = recon.finish() print "Done" ret = ret.get_clip( Region((pad - boxsize) / 2, (pad - boxsize) / 2, (pad - boxsize) / 2, boxsize, boxsize, boxsize)) ret.process_inplace("normalize.edgemean") # ret=ret.get_clip(Region((pad-boxsize)/2,(pad-boxsize)/2,(pad-boxsize)/2,boxsize,boxsize,boxsize)) return ret def reconstruct_ca(self, stack, angstep, mode=2): """Cylindrically averaged tomographic model, generally used for filling empty spaces. Returned volume is padded.""" print "Making CA" taxis = float(self.btiltaxisval.text()) boxsize = stack[0]["nx"] pad = Util.calc_best_fft_size(int(boxsize * 1.5)) # average all of the slices together av = stack[0].copy() for p in stack[1:]: av += p av.del_attr("xform.projection") p.mult(1.0 / len(stack)) av = av.get_clip( Region(-(pad - boxsize) / 2, -(pad - boxsize) / 2, pad, pad)) recon = Reconstructors.get("fourier", { "quiet": True, "sym": "c1", "x_in": pad, "y_in": pad }) recon.setup() for ri in range(3): if ri > 0: alt = -180.0 while (alt < 180.0): recon.determine_slice_agreement( av, Transform({ "type": "eman", "alt": alt, "az": -taxis, "phi": taxis }), 1) alt += angstep alt = -180.0 while (alt < 180.0): recon.insert_slice( av, Transform({ "type": "eman", "alt": alt, "az": -taxis, "phi": taxis })) alt += angstep ret = recon.finish() ret.process_inplace("normalize.edgemean") # ret=ret.get_clip(Region((pad-boxsize)/2,(pad-boxsize)/2,(pad-boxsize)/2,boxsize,boxsize,boxsize)) return ret def reconstruct(self, stack, angstep, mode=0, initmodel=None): """ Tomographic reconstruction of the current stack """ if initmodel != None: print "Using initial model" taxis = float(self.btiltaxisval.text()) boxsize = stack[0]["nx"] pad = good_size(int(boxsize * 1.5)) for i, p in enumerate(stack): p["xform.projection"] = Transform({ "type": "eman", "alt": (i - len(stack) / 2) * angstep, "az": -taxis, "phi": taxis }) recon = Reconstructors.get( "fourier", { "sym": "c1", "size": (pad, pad, pad), "mode": reconmodes[mode], "verbose": True }) if initmodel != None: recon.setup(initmodel, .01) else: recon.setup() scores = [] # First pass to assess qualities and normalizations for i, p in enumerate(stack): p2 = p.get_clip( Region(-(pad - boxsize) / 2, -(pad - boxsize) / 2, pad, pad)) p2 = recon.preprocess_slice(p2, p["xform.projection"]) recon.insert_slice(p2, p["xform.projection"], 1.0) print " %d \r" % i print "" # after building the model once we can assess how well everything agrees for p in stack: p2 = p.get_clip( Region(-(pad - boxsize) / 2, -(pad - boxsize) / 2, pad, pad)) p2 = recon.preprocess_slice(p2, p["xform.projection"]) recon.determine_slice_agreement(p2, p["xform.projection"], 1.0, True) scores.append((p2["reconstruct_absqual"], p2["reconstruct_norm"])) print " %d\t%1.3f \r" % (i, scores[-1][0]) print "" # clear out the first reconstruction (probably no longer necessary) # ret=recon.finish(True) # ret=None # setup for the second run if initmodel != None: recon.setup(initmodel, .01) else: recon.setup() thr = 0.7 * (scores[len(scores) / 2][0] + scores[len(scores) / 2 - 1][0] + scores[len(scores) / 2 + 1][0]) / 3 # this is rather arbitrary # First pass to assess qualities and normalizations for i, p in enumerate(stack): if scores[i][0] < thr: print "%d. %1.3f *" % (i, scores[i][0]) continue print "%d. %1.2f \t%1.3f\t%1.3f" % ( i, p["xform.projection"].get_rotation("eman")["alt"], scores[i][0], scores[i][1]) p2 = p.get_clip( Region(-(pad - boxsize) / 2, -(pad - boxsize) / 2, pad, pad)) p2 = recon.preprocess_slice(p2, p["xform.projection"]) p2.mult(scores[i][1]) recon.insert_slice(p2, p["xform.projection"], 1.0) # plot(scores) recon.set_param("savenorm", "norm.mrc") ret = recon.finish(True) ret = ret.get_clip( Region((pad - boxsize) / 2, (pad - boxsize) / 2, (pad - boxsize) / 2, boxsize, boxsize, boxsize)) # print "Quality: ",qual return ret def tilt_axis(self): ntilt = self.imageparm["nz"] sz = good_size(self.imageparm["nx"] / 2) while 1: av = None n = 0 for i in range(ntilt): refshape = self.tiltshapes[i].getShape() if refshape[4] <= sz / 2 or refshape[ 5] <= sz / 2 or self.imageparm["nx"] - refshape[ 4] <= sz / 2 or self.imageparm["ny"] - refshape[ 5] <= sz / 2: break img = EMData( self.imagefile, 0, False, Region(refshape[4] - sz / 2, refshape[5] - sz / 2, i, sz, sz, 1)) if self.invert: img.mult(-1.0) img.process_inplace("normalize.edgemean") if av == None: av = img else: av.add(img) n += 1 if n == ntilt: break sz /= 2 if sz < 32: return print "You may wish to center on a feature closer to the center of the image next time -> ", sz sz2 = good_size(sz + 128) av2 = av.get_clip(Region((sz - sz2) / 2, (sz - sz2) / 2, sz2, sz2)) av2.process_inplace("mask.zeroedgefill") av2.process_inplace("filter.flattenbackground", {"radius": 64}) av = av2.get_clip(Region((sz2 - sz) / 2, (sz2 - sz) / 2, sz, sz)) av.process_inplace("normalize.edgemean") av.process_inplace("mask.sharp", {"outer_radius": sz / 2 - 1}) # display(av) f = av.do_fft() d = f.calc_az_dist(360, -90.25, 0.5, 10.0, sz / 2 - 1) d = [(i, j * 0.5 - 90) for j, i in enumerate(d)] self.btiltaxisval.setText(str(max(d)[1])) # print max(d) # print min(d) # plot(d) def projection_align(self, angstep=2.0): """realign the current set of boxes using iterative projection matching""" taxis = float(self.btiltaxisval.text()) stack = self.get_boxed_stack() for i, p in enumerate(stack): ort = Transform({ "type": "eman", "alt": (i - len(stack) / 2) * angstep, "az": -taxis, "phi": taxis }) # is this right ? curshape = self.tiltshapes[i].getShape() # Read the reference at the user specified size, then pad it a bit ref = self.map3d.project("standard", ort) ref.process_inplace("filter.lowpass.gauss", {"cutoff_abs": .1}) ref.process_inplace("normalize.edgemean") ref = ref.get_clip( Region(-self.maxshift, -self.maxshift, ref["nx"] + self.maxshift * 2, ref["ny"] + self.maxshift * 2)) # when we read the alignment target, we pad with actual image data since the object will have moved trg = EMData( self.imagefile, 0, False, Region(curshape[4] - self.maxshift, curshape[5] - self.maxshift, i, curshape[6] - curshape[4] + self.maxshift * 2, curshape[7] - curshape[5] + self.maxshift * 2, 1)) trg.process_inplace("filter.lowpass.gauss", {"cutoff_abs": .1}) trg.process_inplace("normalize.edgemean") if self.invert: trg.mult(-1.0) aln = ref.align("translational", trg, { "intonly": 1, "maxshift": self.maxshift * 4 / 5 }) trans = aln["xform.align2d"].get_trans() print i, trans[0], trans[1] if i > len(stack) - 4: display([ref, trg, aln]) # if i==self.curtilt+3 : display((ref,trg,aln,ref.calc_ccf(trg))) self.tiltshapes[i].translate(trans[0], trans[1]) def find_boxes(self, mainshape): """Starting with a user selected box at the current tilt, search for the same shape in the entire tilt series""" if self.imagefile == None: return self.tiltshapes[self.curtilt] = mainshape lref = None for i in range(self.curtilt + 1, self.imageparm["nz"]): refshape = self.tiltshapes[i - 1].getShape() # Read the reference at the user specified size, then pad it a bit ref = EMData( self.imagefile, 0, False, Region(refshape[4], refshape[5], i - 1, refshape[6] - refshape[4], refshape[7] - refshape[5], 1)) ref.process_inplace("threshold.clampminmax.nsigma", {"nsigma": 4.0}) ref.process_inplace("filter.lowpass.gauss", {"cutoff_abs": .1}) ref.process_inplace("normalize.edgemean") ref = ref.get_clip( Region(-self.maxshift, -self.maxshift, ref["nx"] + self.maxshift * 2, ref["ny"] + self.maxshift * 2)) if lref != None and self.seqali: ref.add(lref) ref.process_inplace( "normalize.edgemean") # older images contribute less lref = ref # when we read the alignment target, we pad with actual image data since the object will have moved trg = EMData( self.imagefile, 0, False, Region(refshape[4] - self.maxshift, refshape[5] - self.maxshift, i, refshape[6] - refshape[4] + self.maxshift * 2, refshape[7] - refshape[5] + self.maxshift * 2, 1)) trg.process_inplace("threshold.clampminmax.nsigma", {"nsigma": 4.0}) trg.process_inplace("filter.lowpass.gauss", {"cutoff_abs": .1}) trg.process_inplace("normalize.edgemean") aln = ref.align("translational", trg, { "intonly": 1, "maxshift": self.maxshift * 4 / 5, "masked": 1 }) ref.write_image("dbug.hdf", -1) trg.write_image("dbug.hdf", -1) aln.write_image("dbug.hdf", -1) trans = aln["xform.align2d"].get_trans() # if i==self.curtilt+3 : display((ref,trg,aln,ref.calc_ccf(trg))) self.tiltshapes[i] = EMShape([ "rectpoint", .7, .2, 0, refshape[4] + trans[0], refshape[5] + trans[1], refshape[6] + trans[0], refshape[7] + trans[1], 1 ]) print i, trans[0], trans[1] lref = None for i in range(self.curtilt - 1, -1, -1): refshape = self.tiltshapes[i + 1].getShape() # Read the reference at the user specified size, then pad it a bit ref = EMData( self.imagefile, 0, False, Region(refshape[4], refshape[5], i + 1, refshape[6] - refshape[4], refshape[7] - refshape[5], 1)) ref.process_inplace("filter.lowpass.gauss", {"cutoff_abs": .1}) ref.process_inplace("normalize.edgemean") ref = ref.get_clip( Region(-self.maxshift, -self.maxshift, ref["nx"] + self.maxshift * 2, ref["ny"] + self.maxshift * 2)) if lref != None and self.seqali: ref.add(lref) ref.process_inplace("normalize.edgemean") lref = ref # when we read the alignment target, we pad with actual image data since the object will have moved trg = EMData( self.imagefile, 0, False, Region(refshape[4] - self.maxshift, refshape[5] - self.maxshift, i, refshape[6] - refshape[4] + self.maxshift * 2, refshape[7] - refshape[5] + self.maxshift * 2, 1)) trg.process_inplace("filter.lowpass.gauss", {"cutoff_abs": .1}) trg.process_inplace("normalize.edgemean") aln = ref.align("translational", trg, { "intonly": 1, "maxshift": self.maxshift * 4 / 5, "masked": 1 }) trans = aln["xform.align2d"].get_trans() if i == self.curtilt + 3: display((ref, trg, aln, ref.calc_ccf(trg))) self.tiltshapes[i] = EMShape([ "rectpoint", .7, .2, 0, refshape[4] + trans[0], refshape[5] + trans[1], refshape[6] + trans[0], refshape[7] + trans[1], 1 ]) print i, trans[0], trans[1] self.update_stack()
class EMTransformPanel: def __init__(self,target,parent): self.target = weakref.ref(target) self.parent = weakref.ref(parent) self.label_src = QtGui.QLabel(parent) self.label_src.setText('Rotation Convention') self.src = QtGui.QComboBox(parent) self.load_src_options(self.src) self.x_label = QtGui.QLabel() self.x_label.setText('x') self.x_trans = QtGui.QDoubleSpinBox(parent) self.x_trans.setMinimum(-10000) self.x_trans.setMaximum(10000) self.x_trans.setValue(0.0) self.y_label = QtGui.QLabel() self.y_label.setText('y') self.y_trans = QtGui.QDoubleSpinBox(parent) self.y_trans.setMinimum(-10000) self.y_trans.setMaximum(10000) self.y_trans.setValue(0.0) self.z_label = QtGui.QLabel() self.z_label.setText('z') self.z_trans = QtGui.QDoubleSpinBox(parent) self.z_trans.setMinimum(-10000) self.z_trans.setMaximum(10000) self.z_trans.setValue(0.0) self.az = ValSlider(parent,(-360.0,360.0),"az",-1) self.az.setObjectName("az") self.az.setValue(0.0) self.alt = ValSlider(parent,(-180.0,180.0),"alt",-1) self.alt.setObjectName("alt") self.alt.setValue(0.0) self.phi = ValSlider(parent,(-360.0,360.0),"phi",-1) self.phi.setObjectName("phi") self.phi.setValue(0.0) self.scale = ValSlider(parent,(0.01,30.0),"Zoom:") self.scale.setObjectName("scale") self.scale.setValue(1.0) self.n3_showing = False self.current_src = "eman" QtCore.QObject.connect(self.az, QtCore.SIGNAL("valueChanged"), self.slider_rotate) QtCore.QObject.connect(self.alt, QtCore.SIGNAL("valueChanged"), self.slider_rotate) QtCore.QObject.connect(self.phi, QtCore.SIGNAL("valueChanged"), self.slider_rotate) QtCore.QObject.connect(self.src, QtCore.SIGNAL("currentIndexChanged(QString)"), self.set_src) QtCore.QObject.connect(self.scale, QtCore.SIGNAL("valueChanged"), self.target().set_scale) QtCore.QObject.connect(self.x_trans, QtCore.SIGNAL("valueChanged(double)"), self.target().set_cam_x) QtCore.QObject.connect(self.y_trans, QtCore.SIGNAL("valueChanged(double)"), self.target().set_cam_y) QtCore.QObject.connect(self.z_trans, QtCore.SIGNAL("valueChanged(double)"), self.target().set_cam_z) def set_defaults(self): self.x_trans.setValue(0.0) self.y_trans.setValue(0.0) self.z_trans.setValue(0.0) self.scale.setValue(1.0) self.az.setValue(0.0) self.alt.setValue(0.0) self.phi.setValue(0.0) def slider_rotate(self): self.target().load_rotation(self.get_current_rotation()) def get_current_rotation(self): convention = self.src.currentText() rot = {} if ( self.current_src == "spin" ): rot[self.az.getLabel()] = self.az.getValue() n1 = self.alt.getValue() n2 = self.phi.getValue() n3 = self.n3.getValue() norm = sqrt(n1*n1 + n2*n2 + n3*n3) n1 /= norm n2 /= norm n3 /= norm rot[self.alt.getLabel()] = n1 rot[self.phi.getLabel()] = n2 rot[self.n3.getLabel()] = n3 else: rot[self.az.getLabel()] = self.az.getValue() rot[self.alt.getLabel()] = self.alt.getValue() rot[self.phi.getLabel()] = self.phi.getValue() rot["type"] = self.current_src return Transform(rot) def addWidgets(self,target): target.addWidget(self.scale) self.hbl_trans = QtGui.QHBoxLayout() self.hbl_trans.setMargin(0) self.hbl_trans.setSpacing(6) self.hbl_trans.setObjectName("Trans") self.hbl_trans.addWidget(self.x_label) self.hbl_trans.addWidget(self.x_trans) self.hbl_trans.addWidget(self.y_label) self.hbl_trans.addWidget(self.y_trans) self.hbl_trans.addWidget(self.z_label) self.hbl_trans.addWidget(self.z_trans) target.addLayout(self.hbl_trans) self.hbl_src = QtGui.QHBoxLayout() self.hbl_src.setMargin(0) self.hbl_src.setSpacing(6) self.hbl_src.setObjectName("hbl") self.hbl_src.addWidget(self.label_src) self.hbl_src.addWidget(self.src) target.addLayout(self.hbl_src) target.addWidget(self.az) target.addWidget(self.alt) target.addWidget(self.phi) def set_src(self, val): t3d = self.get_current_rotation() if (self.n3_showing) : self.parent().get_transform_layout().removeWidget(self.n3) self.n3.deleteLater() self.n3_showing = False self.az.setRange(-360,360) self.alt.setRange(-180,180) self.phi.setRange(-360,660) if ( self.src_map[str(val)] == "spider" ): self.az.setLabel('phi') self.alt.setLabel('theta') self.phi.setLabel('psi') elif ( self.src_map[str(val)] == "eman" ): self.az.setLabel('az') self.alt.setLabel('alt') self.phi.setLabel('phi') elif ( self.src_map[str(val)] == "imagic"): self.az.setLabel('alpha') self.alt.setLabel('beta') self.phi.setLabel('gamma') elif ( self.src_map[str(val)] == "xyz"): self.az.setLabel('xtilt') self.alt.setLabel('ytilt') self.phi.setLabel('ztilt') elif ( self.src_map[str(val)] == "mrc" ): self.az.setLabel('phi') self.alt.setLabel('theta') self.phi.setLabel('omega') elif ( self.src_map[str(val)] == "spin" ): self.az.setLabel('Omega') self.alt.setRange(-1,1) self.phi.setRange(-1,1) self.alt.setLabel('n1') self.phi.setLabel('n2') self.n3 = ValSlider(self.parent(),(-360.0,360.0),"n3",-1) self.n3.setRange(-1,1) self.n3.setObjectName("n3") self.parent().get_transform_layout().addWidget(self.n3) QtCore.QObject.connect(self.n3, QtCore.SIGNAL("valueChanged"), self.slider_rotate) self.n3_showing = True self.current_src = self.src_map[str(val)] self.update_rotations(t3d) def load_src_options(self,widgit): self.load_src() for i in self.src_strings: widgit.addItem(i) def load_src(self): # supported_rot_conventions src_flags = [] src_flags.append("eman") src_flags.append("spider") src_flags.append("imagic") src_flags.append("mrc") src_flags.append("spin") src_flags.append("xyz") self.src_strings = [] self.src_map = {} for i in src_flags: self.src_strings.append(str(i)) self.src_map[str(i)] = i def update_rotations(self,t3d): rot = t3d.get_rotation(self.src_map[str(self.src.itemText(self.src.currentIndex()))]) convention = self.src.currentText() if ( self.src_map[str(convention)] == "spin" ): self.n3.setValue(rot[self.n3.getLabel()],True) self.az.setValue(rot[self.az.getLabel()],True) self.alt.setValue(rot[self.alt.getLabel()],True) self.phi.setValue(rot[self.phi.getLabel()],True) def set_scale(self,newscale): self.scale.setValue(newscale) def set_xy_trans(self, x, y): self.x_trans.setValue(x) self.y_trans.setValue(y) def set_xyz_trans(self, x, y,z): self.x_trans.setValue(x) self.y_trans.setValue(y) self.z_trans.setValue(z)
class EMVolumeInspector(QtGui.QWidget): def __init__(self,target) : QtGui.QWidget.__init__(self,None) self.target=weakref.ref(target) self.setWindowIcon(QtGui.QIcon(get_image_directory() +"desktop.png")) self.rotation_sliders = EMTransformPanel(target,self) self.vbl = QtGui.QVBoxLayout(self) self.vbl.setMargin(0) self.vbl.setSpacing(6) self.vbl.setObjectName("vbl") self.hbl = QtGui.QHBoxLayout() self.hbl.setMargin(0) self.hbl.setSpacing(6) self.hbl.setObjectName("hbl") self.vbl.addLayout(self.hbl) self.hist = ImgHistogram(self) self.hist.setObjectName("hist") self.hbl.addWidget(self.hist) self.vbl2 = QtGui.QVBoxLayout() self.vbl2.setMargin(0) self.vbl2.setSpacing(6) self.vbl2.setObjectName("vbl2") self.hbl.addLayout(self.vbl2) self.cubetog = QtGui.QPushButton("Cube") self.cubetog.setCheckable(1) self.vbl2.addWidget(self.cubetog) self.defaults = QtGui.QPushButton("Defaults") self.vbl2.addWidget(self.defaults) self.tabwidget = QtGui.QTabWidget() self.tabwidget.addTab(self.get_main_tab(), "Main") self.tabwidget.addTab(self.get_GL_tab(),"GL") self.vbl.addWidget(self.tabwidget) self.n3_showing = False QtCore.QObject.connect(self.contrast, QtCore.SIGNAL("valueChanged"), target.set_contrast) QtCore.QObject.connect(self.glcontrast, QtCore.SIGNAL("valueChanged"), target.set_GL_contrast) QtCore.QObject.connect(self.glbrightness, QtCore.SIGNAL("valueChanged"), target.set_GL_brightness) QtCore.QObject.connect(self.bright, QtCore.SIGNAL("valueChanged"), target.set_brightness) QtCore.QObject.connect(self.cubetog, QtCore.SIGNAL("toggled(bool)"), target.toggle_cube) QtCore.QObject.connect(self.defaults, QtCore.SIGNAL("clicked(bool)"), self.set_defaults) QtCore.QObject.connect(self.smp, QtCore.SIGNAL("valueChanged(int)"), target.set_texture_sample) def update_rotations(self,t3d): self.rotation_sliders.update_rotations(t3d) def set_scale(self,val): self.rotation_sliders.set_scale(val) def set_xy_trans(self, x, y): self.rotation_sliders.set_xy_trans(x,y) def set_xyz_trans(self,x,y,z): self.rotation_sliders.set_xyz_trans(x,y,z) def get_transform_layout(self): return self.maintab.vbl def get_GL_tab(self): self.gltab = QtGui.QWidget() gltab = self.gltab gltab.vbl = QtGui.QVBoxLayout(self.gltab ) gltab.vbl.setMargin(0) gltab.vbl.setSpacing(6) gltab.vbl.setObjectName("Main") self.glcontrast = ValSlider(gltab,(1.0,5.0),"GLShd:") self.glcontrast.setObjectName("GLShade") self.glcontrast.setValue(1.0) gltab.vbl.addWidget(self.glcontrast) self.glbrightness = ValSlider(gltab,(-1.0,0.0),"GLBst:") self.glbrightness.setObjectName("GLBoost") self.glbrightness.setValue(0.1) self.glbrightness.setValue(0.0) gltab.vbl.addWidget(self.glbrightness) return gltab def get_main_tab(self): self.maintab = QtGui.QWidget() maintab = self.maintab maintab.vbl = QtGui.QVBoxLayout(self.maintab) maintab.vbl.setMargin(0) maintab.vbl.setSpacing(6) maintab.vbl.setObjectName("Main") self.contrast = ValSlider(maintab,(0.0,20.0),"Cont:") self.contrast.setObjectName("contrast") self.contrast.setValue(1.0) maintab.vbl.addWidget(self.contrast) self.bright = ValSlider(maintab,(-5.0,5.0),"Brt:") self.bright.setObjectName("bright") self.bright.setValue(0.1) self.bright.setValue(0.0) maintab.vbl.addWidget(self.bright) self.hbl_smp = QtGui.QHBoxLayout() self.hbl_smp.setMargin(0) self.hbl_smp.setSpacing(6) self.hbl_smp.setObjectName("Texture Oversampling") maintab.vbl.addLayout(self.hbl_smp) self.smp_label = QtGui.QLabel() self.smp_label.setText('Texture Oversampling') self.hbl_smp.addWidget(self.smp_label) self.smp = QtGui.QSpinBox(maintab) self.smp.setMaximum(10) self.smp.setMinimum(1) self.smp.setValue(1) self.hbl_smp.addWidget(self.smp) self.lowlim=0 self.highlim=1.0 self.busy=0 self.rotation_sliders.addWidgets(maintab.vbl) return maintab def set_defaults(self): self.contrast.setValue(1.0) self.bright.setValue(0.0) self.glcontrast.setValue(1.0) self.glbrightness.setValue(0.0) self.rotation_sliders.set_defaults() def slider_rotate(self): self.target().load_rotation(self.get_current_rotation()) def set_hist(self,hist,minden,maxden): self.hist.set_data(hist,minden,maxden)
class EMTransformPanel: def __init__(self, target, parent): self.target = weakref.ref(target) self.parent = weakref.ref(parent) self.label_src = QtGui.QLabel(parent) self.label_src.setText('Rotation Convention') self.src = QtGui.QComboBox(parent) self.load_src_options(self.src) self.x_label = QtGui.QLabel() self.x_label.setText('x') self.x_trans = QtGui.QDoubleSpinBox(parent) self.x_trans.setMinimum(-10000) self.x_trans.setMaximum(10000) self.x_trans.setValue(0.0) self.y_label = QtGui.QLabel() self.y_label.setText('y') self.y_trans = QtGui.QDoubleSpinBox(parent) self.y_trans.setMinimum(-10000) self.y_trans.setMaximum(10000) self.y_trans.setValue(0.0) self.z_label = QtGui.QLabel() self.z_label.setText('z') self.z_trans = QtGui.QDoubleSpinBox(parent) self.z_trans.setMinimum(-10000) self.z_trans.setMaximum(10000) self.z_trans.setValue(0.0) self.az = ValSlider(parent, (-360.0, 360.0), "az", -1) self.az.setObjectName("az") self.az.setValue(0.0) self.alt = ValSlider(parent, (-180.0, 180.0), "alt", -1) self.alt.setObjectName("alt") self.alt.setValue(0.0) self.phi = ValSlider(parent, (-360.0, 360.0), "phi", -1) self.phi.setObjectName("phi") self.phi.setValue(0.0) self.scale = ValSlider(parent, (0.01, 30.0), "Zoom:") self.scale.setObjectName("scale") self.scale.setValue(1.0) self.n3_showing = False self.current_src = "eman" QtCore.QObject.connect(self.az, QtCore.SIGNAL("valueChanged"), self.slider_rotate) QtCore.QObject.connect(self.alt, QtCore.SIGNAL("valueChanged"), self.slider_rotate) QtCore.QObject.connect(self.phi, QtCore.SIGNAL("valueChanged"), self.slider_rotate) QtCore.QObject.connect(self.src, QtCore.SIGNAL("currentIndexChanged(QString)"), self.set_src) QtCore.QObject.connect(self.scale, QtCore.SIGNAL("valueChanged"), self.target().set_scale) QtCore.QObject.connect(self.x_trans, QtCore.SIGNAL("valueChanged(double)"), self.target().set_cam_x) QtCore.QObject.connect(self.y_trans, QtCore.SIGNAL("valueChanged(double)"), self.target().set_cam_y) QtCore.QObject.connect(self.z_trans, QtCore.SIGNAL("valueChanged(double)"), self.target().set_cam_z) def set_defaults(self): self.x_trans.setValue(0.0) self.y_trans.setValue(0.0) self.z_trans.setValue(0.0) self.scale.setValue(1.0) self.az.setValue(0.0) self.alt.setValue(0.0) self.phi.setValue(0.0) def slider_rotate(self): self.target().load_rotation(self.get_current_rotation()) def get_current_rotation(self): convention = self.src.currentText() rot = {} if (self.current_src == "spin"): rot[self.az.getLabel()] = self.az.getValue() n1 = self.alt.getValue() n2 = self.phi.getValue() n3 = self.n3.getValue() norm = sqrt(n1 * n1 + n2 * n2 + n3 * n3) n1 /= norm n2 /= norm n3 /= norm rot[self.alt.getLabel()] = n1 rot[self.phi.getLabel()] = n2 rot[self.n3.getLabel()] = n3 else: rot[self.az.getLabel()] = self.az.getValue() rot[self.alt.getLabel()] = self.alt.getValue() rot[self.phi.getLabel()] = self.phi.getValue() rot["type"] = self.current_src return Transform(rot) def addWidgets(self, target): target.addWidget(self.scale) self.hbl_trans = QtGui.QHBoxLayout() self.hbl_trans.setMargin(0) self.hbl_trans.setSpacing(6) self.hbl_trans.setObjectName("Trans") self.hbl_trans.addWidget(self.x_label) self.hbl_trans.addWidget(self.x_trans) self.hbl_trans.addWidget(self.y_label) self.hbl_trans.addWidget(self.y_trans) self.hbl_trans.addWidget(self.z_label) self.hbl_trans.addWidget(self.z_trans) target.addLayout(self.hbl_trans) self.hbl_src = QtGui.QHBoxLayout() self.hbl_src.setMargin(0) self.hbl_src.setSpacing(6) self.hbl_src.setObjectName("hbl") self.hbl_src.addWidget(self.label_src) self.hbl_src.addWidget(self.src) target.addLayout(self.hbl_src) target.addWidget(self.az) target.addWidget(self.alt) target.addWidget(self.phi) def set_src(self, val): t3d = self.get_current_rotation() if (self.n3_showing): self.parent().get_transform_layout().removeWidget(self.n3) self.n3.deleteLater() self.n3_showing = False self.az.setRange(-360, 360) self.alt.setRange(-180, 180) self.phi.setRange(-360, 660) if (self.src_map[str(val)] == "spider"): self.az.setLabel('phi') self.alt.setLabel('theta') self.phi.setLabel('psi') elif (self.src_map[str(val)] == "eman"): self.az.setLabel('az') self.alt.setLabel('alt') self.phi.setLabel('phi') elif (self.src_map[str(val)] == "imagic"): self.az.setLabel('alpha') self.alt.setLabel('beta') self.phi.setLabel('gamma') elif (self.src_map[str(val)] == "xyz"): self.az.setLabel('xtilt') self.alt.setLabel('ytilt') self.phi.setLabel('ztilt') elif (self.src_map[str(val)] == "mrc"): self.az.setLabel('phi') self.alt.setLabel('theta') self.phi.setLabel('omega') elif (self.src_map[str(val)] == "spin"): self.az.setLabel('omega') self.alt.setRange(-1, 1) self.phi.setRange(-1, 1) self.alt.setLabel('n1') self.phi.setLabel('n2') self.n3 = ValSlider(self.parent(), (-360.0, 360.0), "n3", -1) self.n3.setRange(-1, 1) self.n3.setObjectName("n3") self.parent().get_transform_layout().addWidget(self.n3) QtCore.QObject.connect(self.n3, QtCore.SIGNAL("valueChanged"), self.slider_rotate) self.n3_showing = True self.current_src = self.src_map[str(val)] self.update_rotations(t3d) def load_src_options(self, widgit): self.load_src() for i in self.src_strings: widgit.addItem(i) def load_src(self): # supported_rot_conventions src_flags = [] src_flags.append("eman") src_flags.append("spider") src_flags.append("imagic") src_flags.append("mrc") src_flags.append("spin") src_flags.append("xyz") self.src_strings = [] self.src_map = {} for i in src_flags: self.src_strings.append(str(i)) self.src_map[str(i)] = i def update_rotations(self, t3d): rot = t3d.get_rotation(self.src_map[str( self.src.itemText(self.src.currentIndex()))]) convention = self.src.currentText() if (self.src_map[str(convention)] == "spin"): self.n3.setValue(rot[self.n3.getLabel()], True) self.az.setValue(rot[self.az.getLabel()], True) self.alt.setValue(rot[self.alt.getLabel()], True) self.phi.setValue(rot[self.phi.getLabel()], True) def set_scale(self, newscale): self.scale.setValue(newscale) def set_xy_trans(self, x, y): self.x_trans.setValue(x) self.y_trans.setValue(y) def set_xyz_trans(self, x, y, z): self.x_trans.setValue(x) self.y_trans.setValue(y) self.z_trans.setValue(z)
def get_format_tab(self): self.formattab = QtGui.QWidget() formattab = self.formattab formattab.vbl = QtGui.QVBoxLayout(self.formattab) formattab.vbl.setMargin(0) formattab.vbl.setSpacing(6) formattab.vbl.setObjectName("Format") self.hbl1 = QtGui.QHBoxLayout() self.text = QtGui.QLineEdit() self.text.setText("hello world") text_label = QtGui.QLabel("Enter Text:",self) text_label.setToolTip("Enters quotes to evaluate new line e.g. \"hello\\nworld\". Evaluates numerical expressions e.g. 9*9 (with out quotes)") self.hbl1.addWidget(text_label) self.hbl1.addWidget(self.text) formattab.vbl.addLayout(self.hbl1) self.hbl1 = QtGui.QHBoxLayout() self.Dfont = QtGui.QComboBox() for k in self.l: self.Dfont.addItem(k) self.hbl1.addWidget(QtGui.QLabel("Fonts:",self)) self.hbl1.addWidget(self.Dfont) formattab.vbl.addLayout(self.hbl1) self.hbl1 = QtGui.QHBoxLayout() self.tsize = QtGui.QSpinBox() self.tsize.setRange(0,500) self.tsize.setValue(32) self.hbl1.addWidget(QtGui.QLabel("Size:",self),Qt.AlignLeft) self.hbl1.addWidget(self.tsize,Qt.AlignRight) self.combo = QtGui.QComboBox() self.items = ["Extrude","Pixmap","Bitmap","Polygon","Outline","Texture"] for k in self.items: self.combo.addItem(k) self.hbl1.addWidget(QtGui.QLabel("Style:",self),Qt.AlignLeft) self.hbl1.addWidget(self.combo,Qt.AlignRight) formattab.vbl.addLayout(self.hbl1) self.hbl1 = QtGui.QHBoxLayout() self.lspacing = ValSlider(self,(-100.0,100.0),"Line Spacing:") self.lspacing.setObjectName("Length") self.lspacing.setValue(75.0) self.lspacing.setEnabled(False) self.hbl1.addWidget(self.lspacing) formattab.vbl.addLayout(self.hbl1) self.hbl1 = QtGui.QHBoxLayout() self.length = ValSlider(self,(0.0,500.0),"Length:") self.length.setObjectName("Length") self.length.setValue(75.0) self.hbl1.addWidget(self.length) formattab.vbl.addLayout(self.hbl1) self.hbl1 = QtGui.QHBoxLayout() self.cbb = QtGui.QComboBox() self.hbl1.addWidget(QtGui.QLabel("Material:",self)) self.hbl1.addWidget(self.cbb) formattab.vbl.addLayout(self.hbl1) self.hbl1 = QtGui.QHBoxLayout() self.bgtabwidget = QtGui.QTabWidget() self.maintab = None self.bgtabwidget.addTab(self.get_bgRGB_tab(), "BG RGB") self.hbl1.addWidget(self.bgtabwidget) self.n3_showing = False formattab.vbl.addLayout(self.hbl1) return formattab
class EMGLPlotInspector(QtGui.QWidget): def __init__(self,target) : QtGui.QWidget.__init__(self,None) self.target=target self.vbl = QtGui.QVBoxLayout(self) self.vbl.setMargin(0) self.vbl.setSpacing(6) self.vbl.setObjectName("vbl") self.hbl = QtGui.QHBoxLayout() self.hbl.setMargin(0) self.hbl.setSpacing(6) self.hbl.setObjectName("hbl") self.vbl.addLayout(self.hbl) self.hist = ImgHistogram(self) self.hist.setObjectName("hist") self.hbl.addWidget(self.hist) self.vbl2 = QtGui.QVBoxLayout() self.vbl2.setMargin(0) self.vbl2.setSpacing(6) self.vbl2.setObjectName("vbl2") self.hbl.addLayout(self.vbl2) self.wiretog = QtGui.QPushButton("Wire") self.wiretog.setCheckable(1) self.vbl2.addWidget(self.wiretog) self.lighttog = QtGui.QPushButton("Light") self.lighttog.setCheckable(1) self.vbl2.addWidget(self.lighttog) self.tabwidget = QtGui.QTabWidget() self.maintab = None self.tabwidget.addTab(self.get_main_tab(), "Main") self.tabwidget.addTab(self.get_GL_tab(),"GL") self.vbl.addWidget(self.tabwidget) self.n3_showing = False QtCore.QObject.connect(self.scale, QtCore.SIGNAL("valueChanged"), target.set_scale) QtCore.QObject.connect(self.az, QtCore.SIGNAL("valueChanged"), self.slider_rotate) QtCore.QObject.connect(self.alt, QtCore.SIGNAL("valueChanged"), self.slider_rotate) QtCore.QObject.connect(self.phi, QtCore.SIGNAL("valueChanged"), self.slider_rotate) QtCore.QObject.connect(self.cbb, QtCore.SIGNAL("currentIndexChanged(QString)"), target.setColor) QtCore.QObject.connect(self.src, QtCore.SIGNAL("currentIndexChanged(QString)"), self.set_src) QtCore.QObject.connect(self.x_trans, QtCore.SIGNAL("valueChanged(double)"), target.set_cam_x) QtCore.QObject.connect(self.y_trans, QtCore.SIGNAL("valueChanged(double)"), target.set_cam_y) QtCore.QObject.connect(self.z_trans, QtCore.SIGNAL("valueChanged(double)"), target.set_cam_z) QtCore.QObject.connect(self.wiretog, QtCore.SIGNAL("toggled(bool)"), target.toggle_wire) QtCore.QObject.connect(self.lighttog, QtCore.SIGNAL("toggled(bool)"), target.toggle_light) QtCore.QObject.connect(self.glcontrast, QtCore.SIGNAL("valueChanged"), target.set_GL_contrast) QtCore.QObject.connect(self.glbrightness, QtCore.SIGNAL("valueChanged"), target.set_GL_brightness) def get_GL_tab(self): self.gltab = QtGui.QWidget() gltab = self.gltab gltab.vbl = QtGui.QVBoxLayout(self.gltab ) gltab.vbl.setMargin(0) gltab.vbl.setSpacing(6) gltab.vbl.setObjectName("Main") self.glcontrast = ValSlider(gltab,(1.0,5.0),"GLShd:") self.glcontrast.setObjectName("GLShade") self.glcontrast.setValue(1.0) gltab.vbl.addWidget(self.glcontrast) self.glbrightness = ValSlider(gltab,(-1.0,0.0),"GLBst:") self.glbrightness.setObjectName("GLBoost") self.glbrightness.setValue(0.1) self.glbrightness.setValue(0.0) gltab.vbl.addWidget(self.glbrightness) return gltab def get_main_tab(self): if ( self.maintab == None ): self.maintab = QtGui.QWidget() maintab = self.maintab maintab.vbl = QtGui.QVBoxLayout(self.maintab) maintab.vbl.setMargin(0) maintab.vbl.setSpacing(6) maintab.vbl.setObjectName("Main") self.scale = ValSlider(maintab,(0.01,30.0),"Zoom:") self.scale.setObjectName("scale") self.scale.setValue(1.0) maintab.vbl.addWidget(self.scale) self.hbl_color = QtGui.QHBoxLayout() self.hbl_color.setMargin(0) self.hbl_color.setSpacing(6) self.hbl_color.setObjectName("Material") maintab.vbl.addLayout(self.hbl_color) self.color_label = QtGui.QLabel() self.color_label.setText('Material') self.hbl_color.addWidget(self.color_label) self.cbb = QtGui.QComboBox(maintab) self.hbl_color.addWidget(self.cbb) self.hbl_trans = QtGui.QHBoxLayout() self.hbl_trans.setMargin(0) self.hbl_trans.setSpacing(6) self.hbl_trans.setObjectName("Trans") maintab.vbl.addLayout(self.hbl_trans) self.x_label = QtGui.QLabel() self.x_label.setText('x') self.hbl_trans.addWidget(self.x_label) self.x_trans = QtGui.QDoubleSpinBox(self) self.x_trans.setMinimum(-10000) self.x_trans.setMaximum(10000) self.x_trans.setValue(0.0) self.hbl_trans.addWidget(self.x_trans) self.y_label = QtGui.QLabel() self.y_label.setText('y') self.hbl_trans.addWidget(self.y_label) self.y_trans = QtGui.QDoubleSpinBox(maintab) self.y_trans.setMinimum(-10000) self.y_trans.setMaximum(10000) self.y_trans.setValue(0.0) self.hbl_trans.addWidget(self.y_trans) self.z_label = QtGui.QLabel() self.z_label.setText('z') self.hbl_trans.addWidget(self.z_label) self.z_trans = QtGui.QDoubleSpinBox(maintab) self.z_trans.setMinimum(-10000) self.z_trans.setMaximum(10000) self.z_trans.setValue(0.0) self.hbl_trans.addWidget(self.z_trans) self.hbl_src = QtGui.QHBoxLayout() self.hbl_src.setMargin(0) self.hbl_src.setSpacing(6) self.hbl_src.setObjectName("hbl") maintab.vbl.addLayout(self.hbl_src) self.label_src = QtGui.QLabel() self.label_src.setText('Rotation Convention') self.hbl_src.addWidget(self.label_src) self.src = QtGui.QComboBox(maintab) self.load_src_options(self.src) self.hbl_src.addWidget(self.src) # set default value -1 ensures that the val slider is updated the first time it is created self.az = ValSlider(self,(-360.0,360.0),"az",-1) self.az.setObjectName("az") maintab.vbl.addWidget(self.az) self.alt = ValSlider(self,(-180.0,180.0),"alt",-1) self.alt.setObjectName("alt") maintab.vbl.addWidget(self.alt) self.phi = ValSlider(self,(-360.0,360.0),"phi",-1) self.phi.setObjectName("phi") maintab.vbl.addWidget(self.phi) self.current_src = EULER_EMAN return self.maintab def set_xy_trans(self, x, y): self.x_trans.setValue(x) self.y_trans.setValue(y) def set_translate_scale(self, xscale,yscale,zscale): self.x_trans.setSingleStep(xscale) self.y_trans.setSingleStep(yscale) self.z_trans.setSingleStep(zscale) def update_rotations(self,t3d): rot = t3d.get_rotation(self.src_map[str(self.src.itemText(self.src.currentIndex()))]) convention = self.src.currentText() if ( self.src_map[str(convention)] == EULER_SPIN ): self.n3.setValue(rot[self.n3.getLabel()],True) self.az.setValue(rot[self.az.getLabel()],True) self.alt.setValue(rot[self.alt.getLabel()],True) self.phi.setValue(rot[self.phi.getLabel()],True) def slider_rotate(self): self.target.load_rotation(self.get_current_rotation()) def get_current_rotation(self): convention = self.src.currentText() rot = {} if ( self.current_src == EULER_SPIN ): rot[self.az.getLabel()] = self.az.getValue() n1 = self.alt.getValue() n2 = self.phi.getValue() n3 = self.n3.getValue() norm = sqrt(n1*n1 + n2*n2 + n3*n3) n1 /= norm n2 /= norm n3 /= norm rot[self.alt.getLabel()] = n1 rot[self.phi.getLabel()] = n2 rot[self.n3.getLabel()] = n3 else: rot[self.az.getLabel()] = self.az.getValue() rot[self.alt.getLabel()] = self.alt.getValue() rot[self.phi.getLabel()] = self.phi.getValue() return Transform3D(self.current_src, rot) def set_src(self, val): t3d = self.get_current_rotation() if (self.n3_showing) : self.vbl.removeWidget(self.n3) self.n3.deleteLater() self.n3_showing = False self.az.setRange(-360,360) self.alt.setRange(-180,180) self.phi.setRange(-360,660) if ( self.src_map[str(val)] == EULER_SPIDER ): self.az.setLabel('phi') self.alt.setLabel('theta') self.phi.setLabel('psi') elif ( self.src_map[str(val)] == EULER_EMAN ): self.az.setLabel('az') self.alt.setLabel('alt') self.phi.setLabel('phi') elif ( self.src_map[str(val)] == EULER_IMAGIC ): self.az.setLabel('alpha') self.alt.setLabel('beta') self.phi.setLabel('gamma') elif ( self.src_map[str(val)] == EULER_XYZ ): self.az.setLabel('xtilt') self.alt.setLabel('ytilt') self.phi.setLabel('ztilt') elif ( self.src_map[str(val)] == EULER_MRC ): self.az.setLabel('phi') self.alt.setLabel('theta') self.phi.setLabel('omega') elif ( self.src_map[str(val)] == EULER_SPIN ): self.az.setLabel('Omega') self.alt.setRange(-1,1) self.phi.setRange(-1,1) self.alt.setLabel('n1') self.phi.setLabel('n2') self.n3 = ValSlider(self,(-360.0,360.0),"n3",-1) self.n3.setRange(-1,1) self.n3.setObjectName("n3") self.vbl.addWidget(self.n3) QtCore.QObject.connect(self.n3, QtCore.SIGNAL("valueChanged"), self.slider_rotate) self.n3_showing = True self.current_src = self.src_map[str(val)] self.update_rotations(t3d) def load_src_options(self,widgit): self.load_src() for i in self.src_strings: widgit.addItem(i) # read src as 'supported rotation conventions' def load_src(self): # supported_rot_conventions src_flags = [] src_flags.append(EULER_EMAN) src_flags.append(EULER_SPIDER) src_flags.append(EULER_IMAGIC) src_flags.append(EULER_MRC) src_flags.append(EULER_SPIN) src_flags.append(EULER_XYZ) self.src_strings = [] self.src_map = {} for i in src_flags: self.src_strings.append(str(i)) self.src_map[str(i)] = i def setColors(self,colors,current_color): a = 0 for i in colors: self.cbb.addItem(i) if ( i == current_color): self.cbb.setCurrentIndex(a) a += 1 def set_scale(self,newscale): self.scale.setValue(newscale)
class GUIctf(QtGui.QWidget): def __init__(self, application, data): """Implements the CTF fitting dialog using various EMImage and EMPlot2D widgets 'data' is a list of (filename,ctf,im_1d,bg_1d,im_2d,bg_2d) """ try: from emimage2d import EMImage2DWidget except: print "Cannot import EMAN image GUI objects (EMImage2DWidget)" sys.exit(1) try: from emplot2d import EMPlot2DWidget except: print "Cannot import EMAN plot GUI objects (is matplotlib installed?)" sys.exit(1) self.app = weakref.ref(application) QtGui.QWidget.__init__(self, None) self.setWindowIcon(QtGui.QIcon(get_image_directory() + "ctf.png")) self.data = data self.curset = 0 self.plotmode = 0 self.guiim = EMImage2DWidget(application=self.app()) self.guiplot = EMPlot2DWidget(application=self.app()) self.guiim.connect(self.guiim, QtCore.SIGNAL("mousedown"), self.imgmousedown) self.guiim.connect(self.guiim, QtCore.SIGNAL("mousedrag"), self.imgmousedrag) self.guiim.connect(self.guiim, QtCore.SIGNAL("mouseup"), self.imgmouseup) self.guiplot.connect(self.guiplot, QtCore.SIGNAL("mousedown"), self.plotmousedown) self.guiim.mmode = "app" # This object is itself a widget we need to set up self.hbl = QtGui.QHBoxLayout(self) self.hbl.setMargin(0) self.hbl.setSpacing(6) self.hbl.setObjectName("hbl") # plot list and plot mode combobox self.vbl2 = QtGui.QVBoxLayout() self.setlist = QtGui.QListWidget(self) self.setlist.setSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Expanding) self.vbl2.addWidget(self.setlist) self.splotmode = QtGui.QComboBox(self) self.splotmode.addItem("Bgsub & fit") self.splotmode.addItem("Ptcl & BG power") self.splotmode.addItem("SNR") self.splotmode.addItem("Smoothed SNR") self.splotmode.addItem("Integrated SNR") self.splotmode.addItem("Total CTF") self.vbl2.addWidget(self.splotmode) self.hbl.addLayout(self.vbl2) # ValSliders for CTF parameters self.vbl = QtGui.QVBoxLayout() self.vbl.setMargin(0) self.vbl.setSpacing(6) self.vbl.setObjectName("vbl") self.hbl.addLayout(self.vbl) #self.samp = ValSlider(self,(0,5.0),"Amp:",0) #self.vbl.addWidget(self.samp) self.sdefocus = ValSlider(self, (0, 5), "Defocus:", 0, 90) self.vbl.addWidget(self.sdefocus) self.sbfactor = ValSlider(self, (0, 1600), "B factor:", 0, 90) self.vbl.addWidget(self.sbfactor) self.sampcont = ValSlider(self, (0, 100), "% AC", 0, 90) self.vbl.addWidget(self.sampcont) # self.sapix=ValSlider(self,(.2,10),"A/Pix:",2,90) # self.vbl.addWidget(self.sapix) self.svoltage = ValSlider(self, (0, 500), "Voltage (kV):", 0, 90) self.vbl.addWidget(self.svoltage) self.scs = ValSlider(self, (0, 5), "Cs (mm):", 0, 90) self.vbl.addWidget(self.scs) self.hbl_buttons = QtGui.QHBoxLayout() self.saveparms = QtGui.QPushButton("Save parms") self.recallparms = QtGui.QPushButton("Recall") self.output = QtGui.QPushButton("Output") self.hbl_buttons.addWidget(self.saveparms) self.hbl_buttons.addWidget(self.recallparms) self.hbl_buttons2 = QtGui.QHBoxLayout() self.hbl_buttons2.addWidget(self.output) self.vbl.addLayout(self.hbl_buttons) self.vbl.addLayout(self.hbl_buttons2) QtCore.QObject.connect(self.sdefocus, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.sbfactor, QtCore.SIGNAL("valueChanged"), self.newCTF) # QtCore.QObject.connect(self.sapix, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.sampcont, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.svoltage, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.scs, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.setlist, QtCore.SIGNAL("currentRowChanged(int)"), self.newSet) QtCore.QObject.connect(self.splotmode, QtCore.SIGNAL("currentIndexChanged(int)"), self.newPlotMode) QtCore.QObject.connect(self.saveparms, QtCore.SIGNAL("clicked(bool)"), self.on_save_params) QtCore.QObject.connect(self.recallparms, QtCore.SIGNAL("clicked(bool)"), self.on_recall_params) QtCore.QObject.connect(self.output, QtCore.SIGNAL("clicked(bool)"), self.on_output) self.update_data() self.update_data() self.resize( 460, 380 ) # figured these values out by printing the width and height in resize event self.setWindowTitle("CTF") def on_save_params(self): if len(self.setlist.selectedItems()) == 0: return val = self.curset name = str(self.setlist.item(val).text()) name = get_file_tag(name) # if not db_check_dict(name): # print "error, the db doesn't exist:",name # db_parms = db_open_dict("bdb:e2ctf.parms") ctf = self.data[val][1].to_string() output = [] for i, val in enumerate(self.data[val]): # ignore i == 0 it's just the filename if i > 1: output.append(val) elif i == 1: output.append(ctf) db_parms[name] = output def on_recall_params(self): if len(self.setlist.selectedItems()) == 0: return val = self.curset name = str(self.setlist.item(val).text()) data = [name] name = get_file_tag(name) db_parms = db_open_dict("bdb:e2ctf.parms") if not db_parms.has_key(name): print "error, ctf parameters do not exist for:", name # data.extend(db_parms[name]) ctf = EMAN2Ctf() ctf.from_string(data[1]) data[1] = ctf self.data[val] = data self.newSet(self.curset) # def get_output_params(self): def on_output(self): from emsprworkflow import E2CTFOutputTaskGeneral self.form = E2CTFOutputTaskGeneral() self.form.run_form() def show_guis(self): if self.guiim != None: self.app().show_specific(self.guiim) if self.guiplot != None: self.app().show_specific(self.guiplot) self.app().show_specific(self) def closeEvent(self, event): # QtGui.QWidget.closeEvent(self,event) # self.app.app.closeAllWindows() if self.guiim != None: self.app().close_specific(self.guiim) self.guiim = None if self.guiplot != None: self.app().close_specific(self.guiplot) event.accept() def newData(self, data): self.data = data self.update_data() def update_data(self): """This will make sure the various widgets properly show the current data sets""" self.setlist.clear() for i, j in enumerate(self.data): self.setlist.addItem(j[0]) self.setlist.setCurrentRow(self.curset) def update_plot(self): val = self.curset ctf = self.data[val][1] ds = self.data[val][1].dsbg s = [ds * i for i in xrange(len(ctf.background))] if self.plotmode == 1: self.guiplot.set_data((s, self.data[val][2]), "fg", True, True) self.guiplot.set_data((s, self.data[val][3]), "bg") self.guiplot.setAxisParms("s (1/A)", "Intensity (a.u)") elif self.plotmode == 0: bgsub = [ self.data[val][2][i] - self.data[val][3][i] for i in range(len(self.data[val][2])) ] self.guiplot.set_data((s, bgsub), "fg-bg", True, True) fit = ctf.compute_1d(len(s) * 2, ds, Ctf.CtfType.CTF_AMP) # The fit curve sf = sfact(s, "ribosome", "nono") fit = [sf[i] * fit[i]**2 for i in xrange(len(s)) ] # squared * a generic structure factor # auto-amplitude for b-factor adjustment rto, nrto = 0, 0 for i in xrange( int(.04 / ds) + 1, min(int(0.15 / ds), len(s) - 1)): if bgsub[i] > 0: #rto+=fit[i]**2/fabs(bgsub[i]) #nrto+=fit[i] #rto+=fit[i]**2 #nrto+=bgsub[i]**2 rto += fit[i] nrto += fabs(bgsub[i]) if nrto == 0: rto = 1.0 else: rto /= nrto fit = [fit[i] / rto for i in range(len(s))] self.guiplot.set_data((s, fit), "fit") self.guiplot.setAxisParms("s (1/A)", "Intensity (a.u)") elif self.plotmode == 2: snr = ctf.compute_1d(len(s) * 2, ds, Ctf.CtfType.CTF_SNR) # The snr curve self.guiplot.set_data((s, snr[:len(s)]), "snr", True) self.guiplot.setAxisParms("s (1/A)", "SNR (intensity ratio)") elif self.plotmode == 3: snr = ctf.compute_1d(len(s) * 2, ds, Ctf.CtfType.CTF_SNR) # The snr curve self.guiplot.set_data((s, snr[:len(s)]), "snr", True) ssnr = ctf.compute_1d(len(s) * 2, ds, Ctf.CtfType.CTF_SNR_SMOOTH) # The fit curve self.guiplot.set_data((s, ssnr[:len(s)]), "ssnr") self.guiplot.setAxisParms("s (1/A)", "SNR (intensity ratio)") elif self.plotmode == 4: snr = ctf.compute_1d(len(s) * 2, ds, Ctf.CtfType.CTF_SNR) # The snr curve for i in range(1, len(snr)): snr[i] = snr[i] * i + snr[i - 1] # integrate SNR*s # for i in range(1,len(snr)): snr[i]/=snr[-1] # normalize for i in range(1, len(snr)): snr[i] /= len( snr ) # this way the relative quality of images can be compared self.guiplot.set_data((s, snr[:len(s)]), "snr", True) self.guiplot.setAxisParms("s (1/A)", "Integrated SNR") elif self.plotmode == 5: inten = [ fabs(i) for i in ctf.compute_1d(len(s) * 2, ds, Ctf.CtfType.CTF_AMP) ] # The snr curve self.guiplot.set_data((s, inten[:len(s)]), "single", True) all = [0 for i in inten] for st in self.data: print st inten = [ fabs(i) for i in st[1].compute_1d( len(s) * 2, ds, Ctf.CtfType.CTF_AMP) ] for i in range(len(all)): all[i] += inten[i] self.guiplot.set_data((s, all[:len(s)]), "total") #bgsub=[self.data[val][2][i]-self.data[val][3][i] for i in range(len(self.data[val][2]))] #self.guiplot.set_data("fg-bg",(s,bgsub),True,True) #fit=[bgsub[i]/sfact(s[i]) for i in range(len(s))] # squared * a generic structure factor #self.guiplot.set_data("fit",(s,fit)) def newSet(self, val): "called when a new data set is selected from the list" self.curset = val self.sdefocus.setValue(self.data[val][1].defocus, True) self.sbfactor.setValue(self.data[val][1].bfactor, True) # self.sapix.setValue(self.data[val][1].apix) self.sampcont.setValue(self.data[val][1].ampcont, True) self.svoltage.setValue(self.data[val][1].voltage, True) self.scs.setValue(self.data[val][1].cs, True) self.guiim.set_data(self.data[val][4]) self.update_plot() def newPlotMode(self, mode): self.plotmode = mode self.update_plot() def newCTF(self): self.data[self.curset][1].defocus = self.sdefocus.value self.data[self.curset][1].bfactor = self.sbfactor.value # self.data[self.curset][1].apix=self.sapix.value self.data[self.curset][1].ampcont = self.sampcont.value self.data[self.curset][1].voltage = self.svoltage.value self.data[self.curset][1].cs = self.scs.value self.update_plot() def imgmousedown(self, event): m = self.guiim.scr_to_img((event.x(), event.y())) #self.guiim.add_shape("cen",["rect",.9,.9,.4,x0,y0,x0+2,y0+2,1.0]) def imgmousedrag(self, event): m = self.guiim.scr_to_img((event.x(), event.y())) # box deletion when shift held down #if event.modifiers()&Qt.ShiftModifier: #for i,j in enumerate(self.boxes): def imgmouseup(self, event): m = self.guiim.scr_to_img((event.x(), event.y())) def plotmousedown(self, event): m = self.guiim.scr_to_img((event.x(), event.y())) def run(self): """If you make your own application outside of this object, you are free to use your own local app.exec_(). This is a convenience for ctf-only programs.""" self.app.exec_() # E2saveappwin("boxer","imagegeom",self.guiim) # try: # E2setappval("boxer","imcontrol",self.guiim.inspector.isVisible()) # if self.guiim.inspector.isVisible() : E2saveappwin("boxer","imcontrolgeom",self.guiim.inspector) # except : E2setappval("boxer","imcontrol",False) return
def __init__(self, application, data): """Implements the CTF fitting dialog using various EMImage and EMPlot2D widgets 'data' is a list of (filename,ctf,im_1d,bg_1d,im_2d,bg_2d) """ try: from emimage2d import EMImage2DWidget except: print "Cannot import EMAN image GUI objects (EMImage2DWidget)" sys.exit(1) try: from emplot2d import EMPlot2DWidget except: print "Cannot import EMAN plot GUI objects (is matplotlib installed?)" sys.exit(1) self.app = weakref.ref(application) QtGui.QWidget.__init__(self, None) self.setWindowIcon(QtGui.QIcon(get_image_directory() + "ctf.png")) self.data = data self.curset = 0 self.plotmode = 0 self.guiim = EMImage2DWidget(application=self.app()) self.guiplot = EMPlot2DWidget(application=self.app()) self.guiim.connect(self.guiim, QtCore.SIGNAL("mousedown"), self.imgmousedown) self.guiim.connect(self.guiim, QtCore.SIGNAL("mousedrag"), self.imgmousedrag) self.guiim.connect(self.guiim, QtCore.SIGNAL("mouseup"), self.imgmouseup) self.guiplot.connect(self.guiplot, QtCore.SIGNAL("mousedown"), self.plotmousedown) self.guiim.mmode = "app" # This object is itself a widget we need to set up self.hbl = QtGui.QHBoxLayout(self) self.hbl.setMargin(0) self.hbl.setSpacing(6) self.hbl.setObjectName("hbl") # plot list and plot mode combobox self.vbl2 = QtGui.QVBoxLayout() self.setlist = QtGui.QListWidget(self) self.setlist.setSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Expanding) self.vbl2.addWidget(self.setlist) self.splotmode = QtGui.QComboBox(self) self.splotmode.addItem("Bgsub & fit") self.splotmode.addItem("Ptcl & BG power") self.splotmode.addItem("SNR") self.splotmode.addItem("Smoothed SNR") self.splotmode.addItem("Integrated SNR") self.splotmode.addItem("Total CTF") self.vbl2.addWidget(self.splotmode) self.hbl.addLayout(self.vbl2) # ValSliders for CTF parameters self.vbl = QtGui.QVBoxLayout() self.vbl.setMargin(0) self.vbl.setSpacing(6) self.vbl.setObjectName("vbl") self.hbl.addLayout(self.vbl) #self.samp = ValSlider(self,(0,5.0),"Amp:",0) #self.vbl.addWidget(self.samp) self.sdefocus = ValSlider(self, (0, 5), "Defocus:", 0, 90) self.vbl.addWidget(self.sdefocus) self.sbfactor = ValSlider(self, (0, 1600), "B factor:", 0, 90) self.vbl.addWidget(self.sbfactor) self.sampcont = ValSlider(self, (0, 100), "% AC", 0, 90) self.vbl.addWidget(self.sampcont) # self.sapix=ValSlider(self,(.2,10),"A/Pix:",2,90) # self.vbl.addWidget(self.sapix) self.svoltage = ValSlider(self, (0, 500), "Voltage (kV):", 0, 90) self.vbl.addWidget(self.svoltage) self.scs = ValSlider(self, (0, 5), "Cs (mm):", 0, 90) self.vbl.addWidget(self.scs) self.hbl_buttons = QtGui.QHBoxLayout() self.saveparms = QtGui.QPushButton("Save parms") self.recallparms = QtGui.QPushButton("Recall") self.output = QtGui.QPushButton("Output") self.hbl_buttons.addWidget(self.saveparms) self.hbl_buttons.addWidget(self.recallparms) self.hbl_buttons2 = QtGui.QHBoxLayout() self.hbl_buttons2.addWidget(self.output) self.vbl.addLayout(self.hbl_buttons) self.vbl.addLayout(self.hbl_buttons2) QtCore.QObject.connect(self.sdefocus, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.sbfactor, QtCore.SIGNAL("valueChanged"), self.newCTF) # QtCore.QObject.connect(self.sapix, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.sampcont, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.svoltage, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.scs, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.setlist, QtCore.SIGNAL("currentRowChanged(int)"), self.newSet) QtCore.QObject.connect(self.splotmode, QtCore.SIGNAL("currentIndexChanged(int)"), self.newPlotMode) QtCore.QObject.connect(self.saveparms, QtCore.SIGNAL("clicked(bool)"), self.on_save_params) QtCore.QObject.connect(self.recallparms, QtCore.SIGNAL("clicked(bool)"), self.on_recall_params) QtCore.QObject.connect(self.output, QtCore.SIGNAL("clicked(bool)"), self.on_output) self.update_data() self.update_data() self.resize( 460, 380 ) # figured these values out by printing the width and height in resize event self.setWindowTitle("CTF")
class EMItem3DInspector(QtGui.QTabWidget): """ Class to make the EMItem GUI controls """ def __init__(self, name, item3d): QtGui.QTabWidget.__init__(self) self.item3d = weakref.ref(item3d) self.name = name self.inspector = None self.transfromboxmaxheight = 400 # This might be problematic self.addTabs() def setInspector(self, inspector): """ This is a reference back to the main inspector, which holds all the item inspectors""" self.inspector = weakref.ref(inspector) def addTabs(self): """ Add a tab for each 'column' """ tabwidget = QtGui.QWidget() gridbox = QtGui.QGridLayout() EMItem3DInspector.addControls(self, gridbox) tabwidget.setLayout(gridbox) self.addTab(tabwidget, "basic") def addControls(self, gridbox): """ Construct all the widgets in this Item Inspector """ # selection box and label font = QtGui.QFont() font.setBold(True) label = QtGui.QLabel(self.name,self) label.setFont(font) label.setAlignment(QtCore.Qt.AlignCenter) gridbox.addWidget(label, 0, 0, 1, 1) databox = QtGui.QHBoxLayout() self.boundingbox = None if self.item3d().boundingboxsize: self.boundingbox = QtGui.QLabel("Size: "+self.item3d().boundingboxsize,self) databox.addWidget(self.boundingbox) gridbox.addLayout(databox, 1, 0, 1, 1) # angluar controls xformframe = QtGui.QFrame() xformframe.setFrameShape(QtGui.QFrame.StyledPanel) xformbox = QtGui.QGridLayout() xformlabel = QtGui.QLabel("Transformation", xformframe) xformlabel.setFont(font) xformlabel.setAlignment(QtCore.Qt.AlignCenter) xformbox.addWidget(xformlabel, 0, 0, 1, 2) # Rotations self.rotcombobox = QtGui.QComboBox() xformbox.addWidget(self.rotcombobox, 1, 0, 1, 2) self.rotstackedwidget = QtGui.QStackedWidget() self.addRotationWidgets() xformbox.addWidget(self.rotstackedwidget, 2, 0, 1, 2) #translations txlabel = QtGui.QLabel("TX",xformframe) txlabel.setAlignment(QtCore.Qt.AlignCenter) xformbox.addWidget(txlabel, 3, 0, 1, 1) tylabel = QtGui.QLabel("TY",xformframe) tylabel.setAlignment(QtCore.Qt.AlignCenter) xformbox.addWidget(tylabel, 3, 1, 1, 1) self.tx = EMSpinWidget(0.0, 1.0) self.ty = EMSpinWidget(0.0, 1.0) xformbox.addWidget(self.tx, 4, 0, 1, 1) xformbox.addWidget(self.ty, 4, 1, 1, 1) tzlabel = QtGui.QLabel("TZ",xformframe) tzlabel.setAlignment(QtCore.Qt.AlignCenter) xformbox.addWidget(tzlabel, 5, 0, 1, 1) zoomlabel = QtGui.QLabel("Zoom",xformframe) zoomlabel.setAlignment(QtCore.Qt.AlignCenter) xformbox.addWidget(zoomlabel, 5, 1, 1, 1) self.tz = EMSpinWidget(0.0, 1.0) self.zoom = EMSpinWidget(1.0, 0.1, postivemode=True, wheelstep=0.1) xformbox.addWidget(self.tz, 6, 0, 1, 1) xformbox.addWidget(self.zoom, 6, 1, 1, 1) self.resetbuttontx = QtGui.QPushButton("Reset Tx") self.resetbuttonrot = QtGui.QPushButton("Reset Rot") xformbox.addWidget(self.resetbuttontx, 7, 0, 1, 1) xformbox.addWidget(self.resetbuttonrot, 7, 1, 1, 1) xformframe.setLayout(xformbox) xformframe.setMaximumWidth(350) xformframe.setMaximumHeight(self.transfromboxmaxheight) xformframe.setLayout(xformbox) gridbox.addWidget(xformframe, 2, 0, 1, 1) # set to default, but run only as a base class if type(self) == EMItem3DInspector: self.updateItemControls() QtCore.QObject.connect(self.tx,QtCore.SIGNAL("valueChanged(int)"),self._on_translation) QtCore.QObject.connect(self.ty,QtCore.SIGNAL("valueChanged(int)"),self._on_translation) QtCore.QObject.connect(self.tz,QtCore.SIGNAL("valueChanged(int)"),self._on_translation) QtCore.QObject.connect(self.zoom,QtCore.SIGNAL("valueChanged(int)"),self._on_scale) QtCore.QObject.connect(self.resetbuttontx,QtCore.SIGNAL("clicked()"),self._on_resettx) QtCore.QObject.connect(self.resetbuttonrot,QtCore.SIGNAL("clicked()"),self._on_resetrot) def _on_translation(self, value): """ Need to contain the right coords. And do translation in the correct corrd system """ tt = t = Transform({"tx":self.tx.getValue(),"ty":self.ty.getValue(),"tz":self.tz.getValue()}) tp = self.item3d().getParentMatrixProduct() if tp: tt = tp.inverse()*t self.item3d().getTransform().set_trans(tt.get_trans()) self.inspector().updateSceneGraph() def _on_scale(self, value): self.item3d().getTransform().set_scale(self.zoom.getValue()) self.inspector().updateSceneGraph() def _on_resettx(self): self.item3d().getTransform().set_trans(0.0, 0.0, 0.0) self.updateItemControls() self.inspector().updateSceneGraph() def _on_resetrot(self): self.item3d().getTransform().set_rotation({"type":"eman","az":0.0,"alt":0.0,"phi":0.0}) self.updateItemControls() self.inspector().updateSceneGraph() def _isRotNaN(self, rot1, rot2, rot3): """ Better check to make sure get_rotation did not return Nan, so to prevent a crash """ if rot1 != rot1: return True if rot2 != rot2: return True if rot3 != rot3: return True return False def updateItemControls(self): """ Updates this item inspector. Function is called by the item it observes""" # Translation update stdtransfrom = self.item3d().getTransformStdCoord() translation = stdtransfrom.get_trans() self.tx.setValue(translation[0]) self.ty.setValue(translation[1]) self.tz.setValue(translation[2]) # Rotation update rotation = stdtransfrom.get_rotation(str(self.rotcombobox.currentText())) is_identity = stdtransfrom.is_rot_identity() comboboxidx = self.rotcombobox.currentIndex() if comboboxidx == 0: if self._isRotNaN(rotation["az"],rotation["alt"],rotation["phi"]): return self.emanazslider.setValue(rotation["az"], quiet=1) self.emanaltslider.setValue(rotation["alt"], quiet=1) self.emanphislider.setValue(rotation["phi"], quiet=1) if comboboxidx == 1: if self._isRotNaN(rotation["gamma"],rotation["beta"],rotation["alpha"]): return self.imagicgammaslider.setValue(rotation["gamma"], quiet=1) self.imagicbetaslider.setValue(rotation["beta"], quiet=1) self.imagicalphaslider.setValue(rotation["alpha"], quiet=1) if comboboxidx == 2: if self._isRotNaN(rotation["psi"],rotation["theta"],rotation["phi"]): return self.spiderpsislider.setValue(rotation["psi"], quiet=1) self.spiderthetaslider.setValue(rotation["theta"], quiet=1) self.spiderphislider.setValue(rotation["phi"], quiet=1) if comboboxidx == 3: if self._isRotNaN(rotation["phi"],rotation["theta"],rotation["omega"]): return self.mrcpsislider.setValue(rotation["phi"], quiet=1) self.mrcthetaslider.setValue(rotation["theta"], quiet=1) self.mrcomegaslider.setValue(rotation["omega"], quiet=1) if comboboxidx == 4: if self._isRotNaN(rotation["ztilt"],rotation["ytilt"],rotation["xtilt"]): return self.xyzzslider.setValue(rotation["ztilt"], quiet=1) self.xyzyslider.setValue(rotation["ytilt"], quiet=1) self.xyzxslider.setValue(rotation["xtilt"], quiet=1) if comboboxidx == 5: if self._isRotNaN(rotation["n1"],rotation["n2"],rotation["n3"]): return if is_identity and self.spinn1slider.getValue() == 0.0 and self.spinn2slider.getValue() == 0.0 and self.spinn3slider.getValue() == 0.0: self.spinomegaslider .setValue(0.0, quiet=1) self.spinn1slider.setValue(0.0, quiet=1) self.spinn2slider.setValue(0.0, quiet=1) self.spinn3slider.setValue(1.0, quiet=1) else: self.spinomegaslider .setValue(rotation["omega"], quiet=1) # Don't change slider if reult is Nan if rotation["n1"] == rotation["n1"]: self.spinn1slider.setValue(rotation["n1"], quiet=1) if rotation["n2"] == rotation["n2"]: self.spinn2slider.setValue(rotation["n2"], quiet=1) if rotation["n3"] == rotation["n3"]: self.spinn3slider.setValue(rotation["n3"], quiet=1) if comboboxidx == 6: if self._isRotNaN(rotation["n1"],rotation["n2"],rotation["n3"]): return if is_identity and self.spinn1slider.getValue() == 0.0 and self.spinn2slider.getValue() == 0.0 and self.spinn3slider.getValue() == 0.0: self.spinomegaslider.setValue(0.0, quiet=1) self.sgirotn1slider.setValue(0.0, quiet=1) self.sgirotn2slider.setValue(0.0, quiet=1) self.sgirotn3slider.setValue(1.0, quiet=1) else: self.spinomegaslider.setValue(rotation["q"], quiet=1) # Don't change slider if reult is Nan if rotation["n1"] == rotation["n1"]: self.sgirotn1slider.setValue(rotation["n1"], quiet=1) if rotation["n2"] == rotation["n2"]: self.sgirotn2slider.setValue(rotation["n2"], quiet=1) if rotation["n3"] == rotation["n3"]: self.sgirotn3slider.setValue(rotation["n3"], quiet=1) if comboboxidx == 7: if self._isRotNaN(rotation["e1"],rotation["e2"],rotation["e3"]): return if is_identity: self.quaternione0slider.setValue(1.0, quiet=1) self.quaternione1slider.setValue(0.0, quiet=1) self.quaternione2slider.setValue(0.0, quiet=1) self.quaternione3slider.setValue(0.0, quiet=1) else: self.quaternione0slider.setValue(rotation["e0"], quiet=1) self.quaternione1slider.setValue(rotation["e1"], quiet=1) self.quaternione2slider.setValue(rotation["e2"], quiet=1) self.quaternione3slider.setValue(rotation["e3"], quiet=1) # Scaling update self.zoom.setValue(self.item3d().getTransform().get_scale()) def updateMetaData(self): """ I didn't want to put this in update b/c this data doesn't change very often, and I don't want to waste CPU Its a judgement call really, less coupling vs. more efficiency """ if self.boundingbox: self.boundingbox.setText("Size: "+self.item3d().boundingboxsize) def addRotationWidgets(self): """ Add alll the widgets for the various EMAN2 rotation conventions """ EMANwidget = QtGui.QWidget() Imagicwidget = QtGui.QWidget() Spiderwidget = QtGui.QWidget() MRCwidget = QtGui.QWidget() XYZwidget = QtGui.QWidget() spinwidget = QtGui.QWidget() sgirotwidget = QtGui.QWidget() quaternionwidget = QtGui.QWidget() # EMAN emanbox = QtGui.QVBoxLayout() self.emanazslider = ValSlider(EMANwidget, (0.0, 360.0), " Az", rounding = 1) self.emanaltslider = ValSlider(EMANwidget, (0.0, 180.0), "Alt", rounding = 1) self.emanphislider = ValSlider(EMANwidget, (0.0, 360.0), "Phi", rounding = 1) emanbox.addWidget(self.emanazslider) emanbox.addWidget(self.emanaltslider) emanbox.addWidget(self.emanphislider) EMANwidget.setLayout(emanbox) # Imagic imagicbox = QtGui.QVBoxLayout() self.imagicgammaslider = ValSlider(Imagicwidget, (0.0, 360.0), "Gamma", rounding = 1) self.imagicbetaslider = ValSlider(Imagicwidget, (0.0, 180.0), " Beta", rounding = 1) self.imagicalphaslider = ValSlider(Imagicwidget, (0.0, 360.0), " Alpha", rounding = 1) imagicbox.addWidget(self.imagicgammaslider) imagicbox.addWidget(self.imagicbetaslider) imagicbox.addWidget(self.imagicalphaslider) Imagicwidget.setLayout(imagicbox) # Spider spiderbox = QtGui.QVBoxLayout() self.spiderpsislider = ValSlider(Spiderwidget, (0.0, 360.0), " Psi", rounding = 1) self.spiderthetaslider = ValSlider(Spiderwidget, (0.0, 180.0), "Theta", rounding = 1) self.spiderphislider = ValSlider(Spiderwidget, (0.0, 360.0), " Phi", rounding = 1) spiderbox.addWidget(self.spiderpsislider) spiderbox.addWidget(self.spiderthetaslider) spiderbox.addWidget(self.spiderphislider) Spiderwidget.setLayout(spiderbox) # MRC mrcbox = QtGui.QVBoxLayout() self.mrcpsislider = ValSlider(MRCwidget, (0.0, 360.0), " Psi", rounding = 1) self.mrcthetaslider = ValSlider(MRCwidget, (0.0, 180.0), " Theta", rounding = 1) self.mrcomegaslider = ValSlider(MRCwidget, (0.0, 360.0), "Omega", rounding = 1) mrcbox.addWidget(self.mrcpsislider) mrcbox.addWidget(self.mrcthetaslider) mrcbox.addWidget(self.mrcomegaslider) MRCwidget.setLayout(mrcbox) # XYZ xyzbox = QtGui.QVBoxLayout() self.xyzzslider = ValSlider(XYZwidget, (0.0, 360.0), "Z", rounding = 1) self.xyzyslider = ValSlider(XYZwidget, (0.0, 180.0), "Y", rounding = 1) self.xyzxslider = ValSlider(XYZwidget, (0.0, 360.0), "X", rounding = 1) xyzbox.addWidget(self.xyzzslider) xyzbox.addWidget(self.xyzyslider) xyzbox.addWidget(self.xyzxslider) XYZwidget.setLayout(xyzbox) # spin spinbox = QtGui.QVBoxLayout() self.spinomegaslider = ValSlider(spinwidget, (0.0, 180.0), "Omega", rounding = 1) self.spinn1slider = ValSlider(spinwidget, (0.0, 1.0), " N1", rounding = 4) self.spinn2slider = ValSlider(spinwidget, (0.0, 1.0), " N2", rounding = 4) self.spinn3slider = ValSlider(spinwidget, (0.0, 1.0), " N3", rounding = 4) spinbox.addWidget(self.spinomegaslider) spinbox.addWidget(self.spinn1slider) spinbox.addWidget(self.spinn2slider) spinbox.addWidget(self.spinn3slider) spinwidget.setLayout(spinbox) # sgirot sgirotbox = QtGui.QVBoxLayout() self.sgirotqslider = ValSlider(sgirotwidget, (0.0, 180.0), " Q", rounding = 1) self.sgirotn1slider = ValSlider(sgirotwidget, (0.0, 1.0), "N1", rounding = 4) self.sgirotn2slider = ValSlider(sgirotwidget, (0.0, 1.0), "N2", rounding = 4) self.sgirotn3slider = ValSlider(sgirotwidget, (0.0, 1.0), "N3", rounding = 4) sgirotbox.addWidget(self.sgirotqslider) sgirotbox.addWidget(self.sgirotn1slider) sgirotbox.addWidget(self.sgirotn2slider) sgirotbox.addWidget(self.sgirotn3slider) sgirotwidget.setLayout(sgirotbox) # quaternion quaternionbox = QtGui.QVBoxLayout() self.quaternione0slider = ValSlider(quaternionwidget, (0.0, 1.0), "E0", rounding = 4) self.quaternione1slider = ValSlider(quaternionwidget, (0.0, 1.0), "E1", rounding = 4) self.quaternione2slider = ValSlider(quaternionwidget, (0.0, 1.0), "E2", rounding = 4) self.quaternione3slider = ValSlider(quaternionwidget, (0.0, 1.0), "E3", rounding = 4) quaternionbox.addWidget(self.quaternione0slider) quaternionbox.addWidget(self.quaternione1slider) quaternionbox.addWidget(self.quaternione2slider) quaternionbox.addWidget(self.quaternione3slider) quaternionwidget.setLayout(quaternionbox) # Add widgets to the stack self.rotstackedwidget.addWidget(EMANwidget) self.rotstackedwidget.addWidget(Imagicwidget) self.rotstackedwidget.addWidget(Spiderwidget) self.rotstackedwidget.addWidget(MRCwidget) self.rotstackedwidget.addWidget(XYZwidget) self.rotstackedwidget.addWidget(spinwidget) self.rotstackedwidget.addWidget(sgirotwidget) self.rotstackedwidget.addWidget(quaternionwidget) # add choices to combobox self.rotcombobox.addItem("EMAN") self.rotcombobox.addItem("Imagic") self.rotcombobox.addItem("Spider") self.rotcombobox.addItem("MRC") self.rotcombobox.addItem("XYZ") self.rotcombobox.addItem("spin") self.rotcombobox.addItem("sgirot") self.rotcombobox.addItem("quaternion") # Signal for all sliders QtCore.QObject.connect(self.rotcombobox, QtCore.SIGNAL("activated(int)"), self._rotcombobox_changed) QtCore.QObject.connect(self.emanazslider,QtCore.SIGNAL("valueChanged"),self._on_EMAN_rotation) QtCore.QObject.connect(self.emanaltslider,QtCore.SIGNAL("valueChanged"),self._on_EMAN_rotation) QtCore.QObject.connect(self.emanphislider,QtCore.SIGNAL("valueChanged"),self._on_EMAN_rotation) QtCore.QObject.connect(self.imagicgammaslider,QtCore.SIGNAL("valueChanged"),self._on_Imagic_rotation) QtCore.QObject.connect(self.imagicbetaslider,QtCore.SIGNAL("valueChanged"),self._on_Imagic_rotation) QtCore.QObject.connect(self.imagicalphaslider,QtCore.SIGNAL("valueChanged"),self._on_Imagic_rotation) QtCore.QObject.connect(self.spiderpsislider,QtCore.SIGNAL("valueChanged"),self._on_Spider_rotation) QtCore.QObject.connect(self.spiderthetaslider,QtCore.SIGNAL("valueChanged"),self._on_Spider_rotation) QtCore.QObject.connect(self.spiderphislider,QtCore.SIGNAL("valueChanged"),self._on_Spider_rotation) QtCore.QObject.connect(self.mrcpsislider,QtCore.SIGNAL("valueChanged"),self._on_MRC_rotation) QtCore.QObject.connect(self.mrcthetaslider,QtCore.SIGNAL("valueChanged"),self._on_MRC_rotation) QtCore.QObject.connect(self.mrcomegaslider,QtCore.SIGNAL("valueChanged"),self._on_MRC_rotation) QtCore.QObject.connect(self.xyzzslider,QtCore.SIGNAL("valueChanged"),self._on_XYZ_rotation) QtCore.QObject.connect(self.xyzyslider,QtCore.SIGNAL("valueChanged"),self._on_XYZ_rotation) QtCore.QObject.connect(self.xyzxslider,QtCore.SIGNAL("valueChanged"),self._on_XYZ_rotation) QtCore.QObject.connect(self.spinomegaslider,QtCore.SIGNAL("valueChanged"),self._on_spin_rotation) QtCore.QObject.connect(self.spinn1slider,QtCore.SIGNAL("valueChanged"),self._on_spin_rotation) QtCore.QObject.connect(self.spinn2slider,QtCore.SIGNAL("valueChanged"),self._on_spin_rotation) QtCore.QObject.connect(self.spinn3slider,QtCore.SIGNAL("valueChanged"),self._on_spin_rotation) QtCore.QObject.connect(self.sgirotqslider,QtCore.SIGNAL("valueChanged"),self._on_sgirot_rotation) QtCore.QObject.connect(self.sgirotn1slider,QtCore.SIGNAL("valueChanged"),self._on_sgirot_rotation) QtCore.QObject.connect(self.sgirotn2slider,QtCore.SIGNAL("valueChanged"),self._on_sgirot_rotation) QtCore.QObject.connect(self.sgirotn3slider,QtCore.SIGNAL("valueChanged"),self._on_sgirot_rotation) QtCore.QObject.connect(self.quaternione0slider,QtCore.SIGNAL("valueChanged"),self._on_quaternion_rotation) QtCore.QObject.connect(self.quaternione1slider,QtCore.SIGNAL("valueChanged"),self._on_quaternion_rotation) QtCore.QObject.connect(self.quaternione2slider,QtCore.SIGNAL("valueChanged"),self._on_quaternion_rotation) QtCore.QObject.connect(self.quaternione3slider,QtCore.SIGNAL("valueChanged"),self._on_quaternion_rotation) def _rotcombobox_changed(self, idx): self.rotstackedwidget.setCurrentIndex(idx) self.updateItemControls() def _on_EMAN_rotation(self, value): self._set_rotation_std_coords(Transform({"type":"eman","az":self.emanazslider.getValue(),"alt":self.emanaltslider.getValue(),"phi":self.emanphislider.getValue()})) self.inspector().updateSceneGraph() def _on_Imagic_rotation(self, value): self._set_rotation_std_coords(Transform({"type":"imagic","gamma":self.imagicgammaslider.getValue(),"beta":self.imagicbetaslider.getValue(),"alpha":self.imagicalphaslider.getValue()})) self.inspector().updateSceneGraph() def _on_Spider_rotation(self, value): self._set_rotation_std_coords(Transform({"type":"spider","psi":self.spiderpsislider.getValue(),"theta":self.spiderthetaslider.getValue(),"phi":self.spiderphislider.getValue()})) self.inspector().updateSceneGraph() def _on_MRC_rotation(self, value): self._set_rotation_std_coords(Transform({"type":"mrc","phi":self.mrcpsislider.getValue(),"theta":self.mrcthetaslider.getValue(),"omega":self.mrcomegaslider.getValue()})) self.inspector().updateSceneGraph() def _on_XYZ_rotation(self, value): self._set_rotation_std_coords(Transform({"type":"xyz","ztilt":self.xyzzslider.getValue(),"ytilt":self.xyzyslider.getValue(),"xtilt":self.xyzxslider.getValue()})) self.inspector().updateSceneGraph() def _on_spin_rotation(self, value): v = Vec3f(self.spinn1slider.getValue(), self.spinn2slider.getValue(), self.spinn3slider.getValue()) v.normalize() self._set_rotation_std_coords(Transform({"type":"spin","omega":self.spinomegaslider.getValue(),"n1":v[0],"n2":v[1],"n3":v[2]})) self.inspector().updateSceneGraph() def _on_sgirot_rotation(self, value): v = Vec3f(self.sgirotn1slider.getValue(), self.sgirotn2slider.getValue(), self.sgirotn3slider.getValue()) v.normalize() self._set_rotation_std_coords(Transform({"type":"sgirot","q":self.sgirotqslider.getValue(),"n1":v[0],"n2":v[1],"n3":v[2]})) self.inspector().updateSceneGraph() def _on_quaternion_rotation(self, value): v = Vec4f(self.quaternione0slider.getValue(), self.quaternione1slider.getValue(), self.quaternione2slider.getValue(), self.quaternione3slider.getValue()) v.normalize() self._set_rotation_std_coords(Transform({"type":"quaternion","e0":v[0],"e1":v[1],"e2":v[2],"e3":v[3]})) self.inspector().updateSceneGraph() def _set_rotation_std_coords(self, rotation): """ This function sets the rotation as if there were no preceeding ones, otherwise a rot around Z could be arounf y,x, etc. Works by transforming local coords into global corrds""" tt = rotation tp = self.item3d().getParentMatrixProduct() if tp: tt = tp.inverse()*rotation self.item3d().getTransform().set_rotation(tt.get_rotation())
class GUIctfsim(QtGui.QWidget): def __init__(self,application,apix=1.0,voltage=300.0,cs=4.1,ac=10.0,samples=256): """CTF simulation dialog """ try: from emimage2d import EMImage2DWidget except: print "Cannot import EMAN image GUI objects (EMImage2DWidget)" sys.exit(1) try: from emplot2d import EMPlot2DWidget except: print "Cannot import EMAN plot GUI objects (is matplotlib installed?)" sys.exit(1) self.app = weakref.ref(application) self.df_voltage=voltage self.df_apix=apix self.df_cs=cs self.df_ac=ac self.df_samples=samples self.img=None QtGui.QWidget.__init__(self,None) self.setWindowIcon(QtGui.QIcon(get_image_directory() + "ctf.png")) self.data=[] self.curset=0 self.plotmode=0 self.guiim=EMImage2DWidget(application=self.app()) self.guiiminit = True # a flag that's used to auto resize the first time the gui's set_data function is called self.guiplot=EMPlot2DWidget(application=self.app()) # self.guirealim=EMImage2DWidget(application=self.app()) # This will show the original particle images # self.guirealim.connect(self.guirealim,QtCore.SIGNAL("keypress"),self.realimgkey) self.guiim.connect(self.guiim,QtCore.SIGNAL("mousedown"),self.imgmousedown) self.guiim.connect(self.guiim,QtCore.SIGNAL("mousedrag"),self.imgmousedrag) self.guiim.connect(self.guiim,QtCore.SIGNAL("mouseup") ,self.imgmouseup) self.guiplot.connect(self.guiplot,QtCore.SIGNAL("mousedown"),self.plotmousedown) self.guiim.mmode="app" # This object is itself a widget we need to set up self.hbl = QtGui.QHBoxLayout(self) self.hbl.setMargin(0) self.hbl.setSpacing(6) self.hbl.setObjectName("hbl") # plot list and plot mode combobox self.vbl2 = QtGui.QVBoxLayout() self.setlist=MyListWidget(self) self.setlist.setSizePolicy(QtGui.QSizePolicy.Preferred,QtGui.QSizePolicy.Expanding) self.vbl2.addWidget(self.setlist) self.splotmode=QtGui.QComboBox(self) self.splotmode.addItem("Amplitude") self.splotmode.addItem("Intensity") self.splotmode.addItem("Int w sum") self.splotmode.addItem("Amp w sum") self.vbl2.addWidget(self.splotmode) self.hbl.addLayout(self.vbl2) # ValSliders for CTF parameters self.vbl = QtGui.QVBoxLayout() self.vbl.setMargin(0) self.vbl.setSpacing(6) self.vbl.setObjectName("vbl") self.hbl.addLayout(self.vbl) #self.samp = ValSlider(self,(0,5.0),"Amp:",0) #self.vbl.addWidget(self.samp) self.imginfo=QtGui.QLabel("Info",self) self.vbl.addWidget(self.imginfo) self.sdefocus=ValSlider(self,(0,5),"Defocus:",0,90) self.vbl.addWidget(self.sdefocus) self.sbfactor=ValSlider(self,(0,1600),"B factor:",0,90) self.vbl.addWidget(self.sbfactor) self.sdfdiff=ValSlider(self,(0,1),"DF Diff:",0,90) self.vbl.addWidget(self.sdfdiff) self.sdfang=ValSlider(self,(0,180),"Df Angle:",0,90) self.vbl.addWidget(self.sdfang) self.sampcont=ValSlider(self,(0,100),"% AC",0,90) self.vbl.addWidget(self.sampcont) self.sapix=ValSlider(self,(.2,10),"A/Pix:",2,90) self.vbl.addWidget(self.sapix) self.svoltage=ValSlider(self,(0,1000),"Voltage (kV):",0,90) self.vbl.addWidget(self.svoltage) self.scs=ValSlider(self,(0,5),"Cs (mm):",0,90) self.vbl.addWidget(self.scs) self.ssamples=ValSlider(self,(32,1024),"# Samples:",0,90) self.ssamples.setIntonly(True) self.vbl.addWidget(self.ssamples) self.hbl_buttons = QtGui.QHBoxLayout() self.newbut = QtGui.QPushButton("New") self.hbl_buttons.addWidget(self.newbut) self.vbl.addLayout(self.hbl_buttons) self.on_new_but() QtCore.QObject.connect(self.sdefocus, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.sbfactor, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.sdfdiff, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.sdfang, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.sapix, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.sampcont, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.svoltage, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.scs, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.ssamples, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.setlist,QtCore.SIGNAL("currentRowChanged(int)"),self.newSet) QtCore.QObject.connect(self.setlist,QtCore.SIGNAL("keypress"),self.listkey) QtCore.QObject.connect(self.splotmode,QtCore.SIGNAL("currentIndexChanged(int)"),self.newPlotMode) QtCore.QObject.connect(self.newbut,QtCore.SIGNAL("clicked(bool)"),self.on_new_but) self.resize(720,380) # figured these values out by printing the width and height in resize event E2loadappwin("e2ctfsim","main",self) E2loadappwin("e2ctfsim","image",self.guiim.qt_parent) # E2loadappwin("e2ctf","realimage",self.guirealim.qt_parent) E2loadappwin("e2ctfsim","plot",self.guiplot.qt_parent) self.setWindowTitle("CTF") def listkey(self,event): if event.key()>=Qt.Key_0 and event.key()<=Qt.Key_9 : q=int(event.key())-Qt.Key_0 self.squality.setValue(q) elif event.key() == Qt.Key_Left: self.sdefocus.setValue(self.sdefocus.getValue()-0.01) elif event.key() == Qt.Key_Right: self.sdefocus.setValue(self.sdefocus.getValue()+0.01) elif event.key()==Qt.Key_R : self.on_recall_params() def on_new_but(self): ctf=EMAN2Ctf() ctf.defocus=1.0 ctf.voltage=self.df_voltage ctf.apix=self.df_apix ctf.cs=self.df_cs ctf.ac=self.df_ac ctf.samples=self.df_samples self.data.append((str(len(self.setlist)+1),ctf)) self.curset=len(self.data) self.update_data() def show_guis(self): if self.guiim != None: self.app().show_specific(self.guiim) if self.guiplot != None: self.app().show_specific(self.guiplot) #if self.guirealim != None: #self.app().show_specific(self.guirealim) self.show() def closeEvent(self,event): # QtGui.QWidget.closeEvent(self,event) # self.app.app.closeAllWindows() E2saveappwin("e2ctf","main",self) if self.guiim != None: E2saveappwin("e2ctf","image",self.guiim.qt_parent) self.app().close_specific(self.guiim) self.guiim = None if self.guiplot != None: E2saveappwin("e2ctf","plot",self.guiplot.qt_parent) self.app().close_specific(self.guiplot) #if self.guirealim != None: #E2saveappwin("e2ctf","realimage",self.guirealim.qt_parent) #self.app().close_specific(self.guirealim) event.accept() self.app().close_specific(self) self.emit(QtCore.SIGNAL("module_closed")) # this signal is important when e2ctf is being used by a program running its own event loop def update_data(self): """This will make sure the various widgets properly show the current data sets""" self.setlist.clear() for i,j in enumerate(self.data): self.setlist.addItem(j[0]) self.setlist.setCurrentRow(self.curset) def update_plot(self): if self.guiplot == None: return # it's closed/not visible for d in xrange(len(self.data)): ctf=self.data[d][1] ds=1.0/(ctf.apix*2.0*ctf.samples) s=arange(0,ds*ctf.samples,ds) curve=array(ctf.compute_1d(len(s)*2,ds,Ctf.CtfType.CTF_AMP)) if self.plotmode==1 or self.plotmode==2: curve=curve**2 if self.plotmode==2 or self.plotmode==3: if d==0 : avg=curve[:] else: if len(curve)!=len(avg) : print "Number of samples must be fixed to compute an average ({})".format(d+1) else: avg+=curve self.guiplot.set_data((s,curve),self.data[d][0],d==0,True,color=d+1) if self.plotmode in (2,3) : self.guiplot.set_data((s,avg),"Sum",False,True,color=0) self.guiplot.setAxisParms("s (1/$\AA$)","CTF") ctf.compute_2d_complex(self.img,Ctf.CtfType.CTF_AMP,None) self.guiim.set_data(self.img) def newSet(self,val=0): "called when a new data set is selected from the list" self.curset=val self.sdefocus.setValue(self.data[val][1].defocus,True) self.sbfactor.setValue(self.data[val][1].bfactor,True) self.sapix.setValue(self.data[val][1].apix,True) self.sampcont.setValue(self.data[val][1].ampcont,True) self.svoltage.setValue(self.data[val][1].voltage,True) self.scs.setValue(self.data[val][1].cs,True) self.sdfdiff.setValue(self.data[val][1].dfdiff,True) self.sdfang.setValue(self.data[val][1].dfang,True) self.ssamples.setValue(self.data[val][1].samples,True) # make new image if necessary if self.img==None or self.img["ny"]!=self.data[val][1].samples : self.img=EMData(self.data[val][1].samples+2,self.data[val][1].samples) self.img.to_zero() self.img.set_complex(1) self.guiim.set_data(self.img) # self.imginfo.setText("%s particles SNR = %s"%(ptcl,ssnr)) #if self.guiim != None: ## print self.data #self.guiim.set_data(self.data[val][4]) #if self.guiiminit: #self.guiim.optimally_resize() #self.guiiminit = False #self.guiim.updateGL() #self.update_plot() # print "self.data[val]=",self.data[val][0].split('#')[-1] self.guiim.qt_parent.setWindowTitle("e2ctfsim - 2D FFT - "+self.data[val][0]) # self.guirealim.qt_parent.setWindowTitle("e2ctf - "+self.data[val][0].split('#')[-1]) self.guiplot.qt_parent.setWindowTitle("e2ctfsim - Plot ") #n=EMUtil.get_image_count(self.data[val][0]) #if n>1: #self.ptcldata=EMData.read_images(self.data[val][0],range(0,min(20,n))) #im=sum(self.ptcldata) #im.mult(1.0/len(self.ptcldata)) #self.ptcldata.insert(0,im) #self.guirealim.set_data(self.ptcldata) #else : self.guirealim.set_data([EMData()]) self.update_plot() def newPlotMode(self,mode): self.plotmode=mode self.update_plot() def newCTF(self) : # print traceback.print_stack() self.data[self.curset][1].defocus=self.sdefocus.value self.data[self.curset][1].bfactor=self.sbfactor.value self.data[self.curset][1].dfdiff=self.sdfdiff.value self.data[self.curset][1].dfang=self.sdfang.value self.data[self.curset][1].apix=self.sapix.value self.data[self.curset][1].ampcont=self.sampcont.value self.data[self.curset][1].voltage=self.svoltage.value self.data[self.curset][1].cs=self.scs.value self.data[self.curset][1].samples=self.ssamples.value if self.img==None or self.img["ny"]!=self.ssamples.value : self.img=EMData(self.ssamples.value+2,self.ssamples.value) self.img.to_zero() self.img.set_complex(1) self.guiim.set_data(self.img) self.update_plot() def realimgkey(self,event): """Keypress in the image display window""" if event.key()==Qt.Key_I: # if user presses I in this window we invert the stack on disk fsp=self.data[self.curset][0] n=EMUtil.get_image_count(fsp) print "Inverting images in %s"%fsp for i in xrange(n): img=EMData(fsp,i) img.mult(-1.0) img.write_image(fsp,i) #self.ptcldata=EMData.read_images(fsp,range(0,20)) #self.guirealim.set_data(self.ptcldata) def imgmousedown(self,event) : m=self.guiim.scr_to_img((event.x(),event.y())) #self.guiim.add_shape("cen",["rect",.9,.9,.4,x0,y0,x0+2,y0+2,1.0]) def imgmousedrag(self,event) : m=self.guiim.scr_to_img((event.x(),event.y())) # box deletion when shift held down #if event.modifiers()&Qt.ShiftModifier: #for i,j in enumerate(self.boxes): def imgmouseup(self,event) : m=self.guiim.scr_to_img((event.x(),event.y())) def plotmousedown(self,event) : m=self.guiim.scr_to_img((event.x(),event.y())) def run(self): """If you make your own application outside of this object, you are free to use your own local app.exec_(). This is a convenience for ctf-only programs.""" self.app.exec_() # E2saveappwin("boxer","imagegeom",self.guiim) # try: # E2setappval("boxer","imcontrol",self.guiim.inspector.isVisible()) # if self.guiim.inspector.isVisible() : E2saveappwin("boxer","imcontrolgeom",self.guiim.inspector) # except : E2setappval("boxer","imcontrol",False) return
class GUIctfsim(QtGui.QWidget): def __init__(self, application, apix=1.0, voltage=300.0, cs=4.1, ac=10.0, samples=256): """CTF simulation dialog """ try: from emimage2d import EMImage2DWidget except: print "Cannot import EMAN image GUI objects (EMImage2DWidget)" sys.exit(1) try: from emplot2d import EMPlot2DWidget except: print "Cannot import EMAN plot GUI objects (is matplotlib installed?)" sys.exit(1) self.app = weakref.ref(application) self.df_voltage = voltage self.df_apix = apix self.df_cs = cs self.df_ac = ac self.df_samples = samples self.img = None QtGui.QWidget.__init__(self, None) self.setWindowIcon(QtGui.QIcon(get_image_directory() + "ctf.png")) self.data = [] self.curset = 0 self.plotmode = 0 self.guiim = EMImage2DWidget(application=self.app()) self.guiiminit = True # a flag that's used to auto resize the first time the gui's set_data function is called self.guiplot = EMPlot2DWidget(application=self.app()) # self.guirealim=EMImage2DWidget(application=self.app()) # This will show the original particle images # self.guirealim.connect(self.guirealim,QtCore.SIGNAL("keypress"),self.realimgkey) self.guiim.connect(self.guiim, QtCore.SIGNAL("mousedown"), self.imgmousedown) self.guiim.connect(self.guiim, QtCore.SIGNAL("mousedrag"), self.imgmousedrag) self.guiim.connect(self.guiim, QtCore.SIGNAL("mouseup"), self.imgmouseup) self.guiplot.connect(self.guiplot, QtCore.SIGNAL("mousedown"), self.plotmousedown) self.guiim.mmode = "app" # This object is itself a widget we need to set up self.hbl = QtGui.QHBoxLayout(self) self.hbl.setMargin(0) self.hbl.setSpacing(6) self.hbl.setObjectName("hbl") # plot list and plot mode combobox self.vbl2 = QtGui.QVBoxLayout() self.setlist = MyListWidget(self) self.setlist.setSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Expanding) self.vbl2.addWidget(self.setlist) self.splotmode = QtGui.QComboBox(self) self.splotmode.addItem("Amplitude") self.splotmode.addItem("Intensity") self.splotmode.addItem("Int w sum") self.splotmode.addItem("Amp w sum") self.vbl2.addWidget(self.splotmode) self.hbl.addLayout(self.vbl2) # ValSliders for CTF parameters self.vbl = QtGui.QVBoxLayout() self.vbl.setMargin(0) self.vbl.setSpacing(6) self.vbl.setObjectName("vbl") self.hbl.addLayout(self.vbl) #self.samp = ValSlider(self,(0,5.0),"Amp:",0) #self.vbl.addWidget(self.samp) self.imginfo = QtGui.QLabel("Info", self) self.vbl.addWidget(self.imginfo) self.sdefocus = ValSlider(self, (0, 5), "Defocus:", 0, 90) self.vbl.addWidget(self.sdefocus) self.sbfactor = ValSlider(self, (0, 1600), "B factor:", 0, 90) self.vbl.addWidget(self.sbfactor) self.sdfdiff = ValSlider(self, (0, 1), "DF Diff:", 0, 90) self.vbl.addWidget(self.sdfdiff) self.sdfang = ValSlider(self, (0, 180), "Df Angle:", 0, 90) self.vbl.addWidget(self.sdfang) self.sampcont = ValSlider(self, (0, 100), "% AC", 0, 90) self.vbl.addWidget(self.sampcont) self.sapix = ValSlider(self, (.2, 10), "A/Pix:", 2, 90) self.vbl.addWidget(self.sapix) self.svoltage = ValSlider(self, (0, 1000), "Voltage (kV):", 0, 90) self.vbl.addWidget(self.svoltage) self.scs = ValSlider(self, (0, 5), "Cs (mm):", 0, 90) self.vbl.addWidget(self.scs) self.ssamples = ValSlider(self, (32, 1024), "# Samples:", 0, 90) self.ssamples.setIntonly(True) self.vbl.addWidget(self.ssamples) self.hbl_buttons = QtGui.QHBoxLayout() self.newbut = QtGui.QPushButton("New") self.hbl_buttons.addWidget(self.newbut) self.vbl.addLayout(self.hbl_buttons) self.on_new_but() QtCore.QObject.connect(self.sdefocus, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.sbfactor, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.sdfdiff, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.sdfang, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.sapix, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.sampcont, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.svoltage, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.scs, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.ssamples, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.setlist, QtCore.SIGNAL("currentRowChanged(int)"), self.newSet) QtCore.QObject.connect(self.setlist, QtCore.SIGNAL("keypress"), self.listkey) QtCore.QObject.connect(self.splotmode, QtCore.SIGNAL("currentIndexChanged(int)"), self.newPlotMode) QtCore.QObject.connect(self.newbut, QtCore.SIGNAL("clicked(bool)"), self.on_new_but) self.resize( 720, 380 ) # figured these values out by printing the width and height in resize event E2loadappwin("e2ctfsim", "main", self) E2loadappwin("e2ctfsim", "image", self.guiim.qt_parent) # E2loadappwin("e2ctf","realimage",self.guirealim.qt_parent) E2loadappwin("e2ctfsim", "plot", self.guiplot.qt_parent) self.setWindowTitle("CTF") def listkey(self, event): if event.key() >= Qt.Key_0 and event.key() <= Qt.Key_9: q = int(event.key()) - Qt.Key_0 self.squality.setValue(q) elif event.key() == Qt.Key_Left: self.sdefocus.setValue(self.sdefocus.getValue() - 0.01) elif event.key() == Qt.Key_Right: self.sdefocus.setValue(self.sdefocus.getValue() + 0.01) elif event.key() == Qt.Key_R: self.on_recall_params() def on_new_but(self): ctf = EMAN2Ctf() ctf.defocus = 1.0 ctf.voltage = self.df_voltage ctf.apix = self.df_apix ctf.cs = self.df_cs ctf.ac = self.df_ac ctf.samples = self.df_samples self.data.append((str(len(self.setlist) + 1), ctf)) self.curset = len(self.data) self.update_data() def show_guis(self): if self.guiim != None: self.app().show_specific(self.guiim) if self.guiplot != None: self.app().show_specific(self.guiplot) #if self.guirealim != None: #self.app().show_specific(self.guirealim) self.show() def closeEvent(self, event): # QtGui.QWidget.closeEvent(self,event) # self.app.app.closeAllWindows() E2saveappwin("e2ctf", "main", self) if self.guiim != None: E2saveappwin("e2ctf", "image", self.guiim.qt_parent) self.app().close_specific(self.guiim) self.guiim = None if self.guiplot != None: E2saveappwin("e2ctf", "plot", self.guiplot.qt_parent) self.app().close_specific(self.guiplot) #if self.guirealim != None: #E2saveappwin("e2ctf","realimage",self.guirealim.qt_parent) #self.app().close_specific(self.guirealim) event.accept() self.app().close_specific(self) self.emit( QtCore.SIGNAL("module_closed") ) # this signal is important when e2ctf is being used by a program running its own event loop def update_data(self): """This will make sure the various widgets properly show the current data sets""" self.setlist.clear() for i, j in enumerate(self.data): self.setlist.addItem(j[0]) self.setlist.setCurrentRow(self.curset) def update_plot(self): if self.guiplot == None: return # it's closed/not visible for d in xrange(len(self.data)): ctf = self.data[d][1] ds = 1.0 / (ctf.apix * 2.0 * ctf.samples) s = arange(0, ds * ctf.samples, ds) curve = array(ctf.compute_1d(len(s) * 2, ds, Ctf.CtfType.CTF_AMP)) if self.plotmode == 1 or self.plotmode == 2: curve = curve**2 if self.plotmode == 2 or self.plotmode == 3: if d == 0: avg = curve[:] else: if len(curve) != len(avg): print "Number of samples must be fixed to compute an average ({})".format( d + 1) else: avg += curve self.guiplot.set_data((s, curve), self.data[d][0], d == 0, True, color=d + 1) if self.plotmode in (2, 3): self.guiplot.set_data((s, avg), "Sum", False, True, color=0) self.guiplot.setAxisParms("s (1/$\AA$)", "CTF") ctf.compute_2d_complex(self.img, Ctf.CtfType.CTF_AMP, None) self.guiim.set_data(self.img) def newSet(self, val=0): "called when a new data set is selected from the list" self.curset = val self.sdefocus.setValue(self.data[val][1].defocus, True) self.sbfactor.setValue(self.data[val][1].bfactor, True) self.sapix.setValue(self.data[val][1].apix, True) self.sampcont.setValue(self.data[val][1].ampcont, True) self.svoltage.setValue(self.data[val][1].voltage, True) self.scs.setValue(self.data[val][1].cs, True) self.sdfdiff.setValue(self.data[val][1].dfdiff, True) self.sdfang.setValue(self.data[val][1].dfang, True) self.ssamples.setValue(self.data[val][1].samples, True) # make new image if necessary if self.img == None or self.img["ny"] != self.data[val][1].samples: self.img = EMData(self.data[val][1].samples + 2, self.data[val][1].samples) self.img.to_zero() self.img.set_complex(1) self.guiim.set_data(self.img) # self.imginfo.setText("%s particles SNR = %s"%(ptcl,ssnr)) #if self.guiim != None: ## print self.data #self.guiim.set_data(self.data[val][4]) #if self.guiiminit: #self.guiim.optimally_resize() #self.guiiminit = False #self.guiim.updateGL() #self.update_plot() # print "self.data[val]=",self.data[val][0].split('#')[-1] self.guiim.qt_parent.setWindowTitle("e2ctfsim - 2D FFT - " + self.data[val][0]) # self.guirealim.qt_parent.setWindowTitle("e2ctf - "+self.data[val][0].split('#')[-1]) self.guiplot.qt_parent.setWindowTitle("e2ctfsim - Plot ") #n=EMUtil.get_image_count(self.data[val][0]) #if n>1: #self.ptcldata=EMData.read_images(self.data[val][0],range(0,min(20,n))) #im=sum(self.ptcldata) #im.mult(1.0/len(self.ptcldata)) #self.ptcldata.insert(0,im) #self.guirealim.set_data(self.ptcldata) #else : self.guirealim.set_data([EMData()]) self.update_plot() def newPlotMode(self, mode): self.plotmode = mode self.update_plot() def newCTF(self): # print traceback.print_stack() self.data[self.curset][1].defocus = self.sdefocus.value self.data[self.curset][1].bfactor = self.sbfactor.value self.data[self.curset][1].dfdiff = self.sdfdiff.value self.data[self.curset][1].dfang = self.sdfang.value self.data[self.curset][1].apix = self.sapix.value self.data[self.curset][1].ampcont = self.sampcont.value self.data[self.curset][1].voltage = self.svoltage.value self.data[self.curset][1].cs = self.scs.value self.data[self.curset][1].samples = self.ssamples.value if self.img == None or self.img["ny"] != self.ssamples.value: self.img = EMData(self.ssamples.value + 2, self.ssamples.value) self.img.to_zero() self.img.set_complex(1) self.guiim.set_data(self.img) self.update_plot() def realimgkey(self, event): """Keypress in the image display window""" if event.key( ) == Qt.Key_I: # if user presses I in this window we invert the stack on disk fsp = self.data[self.curset][0] n = EMUtil.get_image_count(fsp) print "Inverting images in %s" % fsp for i in xrange(n): img = EMData(fsp, i) img.mult(-1.0) img.write_image(fsp, i) #self.ptcldata=EMData.read_images(fsp,range(0,20)) #self.guirealim.set_data(self.ptcldata) def imgmousedown(self, event): m = self.guiim.scr_to_img((event.x(), event.y())) #self.guiim.add_shape("cen",["rect",.9,.9,.4,x0,y0,x0+2,y0+2,1.0]) def imgmousedrag(self, event): m = self.guiim.scr_to_img((event.x(), event.y())) # box deletion when shift held down #if event.modifiers()&Qt.ShiftModifier: #for i,j in enumerate(self.boxes): def imgmouseup(self, event): m = self.guiim.scr_to_img((event.x(), event.y())) def plotmousedown(self, event): m = self.guiim.scr_to_img((event.x(), event.y())) def run(self): """If you make your own application outside of this object, you are free to use your own local app.exec_(). This is a convenience for ctf-only programs.""" self.app.exec_() # E2saveappwin("boxer","imagegeom",self.guiim) # try: # E2setappval("boxer","imcontrol",self.guiim.inspector.isVisible()) # if self.guiim.inspector.isVisible() : E2saveappwin("boxer","imcontrolgeom",self.guiim.inspector) # except : E2setappval("boxer","imcontrol",False) return
def __init__(self,application,apix=1.0,voltage=300.0,cs=4.1,ac=10.0,samples=256): """CTF simulation dialog """ try: from emimage2d import EMImage2DWidget except: print "Cannot import EMAN image GUI objects (EMImage2DWidget)" sys.exit(1) try: from emplot2d import EMPlot2DWidget except: print "Cannot import EMAN plot GUI objects (is matplotlib installed?)" sys.exit(1) self.app = weakref.ref(application) self.df_voltage=voltage self.df_apix=apix self.df_cs=cs self.df_ac=ac self.df_samples=samples self.img=None QtGui.QWidget.__init__(self,None) self.setWindowIcon(QtGui.QIcon(get_image_directory() + "ctf.png")) self.data=[] self.curset=0 self.plotmode=0 self.guiim=EMImage2DWidget(application=self.app()) self.guiiminit = True # a flag that's used to auto resize the first time the gui's set_data function is called self.guiplot=EMPlot2DWidget(application=self.app()) # self.guirealim=EMImage2DWidget(application=self.app()) # This will show the original particle images # self.guirealim.connect(self.guirealim,QtCore.SIGNAL("keypress"),self.realimgkey) self.guiim.connect(self.guiim,QtCore.SIGNAL("mousedown"),self.imgmousedown) self.guiim.connect(self.guiim,QtCore.SIGNAL("mousedrag"),self.imgmousedrag) self.guiim.connect(self.guiim,QtCore.SIGNAL("mouseup") ,self.imgmouseup) self.guiplot.connect(self.guiplot,QtCore.SIGNAL("mousedown"),self.plotmousedown) self.guiim.mmode="app" # This object is itself a widget we need to set up self.hbl = QtGui.QHBoxLayout(self) self.hbl.setMargin(0) self.hbl.setSpacing(6) self.hbl.setObjectName("hbl") # plot list and plot mode combobox self.vbl2 = QtGui.QVBoxLayout() self.setlist=MyListWidget(self) self.setlist.setSizePolicy(QtGui.QSizePolicy.Preferred,QtGui.QSizePolicy.Expanding) self.vbl2.addWidget(self.setlist) self.splotmode=QtGui.QComboBox(self) self.splotmode.addItem("Amplitude") self.splotmode.addItem("Intensity") self.splotmode.addItem("Int w sum") self.splotmode.addItem("Amp w sum") self.vbl2.addWidget(self.splotmode) self.hbl.addLayout(self.vbl2) # ValSliders for CTF parameters self.vbl = QtGui.QVBoxLayout() self.vbl.setMargin(0) self.vbl.setSpacing(6) self.vbl.setObjectName("vbl") self.hbl.addLayout(self.vbl) #self.samp = ValSlider(self,(0,5.0),"Amp:",0) #self.vbl.addWidget(self.samp) self.imginfo=QtGui.QLabel("Info",self) self.vbl.addWidget(self.imginfo) self.sdefocus=ValSlider(self,(0,5),"Defocus:",0,90) self.vbl.addWidget(self.sdefocus) self.sbfactor=ValSlider(self,(0,1600),"B factor:",0,90) self.vbl.addWidget(self.sbfactor) self.sdfdiff=ValSlider(self,(0,1),"DF Diff:",0,90) self.vbl.addWidget(self.sdfdiff) self.sdfang=ValSlider(self,(0,180),"Df Angle:",0,90) self.vbl.addWidget(self.sdfang) self.sampcont=ValSlider(self,(0,100),"% AC",0,90) self.vbl.addWidget(self.sampcont) self.sapix=ValSlider(self,(.2,10),"A/Pix:",2,90) self.vbl.addWidget(self.sapix) self.svoltage=ValSlider(self,(0,1000),"Voltage (kV):",0,90) self.vbl.addWidget(self.svoltage) self.scs=ValSlider(self,(0,5),"Cs (mm):",0,90) self.vbl.addWidget(self.scs) self.ssamples=ValSlider(self,(32,1024),"# Samples:",0,90) self.ssamples.setIntonly(True) self.vbl.addWidget(self.ssamples) self.hbl_buttons = QtGui.QHBoxLayout() self.newbut = QtGui.QPushButton("New") self.hbl_buttons.addWidget(self.newbut) self.vbl.addLayout(self.hbl_buttons) self.on_new_but() QtCore.QObject.connect(self.sdefocus, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.sbfactor, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.sdfdiff, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.sdfang, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.sapix, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.sampcont, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.svoltage, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.scs, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.ssamples, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.setlist,QtCore.SIGNAL("currentRowChanged(int)"),self.newSet) QtCore.QObject.connect(self.setlist,QtCore.SIGNAL("keypress"),self.listkey) QtCore.QObject.connect(self.splotmode,QtCore.SIGNAL("currentIndexChanged(int)"),self.newPlotMode) QtCore.QObject.connect(self.newbut,QtCore.SIGNAL("clicked(bool)"),self.on_new_but) self.resize(720,380) # figured these values out by printing the width and height in resize event E2loadappwin("e2ctfsim","main",self) E2loadappwin("e2ctfsim","image",self.guiim.qt_parent) # E2loadappwin("e2ctf","realimage",self.guirealim.qt_parent) E2loadappwin("e2ctfsim","plot",self.guiplot.qt_parent) self.setWindowTitle("CTF")
class TrackerControl(QtGui.QWidget): def __init__(self,app,maxshift,invert=False,seqali=False,tiltstep=2.0): self.app=app self.maxshift=maxshift self.seqali=seqali self.invert=invert self.tiltstep=tiltstep # the control panel QtGui.QWidget.__init__(self,None) self.gbl = QtGui.QGridLayout(self) self.gbl.setMargin(0) self.gbl.setSpacing(6) self.gbl.setObjectName("hbl") # action buttons self.bcenalign=QtGui.QPushButton("Center Align") self.bprojalign=QtGui.QPushButton("Proj. Realign") self.btiltaxis=QtGui.QPushButton("Tilt Axis") self.btiltaxisval=QtGui.QLineEdit("90.0") self.bsavedata=QtGui.QPushButton("Save Data") self.breconst=QtGui.QPushButton("3D Normal") self.sbmode=QtGui.QSpinBox(self) self.sbmode.setRange(0,2) self.sbmode.setValue(0) self.bmagict=QtGui.QPushButton("3D Tomofill") self.bmagics=QtGui.QPushButton("3D Sph") self.bmagicc=QtGui.QPushButton("3D Cyl") self.vslpfilt=ValSlider(self,(0,.5),"Filter",0.5,50) self.gbl.addWidget(self.bcenalign,0,0) self.gbl.addWidget(self.bprojalign,0,1) self.gbl.addWidget(self.btiltaxis,0,2) self.gbl.addWidget(self.btiltaxisval,0,3) # self.gbl.addWidget(self.bsavedata,0,3) self.gbl.addWidget(self.breconst,1,0) self.gbl.addWidget(self.sbmode,2,0,1,1) self.gbl.addWidget(self.vslpfilt,3,0,1,4) self.gbl.addWidget(self.bmagict,1,1) self.gbl.addWidget(self.bmagics,1,2) self.gbl.addWidget(self.bmagicc,1,3) QtCore.QObject.connect(self.bcenalign,QtCore.SIGNAL("clicked(bool)"),self.do_cenalign) QtCore.QObject.connect(self.bprojalign,QtCore.SIGNAL("clicked(bool)"),self.do_projalign) QtCore.QObject.connect(self.btiltaxis,QtCore.SIGNAL("clicked(bool)"),self.do_tiltaxis) QtCore.QObject.connect(self.bsavedata,QtCore.SIGNAL("clicked(bool)"),self.do_savedata) QtCore.QObject.connect(self.breconst,QtCore.SIGNAL("clicked(bool)"),self.do_reconst) QtCore.QObject.connect(self.bmagict,QtCore.SIGNAL("clicked(bool)"),self.do_magict) QtCore.QObject.connect(self.bmagics,QtCore.SIGNAL("clicked(bool)"),self.do_magics) QtCore.QObject.connect(self.bmagicc,QtCore.SIGNAL("clicked(bool)"),self.do_magicc) QtCore.QObject.connect(self.vslpfilt,QtCore.SIGNAL("valueChanged"),self.do_filter) # the single image display widget self.im2d = EMImage2DWidget(application=app,winid="tomotrackbox.big") self.imboxed = EMImage2DWidget(application=app,winid="tomotrackbox.small") self.improj = EMImage2DWidget(application=app,winid="tomotrackbox.proj") self.imslice = EMImage2DWidget(application=app,winid="tomotrackbox.3dslice") self.imvol = EMImage3DModule(application=app,winid="tomotrackbox.3d") # get some signals from the window. QtCore.QObject.connect(self.im2d,QtCore.SIGNAL("mousedown"),self.down) QtCore.QObject.connect(self.im2d,QtCore.SIGNAL("mousedrag"),self.drag) QtCore.QObject.connect(self.im2d,QtCore.SIGNAL("mouseup"),self.up) QtCore.QObject.connect(self.im2d,QtCore.SIGNAL("increment_list_data"),self.change_tilt) self.imagefile=None self.imageparm=None self.tiltshapes=None self.curtilt=0 self.oldtilt=self.curtilt self.map3d=None self.downloc=None self.downadjloc=None self.show() self.im2d.show() def closeEvent(self,event): self.im2d.closeEvent(QtGui.QCloseEvent()) self.imboxed.closeEvent(QtGui.QCloseEvent()) self.improj.closeEvent(QtGui.QCloseEvent()) self.imslice.closeEvent(QtGui.QCloseEvent()) self.imvol.closeEvent(QtGui.QCloseEvent()) event.accept() def do_cenalign(self,x=0): """In response to the center align button. Just a wrapper""" self.cenalign_stack() self.update_stack() def do_projalign(self,x=0): """In response to the projection align button. Just a wrapper""" self.projection_align(self.tiltstep) self.update_stack() # self.do_reconst() def do_tiltaxis(self): """In response to the tilt axis button. Just a wrapper""" self.tilt_axis() def do_reconst(self,x=0): """In response to the normal reconstruction button. Just a wrapper""" stack=self.get_boxed_stack() mode=self.sbmode.value() self.map3d=self.reconstruct(stack,self.tiltstep,mode) self.update_3d() def do_magict(self,x): """In response to tomographic filling reconstruction button. Just a wrapper""" stack=self.get_boxed_stack() # self.map3d=self.reconstruct_ca(stack[5:-4],0.5) # init=self.reconstruct_ca(stack[5:-4],0.5) mode=self.sbmode.value() self.map3d=self.reconstruct_wedgefill(stack,self.tiltstep,mode) self.update_3d() def do_magics(self,x): """In response to the 3D Sph button. Just a wrapper""" return def do_magicc(self,x): """In response to the 3D cyl button. Just a wrapper""" return def do_filter(self,v): """In response to the filter ValSlider""" if self.map3d==None : return self.lpfilt=v self.update_3d() def do_savedata(self): "" def update_3d(self): if self.map3d==None : return self.filt3d=self.map3d.process("filter.lowpass.gauss",{"cutoff_abs":self.vslpfilt.getValue()}) self.imvol.set_data(self.filt3d) self.imvol.show() self.imvol.updateGL() sz=self.map3d["nx"] xsum=self.filt3d.process("misc.directional_sum",{"axis":"x"}) xsum.set_size(sz,sz,1) ysum=self.filt3d.process("misc.directional_sum",{"axis":"y"}) ysum.set_size(sz,sz,1) zsum=self.filt3d.process("misc.directional_sum",{"axis":"z"}) zsum.set_size(sz,sz,1) self.improj.set_data([zsum,ysum,xsum]) self.improj.show() self.improj.updateGL() self.imslice.set_data(self.filt3d) self.imslice.show() self.imslice.updateGL() def update_stack(self): stack=self.get_boxed_stack() self.imboxed.set_data(stack) self.imboxed.show() self.imboxed.updateGL() def set_image(self,fsp): """Takes an ali file to process""" self.imageparm=EMData(fsp,0,True).get_attr_dict() print "%d slices at %d x %d"%(self.imageparm["nz"],self.imageparm["nx"],self.imageparm["ny"]) self.imagefile=fsp self.curtilt=self.imageparm["nz"]/2 self.tiltshapes=[None for i in range(self.imageparm["nz"])] self.update_tilt() def update_tilt(self): if self.imagefile==None : return self.curimg=EMData(self.imagefile,0,False,Region(0,0,self.curtilt,self.imageparm["nx"],self.imageparm["ny"],1)) if self.invert : self.curimg.mult(-1.0) self.im2d.set_data(self.curimg) s=EMShape(["scrlabel",.7,.3,0,20.0,20.0,"%d"%self.curtilt,200.0,1]) self.im2d.add_shape("tilt",s) if self.tiltshapes[self.curtilt]!=None : self.im2d.add_shape("finalbox",self.tiltshapes[self.curtilt]) s0=self.tiltshapes[self.oldtilt].getShape() s1=self.tiltshapes[self.curtilt].getShape() dx=s0[4]-s1[4] dy=s0[5]-s1[5] self.im2d.set_origin(self.im2d.origin[0]-dx,self.im2d.origin[1]-dy) self.oldtilt=self.curtilt self.im2d.updateGL() def change_tilt(self,direc): """When the user presses the up or down arrow""" self.oldtilt=self.curtilt self.curtilt+=direc if self.curtilt<0 : self.curtilt=0 if self.curtilt>=self.imageparm["nz"] : self.curtilt=self.imageparm["nz"]-1 self.update_tilt() def down(self,event,lc): """The event contains the x,y coordinates in window space, lc are the coordinates in image space""" if event.buttons()&Qt.LeftButton: if event.modifiers()&Qt.ShiftModifier : self.downadjloc=(lc,self.tiltshapes[self.curtilt].getShape()[4:8]) else : self.downloc=lc def drag(self,event,lc): if self.downloc!=None: dx=abs(lc[0]-self.downloc[0]) dy=abs(lc[1]-self.downloc[1]) dx=max(dx,dy) # Make box square dx=good_size(dx*2)/2 # use only good sizes dy=dx s=EMShape(["rectpoint",0,.7,0,self.downloc[0]-dx,self.downloc[1]-dy,self.downloc[0]+dx,self.downloc[1]+dy,1]) self.im2d.add_shape("box",s) s=EMShape(["scrlabel",.7,.7,0,20.0,20.0,"%d (%d x %d)"%(self.curtilt,dx*2,dy*2),200.0,1]) self.im2d.add_shape("tilt",s) elif self.downadjloc!=None: dx=(lc[0]-self.downadjloc[0][0]) dy=(lc[1]-self.downadjloc[0][1]) s=self.tiltshapes[self.curtilt].getShape()[:] s[4]=self.downadjloc[1][0]+dx s[5]=self.downadjloc[1][1]+dy s[6]=self.downadjloc[1][2]+dx s[7]=self.downadjloc[1][3]+dy self.im2d.add_shape("box",EMShape(s)) self.im2d.updateGL() def up(self,event,lc): if self.downloc!=None : dx=abs(lc[0]-self.downloc[0]) dy=abs(lc[1]-self.downloc[1]) dx=max(dx,dy) # Make box square dx=good_size(dx*2)/2 # use only good sizes dy=dx s=EMShape(["rectpoint",.7,.2,0,self.downloc[0]-dx,self.downloc[1]-dy,self.downloc[0]+dx,self.downloc[1]+dy,1]) self.im2d.del_shape("box") if hypot(lc[0]-self.downloc[0],lc[1]-self.downloc[1])>5 : self.tiltshapes=[None for i in range(self.imageparm["nz"])] self.find_boxes(s) self.update_tilt() self.downloc=None elif self.downadjloc!=None : dx=(lc[0]-self.downadjloc[0][0]) dy=(lc[1]-self.downadjloc[0][1]) s=self.tiltshapes[self.curtilt].getShape()[:] s[4]=self.downadjloc[1][0]+dx s[5]=self.downadjloc[1][1]+dy s[6]=self.downadjloc[1][2]+dx s[7]=self.downadjloc[1][3]+dy self.tiltshapes[self.curtilt]=EMShape(s) self.im2d.add_shape("finalbox",self.tiltshapes[self.curtilt]) self.im2d.del_shape("box") self.update_tilt() self.update_stack() self.downadjloc=None def get_boxed_stack(self): stack=[] for i in range(self.imageparm["nz"]): refshape=self.tiltshapes[i].getShape() img=EMData(self.imagefile,0,False,Region(refshape[4],refshape[5],i,refshape[6]-refshape[4],refshape[7]-refshape[5],1)) img["ptcl_source_coord"]=(int((refshape[6]+refshape[4])/2.0),int((refshape[7]+refshape[5])/2.0),i) img["ptcl_source_image"]=str(self.imagefile) if self.invert : img.mult(-1.0) img.process_inplace("normalize.edgemean") stack.append(img) return stack def cenalign_stack(self): """This will perform an iterative centering process on a stack of particle images, centering each on the average. It will modify the current stack of boxing parameters in-place""" for it in range(5): stack=self.get_boxed_stack() # Average the stack, and center it av=stack[0].copy() for im in stack[1:]: av.add(im) av.process_inplace("filter.lowpass.gauss",{"cutoff_abs":.1}) av.process_inplace("filter.highpass.gauss",{"cutoff_abs":.02}) av.process_inplace("xform.centeracf") #display((av,av2)) # align to the average for i,im in enumerate(stack): im.process_inplace("filter.lowpass.gauss",{"cutoff_abs":.1}) im.process_inplace("filter.highpass.gauss",{"cutoff_abs":.02}) ali=im.align("translational",av) trans=ali["xform.align2d"].get_trans() shape=self.tiltshapes[i] shape.translate(-trans[0],-trans[1]) # Update the stack display stack=self.get_boxed_stack() self.imboxed.set_data(stack) def reconstruct_wedgefill(self,stack,angstep,mode=2): """Fills the missing wedge with the average of the slices""" print "Making 3D tomofill" taxis=float(self.btiltaxisval.text()) boxsize=stack[0]["nx"] pad=Util.calc_best_fft_size(int(boxsize*1.5)) # average all of the slices together av=stack[0].copy() for p in stack[1:]: av+=p av.del_attr("xform.projection") av.mult(1.0/(len(stack))) av=av.get_clip(Region(-(pad-boxsize)/2,-(pad-boxsize)/2,pad,pad)) for i,p in enumerate(stack) : p["alt"]=(i-len(stack)/2)*angstep # Determine a good angular step for filling Fourier space fullsamp=360.0/(boxsize*pi) if angstep/fullsamp>2.0 : samp=1.0/(floor(angstep/fullsamp)) else : samp=angstep print "Subsampling = %1.2f"%samp # Now the reconstruction recon=Reconstructors.get("fourier", {"sym":"c1","size":(pad,pad,pad),"mode":reconmodes[mode],"verbose":True}) recon.setup() for ri in range(5): print "Iteration ",ri for a in [i*samp for i in range(-int(90.0/samp),int(90.0/samp)+1)]: for ii in range(len(stack)-1): if stack[ii]["alt"]<=a and stack[ii+1]["alt"]>a : break else: ii=-1 if a<stack[0]["alt"] : p=av #frac=0.5*(a-stack[0]["alt"])/(-90.0-stack[0]["alt"]) ## a bit wierd. At the ends (missing wedge) we use the average over all tilts. This could be improved #p=stack[0].get_clip(Region(-(pad-boxsize)/2,-(pad-boxsize)/2,pad,pad))*(1.0-frac)+stack[-1].get_clip(Region(-(pad-boxsize)/2,-(pad-boxsize)/2,pad,pad))*frac # print a," avg ",frac,stack[0]["alt"] elif ii==-1 : p=av #frac=0.5*(a-stack[-1]["alt"])/(90.0-stack[-1]["alt"])+.5 ## a bit wierd. At the ends (missing wedge) we use the average over all tilts. This could be improved #p=stack[-1].get_clip(Region(-(pad-boxsize)/2,-(pad-boxsize)/2,pad,pad))*(1.0-frac)+stack[0].get_clip(Region(-(pad-boxsize)/2,-(pad-boxsize)/2,pad,pad))*frac # print a," avg ",frac else: # We average slices in real space, producing a rotational 'smearing' effect frac=(a-stack[ii]["alt"])/angstep p=stack[ii].get_clip(Region(-(pad-boxsize)/2,-(pad-boxsize)/2,pad,pad))*(1.0-frac)+stack[ii+1].get_clip(Region(-(pad-boxsize)/2,-(pad-boxsize)/2,pad,pad))*frac # print a,ii,ii+1,stack[ii]["alt"],frac xf=Transform({"type":"eman","alt":a,"az":-taxis,"phi":taxis}) p["xform.projection"]=xf if ri%2==1: recon.determine_slice_agreement(p,xf,1) else : recon.insert_slice(p,xf) ret=recon.finish() print "Done" ret=ret.get_clip(Region((pad-boxsize)/2,(pad-boxsize)/2,(pad-boxsize)/2,boxsize,boxsize,boxsize)) ret.process_inplace("normalize.edgemean") # ret=ret.get_clip(Region((pad-boxsize)/2,(pad-boxsize)/2,(pad-boxsize)/2,boxsize,boxsize,boxsize)) return ret def reconstruct_ca(self,stack,angstep,mode=2): """Cylindrically averaged tomographic model, generally used for filling empty spaces. Returned volume is padded.""" print "Making CA" taxis=float(self.btiltaxisval.text()) boxsize=stack[0]["nx"] pad=Util.calc_best_fft_size(int(boxsize*1.5)) # average all of the slices together av=stack[0].copy() for p in stack[1:]: av+=p av.del_attr("xform.projection") p.mult(1.0/len(stack)) av=av.get_clip(Region(-(pad-boxsize)/2,-(pad-boxsize)/2,pad,pad)) recon=Reconstructors.get("fourier", {"quiet":True,"sym":"c1","x_in":pad,"y_in":pad}) recon.setup() for ri in range(3): if ri>0 : alt=-180.0 while (alt<180.0): recon.determine_slice_agreement(av,Transform({"type":"eman","alt":alt,"az":-taxis,"phi":taxis}),1) alt+=angstep alt=-180.0 while (alt<180.0) : recon.insert_slice(av,Transform({"type":"eman","alt":alt,"az":-taxis,"phi":taxis})) alt+=angstep ret=recon.finish() ret.process_inplace("normalize.edgemean") # ret=ret.get_clip(Region((pad-boxsize)/2,(pad-boxsize)/2,(pad-boxsize)/2,boxsize,boxsize,boxsize)) return ret def reconstruct(self,stack,angstep,mode=0,initmodel=None): """ Tomographic reconstruction of the current stack """ if initmodel!=None : print "Using initial model" taxis=float(self.btiltaxisval.text()) boxsize=stack[0]["nx"] pad=good_size(int(boxsize*1.5)) for i,p in enumerate(stack) : p["xform.projection"]=Transform({"type":"eman","alt":(i-len(stack)/2)*angstep,"az":-taxis,"phi":taxis}) recon=Reconstructors.get("fourier", {"sym":"c1","size":(pad,pad,pad),"mode":reconmodes[mode],"verbose":True}) if initmodel!=None : recon.setup(initmodel,.01) else : recon.setup() scores=[] # First pass to assess qualities and normalizations for i,p in enumerate(stack): p2=p.get_clip(Region(-(pad-boxsize)/2,-(pad-boxsize)/2,pad,pad)) p2=recon.preprocess_slice(p2,p["xform.projection"]) recon.insert_slice(p2,p["xform.projection"],1.0) print " %d \r"%i print "" # after building the model once we can assess how well everything agrees for p in stack: p2=p.get_clip(Region(-(pad-boxsize)/2,-(pad-boxsize)/2,pad,pad)) p2=recon.preprocess_slice(p2,p["xform.projection"]) recon.determine_slice_agreement(p2,p["xform.projection"],1.0,True) scores.append((p2["reconstruct_absqual"],p2["reconstruct_norm"])) print " %d\t%1.3f \r"%(i,scores[-1][0]) print "" # clear out the first reconstruction (probably no longer necessary) # ret=recon.finish(True) # ret=None # setup for the second run if initmodel!=None : recon.setup(initmodel,.01) else : recon.setup() thr=0.7*(scores[len(scores)/2][0]+scores[len(scores)/2-1][0]+scores[len(scores)/2+1][0])/3; # this is rather arbitrary # First pass to assess qualities and normalizations for i,p in enumerate(stack): if scores[i][0]<thr : print "%d. %1.3f *"%(i,scores[i][0]) continue print "%d. %1.2f \t%1.3f\t%1.3f"%(i,p["xform.projection"].get_rotation("eman")["alt"],scores[i][0],scores[i][1]) p2=p.get_clip(Region(-(pad-boxsize)/2,-(pad-boxsize)/2,pad,pad)) p2=recon.preprocess_slice(p2,p["xform.projection"]) p2.mult(scores[i][1]) recon.insert_slice(p2,p["xform.projection"],1.0) # plot(scores) recon.set_param("savenorm","norm.mrc") ret=recon.finish(True) ret=ret.get_clip(Region((pad-boxsize)/2,(pad-boxsize)/2,(pad-boxsize)/2,boxsize,boxsize,boxsize)) # print "Quality: ",qual return ret def tilt_axis(self): ntilt=self.imageparm["nz"] sz=good_size(self.imageparm["nx"]/2) while 1: av=None n=0 for i in range(ntilt): refshape=self.tiltshapes[i].getShape() if refshape[4]<=sz/2 or refshape[5]<=sz/2 or self.imageparm["nx"]-refshape[4]<=sz/2 or self.imageparm["ny"]-refshape[5]<=sz/2 : break img=EMData(self.imagefile,0,False,Region(refshape[4]-sz/2,refshape[5]-sz/2,i,sz,sz,1)) if self.invert : img.mult(-1.0) img.process_inplace("normalize.edgemean") if av==None: av=img else : av.add(img) n+=1 if n==ntilt : break sz/=2 if sz<32: return print "You may wish to center on a feature closer to the center of the image next time -> ",sz sz2=good_size(sz+128) av2=av.get_clip(Region((sz-sz2)/2,(sz-sz2)/2,sz2,sz2)) av2.process_inplace("mask.zeroedgefill") av2.process_inplace("filter.flattenbackground",{"radius":64}) av=av2.get_clip(Region((sz2-sz)/2,(sz2-sz)/2,sz,sz)) av.process_inplace("normalize.edgemean") av.process_inplace("mask.sharp",{"outer_radius":sz/2-1}) # display(av) f=av.do_fft() d=f.calc_az_dist(360,-90.25,0.5,10.0,sz/2-1) d=[(i,j*0.5-90) for j,i in enumerate(d)] self.btiltaxisval.setText(str(max(d)[1])) # print max(d) # print min(d) # plot(d) def projection_align(self,angstep=2.0): """realign the current set of boxes using iterative projection matching""" taxis=float(self.btiltaxisval.text()) stack=self.get_boxed_stack() for i,p in enumerate(stack) : ort=Transform({"type":"eman","alt":(i-len(stack)/2)*angstep,"az":-taxis,"phi":taxis}) # is this right ? curshape=self.tiltshapes[i].getShape() # Read the reference at the user specified size, then pad it a bit ref=self.map3d.project("standard",ort) ref.process_inplace("filter.lowpass.gauss",{"cutoff_abs":.1}) ref.process_inplace("normalize.edgemean") ref=ref.get_clip(Region(-self.maxshift,-self.maxshift,ref["nx"]+self.maxshift*2,ref["ny"]+self.maxshift*2)) # when we read the alignment target, we pad with actual image data since the object will have moved trg=EMData(self.imagefile,0,False,Region(curshape[4]-self.maxshift,curshape[5]-self.maxshift,i,curshape[6]-curshape[4]+self.maxshift*2,curshape[7]-curshape[5]+self.maxshift*2,1)) trg.process_inplace("filter.lowpass.gauss",{"cutoff_abs":.1}) trg.process_inplace("normalize.edgemean") if self.invert : trg.mult(-1.0) aln=ref.align("translational",trg,{"intonly":1,"maxshift":self.maxshift*4/5}) trans=aln["xform.align2d"].get_trans() print i,trans[0],trans[1] if i>len(stack)-4 : display([ref,trg,aln]) # if i==self.curtilt+3 : display((ref,trg,aln,ref.calc_ccf(trg))) self.tiltshapes[i].translate(trans[0],trans[1]) def find_boxes(self,mainshape): """Starting with a user selected box at the current tilt, search for the same shape in the entire tilt series""" if self.imagefile==None: return self.tiltshapes[self.curtilt]=mainshape lref=None for i in range(self.curtilt+1,self.imageparm["nz"]): refshape=self.tiltshapes[i-1].getShape() # Read the reference at the user specified size, then pad it a bit ref=EMData(self.imagefile,0,False,Region(refshape[4],refshape[5],i-1,refshape[6]-refshape[4],refshape[7]-refshape[5],1)) ref.process_inplace("threshold.clampminmax.nsigma",{"nsigma":4.0}) ref.process_inplace("filter.lowpass.gauss",{"cutoff_abs":.1}) ref.process_inplace("normalize.edgemean") ref=ref.get_clip(Region(-self.maxshift,-self.maxshift,ref["nx"]+self.maxshift*2,ref["ny"]+self.maxshift*2)) if lref!=None and self.seqali : ref.add(lref) ref.process_inplace("normalize.edgemean") # older images contribute less lref=ref # when we read the alignment target, we pad with actual image data since the object will have moved trg=EMData(self.imagefile,0,False,Region(refshape[4]-self.maxshift,refshape[5]-self.maxshift,i,refshape[6]-refshape[4]+self.maxshift*2,refshape[7]-refshape[5]+self.maxshift*2,1)) trg.process_inplace("threshold.clampminmax.nsigma",{"nsigma":4.0}) trg.process_inplace("filter.lowpass.gauss",{"cutoff_abs":.1}) trg.process_inplace("normalize.edgemean") aln=ref.align("translational",trg,{"intonly":1,"maxshift":self.maxshift*4/5,"masked":1}) ref.write_image("dbug.hdf",-1) trg.write_image("dbug.hdf",-1) aln.write_image("dbug.hdf",-1) trans=aln["xform.align2d"].get_trans() # if i==self.curtilt+3 : display((ref,trg,aln,ref.calc_ccf(trg))) self.tiltshapes[i]=EMShape(["rectpoint",.7,.2,0,refshape[4]+trans[0],refshape[5]+trans[1],refshape[6]+trans[0],refshape[7]+trans[1],1]) print i,trans[0],trans[1] lref=None for i in range(self.curtilt-1,-1,-1): refshape=self.tiltshapes[i+1].getShape() # Read the reference at the user specified size, then pad it a bit ref=EMData(self.imagefile,0,False,Region(refshape[4],refshape[5],i+1,refshape[6]-refshape[4],refshape[7]-refshape[5],1)) ref.process_inplace("filter.lowpass.gauss",{"cutoff_abs":.1}) ref.process_inplace("normalize.edgemean") ref=ref.get_clip(Region(-self.maxshift,-self.maxshift,ref["nx"]+self.maxshift*2,ref["ny"]+self.maxshift*2)) if lref!=None and self.seqali : ref.add(lref) ref.process_inplace("normalize.edgemean") lref=ref # when we read the alignment target, we pad with actual image data since the object will have moved trg=EMData(self.imagefile,0,False,Region(refshape[4]-self.maxshift,refshape[5]-self.maxshift,i,refshape[6]-refshape[4]+self.maxshift*2,refshape[7]-refshape[5]+self.maxshift*2,1)) trg.process_inplace("filter.lowpass.gauss",{"cutoff_abs":.1}) trg.process_inplace("normalize.edgemean") aln=ref.align("translational",trg,{"intonly":1,"maxshift":self.maxshift*4/5,"masked":1}) trans=aln["xform.align2d"].get_trans() if i==self.curtilt+3 : display((ref,trg,aln,ref.calc_ccf(trg))) self.tiltshapes[i]=EMShape(["rectpoint",.7,.2,0,refshape[4]+trans[0],refshape[5]+trans[1],refshape[6]+trans[0],refshape[7]+trans[1],1]) print i,trans[0],trans[1] self.update_stack()
class EMIsoInspector(QtGui.QWidget): def __init__(self, target, enable_browse=False): QtGui.QWidget.__init__(self, None) self.setWindowIcon(QtGui.QIcon(get_image_directory() + "desktop.png")) self.target = weakref.ref(target) self.rotation_sliders = EMTransformPanel(target, self) self.vbl = QtGui.QVBoxLayout(self) self.vbl.setMargin(0) self.vbl.setSpacing(6) self.vbl.setObjectName("vbl") self.mrcChanged = False #added by Muthu if enable_browse: hblbrowse = QtGui.QHBoxLayout() self.mrc_text = QtGui.QLineEdit() hblbrowse.addWidget(self.mrc_text) self.mrc_browse = QtGui.QPushButton("Browse") hblbrowse.addWidget(self.mrc_browse) self.vbl.addLayout(hblbrowse) QtCore.QObject.connect(self.mrc_text, QtCore.SIGNAL("textEdited(const QString&)"), self.on_mrc_text_change) #added by Muthu QtCore.QObject.connect(self.mrc_browse, QtCore.SIGNAL("clicked(bool)"), self.on_mrc_browse) # added by Muthu self.hbl = QtGui.QHBoxLayout() self.hbl.setMargin(0) self.hbl.setSpacing(6) self.hbl.setObjectName("hbl") self.vbl.addLayout(self.hbl) self.hist = ImgHistogram(self) self.hist.setObjectName("hist") self.hbl.addWidget(self.hist) self.vbl2 = QtGui.QVBoxLayout() self.vbl2.setMargin(0) self.vbl2.setSpacing(6) self.vbl2.setObjectName("vbl2") self.hbl.addLayout(self.vbl2) self.wiretog = QtGui.QPushButton("Wire") self.wiretog.setCheckable(1) self.vbl2.addWidget(self.wiretog) self.lighttog = QtGui.QPushButton("Light") self.lighttog.setCheckable(1) self.vbl2.addWidget(self.lighttog) self.cubetog = QtGui.QPushButton("Cube") self.cubetog.setCheckable(1) self.vbl2.addWidget(self.cubetog) self.texturetog = QtGui.QPushButton("Texture") self.texturetog.setCheckable(1) self.vbl2.addWidget(self.texturetog) self.texture = False self.tabwidget = QtGui.QTabWidget() self.maintab = None self.tabwidget.addTab(self.get_main_tab(), "Main") self.texturetab = None self.tabwidget.addTab(self.get_GL_tab(), "GL") self.tabwidget.addTab(self.get_texture_tab(), "Texture") self.get_texture_tab().setEnabled(False) self.vbl.addWidget(self.tabwidget) self.n3_showing = False QtCore.QObject.connect(self.thr, QtCore.SIGNAL("valueChanged"), self.on_threshold_slider) QtCore.QObject.connect(self.contrast, QtCore.SIGNAL("valueChanged"), target.set_contrast) QtCore.QObject.connect(self.bright, QtCore.SIGNAL("valueChanged"), target.set_brightness) QtCore.QObject.connect(self.cbb, QtCore.SIGNAL("currentIndexChanged(QString)"), self.set_material) QtCore.QObject.connect(self.smp, QtCore.SIGNAL("valueChanged(int)"), target.set_sample) QtCore.QObject.connect(self.wiretog, QtCore.SIGNAL("toggled(bool)"), target.toggle_wire) QtCore.QObject.connect(self.lighttog, QtCore.SIGNAL("toggled(bool)"), target.toggle_light) QtCore.QObject.connect(self.texturetog, QtCore.SIGNAL("toggled(bool)"), self.toggle_texture) QtCore.QObject.connect(self.cubetog, QtCore.SIGNAL("toggled(bool)"), target.toggle_cube) QtCore.QObject.connect(self.glcontrast, QtCore.SIGNAL("valueChanged"), target.set_GL_contrast) QtCore.QObject.connect(self.glbrightness, QtCore.SIGNAL("valueChanged"), target.set_GL_brightness) QtCore.QObject.connect(self.ambient_tab.r, QtCore.SIGNAL("valueChanged"), self.update_material) QtCore.QObject.connect(self.ambient_tab.g, QtCore.SIGNAL("valueChanged"), self.update_material) QtCore.QObject.connect(self.ambient_tab.b, QtCore.SIGNAL("valueChanged"), self.update_material) QtCore.QObject.connect(self.diffuse_tab.r, QtCore.SIGNAL("valueChanged"), self.update_material) QtCore.QObject.connect(self.diffuse_tab.g, QtCore.SIGNAL("valueChanged"), self.update_material) QtCore.QObject.connect(self.diffuse_tab.b, QtCore.SIGNAL("valueChanged"), self.update_material) QtCore.QObject.connect(self.specular_tab.r, QtCore.SIGNAL("valueChanged"), self.update_material) QtCore.QObject.connect(self.specular_tab.g, QtCore.SIGNAL("valueChanged"), self.update_material) QtCore.QObject.connect(self.specular_tab.b, QtCore.SIGNAL("valueChanged"), self.update_material) QtCore.QObject.connect(self.emission_tab.r, QtCore.SIGNAL("valueChanged"), self.update_material) QtCore.QObject.connect(self.emission_tab.g, QtCore.SIGNAL("valueChanged"), self.update_material) QtCore.QObject.connect(self.emission_tab.b, QtCore.SIGNAL("valueChanged"), self.update_material) QtCore.QObject.connect(self.shininess, QtCore.SIGNAL("valueChanged"), self.update_material) def on_mrc_text_change(self, text): #if enable_browse, added by muthu print "Use the Browse button to update the mrc file" def on_mrc_browse(self): #if enable_browse, added by muthu import os self.mrcfileName = QtGui.QFileDialog.getOpenFileName( self, "open file", os.getcwd(), "Text files (*.mrc)") if (self.mrcfileName == ""): return mrcData = EMData(str(self.mrcfileName)) self.target().set_data(mrcData) self.mrc_text.setText(self.mrcfileName) self.mrcChanged = True self.target().updateGL() def update_rotations(self, t3d): self.rotation_sliders.update_rotations(t3d) def set_scale(self, val): self.rotation_sliders.set_scale(val) def set_xy_trans(self, x, y): self.rotation_sliders.set_xy_trans(x, y) def set_xyz_trans(self, x, y, z): self.rotation_sliders.set_xyz_trans(x, y, z) def get_transform_layout(self): return self.maintab.vbl def update_material(self): self.target().isocolor = "custom" custom = {} custom["ambient"] = [ self.ambient_tab.r.getValue(), self.ambient_tab.g.getValue(), self.ambient_tab.b.getValue(), 1.0 ] custom["diffuse"] = [ self.diffuse_tab.r.getValue(), self.diffuse_tab.g.getValue(), self.diffuse_tab.b.getValue(), 1.0 ] custom["specular"] = [ self.specular_tab.r.getValue(), self.specular_tab.g.getValue(), self.specular_tab.b.getValue(), 1.0 ] custom["emission"] = [ self.emission_tab.r.getValue(), self.emission_tab.g.getValue(), self.emission_tab.b.getValue(), 1.0 ] custom["shininess"] = self.shininess.getValue() self.target().colors["custom"] = custom n = self.cbb.findText(QtCore.QString("custom")) if n < 0: return self.cbb.setCurrentIndex(n) self.target().updateGL() def set_material(self, color): self.target().set_material(color) material = self.target().get_material() self.ambient_tab.r.setValue(material["ambient"][0]) self.ambient_tab.g.setValue(material["ambient"][1]) self.ambient_tab.b.setValue(material["ambient"][2]) self.diffuse_tab.r.setValue(material["diffuse"][0]) self.diffuse_tab.g.setValue(material["diffuse"][1]) self.diffuse_tab.b.setValue(material["diffuse"][2]) self.specular_tab.r.setValue(material["specular"][0]) self.specular_tab.g.setValue(material["specular"][1]) self.specular_tab.b.setValue(material["specular"][2]) self.emission_tab.r.setValue(material["emission"][0]) self.emission_tab.g.setValue(material["emission"][1]) self.emission_tab.b.setValue(material["emission"][2]) self.shininess.setValue(material["shininess"]) def get_RGB_tab(self, name=""): return get_RGB_tab(self, name) #rgbtab = QtGui.QWidget(self) #rgbtab.vbl = QtGui.QVBoxLayout(rgbtab) #rgbtab.vbl.setMargin(0) #rgbtab.vbl.setSpacing(6) #rgbtab.vbl.setObjectName(name) #rgbtab.r = ValSlider(rgbtab,(0.0,1.0),"R:") #rgbtab.r.setObjectName("R") #rgbtab.r.setValue(0.5) #rgbtab.vbl.addWidget(rgbtab.r) #rgbtab.g = ValSlider(rgbtab,(0.0,1.0),"G:") #rgbtab.g.setObjectName("G") #rgbtab.g.setValue(0.5) #rgbtab.vbl.addWidget(rgbtab.g) #rgbtab.b = ValSlider(rgbtab,(0.0,1.0),"B:") #rgbtab.b.setObjectName("B") #rgbtab.b.setValue(0.5) #rgbtab.vbl.addWidget(rgbtab.b) #return rgbtab def get_GL_tab(self): self.gltab = QtGui.QWidget() gltab = self.gltab gltab.vbl = QtGui.QVBoxLayout(self.gltab) gltab.vbl.setMargin(0) gltab.vbl.setSpacing(6) gltab.vbl.setObjectName("GL") self.glcontrast = ValSlider(gltab, (1.0, 5.0), "GLShd:") self.glcontrast.setObjectName("GLShade") self.glcontrast.setValue(1.0) gltab.vbl.addWidget(self.glcontrast) self.glbrightness = ValSlider(gltab, (-1.0, 0.0), "GLBst:") self.glbrightness.setObjectName("GLBoost") self.glbrightness.setValue(0.1) self.glbrightness.setValue(0.0) gltab.vbl.addWidget(self.glbrightness) self.material_tab_widget = QtGui.QTabWidget() self.ambient_tab = self.get_RGB_tab("ambient") self.material_tab_widget.addTab(self.ambient_tab, "Ambient") self.diffuse_tab = self.get_RGB_tab("diffuse") self.material_tab_widget.addTab(self.diffuse_tab, "Diffuse") self.specular_tab = self.get_RGB_tab("specular") self.material_tab_widget.addTab(self.specular_tab, "Specular") self.emission_tab = self.get_RGB_tab("emission") self.material_tab_widget.addTab(self.emission_tab, "Emission") gltab.vbl.addWidget(self.material_tab_widget) self.shininess = ValSlider(gltab, (0, 128), "Shininess:") self.shininess.setObjectName("Shininess") self.shininess.setValue(64) gltab.vbl.addWidget(self.shininess) self.hbl_color = QtGui.QHBoxLayout() self.hbl_color.setMargin(0) self.hbl_color.setSpacing(6) self.hbl_color.setObjectName("Material") gltab.vbl.addLayout(self.hbl_color) self.color_label = QtGui.QLabel() self.color_label.setText('Material') self.hbl_color.addWidget(self.color_label) self.cbb = QtGui.QComboBox(gltab) self.hbl_color.addWidget(self.cbb) return gltab def toggle_texture(self): self.texture = not self.texture self.target().toggle_texture() self.get_texture_tab().setEnabled(self.texture) def get_texture_tab(self): if (self.texturetab == None): self.texturetab = QtGui.QWidget() texturetab = self.texturetab texturetab.vbl = QtGui.QVBoxLayout(self.texturetab) texturetab.vbl.setMargin(0) texturetab.vbl.setSpacing(6) texturetab.vbl.setObjectName("Main") self.contrast = ValSlider(texturetab, (0.0, 20.0), "Cont:") self.contrast.setObjectName("contrast") self.contrast.setValue(10.0) texturetab.vbl.addWidget(self.contrast) self.bright = ValSlider(texturetab, (-5.0, 5.0), "Brt:") self.bright.setObjectName("bright") self.bright.setValue(0.1) self.bright.setValue(0.0) texturetab.vbl.addWidget(self.bright) #self.glcontrast = ValSlider(texturetab,(1.0,5.0),"GLShd:") #self.glcontrast.setObjectName("GLShade") #self.glcontrast.setValue(1.0) #texturetab.vbl.addWidget(self.glcontrast) #self.glbrightness = ValSlider(texturetab,(-1.0,0.0),"GLBst:") #self.glbrightness.setObjectName("GLBoost") #self.glbrightness.setValue(0.1) #self.glbrightness.setValue(0.0) #texturetab.vbl.addWidget(self.glbrightness) return self.texturetab def get_main_tab(self): if (self.maintab == None): self.maintab = QtGui.QWidget() maintab = self.maintab maintab.vbl = QtGui.QVBoxLayout(self.maintab) maintab.vbl.setMargin(0) maintab.vbl.setSpacing(6) maintab.vbl.setObjectName("Main") self.thr = ValSlider(maintab, (0.0, 4.0), "Thr:") self.thr.setObjectName("thr") self.thr.setValue(0.5) maintab.vbl.addWidget(self.thr) self.hbl_smp = QtGui.QHBoxLayout() self.hbl_smp.setMargin(0) self.hbl_smp.setSpacing(6) self.hbl_smp.setObjectName("Sample") maintab.vbl.addLayout(self.hbl_smp) self.smp_label = QtGui.QLabel() self.smp_label.setText('Sample Level') self.hbl_smp.addWidget(self.smp_label) self.smp = QtGui.QSpinBox(maintab) self.smp.setValue(1) self.hbl_smp.addWidget(self.smp) self.rotation_sliders.addWidgets(maintab.vbl) return self.maintab def set_sampling_range(self, range): self.smp.setMinimum(1) self.smp.setMaximum(1 + range - 1) def slider_rotate(self): self.target().load_rotation(self.get_current_rotation()) def set_materials(self, colors, current_color): a = 0 for i in colors: self.cbb.addItem(i) if (i == current_color): self.cbb.setCurrentIndex(a) a += 1 def on_threshold_slider(self, val): self.target().set_threshold(val) self.bright.setValue(-val, True) def set_thresholds(self, low, high, val): self.thr.setRange(low, high) self.thr.setValue(val, True) self.bright.setValue(-val, True) def set_sample(self, low, high, val): self.smp.setRange(int(low), int(high)) self.smp.setValue(val, True) def set_hist(self, hist, minden, maxden): self.hist.set_data(hist, minden, maxden)
def get_format_tab(self): self.formattab = QtGui.QWidget() formattab = self.formattab formattab.vbl = QtGui.QVBoxLayout(self.formattab) formattab.vbl.setMargin(0) formattab.vbl.setSpacing(6) formattab.vbl.setObjectName("Format") self.hbl1 = QtGui.QHBoxLayout() self.text = QtGui.QLineEdit() self.text.setText("hello world") text_label = QtGui.QLabel("Enter Text:", self) text_label.setToolTip( "Enters quotes to evaluate new line e.g. \"hello\\nworld\". Evaluates numerical expressions e.g. 9*9 (with out quotes)" ) self.hbl1.addWidget(text_label) self.hbl1.addWidget(self.text) formattab.vbl.addLayout(self.hbl1) self.hbl1 = QtGui.QHBoxLayout() self.Dfont = QtGui.QComboBox() for k in self.l: self.Dfont.addItem(k) self.hbl1.addWidget(QtGui.QLabel("Fonts:", self)) self.hbl1.addWidget(self.Dfont) formattab.vbl.addLayout(self.hbl1) self.hbl1 = QtGui.QHBoxLayout() self.tsize = QtGui.QSpinBox() self.tsize.setRange(0, 500) self.tsize.setValue(32) self.hbl1.addWidget(QtGui.QLabel("Size:", self), Qt.AlignLeft) self.hbl1.addWidget(self.tsize, Qt.AlignRight) self.combo = QtGui.QComboBox() self.items = [ "Extrude", "Pixmap", "Bitmap", "Polygon", "Outline", "Texture" ] for k in self.items: self.combo.addItem(k) self.hbl1.addWidget(QtGui.QLabel("Style:", self), Qt.AlignLeft) self.hbl1.addWidget(self.combo, Qt.AlignRight) formattab.vbl.addLayout(self.hbl1) self.hbl1 = QtGui.QHBoxLayout() self.lspacing = ValSlider(self, (-100.0, 100.0), "Line Spacing:") self.lspacing.setObjectName("Length") self.lspacing.setValue(75.0) self.lspacing.setEnabled(False) self.hbl1.addWidget(self.lspacing) formattab.vbl.addLayout(self.hbl1) self.hbl1 = QtGui.QHBoxLayout() self.length = ValSlider(self, (0.0, 500.0), "Length:") self.length.setObjectName("Length") self.length.setValue(75.0) self.hbl1.addWidget(self.length) formattab.vbl.addLayout(self.hbl1) self.hbl1 = QtGui.QHBoxLayout() self.cbb = QtGui.QComboBox() self.hbl1.addWidget(QtGui.QLabel("Material:", self)) self.hbl1.addWidget(self.cbb) formattab.vbl.addLayout(self.hbl1) self.hbl1 = QtGui.QHBoxLayout() self.bgtabwidget = QtGui.QTabWidget() self.maintab = None self.bgtabwidget.addTab(self.get_bgRGB_tab(), "BG RGB") self.hbl1.addWidget(self.bgtabwidget) self.n3_showing = False formattab.vbl.addLayout(self.hbl1) return formattab
class EM3DSliceInspector(QtGui.QWidget): def __init__(self, target): self.busy = False QtGui.QWidget.__init__(self, None) self.setWindowIcon(QtGui.QIcon(get_image_directory() + "desktop.png")) self.transform_panel = EMTransformPanel(target, self) self.target = weakref.ref(target) self.vbl = QtGui.QVBoxLayout(self) self.vbl.setMargin(0) self.vbl.setSpacing(6) self.vbl.setObjectName("vbl") self.hbl = QtGui.QHBoxLayout() self.hbl.setMargin(0) self.hbl.setSpacing(6) self.hbl.setObjectName("hbl") self.vbl.addLayout(self.hbl) self.hist = ImgHistogram(self) self.hist.setObjectName("hist") self.hbl.addWidget(self.hist) self.vbl2 = QtGui.QVBoxLayout() self.vbl2.setMargin(0) self.vbl2.setSpacing(6) self.vbl2.setObjectName("vbl2") self.hbl.addLayout(self.vbl2) self.cubetog = QtGui.QPushButton("Cube") self.cubetog.setCheckable(1) self.vbl2.addWidget(self.cubetog) self.defaults = QtGui.QPushButton("Defaults") self.vbl2.addWidget(self.defaults) self.vbl.addWidget(self.get_main_tab()) self.n3_showing = False # self.current_src = EULER_EMAN QtCore.QObject.connect(self.slice, QtCore.SIGNAL("valueChanged"), target.set_slice) QtCore.QObject.connect(self.glcontrast, QtCore.SIGNAL("valueChanged"), target.set_GL_contrast) QtCore.QObject.connect(self.glbrightness, QtCore.SIGNAL("valueChanged"), target.set_GL_brightness) QtCore.QObject.connect(self.axisCombo, QtCore.SIGNAL("currentIndexChanged(QString)"), target.setAxis) QtCore.QObject.connect(self.cubetog, QtCore.SIGNAL("toggled(bool)"), target.toggle_cube) QtCore.QObject.connect(self.defaults, QtCore.SIGNAL("clicked(bool)"), self.set_defaults) QtCore.QObject.connect(self.contrast, QtCore.SIGNAL("valueChanged"), self.on_contrast_changed) QtCore.QObject.connect(self.bright, QtCore.SIGNAL("valueChanged"), self.on_brightness_changed) def on_contrast_changed(self, val): if self.busy: return self.target().set_contrast(val) def on_brightness_changed(self, val): if self.busy: return self.target().set_brightness(val) def set_contrast_bright(self, c, b): self.busy = True self.contrast.setValue(c) self.bright.setValue(b) self.busy = False def update_rotations(self, t3d): self.transform_panel.update_rotations(t3d) def set_scale(self, val): self.transform_panel.set_scale(val) def set_xy_trans(self, x, y): self.transform_panel.set_xy_trans(x, y) def set_xyz_trans(self, x, y, z): self.transform_panel.set_xyz_trans(x, y, z) def get_transform_layout(self): return self.maintab.vbl def set_defaults(self): self.target().set_default_contrast_settings() self.set_contrast_bright(self.target().contrast, self.target().bright) self.glcontrast.setValue(1.0) self.glbrightness.setValue(0.0) self.transform_panel.set_defaults() self.target().generate_current_display_list() self.target().updateGL() def get_main_tab(self): self.maintab = QtGui.QWidget() maintab = self.maintab maintab.vbl = QtGui.QVBoxLayout(self.maintab) maintab.vbl.setMargin(0) maintab.vbl.setSpacing(6) maintab.vbl.setObjectName("Main") self.hbl_slice = QtGui.QHBoxLayout() self.hbl_slice.setMargin(0) self.hbl_slice.setSpacing(6) self.hbl_slice.setObjectName("Axis") maintab.vbl.addLayout(self.hbl_slice) self.slice = ValSlider(maintab, (0.0, 10.0), "Slice:") self.slice.setObjectName("slice") self.slice.setValue(1.0) self.hbl_slice.addWidget(self.slice) self.axisCombo = QtGui.QComboBox(maintab) self.axisCombo.addItem(' z ') self.axisCombo.addItem(' y ') self.axisCombo.addItem(' x ') self.axisCombo.addItem(' track ') self.hbl_slice.addWidget(self.axisCombo) self.contrast = ValSlider(maintab, (0.0, 20.0), "Cont:") self.contrast.setObjectName("contrast") self.contrast.setValue(1.0) maintab.vbl.addWidget(self.contrast) self.bright = ValSlider(maintab, (-5.0, 5.0), "Brt:") self.bright.setObjectName("bright") self.bright.setValue(0.1) self.bright.setValue(0.0) maintab.vbl.addWidget(self.bright) self.glcontrast = ValSlider(maintab, (1.0, 5.0), "GLShd:") self.glcontrast.setObjectName("GLShade") self.glcontrast.setValue(1.0) maintab.vbl.addWidget(self.glcontrast) self.glbrightness = ValSlider(maintab, (-1.0, 0.0), "GLBst:") self.glbrightness.setObjectName("GLBoost") self.glbrightness.setValue(0.1) self.glbrightness.setValue(0.0) maintab.vbl.addWidget(self.glbrightness) self.transform_panel.addWidgets(maintab.vbl) return maintab def slider_rotate(self): self.target().load_rotation(self.get_current_rotation()) def set_hist(self, hist, minden, maxden): self.hist.set_data(hist, minden, maxden) def set_slice(self, val): self.slice.setValue(val) def set_sliceRange(self, min, max): self.slice.setRange(min, max)
class GUIctf(QtGui.QWidget): def __init__(self,application,data): """Implements the CTF fitting dialog using various EMImage and EMPlot2D widgets 'data' is a list of (filename,ctf,im_1d,bg_1d,im_2d,bg_2d) """ try: from emimage2d import EMImage2DWidget except: print "Cannot import EMAN image GUI objects (EMImage2DWidget)" sys.exit(1) try: from emplot2d import EMPlot2DWidget except: print "Cannot import EMAN plot GUI objects (is matplotlib installed?)" sys.exit(1) self.app = weakref.ref(application) QtGui.QWidget.__init__(self,None) self.setWindowIcon(QtGui.QIcon(get_image_directory() + "ctf.png")) self.data=data self.curset=0 self.plotmode=0 self.guiim=EMImage2DWidget(application=self.app()) self.guiplot=EMPlot2DWidget(application=self.app()) self.guiim.connect(self.guiim,QtCore.SIGNAL("mousedown"),self.imgmousedown) self.guiim.connect(self.guiim,QtCore.SIGNAL("mousedrag"),self.imgmousedrag) self.guiim.connect(self.guiim,QtCore.SIGNAL("mouseup") ,self.imgmouseup) self.guiplot.connect(self.guiplot,QtCore.SIGNAL("mousedown"),self.plotmousedown) self.guiim.mmode="app" # This object is itself a widget we need to set up self.hbl = QtGui.QHBoxLayout(self) self.hbl.setMargin(0) self.hbl.setSpacing(6) self.hbl.setObjectName("hbl") # plot list and plot mode combobox self.vbl2 = QtGui.QVBoxLayout() self.setlist=QtGui.QListWidget(self) self.setlist.setSizePolicy(QtGui.QSizePolicy.Preferred,QtGui.QSizePolicy.Expanding) self.vbl2.addWidget(self.setlist) self.splotmode=QtGui.QComboBox(self) self.splotmode.addItem("Bgsub & fit") self.splotmode.addItem("Ptcl & BG power") self.splotmode.addItem("SNR") self.splotmode.addItem("Smoothed SNR") self.splotmode.addItem("Integrated SNR") self.splotmode.addItem("Total CTF") self.vbl2.addWidget(self.splotmode) self.hbl.addLayout(self.vbl2) # ValSliders for CTF parameters self.vbl = QtGui.QVBoxLayout() self.vbl.setMargin(0) self.vbl.setSpacing(6) self.vbl.setObjectName("vbl") self.hbl.addLayout(self.vbl) #self.samp = ValSlider(self,(0,5.0),"Amp:",0) #self.vbl.addWidget(self.samp) self.sdefocus=ValSlider(self,(0,5),"Defocus:",0,90) self.vbl.addWidget(self.sdefocus) self.sbfactor=ValSlider(self,(0,1600),"B factor:",0,90) self.vbl.addWidget(self.sbfactor) self.sampcont=ValSlider(self,(0,100),"% AC",0,90) self.vbl.addWidget(self.sampcont) # self.sapix=ValSlider(self,(.2,10),"A/Pix:",2,90) # self.vbl.addWidget(self.sapix) self.svoltage=ValSlider(self,(0,500),"Voltage (kV):",0,90) self.vbl.addWidget(self.svoltage) self.scs=ValSlider(self,(0,5),"Cs (mm):",0,90) self.vbl.addWidget(self.scs) self.hbl_buttons = QtGui.QHBoxLayout() self.saveparms = QtGui.QPushButton("Save parms") self.recallparms = QtGui.QPushButton("Recall") self.output = QtGui.QPushButton("Output") self.hbl_buttons.addWidget(self.saveparms) self.hbl_buttons.addWidget(self.recallparms) self.hbl_buttons2 = QtGui.QHBoxLayout() self.hbl_buttons2.addWidget(self.output) self.vbl.addLayout(self.hbl_buttons) self.vbl.addLayout(self.hbl_buttons2) QtCore.QObject.connect(self.sdefocus, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.sbfactor, QtCore.SIGNAL("valueChanged"), self.newCTF) # QtCore.QObject.connect(self.sapix, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.sampcont, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.svoltage, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.scs, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.setlist,QtCore.SIGNAL("currentRowChanged(int)"),self.newSet) QtCore.QObject.connect(self.splotmode,QtCore.SIGNAL("currentIndexChanged(int)"),self.newPlotMode) QtCore.QObject.connect(self.saveparms,QtCore.SIGNAL("clicked(bool)"),self.on_save_params) QtCore.QObject.connect(self.recallparms,QtCore.SIGNAL("clicked(bool)"),self.on_recall_params) QtCore.QObject.connect(self.output,QtCore.SIGNAL("clicked(bool)"),self.on_output) self.update_data() self.update_data() self.resize(460,380) # figured these values out by printing the width and height in resize event self.setWindowTitle("CTF") def on_save_params(self): if len(self.setlist.selectedItems()) == 0: return val = self.curset name = str(self.setlist.item(val).text()) name = get_file_tag(name) # if not db_check_dict(name): # print "error, the db doesn't exist:",name # db_parms=db_open_dict("bdb:e2ctf.parms") ctf = self.data[val][1].to_string() output = [] for i,val in enumerate(self.data[val]): # ignore i == 0 it's just the filename if i > 1: output.append(val) elif i == 1: output.append(ctf) db_parms[name] = output def on_recall_params(self): if len(self.setlist.selectedItems()) == 0: return val = self.curset name = str(self.setlist.item(val).text()) data = [name] name = get_file_tag(name) db_parms=db_open_dict("bdb:e2ctf.parms") if not db_parms.has_key(name): print "error, ctf parameters do not exist for:",name # data.extend(db_parms[name]) ctf=EMAN2Ctf() ctf.from_string(data[1]) data[1] = ctf self.data[val] = data self.newSet(self.curset) # def get_output_params(self): def on_output(self): from emsprworkflow import E2CTFOutputTaskGeneral self.form = E2CTFOutputTaskGeneral() self.form.run_form() def show_guis(self): if self.guiim != None: self.app().show_specific(self.guiim) if self.guiplot != None: self.app().show_specific(self.guiplot) self.app().show_specific(self) def closeEvent(self,event): # QtGui.QWidget.closeEvent(self,event) # self.app.app.closeAllWindows() if self.guiim != None: self.app().close_specific(self.guiim) self.guiim = None if self.guiplot != None: self.app().close_specific(self.guiplot) event.accept() def newData(self,data): self.data=data self.update_data() def update_data(self): """This will make sure the various widgets properly show the current data sets""" self.setlist.clear() for i,j in enumerate(self.data): self.setlist.addItem(j[0]) self.setlist.setCurrentRow(self.curset) def update_plot(self): val=self.curset ctf=self.data[val][1] ds=self.data[val][1].dsbg s=[ds*i for i in xrange(len(ctf.background))] if self.plotmode==1: self.guiplot.set_data((s,self.data[val][2]),"fg",True,True) self.guiplot.set_data((s,self.data[val][3]),"bg") self.guiplot.setAxisParms("s (1/A)","Intensity (a.u)") elif self.plotmode==0: bgsub=[self.data[val][2][i]-self.data[val][3][i] for i in range(len(self.data[val][2]))] self.guiplot.set_data((s,bgsub),"fg-bg",True,True) fit=ctf.compute_1d(len(s)*2,ds,Ctf.CtfType.CTF_AMP) # The fit curve sf = sfact(s, "ribosome","nono") fit=[sf[i]*fit[i]**2 for i in xrange(len(s))] # squared * a generic structure factor # auto-amplitude for b-factor adjustment rto,nrto=0,0 for i in xrange(int(.04/ds)+1,min(int(0.15/ds),len(s)-1)): if bgsub[i]>0 : #rto+=fit[i]**2/fabs(bgsub[i]) #nrto+=fit[i] #rto+=fit[i]**2 #nrto+=bgsub[i]**2 rto+=fit[i] nrto+=fabs(bgsub[i]) if nrto==0 : rto=1.0 else : rto/=nrto fit=[fit[i]/rto for i in range(len(s))] self.guiplot.set_data((s,fit),"fit") self.guiplot.setAxisParms("s (1/A)","Intensity (a.u)") elif self.plotmode==2: snr=ctf.compute_1d(len(s)*2,ds,Ctf.CtfType.CTF_SNR) # The snr curve self.guiplot.set_data((s,snr[:len(s)]),"snr",True) self.guiplot.setAxisParms("s (1/A)","SNR (intensity ratio)") elif self.plotmode==3: snr=ctf.compute_1d(len(s)*2,ds,Ctf.CtfType.CTF_SNR) # The snr curve self.guiplot.set_data((s,snr[:len(s)]),"snr",True) ssnr=ctf.compute_1d(len(s)*2,ds,Ctf.CtfType.CTF_SNR_SMOOTH) # The fit curve self.guiplot.set_data((s,ssnr[:len(s)]),"ssnr") self.guiplot.setAxisParms("s (1/A)","SNR (intensity ratio)") elif self.plotmode==4: snr=ctf.compute_1d(len(s)*2,ds,Ctf.CtfType.CTF_SNR) # The snr curve for i in range(1,len(snr)): snr[i]=snr[i]*i+snr[i-1] # integrate SNR*s # for i in range(1,len(snr)): snr[i]/=snr[-1] # normalize for i in range(1,len(snr)): snr[i]/=len(snr) # this way the relative quality of images can be compared self.guiplot.set_data((s,snr[:len(s)]),"snr",True) self.guiplot.setAxisParms("s (1/A)","Integrated SNR") elif self.plotmode==5: inten=[fabs(i) for i in ctf.compute_1d(len(s)*2,ds,Ctf.CtfType.CTF_AMP)] # The snr curve self.guiplot.set_data((s,inten[:len(s)]),"single",True) all=[0 for i in inten] for st in self.data: print st inten=[fabs(i) for i in st[1].compute_1d(len(s)*2,ds,Ctf.CtfType.CTF_AMP)] for i in range(len(all)): all[i]+=inten[i] self.guiplot.set_data((s,all[:len(s)]),"total") #bgsub=[self.data[val][2][i]-self.data[val][3][i] for i in range(len(self.data[val][2]))] #self.guiplot.set_data("fg-bg",(s,bgsub),True,True) #fit=[bgsub[i]/sfact(s[i]) for i in range(len(s))] # squared * a generic structure factor #self.guiplot.set_data("fit",(s,fit)) def newSet(self,val): "called when a new data set is selected from the list" self.curset=val self.sdefocus.setValue(self.data[val][1].defocus,True) self.sbfactor.setValue(self.data[val][1].bfactor,True) # self.sapix.setValue(self.data[val][1].apix) self.sampcont.setValue(self.data[val][1].ampcont,True) self.svoltage.setValue(self.data[val][1].voltage,True) self.scs.setValue(self.data[val][1].cs,True) self.guiim.set_data(self.data[val][4]) self.update_plot() def newPlotMode(self,mode): self.plotmode=mode self.update_plot() def newCTF(self) : self.data[self.curset][1].defocus=self.sdefocus.value self.data[self.curset][1].bfactor=self.sbfactor.value # self.data[self.curset][1].apix=self.sapix.value self.data[self.curset][1].ampcont=self.sampcont.value self.data[self.curset][1].voltage=self.svoltage.value self.data[self.curset][1].cs=self.scs.value self.update_plot() def imgmousedown(self,event) : m=self.guiim.scr_to_img((event.x(),event.y())) #self.guiim.add_shape("cen",["rect",.9,.9,.4,x0,y0,x0+2,y0+2,1.0]) def imgmousedrag(self,event) : m=self.guiim.scr_to_img((event.x(),event.y())) # box deletion when shift held down #if event.modifiers()&Qt.ShiftModifier: #for i,j in enumerate(self.boxes): def imgmouseup(self,event) : m=self.guiim.scr_to_img((event.x(),event.y())) def plotmousedown(self,event) : m=self.guiim.scr_to_img((event.x(),event.y())) def run(self): """If you make your own application outside of this object, you are free to use your own local app.exec_(). This is a convenience for ctf-only programs.""" self.app.exec_() # E2saveappwin("boxer","imagegeom",self.guiim) # try: # E2setappval("boxer","imcontrol",self.guiim.inspector.isVisible()) # if self.guiim.inspector.isVisible() : E2saveappwin("boxer","imcontrolgeom",self.guiim.inspector) # except : E2setappval("boxer","imcontrol",False) return
def __init__(self, target, parent): self.target = weakref.ref(target) self.parent = weakref.ref(parent) self.label_src = QtGui.QLabel(parent) self.label_src.setText('Rotation Convention') self.src = QtGui.QComboBox(parent) self.load_src_options(self.src) self.x_label = QtGui.QLabel() self.x_label.setText('x') self.x_trans = QtGui.QDoubleSpinBox(parent) self.x_trans.setMinimum(-10000) self.x_trans.setMaximum(10000) self.x_trans.setValue(0.0) self.y_label = QtGui.QLabel() self.y_label.setText('y') self.y_trans = QtGui.QDoubleSpinBox(parent) self.y_trans.setMinimum(-10000) self.y_trans.setMaximum(10000) self.y_trans.setValue(0.0) self.z_label = QtGui.QLabel() self.z_label.setText('z') self.z_trans = QtGui.QDoubleSpinBox(parent) self.z_trans.setMinimum(-10000) self.z_trans.setMaximum(10000) self.z_trans.setValue(0.0) self.az = ValSlider(parent, (-360.0, 360.0), "az", -1) self.az.setObjectName("az") self.az.setValue(0.0) self.alt = ValSlider(parent, (-180.0, 180.0), "alt", -1) self.alt.setObjectName("alt") self.alt.setValue(0.0) self.phi = ValSlider(parent, (-360.0, 360.0), "phi", -1) self.phi.setObjectName("phi") self.phi.setValue(0.0) self.scale = ValSlider(parent, (0.01, 30.0), "Zoom:") self.scale.setObjectName("scale") self.scale.setValue(1.0) self.n3_showing = False self.current_src = "eman" QtCore.QObject.connect(self.az, QtCore.SIGNAL("valueChanged"), self.slider_rotate) QtCore.QObject.connect(self.alt, QtCore.SIGNAL("valueChanged"), self.slider_rotate) QtCore.QObject.connect(self.phi, QtCore.SIGNAL("valueChanged"), self.slider_rotate) QtCore.QObject.connect(self.src, QtCore.SIGNAL("currentIndexChanged(QString)"), self.set_src) QtCore.QObject.connect(self.scale, QtCore.SIGNAL("valueChanged"), self.target().set_scale) QtCore.QObject.connect(self.x_trans, QtCore.SIGNAL("valueChanged(double)"), self.target().set_cam_x) QtCore.QObject.connect(self.y_trans, QtCore.SIGNAL("valueChanged(double)"), self.target().set_cam_y) QtCore.QObject.connect(self.z_trans, QtCore.SIGNAL("valueChanged(double)"), self.target().set_cam_z)
def __init__(self,target,parent): self.target = weakref.ref(target) self.parent = weakref.ref(parent) self.label_src = QtGui.QLabel(parent) self.label_src.setText('Rotation Convention') self.src = QtGui.QComboBox(parent) self.load_src_options(self.src) self.x_label = QtGui.QLabel() self.x_label.setText('x') self.x_trans = QtGui.QDoubleSpinBox(parent) self.x_trans.setMinimum(-10000) self.x_trans.setMaximum(10000) self.x_trans.setValue(0.0) self.y_label = QtGui.QLabel() self.y_label.setText('y') self.y_trans = QtGui.QDoubleSpinBox(parent) self.y_trans.setMinimum(-10000) self.y_trans.setMaximum(10000) self.y_trans.setValue(0.0) self.z_label = QtGui.QLabel() self.z_label.setText('z') self.z_trans = QtGui.QDoubleSpinBox(parent) self.z_trans.setMinimum(-10000) self.z_trans.setMaximum(10000) self.z_trans.setValue(0.0) self.az = ValSlider(parent,(-360.0,360.0),"az",-1) self.az.setObjectName("az") self.az.setValue(0.0) self.alt = ValSlider(parent,(-180.0,180.0),"alt",-1) self.alt.setObjectName("alt") self.alt.setValue(0.0) self.phi = ValSlider(parent,(-360.0,360.0),"phi",-1) self.phi.setObjectName("phi") self.phi.setValue(0.0) self.scale = ValSlider(parent,(0.01,30.0),"Zoom:") self.scale.setObjectName("scale") self.scale.setValue(1.0) self.n3_showing = False self.current_src = "eman" QtCore.QObject.connect(self.az, QtCore.SIGNAL("valueChanged"), self.slider_rotate) QtCore.QObject.connect(self.alt, QtCore.SIGNAL("valueChanged"), self.slider_rotate) QtCore.QObject.connect(self.phi, QtCore.SIGNAL("valueChanged"), self.slider_rotate) QtCore.QObject.connect(self.src, QtCore.SIGNAL("currentIndexChanged(QString)"), self.set_src) QtCore.QObject.connect(self.scale, QtCore.SIGNAL("valueChanged"), self.target().set_scale) QtCore.QObject.connect(self.x_trans, QtCore.SIGNAL("valueChanged(double)"), self.target().set_cam_x) QtCore.QObject.connect(self.y_trans, QtCore.SIGNAL("valueChanged(double)"), self.target().set_cam_y) QtCore.QObject.connect(self.z_trans, QtCore.SIGNAL("valueChanged(double)"), self.target().set_cam_z)
def __init__(self,application,data): """Implements the CTF fitting dialog using various EMImage and EMPlot2D widgets 'data' is a list of (filename,ctf,im_1d,bg_1d,im_2d,bg_2d) """ try: from emimage2d import EMImage2DWidget except: print "Cannot import EMAN image GUI objects (EMImage2DWidget)" sys.exit(1) try: from emplot2d import EMPlot2DWidget except: print "Cannot import EMAN plot GUI objects (is matplotlib installed?)" sys.exit(1) self.app = weakref.ref(application) QtGui.QWidget.__init__(self,None) self.setWindowIcon(QtGui.QIcon(get_image_directory() + "ctf.png")) self.data=data self.curset=0 self.plotmode=0 self.guiim=EMImage2DWidget(application=self.app()) self.guiplot=EMPlot2DWidget(application=self.app()) self.guiim.connect(self.guiim,QtCore.SIGNAL("mousedown"),self.imgmousedown) self.guiim.connect(self.guiim,QtCore.SIGNAL("mousedrag"),self.imgmousedrag) self.guiim.connect(self.guiim,QtCore.SIGNAL("mouseup") ,self.imgmouseup) self.guiplot.connect(self.guiplot,QtCore.SIGNAL("mousedown"),self.plotmousedown) self.guiim.mmode="app" # This object is itself a widget we need to set up self.hbl = QtGui.QHBoxLayout(self) self.hbl.setMargin(0) self.hbl.setSpacing(6) self.hbl.setObjectName("hbl") # plot list and plot mode combobox self.vbl2 = QtGui.QVBoxLayout() self.setlist=QtGui.QListWidget(self) self.setlist.setSizePolicy(QtGui.QSizePolicy.Preferred,QtGui.QSizePolicy.Expanding) self.vbl2.addWidget(self.setlist) self.splotmode=QtGui.QComboBox(self) self.splotmode.addItem("Bgsub & fit") self.splotmode.addItem("Ptcl & BG power") self.splotmode.addItem("SNR") self.splotmode.addItem("Smoothed SNR") self.splotmode.addItem("Integrated SNR") self.splotmode.addItem("Total CTF") self.vbl2.addWidget(self.splotmode) self.hbl.addLayout(self.vbl2) # ValSliders for CTF parameters self.vbl = QtGui.QVBoxLayout() self.vbl.setMargin(0) self.vbl.setSpacing(6) self.vbl.setObjectName("vbl") self.hbl.addLayout(self.vbl) #self.samp = ValSlider(self,(0,5.0),"Amp:",0) #self.vbl.addWidget(self.samp) self.sdefocus=ValSlider(self,(0,5),"Defocus:",0,90) self.vbl.addWidget(self.sdefocus) self.sbfactor=ValSlider(self,(0,1600),"B factor:",0,90) self.vbl.addWidget(self.sbfactor) self.sampcont=ValSlider(self,(0,100),"% AC",0,90) self.vbl.addWidget(self.sampcont) # self.sapix=ValSlider(self,(.2,10),"A/Pix:",2,90) # self.vbl.addWidget(self.sapix) self.svoltage=ValSlider(self,(0,500),"Voltage (kV):",0,90) self.vbl.addWidget(self.svoltage) self.scs=ValSlider(self,(0,5),"Cs (mm):",0,90) self.vbl.addWidget(self.scs) self.hbl_buttons = QtGui.QHBoxLayout() self.saveparms = QtGui.QPushButton("Save parms") self.recallparms = QtGui.QPushButton("Recall") self.output = QtGui.QPushButton("Output") self.hbl_buttons.addWidget(self.saveparms) self.hbl_buttons.addWidget(self.recallparms) self.hbl_buttons2 = QtGui.QHBoxLayout() self.hbl_buttons2.addWidget(self.output) self.vbl.addLayout(self.hbl_buttons) self.vbl.addLayout(self.hbl_buttons2) QtCore.QObject.connect(self.sdefocus, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.sbfactor, QtCore.SIGNAL("valueChanged"), self.newCTF) # QtCore.QObject.connect(self.sapix, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.sampcont, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.svoltage, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.scs, QtCore.SIGNAL("valueChanged"), self.newCTF) QtCore.QObject.connect(self.setlist,QtCore.SIGNAL("currentRowChanged(int)"),self.newSet) QtCore.QObject.connect(self.splotmode,QtCore.SIGNAL("currentIndexChanged(int)"),self.newPlotMode) QtCore.QObject.connect(self.saveparms,QtCore.SIGNAL("clicked(bool)"),self.on_save_params) QtCore.QObject.connect(self.recallparms,QtCore.SIGNAL("clicked(bool)"),self.on_recall_params) QtCore.QObject.connect(self.output,QtCore.SIGNAL("clicked(bool)"),self.on_output) self.update_data() self.update_data() self.resize(460,380) # figured these values out by printing the width and height in resize event self.setWindowTitle("CTF")
def __init__(self, app, maxshift, invert=False, seqali=False, tiltstep=2.0): self.app = app self.maxshift = maxshift self.seqali = seqali self.invert = invert self.tiltstep = tiltstep # the control panel QtGui.QWidget.__init__(self, None) self.gbl = QtGui.QGridLayout(self) self.gbl.setMargin(0) self.gbl.setSpacing(6) self.gbl.setObjectName("hbl") # action buttons self.bcenalign = QtGui.QPushButton("Center Align") self.bprojalign = QtGui.QPushButton("Proj. Realign") self.btiltaxis = QtGui.QPushButton("Tilt Axis") self.btiltaxisval = QtGui.QLineEdit("90.0") self.bsavedata = QtGui.QPushButton("Save Data") self.breconst = QtGui.QPushButton("3D Normal") self.sbmode = QtGui.QSpinBox(self) self.sbmode.setRange(0, 2) self.sbmode.setValue(0) self.bmagict = QtGui.QPushButton("3D Tomofill") self.bmagics = QtGui.QPushButton("3D Sph") self.bmagicc = QtGui.QPushButton("3D Cyl") self.vslpfilt = ValSlider(self, (0, .5), "Filter", 0.5, 50) self.gbl.addWidget(self.bcenalign, 0, 0) self.gbl.addWidget(self.bprojalign, 0, 1) self.gbl.addWidget(self.btiltaxis, 0, 2) self.gbl.addWidget(self.btiltaxisval, 0, 3) # self.gbl.addWidget(self.bsavedata,0,3) self.gbl.addWidget(self.breconst, 1, 0) self.gbl.addWidget(self.sbmode, 2, 0, 1, 1) self.gbl.addWidget(self.vslpfilt, 3, 0, 1, 4) self.gbl.addWidget(self.bmagict, 1, 1) self.gbl.addWidget(self.bmagics, 1, 2) self.gbl.addWidget(self.bmagicc, 1, 3) QtCore.QObject.connect(self.bcenalign, QtCore.SIGNAL("clicked(bool)"), self.do_cenalign) QtCore.QObject.connect(self.bprojalign, QtCore.SIGNAL("clicked(bool)"), self.do_projalign) QtCore.QObject.connect(self.btiltaxis, QtCore.SIGNAL("clicked(bool)"), self.do_tiltaxis) QtCore.QObject.connect(self.bsavedata, QtCore.SIGNAL("clicked(bool)"), self.do_savedata) QtCore.QObject.connect(self.breconst, QtCore.SIGNAL("clicked(bool)"), self.do_reconst) QtCore.QObject.connect(self.bmagict, QtCore.SIGNAL("clicked(bool)"), self.do_magict) QtCore.QObject.connect(self.bmagics, QtCore.SIGNAL("clicked(bool)"), self.do_magics) QtCore.QObject.connect(self.bmagicc, QtCore.SIGNAL("clicked(bool)"), self.do_magicc) QtCore.QObject.connect(self.vslpfilt, QtCore.SIGNAL("valueChanged"), self.do_filter) # the single image display widget self.im2d = EMImage2DWidget(application=app, winid="tomotrackbox.big") self.imboxed = EMImage2DWidget(application=app, winid="tomotrackbox.small") self.improj = EMImage2DWidget(application=app, winid="tomotrackbox.proj") self.imslice = EMImage2DWidget(application=app, winid="tomotrackbox.3dslice") self.imvol = EMImage3DModule(application=app, winid="tomotrackbox.3d") # get some signals from the window. QtCore.QObject.connect(self.im2d, QtCore.SIGNAL("mousedown"), self.down) QtCore.QObject.connect(self.im2d, QtCore.SIGNAL("mousedrag"), self.drag) QtCore.QObject.connect(self.im2d, QtCore.SIGNAL("mouseup"), self.up) QtCore.QObject.connect(self.im2d, QtCore.SIGNAL("increment_list_data"), self.change_tilt) self.imagefile = None self.imageparm = None self.tiltshapes = None self.curtilt = 0 self.oldtilt = self.curtilt self.map3d = None self.downloc = None self.downadjloc = None self.show() self.im2d.show()
class EM3DSliceInspector(QtGui.QWidget): def __init__(self,target) : self.busy = False QtGui.QWidget.__init__(self,None) self.setWindowIcon(QtGui.QIcon(get_image_directory() +"desktop.png")) self.transform_panel = EMTransformPanel(target,self) self.target=weakref.ref(target) self.vbl = QtGui.QVBoxLayout(self) self.vbl.setMargin(0) self.vbl.setSpacing(6) self.vbl.setObjectName("vbl") self.hbl = QtGui.QHBoxLayout() self.hbl.setMargin(0) self.hbl.setSpacing(6) self.hbl.setObjectName("hbl") self.vbl.addLayout(self.hbl) self.hist = ImgHistogram(self) self.hist.setObjectName("hist") self.hbl.addWidget(self.hist) self.vbl2 = QtGui.QVBoxLayout() self.vbl2.setMargin(0) self.vbl2.setSpacing(6) self.vbl2.setObjectName("vbl2") self.hbl.addLayout(self.vbl2) self.cubetog = QtGui.QPushButton("Cube") self.cubetog.setCheckable(1) self.vbl2.addWidget(self.cubetog) self.defaults = QtGui.QPushButton("Defaults") self.vbl2.addWidget(self.defaults) self.vbl.addWidget(self.get_main_tab()) self.n3_showing = False # self.current_src = EULER_EMAN QtCore.QObject.connect(self.slice, QtCore.SIGNAL("valueChanged"), target.set_slice) QtCore.QObject.connect(self.glcontrast, QtCore.SIGNAL("valueChanged"), target.set_GL_contrast) QtCore.QObject.connect(self.glbrightness, QtCore.SIGNAL("valueChanged"), target.set_GL_brightness) QtCore.QObject.connect(self.axisCombo, QtCore.SIGNAL("currentIndexChanged(QString)"), target.setAxis) QtCore.QObject.connect(self.cubetog, QtCore.SIGNAL("toggled(bool)"), target.toggle_cube) QtCore.QObject.connect(self.defaults, QtCore.SIGNAL("clicked(bool)"), self.set_defaults) QtCore.QObject.connect(self.contrast, QtCore.SIGNAL("valueChanged"), self.on_contrast_changed) QtCore.QObject.connect(self.bright, QtCore.SIGNAL("valueChanged"), self.on_brightness_changed) def on_contrast_changed(self,val): if self.busy: return self.target().set_contrast(val) def on_brightness_changed(self,val): if self.busy: return self.target().set_brightness(val) def set_contrast_bright(self,c,b): self.busy = True self.contrast.setValue(c) self.bright.setValue(b) self.busy = False def update_rotations(self,t3d): self.transform_panel.update_rotations(t3d) def set_scale(self,val): self.transform_panel.set_scale(val) def set_xy_trans(self, x, y): self.transform_panel.set_xy_trans(x,y) def set_xyz_trans(self,x,y,z): self.transform_panel.set_xyz_trans(x,y,z) def get_transform_layout(self): return self.maintab.vbl def set_defaults(self): self.target().set_default_contrast_settings() self.set_contrast_bright(self.target().contrast,self.target().bright) self.glcontrast.setValue(1.0) self.glbrightness.setValue(0.0) self.transform_panel.set_defaults() self.target().generate_current_display_list() self.target().updateGL() def get_main_tab(self): self.maintab = QtGui.QWidget() maintab = self.maintab maintab.vbl = QtGui.QVBoxLayout(self.maintab) maintab.vbl.setMargin(0) maintab.vbl.setSpacing(6) maintab.vbl.setObjectName("Main") self.hbl_slice = QtGui.QHBoxLayout() self.hbl_slice.setMargin(0) self.hbl_slice.setSpacing(6) self.hbl_slice.setObjectName("Axis") maintab.vbl.addLayout(self.hbl_slice) self.slice = ValSlider(maintab,(0.0,10.0),"Slice:") self.slice.setObjectName("slice") self.slice.setValue(1.0) self.hbl_slice.addWidget(self.slice) self.axisCombo = QtGui.QComboBox(maintab) self.axisCombo.addItem(' z ') self.axisCombo.addItem(' y ') self.axisCombo.addItem(' x ') self.axisCombo.addItem(' track ') self.hbl_slice.addWidget(self.axisCombo) self.contrast = ValSlider(maintab,(0.0,20.0),"Cont:") self.contrast.setObjectName("contrast") self.contrast.setValue(1.0) maintab.vbl.addWidget(self.contrast) self.bright = ValSlider(maintab,(-5.0,5.0),"Brt:") self.bright.setObjectName("bright") self.bright.setValue(0.1) self.bright.setValue(0.0) maintab.vbl.addWidget(self.bright) self.glcontrast = ValSlider(maintab,(1.0,5.0),"GLShd:") self.glcontrast.setObjectName("GLShade") self.glcontrast.setValue(1.0) maintab.vbl.addWidget(self.glcontrast) self.glbrightness = ValSlider(maintab,(-1.0,0.0),"GLBst:") self.glbrightness.setObjectName("GLBoost") self.glbrightness.setValue(0.1) self.glbrightness.setValue(0.0) maintab.vbl.addWidget(self.glbrightness) self.transform_panel.addWidgets(maintab.vbl) return maintab def slider_rotate(self): self.target().load_rotation(self.get_current_rotation()) def set_hist(self,hist,minden,maxden): self.hist.set_data(hist,minden,maxden) def set_slice(self,val): self.slice.setValue(val) def set_sliceRange(self,min,max): self.slice.setRange(min,max)
def addRotationWidgets(self): """ Add alll the widgets for the various EMAN2 rotation conventions """ EMANwidget = QtGui.QWidget() Imagicwidget = QtGui.QWidget() Spiderwidget = QtGui.QWidget() MRCwidget = QtGui.QWidget() XYZwidget = QtGui.QWidget() spinwidget = QtGui.QWidget() sgirotwidget = QtGui.QWidget() quaternionwidget = QtGui.QWidget() # EMAN emanbox = QtGui.QVBoxLayout() self.emanazslider = ValSlider(EMANwidget, (0.0, 360.0), " Az", rounding=1) self.emanaltslider = ValSlider(EMANwidget, (0.0, 180.0), "Alt", rounding=1) self.emanphislider = ValSlider(EMANwidget, (0.0, 360.0), "Phi", rounding=1) emanbox.addWidget(self.emanazslider) emanbox.addWidget(self.emanaltslider) emanbox.addWidget(self.emanphislider) EMANwidget.setLayout(emanbox) # Imagic imagicbox = QtGui.QVBoxLayout() self.imagicgammaslider = ValSlider(Imagicwidget, (0.0, 360.0), "Gamma", rounding=1) self.imagicbetaslider = ValSlider(Imagicwidget, (0.0, 180.0), " Beta", rounding=1) self.imagicalphaslider = ValSlider(Imagicwidget, (0.0, 360.0), " Alpha", rounding=1) imagicbox.addWidget(self.imagicgammaslider) imagicbox.addWidget(self.imagicbetaslider) imagicbox.addWidget(self.imagicalphaslider) Imagicwidget.setLayout(imagicbox) # Spider spiderbox = QtGui.QVBoxLayout() self.spiderpsislider = ValSlider(Spiderwidget, (0.0, 360.0), " Psi", rounding=1) self.spiderthetaslider = ValSlider(Spiderwidget, (0.0, 180.0), "Theta", rounding=1) self.spiderphislider = ValSlider(Spiderwidget, (0.0, 360.0), " Phi", rounding=1) spiderbox.addWidget(self.spiderpsislider) spiderbox.addWidget(self.spiderthetaslider) spiderbox.addWidget(self.spiderphislider) Spiderwidget.setLayout(spiderbox) # MRC mrcbox = QtGui.QVBoxLayout() self.mrcpsislider = ValSlider(MRCwidget, (0.0, 360.0), " Psi", rounding=1) self.mrcthetaslider = ValSlider(MRCwidget, (0.0, 180.0), " Theta", rounding=1) self.mrcomegaslider = ValSlider(MRCwidget, (0.0, 360.0), "Omega", rounding=1) mrcbox.addWidget(self.mrcpsislider) mrcbox.addWidget(self.mrcthetaslider) mrcbox.addWidget(self.mrcomegaslider) MRCwidget.setLayout(mrcbox) # XYZ xyzbox = QtGui.QVBoxLayout() self.xyzzslider = ValSlider(XYZwidget, (0.0, 360.0), "Z", rounding=1) self.xyzyslider = ValSlider(XYZwidget, (0.0, 180.0), "Y", rounding=1) self.xyzxslider = ValSlider(XYZwidget, (0.0, 360.0), "X", rounding=1) xyzbox.addWidget(self.xyzzslider) xyzbox.addWidget(self.xyzyslider) xyzbox.addWidget(self.xyzxslider) XYZwidget.setLayout(xyzbox) # spin spinbox = QtGui.QVBoxLayout() self.spinomegaslider = ValSlider(spinwidget, (0.0, 180.0), "Omega", rounding=1) self.spinn1slider = ValSlider(spinwidget, (0.0, 1.0), " N1", rounding=4) self.spinn2slider = ValSlider(spinwidget, (0.0, 1.0), " N2", rounding=4) self.spinn3slider = ValSlider(spinwidget, (0.0, 1.0), " N3", rounding=4) spinbox.addWidget(self.spinomegaslider) spinbox.addWidget(self.spinn1slider) spinbox.addWidget(self.spinn2slider) spinbox.addWidget(self.spinn3slider) spinwidget.setLayout(spinbox) # sgirot sgirotbox = QtGui.QVBoxLayout() self.sgirotqslider = ValSlider(sgirotwidget, (0.0, 180.0), " Q", rounding=1) self.sgirotn1slider = ValSlider(sgirotwidget, (0.0, 1.0), "N1", rounding=4) self.sgirotn2slider = ValSlider(sgirotwidget, (0.0, 1.0), "N2", rounding=4) self.sgirotn3slider = ValSlider(sgirotwidget, (0.0, 1.0), "N3", rounding=4) sgirotbox.addWidget(self.sgirotqslider) sgirotbox.addWidget(self.sgirotn1slider) sgirotbox.addWidget(self.sgirotn2slider) sgirotbox.addWidget(self.sgirotn3slider) sgirotwidget.setLayout(sgirotbox) # quaternion quaternionbox = QtGui.QVBoxLayout() self.quaternione0slider = ValSlider(quaternionwidget, (0.0, 1.0), "E0", rounding=4) self.quaternione1slider = ValSlider(quaternionwidget, (0.0, 1.0), "E1", rounding=4) self.quaternione2slider = ValSlider(quaternionwidget, (0.0, 1.0), "E2", rounding=4) self.quaternione3slider = ValSlider(quaternionwidget, (0.0, 1.0), "E3", rounding=4) quaternionbox.addWidget(self.quaternione0slider) quaternionbox.addWidget(self.quaternione1slider) quaternionbox.addWidget(self.quaternione2slider) quaternionbox.addWidget(self.quaternione3slider) quaternionwidget.setLayout(quaternionbox) # Add widgets to the stack self.rotstackedwidget.addWidget(EMANwidget) self.rotstackedwidget.addWidget(Imagicwidget) self.rotstackedwidget.addWidget(Spiderwidget) self.rotstackedwidget.addWidget(MRCwidget) self.rotstackedwidget.addWidget(XYZwidget) self.rotstackedwidget.addWidget(spinwidget) self.rotstackedwidget.addWidget(sgirotwidget) self.rotstackedwidget.addWidget(quaternionwidget) # add choices to combobox self.rotcombobox.addItem("EMAN") self.rotcombobox.addItem("Imagic") self.rotcombobox.addItem("Spider") self.rotcombobox.addItem("MRC") self.rotcombobox.addItem("XYZ") self.rotcombobox.addItem("spin") self.rotcombobox.addItem("sgirot") self.rotcombobox.addItem("quaternion") # Signal for all sliders QtCore.QObject.connect(self.rotcombobox, QtCore.SIGNAL("activated(int)"), self._rotcombobox_changed) QtCore.QObject.connect(self.emanazslider, QtCore.SIGNAL("valueChanged"), self._on_EMAN_rotation) QtCore.QObject.connect(self.emanaltslider, QtCore.SIGNAL("valueChanged"), self._on_EMAN_rotation) QtCore.QObject.connect(self.emanphislider, QtCore.SIGNAL("valueChanged"), self._on_EMAN_rotation) QtCore.QObject.connect(self.imagicgammaslider, QtCore.SIGNAL("valueChanged"), self._on_Imagic_rotation) QtCore.QObject.connect(self.imagicbetaslider, QtCore.SIGNAL("valueChanged"), self._on_Imagic_rotation) QtCore.QObject.connect(self.imagicalphaslider, QtCore.SIGNAL("valueChanged"), self._on_Imagic_rotation) QtCore.QObject.connect(self.spiderpsislider, QtCore.SIGNAL("valueChanged"), self._on_Spider_rotation) QtCore.QObject.connect(self.spiderthetaslider, QtCore.SIGNAL("valueChanged"), self._on_Spider_rotation) QtCore.QObject.connect(self.spiderphislider, QtCore.SIGNAL("valueChanged"), self._on_Spider_rotation) QtCore.QObject.connect(self.mrcpsislider, QtCore.SIGNAL("valueChanged"), self._on_MRC_rotation) QtCore.QObject.connect(self.mrcthetaslider, QtCore.SIGNAL("valueChanged"), self._on_MRC_rotation) QtCore.QObject.connect(self.mrcomegaslider, QtCore.SIGNAL("valueChanged"), self._on_MRC_rotation) QtCore.QObject.connect(self.xyzzslider, QtCore.SIGNAL("valueChanged"), self._on_XYZ_rotation) QtCore.QObject.connect(self.xyzyslider, QtCore.SIGNAL("valueChanged"), self._on_XYZ_rotation) QtCore.QObject.connect(self.xyzxslider, QtCore.SIGNAL("valueChanged"), self._on_XYZ_rotation) QtCore.QObject.connect(self.spinomegaslider, QtCore.SIGNAL("valueChanged"), self._on_spin_rotation) QtCore.QObject.connect(self.spinn1slider, QtCore.SIGNAL("valueChanged"), self._on_spin_rotation) QtCore.QObject.connect(self.spinn2slider, QtCore.SIGNAL("valueChanged"), self._on_spin_rotation) QtCore.QObject.connect(self.spinn3slider, QtCore.SIGNAL("valueChanged"), self._on_spin_rotation) QtCore.QObject.connect(self.sgirotqslider, QtCore.SIGNAL("valueChanged"), self._on_sgirot_rotation) QtCore.QObject.connect(self.sgirotn1slider, QtCore.SIGNAL("valueChanged"), self._on_sgirot_rotation) QtCore.QObject.connect(self.sgirotn2slider, QtCore.SIGNAL("valueChanged"), self._on_sgirot_rotation) QtCore.QObject.connect(self.sgirotn3slider, QtCore.SIGNAL("valueChanged"), self._on_sgirot_rotation) QtCore.QObject.connect(self.quaternione0slider, QtCore.SIGNAL("valueChanged"), self._on_quaternion_rotation) QtCore.QObject.connect(self.quaternione1slider, QtCore.SIGNAL("valueChanged"), self._on_quaternion_rotation) QtCore.QObject.connect(self.quaternione2slider, QtCore.SIGNAL("valueChanged"), self._on_quaternion_rotation) QtCore.QObject.connect(self.quaternione3slider, QtCore.SIGNAL("valueChanged"), self._on_quaternion_rotation)
class EMHelloWorldInspector(QtGui.QWidget): def __init__(self,target) : QtGui.QWidget.__init__(self,None) self.target=target self.vbl = QtGui.QVBoxLayout(self) self.vbl.setMargin(0) self.vbl.setSpacing(6) self.vbl.setObjectName("vbl") self.hbl = QtGui.QHBoxLayout() self.hbl.setMargin(0) self.hbl.setSpacing(6) self.hbl.setObjectName("hbl") self.vbl.addLayout(self.hbl) self.vbl2 = QtGui.QVBoxLayout() self.vbl2.setMargin(0) self.vbl2.setSpacing(6) self.vbl2.setObjectName("vbl2") self.hbl.addLayout(self.vbl2) self.wiretog = QtGui.QPushButton("Wire") self.wiretog.setCheckable(1) self.vbl2.addWidget(self.wiretog) self.lighttog = QtGui.QPushButton("Light") self.lighttog.setCheckable(1) self.vbl2.addWidget(self.lighttog) self.tabwidget = QtGui.QTabWidget() self.maintab = None self.tabwidget.addTab(self.get_main_tab(), "Main") self.tabwidget.addTab(self.get_GL_tab(),"GL") self.vbl.addWidget(self.tabwidget) self.n3_showing = False QtCore.QObject.connect(self.scale, QtCore.SIGNAL("valueChanged"), target.set_scale) QtCore.QObject.connect(self.az, QtCore.SIGNAL("valueChanged"), self.slider_rotate) QtCore.QObject.connect(self.alt, QtCore.SIGNAL("valueChanged"), self.slider_rotate) QtCore.QObject.connect(self.phi, QtCore.SIGNAL("valueChanged"), self.slider_rotate) QtCore.QObject.connect(self.cbb, QtCore.SIGNAL("currentIndexChanged(QString)"), target.setColor) QtCore.QObject.connect(self.src, QtCore.SIGNAL("currentIndexChanged(QString)"), self.set_src) QtCore.QObject.connect(self.x_trans, QtCore.SIGNAL("valueChanged(double)"), target.set_cam_x) QtCore.QObject.connect(self.y_trans, QtCore.SIGNAL("valueChanged(double)"), target.set_cam_y) QtCore.QObject.connect(self.z_trans, QtCore.SIGNAL("valueChanged(double)"), target.set_cam_z) QtCore.QObject.connect(self.wiretog, QtCore.SIGNAL("toggled(bool)"), target.toggle_wire) QtCore.QObject.connect(self.lighttog, QtCore.SIGNAL("toggled(bool)"), target.toggle_light) QtCore.QObject.connect(self.glcontrast, QtCore.SIGNAL("valueChanged"), target.set_GL_contrast) QtCore.QObject.connect(self.glbrightness, QtCore.SIGNAL("valueChanged"), target.set_GL_brightness) def get_GL_tab(self): self.gltab = QtGui.QWidget() gltab = self.gltab gltab.vbl = QtGui.QVBoxLayout(self.gltab ) gltab.vbl.setMargin(0) gltab.vbl.setSpacing(6) gltab.vbl.setObjectName("Main") self.glcontrast = ValSlider(gltab,(1.0,5.0),"GLShd:") self.glcontrast.setObjectName("GLShade") self.glcontrast.setValue(1.0) gltab.vbl.addWidget(self.glcontrast) self.glbrightness = ValSlider(gltab,(-1.0,0.0),"GLBst:") self.glbrightness.setObjectName("GLBoost") self.glbrightness.setValue(0.1) self.glbrightness.setValue(0.0) gltab.vbl.addWidget(self.glbrightness) return gltab def get_main_tab(self): if ( self.maintab == None ): self.maintab = QtGui.QWidget() maintab = self.maintab maintab.vbl = QtGui.QVBoxLayout(self.maintab) maintab.vbl.setMargin(0) maintab.vbl.setSpacing(6) maintab.vbl.setObjectName("Main") self.scale = ValSlider(maintab,(0.01,30.0),"Zoom:") self.scale.setObjectName("scale") self.scale.setValue(1.0) maintab.vbl.addWidget(self.scale) self.hbl_color = QtGui.QHBoxLayout() self.hbl_color.setMargin(0) self.hbl_color.setSpacing(6) self.hbl_color.setObjectName("Material") maintab.vbl.addLayout(self.hbl_color) self.color_label = QtGui.QLabel() self.color_label.setText('Material') self.hbl_color.addWidget(self.color_label) self.cbb = QtGui.QComboBox(maintab) self.hbl_color.addWidget(self.cbb) self.hbl_trans = QtGui.QHBoxLayout() self.hbl_trans.setMargin(0) self.hbl_trans.setSpacing(6) self.hbl_trans.setObjectName("Trans") maintab.vbl.addLayout(self.hbl_trans) self.x_label = QtGui.QLabel() self.x_label.setText('x') self.hbl_trans.addWidget(self.x_label) self.x_trans = QtGui.QDoubleSpinBox(self) self.x_trans.setMinimum(-10000) self.x_trans.setMaximum(10000) self.x_trans.setValue(0.0) self.hbl_trans.addWidget(self.x_trans) self.y_label = QtGui.QLabel() self.y_label.setText('y') self.hbl_trans.addWidget(self.y_label) self.y_trans = QtGui.QDoubleSpinBox(maintab) self.y_trans.setMinimum(-10000) self.y_trans.setMaximum(10000) self.y_trans.setValue(0.0) self.hbl_trans.addWidget(self.y_trans) self.z_label = QtGui.QLabel() self.z_label.setText('z') self.hbl_trans.addWidget(self.z_label) self.z_trans = QtGui.QDoubleSpinBox(maintab) self.z_trans.setMinimum(-10000) self.z_trans.setMaximum(10000) self.z_trans.setValue(0.0) self.hbl_trans.addWidget(self.z_trans) self.hbl_src = QtGui.QHBoxLayout() self.hbl_src.setMargin(0) self.hbl_src.setSpacing(6) self.hbl_src.setObjectName("hbl") maintab.vbl.addLayout(self.hbl_src) self.label_src = QtGui.QLabel() self.label_src.setText('Rotation Convention') self.hbl_src.addWidget(self.label_src) self.src = QtGui.QComboBox(maintab) self.load_src_options(self.src) self.hbl_src.addWidget(self.src) # set default value -1 ensures that the val slider is updated the first time it is created self.az = ValSlider(self,(-360.0,360.0),"az",-1) self.az.setObjectName("az") maintab.vbl.addWidget(self.az) self.alt = ValSlider(self,(-180.0,180.0),"alt",-1) self.alt.setObjectName("alt") maintab.vbl.addWidget(self.alt) self.phi = ValSlider(self,(-360.0,360.0),"phi",-1) self.phi.setObjectName("phi") maintab.vbl.addWidget(self.phi) self.current_src = EULER_EMAN return self.maintab def set_xy_trans(self, x, y): self.x_trans.setValue(x) self.y_trans.setValue(y) def set_xyz_trans(self,x,y,z): self.x_trans.setValue(x) self.y_trans.setValue(y) self.z_trans.setValue(z) def set_translate_scale(self, xscale,yscale,zscale): self.x_trans.setSingleStep(xscale) self.y_trans.setSingleStep(yscale) self.z_trans.setSingleStep(zscale) def update_rotations(self,t3d): convention = str( self.src.currentText() ) #FIXME: Transform.get_rotation() wants a string sometimes and a EulerType other times try: rot = t3d.get_rotation(str(self.src_map[convention])) except Exception as e: #doing a quick fix print(e) print("Developers: This catches a large range of exceptions... a better way surely exists") rot = t3d.get_rotation(self.src_map[convention]) if ( self.src_map[convention] == EULER_SPIN ): self.n3.setValue(rot[self.n3.getLabel()],True) self.az.setValue(rot[self.az.getLabel()],True) self.alt.setValue(rot[self.alt.getLabel()],True) self.phi.setValue(rot[self.phi.getLabel()],True) def slider_rotate(self): self.target.load_rotation(self.get_current_rotation()) def get_current_rotation(self): convention = self.src.currentText() rot = {} if ( self.current_src == EULER_SPIN ): rot[self.az.getLabel()] = self.az.getValue() n1 = self.alt.getValue() n2 = self.phi.getValue() n3 = self.n3.getValue() norm = sqrt(n1*n1 + n2*n2 + n3*n3) n1 /= norm n2 /= norm n3 /= norm rot[self.alt.getLabel()] = n1 rot[self.phi.getLabel()] = n2 rot[self.n3.getLabel()] = n3 else: rot[self.az.getLabel()] = self.az.getValue() rot[self.alt.getLabel()] = self.alt.getValue() rot[self.phi.getLabel()] = self.phi.getValue() return Transform(self.current_src, rot) def set_src(self, val): t3d = self.get_current_rotation() if (self.n3_showing) : self.vbl.removeWidget(self.n3) self.n3.deleteLater() self.n3_showing = False self.az.setRange(-360,360) self.alt.setRange(-180,180) self.phi.setRange(-360,660) if ( self.src_map[str(val)] == EULER_SPIDER ): self.az.setLabel('phi') self.alt.setLabel('theta') self.phi.setLabel('psi') elif ( self.src_map[str(val)] == EULER_EMAN ): self.az.setLabel('az') self.alt.setLabel('alt') self.phi.setLabel('phi') elif ( self.src_map[str(val)] == EULER_IMAGIC ): self.az.setLabel('alpha') self.alt.setLabel('beta') self.phi.setLabel('gamma') elif ( self.src_map[str(val)] == EULER_XYZ ): self.az.setLabel('xtilt') self.alt.setLabel('ytilt') self.phi.setLabel('ztilt') elif ( self.src_map[str(val)] == EULER_MRC ): self.az.setLabel('phi') self.alt.setLabel('theta') self.phi.setLabel('omega') elif ( self.src_map[str(val)] == EULER_SPIN ): self.az.setLabel('omega') self.alt.setRange(-1,1) self.phi.setRange(-1,1) self.alt.setLabel('n1') self.phi.setLabel('n2') self.n3 = ValSlider(self,(-360.0,360.0),"n3",-1) self.n3.setRange(-1,1) self.n3.setObjectName("n3") self.vbl.addWidget(self.n3) QtCore.QObject.connect(self.n3, QtCore.SIGNAL("valueChanged"), self.slider_rotate) self.n3_showing = True self.current_src = self.src_map[str(val)] self.update_rotations(t3d) def load_src_options(self,widgit): self.load_src() for i in self.src_strings: widgit.addItem(i) # read src as 'supported rotation conventions' def load_src(self): # supported_rot_conventions src_flags = [] src_flags.append(EULER_EMAN) src_flags.append(EULER_SPIDER) src_flags.append(EULER_IMAGIC) src_flags.append(EULER_MRC) src_flags.append(EULER_SPIN) src_flags.append(EULER_XYZ) self.src_strings = [] self.src_map = {} for i in src_flags: self.src_strings.append(str(i)) self.src_map[str(i)] = i def setColors(self,colors,current_color): a = 0 for i in colors: self.cbb.addItem(i) if ( i == current_color): self.cbb.setCurrentIndex(a) a += 1 def set_scale(self,newscale): self.scale.setValue(newscale)