# simplemseed
[![PyPI](https://img.shields.io/pypi/v/simplemseed)](https://pypi.org/project/simplemseed/)
[![Documentation Status](https://readthedocs.org/projects/simplemseed/badge/?version=latest)](https://simplemseed.readthedocs.io/en/latest/?badge=latest)
[Miniseed3](http://docs.fdsn.org/projects/miniseed3) (and miniseed2) in pure python.
Read the docs at [readthedocs](https://simplemseed.readthedocs.io/en/latest/)
# Installation
`simplemseed` can be installed in conda environments from [conda-forge](https://conda-forge.org/docs/user/introduction/#how-can-i-install-packages-from-conda-forge) ..
```
$ conda install --channel conda-forge simplemseed
```
.. or from [pypi](https://pypi.org/project/simplemseed/) using `pip`:
```
$ pip install simplemseed
```
# Miniseed3
Write and read mseed3 records like:
```python
#!/usr/bin/env python3
from simplemseed import MSeed3Header, MSeed3Record, FDSNSourceId, readMSeed3Records
data = [(i % 99 - 49) for i in range(0, 1000)]
header = MSeed3Header()
header.starttime = "2024-01-01T15:13:55.123456Z"
header.sampleRatePeriod = 20
sid = FDSNSourceId.createUnknown(header.sampleRatePeriod)
ms3record = MSeed3Record(header, sid, data)
ms3filename = "test.ms3"
with open(ms3filename, "wb") as of:
of.write(ms3record.pack())
print(f" save: {ms3record.details()} ")
print(f" to: {ms3filename} ")
print()
with open(ms3filename, "rb") as infile:
for readms3record in readMSeed3Records(infile):
print(f" extract: {readms3record.details()} ")
print(f" from: {ms3filename} ")
```
Access uncompressed timeseries data as numpy ndarray with:
```python
dataArray = ms3record.decompress()
```
Also includes compression and decompression
for primitive data arrays and
for Steim1 and Steim2, in pure python.
# Miniseed2:
Read miniseed2 with:
```python
with open(ms2filename, "rb") as inms2:
for ms2rec in simplemseed.readMiniseed2Records(inms2):
print(ms2rec.summary())
```
or read and convert to miniseed3:
```python
with open(ms3filename, "wb") as outms3:
with open(ms2filename, "rb") as inms2:
for ms2rec in simplemseed.readMiniseed2Records(inms2):
ms3rec = simplemseed.mseed2to3(ms2rec)
outms3.write(ms3rec.pack())
```
# Command line tools:
## Miniseed3 Details
Print details about each miniseed3 record
```
mseed3details casee.mseed3
FDSN:CO_CASEE_00_H_H_Z, version 4, 285 bytes (format: 3)
start time: 2023-06-17T04:53:54.468392Z (168)
number of samples: 104
sample rate (Hz): 100.0
flags: [00000000] 8 bits$
CRC: 0x4D467F27
extra header length: 31 bytes
data payload length: 192 bytes
payload encoding: STEIM-2 integer compression (val: 11)
extra headers:
Total 104 samples in 1 records
```
## Getting and setting extra header values
```
% mseed3details --get "/FDSN/Time" casee_two.ms3
{"Quality": 0}
% mseed3details --getall "/FDSN/Time/Quality" casee_two.ms3 --verbose
file: casee_two.ms3
FDSN:CO_CASEE_00_H_H_Z 2023-06-17T04:53:50.008392Z 2023-06-17T04:53:50.178392Z (18 pts)
0
FDSN:CO_CASEE_00_H_H_Z 2023-06-17T04:53:50.188392Z 2023-06-17T04:53:55.498392Z (532 pts)
0
% mseed3details --set "/data" '{ "key": "val", "keyb": 3 }' casee_two.ms3
% mseed3details --getall "/data" casee_two.ms3 --verbose
file: casee_two.ms3
FDSN:CO_CASEE_00_H_H_Z 2023-06-17T04:53:50.008392Z 2023-06-17T04:53:50.178392Z (18 pts)
{"key": "val", "keyb": 3}
FDSN:CO_CASEE_00_H_H_Z 2023-06-17T04:53:50.188392Z 2023-06-17T04:53:55.498392Z (532 pts)
pointer not found in extra headers
% mseed3details --setall "/data" '{ "key": "else", "keyb": 4 }' casee_two.ms3
% mseed3details --set "/data/keyb" 42 casee_two.ms3
% mseed3details --getall "/data" casee_two.ms3 --verbose
file: casee_two.ms3
FDSN:CO_CASEE_00_H_H_Z 2023-06-17T04:53:50.008392Z 2023-06-17T04:53:50.178392Z (18 pts)
{"key": "else", "keyb": 42}
FDSN:CO_CASEE_00_H_H_Z 2023-06-17T04:53:50.188392Z 2023-06-17T04:53:55.498392Z (532 pts)
{"key": "else", "keyb": 4}
```
## Merge mseed3 records
- merge contiguous, in order, mseed3 records into larger records. Decompression
is needed as steim1 and 2 cannot be merged without decompression, primitive
types are already decompressed.
```
mseed3merge -o merged.ms3 --decomp bird_jsc.ms3
```
## Convert miniseed 2 to miniseed3.
Note most blockettes are ignored, other than 100, 1000, 1001
```
mseed2to3 --ms2 casee.ms2 --ms3 casee.ms3
```
## FDSN sourceid
Parse FDSN [sourceids](http://docs.fdsn.org/projects/source-identifiers/en/v1.0/)
Split a FDSN source id:
```
fdsnsourceid FDSN:CO_JSC_00_H_H_Z
FDSN:CO_JSC_00_H_H_Z
Net: CO
Sta: JSC
Loc: 00
Band: H - High Broadband, >= 80 to < 250 Hz, response period >= 10 sec
Source: H - High Gain Seismometer
Subsource: Z
```
Describe a band code:
```
fdsnsourceid -b Q
Band: Q - Q - Greater than 10 days , < 0.000001 Hz
```
Find the correct band code for a sample rate:
```
fdsnsourceid --sps 87
Rate: 87.0 - H - H - High Broadband , >= 80 to < 250 Hz, response period >= 10 sec
Rate: 87.0 - E - E - Extremely Short Period, >= 80 to < 250 Hz, response period < 10 sec
```
Describe a source code:
```
fdsnsourceid --source H N
Source: H - High Gain Seismometer
Measures displacement/velocity/acceleration along a line defined by the the dip and azimuth.
Source: N - Accelerometer
Measures displacement/velocity/acceleration along a line defined by the the dip and azimuth.
```
# Examples
There are more examples in the
[examples](https://github.com/crotwell/simplemseed/tree/main/examples) directory.
Raw data
{
"_id": null,
"home_page": null,
"name": "simplemseed",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": null,
"keywords": "fdsn, miniseed, miniseed3, seed, sourceid, steim1, steim2",
"author": null,
"author_email": "Philip Crotwell <crotwell@seis.sc.edu>",
"download_url": "https://files.pythonhosted.org/packages/2f/b5/d6c616cb2472f8b4771f74d8e2bd02757149499568660f518b8f18d89032/simplemseed-0.4.1.tar.gz",
"platform": null,
"description": "# simplemseed\n\n\n[![PyPI](https://img.shields.io/pypi/v/simplemseed)](https://pypi.org/project/simplemseed/)\n[![Documentation Status](https://readthedocs.org/projects/simplemseed/badge/?version=latest)](https://simplemseed.readthedocs.io/en/latest/?badge=latest)\n\n[Miniseed3](http://docs.fdsn.org/projects/miniseed3) (and miniseed2) in pure python.\n\nRead the docs at [readthedocs](https://simplemseed.readthedocs.io/en/latest/)\n\n# Installation\n\n`simplemseed` can be installed in conda environments from [conda-forge](https://conda-forge.org/docs/user/introduction/#how-can-i-install-packages-from-conda-forge) ..\n\n```\n$ conda install --channel conda-forge simplemseed\n```\n\n.. or from [pypi](https://pypi.org/project/simplemseed/) using `pip`:\n\n\n```\n$ pip install simplemseed\n```\n\n# Miniseed3\n\nWrite and read mseed3 records like:\n\n```python\n#!/usr/bin/env python3\n\nfrom simplemseed import MSeed3Header, MSeed3Record, FDSNSourceId, readMSeed3Records\n\ndata = [(i % 99 - 49) for i in range(0, 1000)]\nheader = MSeed3Header()\nheader.starttime = \"2024-01-01T15:13:55.123456Z\"\nheader.sampleRatePeriod = 20\nsid = FDSNSourceId.createUnknown(header.sampleRatePeriod)\nms3record = MSeed3Record(header, sid, data)\n\nms3filename = \"test.ms3\"\nwith open(ms3filename, \"wb\") as of:\n of.write(ms3record.pack())\n print(f\" save: {ms3record.details()} \")\n print(f\" to: {ms3filename} \")\nprint()\nwith open(ms3filename, \"rb\") as infile:\n for readms3record in readMSeed3Records(infile):\n print(f\" extract: {readms3record.details()} \")\n print(f\" from: {ms3filename} \")\n```\n\nAccess uncompressed timeseries data as numpy ndarray with:\n```python\ndataArray = ms3record.decompress()\n```\n\n\nAlso includes compression and decompression\nfor primitive data arrays and\nfor Steim1 and Steim2, in pure python.\n\n# Miniseed2:\n\nRead miniseed2 with:\n```python\nwith open(ms2filename, \"rb\") as inms2:\n for ms2rec in simplemseed.readMiniseed2Records(inms2):\n print(ms2rec.summary())\n```\nor read and convert to miniseed3:\n```python\nwith open(ms3filename, \"wb\") as outms3:\n with open(ms2filename, \"rb\") as inms2:\n for ms2rec in simplemseed.readMiniseed2Records(inms2):\n ms3rec = simplemseed.mseed2to3(ms2rec)\n outms3.write(ms3rec.pack())\n```\n\n# Command line tools:\n\n\n## Miniseed3 Details\n\nPrint details about each miniseed3 record\n\n```\nmseed3details casee.mseed3\n FDSN:CO_CASEE_00_H_H_Z, version 4, 285 bytes (format: 3)\n start time: 2023-06-17T04:53:54.468392Z (168)\n number of samples: 104\n sample rate (Hz): 100.0\n flags: [00000000] 8 bits$\n CRC: 0x4D467F27\n extra header length: 31 bytes\n data payload length: 192 bytes\n payload encoding: STEIM-2 integer compression (val: 11)\n extra headers:\n\nTotal 104 samples in 1 records\n```\n\n## Getting and setting extra header values\n\n```\n% mseed3details --get \"/FDSN/Time\" casee_two.ms3\n {\"Quality\": 0}\n% mseed3details --getall \"/FDSN/Time/Quality\" casee_two.ms3 --verbose\nfile: casee_two.ms3\nFDSN:CO_CASEE_00_H_H_Z 2023-06-17T04:53:50.008392Z 2023-06-17T04:53:50.178392Z (18 pts)\n 0\nFDSN:CO_CASEE_00_H_H_Z 2023-06-17T04:53:50.188392Z 2023-06-17T04:53:55.498392Z (532 pts)\n 0\n% mseed3details --set \"/data\" '{ \"key\": \"val\", \"keyb\": 3 }' casee_two.ms3\n% mseed3details --getall \"/data\" casee_two.ms3 --verbose\nfile: casee_two.ms3\nFDSN:CO_CASEE_00_H_H_Z 2023-06-17T04:53:50.008392Z 2023-06-17T04:53:50.178392Z (18 pts)\n {\"key\": \"val\", \"keyb\": 3}\nFDSN:CO_CASEE_00_H_H_Z 2023-06-17T04:53:50.188392Z 2023-06-17T04:53:55.498392Z (532 pts)\n pointer not found in extra headers\n% mseed3details --setall \"/data\" '{ \"key\": \"else\", \"keyb\": 4 }' casee_two.ms3\n% mseed3details --set \"/data/keyb\" 42 casee_two.ms3\n% mseed3details --getall \"/data\" casee_two.ms3 --verbose\nfile: casee_two.ms3\nFDSN:CO_CASEE_00_H_H_Z 2023-06-17T04:53:50.008392Z 2023-06-17T04:53:50.178392Z (18 pts)\n {\"key\": \"else\", \"keyb\": 42}\nFDSN:CO_CASEE_00_H_H_Z 2023-06-17T04:53:50.188392Z 2023-06-17T04:53:55.498392Z (532 pts)\n {\"key\": \"else\", \"keyb\": 4}\n```\n\n## Merge mseed3 records\n- merge contiguous, in order, mseed3 records into larger records. Decompression\nis needed as steim1 and 2 cannot be merged without decompression, primitive\ntypes are already decompressed.\n```\nmseed3merge -o merged.ms3 --decomp bird_jsc.ms3\n```\n\n## Convert miniseed 2 to miniseed3.\n\nNote most blockettes are ignored, other than 100, 1000, 1001\n\n```\nmseed2to3 --ms2 casee.ms2 --ms3 casee.ms3\n```\n\n\n## FDSN sourceid\n\nParse FDSN [sourceids](http://docs.fdsn.org/projects/source-identifiers/en/v1.0/)\n\nSplit a FDSN source id:\n```\nfdsnsourceid FDSN:CO_JSC_00_H_H_Z\n FDSN:CO_JSC_00_H_H_Z\n Net: CO\n Sta: JSC\n Loc: 00\n Band: H - High Broadband, >= 80 to < 250 Hz, response period >= 10 sec\n Source: H - High Gain Seismometer\n Subsource: Z\n``` \n\nDescribe a band code:\n```\nfdsnsourceid -b Q\n Band: Q - Q - Greater than 10 days , < 0.000001 Hz\n```\n\nFind the correct band code for a sample rate:\n```\nfdsnsourceid --sps 87\n Rate: 87.0 - H - H - High Broadband , >= 80 to < 250 Hz, response period >= 10 sec\n Rate: 87.0 - E - E - Extremely Short Period, >= 80 to < 250 Hz, response period < 10 sec\n```\n\nDescribe a source code:\n```\nfdsnsourceid --source H N\n Source: H - High Gain Seismometer\n Measures displacement/velocity/acceleration along a line defined by the the dip and azimuth.\n Source: N - Accelerometer\n Measures displacement/velocity/acceleration along a line defined by the the dip and azimuth.\n```\n\n# Examples\n\nThere are more examples in the\n[examples](https://github.com/crotwell/simplemseed/tree/main/examples) directory.\n",
"bugtrack_url": null,
"license": null,
"summary": "miniseed3 in pure python",
"version": "0.4.1",
"project_urls": {
"Documentation": "https://simplemseed.readthedocs.io/en/latest/",
"Homepage": "https://github.com/crotwell/simplemseed",
"Issues": "https://github.com/crotwell/simplemseed/issues",
"Repository": "https://github.com/crotwell/simplemseed"
},
"split_keywords": [
"fdsn",
" miniseed",
" miniseed3",
" seed",
" sourceid",
" steim1",
" steim2"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "af3b612dd653d2d1450de35139cec9cb1086acdf96e635c15a9c2d3b46b83f4f",
"md5": "2cd7df71a88aa8fa203566a07f0e3111",
"sha256": "ecc6cc972cdf47b9de71d1cb306fe54549dac1f663ab2e2f6301d44ac9df5423"
},
"downloads": -1,
"filename": "simplemseed-0.4.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "2cd7df71a88aa8fa203566a07f0e3111",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9",
"size": 51829,
"upload_time": "2024-12-16T17:22:19",
"upload_time_iso_8601": "2024-12-16T17:22:19.727871Z",
"url": "https://files.pythonhosted.org/packages/af/3b/612dd653d2d1450de35139cec9cb1086acdf96e635c15a9c2d3b46b83f4f/simplemseed-0.4.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "2fb5d6c616cb2472f8b4771f74d8e2bd02757149499568660f518b8f18d89032",
"md5": "b960d4b8be69f1164d917b777bbf3ee7",
"sha256": "f99b5b8ae62703d1b36308afaa5908396c6c3a8dd033bd4a6b804af955adec74"
},
"downloads": -1,
"filename": "simplemseed-0.4.1.tar.gz",
"has_sig": false,
"md5_digest": "b960d4b8be69f1164d917b777bbf3ee7",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 341196,
"upload_time": "2024-12-16T17:22:22",
"upload_time_iso_8601": "2024-12-16T17:22:22.180405Z",
"url": "https://files.pythonhosted.org/packages/2f/b5/d6c616cb2472f8b4771f74d8e2bd02757149499568660f518b8f18d89032/simplemseed-0.4.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-12-16 17:22:22",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "crotwell",
"github_project": "simplemseed",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "simplemseed"
}