nexpy / nexusformat

Provides an API to open, create, plot, and manipulate NeXus data.
Other
13 stars 19 forks source link

Copying groups containing external links #205

Open rayosborn opened 1 year ago

rayosborn commented 1 year ago

I have not fully diagnosed this problem, but when attempting to copy an NXdata group that contained external links, the following exception was raised by h5py.

---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
File ~/Documents/Computing/Repositories/nexpy/src/nexpy/gui/mainwindow.py:1600, in MainWindow.copy_data(self)
   1598 node = self.treeview.get_node()
   1599 if not isinstance(node, NXroot):
-> 1600     self.copied_node = self.copy_node(node)
   1601     logging.info(f"'{node.nxpath}' copied")
   1602 else:

File ~/Documents/Computing/Repositories/nexpy/src/nexpy/gui/mainwindow.py:1584, in MainWindow.copy_node(self, node)
   1582 if isinstance(node, NXlink):
   1583     node = node.nxlink
-> 1584 self._memroot['entry'][node.nxname] = node
   1585 self._memroot['entry'].attrs['link'] = [node.nxname, node.nxpath,
   1586                                         str(node.nxfilename)]
   1587 return self._memroot['entry'][node.nxname]

File ~/Documents/Computing/Repositories/nexusformat/src/nexusformat/nexus/tree.py:4626, in NXgroup.__setitem__(self, key, value)
   4623 elif (isinstance(group.entries[key], NXentry) and
   4624       not isinstance(group, NXroot)):
   4625     group.entries[key].nxclass = NXsubentry
-> 4626 group.entries[key].update()

File ~/Documents/Computing/Repositories/nexusformat/src/nexusformat/nexus/tree.py:4725, in NXgroup.update(self)
   4723 if self.nxfilemode == 'rw':
   4724     with self.nxfile as f:
-> 4725         f.update(self)
   4726 elif self.nxfilemode is None:
   4727     for node in self.walk():

File ~/Documents/Computing/Repositories/nexusformat/src/nexusformat/nexus/tree.py:1336, in NXFile.update(self, item)
   1334     self._writedata(item)
   1335 elif isinstance(item, NXgroup):
-> 1336     links = self._writegroup(item)
   1337     self._writelinks(links)
   1338 elif isinstance(item, NXobject):

File ~/Documents/Computing/Repositories/nexusformat/src/nexusformat/nexus/tree.py:1020, in NXFile._writegroup(self, group)
   1017         links += [(self.nxpath+"/"+child.nxname, child._target,
   1018                    child._soft)]
   1019 elif isinstance(child, NXfield):
-> 1020     links += self._writedata(child)
   1021 else:
   1022     links += self._writegroup(child)

File ~/Documents/Computing/Repositories/nexusformat/src/nexusformat/nexus/tree.py:1060, in NXFile._writedata(self, data)
   1058 if _file._filename != self._filename:
   1059     with _file as f:
-> 1060         f.copy(_path, self[self.nxparent], name=self.nxpath)
   1061 else:
   1062     self.copy(_path, self[self.nxparent], name=self.nxpath)

File ~/Documents/Computing/Repositories/nexusformat/src/nexusformat/nexus/tree.py:1281, in NXFile.copy(self, source, destination, **kwargs)
   1268 def copy(self, source, destination, **kwargs):
   1269     """Copy an object defined by its path to another location.
   1270 
   1271     This is an interface to the `h5py.Group` copy function. All the
   (...)
   1279         Path of the new copy.
   1280     """
-> 1281     self.file.copy(source, destination, **kwargs)

File ~/opt/miniconda3/envs/py310/lib/python3.10/site-packages/h5py/_hl/group.py:597, in Group.copy(self, source, dest, name, shallow, expand_soft, expand_external, expand_refs, without_attrs)
    594 else:
    595     copypl = None
--> 597 h5o.copy(source.id, self._e(source_path), dest.id, self._e(dest_path),
    598          copypl, base.dlcpl)

File h5py/_objects.pyx:54, in h5py._objects.with_phil.wrapper()

File h5py/_objects.pyx:55, in h5py._objects.with_phil.wrapper()

File h5py/h5o.pyx:217, in h5py.h5o.copy()

RuntimeError: Unable to synchronously copy object (object 'signal' doesn't exist)