Skip to main content

CAOM-2.4 library

Project description

https://img.shields.io/pypi/v/caom2.svg

Common Archive Observation Model - data engineering tools

caom2 module

The caom2 module is a library implementing the Common Archive Observation Model (CAOM-2.3) for manipulating CAOM observations and reading and writing XML documents.

http://www.opencadc.org/caom2/

To create a minimal Simple Observation

import sys
from caom2 import SimpleObservation, TypedOrderedDict, Plane, Artifact,\
                  Part, Chunk, ObservationWriter, ProductType,\
                  ReleaseType, TypedList

observation = SimpleObservation('collection', 'observationID')

observation.planes = TypedOrderedDict(Plane)
plane = Plane('productID')
observation.planes['productID'] = plane

plane.artifacts = TypedOrderedDict(Artifact)
artifact = Artifact('uri:foo/bar', ProductType.SCIENCE, ReleaseType.META)
plane.artifacts['uri:foo/bar'] = artifact

artifact.parts = TypedOrderedDict(Part)
part = Part('name')
artifact.parts['name'] = part

part.chunks = TypedList(Chunk)
chunk = Chunk()
part.chunks.append(chunk)

writer = ObservationWriter()
writer.write(observation, sys.stdout)

The output:

<?xml version='1.0' encoding='UTF-8'?>
<caom2:Observation xmlns:caom2="http://www.opencadc.org/caom2/xml/v2.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="caom2:SimpleObservation" caom2:id="00000000-0000-0000-3d6a-420eab45bf2e" caom2:lastModified="2016-11-24T08:40:54.003">
  <caom2:collection>collection</caom2:collection>
  <caom2:observationID>observationID</caom2:observationID>
  <caom2:algorithm>
    <caom2:name>exposure</caom2:name>
  </caom2:algorithm>
  <caom2:planes>
    <caom2:plane caom2:id="00000000-0000-0000-1fe6-420eab45c0bc" caom2:lastModified="2016-11-24T08:40:54.003">
      <caom2:productID>productID</caom2:productID>
      <caom2:artifacts>
        <caom2:artifact caom2:id="00000000-0000-0000-7adf-420eab45c170" caom2:lastModified="2016-11-24T08:40:54.004">
          <caom2:uri>uri:foo/bar</caom2:uri>
          <caom2:productType>science</caom2:productType>
          <caom2:releaseType>meta</caom2:releaseType>
          <caom2:parts>
            <caom2:part caom2:id="00000000-0000-0000-16f0-420eab45c246" caom2:lastModified="2016-11-24T08:40:54.004">
              <caom2:name>name</caom2:name>
              <caom2:chunks>
                <caom2:chunk caom2:id="00000000-0000-0000-0c8f-420eab45c2a1" caom2:lastModified="2016-11-24T08:40:54.004"/>
              </caom2:chunks>
            </caom2:part>
          </caom2:parts>
        </caom2:artifact>
      </caom2:artifacts>
    </caom2:plane>
  </caom2:planes>
</caom2:Observation>

To create a complete Observation

# make it compatible with Python 2 and 3
from __future__ import (absolute_import, division, print_function,
                    unicode_literals)
from datetime import datetime
import sys
from caom2 import SimpleObservation, Plane, Artifact, Part, Chunk,\
                  TypedOrderedDict, ObservationWriter, ProductType, \
                  ReleaseType, TypedList, Target, TargetPosition, \
                  TargetType, ObservationIntentType, Instrument, \
                  Telescope, Environment, DataProductType, Provenance, \
                  CalibrationLevel, Metrics, Proposal, Point, Slice, Axis,\
                  ObservableAxis, CoordAxis1D, CoordAxis2D, SpatialWCS,\
                  SpectralWCS, EnergyTransition, TemporalWCS, CoordFunction1D,\
                  RefCoord, PolarizationWCS

observation = SimpleObservation('collection', 'observationID')
observation.obs_type = 'flat'
observation.intent = ObservationIntentType.SCIENCE
observation.meta_release = datetime(2016, 11, 22, 11, 53, 44, 0)

observation.proposal = Proposal('proposal id')
observation.proposal.pi_name = 'pi name'
observation.proposal.project = 'proposal project'
observation.proposal.title = 'proposal title'
observation.proposal.keywords.update({'proposal', 'key', 'words'})

observation.target = Target('target name')
observation.target.target_type = TargetType.OBJECT
observation.target.standard = False
observation.target.redshift = 1.5
observation.target.keywords.update({'target', 'key', 'words'})

point = Point(1.0, 2.0)
observation.target_position = TargetPosition(point, 'coordsys')
observation.target_position.equinox = 3.0

observation.telescope = Telescope('telescope name')
observation.telescope.geo_location_x = 1.0
observation.telescope.geo_location_y = 2.0
observation.telescope.geo_location_z = 3.0
observation.telescope.keywords.update({'telescope', 'key', 'words'})

observation.instrument = Instrument('instrument name')
observation.instrument.keywords.update({'instrument', 'key', 'words'})

observation.env = Environment()
observation.env.seeing = 0.08
observation.env.humidity = 0.35
observation.env.elevation = 2.7
observation.env.tau = 0.7
observation.env.wavelength_tau = 450e-6
observation.env.ambient_temp = 20.0
observation.env.photometric = True

observation.planes = TypedOrderedDict(Plane)
plane = Plane('productID')
observation.planes['productID'] = plane

plane.meta_release = datetime(2016, 11, 22, 12, 26, 21, 0)
plane.data_release = datetime(2018, 01, 01, 00, 00, 00, 0)
plane.data_product_type = DataProductType.IMAGE
plane.calibration_level = CalibrationLevel.PRODUCT

plane.provenance = provenance = Provenance('name')
plane.provenance.version = 'version'
plane.provenance.product = 'product'
plane.provenance.producer = 'producer'
plane.provenance.run_id = 'run_id'
plane.provenance.reference = 'http://foo/bar'
plane.provenance.last_executed = datetime(2016, 11, 22, 12, 28, 16, 0)
plane.provenance.keywords.update({'provenance', 'key', 'words'})

plane.metrics = Metrics()
plane.metrics.source_number_density = 1.0
plane.metrics.background = 2.0
plane.metrics.background_std_dev = 3.0
plane.metrics.flux_density_limit = 4.0
plane.metrics.mag_limit = 5.0

plane.artifacts = TypedOrderedDict(Artifact)
artifact = Artifact('uri:foo/bar', ProductType.SCIENCE, ReleaseType.META)
plane.artifacts['uri:foo/bar'] = artifact

artifact.content_type = 'application/fits'
artifact.content_length = 12345L

artifact.parts = TypedOrderedDict(Part)
part = Part('name')
artifact.parts['name'] = part
part.product_type = ProductType.SCIENCE

part.chunks = TypedList(Chunk)
chunk = Chunk()
part.chunks.append(chunk)

chunk.product_type = ProductType.SCIENCE
chunk.naxis = 5
chunk.observable_axis = 1
chunk.position_axis_1 = 1
chunk.position_axis_2 = 2
chunk.energy_axis = 3
chunk.time_axis = 4
chunk.polarization_axis = 5

observable_axis = Slice(Axis('observable_ctype', 'observable_cunit'), 1L)
chunk.observable = ObservableAxis(observable_axis)

position_axis = CoordAxis2D(Axis('position_ctype_1', 'position_cunit_1'),
                            Axis('position_ctype_2', 'position_cunit_2'))
chunk.position = SpatialWCS(position_axis)
chunk.position.coordsys = 'position coordsys'
chunk.position.equinox = 2000.0
chunk.position.resolution = 0.5

energy_axis = CoordAxis1D(Axis('energy_ctype', 'energy_cunit'))
chunk.energy = SpectralWCS(energy_axis, 'specsys')
chunk.energy.ssysobs = 'ssysobs'
chunk.energy.ssyssrc = 'ssyssrc'
chunk.energy.restfrq = 1.0
chunk.energy.restwav = 2.0
chunk.energy.velosys = 3.0
chunk.energy.zsource = 4.0
chunk.energy.velang = 5.0
chunk.energy.bandpassName = 'bandpass name'
chunk.energy.resolvingPower = 6.0
chunk.energy.transition = EnergyTransition('H', '21cm')

time_axis = CoordAxis1D(Axis('time_ctype', 'time_cunit'))
chunk.time = TemporalWCS(time_axis)
chunk.time.exposure = 1.0
chunk.time.resolution = 2.0
chunk.time.timesys = 'UTC'
chunk.time.trefpos = 'TOPOCENTER'
chunk.time.mjdref = 3.0

polarization_axis = CoordAxis1D(Axis('STOKES'))
polarization_axis.function = CoordFunction1D(4L, 1.0, RefCoord(1.0, 1.0))
chunk.polarization = PolarizationWCS(polarization_axis)

writer = ObservationWriter()
writer.write(observation, sys.stdout)

The output:

<?xml version='1.0' encoding='UTF-8'?>
<caom2:Observation xmlns:caom2="http://www.opencadc.org/caom2/xml/v2.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="caom2:SimpleObservation" caom2:id="00000000-0000-0000-21ae-41feaaab49f6" caom2:lastModified="2016-11-23T13:35:24.404">
  <caom2:collection>collection</caom2:collection>
  <caom2:observationID>observationID</caom2:observationID>
  <caom2:metaRelease>2016-11-22T11:53:44.000</caom2:metaRelease>
  <caom2:algorithm>
        <caom2:name>exposure</caom2:name>
  </caom2:algorithm>
  <caom2:type>flat</caom2:type>
  <caom2:intent>science</caom2:intent>
  <caom2:proposal>
        <caom2:id>proposal id</caom2:id>
        <caom2:pi>pi name</caom2:pi>
        <caom2:project>proposal project</caom2:project>
        <caom2:title>proposal title</caom2:title>
        <caom2:keywords>proposal words key</caom2:keywords>
  </caom2:proposal>
  <caom2:target>
        <caom2:name>target name</caom2:name>
        <caom2:type>object</caom2:type>
        <caom2:standard>false</caom2:standard>
        <caom2:redshift>1.5</caom2:redshift>
        <caom2:keywords>words key target</caom2:keywords>
  </caom2:target>
  <caom2:targetPosition>
        <caom2:coordsys>coordsys</caom2:coordsys>
        <caom2:equinox>3.0</caom2:equinox>
        <caom2:coordinates>
          <caom2:cval1>1.0</caom2:cval1>
          <caom2:cval2>2.0</caom2:cval2>
        </caom2:coordinates>
  </caom2:targetPosition>
  <caom2:telescope>
        <caom2:name>telescope name</caom2:name>
        <caom2:geoLocationX>1.0</caom2:geoLocationX>
        <caom2:geoLocationY>2.0</caom2:geoLocationY>
        <caom2:geoLocationZ>3.0</caom2:geoLocationZ>
        <caom2:keywords>words key telescope</caom2:keywords>
  </caom2:telescope>
  <caom2:instrument>
        <caom2:name>instrument name</caom2:name>
        <caom2:keywords>instrument words key</caom2:keywords>
  </caom2:instrument>
  <caom2:planes>
        <caom2:plane caom2:id="00000000-0000-0000-f768-41feaaab4bbc" caom2:lastModified="2016-11-23T13:35:24.404">
          <caom2:productID>productID</caom2:productID>
          <caom2:metaRelease>2016-11-22T12:26:21.000</caom2:metaRelease>
          <caom2:dataRelease>2018-01-01T00:00:00.000</caom2:dataRelease>
          <caom2:dataProductType>image</caom2:dataProductType>
          <caom2:calibrationLevel>3</caom2:calibrationLevel>
          <caom2:provenance>
                <caom2:name>name</caom2:name>
                <caom2:version>version</caom2:version>
                <caom2:producer>producer</caom2:producer>
                <caom2:runID>run_id</caom2:runID>
                <caom2:reference>http://foo/bar</caom2:reference>
                <caom2:lastExecuted>2016-11-22T12:28:16.000</caom2:lastExecuted>
                <caom2:keywords>provenance words key</caom2:keywords>
          </caom2:provenance>
          <caom2:metrics>
                <caom2:sourceNumberDensity>1.0</caom2:sourceNumberDensity>
                <caom2:background>2.0</caom2:background>
                <caom2:backgroundStddev>3.0</caom2:backgroundStddev>
                <caom2:fluxDensityLimit>4.0</caom2:fluxDensityLimit>
                <caom2:magLimit>5.0</caom2:magLimit>
          </caom2:metrics>
          <caom2:artifacts>
                <caom2:artifact caom2:id="00000000-0000-0000-d905-41feaaab4ca0" caom2:lastModified="2016-11-23T13:35:24.404">
                  <caom2:uri>uri:foo/bar</caom2:uri>
                  <caom2:productType>science</caom2:productType>
                  <caom2:releaseType>meta</caom2:releaseType>
                  <caom2:contentType>application/fits</caom2:contentType>
                  <caom2:contentLength>12345</caom2:contentLength>
                  <caom2:parts>
                        <caom2:part caom2:id="00000000-0000-0000-909d-41feaaab4d2d" caom2:lastModified="2016-11-23T13:35:24.405">
                          <caom2:name>name</caom2:name>
                          <caom2:productType>science</caom2:productType>
                          <caom2:chunks>
                                <caom2:chunk caom2:id="00000000-0000-0000-2ef1-41feaaab4d74" caom2:lastModified="2016-11-23T13:35:24.405">
                                  <caom2:productType>science</caom2:productType>
                                  <caom2:naxis>5</caom2:naxis>
                                  <caom2:observableAxis>1</caom2:observableAxis>
                                  <caom2:positionAxis1>1</caom2:positionAxis1>
                                  <caom2:positionAxis2>2</caom2:positionAxis2>
                                  <caom2:energyAxis>3</caom2:energyAxis>
                                  <caom2:timeAxis>4</caom2:timeAxis>
                                  <caom2:polarizationAxis>5</caom2:polarizationAxis>
                                  <caom2:observable>
                                        <caom2:dependent>
                                          <caom2:axis>
                                                <caom2:ctype>observable_ctype</caom2:ctype>
                                                <caom2:cunit>observable_cunit</caom2:cunit>
                                          </caom2:axis>
                                          <caom2:bin>1</caom2:bin>
                                        </caom2:dependent>
                                  </caom2:observable>
                                  <caom2:position>
                                        <caom2:axis>
                                          <caom2:axis1>
                                                <caom2:ctype>position_ctype_1</caom2:ctype>
                                                <caom2:cunit>position_cunit_1</caom2:cunit>
                                          </caom2:axis1>
                                          <caom2:axis2>
                                                <caom2:ctype>position_ctype_2</caom2:ctype>
                                                <caom2:cunit>position_cunit_2</caom2:cunit>
                                          </caom2:axis2>
                                        </caom2:axis>
                                        <caom2:coordsys>position coordsys</caom2:coordsys>
                                        <caom2:equinox>2000.0</caom2:equinox>
                                        <caom2:resolution>0.5</caom2:resolution>
                                  </caom2:position>
                                  <caom2:energy>
                                        <caom2:axis>
                                          <caom2:axis>
                                                <caom2:ctype>energy_ctype</caom2:ctype>
                                                <caom2:cunit>energy_cunit</caom2:cunit>
                                          </caom2:axis>
                                        </caom2:axis>
                                        <caom2:specsys>specsys</caom2:specsys>
                                        <caom2:ssysobs>ssysobs</caom2:ssysobs>
                                        <caom2:ssyssrc>ssyssrc</caom2:ssyssrc>
                                        <caom2:restfrq>1.0</caom2:restfrq>
                                        <caom2:restwav>2.0</caom2:restwav>
                                        <caom2:velosys>3.0</caom2:velosys>
                                        <caom2:zsource>4.0</caom2:zsource>
                                        <caom2:velang>5.0</caom2:velang>
                                        <caom2:transition>
                                          <caom2:species>H</caom2:species>
                                          <caom2:transition>21cm</caom2:transition>
                                        </caom2:transition>
                                  </caom2:energy>
                                  <caom2:time>
                                        <caom2:axis>
                                          <caom2:axis>
                                                <caom2:ctype>time_ctype</caom2:ctype>
                                                <caom2:cunit>time_cunit</caom2:cunit>
                                          </caom2:axis>
                                        </caom2:axis>
                                        <caom2:timesys>UTC</caom2:timesys>
                                        <caom2:trefpos>TOPOCENTER</caom2:trefpos>
                                        <caom2:mjdref>3.0</caom2:mjdref>
                                        <caom2:exposure>1.0</caom2:exposure>
                                        <caom2:resolution>2.0</caom2:resolution>
                                  </caom2:time>
                                  <caom2:polarization>
                                        <caom2:axis>
                                          <caom2:axis>
                                                <caom2:ctype>STOKES</caom2:ctype>
                                          </caom2:axis>
                                          <caom2:function>
                                                <caom2:naxis>4</caom2:naxis>
                                                <caom2:delta>1.0</caom2:delta>
                                                <caom2:refCoord>
                                                  <caom2:pix>1.0</caom2:pix>
                                                  <caom2:val>1.0</caom2:val>
                                                </caom2:refCoord>
                                          </caom2:function>
                                        </caom2:axis>
                                  </caom2:polarization>
                                </caom2:chunk>
                          </caom2:chunks>
                        </caom2:part>
                  </caom2:parts>
                </caom2:artifact>
          </caom2:artifacts>
        </caom2:plane>
  </caom2:planes>
</caom2:Observation>

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

caom2-2.6.1.tar.gz (167.4 kB view details)

Uploaded Source

Built Distribution

caom2-2.6.1-py2.py3-none-any.whl (219.6 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file caom2-2.6.1.tar.gz.

File metadata

  • Download URL: caom2-2.6.1.tar.gz
  • Upload date:
  • Size: 167.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.0.0 CPython/3.12.3

File hashes

Hashes for caom2-2.6.1.tar.gz
Algorithm Hash digest
SHA256 993cabbf1c092b13ab7b28e5786587afbe6e9b6a3f893cc42dffbd6f0233f06c
MD5 004b32befbef3a9484e11904fa0b55d6
BLAKE2b-256 5c9f504ddb19283c5a915ad2263ebe72a029c1ca7e8a759ddb94e22c2c261931

See more details on using hashes here.

File details

Details for the file caom2-2.6.1-py2.py3-none-any.whl.

File metadata

  • Download URL: caom2-2.6.1-py2.py3-none-any.whl
  • Upload date:
  • Size: 219.6 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.0.0 CPython/3.12.3

File hashes

Hashes for caom2-2.6.1-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 de0f274962b614404d56f4e9b851c7f3c4c1dd23f2f3a54d6466bbd63bc971b6
MD5 c03e2eb1923bf00c080b6aa614f286c1
BLAKE2b-256 93a22c683f287a4e8454a5799061ee18647e6d2bbb48b9b57651ef941a5038d0

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page