def loadFromMosaicFileData(self, data, directory): if (data[0] == "section"): self.addSection(coord.Point(float(data[2]), float(data[3]), "um"), float(data[4])) return True else: return False
def loadPositions(self, filename): pos_fp = open(filename, "r") while 1: line = pos_fp.readline() if not line: break [x, y] = line.split(",") self.addPosition(coord.Point(float(x), float(y), "um"))
def handleExtrapolatePict(self): pict_x = self.pointf.x() + (self.pointf.x() - self.extrapolate_start.x()) pict_y = self.pointf.y() + (self.pointf.y() - self.extrapolate_start.y()) self.extrapolate_start = None pic_list = [coord.Point(pict_x, pict_y, "pix")] pic_list.extend(createSpiral(self.extrapolate_count)) self.takePictures.emit(pic_list)
def addImage(self, image): # If image is not an object then we are done. if not image: self.taking_pictures = False self.comm.commDisconnect() return self.view.addImage(image, self.current_objective, self.current_magnification, self.current_offset) if (len(self.picture_queue) > 0): next_item = self.picture_queue[0] if (type(next_item) == type(coord.Point(0, 0, "um"))): self.setCenter(next_item) next_x_um = self.current_center.x_um next_y_um = self.current_center.y_um else: [tx, ty] = next_item next_x_um = self.current_center.x_um + 0.95 * float( image.width ) * self.parameters.pixels_to_um * tx / self.current_magnification next_y_um = self.current_center.y_um + 0.95 * float( image.height ) * self.parameters.pixels_to_um * ty / self.current_magnification self.picture_queue = self.picture_queue[1:] self.comm.captureStart(next_x_um, next_y_um) else: if self.taking_pictures: self.taking_pictures = False self.comm.commDisconnect()
def handleMOValueChange(self, objective, box_type, value): if (box_type == "magnification"): value = value / 100.0 if (objective == self.current_objective): self.current_magnification = value self.view.changeMagnification(objective, value) elif (box_type == "xoffset"): if (objective == self.current_objective): self.current_offset = coord.Point(value, self.current_offset.y_um, "um") self.view.changeXOffset(objective, coord.umToPix(value)) elif (box_type == "yoffset"): if (objective == self.current_objective): self.current_offset = coord.Point(self.current_offset.x_um, value, "um") self.view.changeYOffset(objective, coord.umToPix(value)) else: print "unknown box type:", box_type
def handleObjectiveChange(self, mag_index): data = self.ui.magComboBox.itemData(mag_index).toString() if data: data = data.split(",") if (mag_index == 0): [mag, x_offset, y_offset] = map(float, data[1:]) else: [mag, x_offset, y_offset] = findMO(data[0], self.spin_boxes) mag = mag / 100.0 self.current_objective = data[0] self.current_magnification = mag self.current_offset = coord.Point(x_offset, y_offset, "um")
def handleGetPositionComplete(self, a_point): if not self.requested_stage_pos: # Update cross hair offset_point = coord.Point(a_point.x_um + self.current_offset.x_um, a_point.y_um + self.current_offset.y_um, "um") self.view.setCrosshairPosition(offset_point.x_pix, offset_point.y_pix) else: self.requested_stage_pos = False self.ui.xStartPosSpinBox.setValue(a_point.x_um) self.ui.yStartPosSpinBox.setValue(a_point.y_um) self.comm.commDisconnect()
def addImage(self, image): # If image is not an object then we are done. if not image: self.toggleTakingPicturesStatus(False) self.comm.commDisconnect() return objective = image.parameters.get( "mosaic." + image.parameters.get("mosaic.objective")).split(",")[0] [um_per_pixel, x_offset, y_offset] = self.ui.objectivesGroupBox.getData(objective) magnification = coord.Point.pixels_to_um / um_per_pixel self.current_offset = coord.Point(x_offset, y_offset, "um") self.view.addImage(image, objective, magnification, self.current_offset) self.view.setCrosshairPosition(image.x_pix, image.y_pix) if (len(self.picture_queue) > 0): next_item = self.picture_queue[0] if (type(next_item) == type(coord.Point(0, 0, "um"))): self.setCenter(next_item) next_x_um = self.current_center.x_um next_y_um = self.current_center.y_um else: [tx, ty] = next_item next_x_um = self.current_center.x_um + 0.95 * float( image.width) * coord.Point.pixels_to_um * tx / magnification next_y_um = self.current_center.y_um + 0.95 * float( image.height ) * coord.Point.pixels_to_um * ty / magnification self.picture_queue = self.picture_queue[1:] self.comm.captureStart(next_x_um, next_y_um) else: if self.taking_pictures: self.toggleTakingPicturesStatus(False) self.comm.commDisconnect()
def handleImageGrid(self, dummy): if not self.taking_pictures: # Build position list pos_list = mosaicView.createGrid(self.ui.xSpinBox.value(), self.ui.ySpinBox.value()) # Define first position first_pos = coord.Point(self.ui.xStartPosSpinBox.value(), self.ui.yStartPosSpinBox.value(), "um") pos_list.insert(0, first_pos) # Take pictures self.takePictures(pos_list) else: # Abort button self.picture_queue = []
def handleMessageReceived(self, message): if message.hasError(): hdebug.logText("tcp error: " + message.getErrorMessage()) self.messages = [] self.waiting_for_response = False return # # If the message does not involve taking a movie and there are no more # messages then emit the otherComplete signal. # if (message.getData("is_other") == True) and (len(self.messages) == 0): self.otherComplete.emit() if (message.getType() == "Get Mosaic Settings"): self.got_settings = True #coord.Point.pixels_to_um = message.getResponse("pixels_to_um") i = 1 while message.getResponse("obj" + str(i)) is not None: self.newObjectiveData.emit( message.getResponse("obj" + str(i)).split(",")) i += 1 if (message.getType() == "Get Objective"): if self.curr_objective is None or ( self.curr_objective != message.getResponse("objective")): self.curr_objective = message.getResponse("objective") self.changeObjective.emit(self.curr_objective) if (message.getType() == "Get Stage Position"): a_point = coord.Point(message.getResponse("stage_x"), message.getResponse("stage_y"), "um") self.getPositionComplete.emit(a_point) # # self.loadImage() will emit the captureComplete signal. # if (message.getType() == "Take Movie"): self.loadImage(self.directory + message.getData("name") + ".dax") if (len(self.messages) > 0): self.tcp_client.sendMessage(self.messages.pop(0)) else: self.waiting_for_response = False
def __init__(self, data, size, params): self.camera = params.get("acquisition.camera") self.data = data self.height = size[0] self.image_min = params.get(self.camera + ".scalemin") self.image_max = params.get(self.camera + ".scalemax") self.parameters = params self.parameters_file = params.get("parameters_file") self.width = size[1] location = params.get("acquisition.stage_position") self.x_um = location[0] self.y_um = location[1] # Calculate location in pixels. a_point = coord.Point(self.x_um, self.y_um, "um") self.x_pix = a_point.x_pix self.y_pix = a_point.y_pix
def movePosition(self, dx_um, dy_um): self.a_point = coord.Point(self.a_point.x_um + dx_um, self.a_point.y_um + dy_um, "um") self.setLocation(self.a_point)
def updateMosaicLabel(self, a_point): offset_point = coord.Point(a_point.x_um - self.current_offset.x_um, a_point.y_um - self.current_offset.y_um, "um") self.ui.mosaicLabel.setText("{0:.2f}, {1:.2f}".format( offset_point.x_um, offset_point.y_um))
def handleGoto(self, boolean): self.gotoPosition.emit( coord.Point(self.pointf.x(), self.pointf.y(), "pix"))
def __init__(self, parameters, parent=None): QtGui.QMainWindow.__init__(self, parent) # Coordinate system setup, the internal scale is 1 pixel is 100nm. coord.Point.pixels_to_um = 0.1 # variables self.current_center = coord.Point(0.0, 0.0, "um") self.current_offset = coord.Point(0.0, 0.0, "um") self.debug = parameters.debug self.file_filter = "\S+.dax" self.parameters = parameters self.picture_queue = [] self.regexp_str = "" self.requested_stage_pos = False self.stage_tracking_timer = QtCore.QTimer(self) self.taking_pictures = False self.snapshot_directory = self.parameters.directory self.spin_boxes = [] self.stage_tracking_timer.setInterval(500) # ui setup self.ui = steveUi.Ui_MainWindow() self.ui.setupUi(self) # hide some things that we don't currently use & resize group-box. self.ui.backgroundComboBox.hide() self.ui.backgroundLabel.hide() self.ui.moveAllSectionsCheckBox.hide() self.ui.showFeaturesCheckBox.hide() self.ui.thresholdLabel.hide() self.ui.thresholdSlider.hide() self.ui.sectionViewSettingsGroupBox.setMaximumHeight(50) self.setWindowIcon(QtGui.QIcon("steve.ico")) # handling file drops self.ui.centralwidget.__class__.dragEnterEvent = self.dragEnterEvent self.ui.centralwidget.__class__.dropEvent = self.dropEvent self.ui.centralwidget.setAcceptDrops(True) # Create a validator for scaleLineEdit. self.scale_validator = QtGui.QDoubleValidator(1.0e-6, 1.0e+6, 6, self.ui.scaleLineEdit) self.ui.scaleLineEdit.setValidator(self.scale_validator) # Initialize view. self.view = mosaicView.MosaicView(parameters, self.ui.mosaicFrame) layout = QtGui.QGridLayout(self.ui.mosaicFrame) layout.addWidget(self.view) self.ui.mosaicFrame.setLayout(layout) self.view.show() # Initialize positions list. self.positions = positions.Positions(parameters, self.view.getScene(), self.ui.positionsFrame) layout = QtGui.QGridLayout(self.ui.positionsFrame) layout.addWidget(self.positions) self.ui.positionsFrame.setLayout(layout) self.positions.show() # Initialize sections. self.sections = sections.Sections(parameters, self.view.getScene(), self.ui.sectionsDisplayFrame, self.ui.sectionsScrollArea, self.ui.sectionsTab) # Initialize communications. self.comm = capture.Capture(parameters) # signals self.ui.actionQuit.triggered.connect(self.quit) self.ui.actionAdjust_Contrast.triggered.connect( self.handleAdjustContrast) self.ui.actionDelete_Images.triggered.connect(self.handleDeleteImages) self.ui.actionLoad_Movie.triggered.connect(self.handleLoadMovie) self.ui.actionLoad_Mosaic.triggered.connect(self.handleLoadMosaic) self.ui.actionLoad_Positions.triggered.connect( self.handleLoadPositions) self.ui.actionSave_Mosaic.triggered.connect(self.handleSaveMosaic) self.ui.actionSave_Positions.triggered.connect( self.handleSavePositions) self.ui.actionSave_Snapshot.triggered.connect(self.handleSnapshot) self.ui.actionSet_Working_Directory.triggered.connect( self.handleSetWorkingDirectory) self.ui.foregroundOpacitySlider.valueChanged.connect( self.handleOpacityChange) self.ui.getStagePosButton.clicked.connect(self.handleGetStagePosButton) self.ui.imageGridButton.clicked.connect(self.handleImageGrid) self.ui.scaleLineEdit.textEdited.connect(self.handleScaleChange) self.ui.tabWidget.currentChanged.connect(self.handleTabChange) self.ui.trackStageCheckBox.stateChanged.connect(self.handleTrackStage) self.ui.xSpinBox.valueChanged.connect(self.handleGridChange) self.ui.ySpinBox.valueChanged.connect(self.handleGridChange) self.stage_tracking_timer.timeout.connect( self.handleStageTrackingTimer) self.view.addPosition.connect(self.addPositions) self.view.addSection.connect(self.addSection) self.view.getObjective.connect(self.handleGetObjective) self.view.gotoPosition.connect(self.gotoPosition) self.view.mouseMove.connect(self.updateMosaicLabel) self.view.scaleChange.connect(self.updateScaleLineEdit) self.view.takePictures.connect(self.takePictures) self.sections.addPositions.connect(self.addPositions) self.sections.takePictures.connect(self.takePictures) self.comm.captureComplete.connect(self.addImage) self.comm.changeObjective.connect(self.handleChangeObjective) self.comm.disconnected.connect(self.handleDisconnected) self.comm.getPositionComplete.connect(self.handleGetPositionComplete) self.comm.newObjectiveData.connect(self.handleNewObjectiveData) self.comm.otherComplete.connect(self.handleOtherComplete) self.ui.objectivesGroupBox.valueChanged.connect( self.handleMOValueChange) # Try and get settings from HAL. self.comm.commConnect() self.comm.getSettings()
def setCenter(self, a_point): x_um = a_point.x_um - self.current_offset.x_um y_um = a_point.y_um - self.current_offset.y_um self.current_center = coord.Point(x_um, y_um, "um")
def handlePos(self, boolean): self.addPosition.emit( [coord.Point(self.pointf.x(), self.pointf.y(), "pix")])
def handlePictures(self, positions): pic_list = [coord.Point(self.pointf.x(), self.pointf.y(), "pix")] pic_list.extend(positions) self.takePictures.emit(pic_list)
def handleChangeObjective(self, objective): self.ui.objectivesGroupBox.changeObjective(objective) [magnification, x_offset, y_offset] = self.ui.objectivesGroupBox.getData(objective) self.current_offset = coord.Point(x_offset, y_offset, "um")
def handleSec(self, boolean): self.addSection.emit( coord.Point(self.pointf.x(), self.pointf.y(), "pix"))
def mouseMoveEvent(self, event): pointf = self.mapToScene(event.pos()) self.mouseMove.emit(coord.Point(pointf.x(), pointf.y(), "pix"))
def currentLocation(self): return coord.Point(self.x_spin_box.value(), self.y_spin_box.value(), "um")
def __init__(self, parameters, parent=None): QtGui.QMainWindow.__init__(self, parent) # coordinate system setup coord.Point.pixels_to_um = parameters.pixels_to_um # variables self.current_center = coord.Point(0.0, 0.0, "um") self.current_magnification = 1.0 self.current_objective = False self.current_offset = coord.Point(0.0, 0.0, "um") self.debug = parameters.debug self.parameters = parameters self.picture_queue = [] self.taking_pictures = False # ui setup self.ui = steveUi.Ui_MainWindow() self.ui.setupUi(self) # hide some things that we don't currently use & resize group-box. self.ui.backgroundComboBox.hide() self.ui.backgroundLabel.hide() self.ui.moveAllSectionsCheckBox.hide() self.ui.showFeaturesCheckBox.hide() self.ui.thresholdLabel.hide() self.ui.thresholdSlider.hide() self.ui.sectionViewSettingsGroupBox.setMaximumHeight(50) self.setWindowIcon(QtGui.QIcon("steve.ico")) # Initialize objectives. objectives = [] for i in range(10): mag = "mag" + str(i) if hasattr(self.parameters, mag): data = getattr(self.parameters, mag) obj_name = data.split(",")[0] objectives.append(data) self.ui.magComboBox.addItem(obj_name, data) # Create labels and spin boxes for objective settings. self.spin_boxes = [] layout = QtGui.QGridLayout(self.ui.objectivesFrame) for i, label_text in enumerate( ["Objective", "Magnification", "X Offset", "Y Offset"]): text_item = QtGui.QLabel(label_text, self.ui.objectivesFrame) layout.addWidget(text_item, 0, i) # The first objective is assumed to be the 100x & is not adjustable. data = objectives[0].split(",") self.current_objective = data[0] for j, datum in enumerate(data): text_item = QtGui.QLabel(datum, self.ui.objectivesFrame) layout.addWidget(text_item, 1, j) # The other objectives are adjustable. for i, obj in enumerate(objectives[1:]): data = obj.split(",") text_item = QtGui.QLabel(data[0], self.ui.objectivesFrame) layout.addWidget(text_item, i + 2, 0) for j, btype in enumerate(["magnification", "xoffset", "yoffset"]): sbox = MagOffsetSpinBox(data[0], btype, float(data[j + 1])) layout.addWidget(sbox, i + 2, j + 1) sbox.moValueChange.connect(self.handleMOValueChange) self.spin_boxes.append(sbox) # Create a validator for scaleLineEdit. self.sce_validator = QtGui.QDoubleValidator(1.0e-6, 1.0e+6, 6, self.ui.scaleLineEdit) self.ui.scaleLineEdit.setValidator(self.sce_validator) # Initialize view. self.view = mosaicView.MosaicView(parameters, self.ui.mosaicFrame) layout = QtGui.QGridLayout(self.ui.mosaicFrame) layout.addWidget(self.view) self.ui.mosaicFrame.setLayout(layout) self.view.show() # Initialize positions list. self.positions = positions.Positions(parameters, self.view.getScene(), self.ui.positionsFrame) layout = QtGui.QGridLayout(self.ui.positionsFrame) layout.addWidget(self.positions) self.ui.positionsFrame.setLayout(layout) self.positions.show() # Initialize sections. self.sections = sections.Sections(parameters, self.view.getScene(), self.ui.sectionsDisplayFrame, self.ui.sectionsScrollArea, self.ui.sectionsTab) # Initialize communications. self.comm = capture.Capture(parameters) # signals self.ui.abortButton.clicked.connect(self.handleAbort) self.ui.actionQuit.triggered.connect(self.quit) self.ui.actionDelete_Images.triggered.connect(self.handleDeleteImages) self.ui.actionLoad_Dax.triggered.connect(self.handleLoadDax) self.ui.actionLoad_Mosaic.triggered.connect(self.handleLoadMosaic) self.ui.actionLoad_Positions.triggered.connect( self.handleLoadPositions) self.ui.actionSave_Mosaic.triggered.connect(self.handleSaveMosaic) self.ui.actionSave_Positions.triggered.connect( self.handleSavePositions) self.ui.actionSave_Snapshot.triggered.connect(self.handleSnapshot) self.ui.actionSet_Working_Directory.triggered.connect( self.handleSetWorkingDirectory) self.ui.foregroundOpacitySlider.valueChanged.connect( self.handleOpacityChange) self.ui.magComboBox.currentIndexChanged.connect( self.handleObjectiveChange) self.ui.scaleLineEdit.textEdited.connect(self.handleScaleChange) self.ui.tabWidget.currentChanged.connect(self.handleTabChange) self.ui.xSpinBox.valueChanged.connect(self.handleGridChange) self.ui.ySpinBox.valueChanged.connect(self.handleGridChange) self.view.addPosition.connect(self.addPositions) self.view.addSection.connect(self.addSection) self.view.gotoPosition.connect(self.gotoPosition) self.view.mouseMove.connect(self.updateMosaicLabel) self.view.scaleChange.connect(self.updateScaleLineEdit) self.view.takePictures.connect(self.takePictures) self.sections.addPositions.connect(self.addPositions) self.sections.takePictures.connect(self.takePictures) self.comm.captureComplete.connect(self.addImage) self.comm.disconnected.connect(self.handleDisconnected) self.comm.gotoComplete.connect(self.handleGotoComplete) self.handleObjectiveChange(0)