Ejemplo n.º 1
0
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)
Ejemplo n.º 2
0
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)
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
    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
Ejemplo n.º 5
0
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
Ejemplo n.º 6
0
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
Ejemplo n.º 7
0
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)
Ejemplo n.º 8
0
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