コード例 #1
0
 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
コード例 #2
0
ファイル: positions.py プロジェクト: vaughangroup/scope1
 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"))
コード例 #3
0
 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)
コード例 #4
0
ファイル: steve.py プロジェクト: vaughangroup/scope1
    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()
コード例 #5
0
ファイル: steve.py プロジェクト: vaughangroup/scope1
 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
コード例 #6
0
ファイル: steve.py プロジェクト: vaughangroup/scope1
 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")
コード例 #7
0
ファイル: steve.py プロジェクト: ymsigal/storm-control
 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()
コード例 #8
0
ファイル: steve.py プロジェクト: ymsigal/storm-control
    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()
コード例 #9
0
ファイル: steve.py プロジェクト: ymsigal/storm-control
    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 = []
コード例 #10
0
ファイル: capture.py プロジェクト: ymsigal/storm-control
    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
コード例 #11
0
ファイル: capture.py プロジェクト: ymsigal/storm-control
    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
コード例 #12
0
ファイル: positions.py プロジェクト: vaughangroup/scope1
 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)
コード例 #13
0
ファイル: steve.py プロジェクト: ymsigal/storm-control
 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))
コード例 #14
0
ファイル: mosaicView.py プロジェクト: propupul/storm-control
 def handleGoto(self, boolean):
     self.gotoPosition.emit(
         coord.Point(self.pointf.x(), self.pointf.y(), "pix"))
コード例 #15
0
ファイル: steve.py プロジェクト: ymsigal/storm-control
    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()
コード例 #16
0
ファイル: steve.py プロジェクト: ymsigal/storm-control
 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")
コード例 #17
0
ファイル: mosaicView.py プロジェクト: propupul/storm-control
 def handlePos(self, boolean):
     self.addPosition.emit(
         [coord.Point(self.pointf.x(), self.pointf.y(), "pix")])
コード例 #18
0
ファイル: mosaicView.py プロジェクト: propupul/storm-control
 def handlePictures(self, positions):
     pic_list = [coord.Point(self.pointf.x(), self.pointf.y(), "pix")]
     pic_list.extend(positions)
     self.takePictures.emit(pic_list)
コード例 #19
0
ファイル: steve.py プロジェクト: ymsigal/storm-control
 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")
コード例 #20
0
ファイル: mosaicView.py プロジェクト: propupul/storm-control
 def handleSec(self, boolean):
     self.addSection.emit(
         coord.Point(self.pointf.x(), self.pointf.y(), "pix"))
コード例 #21
0
ファイル: mosaicView.py プロジェクト: propupul/storm-control
 def mouseMoveEvent(self, event):
     pointf = self.mapToScene(event.pos())
     self.mouseMove.emit(coord.Point(pointf.x(), pointf.y(), "pix"))
コード例 #22
0
 def currentLocation(self):
     return coord.Point(self.x_spin_box.value(), self.y_spin_box.value(),
                        "um")
コード例 #23
0
ファイル: steve.py プロジェクト: vaughangroup/scope1
    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)