Skills: plotly/dash, numpy, HDF5 (h5py), vtk/pyvista/other web-native 3D visualisation libraries
Category: short-term contractor job
Location: full remote
Experience: medior to senior
Budget: 400 USD
Application: please send me a direct message here on the forum
We have an existing web application written in the ploty/dash Python framework. The purpose of the application is to browse, visualise and analyse radioactive inventory data.
We would like to add a section to the app in which the user could interactively (with the ability to zoom, rotate, move) visualise radioactivity distributions in 3D components (e.g. a reactor pressure vessel). We have simulation data containing such information.
Currently, we use the VisIt software to produce 3D visualisations of activity distributions. However, it is not possible to display the 3D visualisations natively in the web app. Instead, we generate a png image of the scene in VisIt and then display the image in the web app. We would like to replace VisIt by another tool that would allow us to render the 3D scene directly in the browser.
There are several Python libraries that might be suitable for the job (feel free to suggest other tools as well):
Data to be visualised:
- The data is stored in a single HDF5 database file (example DB file will be provided).
- The library h5py is used to retrieve the data in the form of numpy arrays.
- The database file contains data for multiple physical components (e.g. reactor pressure vessel body, reactor pressure vessel lid, etc.).
- Components are modelled either in cartesian or in cylindrical coordinate systems.
- For each component, activity data is available as 3D numerical arrays (numpy arrays).
- Meshes are described using a set of 1D arrays.
- For cartesian meshes, we have arrays X, Y, and Z containing coordinates (in cm) of mesh nodes.
- For cylindrical meshes, we have arrays R (radius nodes coordinates in cm), Z (height nodes coordinates in cm), and T (azimuth angle nodes coordinates in radians) plus arrays ORIGIN (location of the origin of the cylindrical coordinate system relative to ‘global’ cartesian system in cm), AXIS (longitudial axis unit vector), and VEC (polar axis unit vector).
- You will be provided with example code snippets demonstrating how to retrieve data of interest from the DB file.
- Produce a 3D visualisation similar to the one attached below (cartesian_example.png). Embed the visualisation in a plotly/dash web app.
- The visualisation must be interactive (ability to zoom, rotate, move).
- Visualise both cartesian and cylindrical components.
- Visualise multiple components together in a single scene (also a mix of cartesian and cylindrical components).
- Implement an option to visualise only parts of components (slices along the main coordinate directions - X, Y, Z or R, Z, T). See numpy array slicing and the attached example (cartesian_example_slicing.png).
- Performance needs to be taken into consideration. The largest components in our DB file have mesh sizes of up to ~10 milion cells. It might be impossible to render such large meshes in the browser. If so, we can limit the task to smaller components only. Most of our components have much smaller mesh sizes.
- Support logarithmic ranges/legends.
- The result of your work should be a single Python function which output should be the final visualisation usable as a callback output in plotly/dash. You will be provided with more details regarding the function input parameters.
Project delivery within a fixed budget is preferred. Should you find the proposed budget insufficient, feel free to make your own proposal. We can also discuss defining milestones with their individual budgets so that there is a clear reward for you even without achieving all the requirements listed above.
Pontetially useful resources: