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
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.")