def test_class_apply_defaults(override_file): ob = ObsBlueprint(position_axis=(1, 2), energy_axis=3, polarization_axis=4, time_axis=5) usc = { 'Plane.dataProductType': 'plane.dataProductType', 'Plane.provenance.producer': 'provenance.producer', 'Plane.provenance.project': 'provenance.project', 'Plane.metaRelease': 'plane.metaRelease', 'Plane.dataRelease': 'plane.dataRelease', 'Plane.calibrationLevel': 'plane.calibrationLevel', 'Observation.metaRelease': 'obs.metaRelease', 'Observation.intent': 'obs.intent', 'Observation.type': 'obs.type', 'Observation.proposal.pi': 'proposal.pi', 'Observation.proposal.project': 'proposal.project', 'Observation.proposal.title': 'proposal.title', 'Observation.sequenceNumber': 'obs.sequenceNumber', 'Observation.target.standard': 'target.standard', 'Artifact.productType': 'artifact.productType', 'Chunk.time.resolution': 'time.resolution', 'Chunk.time.exposure': 'time.exposure', 'Chunk.energy.resolvingPower': 'resolvingPower', 'Chunk.energy.bandpassName': 'filtername', 'Artifact.contentChecksum': 'artifact.contentChecksum' } convert = ConvertFromJava(ob, usc) test_overrides = load_config(override_file) for key, value in test_overrides.items(): try: # artifacts is a substructure to be dealt with separately, # WCSAXES should work .... ;) if key == 'artifacts' or key == 'WCSAXES': continue result = convert.get_caom2_elements(key) for r in result: ob._get(r) except ValueError: assert False, 'Could not find key {} in ObsBlueprint'.format(key)
def test_class_apply_defaults(override_file): ob = ObsBlueprint(position_axes=(1, 2), energy_axis=3, polarization_axis=4, time_axis=5) usc = {'Plane.dataProductType': 'plane.dataProductType', 'Plane.provenance.producer': 'provenance.producer', 'Plane.provenance.project': 'provenance.project', 'Plane.metaRelease': 'plane.metaRelease', 'Plane.dataRelease': 'plane.dataRelease', 'Plane.calibrationLevel': 'plane.calibrationLevel', 'Observation.metaRelease': 'obs.metaRelease', 'Observation.intent': 'obs.intent', 'Observation.type': 'obs.type', 'Observation.proposal.pi': 'proposal.pi', 'Observation.proposal.project': 'proposal.project', 'Observation.proposal.title': 'proposal.title', 'Observation.sequenceNumber': 'obs.sequenceNumber', 'Observation.target.standard': 'target.standard', 'Artifact.productType': 'artifact.productType', 'Chunk.time.resolution': 'time.resolution', 'Chunk.time.exposure': 'time.exposure', 'Chunk.energy.resolvingPower': 'resolvingPower', 'Chunk.energy.bandpassName': 'filtername', 'Artifact.contentChecksum': 'artifact.contentChecksum' } convert = ConvertFromJava(ob, usc) test_overrides = load_config(override_file) for key, value in test_overrides.items(): try: # artifacts is a substructure to be dealt with separately, # WCSAXES should work .... ;) if key == 'artifacts' or key == 'WCSAXES': continue result = convert.get_caom2_elements(key) for r in result: ob._get(r) except ValueError: assert False, 'Could not find key {} in ObsBlueprint'.format(key)
def test_chunk_naxis(): hdr1 = fits.Header() test_blueprint = ObsBlueprint() test_blueprint.configure_time_axis(3) test_uri = 'ad:CFHT/1709071g.fits.gz' test_defaults = {'CTYPE3': 'TIME'} test_config = {'Chunk.naxis': 'chunk.naxis'} test_overrides = {'chunk.naxis': '1'} update_blueprint(test_blueprint, test_uri, config=test_config, defaults=test_defaults, overrides=test_overrides) assert test_blueprint._get('Chunk.naxis') == '1', 'default value assigned' FitsParser([hdr1], test_blueprint) assert hdr1['NAXIS'] == 1 assert hdr1['ZNAXIS'] == 1
def visit(self): for uri, file_info in self._metadata_reader.file_info.items(): headers = self._metadata_reader.headers.get(uri) telescope_data = Telescope(uri, headers) blueprint = ObsBlueprint(instantiated_class=telescope_data) telescope_data.accumulate_bp(blueprint) if len(headers) == 0: parser = GenericParser(blueprint, uri) else: parser = FitsParser(headers, blueprint, uri) if self._dump_config: print(f'Blueprint for {uri}: {blueprint}') if self._observation is None: if blueprint._get('DerivedObservation.members') is None: self._logger.debug('Build a SimpleObservation') self._observation = SimpleObservation( collection=self._storage_name.collection, observation_id=self._storage_name.obs_id, algorithm=Algorithm('exposure'), ) else: self._logger.debug('Build a DerivedObservation') self._observation = DerivedObservation( collection=self._storage_name.collection, observation_id=self._storage_name.obs_id, algorithm=Algorithm('composite'), ) parser.augment_observation( observation=self._observation, artifact_uri=uri, product_id=self._storage_name.product_id, ) self._observation = telescope_data.update(self._observation, self._storage_name, file_info) return self._observation
def test_update_fits_headers(): # The rules for the values: # all upper case - a FITS keyword # has an '{' or an '}' - a FITS keyword with an index # # The rules for the keys: # has a '.' - a config keyword # all upper case - a FITS keyword hdr1 = fits.Header() hdr2 = fits.Header() hdr3 = fits.Header() hdr4 = fits.Header() hdr5 = fits.Header() hdr6 = fits.Header() hdr7 = fits.Header() test_blueprint = ObsBlueprint() test_blueprint.configure_time_axis(3) test_parser = FitsParser(src=[hdr1, hdr2, hdr3, hdr4, hdr5, hdr6, hdr7]) test_uri = 'ad:CFHT/1709071g.fits.gz' update_blueprint(test_blueprint, test_uri, config={}, defaults={}, overrides={}) assert test_parser.blueprint._get('Observation.type') == \ (['OBSTYPE'], None), 'unmodified blueprint' test_defaults = { 'CTYPE1': 'RA---TAN', 'CTYPE2': 'DEC--TAN', 'CTYPE3': 'TIME', 'CTYPE4': 'WAVE', 'CDELT4': '1.2', 'CRVAL4': '32' } update_blueprint(test_blueprint, test_uri, config={}, defaults=test_defaults, overrides={}) assert test_blueprint._get('Chunk.position.axis.axis1.ctype') == \ (['CTYPE1'], 'RA---TAN'), 'default value assigned' assert test_blueprint._get('Chunk.position.axis.axis2.ctype') == \ (['CTYPE2'], 'DEC--TAN'), 'default value assigned' assert test_blueprint._get('Chunk.time.axis.axis.ctype') == \ (['CTYPE3'], 'TIME'), 'default value assigned, value all upper case' # print(test_parser.blueprint) test_defaults = { 'CTYPE1': 'RA--TAN', 'CTYPE2': 'DEC--TAN', 'CTYPE3': 'TIME', 'plane.dataProductType': 'image', 'provenance.producer': 'CFHT', 'provenance.project': 'STANDARD PIPELINE' } test_config = load_config(java_config_file) test_overrides = load_config(override_file) update_blueprint(test_blueprint, test_uri, test_config, test_defaults, test_overrides) assert test_blueprint._get('Plane.dataProductType') == \ 'image', 'default value assigned to configuration' assert test_blueprint._get('Plane.provenance.producer') == \ (['ORIGIN'], 'CFHT'), \ 'default value assigned to configuration, all upper-case' assert test_blueprint._get('Plane.provenance.project') == \ (['ADC_ARCH'], 'STANDARD PIPELINE'), \ 'default value assigned to configuration, with white-space' assert test_blueprint._get('Observation.type') == 'OBJECT', \ 'default value over-ridden, value all upper case' assert test_blueprint._get( 'Chunk.position.axis.function.refCoord.coord1.val', 0) == '210.551666667', 'override HDU 0' assert test_blueprint._get( 'Chunk.position.axis.function.refCoord.coord1.val', 1) == \ '210.551666667', 'override HDU 1' assert test_blueprint._get( 'Chunk.position.axis.function.refCoord.coord1.val', 2) == '210.508333333', 'override HDU 2' assert test_blueprint._get( 'Chunk.position.axis.function.refCoord.coord1.val', 3) == '210.898333333', 'override HDU 3' assert test_blueprint._get( 'Chunk.position.axis.function.refCoord.coord1.val', 4) == '210.942083333', 'override HDU 4' assert test_blueprint._get( 'Chunk.position.axis.function.refCoord.coord1.val', 5) == '0.000000000', 'override HDU 5' test_parser.blueprint = test_blueprint assert test_parser._headers[0]['CRVAL1'] == 210.551666667, 'override HDU 0' assert test_parser._headers[1]['CRVAL1'] == 210.551666667, 'override HDU 1' assert test_parser._headers[2]['CRVAL1'] == 210.508333333, 'override HDU 2' assert test_parser._headers[3]['CRVAL1'] == 210.898333333, 'override HDU 3' assert test_parser._headers[4]['CRVAL1'] == 210.942083333, 'override HDU 4' assert test_parser._headers[5]['CRVAL1'] == 0.000000000, 'override HDU 5' assert test_parser._headers[0][ 'CRVAL3'] == 56789.429806900000, 'override HDU 0' # this will fail because of CompositeObservation.members errors assert len(test_parser._errors) == 0, test_parser._errors
def test_obs_blueprint(): # test the CAOM2_ELEMENTS property assert ObsBlueprint.CAOM2_ELEMENTS == ObsBlueprint._CAOM2_ELEMENTS # updating the CAOM2_ELEMENTS property should not update the original elems = ObsBlueprint.CAOM2_ELEMENTS elems = elems[2:] assert elems != ObsBlueprint.CAOM2_ELEMENTS # default config (one entry per row...) assert str(ObsBlueprint()).count('\n') == 24 print(ObsBlueprint()) # default config with WCS info assert str( ObsBlueprint(position_axes=(1, 2), energy_axis=3, polarization_axis=4, time_axis=5, obs_axis=6, custom_axis=7)).count('\n') == 90 ob = ObsBlueprint() ob.configure_position_axes(axes=(1, 2)) ob.configure_energy_axis(axis=3) ob.configure_polarization_axis(axis=4) ob.configure_time_axis(axis=5) ob.configure_observable_axis(axis=6) ob.configure_custom_axis(axis=7) # test that configuring something that's already configured doesn't break # anything ob.configure_position_axes(axes=(1, 2)) ob.configure_energy_axis(axis=3) ob.configure_polarization_axis(axis=4) ob.configure_time_axis(axis=5) ob.configure_observable_axis(axis=6) ob.configure_custom_axis(axis=7) # set attribute ob.set('Observation.instrument.name', 'NIRI') assert ob._plan['Observation.instrument.name'] == 'NIRI' assert 'Observation.instrument.name = NIRI' in str(ob) # set default ob.clear('Observation.instrument.keywords') ob.add_fits_attribute('Observation.instrument.keywords', 'INSTMODE') assert "Observation.instrument.keywords = ['INSTMODE'], default = None" \ in str(ob) ob.set_default('Observation.instrument.keywords', 'TEST') assert ob._plan['Observation.instrument.keywords'][1] == 'TEST' assert ob._plan['Observation.instrument.keywords'][0] == ['INSTMODE'] assert "Observation.instrument.keywords = ['INSTMODE'], default = TEST" \ in str(ob) # set fits attribute ob.add_fits_attribute('Observation.proposal.id', 'PROP') ob.add_fits_attribute('Observation.proposal.id', 'PROP2') ob.set_default('Observation.proposal.id', 'NOPROP') assert ob._plan['Observation.proposal.id'][0] == ['PROP2', 'PROP', 'RUNID'] assert ob._plan['Observation.proposal.id'][1] == 'NOPROP' if sys.version.startswith('2.7.'): assert ("Observation.proposal.id = ['PROP2', 'PROP', u'RUNID'], " "default = NOPROP") in str(ob) else: assert ("Observation.proposal.id = ['PROP2', 'PROP', 'RUNID'], " "default = NOPROP") in str(ob) # set in extension ob.set('Chunk.energy.velang', 33, extension=1) extension1_str = str(ob)[str(ob).index('extension 1'):] assert 'Chunk.energy.velang = 33' in extension1_str # set fits attribute in extension ob.add_fits_attribute('Chunk.energy.axis.axis.ctype', 'MYCTYPE', extension=1) ob.add_fits_attribute('Chunk.energy.axis.axis.ctype', 'MYCTYPE2', extension=1) ob.set_default('Chunk.energy.axis.axis.ctype', 'NOCTYPE', extension=1) extension1_str = str(ob)[str(ob).index('extension 1'):] assert ("Chunk.energy.axis.axis.ctype = ['MYCTYPE2', 'MYCTYPE'], " "default = NOCTYPE") in extension1_str # set in a different extension ob.set('Chunk.energy.velang', 44, extension=2) extension2_str = str(ob)[str(ob).index('extension 2'):] assert 'Chunk.energy.velang = 44' in extension2_str # test get assert ob._get('Observation.instrument.name') == 'NIRI' assert ob._get('Observation.instrument.keywords')[0] == ['INSTMODE'] assert ob._get('Observation.instrument.keywords')[1] == 'TEST' assert ob._get('Chunk.energy.velang', extension=2) == 44 assert ob._get('Chunk.energy.velang', extension=1) == 33 assert ob._get('Chunk.energy.axis.axis.ctype', extension=1)[0] ==\ ['MYCTYPE2', 'MYCTYPE'] assert ob._get('Chunk.energy.axis.axis.ctype', extension=1)[1] == 'NOCTYPE' # test get when keyword not present in extension and the default is used assert ob._get('Chunk.energy.specsys', extension=33)[0] == ['SPECSYS'] assert ob._get('Chunk.energy.specsys', extension=44)[1] is None # get element not set assert 'Observation.target.redshift' not in ob._plan assert ob._get('Observation.target.redshift') is None # bintable :) ob.add_table_attribute('CompositeObservation.members', 'FICS', extension=0) result = ob._get('CompositeObservation.members', extension=0) assert result is not None assert len(result) == 3, len(result) # delete attributes assert len(ob._plan) != 0 assert len(ob._extensions) != 0 for i in ObsBlueprint.CAOM2_ELEMENTS: ob.delete(i) assert len(ob._plan) == 0 # clear ob.clear('Chunk.energy.axis.axis.ctype', extension=1) # delete attributes from extensions ob.delete('Chunk.energy.velang', extension=1) ob.delete('Chunk.energy.axis.axis.ctype', extension=1) ob.delete('CompositeObservation.members', extension=0) ob.delete('Chunk.energy.velang', extension=2) assert len(ob._extensions) == 0 # set defaults in extension ob.set_default('Chunk.energy.axis.axis.ctype', 'NOCTYPE', extension=3) extension3_str = str(ob)[str(ob).index('extension 3'):] assert "Chunk.energy.axis.axis.ctype = NOCTYPE" in extension3_str assert len(ob._extensions) == 1 # testing error cases ob = ObsBlueprint() ob.configure_position_axes(axes=(1, 2)) ob.configure_energy_axis(axis=3) ob.configure_polarization_axis(axis=4) ob.configure_time_axis(axis=5) # non CAOM2 element name with pytest.raises(KeyError): ob.set('Nonexistent', 33) with pytest.raises(KeyError): ob.add_fits_attribute('Nonexistent', 33) with pytest.raises(KeyError): ob.set_default('Nonexistent', 33) with pytest.raises(KeyError): ob._get('Nonexistent') with pytest.raises(KeyError): ob.delete('Nonexistent') with pytest.raises(KeyError): ob.clear('Nonexistent') # repeat with extension specified with pytest.raises(KeyError): ob.set('Chunk.Nonexistent', 33, extension=1) with pytest.raises(KeyError): ob.add_fits_attribute('Chunk.Nonexistent', 33, extension=1) with pytest.raises(KeyError): ob.set_default('Chunk.Nonexistent', 33, extension=1) with pytest.raises(KeyError): ob._get('Nonexistent', extension=33) with pytest.raises(KeyError): ob.delete('Chunk.Nonexistent', extension=1) with pytest.raises(KeyError): ob.clear('Chunk.Nonexistent', extension=1) # CAOM2 element not Chunk with extension specified with pytest.raises(ValueError): ob.set('Observation.observationID', 33, extension=1) with pytest.raises(ValueError): ob.set_default('Observation.observationID', 33, extension=1) with pytest.raises(ValueError): ob.add_fits_attribute('Observation.observationID', 'AA', extension=1) with pytest.raises(ValueError): ob.delete('Observation.observationID', extension=1) with pytest.raises(ValueError): ob.clear('Observation.observationID', extension=1) # CAOM2 element Chunk with extension with pytest.raises(ValueError): ob.clear('Chunk.energy.axis.axis.cunit', extension=33) # add FITS attribute to element that does not exist assert 'Chunk.energy.transition' not in ob._plan ob.set('Chunk.energy.transition', 'Name') with pytest.raises(AttributeError): ob.add_fits_attribute('Chunk.energy.transition', 'BP') # call set_fits_attribute with argument other than list with pytest.raises(AttributeError): ob.add_fits_attribute('Chunk.energy.transition', 33) # delete element from a non-existent extension with pytest.raises(ValueError): ob.delete('Chunk.energy.transition', extension=66) # adding the same thing twice does nothing - the test values are defaults result = ob._get('Observation.metaRelease') initial_result_length = (len(result[0])) ob.add_fits_attribute('Observation.metaRelease', 'DATE-OBS') result = ob._get('Observation.metaRelease') add_result_length = (len(result[0])) assert initial_result_length == add_result_length # in an extension result = ob._get('Chunk.energy.specsys', extension=1) initial_result_length = (len(result[0])) ob.add_fits_attribute('Chunk.energy.specsys', 'SPECSYS') result = ob._get('Chunk.energy.specsys', extension=1) add_result_length = (len(result[0])) assert initial_result_length == add_result_length, result
def test_obs_blueprint(): # test the CAOM2_ELEMENTS property assert ObsBlueprint.CAOM2_ELEMENTS == ObsBlueprint._CAOM2_ELEMENTS # updating the CAOM2_ELEMENTS property should not update the original elems = ObsBlueprint.CAOM2_ELEMENTS elems = elems[2:] assert elems != ObsBlueprint.CAOM2_ELEMENTS # default config (one entry per row...) assert str(ObsBlueprint()).count('\n') == 20 print(ObsBlueprint()) # default config with WCS info assert str( ObsBlueprint(position_axis=(1, 2), energy_axis=3, polarization_axis=4, time_axis=5)).count('\n') == 77 ob = ObsBlueprint() ob.configure_position_axes(axes=(1, 2)) ob.configure_energy_axis(axis=3) ob.configure_polarization_axis(axis=4) ob.configure_time_axis(axis=5) # set attribute ob.set('Observation.instrument.name', 'NIRI') assert ob._plan['Observation.instrument.name'] == 'NIRI' assert 'Observation.instrument.name = NIRI' in str(ob) # set default ob.set_fits_attribute('Observation.instrument.keywords', [str('INSTMODE')]) assert "Observation.instrument.keywords = ['INSTMODE'], default = None" \ in str(ob) ob.set_default('Observation.instrument.keywords', 'TEST') assert ob._plan['Observation.instrument.keywords'][1] == 'TEST' assert ob._plan['Observation.instrument.keywords'][0] == ['INSTMODE'] assert "Observation.instrument.keywords = ['INSTMODE'], default = TEST" \ in str(ob) # set fits attribute ob.set_fits_attribute('Observation.proposal.id', [str('PROP')]) ob.add_fits_attribute('Observation.proposal.id', str('PROP2')) ob.set_default('Observation.proposal.id', 'NOPROP') assert ob._plan['Observation.proposal.id'][0] == ['PROP2', 'PROP'] assert ob._plan['Observation.proposal.id'][1] == 'NOPROP' assert ("Observation.proposal.id = ['PROP2', 'PROP'], " "default = NOPROP") in str(ob) # set in extension ob.set('Chunk.energy.velang', 33, extension=1) extension1_str = str(ob)[str(ob).index('extension 1'):] assert 'Chunk.energy.velang = 33' in extension1_str # set fits attribute in extension ob.set_fits_attribute('Chunk.energy.axis.axis.ctype', [str('MYCTYPE')], extension=1) ob.add_fits_attribute('Chunk.energy.axis.axis.ctype', str('MYCTYPE2'), extension=1) ob.set_default('Chunk.energy.axis.axis.ctype', 'NOCTYPE', extension=1) extension1_str = str(ob)[str(ob).index('extension 1'):] assert ("Chunk.energy.axis.axis.ctype = ['MYCTYPE2', 'MYCTYPE'], " "default = NOCTYPE") in extension1_str # set in a different extension ob.set('Chunk.energy.velang', 44, extension=2) extension2_str = str(ob)[str(ob).index('extension 2'):] assert 'Chunk.energy.velang = 44' in extension2_str # test get assert ob._get('Observation.instrument.name') == 'NIRI' assert ob._get('Observation.instrument.keywords')[0] == ['INSTMODE'] assert ob._get('Observation.instrument.keywords')[1] == 'TEST' assert ob._get('Chunk.energy.velang', extension=2) == 44 assert ob._get('Chunk.energy.velang', extension=1) == 33 assert ob._get('Chunk.energy.axis.axis.ctype', extension=1)[0] ==\ ['MYCTYPE2', 'MYCTYPE'] assert ob._get('Chunk.energy.axis.axis.ctype', extension=1)[1] == 'NOCTYPE' # test get when keyword not present in extension and the default is used assert ob._get('Chunk.energy.specsys', extension=33)[0] == ['SPECSYS'] assert ob._get('Chunk.energy.specsys', extension=44)[1] is None # get element not set assert 'Observation.target.redshift' not in ob._plan assert ob._get('Observation.target.redshift') is None # delete attributes assert len(ob._plan) != 0 assert len(ob._extensions) != 0 for i in ObsBlueprint.CAOM2_ELEMENTS: ob.delete(i) assert len(ob._plan) == 0 # delete attributes from extensions ob.delete('Chunk.energy.velang', extension=1) ob.delete('Chunk.energy.axis.axis.ctype', extension=1) ob.delete('Chunk.energy.velang', extension=2) assert len(ob._extensions) == 0 # testing error cases ob = ObsBlueprint() ob.configure_position_axes(axes=(1, 2)) ob.configure_energy_axis(axis=3) ob.configure_polarization_axis(axis=4) ob.configure_time_axis(axis=5) # non CAOM2 element name with pytest.raises(KeyError): ob.set('Nonexistent', 33) with pytest.raises(KeyError): ob.set_fits_attribute('Nonexistent', 33) with pytest.raises(KeyError): ob.add_fits_attribute('Nonexistent', 33) with pytest.raises(KeyError): ob.set_default('Nonexistent', 33) with pytest.raises(KeyError): ob._get('Nonexistent') with pytest.raises(KeyError): ob.delete('Nonexistent') # repeat with extension specified with pytest.raises(KeyError): ob.set('Chunk.Nonexistent', 33, extension=1) with pytest.raises(KeyError): ob.set_fits_attribute('Chunk.Nonexistent', 33, extension=1) with pytest.raises(KeyError): ob.add_fits_attribute('Chunk.Nonexistent', 33, extension=1) with pytest.raises(KeyError): ob.set_default('Chunk.Nonexistent', 33, extension=1) with pytest.raises(KeyError): ob._get('Nonexistent', extension=33) with pytest.raises(KeyError): ob.delete('Chunk.Nonexistent', extension=1) # CAOM2 element not Chunk with extension specified with pytest.raises(ValueError): ob.set('Observation.observationID', 33, extension=1) with pytest.raises(ValueError): ob.set_fits_attribute('Observation.observationID', ['AA'], extension=1) with pytest.raises(ValueError): ob.set_default('Observation.observationID', 33, extension=1) with pytest.raises(ValueError): ob.add_fits_attribute('Observation.observationID', 'AA', extension=1) with pytest.raises(ValueError): ob.delete('Observation.observationID', extension=1) # add FITS attribute to element that does not exist assert 'Chunk.energy.transition' not in ob._plan with pytest.raises(KeyError): ob.add_fits_attribute('Chunk.energy.transition', 'BP') ob.set('Chunk.energy.transition', 'Name') with pytest.raises(AttributeError): ob.add_fits_attribute('Chunk.energy.transition', 'BP') # call set_fits_attribute with argument other than list with pytest.raises(AssertionError): ob.set_fits_attribute('Chunk.energy.transition', 33) # delete element from a non-existent extension with pytest.raises(ValueError): ob.delete('Chunk.energy.transition', extension=66)
def test_obs_blueprint(): # test the CAOM2_ELEMENTS property assert ObsBlueprint.CAOM2_ELEMENTS == ObsBlueprint._CAOM2_ELEMENTS # updating the CAOM2_ELEMENTS property should not update the original elems = ObsBlueprint.CAOM2_ELEMENTS elems = elems[2:] assert elems != ObsBlueprint.CAOM2_ELEMENTS # default config (one entry per row...) assert str(ObsBlueprint()).count('\n') == 21 print(ObsBlueprint()) # default config with WCS info assert str(ObsBlueprint(position_axes=(1, 2), energy_axis=3, polarization_axis=4, time_axis=5, obs_axis=6)).count('\n') == 81 ob = ObsBlueprint() ob.configure_position_axes(axes=(1, 2)) ob.configure_energy_axis(axis=3) ob.configure_polarization_axis(axis=4) ob.configure_time_axis(axis=5) ob.configure_observable_axis(axis=6) # test that configuring something that's already configured doesn't break # anything ob.configure_position_axes(axes=(1, 2)) ob.configure_energy_axis(axis=3) ob.configure_polarization_axis(axis=4) ob.configure_time_axis(axis=5) ob.configure_observable_axis(axis=6) # set attribute ob.set('Observation.instrument.name', 'NIRI') assert ob._plan['Observation.instrument.name'] == 'NIRI' assert 'Observation.instrument.name = NIRI' in str(ob) # set default ob.clear('Observation.instrument.keywords') ob.add_fits_attribute('Observation.instrument.keywords', str('INSTMODE')) assert "Observation.instrument.keywords = ['INSTMODE'], default = None" \ in str(ob) ob.set_default('Observation.instrument.keywords', 'TEST') assert ob._plan['Observation.instrument.keywords'][1] == 'TEST' assert ob._plan['Observation.instrument.keywords'][0] == ['INSTMODE'] assert "Observation.instrument.keywords = ['INSTMODE'], default = TEST" \ in str(ob) # set fits attribute ob.add_fits_attribute('Observation.proposal.id', str('PROP')) ob.add_fits_attribute('Observation.proposal.id', str('PROP2')) ob.set_default('Observation.proposal.id', 'NOPROP') assert ob._plan['Observation.proposal.id'][0] == ['PROP2', 'PROP', 'RUNID'] assert ob._plan['Observation.proposal.id'][1] == 'NOPROP' if sys.version.startswith('2.7.'): assert ("Observation.proposal.id = ['PROP2', 'PROP', u'RUNID'], " "default = NOPROP") in str(ob) else: assert ("Observation.proposal.id = ['PROP2', 'PROP', 'RUNID'], " "default = NOPROP") in str(ob) # set in extension ob.set('Chunk.energy.velang', 33, extension=1) extension1_str = str(ob)[str(ob).index('extension 1'):] assert 'Chunk.energy.velang = 33' in extension1_str # set fits attribute in extension ob.add_fits_attribute('Chunk.energy.axis.axis.ctype', str('MYCTYPE'), extension=1) ob.add_fits_attribute('Chunk.energy.axis.axis.ctype', str('MYCTYPE2'), extension=1) ob.set_default('Chunk.energy.axis.axis.ctype', 'NOCTYPE', extension=1) extension1_str = str(ob)[str(ob).index('extension 1'):] assert ("Chunk.energy.axis.axis.ctype = ['MYCTYPE2', 'MYCTYPE'], " "default = NOCTYPE") in extension1_str # set in a different extension ob.set('Chunk.energy.velang', 44, extension=2) extension2_str = str(ob)[str(ob).index('extension 2'):] assert 'Chunk.energy.velang = 44' in extension2_str # test get assert ob._get('Observation.instrument.name') == 'NIRI' assert ob._get('Observation.instrument.keywords')[0] == ['INSTMODE'] assert ob._get('Observation.instrument.keywords')[1] == 'TEST' assert ob._get('Chunk.energy.velang', extension=2) == 44 assert ob._get('Chunk.energy.velang', extension=1) == 33 assert ob._get('Chunk.energy.axis.axis.ctype', extension=1)[0] ==\ ['MYCTYPE2', 'MYCTYPE'] assert ob._get('Chunk.energy.axis.axis.ctype', extension=1)[1] == 'NOCTYPE' # test get when keyword not present in extension and the default is used assert ob._get('Chunk.energy.specsys', extension=33)[0] == ['SPECSYS'] assert ob._get('Chunk.energy.specsys', extension=44)[1] is None # get element not set assert 'Observation.target.redshift' not in ob._plan assert ob._get('Observation.target.redshift') is None # bintable :) ob.add_table_attribute('CompositeObservation.members', 'FICS', extension=0) result = ob._get('CompositeObservation.members', extension=0) assert result is not None assert len(result) == 3, len(result) # delete attributes assert len(ob._plan) != 0 assert len(ob._extensions) != 0 for i in ObsBlueprint.CAOM2_ELEMENTS: ob.delete(i) assert len(ob._plan) == 0 # clear ob.clear('Chunk.energy.axis.axis.ctype', extension=1) # delete attributes from extensions ob.delete('Chunk.energy.velang', extension=1) ob.delete('Chunk.energy.axis.axis.ctype', extension=1) ob.delete('CompositeObservation.members', extension=0) ob.delete('Chunk.energy.velang', extension=2) assert len(ob._extensions) == 0 # testing error cases ob = ObsBlueprint() ob.configure_position_axes(axes=(1, 2)) ob.configure_energy_axis(axis=3) ob.configure_polarization_axis(axis=4) ob.configure_time_axis(axis=5) # non CAOM2 element name with pytest.raises(KeyError): ob.set('Nonexistent', 33) with pytest.raises(KeyError): ob.add_fits_attribute('Nonexistent', 33) with pytest.raises(KeyError): ob.set_default('Nonexistent', 33) with pytest.raises(KeyError): ob._get('Nonexistent') with pytest.raises(KeyError): ob.delete('Nonexistent') with pytest.raises(KeyError): ob.clear('Nonexistent') # repeat with extension specified with pytest.raises(KeyError): ob.set('Chunk.Nonexistent', 33, extension=1) with pytest.raises(KeyError): ob.add_fits_attribute('Chunk.Nonexistent', 33, extension=1) with pytest.raises(KeyError): ob.set_default('Chunk.Nonexistent', 33, extension=1) with pytest.raises(KeyError): ob._get('Nonexistent', extension=33) with pytest.raises(KeyError): ob.delete('Chunk.Nonexistent', extension=1) with pytest.raises(KeyError): ob.clear('Chunk.Nonexistent', extension=1) # CAOM2 element not Chunk with extension specified with pytest.raises(ValueError): ob.set('Observation.observationID', 33, extension=1) with pytest.raises(ValueError): ob.set_default('Observation.observationID', 33, extension=1) with pytest.raises(ValueError): ob.add_fits_attribute('Observation.observationID', 'AA', extension=1) with pytest.raises(ValueError): ob.delete('Observation.observationID', extension=1) with pytest.raises(ValueError): ob.clear('Observation.observationID', extension=1) # CAOM2 element Chunk with extension with pytest.raises(ValueError): ob.clear('Chunk.energy.axis.axis.cunit', extension=33) # add FITS attribute to element that does not exist assert 'Chunk.energy.transition' not in ob._plan ob.set('Chunk.energy.transition', 'Name') with pytest.raises(AttributeError): ob.add_fits_attribute('Chunk.energy.transition', 'BP') # call set_fits_attribute with argument other than list with pytest.raises(AttributeError): ob.add_fits_attribute('Chunk.energy.transition', 33) # delete element from a non-existent extension with pytest.raises(ValueError): ob.delete('Chunk.energy.transition', extension=66) # adding the same thing twice does nothing - the test values are defaults result = ob._get('Observation.metaRelease') initial_result_length = (len(result[0])) ob.add_fits_attribute('Observation.metaRelease', 'DATE-OBS') result = ob._get('Observation.metaRelease') add_result_length = (len(result[0])) assert initial_result_length == add_result_length # in an extension result = ob._get('Chunk.energy.specsys', extension=1) initial_result_length = (len(result[0])) ob.add_fits_attribute('Chunk.energy.specsys', 'SPECSYS') result = ob._get('Chunk.energy.specsys', extension=1) add_result_length = (len(result[0])) assert initial_result_length == add_result_length, result