Full Code of johntruckenbrodt/pyroSAR for AI

main 293c2dc4b40f cached
112 files
1.3 MB
365.9k tokens
718 symbols
1 requests
Download .txt
Showing preview only (1,394K chars total). Download the full file or copy to clipboard to get everything.
Repository: johntruckenbrodt/pyroSAR
Branch: main
Commit: 293c2dc4b40f
Files: 112
Total size: 1.3 MB

Directory structure:
gitextract_9rn0un2a/

├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   └── bug_report.md
│   └── workflows/
│       ├── conda-install.yml
│       └── python-publish.yml
├── .gitignore
├── .travis.yml
├── CONTRIBUTING.md
├── LICENSE.txt
├── MANIFEST.in
├── README.md
├── appveyor.yml
├── datacube_prepare.ipynb
├── docs/
│   ├── Makefile
│   ├── make.bat
│   └── source/
│       ├── about/
│       │   ├── changelog.rst
│       │   ├── projects.rst
│       │   ├── publications.rst
│       │   └── references.rst
│       ├── api/
│       │   ├── ancillary.rst
│       │   ├── archive.rst
│       │   ├── auxdata.rst
│       │   ├── datacube.rst
│       │   ├── drivers.rst
│       │   ├── examine.rst
│       │   ├── figures/
│       │   │   ├── snap_geocode.graphml
│       │   │   └── workflow_readme.txt
│       │   ├── gamma/
│       │   │   ├── api.rst
│       │   │   ├── auxil.rst
│       │   │   ├── dem.rst
│       │   │   ├── error.rst
│       │   │   ├── figures/
│       │   │   │   └── gamma_geocode.graphml
│       │   │   ├── index.rst
│       │   │   └── util.rst
│       │   ├── sentinel-1.rst
│       │   └── snap.rst
│       ├── conf.py
│       ├── general/
│       │   ├── DEM.rst
│       │   ├── OSV.rst
│       │   ├── configuration.rst
│       │   ├── filenaming.rst
│       │   ├── installation.rst
│       │   ├── logging.rst
│       │   ├── processing.rst
│       │   └── snap.rst
│       ├── index.rst
│       └── references.bib
├── environment-dev.yml
├── environment-doc.yml
├── environment.yml
├── pyproject.toml
├── pyroSAR/
│   ├── ERS/
│   │   ├── __init__.py
│   │   ├── auxil.py
│   │   └── mapping.py
│   ├── S1/
│   │   ├── __init__.py
│   │   ├── auxil.py
│   │   ├── linesimplify.py
│   │   └── polysimplify.py
│   ├── __init__.py
│   ├── ancillary.py
│   ├── archive.py
│   ├── auxdata.py
│   ├── config.py
│   ├── datacube_util.py
│   ├── drivers.py
│   ├── examine.py
│   ├── gamma/
│   │   ├── __init__.py
│   │   ├── api.py
│   │   ├── auxil.py
│   │   ├── dem.py
│   │   ├── error.py
│   │   ├── parser.py
│   │   ├── parser_demo.py
│   │   └── util.py
│   ├── install/
│   │   ├── download_egm96_15.gtx.sh
│   │   ├── download_testdata.sh
│   │   └── install_deps.sh
│   ├── patterns.py
│   ├── snap/
│   │   ├── __init__.py
│   │   ├── auxil.py
│   │   ├── data/
│   │   │   ├── collect_suffices.py
│   │   │   ├── snap.auxdata.properties
│   │   │   └── snap.suffices.properties
│   │   ├── recipes/
│   │   │   ├── base.xml
│   │   │   └── blank.xml
│   │   └── util.py
│   └── xml_util.py
├── readthedocs.yml
├── requirements-dev.txt
├── requirements.txt
└── tests/
    ├── conftest.py
    ├── data/
    │   ├── ASA_IMS_1PNESA20040703_205338_000000182028_00172_12250_00001672562030318361237.N1
    │   ├── S1A__IW___A_20150309T173017_VV_grd_mli_geo_norm_db.tif
    │   ├── S1A__IW___A_20150309T173017_VV_grd_mli_geo_norm_db.tif.aux.xml
    │   ├── SAR_IMP_1PXESA19960808_205906_00000017G158_00458_26498_2615.E1
    │   ├── archive_outdated.csv
    │   ├── dem.par
    │   └── mli.par
    ├── installtest_gdal_geos.py
    ├── installtest_ogr_sqlite.py
    ├── installtest_spatialite.py
    ├── test_ancillary.py
    ├── test_archive.py
    ├── test_auxdata.py
    ├── test_config.py
    ├── test_drivers.py
    ├── test_examine.py
    ├── test_gamma.py
    ├── test_gamma_args.py
    ├── test_license.py
    ├── test_osv.py
    ├── test_snap.py
    ├── test_snap_exe.py
    └── test_xml_util.py

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: bug
assignees: ''

---

- which operating system are you using?  
e.g. Windows 10, Ubuntu 18.4, etc.
- which environment is pyroSAR running in?  
e.g. system-wide Python installation, Anaconda environment, virtual environment, etc.
- which version of pyroSAR are you using?  
one installed via conda, pip or a clone of the GitHub repository?
-  which function of pyroSAR did you call with which parameters?  
- if applicable, which version of SNAP or GAMMA are you using in pyroSAR?
- the full error message


================================================
FILE: .github/workflows/conda-install.yml
================================================
name: conda build

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]
    types: [ opened, reopened, synchronize ]
  workflow_dispatch:
    inputs:
      debug_enabled:
        type: boolean
        description: 'Run the build with tmate debugging enabled (https://github.com/marketplace/actions/debugging-with-tmate)'
        required: false
        default: false

permissions:
  contents: read

env:
  SNAP_VERSION: "13.0"

jobs:
  build-linux:
    runs-on: ubuntu-latest
    defaults:
      run:
        shell: micromamba-shell {0}
    services:
      postgres:
        image: postgis/postgis:16-3.4
        env:
          POSTGRES_PASSWORD: Password12!
        ports:
          - 5432:5432
    steps:
      - uses: actions/checkout@v3
      - name: Set up python environment
        uses: mamba-org/setup-micromamba@v2
        with:
          environment-file: environment-dev.yml
          cache-environment: true
          init-shell: bash
          generate-run-shell: true
          post-cleanup: 'all'
      - name: Install ESA SNAP
        run: |
          wget -nv https://download.esa.int/step/snap/$SNAP_VERSION/installers/esa-snap_all_linux-$SNAP_VERSION.0.sh
          bash esa-snap_all_linux-$SNAP_VERSION.0.sh -q -dir $GITHUB_ACTION_PATH/esa-snap
      - name: Set paths and variables
        run: |
          echo "$CONDA/bin" >> $GITHUB_PATH
          echo "$GITHUB_ACTION_PATH/esa-snap/bin" >> $GITHUB_PATH
          echo "PROJ_DATA=$CONDA/share/proj" >> $GITHUB_ENV
      - name: Lint with flake8
        run: |
          flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
          flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
      - name: Install pyroSAR
        run: |
          pip install .
      - name: Test with pytest
        run: |
          coverage run -m pytest
          coverage xml
        env:
          PGUSER: postgres
          PGPASSWORD: Password12!
      - name: Publish to coveralls.io
        if: ${{ github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository }}
        uses: coverallsapp/github-action@v2.3.0
        with:
          github-token: ${{ github.token }}
          format: cobertura

  build-windows:
    runs-on: windows-latest
    steps:
      - uses: actions/checkout@v6
      - name: Set up micromamba environment
        uses: mamba-org/setup-micromamba@v2
        with:
          environment-file: environment-dev.yml
          cache-environment: true
          init-shell: bash
          generate-run-shell: true
          post-cleanup: 'all'

      - uses: nyurik/action-setup-postgis@v2.2
        with:
          cached-dir: C:\downloads
          postgres-version: 17

      # ---------------- SNAP cache ----------------
      - name: Cache SNAP zip
        id: cache-snap
        uses: actions/cache@v4
        with:
          path: |
            snap.zip
          key: snap-${{ env.SNAP_VERSION }}-windows

      - name: Download and install SNAP (cache miss)
        if: steps.cache-snap.outputs.cache-hit != 'true'
        shell: cmd
        run: |
          echo Downloading SNAP installer...
          curl -L -o snap.exe https://download.esa.int/step/snap/%SNAP_VERSION%/installers/esa-snap_all_windows-%SNAP_VERSION%.0.exe

          echo Installing SNAP...
          start /wait snap.exe -q -dir C:\esa-snap
          
          echo Creating zip archive for cache...
          powershell Compress-Archive -Path C:\esa-snap -DestinationPath snap.zip

      - name: Restore SNAP from zip (cache hit)
        if: steps.cache-snap.outputs.cache-hit == 'true'
        shell: powershell
        run: |
          Write-Host "Unzipping cached SNAP..."
          Expand-Archive snap.zip C:\

      - name: Add SNAP to PATH
        shell: powershell
        run: |
          echo "C:\esa-snap\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append

      # ---------------- Python steps (micromamba env) ----------------

      - name: Verify micromamba python
        shell: bash -el {0}
        run: |
          where python
          python -V
          where pip

      - name: Install pyroSAR
        shell: bash -el {0}
        run: |
          python -m pip install .

      - name: Setup tmate session (debug)
        uses: mxschmitt/action-tmate@v3
        if: ${{ github.event_name == 'workflow_dispatch' && inputs.debug_enabled }}

      - name: Test with pytest
        shell: bash -el {0}
        run: |
          pytest -vv
        env:
          PGUSER: postgres
          PGPASSWORD: postgres


================================================
FILE: .github/workflows/python-publish.yml
================================================
# This workflow will upload a Python Package using Twine when a release is created
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python#publishing-to-package-registries

# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.

name: Upload Python Package

on:
  release:
    types: [ published ]

permissions:
  contents: read

jobs:
  deploy:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3
    - name: Set up Python
      uses: actions/setup-python@v3
      with:
        python-version: '3.x'
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install build
    - name: Build package
      run: python -m build
    - name: Publish package
      uses: pypa/gh-action-pypi-publish@27b31702a0e7fc50959f5ad993c78deac1bdfc29
      with:
        user: __token__
        password: ${{ secrets.PYPI_API_TOKEN }}


================================================
FILE: .gitignore
================================================
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST

# PyInstaller
#  Usually these files are written by a python script from a template
#  before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
.hypothesis/
.pytest_cache/

# Translations
*.mo
*.pot

# Django stuff:
*.log
local_settings.py
db.sqlite3

# Flask stuff:
instance/
.webassets-cache

# Scrapy stuff:
.scrapy

# Sphinx documentation
docs/_build/

# PyBuilder
target/

# Jupyter Notebook
.ipynb_checkpoints

# IPython
profile_default/
ipython_config.py

# pyenv
.python-version

# celery beat schedule file
celerybeat-schedule

# SageMath parsed files
*.sage.py

# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/

# Spyder project settings
.spyderproject
.spyproject

# Rope project settings
.ropeproject

# mkdocs documentation
/site

# mypy
.mypy_cache/
.dmypy.json
dmypy.json

# Pyre type checker
.pyre/

.idea/
out/
dev_*

# OSX tempfiles
.DS_Store

================================================
FILE: .travis.yml
================================================
dist: jammy
language: python
sudo: required
cache:
  directories:
    - ~/.cache/pip

env:
  global:
    - PIP_WHEEL_DIR=$HOME/.cache/pip/wheels
    - PIP_FIND_LINKS=file://$HOME/.cache/pip/wheels
    - TESTDATA_DIR=$HOME/testdata
    - PGUSER=travis
    - PGPASSWORD=Password12!
    - SNAP_VERSION=10

addons:
  postgresql: '14'
  apt:
    sources:
      - sourceline: 'ppa:ubuntugis/ppa'
    packages:
      - libgdal-dev
      - gdal-bin
      - libsqlite3-mod-spatialite
      - libproj-dev
      - python3-dev
      - postgresql-14-postgis-3

services:
  - postgresql

python:
  - '3.10'

before_install:
  - export SNAP_INSTALLER=esa-snap_sentinel_linux-"$SNAP_VERSION".0.0.sh
  - wget -O $SNAP_INSTALLER https://download.esa.int/step/snap/"$SNAP_VERSION"_0/installers/"$SNAP_INSTALLER"
  - bash $SNAP_INSTALLER -q
  - export PATH=$PATH:/opt/snap/bin

install:
  - mkdir -p ~/.cache/pip/wheels # remove warning "Url 'file:///home/travis/.cache/pip/wheels' is ignored: it is neither a file nor a directory."
  - pip install --ignore-installed setuptools pip six certifi # install packages inside the venv if the system version is too old
  - pip install numpy
  - pip install GDAL==$(gdal-config --version) --global-option=build_ext --global-option="$(gdal-config --cflags)"
  - pip install coveralls coverage
  - pip install .[test]

#before_script:
#  - travis_wait 40 . ./pyroSAR/install/download_testdata.sh

before_script:
  - psql -U $PGUSER -c 'create database travis_ci_test'
  - psql -U $PGUSER -c "create extension if not exists postgis"
  - psql -U $PGUSER -c "alter user ${PGUSER} password '${PGPASSWORD}'"

script:
  - coverage run -m pytest

after_success:
  - coveralls


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to pyroSAR

First off, thanks for considering a contribution to pyroSAR. Any contribution, may it be a feature suggestion, a pull 
request or s simple bug report, is valuable to the project and very welcome.
This document is intended as a guideline on best practices.

## How to open an issue
The easiest way to contribute to pyroSAR is by opening an issue. This is intended for reporting software bugs and 
suggesting new features. Before you do, please read through the list of 
[open issues](https://github.com/johntruckenbrodt/pyroSAR/issues) to see whether this issue has already been raised.
This way, duplicates can be reduced and it is easier for the developers to address them.
If you are not sure whether your issue is a duplicate of an existing one, just open a new issue. It is easier to link 
two existing similar issues than separating two different ones contained in one.
For reporting bugs please fill out the template, which is available once you open it. For suggesting new features you
can just delete the template text.  
The following questions need to be answered so that is is possible for the developers to start fixing the software:
- which operating system are you using?  
e.g. Windows 10, Ubuntu 18.4, etc.
- which environment is pyroSAR running in?  
e.g. system-wide Python installation, Anaconda environment, virtual environment, etc.
- which version of pyroSAR are you using?  
one installed via pip or a clone of the GitHub repository?
-  which function of pyroSAR did you call with which parameters?  
- if applicable, which version of SNAP or GAMMA are you using in pyroSAR?
- the full error message

This way the error is reproducible and can quickly be fixed.

## Checking pyroSAR's version
The used version can be obtained like this:
```python
import pyroSAR
print(pyroSAR.__version__)
```
Depending on how you installed pyroSAR the version might look differently. 
If installed via pip with `pip install pyroSAR`, the package is downloaded from 
[PyPI](https://pypi.org/project/pyroSAR/), 
where only the main releases are stored and versions are named e.g. `0.9.1`. 
These can also be found on GitHub [here](https://github.com/johntruckenbrodt/pyroSAR/releases).
If you have installed pyroSAR directly from GitHub like so:
```shell script
python3 -m pip install git+https://github.com/johntruckenbrodt/pyroSAR
```
or have directly cloned a branch from GitHub, your version might look like this:
`0.9.2.dev103+g57eeb30`, in which this naming pattern is used:  
`{next_version}.dev{distance}+{scm letter}{revision hash}`.
In this case we can see that git is used as scm and the latest commit of the software was 
[57eeb30](https://github.com/johntruckenbrodt/pyroSAR/commit/57eeb30970dc6adfee62ca12fd8c8818ecaf3a14), 
which, at the time of checking the version, had a distance of 103 commits to the latest commit.
See [here](https://www.diycode.cc/projects/pypa/setuptools_scm) for more details.


================================================
FILE: LICENSE.txt
================================================
# Copyright (c) 2014-2026, the pyroSAR Developers.

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


================================================
FILE: MANIFEST.in
================================================
recursive-include pyroSAR/snap *.xml
recursive-include pyroSAR/snap/data *
recursive-include pyroSAR/ERS/data *
recursive-exclude tests *
recursive-exclude .github *
exclude .travis.yml appveyor.yml


================================================
FILE: README.md
================================================
<h1 align="center">
  <br>
  <a>pyroSAR</a>
</h1>
<h3 align="center">A Python Framework for Large-Scale SAR Satellite Data Processing</h3>

<p align="center">
  <a href='https://github.com/johntruckenbrodt/pyroSAR/actions/workflows/conda-install.yml'>
    <img src='https://github.com/johntruckenbrodt/pyroSAR/actions/workflows/conda-install.yml/badge.svg' alt='Conda Build Status'></a>
  <a href='https://coveralls.io/github/johntruckenbrodt/pyroSAR?branch=main'>
    <img src='https://coveralls.io/repos/github/johntruckenbrodt/pyroSAR/badge.svg?branch=main' alt='Coveralls Status' /></a>
  <a href='https://pyrosar.readthedocs.io/en/latest/?badge=latest'>
    <img src='https://readthedocs.org/projects/pyrosar/badge/?version=latest' alt='Documentation Status' /></a>
  <a href='https://badge.fury.io/py/pyroSAR'>
    <img src='https://badge.fury.io/py/pyroSAR.svg' alt='PyPI Status' /></a>
  <a href='https://anaconda.org/conda-forge/pyrosar'>
    <img src='https://img.shields.io/conda/vn/conda-forge/pyrosar.svg' alt='Conda-Forge Status' /></a>
</p>

The pyroSAR package aims at providing a complete solution for the scalable organization and processing of SAR satellite data:
* Reading of data from various past and present satellite missions
* Handling of acquisition metadata
* User-friendly access to processing utilities in [SNAP](https://step.esa.int/main/toolboxes/snap/) 
and [GAMMA Remote Sensing](https://www.gamma-rs.ch/) software
* Formatting of the preprocessed data for further analysis
* Export to Data Cube solutions

Head on over to [readthedocs](https://pyrosar.readthedocs.io/en/latest/?badge=latest) for installation instructions,
examples and API reference.


================================================
FILE: appveyor.yml
================================================
# thanks a lot to the Nansat project (https://github.com/nansencenter/nansat) from which this file was adapted
environment:
  matrix:
    - TARGET_ARCH: x64
      CONDA_PY: 36
      CONDA_INSTALL_LOCN: C:\Miniconda3-x64
      GDAL_DATA: C:\Miniconda3-x64\Library\share\gdal
      PROJECT_DIR: C:\projects\pyrosar
      SNAP_INSTALL: C:\projects\snap
      PGUSER: postgres
      PGPASSWORD: Password12!
      SNAP_VERSION: 10
      SNAP_INSTALLER: esa-snap_sentinel_windows-%SNAP_VERSION%.0.0.exe

platform:
  - x64

services:
  - postgresql96

install:
  # Cygwin's git breaks conda-build. (See https://github.com/conda-forge/conda-smithy-feedstock/pull/2.)
  - rmdir C:\cygwin /s /q

  # install PostGIS
  - appveyor DownloadFile  https://download.osgeo.org/postgis/windows/pg96/archive/postgis-bundle-pg96-3.2.0x64.zip
  - 7z x .\postgis-bundle-pg96-3.2.0x64.zip
  - xcopy /e /y /q .\postgis-bundle-pg96-3.2.0x64 C:\Progra~1\PostgreSQL\9.6

  # activate conda
  - call %CONDA_INSTALL_LOCN%\Scripts\activate.bat

  # If there is a newer build queued for the same PR, cancel this one.
  - appveyor DownloadFile https://raw.githubusercontent.com/conda-forge/conda-forge-build-setup-feedstock/master/recipe/ff_ci_pr_build.py
  - python ff_ci_pr_build.py -v --ci "appveyor" "%APPVEYOR_ACCOUNT_NAME%/%APPVEYOR_PROJECT_SLUG%" "%APPVEYOR_BUILD_NUMBER%" "%APPVEYOR_PULL_REQUEST_NUMBER%"
  - del ff_ci_pr_build.py

  # update conda
  - conda update --yes --quiet conda

  - set PYTHONUNBUFFERED=1


  # Add our channels.
  - conda config --set show_channel_urls true
  - conda config --remove channels defaults
  - conda config --add channels defaults
  - conda config --add channels conda-forge

  # install ESA SNAP
  - appveyor DownloadFile https://download.esa.int/step/snap/%SNAP_VERSION%_0/installers/%SNAP_INSTALLER%
  - start %SNAP_INSTALLER% -q -dir %SNAP_INSTALL%

  - set PATH=%PATH%;%SNAP_INSTALL%\bin

  - echo %PATH%

  # Configure the VM.
  - conda env create --file environment-dev.yml
  - conda activate ps_test_dev
  - pip install .

# Skip .NET project specific build phase.
build: false

test_script:
  - coverage run -m pytest


================================================
FILE: datacube_prepare.ipynb
================================================
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This is a quick notebook to demonstrate the pyroSAR functionality for importing processed SAR scenes into an Open Data Cube"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from pyroSAR.datacube_util import Product, Dataset\n",
    "from pyroSAR.ancillary import groupby, find_datasets"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# define a directory containing processed SAR scenes\n",
    "dir = '/path/to/some/data'\n",
    "\n",
    "# define a name for the product YML; this is used for creating a new product in the datacube\n",
    "yml_product = './product_def.yml'\n",
    "\n",
    "# define a directory for storing the indexing YMLs; these are used to index the dataset in the datacube\n",
    "yml_index_outdir = './yml_indexing'\n",
    "\n",
    "# define a name for the ingestion YML; this is used to ingest the indexed datasets into the datacube\n",
    "yml_ingest = './ingestion.yml'\n",
    "\n",
    "# product description\n",
    "product_name_indexed = 'S1_GRD_index'\n",
    "product_name_ingested = 'S1_GRD_ingest'\n",
    "product_type = 'gamma0'\n",
    "description = 'this is just some test'\n",
    "\n",
    "# define the units of the dataset measurements (i.e. polarizations)\n",
    "units = 'backscatter'\n",
    "# alternatively this could be a dictionary:\n",
    "# units = {'VV': 'backscatter VV', 'VH': 'backscatter VH'}\n",
    "\n",
    "ingest_location = './ingest'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# find pyroSAR files by metadata attributes\n",
    "files = find_datasets(dir, recursive=True, sensor=('S1A', 'S1B'), acquisition_mode='IW')\n",
    "\n",
    "# group the found files by their file basenames\n",
    "# files with the same basename are considered to belong to the same dataset\n",
    "grouped = groupby(files, 'outname_base')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print(len(files))\n",
    "print(len(grouped))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In the next step we create a new product, add the grouped datasets to it and create YML files for indexing the datasets in the cube."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# create a new product and add the collected datasets to it\n",
    "# alternatively, an existing product can be used by providing the corresponding product YML file\n",
    "with Product(name=product_name_indexed,\n",
    "             product_type=product_type,\n",
    "             description=description) as prod:\n",
    "\n",
    "    for dataset in grouped:\n",
    "        with Dataset(dataset, units=units) as ds:\n",
    "\n",
    "            # add the datasets to the product\n",
    "            # this will generalize the metadata from those datasets to measurement descriptions,\n",
    "            # which define the product definition\n",
    "            prod.add(ds)\n",
    "\n",
    "            # parse datacube indexing YMLs from product and dataset metadata\n",
    "            prod.export_indexing_yml(ds, yml_index_outdir)\n",
    "\n",
    "    # write the product YML\n",
    "    prod.write(yml_product)\n",
    "    \n",
    "    # print the product metadata, which is written to the product YML\n",
    "    print(prod)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now that we have a YML file for creating a new product and individual YML files for indexing the datasets, we can create a last YML file, which will ingest the indexed datasets into the cube. For this a new product is created and the files are converted to NetCDF, which are optimised for useage in the cube. The location of those NetCDF files also needs to be defined."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "with Product(yml_product) as prod:\n",
    "    prod.export_ingestion_yml(yml_ingest, product_name_ingested, ingest_location, \n",
    "                              chunking={'x': 512, 'y': 512, 'time': 1})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "cubeenv",
   "language": "python",
   "name": "cubeenv"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}


================================================
FILE: docs/Makefile
================================================
# Minimal makefile for Sphinx documentation
#

# You can set these variables from the command line, and also
# from the environment for the first two.
SPHINXOPTS    ?=
SPHINXBUILD   ?= sphinx-build
SOURCEDIR     = source
BUILDDIR      = build

# Put it first so that "make" without argument is like "make help".
help:
	@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)

.PHONY: help Makefile

# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
	@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)


================================================
FILE: docs/make.bat
================================================
@ECHO OFF

pushd %~dp0

REM Command file for Sphinx documentation

if "%SPHINXBUILD%" == "" (
	set SPHINXBUILD=sphinx-build
)
set SOURCEDIR=source
set BUILDDIR=build

%SPHINXBUILD% >NUL 2>NUL
if errorlevel 9009 (
	echo.
	echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
	echo.installed, then set the SPHINXBUILD environment variable to point
	echo.to the full path of the 'sphinx-build' executable. Alternatively you
	echo.may add the Sphinx directory to PATH.
	echo.
	echo.If you don't have Sphinx installed, grab it from
	echo.https://www.sphinx-doc.org/
	exit /b 1
)

if "%1" == "" goto help

%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
goto end

:help
%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%

:end
popd


================================================
FILE: docs/source/about/changelog.rst
================================================
#########
Changelog
#########

0.6 | 2018-11-20
================

SAR metadata
------------
- new standardized  metadata fields `orbitNumber_abs`, `orbitNumber_rel`, `cycleNumber` and `frameNumber` for all SAR
  formats
- customization of output file names with additional metadata fields (e.g. orbit numbers)

software configuration
----------------------
- pyroSAR configuration file handling: the paths to the SNAP and Gamma installation as well as relevant metadata
  directories are now registered in a configuration file `config.ini`, which is stored in a directory `.pyrosar` in the
  user home directory
- improved SNAP installation verification: pyroSAR now performs a deeper check of the SNAP installation to make sure
  it is not mistaken with e.g. the Ubuntu package manager snap; relevant installation executables and directories are
  stored in the configuration file

general functionality
---------------------
- deeper integration of package `spatialist <https://github.com/johntruckenbrodt/spatialist>`_: all the spatial file
  handling functionality that was part of pyroSAR is now part of package spatialist; now all the functionality is imported
  from spatialist and removed from pyroSAR
- improved search for datasets processed by pyroSAR: new helper functions exist, which make it easier to search for
  datasets by metadata fields, which are internally searched for in the respective file names
- introduced gamma function parser: these new tools search for a GAMMA_HOME environment variable and, if found, parse
  Python functions from the docstring of respective command line tools; for this, new Python scripts are created, which
  are stored alongside the configuration file in the user home directory; this way users can easily use Python functions
  with named parameters instead of the positional arguments of the Gamma command line tools
- improved documentation

Open Data Cube Export
---------------------
functionality to export processed datasets directly to an Open Data Cube:
it is now possible to create Open Data Cube product YML files as well as YML files for data indexing and ingestion
into this product; pyroSAR also internally checks for compatibility of a particular dataset with the target product;
this way, the resulting files can easily be passed to the Open Data Cube command line tools
several bug fixes

SNAP API
--------
improved SNAP processing workflow node linking: it is now possible to add a node also before an existing one, instead
of just after it

Python package integrity
------------------------
- add trove classifiers for supported operating systems and MIT license for easier online search
- exchange http with https for all URLs that support it

0.7 | 2019-01-03
================

several changes to the functioning of the Gamma command API

GAMMA API
---------

processing
++++++++++
- :func:`pyroSAR.gamma.geocode`:

  * optionally write all Gamma commands to shellscript
  * newly introduced choice of normalization method
  * changed normalization default approach

- :func:`pyroSAR.gamma.process`:

  * new parameter `logfile` to specify a logfile instead of just a directory with automated file naming
  * new parameter `shellscript` to write the executed command to a shell script protocol

command parser
++++++++++++++
- add parameters `outdir` and `shellscript` to parsed functions
- extensive improvement to accurately parse more commands
- add parameter `inlist` to some commands, which require interactive input via `stdin`

general
+++++++
- several bug fixes
- extended documentation
- make use of parsed command functions internally
- enable passing `logpath`, `outdir` and `shellscript` to all parsed functions via additional parameters for other
  convenience functions

0.8 | 2019-02-11
================

Auxiliary Data Handling
-----------------------

- new module auxdata with function :func:`pyroSAR.auxdata.dem_autoload` to automatically download tiles of
  different DEM types overlapping with given geometries
- class :class:`pyroSAR.S1.OSV`: reduced search time for new RES orbit state vector files;
  included more meaningful status messages

GAMMA API
---------

- new function :func:`pyroSAR.gamma.srtm.dem_autocreate` to automatically create DEMs in Gamma format from the output
  of function :func:`pyroSAR.auxdata.dem_autoload`
- improved writing of ENVI HDR files from class :class:`pyroSAR.gamma.ISPPar`
- class :class:`pyroSAR.gamma.UTM`: improved to work with newer Gamma versions
- function :func:`pyroSAR.gamma.geocode`:

  + improved documentation
  + clarified code for better readability
  + more consistent naming scheme for all temporarily written files
  + export temporarily written files (e.g. local incidence angle) via new parameter `export_extra`
  + additional parametrization tests to ensure best processing result
  + changed default of parameter `func_interp` to 2 to work best with default of parameter `normalization_method`
    (see documentation of Gamma command pixel_area)

SNAP API
--------

- function :func:`pyroSAR.snap.util.geocode`:

  + export temporarily written files (e.g. local incidence angle) via new parameter `export_extra`

0.9 | 2019-06-15
================

Drivers
-------

- :class:`pyroSAR.drivers.SAFE`: read heading angle, incident angle and image geometry (e.g. Ground Range) from metadata
- :class:`pyroSAR.drivers.Archive`: improved cross-compatibility with Python2 and Python3


SNAP API
--------

- function :func:`pyroSAR.snap.util.geocode`:

  + option to export `DEM` via parameter `export_extra`
  + added Sentinel-1 `ThermalNoiseRemoval` node via new parameter `removeS1ThermalNoise`
  + added `Multilook` node which is executed to approximate the target resolution if necessary
    (currently only for Sentinel-1 since metadata entries `incidence` and `image_geometry` are required)
  + new parameter `groupsize` to split workflows into several groups, which are executed separately with
    intermediate products written to disk. This increases processing speed
  + simplified internal node parametrization for easier use in future functions
  + fail if no POE orbit state vector file is found
  + `Terrain-Flattening`:

    * added additional parameters `additionalOverlap` and `oversamplingMultiple`
    * use bilinear instead of bicubic interpolation
  + `Remove-GRD-Border-Noise`: decrease `borderLimit` from 1000 to 500 (SNAP default)
  + new parameter `gpt_exceptions` to execute workflows containing specific nodes with different GPT versions than
    the default one
  + automatically remove node parameters on GPT fail and re-run the modified workflow; this is relevant if a node is
    executed in an older GPT version (e.g. via parameter `gpt_exceptions`), which does not accept parameters which were
    introduced in later GPT versions (e.g. those described above for node `Terrain-Flattening`)
  + disable/enable terrain flattening via new parameter `terrainFlattening`
  + optionally return workflow filename with new parameter `returnWF`
  + execute custom pyroSAR S1 GRD border noise removal (see :func:`pyroSAR.S1.removeGRDBorderNoise`)
  + new parameters `demResamplingMethod` and `imgResamplingMethod`

GAMMA API
---------

- SRTM Tools renamed to DEM Tools

  + function :func:`pyroSAR.gamma.dem.dem_autocreate`:

    * define arbitrary output CRS and resolution via new parameters `t_srs` and `tr`
    * optionally perform geoid to ellipsoid conversion in either GDAL or GAMMA via new parameter `geoid_mode`

- function :func:`pyroSAR.gamma.geocode`:

  + removed multiplication of backscatter with cosine of incident angle via command `lin_comb`
  + fixed bug in writing correct nodata values to ancillary products defined via parameter `export_extra`
  + changed default of parameter `func_geoback` from 2 to 1 (GAMMA default)

- function :func:`pyroSAR.gamma.correctOSV`:

  + fixed bug in using the first OSV file in a directory for correcting an image, which resulted in S1B files being
    corrected with S1A OSV files. This occasionally resulted in errors of no DEM overlap while processing S1B scenes

- fixed bug in treating GAMMA image pixel coordinates as top left instead of pixel center. This is relevant for writing
  ENVI HDR files for GAMMA images via function :func:`pyroSAR.gamma.par2hdr` resulting in the image to be shifted
  by 1/2 pixel to Southeast

Command Parser
++++++++++++++
- compatibility with GAMMA version released in November 2018
- delete parsed modules if environment variable `GAMMA_HOME` was reset causing them to be re-parsed with the new version
  on module import

general functionality
---------------------

- new function :func:`pyroSAR.ancillary.multilook_factors` to compute factors depending on image geometry and target resolution
- :func:`pyroSAR.S1.removeGRDBorderNoise`: reached Python3 compatibility

Auxiliary Data Handling
-----------------------

- new function :func:`pyroSAR.auxdata.dem_create` for convenient creation of DEM mosaics as downloaded by
  :func:`pyroSAR.auxdata.dem_autoload`

- function :func:`pyroSAR.auxdata.dem_autoload`: download 1 degree tiles instead of 5 degree tiles

- class :class:`pyroSAR.S1.OSV`:

  + download files specific to the Sentinel-1 sensor (S1A/S1B) instead of all matching the acquisition time
  + improved time span search, which occasionally resulted in missing OSV files

0.9.1 | 2019-07-05
==================

Auxiliary Data Handling
-----------------------

- function :func:`pyroSAR.auxdata.dem_create`: new parameter `resampling_method`

GAMMA API
---------

- function :func:`pyroSAR.gamma.dem.dem_autocreate`: new parameter `resampling_method`

SNAP API
--------

- function :func:`pyroSAR.snap.util.geocode`: fixed typo of parameter `removeS1BorderNoise`

0.10 | 2019-12-06
=================

Drivers
-------

- method :meth:`~pyroSAR.drivers.ID.bbox`: choose the output vector file format via new parameter `driver` or by
  using one of spatialist's supported file name extensions (see :meth:`spatialist.vector.Vector.write`)

- :class:`pyroSAR.drivers.SAFE`

  + new method :meth:`~pyroSAR.drivers.SAFE.quicklook` for writing KMZ quicklooks
  + method :meth:`~pyroSAR.drivers.SAFE.getOSV`: renamed parameter `outdir` to `osvdir`

- :class:`pyroSAR.drivers.Archive`: remove scenes from the database if they cannot be found at their file location.
  This is performed at each initialization of an `Archive` object.

GAMMA API
---------

- new parameter `basename_extensions` for adding extra metadata fields to output image names; affects:

  + :func:`pyroSAR.gamma.convert2gamma`
  + :func:`pyroSAR.gamma.geocode`

- :func:`pyroSAR.gamma.correctOSV`: make use of OSV files in SNAP's auxdata structure
- :func:`pyroSAR.gamma.geocode`: made border nose removal optional with new parameter `removeS1BorderNoise`

SNAP API
--------
- workflow parsing

  + improved output XML for better display in SNAP GUI
  + support for nodes with multiple input scenes, e.g. `SliceAssembly`

- SAR processor (function :func:`~pyroSAR.snap.auxil.gpt`)

  + write Sentinel-1 manifest.safe with processing results
  + two methods for border noise removal: `ESA` and `pyroSAR` via new parameter `removeS1BorderNoiseMethod`

- function :func:`pyroSAR.snap.util.geocode`

  + optional speckle filtering with new parameter `speckleFilter`
  + choose the output backscatter reference area (`beta0`/`gamma0`/`sigma0`) with new parameter `refarea`
  + default of parameter `groupsize` changed to 1
  + internally download S1 OSV files
  + internally download SNAP's `EGM96` geoid to `WGS84` ellipsoid DEM conversion lookup table via new function
    :func:`pyroSAR.snap.auxil.get_egm96_lookup`
  + support for multi-scene `SliceAssembly`; can be invoke by passing a list of scenes to parameter `infile`
  + new parameter `removeS1BorderNoiseMethod`
  + new parameter `gpt_args` to pass additional arguments to the GPT call

Datacube Tools
--------------

- :meth:`pyroSAR.datacube_util.Product.export_ingestion_yml`: new parameter `chunking`

Auxiliary Data Handling
-----------------------

- OSV download functionality (class :class:`pyroSAR.S1.OSV`)

  + made definition of OSV download directory optional; default is SNAP's auxdata directory
  + organization of downloaded files into SNAP's auxdata structure:

    * compression to zip
    * sort files into subdirs for sensor, year, month

  + removed method :meth:`~pyroSAR.S1.OSV.update`

Ancillary Tools
---------------
- :func:`pyroSAR.ancillary.parse_datasetname`

  + support for datasets in NetCDF format
  + enable parsing of ancillary products like local incidence angle (\*inc_geo.tif)

- :func:`pyroSAR.ancillary.find_datasets`:  new parameters `start` and `stop` for time filtering

general
-------
- bug fixes and documentation improvements

0.10.1 | 2019-12-12
===================

GAMMA API
---------

- :ref:`Command API <gamma-command-api>` compatibility with GAMMA version 20191203

0.11 | 2020-05-29
=================

Drivers
-------

- :class:`pyroSAR.drivers.Archive`: completely restructured to use the `SQLAlchemy <https://www.sqlalchemy.org/>`_
  Object Relational Mapper (ORM). This makes it possible to switch between SQLite+Spatialite and PostgreSQL+PostGIS
  database backends.

- :meth:`pyroSAR.drivers.SAFE.getOSV`: new argument `returnMatch` to also return the name of an OSV file instead of just
  downloading it.

SNAP API
--------

- arbitrary nodes can now be parsed. Before, only a small selection of nodes (those used by function
  :func:`~pyroSAR.snap.util.geocode`) were available. Now, any node and its default parametrization can be parsed to XML
  from the GPT documentation by internally calling e.g.:

    ::

        gpt Terrain-Flattening -h

  The parsed XML representation is saved for faster future reuse. See function :func:`~pyroSAR.snap.auxil.parse_node`
  for details. In all cases the standard SNAP file suffix is used for output products, e.g. `_TF` for
  `Terrain-Flattening`.

- multi-source nodes like `SliceAssembly` now take any number of sources, not just two.
  See class :class:`~pyroSAR.snap.auxil.Node`.

- function :func:`pyroSAR.snap.util.geocode`:

  + new argument `nodataValueAtSea` to decide whether sea areas are masked out.
    Depends on the quality of the sea mask in the input DEM.
  + automatically download required Sentinel-1 Orbit State Vector (OSV) files.
  + new argument `allow_RES_OSV` to decide whether to allow usage of the less accurate Sentinel-1 RES OSV files in
    case the POE file is not available yet.
  + new argument `demName` to choose the type of the auto-downloaded DEM.

Auxiliary Data Handling
-----------------------

- class :class:`pyroSAR.S1.OSV`:

  + removed progressbar from method :meth:`~pyroSAR.S1.OSV.catch` and made it optional in method
    :meth:`~pyroSAR.S1.OSV.retrieve` with new argument `pbar`

general
-------
- bug fixes, new automated tests, documentation improvements

0.11.1 | 2020-07-17
===================

- bug fixes

GAMMA API
---------

- :ref:`Command API <gamma-command-api>` compatibility with GAMMA version 20200713

0.12 | 2021-02-19
=================

Drivers
-------

- :class:`pyroSAR.drivers.Archive`:

  + new argument `cleanup` to automatically remove missing scenes from database on initialization
  + method :meth:`~pyroSAR.drivers.Archive.insert`: improved insertion speed
  + method :meth:`~pyroSAR.drivers.Archive.select_duplicates`: new argument `value`
  + method :meth:`~pyroSAR.drivers.Archive.get_colnames`: new argument `table` to get column names from arbitrary
    tables, not just the main `data` table
  + method :meth:`~pyroSAR.drivers.Archive.drop_element`: option to remove scene from `data` and `duplicates` tables
    simultaneously by removing argument `table` and adding argument `with_duplicates`
  + method :meth:`~pyroSAR.drivers.Archive.drop_table`:

    * new argument `verbose`
    * remove arbitrary tables, not just `data` and `duplicates`

  + method :meth:`~pyroSAR.drivers.Archive.drop_database`: replaced by new function :func:`pyroSAR.drivers.drop_archive`
  + new method :meth:`~pyroSAR.drivers.Archive.add_tables` to add custom tables to a database
  + bug fixes

- :class:`pyroSAR.drivers.CEOS_PSR`:

  + added support for ALOS-1 PALSAR
  + added basic support for Level 1.0 data

- :class:`pyroSAR.drivers.SAFE`:

  + method :meth:`~pyroSAR.drivers.SAFE.getOSV`: new argument `useLocal` to not search online if local matching
    files are found

GAMMA API
---------

- :ref:`Command API <gamma-command-api>` compatibility with GAMMA version 20201216

- function :func:`pyroSAR.gamma.convert2gamma`:

  + renamed argument `S1_noiseremoval` to `S1_tnr` (thermal noise removal)
  + new argument `S1_bnr` (border noise removal)

- function :func:`pyroSAR.gamma.geocode`:

  + new default ``removeS1BorderNoiseMethod='gamma'``
  + renamed argument `tempdir` to `tmpdir`

SNAP API
--------

- function :func:`pyroSAR.snap.util.geocode`:

  + enable grid alignment with new arguments `alignToStandardGrid`, `standardGridOriginX` and `standardGridOriginY`
  + new argument `tmpdir` to choose the location of temporarily created files
  + bug fixes

- function :func:`pyroSAR.snap.auxil.gpt`:

  + perform custom pyroSAR S1 GRD border noise removal only if IPF<2.9

Auxiliary Data Handling
-----------------------

- function :func:`pyroSAR.auxdata.dem_autoload`: return `None` if a VRT was defined

0.12.1 | 2021-03-09
===================

SNAP API
--------

- function :func:`pyroSAR.snap.util.geocode`:

  + output both sigma0 and gamma0 via argument `refarea`
  + new `export_extra` option 'layoverShadowMask'

- numerous bug fixes and API improvements

Auxiliary Data Handling
-----------------------

- class :class:`pyroSAR.S1.OSV`:

  + download files from https://scihub.copernicus.eu/gnss

0.13 | 2021-09-10
=================

Drivers
-------

- new class :class:`pyroSAR.drivers.EORC_PSR`
- new argument `exist_ok` for ID object unpack methods to enable reuse of already unpacked scenes
- :meth:`pyroSAR.drivers.SAFE.getOSV`: new argument `url_option` to choose between different download URLs
- :class:`pyroSAR.drivers.SAFE` align coordinate sorting of attribute `meta['coordinates']` with CRS description
- :func:`pyroSAR.drivers.identify_many`: disable progressbar by default

GAMMA API
---------

- adaptations to enable processing of :class:`~pyroSAR.drivers.EORC_PSR` data:

  + :func:`pyroSAR.gamma.calibrate`
  + :func:`pyroSAR.gamma.convert2gamma`
  + :func:`pyroSAR.gamma.geocode`

- :func:`pyroSAR.gamma.geocode`:

  + experimental optional refinement of the geocoding lookup table with new argument `refine_lut`
  + removed arguments `normalization_method`, `func_interp`, `removeS1BorderNoise`, `sarSimCC`
  + limit radiometric normalization to RTC correction method
  + simplify and improve computation of RTC contribution area
  + file suffices `pan` and `norm` have been replaced with `gamma0-rtc`
  + argument `export_extra` options:

    * removed `pix_geo`
    * renamed `pix_fine` to `pix_ratio`
    * added `pix_area_sigma0`, `pix_area_sigma0_geo`, `pix_area_gamma0_geo`, `gs_ratio` , `gs_ratio_geo`, `pix_ratio_geo`

  + use a dedicated temporary directory to unpack the scene and write GAMMA files so that they are separated (the GAMMA
    files used to be written to the unpacked scene's directory)
  + enable multiple scenes as input so that they can be mosaiced in SAR geometry before geocoding

- :func:`pyroSAR.gamma.correctOSV`: new argument `directory`

- :func:`pyroSAR.gamma.multilook`: new argument `exist_ok`

- :func:`pyroSAR.gamma.convert2gamma`: new argument `exist_ok`

- function :func:`pyroSAR.gamma.dem.dem_autocreate`:

  + do not apply an extent buffer by default
  + allow geometry in arbitrary CRS

SNAP API
--------

- function :func:`pyroSAR.snap.util.geocode`:

  + new `export_extra` option `scatteringArea`

- extended support for `BandMaths` operator

Auxiliary Data Handling
-----------------------

- method :meth:`pyroSAR.S1.OSV.catch`: new argument `url_option` with two download URLs to choose from

- function :func:`pyroSAR.auxdata.dem_autoload`:

  + added new DEM option `GETASSE30`
  + align pixels of subsetted VRT with original tiles

- function :func:`pyroSAR.auxdata.dem_create`:

  + new argument `outputBounds`

general
-------
- replaced print messages with logging. This made the `verbose` argument that was used by several functions and
  methods obsolete; affects the following:

  + :func:`pyroSAR.drivers.identify_many`: replaced by argument `pbar`
  + :meth:`pyroSAR.drivers.Archive.add_tables`: removed
  + :meth:`pyroSAR.drivers.Archive.drop_table`: removed
  + :meth:`pyroSAR.drivers.Archive.insert`: replaced by argument `pbar`
  + :meth:`pyroSAR.drivers.Archive.import_outdated`: removed
  + :meth:`pyroSAR.drivers.Archive.move`: replaced by argument `pbar`
  + :meth:`pyroSAR.drivers.Archive.select`: removed
  + :func:`pyroSAR.snap.auxil.execute`: removed

  See section :doc:`Logging </general/logging>` for details.

0.14.0 | 2021-10-12
===================

Drivers
-------
- raise more appropriate errors (`c430c59 <https://github.com/johntruckenbrodt/pyroSAR/commit/c430c59289016b5fe2e0f3044225dc5166c39e80>`_)

- :func:`pyroSAR.drivers.findfiles`: removed (functionality contained in :meth:`pyroSAR.drivers.ID.findfiles`,
  now making use of :func:`spatialist.ancillary.finder`)

- :meth:`pyroSAR.drivers.Archive.select`:

  + show progressbar for scene identification if ``pbar=True``
  + enabled input of :obj:`~datetime.datetime` objects for arguments ``mindate`` and ``maxdate``

- :func:`pyroSAR.drivers.identify_many`: issue a warning when a file cannot be accessed
  (instead of raising a :obj:`PermissionError`)

GAMMA API
---------
- :func:`pyroSAR.gamma.dem.dem_autocreate`: support for new DEM options provided by :func:`pyroSAR.auxdata.dem_autoload`

SNAP API
--------
- :func:`pyroSAR.snap.auxil.get_egm96_lookup` removed in favor of new function :func:`pyroSAR.auxdata.get_egm_lookup`

Auxiliary Data Handling
-----------------------
- method :meth:`pyroSAR.S1.OSV.retrieve`: thread-safe writing of orbit files

- new function :func:`pyroSAR.auxdata.get_egm_lookup`

- function :func:`pyroSAR.auxdata.dem_create`

  + new geoid option 'EGM2008'
  + make use of :func:`~pyroSAR.auxdata.get_egm_lookup` for auto-download of EGM lookup files
  + several bug fixes related to vertical CRS transformation
  + bug fix for target pixel alignment

- function :func:`pyroSAR.auxdata.dem_autoload`: new DEM options:

  + 'Copernicus 10m EEA DEM'
  + 'Copernicus 30m Global DEM'
  + 'Copernicus 90m Global DEM'

general
-------
- replaced http URLs with https where applicable
- improved documentation

0.15.0 | 2022-01-04
===================

Drivers
-------
- :meth:`pyroSAR.drivers.ID.geometry`: new method

GAMMA API
---------
- :ref:`Command API <gamma-command-api>` compatibility with GAMMA version 20211208

- renamed argument `resolution` to `spacing`; affects:

  + :func:`pyroSAR.gamma.geocode`
  + :func:`pyroSAR.gamma.ovs`
  + :func:`pyroSAR.gamma.multilook`

- function :func:`pyroSAR.gamma.calibrate`

  + removed argument `replace`
  + added argument `return_fnames`

- function :func:`pyroSAR.gamma.convert2gamma`

  + added argument `return_fnames`

- function :func:`pyroSAR.gamma.multilook`

  + pass multiple Sentinel-1 sub-swaths to argument `infile` which are then
    combined into a single MLI using GAMMA command `isp.multi_look_ScanSAR`

- class :class:`pyroSAR.gamma.ISPPar`:

  + new object attribute `filetype` with possible values 'isp' and 'dem'

SNAP API
--------
- function :func:`pyroSAR.snap.util.geocode`:

  + enabled SLC processing
  + enable processing of sigma nought RTC
  + new `export_extra` argument `gammaSigmaRatio`
  + simplified workflow by writing layover-shadow mask directly from `Terrain-Correction`
  + changed processing node sequence:

    * was: Read->ThermalNoiseRemoval->SliceAssembly->Remove-GRD-Border-Noise->Calibration
    * is:  Read->Remove-GRD-Border-Noise->Calibration->ThermalNoiseRemoval->SliceAssembly

  + new output image naming scheme, e.g.

    * S1A__IW___A_20210914T191350_VV_gamma0-rtc.tif
    * S1A__IW___A_20210914T191350_VH_sigma0-elp.tif

- function :func:`pyroSAR.snap.auxil.gpt`:

  + removed argument `multisource`
  + added argument `tmpdir`

Auxiliary Data Handling
-----------------------
- function :func:`pyroSAR.auxdata.dem_autoload`:

  + updated version of 'Copernicus 10m EEA DEM' from '2020_1' to '2021_1'
  + new DEM options:

    * 'Copernicus 30m Global DEM II'
    * 'Copernicus 90m Global DEM II'

general
-------
- compatibility with sqlalchemy>=1.4

0.15.1 | 2022-01-07
===================
general
-------
- bug fixes

0.16.0 | 2022-03-03
===================

Drivers
-------
- :class:`pyroSAR.drivers.BEAM_DIMAP`: new driver supporting SNAP's BEAM-DIMAP format
- :class:`pyroSAR.drivers.SAFE`:

  + corrected SLC metadata (was read from first sub-swath, now from center sub-swath or as sum of all sub-swaths):
    center: spacing, heading, incidence; sum: samples, lines
  + new property :attr:`pyroSAR.drivers.SAFE.resolution`

Auxiliary Data Handling
-----------------------
- create water body mask mosaics from ancillary DEM products. Affects the following:

  + function :func:`pyroSAR.auxdata.dem_autoload`: new arguments `nodata` and `hide_nodata`

- function :func:`pyroSAR.auxdata.dem_create`:

  + new arguments `pbar` and `threads`

SNAP API
--------
- new method :meth:`pyroSAR.snap.auxil.Par_BandMath.add_equation`
- new function :func:`pyroSAR.snap.util.noise_power`
- new function :func:`pyroSAR.snap.auxil.erode_edges`
- function :func:`pyroSAR.snap.auxil.writer`:

  + new arguments `clean_edges` and `clean_edges_npixels`
    (to make use of function :func:`~pyroSAR.snap.auxil.erode_edges`)
  + enabled conversion of BEAM-DIMAP files

- function :func:`pyroSAR.snap.util.geocode`:

  + new arguments `clean_edges` and `clean_edges_npixels` (see function :func:`~pyroSAR.snap.auxil.writer`)
  + renamed argument `tr` to `spacing`
  + new arguments `rlks` and `azlks` to manually set the number of looks

GAMMA API
---------
- function :func:`pyroSAR.gamma.geocode`:

  + new arguments `rlks` and `azlks`

- function :func:`pyroSAR.gamma.multilook`:

  + new arguments `rlks` and `azlks`

general
-------
- correction of multi-look factor computation. Before: approximate target pixel spacing but never exceed it.
  Now: first best approximate the azimuth spacing as close as possible (even if this means exceeding the target spacing)
  and then choose the range looks to approximate a square pixel as close as possible. API changes:

  + function :func:`pyroSAR.ancillary.multilook_factors`:

    * renamed argument `sp_rg` to `source_rg`
    * renamed argument `sp_az` to `source_az`
    * replaced arguments `tr_rg` and `tr_az` with unified `target`

0.16.1 | 2022-03-07
===================

Auxiliary Data Handling
-----------------------
- function :func:`pyroSAR.auxdata.get_egm_lookup`:

  + changed URL for PROJ geoid models, which results in better performance for
    function :func:`pyroSAR.auxdata.dem_create`
    (See `pyroSAR#200 <https://github.com/johntruckenbrodt/pyroSAR/issues/200>`_).

0.16.2 | 2022-03-14
===================

SNAP API
--------
- function :func:`pyroSAR.snap.util.noise_power`: added missing orbit state vector refinement

0.16.3 | 2022-03-23
===================

SNAP API
--------
- function :func:`pyroSAR.snap.util.noise_power`: pass argument `cleanup` to :func:`~pyroSAR.snap.auxil.gpt` call
- function :func:`~pyroSAR.snap.auxil.gpt`: shortened names of temporary directories
- function :func:`~pyroSAR.snap.auxil.erode_edges`: fixed bug in polygon selection
- function :func:`~pyroSAR.snap.auxil.writer`: do not erode edges of layover-shadow mask

0.17.0 | 2022-05-30
===================

SNAP API
--------

- function :func:`pyroSAR.snap.erode_edges`: reuse mask for all images

GAMMA API
---------

- new function :func:`pyroSAR.gamma.dem.dem_import`

- function :func:`pyroSAR.gamma.geocode`:

  + new argument `update_osv`

general
-------

- full support for Sentinel-1 stripmap mode; renamed `SM` naming pattern to `S1..S6` to differentiate different beams
- bug fixes

0.17.2 | 2022-06-23
===================

Auxiliary Data Handling
-----------------------
- function :func:`pyroSAR.auxdata.dem_create`:

  + use maximum possible value of `dtype` (e.g. 255 for unit8) instead of -32767.0 if the nodata value cannot be read from the source file
  + always use the same value for source and destination nodata

0.17.3 | 2022-07-03
===================

Auxiliary Data Handling
-----------------------
- function :func:`pyroSAR.auxdata.dem_create`:

  + In case the nodata value could not be read from the source file, the function used to define a value itself, which is prone to errors. This value now needs to be set by a user via new argument `nodata` if it cannot be read from the source file.
  + bug fix: no longer try to download 'Copernicus 30m Global DEM' or 'Copernicus 90m Global DEM' tiles that don't exist.

- function :func:`pyroSAR.auxdata.dem_autoload`:

  + new argument `dst_nodata`. This can be used to temporarily override the native nodata value for extrapolation of ocean areas (in combination with ``hide_nodata=True``).

0.18.0 | 2022-08-24
===================

Drivers
-------
- method :meth:`pyroSAR.drivers.SAFE.quicklook`: new argument `na_transparent`
- new class :class:`~pyroSAR.drivers.TDM`
- method :meth:`pyroSAR.drivers.TSX.getCorners`: fixed bug in longitude computation
- class :class:`~pyroSAR.drivers.ESA`: improved support for ERS and ASAR


GAMMA API
---------
- :ref:`Command API <gamma-command-api>` compatibility with GAMMA version 20220629

SNAP API
--------
- compatibility with SNAP version 9
- function :func:`~pyroSAR.snap.util.geocode`: improved support for ERS and ASAR

0.19.0 | 2022-09-28
===================

Drivers
-------
- class :class:`pyroSAR.drivers.ESA`: added support for ASAR WSM

SNAP API
--------
- new convenience functions:

  + :func:`pyroSAR.snap.auxil.geo_parametrize`
  + :func:`pyroSAR.snap.auxil.sub_parametrize`
  + :func:`pyroSAR.snap.auxil.mli_parametrize`
  + :func:`pyroSAR.snap.auxil.dem_parametrize`

- function :func:`pyroSAR.snap.auxil.orb_parametrize`: removed args `workflow`, `before`, `continueOnFail`; added `kwargs`
- function :func:`pyroSAR.snap.auxil.erode_edges`: extended to also take a BEAM-DIMAP product as input or a folder of multiple ENVI files (and not just and individual ENVI file)
- function :func:`pyroSAR.snap.auxil.Workflow.insert_node`: option to insert multiple nodes at once

Auxiliary Data Handling
-----------------------
- function :func:`pyroSAR.auxdata.dem_autoload`:

  + new argument `crop` to optionally return the full extent of all overlapping DEM tiles
  + added download status print messages
  + download and modify a Copernicus DEM index file for future reuse; this removes the need to search the FTP server for files and thus greatly accelerates the process of collecting all files overlapping with the AOI

0.20.0 | 2022-12-27
===================

Drivers
-------
- class :class:`pyroSAR.drivers.ESA`: changed ASAR orbit type from DELFT to DORIS
- class :class:`pyroSAR.drivers.BEAM_DIMAP`: new attributes `meta['incidence']` and `meta['image_geometry']`
- class :class:`pyroSAR.drivers.Archive`: new argument `date_strict` for method :meth:`~pyroSAR.drivers.Archive.select`

SNAP API
--------
- function :func:`pyroSAR.snap.util.geocode`: force multi-looking for ERS1, ERS2, ASAR even if range and azimuth factor are both 1

Auxiliary Data Handling
-----------------------
- function :func:`pyroSAR.auxdata.dem_autoload`:

  + no longer require DEM tiles for creating a mosaic to address ocean cases
  + simplified handling and removed arguments `nodata`, `dst_nodata` and `hide_nodata`
  + the DEM option 'Copernicus 30m Global DEM' now also includes several auxiliary layers that can be downloaded automatically
  + the URLs for DEM options 'SRTM 3Sec' and 'TDX90m' have been updated

- function :func:`pyroSAR.auxdata.dem_create`:

  + option to customize the output DEM via additional keyword arguments to be passed to :func:`spatialist.auxil.gdalwarp`
  + no longer require a nodata value

0.21.0 | 2023-05-11
===================

Drivers
-------
- class :class:`pyroSAR.drivers.Archive`:

  + improved PostgreSQL connection stability
  + method :meth:`~pyroSAR.drivers.Archive.select`: the `vectorobject` geometry is now cloned before being reprojected to EPSG:4326 so that the source geometry remains unaltered

GAMMA API
---------
- the `LAT` module is no longer needed: new pyroSAR-internal implementations can be used if the module is missing (concerns commands `product`, `ratio` and `linear_to_dB`)
- improved backwards compatibility:

  + use `multi_look_ScanSAR` if present and `multi_S1_TOPS` otherwise
  + use `gc_map2` if possible (present and with all needed arguments) and `gc_map` otherwise
  + addressed the case where `gc_map` does not have an argument `OFF_par`

- function `gamma.pixel_area_wrap`: new argument `exist_ok` (this function will be made more visible in the documentation once matured)
- bug fixes:

  + :func:`pyroSAR.gamma.convert2gamma`: raise an error if `S1_bnr=True` but the GAMMA command does not support border noise removal
  + :func:`pyroSAR.gamma.geocode`: removed unneeded underscore in HDR file naming
  + `gamma.pixel_area_wrap`: fixed some issues with occasionally missing intermediate files, e.g. for computing ratios

SNAP API
--------
- function :func:`pyroSAR.snap.util.geocode`: new argument `dem_oversampling_multiple` with default 2 to increase the DEM oversampling factor for terrain flattening
- function :func:`pyroSAR.snap.auxil.erode_edges`:

  + do not attempt to perform erosion if the image only contains nodata (this might happen if only parts of the image were geocoded)
  + make sure that a backscatter image is used for erosion (auxiliary data like the local incidence angle often has a larger valid data extent and using such image for erosion would thus not properly erode edges of the backscatter images; additionally this has the effect that all images will have the same valid data extent after erosion)
  + the written mask files (delineating valid data and nodata after erosion of the backscatter image and used for masking all other images) are now compressed (deflate) so that data volume is decreased significantly

Auxiliary Data Handling
-----------------------
- function :func:`pyroSAR.auxdata.dem_create`:

  + new argument `resampleAlg` to change the resampling algorithm

0.22.0 | 2023-09-21
===================

Drivers
-------
- class :class:`pyroSAR.drivers.Archive`:

  + allow multiple products with same `outname_base`, e.g. Sentinel-1 GRD and SLC; this required the introduction of a second primary key in the database
  + method :meth:`~pyroSAR.drivers.Archive.import_outdated`: option to import data from an old database with only one primary key; this requires the old
    database to be opened in legacy mode (new argument `legacy=True`)

- class :class:`pyroSAR.drivers.SAFE`: support for handling Sentinel-1 OCN products (metadata reading and database handling)

Auxiliary Data Handling
-----------------------
- class :class:`pyroSAR.auxdata.DEMHandler`: enabled handling of southern hemisphere geometries.

0.22.1 | 2023-10-11
===================

Drivers
-------
- class :class:`pyroSAR.drivers.BEAM_DIMAP`: enable calling inherited method :meth:`~pyroSAR.drivers.ID.geometry`

0.22.2 | 2023-11-16
===================

SNAP API
--------
- function :func:`pyroSAR.snap.auxil.writer`: fixed bug in ignoring `erode_edges` argument
- function :func:`pyroSAR.snap.auxil.erode_edges`: enable handling of polarimetric matrices

Drivers
-------
- function :func:`pyroSAR.drivers.identify`: enable reading of :class:`~pyroSAR.drivers.TDM` products

Misc
----
- class :class:`pyroSAR.examine.ExamineGamma`: enhanced flexibility in finding GAMMA installation

0.23.0 | 2023-11-23
===================

Drivers
-------
- class :class:`pyroSAR.drivers.Archive`: fixed bug in loading spatialite on Darwin-based systems

Auxiliary Data Handling
-----------------------

changes to Sentinel-1 OSV data handling:

- method :meth:`pyroSAR.S1.OSV.catch`:

  + removed `url_option` 1 (https://scihub.copernicus.eu/gnss)
  + made option 2 the new default option 1 (https://step.esa.int/auxdata/orbits/Sentinel-1)

- added new arguments to the following functions:

  + :func:`pyroSAR.gamma.correctOSV`: `url_option`
  + :func:`pyroSAR.gamma.geocode`: `s1_osv_url_option`
  + :func:`pyroSAR.snap.auxil.orb_parametrize`: `url_option`
  + :func:`pyroSAR.snap.util.geocode`: `s1_osv_url_option`
  + :func:`pyroSAR.snap.util.noise_power`: `osv_url_option`

0.24.0 | 2024-01-10
===================

Drivers
-------
- new base attribute `coordinates`
- enable method :meth:`~pyroSAR.drivers.ID.geometry` for all driver classes
- classes :class:`~pyroSAR.drivers.ESA` and :class:`~pyroSAR.drivers.CEOS_ERS`: removed call to `gdalinfo`
  (for increased test capability and speed)
- outsourced regular expressions for product identification into separate module `patterns`

Auxiliary Data Handling
-----------------------
- method :meth:`pyroSAR.S1.OSV.catch`: fixed bug in finding files starting in previous month

0.25.0 | 2024-04-16
===================

Drivers
-------
- class :class:`pyroSAR.drivers.Archive`:

  + replaced column `bbox` with `geometry`; requires database migration
  + method :meth:`~pyroSAR.drivers.Archive.export2shp`: improved column name laundering

SNAP API
--------
- function :func:`pyroSAR.snap.auxil.gpt`: fixed bug that occurred during removal of BNR node

Ancillary Tools
---------------
- new classes :class:`pyroSAR.ancillary.Lock` and :class:`pyroSAR.ancillary.LockCollection`
  for custom file/folder locking

Auxiliary Data Handling
-----------------------
- function :func:`pyroSAR.auxdata.dem_create`:

  + make use of new classes :class:`~pyroSAR.ancillary.Lock` and :class:`~pyroSAR.ancillary.LockCollection`
    for DEM download and mosaic creation (new argument `lock_timeout`)
  + check whether all VRT source files exist

0.26.0 | 2024-05-15
===================

SNAP API
--------
- compatibility with SNAP 10.
- completely revised configuration mechanisms. See

  + :doc:`/general/configuration`
  + :class:`pyroSAR.examine.ExamineSnap`
  + :class:`pyroSAR.examine.SnapProperties`

0.26.1 | 2024-10-01
===================

Drivers
-------
- method :meth:`pyroSAR.drivers.Archive.select`: do not accept multi-feature vectorobjects

SNAP API
--------
- fixed bug in writing SNAP properties configuration

Auxiliary Data Handling
-----------------------
- class :class:`pyroSAR.auxdata.DEMHandler`: lock created VRT files

0.27.0 | 2024-12-19
===================

Auxiliary Data Handling
-----------------------
- class :class:`pyroSAR.S1.OSV`: fixed bug in searching STEP OSV repository
- function :func:`pyroSAR.auxdata.dem_create`: removed argument `lock_timeout`, do no longer lock the target file.
- function :func:`pyroSAR.auxdata.dem_autoload`: the target VRT file is no longer locked. However, the individual downloaded DEM tiles now are.

Ancillary Tools
---------------
- classes :class:`~pyroSAR.ancillary.Lock` and :class:`~pyroSAR.ancillary.LockCollection`:
  enable nested locking

Misc
----
- removed upper Python dependency limit

0.28.0 | 2025-02-20
===================

General
-------
- support for SNAP 11 (tested, no modifications necessary)
- support for Sentinel-1C and D

Drivers
-------
- function :func:`pyroSAR.drivers.identify_many`: new argument `cores` for parallel scene identification
- class :class:`pyroSAR.drivers.SAFE`: enable unzipping of products from CDSE

Auxiliary Data Handling
-----------------------
- removed option for `TDX90m` DEM download because the FTP server has been shut down
  (perhaps reactivated in the future if HTTPS authentication can be implemented)

0.29.0 | 2025-04-09
===================

General
-------
- extended support for Sentinel-1C and D

Drivers
-------
- :meth:`pyroSAR.drivers.SAFE.geo_grid`: new method

0.29.1 | 2025-05-12
===================

SNAP API
--------
- support for SNAP 12

0.30.0 | 2025-05-14
===================

Drivers
-------
- changed polygon coordinate order to counter-clockwise for methods

  - :meth:`pyroSAR.drivers.ID.bbox`
  - :meth:`pyroSAR.drivers.ID.geometry`
- method :meth:`pyroSAR.drivers.Archive.select`: new argument `return_value`

0.30.1 | 2025-08-22
===================

Drivers
-------
- :class:`~pyroSAR.drivers.ESA`: read all `GEOLOCATION GRID ADS` segments to obtain GCPs, not just the first one (bugfix)

GAMMA API
---------
- support for GAMMA version 20250625
- support for polar stereographic projections (via :meth:`~pyroSAR.gamma.auxil.ISPPar.envidict`)
- class :class:`~pyroSAR.gamma.auxil.ISPPar`: raise error if file type is unknown
  (instead of setting the `filetype` attribute to `unknown`)
- :func:`~pyroSAR.gamma.util.pixel_area_wrap`:

  + create ENVI HDR files for inputs to :func:`~pyroSAR.gamma.util.lat_ratio` (bugfix)
  + fixed bug in ignoring conditions for writing ENVI HDR files of `pix*` and `gs_ratio` products

- improved readability of tests

0.31.0 | 2025-09-23
===================

Drivers
-------
- :meth:`pyroSAR.drivers.ID.bbox`: new argument `buffer`
- :class:`~pyroSAR.drivers.SAFE`, :class:`~pyroSAR.drivers.BEAM_DIMAP`: new argument `looks`
- :class:`~pyroSAR.drivers.Archive`: context-manage all database handles (code improvement)

GAMMA API
---------
- :func:`~pyroSAR.gamma.util.convert2gamma`, :func:`~pyroSAR.gamma.util.correctOSV`: add file locking
- fixed argument names of `isp.MLI_cat`

0.32.0 | 2025-10-29
===================

SNAP API
--------
- :func:`~pyroSAR.snap.auxil.orb_parametrize`: improved ERS/ASAR orbit handling (more work necessary to always select the best available file, because all options are limited in time (e.g. use option 1 if possible, fall back to option 2 otherwise, etc.); needs a download functionality like :class:`pyroSAR.S1.auxil.OSV` to know which ones are available)
- :func:`~pyroSAR.snap.util.geocode`:

  + explicitly use 'Latest Auxiliary File' for Envisat calibration (just for readability, this is already the default value of the parsed node; other options: 'Product Auxiliary File', 'External Auxiliary File')
  + leave calibration node polarizations field empty when processing all polarizations (otherwise processing may finish without errors but no product is being written; looks like a SNAP bug, also reported in `step-44830 <https://forum.step.esa.int/t/naming-of-source-bands/44830>`_)
  + `Calibration` in/out band handling improvements

    * select source bands based on sensor and acquisition mode (also described in `step-44830 <https://forum.step.esa.int/t/naming-of-source-bands/44830>`_)
    * more explicit handling of output bands: all that are not needed set to `False`
    * commented out output bands that are apparently not needed

  + fixed sarsim-cc geocoding:

    * old: `SAR-Simulation->Cross-Correlation->Terrain-Flattening->SARSim-Terrain-Correction` (does not work because `Terrain-Flattening` does not pass through any source layers)
    * new: `SAR-Simulation->Cross-Correlation->Warp->Terrain-Flattening->Terrain-Correction`
    * this reveals a flaw in current SNAP processing: the additional `Warp` step introduces unnecessary resampling, the created lookup table is not passed between operators and thus makes the process inefficient, the whole procedure only works with EPSG:4326 as map geometry thus, by the looks of it, requiring three forward geocoding steps (for `SAR-Simulation`, `Terrain-Flattening` and `Terrain-Correction`, respectively)

- :func:`~pyroSAR.snap.auxil.groupbyWorkers`: add `Warp` operator to the group of its source node, because it cannot be executed alone (just like `ThermalNoiseRemoval`)
- ancillary layer writing fix: a layover-shadow-mask can also be created by `SAR-Simulation`, but the output layer is named differently ('layover_shadow_mask' instead of 'layoverShadowMask' by `Terrain-Correction`); this must be handled correctly in :func:`pyroSAR.snap.auxil.writer`

Drivers
-------
- :class:`~pyroSAR.drivers.ESA`:

  + :meth:`~pyroSAR.drivers.ESA.scanMetadata`:

    * read out all MPH, SPH, DSD and GEOLOCATION_GRID_ADS metadata and expose it via `meta['origin']`
    * use absolute orbit number as `frameNumber` instead of product counter (which often seems to be 0)
    * convert original metadata to Python types (int, float, datetime)
    * renamed several meta attributes:

      - `incidenceAngleMin` -> `incidence_nr`
      - `incidenceAngleMax` -> `incidence_fr`
      - `rangeResolution`, `azimuthResolution` -> `resolution` (tuple)
      - `neszNear`, `neszFar` -> `nesz` (tuple)

  + new method :meth:`~pyroSAR.drivers.ESA.geo_grid` (like for `SAFE`)
  + corrected `acquisition_mode` for ASAR WSM, WSS
  + added MR product type

- :class:`~pyroSAR.drivers.BEAM_DIMAP`

  + improved metadata parsing

    * `incidenceAngleMidSwath` not always present, use `incidence_near` and `incidence_far` alternatively
    * the cycle number may be named `orbit_cycle` or `CYCLE`
    * for pyroSAR `frameNumber`, use `ABS_ORBIT`, not `data_take_id` as for Sentinel-1
    * added further `meta` attributes: `swath`, `looks`
    * always four `Polarizations` fields present, some may be set to None -> filtered out
    * for Sentinel-1 the product and acquisition_mode attributes can be obtained from `ACQUISITION_MODE` and `PRODUCT_TYPE` respectively; for ASAR/ERS `ACQUISITION_MODE` is missing and `PRODUCT_TYPE` contains the original values, e.g. 'ASA_APP_1P' -> must be abstracted

  + added MR product type

- :class:`~pyroSAR.drivers.ID`

  + added methods `start_dt` and `stop_dt` returning timezone-aware datetime objects

Ancillary Tools
---------------

- :meth:`~pyroSAR.ancillary.multilook_factors`: fixed bug in returning 0 as range factor

0.32.1 | 2025-11-06
===================

Auxiliary Data Handling
-----------------------
- class :class:`pyroSAR.S1.OSV`: lock local target files for download (to avoid multi-download and conflicts in parallel processes)

0.33.0 | 2025-12-17
===================

Drivers
-------
- :class:`~pyroSAR.drivers.ESA`:

    + convert coordinates in `meta['origin']` to floats
    + read incident angles directly from metadata, not from custom mapping `ANGLES_RESOLUTION` (from which they have been removed)
    + `ERS.mapping` renaming:

          * `ANGLES_RESOLUTION` -> `RESOLUTION_NESZ`
          * `get_angles_resolution` -> `get_resolution_nesz`
          * `range` -> `res_rg`
          * `azimuth` -> `res_az`
          * `nesz_near` -> `nesz_nr`
          * `nesz_far` -> `nesz_fr`

    + made code more robust by reading SPH and DSD sizes from MPH
    + added WSS mode to `RESOLUTION_NESZ` (although all values are just `None` because they could not be found yet)
    + simplified code and added typing

- :class:`~pyroSAR.drivers.BEAM_DIMAP`:

    + more robust incident angle reading

SNAP API
--------
- support for SNAP 13

Ancillary Tools
---------------

- :meth:`~pyroSAR.ancillary.multilook_factors`: complete reimplementation for more robustness

Auxiliary Data Handling
-----------------------
- class :class:`pyroSAR.auxdata.DEMHandler`: handle ocean areas without DEM coverage using a dummy DEM spanning the target extent instead of the whole globe. The latter is no longer supported by GDAL.

0.33.1 | 2026-01-19
===================

Drivers
-------
- :meth:`pyroSAR.drivers.SAFE.geo_grid`: fixed datetime handling bug by requiring spatialist>=0.16.2

0.33.2 | 2026-01-21
===================

Auxiliary Data Handling
-----------------------
- :meth:`S1.OSV.__catch_step_auxdata` do not stop if no file was found on first URL

0.33.3 | 2026-01-30
===================

GAMMA API
---------
- :class:`pyroSAR.gamma.auxil.ISPPar`: fixed `date` attribute handling

0.34.0 | 2026-02-12
===================

Drivers
-------
- :class:`~pyroSAR.drivers.CEOS_PSR`: add new `meta` attributes `heading` and `heading_scene`

Auxiliary Data Handling
-----------------------
- enable global search (the parameter `geometries` is now optional)
- generation of local indices to reduce web traffic
- option to work in offline mode

Ancillary Tools
---------------
- class :class:`~pyroSAR.ancillary.Lock`: fixed bug where lock file would remain on error if target does not exist

SNAP API
--------
- :meth:`pyroSAR.examine.ExamineSnap.get_version`: more robust mechanism to read version information.
  Only the version is returned as string now (instead of a dictionary with version and release date).

- :meth:`pyroSAR.examine.SnapProperties`: support for `snap.conf` files

0.34.1 | 2026-02-12
===================

SNAP API
--------
- :class:`pyroSAR.examine.ExamineSnap`: restore Python 3.10 compatibility (f-string parsing issue)

0.34.2 | 2026-02-13
===================

Ancillary Tools
---------------
- restored Python 3.10 compatibility (import `typing_extensions.Self` instead of `typing.Self` if necessary)

0.34.3 | 2026-02-17
===================

SNAP API
--------
- :class:`pyroSAR.examine.ExamineSnap`: do not call SNAP to read version info in `__init__`

Auxiliary Data Handling
-----------------------
- handle empty URL lists in `DEMHandler.__retrieve`

0.34.4 | 2026-03-03
===================

SNAP API
--------
- :func:`pyroSAR.snap.auxil.erode_edges`: explictly open BEAM-DIMAP .img files with the ENVI driver.
  This was necessary because GDAL 3.12 introduces a new `MiraMonRaster` driver, which is used per default for .img files.

Drivers
-------
- use `MEM` instead of `Memory` as driver for creating in-memory :class:`spatialist.vector.Vector` objects. `Memory` has been deprecated.

0.34.5 | 2026-03-06
===================

SNAP API
--------
- :meth:`pyroSAR.examine.ExamineSnap.get_version`: fixed bug where the X11 environment variable `DISPLAY` was preventing SNAP to start

GAMMA API
---------
- handle subprocess signal kills like segmentation fault (SIGSEGV). Before these were just passed through, now a `RuntimeError` is raised.

0.35.0 | 2026-03-09
===================

Archive
-------
- new module :mod:`pyroSAR.archive` extracted from :mod:`pyroSAR.drivers`
- new protocol class :class:`pyroSAR.archive.SceneArchive` to establish an interface for scene search classes (inherited by :class:`pyroSAR.archive.Archive`).
- method `Archive.encode` has been renamed to :meth:`~pyroSAR.archive.Archive.to_str` and has been reimplemented to be more predictable

Drivers
-------
- :class:`~pyroSAR.drivers.ID`: deleted method `export2sqlite`

0.36.0 | 2026-03-10
===================

GAMMA API
---------

- :func:`pyroSAR.gamma.dem.dem_import`:

    + add `shellscript` argument
    + consistently pass `logpath`, `outdir` and `shellscript` to GAMMA commands

- :func:`pyroSAR.gamma.auxil.process`:

    + replace environment variable `base` in the `shellscript` with `OUTDIR` and corrected its usage.
      Before, the value of `outdir` in the command was just replaced with `$base`.
      This lead to wrong scripts whenever different values for `outdir` were passed to `process`.
      Now, no global variable is set and `OUTDIR` is redefined whenever the value of `outdir` changes, e.g.

      .. code-block:: bash

          OUTDIR=/xyz
          command1 $OUTDIR
          command2 $OUTDIR
          OUTDIR=/abc
          command3 $OUTDIR

    + bugfix: the file header and the declaration of `GAMMA_HOME` are now written to the file even if `outdir=None`

0.36.1 | 2026-03-24
===================

GAMMA API
---------

- :func:`pyroSAR.gamma.util.convert2gamma`: fix error in not removing thermal noise due to GAMMA interface change


================================================
FILE: docs/source/about/projects.rst
================================================
######################
Projects using pyroSAR
######################

pyroSAR is/was used in these projects:

- `BACI <http://www.baci-h2020.eu/index.php/Main/HomePage>`_
- `CCI Biomass <https://climate.esa.int/en/projects/biomass/>`_
- `COPA <https://sentinel.esa.int/web/sentinel/sentinel-1-ard-normalised-radar-backscatter-nrb-product>`_
- `EMSAfrica <https://www.emsafrica.org/>`_
- `GlobBiomass <https://globbiomass.org/>`_
- `SALDi <https://www.saldi.uni-jena.de/>`_
- `SenThIS <https://eos-jena.com/en/projects/>`_
- `Sentinel4REDD <https://www.dlr.de/rd/en/Portaldata/28/Resources/dokumente/re/Projektblatt_Sentinel4REDD_engl.pdf>`_
- `SWOS <https://www.swos-service.eu/>`_
- `BONDS <https://www.biodiversa.org/1418>`_

You know of other projects? We'd be happy to know.


================================================
FILE: docs/source/about/publications.rst
================================================
############
Publications
############

.. bibliography::
    :style: plain
    :list: bullet
    :filter: author % "Truckenbrodt"

================================================
FILE: docs/source/about/references.rst
================================================
.. only:: html or text

    References
    ==========

.. bibliography::
    :style: plain


================================================
FILE: docs/source/api/ancillary.rst
================================================
Ancillary Functions
===================

.. automodule:: pyroSAR.ancillary
    :members:
    :undoc-members:
    :show-inheritance:

    .. autosummary::
        :nosignatures:

        find_datasets
        getargs
        groupby
        groupbyTime
        hasarg
        multilook_factors
        parse_datasetname
        seconds
        Lock
        LockCollection


================================================
FILE: docs/source/api/archive.rst
================================================
Archive
=======

.. automodule:: pyroSAR.archive
    :members:
    :undoc-members:
    :show-inheritance:

    .. autosummary::
        :nosignatures:

        Archive
        drop_archive


================================================
FILE: docs/source/api/auxdata.rst
================================================
Auxiliary Data Tools
====================

.. automodule:: pyroSAR.auxdata
    :members: dem_autoload, dem_create, get_egm_lookup, getasse30_hdr, get_dem_options, DEMHandler
    :undoc-members:
    :show-inheritance:

    .. autosummary::
        :nosignatures:

        dem_autoload
        dem_create
        get_egm_lookup
        getasse30_hdr
        get_dem_options
        DEMHandler


================================================
FILE: docs/source/api/datacube.rst
================================================
Datacube Tools
==============

.. automodule:: pyroSAR.datacube_util
    :members:
    :undoc-members:
    :show-inheritance:


================================================
FILE: docs/source/api/drivers.rst
================================================
Drivers
=======

.. automodule:: pyroSAR.drivers
    :members:
    :undoc-members:
    :show-inheritance:

    .. rubric:: classes

    .. autosummary::
        :nosignatures:

        ID
        BEAM_DIMAP
        CEOS_PSR
        CEOS_ERS
        EORC_PSR
        ESA
        SAFE
        TSX
        TDM

    .. rubric:: functions

    .. autosummary::
        :nosignatures:

        identify
        identify_many
        filter_processed
        getFileObj
        parse_date


================================================
FILE: docs/source/api/examine.rst
================================================
Examine
=======

.. automodule:: pyroSAR.examine
    :members:
    :undoc-members:
    :show-inheritance:

    .. autosummary::
        :nosignatures:

================================================
FILE: docs/source/api/figures/snap_geocode.graphml
================================================
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd">
  <!--Created by yEd 3.21.1-->
  <key attr.name="Description" attr.type="string" for="graph" id="d0"/>
  <key for="port" id="d1" yfiles.type="portgraphics"/>
  <key for="port" id="d2" yfiles.type="portgeometry"/>
  <key for="port" id="d3" yfiles.type="portuserdata"/>
  <key attr.name="url" attr.type="string" for="node" id="d4"/>
  <key attr.name="description" attr.type="string" for="node" id="d5"/>
  <key for="node" id="d6" yfiles.type="nodegraphics"/>
  <key for="graphml" id="d7" yfiles.type="resources"/>
  <key attr.name="url" attr.type="string" for="edge" id="d8"/>
  <key attr.name="description" attr.type="string" for="edge" id="d9"/>
  <key for="edge" id="d10" yfiles.type="edgegraphics"/>
  <graph edgedefault="directed" id="G">
    <data key="d0" xml:space="preserve"/>
    <node id="n0">
      <data key="d6">
        <y:ShapeNode>
          <y:Geometry height="30.0" width="85.0" x="451.5279999999999" y="-0.8119999999999976"/>
          <y:Fill color="#6AB0DE" transparent="false"/>
          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="48.677734375" x="18.1611328125" xml:space="preserve" y="5.649414062499986">S1 GRD<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
          <y:Shape type="roundrectangle"/>
        </y:ShapeNode>
      </data>
    </node>
    <node id="n1">
      <data key="d6">
        <y:ShapeNode>
          <y:Geometry height="30.0" width="131.0" x="428.5279999999999" y="240.628"/>
          <y:Fill color="#EEFFCC" transparent="false"/>
          <y:BorderStyle color="#000000" raised="false" type="dashed" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="126.0390625" x="2.48046875" xml:space="preserve" y="5.6494140625">ThermalNoiseRemoval<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
          <y:Shape type="rectangle"/>
        </y:ShapeNode>
      </data>
    </node>
    <node id="n2">
      <data key="d6">
        <y:ShapeNode>
          <y:Geometry height="30.0" width="90.0" x="449.0279999999999" y="376.628"/>
          <y:Fill color="#EEFFCC" transparent="false"/>
          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="87.349609375" x="1.3251953125" xml:space="preserve" y="5.6494140625">Apply-Orbit-File<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
          <y:Shape type="rectangle"/>
        </y:ShapeNode>
      </data>
    </node>
    <node id="n3">
      <data key="d6">
        <y:ShapeNode>
          <y:Geometry height="30.0" width="90.0" x="449.0279999999999" y="494.128"/>
          <y:Fill color="#EEFFCC" transparent="false"/>
          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="51.349609375" x="19.3251953125" xml:space="preserve" y="5.6494140625">Multilook<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
          <y:Shape type="rectangle"/>
        </y:ShapeNode>
      </data>
    </node>
    <node id="n4">
      <data key="d6">
        <y:ShapeNode>
          <y:Geometry height="30.0" width="106.75999999999999" x="440.6479999999999" y="554.1279999999999"/>
          <y:Fill color="#EEFFCC" transparent="false"/>
          <y:BorderStyle color="#000000" raised="false" type="dashed" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="98.705078125" x="4.0274609374999955" xml:space="preserve" y="5.6494140625">Terrain-Flattening<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
          <y:Shape type="rectangle"/>
        </y:ShapeNode>
      </data>
    </node>
    <node id="n5">
      <data key="d6">
        <y:ShapeNode>
          <y:Geometry height="30.0" width="106.75999999999999" x="440.6479999999999" y="704.1279999999999"/>
          <y:Fill color="#EEFFCC" transparent="false"/>
          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="101.359375" x="2.7003124999999955" xml:space="preserve" y="5.6494140625">Terrain-Correction<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
          <y:Shape type="rectangle"/>
        </y:ShapeNode>
      </data>
    </node>
    <node id="n6">
      <data key="d6">
        <y:ShapeNode>
          <y:Geometry height="30.0" width="120.0" x="587.0279999999997" y="376.628"/>
          <y:Fill color="#6AB0DE" transparent="false"/>
          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="116.025390625" x="1.9873046875" xml:space="preserve" y="5.6494140625">RESORB / POEORB<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
          <y:Shape type="roundrectangle"/>
        </y:ShapeNode>
      </data>
    </node>
    <node id="n7">
      <data key="d6">
        <y:ShapeNode>
          <y:Geometry height="30.0" width="85.0" x="587.0279999999997" y="554.1279999999999"/>
          <y:Fill color="#6AB0DE" transparent="false"/>
          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="30.666015625" x="27.1669921875" xml:space="preserve" y="5.6494140625">DEM<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
          <y:Shape type="roundrectangle"/>
        </y:ShapeNode>
      </data>
    </node>
    <node id="n8">
      <data key="d6">
        <y:ShapeNode>
          <y:Geometry height="30.0" width="90.00000000000006" x="449.0279999999999" y="59.18799999999999"/>
          <y:Fill color="#EEFFCC" transparent="false"/>
          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="32.6875" x="28.65625" xml:space="preserve" y="5.6494140625">Read<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
          <y:Shape type="rectangle"/>
        </y:ShapeNode>
      </data>
    </node>
    <node id="n9">
      <data key="d6">
        <y:ShapeNode>
          <y:Geometry height="30.0" width="105.43200000000002" x="261.084" y="240.628"/>
          <y:Fill color="#EEFFCC" transparent="false"/>
          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="99.35546875" x="3.038265625000008" xml:space="preserve" y="5.6494140625">TOPSAR-Deburst<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
          <y:Shape type="rectangle"/>
        </y:ShapeNode>
      </data>
    </node>
    <node id="n10">
      <data key="d6">
        <y:ShapeNode>
          <y:Geometry height="30.0" width="85.0" x="271.3" y="-0.8119999999999976"/>
          <y:Fill color="#6AB0DE" transparent="false"/>
          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="45.35546875" x="19.822265625" xml:space="preserve" y="5.6494140625">S1 SLC<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
          <y:Shape type="roundrectangle"/>
        </y:ShapeNode>
      </data>
    </node>
    <node id="n11">
      <data key="d6">
        <y:ShapeNode>
          <y:Geometry height="30.0" width="131.0" x="248.3" y="180.628"/>
          <y:Fill color="#EEFFCC" transparent="false"/>
          <y:BorderStyle color="#000000" raised="false" type="dashed" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="126.0390625" x="2.48046875" xml:space="preserve" y="5.6494140625">ThermalNoiseRemoval<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
          <y:Shape type="rectangle"/>
        </y:ShapeNode>
      </data>
    </node>
    <node id="n12">
      <data key="d6">
        <y:ShapeNode>
          <y:Geometry height="30.0" width="90.00000000000006" x="268.8" y="59.188"/>
          <y:Fill color="#EEFFCC" transparent="false"/>
          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="32.6875" x="28.656250000000057" xml:space="preserve" y="5.6494140625">Read<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
          <y:Shape type="rectangle"/>
        </y:ShapeNode>
      </data>
    </node>
    <node id="n13" yfiles.foldertype="group">
      <data key="d4" xml:space="preserve"/>
      <data key="d6">
        <y:ProxyAutoBoundsNode>
          <y:Realizers active="0">
            <y:GroupNode>
              <y:Geometry height="391.81646484375" width="190.50000000000136" x="599.5059999999991" y="-38.18846484375"/>
              <y:Fill color="#F5F5F5" transparent="false"/>
              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
              <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="22.37646484375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="190.50000000000136" x="0.0" xml:space="preserve" y="0.0">multi-GRD</y:NodeLabel>
              <y:Shape type="roundrectangle"/>
              <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
              <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
              <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
            </y:GroupNode>
            <y:GroupNode>
              <y:Geometry height="50.0" width="50.0" x="614.2559999999997" y="83.25153515624999"/>
              <y:Fill color="#F5F5F5" transparent="false"/>
              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="22.37646484375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="59.02685546875" x="-4.513427734375" xml:space="preserve" y="0.0">Folder 1</y:NodeLabel>
              <y:Shape type="roundrectangle"/>
              <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
              <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/>
              <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
            </y:GroupNode>
          </y:Realizers>
        </y:ProxyAutoBoundsNode>
      </data>
      <graph edgedefault="directed" id="n13:">
        <node id="n13::n0">
          <data key="d6">
            <y:ShapeNode>
              <y:Geometry height="30.0" width="85.0" x="652.2559999999997" y="-0.8119999999999976"/>
              <y:Fill color="#6AB0DE" transparent="false"/>
              <y:BorderStyle color="#000000" raised="false" type="dashed" width="1.0"/>
              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="58.685546875" x="13.1572265625" xml:space="preserve" y="5.6494140625">S1 GRD 2<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
              <y:Shape type="roundrectangle"/>
            </y:ShapeNode>
          </data>
        </node>
        <node id="n13::n1">
          <data key="d6">
            <y:ShapeNode>
              <y:Geometry height="30.0" width="131.0" x="629.2559999999997" y="240.628"/>
              <y:Fill color="#EEFFCC" transparent="false"/>
              <y:BorderStyle color="#000000" raised="false" type="dashed" width="1.0"/>
              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="126.0390625" x="2.48046875" xml:space="preserve" y="5.6494140625">ThermalNoiseRemoval<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
              <y:Shape type="rectangle"/>
            </y:ShapeNode>
          </data>
        </node>
        <node id="n13::n2">
          <data key="d6">
            <y:ShapeNode>
              <y:Geometry height="30.0" width="90.00000000000006" x="649.7559999999997" y="59.18799999999999"/>
              <y:Fill color="#EEFFCC" transparent="false"/>
              <y:BorderStyle color="#000000" raised="false" type="dashed" width="1.0"/>
              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="32.6875" x="28.65625" xml:space="preserve" y="5.6494140625">Read<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
              <y:Shape type="rectangle"/>
            </y:ShapeNode>
          </data>
        </node>
        <node id="n13::n3">
          <data key="d6">
            <y:ShapeNode>
              <y:Geometry height="30.0" width="85.0" x="652.2559999999997" y="308.628"/>
              <y:Fill color="#EEFFCC" transparent="false"/>
              <y:BorderStyle color="#000000" raised="false" type="dashed" width="1.0"/>
              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="82.0234375" x="1.48828125" xml:space="preserve" y="5.6494140625">SliceAssembly<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
              <y:Shape type="rectangle"/>
            </y:ShapeNode>
          </data>
        </node>
        <node id="n13::n4">
          <data key="d6">
            <y:ShapeNode>
              <y:Geometry height="30.0" width="160.50000000000136" x="614.5059999999991" y="120.62799999999999"/>
              <y:Fill color="#EEFFCC" transparent="false"/>
              <y:BorderStyle color="#000000" raised="false" type="dashed" width="1.0"/>
              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="154.03515625" x="3.232421875000682" xml:space="preserve" y="5.6494140625">Remove-GRD-Border-Noise<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
              <y:Shape type="rectangle"/>
            </y:ShapeNode>
          </data>
        </node>
        <node id="n13::n5">
          <data key="d6">
            <y:ShapeNode>
              <y:Geometry height="30.0" width="90.00000000000011" x="649.7559999999999" y="180.628"/>
              <y:Fill color="#EEFFCC" transparent="false"/>
              <y:BorderStyle color="#000000" raised="false" type="dashed" width="1.0"/>
              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="61.36328125" x="14.318359375000114" xml:space="preserve" y="5.6494140625">Calibration<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
              <y:Shape type="rectangle"/>
            </y:ShapeNode>
          </data>
        </node>
      </graph>
    </node>
    <node id="n14">
      <data key="d6">
        <y:ShapeNode>
          <y:Geometry height="30.0" width="90.0" x="449.0279999999999" y="434.128"/>
          <y:Fill color="#EEFFCC" transparent="false"/>
          <y:BorderStyle color="#000000" raised="false" type="dashed" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="41.359375" x="24.3203125" xml:space="preserve" y="5.6494140625">Subset<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
          <y:Shape type="rectangle"/>
        </y:ShapeNode>
      </data>
    </node>
    <node id="n15">
      <data key="d6">
        <y:ShapeNode>
          <y:Geometry height="30.0" width="85.0" x="587.0279999999997" y="434.128"/>
          <y:Fill color="#6AB0DE" transparent="false"/>
          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="24.671875" x="30.1640625" xml:space="preserve" y="5.6494140625">AOI<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
          <y:Shape type="roundrectangle"/>
        </y:ShapeNode>
      </data>
    </node>
    <node id="n16" yfiles.foldertype="group">
      <data key="d4" xml:space="preserve"/>
      <data key="d6">
        <y:ProxyAutoBoundsNode>
          <y:Realizers active="0">
            <y:GroupNode>
              <y:Geometry height="82.37646484375" width="120.0" x="167.0559999999998" y="516.7515351562499"/>
              <y:Fill color="#F5F5F5" transparent="false"/>
              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
              <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="22.37646484375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="120.0" x="0.0" xml:space="preserve" y="0.0">scatteringArea</y:NodeLabel>
              <y:Shape type="roundrectangle"/>
              <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
              <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
              <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
            </y:GroupNode>
            <y:GroupNode>
              <y:Geometry height="50.0" width="50.0" x="0.0" y="60.0"/>
              <y:Fill color="#F5F5F5" transparent="false"/>
              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="22.37646484375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="59.02685546875" x="-4.513427734375" xml:space="preserve" y="0.0">Folder 2</y:NodeLabel>
              <y:Shape type="roundrectangle"/>
              <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
              <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/>
              <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
            </y:GroupNode>
          </y:Realizers>
        </y:ProxyAutoBoundsNode>
      </data>
      <graph edgedefault="directed" id="n16:">
        <node id="n16::n0">
          <data key="d6">
            <y:ShapeNode>
              <y:Geometry height="30.0" width="90.0" x="182.0559999999998" y="554.1279999999999"/>
              <y:Fill color="#EEFFCC" transparent="false"/>
              <y:BorderStyle color="#000000" raised="false" type="dashed" width="1.0"/>
              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="64.703125" x="12.6484375" xml:space="preserve" y="5.6494140625">BandMaths<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
              <y:Shape type="rectangle"/>
            </y:ShapeNode>
          </data>
        </node>
      </graph>
    </node>
    <node id="n17" yfiles.foldertype="group">
      <data key="d4" xml:space="preserve"/>
      <data key="d6">
        <y:ProxyAutoBoundsNode>
          <y:Realizers active="0">
            <y:GroupNode>
              <y:Geometry height="82.37646484375" width="134.296" x="296.7039999999999" y="591.7515351562499"/>
              <y:Fill color="#F5F5F5" transparent="false"/>
              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
              <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="22.37646484375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="134.296" x="0.0" xml:space="preserve" y="0.0">gammaSigmaRatio</y:NodeLabel>
              <y:Shape type="roundrectangle"/>
              <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
              <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
              <y:BorderInsets bottom="0" bottomF="0.0" left="5" leftF="5.092000000000041" right="9" rightF="9.20399999999995" top="0" topF="0.0"/>
            </y:GroupNode>
            <y:GroupNode>
              <y:Geometry height="50.0" width="50.0" x="0.0" y="60.0"/>
              <y:Fill color="#F5F5F5" transparent="false"/>
              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="22.37646484375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="59.02685546875" x="-4.513427734375" xml:space="preserve" y="0.0">Folder 3</y:NodeLabel>
              <y:Shape type="roundrectangle"/>
              <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
              <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/>
              <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
            </y:GroupNode>
          </y:Realizers>
        </y:ProxyAutoBoundsNode>
      </data>
      <graph edgedefault="directed" id="n17:">
        <node id="n17::n0">
          <data key="d6">
            <y:ShapeNode>
              <y:Geometry height="30.0" width="90.0" x="316.79599999999994" y="629.1279999999999"/>
              <y:Fill color="#EEFFCC" transparent="false"/>
              <y:BorderStyle color="#000000" raised="false" type="dashed" width="1.0"/>
              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="64.703125" x="12.6484375" xml:space="preserve" y="5.6494140625">BandMaths<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
              <y:Shape type="rectangle"/>
            </y:ShapeNode>
          </data>
        </node>
      </graph>
    </node>
    <node id="n18" yfiles.foldertype="group">
      <data key="d4" xml:space="preserve"/>
      <data key="d6">
        <y:ProxyAutoBoundsNode>
          <y:Realizers active="0">
            <y:GroupNode>
              <y:Geometry height="202.37646484375" width="165.12400000000133" x="316.79599999999994" y="756.7515351562499"/>
              <y:Fill color="#F5F5F5" transparent="false"/>
              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
              <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="22.37646484375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="165.12400000000133" x="0.0" xml:space="preserve" y="0.0">export_extra</y:NodeLabel>
              <y:Shape type="roundrectangle"/>
              <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
              <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
              <y:BorderInsets bottom="0" bottomF="0.0" left="19" leftF="19.36400000000134" right="0" rightF="0.0" top="0" topF="0.0"/>
            </y:GroupNode>
            <y:GroupNode>
              <y:Geometry height="50.0" width="50.0" x="0.0" y="60.0"/>
              <y:Fill color="#F5F5F5" transparent="false"/>
              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="22.37646484375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="59.02685546875" x="-4.513427734375" xml:space="preserve" y="0.0">Folder 4</y:NodeLabel>
              <y:Shape type="roundrectangle"/>
              <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
              <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/>
              <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
            </y:GroupNode>
          </y:Realizers>
        </y:ProxyAutoBoundsNode>
      </data>
      <graph edgedefault="directed" id="n18:">
        <node id="n18::n0">
          <data key="d6">
            <y:ShapeNode>
              <y:Geometry height="30.0" width="90.0" x="364.04000000000127" y="794.1279999999999"/>
              <y:Fill color="#EEFFCC" transparent="false"/>
              <y:BorderStyle color="#000000" raised="false" type="dashed" width="1.0"/>
              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="31.99609375" x="29.001953125" xml:space="preserve" y="5.6494140625">Write<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
              <y:Shape type="rectangle"/>
            </y:ShapeNode>
          </data>
        </node>
        <node id="n18::n1">
          <data key="d6">
            <y:ShapeNode>
              <y:Geometry height="30.0" width="115.75999999999999" x="351.1600000000013" y="854.1279999999999"/>
              <y:Fill color="#6AB0DE" transparent="false"/>
              <y:BorderStyle color="#000000" raised="false" type="dashed" width="1.0"/>
              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="110.740234375" x="2.5098828124999955" xml:space="preserve" y="5.6494140625">localIncidenceAngle<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
              <y:Shape type="roundrectangle"/>
            </y:ShapeNode>
          </data>
        </node>
        <node id="n18::n2">
          <data key="d6">
            <y:ShapeNode>
              <y:Geometry height="30.0" width="106.75999999999999" x="355.6600000000013" y="914.1279999999999"/>
              <y:Fill color="#6AB0DE" transparent="false"/>
              <y:BorderStyle color="#000000" raised="false" type="dashed" width="1.0"/>
              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="14.001953125" x="46.379023437499995" xml:space="preserve" y="5.6494140625">...<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
              <y:Shape type="roundrectangle"/>
            </y:ShapeNode>
          </data>
        </node>
      </graph>
    </node>
    <node id="n19" yfiles.foldertype="group">
      <data key="d4" xml:space="preserve"/>
      <data key="d6">
        <y:ProxyAutoBoundsNode>
          <y:Realizers active="0">
            <y:GroupNode>
              <y:Geometry height="202.37646484375" width="164.29600000000005" x="504.6520000000012" y="756.7515351562499"/>
              <y:Fill color="#F5F5F5" transparent="false"/>
              <y:BorderStyle color="#000000" type="line" width="1.0"/>
              <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="22.37646484375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="164.29600000000005" x="0.0" xml:space="preserve" y="0.0">backscatter</y:NodeLabel>
              <y:Shape type="roundrectangle"/>
              <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
              <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
              <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
            </y:GroupNode>
            <y:GroupNode>
              <y:Geometry height="50.0" width="50.0" x="0.0" y="60.0"/>
              <y:Fill color="#F5F5F5" transparent="false"/>
              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="22.37646484375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="59.02685546875" x="-4.513427734375" xml:space="preserve" y="0.0">Folder 5</y:NodeLabel>
              <y:Shape type="roundrectangle"/>
              <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
              <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/>
              <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
            </y:GroupNode>
          </y:Realizers>
        </y:ProxyAutoBoundsNode>
      </data>
      <graph edgedefault="directed" id="n19:">
        <node id="n19::n0">
          <data key="d6">
            <y:ShapeNode>
              <y:Geometry height="30.0" width="98.38" x="537.6100000000013" y="794.1279999999999"/>
              <y:Fill color="#EEFFCC" transparent="false"/>
              <y:BorderStyle color="#000000" raised="false" type="dashed" width="1.0"/>
              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="94.03515625" x="2.1724218750000546" xml:space="preserve" y="5.6494140625">LinearToFromdB<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
              <y:Shape type="rectangle"/>
            </y:ShapeNode>
          </data>
        </node>
        <node id="n19::n1">
          <data key="d6">
            <y:ShapeNode>
              <y:Geometry height="30.0" width="90.0" x="541.8000000000013" y="854.1279999999999"/>
              <y:Fill color="#EEFFCC" transparent="false"/>
              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="49.99609375" x="20.001953125" xml:space="preserve" y="5.6494140625">Write (2)<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
              <y:Shape type="rectangle"/>
            </y:ShapeNode>
          </data>
        </node>
        <node id="n19::n2">
          <data key="d6">
            <y:ShapeNode>
              <y:Geometry height="30.0" width="134.29600000000005" x="519.6520000000012" y="914.1279999999999"/>
              <y:Fill color="#6AB0DE" transparent="false"/>
              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="128.716796875" x="2.7896015625000246" xml:space="preserve" y="5.6494140625">sigma0/gamma0 elp/rtc<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
              <y:Shape type="roundrectangle"/>
            </y:ShapeNode>
          </data>
        </node>
      </graph>
    </node>
    <node id="n20">
      <data key="d6">
        <y:ShapeNode>
          <y:Geometry height="30.0" width="90.0" x="449.0279999999999" y="180.628"/>
          <y:Fill color="#EEFFCC" transparent="false"/>
          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="61.36328125" x="14.318359375" xml:space="preserve" y="5.6494140625">Calibration<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
          <y:Shape type="rectangle"/>
        </y:ShapeNode>
      </data>
    </node>
    <node id="n21">
      <data key="d6">
        <y:ShapeNode>
          <y:Geometry height="30.0" width="160.50000000000136" x="413.77799999999917" y="120.62799999999999"/>
          <y:Fill color="#EEFFCC" transparent="false"/>
          <y:BorderStyle color="#000000" raised="false" type="dashed" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="154.03515625" x="3.232421875000682" xml:space="preserve" y="5.6494140625">Remove-GRD-Border-Noise<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
          <y:Shape type="rectangle"/>
        </y:ShapeNode>
      </data>
    </node>
    <node id="n22">
      <data key="d6">
        <y:ShapeNode>
          <y:Geometry height="30.0" width="90.0" x="268.80000000000007" y="120.62799999999999"/>
          <y:Fill color="#EEFFCC" transparent="false"/>
          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="61.36328125" x="14.318359375" xml:space="preserve" y="5.6494140625">Calibration<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
          <y:Shape type="rectangle"/>
        </y:ShapeNode>
      </data>
    </node>
    <edge id="n19::e0" source="n19::n0" target="n19::n1">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e0" source="n5" target="n18::n0">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="90.0" tx="27.259999999998627" ty="0.0"/>
          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e1" source="n3" target="n4">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e2" source="n4" target="n5">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e3" source="n6" target="n2">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e4" source="n7" target="n4">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e5" source="n7" target="n5">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
            <y:Point x="629.5279999999997" y="719.1279999999999"/>
          </y:Path>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="n19::e1" source="n19::n1" target="n19::n2">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="n18::e0" source="n18::n0" target="n18::n1">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
            <y:Point x="328.2519999999999" y="809.1279999999999"/>
            <y:Point x="328.2519999999999" y="869.1279999999999"/>
          </y:Path>
          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="n18::e1" source="n18::n0" target="n18::n2">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
            <y:Point x="328.2519999999999" y="809.1279999999999"/>
            <y:Point x="328.2519999999999" y="929.1279999999999"/>
          </y:Path>
          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e6" source="n0" target="n8">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e7" source="n5" target="n19::n0">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
            <y:Point x="494.0279999999999" y="809.1279999999999"/>
          </y:Path>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e8" source="n1" target="n13::n3">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e9" source="n10" target="n12">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e10" source="n11" target="n9">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e11" source="n9" target="n2">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
            <y:Point x="313.8" y="391.628"/>
          </y:Path>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="n13::e0" source="n13::n0" target="n13::n2">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="n13::e1" source="n13::n1" target="n13::n3">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e12" source="n2" target="n14">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e13" source="n15" target="n14">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e14" source="n4" target="n17::n0">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
            <y:Point x="362.0559999999998" y="569.1279999999999"/>
          </y:Path>
          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e15" source="n17::n0" target="n5">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
            <y:Point x="362.0559999999998" y="719.1279999999999"/>
          </y:Path>
          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e16" source="n3" target="n16::n0">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="-23.52799999999945" sy="-0.12799999999992906" tx="0.0" ty="-0.12799999999992906">
            <y:Point x="227.0559999999998" y="509.00000000000006"/>
          </y:Path>
          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e17" source="n16::n0" target="n5">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="-132.52799999999945" ty="0.0">
            <y:Point x="227.11199999999963" y="719.1279999999999"/>
          </y:Path>
          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
          <y:Arrows source="none" target="none"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e18" source="n4" target="n16::n0">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="-131.84799999999944" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e19" source="n8" target="n21">
      <data key="d9"/>
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e20" source="n21" target="n20">
      <data key="d9"/>
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e21" source="n20" target="n1">
      <data key="d9"/>
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e22" source="n1" target="n2">
      <data key="d9"/>
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e23" source="n13::n3" target="n2">
      <data key="d9"/>
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
            <y:Point x="494.0279999999999" y="323.628"/>
          </y:Path>
          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e24" source="n14" target="n3">
      <data key="d9"/>
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e25" source="n12" target="n22">
      <data key="d9"/>
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e26" source="n22" target="n11">
      <data key="d9"/>
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="n13::e2" source="n13::n2" target="n13::n4">
      <data key="d9"/>
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="n13::e3" source="n13::n4" target="n13::n5">
      <data key="d9"/>
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="n13::e4" source="n13::n5" target="n13::n1">
      <data key="d9"/>
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
  </graph>
  <data key="d7">
    <y:Resources/>
  </data>
</graphml>


================================================
FILE: docs/source/api/figures/workflow_readme.txt
================================================
workflow files were created with the yED Graph Editor (https://www.yworks.com/products/yed)

setting the vector bridge style:
Preferences -> Display -> Bridge Style


================================================
FILE: docs/source/api/gamma/api.rst
================================================
.. _gamma-command-api:

GAMMA Command API
-----------------

This is an attempt to make it easier to execute GAMMA commands by offering automatically parsed Python functions.
Thus, instead of executing the command via shell:

.. code-block:: shell

    offset_fit offs ccp off.par coffs - 0.15 3 0 > offset_fit.log

one can wrap it in a Python script:

.. code-block:: python

    import os
    from pyroSAR.gamma.api import isp

    workdir = '/data/gamma_workdir'

    parameters = {'offs': os.path.join(workdir, 'offs'),
                  'ccp': os.path.join(workdir, 'ccp'),
                  'OFF_par': os.path.join(workdir, 'off.par'),
                  'coffs': os.path.join(workdir, 'coffs'),
                  'thres': 0.15,
                  'npoly': 3,
                  'interact_flag': 0,
                  'logpath': workdir}

    isp.offset_fit(**parameters)

A file `offset_fit.log` containing the output of the command is written in both cases. Any parameters, which should
not be written and need to be set to - in the shell can be omitted in the Python call since all optional parameters
of the functions are already defined with '-' as a default.
The documentation can be called like with any Python function:

.. code-block:: python

    from pyroSAR.gamma.api import isp
    help(isp.offset_fit)

Parser Documentation
********************

.. automodule:: pyroSAR.gamma.parser
    :members:
    :undoc-members:
    :show-inheritance:

API Demo
********

This is a demonstration of an output script as generated automatically by function
:func:`~pyroSAR.gamma.parser.parse_module` for the GAMMA module `ISP`.
Within each function, the command name and all parameters are passed to function
:func:`~pyroSAR.gamma.process`, which converts all input to :py:obj:`str` and then calls the command via the
:mod:`subprocess` module.

.. automodule:: pyroSAR.gamma.parser_demo
    :members:
    :undoc-members:
    :show-inheritance:

================================================
FILE: docs/source/api/gamma/auxil.rst
================================================
Auxiliary functionality
-----------------------

.. automodule:: pyroSAR.gamma.auxil
    :members:
    :undoc-members:
    :show-inheritance:

    .. autosummary::
        :nosignatures:

        do_execute
        ISPPar
        Namespace
        par2hdr
        process
        slc_corners
        Spacing
        UTM

================================================
FILE: docs/source/api/gamma/dem.rst
================================================
DEM tools
---------

.. automodule:: pyroSAR.gamma.dem
    :members: dem_autocreate, dem_import, dempar, fill, hgt, hgt_collect, makeSRTM, mosaic, swap
    :undoc-members:
    :show-inheritance:

    .. autosummary::
        :nosignatures:

        dem_autocreate
        dem_import
        dempar
        fill
        hgt
        hgt_collect
        makeSRTM
        mosaic
        swap

================================================
FILE: docs/source/api/gamma/error.rst
================================================
Error handling
--------------

.. automodule:: pyroSAR.gamma.error
    :members:
    :undoc-members:
    :show-inheritance:

    .. autosummary::
        :nosignatures:

        gammaErrorHandler
        GammaUnknownError

================================================
FILE: docs/source/api/gamma/figures/gamma_geocode.graphml
================================================
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd">
  <!--Created by yEd 3.19.1.1-->
  <key attr.name="Description" attr.type="string" for="graph" id="d0"/>
  <key for="port" id="d1" yfiles.type="portgraphics"/>
  <key for="port" id="d2" yfiles.type="portgeometry"/>
  <key for="port" id="d3" yfiles.type="portuserdata"/>
  <key attr.name="url" attr.type="string" for="node" id="d4"/>
  <key attr.name="description" attr.type="string" for="node" id="d5"/>
  <key for="node" id="d6" yfiles.type="nodegraphics"/>
  <key for="graphml" id="d7" yfiles.type="resources"/>
  <key attr.name="url" attr.type="string" for="edge" id="d8"/>
  <key attr.name="description" attr.type="string" for="edge" id="d9"/>
  <key for="edge" id="d10" yfiles.type="edgegraphics"/>
  <graph edgedefault="directed" id="G">
    <data key="d0" xml:space="preserve"/>
    <node id="n0">
      <data key="d6">
        <y:ShapeNode>
          <y:Geometry height="30.0" width="90.0" x="597.0000000000002" y="179.50000000000009"/>
          <y:Fill color="#EEFFCC" transparent="false"/>
          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="78.033203125" x="5.9833984375" xml:space="preserve" y="6.015625">par_S1_GRD<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
          <y:Shape type="rectangle"/>
        </y:ShapeNode>
      </data>
    </node>
    <node id="n1">
      <data key="d6">
        <y:ShapeNode>
          <y:Geometry height="30.0" width="90.0" x="712.0000000000002" y="236.50000000000009"/>
          <y:Fill color="#EEFFCC" transparent="false"/>
          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="87.701171875" x="1.1494140625" xml:space="preserve" y="6.015625000000028">S1_OPOD_vec<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
          <y:Shape type="rectangle"/>
        </y:ShapeNode>
      </data>
    </node>
    <node id="n2">
      <data key="d6">
        <y:ShapeNode>
          <y:Geometry height="30.0" width="90.0" x="597.0000000000002" y="299.5000000000001"/>
          <y:Fill color="#EEFFCC" transparent="false"/>
          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="92.212890625" x="-1.1064453125" xml:space="preserve" y="6.015625">multi_look_MLI<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
          <y:Shape type="rectangle"/>
        </y:ShapeNode>
      </data>
    </node>
    <node id="n3">
      <data key="d6">
        <y:ShapeNode>
          <y:Geometry height="30.0" width="90.0" x="398.00000000000017" y="366.0000000000001"/>
          <y:Fill color="#EEFFCC" transparent="false"/>
          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="50.875" x="19.5625" xml:space="preserve" y="6.015625">gc_map<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
          <y:Shape type="rectangle"/>
        </y:ShapeNode>
      </data>
    </node>
    <node id="n4">
      <data key="d6">
        <y:ShapeNode>
          <y:Geometry height="30.0" width="90.0" x="597.0000000000002" y="513.7500000000001"/>
          <y:Fill color="#EEFFCC" transparent="false"/>
          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="65.79296875" x="12.103515625" xml:space="preserve" y="6.015625">pixel_area<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
          <y:Shape type="rectangle"/>
        </y:ShapeNode>
      </data>
    </node>
    <node id="n5">
      <data key="d6">
        <y:ShapeNode>
          <y:Geometry height="30.0" width="90.0" x="739.5000000000002" y="573.7500000000001"/>
          <y:Fill color="#EEFFCC" transparent="false"/>
          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="50.41796875" x="19.791015625" xml:space="preserve" y="6.015625">product<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
          <y:Shape type="rectangle"/>
        </y:ShapeNode>
      </data>
    </node>
    <node id="n6">
      <data key="d6">
        <y:ShapeNode>
          <y:Geometry height="30.0" width="90.0" x="597.0000000000002" y="646.7500000000001"/>
          <y:Fill color="#EEFFCC" transparent="false"/>
          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="89.798828125" x="0.1005859375" xml:space="preserve" y="6.015625">geocode_back<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
          <y:Shape type="rectangle"/>
        </y:ShapeNode>
      </data>
    </node>
    <node id="n7">
      <data key="d6">
        <y:ShapeNode>
          <y:Geometry height="30.0" width="90.0" x="597.0000000000002" y="766.7500000000001"/>
          <y:Fill color="#EEFFCC" transparent="false"/>
          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="77.83984375" x="6.080078125" xml:space="preserve" y="6.015625">linear_to_dB<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
          <y:Shape type="rectangle"/>
        </y:ShapeNode>
      </data>
    </node>
    <node id="n8">
      <data key="d6">
        <y:ShapeNode>
          <y:Geometry height="30.0" width="85.0" x="599.5000000000002" y="119.50000000000009"/>
          <y:Fill color="#6AB0DE" transparent="false"/>
          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="49.943359375" x="17.5283203125" xml:space="preserve" y="6.015625">S1 GRD<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
          <y:Shape type="roundrectangle"/>
        </y:ShapeNode>
      </data>
    </node>
    <node id="n9">
      <data key="d6">
        <y:ShapeNode>
          <y:Geometry height="30.0" width="85.0" x="400.50000000000017" y="281.5000000000001"/>
          <y:Fill color="#6AB0DE" transparent="false"/>
          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="31.17578125" x="26.912109375" xml:space="preserve" y="6.015625">DEM<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
          <y:Shape type="roundrectangle"/>
        </y:ShapeNode>
      </data>
    </node>
    <node id="n10">
      <data key="d6">
        <y:ShapeNode>
          <y:Geometry height="30.0" width="129.0319999999998" x="577.9960000000003" y="826.7500000000001"/>
          <y:Fill color="#6AB0DE" transparent="false"/>
          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="128.095703125" x="0.4681484374999627" xml:space="preserve" y="6.015625">gamma0-rtc_geo_dB<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
          <y:Shape type="roundrectangle"/>
        </y:ShapeNode>
      </data>
    </node>
    <node id="n11">
      <data key="d6">
        <y:ShapeNode>
          <y:Geometry height="30.0" width="90.0" x="398.00000000000017" y="766.7500000000001"/>
          <y:Fill color="#EEFFCC" transparent="false"/>
          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="89.798828125" x="0.1005859375" xml:space="preserve" y="6.015625">geocode_back<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
          <y:Shape type="rectangle"/>
        </y:ShapeNode>
      </data>
    </node>
    <node id="n12">
      <data key="d6">
        <y:ShapeNode>
          <y:Geometry height="30.0" width="85.0" x="400.50000000000017" y="826.7500000000001"/>
          <y:Fill color="#6AB0DE" transparent="false"/>
          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="49.87890625" x="17.560546875" xml:space="preserve" y="6.015625">inc_geo<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
          <y:Shape type="roundrectangle"/>
        </y:ShapeNode>
      </data>
    </node>
    <node id="n13">
      <data key="d6">
        <y:ShapeNode>
          <y:Geometry height="30.0" width="30.0" x="627.0000000000002" y="236.50000000000009"/>
          <y:Fill color="#E7F2FA" transparent="false"/>
          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="22.357421875" x="3.8212890625" xml:space="preserve" y="6.015625000000028">mli<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
          <y:Shape type="parallelogram"/>
        </y:ShapeNode>
      </data>
    </node>
    <node id="n14">
      <data key="d6">
        <y:ShapeNode>
          <y:Geometry height="30.0" width="36.0" x="624.0000000000002" y="366.0000000000001"/>
          <y:Fill color="#E7F2FA" transparent="false"/>
          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="29.9921875" x="3.00390625" xml:space="preserve" y="6.015625">mli2<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
          <y:Shape type="parallelogram"/>
        </y:ShapeNode>
      </data>
    </node>
    <node id="n15">
      <data key="d6">
        <y:ShapeNode>
          <y:Geometry height="30.0" width="30.0" x="478.75000000000017" y="426.0000000000001"/>
          <y:Fill color="#E7F2FA" transparent="false"/>
          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="30.689453125" x="-0.3447265625" xml:space="preserve" y="6.015625">dem<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
          <y:Shape type="parallelogram"/>
        </y:ShapeNode>
      </data>
    </node>
    <node id="n16">
      <data key="d6">
        <y:ShapeNode>
          <y:Geometry height="30.0" width="30.0" x="377.25000000000017" y="426.0000000000001"/>
          <y:Fill color="#E7F2FA" transparent="false"/>
          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="21.537109375" x="4.2314453125" xml:space="preserve" y="6.015625">inc<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
          <y:Shape type="parallelogram"/>
        </y:ShapeNode>
      </data>
    </node>
    <node id="n17">
      <data key="d6">
        <y:ShapeNode>
          <y:Geometry height="30.0" width="30.0" x="428.00000000000017" y="426.0000000000001"/>
          <y:Fill color="#E7F2FA" transparent="false"/>
          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="19.64453125" x="5.177734375" xml:space="preserve" y="6.015625">lut<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
          <y:Shape type="parallelogram"/>
        </y:ShapeNode>
      </data>
    </node>
    <node id="n18">
      <data key="d6">
        <y:ShapeNode>
          <y:Geometry height="30.0" width="30.0" x="529.5000000000002" y="426.0000000000001"/>
          <y:Fill color="#E7F2FA" transparent="false"/>
          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="13.5859375" x="8.20703125" xml:space="preserve" y="6.015625">ls<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
          <y:Shape type="parallelogram"/>
        </y:ShapeNode>
      </data>
    </node>
    <node id="n19">
      <data key="d6">
        <y:ShapeNode>
          <y:Geometry height="30.0" width="99.07999999999993" x="592.4600000000003" y="573.7500000000001"/>
          <y:Fill color="#E7F2FA" transparent="false"/>
          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="89.166015625" x="4.956992187499964" xml:space="preserve" y="6.015625">sig2gam_ratio<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
          <y:Shape type="parallelogram"/>
        </y:ShapeNode>
      </data>
    </node>
    <node id="n20">
      <data key="d6">
        <y:ShapeNode>
          <y:Geometry height="30.0" width="90.0" x="739.5000000000002" y="646.7500000000001"/>
          <y:Fill color="#E7F2FA" transparent="false"/>
          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="77.904296875" x="6.0478515625" xml:space="preserve" y="6.015625">gamma0-rtc<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
          <y:Shape type="parallelogram"/>
        </y:ShapeNode>
      </data>
    </node>
    <node id="n21">
      <data key="d6">
        <y:ShapeNode>
          <y:Geometry height="30.0" width="122.8879999999998" x="580.5560000000003" y="706.7500000000001"/>
          <y:Fill color="#E7F2FA" transparent="false"/>
          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="106.24609375" x="8.320953124999846" xml:space="preserve" y="6.015625">gamma0-rtc_geo<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
          <y:Shape type="parallelogram"/>
        </y:ShapeNode>
      </data>
    </node>
    <node id="n22">
      <data key="d6">
        <y:ShapeNode>
          <y:Geometry height="30.0" width="85.0" x="714.5000000000002" y="119.50000000000009"/>
          <y:Fill color="#6AB0DE" transparent="false"/>
          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="54.279296875" x="15.3603515625" xml:space="preserve" y="6.015625">POEORB<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
          <y:Shape type="roundrectangle"/>
        </y:ShapeNode>
      </data>
    </node>
    <edge id="e0" source="n0" target="n13">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e1" source="n13" target="n2">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e2" source="n1" target="n13">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e3" source="n2" target="n14">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e4" source="n3" target="n15">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
            <y:Point x="443.00000000000017" y="410.4330726400001"/>
            <y:Point x="493.75000000000017" y="410.4330726400001"/>
          </y:Path>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e5" source="n3" target="n16">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
            <y:Point x="443.00000000000017" y="410.4330726400001"/>
            <y:Point x="392.25000000000017" y="410.4330726400001"/>
          </y:Path>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e6" source="n14" target="n4">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e7" source="n14" target="n3">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e8" source="n8" target="n0">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e9" source="n9" target="n3">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e10" source="n3" target="n17">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
            <y:Point x="443.00000000000017" y="410.4330726400001"/>
            <y:Point x="443.00000000000017" y="410.4330726400001"/>
          </y:Path>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e11" source="n15" target="n4">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e12" source="n17" target="n4">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e13" source="n16" target="n4">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
            <y:Point x="392.25000000000017" y="528.7500000000001"/>
          </y:Path>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e14" source="n18" target="n4">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e15" source="n14" target="n5">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
            <y:Point x="784.5000000000002" y="381.0000000000001"/>
          </y:Path>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e16" source="n19" target="n5">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e17" source="n4" target="n19">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e18" source="n5" target="n20">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e19" source="n20" target="n6">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e20" source="n17" target="n6">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
            <y:Point x="443.00000000000017" y="661.7500000000001"/>
          </y:Path>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e21" source="n21" target="n7">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e22" source="n3" target="n18">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
            <y:Point x="443.00000000000017" y="410.4330726400001"/>
            <y:Point x="544.5000000000002" y="410.4330726400001"/>
          </y:Path>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e23" source="n16" target="n11">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
            <y:Point x="392.25000000000017" y="781.7500000000001"/>
          </y:Path>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e24" source="n17" target="n11">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e25" source="n11" target="n12">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e26" source="n22" target="n1">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e27" source="n7" target="n10">
      <data key="d10">
        <y:PolyLineEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:BendStyle smoothed="false"/>
        </y:PolyLineEdge>
      </data>
    </edge>
    <edge id="e28" source="n6" target="n21">
      <data key="d9"/>
      <data key="d10">
        <y:ArcEdge>
          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
            <y:Point x="642.0" y="691.75"/>
          </y:Path>
          <y:LineStyle color="#000000" type="line" width="1.0"/>
          <y:Arrows source="none" target="standard"/>
          <y:Arc height="0.0" ratio="0.0" type="fixedRatio"/>
        </y:ArcEdge>
      </data>
    </edge>
  </graph>
  <data key="d7">
    <y:Resources/>
  </data>
</graphml>


================================================
FILE: docs/source/api/gamma/index.rst
================================================
GAMMA
=====

.. toctree::
    :maxdepth: 1

    util
    auxil
    dem
    api
    error

================================================
FILE: docs/source/api/gamma/util.rst
================================================
Processing
----------

.. automodule:: pyroSAR.gamma.util
    :members:
    :undoc-members:
    :show-inheritance:

    .. autosummary::
        :nosignatures:

        calibrate
        convert2gamma
        correctOSV
        gc_map_wrap
        geocode
        lat_linear_to_db
        lat_product
        lat_ratio
        multilook
        ovs
        pixel_area_wrap
        S1_deburst

================================================
FILE: docs/source/api/sentinel-1.rst
================================================
Sentinel-1 Tools
================

.. automodule:: pyroSAR.S1
    :members: OSV, removeGRDBorderNoise
    :undoc-members:
    :show-inheritance:

    .. autosummary::
        :nosignatures:

        OSV
        removeGRDBorderNoise


================================================
FILE: docs/source/api/snap.rst
================================================
SNAP
====

Processing
----------

.. automodule:: pyroSAR.snap.util
    :members:
    :undoc-members:
    :show-inheritance:

    .. autosummary::
        :nosignatures:

        geocode
        noise_power

Workflow Parsing and Execution
------------------------------

.. automodule:: pyroSAR.snap.auxil
    :members: gpt, execute, parse_node, parse_recipe, split, groupbyWorkers, Workflow, Node, Par, Par_BandMath, dem_parametrize, geo_parametrize, mli_parametrize, orb_parametrize, sub_parametrize
    :undoc-members:
    :show-inheritance:

    .. autosummary::
        :nosignatures:

        gpt
        execute
        parse_node
        parse_recipe
        split
        groupbyWorkers
        Workflow
        Node
        Par
        Par_BandMath
        dem_parametrize
        geo_parametrize
        mli_parametrize
        orb_parametrize
        sub_parametrize

General Utilities
-----------------

.. automodule:: pyroSAR.snap.auxil
    :members: erode_edges, writer
    :undoc-members:
    :show-inheritance:

    .. autosummary::
        :nosignatures:

        erode_edges
        writer


================================================
FILE: docs/source/conf.py
================================================
import sys
import os
import datetime
from importlib.metadata import version as get_version

project = 'pyroSAR'
authors = 'the pyroSAR Developers'
year = datetime.datetime.now().year

# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
sys.path.insert(0, os.path.abspath('../..'))

# The full version, including alpha/beta/rc tags.
version_full = get_version(project)
# The short X.Y version.
version = '.'.join(version_full.split('.')[:2])
# release is automatically added to the latex document title and header
release = version

autodoc_mock_imports = ['osgeo', 'sqlalchemy', 'sqlalchemy_utils', 'geoalchemy2',
                        'lxml', 'progressbar', 'spatialist']

# If your documentation needs a minimal Sphinx version, state it here.
needs_sphinx = '1.6'

# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = [
    'sphinx.ext.autodoc',
    'sphinx.ext.coverage',
    'sphinx.ext.napoleon',
    'sphinx.ext.autosummary',
    'sphinx.ext.intersphinx',
    'sphinx.ext.viewcode',
    'sphinxcontrib.bibtex',
    'sphinxcontrib.cairosvgconverter',
    'sphinx_autodoc_typehints'
]

bibtex_bibfiles = ['references.bib']

# autodoc_default_flags = ['members']
autosummary_generate = []

intersphinx_mapping = {
    'osgeo': ('https://gdal.org', None),
    'python': ('https://docs.python.org/3', None),
    'requests': ('https://requests.readthedocs.io/en/latest', None),
    'scipy': ('https://docs.scipy.org/doc/scipy', None),
    'spatialist': ('https://spatialist.readthedocs.io/en/latest', None),
    'sqlalchemy': ('https://docs.sqlalchemy.org/en/latest', None),
    'sqlalchemy-utils': ('https://sqlalchemy-utils.readthedocs.io/en/latest', None)
}

napoleon_google_docstring = False
napoleon_numpy_docstring = True
napoleon_include_init_with_doc = False
napoleon_include_private_with_doc = False
napoleon_include_special_with_doc = True
napoleon_use_admonition_for_examples = False
napoleon_use_admonition_for_notes = False
napoleon_use_admonition_for_references = False
napoleon_use_ivar = False
napoleon_use_param = True
napoleon_use_rtype = True

# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']

# The suffix of source filenames.
source_suffix = '.rst'

# The encoding of source files.
# source_encoding = 'utf-8-sig'

# The master toctree document.
master_doc = 'index'

# General information about the project.
copyright = ' (c) 2014-{}, {}'.format(year, authors)

# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
# language = None

# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
# today = ''
# Else, today_fmt is used as the format for a strftime call.
# today_fmt = '%B %d, %Y'

# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
exclude_patterns = ['_build']

# The reST default role (used for this markup: `text`) to use for all
# documents.
# default_role = None

# If true, '()' will be appended to :func: etc. cross-reference text.
# add_function_parentheses = True

# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
# add_module_names = True

# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
# show_authors = False

# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'

# A list of ignored prefixes for module index sorting.
# modindex_common_prefix = []

# If true, keep warnings as "system message" paragraphs in the built documents.
# keep_warnings = False


# -- Options for HTML output ----------------------------------------------

# The theme to use for HTML and HTML Help pages.  See the documentation for
# a list of builtin themes.
html_theme = 'sphinx_rtd_theme'

# Theme options are theme-specific and customize the look and feel of a theme
# further.  For a list of options available for each theme, see the
# documentation.
# html_theme_options = {}

# Add any paths that contain custom themes here, relative to this directory.
# html_theme_path = []

# The name for this set of Sphinx documents.  If None, it defaults to
# "<project> v<release> documentation".
# html_title = None

# A shorter title for the navigation bar.  Default is the same as html_title.
# html_short_title = None

# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
# html_logo = None

# The name of an image file (within the static path) to use as favicon of the
# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
# html_favicon = None

# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']

# Add any extra paths that contain custom files (such as robots.txt or
# .htaccess) here, relative to this directory. These files are copied
# directly to the root of the documentation.
# html_extra_path = []

# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
# html_last_updated_fmt = '%b %d, %Y'

# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
# html_use_smartypants = True

# Custom sidebar templates, maps document names to template names.
# html_sidebars = {}

# Additional templates that should be rendered to pages, maps page names to
# template names.
# html_additional_pages = {}

# If false, no module index is generated.
# html_domain_indices = True

# If false, no index is generated.
html_use_index = True

# If true, the index is split into individual pages for each letter.
# html_split_index = False

# If true, links to the reST sources are added to the pages.
# html_show_sourcelink = True

# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
# html_show_sphinx = True

# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
# html_show_copyright = True

# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it.  The value of this option must be the
# base URL from which the finished HTML is served.
# html_use_opensearch = ''

# This is the file name suffix for HTML files (e.g. ".xhtml").
# html_file_suffix = None

# Output file base name for HTML help builder.
htmlhelp_basename = '{}doc'.format(project)

# -- Options for LaTeX output ---------------------------------------------

latex_elements = {
    # The paper size ('letterpaper' or 'a4paper').
    'papersize': 'a4paper',
    
    # The font size ('10pt', '11pt' or '12pt').
    'pointsize': '10pt',
    
    # Additional stuff for the LaTeX preamble.
    'preamble': r'''
    \setcounter{tocdepth}{2}
    \setlength{\headheight}{27pt}
    ''',
    
    # disable floating
    'figure_align': 'H',
}

# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
#  author, documentclass [howto, manual, or own class]).
latex_documents = [
    ('index',
     '{}.tex'.format(project),
     r'{} Documentation'.format(project),
     authors, 'manual'),
]

# The name of an image file (relative to this directory) to place at the top of
# the title page.
# latex_logo = None

# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
# latex_use_parts = False

# If true, show page references after internal links.
# latex_show_pagerefs = False

# If true, show URL addresses after external links.
# latex_show_urls = False

# Documents to append as an appendix to all manuals.
# latex_appendices = []

# If false, no module index is generated.
# latex_domain_indices = True


# -- Options for manual page output ---------------------------------------

# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
    ('index',
     project,
     '{} Documentation'.format(project),
     [authors],
     1)
]

# If true, show URL addresses after external links.
# man_show_urls = False


# -- Options for Texinfo output -------------------------------------------

# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
#  dir menu entry, description, category)
texinfo_documents = [
    ('index',
     project,
     '{} Documentation'.format(project),
     authors,
     project,
     'One line description of project.',
     'Miscellaneous'),
]

# Documents to append as an appendix to all manuals.
# texinfo_appendices = []

# If false, no module index is generated.
# texinfo_domain_indices = True

# How to display URL addresses: 'footnote', 'no', or 'inline'.
# texinfo_show_urls = 'footnote'

# If true, do not generate a @detailmenu in the "Top" node's menu.
# texinfo_no_detailmenu = False


================================================
FILE: docs/source/general/DEM.rst
================================================
###############
DEM Preparation
###############

SAR processing requires a high resolution Digital Elevation Model for ortho-rectification and normalization of
terrain-specific imaging effects.

In SNAP, the DEM is usually auto-downloaded by the software itself and the user only specifies the DEM source to be
used, e.g. SRTM. pyroSAR's convenience function :func:`pyroSAR.snap.util.geocode` can additionally pass SNAP's option to use an
external DEM file via parameters `externalDEMFile`, `externalDEMNoDataValue` and `externalDEMApplyEGM`.

GAMMA does not provide ways to automatically download DEMs for processing and the user thus also needs to provide an
external DEM file in GAMMA's own format. However, several commands are available to prepare these DEMs including
conversion from geoid heights to WGS84 ellipsoid heights.

pyroSAR offers several convenience functions to automatically prepare DEM mosaics from different
sources to use them in either SNAP or GAMMA.

Download of DEM Tiles
=====================

The function :func:`pyroSAR.auxdata.dem_autoload` offers convenient download of tiles from different sources
overlapping with user-defined geometries. Optionally, a buffer in degrees can be defined.
This function internally makes use of the function :func:`spatialist.auxil.gdalbuildvrt`.

.. code-block:: python

    from pyroSAR.auxdata import dem_autoload
    from spatialist import Vector

    site = 'mysite.shp'
    vrt = 'mosaic.vrt'

    with V
Download .txt
gitextract_9rn0un2a/

├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   └── bug_report.md
│   └── workflows/
│       ├── conda-install.yml
│       └── python-publish.yml
├── .gitignore
├── .travis.yml
├── CONTRIBUTING.md
├── LICENSE.txt
├── MANIFEST.in
├── README.md
├── appveyor.yml
├── datacube_prepare.ipynb
├── docs/
│   ├── Makefile
│   ├── make.bat
│   └── source/
│       ├── about/
│       │   ├── changelog.rst
│       │   ├── projects.rst
│       │   ├── publications.rst
│       │   └── references.rst
│       ├── api/
│       │   ├── ancillary.rst
│       │   ├── archive.rst
│       │   ├── auxdata.rst
│       │   ├── datacube.rst
│       │   ├── drivers.rst
│       │   ├── examine.rst
│       │   ├── figures/
│       │   │   ├── snap_geocode.graphml
│       │   │   └── workflow_readme.txt
│       │   ├── gamma/
│       │   │   ├── api.rst
│       │   │   ├── auxil.rst
│       │   │   ├── dem.rst
│       │   │   ├── error.rst
│       │   │   ├── figures/
│       │   │   │   └── gamma_geocode.graphml
│       │   │   ├── index.rst
│       │   │   └── util.rst
│       │   ├── sentinel-1.rst
│       │   └── snap.rst
│       ├── conf.py
│       ├── general/
│       │   ├── DEM.rst
│       │   ├── OSV.rst
│       │   ├── configuration.rst
│       │   ├── filenaming.rst
│       │   ├── installation.rst
│       │   ├── logging.rst
│       │   ├── processing.rst
│       │   └── snap.rst
│       ├── index.rst
│       └── references.bib
├── environment-dev.yml
├── environment-doc.yml
├── environment.yml
├── pyproject.toml
├── pyroSAR/
│   ├── ERS/
│   │   ├── __init__.py
│   │   ├── auxil.py
│   │   └── mapping.py
│   ├── S1/
│   │   ├── __init__.py
│   │   ├── auxil.py
│   │   ├── linesimplify.py
│   │   └── polysimplify.py
│   ├── __init__.py
│   ├── ancillary.py
│   ├── archive.py
│   ├── auxdata.py
│   ├── config.py
│   ├── datacube_util.py
│   ├── drivers.py
│   ├── examine.py
│   ├── gamma/
│   │   ├── __init__.py
│   │   ├── api.py
│   │   ├── auxil.py
│   │   ├── dem.py
│   │   ├── error.py
│   │   ├── parser.py
│   │   ├── parser_demo.py
│   │   └── util.py
│   ├── install/
│   │   ├── download_egm96_15.gtx.sh
│   │   ├── download_testdata.sh
│   │   └── install_deps.sh
│   ├── patterns.py
│   ├── snap/
│   │   ├── __init__.py
│   │   ├── auxil.py
│   │   ├── data/
│   │   │   ├── collect_suffices.py
│   │   │   ├── snap.auxdata.properties
│   │   │   └── snap.suffices.properties
│   │   ├── recipes/
│   │   │   ├── base.xml
│   │   │   └── blank.xml
│   │   └── util.py
│   └── xml_util.py
├── readthedocs.yml
├── requirements-dev.txt
├── requirements.txt
└── tests/
    ├── conftest.py
    ├── data/
    │   ├── ASA_IMS_1PNESA20040703_205338_000000182028_00172_12250_00001672562030318361237.N1
    │   ├── S1A__IW___A_20150309T173017_VV_grd_mli_geo_norm_db.tif
    │   ├── S1A__IW___A_20150309T173017_VV_grd_mli_geo_norm_db.tif.aux.xml
    │   ├── SAR_IMP_1PXESA19960808_205906_00000017G158_00458_26498_2615.E1
    │   ├── archive_outdated.csv
    │   ├── dem.par
    │   └── mli.par
    ├── installtest_gdal_geos.py
    ├── installtest_ogr_sqlite.py
    ├── installtest_spatialite.py
    ├── test_ancillary.py
    ├── test_archive.py
    ├── test_auxdata.py
    ├── test_config.py
    ├── test_drivers.py
    ├── test_examine.py
    ├── test_gamma.py
    ├── test_gamma_args.py
    ├── test_license.py
    ├── test_osv.py
    ├── test_snap.py
    ├── test_snap_exe.py
    └── test_xml_util.py
Download .txt
SYMBOL INDEX (718 symbols across 36 files)

FILE: pyroSAR/ERS/auxil.py
  function passdb_create (line 24) | def passdb_create(ers1passes, ers2passes, dbname):
  function passdb_query (line 83) | def passdb_query(satellite, acqtime, dbname=None):

FILE: pyroSAR/ERS/mapping.py
  function get_resolution_nesz (line 254) | def get_resolution_nesz(

FILE: pyroSAR/S1/auxil.py
  function init_parser (line 49) | def init_parser():
  class OSV (line 79) | class OSV(object):
    method __init__ (line 102) | def __init__(self, osvdir=None, timeout=300):
    method __enter__ (line 121) | def __enter__(self):
    method __exit__ (line 124) | def __exit__(self, exc_type, exc_val, exc_tb):
    method _init_dir (line 127) | def _init_dir(self):
    method _parse (line 135) | def _parse(self, file):
    method _reorganize (line 140) | def _reorganize(self):
    method _typeEvaluate (line 168) | def _typeEvaluate(self, osvtype):
    method __catch_aux_sentinel (line 189) | def __catch_aux_sentinel(self, sensor, start, stop, osvtype='POE'):
    method __catch_step_auxdata (line 224) | def __catch_step_auxdata(self, sensor, start, stop, osvtype='POE'):
    method __catch_gnss (line 269) | def __catch_gnss(self, sensor, start, stop, osvtype='POE'):
    method catch (line 383) | def catch(self, sensor, osvtype='POE', start=None, stop=None, url_opti...
    method date (line 437) | def date(self, file, datetype):
    method clean_res (line 455) | def clean_res(self):
    method getLocals (line 466) | def getLocals(self, osvtype='POE'):
    method maxdate (line 483) | def maxdate(self, osvtype='POE', datetype='stop'):
    method mindate (line 503) | def mindate(self, osvtype='POE', datetype='start'):
    method match (line 523) | def match(self, sensor, timestamp, osvtype='POE'):
    method retrieve (line 566) | def retrieve(self, products, pbar=False):
    method sortByDate (line 633) | def sortByDate(self, files, datetype='start'):
    method _subdir (line 651) | def _subdir(self, file):
  function removeGRDBorderNoise (line 677) | def removeGRDBorderNoise(scene, method='pyroSAR'):

FILE: pyroSAR/S1/linesimplify.py
  function simplify (line 28) | def simplify(x, y, maxpoints=20):
  function createPoly (line 60) | def createPoly(xn, yn, xmax, ymax, plot=False):
  function reduce (line 103) | def reduce(seq, maxpoints=20, straighten=False, plot=False):

FILE: pyroSAR/S1/polysimplify.py
  function triangle_area (line 38) | def triangle_area(p1, p2, p3):
  function triangle_areas_from_array (line 45) | def triangle_areas_from_array(arr):
  function remove (line 82) | def remove(s, i):
  class VWSimplifier (line 92) | class VWSimplifier(object):
    method __init__ (line 93) | def __init__(self, pts):
    method build_thresholds (line 103) | def build_thresholds(self):
    method from_threshold (line 188) | def from_threshold(self, threshold):
    method from_number (line 191) | def from_number(self, n):
    method from_ratio (line 199) | def from_ratio(self, r):
  class WKTSimplifier (line 206) | class WKTSimplifier(VWSimplifier):
    method __init__ (line 211) | def __init__(self, *args, **kwargs):
    method set_precision (line 219) | def set_precision(self, precision):
    method wkt_from_threshold (line 231) | def wkt_from_threshold(self, threshold, precision=None):
    method wkt_from_number (line 237) | def wkt_from_number(self, n, precision=None):
    method wkt_from_ratio (line 247) | def wkt_from_ratio(self, r, precision=None):
  class GDALSimplifier (line 258) | class GDALSimplifier(object):
    method __init__ (line 263) | def __init__(*args, **kwargs):
    method __init__ (line 285) | def __init__(self, geom, precision=None, return_GDAL=True):
    method pt2str (line 336) | def pt2str(self, pt):
    method linebuild (line 340) | def linebuild(self):
    method line2wkt (line 343) | def line2wkt(self, pts):
    method linemask (line 346) | def linemask(self, threshold):
    method polybuild (line 354) | def polybuild(self):
    method poly2wkt (line 361) | def poly2wkt(self, list_of_pts):
    method polymask (line 364) | def polymask(self, threshold):
    method multibuild (line 373) | def multibuild(self):
    method multi2wkt (line 383) | def multi2wkt(self, list_of_list_of_pts):
    method multimask (line 389) | def multimask(self, threshold):
    method notimplemented (line 404) | def notimplemented(self, n):
    method from_threshold (line 407) | def from_threshold(self, threshold):
    method from_number (line 415) | def from_number(self, n):
    method from_ratio (line 423) | def from_ratio(self, r):
  class GDALSimplifier (line 275) | class GDALSimplifier(object):
    method __init__ (line 263) | def __init__(*args, **kwargs):
    method __init__ (line 285) | def __init__(self, geom, precision=None, return_GDAL=True):
    method pt2str (line 336) | def pt2str(self, pt):
    method linebuild (line 340) | def linebuild(self):
    method line2wkt (line 343) | def line2wkt(self, pts):
    method linemask (line 346) | def linemask(self, threshold):
    method polybuild (line 354) | def polybuild(self):
    method poly2wkt (line 361) | def poly2wkt(self, list_of_pts):
    method polymask (line 364) | def polymask(self, threshold):
    method multibuild (line 373) | def multibuild(self):
    method multi2wkt (line 383) | def multi2wkt(self, list_of_list_of_pts):
    method multimask (line 389) | def multimask(self, threshold):
    method notimplemented (line 404) | def notimplemented(self, n):
    method from_threshold (line 407) | def from_threshold(self, threshold):
    method from_number (line 415) | def from_number(self, n):
    method from_ratio (line 423) | def from_ratio(self, r):
  function fancy_parametric (line 432) | def fancy_parametric(k):

FILE: pyroSAR/ancillary.py
  function groupby (line 40) | def groupby(
  function groupbyTime (line 73) | def groupbyTime(
  function multilook_factors (line 111) | def multilook_factors(
  function seconds (line 217) | def seconds(filename: str) -> float:
  function parse_datasetname (line 237) | def parse_datasetname(
  function find_datasets (line 282) | def find_datasets(
  function getargs (line 332) | def getargs(func: Callable[..., Any]) -> list[str]:
  function hasarg (line 348) | def hasarg(func: Callable[..., Any], arg: str) -> bool:
  function windows_fileprefix (line 366) | def windows_fileprefix(
  class Lock (line 396) | class Lock(object):
    method __new__ (line 456) | def __new__(
    method __init__ (line 477) | def __init__(
    method __enter__ (line 513) | def __enter__(self) -> Self:
    method __exit__ (line 516) | def __exit__(
    method is_used (line 524) | def is_used(self) -> bool:
    method remove (line 533) | def remove(
  class LockCollection (line 558) | class LockCollection(object):
    method __init__ (line 572) | def __init__(
    method __enter__ (line 580) | def __enter__(self) -> Self:
    method __exit__ (line 583) | def __exit__(

FILE: pyroSAR/archive.py
  class SceneArchive (line 57) | class SceneArchive(Protocol):
    method __enter__ (line 66) | def __enter__(self) -> SceneArchive:
    method __exit__ (line 72) | def __exit__(
    method close (line 83) | def close(self) -> None:
    method select (line 92) | def select(
  class Archive (line 134) | class Archive(SceneArchive):
    method __init__ (line 223) | def __init__(
    method add_tables (line 334) | def add_tables(
    method __init_data_table (line 369) | def __init_data_table(self) -> None:
    method __init_duplicates_table (line 409) | def __init_duplicates_table(self) -> None:
    method __load_spatialite (line 423) | def __load_spatialite(dbapi_conn: sqlite3.Connection, connection_recor...
    method __prepare_insertion (line 452) | def __prepare_insertion(self, scene: str | ID) -> Any:
    method __select_missing (line 492) | def __select_missing(self, table: str) -> list[str]:
    method insert (line 515) | def insert(
    method is_registered (line 603) | def is_registered(self, scene: str | ID) -> bool:
    method __is_registered_in_duplicates (line 631) | def __is_registered_in_duplicates(self, scene: str | ID) -> bool:
    method cleanup (line 654) | def cleanup(self) -> None:
    method to_str (line 664) | def to_str(string: str | bytes, encoding: str = 'utf-8') -> str:
    method export2shp (line 670) | def export2shp(self, path: str, table: str = 'data') -> None:
    method filter_scenelist (line 719) | def filter_scenelist(self, scenelist: list[str | ID]) -> list[str | ID]:
    method get_colnames (line 749) | def get_colnames(self, table: str = 'data') -> list[str]:
    method get_tablenames (line 763) | def get_tablenames(self, return_all: bool = False) -> list[str]:
    method get_unique_directories (line 797) | def get_unique_directories(self) -> list[str]:
    method import_outdated (line 811) | def import_outdated(self, dbfile: str | Archive) -> None:
    method move (line 841) | def move(self, scenelist: list[str], directory: str, pbar: bool = Fals...
    method select (line 904) | def select(
    method select_duplicates (line 1117) | def select_duplicates(
    method size (line 1173) | def size(self) -> tuple[int, int]:
    method __enter__ (line 1187) | def __enter__(self) -> Archive:
    method close (line 1190) | def close(self) -> None:
    method __exit__ (line 1197) | def __exit__(
    method drop_element (line 1205) | def drop_element(
    method drop_table (line 1272) | def drop_table(self, table: str) -> None:
    method __is_open (line 1300) | def __is_open(ip: str, port: str | int) -> bool:
    method __check_host (line 1327) | def __check_host(self, ip: str, port: str | int) -> bool:
  function drop_archive (line 1352) | def drop_archive(archive: Archive) -> None:

FILE: pyroSAR/auxdata.py
  function dem_autoload (line 43) | def dem_autoload(geometries, demType, vrt=None, buffer=None, username=None,
  function dem_create (line 242) | def dem_create(src, dst, t_srs=None, tr=None, threads=None,
  class DEMHandler (line 408) | class DEMHandler:
    method __init__ (line 420) | def __init__(self, geometries):
    method __enter__ (line 434) | def __enter__(self):
    method __exit__ (line 437) | def __exit__(self, exc_type, exc_val, exc_tb):
    method __applybuffer (line 441) | def __applybuffer(extent, buffer):
    method __find_first (line 450) | def __find_first(self, dem_type, product):
    method __buildvrt (line 469) | def __buildvrt(tiles, vrtfile, pattern, vsi, extent, src_nodata=None,
    method __commonextent (line 537) | def __commonextent(self, buffer=None):
    method __create_dummy_dem (line 563) | def __create_dummy_dem(filename, extent):
    method intrange (line 592) | def intrange(extent, step):
    method __get_resolution (line 622) | def __get_resolution(self, dem_type, y):
    method __local_index (line 642) | def __local_index(self, dem_type):
    method __retrieve (line 717) | def __retrieve(
    method __retrieve_ftp (line 764) | def __retrieve_ftp(url, filenames, outdir, username, password,
    method config (line 817) | def config(self):
    method load (line 1043) | def load(self, dem_type, vrt=None, buffer=None, username=None,
    method remote_ids (line 1257) | def remote_ids(self, extent, dem_type, product='dem', username=None, p...
  function getasse30_hdr (line 1443) | def getasse30_hdr(fname):
  function get_dem_options (line 1493) | def get_dem_options(require_auth=None):
  function get_egm_lookup (line 1521) | def get_egm_lookup(geoid, software):
  class ImplicitFTP_TLS (line 1592) | class ImplicitFTP_TLS(ftplib.FTP_TLS):
    method __init__ (line 1598) | def __init__(self, *args, **kwargs):
    method sock (line 1603) | def sock(self):
    method sock (line 1608) | def sock(self, value):
  function vrt_check_sources (line 1615) | def vrt_check_sources(fname):

FILE: pyroSAR/config.py
  class Singleton (line 26) | class Singleton(type):
    method __init__ (line 32) | def __init__(cls, name, bases, attrs, **kwargs):
    method __call__ (line 36) | def __call__(cls, *args, **kwargs):
  class ConfigHandler (line 42) | class ConfigHandler(metaclass=Singleton):
    method __init__ (line 78) | def __init__(self):
    method __create_config (line 94) | def __create_config(self):
    method __str__ (line 109) | def __str__(self):
    method __getitem__ (line 126) | def __getitem__(self, section):
    method sections (line 132) | def sections(self):
    method keys (line 135) | def keys(self, section):
    method open (line 151) | def open(self):
    method add_section (line 164) | def add_section(self, section):
    method file (line 185) | def file(self):
    method set (line 188) | def set(self, section, key, value, overwrite=False):
    method remove_option (line 219) | def remove_option(self, section, key):
    method remove_section (line 243) | def remove_section(self, section):
    method write (line 259) | def write(self):

FILE: pyroSAR/datacube_util.py
  class Dataset (line 68) | class Dataset(object):
    method __init__ (line 80) | def __init__(self, filename, units='DN'):
    method __add__ (line 170) | def __add__(self, dataset):
    method __radd__ (line 196) | def __radd__(self, dataset):
    method __extent_convert (line 216) | def __extent_convert(extent, xkey, ykey):
    method __enter__ (line 244) | def __enter__(self):
    method __exit__ (line 247) | def __exit__(self, exc_type, exc_val, exc_tb):
    method __get_measurement_attr (line 250) | def __get_measurement_attr(self, attr):
    method filenames (line 267) | def filenames(self):
    method identifier (line 278) | def identifier(self):
    method units (line 289) | def units(self):
    method units (line 300) | def units(self, value):
    method close (line 328) | def close(self):
  class Product (line 332) | class Product(object):
    method __init__ (line 349) | def __init__(self, definition=None, name=None, product_type=None,
    method __enter__ (line 380) | def __enter__(self):
    method __exit__ (line 383) | def __exit__(self, exc_type, exc_val, exc_tb):
    method __str__ (line 386) | def __str__(self):
    method __getattr__ (line 389) | def __getattr__(self, item):
    method __setattr__ (line 400) | def __setattr__(self, key, value):
    method close (line 411) | def close(self):
    method __add_measurement (line 414) | def __add_measurement(self, name, dtype, nodata, units):
    method __initialize (line 440) | def __initialize(self, name, product_type, description):
    method __check_dict_keys (line 469) | def __check_dict_keys(keys, reference):
    method __fixture_fields (line 473) | def __fixture_fields(self):
    method __fixture_measurement (line 484) | def __fixture_measurement(self):
    method __fixture_metadata (line 495) | def __fixture_metadata(self):
    method __fixture_storage (line 506) | def __fixture_storage(self):
    method __validate (line 516) | def __validate(self):
    method add (line 537) | def add(self, dataset):
    method check_integrity (line 569) | def check_integrity(self, dataset, allow_new_measurements=False):
    method export_indexing_yml (line 610) | def export_indexing_yml(self, dataset, outdir):
    method export_ingestion_yml (line 665) | def export_ingestion_yml(self, outname, product_name, ingest_location,...
    method measurements (line 738) | def measurements(self):
    method write (line 748) | def write(self, ymlfile):

FILE: pyroSAR/drivers.py
  function identify (line 62) | def identify(scene):
  function identify_many (line 117) | def identify_many(scenes, pbar=False, sortkey=None, cores=1):
  function filter_processed (line 179) | def filter_processed(scenelist, outdir, recursive=False):
  class ID (line 202) | class ID(object):
    method __init__ (line 207) | def __init__(self, metadict):
    method __getattr__ (line 219) | def __getattr__(self, item):
    method __str__ (line 222) | def __str__(self):
    method bbox (line 234) | def bbox(self, outname=None, driver=None, overwrite=True, buffer=None):
    method geometry (line 269) | def geometry(self, outname=None, driver=None, overwrite=True):
    method compression (line 323) | def compression(self):
    method export2dict (line 341) | def export2dict(self):
    method examine (line 351) | def examine(self, include_folders=False):
    method findfiles (line 376) | def findfiles(self, pattern, include_folders=False):
    method gdalinfo (line 411) | def gdalinfo(self):
    method getCorners (line 462) | def getCorners(self):
    method getFileObj (line 478) | def getFileObj(self, filename):
    method getGammaImages (line 494) | def getGammaImages(self, directory=None):
    method getHGT (line 521) | def getHGT(self):
    method is_processed (line 547) | def is_processed(self, outdir, recursive=False):
    method outname_base (line 568) | def outname_base(self, extensions=None):
    method parse_date (line 596) | def parse_date(x):
    method quicklook (line 614) | def quicklook(self, outname, format='kmz'):
    method start_dt (line 639) | def start_dt(self) -> datetime:
    method stop_dt (line 650) | def stop_dt(self) -> datetime:
    method summary (line 660) | def summary(self):
    method scanMetadata (line 671) | def scanMetadata(self):
    method unpack (line 687) | def unpack(self, directory, overwrite=False, exist_ok=False):
    method _unpack (line 706) | def _unpack(self, directory, offset=None, overwrite=False, exist_ok=Fa...
  class BEAM_DIMAP (line 791) | class BEAM_DIMAP(ID):
    method __init__ (line 799) | def __init__(self, scene):
    method scanMetadata (line 810) | def scanMetadata(self):
    method unpack (line 940) | def unpack(self, directory, overwrite=False, exist_ok=False):
  class CEOS_ERS (line 944) | class CEOS_ERS(ID):
    method __init__ (line 957) | def __init__(self, scene):
    method unpack (line 973) | def unpack(self, directory, overwrite=False, exist_ok=False):
    method scanMetadata (line 984) | def scanMetadata(self):
  class CEOS_PSR (line 1068) | class CEOS_PSR(ID):
    method __init__ (line 1124) | def __init__(self, scene):
    method _getLeaderfileContent (line 1144) | def _getLeaderfileContent(self):
    method _img_get_coordinates (line 1150) | def _img_get_coordinates(self):
    method _parseSummary (line 1175) | def _parseSummary(self):
    method led_filename (line 1188) | def led_filename(self):
    method scanMetadata (line 1191) | def scanMetadata(self):
    method unpack (line 1433) | def unpack(self, directory, overwrite=False, exist_ok=False):
  class EORC_PSR (line 1438) | class EORC_PSR(ID):
    method __init__ (line 1455) | def __init__(self, scene):
    method _getHeaderfileContent (line 1468) | def _getHeaderfileContent(self):
    method _img_get_coordinates (line 1475) | def _img_get_coordinates(self):
    method _parseFacter_m (line 1500) | def _parseFacter_m(self):
    method header_filename (line 1512) | def header_filename(self):
    method scanMetadata (line 1515) | def scanMetadata(self):
    method unpack (line 1584) | def unpack(self, directory, overwrite=False, exist_ok=False):
  class ESA (line 1589) | class ESA(ID):
    method __init__ (line 1599) | def __init__(self, scene):
    method scanMetadata (line 1618) | def scanMetadata(self):
    method geo_grid (line 1802) | def geo_grid(self, outname=None, driver=None, overwrite=True):
    method unpack (line 1863) | def unpack(self, directory, overwrite=False, exist_ok=False):
  class SAFE (line 1872) | class SAFE(ID):
    method __init__ (line 1887) | def __init__(self, scene):
    method removeGRDBorderNoise (line 1917) | def removeGRDBorderNoise(self, method='pyroSAR'):
    method geo_grid (line 1938) | def geo_grid(self, outname=None, driver=None, overwrite=True):
    method getOSV (line 2007) | def getOSV(self, osvdir=None, osvType='POE', returnMatch=False, useLoc...
    method quicklook (line 2067) | def quicklook(self, outname, format='kmz', na_transparent=True):
    method resolution (line 2117) | def resolution(self):
    method scanMetadata (line 2189) | def scanMetadata(self):
    method unpack (line 2280) | def unpack(self, directory, overwrite=False, exist_ok=False):
  class TSX (line 2285) | class TSX(ID):
    method __init__ (line 2321) | def __init__(self, scene):
    method scanMetadata (line 2338) | def scanMetadata(self):
    method unpack (line 2378) | def unpack(self, directory, overwrite=False, exist_ok=False):
  class TDM (line 2385) | class TDM(TSX):
    method __init__ (line 2423) | def __init__(self, scene):
    method scanMetadata (line 2439) | def scanMetadata(self):
  function getFileObj (line 2512) | def getFileObj(scene, filename):
  function parse_date (line 2563) | def parse_date(x):

FILE: pyroSAR/examine.py
  class ExamineSnap (line 32) | class ExamineSnap(object):
    method __init__ (line 50) | def __init__(self):
    method __getattr__ (line 101) | def __getattr__(self, item):
    method __is_identified (line 111) | def __is_identified(self):
    method __identify_snap (line 122) | def __identify_snap(self):
    method __read_config (line 180) | def __read_config(self):
    method __read_config_attr (line 199) | def __read_config_attr(self, attr, section):
    method __read_version_dict (line 221) | def __read_version_dict(self):
    method __update_config (line 264) | def __update_config(self):
    method __update_config_attr (line 278) | def __update_config_attr(attr, value, section):
    method get_suffix (line 287) | def get_suffix(self, operator):
    method get_version (line 313) | def get_version(self, module: str) -> str:
    method auxdatapath (line 361) | def auxdatapath(self):
    method auxdatapath (line 379) | def auxdatapath(self, value):
    method userpath (line 383) | def userpath(self):
    method userpath (line 398) | def userpath(self, value):
  class ExamineGamma (line 402) | class ExamineGamma(object):
    method __init__ (line 415) | def __init__(self):
    method __read_config (line 449) | def __read_config(self):
    method __update_config (line 456) | def __update_config(self):
    method __update_config_attr (line 464) | def __update_config_attr(attr, value, section):
  class SnapProperties (line 472) | class SnapProperties(object):
    method __init__ (line 499) | def __init__(self, path):
    method __getitem__ (line 541) | def __getitem__(
    method __setitem__ (line 552) | def __setitem__(
    method _to_dict (line 598) | def _to_dict(
    method _string_convert (line 637) | def _string_convert(string):
    method keys (line 653) | def keys(self):
    method userpath (line 667) | def userpath(self):
    method userpath (line 675) | def userpath(self, value):
    method userpath_auxdata_properties (line 679) | def userpath_auxdata_properties(self):
    method userpath_properties (line 684) | def userpath_properties(self):
    method userpath_conf (line 689) | def userpath_conf(self):

FILE: pyroSAR/gamma/auxil.py
  function do_execute (line 29) | def do_execute(par, ids, exist_ok):
  class ISPPar (line 51) | class ISPPar(object):
    method __init__ (line 85) | def __init__(self, filename):
    method __enter__ (line 154) | def __enter__(self):
    method __exit__ (line 157) | def __exit__(self, exc_type, exc_val, exc_tb):
    method __getattr__ (line 160) | def __getattr__(self, item):
    method __str__ (line 164) | def __str__(self):
    method envidict (line 170) | def envidict(self, nodata=None):
  class Namespace (line 266) | class Namespace(object):
    method __init__ (line 289) | def __init__(self, directory, basename):
    method __getitem__ (line 294) | def __getitem__(self, item):
    method __getattr__ (line 298) | def __getattr__(self, item):
    method appreciate (line 302) | def appreciate(self, keys):
    method depreciate (line 318) | def depreciate(self, keys):
    method getall (line 334) | def getall(self):
    method select (line 340) | def select(self, selection):
    method isregistered (line 343) | def isregistered(self, key):
    method isappreciated (line 346) | def isappreciated(self, key):
    method isfile (line 352) | def isfile(self, key):
    method get (line 355) | def get(self, key):
  function par2hdr (line 359) | def par2hdr(parfile, hdrfile, modifications=None, nodata=None):
  function process (line 397) | def process(
  function slc_corners (line 487) | def slc_corners(parfile):
  class Spacing (line 514) | class Spacing(object):
    method __init__ (line 526) | def __init__(self, par, spacing='automatic'):
  class UTM (line 545) | class UTM(object):
    method __init__ (line 561) | def __init__(self, parfile):

FILE: pyroSAR/gamma/dem.py
  function fill (line 44) | def fill(dem, dem_out, logpath=None, replace=False):
  function transform (line 121) | def transform(infile, outfile, posting=90):
  function dem_autocreate (line 154) | def dem_autocreate(geometry, demType, outfile, buffer=None, t_srs=4326, ...
  function dem_import (line 302) | def dem_import(
  function dempar (line 390) | def dempar(dem, logpath=None):
  function swap (line 449) | def swap(data, outname):
  function mosaic (line 482) | def mosaic(demlist, outname, byteorder=1, gammapar=True):
  function hgt (line 525) | def hgt(parfiles):
  function makeSRTM (line 576) | def makeSRTM(scenes, srtmdir, outname):
  function hgt_collect (line 637) | def hgt_collect(parfiles, outdir, demdir=None, arcsec=3):

FILE: pyroSAR/gamma/error.py
  function gammaErrorHandler (line 19) | def gammaErrorHandler(returncode: int, out: str, err: str) -> None:
  class GammaUnknownError (line 92) | class GammaUnknownError(Exception):
    method __init__ (line 99) | def __init__(self, errormessage):

FILE: pyroSAR/gamma/parser.py
  function parse_command (line 28) | def parse_command(command, indent='    '):
  function parse_module (line 634) | def parse_module(bindir, outfile):
  function autoparse (line 693) | def autoparse():

FILE: pyroSAR/gamma/parser_demo.py
  function adapt_filt (line 4) | def adapt_filt(int, sm, width, low_SNR_thr='-', filt_width='-', xmin='-'...
  function adf (line 40) | def adf(interf, sm, cc, width, alpha='-', nfft='-', cc_win='-', step='-'...
  function adf2 (line 80) | def adf2(interf, cc_interf, sm, cc_filt, width, alpha_max='-', nfft='-',...
  function af_SLC (line 122) | def af_SLC(SLC_par, SLC, rwin='-', azwin='-', dr='-', daz='-', thres='-'...
  function ASAR_LO_phase_drift (line 172) | def ASAR_LO_phase_drift(SLC1_par, SLC2_par, OFF_par, ph_drift, logpath=N...
  function ASAR_XCA (line 198) | def ASAR_XCA(ASA_XCA, antenna, swath='-', pol='-', logpath=None, outdir=...
  function ave_cpx (line 225) | def ave_cpx(cpx_list, width, cpx_ave, start='-', nlines='-', zflag='-', ...
  function ave_image (line 258) | def ave_image(im_list, width, ave_image, start='-', nlines='-', pixav_x=...
  function az_integrate (line 297) | def az_integrate(data, width, azi, cflg, scale='-', lz='-', logpath=None...
  function az_spec_SLC (line 330) | def az_spec_SLC(SLC, SLC_par, spectrum, roff='-', namb='-', pltflg='-', ...
  function base_copy (line 363) | def base_copy(SLC1_par, baseline1, SLC2_par, baseline2, time_rev='-', lo...
  function base_est_fft (line 394) | def base_est_fft(interf, SLC1_par, OFF_par, baseline, nazfft='-', r_samp...
  function base_init (line 428) | def base_init(SLC1_par, SLC2_par, OFF_par, interf, baseline, mflag='-', ...
  function base_ls (line 476) | def base_ls(SLC_par, OFF_par, gcp_ph, baseline, ph_flag='-', bc_flag='-'...
  function base_orbit (line 531) | def base_orbit(SLC1_par, SLC2_par, baseline, logpath=None, outdir=None, ...
  function base_perp (line 555) | def base_perp(baseline, SLC1_par, OFF_par, time_rev='-', logpath=None, o...
  function bpf (line 584) | def bpf(data_in, data_out, width, fc_x, bw_x, fc_y, bw_y, roff='-', azof...
  function bridge_unw (line 640) | def bridge_unw(int, flag, unw, bridge, width, xmin='-', xmax='-', ymin='...
  function cc_wave (line 676) | def cc_wave(interf, MLI1, MLI2, cc, width, bx='-', by='-', wflg='-', xmi...
  function clear_flag (line 726) | def clear_flag(flag, width, flag_bits, xmin='-', xmax='-', ymin='-', yma...
  function corr_flag (line 760) | def corr_flag(corr, flag, width, corr_thr, xmin='-', xmax='-', ymin='-',...
  function create_offset (line 796) | def create_offset(SLC1_par, SLC2_par, OFF_par, algorithm='-', rlks='-', ...
  function dcomp_sirc (line 834) | def dcomp_sirc(infile, outfile, samples, loff='-', nlines='-', logpath=N...
  function dcomp_sirc_quad (line 862) | def dcomp_sirc_quad(infile, outfile, samples, parameter, loff='-', nline...
  function DELFT_vec2 (line 905) | def DELFT_vec2(SLC_par, DELFT_dir, nstate='-', interval='-', ODR='-', lo...
  function doppler_2d_SLC (line 935) | def doppler_2d_SLC(SLC, SLC_par, dop2d, loff='-', blsz='-', nbl='-', a2_...
  function DORIS_vec (line 987) | def DORIS_vec(SLC_par, DOR, nstate='-', logpath=None, outdir=None, shell...
  function error_stat (line 1011) | def error_stat(d1, d2, width, dtype, roff, loff, nr, nl, report, logpath...
  function fill_gaps (line 1052) | def fill_gaps(data_in, width, data_out, dtype='-', method='-', max_dist=...
  function fspf (line 1109) | def fspf(data_in, data_out, width, dtype='-', r_max='-', spf_type='-', M...
  function gcp_phase (line 1161) | def gcp_phase(unw, OFF_par, gcp, gcp_ph, win_sz='-', logpath=None, outdi...
  function grasses (line 1189) | def grasses(int, flag, unw, width, xmin='-', xmax='-', ymin='-', ymax='-...
  function GRD_to_SR (line 1232) | def GRD_to_SR(GRD_par, MLI_par, OFF_par, in_file, out_file, rlks='-', az...
  function hgt_map (line 1282) | def hgt_map(unw, SLC_par, OFF_par, baseline, hgt, gr, ph_flag='-', loff=...
  function image_stat (line 1323) | def image_stat(image, width, roff='-', loff='-', nr='-', nl='-', report=...
  function init_offset (line 1362) | def init_offset(SLC1, SLC2, SLC1_par, SLC2_par, OFF_par, rlks='-', azlks...
  function init_offset_orbit (line 1418) | def init_offset_orbit(SLC1_par, SLC2_par, OFF_par, rpos='-', azpos='-', ...
  function interf_SLC (line 1451) | def interf_SLC(SLC1, SLC2, SLC1_par, SLC2_par, OFF_par, MLI1, MLI2, inte...
  function interp_ad (line 1507) | def interp_ad(data_in, data_out, width, r_max='-', np_min='-', np_max='-...
  function mask_data (line 1557) | def mask_data(data_in, width, data_out, mask, dtype='-', logpath=None, o...
  function mcf (line 1591) | def mcf(interf, wgt, mask, unw, width, tri_mode='-', roff='-', loff='-',...
  function MLI_cat (line 1649) | def MLI_cat(MLI1, MLI2, MLI1_par, MLI2_par, MLI3, MLI3_par, dtype='-', m...
  function MLI_copy (line 1705) | def MLI_copy(MLI_in, MLI_in_par, MLI_out, MLI_out_par, roff='-', nr='-',...
  function mosaic_WB (line 1739) | def mosaic_WB(data_tab, dtype, data_out, data_par_out, sc_flg='-', logpa...
  function multi_look (line 1774) | def multi_look(SLC, SLC_par, MLI, MLI_par, rlks, azlks, loff='-', nlines...
  function multi_look2 (line 1812) | def multi_look2(SLC, SLC_par, MLI, MLI_par, r_dec, az_dec, rwin='-', azw...
  function multi_look_MLI (line 1862) | def multi_look_MLI(MLI_in, MLI_in_par, MLI_out, MLI_out_par, rlks, azlks...
  function multi_look_ScanSAR (line 1903) | def multi_look_ScanSAR(SLC_tab, MLI, MLI_par, rlks, azlks, bflg='-', SLC...
  function multi_real (line 1943) | def multi_real(data_in, OFF_par_in, data_out, OFF_par_out, rlks='-', azl...
  function multi_SLC_WSS (line 1981) | def multi_SLC_WSS(SLC, SLC_par, MLI, MLI_par, logpath=None, outdir=None,...
  function neutron (line 2007) | def neutron(intensity, flag, width, n_thres, ymin='-', ymax='-', logpath...
  function offset_add (line 2037) | def offset_add(OFF_par1, OFF_par2, OFF_par3, logpath=None, outdir=None, ...
  function offset_fit (line 2062) | def offset_fit(offs, ccp, OFF_par, coffs='-', coffsets='-', thres='-', n...
  function offset_pwr (line 2099) | def offset_pwr(SLC1, SLC2, SLC1_par, SLC2_par, OFF_par, offs, ccp, rwin=...
  function offset_pwr_tracking (line 2175) | def offset_pwr_tracking(SLC1, SLC2, SLC1_par, SLC2_par, OFF_par, offs, c...
  function offset_pwr_tracking2 (line 2259) | def offset_pwr_tracking2(SLC1, SLC2, SLC1_par, SLC2_par, OFF_par, offs, ...
  function offset_pwr_tracking_polygons (line 2345) | def offset_pwr_tracking_polygons(SLC_par, OFF_par, rlks, azlks, rwin, az...
  function offset_SLC (line 2393) | def offset_SLC(SLC1, SLC2, SLC1_par, SLC2_par, OFF_par, offs, snr, rwin=...
  function offset_SLC_tracking (line 2446) | def offset_SLC_tracking(SLC1, SLC2, SLC1_par, SLC2_par, OFF_par, offs, s...
  function offset_sub (line 2507) | def offset_sub(offs, OFF_par, offs_sub, logpath=None, outdir=None, shell...
  function offset_tracking (line 2531) | def offset_tracking(offs, ccp, SLC_par, OFF_par, disp_map, disp_val='-',...
  function ORB_filt (line 2574) | def ORB_filt(SLC_par_in, SLC_par_out, interval='-', extra='-', logpath=N...
  function ORB_prop_SLC (line 2600) | def ORB_prop_SLC(SLC_par, nstate='-', interval='-', extra='-', mode='-',...
  function ORRM_vec (line 2632) | def ORRM_vec(SLC_par, ORRM, nstate='-', logpath=None, outdir=None, shell...
  function par_ACS_ERS (line 2656) | def par_ACS_ERS(CEOS_SAR_leader, SLC_par, logpath=None, outdir=None, she...
  function par_ASAR (line 2678) | def par_ASAR(ASAR_ERS_file, output_name, K_dB='-', logpath=None, outdir=...
  function par_ASF_91 (line 2705) | def par_ASF_91(CEOS_leader, CEOS_trailer, SLC_par, logpath=None, outdir=...
  function par_ASF_96 (line 2729) | def par_ASF_96(CEOS_SAR_leader, SLC_par, logpath=None, outdir=None, shel...
  function par_ASF_PRI (line 2751) | def par_ASF_PRI(CEOS_leader, CEOS_data, GRD_par, GRD, logpath=None, outd...
  function par_ASF_RSAT_SS (line 2777) | def par_ASF_RSAT_SS(CEOS_leader, CEOS_data, GRD_par, GRD, logpath=None, ...
  function par_ASF_SLC (line 2803) | def par_ASF_SLC(CEOS_leader, SLC_par, CEOS_data='-', SLC='-', logpath=No...
  function par_ASNARO2 (line 2829) | def par_ASNARO2(CEOS_data, CEOS_leader, SLC_par, SLC='-', reramp='-', lo...
  function par_ATLSCI_ERS (line 2861) | def par_ATLSCI_ERS(CEOS_SAR_leader, CEOS_Image, SLC_par, logpath=None, o...
  function par_Capella_SLC (line 2885) | def par_Capella_SLC(GeoTIFF, ext_JSON, SLC_par, SLC='-', radcal='-', noi...
  function par_CS_DGM (line 2922) | def par_CS_DGM(HDF5, trunk, logpath=None, outdir=None, shellscript=None):
  function par_CS_SLC (line 2945) | def par_CS_SLC(HDF5, trunk, logpath=None, outdir=None, shellscript=None):
  function par_CS_SLC_TIF (line 2968) | def par_CS_SLC_TIF(GeoTIFF, XML, trunk, logpath=None, outdir=None, shell...
  function par_CSG_DGM (line 2993) | def par_CSG_DGM(HDF5, trunk, logpath=None, outdir=None, shellscript=None):
  function par_CSG_SLC (line 3016) | def par_CSG_SLC(HDF5, trunk, logpath=None, outdir=None, shellscript=None):
  function par_EORC_JERS_SLC (line 3039) | def par_EORC_JERS_SLC(CEOS_SAR_leader, SLC_par, CEOS_data='-', SLC='-', ...
  function par_EORC_PALSAR (line 3065) | def par_EORC_PALSAR(CEOS_leader, SLC_par, CEOS_data, SLC='-', dtype='-',...
  function par_EORC_PALSAR_ScanSAR (line 3098) | def par_EORC_PALSAR_ScanSAR(CEOS_data, CEOS_leader, SLC_par, SLC='-', TO...
  function par_ERSDAC_PALSAR (line 3141) | def par_ERSDAC_PALSAR(ERSDAC_SLC_par, SLC_par, logpath=None, outdir=None...
  function par_ESA_ERS (line 3163) | def par_ESA_ERS(CEOS_SAR_leader, SLC_par, inlist, CEOS_DAT='-', SLC='-',...
  function par_ESA_JERS_SEASAT_SLC (line 3191) | def par_ESA_JERS_SEASAT_SLC(CEOS_data, CEOS_leader, SLC_par, SLC='-', lo...
  function par_ESA_PALSAR_GDH (line 3217) | def par_ESA_PALSAR_GDH(CEOS_data, CEOS_leader, MLI_par, MLI='-', GRD_par...
  function par_Fucheng_SLC (line 3249) | def par_Fucheng_SLC(GeoTIFF, annotation_XML, calibration_XML, noise_XML,...
  function par_GF3_SLC (line 3292) | def par_GF3_SLC(GeoTIFF, annotation_XML, SLC_par, SLC='-', logpath=None,...
  function par_HISEA1_SLC (line 3318) | def par_HISEA1_SLC(GeoTIFF, annotation_XML, calibration_XML, SLC_par, SL...
  function par_HT1_SLC (line 3358) | def par_HT1_SLC(GeoTIFF, annotation_XML, SLC_par, SLC='-', dtype='-', lo...
  function par_ICEYE_GRD (line 3389) | def par_ICEYE_GRD(GeoTIFF, XML, MLI_par, MLI='-', GRD_par='-', GRD='-', ...
  function par_ICEYE_SLC (line 3421) | def par_ICEYE_SLC(HDF5, SLC_par, SLC='-', dtype='-', logpath=None, outdi...
  function par_IECAS_SLC (line 3450) | def par_IECAS_SLC(aux_data, slc_Re, slc_Im, date, SLC_par, SLC, logpath=...
  function par_KC_PALSAR_slr (line 3480) | def par_KC_PALSAR_slr(facter_m, CEOS_leader, SLC_par, pol, pls_mode, KC_...
  function par_KS_DGM (line 3518) | def par_KS_DGM(HDF5, trunk, logpath=None, outdir=None, shellscript=None):
  function par_KS_SLC (line 3541) | def par_KS_SLC(HDF5, trunk, logpath=None, outdir=None, shellscript=None):
  function par_LT1_SLC (line 3564) | def par_LT1_SLC(GeoTIFF, annotation_XML, SLC_par, SLC='-', dtype='-', lo...
  function par_MSP (line 3595) | def par_MSP(SAR_par, PROC_par, SLC_par, image_format='-', logpath=None, ...
  function par_NISAR_RSLC (line 3625) | def par_NISAR_RSLC(HDF5, root_name, radcal='-', noise='-', band='-', fre...
  function par_NovaSAR_GRD (line 3670) | def par_NovaSAR_GRD(GeoTIFF, XML, polarization, MLI_par, MLI='-', GRD_pa...
  function par_NovaSAR_SLC (line 3714) | def par_NovaSAR_SLC(GeoTIFF, XML, polarization, SLC_par, SLC='-', dtype=...
  function par_NovaSAR_SRD (line 3757) | def par_NovaSAR_SRD(GeoTIFF, XML, polarization, MLI_par, MLI='-', radcal...
  function par_PRI (line 3795) | def par_PRI(CEOS_SAR_leader, PRI_par, CEOS_DAT, PRI, logpath=None, outdi...
  function par_PRI_ESRIN_JERS (line 3821) | def par_PRI_ESRIN_JERS(CEOS_SAR_leader, PRI_par, CEOS_DAT, PRI, logpath=...
  function par_PulSAR (line 3847) | def par_PulSAR(CEOS_SAR_leader, SLC_par, logpath=None, outdir=None, shel...
  function par_RCM_GRC (line 3869) | def par_RCM_GRC(RCM_dir, polarization, radcal, noise, SLC_par='-', SLC='...
  function par_RCM_GRD (line 3918) | def par_RCM_GRD(RCM_dir, polarization, radcal, noise, MLI_par='-', MLI='...
  function par_RCM_MLC (line 3967) | def par_RCM_MLC(RCM_dir, radcal, noise, root_name, logpath=None, outdir=...
  function par_RCM_SLC (line 4004) | def par_RCM_SLC(RCM_dir, polarization, radcal, noise, SLC_par, SLC, nois...
  function par_RCM_SLC_ScanSAR (line 4047) | def par_RCM_SLC_ScanSAR(RCM_dir, polarization, radcal, noise_in, root_na...
  function par_RISAT_GRD (line 4098) | def par_RISAT_GRD(CEOS_leader, BAND_META, GRD_par, CEOS_image, GRD='-', ...
  function par_RISAT_SLC (line 4145) | def par_RISAT_SLC(CEOS_leader, BAND_META, SLC_par, CEOS_image, SLC='-', ...
  function par_RSAT2_SG (line 4192) | def par_RSAT2_SG(product_XML, lut_XML, GeoTIFF, polarization, MLI_par='-...
  function par_RSAT2_SLC (line 4230) | def par_RSAT2_SLC(product_XML, lut_XML, GeoTIFF, polarization, SLC_par, ...
  function par_RSAT_SCW (line 4260) | def par_RSAT_SCW(CEOS_leader, CEOS_trailer, CEOS_data, GRD_par, GRD, sc_...
  function par_RSAT_SGF (line 4292) | def par_RSAT_SGF(CEOS_leader, CEOS_data, GRD_par, GRD, sc_dB='-', dt='-'...
  function par_RSAT_SLC (line 4322) | def par_RSAT_SLC(CEOS_leader, SLC_par, CEOS_data, SLC='-', sc_dB='-', dt...
  function par_RSI_ERS (line 4352) | def par_RSI_ERS(CEOS_SAR_leader, SLC_par, logpath=None, outdir=None, she...
  function par_S1_GRD (line 4374) | def par_S1_GRD(GeoTIFF, annotation_XML, calibration_XML, noise_XML, MLI_...
  function par_S1_SLC (line 4433) | def par_S1_SLC(GeoTIFF, annotation_XML, calibration_XML, noise_XML, SLC_...
  function par_SAOCOM_GRD (line 4477) | def par_SAOCOM_GRD(data, XML, MLI_par, MLI='-', GRD_par='-', GRD='-', rp...
  function par_SAOCOM_SLC (line 4509) | def par_SAOCOM_SLC(data, XML, SLC_par, SLC='-', TOPS_par='-', RSLC_par='...
  function par_SICD_SLC (line 4541) | def par_SICD_SLC(NITF, radcal, noise, SLC_par, SLC='-', XML='-', logpath...
  function par_SIRC (line 4580) | def par_SIRC(CEOS_leader, SLC_par, UTC_MET='-', logpath=None, outdir=Non...
  function par_STRIX (line 4604) | def par_STRIX(CEOS_leader, SLC_par, CEOS_data, SLC='-', logpath=None, ou...
  function par_SV2_SLC (line 4630) | def par_SV2_SLC(GeoTIFF, annotation_XML, SLC_par, SLC='-', dtype='-', ra...
  function par_SWOT_SLC (line 4667) | def par_SWOT_SLC(NETCDF, trunk, DEM='-', DEM_par='-', logpath=None, outd...
  function par_TX_GRD (line 4694) | def par_TX_GRD(annotation_XML, GeoTIFF, GRD_par, GRD='-', pol='-', MLI_p...
  function par_TX_ScanSAR (line 4730) | def par_TX_ScanSAR(annotation_XML, swath, SLC_par, SLC, TOPS_par, bwflg=...
  function par_TX_SLC (line 4774) | def par_TX_SLC(annotation_XML, COSAR, SLC_par, SLC, pol='-', dtype='-', ...
  function par_UAVSAR_SLC (line 4807) | def par_UAVSAR_SLC(ann, SLC_MLC_in, SLC_MLI_par, SLC_MLI_out='-', image_...
  function ph_slope_base (line 4846) | def ph_slope_base(int_in, SLC_par, OFF_par, base, int_out, int_type='-',...
  function phase_slope (line 4884) | def phase_slope(interf, slopes, width, win_sz='-', thres='-', xmin='-', ...
  function PRC_vec (line 4920) | def PRC_vec(SLC_par, PRC, nstate='-', logpath=None, outdir=None, shellsc...
  function ptarg_cal_MLI (line 4944) | def ptarg_cal_MLI(MLI_par, MLI, r_samp, az_samp, psigma, c_r_samp, c_az_...
  function ptarg_cal_SLC (line 5001) | def ptarg_cal_SLC(SLC_par, SLC, r_samp, az_samp, psigma, c_r_samp, c_az_...
  function ptarg_SLC (line 5058) | def ptarg_SLC(SLC_par, SLC, r_samp, az_samp, ptr_image, r_plot, az_plot,...
  function radcal_MLI (line 5103) | def radcal_MLI(MLI, MLI_par, OFF_par, CMLI, antenna='-', rloss_flag='-',...
  function radcal_PRI (line 5161) | def radcal_PRI(PRI, PRI_par, GRD, GRD_par, K_dB='-', inc_ref='-', roff='...
  function radcal_pwr_stat (line 5203) | def radcal_pwr_stat(SLC_tab, SLC_tab_cal, plist, MSR_cal, PWR_cal, roff=...
  function radcal_SLC (line 5241) | def radcal_SLC(SLC, SLC_par, CSLC, CSLC_par, fcase='-', antenna='-', rlo...
  function rascc_mask (line 5306) | def rascc_mask(cc, pwr, width, start_cc='-', start_pwr='-', nlines='-', ...
  function rascc_mask_thinning (line 5362) | def rascc_mask_thinning(ras_in, in_file, width, ras_out, nmax='-', thres...
  function res_map (line 5392) | def res_map(hgt, gr, data, SLC_par, OFF_par, res_hgt, res_data, nr='-', ...
  function residue (line 5434) | def residue(int, flag, width, xmin='-', xmax='-', ymin='-', ymax='-', lo...
  function residue_cc (line 5466) | def residue_cc(int, flag, width, xmin='-', xmax='-', ymin='-', ymax='-',...
  function RSAT2_vec (line 5498) | def RSAT2_vec(SLC_par, RSAT2_orb, nstate='-', logpath=None, outdir=None,...
  function S1_burstloc (line 5522) | def S1_burstloc(annotation_XML, logpath=None, outdir=None, shellscript=N...
  function S1_ETAD_SLC (line 5542) | def S1_ETAD_SLC(ETAD, SLC1_tab, SLC2_tab, OPOD='-', corr='-', phase='-',...
  function S1_OPOD_vec (line 5632) | def S1_OPOD_vec(SLC_par, OPOD, nstate='-', logpath=None, outdir=None, sh...
  function sbi_filt (line 5657) | def sbi_filt(SLC1, SLC1_par, SLC2R_par, SLCf, SLCf_par, SLCb, SLCb_par, ...
  function sbi_offset (line 5697) | def sbi_offset(sbi_unw, SLCf_par, SLCb_par, OFF_par, az_offset, logpath=...
  function ScanSAR_burst_copy (line 5725) | def ScanSAR_burst_copy(SLC, SLC_par, TOPS_par, SLC_out, SLC_out_par, bur...
  function ScanSAR_burst_corners (line 5767) | def ScanSAR_burst_corners(SLC_par, TOPS_par, KML='-', logpath=None, outd...
  function ScanSAR_burst_MLI (line 5791) | def ScanSAR_burst_MLI(SLC_tab, MLI_tab, rlks, azlks, bflg='-', SLCR_tab=...
  function ScanSAR_burst_overlap (line 5833) | def ScanSAR_burst_overlap(SLC_tab, root_name, rlks, azlks, mode='-', bfl...
  function ScanSAR_burst_to_mosaic (line 5880) | def ScanSAR_burst_to_mosaic(DATA_tab, mosaic, MLI_par, mflg='-', data_ta...
  function ScanSAR_full_aperture_SLC (line 5921) | def ScanSAR_full_aperture_SLC(SLC1_tab, SLC2_tab, SLCR_tab='-', SLC2_dir...
  function ScanSAR_mosaic_to_burst (line 5975) | def ScanSAR_mosaic_to_burst(DATA, MLI_par, DATA_tab, logpath=None, outdi...
  function slant_range (line 6003) | def slant_range(SLC_par, slr, logpath=None, outdir=None, shellscript=None):
  function SLC_adf (line 6025) | def SLC_adf(SLC, ref_SLC, ref_SLC_par, SLC_filt, mode='-', alpha='-', nf...
  function SLC_cat (line 6072) | def SLC_cat(SLC1, SLC2, SLC1_par, SLC2_par, OFF_par, SLC3, SLC3_par, dop...
  function SLC_cat_ScanSAR (line 6132) | def SLC_cat_ScanSAR(SLC_tab1, SLC_tab2, SLC_tab3, bin_flag='-', logpath=...
  function SLC_copy (line 6164) | def SLC_copy(SLC_in, SLC_par_in, SLC_out, SLC_par_out, fcase='-', sc='-'...
  function SLC_copy_ScanSAR (line 6219) | def SLC_copy_ScanSAR(SLC1_tab, SLC2_tab, BURST_tab, dtype='-', SLC2_dir=...
  function SLC_corners (line 6259) | def SLC_corners(SLC_par, terra_alt='-', kml='-', logpath=None, outdir=No...
  function SLC_deramp (line 6283) | def SLC_deramp(SLC1, SLC1_par, SLC2, SLC2_par, mode, dop_ph='-', logpath...
  function SLC_deramp_ScanSAR (line 6317) | def SLC_deramp_ScanSAR(SLC1_tab, SLC2_tab, mode, phflg='-', logpath=None...
  function SLC_deskew (line 6350) | def SLC_deskew(SLC1, SLC1_par, SLC2, SLC2_par, mode='-', interp='-', ord...
  function SLC_freq_shift (line 6402) | def SLC_freq_shift(SLC, SLC_par, SLC_shift, SLC_shift_par, freq_shift, l...
  function SLC_interp (line 6431) | def SLC_interp(SLC2, SLC1_par, SLC2_par, OFF_par, SLC2R, SLC2R_par, loff...
  function SLC_interp_map (line 6472) | def SLC_interp_map(SLC2, SLC1_par, SLC2_par, OFF_par, SLC2R, SLC2R_par, ...
  function SLC_interp_ScanSAR (line 6517) | def SLC_interp_ScanSAR(SLC2_tab, SLC2_par, SLC1_tab, SLC1_par, OFF_par, ...
  function SLC_intf (line 6570) | def SLC_intf(SLC1, SLC2R, SLC1_par, SLC2R_par, OFF_par, interf, rlks, az...
  function SLC_intf2 (line 6638) | def SLC_intf2(SLC1, SLC2R, SLC1_par, SLC2R_par, MLI1, MLI2R, MLI1_par, M...
  function SLC_mosaic_range (line 6698) | def SLC_mosaic_range(SLC_tab, SLC, SLC_par, mode='-', order='-', logpath...
  function SLC_mosaic_ScanSAR (line 6731) | def SLC_mosaic_ScanSAR(SLC_tab, SLC, SLC_par, rlks, azlks, bflg='-', SLC...
  function SLC_ovr (line 6770) | def SLC_ovr(SLC, SLC_par, SLC_ovr, SLC_ovr_par, r_ovr='-', az_ovr='-', m...
  function SLC_phase_shift (line 6812) | def SLC_phase_shift(SLC1, SLC1_par, SLC2, SLC2_par, ph_shift, logpath=No...
  function SLC_RFI_filt (line 6844) | def SLC_RFI_filt(SLC, SLC_par, SLC_filt, rfi_thres='-', nfft_r='-', nfft...
  function SLC_RFI_filt2 (line 6882) | def SLC_RFI_filt2(SLC, SLC_par, SLC_filt, rfi_thres='-', method='-', f_b...
  function split_WB (line 6931) | def split_WB(data_in, data_par_in, data_tab, dtype, logpath=None, outdir...
  function SR_to_GRD (line 6961) | def SR_to_GRD(MLI_par, OFF_par, GRD_par, in_file, out_file, rlks='-', az...
  function subtract_phase (line 7009) | def subtract_phase(interf_in, phase_file, interf_out, width, factor='-',...
  function tree_cc (line 7038) | def tree_cc(flag, width, mbl='-', xmin='-', xmax='-', ymin='-', ymax='-'...
  function tree_gzw (line 7070) | def tree_gzw(flag, width, mbl='-', xmin='-', xmax='-', ymin='-', ymax='-...
  function unw_model (line 7102) | def unw_model(interf, unw_model, unw, width, xinit='-', yinit='-', ref_p...
  function bpf_ssi (line 7136) | def bpf_ssi(SLC, SLC_par, SLC_flow, SLC_flow_par, SLC_fhigh, SLC_fhigh_p...
  function bpf_ssi_S1 (line 7169) | def bpf_ssi_S1(SLC_tab, SLC_tab_flow, SLC_tab_high, rbs='-', logpath=Non...
  function get_GAMMA_RASTER (line 7197) | def get_GAMMA_RASTER(mode, logpath=None, outdir=None, shellscript=None):
  function INTF_SLC (line 7241) | def INTF_SLC(pass1, pass2, rlks, azlks, algorithm='-', cc_win='-', r_pos...
  function ionosphere_check (line 7278) | def ionosphere_check(SLC, par, rwin='-', azwin='-', thresh='-', rstep='-...
  function make_tab (line 7321) | def make_tab(list, tab, template, logpath=None, outdir=None, shellscript...
  function mk_ptarg (line 7349) | def mk_ptarg(RSLC_tab, cal_dir, r_samp, az_samp, osf='-', options='-', l...
  function mk_ptarg_cal (line 7384) | def mk_ptarg_cal(CR_tab, SLC, SLC_par, cal_dir, sigma, c_rpos, c_azpos, ...
  function mk_tab3 (line 7426) | def mk_tab3(dir, ext1, ext2, ext3, tab, logpath=None, outdir=None, shell...
  function offset_plot_az (line 7456) | def offset_plot_az(offset, r_min, r_max, r_plot, az_plot, logpath=None, ...
  function offset_plot_r (line 7485) | def offset_plot_r(offset, az_min, az_max, r_plot, az_plot, logpath=None,...
  function OPOD_vec (line 7514) | def OPOD_vec(SLC_par, OPOD_dir, nstate='-', logpath=None, outdir=None, s...
  function run_all (line 7540) | def run_all(list, command, log='-', logpath=None, outdir=None, shellscri...
  function S1_BURST_tab (line 7569) | def S1_BURST_tab(SLC1_tab, SLC2_tab, BURST_tab, logpath=None, outdir=Non...
  function S1_BURST_tab_from_zipfile (line 7596) | def S1_BURST_tab_from_zipfile(zipfile_list, zipfile_ref, burst_number_ta...
  function S1_extract_png (line 7631) | def S1_extract_png(zipfile, logpath=None, outdir=None, shellscript=None):
  function S1_GRD_preproc (line 7652) | def S1_GRD_preproc(S1_list, MLI_dir, pol, log, options='-', logpath=None...
  function S1_path_number (line 7685) | def S1_path_number(S1_zipfile, logpath=None, outdir=None, shellscript=No...
  function S1_TOPS_preproc (line 7706) | def S1_TOPS_preproc(S1_list, SLC_dir, pol, log, options='-', logpath=Non...
  function SBI_INT (line 7743) | def SBI_INT(RSLC1, RSLC1_par, RSLC2, RSLC2_par, sbi, off, sbi_pwr, par_o...
  function ScanSAR_burst_cc_ad (line 7795) | def ScanSAR_burst_cc_ad(DIFF_tab, MLI1_tab, MLI2R_tab, slope_tab, textur...
  function ScanSAR_burst_cc_wave (line 7844) | def ScanSAR_burst_cc_wave(DIFF_tab, MLI1_tab, MLI2R_tab, CC_tab, log, bx...
  function SLC_copy_WB (line 7892) | def SLC_copy_WB(SLC_tab, SLC2_dir, logpath=None, outdir=None, shellscrip...
  function TX_SLC_preproc (line 7917) | def TX_SLC_preproc(TSX_list, SLC_dir, log, logpath=None, outdir=None, sh...
  function unw_correction_filt (line 7942) | def unw_correction_filt(unw_in, unw_out, width, fsize='-', thresh1='-', ...
  function unw_correction_poly (line 7980) | def unw_correction_poly(unw_in, unw_out, width, poly, flag, max_iter='-'...
  function UNWRAP (line 8013) | def UNWRAP(interf, cc, pwr, unwrap, flag, width, lines, corr_thr='-', pw...
  function UNWRAP_PAR (line 8061) | def UNWRAP_PAR(interf_par, interf, cc, pwr, unwrap, flag, corr_thr='-', ...

FILE: pyroSAR/gamma/util.py
  function calibrate (line 50) | def calibrate(id, directory, return_fnames=False,
  function convert2gamma (line 143) | def convert2gamma(id, directory, S1_tnr=True, S1_bnr=True,
  function correctOSV (line 453) | def correctOSV(id, directory, osvdir=None, osvType='POE', timeout=20,
  function gc_map_wrap (line 562) | def gc_map_wrap(image, namespace, dem, spacing, exist_ok=False,
  function geocode (line 659) | def geocode(scene, dem, tmpdir, outdir, spacing, scaling='linear', func_...
  function _delete_product (line 1144) | def _delete_product(path):
  function lat_linear_to_db (line 1150) | def lat_linear_to_db(data_in: str, data_out: str) -> None:
  function lat_product (line 1179) | def lat_product(data_in1: str, data_in2: str, data_out: str) -> None:
  function lat_ratio (line 1213) | def lat_ratio(data_in1: str, data_in2: str, data_out: str) -> None:
  function multilook (line 1247) | def multilook(infile, outfile, spacing, rlks=None, azlks=None,
  function ovs (line 1362) | def ovs(parfile, spacing):
  function pixel_area_wrap (line 1402) | def pixel_area_wrap(image, namespace, lut, exist_ok=False,
  function S1_deburst (line 1544) | def S1_deburst(burst1, burst2, burst3, name_out, rlks=5, azlks=1,

FILE: pyroSAR/snap/auxil.py
  function parse_recipe (line 40) | def parse_recipe(name):
  function parse_node (line 67) | def parse_node(name, use_existing=True):
  function execute (line 193) | def execute(xmlfile, cleanup=True, gpt_exceptions=None, gpt_args=None):
  function gpt (line 309) | def gpt(xmlfile, tmpdir, groups=None, cleanup=True,
  function writer (line 439) | def writer(xmlfile, outdir, basename_extensions=None,
  function is_consistent (line 554) | def is_consistent(workflow):
  function split (line 586) | def split(xmlfile, groups, outdir=None):
  function groupbyWorkers (line 699) | def groupbyWorkers(xmlfile, n=2):
  class Workflow (line 770) | class Workflow(object):
    method __init__ (line 780) | def __init__(self, xmlfile):
    method __enter__ (line 784) | def __enter__(self):
    method __exit__ (line 787) | def __exit__(self, exc_type, exc_val, exc_tb):
    method __getitem__ (line 790) | def __getitem__(self, item):
    method __len__ (line 806) | def __len__(self):
    method __delitem__ (line 809) | def __delitem__(self, key):
    method __str__ (line 820) | def __str__(self):
    method __iter__ (line 826) | def __iter__(self):
    method successors (line 829) | def successors(self, id, recursive=False):
    method __reset_successor_source (line 858) | def __reset_successor_source(self, id):
    method __optimize_appearance (line 908) | def __optimize_appearance(self):
    method ids (line 936) | def ids(self):
    method index (line 946) | def index(self, node):
    method insert_node (line 961) | def insert_node(self, node, before=None, after=None, resetSuccessorSou...
    method nodes (line 1045) | def nodes(self):
    method operators (line 1056) | def operators(self):
    method refresh_ids (line 1066) | def refresh_ids(self):
    method set_par (line 1091) | def set_par(self, key, value, exceptions=None):
    method suffix (line 1114) | def suffix(self, stop=None):
    method write (line 1140) | def write(self, outfile):
  class Node (line 1159) | class Node(object):
    method __init__ (line 1169) | def __init__(self, element):
    method __repr__ (line 1174) | def __repr__(self):
    method __str__ (line 1177) | def __str__(self):
    method __set_source (line 1182) | def __set_source(self, key, value):
    method copy (line 1190) | def copy(self):
    method id (line 1201) | def id(self):
    method id (line 1212) | def id(self, value):
    method operator (line 1216) | def operator(self):
    method parameters (line 1227) | def parameters(self):
    method source (line 1242) | def source(self):
    method source (line 1264) | def source(self, value):
  class Par (line 1295) | class Par(object):
    method __init__ (line 1307) | def __init__(self, operator, element):
    method __delitem__ (line 1311) | def __delitem__(self, key):
    method __getitem__ (line 1315) | def __getitem__(self, item):
    method __setitem__ (line 1330) | def __setitem__(self, key, value):
    method __repr__ (line 1336) | def __repr__(self):
    method dict (line 1339) | def dict(self):
    method items (line 1349) | def items(self):
    method keys (line 1359) | def keys(self):
    method values (line 1369) | def values(self):
  class Par_BandMath (line 1380) | class Par_BandMath(Par):
    method __init__ (line 1390) | def __init__(self, operator, element):
    method __getitem__ (line 1395) | def __getitem__(self, item):
    method clear_variables (line 1404) | def clear_variables(self):
    method add_equation (line 1416) | def add_equation(self):
  function value2str (line 1433) | def value2str(value):
  function erode_edges (line 1457) | def erode_edges(src, only_boundary=False, connectedness=4, pixels=1):
  function mli_parametrize (line 1590) | def mli_parametrize(scene, spacing=None, rlks=None, azlks=None, **kwargs):
  function orb_parametrize (line 1650) | def orb_parametrize(scene, formatName, allow_RES_OSV=True, url_option=1,...
  function sub_parametrize (line 1709) | def sub_parametrize(scene, geometry=None, offset=None, buffer=0.01, copy...
  function geo_parametrize (line 1790) | def geo_parametrize(spacing, t_srs, tc_method='Range-Doppler',
  function dem_parametrize (line 1973) | def dem_parametrize(workflow=None, node=None, demName='SRTM 1Sec HGT', e...

FILE: pyroSAR/snap/data/collect_suffices.py
  function main (line 32) | def main():

FILE: pyroSAR/snap/util.py
  function geocode (line 28) | def geocode(infile, outdir, t_srs=4326, spacing=20, polarizations='all',...
  function noise_power (line 706) | def noise_power(infile, outdir, polarizations, spacing, t_srs, refarea='...

FILE: pyroSAR/xml_util.py
  class XMLHandler (line 21) | class XMLHandler(object):
    method __init__ (line 22) | def __init__(self, xml):
    method restoreNamespaces (line 53) | def restoreNamespaces(self):
    method write (line 58) | def write(self, outname, mode):
    method __enter__ (line 62) | def __enter__(self):
    method __exit__ (line 65) | def __exit__(self, exc_type, exc_val, exc_tb):
  function getNamespaces (line 69) | def getNamespaces(xmlfile):

FILE: tests/conftest.py
  function travis (line 10) | def travis():
  function appveyor (line 15) | def appveyor():
  function testdir (line 20) | def testdir():
  function testdata (line 25) | def testdata(testdir):
  function auxdata_dem_cases (line 56) | def auxdata_dem_cases():
  function tmp_home (line 70) | def tmp_home(tmp_path_factory):

FILE: tests/test_ancillary.py
  function test_seconds (line 10) | def test_seconds():
  function test_groupby (line 14) | def test_groupby():
  function test_groupbyTime (line 52) | def test_groupbyTime():
  function test_parse_datasetname (line 70) | def test_parse_datasetname():
  function test_find_datasets (line 123) | def test_find_datasets(testdir):
  function test_lock (line 128) | def test_lock(tmpdir):

FILE: tests/test_archive.py
  function test_archive (line 24) | def test_archive(tmpdir, testdata):
  function test_archive2 (line 71) | def test_archive2(tmpdir, testdata):
  function test_archive_postgres (line 106) | def test_archive_postgres(tmpdir, testdata):

FILE: tests/test_auxdata.py
  function test_handler (line 8) | def test_handler(auxdata_dem_cases):
  function test_autoload (line 33) | def test_autoload(auxdata_dem_cases, travis):
  function test_dem_create (line 58) | def test_dem_create(tmpdir):
  function test_intrange (line 69) | def test_intrange():

FILE: tests/test_config.py
  class TestConfigHandler (line 6) | class TestConfigHandler:
    method test_make_dir_and_config (line 8) | def test_make_dir_and_config(self, tmpdir):
    method test_add_section (line 17) | def test_add_section(self):
    method test_options (line 23) | def test_options(self, tmpdir):
    method test_overwrite (line 34) | def test_overwrite(self, tmpdir):
    method test_remove (line 43) | def test_remove(self, tmpdir):

FILE: tests/test_drivers.py
  function testcases (line 21) | def testcases():
  function scene (line 61) | def scene(testcases, testdata, request):
  class Test_Metadata (line 67) | class Test_Metadata():
    method test_attributes (line 69) | def test_attributes(self, scene):
  function test_identify_fail (line 86) | def test_identify_fail(testdir, testdata):
  function test_identify_many_fail (line 93) | def test_identify_many_fail(testdata):
  function test_filter_processed (line 97) | def test_filter_processed(tmpdir, testdata):
  function test_parse_date (line 102) | def test_parse_date():
  function test_export2dict (line 110) | def test_export2dict():
  function test_getFileObj (line 114) | def test_getFileObj(tmpdir, testdata):
  function test_scene (line 140) | def test_scene(tmpdir, testdata):
  function test_geometry (line 162) | def test_geometry(testdata, dataset):
  function test_geo_grid (line 168) | def test_geo_grid(tmpdir, testdata):

FILE: tests/test_examine.py
  function test_snap_config (line 6) | def test_snap_config(tmpdir):

FILE: tests/test_gamma.py
  function test_par (line 6) | def test_par(testdata, tmpdir):
  function test_namespace (line 28) | def test_namespace():
  function test_slc_corners (line 48) | def test_slc_corners(testdata):

FILE: tests/test_gamma_args.py
  function test_args_diff (line 7) | def test_args_diff():
  function test_args_disp (line 36) | def test_args_disp():
  function test_args_isp (line 47) | def test_args_isp():
  function test_args_lat (line 87) | def test_args_lat():

FILE: tests/test_license.py
  function test_license_year (line 5) | def test_license_year():

FILE: tests/test_osv.py
  function test_osv_cleanres (line 9) | def test_osv_cleanres(tmpdir):
  function test_scene_osv (line 21) | def test_scene_osv(tmpdir, testdata):

FILE: tests/test_snap.py
  function test_installation (line 14) | def test_installation():
  function test_consistency (line 22) | def test_consistency():
  function test_geocode (line 27) | def test_geocode(tmpdir, testdata):
  class Test_geocode_opts (line 48) | class Test_geocode_opts():
    method test_infile_type (line 49) | def test_infile_type(self, tmpdir, testdata):
    method test_pol (line 56) | def test_pol(self, tmpdir, testdata):
    method test_pol_list (line 64) | def test_pol_list(self, tmpdir, testdata):
    method test_geotype (line 68) | def test_geotype(self, tmpdir, testdata):
    method test_srs (line 75) | def test_srs(self, tmpdir, testdata):
    method test_scaling (line 81) | def test_scaling(self, tmpdir, testdata):
    method test_shp (line 86) | def test_shp(self, tmpdir, testdata):
    method test_offset (line 99) | def test_offset(self, tmpdir, testdata):
    method test_export_extra (line 103) | def test_export_extra(self, tmpdir, testdata):
    method test_externalDEM (line 111) | def test_externalDEM(self, tmpdir, testdata):
    method test_speckleFilter (line 118) | def test_speckleFilter(self, tmpdir, testdata):
    method test_refarea (line 124) | def test_refarea(self, tmpdir, testdata):
    method test_sliceassembly (line 130) | def test_sliceassembly(self, tmpdir, testdata):

FILE: tests/test_snap_exe.py
  function not_raises (line 5) | def not_raises(ExpectedException):

FILE: tests/test_xml_util.py
  function test_handler (line 8) | def test_handler(tmpdir, testdata):
Condensed preview — 112 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,425K chars).
[
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 589,
    "preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: bug\nassignees: ''\n\n---\n\n- which operati"
  },
  {
    "path": ".github/workflows/conda-install.yml",
    "chars": 4611,
    "preview": "name: conda build\n\non:\n  push:\n    branches: [ main ]\n  pull_request:\n    branches: [ main ]\n    types: [ opened, reopen"
  },
  {
    "path": ".github/workflows/python-publish.yml",
    "chars": 1086,
    "preview": "# This workflow will upload a Python Package using Twine when a release is created\n# For more information see: https://d"
  },
  {
    "path": ".gitignore",
    "chars": 1372,
    "preview": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packagi"
  },
  {
    "path": ".travis.yml",
    "chars": 1690,
    "preview": "dist: jammy\nlanguage: python\nsudo: required\ncache:\n  directories:\n    - ~/.cache/pip\n\nenv:\n  global:\n    - PIP_WHEEL_DIR"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 2949,
    "preview": "# Contributing to pyroSAR\n\nFirst off, thanks for considering a contribution to pyroSAR. Any contribution, may it be a fe"
  },
  {
    "path": "LICENSE.txt",
    "chars": 1075,
    "preview": "# Copyright (c) 2014-2026, the pyroSAR Developers.\n\nPermission is hereby granted, free of charge, to any person obtainin"
  },
  {
    "path": "MANIFEST.in",
    "chars": 199,
    "preview": "recursive-include pyroSAR/snap *.xml\nrecursive-include pyroSAR/snap/data *\nrecursive-include pyroSAR/ERS/data *\nrecursiv"
  },
  {
    "path": "README.md",
    "chars": 1685,
    "preview": "<h1 align=\"center\">\n  <br>\n  <a>pyroSAR</a>\n</h1>\n<h3 align=\"center\">A Python Framework for Large-Scale SAR Satellite Da"
  },
  {
    "path": "appveyor.yml",
    "chars": 2141,
    "preview": "# thanks a lot to the Nansat project (https://github.com/nansencenter/nansat) from which this file was adapted\nenvironme"
  },
  {
    "path": "datacube_prepare.ipynb",
    "chars": 5016,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"This is a quick notebook to demonst"
  },
  {
    "path": "docs/Makefile",
    "chars": 638,
    "preview": "# Minimal makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line, and also\n# from the "
  },
  {
    "path": "docs/make.bat",
    "chars": 769,
    "preview": "@ECHO OFF\n\npushd %~dp0\n\nREM Command file for Sphinx documentation\n\nif \"%SPHINXBUILD%\" == \"\" (\n\tset SPHINXBUILD=sphinx-bu"
  },
  {
    "path": "docs/source/about/changelog.rst",
    "chars": 51790,
    "preview": "#########\nChangelog\n#########\n\n0.6 | 2018-11-20\n================\n\nSAR metadata\n------------\n- new standardized  metadata"
  },
  {
    "path": "docs/source/about/projects.rst",
    "chars": 779,
    "preview": "######################\nProjects using pyroSAR\n######################\n\npyroSAR is/was used in these projects:\n\n- `BACI <h"
  },
  {
    "path": "docs/source/about/publications.rst",
    "chars": 130,
    "preview": "############\nPublications\n############\n\n.. bibliography::\n    :style: plain\n    :list: bullet\n    :filter: author % \"Tru"
  },
  {
    "path": "docs/source/about/references.rst",
    "chars": 91,
    "preview": ".. only:: html or text\n\n    References\n    ==========\n\n.. bibliography::\n    :style: plain\n"
  },
  {
    "path": "docs/source/api/ancillary.rst",
    "chars": 371,
    "preview": "Ancillary Functions\n===================\n\n.. automodule:: pyroSAR.ancillary\n    :members:\n    :undoc-members:\n    :show-i"
  },
  {
    "path": "docs/source/api/archive.rst",
    "chars": 189,
    "preview": "Archive\n=======\n\n.. automodule:: pyroSAR.archive\n    :members:\n    :undoc-members:\n    :show-inheritance:\n\n    .. autosu"
  },
  {
    "path": "docs/source/api/auxdata.rst",
    "chars": 391,
    "preview": "Auxiliary Data Tools\n====================\n\n.. automodule:: pyroSAR.auxdata\n    :members: dem_autoload, dem_create, get_e"
  },
  {
    "path": "docs/source/api/datacube.rst",
    "chars": 126,
    "preview": "Datacube Tools\n==============\n\n.. automodule:: pyroSAR.datacube_util\n    :members:\n    :undoc-members:\n    :show-inherit"
  },
  {
    "path": "docs/source/api/drivers.rst",
    "chars": 482,
    "preview": "Drivers\n=======\n\n.. automodule:: pyroSAR.drivers\n    :members:\n    :undoc-members:\n    :show-inheritance:\n\n    .. rubric"
  },
  {
    "path": "docs/source/api/examine.rst",
    "chars": 150,
    "preview": "Examine\n=======\n\n.. automodule:: pyroSAR.examine\n    :members:\n    :undoc-members:\n    :show-inheritance:\n\n    .. autosu"
  },
  {
    "path": "docs/source/api/figures/snap_geocode.graphml",
    "chars": 63817,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<graphml xmlns=\"http://graphml.graphdrawing.org/xmlns\" xmlns:java"
  },
  {
    "path": "docs/source/api/figures/workflow_readme.txt",
    "chars": 165,
    "preview": "workflow files were created with the yED Graph Editor (https://www.yworks.com/products/yed)\n\nsetting the vector bridge s"
  },
  {
    "path": "docs/source/api/gamma/api.rst",
    "chars": 1945,
    "preview": ".. _gamma-command-api:\n\nGAMMA Command API\n-----------------\n\nThis is an attempt to make it easier to execute GAMMA comma"
  },
  {
    "path": "docs/source/api/gamma/auxil.rst",
    "chars": 319,
    "preview": "Auxiliary functionality\n-----------------------\n\n.. automodule:: pyroSAR.gamma.auxil\n    :members:\n    :undoc-members:\n "
  },
  {
    "path": "docs/source/api/gamma/dem.rst",
    "chars": 387,
    "preview": "DEM tools\n---------\n\n.. automodule:: pyroSAR.gamma.dem\n    :members: dem_autocreate, dem_import, dempar, fill, hgt, hgt_"
  },
  {
    "path": "docs/source/api/gamma/error.rst",
    "chars": 221,
    "preview": "Error handling\n--------------\n\n.. automodule:: pyroSAR.gamma.error\n    :members:\n    :undoc-members:\n    :show-inheritan"
  },
  {
    "path": "docs/source/api/gamma/figures/gamma_geocode.graphml",
    "chars": 37310,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<graphml xmlns=\"http://graphml.graphdrawing.org/xmlns\" xmlns:java"
  },
  {
    "path": "docs/source/api/gamma/index.rst",
    "chars": 88,
    "preview": "GAMMA\n=====\n\n.. toctree::\n    :maxdepth: 1\n\n    util\n    auxil\n    dem\n    api\n    error"
  },
  {
    "path": "docs/source/api/gamma/util.rst",
    "chars": 391,
    "preview": "Processing\n----------\n\n.. automodule:: pyroSAR.gamma.util\n    :members:\n    :undoc-members:\n    :show-inheritance:\n\n    "
  },
  {
    "path": "docs/source/api/sentinel-1.rst",
    "chars": 232,
    "preview": "Sentinel-1 Tools\n================\n\n.. automodule:: pyroSAR.S1\n    :members: OSV, removeGRDBorderNoise\n    :undoc-members"
  },
  {
    "path": "docs/source/api/snap.rst",
    "chars": 1110,
    "preview": "SNAP\n====\n\nProcessing\n----------\n\n.. automodule:: pyroSAR.snap.util\n    :members:\n    :undoc-members:\n    :show-inherita"
  },
  {
    "path": "docs/source/conf.py",
    "chars": 9428,
    "preview": "import sys\nimport os\nimport datetime\nfrom importlib.metadata import version as get_version\n\nproject = 'pyroSAR'\nauthors "
  },
  {
    "path": "docs/source/general/DEM.rst",
    "chars": 3925,
    "preview": "###############\nDEM Preparation\n###############\n\nSAR processing requires a high resolution Digital Elevation Model for o"
  },
  {
    "path": "docs/source/general/OSV.rst",
    "chars": 5933,
    "preview": "####################################\nHandling of Orbit State Vector Files\n####################################\nSAR produ"
  },
  {
    "path": "docs/source/general/configuration.rst",
    "chars": 1032,
    "preview": "#############\nConfiguration\n#############\n\npyroSAR stores configuration under `$HOME/.pyrosar`.\nIt contains a file `conf"
  },
  {
    "path": "docs/source/general/filenaming.rst",
    "chars": 1291,
    "preview": "###########\nFile Naming\n###########\n\npyroSAR internally uses a fixed naming scheme to keep track of processed results. F"
  },
  {
    "path": "docs/source/general/installation.rst",
    "chars": 4342,
    "preview": "############\nInstallation\n############\n\nconda\n=====\n\nStarting with version 0.11, pyroSAR is distributed via `conda-forge"
  },
  {
    "path": "docs/source/general/logging.rst",
    "chars": 584,
    "preview": "#######\nLogging\n#######\n\npyroSAR makes use of the :mod:`logging` module to display status messages for running processes"
  },
  {
    "path": "docs/source/general/processing.rst",
    "chars": 4203,
    "preview": "#################################\nSAR Image Handling and Processing\n#################################\n\nImage Metadata\n=="
  },
  {
    "path": "docs/source/general/snap.rst",
    "chars": 6219,
    "preview": "########\nSNAP API\n########\n\npyroSAR offers a collection of tools to parse SNAP XML workflows and execute them with SNAP'"
  },
  {
    "path": "docs/source/index.rst",
    "chars": 777,
    "preview": "###################################\nWelcome to pyroSAR's documentation!\n###################################\n\nGeneral Top"
  },
  {
    "path": "docs/source/references.bib",
    "chars": 2552,
    "preview": "% Encoding: UTF-8\n@article{Ali2018,\n   author = {Ali, I. and Cao, S. and Naeimi, V. and Paulik, C. and Wagner, W.},\n   t"
  },
  {
    "path": "environment-dev.yml",
    "chars": 374,
    "preview": "name: ps_test_dev\nchannels:\n  - conda-forge\ndependencies:\n  - gdal>=2.4\n  - geoalchemy2<0.14.0\n  - libgdal\n  - libspatia"
  },
  {
    "path": "environment-doc.yml",
    "chars": 234,
    "preview": "name: ps_doc\nchannels:\n  - conda-forge\ndependencies:\n  - python>=3.10\n  - matplotlib\n  - numpy\n  - sphinx\n  - sphinx_rtd"
  },
  {
    "path": "environment.yml",
    "chars": 335,
    "preview": "name: ps_test\nchannels:\n  - conda-forge\ndependencies:\n  - gdal>=2.4\n  - geoalchemy2<0.14.0\n  - libgdal\n  - libspatialite"
  },
  {
    "path": "pyproject.toml",
    "chars": 1079,
    "preview": "[build-system]\nrequires = [\"setuptools>=45\", \"setuptools_scm[toml]>=6.2\", \"wheel\"]\n\n[project]\nname = \"pyroSAR\"\ndescripti"
  },
  {
    "path": "pyroSAR/ERS/__init__.py",
    "chars": 87,
    "preview": "from .auxil import passdb_create, passdb_query\nfrom .mapping import get_resolution_nesz"
  },
  {
    "path": "pyroSAR/ERS/auxil.py",
    "chars": 4867,
    "preview": "###############################################################################\n# tools for processing ERS satellite dat"
  },
  {
    "path": "pyroSAR/ERS/mapping.py",
    "chars": 7576,
    "preview": "from typing import Literal\n\nRESOLUTION_NESZ = {\n    'ERS1': {\n        'IMP': {\n            'IS2': {\n                'res"
  },
  {
    "path": "pyroSAR/S1/__init__.py",
    "chars": 66,
    "preview": "__author__ = 'john'\n\nfrom .auxil import OSV, removeGRDBorderNoise\n"
  },
  {
    "path": "pyroSAR/S1/auxil.py",
    "chars": 35024,
    "preview": "###############################################################################\n# general utilities for Sentinel-1\n\n# Co"
  },
  {
    "path": "pyroSAR/S1/linesimplify.py",
    "chars": 8501,
    "preview": "###############################################################################\n# Utilities for simplification of lines "
  },
  {
    "path": "pyroSAR/S1/polysimplify.py",
    "chars": 16905,
    "preview": "\"\"\"\nVisvalingam-Whyatt method of poly-line vertex reduction\nVisvalingam, M and Whyatt J D (1993)\n\"Line Generalisation by"
  },
  {
    "path": "pyroSAR/__init__.py",
    "chars": 272,
    "preview": "from .drivers import *\nfrom .archive import Archive, drop_archive\nfrom . import ancillary, drivers\n\nfrom importlib.metad"
  },
  {
    "path": "pyroSAR/ancillary.py",
    "chars": 19599,
    "preview": "###############################################################################\n# ancillary routines for software pyroSA"
  },
  {
    "path": "pyroSAR/archive.py",
    "chars": 54396,
    "preview": "###############################################################################\n# Scene database tools for pyroSAR\n# Cop"
  },
  {
    "path": "pyroSAR/auxdata.py",
    "chars": 69644,
    "preview": "###############################################################################\n# tools for handling auxiliary data in s"
  },
  {
    "path": "pyroSAR/config.py",
    "chars": 7786,
    "preview": "# -*- coding: utf-8 -*-\n###############################################################################\n# pyroSAR config"
  },
  {
    "path": "pyroSAR/datacube_util.py",
    "chars": 28786,
    "preview": "###############################################################################\n# Convenience tools for Open Data Cube i"
  },
  {
    "path": "pyroSAR/drivers.py",
    "chars": 106228,
    "preview": "###############################################################################\n# Reading and Organizing system for SAR "
  },
  {
    "path": "pyroSAR/examine.py",
    "chars": 26143,
    "preview": "###############################################################################\n# Examination of SAR processing software"
  },
  {
    "path": "pyroSAR/gamma/__init__.py",
    "chars": 192,
    "preview": "from .auxil import process, ISPPar, UTM, Spacing, Namespace, slc_corners, par2hdr\nfrom .util import calibrate, convert2g"
  },
  {
    "path": "pyroSAR/gamma/api.py",
    "chars": 1135,
    "preview": "###############################################################################\n# import wrapper for the pyroSAR GAMMA A"
  },
  {
    "path": "pyroSAR/gamma/auxil.py",
    "chars": 21798,
    "preview": "###############################################################################\n# general GAMMA utilities\n\n# Copyright ("
  },
  {
    "path": "pyroSAR/gamma/dem.py",
    "chars": 25136,
    "preview": "###############################################################################\n# preparation of DEM data for use in GAM"
  },
  {
    "path": "pyroSAR/gamma/error.py",
    "chars": 5034,
    "preview": "###############################################################################\n# interface for translating GAMMA errors"
  },
  {
    "path": "pyroSAR/gamma/parser.py",
    "chars": 38082,
    "preview": "###############################################################################\n# parse GAMMA command docstrings to Pyth"
  },
  {
    "path": "pyroSAR/gamma/parser_demo.py",
    "chars": 342649,
    "preview": "from pyroSAR.gamma.auxil import process\n\n\ndef adapt_filt(int, sm, width, low_SNR_thr='-', filt_width='-', xmin='-', xmax"
  },
  {
    "path": "pyroSAR/gamma/util.py",
    "chars": 69582,
    "preview": "###############################################################################\n# universal core routines for processing"
  },
  {
    "path": "pyroSAR/install/download_egm96_15.gtx.sh",
    "chars": 196,
    "preview": "#!/usr/bin/env bash\n# download EGM96 geoid model to convert heights with GDAL\ncd /usr/share/proj\nsudo wget https://downl"
  },
  {
    "path": "pyroSAR/install/download_testdata.sh",
    "chars": 273,
    "preview": "#!/usr/bin/env bash\n\n\nmkdir -p $TESTDATA_DIR\n\n#cd $TESTDATA_DIR\n\necho \"Start Download forest_brazil\"\nwget --quiet -P $TE"
  },
  {
    "path": "pyroSAR/install/install_deps.sh",
    "chars": 5721,
    "preview": "#!/usr/bin bash\n##############################################################\n# manual installation of pyroSAR dependen"
  },
  {
    "path": "pyroSAR/patterns.py",
    "chars": 4766,
    "preview": "###############################################################################\n# Reading and Organizing system for SAR "
  },
  {
    "path": "pyroSAR/snap/__init__.py",
    "chars": 62,
    "preview": "from .util import geocode, noise_power\nfrom .auxil import gpt\n"
  },
  {
    "path": "pyroSAR/snap/auxil.py",
    "chars": 77355,
    "preview": "###############################################################################\n# pyroSAR SNAP API tools\n\n# Copyright (c"
  },
  {
    "path": "pyroSAR/snap/data/collect_suffices.py",
    "chars": 3965,
    "preview": "##############################################################\n# SNAP source code scan for retrieving operator suffices\n"
  },
  {
    "path": "pyroSAR/snap/data/snap.auxdata.properties",
    "chars": 3218,
    "preview": "####################################################################################\n# Configuration for the Auxdata pat"
  },
  {
    "path": "pyroSAR/snap/data/snap.suffices.properties",
    "chars": 1267,
    "preview": "AdaptiveThresholding=THR\nALOS-Deskewing=DSk\nApply-Orbit-File=Orb\nBack-Geocoding=Stack\nCalibration=Cal\nCoherence=Coh\nCP-S"
  },
  {
    "path": "pyroSAR/snap/recipes/base.xml",
    "chars": 2720,
    "preview": "<graph id=\"Graph\">\n    <version>1.0</version>\n    <node id=\"Read\">\n        <operator>Read</operator>\n        <sources/>\n"
  },
  {
    "path": "pyroSAR/snap/recipes/blank.xml",
    "chars": 141,
    "preview": "<graph id=\"Graph\">\n    <version>1.0</version>\n    <applicationData id=\"Presentation\">\n        <Description/>\n    </appli"
  },
  {
    "path": "pyroSAR/snap/util.py",
    "chars": 40341,
    "preview": "###############################################################################\n# Convenience functions for SAR image ba"
  },
  {
    "path": "pyroSAR/xml_util.py",
    "chars": 2541,
    "preview": "###############################################################################\n# utility collection for xml file handli"
  },
  {
    "path": "readthedocs.yml",
    "chars": 307,
    "preview": "version: 2\n\nbuild:\n  os: \"ubuntu-lts-latest\"\n  tools:\n    python: \"mambaforge-latest\"\n\nconda:\n  environment: environment"
  },
  {
    "path": "requirements-dev.txt",
    "chars": 188,
    "preview": "-r requirements.txt\n\n#Testing requirements\npytest\n\n#Documentation requirements\nsphinx\nsphinx_rtd_theme\nsphinxcontrib-bib"
  },
  {
    "path": "requirements.txt",
    "chars": 162,
    "preview": "geoalchemy2<0.14.0\nlxml\nnumpy\npackaging\npillow\nprogressbar2\npsycopg2\npyyaml\nrequests\nshapely\nspatialist>=0.17.0\nsqlalche"
  },
  {
    "path": "tests/conftest.py",
    "chars": 3988,
    "preview": "import os\nimport shutil\nimport pytest\nimport platform\nfrom pathlib import Path\nfrom pyroSAR.examine import ExamineSnap\n\n"
  },
  {
    "path": "tests/data/S1A__IW___A_20150309T173017_VV_grd_mli_geo_norm_db.tif.aux.xml",
    "chars": 333,
    "preview": "<PAMDataset>\n  <PAMRasterBand band=\"1\">\n    <Metadata>\n      <MDI key=\"STATISTICS_MAXIMUM\">1.4325850009918</MDI>\n      <"
  },
  {
    "path": "tests/data/archive_outdated.csv",
    "chars": 58485,
    "preview": "sensor;acquisition_mode;polarizations;scene;bbox\nS1A;IW;VV,VH;/geonfs02_vol1/c4bech/01_sentinel/09_KNP/01_data/S1A_IW_GR"
  },
  {
    "path": "tests/data/dem.par",
    "chars": 1120,
    "preview": "Gamma DIFF&GEO DEM/MAP parameter file\ntitle: alps_dem_gamma_SRTM-1Sec-HGT\nDEM_projection:     UTM\ndata_format:        RE"
  },
  {
    "path": "tests/data/mli.par",
    "chars": 5096,
    "preview": "Gamma Interferometric SAR Processor (ISP) - Image Parameter File\n\ntitle:     S1A-IW-IW-VV-3296 (software: Sentinel-1 IPF"
  },
  {
    "path": "tests/installtest_gdal_geos.py",
    "chars": 768,
    "preview": "from osgeo import ogr\n\n\n# test whether GDAL was successfully built with GEOS support\nwkt1 = 'POLYGON ((' \\\n       '12080"
  },
  {
    "path": "tests/installtest_ogr_sqlite.py",
    "chars": 144,
    "preview": "from osgeo import ogr\n\ndriver = ogr.GetDriverByName('SQLite')\n\nif driver is None:\n    raise RuntimeError('OGR was built "
  },
  {
    "path": "tests/installtest_spatialite.py",
    "chars": 302,
    "preview": "\ntry:\n    from pysqlite2 import dbapi2 as sqlite3\nexcept ImportError:\n    import sqlite3\n\nprint(sqlite3.__file__)\n\ncon ="
  },
  {
    "path": "tests/test_ancillary.py",
    "chars": 8022,
    "preview": "import os\nimport pytest\nimport datetime\nfrom pathlib import Path\nfrom pyroSAR.ancillary import (seconds, groupbyTime, gr"
  },
  {
    "path": "tests/test_archive.py",
    "chars": 7104,
    "preview": "import os\n\nfrom sqlalchemy import Table, MetaData, Column, Integer, String\nfrom geoalchemy2 import Geometry\n\nfrom pyroSA"
  },
  {
    "path": "tests/test_auxdata.py",
    "chars": 3543,
    "preview": "import os\nimport pytest\nfrom pyroSAR.auxdata import dem_autoload, DEMHandler, dem_create\n\nfrom spatialist import bbox\n\n\n"
  },
  {
    "path": "tests/test_config.py",
    "chars": 1648,
    "preview": "from pyroSAR.config import ConfigHandler\nimport os\nimport pytest\n\n\nclass TestConfigHandler:\n    \n    def test_make_dir_a"
  },
  {
    "path": "tests/test_drivers.py",
    "chars": 6061,
    "preview": "import pyroSAR\n\nimport pytest\nimport platform\nimport tarfile as tf\nimport os\nfrom datetime import datetime\nfrom spatiali"
  },
  {
    "path": "tests/test_examine.py",
    "chars": 2098,
    "preview": "import os\nimport pytest\nfrom pyroSAR.examine import ExamineSnap, SnapProperties\n\n\ndef test_snap_config(tmpdir):\n    conf"
  },
  {
    "path": "tests/test_gamma.py",
    "chars": 2176,
    "preview": "import os\nimport pytest\nfrom pyroSAR.gamma import ISPPar, par2hdr, Namespace, slc_corners, api\n\n\ndef test_par(testdata, "
  },
  {
    "path": "tests/test_gamma_args.py",
    "chars": 5420,
    "preview": "import pytest\nfrom pyroSAR.ancillary import getargs\nfrom pyroSAR.gamma import api\n\n\n@pytest.mark.skipif('diff' not in di"
  },
  {
    "path": "tests/test_license.py",
    "chars": 473,
    "preview": "import os\nimport re\nfrom datetime import datetime\n\ndef test_license_year():\n    dir_current = os.path.dirname(os.path.ab"
  },
  {
    "path": "tests/test_osv.py",
    "chars": 2129,
    "preview": "import os\nimport time\nimport pytest\nfrom pyroSAR import identify\nfrom pyroSAR.S1 import OSV\nfrom datetime import datetim"
  },
  {
    "path": "tests/test_snap.py",
    "chars": 5313,
    "preview": "#####################################################################\n# Module for testing the functionality of the SNAP"
  },
  {
    "path": "tests/test_snap_exe.py",
    "chars": 442,
    "preview": "from contextlib import contextmanager\n\n\n@contextmanager\ndef not_raises(ExpectedException):\n    try:\n        yield\n\n    e"
  },
  {
    "path": "tests/test_xml_util.py",
    "chars": 569,
    "preview": "\nimport os\nimport pytest\nfrom pyroSAR import SAFE\nfrom pyroSAR.xml_util import XMLHandler\n\n\ndef test_handler(tmpdir, tes"
  }
]

// ... and 3 more files (download for full content)

About this extraction

This page contains the full source code of the johntruckenbrodt/pyroSAR GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 112 files (1.3 MB), approximately 365.9k tokens, and a symbol index with 718 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!