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; }
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); }
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); }