Official Python interface for the SDDS (Self Describing Data Sets) format.
Project description
SDDS Python Module
The sdds Python module provides a high-level interface for creating, manipulating, and reading Self Describing Data Sets (SDDS) files, a file protocol designed for storing and transferring scientific data.
Features
- Read and Write SDDS files in ASCII and binary formats.
- Support for all SDDS data types: parameters, arrays, and columns.
- Define and manipulate data with ease.
- Multi-page data handling for advanced use cases.
- Includes mostly compatible read() and write() functions similar to the PyLHC sdds module. Unlike the PyLHC version, this module works with multi-page SDDS files and with column data.
Requirements
- Python 3.9 or higher
- An SDDS-compatible environment with the necessary C library dependencies (already integrated into this module).
Installation
You can install the sdds module directly using pip or conda:
python -m pip install soliday.sdds
conda install soliday::sdds
Usage
Creating an SDDS File
Below is an example of how to create an SDDS file with parameters, columns, and arrays.
import sdds
def main():
# Initialize the SDDS object with an index of 0
sdds_obj = sdds.SDDS(0)
# Specify the name of the output SDDS file
output_file = "output_all_data_types.sdds"
# Set the description of the SDDS file with a brief text and detailed contents
sdds_obj.setDescription(
"Example output file for demonstration purposes",
"Includes parameters, columns, and arrays for every supported datatype."
)
# Define parameters for all supported SDDS data types
sdds_obj.defineSimpleParameter("param_short", sdds.SDDS_SHORT)
sdds_obj.defineSimpleParameter("param_ushort", sdds.SDDS_USHORT)
sdds_obj.defineSimpleParameter("param_long", sdds.SDDS_LONG)
sdds_obj.defineSimpleParameter("param_ulong", sdds.SDDS_ULONG)
sdds_obj.defineSimpleParameter("param_long64", sdds.SDDS_LONG64)
sdds_obj.defineSimpleParameter("param_ulong64", sdds.SDDS_ULONG64)
sdds_obj.defineSimpleParameter("param_float", sdds.SDDS_FLOAT)
sdds_obj.defineSimpleParameter("param_double", sdds.SDDS_DOUBLE)
sdds_obj.defineSimpleParameter("param_string", sdds.SDDS_STRING)
sdds_obj.defineSimpleParameter("param_character", sdds.SDDS_CHARACTER)
# Define columns for all supported SDDS data types
sdds_obj.defineSimpleColumn("col_short", sdds.SDDS_SHORT)
sdds_obj.defineSimpleColumn("col_ushort", sdds.SDDS_USHORT)
sdds_obj.defineSimpleColumn("col_long", sdds.SDDS_LONG)
sdds_obj.defineSimpleColumn("col_ulong", sdds.SDDS_ULONG)
sdds_obj.defineSimpleColumn("col_long64", sdds.SDDS_LONG64)
sdds_obj.defineSimpleColumn("col_ulong64", sdds.SDDS_ULONG64)
sdds_obj.defineSimpleColumn("col_float", sdds.SDDS_FLOAT)
sdds_obj.defineSimpleColumn("col_double", sdds.SDDS_DOUBLE)
sdds_obj.defineSimpleColumn("col_string", sdds.SDDS_STRING)
sdds_obj.defineSimpleColumn("col_character", sdds.SDDS_CHARACTER)
# Define arrays for all supported SDDS data types
# The third parameter specifies the dimensionality of the array
sdds_obj.defineSimpleArray("array_short", sdds.SDDS_SHORT, 1)
sdds_obj.defineSimpleArray("array_ushort", sdds.SDDS_USHORT, 1)
sdds_obj.defineSimpleArray("array_long", sdds.SDDS_LONG, 2)
sdds_obj.defineSimpleArray("array_ulong", sdds.SDDS_ULONG, 1)
sdds_obj.defineSimpleArray("array_long64", sdds.SDDS_LONG64, 1)
sdds_obj.defineSimpleArray("array_ulong64", sdds.SDDS_ULONG64, 1)
sdds_obj.defineSimpleArray("array_float", sdds.SDDS_FLOAT, 1)
sdds_obj.defineSimpleArray("array_double", sdds.SDDS_DOUBLE, 1)
sdds_obj.defineSimpleArray("array_string", sdds.SDDS_STRING, 1)
sdds_obj.defineSimpleArray("array_character", sdds.SDDS_CHARACTER, 1)
# -------------------------
# Populate Page 1 with Data
# -------------------------
# Set parameter values for Page 1
sdds_obj.setParameterValue("param_short", 1, page=1)
sdds_obj.setParameterValue("param_ushort", 2, page=1)
sdds_obj.setParameterValue("param_long", 3, page=1)
sdds_obj.setParameterValue("param_ulong", 4, page=1)
sdds_obj.setParameterValue("param_long64", 5, page=1)
sdds_obj.setParameterValue("param_ulong64", 6, page=1)
sdds_obj.setParameterValue("param_float", 7.7, page=1)
sdds_obj.setParameterValue("param_double", 8.8, page=1)
sdds_obj.setParameterValue("param_string", "Page 1 String", page=1)
sdds_obj.setParameterValue("param_character", "A", page=1)
# Define column data for Page 1
columns_page1 = {
"col_short": [1, 2],
"col_ushort": [3, 4],
"col_long": [5, 6],
"col_ulong": [7, 8],
"col_long64": [9, 10],
"col_ulong64": [11, 12],
"col_float": [13.1, 14.2],
"col_double": [15.3, 16.4],
"col_string": ["String1", "String2"],
"col_character": ["X", "Y"],
}
# Populate column data for Page 1
for col_name, col_data in columns_page1.items():
sdds_obj.setColumnValueList(col_name, col_data, page=1)
# Define array data for Page 1 (one-dimensional arrays)
arrays_page1_1d = {
"array_short": [1, 2, 3],
"array_ushort": [4, 5, 6],
"array_ulong": [10, 11, 12],
"array_long64": [13, 14, 15],
"array_ulong64": [16, 17, 18],
"array_float": [19.1, 20.2, 21.3],
"array_double": [22.4, 23.5, 24.6],
"array_string": ["Array1", "Array2", "Array3"],
"array_character": ["M", "N", "O"],
}
# Populate one-dimensional array data for Page 1
for array_name, array_data in arrays_page1_1d.items():
sdds_obj.setArrayValueList(array_name, array_data, [3], page=1)
# Define array data for Page 1 (two-dimensional array)
arrays_page1_2d = {
"array_long": [7, 8, 9, 17, 18, 19],
}
# Populate two-dimensional array data for Page 1
for array_name, array_data in arrays_page1_2d.items():
sdds_obj.setArrayValueList(array_name, array_data, [2, 3], page=1)
# -------------------------
# Populate Page 2 with Data
# -------------------------
# Set parameter values for Page 2
sdds_obj.setParameterValue("param_short", 10, page=2)
sdds_obj.setParameterValue("param_ushort", 20, page=2)
sdds_obj.setParameterValue("param_long", 30, page=2)
sdds_obj.setParameterValue("param_ulong", 40, page=2)
sdds_obj.setParameterValue("param_long64", 50, page=2)
sdds_obj.setParameterValue("param_ulong64", 60, page=2)
sdds_obj.setParameterValue("param_float", 70.7, page=2)
sdds_obj.setParameterValue("param_double", 80.8, page=2)
sdds_obj.setParameterValue("param_string", "Page 2 String", page=2)
sdds_obj.setParameterValue("param_character", "B", page=2)
# Define column data for Page 2
columns_page2 = {
"col_short": [21, 22],
"col_ushort": [23, 24],
"col_long": [25, 26],
"col_ulong": [27, 28],
"col_long64": [29, 30],
"col_ulong64": [31, 32],
"col_float": [33.1, 34.2],
"col_double": [35.3, 36.4],
"col_string": ["String3", "String4"],
"col_character": ["Z", "W"],
}
# Populate column data for Page 2
for col_name, col_data in columns_page2.items():
sdds_obj.setColumnValueList(col_name, col_data, page=2)
# Define array data for Page 2 (one-dimensional arrays)
arrays_page2_1d = {
"array_short": [101, 102, 103],
"array_ushort": [104, 105, 106],
"array_ulong": [110, 111, 112],
"array_long64": [113, 114, 115],
"array_ulong64": [116, 117, 118],
"array_float": [119.1, 120.2, 121.3],
"array_double": [122.4, 123.5, 124.6],
"array_string": ["Array4", "Array5", "Array6"],
"array_character": ["P", "Q", "R"],
}
# Populate one-dimensional array data for Page 2
for array_name, array_data in arrays_page2_1d.items():
sdds_obj.setArrayValueList(array_name, array_data, [3], page=2)
# Define array data for Page 2 (two-dimensional array)
arrays_page2_2d = {
"array_long": [107, 108, 109, 207, 208, 209],
}
# Populate two-dimensional array data for Page 2
for array_name, array_data in arrays_page2_2d.items():
sdds_obj.setArrayValueList(array_name, array_data, [2, 3], page=2)
# -------------------------
# Save the SDDS File
# -------------------------
# Save all the defined data into the specified SDDS file
sdds_obj.save(output_file)
if __name__ == "__main__":
main()
Reading an SDDS File
Here’s how to read and inspect an SDDS file:
import sdds
def main():
# Specify the input SDDS file.
input_file = "output_all_data_types.sdds"
# Load the SDDS file into the SDDS object
sdds_obj = sdds.load(input_file)
# Determine and display the file mode: Binary or ASCII
if sdds_obj.mode == sdds.SDDS_BINARY:
print("SDDS file mode: SDDS_BINARY")
else:
print("SDDS file mode: SDDS_ASCII")
# Display the description text if available
if sdds_obj.description[0]:
print(f"SDDS file description text: {sdds_obj.description[0]}")
# Display additional description contents if available
if sdds_obj.description[1]:
print(f"SDDS file description contents: {sdds_obj.description[1]}")
# Check and print parameter definitions if any are present
if sdds_obj.parameterName:
print("\nParameters:")
for i, definition in enumerate(sdds_obj.parameterDefinition):
name = sdds_obj.parameterName[i]
datatype = sdds.sdds_data_type_to_string(definition[4])
units = definition[1]
description = definition[2]
print(f" {name}")
print(f" Datatype: {datatype}", end="")
if units:
print(f", Units: {units}", end="")
if description:
print(f", Description: {description}", end="")
print("") # Newline for readability
# Check and print array definitions if any are present
if sdds_obj.arrayName:
print("\nArrays:")
for i, definition in enumerate(sdds_obj.arrayDefinition):
name = sdds_obj.arrayName[i]
datatype = sdds.sdds_data_type_to_string(definition[5])
units = definition[1]
description = definition[2]
dimensions = definition[7]
print(f" {name}")
print(f" Datatype: {datatype}, Dimensions: {dimensions}", end="")
if units:
print(f", Units: {units}", end="")
if description:
print(f", Description: {description}", end="")
print("") # Newline for readability
# Check and print column definitions if any are present
if sdds_obj.columnName:
print("\nColumns:")
for i, definition in enumerate(sdds_obj.columnDefinition):
name = sdds_obj.columnName[i]
datatype = sdds.sdds_data_type_to_string(definition[4])
units = definition[1]
description = definition[2]
print(f" {name}")
print(f" Datatype: {datatype}", end="")
if units:
print(f", Units: {units}", end="")
if description:
print(f", Description: {description}", end="")
print("") # Newline for readability
# Iterate through each loaded page and display parameter, array, and column data
for page in range(sdds_obj.loaded_pages):
print(f"\nPage: {page + 1}")
# Display parameter data for the current page
for i, name in enumerate(sdds_obj.parameterName):
value = sdds_obj.parameterData[i][page]
print(f" Parameter '{name}': {value}")
# Display array data for the current page
for i, name in enumerate(sdds_obj.arrayName):
value = sdds_obj.arrayData[i][page]
print(f" Array '{name}': {value}")
# Display column data for the current page
for i, name in enumerate(sdds_obj.columnName):
value = sdds_obj.columnData[i][page]
print(f" Column '{name}': {value}")
if __name__ == "__main__":
main()
Documentation
For detailed documentation, examples, and API references, visit the SDDS Python Module Documentation.
License
This project is licensed under the SDDS Toolkit License. See the LICENSE file for details.
Contact
For questions or support, email soliday@anl.gov
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file soliday.sdds-5.7.1-py3-none-manylinux_2_17_x86_64.whl.
File metadata
- Download URL: soliday.sdds-5.7.1-py3-none-manylinux_2_17_x86_64.whl
- Upload date:
- Size: 1.1 MB
- Tags: Python 3, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.0.1 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cb492cd8a179ca8709e8adfb70ca10eab915822ab9ecb619e5ae8c09b2145fff
|
|
| MD5 |
d5ff0a65d664b7eb4ddc4f27469dd534
|
|
| BLAKE2b-256 |
c0de5464b6ad075ceeed0e22298956c5c1c8aa0ddb24e64b571ecee7c077ac03
|
File details
Details for the file soliday.sdds-5.7.1-py3-none-macosx_11_0_x86_64.whl.
File metadata
- Download URL: soliday.sdds-5.7.1-py3-none-macosx_11_0_x86_64.whl
- Upload date:
- Size: 426.9 kB
- Tags: Python 3, macOS 11.0+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.0.1 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
331033287aaffd57221b59641f637ce0758c2463b351c567e61738f785792ab6
|
|
| MD5 |
7a981381384b7d5c232322cf0ea0f14d
|
|
| BLAKE2b-256 |
016a476e7c2486e9f8423096fa0aaf5cc4af68af4972504f9aa52bda9766946b
|
File details
Details for the file soliday.sdds-5.7.1-py3-none-macosx_11_0_arm64.whl.
File metadata
- Download URL: soliday.sdds-5.7.1-py3-none-macosx_11_0_arm64.whl
- Upload date:
- Size: 395.6 kB
- Tags: Python 3, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.0.1 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
696eb0c70098f62d169ad86250a9287ab107c1375666e49174a606c3164eff18
|
|
| MD5 |
1c7bb42f7727684da705ba8d2a3abc2d
|
|
| BLAKE2b-256 |
fbaac7f55c7bd41dec961d0fe59a499198e75fbfed171b20ef41a3bf26d4268e
|
File details
Details for the file soliday.sdds-5.7.1-cp313-none-win_amd64.whl.
File metadata
- Download URL: soliday.sdds-5.7.1-cp313-none-win_amd64.whl
- Upload date:
- Size: 572.4 kB
- Tags: CPython 3.13, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.0.1 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0d94831dbf80a88753914e0f7d973182101d2428b57b791dcab258851b56af4a
|
|
| MD5 |
2b785f336baaebea3932b2737216b043
|
|
| BLAKE2b-256 |
107df53635ec7c5111c44f720449feb0e79887dcc5d3357fd5af10d969b0d7cc
|
File details
Details for the file soliday.sdds-5.7.1-cp312-none-win_amd64.whl.
File metadata
- Download URL: soliday.sdds-5.7.1-cp312-none-win_amd64.whl
- Upload date:
- Size: 572.4 kB
- Tags: CPython 3.12, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.0.1 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2238d9aecf2bf875bba00838df07b863e61cb627637478c122b5efe9d5f8b179
|
|
| MD5 |
85265b471fc722e88df27a5157ffa29b
|
|
| BLAKE2b-256 |
e441e469bcaee6ba90c2622b04731537ed257dddc5e5b64fc92e36928dbbabb2
|
File details
Details for the file soliday.sdds-5.7.1-cp311-none-win_amd64.whl.
File metadata
- Download URL: soliday.sdds-5.7.1-cp311-none-win_amd64.whl
- Upload date:
- Size: 572.4 kB
- Tags: CPython 3.11, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.0.1 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b563f0e22b57adecfeb310326fd610de4049fcf17200a63283ccc1ac2a139d5c
|
|
| MD5 |
89802ddb6f0107ac19cd8ab9faa640e2
|
|
| BLAKE2b-256 |
0dbc4a1a0042b9f9730fb9a644c75b2937b6a642f28f79813fdcb4f8bbbfbfa4
|
File details
Details for the file soliday.sdds-5.7.1-cp310-none-win_amd64.whl.
File metadata
- Download URL: soliday.sdds-5.7.1-cp310-none-win_amd64.whl
- Upload date:
- Size: 572.4 kB
- Tags: CPython 3.10, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.0.1 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9103a6c36c6e7add843d29fb831ffd4266bb52d4a13ef604e72091261d90dd8d
|
|
| MD5 |
1f5349b50f2e468783cf5465fc2e6a03
|
|
| BLAKE2b-256 |
12c1b87e487e69110c3d131e03c030a49027e9d80811734ec14a112428d4eead
|
File details
Details for the file soliday.sdds-5.7.1-cp39-none-win_amd64.whl.
File metadata
- Download URL: soliday.sdds-5.7.1-cp39-none-win_amd64.whl
- Upload date:
- Size: 572.4 kB
- Tags: CPython 3.9, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.0.1 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e7bfa9ee0f109f9aeef84ce1efe9556d7c9f5ddcb5c9b1e8d0acc292b0c33a32
|
|
| MD5 |
292c378082a6f655ec19a0f214401643
|
|
| BLAKE2b-256 |
7b30824e63de5aa52e9b37a062f4191d7306346a39570fb546d54137373b1e47
|