LorenFrankLab / spyglass

Neuroscience data analysis framework for reproducible research built by Loren Frank Lab at UCSF
https://lorenfranklab.github.io/spyglass/
MIT License
81 stars 40 forks source link

merged_sorting_extractor not found #1005

Open jguides opened 3 weeks ago

jguides commented 3 weeks ago

In the v0 spikesorting pipeline, the call Waveforms().load_waveforms(key) appears to no longer work.

---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
Cell In[6], line 1
----> 1 BrainRegionUnits().populate()

File ~/mambaforge/envs/spyglass/lib/python3.9/site-packages/datajoint/autopopulate.py:241, in AutoPopulate.populate(self, suppress_errors, return_exception_objects, reserve_jobs, order, limit, max_calls, display_progress, processes, make_kwargs, *restrictions)
    237 if processes == 1:
    238     for key in (
    239         tqdm(keys, desc=self.__class__.__name__) if display_progress else keys
    240     ):
--> 241         error = self._populate1(key, jobs, **populate_kwargs)
    242         if error is not None:
    243             error_list.append(error)

File ~/mambaforge/envs/spyglass/lib/python3.9/site-packages/datajoint/autopopulate.py:292, in AutoPopulate._populate1(self, key, jobs, suppress_errors, return_exception_objects, make_kwargs)
    290 self.__class__._allow_insert = True
    291 try:
--> 292     make(dict(key), **(make_kwargs or {}))
    293 except (KeyboardInterrupt, SystemExit, Exception) as error:
    294     try:

File ~/Src/jguides_2024/src/jguides_2024/spikes/jguidera_unit.py:653, in BrainRegionUnits.make(self, key)
    651 # Update units to be those within valid range from probe tip to edge of target region
    652 for sort_group_id, unit_ids in sort_group_unit_ids_map.items():
--> 653     peak_ch_map = get_peak_ch_map(key["nwb_file_name"], sort_group_id)  # map from unit id to peak ch
    654     valid_unit_ids = [unit_id for unit_id, peak_ch in peak_ch_map.items() if peak_ch in valid_chs]
    655     sort_group_unit_ids_map[sort_group_id] = [x for x in unit_ids if x in valid_unit_ids]

File ~/Src/jguides_2024/src/jguides_2024/spike_sorting_curation/spikesorting_helpers.py:96, in get_peak_ch_map(nwb_file_name, sort_group_id, sort_interval_name, curation_id, peak_sign)
     94 # Get waveform extractor
     95 from spyglass.spikesorting.v0.spikesorting_curation import _get_peak_channel, Waveforms
---> 96 waveform_extractor = Waveforms().load_waveforms(key)
     97 return _get_peak_channel(waveform_extractor, peak_sign)

File ~/Src/spyglass/src/spyglass/spikesorting/v0/spikesorting_curation.py:377, in Waveforms.load_waveforms(self, key)
    364 """Returns a spikeinterface waveform extractor specified by key
    365 
    366 Parameters
   (...)
    374 we : spikeinterface.WaveformExtractor
    375 """
    376 we_path = (self & key).fetch1("waveform_extractor_path")
--> 377 we = si.WaveformExtractor.load_from_folder(we_path)
    378 return we

File ~/mambaforge/envs/spyglass/lib/python3.9/site-packages/spikeinterface/core/waveform_extractor.py:178, in WaveformExtractor.load_from_folder(cls, folder, with_recording, sorting)
    176 if sorting is None:
    177     if (folder / "sorting.json").exists():
--> 178         sorting = load_extractor(folder / "sorting.json", base_folder=folder)
    179     elif (folder / "sorting.pickle").exists():
    180         sorting = load_extractor(folder / "sorting.pickle", base_folder=folder)

File ~/mambaforge/envs/spyglass/lib/python3.9/site-packages/spikeinterface/core/base.py:1105, in load_extractor(file_or_folder_or_dict, base_folder)
   1103     return BaseExtractor.from_dict(file_or_folder_or_dict, base_folder=base_folder)
   1104 else:
-> 1105     return BaseExtractor.load(file_or_folder_or_dict, base_folder=base_folder)

File ~/mambaforge/envs/spyglass/lib/python3.9/site-packages/spikeinterface/core/base.py:689, in BaseExtractor.load(file_path, base_folder)
    687         print("The extractor was not serializable to file")
    688         return None
--> 689     extractor = BaseExtractor.from_dict(d, base_folder=base_folder)
    690     return extractor
    692 elif file_path.is_dir():
    693     # case from a folder after a calling extractor.save(...)

File ~/mambaforge/envs/spyglass/lib/python3.9/site-packages/spikeinterface/core/base.py:436, in BaseExtractor.from_dict(dictionary, base_folder)
    434     assert base_folder is not None, "When  relative_paths=True, need to provide base_folder"
    435     dictionary = _make_paths_absolute(dictionary, base_folder)
--> 436 extractor = _load_extractor_from_dict(dictionary)
    437 folder_metadata = dictionary.get("folder_metadata", None)
    438 if folder_metadata is not None:

File ~/mambaforge/envs/spyglass/lib/python3.9/site-packages/spikeinterface/core/base.py:1034, in _load_extractor_from_dict(dic)
   1031         new_kwargs[name] = value
   1033 class_name = dic["class"]
-> 1034 extractor_class = _get_class_from_string(class_name)
   1036 assert extractor_class is not None and class_name is not None, "Could not load spikeinterface class"
   1037 if not _check_same_version(class_name, dic["version"]):

File ~/mambaforge/envs/spyglass/lib/python3.9/site-packages/spikeinterface/core/base.py:1056, in _get_class_from_string(class_string)
   1054 class_name = class_string.split(".")[-1]
   1055 module = ".".join(class_string.split(".")[:-1])
-> 1056 imported_module = importlib.import_module(module)
   1058 try:
   1059     imported_class = getattr(imported_module, class_name)

File ~/mambaforge/envs/spyglass/lib/python3.9/importlib/__init__.py:127, in import_module(name, package)
    125             break
    126         level += 1
--> 127 return _bootstrap._gcd_import(name[level:], package, level)

File <frozen importlib._bootstrap>:1030, in _gcd_import(name, package, level)

File <frozen importlib._bootstrap>:1007, in _find_and_load(name, import_)

File <frozen importlib._bootstrap>:984, in _find_and_load_unlocked(name, import_)

ModuleNotFoundError: No module named 'spyglass.spikesorting.merged_sorting_extractor'
edeno commented 3 weeks ago

We moved spyglass.spikesorting.merged_sorting_extractor to spyglass.spikesorting.v0.merged_sorting_extractor. Not sure what is going on in the spikeinterface side such that it needs to load a module from the string name? @khl02007 do you know anything more about this?

samuelbray32 commented 2 weeks ago

I was able to use this function in my environment.

@jguides, could you share what key was trying to be accessed here, and what version of spikeinterface you have?

jguides commented 3 days ago

Thanks @samuelbray32. The key is {'nwb_filename': 'fig20211108.nwb', 'sort_group_id': 19, 'sort_interval_name': 'raw data valid times no premaze no home', 'curation_id': 2}, and the spikeinterface version is 0.99.1.