hyperspy / hyperspy

Multidimensional data analysis
https://hyperspy.org
GNU General Public License v3.0
513 stars 208 forks source link

Lazy EELSSpectrum fails with s.align_zero_loss_peak() #1592

Closed thomasaarholt closed 6 years ago

thomasaarholt commented 7 years ago

When loaded lazily, my EELS SI fail when aligning the zlp. The following was tried on both Rnm and #1531.

s = hs.load(path + name + ext, lazy=True)
s.align_zero_loss_peak(True) # Or false

On a large signal:

>>> s
<LazyEELSSpectrum, title: EELS Spectrum Image 0eV, dimensions: (3, 3|2048)>
>>> s.align_zero_loss_peak(True) # Or False
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-4-8925d1fde6ab> in <module>()
----> 1 s.align_zero_loss_peak(True) # or False

c:\users\thomasaar\documents\hyperspy\hyperspy\_signals\eels.py in align_zero_loss_peak(self, calibrate, also_align, print_stats, subpixel, mask, signal_range, show_progressbar, **kwargs)
    266 
    267         zlpc = estimate_zero_loss_peak_centre(self, mask, signal_range)
--> 268         mean_ = without_nans(zlpc.data).mean()
    269         if print_stats is True:
    270             print()

c:\users\thomasaar\documents\hyperspy\hyperspy\misc\utils.py in without_nans(data)
    756 
    757 def without_nans(data):
--> 758     return data[~np.isnan(data)]
    759 
    760 

C:\Users\thomasaar\AppData\Local\Continuum\Anaconda3\lib\site-packages\dask\array\core.py in __getitem__(self, index)
   1239             return self
   1240 
-> 1241         dsk, chunks = slice_array(out, self.name, self.chunks, index)
   1242 
   1243         dsk2 = sharedict.merge(self.dask, (out, dsk))

C:\Users\thomasaar\AppData\Local\Continuum\Anaconda3\lib\site-packages\dask\array\slicing.py in slice_array(out_name, in_name, blockdims, index)
    137 
    138     # Pass down to next function
--> 139     dsk_out, bd_out = slice_with_newaxes(out_name, in_name, blockdims, index)
    140 
    141     bd_out = tuple(map(tuple, bd_out))

C:\Users\thomasaar\AppData\Local\Continuum\Anaconda3\lib\site-packages\dask\array\slicing.py in slice_with_newaxes(out_name, in_name, blockdims, index)
    159 
    160     # Pass down and do work
--> 161     dsk, blockdims2 = slice_wrap_lists(out_name, in_name, blockdims, index2)
    162 
    163     if where_none:

C:\Users\thomasaar\AppData\Local\Continuum\Anaconda3\lib\site-packages\dask\array\slicing.py in slice_wrap_lists(out_name, in_name, blockdims, index)
    200         raise IndexError("Too many indices for array")
    201     for bd, i in zip(blockdims, index):
--> 202         check_index(i, sum(bd))
    203 
    204     # Change indices like -1 to 9

C:\Users\thomasaar\AppData\Local\Continuum\Anaconda3\lib\site-packages\dask\array\slicing.py in check_index(ind, dimension)
    711         x = np.array(ind)
    712         if (x >= dimension).any() or (x <= -dimension).any():
--> 713             raise IndexError("Index out of bounds %s" % dimension)
    714     elif isinstance(ind, slice):
    715         return

IndexError: Index out of bounds 200

Cropping the signal above to a much smaller navigator gives a different error:

>>> s2
<LazyEELSSpectrum, title: EELS Spectrum Image 0eV, dimensions: (3, 3|2048)>
>>> s2.align_zero_loss_peak(True) # Or False
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-8-086b4efcd00c> in <module>()
----> 1 s2.align_zero_loss_peak(True)

c:\users\thomasaar\documents\hyperspy\hyperspy\_signals\eels.py in align_zero_loss_peak(self, calibrate, also_align, print_stats, subpixel, mask, signal_range, show_progressbar, **kwargs)
    266 
    267         zlpc = estimate_zero_loss_peak_centre(self, mask, signal_range)
--> 268         mean_ = without_nans(zlpc.data).mean()
    269         if print_stats is True:
    270             print()

c:\users\thomasaar\documents\hyperspy\hyperspy\misc\utils.py in without_nans(data)
    756 
    757 def without_nans(data):
--> 758     return data[~np.isnan(data)]
    759 
    760 

C:\Users\thomasaar\AppData\Local\Continuum\Anaconda3\lib\site-packages\dask\array\core.py in __getitem__(self, index)
   1239             return self
   1240 
-> 1241         dsk, chunks = slice_array(out, self.name, self.chunks, index)
   1242 
   1243         dsk2 = sharedict.merge(self.dask, (out, dsk))

C:\Users\thomasaar\AppData\Local\Continuum\Anaconda3\lib\site-packages\dask\array\slicing.py in slice_array(out_name, in_name, blockdims, index)
    137 
    138     # Pass down to next function
--> 139     dsk_out, bd_out = slice_with_newaxes(out_name, in_name, blockdims, index)
    140 
    141     bd_out = tuple(map(tuple, bd_out))

C:\Users\thomasaar\AppData\Local\Continuum\Anaconda3\lib\site-packages\dask\array\slicing.py in slice_with_newaxes(out_name, in_name, blockdims, index)
    159 
    160     # Pass down and do work
--> 161     dsk, blockdims2 = slice_wrap_lists(out_name, in_name, blockdims, index2)
    162 
    163     if where_none:

C:\Users\thomasaar\AppData\Local\Continuum\Anaconda3\lib\site-packages\dask\array\slicing.py in slice_wrap_lists(out_name, in_name, blockdims, index)
    203 
    204     # Change indices like -1 to 9
--> 205     index2 = posify_index(shape, index)
    206 
    207     # Do we have more than one list in the index?

C:\Users\thomasaar\AppData\Local\Continuum\Anaconda3\lib\site-packages\dask\array\slicing.py in posify_index(shape, ind)
    569     """
    570     if isinstance(ind, tuple):
--> 571         return tuple(map(posify_index, shape, ind))
    572     if isinstance(ind, (int, long)):
    573         if ind < 0:

C:\Users\thomasaar\AppData\Local\Continuum\Anaconda3\lib\site-packages\dask\array\slicing.py in posify_index(shape, ind)
    576             return ind
    577     if isinstance(ind, list):
--> 578         return [i + shape if i < 0 else i for i in ind]
    579     return ind
    580 

C:\Users\thomasaar\AppData\Local\Continuum\Anaconda3\lib\site-packages\dask\array\slicing.py in <listcomp>(.0)
    576             return ind
    577     if isinstance(ind, list):
--> 578         return [i + shape if i < 0 else i for i in ind]
    579     return ind
    580 

TypeError: unorderable types: list() < int()

Finally, running it on a single spectrum with argument True runs successfully, simply shifting the zlp to 0eV.

francisco-dlp commented 7 years ago

What happens when lazy=False?

thomasaarholt commented 7 years ago

It works fine. Sorry, I should have mentioned.

On Tue, 11 Apr 2017 at 19:15, Francisco de la Peña notifications@github.com wrote:

What happens when lazy=False?

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/hyperspy/hyperspy/issues/1592#issuecomment-293333421, or mute the thread https://github.com/notifications/unsubscribe-auth/ACmGj4SO5VJ340LcdHF8Ptbc5SmoqIvSks5ru7UbgaJpZM4M6Bjb .