Packaging Script Example

Here is an example of how you could use this library and it’s functions to build an NWB

  1from simply_nwb.transforms import labjack_load_file, mp4_read_data
  2from simply_nwb import SimpleNWB
  3from simply_nwb.transforms import plaintext_metadata_read
  4from pynwb.file import Subject
  5import pendulum
  6import pickle
  7import os
  8
  9# Simply-NWB Package Documentation
 10# https://simply-nwb.readthedocs.io/en/latest/index.html
 11
 12
 13# Constants at the top of the file for things you might want to change for
 14# different NWBs for flexibility
 15INSTITUTION: str = "InstitutionHere"
 16
 17EXPERIMENTERS: [str] = [
 18    "Lastname, Firstname"
 19]
 20LAB: str = "LabNameHere"
 21
 22EXPERIMENT_DESCRIPTION: str = "Long description of experiment goes here"
 23EXPERIMENT_KEYWORDS: [str] = ["mouse"]
 24EXPERIMENT_RELATED_PUBLICATIONS = None  # optional
 25
 26SESSION_IDENTIFIER: str = "session1"
 27SESSION_DESCRIPTION: str = "sess desc"
 28SUBJECT: Subject = Subject(
 29    subject_id="mouse1",
 30    age="P90D", # ISO-8601 90 days
 31    strain="TypeOfMouse",  # if unknown, put Wild Strain
 32    description="Mouse desc goes here",
 33    sex="M"
 34)
 35
 36SESSION_ROOT: str = "../data/mouse1"
 37METADATA_FILENAME: str = "metadata.txt"
 38
 39LABJACK_FILENAME: str = "labjack/lick1OKRvartest40-4-14-23/data_0.dat"
 40LABJACK_NAME: str = "Labjack Data"
 41LABJACK_SAMPLING_RATE: float = 20.0  # in Hz
 42LABJACK_DESCRIPTION: str = "labjack description here"
 43LABJACK_COMMENTS: str = "labjack comments here"
 44
 45MP4_FILES: {str: str} = {
 46    "RightEye": "movies/righteye.mp4",
 47    "LeftEye": "movies/lefteye.mp4"
 48}
 49MP4_DESCRIPTION: str = "description of mp4 files here"
 50MP4_SAMPLING_RATE: float = 120.0
 51
 52PICKLE_FILENAME: str = "pickledata.pkl"
 53PICKLE_DATA_NAME_PREFIX: str = "data"
 54PICKLE_DATA_DESCRIPTION: str = "desc of data here"
 55
 56
 57def main():
 58    # Parse out the metadata.txt file
 59    metadata = plaintext_metadata_read(os.path.join(SESSION_ROOT, METADATA_FILENAME))
 60    start_date = pendulum.parse(metadata["Date"], tz="local")
 61
 62    # Create the NWB object
 63    nwbfile = SimpleNWB.create_nwb(
 64        session_description=SESSION_DESCRIPTION,
 65        session_start_time=start_date,
 66        experimenter=EXPERIMENTERS,
 67        lab=LAB,
 68        experiment_description=EXPERIMENT_DESCRIPTION,
 69        session_id=SESSION_IDENTIFIER,
 70        institution=INSTITUTION,
 71        keywords=EXPERIMENT_KEYWORDS,
 72        related_publications=EXPERIMENT_RELATED_PUBLICATIONS
 73    )
 74
 75    # Add labjack data to NWB
 76    labjack_filename_absolute = os.path.join(SESSION_ROOT, LABJACK_FILENAME)
 77    labjack_data = labjack_load_file(labjack_filename_absolute)
 78
 79    SimpleNWB.labjack_file_as_behavioral_data(
 80        nwbfile,
 81        labjack_filename=labjack_filename_absolute,
 82        name=LABJACK_NAME,
 83        measured_unit_list=["unit for columns, Time", "v0", "v1", "v2", "v3", "y0", "y1", "y2", "y3"],
 84        start_time=pendulum.parse(labjack_data["date"]),
 85        sampling_rate=LABJACK_SAMPLING_RATE,
 86        description=LABJACK_DESCRIPTION,
 87        comments=LABJACK_COMMENTS
 88    )
 89
 90    # Add pickle data to NWB
 91    pickle_file_obj = open(os.path.join(SESSION_ROOT, PICKLE_FILENAME), "rb")
 92    pickle_data = pickle.load(pickle_file_obj)
 93    SimpleNWB.processing_add_dict(
 94        nwbfile,
 95        processed_name=PICKLE_DATA_NAME_PREFIX,
 96        processed_description=PICKLE_DATA_DESCRIPTION,
 97        data_dict=pickle_data,
 98        uneven_columns=True
 99    )
100
101    # Access the data like this: (where missingDataMask is part of the pickle file)
102    # nwb.processing["misc"]["NAMEHERE_missingDataMask"]["missingDataMask"].data[0]["left"]
103    # nwb.processing["misc"]["NAMEHERE_eyePositionUncorrected"]["eyePositionUncorrected"].data[:]
104
105    # Add mp4 data to NWB
106    for mp4_name, mp4_filename in MP4_FILES.items():
107        data, frames = mp4_read_data(os.path.join(SESSION_ROOT, mp4_filename))
108        SimpleNWB.mp4_add_as_behavioral(
109            nwbfile,
110            name=mp4_name,
111            numpy_data=data,
112            frame_count=frames,
113            sampling_rate=MP4_SAMPLING_RATE,
114            description=MP4_DESCRIPTION
115        )
116
117    now = pendulum.now()
118    SimpleNWB.write(nwbfile, "nwb-{}-{}_{}".format(now.month, now.day, now.hour))
119
120
121if __name__ == "__main__":
122    main()