def test_PETDicomExtensionSelfTest_Main(self):
   """ test PET SUV Plugin and DICOM RWVM creation 
   """ 
   self.delayDisplay('Checking for PET DICOM plugins')
   dicomWidget = slicer.modules.dicom.widgetRepresentation().self()
   dicomPluginCheckbox =  dicomWidget.detailsPopup.pluginSelector.checkBoxByPlugin
   self.assertIn('DICOMPETSUVPlugin', dicomPluginCheckbox)
   self.assertIn('DICOMRWVMPlugin', dicomPluginCheckbox)    
   
   self.delayDisplay('Adding PET DICOM dataset to DICOM database (including download if necessary)')
   self._downloadTestData()
   
   self.delayDisplay('Loading data with DICOMPETSUVPlugin')
   self._loadWithPlugin(self.UID, 'DICOMPETSUVPlugin')
   imageNode = slicer.mrmlScene.GetFirstNodeByClass('vtkMRMLScalarVolumeNode')
   self.assertIsNotNone(imageNode)
   
   self.delayDisplay('Testing properties of loaded SUV normalized data')
   self._testDataProperties(imageNode)
   
   self.delayDisplay('Testing DICOM database for created RWVM file')
   patientUID = DICOMUtils.getDatabasePatientUIDByPatientName(self.PatientName)
   studies = slicer.dicomDatabase.studiesForPatient(patientUID)
   series = slicer.dicomDatabase.seriesForStudy(studies[0])
   RWVMSeries = None
   for serie in series:
     description = slicer.dicomDatabase.descriptionForSeries(serie)
     if description=='PET SUV Factors':
       RWVMSeries = serie
   self.assertIsNotNone(RWVMSeries)
   files = slicer.dicomDatabase.filesForSeries(RWVMSeries)
   self.assertTrue(len(files)>0)
   RWVMFile = files[0]
   print(RWVMFile)
   
   self.delayDisplay('Testing RealWorldValueSlope stored in RWVM file')
   rwvm=dicom.read_file(RWVMFile)
   self.assertIn('ReferencedImageRealWorldValueMappingSequence',  rwvm)
   rirwvms = rwvm.ReferencedImageRealWorldValueMappingSequence[0]
   self.assertIn('RealWorldValueMappingSequence', rirwvms)
   rwvms = rirwvms.RealWorldValueMappingSequence[0]
   self.assertIn('RealWorldValueSlope', rwvms)
   slope = rwvms.RealWorldValueSlope
   self.assertTrue(abs(slope-0.000401664)<0.00001)
   
   self.delayDisplay('Loading data with DICOMRWVMPlugin')
   slicer.mrmlScene.Clear(0)
   self._loadWithPlugin(RWVMSeries, 'DICOMRWVMPlugin')
   imageNode = slicer.mrmlScene.GetFirstNodeByClass('vtkMRMLScalarVolumeNode')
   self.assertIsNotNone(imageNode)
   
   self.delayDisplay('Testing properties of loaded SUV normalized data')
   self._testDataProperties(imageNode)
       
   self.delayDisplay('Test passed!')
Example #2
0
    def test_PETPhantomAnalysis(self):
        """ test standard processing
    """
        try:
            self.assertIsNotNone(slicer.modules.petphantomanalysis)
            with DICOMUtils.TemporaryDICOMDatabase(
                    self.tempDicomDatabaseDir) as db:
                self.assertTrue(db.isOpen)
                self.assertEqual(slicer.dicomDatabase, db)

                self.delayDisplay(
                    'Loading PET DICOM dataset (including download if necessary)'
                )
                petNode = self.loadTestData()

                self.delayDisplay('Running segmentation')
                m = slicer.util.mainWindow()
                m.moduleSelector().selectModule('PETPhantomAnalysis')
                qrWidget = slicer.modules.PETPhantomAnalysisWidget
                qrWidget.inputSelector.setCurrentNode(petNode)
                segmentationNode = qrWidget.segmentationSelector.addNode()
                qrWidget.inputVolumeSelected()
                qrWidget.segmentButton.click()

                # assert measurements are correct
                self.assertTrue(
                    abs(float(qrWidget.meanValueLineEdit.text) -
                        0.982502) < 0.01)
                self.assertTrue(
                    abs(float(qrWidget.stdValueLineEdit.text) -
                        0.031612) < 0.01)
                self.assertTrue(
                    abs(
                        float(qrWidget.maxRelDiffValueLineEdit.text) +
                        0.0203663) < 0.01)

                ## clean up data from DICOM database
                patientUID = DICOMUtils.getDatabasePatientUIDByPatientName(
                    self.patienName)
                db.removePatient(patientUID)

                self.delayDisplay('Test passed!')

        except Exception as e:
            import traceback
            traceback.print_exc()
            self.delayDisplay('Test caused exception!\n' + str(e),
                              self.delayMs * 2)
  def test_PETLiverUptakeMeasurementQR2(self):
    """ test segmentation options
    """
    try:
      self.assertIsNotNone( slicer.modules.petliveruptakemeasurement )
      with DICOMUtils.TemporaryDICOMDatabase(self.tempDicomDatabaseDir) as db:
        self.assertTrue(db.isOpen)
        self.assertEqual(slicer.dicomDatabase, db)
        self.delayDisplay('Loading PET DICOM dataset (including download if necessary)')
        petNode = self.loadTestData()

        qrWidget = slicer.modules.PETLiverUptakeMeasurementQRWidget
        qrWidget.inputSelector.setCurrentNode(petNode)
        segmentationNode = qrWidget.segmentationSelector.addNode()

        self.delayDisplay('Running segmentation with standard settings')
        qrWidget.segmentButton.click()
        self.assertTrue(abs(float(qrWidget.meanValueLineEdit.text)-2.36253)<0.01)

        self.delayDisplay('Specifying annotation ROI')
        roi=slicer.vtkMRMLAnnotationROINode()
        roi.SetXYZ([-34,243,-1168])
        roi.SetRadiusXYZ([85,102,82])
        roi.SetName('ROI')
        slicer.mrmlScene.AddNode(roi)
        qrWidget.regionSelector.setCurrentNode(roi)
        qrWidget.segmentButton.click()
        self.assertTrue(abs(float(qrWidget.meanValueLineEdit.text)-2.91891)<0.01)

        self.delayDisplay('Changing erosion range')
        originalErosion = qrWidget.erosionSlider.value
        qrWidget.erosionSlider.value = 0
        qrWidget.segmentButton.click()
        self.assertTrue(abs(float(qrWidget.meanValueLineEdit.text)-2.71982)<0.01)

        self.delayDisplay('Changing thresholds')
        originalMinimValue = qrWidget.thresholdRangeSlider.minimumValue
        originalMaximumValue = qrWidget.thresholdRangeSlider.maximumValue
        qrWidget.thresholdRangeSlider.minimumValue = 2
        qrWidget.thresholdRangeSlider.maximumValue = 20
        qrWidget.segmentButton.click()
        self.assertTrue(abs(float(qrWidget.meanValueLineEdit.text)-3.72669)<0.01)

        self.delayDisplay('Completing and writing DICOM report')
        qrWidget.readerValueLineEdit.text = 'semiautotest'
        self.assertTrue(qrWidget.saveReport(completed=True))

        self.delayDisplay('Testing that report was saved as semiautomatic result')
        import dicom
        patientUID = DICOMUtils.getDatabasePatientUIDByPatientName('QIN-HEADNECK-01-0139')
        studies = slicer.dicomDatabase.studiesForPatient(patientUID)
        series = slicer.dicomDatabase.seriesForStudy(studies[0])
        SEGSeries = None
        for serie in series:
          description = slicer.dicomDatabase.descriptionForSeries(serie)
          if description=='Semiautomatic Liver Reference Region Segmentation':
            SEGSeries = serie
        self.assertIsNotNone(SEGSeries)

        # reset values
        qrWidget.regionSelector.removeCurrentNode()
        qrWidget.erosionSlider.value = originalErosion
        qrWidget.thresholdRangeSlider.minimumValue = originalMinimValue
        qrWidget.thresholdRangeSlider.maximumValue = originalMaximumValue

        # clean up data from DICOM database
        db.removePatient(patientUID)

        self.delayDisplay('Test passed!')

    except Exception, e:
      import traceback
      traceback.print_exc()
      self.delayDisplay('Test caused exception!\n' + str(e),self.delayMs*2)
  def test_PETLiverUptakeMeasurementQR1(self):
    """ test standard segmentation and report generation
    """
    try:
      self.assertIsNotNone( slicer.modules.petliveruptakemeasurement )
      with DICOMUtils.TemporaryDICOMDatabase(self.tempDicomDatabaseDir) as db:
        self.assertTrue(db.isOpen)
        self.assertEqual(slicer.dicomDatabase, db)

        self.delayDisplay('Loading PET DICOM dataset (including download if necessary)')
        petNode = self.loadTestData()

        self.delayDisplay('Running segmentation')
        m = slicer.util.mainWindow()
        m.moduleSelector().selectModule('PETLiverUptakeMeasurementQR')
        qrWidget = slicer.modules.PETLiverUptakeMeasurementQRWidget
        qrWidget.inputSelector.setCurrentNode(petNode)
        segmentationNode = qrWidget.segmentationSelector.addNode()
        qrWidget.segmentButton.click()

        self.assertTrue(abs(float(qrWidget.meanValueLineEdit.text)-2.36253)<0.01)
        self.assertTrue(abs(float(qrWidget.stdValueLineEdit.text)-0.402997)<0.01)
        self.assertTrue(abs(float(qrWidget.medianValueLineEdit.text)-2.335)<0.01)

        self.delayDisplay('Completing and writing DICOM report')
        qrWidget.readerValueLineEdit.text = 'autotest'
        self.assertTrue(qrWidget.saveReport(completed=True))

        self.delayDisplay('Checking for DICOM SEG and SR')
        import dicom
        patientUID = DICOMUtils.getDatabasePatientUIDByPatientName(self.patienName)
        studies = slicer.dicomDatabase.studiesForPatient(patientUID)
        series = slicer.dicomDatabase.seriesForStudy(studies[0])
        SRSeries = None
        SEGSeries = None
        for serie in series:
          description = slicer.dicomDatabase.descriptionForSeries(serie)
          if description=='Automatic Liver Reference Region Segmentation':
            SEGSeries = serie
          if description=='Liver Reference Region Measurement Report':
            SRSeries = serie
        self.assertIsNotNone(SRSeries)
        self.assertIsNotNone(SEGSeries)
        SRFile = slicer.dicomDatabase.filesForSeries(SRSeries)[0]

        self.delayDisplay('Loading DICOM SR and verifying stored measurements')
        sr = dicom.read_file(SRFile)
        dicomMean = self._getMeasuredValue(sr,'Mean')
        self.assertIsNotNone(dicomMean)
        self.assertEqual(dicomMean.MeasuredValueSequence[0].NumericValue, 2.36253)
        dicomStandardDeviation = self._getMeasuredValue(sr,'Standard Deviation')
        self.assertIsNotNone(dicomStandardDeviation)
        self.assertEqual(dicomStandardDeviation.MeasuredValueSequence[0].NumericValue, 0.402997)
        dicomMedian = self._getMeasuredValue(sr,'Median')
        self.assertIsNotNone(dicomMedian)
        self.assertEqual(dicomMedian.MeasuredValueSequence[0].NumericValue, 2.335)

        # clean up data from DICOM database
        db.removePatient(patientUID)

        self.delayDisplay('Test passed!')

    except Exception, e:
      import traceback
      traceback.print_exc()
      self.delayDisplay('Test caused exception!\n' + str(e),self.delayMs*2)