summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2023-05-29 11:01:13 +0000
committerCoprDistGit <infra@openeuler.org>2023-05-29 11:01:13 +0000
commit5f689d092c270636263b0e11766b50e122030b13 (patch)
tree447c65ea8d27717f416596a2e343e76845ab823b
parentdd4ebcdcdb9020a45b4c65ee42726cb0e9e54a06 (diff)
automatic import of python-konigcell
-rw-r--r--.gitignore1
-rw-r--r--python-konigcell.spec742
-rw-r--r--sources1
3 files changed, 744 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index e69de29..1c9a8a7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -0,0 +1 @@
+/konigcell-0.2.1.tar.gz
diff --git a/python-konigcell.spec b/python-konigcell.spec
new file mode 100644
index 0000000..20a1300
--- /dev/null
+++ b/python-konigcell.spec
@@ -0,0 +1,742 @@
+%global _empty_manifest_terminate_build 0
+Name: python-konigcell
+Version: 0.2.1
+Release: 1
+Summary: Quantitative, Fast Grid-Based Fields Calculations in 2D and 3D - Residence Time Distributions, Velocity Grids, Eulerian Cell Projections etc.
+License: MIT
+URL: https://github.com/anicusan/KonigCell
+Source0: https://mirrors.nju.edu.cn/pypi/web/packages/8c/fa/a73f7b471a6683673b1cc365686ef2a6645453978d8e2e268529672ee849/konigcell-0.2.1.tar.gz
+
+Requires: python3-numpy
+Requires: python3-Cython
+Requires: python3-tqdm
+Requires: python3-plotly
+Requires: python3-matplotlib
+Requires: python3-pyvista
+Requires: python3-Sphinx
+Requires: python3-numpydoc
+Requires: python3-ipython
+Requires: python3-pydata-sphinx-theme
+Requires: python3-pytest
+
+%description
+
+
+[![KonigCell](https://github.com/anicusan/KonigCell/blob/main/docs/source/_static/logo.png?raw=true)](https://konigcell.readthedocs.io/en/latest/)
+
+[![PyPI version shields.io](https://img.shields.io/pypi/v/konigcell.svg?style=flat-square)](https://pypi.python.org/pypi/konigcell/)
+[![Documentation Status](https://readthedocs.org/projects/konigcell/badge/?version=latest&style=flat-square)](https://konigcell.readthedocs.io/en/latest/?badge=latest)
+[![Language grade: Python](https://img.shields.io/lgtm/grade/python/g/anicusan/KonigCell.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/anicusan/KonigCell/context:python)
+[![Language grade: C/C++](https://img.shields.io/lgtm/grade/cpp/g/anicusan/KonigCell.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/anicusan/KonigCell/context:cpp)
+[![License: MIT](https://img.shields.io/github/license/anicusan/konigcell?style=flat-square)](https://github.com/anicusan/konigcell)
+[![PyPI pyversions](https://img.shields.io/pypi/pyversions/konigcell.svg?style=flat-square)](https://pypi.python.org/pypi/konigcell/)
+
+[![Wheels Windows](https://img.shields.io/badge/Wheels-Windows%20x86%20%7C%20x86__64-brightgreen)](https://pypi.org/project/konigcell/#files)
+[![Wheels MacOS](https://img.shields.io/badge/Wheels-MacOS%20x86__64-brightgreen)](https://pypi.org/project/konigcell/#files)
+[![Wheels Linux](https://img.shields.io/badge/Wheels-Linux%20x86__64%20%7C%20i686-brightgreen)](https://pypi.org/project/konigcell/#files)
+[![Wheel Python](https://img.shields.io/badge/Wheels-Python%203.6%20%7C%203.7%20%7C%203.8%20%7C%203.9%20%7C%203.10-brightgreen)](https://pypi.org/project/konigcell/#files)
+
+#### **Quantitative, Fast Grid-Based Fields Calculations in 2D and 3D** - Residence Time Distributions, Velocity Grids, Eulerian Cell Projections etc.
+
+That sounds dry as heck.
+
+#### **Project moving particles' trajectories (experimental or simulated) onto 2D or 3D grids with infinite resolution.**
+
+Better? No? Here are some figures produced by KonigCell:
+
+
+![Example Plots](https://github.com/anicusan/KonigCell/blob/main/docs/source/_static/examples.png?raw=true)
+
+*Left panel: 2D residence time distribution in a GranuTools GranuDrum imaged using Positron Emission Particle Tracking (PEPT). Two middle panels: 3D velocity distribution in the same system; voxels are rendered as a scatter plot (left) and tomogram-like 3-slice (right). Right panel: velocity vectorfield in a constricted pipe simulating a aneurysm, imaged using PEPT.*
+
+
+This is, to my knowledge, the only library that accurately projects particle
+trajectories onto grids - that is, taking their full projected area / volume into
+account (and not approximating them as points / lines). It's also the only one creating
+quantitative 3D projections.
+
+And it is *fast* - 1,000,000 particle positions can be rasterized onto a 512x512
+grid in 7 seconds on my 16-thread i9 CPU. The code is fully parallelised on
+threads, processes or distributed MPI nodes.
+
+
+
+## But Why?
+
+Rasterizing moving tracers onto uniform grids is a powerful way of computing statistics about a
+system - occupancies, velocity vector fields, modelling particle clump imaging etc. - be it
+experimental or simulated. However, the classical approach of approximating particle trajectories
+as lines discards a lot of (most) information.
+
+Here is an example of a particle moving randomly inside a box - on a high resolution (512x512)
+pixel grid, the classical approach (top row) does not yield much better statistics with increasing
+numbers of particle positions imaged. Projecting complete trajectory **areas** onto the grid
+(KonigCell, bottom row) preserves more information about the system explored:
+
+![Increasing Positions](https://github.com/anicusan/KonigCell/blob/main/docs/source/_static/increasing_positions.png?raw=true)
+
+
+A typical strategy for dealing with information loss is to coarsen the pixel grid, resulting in
+a trade-off between accuracy and statistical soundness. However, even very low resolutions
+still yield less information using line approximations (top row). With area projections,
+**you can increase the resolution arbitrarily** and improve precision (KonigCell, bottom row):
+
+![Increasing Resolution](https://github.com/anicusan/KonigCell/blob/main/docs/source/_static/increasing_resolution.png?raw=true)
+
+
+
+
+## The KonigCell Libraries
+
+This repository effectively hosts three libraries:
+
+- `konigcell2d`: a portable C library for 2D grid projections.
+- `konigcell3d`: a portable C library for 3D grid projections.
+- `konigcell`: a user-friendly Python interface to the two libraries above.
+
+
+
+### Installing the Python Package
+
+This package supports Python 3.6 and above (though it might work with even older
+versions).
+
+Install this package from PyPI:
+
+```pip install konigcell```
+
+
+Or conda-forge:
+
+```conda install konigcell```
+
+
+If you have a relatively standard system, the above should just download pre-compiled wheels -
+so no prior configuration should be needed.
+
+
+To *build* this package on your specific machine, you will need a C compiler -
+the low-level C code does not use any tomfoolery, so any compiler since the
+2000s should do.
+
+
+To build the latest development version from GitHub:
+
+```pip install git+https://github.com/anicusan/KonigCell```
+
+
+
+### Integrating the C Libraries with your Code
+
+The C libraries in the `konigcell2d` and `konigcell3d` directories in this repository; they
+contain instructions for compiling and using the low-level subroutines. All code is fully
+commented and follows a portable subset of the C99 standard - so no VLAs, weird macros or
+compiler-specific extensions. Even MSVC compiles it!
+
+You can run `make` in the `konigcell2d` or `konigcell3d` directories to build shared
+libraries and the example executables under `-Wall -Werror -Wextra` like a stickler. Running
+`make` in the repository root builds both libraries.
+
+Both libraries are effectively single-source - they should be as straightforward as possible
+to integrate in other C / C++ codebases, or interface with from higher-level programming
+languages.
+
+
+
+## Examples and Documentation
+
+The `examples` directory contains some Python scripts using the high-level Python routines
+and the low-level Cython interfaces. The `konigcell2d` and `konigcell3d` directories contain
+C examples.
+
+Full documentation is available [here](https://konigcell.readthedocs.io/).
+
+```python
+import numpy as np
+import konigcell as kc
+
+# Generate a short trajectory of XY positions to pixellise
+positions = np.array([
+ [0.3, 0.2],
+ [0.2, 0.8],
+ [0.3, 0.55],
+ [0.6, 0.8],
+ [0.3, 0.45],
+ [0.6, 0.2],
+])
+
+# The particle radius may change
+radii = np.array([0.05, 0.03, 0.01, 0.02, 0.02, 0.03])
+
+# Values to rasterize - velocity, duration, etc.
+values = np.array([1, 2, 1, 1, 2, 1])
+
+# Pixellise the particle trajectories
+pixels1 = kc.dynamic2d(
+ positions,
+ mode = kc.ONE,
+ radii = radii,
+ values = values[:-1],
+ resolution = (512, 512),
+)
+
+pixels2 = kc.static2d(
+ positions,
+ mode = kc.ONE,
+ radii = radii,
+ values = values,
+ resolution = (512, 512),
+)
+
+# Create Plotly 1x2 subplot grid and add Plotly heatmaps of pixels
+fig = kc.create_fig(
+ nrows = 1, ncols = 2,
+ subplot_titles = ["Dynamic 2D", "Static 2D"],
+)
+
+fig.add_trace(pixels1.heatmap_trace(), row = 1, col = 1)
+fig.add_trace(pixels2.heatmap_trace(), row = 1, col = 2)
+
+fig.show()
+```
+
+![Static-Dynamic 2D](https://github.com/anicusan/KonigCell/blob/main/docs/source/_static/static_dynamic2d.png?raw=true)
+
+
+
+## Contributing
+You are more than welcome to contribute to this library in the form of library
+improvements, documentation or helpful examples; please submit them either as:
+
+- GitHub issues.
+- Pull requests (superheroes only).
+- Email me at <a.l.nicusan@bham.ac.uk>.
+
+
+
+## Acknowledgements
+I would like to thank the Formulation Engineering CDT @School of Chemical
+Engineering and the Positron Imaging Centre @School of Physics and
+Astronomy, University of Birmingham for supporting my work.
+
+And thanks to Dr. Kit Windows-Yule for putting up with my bonkers ideas.
+
+
+
+## Citing
+If you use this library in your research, you are kindly asked to cite:
+
+> [Paper after publication]
+
+
+This library would not have been possible without the excellent `r3d` library
+(https://github.com/devonmpowell/r3d) which forms the very core of the C
+subroutines; if you use KonigCell in your work, please also cite:
+
+> Powell D, Abel T. An exact general remeshing scheme applied to physically conservative voxelization. Journal of Computational Physics. 2015 Sep 15;297:340-56.
+
+
+
+## Licensing
+KonigCell is MIT licensed. Enjoy.
+
+
+%package -n python3-konigcell
+Summary: Quantitative, Fast Grid-Based Fields Calculations in 2D and 3D - Residence Time Distributions, Velocity Grids, Eulerian Cell Projections etc.
+Provides: python-konigcell
+BuildRequires: python3-devel
+BuildRequires: python3-setuptools
+BuildRequires: python3-pip
+BuildRequires: python3-cffi
+BuildRequires: gcc
+BuildRequires: gdb
+%description -n python3-konigcell
+
+
+[![KonigCell](https://github.com/anicusan/KonigCell/blob/main/docs/source/_static/logo.png?raw=true)](https://konigcell.readthedocs.io/en/latest/)
+
+[![PyPI version shields.io](https://img.shields.io/pypi/v/konigcell.svg?style=flat-square)](https://pypi.python.org/pypi/konigcell/)
+[![Documentation Status](https://readthedocs.org/projects/konigcell/badge/?version=latest&style=flat-square)](https://konigcell.readthedocs.io/en/latest/?badge=latest)
+[![Language grade: Python](https://img.shields.io/lgtm/grade/python/g/anicusan/KonigCell.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/anicusan/KonigCell/context:python)
+[![Language grade: C/C++](https://img.shields.io/lgtm/grade/cpp/g/anicusan/KonigCell.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/anicusan/KonigCell/context:cpp)
+[![License: MIT](https://img.shields.io/github/license/anicusan/konigcell?style=flat-square)](https://github.com/anicusan/konigcell)
+[![PyPI pyversions](https://img.shields.io/pypi/pyversions/konigcell.svg?style=flat-square)](https://pypi.python.org/pypi/konigcell/)
+
+[![Wheels Windows](https://img.shields.io/badge/Wheels-Windows%20x86%20%7C%20x86__64-brightgreen)](https://pypi.org/project/konigcell/#files)
+[![Wheels MacOS](https://img.shields.io/badge/Wheels-MacOS%20x86__64-brightgreen)](https://pypi.org/project/konigcell/#files)
+[![Wheels Linux](https://img.shields.io/badge/Wheels-Linux%20x86__64%20%7C%20i686-brightgreen)](https://pypi.org/project/konigcell/#files)
+[![Wheel Python](https://img.shields.io/badge/Wheels-Python%203.6%20%7C%203.7%20%7C%203.8%20%7C%203.9%20%7C%203.10-brightgreen)](https://pypi.org/project/konigcell/#files)
+
+#### **Quantitative, Fast Grid-Based Fields Calculations in 2D and 3D** - Residence Time Distributions, Velocity Grids, Eulerian Cell Projections etc.
+
+That sounds dry as heck.
+
+#### **Project moving particles' trajectories (experimental or simulated) onto 2D or 3D grids with infinite resolution.**
+
+Better? No? Here are some figures produced by KonigCell:
+
+
+![Example Plots](https://github.com/anicusan/KonigCell/blob/main/docs/source/_static/examples.png?raw=true)
+
+*Left panel: 2D residence time distribution in a GranuTools GranuDrum imaged using Positron Emission Particle Tracking (PEPT). Two middle panels: 3D velocity distribution in the same system; voxels are rendered as a scatter plot (left) and tomogram-like 3-slice (right). Right panel: velocity vectorfield in a constricted pipe simulating a aneurysm, imaged using PEPT.*
+
+
+This is, to my knowledge, the only library that accurately projects particle
+trajectories onto grids - that is, taking their full projected area / volume into
+account (and not approximating them as points / lines). It's also the only one creating
+quantitative 3D projections.
+
+And it is *fast* - 1,000,000 particle positions can be rasterized onto a 512x512
+grid in 7 seconds on my 16-thread i9 CPU. The code is fully parallelised on
+threads, processes or distributed MPI nodes.
+
+
+
+## But Why?
+
+Rasterizing moving tracers onto uniform grids is a powerful way of computing statistics about a
+system - occupancies, velocity vector fields, modelling particle clump imaging etc. - be it
+experimental or simulated. However, the classical approach of approximating particle trajectories
+as lines discards a lot of (most) information.
+
+Here is an example of a particle moving randomly inside a box - on a high resolution (512x512)
+pixel grid, the classical approach (top row) does not yield much better statistics with increasing
+numbers of particle positions imaged. Projecting complete trajectory **areas** onto the grid
+(KonigCell, bottom row) preserves more information about the system explored:
+
+![Increasing Positions](https://github.com/anicusan/KonigCell/blob/main/docs/source/_static/increasing_positions.png?raw=true)
+
+
+A typical strategy for dealing with information loss is to coarsen the pixel grid, resulting in
+a trade-off between accuracy and statistical soundness. However, even very low resolutions
+still yield less information using line approximations (top row). With area projections,
+**you can increase the resolution arbitrarily** and improve precision (KonigCell, bottom row):
+
+![Increasing Resolution](https://github.com/anicusan/KonigCell/blob/main/docs/source/_static/increasing_resolution.png?raw=true)
+
+
+
+
+## The KonigCell Libraries
+
+This repository effectively hosts three libraries:
+
+- `konigcell2d`: a portable C library for 2D grid projections.
+- `konigcell3d`: a portable C library for 3D grid projections.
+- `konigcell`: a user-friendly Python interface to the two libraries above.
+
+
+
+### Installing the Python Package
+
+This package supports Python 3.6 and above (though it might work with even older
+versions).
+
+Install this package from PyPI:
+
+```pip install konigcell```
+
+
+Or conda-forge:
+
+```conda install konigcell```
+
+
+If you have a relatively standard system, the above should just download pre-compiled wheels -
+so no prior configuration should be needed.
+
+
+To *build* this package on your specific machine, you will need a C compiler -
+the low-level C code does not use any tomfoolery, so any compiler since the
+2000s should do.
+
+
+To build the latest development version from GitHub:
+
+```pip install git+https://github.com/anicusan/KonigCell```
+
+
+
+### Integrating the C Libraries with your Code
+
+The C libraries in the `konigcell2d` and `konigcell3d` directories in this repository; they
+contain instructions for compiling and using the low-level subroutines. All code is fully
+commented and follows a portable subset of the C99 standard - so no VLAs, weird macros or
+compiler-specific extensions. Even MSVC compiles it!
+
+You can run `make` in the `konigcell2d` or `konigcell3d` directories to build shared
+libraries and the example executables under `-Wall -Werror -Wextra` like a stickler. Running
+`make` in the repository root builds both libraries.
+
+Both libraries are effectively single-source - they should be as straightforward as possible
+to integrate in other C / C++ codebases, or interface with from higher-level programming
+languages.
+
+
+
+## Examples and Documentation
+
+The `examples` directory contains some Python scripts using the high-level Python routines
+and the low-level Cython interfaces. The `konigcell2d` and `konigcell3d` directories contain
+C examples.
+
+Full documentation is available [here](https://konigcell.readthedocs.io/).
+
+```python
+import numpy as np
+import konigcell as kc
+
+# Generate a short trajectory of XY positions to pixellise
+positions = np.array([
+ [0.3, 0.2],
+ [0.2, 0.8],
+ [0.3, 0.55],
+ [0.6, 0.8],
+ [0.3, 0.45],
+ [0.6, 0.2],
+])
+
+# The particle radius may change
+radii = np.array([0.05, 0.03, 0.01, 0.02, 0.02, 0.03])
+
+# Values to rasterize - velocity, duration, etc.
+values = np.array([1, 2, 1, 1, 2, 1])
+
+# Pixellise the particle trajectories
+pixels1 = kc.dynamic2d(
+ positions,
+ mode = kc.ONE,
+ radii = radii,
+ values = values[:-1],
+ resolution = (512, 512),
+)
+
+pixels2 = kc.static2d(
+ positions,
+ mode = kc.ONE,
+ radii = radii,
+ values = values,
+ resolution = (512, 512),
+)
+
+# Create Plotly 1x2 subplot grid and add Plotly heatmaps of pixels
+fig = kc.create_fig(
+ nrows = 1, ncols = 2,
+ subplot_titles = ["Dynamic 2D", "Static 2D"],
+)
+
+fig.add_trace(pixels1.heatmap_trace(), row = 1, col = 1)
+fig.add_trace(pixels2.heatmap_trace(), row = 1, col = 2)
+
+fig.show()
+```
+
+![Static-Dynamic 2D](https://github.com/anicusan/KonigCell/blob/main/docs/source/_static/static_dynamic2d.png?raw=true)
+
+
+
+## Contributing
+You are more than welcome to contribute to this library in the form of library
+improvements, documentation or helpful examples; please submit them either as:
+
+- GitHub issues.
+- Pull requests (superheroes only).
+- Email me at <a.l.nicusan@bham.ac.uk>.
+
+
+
+## Acknowledgements
+I would like to thank the Formulation Engineering CDT @School of Chemical
+Engineering and the Positron Imaging Centre @School of Physics and
+Astronomy, University of Birmingham for supporting my work.
+
+And thanks to Dr. Kit Windows-Yule for putting up with my bonkers ideas.
+
+
+
+## Citing
+If you use this library in your research, you are kindly asked to cite:
+
+> [Paper after publication]
+
+
+This library would not have been possible without the excellent `r3d` library
+(https://github.com/devonmpowell/r3d) which forms the very core of the C
+subroutines; if you use KonigCell in your work, please also cite:
+
+> Powell D, Abel T. An exact general remeshing scheme applied to physically conservative voxelization. Journal of Computational Physics. 2015 Sep 15;297:340-56.
+
+
+
+## Licensing
+KonigCell is MIT licensed. Enjoy.
+
+
+%package help
+Summary: Development documents and examples for konigcell
+Provides: python3-konigcell-doc
+%description help
+
+
+[![KonigCell](https://github.com/anicusan/KonigCell/blob/main/docs/source/_static/logo.png?raw=true)](https://konigcell.readthedocs.io/en/latest/)
+
+[![PyPI version shields.io](https://img.shields.io/pypi/v/konigcell.svg?style=flat-square)](https://pypi.python.org/pypi/konigcell/)
+[![Documentation Status](https://readthedocs.org/projects/konigcell/badge/?version=latest&style=flat-square)](https://konigcell.readthedocs.io/en/latest/?badge=latest)
+[![Language grade: Python](https://img.shields.io/lgtm/grade/python/g/anicusan/KonigCell.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/anicusan/KonigCell/context:python)
+[![Language grade: C/C++](https://img.shields.io/lgtm/grade/cpp/g/anicusan/KonigCell.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/anicusan/KonigCell/context:cpp)
+[![License: MIT](https://img.shields.io/github/license/anicusan/konigcell?style=flat-square)](https://github.com/anicusan/konigcell)
+[![PyPI pyversions](https://img.shields.io/pypi/pyversions/konigcell.svg?style=flat-square)](https://pypi.python.org/pypi/konigcell/)
+
+[![Wheels Windows](https://img.shields.io/badge/Wheels-Windows%20x86%20%7C%20x86__64-brightgreen)](https://pypi.org/project/konigcell/#files)
+[![Wheels MacOS](https://img.shields.io/badge/Wheels-MacOS%20x86__64-brightgreen)](https://pypi.org/project/konigcell/#files)
+[![Wheels Linux](https://img.shields.io/badge/Wheels-Linux%20x86__64%20%7C%20i686-brightgreen)](https://pypi.org/project/konigcell/#files)
+[![Wheel Python](https://img.shields.io/badge/Wheels-Python%203.6%20%7C%203.7%20%7C%203.8%20%7C%203.9%20%7C%203.10-brightgreen)](https://pypi.org/project/konigcell/#files)
+
+#### **Quantitative, Fast Grid-Based Fields Calculations in 2D and 3D** - Residence Time Distributions, Velocity Grids, Eulerian Cell Projections etc.
+
+That sounds dry as heck.
+
+#### **Project moving particles' trajectories (experimental or simulated) onto 2D or 3D grids with infinite resolution.**
+
+Better? No? Here are some figures produced by KonigCell:
+
+
+![Example Plots](https://github.com/anicusan/KonigCell/blob/main/docs/source/_static/examples.png?raw=true)
+
+*Left panel: 2D residence time distribution in a GranuTools GranuDrum imaged using Positron Emission Particle Tracking (PEPT). Two middle panels: 3D velocity distribution in the same system; voxels are rendered as a scatter plot (left) and tomogram-like 3-slice (right). Right panel: velocity vectorfield in a constricted pipe simulating a aneurysm, imaged using PEPT.*
+
+
+This is, to my knowledge, the only library that accurately projects particle
+trajectories onto grids - that is, taking their full projected area / volume into
+account (and not approximating them as points / lines). It's also the only one creating
+quantitative 3D projections.
+
+And it is *fast* - 1,000,000 particle positions can be rasterized onto a 512x512
+grid in 7 seconds on my 16-thread i9 CPU. The code is fully parallelised on
+threads, processes or distributed MPI nodes.
+
+
+
+## But Why?
+
+Rasterizing moving tracers onto uniform grids is a powerful way of computing statistics about a
+system - occupancies, velocity vector fields, modelling particle clump imaging etc. - be it
+experimental or simulated. However, the classical approach of approximating particle trajectories
+as lines discards a lot of (most) information.
+
+Here is an example of a particle moving randomly inside a box - on a high resolution (512x512)
+pixel grid, the classical approach (top row) does not yield much better statistics with increasing
+numbers of particle positions imaged. Projecting complete trajectory **areas** onto the grid
+(KonigCell, bottom row) preserves more information about the system explored:
+
+![Increasing Positions](https://github.com/anicusan/KonigCell/blob/main/docs/source/_static/increasing_positions.png?raw=true)
+
+
+A typical strategy for dealing with information loss is to coarsen the pixel grid, resulting in
+a trade-off between accuracy and statistical soundness. However, even very low resolutions
+still yield less information using line approximations (top row). With area projections,
+**you can increase the resolution arbitrarily** and improve precision (KonigCell, bottom row):
+
+![Increasing Resolution](https://github.com/anicusan/KonigCell/blob/main/docs/source/_static/increasing_resolution.png?raw=true)
+
+
+
+
+## The KonigCell Libraries
+
+This repository effectively hosts three libraries:
+
+- `konigcell2d`: a portable C library for 2D grid projections.
+- `konigcell3d`: a portable C library for 3D grid projections.
+- `konigcell`: a user-friendly Python interface to the two libraries above.
+
+
+
+### Installing the Python Package
+
+This package supports Python 3.6 and above (though it might work with even older
+versions).
+
+Install this package from PyPI:
+
+```pip install konigcell```
+
+
+Or conda-forge:
+
+```conda install konigcell```
+
+
+If you have a relatively standard system, the above should just download pre-compiled wheels -
+so no prior configuration should be needed.
+
+
+To *build* this package on your specific machine, you will need a C compiler -
+the low-level C code does not use any tomfoolery, so any compiler since the
+2000s should do.
+
+
+To build the latest development version from GitHub:
+
+```pip install git+https://github.com/anicusan/KonigCell```
+
+
+
+### Integrating the C Libraries with your Code
+
+The C libraries in the `konigcell2d` and `konigcell3d` directories in this repository; they
+contain instructions for compiling and using the low-level subroutines. All code is fully
+commented and follows a portable subset of the C99 standard - so no VLAs, weird macros or
+compiler-specific extensions. Even MSVC compiles it!
+
+You can run `make` in the `konigcell2d` or `konigcell3d` directories to build shared
+libraries and the example executables under `-Wall -Werror -Wextra` like a stickler. Running
+`make` in the repository root builds both libraries.
+
+Both libraries are effectively single-source - they should be as straightforward as possible
+to integrate in other C / C++ codebases, or interface with from higher-level programming
+languages.
+
+
+
+## Examples and Documentation
+
+The `examples` directory contains some Python scripts using the high-level Python routines
+and the low-level Cython interfaces. The `konigcell2d` and `konigcell3d` directories contain
+C examples.
+
+Full documentation is available [here](https://konigcell.readthedocs.io/).
+
+```python
+import numpy as np
+import konigcell as kc
+
+# Generate a short trajectory of XY positions to pixellise
+positions = np.array([
+ [0.3, 0.2],
+ [0.2, 0.8],
+ [0.3, 0.55],
+ [0.6, 0.8],
+ [0.3, 0.45],
+ [0.6, 0.2],
+])
+
+# The particle radius may change
+radii = np.array([0.05, 0.03, 0.01, 0.02, 0.02, 0.03])
+
+# Values to rasterize - velocity, duration, etc.
+values = np.array([1, 2, 1, 1, 2, 1])
+
+# Pixellise the particle trajectories
+pixels1 = kc.dynamic2d(
+ positions,
+ mode = kc.ONE,
+ radii = radii,
+ values = values[:-1],
+ resolution = (512, 512),
+)
+
+pixels2 = kc.static2d(
+ positions,
+ mode = kc.ONE,
+ radii = radii,
+ values = values,
+ resolution = (512, 512),
+)
+
+# Create Plotly 1x2 subplot grid and add Plotly heatmaps of pixels
+fig = kc.create_fig(
+ nrows = 1, ncols = 2,
+ subplot_titles = ["Dynamic 2D", "Static 2D"],
+)
+
+fig.add_trace(pixels1.heatmap_trace(), row = 1, col = 1)
+fig.add_trace(pixels2.heatmap_trace(), row = 1, col = 2)
+
+fig.show()
+```
+
+![Static-Dynamic 2D](https://github.com/anicusan/KonigCell/blob/main/docs/source/_static/static_dynamic2d.png?raw=true)
+
+
+
+## Contributing
+You are more than welcome to contribute to this library in the form of library
+improvements, documentation or helpful examples; please submit them either as:
+
+- GitHub issues.
+- Pull requests (superheroes only).
+- Email me at <a.l.nicusan@bham.ac.uk>.
+
+
+
+## Acknowledgements
+I would like to thank the Formulation Engineering CDT @School of Chemical
+Engineering and the Positron Imaging Centre @School of Physics and
+Astronomy, University of Birmingham for supporting my work.
+
+And thanks to Dr. Kit Windows-Yule for putting up with my bonkers ideas.
+
+
+
+## Citing
+If you use this library in your research, you are kindly asked to cite:
+
+> [Paper after publication]
+
+
+This library would not have been possible without the excellent `r3d` library
+(https://github.com/devonmpowell/r3d) which forms the very core of the C
+subroutines; if you use KonigCell in your work, please also cite:
+
+> Powell D, Abel T. An exact general remeshing scheme applied to physically conservative voxelization. Journal of Computational Physics. 2015 Sep 15;297:340-56.
+
+
+
+## Licensing
+KonigCell is MIT licensed. Enjoy.
+
+
+%prep
+%autosetup -n konigcell-0.2.1
+
+%build
+%py3_build
+
+%install
+%py3_install
+install -d -m755 %{buildroot}/%{_pkgdocdir}
+if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi
+if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi
+if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi
+if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi
+pushd %{buildroot}
+if [ -d usr/lib ]; then
+ find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/lib64 ]; then
+ find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/bin ]; then
+ find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/sbin ]; then
+ find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+touch doclist.lst
+if [ -d usr/share/man ]; then
+ find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst
+fi
+popd
+mv %{buildroot}/filelist.lst .
+mv %{buildroot}/doclist.lst .
+
+%files -n python3-konigcell -f filelist.lst
+%dir %{python3_sitearch}/*
+
+%files help -f doclist.lst
+%{_docdir}/*
+
+%changelog
+* Mon May 29 2023 Python_Bot <Python_Bot@openeuler.org> - 0.2.1-1
+- Package Spec generated
diff --git a/sources b/sources
new file mode 100644
index 0000000..998710d
--- /dev/null
+++ b/sources
@@ -0,0 +1 @@
+5eda3504a194563552b91ce27420b6e5 konigcell-0.2.1.tar.gz