Esempio n. 1
0
 def onSaveButtonClicked(self):
   bundle = EditUtil.EditUtil().getParameterNode().GetParameter('QuickTCGAEffect,erich')
   tran = json.loads(bundle)
   layers = []
   for key in tran:
     nn = tran[key]
     nn["file"] = key + '.tif'
     layers.append(tran[key])
   j = {}
   j['layers'] = layers
   j['username'] = self.setupUserName.text
   j['sourcetile'] = self.tilename
   j['generator'] = "3DSlicer-4.5.0 with SlicerPathology v1.0a"
   j['timestamp'] = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
   labelNodes = slicer.util.getNodes('vtkMRMLLabelMapVolumeNode*')
   savedMessage = 'Segmentations for the following series were saved:\n\n'
   for label in labelNodes.values():
     labelName = label.GetName()
     labelFileName = os.path.join(self.dataDirButton.directory, labelName + '.tif')
     print "labelFileName : "+labelFileName
     sNode = slicer.vtkMRMLVolumeArchetypeStorageNode()
     sNode.SetFileName(labelFileName)
     sNode.SetWriteFileFormat('tif')
     sNode.SetURI(None)
     success = sNode.WriteData(label)
     if success:
       print "successful writing "+labelFileName
     else:
       print "failed writing "+labelFileName
   jstr = json.dumps(j,sort_keys=True, indent=4, separators=(',', ': '))
   f = open(os.path.join(self.dataDirButton.directory, self.tilename + '.json'),'w')
   f.write(jstr)
   f.close()
Esempio n. 2
0
 def readFrame(self, file):
     sNode = slicer.vtkMRMLVolumeArchetypeStorageNode()
     sNode.ResetFileNameList()
     sNode.SetFileName(file)
     sNode.SetSingleFile(0)
     frame = slicer.vtkMRMLScalarVolumeNode()
     success = sNode.ReadData(frame)
     return (success, frame)
 def onSaveButtonClicked(self):
   import zipfile
   bundle = EditUtil.EditUtil().getParameterNode().GetParameter('QuickTCGAEffect,erich')
   tran = json.loads(bundle)
   layers = []
   for key in tran:
     nn = tran[key]
     nn["file"] = key + '.tif'
     layers.append(tran[key])
   self.j['layers'] = layers
   self.j['username'] = self.setupUserName.text
   self.j['sourcetile'] = self.tilename
   self.j['generator'] = slicer.app.applicationVersion
   self.j['timestamp'] = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
   labelNodes = slicer.util.getNodes('vtkMRMLLabelMapVolumeNode*')
   savedMessage = 'Segmentations for the following series were saved:\n\n'
   zfname = os.path.join(self.dataDirButton.directory, self.tilename + '.zip')
   print "zipfile name"
   print zfname
   zf = zipfile.ZipFile(zfname, mode='w')
   for label in labelNodes.values():
     labelName = label.GetName()
     labelFileName = os.path.join(self.dataDirButton.directory, labelName + '.tif')
     print "labelFileName : "+labelFileName
     sNode = slicer.vtkMRMLVolumeArchetypeStorageNode()
     sNode.SetFileName(labelFileName)
     sNode.SetWriteFileFormat('tif')
     sNode.SetURI(None)
     success = sNode.WriteData(label)
     if success:
       print "adding "+labelFileName+" to zipfile"
       zf.write(labelFileName)
       os.remove(labelFileName)
     else:
       print "failed writing "+labelFileName
   jstr = json.dumps(self.j,sort_keys=True, indent=4, separators=(',', ': '))
   mfname = os.path.join(self.dataDirButton.directory, 'manifest.json')
   f = open(mfname,'w')
   f.write(jstr)
   f.close()
   zf.write(mfname)
   zf.close()
   os.remove(mfname)
Esempio n. 4
0
            def onClick(caller, event):
                coordinates = self.interactor.GetLastEventPosition()
                ctrlKey = self.interactor.GetControlKey()
                rasPoint = ConvertCoordinates2RAS(coordinates)
                ijkPoint = ConvertCoordinates2IJK(coordinates)
                ijk = [int(round(i)) for i in ijkPoint[0:3]]
                labeledImage = self.LabeledVolumeSelector.currentNode(
                ).GetImageData()  #GetImageData()
                selectedImage = self.SelectedVolumeSelector.currentNode(
                ).GetImageData()
                pointId = labeledImage.ComputePointId(ijk)  #*
                targetLabel = int(
                    round(
                        labeledImage.GetScalarComponentAsFloat(
                            ijk[0], ijk[1], ijk[2], 0)))
                selectedLabel = int(
                    round(
                        selectedImage.GetScalarComponentAsFloat(
                            ijk[0], ijk[1], ijk[2], 0)))

                labeledArray = slicer.util.arrayFromVolume(
                    self.LabeledVolumeSelector.currentNode())
                labeledSlice = labeledArray[ijk[2], ...]

                selectedArray = slicer.util.arrayFromVolume(
                    self.SelectedVolumeSelector.currentNode())
                selectedSlice = selectedArray[ijk[2], ...]

                if not ctrlKey:
                    selectedSlice[labeledSlice == targetLabel] = targetLabel
                else:
                    selectedSlice[selectedSlice == selectedLabel] = 0

                self.SelectedVolumeSelector.currentNode().Modified()

                storageNode = slicer.vtkMRMLVolumeArchetypeStorageNode()
                storageNode.SetFileName(self.SaveFile)  #SAVE
                storageNode.WriteData(
                    self.SelectedVolumeSelector.currentNode())
                print("SAVED")
Esempio n. 5
0
 def onSaveButtonClicked(self):
     bundle = EditUtil.EditUtil().getParameterNode().GetParameter(
         'QuickTCGAEffect,erich')
     tran = json.loads(bundle)
     layers = []
     for key in tran:
         nn = tran[key]
         nn["file"] = key + '.tif'
         layers.append(tran[key])
     j = {}
     j['layers'] = layers
     j['username'] = self.setupUserName.text
     j['sourcetile'] = self.tilename
     j['generator'] = "3DSlicer-4.5.0 with SlicerPathology v1.0a"
     j['timestamp'] = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
     labelNodes = slicer.util.getNodes('vtkMRMLLabelMapVolumeNode*')
     savedMessage = 'Segmentations for the following series were saved:\n\n'
     for label in labelNodes.values():
         labelName = label.GetName()
         labelFileName = os.path.join(self.dataDirButton.directory,
                                      labelName + '.tif')
         print "labelFileName : " + labelFileName
         sNode = slicer.vtkMRMLVolumeArchetypeStorageNode()
         sNode.SetFileName(labelFileName)
         sNode.SetWriteFileFormat('tif')
         sNode.SetURI(None)
         success = sNode.WriteData(label)
         if success:
             print "successful writing " + labelFileName
         else:
             print "failed writing " + labelFileName
     jstr = json.dumps(j, sort_keys=True, indent=4, separators=(',', ': '))
     f = open(
         os.path.join(self.dataDirButton.directory,
                      self.tilename + '.json'), 'w')
     f.write(jstr)
     f.close()
Esempio n. 6
0
    def load(self, loadable):
        """Load the selection as a MultiVolume, if multivolume attribute is
    present
    """

        mvNode = ''
        try:
            mvNode = loadable.multivolume
        except AttributeError:
            return None

        nFrames = int(mvNode.GetAttribute('MultiVolume.NumberOfFrames'))
        files = string.split(mvNode.GetAttribute('MultiVolume.FrameFileList'),
                             ',')
        nFiles = len(files)
        filesPerFrame = nFiles / nFrames
        frames = []

        baseName = loadable.name

        loadAsVolumeSequence = hasattr(
            loadable, 'loadAsVolumeSequence') and loadable.loadAsVolumeSequence
        if loadAsVolumeSequence:
            volumeSequenceNode = slicer.mrmlScene.AddNewNodeByClass(
                "vtkMRMLSequenceNode",
                slicer.mrmlScene.GenerateUniqueName(baseName))
            volumeSequenceNode.SetIndexName("")
            volumeSequenceNode.SetIndexUnit("")
        else:
            mvImage = vtk.vtkImageData()
            mvImageArray = None

        scalarVolumePlugin = slicer.modules.dicomPlugins[
            'DICOMScalarVolumePlugin']()
        instanceUIDs = ""
        for file in files:
            uid = slicer.dicomDatabase.fileValue(file,
                                                 self.tags['instanceUID'])
            if uid == "":
                uid = "Unknown"
            instanceUIDs += uid + " "
        instanceUIDs = instanceUIDs[:-1]
        mvNode.SetAttribute("DICOM.instanceUIDs", instanceUIDs)

        progressbar = slicer.util.createProgressDialog(
            labelText="Loading " + baseName,
            value=0,
            maximum=nFrames,
            windowModality=qt.Qt.WindowModal)

        try:
            # read each frame into scalar volume
            for frameNumber in range(nFrames):

                progressbar.value = frameNumber
                slicer.app.processEvents()
                if progressbar.wasCanceled:
                    break

                sNode = slicer.vtkMRMLVolumeArchetypeStorageNode()
                sNode.ResetFileNameList()

                frameFileList = files[frameNumber *
                                      filesPerFrame:(frameNumber + 1) *
                                      filesPerFrame]
                # sv plugin will sort the filenames by geometric order
                svLoadables = scalarVolumePlugin.examine([frameFileList])

                if len(svLoadables) == 0:
                    raise IOError("volume frame %d is invalid" % frameNumber)

                frame = scalarVolumePlugin.load(svLoadables[0])

                if frame.GetImageData() == None:
                    raise IOError("volume frame %d is invalid" % frameNumber)
                if loadAsVolumeSequence:
                    # Load into volume sequence

                    # volumeSequenceNode.SetDataNodeAtValue would deep-copy the volume frame.
                    # To avoid memory reallocation, add an empty node and shallow-copy the contents
                    # of the volume frame.

                    # Create an empty volume node in the sequence node
                    proxyVolume = slicer.mrmlScene.AddNewNodeByClass(
                        frame.GetClassName())
                    indexValue = str(frameNumber)
                    volumeSequenceNode.SetDataNodeAtValue(
                        proxyVolume, indexValue)
                    slicer.mrmlScene.RemoveNode(proxyVolume)

                    # Update the data node
                    shallowCopy = True
                    volumeSequenceNode.UpdateDataNodeAtValue(
                        frame, indexValue, shallowCopy)

                else:
                    # Load into multi-volume

                    if frameNumber == 0:
                        frameImage = frame.GetImageData()
                        frameExtent = frameImage.GetExtent()
                        frameSize = frameExtent[1] * frameExtent[
                            3] * frameExtent[5]

                        mvImage.SetExtent(frameExtent)
                        if vtk.VTK_MAJOR_VERSION <= 5:
                            mvImage.SetNumberOfScalarComponents(nFrames)
                            mvImage.SetScalarType(
                                frame.GetImageData().GetScalarType())
                            mvImage.AllocateScalars()
                        else:
                            mvImage.AllocateScalars(
                                frame.GetImageData().GetScalarType(), nFrames)

                        mvImageArray = vtk.util.numpy_support.vtk_to_numpy(
                            mvImage.GetPointData().GetScalars())

                        mvNode.SetScene(slicer.mrmlScene)

                        mat = vtk.vtkMatrix4x4()
                        frame.GetRASToIJKMatrix(mat)
                        mvNode.SetRASToIJKMatrix(mat)
                        frame.GetIJKToRASMatrix(mat)
                        mvNode.SetIJKToRASMatrix(mat)

                    frameImage = frame.GetImageData()
                    frameImageArray = vtk.util.numpy_support.vtk_to_numpy(
                        frameImage.GetPointData().GetScalars())

                    mvImageArray.T[frameNumber] = frameImageArray

                # Remove temporary volume node
                if frame.GetDisplayNode():
                    slicer.mrmlScene.RemoveNode(frame.GetDisplayNode())
                if frame.GetStorageNode():
                    slicer.mrmlScene.RemoveNode(frame.GetStorageNode())
                slicer.mrmlScene.RemoveNode(frame)

            if loadAsVolumeSequence:
                # Finalize volume sequence import
                # For user convenience, add a browser node and show the volume in the slice viewer.

                # Add browser node
                sequenceBrowserNode = slicer.mrmlScene.AddNewNodeByClass(
                    'vtkMRMLSequenceBrowserNode',
                    slicer.mrmlScene.GenerateUniqueName(baseName + " browser"))
                sequenceBrowserNode.SetAndObserveMasterSequenceNodeID(
                    volumeSequenceNode.GetID())
                # If save changes are allowed then proxy nodes are updated using shallow copy, which is much
                # faster for images. Images are usually not modified, so the risk of accidentally modifying
                # data in the sequence is low.
                sequenceBrowserNode.SetSaveChanges(volumeSequenceNode, True)
                # Show frame number in proxy volume node name
                sequenceBrowserNode.SetOverwriteProxyName(
                    volumeSequenceNode, True)

                # Automatically select the volume to display
                imageProxyVolumeNode = sequenceBrowserNode.GetProxyNode(
                    volumeSequenceNode)
                appLogic = slicer.app.applicationLogic()
                selNode = appLogic.GetSelectionNode()
                selNode.SetReferenceActiveVolumeID(
                    imageProxyVolumeNode.GetID())
                appLogic.PropagateVolumeSelection()

                # Show sequence browser toolbar
                sequenceBrowserModule = slicer.modules.sequencebrowser
                if sequenceBrowserModule.autoShowToolBar:
                    sequenceBrowserModule.setToolBarActiveBrowserNode(
                        sequenceBrowserNode)
                    sequenceBrowserModule.setToolBarVisible(True)

            else:
                # Finalize multi-volume import

                mvDisplayNode = slicer.mrmlScene.AddNewNodeByClass(
                    'vtkMRMLMultiVolumeDisplayNode')
                mvDisplayNode.SetDefaultColorMap()

                mvNode.SetAndObserveDisplayNodeID(mvDisplayNode.GetID())
                mvNode.SetAndObserveImageData(mvImage)
                mvNode.SetNumberOfFrames(nFrames)
                mvNode.SetName(loadable.name)
                slicer.mrmlScene.AddNode(mvNode)

                #
                # automatically select the volume to display
                #
                appLogic = slicer.app.applicationLogic()
                selNode = appLogic.GetSelectionNode()
                selNode.SetReferenceActiveVolumeID(mvNode.GetID())
                appLogic.PropagateVolumeSelection()

                # file list is no longer needed - remove the attribute
                mvNode.RemoveAttribute('MultiVolume.FrameFileList')

        except Exception as e:
            logging.error("Failed to read a multivolume: {0}".format(
                e.message))
            import traceback
            traceback.print_exc()
            mvNode = None

        finally:
            progressbar.close()

        return mvNode
Esempio n. 7
0
  if len(dcm)-dcm.rfind('.dcm') == 4:
    rwvmList.append(rwvmDir+'/'+dcm)

rwvmList = rwvmList[:1]

rwvmPlugin = slicer.modules.dicomPlugins['DICOMRWVMPlugin']()

# index input DICOM series
indexer = ctk.ctkDICOMIndexer()
indexer.addDirectory(slicer.dicomDatabase, petDir)
indexer.waitForImportFinished()
indexer.addDirectory(slicer.dicomDatabase, rwvmDir)
indexer.waitForImportFinished()

loadables = rwvmPlugin.examine([rwvmList])

if len(loadables) == 0:
  print 'Could not parse the DICOM Study!'
  exit()

# load input DICOM volume
dcmVolume = rwvmPlugin.load(loadables[0])

# save DICOM volume as single file nrrd format
dcmStorage = slicer.vtkMRMLVolumeArchetypeStorageNode()
dcmStorage.SetWriteFileFormat('nrrd')
dcmStorage.SetFileName(os.path.join(outputDir,'SUVbw.nrrd'))
dcmStorage.WriteData(dcmVolume)

sys.exit()
Esempio n. 8
0
 def SaveEditorButtonClicked(self):
     storageNode = slicer.vtkMRMLVolumeArchetypeStorageNode()
     storageNode.SetFileName(self.SaveFile)
     storageNode.WriteData(self.SelectedVolumeSelector.currentNode())
     print("SAVED EDITOR")
  def load(self,loadable):
    """Load the selection as a MultiVolume, if multivolume attribute is
    present
    """

    mvNode = ''
    try:
      mvNode = loadable.multivolume
    except AttributeError:
      return None

    nFrames = int(mvNode.GetAttribute('MultiVolume.NumberOfFrames'))
    files = mvNode.GetAttribute('MultiVolume.FrameFileList').split(',')
    nFiles = len(files)
    filesPerFrame = int(nFiles/nFrames)
    frames = []

    baseName = loadable.name
    
    loadAsVolumeSequence = hasattr(loadable, 'loadAsVolumeSequence') and loadable.loadAsVolumeSequence
    if loadAsVolumeSequence:
      volumeSequenceNode = slicer.mrmlScene.AddNewNodeByClass("vtkMRMLSequenceNode",
        slicer.mrmlScene.GenerateUniqueName(baseName))
      volumeSequenceNode.SetIndexName("")
      volumeSequenceNode.SetIndexUnit("")
    else:
      mvImage = vtk.vtkImageData()
      mvImageArray = None

    scalarVolumePlugin = slicer.modules.dicomPlugins['DICOMScalarVolumePlugin']()
    instanceUIDs = ""
    for file in files:
      uid = slicer.dicomDatabase.fileValue(file,self.tags['instanceUID'])
      if uid == "":
        uid = "Unknown"
      instanceUIDs += uid+" "
    instanceUIDs = instanceUIDs[:-1]
    mvNode.SetAttribute("DICOM.instanceUIDs", instanceUIDs)

    progressbar = slicer.util.createProgressDialog(labelText="Loading "+baseName,
                                                   value=0, maximum=nFrames,
                                                   windowModality = qt.Qt.WindowModal)

    try:
      # read each frame into scalar volume
      for frameNumber in range(nFrames):

        progressbar.value = frameNumber
        slicer.app.processEvents()
        if progressbar.wasCanceled:
          break

        sNode = slicer.vtkMRMLVolumeArchetypeStorageNode()
        sNode.ResetFileNameList();

        frameFileList = files[frameNumber*filesPerFrame:(frameNumber+1)*filesPerFrame]
        # sv plugin will sort the filenames by geometric order
        svLoadables = scalarVolumePlugin.examine([frameFileList])

        if len(svLoadables) == 0:
          raise IOError("volume frame %d is invalid" % frameNumber)

        frame = scalarVolumePlugin.load(svLoadables[0])

        if frame.GetImageData() == None:
          raise IOError("volume frame %d is invalid" % frameNumber)
        if loadAsVolumeSequence:
          # Load into volume sequence

          # volumeSequenceNode.SetDataNodeAtValue would deep-copy the volume frame.
          # To avoid memory reallocation, add an empty node and shallow-copy the contents
          # of the volume frame.

          # Create an empty volume node in the sequence node
          proxyVolume = slicer.mrmlScene.AddNewNodeByClass(frame.GetClassName())
          indexValue = str(frameNumber)
          volumeSequenceNode.SetDataNodeAtValue(proxyVolume, indexValue)
          slicer.mrmlScene.RemoveNode(proxyVolume)

          # Update the data node
          shallowCopy = True
          volumeSequenceNode.UpdateDataNodeAtValue(frame, indexValue, shallowCopy)

        else:
          # Load into multi-volume

          if frameNumber == 0:
            frameImage = frame.GetImageData()
            frameExtent = frameImage.GetExtent()
            frameSize = frameExtent[1]*frameExtent[3]*frameExtent[5]

            mvImage.SetExtent(frameExtent)
            if vtk.VTK_MAJOR_VERSION <= 5:
              mvImage.SetNumberOfScalarComponents(nFrames)
              mvImage.SetScalarType(frame.GetImageData().GetScalarType())
              mvImage.AllocateScalars()
            else:
              mvImage.AllocateScalars(frame.GetImageData().GetScalarType(), nFrames)

            mvImageArray = vtk.util.numpy_support.vtk_to_numpy(mvImage.GetPointData().GetScalars())

            mvNode.SetScene(slicer.mrmlScene)

            mat = vtk.vtkMatrix4x4()
            frame.GetRASToIJKMatrix(mat)
            mvNode.SetRASToIJKMatrix(mat)
            frame.GetIJKToRASMatrix(mat)
            mvNode.SetIJKToRASMatrix(mat)

          frameImage = frame.GetImageData()
          frameImageArray = vtk.util.numpy_support.vtk_to_numpy(frameImage.GetPointData().GetScalars())

          mvImageArray.T[frameNumber] = frameImageArray

        # Remove temporary volume node
        if frame.GetDisplayNode():
          slicer.mrmlScene.RemoveNode(frame.GetDisplayNode())
        if frame.GetStorageNode():
          slicer.mrmlScene.RemoveNode(frame.GetStorageNode())
        slicer.mrmlScene.RemoveNode(frame)

      if loadAsVolumeSequence:
        # Finalize volume sequence import
        # For user convenience, add a browser node and show the volume in the slice viewer.

        # Add browser node
        sequenceBrowserNode = slicer.mrmlScene.AddNewNodeByClass('vtkMRMLSequenceBrowserNode',
          slicer.mrmlScene.GenerateUniqueName(baseName + " browser"))
        sequenceBrowserNode.SetAndObserveMasterSequenceNodeID(volumeSequenceNode.GetID())
        # If save changes are allowed then proxy nodes are updated using shallow copy, which is much
        # faster for images. Images are usually not modified, so the risk of accidentally modifying
        # data in the sequence is low.
        sequenceBrowserNode.SetSaveChanges(volumeSequenceNode, True)
        # Show frame number in proxy volume node name
        sequenceBrowserNode.SetOverwriteProxyName(volumeSequenceNode, True);

        # Automatically select the volume to display
        imageProxyVolumeNode = sequenceBrowserNode.GetProxyNode(volumeSequenceNode)
        appLogic = slicer.app.applicationLogic()
        selNode = appLogic.GetSelectionNode()
        selNode.SetReferenceActiveVolumeID(imageProxyVolumeNode.GetID())
        appLogic.PropagateVolumeSelection()

        # Show sequence browser toolbar
        sequenceBrowserModule = slicer.modules.sequencebrowser
        if sequenceBrowserModule.autoShowToolBar:
          sequenceBrowserModule.setToolBarActiveBrowserNode(sequenceBrowserNode)
          sequenceBrowserModule.setToolBarVisible(True)

      else:
        # Finalize multi-volume import

        mvDisplayNode = slicer.mrmlScene.AddNewNodeByClass('vtkMRMLMultiVolumeDisplayNode')
        mvDisplayNode.SetDefaultColorMap()

        mvNode.SetAndObserveDisplayNodeID(mvDisplayNode.GetID())
        mvNode.SetAndObserveImageData(mvImage)
        mvNode.SetNumberOfFrames(nFrames)
        mvNode.SetName(loadable.name)
        slicer.mrmlScene.AddNode(mvNode)

        #
        # automatically select the volume to display
        #
        appLogic = slicer.app.applicationLogic()
        selNode = appLogic.GetSelectionNode()
        selNode.SetReferenceActiveVolumeID(mvNode.GetID())
        appLogic.PropagateVolumeSelection()

        # file list is no longer needed - remove the attribute
        mvNode.RemoveAttribute('MultiVolume.FrameFileList')

    except Exception as e:
      logging.error("Failed to read a multivolume: {0}".format(e.message))
      import traceback
      traceback.print_exc()
      mvNode = None

    finally:
      progressbar.close()

    return mvNode
Esempio n. 10
0
 def onSaveButtonClicked(self):
   import zipfile
   import os.path
   import uuid
   bundle = EditUtil.EditUtil().getParameterNode().GetParameter('QuickTCGAEffect,erich')
   tran = json.loads(bundle)
   layers = []
   for key in tran:
     nn = tran[key]
     nn["file"] = key + '.tif'
     layers.append(tran[key])
   self.j['layers'] = layers
   self.j['username'] = self.setupUserName.text
   self.j['sourcetile'] = self.tilename
   self.j['generator'] = slicer.app.applicationVersion
   self.j['timestamp'] = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
   self.j['execution_id'] = self.setupExecutionID.text + "-"+ uuid.uuid4().get_urn()
   labelNodes = slicer.util.getNodes('vtkMRMLLabelMapVolumeNode*')
   savedMessage = 'Segmentations for the following series were saved:\n\n'
   zfname = os.path.join(self.dataDirButton.directory, self.tilename + "_" + datetime.datetime.now().strftime("%Y%m%d%H%M%S") + '.zip')
   print "zipfile name"
   print zfname
   zf = zipfile.ZipFile(zfname, mode='w')
   red_logic = slicer.app.layoutManager().sliceWidget("Red").sliceLogic()
   red_cn = red_logic.GetSliceCompositeNode()
   fg = red_cn.GetForegroundVolumeID()
   ff = slicer.util.getNode(fg)
   sNode = slicer.vtkMRMLVolumeArchetypeStorageNode()
   sNode.SetFileName("original.tif")
   sNode.SetWriteFileFormat('tif')
   sNode.SetURI(None)
   success = sNode.WriteData(ff)
   zf.write("original.tif")
   os.remove("original.tif")
   for label in labelNodes.values():
     labelName = label.GetName()
     labelFileName = os.path.join(self.dataDirButton.directory, labelName + '.tif')
     compFileName = os.path.join(self.dataDirButton.directory, labelName + '-comp.tif')
     sNode.SetFileName(labelFileName)
     success = sNode.WriteData(label)
     if success:
       print "adding "+labelFileName+" to zipfile"
       zf.write(labelFileName,os.path.basename(labelFileName))
       os.remove(labelFileName)
     else:
       print "failed writing "+labelFileName
     comp = self.WriteLonI(label.GetImageData(),ff.GetImageData())
     volumeNode = slicer.vtkMRMLVectorVolumeNode()
     volumeNode.SetName("COMP")
     volumeNode.SetAndObserveImageData(comp)
     sNode.SetFileName(compFileName)
     success = sNode.WriteData(volumeNode)
     if success:
       print "adding "+compFileName+" to zipfile"
       zf.write(compFileName,os.path.basename(compFileName))
       os.remove(compFileName)
     else:
       print "failed writing "+compFileName
   jstr = json.dumps(self.j,sort_keys=True, indent=4, separators=(',', ': '))
   mfname = os.path.join(self.dataDirButton.directory, 'manifest.json')
   f = open(mfname,'w')
   f.write(jstr)
   f.close()
   zf.write(mfname,os.path.basename(mfname))
   zf.close()
   os.remove(mfname)
Esempio n. 11
0
    if len(dcm) - dcm.rfind('.dcm') == 4:
        rwvmList.append(rwvmDir + '/' + dcm)

rwvmList = rwvmList[:1]

rwvmPlugin = slicer.modules.dicomPlugins['DICOMRWVMPlugin']()

# index input DICOM series
indexer = ctk.ctkDICOMIndexer()
indexer.addDirectory(slicer.dicomDatabase, petDir)
indexer.waitForImportFinished()
indexer.addDirectory(slicer.dicomDatabase, rwvmDir)
indexer.waitForImportFinished()

loadables = rwvmPlugin.examine([rwvmList])

if len(loadables) == 0:
    print 'Could not parse the DICOM Study!'
    exit()

# load input DICOM volume
dcmVolume = rwvmPlugin.load(loadables[0])

# save DICOM volume as single file nrrd format
dcmStorage = slicer.vtkMRMLVolumeArchetypeStorageNode()
dcmStorage.SetWriteFileFormat('nrrd')
dcmStorage.SetFileName(os.path.join(outputDir, 'SUVbw.nrrd'))
dcmStorage.WriteData(dcmVolume)

sys.exit()
Esempio n. 12
0
  def load(self,loadable):
    """Load the selection as a MultiVolume, if multivolume attribute is
    present
    """

    mvNode = ''
    try:
      mvNode = loadable.multivolume
    except AttributeError:
      return None

    nFrames = int(mvNode.GetAttribute('MultiVolume.NumberOfFrames'))
    files = string.split(mvNode.GetAttribute('MultiVolume.FrameFileList'),',')
    nFiles = len(files)
    filesPerFrame = nFiles/nFrames
    frames = []

    mvImage = vtk.vtkImageData()
    mvImageArray = None

    scalarVolumePlugin = slicer.modules.dicomPlugins['DICOMScalarVolumePlugin']()
    instanceUIDs = ""
    for file in files:
      uid = slicer.dicomDatabase.fileValue(file,self.tags['instanceUID'])
      if uid == "":
        uid = "Unknown"
      instanceUIDs += uid+" "
    instanceUIDs = instanceUIDs[:-1]
    mvNode.SetAttribute("DICOM.instanceUIDs", instanceUIDs)

    # read each frame into scalar volume
    for frameNumber in range(nFrames):

      sNode = slicer.vtkMRMLVolumeArchetypeStorageNode()
      sNode.ResetFileNameList();

      frameFileList = files[frameNumber*filesPerFrame:(frameNumber+1)*filesPerFrame]
      # sv plugin will sort the filenames by geometric order
      svLoadables = scalarVolumePlugin.examine([frameFileList])

      if len(svLoadables) == 0:
        return None
      for f in svLoadables[0].files:
        sNode.AddFileName(f)

      sNode.SetFileName(frameFileList[0]) # only used when num files/frame = 1
      sNode.SetSingleFile(0)
      frame = slicer.vtkMRMLScalarVolumeNode()
      sNode.ReadData(frame)

      if frame.GetImageData() == None:
        logging.error('Failed to read a multivolume frame!')
        return None

      if frameNumber == 0:
        frameImage = frame.GetImageData()
        frameExtent = frameImage.GetExtent()
        frameSize = frameExtent[1]*frameExtent[3]*frameExtent[5]

        mvImage.SetExtent(frameExtent)
        if vtk.VTK_MAJOR_VERSION <= 5:
          mvImage.SetNumberOfScalarComponents(nFrames)
          mvImage.SetScalarType(frame.GetImageData().GetScalarType())
          mvImage.AllocateScalars()
        else:
          mvImage.AllocateScalars(frame.GetImageData().GetScalarType(), nFrames)

        mvImageArray = vtk.util.numpy_support.vtk_to_numpy(mvImage.GetPointData().GetScalars())

        mvNode.SetScene(slicer.mrmlScene)

        mat = vtk.vtkMatrix4x4()
        frame.GetRASToIJKMatrix(mat)
        mvNode.SetRASToIJKMatrix(mat)
        frame.GetIJKToRASMatrix(mat)
        mvNode.SetIJKToRASMatrix(mat)

      frameImage = frame.GetImageData()
      frameImageArray = vtk.util.numpy_support.vtk_to_numpy(frameImage.GetPointData().GetScalars())

      mvImageArray.T[frameNumber] = frameImageArray

    mvDisplayNode = slicer.mrmlScene.CreateNodeByClass('vtkMRMLMultiVolumeDisplayNode')
    mvDisplayNode.SetReferenceCount(mvDisplayNode.GetReferenceCount()-1)
    mvDisplayNode.SetScene(slicer.mrmlScene)
    mvDisplayNode.SetDefaultColorMap()
    slicer.mrmlScene.AddNode(mvDisplayNode)

    mvNode.SetAndObserveDisplayNodeID(mvDisplayNode.GetID())
    mvNode.SetAndObserveImageData(mvImage)
    mvNode.SetNumberOfFrames(nFrames)
    mvNode.SetName(loadable.name)
    slicer.mrmlScene.AddNode(mvNode)

    #
    # automatically select the volume to display
    #
    appLogic = slicer.app.applicationLogic()
    selNode = appLogic.GetSelectionNode()
    selNode.SetReferenceActiveVolumeID(mvNode.GetID())
    appLogic.PropagateVolumeSelection()

    # file list is no longer needed - remove the attribute
    mvNode.RemoveAttribute('MultiVolume.FrameFileList')

    return mvNode