def test_writingData(self, qtbot):
        cdw = CameraDataWidget()
        qtbot.addWidget(cdw)
        currentFps = 40
        dc = DataController(cdw)
        assert dc.cameraDataWidget.saveDataCheckBox.isChecked() is False
        assert dc.generalConfig.saveBufferData is False
        assert dc.filesCreated is False

        nonePsd = (None, None, None)

        dc.writeDataToFile(nonePsd, currentFps)
        assert dc.filesCreated is False

        qtbot.mouseClick(cdw.saveDataCheckBox, Qt.LeftButton)
        assert dc.generalConfig.saveBufferData is True

        dc.writeDataToFile(nonePsd, currentFps)
        assert dc.filesCreated is False

        # Setup buffer model
        dc.setBufferSize(4)
        dc.bufferModel.updateInformation(
            GenericFrameInformation(self.timestamp, 300.3, 400.2, 32042.42,
                                    145.422, 14.836, 70, None), (0, 0))
        dc.bufferModel.updateInformation(
            GenericFrameInformation(self.timestamp + self.deltaTime, 300.4,
                                    400.4, 32045.42, 146.422, 15.836, 70,
                                    None), (0, 0))
        dc.bufferModel.updateInformation(
            GenericFrameInformation(self.timestamp + self.deltaTime * 2, 300.2,
                                    400.5, 32040.42, 142.422, 12.836, 70,
                                    None), (0, 0))
        dc.bufferModel.updateInformation(
            GenericFrameInformation(self.timestamp + self.deltaTime * 3, 300.1,
                                    400.3, 32043.42, 143.422, 13.836, 70,
                                    None), (0, 0))
        assert dc.bufferModel.rollBuffer is True
        centroidOutputFile = 'smm_centroid_20181030_223015.h5'
        psdOutputFile = 'smm_psd_20181030_223015.h5'
        psdInfo = dc.bufferModel.getPsd(currentFps)
        dc.writeDataToFile(psdInfo, currentFps)
        assert dc.filesCreated is True
        assert dc.centroidFilename == centroidOutputFile
        assert dc.psdFilename == psdOutputFile
        assert os.path.exists(centroidOutputFile)
        assert os.path.exists(psdOutputFile)
        os.remove(centroidOutputFile)
        os.remove(psdOutputFile)
    def test_noTelemetryDirCleanup(self, qtbot):
        cdw = CameraDataWidget()
        qtbot.addWidget(cdw)
        saveTelemetryDir = os.path.join(os.path.abspath(os.path.curdir),
                                        'temp2')
        telemetryOutputDir = 'dsm_telemetry'
        fullSaveDir = os.path.join(saveTelemetryDir, telemetryOutputDir)
        dc = DataController(cdw)
        dc.telemetrySavePath = saveTelemetryDir
        dc.removeTelemetryDir = False

        # Setup buffer model
        dc.setBufferSize(4)
        dc.bufferModel.updateInformation(
            GenericFrameInformation(self.timestamp, 300.3, 400.2, 32042.42,
                                    145.422, 14.836, 70, None), (0, 0))
        dc.bufferModel.updateInformation(
            GenericFrameInformation(self.timestamp + self.deltaTime, 300.4,
                                    400.4, 32045.42, 146.422, 15.836, 70,
                                    None), (0, 0))
        dc.bufferModel.updateInformation(
            GenericFrameInformation(self.timestamp + self.deltaTime * 2, 300.2,
                                    400.5, 32040.42, 142.422, 12.836, 70,
                                    None), (0, 0))
        dc.bufferModel.updateInformation(
            GenericFrameInformation(self.timestamp + self.deltaTime * 3, 300.1,
                                    400.3, 32043.42, 143.422, 13.836, 70,
                                    None), (0, 0))

        telemetryFile = 'dsm_20181030_223015.dat'
        configFile = 'dsm_ui_config.yaml'
        roiInfo = dc.bufferModel.getInformation(self.roiFrameStatus.currentFps)
        dc.writeTelemetryFile(roiInfo, self.roiFrameStatus)
        assert os.path.exists(fullSaveDir) is True
        assert os.path.exists(os.path.join(fullSaveDir, telemetryFile)) is True
        assert os.path.exists(os.path.join(fullSaveDir, configFile)) is True
        dc.cleanTelemetry()
        assert os.path.exists(os.path.join(fullSaveDir,
                                           telemetryFile)) is False
        assert os.path.exists(os.path.join(fullSaveDir, configFile)) is False
        assert os.path.exists(fullSaveDir) is True
        assert dc.telemetrySetup is False
        os.removedirs(fullSaveDir)
 def test_getCentroidForUpdate(self, qtbot, mocker):
     cdw = CameraDataWidget()
     qtbot.addWidget(cdw)
     dc = DataController(cdw)
     truthInfo = GenericFrameInformation(self.timestamp, 300.3, 400.2,
                                         32042.42, 145.422, 15.532, 70,
                                         None)
     dc.fullFrameModel.calculateCentroid = mocker.Mock(
         return_value=truthInfo)
     info = dc.getCentroidForUpdate(self.frame)
     assert info.centerX == truthInfo.centerX
     assert info.centerY == truthInfo.centerY
    def getCentroidForUpdate(self, frame):
        """Calculate centroid from frame for offset update.

        Parameters
        ----------
        frame : numpy.array
            A frame from a camera CCD.

        Returns
        -------
        GenericInformation
            The instance containing the results of the calculations.
        """
        try:
            return self.fullFrameModel.calculateCentroid(frame)
        except FrameRejected:
            return GenericFrameInformation(self.timeHandler.getTime(), 300, 200, -1, -1, -1, -1, None)
    def test_updateRoiFrameData(self, qtbot, mocker):
        cdw = CameraDataWidget()
        qtbot.addWidget(cdw)
        dc = DataController(cdw)
        mockCameraDataWidgetReset = mocker.patch.object(cdw, 'reset')
        mockBufferModelUpdateInfo = mocker.patch.object(
            dc.bufferModel, 'updateInformation')
        dc.roiFrameModel.calculateCentroid = mocker.Mock(
            return_value=GenericFrameInformation(self.timestamp, 242.3, 286.2,
                                                 2519.534, 104.343, 11.963, 50,
                                                 1.532))

        dc.passFrame(self.frame, self.roiFrameStatus)
        assert mockCameraDataWidgetReset.call_count == 1
        assert mockBufferModelUpdateInfo.call_count == 1
        dc.passFrame(self.frame, self.roiFrameStatus)
        assert mockCameraDataWidgetReset.call_count == 1
        assert mockBufferModelUpdateInfo.call_count == 2
    def calculateCentroid(self, roiFrame):
        """This function performs calculations for the ROI CCD frame.

        Parameters
        ----------
        roiFrame : numpy.array
            A ROI CCD frame.

        Returns
        -------
        GenericInformation
            The instance containing the results of the calculations.

        Raises
        ------
        FrameRejected
            Raised if ROI frame does not pass flux threshold.
        """
        if self.frameCheck is None:
            self.frameCheck = passFrame

        newFrame = np.copy(roiFrame)
        newFrame = newFrame - self.thresholdFactor * newFrame.max()
        newFrame[newFrame < 0] = 0
        maxAdc = newFrame.max()
        flux = np.sum(newFrame)
        if self.frameCheck(flux):
            comY, comX = ndimage.center_of_mass(newFrame)
            objectSize = np.count_nonzero(newFrame)
            fwhm = fwhm_calculator(newFrame, int(comX), int(comY))
            # Get standard deviation of original image without object pixels
            # Removing this for speed improvement. MAR 2018/10/05
            # maxStd = np.std(np.ma.masked_array(roiFrame, mask=newFrame))
            maxStd = -999
            return GenericFrameInformation(self.timeHandler.getTime(), comX,
                                           comY, flux, maxAdc, fwhm,
                                           objectSize, maxStd)
        else:
            raise FrameRejected('ROI frame rejected due to low flux')
 def test_updateFullFrameData(self, qtbot, mocker):
     cdw = CameraDataWidget()
     qtbot.addWidget(cdw)
     dc = DataController(cdw)
     mockCameraDataWidgetReset = mocker.patch.object(cdw, 'reset')
     mockTakeScreenshot = mocker.patch.object(dc, 'writeScreenshot')
     mocker.patch(
         'spot_motion_monitor.views.camera_data_widget.CameraDataWidget.updateFullFrameData'
     )
     dc.fullFrameModel.calculateCentroid = mocker.Mock(
         return_value=GenericFrameInformation(self.timestamp, 300.3, 400.2,
                                              32042.42, 145.422, 17.525, 70,
                                              None))
     dc.takeScreenshot = True
     dc.passFrame(self.frame, self.fullFrameStatus)
     assert dc.cameraDataWidget.updateFullFrameData.call_count == 1
     assert mockCameraDataWidgetReset.call_count == 0
     assert mockTakeScreenshot.call_count == 1
     assert dc.roiResetDone is False
     dc.roiResetDone = True
     dc.passFrame(self.frame, self.fullFrameStatus)
     assert mockCameraDataWidgetReset.call_count == 1
     assert dc.roiResetDone is False
Esempio n. 8
0
    def calculateCentroid(self, fullFrame):
        """This function performs calculations for the full CCD frame.

        Parameters
        ----------
        fullFrame : numpy.array
            A full CCD frame.

        Returns
        -------
        GenericInformation
            The instance containing the results of the calculations.

        Raises
        ------
        FrameRejected
            Reject frames for different reasons. Messages tell why.
        """
        if self.frameCheck is None:
            self.frameCheck = passFrame

        # Background and noise threshold calculations
        frameStd = ndimage.standard_deviation(fullFrame)
        threshold = np.median(fullFrame) + self.sigmaScale * frameStd
        thresholdMask = fullFrame > threshold
        frameLabels, numLabels = ndimage.label(thresholdMask)

        # Sizes and mean values of all objects found
        labelSizes = ndimage.sum(thresholdMask, frameLabels, range(numLabels + 1))

        # Cleanup small objects
        maskSize = labelSizes < self.minimumNumPixels
        removePixel = maskSize[frameLabels]
        frameLabels[removePixel] = 0

        # Reassign labels
        labels = np.unique(frameLabels)
        frameLabels = np.searchsorted(labels, frameLabels)
        objects = ndimage.find_objects(frameLabels)

        try:
            objectSize = ndimage.sum(thresholdMask, frameLabels, 1)
            # Object slice coordinates refer to image origin
            ySlice, xSlice = objects[0]
            objectFrame = fullFrame[ySlice, xSlice] - threshold
            objectFrame[objectFrame < 0] = 0
            flux = objectFrame.sum()
            maxAdc = objectFrame.max()
            comY, comX = ndimage.center_of_mass(objectFrame)
            if self.frameCheck(flux, maxAdc, comX, comY):
                fwhm = fwhm_calculator(objectFrame, int(comX), int(comY))
                centerX = comX + xSlice.start
                centerY = comY + ySlice.start
                return GenericFrameInformation(self.timeHandler.getTime(), centerX, centerY,
                                               flux, maxAdc, fwhm, objectSize, None)
            else:
                msg = 'Full frame rejected: flux = {}, maxAdc = {}, centroid = ({}, {})'.format(flux,
                                                                                                maxAdc,
                                                                                                comX,
                                                                                                comY)
                raise FrameRejected(msg)
        except IndexError:
            raise FrameRejected("Failed to find object in frame.")