# ndx-acquisition-module
[![pipeline status](https://img.shields.io/gitlab/pipeline-status/fleischmann-lab/ndx/ndx-acquisition-module?branch=main&label=pipeline&style=for-the-badge)](https://gitlab.com/fleischmann-lab/ndx/ndx-acquisition-module/-/commits/main)
[![release](https://img.shields.io/gitlab/v/release/fleischmann-lab/ndx/ndx-acquisition-module?label=release&sort=date&style=for-the-badge)](https://gitlab.com/fleischmann-lab/ndx/ndx-acquisition-module/-/releases)
[![pypi package](https://img.shields.io/pypi/v/ndx-acquisition-module?label=pypi%20package&style=for-the-badge&color=blue)](https://pypi.org/pypi/ndx-acquisition-module)
[![license](https://img.shields.io/gitlab/license/fleischmann-lab/ndx/ndx-acquisition-module?color=yellow&label=license&style=for-the-badge)](LICENSE.txt)
This extension is used to allow adding modules in `nwbfile.acquisition`, similarly to how `nwbfile.processing` allows adding modules.
More specifically, this allows creating a module that has `TimeSeries` and `DynamicTable` objects, then users can add this module.
This is in alpha development stages. Please use with discretion.
[TOC]
## Requirement
The requirements and additional development requirements can be seen in [`pyproject.toml`](pyproject.toml) file.
Here are the minimum requirements:
- `python >=3.8`
- `pynwb>=1.5.0,<3`
- `hdmf>=3.4.7,<4`
## Installation
### Via `pip`
```bash
pip install ndx-acquisition-module
```
### Via `git`
```bash
pip install git+https://gitlab.com/fleischmann-lab/ndx/ndx-acquisition-module
```
## Usage
### Main usage
```python
from ndx_acquisition_module import AcquisitionModule
mod = AcquisitionModule(name="raw_mod", description="raw acq module")
# Add data objects to created AcquisitionModule
mod.add(time_series) # add time series
mod.add(dynamic_table) # add dynamic table
# Add AcquisitionModule to nwbfile.acquisition
nwbfile.add_acquisition(mod)
```
### Full example
```python
from datetime import datetime
import numpy as np
from dateutil import tz
from hdmf.common import DynamicTable, VectorData
from ndx_acquisition_module import AcquisitionModule
from pynwb import NWBHDF5IO, NWBFile, TimeSeries
# Create an example NWBFile
nwbfile = NWBFile(
session_description="test session description",
identifier="unique_identifier",
session_start_time=datetime(2012, 2, 21, tzinfo=tz.gettz("US/Pacific")),
)
# Create time series
ts = TimeSeries(
name="choice_series",
description="raw choice series",
data=np.random.randint(4, size=100),
timestamps=(np.arange(100).astype("float") + 2) / 30,
unit="-",
)
# Create dynamic table
tbl = DynamicTable(
name="lookup_table",
description="lookup table for `choice_series`",
columns=[
VectorData(
name="lookup_id", description="ID to look up", data=[0, 1, 2, 3]
),
VectorData(
name="lookup_name",
description="name of ID",
data=["water", "earth", "fire", "air"],
),
],
)
# Create AcquisitionModule to store these objects
mod = AcquisitionModule(name="raw_mod", description="raw acq module")
# Add data objects to created AcquisitionModule
mod.add(ts) # add time series
mod.add(tbl) # add dynamic table
# Add AcquisitionModule to nwbfile.acquisition
nwbfile.add_acquisition(mod)
# Write the file to disk
filename = "test.nwb"
with NWBHDF5IO(path=filename, mode="w") as io:
io.write(nwbfile)
```
### API usage notes
#### With package installed
Currently to use `mod.get(<object_name>)` or `mod[<object_name>]`, users would also need to install this package.
```bash
pip install git+https://gitlab.com/fleischmann-lab/ndx/ndx-acquisition-module
```
And import, using `NWBHDF5IO(..., load_namespaces=True)` would not be enough.
```python
# new file completely
from pynwb import NWBHDF5IO
from ndx_acquisition_module import AcquisitionModule
nwb = NWBHDF5IO('test.nwb', mode='r').read() # notice `load_namepsaces` is not needed
print(nwb.acquisition['raw_mod'])
```
which outputs:
```text
raw_mod ndx_acquisition_module.AcquisitionModule at 0x139742592581104
Fields:
data_interfaces: {
choice_series <class 'pynwb.base.TimeSeries'>,
lookup_table <class 'hdmf.common.table.DynamicTable'>
}
```
To access:
```python
nwb.acquisition['raw_mod']['lookup_table']
nwb.acquisition['raw_mod']['choice_series']
```
#### Without package installed
Otherwise, if `ndx-acquisition-module` is not installed, accessing the inside objects have to be done based on types:
```python
# new file completely
from pynwb import NWBHDF5IO
nwb = NWBHDF5IO('test.nwb', mode='r', load_namespaces=True).read() # notice `load_namepsaces` is NEEDED
print(nwb.acquisition['raw_mod'])
```
which outputs:
```text
raw_mod abc.AcquisitionModule at 0x140252603705728
Fields:
description: raw acq module
dynamic_tables: {
lookup_table <class 'hdmf.common.table.DynamicTable'>
}
nwb_data_interfaces: {
choice_series <class 'pynwb.base.TimeSeries'>
}
```
To access:
```python
nwb.acquisition['raw_mod'].dynamic_tables['lookup_table']
nwb.acquisition['raw_mod'].nwb_data_interfaces['choice_series']
```
## TODOs
- [ ] Figure out how to allow consistent access even if package is not installed, so that using `load_namespaces=True` is sufficient.
- [ ] Edit `sphinx` deploy stage
- [x] Publish on `pypi`
- [ ] Publish on `conda`
---
This extension was created using [ndx-template](https://github.com/nwb-extensions/ndx-template).
Raw data
{
"_id": null,
"home_page": "",
"name": "ndx-acquisition-module",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": "Tuan Pham <tuanhpham@brown.edu>",
"keywords": "NeurodataWithoutBorders,NWB,nwb-extension,ndx-extension",
"author": "",
"author_email": "Tuan Pham <tuanhpham@brown.edu>",
"download_url": "https://files.pythonhosted.org/packages/a1/ef/fa528d0f1c3a926c1a939beca8985d3b75858f40670e1f7f8f86a88267c0/ndx-acquisition-module-0.1.1.tar.gz",
"platform": null,
"description": "# ndx-acquisition-module\n\n[![pipeline status](https://img.shields.io/gitlab/pipeline-status/fleischmann-lab/ndx/ndx-acquisition-module?branch=main&label=pipeline&style=for-the-badge)](https://gitlab.com/fleischmann-lab/ndx/ndx-acquisition-module/-/commits/main)\n[![release](https://img.shields.io/gitlab/v/release/fleischmann-lab/ndx/ndx-acquisition-module?label=release&sort=date&style=for-the-badge)](https://gitlab.com/fleischmann-lab/ndx/ndx-acquisition-module/-/releases)\n[![pypi package](https://img.shields.io/pypi/v/ndx-acquisition-module?label=pypi%20package&style=for-the-badge&color=blue)](https://pypi.org/pypi/ndx-acquisition-module)\n[![license](https://img.shields.io/gitlab/license/fleischmann-lab/ndx/ndx-acquisition-module?color=yellow&label=license&style=for-the-badge)](LICENSE.txt)\n\nThis extension is used to allow adding modules in `nwbfile.acquisition`, similarly to how `nwbfile.processing` allows adding modules.\n\nMore specifically, this allows creating a module that has `TimeSeries` and `DynamicTable` objects, then users can add this module.\n\nThis is in alpha development stages. Please use with discretion.\n\n[TOC]\n\n## Requirement\n\nThe requirements and additional development requirements can be seen in [`pyproject.toml`](pyproject.toml) file.\n\nHere are the minimum requirements:\n\n- `python >=3.8`\n- `pynwb>=1.5.0,<3`\n- `hdmf>=3.4.7,<4`\n\n## Installation\n\n### Via `pip`\n\n```bash\npip install ndx-acquisition-module\n```\n\n### Via `git`\n\n```bash\npip install git+https://gitlab.com/fleischmann-lab/ndx/ndx-acquisition-module\n```\n\n## Usage\n\n### Main usage\n\n```python\nfrom ndx_acquisition_module import AcquisitionModule\n\nmod = AcquisitionModule(name=\"raw_mod\", description=\"raw acq module\")\n\n# Add data objects to created AcquisitionModule\nmod.add(time_series) # add time series\nmod.add(dynamic_table) # add dynamic table\n\n# Add AcquisitionModule to nwbfile.acquisition\nnwbfile.add_acquisition(mod)\n```\n\n### Full example\n\n```python\nfrom datetime import datetime\n\nimport numpy as np\nfrom dateutil import tz\nfrom hdmf.common import DynamicTable, VectorData\nfrom ndx_acquisition_module import AcquisitionModule\n\nfrom pynwb import NWBHDF5IO, NWBFile, TimeSeries\n\n# Create an example NWBFile\nnwbfile = NWBFile(\n session_description=\"test session description\",\n identifier=\"unique_identifier\",\n session_start_time=datetime(2012, 2, 21, tzinfo=tz.gettz(\"US/Pacific\")),\n)\n\n# Create time series\nts = TimeSeries(\n name=\"choice_series\",\n description=\"raw choice series\",\n data=np.random.randint(4, size=100),\n timestamps=(np.arange(100).astype(\"float\") + 2) / 30,\n unit=\"-\",\n)\n\n# Create dynamic table\ntbl = DynamicTable(\n name=\"lookup_table\",\n description=\"lookup table for `choice_series`\",\n columns=[\n VectorData(\n name=\"lookup_id\", description=\"ID to look up\", data=[0, 1, 2, 3]\n ),\n VectorData(\n name=\"lookup_name\",\n description=\"name of ID\",\n data=[\"water\", \"earth\", \"fire\", \"air\"],\n ),\n ],\n)\n\n# Create AcquisitionModule to store these objects\nmod = AcquisitionModule(name=\"raw_mod\", description=\"raw acq module\")\n\n# Add data objects to created AcquisitionModule\nmod.add(ts) # add time series\nmod.add(tbl) # add dynamic table\n\n# Add AcquisitionModule to nwbfile.acquisition\nnwbfile.add_acquisition(mod)\n\n# Write the file to disk\nfilename = \"test.nwb\"\nwith NWBHDF5IO(path=filename, mode=\"w\") as io:\n io.write(nwbfile)\n\n```\n\n### API usage notes\n\n#### With package installed\n\nCurrently to use `mod.get(<object_name>)` or `mod[<object_name>]`, users would also need to install this package.\n\n```bash\npip install git+https://gitlab.com/fleischmann-lab/ndx/ndx-acquisition-module\n```\n\nAnd import, using `NWBHDF5IO(..., load_namespaces=True)` would not be enough.\n\n```python\n# new file completely\nfrom pynwb import NWBHDF5IO\nfrom ndx_acquisition_module import AcquisitionModule\nnwb = NWBHDF5IO('test.nwb', mode='r').read() # notice `load_namepsaces` is not needed\n\nprint(nwb.acquisition['raw_mod'])\n```\n\nwhich outputs:\n\n```text\nraw_mod ndx_acquisition_module.AcquisitionModule at 0x139742592581104\nFields:\n data_interfaces: {\n choice_series <class 'pynwb.base.TimeSeries'>,\n lookup_table <class 'hdmf.common.table.DynamicTable'>\n }\n```\n\nTo access:\n\n```python\nnwb.acquisition['raw_mod']['lookup_table']\nnwb.acquisition['raw_mod']['choice_series']\n```\n\n#### Without package installed\n\nOtherwise, if `ndx-acquisition-module` is not installed, accessing the inside objects have to be done based on types:\n\n```python\n# new file completely\nfrom pynwb import NWBHDF5IO\nnwb = NWBHDF5IO('test.nwb', mode='r', load_namespaces=True).read() # notice `load_namepsaces` is NEEDED\n\nprint(nwb.acquisition['raw_mod'])\n```\n\nwhich outputs:\n\n```text\nraw_mod abc.AcquisitionModule at 0x140252603705728\nFields:\n description: raw acq module\n dynamic_tables: {\n lookup_table <class 'hdmf.common.table.DynamicTable'>\n }\n nwb_data_interfaces: {\n choice_series <class 'pynwb.base.TimeSeries'>\n }\n```\n\nTo access:\n\n```python\nnwb.acquisition['raw_mod'].dynamic_tables['lookup_table']\nnwb.acquisition['raw_mod'].nwb_data_interfaces['choice_series']\n```\n\n## TODOs\n\n- [ ] Figure out how to allow consistent access even if package is not installed, so that using `load_namespaces=True` is sufficient.\n- [ ] Edit `sphinx` deploy stage\n- [x] Publish on `pypi`\n- [ ] Publish on `conda`\n\n---\n\nThis extension was created using [ndx-template](https://github.com/nwb-extensions/ndx-template).\n",
"bugtrack_url": null,
"license": "BSD-3",
"summary": "Extension to add acquisition module",
"version": "0.1.1",
"split_keywords": [
"neurodatawithoutborders",
"nwb",
"nwb-extension",
"ndx-extension"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "fd73a7097d2025be31f0e811baf1c8ee89c302384942b215e57428ca04e3092d",
"md5": "30da556d63ce58797c9a7f9afa83377e",
"sha256": "93b97bc56b9a773faa57b40a43ab8ae5a5872a7214e1332945831c65a5a77381"
},
"downloads": -1,
"filename": "ndx_acquisition_module-0.1.1-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "30da556d63ce58797c9a7f9afa83377e",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": ">=3.8",
"size": 6549,
"upload_time": "2023-02-01T00:27:25",
"upload_time_iso_8601": "2023-02-01T00:27:25.252552Z",
"url": "https://files.pythonhosted.org/packages/fd/73/a7097d2025be31f0e811baf1c8ee89c302384942b215e57428ca04e3092d/ndx_acquisition_module-0.1.1-py2.py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "a1effa528d0f1c3a926c1a939beca8985d3b75858f40670e1f7f8f86a88267c0",
"md5": "a8962e6a04237bca811d136728ef21b2",
"sha256": "25c13bd6d8c3437f7ef20c4a7caf26f574ee1160a704683e8e579f9bcdcb37be"
},
"downloads": -1,
"filename": "ndx-acquisition-module-0.1.1.tar.gz",
"has_sig": false,
"md5_digest": "a8962e6a04237bca811d136728ef21b2",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 15780,
"upload_time": "2023-02-01T00:27:26",
"upload_time_iso_8601": "2023-02-01T00:27:26.911158Z",
"url": "https://files.pythonhosted.org/packages/a1/ef/fa528d0f1c3a926c1a939beca8985d3b75858f40670e1f7f8f86a88267c0/ndx-acquisition-module-0.1.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-02-01 00:27:26",
"github": false,
"gitlab": false,
"bitbucket": false,
"lcname": "ndx-acquisition-module"
}