예제 #1
0
    def test_get_slew_delay(self):
        self.model.update_state(0)
        # Use old values, to avoid updating final states.
        self.model.params.rotator_followsky = True

        self.assertEqual(
            str(self.model.current_state),
            "t=0.0 ra=29.480 dec=-26.744 ang=180.000 "
            "filter=r track=False alt=86.500 az=0.000 pa=180.000 rot=0.000 "
            "telaz=0.000 telrot=0.000 "
            "mounted=['g', 'r', 'i', 'z', 'y'] unmounted=['u']",
        )
        # This slew will include a CL optics correction.
        target = Target()
        target.ra_rad = math.radians(60)
        target.dec_rad = math.radians(-20)
        target.ang_rad = math.radians(0)
        target.filter = "r"

        delay, status = self.model.get_slew_delay(target)
        self.assertAlmostEqual(delay, 85.507, delta=1e-3)

        self.model.slew(target)

        # This slew simply includes a filter change.
        target = Target()
        target.ra_rad = math.radians(60)
        target.dec_rad = math.radians(-20)
        target.ang_rad = math.radians(0)
        target.filter = "g"

        delay, status = self.model.get_slew_delay(target)
        self.assertAlmostEqual(delay, 120, delta=1e-3)

        # This slew does not include OL correction, but does involve dome
        # crawl.
        target = Target()
        target.ra_rad = math.radians(50)
        target.dec_rad = math.radians(-10)
        target.ang_rad = math.radians(10)
        target.filter = "r"

        delay, status = self.model.get_slew_delay(target)
        self.assertAlmostEqual(delay, 17.913, delta=1e-3)

        # This slew is only readout.
        self.model.slew(target)
        delay, status = self.model.get_slew_delay(target)
        self.assertAlmostEqual(delay, 2.0, delta=1e-3)

        # This slew involves rotator.
        target.ang_rad = math.radians(15)
        delay, status = self.model.get_slew_delay(target)
        self.assertAlmostEqual(delay, 4.472, delta=1e-3)
예제 #2
0
    def test_get_slew_delay_followsky_false(self):
        # Test slew time without followsky option. Similar to
        # test_get_slew_delay above.
        self.model.update_state(0)
        self.model.params.rotator_followsky = False
        expected_state = (
            "t=0.0 ra=29.480 dec=-26.744 ang=180.000 "
            "filter=r track=False alt=86.500 az=0.000 pa=180.000 rot=0.000 "
            "telaz=0.000 telrot=0.000 "
            "mounted=['g', 'r', 'i', 'z', 'y'] unmounted=['u']")
        self.assertEqual(str(self.model.current_state), expected_state)

        target = Target()
        target.ra_rad = math.radians(60)
        target.dec_rad = math.radians(-20)
        target.ang_rad = math.radians(0)
        target.filter = "r"

        delay, status = self.model.get_slew_delay(target)
        self.assertAlmostEqual(delay, 85.507, delta=1e-3)

        self.model.slew(target)

        target = Target()
        target.ra_rad = math.radians(60)
        target.dec_rad = math.radians(-20)
        target.ang_rad = math.radians(0)
        target.filter = "g"

        delay, status = self.model.get_slew_delay(target)
        self.assertAlmostEqual(delay, 120, delta=1e-3)

        target = Target()
        target.ra_rad = math.radians(50)
        target.dec_rad = math.radians(-10)
        target.ang_rad = math.radians(10)
        target.filter = "r"

        delay, status = self.model.get_slew_delay(target)
        self.assertAlmostEqual(delay, 17.913, delta=1e-3)

        self.model.slew(target)
        delay, status = self.model.get_slew_delay(target)
        self.assertAlmostEqual(delay, 2.0, delta=1e-3)

        # Here is the difference when using followsky = False
        target.ang_rad = math.radians(15)
        delay, status = self.model.get_slew_delay(target)
        self.assertAlmostEqual(delay, 2.0, delta=1e-3)
예제 #3
0
    def test_park(self):
        self.model.update_state(0)
        self.model.params.rotator_followsky = False
        self.model.params.rotator_resume_angle = False
        # Start at park, slew to target.
        # Use default configuration (dome crawl, CL updates, etc.)
        target = Target()
        target.ra_rad = math.radians(60)
        target.dec_rad = math.radians(-20)
        target.ang_rad = math.radians(0)
        target.filter = "z"

        self.model.slew(target)
        expected_state = "t=156.0 ra=60.000 dec=-20.000 ang=243.495 filter=z track=True " \
                         "alt=61.191 az=76.196 pa=243.224 rot=359.729 telaz=76.196 telrot=-0.271 " \
                         "mounted=['g', 'r', 'i', 'z', 'y'] unmounted=['u']"
        self.assertEqual(str(self.model.current_state), expected_state)
        self.check_delay_and_state(
            self.model,
            self.make_slewact_dict((8.387, 11.966, 0.0, 7.387, 36.0, 18.775,
                                    48.507, 1.0, 120.0, 2.0)),
            ['telopticsclosedloop', 'filter'], (-3.50, 7.00, 0.0, -1.75, 1.50))

        self.model.park()
        expected_state = "t=241.1 ra=30.487 dec=-26.744 ang=180.000 filter=z track=False " \
                         "alt=86.500 az=0.000 pa=180.000 rot=0.000 telaz=0.000 telrot=0.000 " \
                         "mounted=['g', 'r', 'i', 'z', 'y'] unmounted=['u']"
        self.assertEqual(str(self.model.current_state), expected_state)
        self.check_delay_and_state(
            self.model,
            self.make_slewact_dict(
                (8.231, 11.885, 1.041, 7.231, 36.0, 18.462, 48.130, 1.0, 0.0,
                 2.0)), ['telopticsclosedloop', 'domazsettle', 'domaz'],
            (3.50, -7.00, 0.520, 1.75, -1.50))
예제 #4
0
    def read_script(self):

        scriptfilepath = self.script_file
        lines = file(scriptfilepath).readlines()
        targetid = 0
        self.targetsList = []
        for line in lines:
            line = line.strip()
            if not line:			# skip blank line
                continue
            if line[0] == '#': 		# skip comment line
                continue
            targetid += 1
            values = line.split()
            target = Target()
            target.fieldid = eval(values[0])
            target.filter = values[1]
            target.ra_rad = math.radians(eval(values[2]))
            target.dec_rad = math.radians(eval(values[3]))
            target.ang_rad = math.radians(eval(values[4]))
            target.num_exp = eval(values[5])
            target.exp_times = [int(x) for x in values[6].split(',')]

            self.targetsList.append(target)
        self.log.info("%d targets" % len(self.targetsList))
예제 #5
0
    def test_slew(self):
        self.model.update_state(0)
        self.model.params.domaz_free_range = 0
        self.model.params.optics_cl_delay = [0, 20.0]
        self.model.params.rotator_followsky = True

        self.assertEqual(
            str(self.model.current_state),
            "t=0.0 ra=29.480 dec=-26.744 ang=180.000 "
            "filter=r track=False alt=86.500 az=0.000 pa=180.000 rot=0.000 "
            "telaz=0.000 telrot=0.000 "
            "mounted=['g', 'r', 'i', 'z', 'y'] unmounted=['u']",
        )

        target = Target()
        target.ra_rad = math.radians(60)
        target.dec_rad = math.radians(-20)
        target.ang_rad = math.radians(0)
        target.filter = "r"

        self.model.slew(target)
        self.assertEqual(
            str(self.model.current_state),
            "t=74.2 ra=60.000 dec=-20.000 ang=180.000 "
            "filter=r track=True alt=60.904 az=76.495 pa=243.368 rot=63.368 "
            "telaz=76.495 telrot=63.368 "
            "mounted=['g', 'r', 'i', 'z', 'y'] unmounted=['u']",
        )

        target = Target()
        target.ra_rad = math.radians(60)
        target.dec_rad = math.radians(-20)
        target.ang_rad = math.radians(0)
        target.filter = "i"

        self.model.slew(target)
        self.assertEqual(
            str(self.model.current_state),
            "t=194.2 ra=60.000 dec=-20.000 ang=180.000 "
            "filter=i track=True alt=61.324 az=76.056 pa=243.156 rot=63.156 "
            "telaz=76.056 telrot=63.156 "
            "mounted=['g', 'r', 'i', 'z', 'y'] unmounted=['u']",
        )
예제 #6
0
    def generate_target(self, fb_observation, tag='generate'):
        '''Takes an observation array given by the feature based scheduler and generate an appropriate OpSim target.

        :param fb_observation: numpy.array
        :return: Target
        '''

        # self.log.debug('%s: %s' % (tag, fb_observation))
        self.targetid += 1
        filtername = fb_observation['filter']
        propid = fb_observation['survey_id']

        target = Target()
        target.targetid = self.targetid
        target.fieldid = fb_observation['field_id']
        target.filter = str(filtername)
        target.num_exp = fb_observation['nexp']
        target.exp_times = [
            fb_observation['exptime'] / fb_observation['nexp']
        ] * fb_observation['nexp']
        target.ra_rad = fb_observation['RA']
        target.dec_rad = fb_observation['dec']
        target.ang_rad = fb_observation['rotSkyPos']
        target.propid = propid
        target.goal = 100
        target.visits = 0
        target.progress = 0.0
        target.groupid = 1
        target.groupix = 0
        target.propid_list = [propid]
        target.need_list = [target.need]
        target.bonus_list = [target.bonus]
        target.value_list = [target.value]
        target.propboost_list = [target.propboost]
        target.sequenceid_list = [target.sequenceid]
        target.subsequencename_list = [target.subsequencename]
        target.groupid_list = [target.groupid]
        target.groupix_list = [target.groupix]
        target.is_deep_drilling_list = [target.is_deep_drilling]
        target.is_dd_firstvisit_list = [target.is_dd_firstvisit]
        target.remaining_dd_visits_list = [target.remaining_dd_visits]
        target.dd_exposures_list = [target.dd_exposures]
        target.dd_filterchanges_list = [target.dd_filterchanges]
        target.dd_exptime_list = [target.dd_exptime]

        return target
예제 #7
0
    def test_domecrawl(self):
        self.model.update_state(0)
        self.assertEqual(
            str(self.model.current_state),
            "t=0.0 ra=29.480 dec=-26.744 ang=180.000 "
            "filter=r track=False alt=86.500 az=0.000 pa=180.000 rot=0.000 "
            "telaz=0.000 telrot=0.000 "
            "mounted=['g', 'r', 'i', 'z', 'y'] unmounted=['u']")

        target = Target()
        target.ra_rad = math.radians(35)
        target.dec_rad = math.radians(-27)
        target.ang_rad = math.radians(0)
        target.filter = "r"

        # Just test whether dome crawl is faster or not.
        # If we test the final slew state, this is including other aspects of slew model (such as CLoptics).
        self.model.params.domaz_free_range = 0
        delay_nocrawl = self.model.get_slew_delay(target)
        self.model.params.domaz_free_range = np.radians(4.0)
        delay_crawl = self.model.get_slew_delay(target)
        self.assertTrue(delay_crawl < delay_nocrawl)
예제 #8
0
    def test_slewdata(self):
        self.model.update_state(0)
        # Use old values, to avoid updating final states.
        self.model.params.domaz_free_range = 0
        self.model.params.optics_cl_delay = [0, 20.0]
        self.model.params.rotator_followsky = True

        target = Target()
        target.ra_rad = math.radians(60)
        target.dec_rad = math.radians(-20)
        target.ang_rad = math.radians(0)
        target.filter = "r"

        self.model.slew(target)
        self.assertEqual(
            str(self.model.current_state),
            "t=74.2 ra=60.000 dec=-20.000 ang=180.000 "
            "filter=r track=True alt=60.904 az=76.495 pa=243.368 rot=63.368 "
            "telaz=76.495 telrot=63.368 "
            "mounted=['g', 'r', 'i', 'z', 'y'] unmounted=['u']")
        self.check_delay_and_state(
            self.model,
            self.make_slewact_dict(
                (8.387, 11.966, 21.641, 7.387, 20.0, 18.775, 53.174, 1.0, 0.0,
                 2.0)), ['telopticsclosedloop', 'domazsettle', 'domaz'],
            (-3.50, 7.00, 3.50, -1.75, 1.50))

        target = Target()
        target.ra_rad = math.radians(60)
        target.dec_rad = math.radians(-20)
        target.ang_rad = math.radians(0)
        target.filter = "i"

        self.model.slew(target)
        self.assertEqual(
            str(self.model.current_state),
            "t=194.2 ra=60.000 dec=-20.000 ang=180.000 "
            "filter=i track=True alt=61.324 az=76.056 pa=243.156 rot=63.156 "
            "telaz=76.056 telrot=63.156 "
            "mounted=['g', 'r', 'i', 'z', 'y'] unmounted=['u']")
        self.check_delay_and_state(
            self.model,
            self.make_slewact_dict(
                (0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 120.0, 2.0)),
            ['filter'], (0, 0, 0, 0, 0))

        target = Target()
        target.ra_rad = math.radians(61)
        target.dec_rad = math.radians(-21)
        target.ang_rad = math.radians(1)
        target.filter = "i"

        self.model.slew(target)
        self.assertEqual(
            str(self.model.current_state),
            "t=199.0 ra=61.000 dec=-21.000 ang=181.000 "
            "filter=i track=True alt=60.931 az=78.751 pa=245.172 rot=64.172 "
            "telaz=78.751 telrot=64.172 "
            "mounted=['g', 'r', 'i', 'z', 'y'] unmounted=['u']")
        self.check_delay_and_state(
            self.model,
            self.make_slewact_dict((0.683, 1.244, 2.022, 0.117, 0.0, 1.365,
                                    3.801, 1.0, 0.000, 2.000)),
            ['domazsettle', 'domaz'], (-1.194, 4.354, 1.011, -0.598, 1.425))