<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">
<div class="">Steve,</div>
<div class="">The NeXus format has, since its inception, had the concept that there is a parent object for each link, defined by the attribute ‘target’, even though linked data are stored in HDF5 files as hard links. NeXpy, or rather the underlying nexusformat
 API, is designed to make that association clear, whereas h5py makes no such distinction. I’m not sure if there is even a way for h5py to tell what groups an object has been added to without checking object ids. </div>
<div class=""><br class="">
</div>
<div class="">If you have a recent version of NeXpy installed, you can open the example file, ‘chopper.nxs’, from the Help menu. I will use it to discuss why I believe it handles links appropriately. In ‘chopper.nxs’, the data group contains two links. Here
 are edited selections from the file tree:</div>
<div class=""><br class="">
</div>
<div class="">
<div class="">entry:NXentry</div>
<div class="">  data:NXdata</div>
<div class="">    polar_angle -> /entry/instrument/detector/polar_angle</div>
<div class="">  instrument:NXinstrument</div>
<div class="">    detector:NXdetector</div>
<div class="">      polar_angle = float32(148)</div>
<div class="">        @target = '/entry/instrument/detector/polar_angle'</div>
<div class=""><br class="">
</div>
</div>
<div class="">So ‘/entry/data/polar_angle’ and ‘/entry/instrument/detector/polar_angle’ are both paths to the same HDF5 object, but the parent object is deemed by the NeXus format to be the latter, as specified by its target attribute. NeXpy chooses to display
 the other instance, in ‘/entry/data’ as a link to make this clear.</div>
<div class=""><br class="">
</div>
<div class="">
<div class="">>>> chopper.entry.data.polar_angle</div>
<div class="">NXlink('/entry/instrument/detector/polar_angle')</div>
<div class="">>>> chopper.entry.instrument.detector.polar_angle</div>
<div class="">
<div class="">NXfield(array([  -7.19999981,   -6.5999999 ,   -6.        , ...,  116.3999939 ,</div>
<div class="">        116.99999237,  117.59999084], dtype=float32))</div>
</div>
</div>
<div class=""><br class="">
</div>
<div class="">If you want to know what the parent object is, you can use the NXlink’s ‘nxlink’ attribute, which returns the parent.</div>
<div class=""><br class="">
</div>
<div class="">
<div class="">>>> chopper.entry.data.polar_angle.nxlink</div>
<div class="">
<div class="">NXfield(array([  -7.19999981,   -6.5999999 ,   -6.        , ...,  116.3999939 ,</div>
<div class="">        116.99999237,  117.59999084], dtype=float32))</div>
</div>
</div>
<div class=""><br class="">
</div>
<div class="">Within the NeXpy GUI, you can right-click on the link, which has a chain link icon by it, to display the parent. There is no way to do this in a generic HDF5 viewer.</div>
<div class=""><br class="">
</div>
<div class="">In practice, the fact that ‘/entry/data/polar_angle’ is an NXlink object should make no difference in your use of the data. For example, you can check its dtype or shape, and use fields in arithmetic expressions on either the parent or the link.</div>
<div class=""><br class="">
</div>
<div class="">
<div class="">>>> chopper.entry.data.polar_angle + 100.0</div>
<div class="">NXfield(array([  92.80000305,   93.40000153,   94.        , ...,  216.3999939 ,</div>
<div class="">        217.        ,  217.59999084], dtype=float32))</div>
<div class="">>>> chopper.entry.instrument.detector.polar_angle + 100.0</div>
<div class="">NXfield(array([  92.80000305,   93.40000153,   94.        , ...,  216.3999939 ,</div>
<div class="">        217.        ,  217.59999084], dtype=float32))</div>
</div>
<div class=""><br class="">
</div>
<div class="">I think this is the right way to handle links. In h5py, you could update a dataset’s value without knowing that it has the side effect of changing its value in another group. In NeXpy, the existence of the link is clear but it shouldn’t impede
 your use of its values or attributes. I would welcome further comments if you think these are not the right calls.</div>
<div class=""><br class="">
</div>
<div class="">With best regards,</div>
<div class="">Ray</div>
<div class=""><br class="">
</div>
<div>
<blockquote type="cite" class="">
<div class="">On Jun 14, 2017, at 6:13 AM, <a href="mailto:steve.collins@diamond.ac.uk" class="">
steve.collins@diamond.ac.uk</a> wrote:</div>
<br class="Apple-interchange-newline">
<div class="">
<div class="WordSection1" style="page: WordSection1; font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;">
<div style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif;" class="">
Hello,<o:p class=""></o:p></div>
<div style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif;" class="">
<o:p class=""> </o:p></div>
<div style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif;" class="">
I’d like to subscribe to this email list. I’m not sure if it is appropriate to ask a technical question here, but here is one anyway (I hope it’s OK):<o:p class=""></o:p></div>
<div style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif;" class="">
<o:p class=""> </o:p></div>
<div style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif;" class="">
I have a question about the Python Nexusformat/NeXpy nxload method.<o:p class=""></o:p></div>
<div style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif;" class="">
<o:p class=""> </o:p></div>
<div style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif;" class="">
I seem to have problems reading data entries that have been defined using links. That is, the method returns an NXlink object rather than the actual data:<o:p class=""></o:p></div>
<div style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif;" class="">
<o:p class=""> </o:p></div>
<div style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif;" class="">
n.entry1.default.ic1monitor<o:p class=""></o:p></div>
<div style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif;" class="">
Out[143]: NXlink('['/entry1/instrument/ic1monitor/ic1monitor']')<o:p class=""></o:p></div>
<div style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif;" class="">
<o:p class=""> </o:p></div>
<div style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif;" class="">
If I use h5py directly then I get the dataset:<o:p class=""></o:p></div>
<div style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif;" class="">
<o:p class=""> </o:p></div>
<div style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif;" class="">
h['/entry1/default/ic1monitor']<o:p class=""></o:p></div>
<div style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif;" class="">
Out[144]: <HDF5 dataset "ic1monitor": shape (10001,), type "<f8"><o:p class=""></o:p></div>
<div style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif;" class="">
<o:p class=""> </o:p></div>
<div style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif;" class="">
Is this expected or am I doing something wrong? I read in the manual that all data are specified via links so there is no distinction between the 'original' data and a link. Is that right?<o:p class=""></o:p></div>
<div style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif;" class="">
<o:p class=""> </o:p></div>
<div style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif;" class="">
Thank you for your help.<o:p class=""></o:p></div>
<div style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif;" class="">
<o:p class=""> </o:p></div>
<div style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif;" class="">
Regards,<o:p class=""></o:p></div>
<div style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif;" class="">
Steve Collins (Diamond Light Source)<o:p class=""></o:p></div>
<div style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif;" class="">
<o:p class=""> </o:p></div>
<div style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif;" class="">
P.S. I can send you the data files and Python code of course, if that helps.<o:p class=""></o:p></div>
</div>
</div>
</blockquote>
</div>
<br class="">
<div class="">
<div style="color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;">
-- <br class="">
Ray Osborn, Senior Scientist<br class="">
Materials Science Division<br class="">
Argonne National Laboratory<br class="">
Argonne, IL 60439, USA<br class="">
Phone: +1 (630) 252-9011<br class="">
Email: <a href="mailto:ROsborn@anl.gov" class="">ROsborn@anl.gov</a></div>
</div>
<br class="">
</body>
</html>