Pinnacle : RoiList
Contours
Create a contour
CreateNewROI = "Add Region Of Interest"; //This creates a blank contour with no slices
Name contour
RoiList.Current.Name = "SomeName";
Choose contour’s associated dataset
//(RoiList.Current.VolumeName = Dataset Name)
RoiList.Current.VolumeName = VolumeList.#"#1".Name; //where the index # corresponds to the dataset index (0=primary, 1=secondary #1, etc)
Contour display
RoiList.Current.Display2dWithMeshCheck = "Both";//Supports other options like "Contour", "Colorwash", "Poly", "Mesh", "Off"
Contour color
RoiList.Current.Color = "blue"; //Supports generic Pinnacle colors like "red", "green", "yellow", "purple", "skyblue", etc
Clean contour
RoiList.Current.CurveMinArea = "100"; //Minimum curve area
RoiList.Current.CurveOverlapMinimum = "88"; //Minimum curve overlap
RoiList.Current.Clean = "Rescan"; //Scan for nonconforming curves
RoiList.Current.CleanAndDelete = "Delete Curves"; //Delete non-conforming curves
Destroy contour
RoiList.#"SomeContourName".Destroy=1; // Method A
DestroyCurrentROI = Store.StringAt.ContourName; // Method B
ROI Expansion/Contraction/Rings
Open ROI Expand/Contract Window
- It is not necessary to open the ROI Expand/Contract Window to alter ROIs
WindowList .RoiExpandWindow .Create = "ROI Expansion/Contraction...";
Clear all previous selections
- This command should be run before any expansion/contraction/ring action to remove previous selections
RoiList.#"*".ResetRoiExpandState="Clear All";
Select Source
Avoid Interior
Avoid Exterior
Use constant thickness padding(1=yes, 0=no)
RoiExpandControl .UseConstantPadding = "1";
RoiExpandControl .UseConstantPadding = "0";
Thickness of padding
- Constant thickness
//Thickness of constant padding (cm)
RoiExpandControl .ConstantPadding = " 1";
- Variable thickness
//Direction of expansion/contraction (in cm)
//Right
RoiExpandControl .NegXPadding = "1";
//Left
RoiExpandControl .PosXPadding = "2";
//Anterior
RoiExpandControl .NegYPadding = "3";
//Posterior
RoiExpandControl .PosYPadding = "4";
//Superior
RoiExpandControl .NegZPadding = " 5";
//Inferior
RoiExpandControl .PosZPadding = "6";
Create new ROI for expansion/contraction
RoiExpandControl .CreateNewTarget = "1";
//Name of target
RoiExpandControl .TargetRoiName = "SomeContourName";
Replace an existing ROI
RoiExpandControl .TargetRoi = "SomeOtherContourName";
RoiExpandControl .CreateNewTarget = "0";
Expand the source ROI
RoiExpandControl .Expand = "1";
RoiExpandControl .DoExpand = "Expand";
Contract the source ROI
RoiExpandControl .Expand = "0";
RoiExpandControl .DoExpand = "Contract";
Create a Ring
RoiExpandControl .DoRingExpansion = "Create Ring ROI";
Examples
Constant Margin Expansion
RoiList .#"BBs".RoiExpandState = "Source";
RoiExpandControl .CheckTargetRoi = RoiList .#"BBs+2" .Address;
RoiExpandControl .ConstantPadding = " 2";
RoiExpandControl .UseConstantPadding = "1";
RoiExpandControl .TargetRoiName = "BBs+2";
RoiExpandControl .CreateNewTarget = "1";
RoiExpandControl .DoExpand = "Expand";
Contraction with Variable Margin
RoiList .#"NameOfSourceROI".RoiExpandState = "Source";
RoiExpandControl .CheckTargetRoi = RoiList .#"BBsContract" .Address;
RoiExpandControl .NegXPadding = " .1";
RoiExpandControl .UseConstantPadding = "0";
RoiExpandControl .PosXPadding = " .2";
RoiExpandControl .UseConstantPadding = "0";
RoiExpandControl .NegYPadding = " .3";
RoiExpandControl .UseConstantPadding = "0";
RoiExpandControl .PosYPadding = " .4";
RoiExpandControl .UseConstantPadding = "0";
RoiExpandControl .NegZPadding = " .5";
RoiExpandControl .UseConstantPadding = "0";
RoiExpandControl .PosZPadding = " .6";
RoiExpandControl .UseConstantPadding = "0";
RoiExpandControl .TargetRoiName = "NewROIName";
RoiExpandControl .CreateNewTarget = "1";
RoiExpandControl .Expand = "0";
RoiExpandControl .DoExpand = "Contract";
Ring
RoiList .#"BBs".RoiExpandState = "Source"; //source ROI
RoiExpandControl .CheckTargetRoi = RoiList .#"BBs+2" .Address; //New ROI to be created
RoiExpandControl .ConstantPadding = " 2"; //Expansion in cm
RoiExpandControl .UseConstantPadding = "1"; //Expand the same distance in all directions
RoiExpandControl .TargetRoiName = "BBs+2";//New target
RoiExpandControl .CreateNewTarget = "1";
RoiExpandControl .DoRingExpansion = "Create Ring ROI";//Create a ring
AutoContour
Set max and min autocontour thresholds
RoiList.Current.AutoLower = "200";
RoiList.Current.AutoUpper = "4096";
Set the boundary box
RoiList.Current.ApplyBoundingBox = 1;
//These can be used or commented out. They aren't necessary to perform the autocontour
RoiList.Current.BoundingBox.DisplayXOrigin = "-60";
RoiList .Current.BoundingBox.DisplayYOrigin = TrialList.Current.CouchRemovalYCoordinate;//Only contours above the couch removal line, this can be a number too.
RoiList.Current.BoundingBox.DisplayZOrigin = "0";
RoiList.Current.BoundingBox.Size.X = "128";
RoiList.Current.BoundingBox.Size.Y = "128";
RoiList.Current.BoundingBox.Size.Z = "38.0999";
Perform autocontour
RoiList.Current.AutoContourROI = "Current Region Of Interest";
Contour coordinates
X direction (i.e. Sagittal Orientation, Left-Right)
CT Slice
RoiList.Current.BinaryVolume.XMin;//First CT slice containing contour in X coordinate.
RoiList.Current.BinaryVolume.XMax;//Last CT slice containing contour in X coordinate.
DICOM Coordinates (Most left and right)
////Most Left Coordinate
//Voxel size
Store.FloatAt.XMinPos = VolumeList.Current.VoxelSize.X;
//Voxel size * slice #
Store.At.XMinPos.Multiply = RoiList.Current.BinaryVolume.XMin;
//(Voxel size * slice #) + origin coordinate = position
Store.At.XMinPos.Add = VolumeList.Current.Origin.X;
//InfoMessage = Store.FloatAt.XMinPos;
////Most Right Coordinate
//Voxel size
Store.FloatAt.XMaxPos = VolumeList.Current.VoxelSize.X;
//Voxel size * slice #
Store.At.XMaxPos.Multiply = RoiList.Current.BinaryVolume.XMax;
//(Voxel size * slice #) + Origin coordinate = position
Store.At.XMaxPos.Add = VolumeList.Current.Origin.X;
//InfoMessage = Store.FloatAt.XMaxPos;
Y direction (i.e. Coronal Orientation, Ant-Post)
The Y coordinate is different from the others in that instead of providing the CT slice number, the variable contains a value equal to the #CT slices - Slice Number. In most, and maybe all, cases there are 512 slices in the CT in the Y direction. So, to find the slice number, simply subtract the number provided by Pinnacle from 512.
CT Slice
RoiList.Current.BinaryVolume.YMin;// "# of CT Slices-First CT" slice containing contour in Y direction
RoiList.Current.BinaryVolume.YMax;
DICOM Coordinate (most anterior)
Replace YMin with YMax for most posterior coordinate
//Most anterior coordinate
//Determine slice # (y slices are determined differently than X and Z)
// (512-Ymin = actual Y slice)
Store.FloatAt.YMinSlice=VolumeList.Current.Dimension.Y;
Store.At.YMinSlice.Subtract=RoiList.Current.BinaryVolume.YMin;
//Voxel size
Store.FloatAt.YMinPos = VolumeList.Current.VoxelSize.Y;
//Voxel size * slice #
Store.At.YMinPos.Multiply = Store.FloatAt.YMinSlice;
//(Voxel size * slice #) + Origin coordinate = position
Store.At.YMinPos.Add = VolumeList.Current.Origin.Y;
InfoMessage = Store.FloatAt.YMinPos;
Z direction (i.e. Transverse Orientation, Sup-Inf)
CT slice
RoiList.Current.BinaryVolume.ZMin;//First CT slice containing contour in Z coordinate.
RoiList.Current.BinaryVolume.ZMax;
DICOM Coordinate (most inferior)
Replace ZMax with Zmin for most superior coordinate
////Most inferior coordinate
//Voxel size
Store.FloatAt.ZMaxPos = VolumeList.Current.VoxelSize.Z;
//Voxel size * slice #
Store.At.ZMaxPos.Multiply = RoiList.Current.BinaryVolume.ZMax;
//(Voxel size * slice #) + Origin coordinate = position
Store.At.ZMaxPos.Add = VolumeList.Current.Origin.Z;
InfoMessage = Store.FloatAt.ZMaxPos;
Example
Set current window view to first CT slice containing the current contour.
ViewWindowList.Current.UserSliceNumber = RoiList.Current.BinaryVolume.ZMin;