Skip to content

np.asscalar() is deprecated and prevents the metadata from being saved in some experiments #98

Description

@nvbln

I got the following error trace whilst saving the metadata in Stytra after the experiment finished:

  File "C:\Users\portugueslab\python\opto_stytra\stytra\stytra\experiments\tracking_experiments.py", line 441, in end_protocol
    super().end_protocol(save)
  File "C:\Users\portugueslab\python\opto_stytra\stytra\stytra\experiments\tracking_experiments.py", line 141, in end_protocol
    super().end_protocol(save=save)
  File "C:\Users\portugueslab\python\opto_stytra\stytra\stytra\experiments\__init__.py", line 528, in end_protocol
    self.save_data()
  File "C:\Users\portugueslab\python\opto_stytra\stytra\stytra\experiments\tracking_experiments.py", line 460, in save_data
    super().save_data()
  File "C:\Users\portugueslab\python\opto_stytra\stytra\stytra\experiments\__init__.py", line 759, in save_data
    super().save_data()
  File "C:\Users\portugueslab\python\opto_stytra\stytra\stytra\experiments\__init__.py", line 498, in save_data
    self.dc.save(self.filename_base() + "metadata.json")  # save data_log
  File "C:\Users\portugueslab\python\opto_stytra\stytra\stytra\collectors\data_collector.py", line 234, in save
    self.save_json_log(output_path)
  File "C:\Users\portugueslab\python\opto_stytra\stytra\stytra\collectors\data_collector.py", line 215, in save_json_log
    clean_dict = self.get_clean_dict(convert_datetime=True)
  File "C:\Users\portugueslab\python\opto_stytra\stytra\stytra\collectors\data_collector.py", line 156, in get_clean_dict
    return prepare_json(clean_data_dict, **kwargs)
  File "C:\Users\portugueslab\python\opto_stytra\stytra\stytra\utilities.py", line 128, in prepare_json
    new_dict[key] = prepare_json(value, **kwargs)
  File "C:\Users\portugueslab\python\opto_stytra\stytra\stytra\utilities.py", line 128, in prepare_json
    new_dict[key] = prepare_json(value, **kwargs)
  File "C:\Users\portugueslab\python\opto_stytra\stytra\stytra\utilities.py", line 133, in prepare_json
    return [prepare_json(el, **kwargs) for el in it]
  File "C:\Users\portugueslab\python\opto_stytra\stytra\stytra\utilities.py", line 133, in <listcomp>
    return [prepare_json(el, **kwargs) for el in it]
  File "C:\Users\portugueslab\python\opto_stytra\stytra\stytra\utilities.py", line 128, in prepare_json
    new_dict[key] = prepare_json(value, **kwargs)
  File "C:\Users\portugueslab\python\opto_stytra\stytra\stytra\utilities.py", line 135, in prepare_json
    return np.asscalar(it)
  File "C:\Users\portugueslab\anaconda3\envs\opto_stytra_env\lib\site-packages\numpy\__init__.py", line 311, in __getattr__
    raise AttributeError("module {!r} has no attribute "
Error in sys.excepthook:
Traceback (most recent call last):
  File "C:\Users\portugueslab\python\opto_stytra\stytra\stytra\experiments\tracking_experiments.py", line 482, in excepthook
    super()._finish_recording()
  File "C:\Users\portugueslab\python\opto_stytra\stytra\stytra\experiments\tracking_experiments.py", line 244, in _finish_recording
    self.frame_recorder.finish_event.set()
AttributeError: 'TrackingExperiment' object has no attribute 'frame_recorder'

Original exception was:
Traceback (most recent call last):
  File "C:\Users\portugueslab\python\opto_stytra\stytra\stytra\experiments\tracking_experiments.py", line 441, in end_protocol
    super().end_protocol(save)
  File "C:\Users\portugueslab\python\opto_stytra\stytra\stytra\experiments\tracking_experiments.py", line 141, in end_protocol
    super().end_protocol(save=save)
  File "C:\Users\portugueslab\python\opto_stytra\stytra\stytra\experiments\__init__.py", line 528, in end_protocol
    self.save_data()
  File "C:\Users\portugueslab\python\opto_stytra\stytra\stytra\experiments\tracking_experiments.py", line 460, in save_data
    super().save_data()
  File "C:\Users\portugueslab\python\opto_stytra\stytra\stytra\experiments\__init__.py", line 759, in save_data
    super().save_data()
  File "C:\Users\portugueslab\python\opto_stytra\stytra\stytra\experiments\__init__.py", line 498, in save_data
    self.dc.save(self.filename_base() + "metadata.json")  # save data_log
  File "C:\Users\portugueslab\python\opto_stytra\stytra\stytra\collectors\data_collector.py", line 234, in save
<class 'AttributeError'>: module 'numpy' has no attribute 'asscalar'
    self.save_json_log(output_path)
  File "C:\Users\portugueslab\python\opto_stytra\stytra\stytra\collectors\data_collector.py", line 215, in save_json_log
    clean_dict = self.get_clean_dict(convert_datetime=True)
  File "C:\Users\portugueslab\python\opto_stytra\stytra\stytra\collectors\data_collector.py", line 156, in get_clean_dict
    return prepare_json(clean_data_dict, **kwargs)
  File "C:\Users\portugueslab\python\opto_stytra\stytra\stytra\utilities.py", line 128, in prepare_json
    new_dict[key] = prepare_json(value, **kwargs)
  File "C:\Users\portugueslab\python\opto_stytra\stytra\stytra\utilities.py", line 128, in prepare_json
    new_dict[key] = prepare_json(value, **kwargs)
  File "C:\Users\portugueslab\python\opto_stytra\stytra\stytra\utilities.py", line 133, in prepare_json
    return [prepare_json(el, **kwargs) for el in it]
  File "C:\Users\portugueslab\python\opto_stytra\stytra\stytra\utilities.py", line 133, in <listcomp>
    return [pr

It seems that the prepare_json() function relies on a deprecated Numpy function. The fix seems relatively easy: change return np.asscalar(it) to return it.item().

I tested it, and I can confirm that the metadata file is saved again as before. However, I didn't check the file contents to see if the output has changed.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions