def __init__(self, target): QtWidgets.QWidget.__init__(self) #print "aaaaaaaa" self.setWindowTitle("Options") self.target = weakref.ref(target) self.gbl = QtWidgets.QGridLayout(self) #self.gbl.setContentsMargins(2, 2, 2, 2) #self.gbl.setSpacing(6) self.gbl.setObjectName("gbl") self.erasercheckbox = QtWidgets.QCheckBox("Eraser") self.gbl.addWidget(self.erasercheckbox, 0, 0) self.eraser_radius = ValBox(label="Radius:", value=64) self.gbl.addWidget(self.eraser_radius, 0, 1) self.tabwidget = QtWidgets.QTabWidget() self.gbl.addWidget(self.tabwidget, 1, 0, 1, 2)
def __init__(self,application,options,datafile): QtWidgets.QWidget.__init__(self) self.initialized=False self.app=weakref.ref(application) self.options=options self.apix=options.apix self.currentset=0 self.shrink=1#options.shrink self.setWindowTitle("Main Window (e2spt_boxer.py)") if options.mode=="3D": self.boxshape="circle" else: self.boxshape="rect" self.globalxf=Transform() # Menu Bar self.mfile=self.menuBar().addMenu("File") #self.mfile_open=self.mfile.addAction("Open") self.mfile_read_boxloc=self.mfile.addAction("Read Box Coord") self.mfile_save_boxloc=self.mfile.addAction("Save Box Coord") self.mfile_save_boxpdb=self.mfile.addAction("Save Coord as PDB") self.mfile_save_boxes_stack=self.mfile.addAction("Save Boxes as Stack") #self.mfile_quit=self.mfile.addAction("Quit") self.setCentralWidget(QtWidgets.QWidget()) self.gbl = QtWidgets.QGridLayout(self.centralWidget()) # relative stretch factors self.gbl.setColumnMinimumWidth(0,200) self.gbl.setRowMinimumHeight(0,200) self.gbl.setColumnStretch(0,0) self.gbl.setColumnStretch(1,100) self.gbl.setColumnStretch(2,0) self.gbl.setRowStretch(1,0) self.gbl.setRowStretch(0,100) # 3 orthogonal restricted projection views self.xyview = EMImage2DWidget(sizehint=(1024,1024)) self.gbl.addWidget(self.xyview,0,1) self.xzview = EMImage2DWidget(sizehint=(1024,256)) self.gbl.addWidget(self.xzview,1,1) self.zyview = EMImage2DWidget(sizehint=(256,1024)) self.gbl.addWidget(self.zyview,0,0) # Select Z for xy view self.wdepth = QtWidgets.QSlider() self.gbl.addWidget(self.wdepth,1,2) ### Control panel area in upper left corner self.gbl2 = QtWidgets.QGridLayout() self.gbl.addLayout(self.gbl2,1,0) #self.wxpos = QtWidgets.QSlider(Qt.Horizontal) #self.gbl2.addWidget(self.wxpos,0,0) #self.wypos = QtWidgets.QSlider(Qt.Vertical) #self.gbl2.addWidget(self.wypos,0,3,6,1) # box size self.wboxsize=ValBox(label="Box Size:",value=0) self.gbl2.addWidget(self.wboxsize,2,0) # max or mean #self.wmaxmean=QtWidgets.QPushButton("MaxProj") #self.wmaxmean.setCheckable(True) #self.gbl2.addWidget(self.wmaxmean,3,0) # number slices label0=QtWidgets.QLabel("Thickness") self.gbl2.addWidget(label0,3,0) self.wnlayers=QtWidgets.QSpinBox() self.wnlayers.setMinimum(1) self.wnlayers.setMaximum(256) self.wnlayers.setValue(1) self.gbl2.addWidget(self.wnlayers,3,1) # Local boxes in side view self.wlocalbox=QtWidgets.QCheckBox("Limit Side Boxes") self.gbl2.addWidget(self.wlocalbox,4,0) self.wlocalbox.setChecked(True) self.button_flat = QtWidgets.QPushButton("Flatten") self.gbl2.addWidget(self.button_flat,5,0) self.button_reset = QtWidgets.QPushButton("Reset") self.gbl2.addWidget(self.button_reset,5,1) ## scale factor #self.wscale=ValSlider(rng=(.1,2),label="Sca:",value=1.0) #self.gbl2.addWidget(self.wscale,4,0,1,2) # 2-D filters self.wfilt = ValSlider(rng=(0,150),label="Filt",value=0.0) self.gbl2.addWidget(self.wfilt,6,0,1,2) self.curbox=-1 self.boxes=[] # array of box info, each is (x,y,z,...) self.boxesimgs=[] # z projection of each box self.dragging=-1 ##coordinate display self.wcoords=QtWidgets.QLabel("") self.gbl2.addWidget(self.wcoords, 1, 0, 1, 2) self.button_flat.clicked[bool].connect(self.flatten_tomo) self.button_reset.clicked[bool].connect(self.reset_flatten_tomo) # file menu #self.mfile_open.triggered[bool].connect(self.menu_file_open) self.mfile_read_boxloc.triggered[bool].connect(self.menu_file_read_boxloc) self.mfile_save_boxloc.triggered[bool].connect(self.menu_file_save_boxloc) self.mfile_save_boxpdb.triggered[bool].connect(self.menu_file_save_boxpdb) self.mfile_save_boxes_stack.triggered[bool].connect(self.save_boxes) #self.mfile_quit.triggered[bool].connect(self.menu_file_quit) # all other widgets self.wdepth.valueChanged[int].connect(self.event_depth) self.wnlayers.valueChanged[int].connect(self.event_nlayers) self.wboxsize.valueChanged.connect(self.event_boxsize) #self.wmaxmean.clicked[bool].connect(self.event_projmode) #self.wscale.valueChanged.connect(self.event_scale) self.wfilt.valueChanged.connect(self.event_filter) self.wlocalbox.stateChanged[int].connect(self.event_localbox) self.xyview.mousemove.connect(self.xy_move) self.xyview.mousedown.connect(self.xy_down) self.xyview.mousedrag.connect(self.xy_drag) self.xyview.mouseup.connect(self.mouse_up) self.xyview.mousewheel.connect(self.xy_wheel) self.xyview.signal_set_scale.connect(self.event_scale) self.xyview.origin_update.connect(self.xy_origin) self.xzview.mousedown.connect(self.xz_down) self.xzview.mousedrag.connect(self.xz_drag) self.xzview.mouseup.connect(self.mouse_up) self.xzview.mousewheel.connect(self.xz_wheel) self.xzview.signal_set_scale.connect(self.event_scale) self.xzview.origin_update.connect(self.xz_origin) self.xzview.mousemove.connect(self.xz_move) self.zyview.mousedown.connect(self.zy_down) self.zyview.mousedrag.connect(self.zy_drag) self.zyview.mouseup.connect(self.mouse_up) self.zyview.mousewheel.connect(self.zy_wheel) self.zyview.signal_set_scale.connect(self.event_scale) self.zyview.origin_update.connect(self.zy_origin) self.zyview.mousemove.connect(self.zy_move) self.xyview.keypress.connect(self.key_press) self.datafilename=datafile self.basename=base_name(datafile) p0=datafile.find('__') if p0>0: p1=datafile.rfind('.') self.filetag=datafile[p0:p1] if self.filetag[-1]!='_': self.filetag+='_' else: self.filetag="__" data=EMData(datafile) self.set_data(data) # Boxviewer subwidget (details of a single box) #self.boxviewer=EMBoxViewer() #self.app().attach_child(self.boxviewer) # Boxes Viewer (z projections of all boxes) self.boxesviewer=EMImageMXWidget() #self.app().attach_child(self.boxesviewer) self.boxesviewer.show() self.boxesviewer.set_mouse_mode("App") self.boxesviewer.setWindowTitle("Particle List") self.boxesviewer.rzonce=True self.setspanel=EMTomoSetsPanel(self) self.optionviewer=EMTomoBoxerOptions(self) self.optionviewer.add_panel(self.setspanel,"Sets") self.optionviewer.show() self.boxesviewer.mx_image_selected.connect(self.img_selected) ################## #### deal with metadata in the _info.json file... self.jsonfile=info_name(datafile) info=js_open_dict(self.jsonfile) #### read particle classes self.sets={} self.boxsize={} if "class_list" in info: clslst=info["class_list"] for k in sorted(clslst.keys()): if type(clslst[k])==dict: self.sets[int(k)]=str(clslst[k]["name"]) self.boxsize[int(k)]=int(clslst[k]["boxsize"]) else: self.sets[int(k)]=str(clslst[k]) self.boxsize[int(k)]=64 clr=QtGui.QColor self.setcolors=[QtGui.QBrush(clr("blue")),QtGui.QBrush(clr("green")),QtGui.QBrush(clr("red")),QtGui.QBrush(clr("cyan")),QtGui.QBrush(clr("purple")),QtGui.QBrush(clr("orange")), QtGui.QBrush(clr("yellow")),QtGui.QBrush(clr("hotpink")),QtGui.QBrush(clr("gold"))] self.sets_visible={} #### read boxes if "boxes_3d" in info: box=info["boxes_3d"] for i,b in enumerate(box): #### X-center,Y-center,Z-center,method,[score,[class #]] bdf=[0,0,0,"manual",0.0, 0] for j,bi in enumerate(b): bdf[j]=bi if bdf[5] not in list(self.sets.keys()): clsi=int(bdf[5]) self.sets[clsi]="particles_{:02d}".format(clsi) self.boxsize[clsi]=64 self.boxes.append(bdf) ###### this is the new (2018-09) metadata standard.. ### now we use coordinates at full size from center of tomogram so it works for different binning and clipping ### have to make it compatible with older versions though.. if "apix_unbin" in info: self.apix_unbin=info["apix_unbin"] self.apix_cur=apix=data["apix_x"] for b in self.boxes: b[0]=b[0]/apix*self.apix_unbin+data["nx"]//2 b[1]=b[1]/apix*self.apix_unbin+data["ny"]//2 b[2]=b[2]/apix*self.apix_unbin+data["nz"]//2 for k in self.boxsize.keys(): self.boxsize[k]=int(np.round(self.boxsize[k]*self.apix_unbin/apix)) else: self.apix_unbin=-1 info.close() E2loadappwin("e2sptboxer","main",self) E2loadappwin("e2sptboxer","boxes",self.boxesviewer.qt_parent) E2loadappwin("e2sptboxer","option",self.optionviewer) #### particle classes if len(self.sets)==0: self.new_set("particles_00") self.sets_visible[list(self.sets.keys())[0]]=0 self.currentset=sorted(self.sets.keys())[0] self.setspanel.update_sets() self.wboxsize.setValue(self.get_boxsize()) #print(self.sets) for i in range(len(self.boxes)): self.update_box(i) self.update_all() self.initialized=True
def __init__(self,app): self.app=app QtWidgets.QWidget.__init__(self,None) self.synthplot=EMPlot2DWidget(self.app) self.synthplot.show() # overall layout self.vbl1=QtWidgets.QVBoxLayout() self.setLayout(self.vbl1) # First row contains general purpose controls self.hbl1=QtWidgets.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:",32) self.vnsin.intonly=1 self.hbl1.addWidget(self.vnsin) self.cbshowall=QtWidgets.QCheckBox("Show All") self.hbl1.addWidget(self.cbshowall) self.cbshifted=QtWidgets.QCheckBox("Shifted") self.hbl1.addWidget(self.cbshifted) self.cbtargfn=QtWidgets.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.cbtargfn.addItem("square imp dx") self.cbtargfn.addItem("square imp 2") self.hbl1.addWidget(self.cbtargfn) # Widget containing valsliders self.wapsliders=QtWidgets.QWidget(self) # self.wapsliders.setMinimumSize(800,640) self.gblap=QtWidgets.QGridLayout() self.gblap.setSizeConstraint(QtWidgets.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=QtWidgets.QScrollArea(self) self.wapsarea.setWidgetResizable(True) self.wapsarea.setWidget(self.wapsliders) self.vbl1.addWidget(self.wapsarea) self.vcell.valueChanged.connect(self.recompute) self.vncells.valueChanged.connect(self.recompute) self.voversamp.valueChanged.connect(self.recompute) self.vnsin.valueChanged.connect(self.nsinchange) self.cbshowall.stateChanged[int].connect(self.recompute) self.cbshifted.stateChanged[int].connect(self.recompute) self.cbtargfn.activated[int].connect(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) self.wamp[-1].valueChanged.connect(self.recompute) self.wpha.append(ValSlider(self,(-180.0,180.0),"%2d:"%i,0.0)) self.gblap.addWidget(self.wpha[-1],i,1) self.wpha[-1].valueChanged.connect(self.recompute) self.curves.append(EMData(64,1)) if self.cbshowall.isChecked() : self.synthplot self.total=EMData(64,1) self.nsinchange()
def __init__(self,app): self.app=app QtWidgets.QWidget.__init__(self,None) self.synthplot=EMPlot2DWidget(self.app) self.synthplot.show() self.fftplot=EMPlot2DWidget(self.app) # not shown initially self.fftplot.show() # self.bispecimg=EMImage2DWidget(self.app) # not shown initially # overall layout self.vbl1=QtWidgets.QVBoxLayout() self.setLayout(self.vbl1) # First row contains general purpose controls self.hbl1=QtWidgets.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:",32) self.vnsin.intonly=1 self.hbl1.addWidget(self.vnsin) self.cbshowall=QtWidgets.QCheckBox("Show All") self.hbl1.addWidget(self.cbshowall) self.cbshifted=QtWidgets.QCheckBox("Shifted") self.hbl1.addWidget(self.cbshifted) self.vshftstep=ValBox(self,(1,64),"Shft:",1) self.hbl1.addWidget(self.vshftstep) self.bphaseleft=QtWidgets.QPushButton("\u2190") # phase left self.hbl1.addWidget(self.bphaseleft) self.bphasecen=QtWidgets.QPushButton("O") self.hbl1.addWidget(self.bphasecen) self.bphaseright=QtWidgets.QPushButton("\u2192") # phase right self.hbl1.addWidget(self.bphaseright) self.cbtargfn=QtWidgets.QComboBox(self) self.cbtargfn.addItem("None") # 0 self.cbtargfn.addItem("triangle") # 1 self.cbtargfn.addItem("square") # 2 self.cbtargfn.addItem("square imp") # 3 self.cbtargfn.addItem("delta") # 4 self.cbtargfn.addItem("noise") self.cbtargfn.addItem("saw") self.cbtargfn.addItem("sin") self.cbtargfn.addItem("modsin") self.cbtargfn.addItem("modsin2") self.cbtargfn.addItem("modsin3") #10 self.cbtargfn.addItem("sin low") self.cbtargfn.addItem("doubledelta") self.cbtargfn.addItem("sin bad f") self.cbtargfn.addItem("sin bad f2") self.cbtargfn.addItem("0 phase") #15 self.cbtargfn.addItem("rand phase") self.hbl1.addWidget(self.cbtargfn) self.bsound=QtWidgets.QPushButton("Play") self.hbl1.addWidget(self.bsound) self.bsoundr=QtWidgets.QPushButton("Rec") self.hbl1.addWidget(self.bsoundr) self.vrootf=ValBox(self,(1,64),"Root F:",264) # 264 is middle C #self.vrootf.intonly=1 self.hbl1.addWidget(self.vrootf) # Widget containing valsliders self.wapsliders=QtWidgets.QWidget(self) # self.wapsliders.setMinimumSize(800,640) self.gblap=QtWidgets.QGridLayout() self.gblap.setSizeConstraint(QtWidgets.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=QtWidgets.QScrollArea(self) self.wapsarea.setWidgetResizable(True) self.wapsarea.setWidget(self.wapsliders) self.vbl1.addWidget(self.wapsarea) self.vcell.valueChanged.connect(self.recompute) self.vncells.valueChanged.connect(self.recompute) self.voversamp.valueChanged.connect(self.recompute) self.vnsin.valueChanged.connect(self.nsinchange) self.cbshowall.stateChanged[int].connect(self.recompute) self.cbshifted.stateChanged[int].connect(self.recompute) self.cbtargfn.activated[int].connect(self.newtargfn) self.bphaseleft.clicked.connect(self.phaseleft) self.bphasecen.clicked.connect(self.phasecen) self.bphaseright.clicked.connect(self.phaseright) self.bsound.clicked.connect(self.playsound) self.bsoundr.clicked.connect(self.recsound) 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) self.wamp[-1].valueChanged.connect(self.recompute) self.wpha.append(ValSlider(self,(-180.0,180.0),"%2d:"%i,0.0)) self.gblap.addWidget(self.wpha[-1],i,1) self.wpha[-1].valueChanged.connect(self.recompute) self.curves.append(EMData(64,1)) # if self.cbshowall.isChecked() : # self.synthplot self.total=EMData(64,1) self.nsinchange() E2loadappwin("e2fftsynth","main",self) E2loadappwin("e2fftsynth","synth",self.synthplot.qt_parent) E2loadappwin("e2fftsynth","fft",self.fftplot.qt_parent)