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)
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)
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))
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))
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']", )
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
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)
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))
def start_night(self, timestamp, filters_mounted_tonight_list, night): Proposal.start_night(self, timestamp, filters_mounted_tonight_list, night) self.fieldsvisitedtonight = {} self.tonight_filters_list = [] self.tonight_targets = 0 self.tonight_targets_dict = {} for filter in filters_mounted_tonight_list: self.tonight_filters_list.append(filter) self.build_tonight_fields_list(timestamp, night) self.tonight_fields = len(self.tonight_fields_list) # compute at start night for field in self.tonight_fields_list: fieldid = field.fieldid # add new fields to fields dictionary if fieldid not in self.survey_fields_dict: self.survey_fields_dict[fieldid] = field.get_copy() self.survey_fields += 1 # add new fields to targets dictionary if fieldid not in self.survey_targets_dict: self.survey_targets_dict[fieldid] = {} self.tonight_targets_dict[fieldid] = {} for filter in filters_mounted_tonight_list: if filter in self.params.filter_list: if self.params.filter_goal_dict[filter] > 0: if filter not in self.survey_targets_dict[fieldid]: target = Target() target.fieldid = fieldid target.filter = filter target.num_exp = self.params.filter_num_exp_dict[ filter] target.exp_times = self.params.filter_exp_times_dict[ filter] target.ra_rad = field.ra_rad target.dec_rad = field.dec_rad target.propid = self.propid target.goal = self.params.filter_goal_dict[filter] target.visits = 0 target.progress = 0.0 target.groupid = 1 target.groupix = 1 self.survey_targets_dict[fieldid][filter] = target self.survey_targets += 1 self.survey_targets_goal += target.goal self.survey_filters_goal_dict[ filter] += target.goal target = self.survey_targets_dict[fieldid][filter] if target.progress < 1.0: self.tonight_targets_dict[fieldid][filter] = target self.tonight_targets += 1 for filter in self.params.filter_list: if self.survey_filters_goal_dict[filter] > 0: self.survey_filters_progress_dict[filter] = \ float(self.survey_filters_visits_dict[filter]) / self.survey_filters_goal_dict[filter] else: self.survey_filters_progress_dict[filter] = 0.0 if self.survey_targets_goal > 0: self.survey_targets_progress = float( self.survey_targets_visits) / self.survey_targets_goal else: self.survey_targets_progress = 0.0 self.log.debug("start_night tonight fields=%i targets=%i" % (self.tonight_fields, self.tonight_targets)) self.last_observation = None self.last_observation_was_for_this_proposal = False