def save(self, session_object): # Cannot type session_object due to a circular dependency # TODO fix circular dependency and add type session_metadata: BehaviorOphysMetadata = \ session_object.api.get_metadata() session_type = session_metadata.session_type nwbfile = NWBFile( session_description=session_type, identifier=str(session_object.ophys_experiment_id), session_start_time=session_metadata.date_of_acquisition, file_create_date=pytz.utc.localize(datetime.datetime.now()), institution="Allen Institute for Brain Science", keywords=[ "2-photon", "calcium imaging", "visual cortex", "behavior", "task" ], experiment_description=get_expt_description(session_type)) # Add stimulus_timestamps to NWB in-memory object: nwb.add_stimulus_timestamps(nwbfile, session_object.stimulus_timestamps) # Add running acquisition ('dx', 'v_sig', 'v_in') data to NWB # This data should be saved to NWB but not accessible directly from # Sessions nwb.add_running_acquisition_to_nwbfile( nwbfile, session_object.api.get_running_acquisition_df()) # Add running data to NWB in-memory object: nwb.add_running_speed_to_nwbfile(nwbfile, session_object.running_speed, name="speed", from_dataframe=True) nwb.add_running_speed_to_nwbfile(nwbfile, session_object.raw_running_speed, name="speed_unfiltered", from_dataframe=True) # Add stimulus template data to NWB in-memory object: # Use the semi-private _stimulus_templates attribute because it is # a StimulusTemplate object. The public stimulus_templates property # of the session_object returns a DataFrame. session_stimulus_templates = session_object._stimulus_templates self._add_stimulus_templates( nwbfile=nwbfile, stimulus_templates=session_stimulus_templates, stimulus_presentations=session_object.stimulus_presentations) # search for omitted rows and add stop_time before writing to NWB file set_omitted_stop_time( stimulus_table=session_object.stimulus_presentations) # Add stimulus presentations data to NWB in-memory object: nwb.add_stimulus_presentations(nwbfile, session_object.stimulus_presentations) # Add trials data to NWB in-memory object: nwb.add_trials(nwbfile, session_object.trials, TRIAL_COLUMN_DESCRIPTION_DICT) # Add licks data to NWB in-memory object: if len(session_object.licks) > 0: nwb.add_licks(nwbfile, session_object.licks) # Add rewards data to NWB in-memory object: if len(session_object.rewards) > 0: nwb.add_rewards(nwbfile, session_object.rewards) # Add max_projection image data to NWB in-memory object: nwb.add_max_projection(nwbfile, session_object.max_projection) # Add average_image image data to NWB in-memory object: nwb.add_average_image(nwbfile, session_object.average_projection) # Add segmentation_mask_image image data to NWB in-memory object: nwb.add_segmentation_mask_image(nwbfile, session_object.segmentation_mask_image) # Add metadata to NWB in-memory object: nwb.add_metadata(nwbfile, session_object.metadata, behavior_only=False) # Add task parameters to NWB in-memory object: nwb.add_task_parameters(nwbfile, session_object.task_parameters) # Add roi metrics to NWB in-memory object: nwb.add_cell_specimen_table(nwbfile, session_object.cell_specimen_table, session_object.metadata) # Add dff to NWB in-memory object: nwb.add_dff_traces(nwbfile, session_object.dff_traces, session_object.ophys_timestamps) # Add corrected_fluorescence to NWB in-memory object: nwb.add_corrected_fluorescence_traces( nwbfile, session_object.corrected_fluorescence_traces) # Add motion correction to NWB in-memory object: nwb.add_motion_correction(nwbfile, session_object.motion_correction) # Add eye tracking and rig geometry to NWB in-memory object # if eye_tracking data exists. if session_object.eye_tracking is not None: self.add_eye_tracking_data_to_nwb( nwbfile, session_object.eye_tracking, session_object.eye_tracking_rig_geometry) # Add events self.add_events(nwbfile=nwbfile, events=session_object.events) # Write the file: with NWBHDF5IO(self.path, 'w') as nwb_file_writer: nwb_file_writer.write(nwbfile) return nwbfile
def test_get_expt_description_raises_with_invalid_session_type(session_type): with pytest.raises(RuntimeError, match="session type should match.*"): get_expt_description(session_type)
def save(self, session_object): session_metadata: BehaviorMetadata = \ session_object.api.get_metadata() session_type = str(session_metadata.session_type) nwbfile = NWBFile( session_description=session_type, identifier=str(session_object.behavior_session_id), session_start_time=session_metadata.date_of_acquisition, file_create_date=pytz.utc.localize(datetime.datetime.now()), institution="Allen Institute for Brain Science", keywords=["visual", "behavior", "task"], experiment_description=get_expt_description(session_type)) # Add stimulus_timestamps to NWB in-memory object: nwb.add_stimulus_timestamps(nwbfile, session_object.stimulus_timestamps) # Add running acquisition ('dx', 'v_sig', 'v_in') data to NWB # This data should be saved to NWB but not accessible directly from # Sessions nwb.add_running_acquisition_to_nwbfile( nwbfile, session_object.api.get_running_acquisition_df()) # Add running data to NWB in-memory object: nwb.add_running_speed_to_nwbfile(nwbfile, session_object.running_speed, name="speed", from_dataframe=True) nwb.add_running_speed_to_nwbfile(nwbfile, session_object.raw_running_speed, name="speed_unfiltered", from_dataframe=True) # Add stimulus template data to NWB in-memory object: # Use the semi-private _stimulus_templates attribute because it is # a StimulusTemplate object. The public stimulus_templates property # of the session_object returns a DataFrame. session_stimulus_templates = session_object._stimulus_templates self._add_stimulus_templates( nwbfile=nwbfile, stimulus_templates=session_stimulus_templates, stimulus_presentations=session_object.stimulus_presentations) # search for omitted rows and add stop_time before writing to NWB file set_omitted_stop_time( stimulus_table=session_object.stimulus_presentations) # Add stimulus presentations data to NWB in-memory object: nwb.add_stimulus_presentations(nwbfile, session_object.stimulus_presentations) # Add trials data to NWB in-memory object: nwb.add_trials(nwbfile, session_object.trials, TRIAL_COLUMN_DESCRIPTION_DICT) # Add licks data to NWB in-memory object: if len(session_object.licks) > 0: nwb.add_licks(nwbfile, session_object.licks) # Add rewards data to NWB in-memory object: if len(session_object.rewards) > 0: nwb.add_rewards(nwbfile, session_object.rewards) # Add metadata to NWB in-memory object: nwb.add_metadata(nwbfile, session_object.metadata, behavior_only=True) # Add task parameters to NWB in-memory object: nwb.add_task_parameters(nwbfile, session_object.task_parameters) # Write the file: with NWBHDF5IO(self.path, 'w') as nwb_file_writer: nwb_file_writer.write(nwbfile) return nwbfile
def test_get_expt_description_with_valid_session_type(session_type, expected_description): obt = get_expt_description(session_type) assert obt == expected_description