Skip to main content

# RadFiled3D

Project description

RadFiled3D

Tests

This Repository contains the file format and API according to the Paper: "RadField3D: A Data Generator and Data Format for Deep Learning in Radiation-Protection Dosimetry for Medical Applications".

The aim of this library is, to provide a simple to use API for a structured, binary file format, that can store all relevant information from a three dimensional radiation field calculated by applications that use algorithms like Monte-Carlo radiation transport simulations. Such a binary file format is useful, when one needs to process a huge amount of radiation field files like when training a neural network. With that use-case in mind, RadFiled3D also provides a python interface with a pyTorch integration.

🌟 Why Use RadFiled3D

  • Efficient Storage: Structured, binary file format for storing large amounts of radiation field data.
  • Easy Integration: Simple API for C++ and Python with pyTorch support.
  • High Performance: Optimized for fast data access and manipulation.
  • Versatile: Supports both Cartesian and Polar coordinate systems.
  • Extensible: Easily extendable to include additional metadata and data types.

Table of Contents

Building and Installing

Installing from PyPi

Prebuilt versions of this module for python 3.11, 3.12 and 3.13 for Windows and most Linuxsystems can be installed directly by using pip.

pip install RadFiled3D

Installing from Source

You can build and install this library and python module from source by using CMake and a C++ compiler. The CMake Project will be built automatically, but will take some time.

Prerequisites

  • C++ Compiler
    • g++ or clang for Linux
    • MSVC or clang from Visual Studio 2022 for Windows
  • CMake >= 3.30
  • Python >= 3.11

CMake

In order to use the module directly from another C++ Project, you can integrate it by adding the local location of this repository via add_submodule() and then link against the target libRadFiled3D. All classes are then available from the namespace RadFiled3D. Check the Example or the First Test File as a first reference.

Python

In order to use the Module from Python, we provide a setup.py file that handles the compilation and integration automatically from the python setuptools.

Installing locally

python -m pip install .

Building a wheel

python -m build --wheel

Getting Started

Disclaimer: Not all methods support keyword arguments as they need to be defined manually in the bindings. For some methods like add_layer or the Metadata methods those are implemented.

From Python

Simple example on how to create and store a radiation field. Find more in the example file: Example

from RadFiled3D.RadFiled3D import CartesianRadiationField, FieldStore, StoreVersion, DType
from RadFiled3D.metadata.v1 import Metadata


# Creating a cartesian radiation field
field = CartesianRadiationField(vec3(2.5, 2.5, 2.5), vec3(0.05, 0.05, 0.05))
# defining a channel and a layer on it
field.get_channel("channel1").add_layer("layer1", "unit1", DType.FLOAT32)

# accessing the voxels by using numpy arrays
array = field.get_channel("channel1").get_layer_as_ndarray("layer1")
assert array.shape == (50, 50, 50)
# modify voxels content by using numpy array as no data is copied, just referenced
array[2:5, 2:5, 2:5] = 2.0

# addressing a voxel by providing a point in space
voxel = field.get_channel("channel1").get_voxel_by_coord("layer1", 0.1, 2.4, 5)

# Store changes to a file
metadata = Metadata.default()
FieldStore.store(field, metadata, "test01.rf3", StoreVersion.V1)

# load data
field2 = FieldStore.load("test01.rf3")
metadata2 = FieldStore.load_metadata("test01.rf3")

Integrating with pyTorch

RadFiled3D comes with a submodule at RadFiled3D.pytorch. This module provides some dataset classes to support the usage. Datasets can be loaded from folders or .zip-Files.

from RadFiled3D.pytorch import MetadataLoadMode, CartesianFieldSingleLayerDataset, DataLoaderBuilder
from RadFiled3D.pytorch.helpers import load_tensor_from_layer
from RadFiled3D.RadFiled3D import VoxelGrid
from torch import Tensor
from RadFiled3D.metadata.v1 import Metadata


# Extend one of the provided dataset classes to match the output to the current needs
# The argument type of 'layer' may vary depending on the dataset type between RadiationField (Whole field), VoxelGridBuffer (Channel), VoxelGrid (Layer) and Voxel (Single Voxel)
# The argument idx will contain the requested index from the dataset just in case someone wants to alter the return value based on it.
class MyLayerDataset(CartesianFieldSingleLayerDataset):
    def transform(self, layer: VoxelGrid, idx: int) -> Tensor:
        return load_tensor_from_layer(layer)    # transform the layers data

    def transform_origin(self, metadata: Metadata, idx) -> Tensor:
        direction = metadata.get_header().simulation.tube.radiation_direction   # transform selected data from the header
        return torch.tensor([direction.x, direction.y, direction.z], dtype=torch.float32)

def finalize_dataset(dataset: MyLayerDataset)
    dataset.set_channel_and_layer("test_channel", "test_layer")
    dataset.metadata_load_mode = MetadataLoadMode.HEADER

# Pass the dataset class and other options to the DataLoaderBuilder
builder = DataLoaderBuilder(
    "./test_dataset.zip",
    train_ratio=0.7,
    val_ratio=0.15,
    test_ratio=0.15,
    dataset_class=MyLayerDataset,
    on_dataset_created=finalize_dataset     # Optional: provide a finalizer to perform configuration of the dataset once it was created by the builder
)

# Build the training dataset
train_dl = builder.build_train_dataloader(
    batch_size=8,
    shuffle=True,
    worker_count=4
)

# iterate over the dataset
for field, metadata in train_dl:
    pass

Tracing paths in Cartesian Coordinate Systems

In order to integrate RadFiled3D with other simulation frameworks or applications, one can either take the final results and write it voxel-wise to RadFiled3D or one can already use RadFiled3D during the particle tracking. Therefore, this library offers GridTracers. Each of them implements a different line-segment tracing algorithm to find consecutive voxels that are intersected.

The following GridTracers exists:

  • SamplingGridTracer: Traces a line between two points in the grid using a sampling approach. In this approach the minimum sampling size is the length of the line segment. If the line segment is longer than the minimum sampling size, which is half the L2-Norm of the voxel size, the line is divided into segments of the minimum sampling size. This approach counts the hits if the line segment is incident to a voxel, only!
  • BresenhamGridTracer: Traces a line between two points in the grid using the Bresenham algorithm. This algorithm is a line rasterization algorithm that is used to trace a line between two points in a grid. The starting point is excluded as this can only exit a voxel.
  • LinetracingGridTracer: This class traces a line between two points in the grid using a combination of the SamplingGridTracer and a line tracing algorithm. First the lossy sampling tracer is used to trace the line. Then all adjacent voxels to the voxels that were hit are tested using a line-segment intersection test algorithm.

All those tracers can be created by calling the GridTracerFactory.construct(..) method. The tracers share one single interface method:

def trace(self, p1: vec3, p2: vec3) -> list[int]:

This method takes two points as the definition of the considered line-segment and returns the flat indices of all voxels intersected, that are inside the grid.

Example usage:

from RadFiled3D.RadFiled3D import vec3, GridTracerFactory, GridTracerAlgorithm, CartesianRadiationField, DType

field = CartesianRadiationField(vec3(1.0, 1.0, 1.0), vec3(0.01, 0.01, 0.01))
field.add_channel("test").add_layer("hits", "counts", DType.INT32)
hits_counts = field.get_channel("test").get_layer_as_ndarray("hits")
hits_counts = hits_counts.flatten()

tracer = GridTracerFactory.construct(field, GridTracerAlgorithm.SAMPLING)

indices = tracer.trace(vec3(0.5, 0.5, 0.0), vec3(0.5, 0.85, 1.0))
hits_counts[indices] += 1
grid_shape = field.get_voxel_counts()
hits_counts.reshape((grid_shape.x, grid_shape.y, grid_shape.z))

Faster loading of field series

As the RadFiled3D format possesses a dynamic structure, the loading of a radiation field requires the discovery of channels and layers as well as calculating the binary entry points of channels, layers and voxels. When loading datasets for machine learning, the structure of the fields loaded will likely be constant for each dataset. Therefore, the binary entry points can be precalculated to access only those parts of the RadFiled3D files that are really needed to increase the loading speed and to reduce the needed memory. This is relealized by the FieldAccessors objects.

from RadFiled3D.RadFiled3D import CartesianFieldAccessor, FieldStore, FieldType, uvec3

accessor: CartesianFieldAccessor = FieldStore.construct_field_accessor("a_file.rf3")
field_type = accessor.get_field_type()
assert field_type == FieldType.CARTESIAN

print(accessor)
field = accessor.access_field("a_similar_file.rf3")
layer = accessor.access_layer("a_similar_file.rf3", "channel1", "layer1")
voxel = accessor.access_voxel("a_similar_file.rf3", "channel1", "layer1", uvec3(0, 0, 0))

FieldAccessors are implemented for the two currently supported coordinate systems: CartesianFieldAccessor and PolarFieldAccessor. Depending on the actual field type, FieldStore.construct_field_accessor(AFile) returns one of them. The pyTorch Datasets are implemented using the FieldAccessor objects to allow for quicker access of datasets. The tests shall act as example code see test_field_accessor.py.

From C++

Simple example on how to create and store a radiation field. Find more in the example file: Example

#include <RadFiled3D/storage/RadiationFieldStore.hpp>
#include <RadFiled3D/RadiationField.hpp>

using namespace RadFiled3D;
using namespace RadFiled3D::Storage;

void main() {
    auto field = std::make_shared<CartesianRadiationField>(glm::vec3(2.5f), glm::vec3(0.05f)); // field extents: 2.5 m x 2.5 m x 2.5 m and voxel extents: 5 cm x 5 cm x 5 cm

    auto metadata = std::make_shared<RadFiled3D::Storage::V1::RadiationFieldMetadata>(
        // learn about the existing data fields from the example file in ./examples/cxx/examples01.cpp
    )

    FieldStore::store(field, metadata, "test_field.rf3", StoreVersion::V1);

    auto field2 = FieldStore::load("test_field.rf3");
}

Field Structure

RadFiled3D defines a field structure, that provides the user with the possibility to first define in which kind of space he wants to operate. Therefore one can choose between CartesianRadiationField and PolarRadiationField.

  • CartesianRadiationField: Segments a room defined by an extent of the room itself and each cuboid voxel into a set of voxels. Each voxel can be addressed by a 3D position (coordinate: x, y, z), a 3D index (number of the voxel in each dimension) or a flat 1D index.
  • PolarRadiationField: Segements the surface of a unit sphere into surface segments. Each segment (voxel) can be addressed by a 2D position (coordinate: theta, phi), a 2D index (number of the segment in each dimension) or a flat 1D index.

Fields are then partitioned into channels (VoxelGridBuffer/PolarSegmentsBuffer). All channels share the same size and resolution. A channel is again partitioned into layers (VoxelGrid/PolarSegment). Each layer holds the actual voxel data and can be constructed from various data types (float, double, uint32_t, uint64_t, glm::vec2, glm::vec3, glm::vec4, N-D-Histogram (list of floats)). Additionally, a layer has a unit string assigned to it as well as a statistical uncertainty to perserve those information.

Dependencies

RadFiled3D comes with a possibly low amount of dependencies. We integrated the OpenGL Math Library (GLM) just to provide those datatypes out of the box and as GLM is a head-only library we suspect no issues by doing so.

All C++ dependencies (Will be fetched by CMake):

All python dependencies:

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

radfiled3d-1.0.8.tar.gz (15.4 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

radfiled3d-1.0.8-cp313-cp313-win_amd64.whl (469.2 kB view details)

Uploaded CPython 3.13Windows x86-64

radfiled3d-1.0.8-cp313-cp313-musllinux_1_2_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

radfiled3d-1.0.8-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

radfiled3d-1.0.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

radfiled3d-1.0.8-cp312-cp312-win_amd64.whl (469.2 kB view details)

Uploaded CPython 3.12Windows x86-64

radfiled3d-1.0.8-cp312-cp312-musllinux_1_2_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

radfiled3d-1.0.8-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

radfiled3d-1.0.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

radfiled3d-1.0.8-cp311-cp311-musllinux_1_2_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

radfiled3d-1.0.8-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

radfiled3d-1.0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

File details

Details for the file radfiled3d-1.0.8.tar.gz.

File metadata

  • Download URL: radfiled3d-1.0.8.tar.gz
  • Upload date:
  • Size: 15.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for radfiled3d-1.0.8.tar.gz
Algorithm Hash digest
SHA256 87776bc97a2559d32cd592d8f0d42572117aa20ae67b51d33ca13a2dd0853f59
MD5 5f50a416e556656154d830a34659367b
BLAKE2b-256 9f94e386095b9f077cbf65581d33873bfc04cc95050fc19054682bd291920ee6

See more details on using hashes here.

Provenance

The following attestation bundles were made for radfiled3d-1.0.8.tar.gz:

Publisher: package-test-publish.yml on Centrasis/RadFiled3D

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file radfiled3d-1.0.8-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: radfiled3d-1.0.8-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 469.2 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.2

File hashes

Hashes for radfiled3d-1.0.8-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 d8ca6729c1e88d3304993186fff8c1ff52185d03647e4d310f4528072ce982c9
MD5 6e2e7f7c303d3eda869f1b9e2dc8f352
BLAKE2b-256 eeef8c90be992222f33094b3a1f8060883982afc39f780f6094090d0d5ec1521

See more details on using hashes here.

File details

Details for the file radfiled3d-1.0.8-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for radfiled3d-1.0.8-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 8611801bd6893378013e824f39ff11cb23279550e0b4ff2730bcb5c66a35e29f
MD5 faa7ba14a82f95f9e976192b59ec7d85
BLAKE2b-256 92c90b467fb8b85d5b6cd1caef64fb4eae08ee65587e12fd52c0e79dd308741c

See more details on using hashes here.

Provenance

The following attestation bundles were made for radfiled3d-1.0.8-cp313-cp313-musllinux_1_2_x86_64.whl:

Publisher: package-test-publish.yml on Centrasis/RadFiled3D

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file radfiled3d-1.0.8-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for radfiled3d-1.0.8-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a0980197a3aa95728155bad4cf3be265a1756a11482376a45b7ad8030c11c19a
MD5 3ad6fae1e07e262a0e95105c4da1947e
BLAKE2b-256 966fe6f6829e2500da01860fb7e6c1c64c05127f2a872dbc87666e5d1e9bceb4

See more details on using hashes here.

Provenance

The following attestation bundles were made for radfiled3d-1.0.8-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: package-test-publish.yml on Centrasis/RadFiled3D

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file radfiled3d-1.0.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for radfiled3d-1.0.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0fdaadba92c4b74058b7acd796df5ee760ec87b350060d349fac98e977689053
MD5 f0566d466d3833bb8a42b728bfcd9ed1
BLAKE2b-256 f794c22104f4e29056ad6368c991b71cd60fd4bef7ca343d1be5d998cc1faedf

See more details on using hashes here.

Provenance

The following attestation bundles were made for radfiled3d-1.0.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: package-test-publish.yml on Centrasis/RadFiled3D

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file radfiled3d-1.0.8-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: radfiled3d-1.0.8-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 469.2 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for radfiled3d-1.0.8-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 a2f11a96496765fcafcb6559af0308607c10c7c65857699a4d9abff3b9f7bce5
MD5 704abc674b597adbd3eb715ed33b71fe
BLAKE2b-256 ac4d4100b7f9d0857aee54703076ed2985f47dc8ed10398f4b01a17b8f4a201b

See more details on using hashes here.

File details

Details for the file radfiled3d-1.0.8-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for radfiled3d-1.0.8-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 38d8a57566725b487939a3f8cd69d9bcfdc9e2779c01809c202dd30db1a0fd2a
MD5 1be8a854c44eff66c5b2699464e863f6
BLAKE2b-256 6e2f28a097235aa7b53d452e2fc8daf7ec48a6554fae54c284b0a7be6630a08c

See more details on using hashes here.

Provenance

The following attestation bundles were made for radfiled3d-1.0.8-cp312-cp312-musllinux_1_2_x86_64.whl:

Publisher: package-test-publish.yml on Centrasis/RadFiled3D

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file radfiled3d-1.0.8-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for radfiled3d-1.0.8-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ff85254988e69f9e02001f2eac83de96ef1ea6b0191f202d0de1fc9d7a9e0b99
MD5 925269f95b98c0a5b4b3f97c2d152a0b
BLAKE2b-256 8f44b7357635026eee88d64a890c3baa2f03d6dc40760fbec0bb577f586cba52

See more details on using hashes here.

Provenance

The following attestation bundles were made for radfiled3d-1.0.8-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: package-test-publish.yml on Centrasis/RadFiled3D

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file radfiled3d-1.0.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for radfiled3d-1.0.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 dec5e444084cc40329508953fd7c4c50d6b79c1a9501c881f429044a09f2a268
MD5 c87f6e6a486d20717377eac6d48e522e
BLAKE2b-256 4251597c5fb0a5a47a4aea1871b9766b4eb9010371d58e946c9a592463f58ad3

See more details on using hashes here.

Provenance

The following attestation bundles were made for radfiled3d-1.0.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: package-test-publish.yml on Centrasis/RadFiled3D

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file radfiled3d-1.0.8-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for radfiled3d-1.0.8-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 37970e65ac2b73662fc03baee429a79b98c41d0c1acb5b85b8fe52adfcbcd6f9
MD5 196f18ba8f3ee45626403c97fcab7fab
BLAKE2b-256 cbdf729b76303c465963ad8ed91f84c1b2612432e5f02f8a64cf5adc2382b864

See more details on using hashes here.

Provenance

The following attestation bundles were made for radfiled3d-1.0.8-cp311-cp311-musllinux_1_2_x86_64.whl:

Publisher: package-test-publish.yml on Centrasis/RadFiled3D

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file radfiled3d-1.0.8-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for radfiled3d-1.0.8-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b5150738750a38d13f81d558a6fccbe7502bc3b52dd007e2b0c2710bfb4796d9
MD5 ccd9211c47bd42e5017dbab433be564a
BLAKE2b-256 cb88f2734d9710d18dddc67691029da07ee099af7774a7d8ddb809857102ab41

See more details on using hashes here.

Provenance

The following attestation bundles were made for radfiled3d-1.0.8-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: package-test-publish.yml on Centrasis/RadFiled3D

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file radfiled3d-1.0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for radfiled3d-1.0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 bdf24f4a9eb3f5f683e4bae5176498d67fc7371282a38bc8354f727c4210c621
MD5 6270d6d316ff2ec48d35aa4d4cd69503
BLAKE2b-256 21708d3d5cb7f5251b6009bd680e00c381054ded9747102354f3eaec0a47776a

See more details on using hashes here.

Provenance

The following attestation bundles were made for radfiled3d-1.0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: package-test-publish.yml on Centrasis/RadFiled3D

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page