Exemplo n.º 1
0
	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
Exemplo n.º 2
0
	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
Exemplo n.º 3
0
    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
Exemplo n.º 4
0
    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
Exemplo n.º 5
0
    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
Exemplo n.º 6
0
	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
Exemplo n.º 7
0
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)
Exemplo n.º 8
0
	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
Exemplo n.º 9
0
    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
Exemplo n.º 10
0
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)
Exemplo n.º 11
0
	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)
Exemplo n.º 12
0
    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)
Exemplo n.º 13
0
	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)
Exemplo n.º 14
0
	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
Exemplo n.º 15
0
	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
Exemplo n.º 16
0
	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)
Exemplo n.º 17
0
	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
Exemplo n.º 18
0
	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
Exemplo n.º 19
0
	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
Exemplo n.º 20
0
	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
Exemplo n.º 21
0
	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)
Exemplo n.º 22
0
	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)
Exemplo n.º 23
0
    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
Exemplo n.º 24
0
    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
Exemplo n.º 25
0
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)
Exemplo n.º 26
0
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
Exemplo n.º 27
0
	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()
Exemplo n.º 28
0
    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")
Exemplo n.º 29
0
	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)	
Exemplo n.º 30
0
    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()
Exemplo n.º 31
0
	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
Exemplo n.º 32
0
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())
Exemplo n.º 33
0
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()
Exemplo n.º 34
0
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)
Exemplo n.º 35
0
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)
Exemplo n.º 36
0
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)
Exemplo n.º 37
0
	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
Exemplo n.º 38
0
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)
Exemplo n.º 39
0
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
Exemplo n.º 40
0
	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
Exemplo n.º 41
0
    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")
Exemplo n.º 42
0
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())
Exemplo n.º 43
0
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
Exemplo n.º 44
0
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
Exemplo n.º 45
0
	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")
Exemplo n.º 46
0
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()
Exemplo n.º 47
0
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)
Exemplo n.º 48
0
    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
Exemplo n.º 49
0
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)
Exemplo n.º 50
0
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
Exemplo n.º 51
0
    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)
Exemplo n.º 52
0
	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)
Exemplo n.º 53
0
	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")
Exemplo n.º 54
0
    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()
Exemplo n.º 55
0
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)
Exemplo n.º 56
0
    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)
Exemplo n.º 57
0
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)