Source code for ipfx.dataset.create
from typing import Optional, Dict, Any
import re
from pathlib import Path
import h5py
import numpy as np
import allensdk.core.json_utilities as ju
from ipfx.dataset.ephys_data_set import EphysDataSet
from ipfx.stimulus import StimulusOntology
from ipfx.dataset.hbg_nwb_data import HBGNWBData
from ipfx.dataset.mies_nwb_data import MIESNWBData
from ipfx.string_utils import to_str
from ipfx.dataset.labnotebook import LabNotebookReaderIgorNwb
[docs]def get_scalar_value(dataset_from_nwb):
"""
Some values in NWB are stored as scalar whereas others as np.ndarrays with
dimension 1. Use this function to retrieve the scalar value itself.
"""
if isinstance(dataset_from_nwb, np.ndarray):
return dataset_from_nwb.item()
return dataset_from_nwb
[docs]def is_file_mies(path: str) -> bool:
with h5py.File(path, "r") as fil:
if "generated_by" in fil["general"].keys():
generated_by = dict(fil["general"]["generated_by"][:])
return generated_by.get("Package", "None") == "MIES"
return False
[docs]def get_nwb_version(nwb_file: str) -> Dict[str, Any]:
"""
Find version of the nwb file
Parameters
----------
nwb_file
Returns
-------
dict in the format:
{
`major`: str
`full` str.
}
"""
with h5py.File(nwb_file, 'r') as f:
if "nwb_version" in f: # In version 0 and 1 this is a dataset
nwb_version = get_scalar_value(f["nwb_version"][()])
nwb_version_str = to_str(nwb_version)
if nwb_version is not None and re.match("^NWB-", nwb_version_str):
return {
"major": int(nwb_version_str[4]),
"full": nwb_version_str
}
elif "nwb_version" in f.attrs: # in version 2 this is an attribute
nwb_version_str = to_str(f.attrs["nwb_version"])
if nwb_version_str is not None and (
re.match("^2", nwb_version_str) or
re.match("^NWB-2", nwb_version_str)
):
return {"major": 2, "full": nwb_version_str}
return {"major": None, "full": None}
[docs]def create_ephys_data_set(
nwb_file: str,
sweep_info: Optional[Dict[str, Any]] = None,
ontology: Optional[str] = None
) -> EphysDataSet:
"""
Create an ephys data set with the appropriate nwbdata reader class
Parameters
----------
nwb_file
sweep_info
ontology
Returns
-------
EphysDataSet
"""
nwb_version = get_nwb_version(nwb_file)
is_mies = is_file_mies(nwb_file)
if not ontology:
ontology = StimulusOntology.DEFAULT_STIMULUS_ONTOLOGY_FILE
if isinstance(ontology, (str, Path)):
ontology = StimulusOntology(ju.read(ontology))
if nwb_version["major"] == 2:
if is_mies:
labnotebook = LabNotebookReaderIgorNwb(nwb_file)
nwb_data = MIESNWBData(nwb_file, labnotebook, ontology)
else:
nwb_data = HBGNWBData(nwb_file, ontology)
else:
raise ValueError(
"Unsupported or unknown NWB major version {} ({})".format(
nwb_version["major"], nwb_version["full"]
)
)
return EphysDataSet(
sweep_info=sweep_info,
data=nwb_data,
)