diff --git a/SAS/TMSS/backend/services/scheduling/test/t_dynamic_scheduling.py b/SAS/TMSS/backend/services/scheduling/test/t_dynamic_scheduling.py index f8e2869a8dba9181d30cc682f8e9eaecebc23a9c..321d195c5d07befcb5a552e379868cf8aa098865 100755 --- a/SAS/TMSS/backend/services/scheduling/test/t_dynamic_scheduling.py +++ b/SAS/TMSS/backend/services/scheduling/test/t_dynamic_scheduling.py @@ -965,8 +965,8 @@ class TestSkyConstraints(unittest.TestCase): self.scheduling_unit_blueprint.scheduling_constraints_doc['sky'] = {'transit_offset': {'from': -7201, 'to': -7199}} self.scheduling_unit_blueprint.specifications_doc['tasks']['Observation']['specifications_doc']['antenna_set'] = 'LBA_INNER' self.scheduling_unit_blueprint.specifications_doc['tasks']['Observation']['specifications_doc']['SAPs'] = \ - [{'name': 'CygA', 'target': 'CygA', 'subbands': [0, 1], 'digital_pointing': {'angle1': 5.233660650313663, 'angle2': 0.7109404782526458, 'direction_type': 'J2000'}}, - {'name': 'CasA', 'target': 'CasA', 'subbands': [2, 3], 'digital_pointing': {'angle1': 6.233660650313663, 'angle2': 0.6109404782526458, 'direction_type': 'J2000'}}] + [{'name': 'CygA', 'subbands': [0, 1], 'digital_pointing': {'angle1': 5.233660650313663, 'angle2': 0.7109404782526458, 'direction_type': 'J2000', 'target': 'CygA', }}, + {'name': 'CasA', 'subbands': [2, 3], 'digital_pointing': {'angle1': 6.233660650313663, 'angle2': 0.6109404782526458, 'direction_type': 'J2000', 'target': 'CasA',}}] self.scheduling_unit_blueprint.save() timestamp = datetime(2020, 1, 1, 12, 0, 0) returned_value = tc1.can_run_anywhere_within_timewindow_with_sky_constraints(self.scheduling_unit_blueprint, timestamp, timestamp + timedelta(seconds=self.obs_duration)) diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/adapters/feedback.py b/SAS/TMSS/backend/src/tmss/tmssapp/adapters/feedback.py index 9fdbd7d3d8053a1d6a58ed36301103f9c5f112bb..1749437ca50a8b9e7ef50e5af55327793df3e29e 100644 --- a/SAS/TMSS/backend/src/tmss/tmssapp/adapters/feedback.py +++ b/SAS/TMSS/backend/src/tmss/tmssapp/adapters/feedback.py @@ -93,6 +93,7 @@ def observation_correlated_feedback_to_feedback_doc(dp_feedback: dict) -> dict: "direction_type": dp_feedback['Pointing.directionType'], "angle1": float(dp_feedback['Pointing.angle1']), "angle2": float(dp_feedback['Pointing.angle2']), + "target": "Unknown" # todo } }, "samples": { @@ -138,6 +139,7 @@ def observation_beamformed_feedback_to_feedback_doc(dp_feedback: dict) -> dict: "direction_type": dp_feedback[beam_prefix + 'Pointing.directionType'], "angle1": float(dp_feedback[beam_prefix + 'Pointing.angle1']), "angle2": float(dp_feedback[beam_prefix + 'Pointing.angle2']), + "target": "Unknown" # todo }, "coherent": not beam_prefix.startswith("IncoherentStokesBeam") }, @@ -246,6 +248,7 @@ def pulsar_pipeline_analysis_feedback_to_feedback_doc(input_dp_feedback_doc: dic "direction_type": "J2000", "angle1": float(dp_feedback[beam_prefix + 'Pointing.angle1']), "angle2": float(dp_feedback[beam_prefix + 'Pointing.angle2']), + "target": "Unknown" # todo } if beam_prefix == "CoherentStokesBeam." else input_dp_feedback_doc["target"]["pointing"], "coherent": beam_prefix != "IncoherentStokesBeam." }, diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/adapters/sip.py b/SAS/TMSS/backend/src/tmss/tmssapp/adapters/sip.py index f299db6d2fb0a7e8464777a3e71650281ee1bc30..fd30e6699297261f9de5a820c35333e998aa5d32 100644 --- a/SAS/TMSS/backend/src/tmss/tmssapp/adapters/sip.py +++ b/SAS/TMSS/backend/src/tmss/tmssapp/adapters/sip.py @@ -155,7 +155,7 @@ def create_sip_representation_for_subtask(subtask: Subtask): beamnumber=0, # TODO: where to get the beamnumber? identifier=get_siplib_identifier(sap.global_identifier, "SAP id=%s" % sap.id), measurementtype=sap.specifications_doc['measurement_type'].capitalize(), - targetname=sap.specifications_doc['target'], + targetname=sap.specifications_doc["pointing"]['target'], starttime=sap.specifications_doc['time']['start_time'], duration=isodate.duration_isoformat(datetime.timedelta(seconds=round(sap.specifications_doc['time']['duration']))), numberofprocessing=1, #TODO: check diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/subtasks.py b/SAS/TMSS/backend/src/tmss/tmssapp/subtasks.py index 68f849f77d160de4b52132961557dee6a82b7835..b2b5d89c6375985768b4e47b0cacb8bab685c72a 100644 --- a/SAS/TMSS/backend/src/tmss/tmssapp/subtasks.py +++ b/SAS/TMSS/backend/src/tmss/tmssapp/subtasks.py @@ -115,7 +115,8 @@ def _add_pointings(pointing_a, pointing_b): if pointing_a['direction_type'] != pointing_b['direction_type']: raise SubtaskCreationException( "Cannot add pointings because direction types differ pointing_a=%s; pointing_b=%s" % (pointing_a, pointing_b)) - pointing = {"direction_type": pointing_a['direction_type']} + target = pointing_a["target"] if pointing_a["target"] == pointing_b["target"] else "%s_+_%s" % (pointing_a["target"], pointing_b["target"]) + pointing = {"direction_type": pointing_a['direction_type'], "target": target} for angle in ['angle1', 'angle2']: pointing[angle] = pointing_a.get(angle, 0.0) + pointing_b.get(angle, 0.0) return pointing @@ -133,7 +134,7 @@ def _generate_tab_ring_pointings(pointing, tab_rings) -> [dict]: width=tab_rings['width'], center=(pointing['angle1'], pointing['angle2']), dirtype=pointing['direction_type']).coordinates() - relative_pointings = [{'angle1': angle1, 'angle2': angle2, 'direction_type': pointing['direction_type']} for angle1, angle2 in coordinates] + relative_pointings = [{'angle1': angle1, 'angle2': angle2, 'direction_type': pointing['direction_type'], 'target': pointing['target']} for angle1, angle2 in coordinates] # add ring coordinates to main pointing to get absolute TAB pointings and return them tab_pointings = [_add_pointings(pointing, relative_pointing) for relative_pointing in relative_pointings] @@ -434,17 +435,19 @@ def create_observation_subtask_specifications_from_observation_task_blueprint(ta for sap in target_task_spec.get("SAPs", []): subtask_spec['stations']['digital_pointings'].append( {"name": sap["name"], - "target": sap["target"], + "target": sap["digital_pointing"]["target"], "pointing": {"direction_type": sap["digital_pointing"]["direction_type"], "angle1": sap["digital_pointing"]["angle1"], - "angle2": sap["digital_pointing"]["angle2"]}, + "angle2": sap["digital_pointing"]["angle2"], + "target": sap["digital_pointing"]["target"]}, "subbands": sap["subbands"] }) if "tile_beam" in target_task_spec: subtask_spec['stations']['analog_pointing'] = { "direction_type": target_task_spec["tile_beam"]["direction_type"], "angle1": target_task_spec["tile_beam"]["angle1"], - "angle2": target_task_spec["tile_beam"]["angle2"] } + "angle2": target_task_spec["tile_beam"]["angle2"], + "target": target_task_spec["tile_beam"]["target"]} @@ -464,7 +467,8 @@ def create_observation_subtask_specifications_from_observation_task_blueprint(ta subtask_spec['stations']['analog_pointing'] = { "direction_type": target_task_spec["tile_beam"]["direction_type"], "angle1": target_task_spec["tile_beam"]["angle1"], - "angle2": target_task_spec["tile_beam"]["angle2"]} + "angle2": target_task_spec["tile_beam"]["angle2"], + "target": target_task_spec["tile_beam"]["target"]} else: raise SubtaskCreationException("Cannot determine the pointing specification from task_blueprint " "id=%s in auto-select mode, because the related target observation " @@ -473,7 +477,8 @@ def create_observation_subtask_specifications_from_observation_task_blueprint(ta else: subtask_spec['stations']['analog_pointing'] = {"direction_type": calibrator_task_spec["pointing"]["direction_type"], "angle1": calibrator_task_spec["pointing"]["angle1"], - "angle2": calibrator_task_spec["pointing"]["angle2"]} + "angle2": calibrator_task_spec["pointing"]["angle2"], + "target": calibrator_task_spec["pointing"]["target"]} # for the calibrator, the subbands are the union of the subbands of the targetobs subbands = [] diff --git a/SAS/TMSS/backend/test/t_adapter.py b/SAS/TMSS/backend/test/t_adapter.py index 0ed300bba2c8a7d87f4136881c6f9a6d4fb564a8..424f2676e5229b0489b7cdc641caba8ca05127c9 100755 --- a/SAS/TMSS/backend/test/t_adapter.py +++ b/SAS/TMSS/backend/test/t_adapter.py @@ -190,7 +190,7 @@ class ObservationParsetAdapterTest(unittest.TestCase): "tabs": [ { "coherent": True, - "pointing": { "angle1": 1.0, "angle2": 2.0 } + "pointing": { "angle1": 1.0, "angle2": 2.0, "target": "target1" } }, { "coherent": False @@ -263,7 +263,7 @@ class SIPadapterTest(unittest.TestCase): specifications_doc['stations']['filter'] = "HBA_210_250" feedback_template = models.DataproductFeedbackTemplate.objects.get(name='feedback') # feedback_doc = get_default_json_object_for_schema(feedback_template.schema) # todo <- fix the default generator, for some reason it does not produce valid json here... - feedback_doc = {'percentage_written': 100, 'frequency': {'subbands': [156], 'central_frequencies': [33593750.0], 'channel_width': 6103.515625, 'channels_per_subband': 32}, 'time': {'start_time': '2013-02-16T17:00:00', 'duration': 5.02732992172, 'sample_width': 2.00278016}, 'antennas': {'set': 'HBA_DUAL', 'fields': [{'type': 'HBA', 'field': 'HBA0', 'station': 'CS001'}, {'type': 'HBA', 'field': 'HBA1', 'station': 'CS001'}]}, 'target': {'pointing': {'angle1': 0, 'angle2': 0, 'direction_type': 'J2000'}}, 'samples': {'polarisations': ['XX', 'XY', 'YX', 'YY'], 'type': 'float', 'bits': 32, 'writer': 'standard', 'writer_version': '2.2.0', 'complex': True}, '$schema': 'http://127.0.0.1:8001/api/schemas/dataproductfeedbacktemplate/feedback/1#'} + feedback_doc = {'percentage_written': 100, 'frequency': {'subbands': [156], 'central_frequencies': [33593750.0], 'channel_width': 6103.515625, 'channels_per_subband': 32}, 'time': {'start_time': '2013-02-16T17:00:00', 'duration': 5.02732992172, 'sample_width': 2.00278016}, 'antennas': {'set': 'HBA_DUAL', 'fields': [{'type': 'HBA', 'field': 'HBA0', 'station': 'CS001'}, {'type': 'HBA', 'field': 'HBA1', 'station': 'CS001'}]}, 'target': {'pointing': {'angle1': 0, 'angle2': 0, 'direction_type': 'J2000', "target": "target1"}}, 'samples': {'polarisations': ['XX', 'XY', 'YX', 'YY'], 'type': 'float', 'bits': 32, 'writer': 'standard', 'writer_version': '2.2.0', 'complex': True}, '$schema': 'http://127.0.0.1:8001/api/schemas/dataproductfeedbacktemplate/feedback/1#'} for dp in specifications_doc['stations']['digital_pointings']: dp['subbands'] = list(range(8)) # Create SubTask(output) @@ -309,7 +309,7 @@ class SIPadapterTest(unittest.TestCase): specifications_doc['stations']['filter'] = "HBA_210_250" feedback_template = models.DataproductFeedbackTemplate.objects.get(name='feedback') # feedback_doc = get_default_json_object_for_schema(feedback_template.schema) # todo <- fix the default generator, for some reason it does not produce valid json here... - feedback_doc = {'percentage_written': 100, 'frequency': {'subbands': [156], 'central_frequencies': [33593750.0], 'channel_width': 6103.515625, 'channels_per_subband': 32}, 'time': {'start_time': '2013-02-16T17:00:00', 'duration': 5.02732992172, 'sample_width': 2.00278016}, 'antennas': {'set': 'HBA_DUAL', 'fields': [{'type': 'HBA', 'field': 'HBA0', 'station': 'CS001'}, {'type': 'HBA', 'field': 'HBA1', 'station': 'CS001'}]}, 'target': {'pointing': {'angle1': 0, 'angle2': 0, 'direction_type': 'J2000'}}, 'samples': {'polarisations': ['XX', 'XY', 'YX', 'YY'], 'type': 'float', 'bits': 32, 'writer': 'standard', 'writer_version': '2.2.0', 'complex': True}, '$schema': 'http://127.0.0.1:8001/api/schemas/dataproductfeedbacktemplate/feedback/1#'} + feedback_doc = {'percentage_written': 100, 'frequency': {'subbands': [156], 'central_frequencies': [33593750.0], 'channel_width': 6103.515625, 'channels_per_subband': 32}, 'time': {'start_time': '2013-02-16T17:00:00', 'duration': 5.02732992172, 'sample_width': 2.00278016}, 'antennas': {'set': 'HBA_DUAL', 'fields': [{'type': 'HBA', 'field': 'HBA0', 'station': 'CS001'}, {'type': 'HBA', 'field': 'HBA1', 'station': 'CS001'}]}, 'target': {'pointing': {'angle1': 0, 'angle2': 0, 'direction_type': 'J2000', "target": "target1"}}, 'samples': {'polarisations': ['XX', 'XY', 'YX', 'YY'], 'type': 'float', 'bits': 32, 'writer': 'standard', 'writer_version': '2.2.0', 'complex': True}, '$schema': 'http://127.0.0.1:8001/api/schemas/dataproductfeedbacktemplate/feedback/1#'} for dp in specifications_doc['stations']['digital_pointings']: dp['subbands'] = list(range(8)) # Create SubTask(output) @@ -377,7 +377,7 @@ class SIPadapterTest(unittest.TestCase): specifications_doc['stations']['filter'] = "HBA_110_190" feedback_template = models.DataproductFeedbackTemplate.objects.get(name='feedback') # feedback_doc = get_default_json_object_for_schema(feedback_template.schema) # todo <- fix the default generator, for some reason it does not produce valid json here... - feedback_doc = {'percentage_written': 100, 'frequency': {'subbands': [152], 'central_frequencies': [33593750.0], 'channel_width': 3051.7578125, 'channels_per_subband': 64}, 'time': {'start_time': '2013-02-16T17:00:00', 'duration': 5.02732992172, 'sample_width': 2.00278016}, 'antennas': {'set': 'HBA_DUAL', 'fields': [{'type': 'HBA', 'field': 'HBA0', 'station': 'CS001'}, {'type': 'HBA', 'field': 'HBA1', 'station': 'CS001'}]}, 'target': {'pointing': {'angle1': 0, 'angle2': 0, 'direction_type': 'J2000'}, 'coherent': True}, 'samples': {'polarisations': ['XX', 'XY', 'YX', 'YY'], 'type': 'float', 'bits': 32, 'writer': 'standard', 'writer_version': '2.2.0', 'complex': True}, 'files': ['stokes/SAP0/CS003HBA1/L773569_SAP000_B005_S0_P000_bf.h5', 'stokes/SAP0/RS106HBA/L773569_SAP000_B046_S0_P000_bf.h5'], '$schema': 'http://127.0.0.1:8001/api/schemas/dataproductfeedbacktemplate/feedback/1#'} + feedback_doc = {'percentage_written': 100, 'frequency': {'subbands': [152], 'central_frequencies': [33593750.0], 'channel_width': 3051.7578125, 'channels_per_subband': 64}, 'time': {'start_time': '2013-02-16T17:00:00', 'duration': 5.02732992172, 'sample_width': 2.00278016}, 'antennas': {'set': 'HBA_DUAL', 'fields': [{'type': 'HBA', 'field': 'HBA0', 'station': 'CS001'}, {'type': 'HBA', 'field': 'HBA1', 'station': 'CS001'}]}, 'target': {'pointing': {'angle1': 0, 'angle2': 0, 'direction_type': 'J2000', "target": "target1"}, 'coherent': True}, 'samples': {'polarisations': ['XX', 'XY', 'YX', 'YY'], 'type': 'float', 'bits': 32, 'writer': 'standard', 'writer_version': '2.2.0', 'complex': True}, 'files': ['stokes/SAP0/CS003HBA1/L773569_SAP000_B005_S0_P000_bf.h5', 'stokes/SAP0/RS106HBA/L773569_SAP000_B046_S0_P000_bf.h5'], '$schema': 'http://127.0.0.1:8001/api/schemas/dataproductfeedbacktemplate/feedback/1#'} for dp in specifications_doc['stations']['digital_pointings']: dp['subbands'] = list(range(8)) # Create SubTask(output) diff --git a/SAS/TMSS/backend/test/t_scheduling.py b/SAS/TMSS/backend/test/t_scheduling.py index 92da7f2e8d7ef6830cc83e6905c16381af9d2069..d377f3e2f4cc03bbfcb3dfbfd04ff7d2de9fccdf 100755 --- a/SAS/TMSS/backend/test/t_scheduling.py +++ b/SAS/TMSS/backend/test/t_scheduling.py @@ -734,7 +734,7 @@ class SAPTest(unittest.TestCase): spec['stations']['digital_pointings'][0]['name'] = task_blueprint_data['specifications_doc']['SAPs'][0]['name'] spec['stations']['digital_pointings'][0]['subbands'] = [0] cluster_url = client.get_path_as_json_object('/cluster/1')['url'] - pointing = {"angle1": 7.6, "angle2": 5.4, "direction_type": "J2000"} + pointing = {"angle1": 7.6, "angle2": 5.4, "direction_type": "J2000", "target": "target1"} spec['stations']['digital_pointings'][0]['pointing'] = pointing subtask_data = test_data_creator.Subtask(specifications_template_url=subtask_template['url'], diff --git a/SAS/TMSS/backend/test/t_subtasks.py b/SAS/TMSS/backend/test/t_subtasks.py index 53d98a77b916deb19018831a5d3295c2fdf7a645..db7476a7538d75c5c9cbe06f24679815582bfeaa 100755 --- a/SAS/TMSS/backend/test/t_subtasks.py +++ b/SAS/TMSS/backend/test/t_subtasks.py @@ -231,12 +231,14 @@ class SubTasksCreationFromTaskBluePrint(unittest.TestCase): def test_create_subtasks_from_task_blueprint_translates_SAP_names(self): task_blueprint = create_task_blueprint_object_for_testing('target observation') - task_blueprint.specifications_doc['SAPs'] = [{'name': 'target1', 'target': 'target1', 'subbands': [], + task_blueprint.specifications_doc['SAPs'] = [{'name': 'target1', 'subbands': [], 'digital_pointing': {'angle1': 0.1, 'angle2': 0.1, - 'direction_type': 'J2000'}}, - {'name': 'target2', 'target': 'target2', 'subbands': [], + 'direction_type': 'J2000', + 'target': 'target1'}}, + {'name': 'target2', 'subbands': [], 'digital_pointing': {'angle1': 0.2, 'angle2': 0.2, - 'direction_type': 'J2000'}}] + 'direction_type': 'J2000', + 'target': 'target2'}}] subtask = create_observation_control_subtask_from_task_blueprint(task_blueprint) i = 0 for sap in task_blueprint.specifications_doc['SAPs']: @@ -345,12 +347,14 @@ class SubTasksCreationFromTaskBluePrintCalibrator(unittest.TestCase): target_task_blueprint = create_task_blueprint_object_for_testing() create_scheduling_relation_task_blueprint_for_testing(cal_task_blueprint, target_task_blueprint, placement='parallel') - target_task_blueprint.specifications_doc['SAPs'] = [{'name': 'target1', 'target': '', 'subbands': list(range(0, 150)), + target_task_blueprint.specifications_doc['SAPs'] = [{'name': 'target1', 'subbands': list(range(0, 150)), 'digital_pointing': {'angle1': 0.1, 'angle2': 0.1, - 'direction_type': 'J2000'}}, - {'name': 'target2', 'target': '', 'subbands': list(range(150, 300)), + 'direction_type': 'J2000', + 'target': 'target1'}}, + {'name': 'target2', 'subbands': list(range(150, 300)), 'digital_pointing': {'angle1': 0.2, 'angle2': 0.2, - 'direction_type': 'J2000'}}] + 'direction_type': 'J2000', + 'target': 'target2'}}] target_task_blueprint.save() with self.assertRaises(SubtaskCreationException) as cm: @@ -547,24 +551,24 @@ class SettingTest(unittest.TestCase): class SubTaskCreationFromTaskBlueprintBeamformer(unittest.TestCase): - saps = [{"name": "target1", "target": "target1", "subbands": [349, 372], - "digital_pointing": {"angle1": 0.24, "angle2": 0.25, "direction_type": "J2000"}}, - {"name": "target2", "target": "target2", "subbands": [309, 302], - "digital_pointing": {"angle1": 0.42, "angle2": 0.52, "direction_type": "J2000"}} + saps = [{"name": "target1", "subbands": [349, 372], + "digital_pointing": {"angle1": 0.24, "angle2": 0.25, "direction_type": "J2000", "target": "target1"}}, + {"name": "target2", "subbands": [309, 302], + "digital_pointing": {"angle1": 0.42, "angle2": 0.52, "direction_type": "J2000", "target": "target2"}} ] beamformers = [{"name": "beamformer1", "coherent": {"settings": {"stokes": "I", "time_integration_factor": 8, "subbands_per_file": 244, "channels_per_subband": 8 }, "SAPs": [{"name": "target1", "tabs": [{"relative": True, - "pointing": {"direction_type": "J2000", "angle1": 0.1, "angle2": 0.1}}, - {"relative": False, "pointing": {"direction_type": "J2000", "angle1": 0.2, "angle2": 0.2}}], + "pointing": {"direction_type": "J2000", "angle1": 0.1, "angle2": 0.1, "target": "target1"}}, + {"relative": False, "pointing": {"direction_type": "J2000", "angle1": 0.2, "angle2": 0.2, "target": "target1"}}], "tab_rings": {"count": 8, "width": 0.02}, "subbands": {"method": "copy"}}, {"name": "target2", "tabs": [{"relative": True, - "pointing": {"direction_type": "J2000", "angle1": 0.1, "angle2": 0.1}}, - {"relative": False, "pointing": {"direction_type": "J2000", "angle1": 0.2, "angle2": 0.2}}], + "pointing": {"direction_type": "J2000", "angle1": 0.1, "angle2": 0.1, "target": "target2"}}, + {"relative": False, "pointing": {"direction_type": "J2000", "angle1": 0.2, "angle2": 0.2, "target": "target2"}}], "tab_rings": {"count": 7, "width": 0.03}, "subbands": {"list":[10,20,30], "method": "copy"} }]}, @@ -657,7 +661,7 @@ class SubTaskCreationFromTaskBlueprintBeamformer(unittest.TestCase): def test_generate_tab_ring_pointings_returns_correct_pointings(self): - pointing = {"angle1": 0.11, "angle2": 0.22, "direction_type": "J2000"} + pointing = {"angle1": 0.11, "angle2": 0.22, "direction_type": "J2000", "target": "target1"} tab_rings = {"width": 1, "count": 1} # assert center pointing is returned @@ -678,10 +682,10 @@ class SubTaskCreationFromTaskBlueprintBeamformer(unittest.TestCase): def test_add_pointings_adds_correctly(self): - pointing_a = {"angle1": 0.11, "angle2": 0.22, "direction_type": "J2000"} - pointing_b = {"angle1": 0.88, "angle2": 0.66, "direction_type": "J2000"} + pointing_a = {"angle1": 0.11, "angle2": 0.22, "direction_type": "J2000", "target": "target_a"} + pointing_b = {"angle1": 0.88, "angle2": 0.66, "direction_type": "J2000", "target": "target_b"} pointing_sum = _add_pointings(pointing_a, pointing_b) - self.assertEqual(pointing_sum, {"angle1": 0.99, "angle2": 0.88, "direction_type": "J2000"}) + self.assertEqual(pointing_sum, {"angle1": 0.99, "angle2": 0.88, "direction_type": "J2000", "target": "target_a_+_target_b"}) def test_filter_subbands_filters_correctly(self): subbands = [1,3,4,5,10,11,12,13,19,20]