예제 #1
0
파일: GridMath.cs 프로젝트: yt876/rt-dtools
        /// <summary>
        /// Returns a blank grid which encompasses both grid1 and grid2
        /// </summary>
        /// <param name="grid1"></param>
        /// <param name="grid2"></param>
        /// <returns></returns>
        public GridBasedVoxelDataStructure CreateBlank(IVoxelDataStructure grid1, IVoxelDataStructure grid2)
        {
            var grid = new GridBasedVoxelDataStructure();

            grid.XRange = grid1.XRange.Combine(grid2.XRange);
            grid.YRange = grid1.YRange.Combine(grid2.YRange);
            grid.ZRange = grid1.ZRange.Combine(grid2.ZRange);
            grid.ConstantGridSpacing = true;
            grid.GridSpacing         = new Utilities.RTMath.Point3d(1, 1, 2);
            int lenX = (int)Math.Round((grid.XRange.Length / grid.GridSpacing.X)) + 1;
            int lenY = (int)Math.Round((grid.YRange.Length / grid.GridSpacing.Y)) + 1;
            int lenZ = (int)Math.Round((grid.ZRange.Length / grid.GridSpacing.Z)) + 1;

            grid.XCoords = new float[lenX];
            grid.YCoords = new float[lenY];
            grid.ZCoords = new float[lenZ];
            for (int i = 0; i < lenX; i++)
            {
                grid.XCoords[i] = (float)(grid.XRange.Minimum + i * grid.GridSpacing.X);
            }
            for (int j = 0; j < lenY; j++)
            {
                grid.YCoords[j] = (float)(grid.YRange.Minimum + j * grid.GridSpacing.Y);
            }
            for (int k = 0; k < lenZ; k++)
            {
                grid.ZCoords[k] = (float)(grid.ZRange.Minimum + k * grid.GridSpacing.Z);
            }

            grid.Data = new float[lenX * lenY * lenZ];
            return(grid);
        }
예제 #2
0
        public void Create(int xWidth, int yWidth, int zWidth, double xSpacing, double ySpacing, double zSpacing)
        {
            int xRows = (int)(xWidth / xSpacing) + 1;
            int yRows = (int)(yWidth / ySpacing) + 1;
            int zRows = (int)(zWidth / zSpacing) + 1;
            var grid  = new GridBasedVoxelDataStructure();

            grid.DefaultPhysicalValue = -1000;
            grid.ConstantGridSpacing  = true;
            grid.Data    = new float[xRows * yRows * zRows];
            grid.XCoords = new float[xRows];
            grid.YCoords = new float[yRows];
            grid.ZCoords = new float[zRows];
            grid.XRange  = new Range(-xWidth / 2, xWidth / 2);
            grid.YRange  = new Range(-yWidth / 2, yWidth / 2);
            grid.ZRange  = new Range(-zWidth / 2, zWidth / 2);
            for (int i = 0; i < grid.XCoords.Length; i++)
            {
                grid.XCoords[i] = (float)(grid.XRange.Minimum + i * xSpacing);
            }
            for (int i = 0; i < grid.YCoords.Length; i++)
            {
                grid.YCoords[i] = (float)(grid.YRange.Minimum + i * ySpacing);
            }
            for (int i = 0; i < grid.ZCoords.Length; i++)
            {
                grid.ZCoords[i] = (float)(grid.ZRange.Minimum + i * zSpacing);
            }
            grid.GridSpacing = new Utilities.RTMath.Point3d(xSpacing, ySpacing, zSpacing);
            this.Grid        = grid;
            this.Grid.Name   = "Cube Phantom";
        }
예제 #3
0
        public void GridBasedStrctureInterpolation()
        {
            var grid = GridBasedVoxelDataStructure.CreateNew(10, 10, 10, new Range(0, 10), new Range(0, 10), new Range(0, 10));

            grid.ConstantGridSpacing = true;
            grid.SetVoxelByCoords(1, 1, 1, 10);
            Assert.AreEqual(grid.Interpolate(1, 1, 1).Value, 10);
        }
예제 #4
0
        public void Create(int radius, int length, int xSpacing, int ySpacing, int zSpacing)
        {
            int xRows = (radius * 2) / xSpacing;
            int yRows = (radius * 2) / ySpacing;
            int zRows = length / zSpacing;

            var grid = new GridBasedVoxelDataStructure();

            grid.DefaultPhysicalValue = -1000;
            grid.ConstantGridSpacing  = true;
            grid.Data    = new float[xRows * yRows * zRows];
            grid.XCoords = new float[xRows];
            grid.YCoords = new float[yRows];
            grid.ZCoords = new float[zRows];
            grid.XRange  = new Range(-xRows * xSpacing / 2, xRows * xSpacing / 2);
            grid.YRange  = new Range(-yRows * ySpacing / 2, yRows * ySpacing / 2);
            grid.ZRange  = new Range(-zRows * zSpacing / 2, zRows * zSpacing / 2);
            for (int i = 0; i < grid.XCoords.Length; i++)
            {
                grid.XCoords[i] = (float)grid.XRange.Minimum + i * xSpacing;
            }
            for (int i = 0; i < grid.YCoords.Length; i++)
            {
                grid.YCoords[i] = (float)grid.YRange.Minimum + i * ySpacing;
            }
            for (int i = 0; i < grid.ZCoords.Length; i++)
            {
                grid.ZCoords[i] = (float)grid.ZRange.Minimum + i * zSpacing;
            }
            grid.GridSpacing   = new Utilities.RTMath.Point3d();
            grid.GridSpacing.X = xSpacing;
            grid.GridSpacing.Y = ySpacing;
            grid.GridSpacing.Z = zSpacing;


            for (int i = 0; i < zRows; i++)
            {
                for (int j = 0; j < xRows; j++)
                {
                    for (int k = 0; k < yRows; k++)
                    {
                        if (grid.XCoords[j] * grid.XCoords[j] + grid.YCoords[k] * grid.YCoords[k] < radius * radius)
                        {
                            grid.SetVoxelByIndices(i, j, k, 0);
                        }
                        else
                        {
                            grid.SetVoxelByIndices(i, j, j, 0);
                        }
                    }
                }
            }

            this.Grid = grid;
        }
예제 #5
0
파일: GridMath.cs 프로젝트: yt876/rt-dtools
 private static void TestAndSetMinAndMax(GridBasedVoxelDataStructure grid, float gamma)
 {
     if (gamma > grid.MaxVoxel.Value)
     {
         grid.MaxVoxel.Value = gamma;
     }
     if (gamma < grid.MinVoxel.Value)
     {
         grid.MinVoxel.Value = gamma;
     }
 }
예제 #6
0
        public EgsDoseObject Load(string fileName)
        {
            EgsDoseObject dose = new EgsDoseObject();
            GridBasedVoxelDataStructure grid = new GridBasedVoxelDataStructure();

            dose.Name = Path.GetFileName(fileName);
            string text = File.ReadAllText(fileName);

            string[] numbers = text.Split(new char[] { '\n', ' ', '\t', '\r' }, StringSplitOptions.RemoveEmptyEntries);
            int      SizeX   = Int32.Parse(numbers[0]);
            int      SizeY   = Int32.Parse(numbers[1]);
            int      SizeZ   = Int32.Parse(numbers[2]);

            grid.XCoords = new double[SizeX];
            grid.YCoords = new double[SizeY];
            grid.ZCoords = new double[SizeZ];
            grid.Data    = new float[SizeX, SizeY, SizeZ];

            int offset = 3;

            for (int i = 0; i < SizeX; i++)
            {
                grid.XCoords[i] = 10 * (Double.Parse(numbers[offset + i]) + Double.Parse(numbers[offset + i + 1])) / 2;
            }
            offset += SizeX + 1;
            for (int i = 0; i < SizeY; i++)
            {
                grid.YCoords[i] = 10 * (Double.Parse(numbers[offset + i]) + Double.Parse(numbers[offset + i + 1])) / 2;
            }
            offset += SizeY + 1;
            for (int i = 0; i < SizeZ; i++)
            {
                grid.ZCoords[i] = 10 * (Double.Parse(numbers[offset + i]) + Double.Parse(numbers[offset + i + 1])) / 2;
            }
            offset += SizeZ + 1;

            for (int i = 0; i < SizeX * SizeY * SizeZ; i++)
            {
                int indexX = i % SizeX;
                int indexZ = (int)(i / (SizeX * SizeY));
                int indexY = (int)(i / SizeX) - indexZ * (SizeY);
                grid.Data[indexX, indexY, indexZ] = float.Parse(numbers[offset + i]);
            }

            foreach (Voxel voxel in grid.Voxels)
            {
                if (voxel.Value > grid.GlobalMax.Value)
                {
                    grid.GlobalMax = voxel;
                }
            }
            return(dose);
        }
예제 #7
0
        public GridBasedVoxelDataStructure Load(DicomFile[] dicomFiles)
        {
            GridBasedVoxelDataStructure grid = new GridBasedVoxelDataStructure();

            DicomFile[]   files       = SortOnZIncreasing(dicomFiles);
            PixelDataInfo DicomHeader = new PixelDataInfo(files[0]);
            Point3d       size        = GetSize(files);

            grid.ConstantGridSpacing = true;
            grid.GridSpacing         = GetSpacing(files);
            grid.XCoords             = GetCoords(files, (int)size.X, DicomHeader.RowDir.X, DicomHeader.ColDir.X, DicomHeader.ImagePositionPatient.X, 1);
            grid.YCoords             = GetCoords(files, (int)size.Y, DicomHeader.RowDir.Y, DicomHeader.ColDir.Y, DicomHeader.ImagePositionPatient.Y, 1);
            grid.ZCoords             = GetCoords(files, (int)size.Z, DicomHeader.RowDir.Z, DicomHeader.ColDir.Z, DicomHeader.ImagePositionPatient.Z, 1);
            grid.Data = new float[(int)size.X / 1, (int)size.Y / 1, (int)size.Z / 1];

            int currYIndex = 0;
            int currZIndex = 0;
            int currXIndex = 0;

            for (int i = 0; i < files.Length; i++)
            {
                DicomPixelData dicomPixelData = DicomPixelData.Create(files[i].Dataset);
                PixelDataInfo  tempHeaderInfo = new PixelDataInfo(files[i]);
                for (int j = 0; j < tempHeaderInfo.GridFrameOffsetVector.Length; j++)
                {
                    byte[]  framePixelData = dicomPixelData.GetFrame(j).Data;
                    float[] dataArray      = GetDataArray(framePixelData, tempHeaderInfo.BitsAllocated, tempHeaderInfo.PixelRepresentation);
                    for (int k = 0; k < dataArray.Length; k++)
                    {
                        int currRow = k % tempHeaderInfo.Columns;
                        int currCol = (int)Math.Floor((double)(k / (tempHeaderInfo.Columns)));
                        currXIndex = (int)Math.Abs(tempHeaderInfo.RowDir.X) * currRow + (int)Math.Abs(tempHeaderInfo.ColDir.X) * currCol
                                     + (1 - (int)Math.Abs(tempHeaderInfo.RowDir.X) - (int)Math.Abs(tempHeaderInfo.ColDir.X)) * (i + j);;
                        currYIndex = (int)Math.Abs(tempHeaderInfo.RowDir.Y) * currRow + (int)Math.Abs(tempHeaderInfo.ColDir.Y) * currCol
                                     + (1 - (int)Math.Abs(tempHeaderInfo.RowDir.Y) - (int)Math.Abs(tempHeaderInfo.ColDir.Y)) * (i + j);;
                        currZIndex = (int)Math.Abs(tempHeaderInfo.RowDir.Z) * currRow + (int)Math.Abs(tempHeaderInfo.ColDir.Z) * currCol
                                     + (1 - (int)Math.Abs(tempHeaderInfo.RowDir.Z) - (int)Math.Abs(tempHeaderInfo.ColDir.Z)) * (i + j);

                        //Rescale back to actual values
                        dataArray[k] = dataArray[k] * tempHeaderInfo.RescaleSlope + tempHeaderInfo.RescaleSlope;
                        grid.Data[currXIndex, currYIndex, currZIndex] = dataArray[k];
                    }
                }
            }
            return(grid);
            //setGlobalMax();
        }
예제 #8
0
파일: GridMath.cs 프로젝트: yt876/rt-dtools
        /// <summary>
        /// Returns an empty grid with the same size as the grid
        /// </summary>
        /// <param name="grid"></param>
        /// <returns></returns>
        public GridBasedVoxelDataStructure CreateBlank(IVoxelDataStructure g)
        {
            var grid    = (GridBasedVoxelDataStructure)g;
            var newGrid = new GridBasedVoxelDataStructure();

            newGrid.XRange              = new Range(grid.XRange.Minimum, grid.XRange.Maximum);
            newGrid.YRange              = new Range(grid.YRange.Minimum, grid.YRange.Maximum);
            newGrid.ZRange              = new Range(grid.ZRange.Minimum, grid.ZRange.Maximum);
            newGrid.XCoords             = new float[grid.XCoords.Length]; grid.XCoords.CopyTo(newGrid.XCoords, 0);
            newGrid.YCoords             = new float[grid.YCoords.Length]; grid.YCoords.CopyTo(newGrid.YCoords, 0);
            newGrid.ZCoords             = new float[grid.ZCoords.Length]; grid.ZCoords.CopyTo(newGrid.ZCoords, 0);
            newGrid.Scaling             = 1;
            newGrid.Data                = new float[newGrid.XCoords.Length * newGrid.YCoords.Length * newGrid.ZCoords.Length];
            newGrid.ConstantGridSpacing = grid.ConstantGridSpacing;
            newGrid.GridSpacing         = new Point3d();
            grid.GridSpacing.CopyTo(newGrid.GridSpacing);
            return(newGrid);
        }
예제 #9
0
        public EgsDoseObject Load(string fileName, EgsDoseObject doseObject, IProgress <double> progress)
        {
            GridBasedVoxelDataStructure grid = new GridBasedVoxelDataStructure();

            grid.Name = Path.GetFileName(fileName);
            double max = 0;

            int SizeX, SizeY, SizeZ;

            using (TextReader reader = File.OpenText(fileName))
            {
                SizeX = (int)ReadDouble(reader);
                SizeY = (int)ReadDouble(reader);
                SizeZ = (int)ReadDouble(reader);

                grid.XCoords = new float[SizeX];
                grid.YCoords = new float[SizeY];
                grid.ZCoords = new float[SizeZ];
                grid.Data    = new float[SizeX * SizeY * SizeZ];

                fillCoords(grid.XCoords, SizeX, reader);
                fillCoords(grid.YCoords, SizeY, reader);
                fillCoords(grid.ZCoords, SizeZ, reader);

                int Size = SizeX * SizeY * SizeZ;
                for (int i = 0; i < Size; i++)
                {
                    int   indexX = i % SizeX;
                    int   indexZ = (int)(i / (SizeX * SizeY));
                    int   indexY = (int)(i / SizeX) - indexZ * (SizeY);
                    float data   = ReadFloat(reader);
                    grid.SetVoxelByIndices(indexX, indexY, indexZ, data);

                    if (data > grid.MaxVoxel.Value)
                    {
                        grid.MaxVoxel.Value      = data;
                        grid.MaxVoxel.Position.X = grid.XCoords[indexX];
                        grid.MaxVoxel.Position.Y = grid.XCoords[indexY];
                        grid.MaxVoxel.Position.Z = grid.XCoords[indexZ];
                    }
                    if (data < grid.MinVoxel.Value)
                    {
                        grid.MinVoxel.Value      = data;
                        grid.MinVoxel.Position.X = grid.XCoords[indexX];
                        grid.MinVoxel.Position.Y = grid.XCoords[indexY];
                        grid.MinVoxel.Position.Z = grid.XCoords[indexZ];
                    }
                    //only report progress every 5%.
                    if (i % (Size / 20) == 0)
                    {
                        progress.Report(100 * (double)i / (double)(Size));
                    }
                }
            }
            grid.XRange = new Range((double)grid.XCoords[0], (double)grid.XCoords[grid.XCoords.Length - 1]);
            grid.YRange = new Range(grid.YCoords[0], grid.YCoords[grid.YCoords.Length - 1]);
            grid.ZRange = new Range(grid.ZCoords[0], grid.ZCoords[grid.ZCoords.Length - 1]);

            doseObject.Grid           = grid;
            doseObject.Grid.ValueUnit = Unit.Egs;
            //doseObject.Grid.ComputeMax();
            return(doseObject);
        }
예제 #10
0
        public GridBasedVoxelDataStructure Load(DicomFile[] dicomFiles, IProgress <double> progress)
        {
            GridBasedVoxelDataStructure grid = new GridBasedVoxelDataStructure();

            DicomFile[]   files       = SortOnZIncreasing(dicomFiles);
            PixelDataInfo DicomHeader = new PixelDataInfo(files[0]);
            Point3d       size        = GetSize(files);

            grid.ConstantGridSpacing = true;
            grid.GridSpacing         = GetSpacing(files);
            grid.XCoords             = GetCoords(files, (int)size.X, DicomHeader.RowDir.X, DicomHeader.ColDir.X, DicomHeader.ImagePositionPatient.X, 1);
            grid.YCoords             = GetCoords(files, (int)size.Y, DicomHeader.RowDir.Y, DicomHeader.ColDir.Y, DicomHeader.ImagePositionPatient.Y, 1);
            grid.ZCoords             = GetCoords(files, (int)size.Z, DicomHeader.RowDir.Z, DicomHeader.ColDir.Z, DicomHeader.ImagePositionPatient.Z, 1);

            grid.Data = new float[(int)size.X * (int)size.Y * (int)size.Z];

            int currYIndex = 0;
            int currZIndex = 0;
            int currXIndex = 0;

            for (int i = 0; i < files.Length; i++)
            {
                DicomPixelData dicomPixelData = DicomPixelData.Create(files[i].Dataset);
                PixelDataInfo  tempHeaderInfo = new PixelDataInfo(files[i]);
                for (int j = 0; j < tempHeaderInfo.GridFrameOffsetVector.Length; j++)
                {
                    byte[]  framePixelData = dicomPixelData.GetFrame(j).Data;
                    float[] dataArray      = GetDataArray(framePixelData, tempHeaderInfo.BitsAllocated, tempHeaderInfo.PixelRepresentation);
                    for (int k = 0; k < dataArray.Length; k++)
                    {
                        int currRow = k % tempHeaderInfo.Columns;
                        int currCol = (int)Math.Floor((double)(k / (tempHeaderInfo.Columns)));
                        currXIndex = (int)Math.Abs(tempHeaderInfo.RowDir.X) * currRow + (int)Math.Abs(tempHeaderInfo.ColDir.X) * currCol
                                     + (1 - (int)Math.Abs(tempHeaderInfo.RowDir.X) - (int)Math.Abs(tempHeaderInfo.ColDir.X)) * (i + j);;
                        currYIndex = (int)Math.Abs(tempHeaderInfo.RowDir.Y) * currRow + (int)Math.Abs(tempHeaderInfo.ColDir.Y) * currCol
                                     + (1 - (int)Math.Abs(tempHeaderInfo.RowDir.Y) - (int)Math.Abs(tempHeaderInfo.ColDir.Y)) * (i + j);;
                        currZIndex = (int)Math.Abs(tempHeaderInfo.RowDir.Z) * currRow + (int)Math.Abs(tempHeaderInfo.ColDir.Z) * currCol
                                     + (1 - (int)Math.Abs(tempHeaderInfo.RowDir.Z) - (int)Math.Abs(tempHeaderInfo.ColDir.Z)) * (i + j);

                        //Rescale back to actual HUs
                        dataArray[k] = dataArray[k] * tempHeaderInfo.RescaleSlope + tempHeaderInfo.RescaleIntercept;
                        grid.SetVoxelByIndices(currXIndex, currYIndex, currZIndex, dataArray[k]);

                        if (dataArray[k] > grid.MaxVoxel.Value)
                        {
                            grid.MaxVoxel.Value      = dataArray[k];
                            grid.MaxVoxel.Position.X = grid.XCoords[currXIndex];
                            grid.MaxVoxel.Position.Y = grid.YCoords[currYIndex];
                            grid.MaxVoxel.Position.Z = grid.ZCoords[currZIndex];
                        }
                        if (dataArray[k] < grid.MinVoxel.Value)
                        {
                            grid.MinVoxel.Value      = dataArray[k];
                            grid.MinVoxel.Position.X = grid.XCoords[currXIndex];
                            grid.MinVoxel.Position.Y = grid.YCoords[currYIndex];
                            grid.MinVoxel.Position.Z = grid.ZCoords[currZIndex];
                        }
                    }

                    progress.Report(100 * ((((double)j / (double)tempHeaderInfo.GridFrameOffsetVector.Length) / files.Length) + ((double)i / (double)files.Length)));
                }
            }
            grid.XRange = new Range(grid.XCoords[0], grid.XCoords[grid.XCoords.Length - 1]);
            grid.YRange = new Range(grid.YCoords[0], grid.YCoords[grid.YCoords.Length - 1]);
            grid.ZRange = new Range(grid.ZCoords[0], grid.ZCoords[grid.ZCoords.Length - 1]);

            //grid.ComputeMax();
            return(grid);
        }