monai.deploy.operators.DICOMSeriesToVolumeOperator#

class monai.deploy.operators.DICOMSeriesToVolumeOperator(fragment, *args, affine_lps_to_ras=True, **kwargs)[source]#

Bases: Operator

This operator converts an instance of DICOMSeries into an Image object.

The loaded Image Object can be used for further processing via other operators. The data array will be a 3D image NumPy array with index order of DHW. Channel is limited to 1 as of now, and C is absent in the NumPy array.

Named Input:

study_selected_series_list: List of StudySelectedSeries.

Named Output:

image: Image object.

Create an instance for a containing application object.

This operator converts instances of DICOMSeries into an Image object. The loaded Image Object can be used for further processing via other operators. The data array will be a 3D image NumPy array with index order of DHW. Channel is limited to 1 as of now, and C is absent in the NumPy array.

This operator registers nvimgcodec based compressed pixel data decoder plugin with Pydicom at application startup to support and improve the performance of decoding DICOM files with compressed pixel data of in JPEG, JPEG 2000, and HTJ2K, irrespective of if python-gdcm, Python libjpg and openjpeg based decoder plugins are available at runtime.

Registering the decoder plugin is all automatic and does not require any additional change in user’s application except for adding a dependency on the nvimgcodec-cu12 and nvidia-nvjpeg2k-cu12 packages (suffix of cu12 means CUDA 12.0 though cu13 is also supported).

Named Input:

study_selected_series_list: List of StudySelectedSeries.

Named Output:

image: Image object.

Parameters:
  • fragment (Fragment) – An instance of the Application class which is derived from Fragment.

  • affine_lps_to_ras (bool) – If true, the affine transform in the image metadata is RAS oriented, otherwise it is LPS oriented. Default is True.

Methods

__init__(fragment, *args[, affine_lps_to_ras])

Create an instance for a containing application object.

add_arg(*args, **kwargs)

Overloaded function.

add_dynamic_flow(*args, **kwargs)

Overloaded function.

compute(op_input, op_output, context)

Performs computation for this operator and handles I/O.

compute_affine_transform(s_1, s_n, n, series)

Computes the affine transform for this series.

convert_to_image(study_selected_series_list)

Extracts the pixel data from a DICOM Series and other attributes to create an Image object

create_metadata(series)

Collects all relevant metadata from the DICOM Series and creates a dictionary.

create_volumetric_image(vox_data, metadata)

Creates an instance of 3D image.

enable_metadata(self, enable)

Configure whether or not the metadata feature is enabled for this operator.

find_all_flow_info(self, predicate)

Find all flow info objects in the operator's next flows that match a given condition.

find_flow_info(self, predicate)

Find a flow info in the operator's next flows based on a given predicate.

generate_voxel_data(series)

Applies rescale slope and rescale intercept to the pixels.

initialize()

Default implementation of initialize

prepare_series(series)

Computes the slice normal for each slice and then projects the first voxel of each slice on that slice normal.

queue_policy(self, port_name, port_type, policy)

Set the queue policy to be used by an input (or output) port's receiver (or transmitter).

receiver(self, port_name)

Get the receiver used by an input port.

resource(self, name)

Resources associated with the operator.

service(self, service_type[, id])

Retrieve a registered fragment service through the component's fragment.

setup(spec)

Default implementation of setup method.

start()

Default implementation of start

stop()

Default implementation of stop

stop_execution(self)

Stop the execution of the operator.

transmitter(self, port_name)

Get the transmitter used by an output port.

Attributes

ATTRIBUTE_DICOM_AFFINE

ATTRIBUTE_NIFTI_AFFINE

INPUT_EXEC_PORT_NAME

METADATA_SPACE_LPS

METADATA_SPACE_RAS

MONAI_TRANSFORMS_SPATIAL_METADATA_NAME

MONAI_UTIL_ENUMS_SPACEKEYS_LPS

MONAI_UTIL_ENUMS_SPACEKEYS_RAS

OUTPUT_EXEC_PORT_NAME

args

The list of arguments associated with the component.

async_condition

The internal asynchronous condition for the operator.

conditions

Conditions associated with the operator.

description

YAML formatted string describing the operator.

execution_context

The execution context for the operator.

fragment

The fragment (holoscan.core.Fragment) that the operator belongs to.

id

The identifier of the component.

is_metadata_enabled

Boolean indicating whether the fragment this operator belongs to has metadata transmission enabled.

metadata

The metadata dictionary (holoscan.core.MetadataDictionary) associated with the operator.

metadata_policy

The metadata policy (holoscan.core.MetadataPolicy) associated with the operator.

name

The name of the operator.

next_flows

Get the list of flow information for connections to downstream operators.

operator_type

The operator type.

resources

Resources associated with the operator.

spec

The operator spec (holoscan.core.OperatorSpec) associated with the operator.

class OperatorType(self: holoscan.core._core.OperatorBase.OperatorType, value: int)#

Bases: pybind11_object

Enum class for operator types used by the executor.

  • NATIVE: Native operator.

  • GXF: GXF operator.

  • VIRTUAL: Virtual operator. (for internal use, not intended for use by application authors)

Members:

NATIVE

GXF

VIRTUAL

property name#
__init__(fragment, *args, affine_lps_to_ras=True, **kwargs)[source]#

Create an instance for a containing application object.

This operator converts instances of DICOMSeries into an Image object. The loaded Image Object can be used for further processing via other operators. The data array will be a 3D image NumPy array with index order of DHW. Channel is limited to 1 as of now, and C is absent in the NumPy array.

This operator registers nvimgcodec based compressed pixel data decoder plugin with Pydicom at application startup to support and improve the performance of decoding DICOM files with compressed pixel data of in JPEG, JPEG 2000, and HTJ2K, irrespective of if python-gdcm, Python libjpg and openjpeg based decoder plugins are available at runtime.

Registering the decoder plugin is all automatic and does not require any additional change in user’s application except for adding a dependency on the nvimgcodec-cu12 and nvidia-nvjpeg2k-cu12 packages (suffix of cu12 means CUDA 12.0 though cu13 is also supported).

Named Input:

study_selected_series_list: List of StudySelectedSeries.

Named Output:

image: Image object.

Parameters:
  • fragment (Fragment) – An instance of the Application class which is derived from Fragment.

  • affine_lps_to_ras (bool) – If true, the affine transform in the image metadata is RAS oriented, otherwise it is LPS oriented. Default is True.

add_arg(*args, **kwargs)#

Overloaded function.

  1. add_arg(self: holoscan.core._core.OperatorBase, arg: holoscan.core._core.Arg) -> None

Add an argument to the component.

  1. add_arg(self: holoscan.core._core.OperatorBase, arg: holoscan.core._core.ArgList) -> None

Add a list of arguments to the component.

  1. add_arg(self: holoscan.core._core.OperatorBase, **kwargs) -> None

Add arguments to the component via Python kwargs.

  1. add_arg(self: holoscan.core._core.OperatorBase, arg: holoscan.core._core.ConditionBase) -> None

  2. add_arg(self: holoscan.core._core.OperatorBase, arg: holoscan.core._core.ResourceBase) -> None

Add a condition or resource to the Operator.

This can be used to add a condition or resource to an operator after it has already been constructed.

Parameters#

argholoscan.core.Condition or holoscan.core.Resource

The condition or resource to add.

add_dynamic_flow(*args, **kwargs)#

Overloaded function.

  1. add_dynamic_flow(self: holoscan.core._core.OperatorBase, flow: holoscan.core._core.FlowInfo) -> None

  2. add_dynamic_flow(self: holoscan.core._core.OperatorBase, flows: list[holoscan.core._core.FlowInfo]) -> None

  3. add_dynamic_flow(self: holoscan.core._core.OperatorBase, next_op: holoscan.core._core.OperatorBase, next_input_port_name: str = ‘’) -> None

Add a dynamic flow from this operator to another operator.

Parameters#

next_opholoscan.core.Operator

The downstream operator to connect to.

next_input_port_namestr, optional

The name of the input port on the downstream operator to connect to. If not specified, the first available input port will be used.

Notes#

This method has several overloads to support different ways of creating dynamic flows:

  1. add_dynamic_flow(next_op: Operator, next_input_port_name: str = ‘’) - Basic connection using default output port. This is the simplest form for connecting

    two operators when you only need to specify the destination.

  2. add_dynamic_flow(curr_output_port_name: str, next_op: Operator, next_input_port_name: str = ‘’) - Connection with explicit output port specification. Use this when the source operator has

    multiple output ports and you need to specify which one to use.

  3. add_dynamic_flow(flow: FlowInfo) - Connection using a FlowInfo object, which encapsulates all connection details including:

    • Source operator and its output port specification

    • Destination operator and its input port specification

    • Port names and associated IOSpecs

    • This is useful for complex connections or when reusing connection patterns.

  4. add_dynamic_flow(flows: List[FlowInfo]) - Batch connection using multiple FlowInfo objects. Use this to set up multiple

    connections in a single call, which is more efficient than making multiple individual connections.

The FlowInfo class provides a complete description of a flow connection between operators, including all port specifications and naming. It’s particularly useful when you need to:

  • Store and reuse connection patterns

  • Create complex routing configurations

  • Handle dynamic port specifications

  • Manage multiple connections systematically

  1. add_dynamic_flow(self: holoscan.core._core.OperatorBase, curr_output_port_name: str, next_op: holoscan.core._core.OperatorBase, next_input_port_name: str = ‘’) -> None

property args#

The list of arguments associated with the component.

Returns#

arglist : holoscan.core.ArgList

property async_condition#

The internal asynchronous condition for the operator.

This property provides access to the internal asynchronous condition for the operator, which controls the scheduling of the operator’s compute method.

Returns#

conditionholoscan.conditions.AsynchronousCondition

An instance of holoscan.conditions.AsynchronousCondition that is the internal asynchronous condition for the operator.

Notes#

This object is only accessible after the executor has called Operator.initialize() via run() or run_async(). If accessed during Application.compose(), it will return None.

compute(op_input, op_output, context)[source]#

Performs computation for this operator and handles I/O.

compute_affine_transform(s_1, s_n, n, series)[source]#

Computes the affine transform for this series. It does it in both DICOM Patient oriented coordinate system as well as the pne preferred by NIFTI standard. Accordingly, the two attributes dicom_affine_transform and nifti_affine_transform are stored in the series instance.

The Image Orientation Patient contains two triplets, [rx ry rz cx cy cz], which encode direction cosines of the row and column of an image slice. The Image Position Patient of the first slice in a volume, [x1 y1 z1], is the x, y, z coordinates of the upper-left corner voxel of the slice. These two parameters define the location of the slice in PCS. To determine the location of a volume, the Image Position Patient of another slice is normally needed. In practice, we tend to use the position of the last slice in a volume, [xn yn zn]. The voxel size within the slice plane, [vr vc], is stored in object Pixel Spacing.

Parameters:
  • s_1 – A first slice in the series.

  • s_n – A last slice in the series.

  • n – A number of slices in the series.

  • series – An instance of DICOMSeries.

property conditions#

Conditions associated with the operator.

convert_to_image(study_selected_series_list)[source]#

Extracts the pixel data from a DICOM Series and other attributes to create an Image object

Return type:

Optional[Image]

create_metadata(series)[source]#

Collects all relevant metadata from the DICOM Series and creates a dictionary.

Parameters:

series – An instance of DICOMSeries.

Return type:

Dict

Returns:

An instance of a dictionary containing metadata for the volumetric image.

create_volumetric_image(vox_data, metadata)[source]#

Creates an instance of 3D image.

Parameters:
  • vox_data – A numpy array representing the volumetric data.

  • metadata – DICOM attributes in a dictionary.

Returns:

An instance of Image object.

property description#

YAML formatted string describing the operator.

enable_metadata(self: holoscan.core._core.OperatorBase, enable: bool) None#

Configure whether or not the metadata feature is enabled for this operator. If it is not set, the default value will be determined by the enable_metadata setting from the Fragment that this operator belongs to.

property execution_context#

The execution context for the operator.

This property provides access to the execution context of the operator, which contains information about the current execution environment including scheduling details.

Returns#

holoscan.core.ExecutionContext

The execution context object for this operator.

find_all_flow_info(self: holoscan.core._core.OperatorBase, predicate: Callable[[holoscan.core._core.FlowInfo], bool]) list[holoscan.core._core.FlowInfo]#

Find all flow info objects in the operator’s next flows that match a given condition.

Parameters#

predicatecallable

A function that takes a FlowInfo object and returns a boolean.

Returns#

list[holoscan.core.FlowInfo]

List of matching FlowInfo objects.

find_flow_info(self: holoscan.core._core.OperatorBase, predicate: Callable[[holoscan.core._core.FlowInfo], bool]) holoscan.core._core.FlowInfo#

Find a flow info in the operator’s next flows based on a given predicate.

Parameters#

predicatecallable

A function that takes a FlowInfo object and returns a boolean.

Returns#

holoscan.core.FlowInfo or None

The first matching FlowInfo object, or None if not found.

property fragment#

The fragment (holoscan.core.Fragment) that the operator belongs to.

generate_voxel_data(series)[source]#

Applies rescale slope and rescale intercept to the pixels.

Supports monochrome image only for now. Photometric Interpretation attribute, tag (0028,0004), is considered. Both MONOCHROME2 (IDENTITY) and MONOCHROME1 (INVERSE) result in an output image where The minimum sample value is intended to be displayed as black.

Parameters:

series – DICOM Series for which the pixel data needs to be extracted.

Returns:

A 3D numpy tensor representing the volumetric data.

property id#

The identifier of the component.

The identifier is initially set to -1, and will become a valid value when the component is initialized.

With the default executor (holoscan.gxf.GXFExecutor), the identifier is set to the GXF component ID.

Returns#

id : int

initialize()#

Default implementation of initialize

property is_metadata_enabled#

Boolean indicating whether the fragment this operator belongs to has metadata transmission enabled.

property metadata#

The metadata dictionary (holoscan.core.MetadataDictionary) associated with the operator.

property metadata_policy#

The metadata policy (holoscan.core.MetadataPolicy) associated with the operator.

The supported policies are:

  • MetadataPolicy.REJECT: Reject the new value if the key already exists

  • MetadataPolicy.UPDATE: Replace existing value with the new one if the key already exists

  • MetadataPolicy.INPLACE_UPDATE: Update the value stored within an existing MetadataObject in-place if the key already exists (in contrast to UPDATE which always replaces the existing MetadataObject with a new one).

  • MetadataPolicy.RAISE: Raise an exception if the key already exists

property name#

The name of the operator.

property next_flows#

Get the list of flow information for connections to downstream operators.

Returns#

list[holoscan.core.FlowInfo]

List of flow information objects describing connections to downstream operators.

property operator_type#

The operator type.

holoscan.core.Operator.OperatorType enum representing the type of the operator. The two types currently implemented are native and GXF.

prepare_series(series)[source]#

Computes the slice normal for each slice and then projects the first voxel of each slice on that slice normal.

It computes the distance of that point from the origin of the patient coordinate system along the slice normal. It orders the slices in the series according to that distance.

Parameters:

series – An instance of DICOMSeries.

queue_policy(self: holoscan.core._core.OperatorBase, port_name: str, port_type: holoscan.core._core.IOSpec.IOType = <IOType.INPUT: 0>, policy: holoscan.core._core.IOSpec.QueuePolicy = <QueuePolicy.FAULT: 2>) None#

Set the queue policy to be used by an input (or output) port’s receiver (or transmitter).

Parameters#

port_namestr

The name of the port.

port_typeIOSpec.IOType, optional

Enum indicating whether port_name corresponds to an input port or output port.

policyIOSpec.QueuePolicy, optional

The queue policy to set. Valid values are:

  • QueuePolicy.POP : If the queue is full, pop the oldest item, then add the new one.

  • QueuePolicy.REJECT : If the queue is full, reject (discard) the new item.

  • QueuePolicy.FAULT : If the queue is full, log a warning and reject the new item.

Returns#

transmitterholoscan.resources.Transmitter or None

The transmitter used by this output port. Will be None if the port does not exist.

receiver(self: holoscan.core._core.OperatorBase, port_name: str) Optional[holoscan::Receiver]#

Get the receiver used by an input port.

Parameters#

port_namestr

The name of the input port.

Returns#

receiverholoscan.resources.Receiver

The receiver used by this input port. Will be None if the port does not exist.

resource(self: holoscan.core._core.OperatorBase, name: str) object | None#

Resources associated with the operator.

Parameters#

namestr

The name of the resource to retrieve

Returns#

holoscan.core.Resource or None

The resource with the given name. If no resource with the given name is found, None is returned.

property resources#

Resources associated with the operator.

service(self: object, service_type: type, id: str = '') object#

Retrieve a registered fragment service through the component’s fragment.

This method delegates to the fragment’s service() method to retrieve a previously registered fragment service by its type and optional identifier. Returns None if no fragment service is found with the specified type and identifier.

Parameters#

service_typetype

The type of the fragment service to retrieve. Must be a type that inherits from Resource or FragmentService.

idstr, optional

The identifier of the fragment service. If empty, retrieves by service type only. For Resources, this would typically be the resource’s name.

Returns#

object or None

The fragment service instance of the requested type, or None if not found. If the service wraps a Resource and a Resource type is requested, the unwrapped Resource instance is returned.

Raises#

RuntimeError

If the component has no associated fragment or if the fragment’s service method cannot be accessed.

Notes#

This is a convenience method that internally calls the fragment’s service() method. For services that wrap Resources, the method will automatically unwrap and return the Resource if a Resource type is requested.

setup(spec)[source]#

Default implementation of setup method.

property spec#

The operator spec (holoscan.core.OperatorSpec) associated with the operator.

start()#

Default implementation of start

stop()#

Default implementation of stop

stop_execution(self: holoscan.core._core.OperatorBase) None#

Stop the execution of the operator.

This method is used to stop the execution of the operator by setting the internal async condition to EVENT_NEVER state, which sets the scheduling condition to NEVER. Once stopped, the operator will not be scheduled for execution (the compute() method will not be called).

Note that executing this method does not trigger the operator’s stop() method. The stop() method is called only when the scheduler deactivates all operators together.

transmitter(self: holoscan.core._core.OperatorBase, port_name: str) Optional[holoscan::Transmitter]#

Get the transmitter used by an output port.

Parameters#

port_namestr

The name of the output port.

Returns#

transmitterholoscan.resources.Transmitter or None

The transmitter used by this output port. Will be None if the port does not exist.