def createVectorVolumeFromRoi(self, exportRoi, spacingMm, numberOfComponents=3): roiCenter = [0, 0, 0] exportRoi.GetXYZ(roiCenter) roiRadius = [0, 0, 0] exportRoi.GetRadiusXYZ(roiRadius) roiOrigin_Roi = [ roiCenter[0] - roiRadius[0], roiCenter[1] - roiRadius[1], roiCenter[2] - roiRadius[2], 1 ] roiToRas = vtk.vtkMatrix4x4() if exportRoi.GetTransformNodeID() != None: roiBoxTransformNode = slicer.mrmlScene.GetNodeByID( exportRoi.GetTransformNodeID()) roiBoxTransformNode.GetMatrixTransformToWorld(roiToRas) exportVolumeSize = [ roiRadius[0] * 2 / spacingMm, roiRadius[1] * 2 / spacingMm, roiRadius[2] * 2 / spacingMm ] exportVolumeSize = [int(math.ceil(x)) for x in exportVolumeSize] exportImageData = vtk.vtkImageData() exportImageData.SetExtent(0, exportVolumeSize[0] - 1, 0, exportVolumeSize[1] - 1, 0, exportVolumeSize[2] - 1) if vtk.VTK_MAJOR_VERSION <= 5: exportImageData.SetScalarType(vtk.VTK_DOUBLE) exportImageData.SetNumberOfScalarComponents(numberOfComponents) exportImageData.AllocateScalars() else: exportImageData.AllocateScalars(vtk.VTK_DOUBLE, numberOfComponents) exportVolume = None if numberOfComponents == 1: exportVolume = slicer.vtkMRMLScalarVolumeNode() else: exportVolume = slicer.vtkMRMLVectorVolumeNode() exportVolume.SetAndObserveImageData(exportImageData) exportVolume.SetIJKToRASDirections(roiToRas.GetElement(0, 0), roiToRas.GetElement(0, 1), roiToRas.GetElement(0, 2), roiToRas.GetElement(1, 0), roiToRas.GetElement(1, 1), roiToRas.GetElement(1, 2), roiToRas.GetElement(2, 0), roiToRas.GetElement(2, 1), roiToRas.GetElement(2, 2)) exportVolume.SetSpacing(spacingMm, spacingMm, spacingMm) roiOrigin_Ras = roiToRas.MultiplyPoint(roiOrigin_Roi) exportVolume.SetOrigin(roiOrigin_Ras[0:3]) return exportVolume
def resampleVectorVolume(self,vectorVolume,resample): if not vectorVolume or not vectorVolume.IsA('vtkMRMLVectorVolumeNode'): print "No vector volume for resampling." return if resample == []: print "No resample values." return if not len(resample) == 3: print "Too many values for resampling." return oldVectorVolume = vectorVolume #Create new vector volume newVectorVolume = slicer.vtkMRMLVectorVolumeNode() newVectorVolume.SetName(oldVectorVolume.GetName()) slicer.mrmlScene.AddNode(newVectorVolume) newStorageNode = newVectorVolume.CreateDefaultStorageNode() newVectorVolume.SetAndObserveStorageNodeID(newStorageNode.GetID()) #Create strings for resampling spacing = '' size = '' for i in range(0,len(resample)): spacing += str(oldVectorVolume.GetSpacing()[i]*resample[i]) #extent = oldVectorVolume.GetImageData().GetExtent[2*i+1] extent = oldVectorVolume.GetImageData().GetExtent()[2*i+1]+1 size += str(extent/resample[i]) if i < 2: spacing += ',' size += ',' print "Resampling " + oldVectorVolume.GetName() + " to new pixel size " + size #Set parameters parameters = {} parameters["inputVolume"] = oldVectorVolume.GetID() parameters["outputVolume"] = newVectorVolume.GetID() parameters["referenceVolume"] = '' parameters["outputImageSpacing"] = spacing parameters["outputImageSize"] = size #Do resampling resampleScalarVolume = slicer.modules.resamplescalarvectordwivolume clNode = slicer.cli.run(resampleScalarVolume, None, parameters, wait_for_completion=True) #Remove old vector node and set new: return newVectorVolume
def resampleVectorVolume(self): if not self.vectorVolume or not self.vectorVolume.IsA('vtkMRMLVectorVolumeNode'): print "No vector volume for resampling." return if self.resample == []: print "No resample values." return if not len(self.resample) == 3: print "Too many values for resampling." return oldVectorVolume = self.vectorVolume #Create new vector volume newVectorVolume = slicer.vtkMRMLVectorVolumeNode() newVectorVolume.SetName(oldVectorVolume.GetName()) slicer.mrmlScene.AddNode(newVectorVolume) #Create strings for resampling spacing = '' size = '' for i in range(0, len(self.resample)): spacing += str(oldVectorVolume.GetSpacing()[i] * self.resample[i]) #extent = oldVectorVolume.GetImageData().GetExtent[2*i+1] extent = oldVectorVolume.GetImageData().GetExtent()[2 * i + 1] + 1 size += str(extent / self.resample[i]) if i < 2: spacing += ',' size += ',' print "Resampling " + oldVectorVolume.GetName() + " to new pixel size " + size #Set parameters parameters = {} parameters["inputVolume"] = oldVectorVolume.GetID() parameters["outputVolume"] = newVectorVolume.GetID() parameters["referenceVolume"] = '' parameters["outputImageSpacing"] = spacing parameters["outputImageSize"] = size #Do resampling resampleScalarVolume = slicer.modules.resamplescalarvectordwivolume clNode = slicer.cli.run(resampleScalarVolume, None, parameters, wait_for_completion=True) #Remove old vector node and set new: self.vectorVolume = newVectorVolume slicer.mrmlScene.RemoveNode(oldVectorVolume)
def resampleVolume(self, inputVolume, referenceVolume): parameters = {} parameters["inputVolume"] = inputVolume.GetID() parameters["referenceVolume"] = referenceVolume.GetID() outputVolume = slicer.vtkMRMLVectorVolumeNode() outputVolume.SetName('ResampledVolume') slicer.mrmlScene.AddNode( outputVolume ) parameters["outputVolume"] = outputVolume.GetID() # Instead of # slicer.cli.run(slicer.modules.resamplescalarvectordwivolume, None, parameters, wait_for_completion=True) # apply using custom code to allow disabling DisplayData in ApplyAndWait module = slicer.modules.resamplescalarvectordwivolume node = slicer.cli.createNode(module, parameters) logic = module.logic() logic.ApplyAndWait(node, False) return outputVolume
def resampleVolume(self, inputVolume, referenceVolume): parameters = {} parameters["inputVolume"] = inputVolume.GetID() parameters["referenceVolume"] = referenceVolume.GetID() outputVolume = slicer.vtkMRMLVectorVolumeNode() outputVolume.SetName('ResampledVolume') slicer.mrmlScene.AddNode(outputVolume) parameters["outputVolume"] = outputVolume.GetID() # Instead of # slicer.cli.run(slicer.modules.resamplescalarvectordwivolume, None, parameters, wait_for_completion=True) # apply using custom code to allow disabling DisplayData in ApplyAndWait module = slicer.modules.resamplescalarvectordwivolume node = slicer.cli.createNode(module, parameters) logic = module.logic() logic.ApplyAndWait(node, False) return outputVolume
def createVectorVolumeFromRoi(self, exportRoi, spacingMm, numberOfComponents=3): roiCenter = [0, 0, 0] exportRoi.GetXYZ( roiCenter ) roiRadius = [0, 0, 0] exportRoi.GetRadiusXYZ( roiRadius ) roiOrigin_Roi = [roiCenter[0] - roiRadius[0], roiCenter[1] - roiRadius[1], roiCenter[2] - roiRadius[2], 1 ] roiToRas = vtk.vtkMatrix4x4() if exportRoi.GetTransformNodeID() != None: roiBoxTransformNode = slicer.mrmlScene.GetNodeByID(exportRoi.GetTransformNodeID()) roiBoxTransformNode.GetMatrixTransformToWorld(roiToRas) exportVolumeSize = [roiRadius[0]*2/spacingMm, roiRadius[1]*2/spacingMm, roiRadius[2]*2/spacingMm] exportVolumeSize = [int(math.ceil(x)) for x in exportVolumeSize] exportImageData = vtk.vtkImageData() exportImageData.SetExtent(0, exportVolumeSize[0]-1, 0, exportVolumeSize[1]-1, 0, exportVolumeSize[2]-1) if vtk.VTK_MAJOR_VERSION <= 5: exportImageData.SetScalarType(vtk.VTK_DOUBLE) exportImageData.SetNumberOfScalarComponents(numberOfComponents) exportImageData.AllocateScalars() else: exportImageData.AllocateScalars(vtk.VTK_DOUBLE, numberOfComponents) exportVolume = None if numberOfComponents==1: exportVolume = slicer.vtkMRMLScalarVolumeNode() else: exportVolume = slicer.vtkMRMLVectorVolumeNode() exportVolume.SetAndObserveImageData(exportImageData) exportVolume.SetIJKToRASDirections( roiToRas.GetElement(0,0), roiToRas.GetElement(0,1), roiToRas.GetElement(0,2), roiToRas.GetElement(1,0), roiToRas.GetElement(1,1), roiToRas.GetElement(1,2), roiToRas.GetElement(2,0), roiToRas.GetElement(2,1), roiToRas.GetElement(2,2)) exportVolume.SetSpacing(spacingMm, spacingMm, spacingMm) roiOrigin_Ras = roiToRas.MultiplyPoint(roiOrigin_Roi) exportVolume.SetOrigin(roiOrigin_Ras[0:3]) return exportVolume
def exportTransformToVectorVolume(self, positionErrorVectorTransform, exportRoi, magnitudeOnly): if not positionErrorVectorTransform: return roiBounds_Ras = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0] exportRoi.GetRASBounds(roiBounds_Ras) exportVolumeSize = [(roiBounds_Ras[1]-roiBounds_Ras[0]+1)/self.exportVolumeSpacingMm, (roiBounds_Ras[3]-roiBounds_Ras[2]+1)/self.exportVolumeSpacingMm, (roiBounds_Ras[5]-roiBounds_Ras[4]+1)/self.exportVolumeSpacingMm] exportVolumeSize = [int(math.ceil(x)) for x in exportVolumeSize] exportImageData = vtk.vtkImageData() exportImageData.SetExtent(0, exportVolumeSize[0]-1, 0, exportVolumeSize[1]-1, 0, exportVolumeSize[2]-1) if vtk.VTK_MAJOR_VERSION <= 5: exportImageData.SetScalarType(vtk.VTK_DOUBLE) exportImageData.SetNumberOfScalarComponents(1) exportImageData.AllocateScalars() else: exportImageData.AllocateScalars(vtk.VTK_DOUBLE, 1) exportVolume = slicer.vtkMRMLVectorVolumeNode() exportVolume.SetAndObserveImageData(exportImageData) exportVolume.SetSpacing(self.exportVolumeSpacingMm, self.exportVolumeSpacingMm, self.exportVolumeSpacingMm) exportVolume.SetOrigin(roiBounds_Ras[0], roiBounds_Ras[2], roiBounds_Ras[4]) slicer.modules.transforms.logic().CreateDisplacementVolumeFromTransform(positionErrorVectorTransform, exportVolume, magnitudeOnly)
def DoIt(inputDir, rgbDir, outputDir): # # Read the input DICOM series as a volume # dcmList = [] for dcm in os.listdir(inputDir): if len(dcm)-dcm.rfind('.dcm') == 4: dcmList.append(inputDir+'/'+dcm) scalarVolumePlugin = slicer.modules.dicomPlugins['DICOMScalarVolumePlugin']() print 'Will examine: ',dcmList indexer = ctk.ctkDICOMIndexer() indexer.addDirectory(slicer.dicomDatabase, inputDir) indexer.waitForImportFinished() loadables = scalarVolumePlugin.examine([dcmList]) if len(loadables) == 0: print 'Could not parse the DICOM Study!' exit() inputVolume = scalarVolumePlugin.load(loadables[0]) sNode = slicer.vtkMRMLVolumeArchetypeStorageNode() ''' sNode.ResetFileNameList() for f in loadables[0].files: sNode.AddFileName(f) sNode.SetFileName(loadables[0].files[0]) sNode.SetSingleFile(0) inputVolume = slicer.vtkMRMLScalarVolumeNode() sNode.ReadData(inputVolume) ''' sNode.SetWriteFileFormat('nrrd') sNode.SetFileName(os.path.join(outputDir,'input_volume.nrrd')) sNode.WriteData(inputVolume) # # Order the input RGBs and rename in a temp directory # rgbList = [] for rgb in os.listdir(rgbDir): if len(rgb)-rgb.rfind('.bmp') == 4: rgbList.append(rgb) tmpDir = slicer.app.settings().value('Modules/TemporaryDirectory') tmpDir = tmpDir+'/PNGStackLabelConverter' if not os.path.exists(tmpDir): os.mkdir(tmpDir) oldFiles = os.listdir(tmpDir) # just in case there is anything in that directory for f in oldFiles: os.unlink(tmpDir+'/'+f) rgbOrdered = [None] * len(loadables[0].files) rgbCnt = 0 rgbExt = rgbList[0][rgbList[0].rfind('.')+1:len(rgbList[0])] print 'Extension for RGBs: ',rgbExt dcmFileList = loadables[0].files rgbRenamedList = [] print 'Number of dcm files: ',len(dcmFileList), ' and rgb files: ',len(rgbOrdered) dcmIdx = 0 for dcm in dcmFileList: rgbIdx = 0 for rgb in rgbList: dcmPrefix = dcm[dcm.rfind('/')+1:dcm.rfind('.')] if rgb.find(dcmPrefix) != -1: name = string.zfill(str(dcmIdx),5) rgbCnt = rgbCnt+1 src = rgbDir+'/'+rgb dest = tmpDir+'/'+name+'.'+rgbExt rgbRenamedList.append(dest) shutil.copy(src,dest) break rgbIdx = rgbIdx+1 # remove the matched DICOM file from the list if rgbIdx == len(rgbList): print('ERROR: failed to find matching label file for DICOM file '+dcm) return del rgbList[rgbIdx] dcmIdx = dcmIdx+1 if len(rgbRenamedList) == 0: print 'Could not parse the DICOM Study!' return sNode = slicer.vtkMRMLVolumeArchetypeStorageNode() sNode.ResetFileNameList() for f in rgbRenamedList: sNode.AddFileName(f) sNode.SetFileName(rgbRenamedList[0]) sNode.SetSingleFile(0) inputRGBVolume = slicer.vtkMRMLVectorVolumeNode() sNode.ReadData(inputRGBVolume) # run the filter # - extract the RGB portions extract = vtk.vtkImageExtractComponents() extract.SetComponents(0,1,2) if vtk.vtkVersion().GetVTKMajorVersion() < 6: extract.SetInput(inputRGBVolume.GetImageData()) else: extract.SetInputData(inputRGBVolume.GetImageData()) luminance = vtk.vtkImageLuminance() if vtk.vtkVersion().GetVTKMajorVersion() < 6: luminance.SetInput(extract.GetOutput()) else: luminance.SetInputData(extract.GetOutput()) cast = vtk.vtkImageCast() if vtk.vtkVersion().GetVTKMajorVersion() < 6: cast.SetInput(luminance.GetOutput()) else: cast.SetInputData(luminance.GetOutput()) cast.SetOutputScalarTypeToShort() cast.GetOutput().Update() ijkToRAS = vtk.vtkMatrix4x4() inputVolume.GetIJKToRASMatrix(ijkToRAS) outputLabel = slicer.vtkMRMLLabelMapVolumeNode() outputLabel.SetIJKToRASMatrix(ijkToRAS) outputLabel.SetAndObserveImageData(cast.GetOutput()) reportingLogic = slicer.modules.reporting.logic() displayNode = slicer.vtkMRMLLabelMapVolumeDisplayNode() displayNode.SetAndObserveColorNodeID(reportingLogic.GetDefaultColorNode().GetID()) slicer.mrmlScene.AddNode(displayNode) outputLabel.SetAndObserveDisplayNodeID(displayNode.GetID()) sNode.SetWriteFileFormat('nrrd') sNode.SetFileName(os.path.join(outputDir,'label_output.nrrd')) sNode.WriteData(outputLabel) # save as DICOM SEG labelCollection = vtk.vtkCollection() labelCollection.AddItem(outputLabel) slicer.mrmlScene.AddNode(inputVolume) outputLabel.SetAttribute('AssociatedNodeID',inputVolume.GetID()) slicer.mrmlScene.AddNode(outputLabel) # initialize the DICOM DB for Reporting logic settings = qt.QSettings() dbFileName = settings.value('DatabaseDirectory','') if dbFileName =='': print('ERROR: database must be initialized') else: dbFileName = dbFileName +'/ctkDICOM.sql' reportingLogic.InitializeDICOMDatabase(dbFileName) reportingLogic.DicomSegWrite(labelCollection, outputDir)
def DoIt(inputDir, rgbDir, outputDir): # # Read the input DICOM series as a volume # dcmList = [] for dcm in os.listdir(inputDir): if len(dcm) - dcm.rfind('.dcm') == 4: dcmList.append(inputDir + '/' + dcm) scalarVolumePlugin = slicer.modules.dicomPlugins[ 'DICOMScalarVolumePlugin']() print 'Will examine: ', dcmList indexer = ctk.ctkDICOMIndexer() indexer.addDirectory(slicer.dicomDatabase, inputDir) indexer.waitForImportFinished() loadables = scalarVolumePlugin.examine([dcmList]) if len(loadables) == 0: print 'Could not parse the DICOM Study!' exit() inputVolume = scalarVolumePlugin.load(loadables[0]) sNode = slicer.vtkMRMLVolumeArchetypeStorageNode() ''' sNode.ResetFileNameList() for f in loadables[0].files: sNode.AddFileName(f) sNode.SetFileName(loadables[0].files[0]) sNode.SetSingleFile(0) inputVolume = slicer.vtkMRMLScalarVolumeNode() sNode.ReadData(inputVolume) ''' sNode.SetWriteFileFormat('nrrd') sNode.SetFileName(os.path.join(outputDir, 'input_volume.nrrd')) sNode.WriteData(inputVolume) # # Order the input RGBs and rename in a temp directory # rgbList = [] for rgb in os.listdir(rgbDir): if len(rgb) - rgb.rfind('.bmp') == 4: rgbList.append(rgb) tmpDir = slicer.app.settings().value('Modules/TemporaryDirectory') tmpDir = tmpDir + '/PNGStackLabelConverter' if not os.path.exists(tmpDir): os.mkdir(tmpDir) oldFiles = os.listdir(tmpDir) # just in case there is anything in that directory for f in oldFiles: os.unlink(tmpDir + '/' + f) rgbOrdered = [None] * len(loadables[0].files) rgbCnt = 0 rgbExt = rgbList[0][rgbList[0].rfind('.') + 1:len(rgbList[0])] print 'Extension for RGBs: ', rgbExt dcmFileList = loadables[0].files rgbRenamedList = [] print 'Number of dcm files: ', len(dcmFileList), ' and rgb files: ', len( rgbOrdered) dcmIdx = 0 for dcm in dcmFileList: rgbIdx = 0 for rgb in rgbList: dcmPrefix = dcm[dcm.rfind('/') + 1:dcm.rfind('.')] if rgb.find(dcmPrefix) != -1: name = string.zfill(str(dcmIdx), 5) rgbCnt = rgbCnt + 1 src = rgbDir + '/' + rgb dest = tmpDir + '/' + name + '.' + rgbExt rgbRenamedList.append(dest) shutil.copy(src, dest) break rgbIdx = rgbIdx + 1 # remove the matched DICOM file from the list if rgbIdx == len(rgbList): print('ERROR: failed to find matching label file for DICOM file ' + dcm) return del rgbList[rgbIdx] dcmIdx = dcmIdx + 1 if len(rgbRenamedList) == 0: print 'Could not parse the DICOM Study!' return sNode = slicer.vtkMRMLVolumeArchetypeStorageNode() sNode.ResetFileNameList() for f in rgbRenamedList: sNode.AddFileName(f) sNode.SetFileName(rgbRenamedList[0]) sNode.SetSingleFile(0) inputRGBVolume = slicer.vtkMRMLVectorVolumeNode() sNode.ReadData(inputRGBVolume) # run the filter # - extract the RGB portions extract = vtk.vtkImageExtractComponents() extract.SetComponents(0, 1, 2) if vtk.vtkVersion().GetVTKMajorVersion() < 6: extract.SetInput(inputRGBVolume.GetImageData()) else: extract.SetInputData(inputRGBVolume.GetImageData()) luminance = vtk.vtkImageLuminance() if vtk.vtkVersion().GetVTKMajorVersion() < 6: luminance.SetInput(extract.GetOutput()) else: luminance.SetInputData(extract.GetOutput()) cast = vtk.vtkImageCast() if vtk.vtkVersion().GetVTKMajorVersion() < 6: cast.SetInput(luminance.GetOutput()) else: cast.SetInputData(luminance.GetOutput()) cast.SetOutputScalarTypeToShort() cast.GetOutput().Update() ijkToRAS = vtk.vtkMatrix4x4() inputVolume.GetIJKToRASMatrix(ijkToRAS) outputLabel = slicer.vtkMRMLLabelMapVolumeNode() outputLabel.SetIJKToRASMatrix(ijkToRAS) outputLabel.SetAndObserveImageData(cast.GetOutput()) reportingLogic = slicer.modules.reporting.logic() displayNode = slicer.vtkMRMLLabelMapVolumeDisplayNode() displayNode.SetAndObserveColorNodeID( reportingLogic.GetDefaultColorNode().GetID()) slicer.mrmlScene.AddNode(displayNode) outputLabel.SetAndObserveDisplayNodeID(displayNode.GetID()) sNode.SetWriteFileFormat('nrrd') sNode.SetFileName(os.path.join(outputDir, 'label_output.nrrd')) sNode.WriteData(outputLabel) # save as DICOM SEG labelCollection = vtk.vtkCollection() labelCollection.AddItem(outputLabel) slicer.mrmlScene.AddNode(inputVolume) outputLabel.SetAttribute('AssociatedNodeID', inputVolume.GetID()) slicer.mrmlScene.AddNode(outputLabel) # initialize the DICOM DB for Reporting logic settings = qt.QSettings() dbFileName = settings.value('DatabaseDirectory', '') if dbFileName == '': print('ERROR: database must be initialized') else: dbFileName = dbFileName + '/ctkDICOM.sql' reportingLogic.InitializeDICOMDatabase(dbFileName) reportingLogic.DicomSegWrite(labelCollection, outputDir)
def writeTRiPdata(self, filePath, pytripCube=None, extension='.ctx', nodeID = None, binfoName='',aix = False, resample = []): if nodeID is not None: node = slicer.util.getNode( nodeID ) print "Node to write:" + node.GetID() else: node = None if pytripCube is None and node is not None: print "Converting slicer node into pytrip cube " + str(node.GetID()) #Getting vector field from transform node if node.IsA('vtkMRMLGridTransformNode') or node.IsA('vtkMRMLBSplineTransformNode'): print "Converting Transform Node to Vector Field" trans = node.GetTransformFromParent()#.GetConcatenatedTransform(0) #trans.Inverse() #trans.Update() im = trans.GetDisplacementGrid() if im is None: print "Can't get image data. " + str(im) return vectorVolume = slicer.vtkMRMLVectorVolumeNode() slicer.mrmlScene.AddNode( vectorVolume ) vectorVolume.SetAndObserveImageData( im ) vectorVolume.SetName( node.GetName() ) vectorVolume.SetSpacing( im.GetSpacing() ) #vectorVolume.SetOrigin( im.GetOrigin() ) #Get Right Direction For Vector Volume #matrix = vtk.vtkMatrix4x4() matrix = trans.GetGridDirectionMatrix() #matrix.DeepCopy((-1,0,0,0,0,-1,0,0,0,0,1,0,0,0,0,1)) vectorVolume.SetIJKToRASDirectionMatrix(matrix) if not resample == []: newVectorVolume = self.resampleVectorVolume(vectorVolume,resample) slicer.mrmlScene.RemoveNode(vectorVolume) vectorVolume = newVectorVolume node = vectorVolume pytripCube = self.getPyTRiPCubeFromNode(node) if aix: pytripCube.byte_order = 'aix' pytripCube.cube.byteswap() else: pytripCube.byte_order = 'vms' if pytripCube is None: if node is None: print "Input slicer node or pytrip Cube!" return else: print "Cannot create/find pytripCube" return if not filePath[-1] == '/': filePath += '/' fName = str(filePath)+binfoName+ pytripCube.patient_name if node is not None: if node.IsA('vtkMRMLVectorVolumeNode'): if not extension == '.cbt': print "Error, vector volume can be exported only as .cbt (no: "+extension+" )" return array = slicer.util.array(node.GetID()) #Change precision from double to float if array.dtype == np.float64: array = array.astype(np.float32) if pytripCube.byte_order == 'aix': print "Changing array to aix byte order." array.byteswap() pName = pytripCube.patient_name for i in range(0,3): # Vector field components in cbt are divided with voxel spacing due to historical reasons. if i == 2: pytripCube.cube = np.array(array[:,:,:,i])/pytripCube.slice_distance else: if nodeID.find('GridTransform') > -1: print "Changing sign" pytripCube.cube = -np.array(array[:,:,:,i])/pytripCube.pixel_size else: pytripCube.cube = np.array(array[:,:,:,i])/pytripCube.pixel_size #if i == 2: #print "Converting vector components." #pytripCube.cube = np.array(array[:,:,:,i]/pytripCube.slice_distance #elif i < 2: #pytripCube.cube = np.array(array[:,:,:,i]/pytripCube.pixel_size #pytripCube.cube = array if i==0: fNameNew = fName + "_x" pytripCube.patient_name = pName + "_x" elif i==1: fNameNew = fName + "_y" pytripCube.patient_name = pName + "_y" elif i==2: fNameNew = fName + "_z" pytripCube.patient_name = pName + "_z" print("Saving: "+fNameNew) pytripCube.write_trip_data(fNameNew+extension) pytripCube.write_trip_header(fNameNew+".hed") if nodeID.find('GridTransform') > -1: slicer.mrmlScene.RemoveNode(vectorVolume) elif node.IsA('vtkMRMLScalarVolumeNode'): pytripCube.write_trip_data(fName+extension) pytripCube.write_trip_header(fName+".hed") else: if extension == '.cbt': print "Error, input is not vector volume for exporting cbt." return pytripCube.write_trip_data(fName+extension) pytripCube.write_trip_header(fName+".hed") print("Saved: "+fName+extension)