xdas-dev / xdas

Python framework for Distributed Acoustic Sensing (DAS).
https://xdas.readthedocs.io
GNU General Public License v3.0
29 stars 2 forks source link

Changing coordinates raises exception in xdas.fft #22

Open martijnende opened 3 days ago

martijnende commented 3 days ago

When applying xdas.fft on data with more than 2 coordinates (e.g. ABYSS data with station, latitude, etc. in addition to time and distance), doing xdas.fft.rfft(data) will trigger:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[32], [line 1](vscode-notebook-cell:?execution_count=32&line=1)
----> [1](vscode-notebook-cell:?execution_count=32&line=1) fs = rfft(da)

Cell In[27], [line 61](vscode-notebook-cell:?execution_count=27&line=61)
     [59](vscode-notebook-cell:?execution_count=27&line=59) dims = tuple(newdim if dim == olddim else dim for dim in da.dims)
     [60](vscode-notebook-cell:?execution_count=27&line=60) print(dims)
---> [61](vscode-notebook-cell:?execution_count=27&line=61) return DataArray(data, coords, dims, da.name, da.attrs)

File ~/miniconda3/envs/abyss/lib/python3.12/site-packages/xdas/core/dataarray.py:69, in DataArray.__init__(self, data, coords, dims, name, attrs)
     [67](https://vscode-remote+ssh-002dremote-002babyss.vscode-resource.vscode-cdn.net/home/vanden/abyss/T-waves/abyss_events/~/miniconda3/envs/abyss/lib/python3.12/site-packages/xdas/core/dataarray.py:67)     raise ValueError("different number of dimensions on `data` and `dims`")
     [68](https://vscode-remote+ssh-002dremote-002babyss.vscode-resource.vscode-cdn.net/home/vanden/abyss/T-waves/abyss_events/~/miniconda3/envs/abyss/lib/python3.12/site-packages/xdas/core/dataarray.py:68) coords = Coordinates(coords, dims)
---> [69](https://vscode-remote+ssh-002dremote-002babyss.vscode-resource.vscode-cdn.net/home/vanden/abyss/T-waves/abyss_events/~/miniconda3/envs/abyss/lib/python3.12/site-packages/xdas/core/dataarray.py:69) coords._assign_parent(self)
     [70](https://vscode-remote+ssh-002dremote-002babyss.vscode-resource.vscode-cdn.net/home/vanden/abyss/T-waves/abyss_events/~/miniconda3/envs/abyss/lib/python3.12/site-packages/xdas/core/dataarray.py:70) self._coords = coords
     [72](https://vscode-remote+ssh-002dremote-002babyss.vscode-resource.vscode-cdn.net/home/vanden/abyss/T-waves/abyss_events/~/miniconda3/envs/abyss/lib/python3.12/site-packages/xdas/core/dataarray.py:72) # metadata

File ~/miniconda3/envs/abyss/lib/python3.12/site-packages/xdas/core/coordinates.py:234, in Coordinates._assign_parent(self, parent)
    [232](https://vscode-remote+ssh-002dremote-002babyss.vscode-resource.vscode-cdn.net/home/vanden/abyss/T-waves/abyss_events/~/miniconda3/envs/abyss/lib/python3.12/site-packages/xdas/core/coordinates.py:232) def _assign_parent(self, parent):
    [233](https://vscode-remote+ssh-002dremote-002babyss.vscode-resource.vscode-cdn.net/home/vanden/abyss/T-waves/abyss_events/~/miniconda3/envs/abyss/lib/python3.12/site-packages/xdas/core/coordinates.py:233)     if not len(self.dims) == parent.ndim:
--> [234](https://vscode-remote+ssh-002dremote-002babyss.vscode-resource.vscode-cdn.net/home/vanden/abyss/T-waves/abyss_events/~/miniconda3/envs/abyss/lib/python3.12/site-packages/xdas/core/coordinates.py:234)         raise ValueError(
    [235](https://vscode-remote+ssh-002dremote-002babyss.vscode-resource.vscode-cdn.net/home/vanden/abyss/T-waves/abyss_events/~/miniconda3/envs/abyss/lib/python3.12/site-packages/xdas/core/coordinates.py:235)             "infered dimension number from `coords` does not match "
    [236](https://vscode-remote+ssh-002dremote-002babyss.vscode-resource.vscode-cdn.net/home/vanden/abyss/T-waves/abyss_events/~/miniconda3/envs/abyss/lib/python3.12/site-packages/xdas/core/coordinates.py:236)             "`data` dimensionality`"
    [237](https://vscode-remote+ssh-002dremote-002babyss.vscode-resource.vscode-cdn.net/home/vanden/abyss/T-waves/abyss_events/~/miniconda3/envs/abyss/lib/python3.12/site-packages/xdas/core/coordinates.py:237)         )
    [238](https://vscode-remote+ssh-002dremote-002babyss.vscode-resource.vscode-cdn.net/home/vanden/abyss/T-waves/abyss_events/~/miniconda3/envs/abyss/lib/python3.12/site-packages/xdas/core/coordinates.py:238)     for dim, size in zip(self.dims, parent.shape):
    [239](https://vscode-remote+ssh-002dremote-002babyss.vscode-resource.vscode-cdn.net/home/vanden/abyss/T-waves/abyss_events/~/miniconda3/envs/abyss/lib/python3.12/site-packages/xdas/core/coordinates.py:239)         if (dim in self) and (not len(self[dim]) == size):

ValueError: infered dimension number from `coords` does not match `data` dimensionality`

The issue is that in Coordinates.__assign_parent it compares the total number of coordinates (station, latitude, ...), not the number of dimensions (time and distance).