stytra icon indicating copy to clipboard operation
stytra copied to clipboard

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

Open nvbln opened this issue 3 months ago • 0 comments

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.

nvbln avatar Apr 05 '24 15:04 nvbln