Source code for allensdk.brain_observatory.ecephys.write_nwb.nwb_writer

import inspect
import logging
import os
from pathlib import Path
from typing import Union

from pynwb import NWBHDF5IO, NWBFile

from allensdk.brain_observatory.ecephys.behavior_ecephys_session import \
    BehaviorEcephysSession
from allensdk.brain_observatory.nwb.nwb_utils import NWBWriter
from allensdk.core import JsonReadableInterface, NwbReadableInterface, \
    NwbWritableInterface


[docs] class BehaviorEcephysNwbWriter(NWBWriter): """NWB Writer for behavior ecephys. Same as `NWBWriter` except also writes probe NWB files separately """ def __init__( self, session_nwb_filepath: str, session_data: dict, serializer: Union[ JsonReadableInterface, NwbReadableInterface, NwbWritableInterface]): super().__init__( nwb_filepath=session_nwb_filepath, session_data=session_data, serializer=serializer )
[docs] def write_nwb(self, **kwargs): """Tries to write nwb to disk. If it fails, the filepath has ".error" appended Parameters ---------- kwargs: kwargs sent to `from_json`, `from_nwb`, `to_nwb` """ from_json_kwargs = { k: v for k, v in kwargs.items() if k in inspect.signature(self._serializer.from_json).parameters} json_session = self._serializer.from_json( session_data=self._session_data, **from_json_kwargs) try: nwbfile = self._write_nwb( session=json_session, **kwargs) self._compare_sessions(nwbfile=nwbfile, loaded_session=json_session, **kwargs) os.rename(self.nwb_filepath_inprogress, self._nwb_filepath) except Exception as e: if os.path.isfile(self.nwb_filepath_inprogress): os.rename(self.nwb_filepath_inprogress, self._nwb_filepath_error) raise e
def _write_nwb( self, session: BehaviorEcephysSession, **kwargs) -> NWBFile: to_nwb_kwargs = { k: v for k, v in kwargs.items() if k in inspect.signature(self._serializer.to_nwb).parameters} session_nwbfile, probe_nwbfile_map = session.to_nwb(**to_nwb_kwargs) os.makedirs(Path(self.nwb_filepath_inprogress).parent, exist_ok=True) logging.info(f'Writing session NWB file to ' f'{self.nwb_filepath_inprogress}') with NWBHDF5IO(self.nwb_filepath_inprogress, 'w') as nwb_file_writer: nwb_file_writer.write(session_nwbfile) logging.info(f'Wrote session NWB file to ' f'{self.nwb_filepath_inprogress}') for probe_name, probe_nwbfile in probe_nwbfile_map.items(): probe_id = [p.id for p in session.get_probes_obj() if p.name == probe_name][0] if probe_nwbfile is not None: probe_nwb_path = Path(self._nwb_filepath).parent / \ f'lfp_probe_{probe_id}.nwb' logging.info(f'Writing probe NWB file to ' f'{probe_nwb_path}') with NWBHDF5IO(probe_nwb_path, 'w') as nwb_file_writer: nwb_file_writer.write(probe_nwbfile) logging.info(f'Wrote probe NWB file to ' f'{probe_nwb_path}') return session_nwbfile