Beispiel #1
0
    def testEstiUkWithGainOfComCam(self):

        dataShare = DataShare()
        configDir = os.path.join(getModulePath(), "configData")
        dataShare.config(configDir, instName=InstName.COMCAM)

        optStateEstiData = OptStateEstiDataDecorator(dataShare)
        optStateEstiData.configOptStateEstiData()

        mixedData = OptCtrlDataDecorator(optStateEstiData)
        mixedData.configOptCtrlData(configFileName="optiPSSN_x00.ctrl")

        optStateEsti = OptStateEsti()
        optCtrl = OptCtrl()

        self.ztaac = ZTAAC(optStateEsti, optCtrl, mixedData)
        self.ztaac.config(filterType=FilterType.REF,
                          defaultGain=0.7,
                          fwhmThresholdInArcsec=0.2)

        self._setStateAndState0FromFile()

        gainToUse = 1
        self.ztaac.setGain(gainToUse)

        wfErr, sensorNameList = self._getWfErrAndSensorNameListFromComCamFile()
        uk = self.ztaac.estiUkWithGain(wfErr, sensorNameList)

        ansFilePath = os.path.join(getModulePath(), "tests", "testData",
                                   "comcam_pert_iter1.txt")
        ukAns = gainToUse * np.loadtxt(ansFilePath, usecols=1)

        delta = np.sum(np.abs(uk - ukAns))
        self.assertLess(delta, 0.0012)
    def setUp(self):

        dataShare = DataShare()
        configDir = os.path.join(getModulePath(), "configData")
        dataShare.config(configDir, instName=InstName.LSST)
        self.optCtrlData = OptCtrlDataDecorator(dataShare)
        self.optCtrlData.configOptCtrlData()
Beispiel #3
0
    def setUp(self):

        dataShare = DataShare()
        configDir = os.path.join(getModulePath(), "configData")
        dataShare.config(configDir, instName=InstName.LSST)

        optStateEstiData = OptStateEstiDataDecorator(dataShare)
        optStateEstiData.configOptStateEstiData()
        self.mixedData = OptCtrlDataDecorator(optStateEstiData)
        self.mixedData.configOptCtrlData(configFileName="optiPSSN_x00.ctrl")

        optStateEsti = OptStateEsti()
        wfsFilePath = os.path.join(getModulePath(), "tests", "testData",
                                   "lsst_wfs_error_iter0.z4c")
        sensorNameList = ["R44_S00", "R04_S20", "R00_S22", "R40_S02"]
        wfErr, fieldIdx = optStateEstiData.getWfAndFieldIdFromFile(
            wfsFilePath, sensorNameList)

        self.filterType = FilterType.REF
        self.optSt = optStateEsti.estiOptState(optStateEstiData,
                                               self.filterType, wfErr,
                                               fieldIdx)

        self.optCtrl = OptCtrl()

        state0InDof = self.mixedData.getState0FromFile()
        testState0InDof = np.ones(len(state0InDof))
        self.optCtrl.setState0(testState0InDof)
        self.optCtrl.initStateToState0()
Beispiel #4
0
    def setUp(self):

        dataShare = DataShare()
        configDir = os.path.join(getModulePath(), "configData")
        dataShare.config(configDir, instName=InstName.LSST)

        optStateEstiData = OptStateEstiDataDecorator(dataShare)
        optStateEstiData.configOptStateEstiData()

        mixedData = OptCtrlDataDecorator(optStateEstiData)
        mixedData.configOptCtrlData(configFileName="optiPSSN_x00.ctrl")

        optStateEsti = OptStateEsti()
        optCtrl = OptCtrl()

        self.ztaac = ZTAAC(optStateEsti, optCtrl, mixedData)
        self.ztaac.config(filterType=FilterType.REF,
                          defaultGain=0.7,
                          fwhmThresholdInArcsec=0.2)

        self.ztaac.setState0FromFile(state0InDofFileName="state0inDof.txt")
        self.ztaac.setStateToState0()

        self.camRot = CamRot()
        self.camRot.setRotAng(0)

        iterDataDir = os.path.join(getModulePath(), "tests", "testData",
                                   "iteration")
        self.iterDataReader = IterDataReader(iterDataDir)
    def testGetQwgtOfComcam(self):

        dataShare = DataShare()
        configDir = os.path.join(getModulePath(), "configData")
        dataShare.config(configDir, instName=InstName.COMCAM)
        optCtrlData = OptCtrlDataDecorator(dataShare)
        optCtrlData.configOptCtrlData()

        qWgt = optCtrlData.getQwgt()
        self.assertEqual(len(qWgt), 9)
        self.assertAlmostEqual(np.sum(qWgt), 1)
Beispiel #6
0
def setup():

    # Set up the object of data share class. This contains the
    # information of indexes of zk and degree of freedom (DOF)
    # to use.
    dataShare = DataShare()
    configDir = os.path.join(getModulePath(), "configData")
    dataShare.config(configDir, instName=InstName.LSST)

    # Decorate the DataShare object to get the data needed
    # for the OptStateEsti object.
    optStateEstiData = OptStateEstiDataDecorator(dataShare)
    optStateEstiData.configOptStateEstiData()

    # Decorate the DataShare object to get the data needed
    # for the OptCtrl object.
    mixedData = OptCtrlDataDecorator(optStateEstiData)
    mixedData.configOptCtrlData(configFileName="optiPSSN_x00.ctrl")

    # Instantiate the objects of OptStateEsti and OptCtrl classes.
    optStateEsti = OptStateEsti()
    optCtrl = OptCtrl()

    # Instantiate the ZTAAC object with the configured objects.
    ztaac = ZTAAC(optStateEsti, optCtrl, mixedData)

    # Do the configuration of ZTAAC object.
    ztaac.config(filterType=FilterType.REF,
                 defaultGain=0.7,
                 fwhmThresholdInArcsec=0.2)

    # Set the state 0 from file. This is only used in the simulation.
    # In the real control, the state 0 should come from the subsystem
    # by SAL (software abstracion layer). But the algorithm for this
    # needs to be developed.
    ztaac.setState0FromFile(state0InDofFileName="state0inDof.txt")

    # Initialize the state to state 0.
    ztaac.setStateToState0()

    # Instantiate the camera rotation object.
    camRot = CamRot()

    # Set up the rotation angle.
    # The angle is zero degree in the test data.
    camRot.setRotAng(0)

    # Read the test iteration data by the IM closed-loop simulation.
    iterDataDir = os.path.join(getModulePath(), "tests", "testData",
                               "iteration")
    iterDataReader = IterDataReader(iterDataDir)

    return ztaac, camRot, iterDataReader
Beispiel #7
0
    def setUp(self):

        dataShare = DataShare()
        configDir = os.path.join(getModulePath(), "configData")
        dataShare.config(configDir, instName=InstName.LSST)

        optStateEstiData = OptStateEstiDataDecorator(dataShare)
        optStateEstiData.configOptStateEstiData()

        mixedData = OptCtrlDataDecorator(optStateEstiData)
        mixedData.configOptCtrlData(configFileName="optiPSSN_x00.ctrl")

        optStateEsti = OptStateEsti()
        optCtrl = OptCtrl()

        self.ztaac = ZTAAC(optStateEsti, optCtrl, mixedData)
        self.ztaac.config(filterType=FilterType.REF,
                          defaultGain=0.7,
                          fwhmThresholdInArcsec=0.2)
Beispiel #8
0
    def _configZTAAC(self, instName):
        """Configurate the ZTAAC.

        ZTAAC: Zernike to actuator adjustment calculator.

        Parameters
        ----------
        instName : InstName
            Instrument name.

        Returns
        -------
        ZTAAC
            configurated ZTAAC object.
        """

        # Prepare the data object for the ZTAAC to use
        dataShare = DataShare()
        configDataPath = self._getConfigDataPath()
        dataShare.config(configDataPath, instName=instName)

        optStateEstiData = OptStateEstiDataDecorator(dataShare)
        optStateEstiData.configOptStateEstiData()

        mixedData = OptCtrlDataDecorator(optStateEstiData)
        mixedData.configOptCtrlData(configFileName="optiPSSN_x00.ctrl")

        # Instantiate the ZTAAC object with the configured objects.
        ztaac = ZTAAC(OptStateEsti(), OptCtrl(), mixedData)

        # Set the state 0 and state
        ztaac.setState0FromFile(state0InDofFileName="state0inDof.txt")
        ztaac.setStateToState0()

        # Configure the parameters
        ztaac.config(filterType=FilterType.REF,
                     defaultGain=self.DEFAULT_GAIN,
                     fwhmThresholdInArcsec=self.FWHM_THRESHOLD_IN_ARCSEC)

        return ztaac
Beispiel #9
0
class TestOptCtrlDefault(unittest.TestCase):
    """Test the OptCtrlDefault class."""

    def setUp(self):

        dataShare = DataShare()
        configDir = os.path.join(getModulePath(), "configData")
        dataShare.config(configDir, instName=InstName.LSST)
        self.optCtrlData = OptCtrlDataDecorator(dataShare)
        self.optCtrlData.configOptCtrlData()

        self.optCtrl = OptCtrlDefault()

    def testSetState0(self):

        state0 = [1, 2, 3, 4]
        self._assertDeltaState0IsZero(state0)

    def testSetState0WithEmptyInput(self):

        state0 = []
        self._assertDeltaState0IsZero(state0)

    def _assertDeltaState0IsZero(self, state0):

        self.optCtrl.setState0(state0)

        dofIdx = np.arange(len(state0))
        state0InOpCtrl = self.optCtrl.getState0(dofIdx)

        delta = np.sum(np.abs(state0InOpCtrl - np.array(state0)))
        self.assertEqual(delta, 0)

    def testSetState(self):

        state = [1, 2, 3, 4]
        self._assertDeltaStateIsZero(state)

    def testSetStateWithEmptyInput(self):

        state = []
        self._assertDeltaStateIsZero(state)

    def _assertDeltaStateIsZero(self, state):

        self.optCtrl.setState(state)

        dofIdx = np.arange(len(state))
        stateInOpCtrl = self.optCtrl.getState(dofIdx)

        delta = np.sum(np.abs(stateInOpCtrl - np.array(state)))
        self.assertEqual(delta, 0)

    def testInitStateToState0(self):

        state0 = [1, 2, 3, 4, 5]
        self.optCtrl.setState0(state0)
        self.optCtrl.initStateToState0()

        dofIdx = np.arange(len(state0))
        state0InOpCtrl = self.optCtrl.getState0(dofIdx)
        stateInOpCtrl = self.optCtrl.getState(dofIdx)

        delta = np.sum(np.abs(state0InOpCtrl - stateInOpCtrl))
        self.assertEqual(delta, 0)
        self.assertNotEqual(id(self.optCtrl.state0InDof),
                            id(self.optCtrl.stateInDof))

    def testGetNumOfState0(self):

        state0 = [1, 2, 3, 4, 5]
        self.optCtrl.setState0(state0)

        numOfState0 = self.optCtrl.getNumOfState0()
        self.assertEqual(numOfState0, len(state0))

    def testAggState(self):

        state0 = [1, 2, 3, 4, 5]
        self.optCtrl.setState0(state0)
        self.optCtrl.initStateToState0()

        calcDof = [1, 2, 3]
        dofIdx = [0, 2, 4]
        self.optCtrl.aggState(calcDof, dofIdx)

        ans = [2, 2, 5, 4, 8]
        stateInOpCtrl = self.optCtrl.getState(np.arange(len(state0)))
        delta = np.sum(np.abs(stateInOpCtrl - np.array(ans)))
        self.assertEqual(delta, 0)

    def testGetGroupDofWithInteralDof(self):

        state0 = [1, 2, 3, 4, 5]
        self.optCtrl.setState0(state0)

        state = [4, 1, 3, 2, 1]
        self.optCtrl.setState(state)

        startIdx = 1
        groupLeng = 2
        dof = self.optCtrl.getGroupDof(startIdx, groupLeng, inputDof=None)

        ans = [-1, 0]
        delta = np.sum(np.abs(dof - np.array(ans)))
        self.assertEqual(delta, 0)

    def testGetGroupDofWithInputDof(self):

        startIdx = 1
        groupLeng = 2
        inputDof = [4, 1, 3, 2, 1]
        dof = self.optCtrl.getGroupDof(startIdx, groupLeng, inputDof=inputDof)

        ans = [1, 3]
        delta = np.sum(np.abs(dof - np.array(ans)))
        self.assertEqual(delta, 0)

    def testSetAndGetGain(self):

        gain = 0.7
        self.optCtrl.setGain(gain)
        self.assertEqual(self.optCtrl.getGain(), gain)

    def testSetGainOutOfRange(self):

        gain = 1.9
        self.assertRaises(ValueError, self.optCtrl.setGain, gain)

    def testCalcEffGQFWHM(self):

        numOfFieldIdx = 31
        fieldIdx = np.arange(numOfFieldIdx)
        pssn = np.ones(numOfFieldIdx)*0.9

        fwhmGq = self.optCtrl.calcEffGQFWHM(self.optCtrlData, pssn, fieldIdx)
        self.assertEqual(fwhmGq, 0.2172)

    def testCalcEffGQFWHMwithPssnGreaterThanOne(self):

        numOfFieldIdx = 31
        fieldIdx = np.arange(numOfFieldIdx)
        pssn = np.ones(numOfFieldIdx)
        pssn[20] = 1.2

        self.assertRaises(ValueError, self.optCtrl.calcEffGQFWHM,
                          self.optCtrlData, pssn, fieldIdx)

    def testCalcEffGQFWHMwithPssnEqualsZero(self):

        numOfFieldIdx = 31
        fieldIdx = np.arange(numOfFieldIdx)
        pssn = np.ones(numOfFieldIdx)
        pssn[20] = 0

        self.assertRaises(ValueError, self.optCtrl.calcEffGQFWHM,
                          self.optCtrlData, pssn, fieldIdx)

    def testEstiUkWithGain(self):

        self.assertRaises(NotImplementedError,
                          self.optCtrl.estiUkWithGain,
                          None, None, None)

    def testEstiUkWithoutGain(self):

        self.assertRaises(NotImplementedError,
                          self.optCtrl.estiUkWithoutGain,
                          None, None, None)
class TestOptCtrlDataDecorator(unittest.TestCase):
    """Test the OptCtrlDataDecorator class."""
    def setUp(self):

        dataShare = DataShare()
        configDir = os.path.join(getModulePath(), "configData")
        dataShare.config(configDir, instName=InstName.LSST)
        self.optCtrlData = OptCtrlDataDecorator(dataShare)
        self.optCtrlData.configOptCtrlData()

    def testGetAuthority(self):

        authority = self.optCtrlData.getAuthority()
        self.assertEqual(len(authority), 50)
        self.assertAlmostEqual(authority[0], 1)
        self.assertAlmostEqual(authority[1], 0.880597015)
        self.assertAlmostEqual(authority[11], 45.96449329039931)
        self.assertAlmostEqual(authority[12], 103.4589756080062)
        self.assertAlmostEqual(authority[31], 45.96449329039931)
        self.assertAlmostEqual(authority[32], 103.4589756080062)

    def testGetQwgt(self):

        qWgt = self.optCtrlData.getQwgt()
        self.assertEqual(len(qWgt), 31)
        self.assertAlmostEqual(np.sum(qWgt), 1)
        self.assertAlmostEqual(qWgt[1], 0.01974265)

    def testGetQwgtOfComcam(self):

        dataShare = DataShare()
        configDir = os.path.join(getModulePath(), "configData")
        dataShare.config(configDir, instName=InstName.COMCAM)
        optCtrlData = OptCtrlDataDecorator(dataShare)
        optCtrlData.configOptCtrlData()

        qWgt = optCtrlData.getQwgt()
        self.assertEqual(len(qWgt), 9)
        self.assertAlmostEqual(np.sum(qWgt), 1)

    def testGetPssnAlpha(self):

        pssnAlpha = self.optCtrlData.getPssnAlpha()
        self.assertEqual(len(pssnAlpha), 19)
        self.assertEqual(pssnAlpha[0], 6.6906168e-03)

    def testGetNumOfFieldInQwgt(self):

        numOfField = self.optCtrlData.getNumOfFieldInQwgt()
        self.assertEqual(numOfField, 31)

    def testGetMotRng(self):

        motRng = self.optCtrlData.getMotRng()
        self.assertEqual(len(motRng), 50)
        self.assertEqual(motRng[0], 5900)

    def testGetState0FromFile(self):

        state0InDof = self.optCtrlData.getState0FromFile()
        self.assertEqual(len(state0InDof), 50)
        self.assertEqual(np.sum(state0InDof), 0)

    def testGetPenality(self):

        penality = self.optCtrlData.getPenality()
        self.assertEqual(penality["M1M3Act"], 5.9)
        self.assertEqual(penality["M2Act"], 5.9)
        self.assertEqual(penality["Motion"], 0.001)

    def testGetXref(self):

        xRef = self.optCtrlData.getXref()
        self.assertEqual(xRef, "x00")
Beispiel #11
0
class TestOptCtrl(unittest.TestCase):
    """Test the OptCtrl class."""
    def setUp(self):

        dataShare = DataShare()
        configDir = os.path.join(getModulePath(), "configData")
        dataShare.config(configDir, instName=InstName.LSST)

        optStateEstiData = OptStateEstiDataDecorator(dataShare)
        optStateEstiData.configOptStateEstiData()
        self.mixedData = OptCtrlDataDecorator(optStateEstiData)
        self.mixedData.configOptCtrlData(configFileName="optiPSSN_x00.ctrl")

        optStateEsti = OptStateEsti()
        wfsFilePath = os.path.join(getModulePath(), "tests", "testData",
                                   "lsst_wfs_error_iter0.z4c")
        sensorNameList = ["R44_S00", "R04_S20", "R00_S22", "R40_S02"]
        wfErr, fieldIdx = optStateEstiData.getWfAndFieldIdFromFile(
            wfsFilePath, sensorNameList)

        self.filterType = FilterType.REF
        self.optSt = optStateEsti.estiOptState(optStateEstiData,
                                               self.filterType, wfErr,
                                               fieldIdx)

        self.optCtrl = OptCtrl()

        state0InDof = self.mixedData.getState0FromFile()
        testState0InDof = np.ones(len(state0InDof))
        self.optCtrl.setState0(testState0InDof)
        self.optCtrl.initStateToState0()

    def testEstiUkWithoutGainWithX0(self):

        self.mixedData.xRef = "x0"
        uk = self.optCtrl.estiUkWithoutGain(self.mixedData, self.filterType,
                                            self.optSt)

        self.assertEqual(len(uk), len(self.mixedData.getDofIdx()))
        self.assertAlmostEqual(uk[0], -16.036665624673333)
        self.assertAlmostEqual(uk[1], -1.349544022857101)
        self.assertAlmostEqual(uk[2], 2.6511005518054187)

    def testEstiUkWithoutGainWith0(self):

        self.mixedData.xRef = "0"
        uk = self.optCtrl.estiUkWithoutGain(self.mixedData, self.filterType,
                                            self.optSt)

        self.assertEqual(len(uk), len(self.mixedData.getDofIdx()))
        self.assertAlmostEqual(uk[0], 69.00565727180765)
        self.assertAlmostEqual(uk[1], -6.579374120758578)
        self.assertAlmostEqual(uk[2], -39.21488331771004)

    def testEstiUkWithoutGainWithX00(self):

        self.mixedData.xRef = "x00"
        uk = self.optCtrl.estiUkWithoutGain(self.mixedData, self.filterType,
                                            self.optSt)

        self.assertEqual(len(uk), len(self.mixedData.getDofIdx()))
        self.assertAlmostEqual(uk[0], -16.036665624673333)
        self.assertAlmostEqual(uk[1], -1.349544022857101)
        self.assertAlmostEqual(uk[2], 2.6511005518054187)

    def testEstiUkWithoutGainAndXref(self):

        self.mixedData.xRef = None
        self.assertRaises(ValueError, self.optCtrl.estiUkWithoutGain,
                          self.mixedData, self.filterType, self.optSt)