Skip to main content

A library for SuperDARN DMAP file I/O

github

The SuperDARN DMAP file formats are all supported (IQDAT, RAWACF, FITACF, GRID, MAP, and SND) as well as a generic DMAP format that is unaware of any required fields or types (e.g. char, int32) for any fields. For more information on DMAP please see RST Documentation.

Installation

Package manager

This package is registered on PyPI as darn-dmap, you can install the package with your package manager, e.g. pip install darn-dmap.

From source

If you want to build from source, you first need to have Rust installed on your machine. Then:

  1. Clone the repository: git clone https://github.com/SuperDARNCanada/dmap
  2. Create a virtual environment and source it, then install maturin
  3. In the project directory, run maturin develop to build and install the Python bindings. This will make a wheel file based on your operating system and architecture that you can install directly on any compatible machine.

Usage

The basics

The basic code to read and write a DMAP file is:

import dmap

file = "path/to/rawacf_file"
data, _ = dmap.read_rawacf(file)  # returns `tuple[list[dict], Optional[int]]`
outfile = "path/to/outfile.rawacf"
dmap.write_rawacf(data, outfile)  # writes binary data to `outfile`
raw_bytes = dmap.write_rawacf(data)  # returns a `bytes` object

dmap.read_rawacf(...) reads the file into a list of dictionaries, returning the list as well as the byte where any corrupted records start.

The supported reading functions are:

  • read_iqdat,
  • read_rawacf,
  • read_fitacf,
  • read_grid,
  • read_map,
  • read_snd, and
  • read_dmap.

The supported writing functions are:

  • write_iqdat,
  • write_rawacf,
  • write_fitacf,
  • write_grid,
  • write_map,
  • write_snd, and
  • write_dmap.

Accessing data fields

To see the names of the variables you've loaded in and now have access to, try using the keys() method:

print(data[0].keys())

which will tell you all the variables in the first (zeroth) record.

Let's say you loaded in a MAP file, and wanted to grab the cross polar-cap potentials for each record:

import dmap
file = "20150302.n.map"
map_data, _ = dmap.read_map(file)

cpcps=[rec['pot.drop'] for rec in map_data]

I/O on a bz2 compressed file

dmap will handle compressing and decompressing .bz2 files seamlessly, detecting the compression automatically. E.g.

import dmap
fitacf_file = "path/to/file.bz2"
data, _ = dmap.read_fitacf(fitacf_file)
dmap.write_fitacf(data, "temp.fitacf.bz2")

will read in the compressed file, then also write out a new compressed file. You can also pass the argument bz2=True to compress with bzip2 regardless of file extension, or even to return compressed byte objects.

Generic I/O

dmap supports generic DMAP I/O, without verifying the field names and types. The file must still be properly formatted as a DMAP file, but otherwise no checks are conducted.

NOTE: When using the generic writing function write_dmap, scalar fields will possibly be resized; e.g., the stid field may be stored as an 8-bit integer, as opposed to a 16-bit integer as usual. As such, reading with a specific method (e.g. read_fitacf) on a file written using write_dmap will likely not pass the FITACF format checks.

import dmap
generic_file = "path/to/file"  # can be iqdat, rawacf, fitacf, grid, map, snd, and optionally .bz2 compressed
data, _ = dmap.read_dmap(generic_file)
dmap.write_dmap(data, "temp.generic.fitacf")  # fitacf as an example
data2, bad_byte = dmap.read_rawacf("temp.generic.fitacf")  # This will fail due to different types for scalar fields
assert bad_byte == 0  # The first record should be corrupted, i.e. not be a valid FITACF record
assert len(data2) == 0  # No valid records encountered

Handling corrupted data files

The self-describing data format of DMAP files makes it susceptible to corruption. The metadata fields which describe how to interpret the following bytes are very important, and so any corruption will lead to the remainder of the file being effectively useless. dmap is able to handle corruption in two ways. The keyword argument mode of the read_rawacf, etc. functions allows you to choose how to handle corrupt records.

In "lax" mode (the default), no error is raised if a corrupt file is read, and the byte where the corrupted records start is returned along with the non-corrupted records. In "strict" mode, the I/O functions will raise an error if a corrupted record is encountered.

import dmap

corrupted_file = "path/to/file"
data, bad_byte = dmap.read_dmap(corrupted_file, mode="lax")
assert bad_byte > 0

good_file = "path/to/file"
data, bad_byte = dmap.read_dmap(good_file, mode="lax")
assert bad_byte is None

In both uses of the above example, data will be a list of all records extracted from the file, but may be considerably smaller than the file.

import dmap

corrupted_file = "path/to/file"
try:
    data = dmap.read_dmap(corrupted_file, mode="strict")
    had_error = False
except:
    had_error = True
assert had_error

good_file = "path/to/file"
try:
    data = dmap.read_dmap(good_file, mode="strict")
    had_error = False
except:
    had_error = True
assert had_error is False

Stream I/O

dmap also can conduct read/write operations from/to Python bytes objects directly. These bytes must be formatted in accordance with the DMAP format. Simply pass in a bytes object to any of the read_[type] functions instead of a path and the input will be parsed.

While not the recommended way to read data from a DMAP file, the following example shows the use of these byte I/O functions:

import dmap
file = "path/to/file.fitacf"
with open(file, 'rb') as f:  # 'rb' specifies to open the binary (b) file as read-only (r)
    raw_bytes = f.read()  # reads the file in its entirety
data, _ = dmap.read_dmap(raw_bytes)
binary_data = dmap.write_fitacf(data)
assert binary_data == raw_bytes

As a note, this binary data can be compressed ~2x typically using zlib, or with another compression utility. This is quite useful if sending data over a network where speed and bandwidth must be considered. Note that the binary writing functions can compress with bzip2 by passing bz2=True as an argument.

File "sniffing"

If you only want to inspect a file, without actually needing access to all the data, you can use the read_[type] functions in with the optional indices argument. This will only read in the specified records from a file, and works in all modes.

import dmap
path = "path/to/file"
recs = dmap.read_dmap(path, mode="...", indices=[0, 1, -2, -1])

Reading only metadata fields

Each DMAP format consists of metadata and data fields. You can read only the metadata fields by passing mode="metadata" to any of the writing functions. Note that the generic read function read_dmap will return all fields, as it by nature has no knowledge of the underlying fields. Note also that the read functions operating on a file still read the entire file into memory first, so reading metadata only may not significantly decrease read times. Also, bzipped files are fully decompressed before reading begins, so again read times may not be significantly quicker in this mode under certain circumstances.

Download files

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

Source Distribution

darn_dmap-0.8.1.tar.gz (44.1 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

darn_dmap-0.8.1-cp38-abi3-win_amd64.whl (567.2 kB view details)

Uploaded CPython 3.8+Windows x86-64

darn_dmap-0.8.1-cp38-abi3-win32.whl (511.8 kB view details)

Uploaded CPython 3.8+Windows x86

darn_dmap-0.8.1-cp38-abi3-musllinux_1_2_x86_64.whl (874.9 kB view details)

Uploaded CPython 3.8+musllinux: musl 1.2+ x86-64

darn_dmap-0.8.1-cp38-abi3-musllinux_1_2_i686.whl (909.8 kB view details)

Uploaded CPython 3.8+musllinux: musl 1.2+ i686

darn_dmap-0.8.1-cp38-abi3-musllinux_1_2_armv7l.whl (893.7 kB view details)

Uploaded CPython 3.8+musllinux: musl 1.2+ ARMv7l

darn_dmap-0.8.1-cp38-abi3-musllinux_1_2_aarch64.whl (803.1 kB view details)

Uploaded CPython 3.8+musllinux: musl 1.2+ ARM64

darn_dmap-0.8.1-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (678.1 kB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ x86-64

darn_dmap-0.8.1-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl (676.9 kB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ s390x

darn_dmap-0.8.1-cp38-abi3-manylinux_2_17_i686.manylinux2014_i686.whl (735.2 kB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ i686

darn_dmap-0.8.1-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (618.7 kB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ ARMv7l

darn_dmap-0.8.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (637.9 kB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ ARM64

darn_dmap-0.8.1-cp38-abi3-macosx_11_0_arm64.whl (575.5 kB view details)

Uploaded CPython 3.8+macOS 11.0+ ARM64

darn_dmap-0.8.1-cp38-abi3-macosx_10_12_x86_64.whl (600.9 kB view details)

Uploaded CPython 3.8+macOS 10.12+ x86-64

File details

Details for the file darn_dmap-0.8.1.tar.gz.

File metadata

  • Download URL: darn_dmap-0.8.1.tar.gz
  • Upload date:
  • Size: 44.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.14.1

File hashes

Hashes for darn_dmap-0.8.1.tar.gz
Algorithm Hash digest
SHA256 59d2727c31f5969d531aa0cb2d0b09deb9c50e225a9a7801837f588da7b16b81
MD5 73659494b12adaf21f476416e026ccaf
BLAKE2b-256 feb2e5d0ba8dd9299ac3ef69bba430632c9f3510fc7b41a9bb07f4beec6d9efc

See more details on using hashes here.

File details

Details for the file darn_dmap-0.8.1-cp38-abi3-win_amd64.whl.

File metadata

  • Download URL: darn_dmap-0.8.1-cp38-abi3-win_amd64.whl
  • Upload date:
  • Size: 567.2 kB
  • Tags: CPython 3.8+, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.14.1

File hashes

Hashes for darn_dmap-0.8.1-cp38-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 d0b9b408f277d4d37625ff9e6ae8222488ae165d5151400021aec3c4a02b8377
MD5 5810636e3d7ee4481dedadff52386923
BLAKE2b-256 18c0b7e115137bc5d07a2759dc802d84e1f2778ab3d05c11f12ac789d5637744

See more details on using hashes here.

File details

Details for the file darn_dmap-0.8.1-cp38-abi3-win32.whl.

File metadata

  • Download URL: darn_dmap-0.8.1-cp38-abi3-win32.whl
  • Upload date:
  • Size: 511.8 kB
  • Tags: CPython 3.8+, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.14.1

File hashes

Hashes for darn_dmap-0.8.1-cp38-abi3-win32.whl
Algorithm Hash digest
SHA256 ed29e530f013e4ec0417c3ff41c54d50e401a966f4602fadf7d2ac1b748bd7ce
MD5 65d46b50b810515829c87dbd71be2212
BLAKE2b-256 1abffd8165e29103348349fb3981f4ed55fe93d4950fe7cbd513a70860ddfc62

See more details on using hashes here.

File details

Details for the file darn_dmap-0.8.1-cp38-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for darn_dmap-0.8.1-cp38-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 a69064dcf33f6bd8e958f8e609798e5cf820d7246ad156a177ae72936a54e38a
MD5 68c7035d0e5aeba927c75c9d4fab5712
BLAKE2b-256 8527b8f4ddfab934ba42fe042a25abf230323c584d9f3ee422ff7c4b8dcd01e9

See more details on using hashes here.

File details

Details for the file darn_dmap-0.8.1-cp38-abi3-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for darn_dmap-0.8.1-cp38-abi3-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 b4f36ecd74d98c23198b70fbcfd20502d694c64dcc9ecf031d587d73e33fb0f8
MD5 4bf84f50382f85d6c9787f6f7534c51d
BLAKE2b-256 cb3aaf7be1ba8cd728059018b48067d41846e16c07c0cb2e219a08b542003df2

See more details on using hashes here.

File details

Details for the file darn_dmap-0.8.1-cp38-abi3-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for darn_dmap-0.8.1-cp38-abi3-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 4cc68a9eb7240e6068225e993efe5f4aa12633edf0973b2eae9f0e4bc1c1b9f3
MD5 80a80715bd85d1cebf382db10a9da039
BLAKE2b-256 bcd8f847e4ba643c00fa2cfa4e6e1067f65ababecc8ff34b7a9693e752c6f147

See more details on using hashes here.

File details

Details for the file darn_dmap-0.8.1-cp38-abi3-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for darn_dmap-0.8.1-cp38-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 92fdfd39e32aabb73ab2f64cb00b9ad3938ba1b65e0c223ff3ccb121e4e49902
MD5 9c50d038e9fd1131d7ec3f8a3c2a2ab8
BLAKE2b-256 e12651418f66ed878ca8239366ba0dd850861c6a206f4df9f845398ce0d33514

See more details on using hashes here.

File details

Details for the file darn_dmap-0.8.1-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for darn_dmap-0.8.1-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9e62073f7052d89700199909d7c67149fc495d9ca030a9eaf36b32bcca3a1aef
MD5 14de889a3a26fdbde5e4c8a3606e394e
BLAKE2b-256 3347d52f2d548f1a26eca2b3e5d41d9d5f3abfc214559bef33a85b08f9549ec4

See more details on using hashes here.

File details

Details for the file darn_dmap-0.8.1-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl.

File metadata

File hashes

Hashes for darn_dmap-0.8.1-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 16274b499cea83acff515e5337003c9cf13665774317aa9f2d76b2ca904771d6
MD5 92fc142969b4aa3d6a40104ae657f844
BLAKE2b-256 d343d0a24ca854bcdb20da9b19d7503ed73bca32efaef5bb0a3f440cb201db4d

See more details on using hashes here.

File details

Details for the file darn_dmap-0.8.1-cp38-abi3-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for darn_dmap-0.8.1-cp38-abi3-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 ed3662db3e5311d183b04395722aa834a1cfe3c5d34e0407c0dd6fa8e001c3a7
MD5 d57c33ed2c95253779b345dce94c7457
BLAKE2b-256 0b9265fbdba4ad9ec9d188fb08431620f36e7a452c8cb31adba1f9da1c4954ab

See more details on using hashes here.

File details

Details for the file darn_dmap-0.8.1-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for darn_dmap-0.8.1-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 56feb09d7c6e06b79e302decc4794da707137ab1b669d55d4677a4576354d00f
MD5 af36aa2319e5898582108cfc4d409621
BLAKE2b-256 eeb123106f08970c977f0be3058044d9aedc99999089823519d60d427abb54cb

See more details on using hashes here.

File details

Details for the file darn_dmap-0.8.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for darn_dmap-0.8.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 5162a91509e3a1fd95fd9416f62979713044998ff770f7e7f3500833b607d520
MD5 e5e62b1fb863d5af339dec4503fc5481
BLAKE2b-256 c0ef8895952ca2219cab04f14eb16f44004c5fbc6ea4888cca4373f6f34949be

See more details on using hashes here.

File details

Details for the file darn_dmap-0.8.1-cp38-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for darn_dmap-0.8.1-cp38-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0921803dd2b5883c8040e7a146c3edcceaee984858fabd27eeac5d10977c38e9
MD5 1b07dd0ec2212998e977d0f68beb75eb
BLAKE2b-256 ee32581033ffc6389b5b91efe726ef1b26328452af0a62b47b17c326d845a717

See more details on using hashes here.

File details

Details for the file darn_dmap-0.8.1-cp38-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for darn_dmap-0.8.1-cp38-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 678498adc0ef97a8ac3dac2a5848bdc98b9e5769dd380018ec65273304d4633a
MD5 db26f38326f7a0028943900b9844f38e
BLAKE2b-256 4097d835c673fa3d97bd2f82797da0ca84c610ad2e6b99348513e47d001d4e7f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page