|
@@ -21,7 +21,7 @@ class imageBrowser(ScriptedLoadableModule):
|
|
|
ScriptedLoadableModule.__init__(self, parent)
|
|
|
self.parent.title = "image Browser"
|
|
|
# TODO make this more human readable by adding spaces
|
|
|
- self.parent.categories = ["LabKey"]
|
|
|
+ self.parent.categories = ["dynamicSPECT"]
|
|
|
self.parent.dependencies = []
|
|
|
self.parent.contributors = ["Andrej Studen (UL/FMF)"]
|
|
|
# replace with "Firstname Lastname (Organization)"
|
|
@@ -66,11 +66,11 @@ class imageBrowserWidget(ScriptedLoadableModuleWidget):
|
|
|
self.participantField=qt.QLabel("PatientId")
|
|
|
infoLayout.addRow("Participant field:",self.participantField)
|
|
|
|
|
|
- self.ctField=qt.QLabel("ctResampled")
|
|
|
+ self.ctField=qt.QLabel("ct")
|
|
|
infoLayout.addRow("Data field (CT):",self.ctField)
|
|
|
|
|
|
- self.spectField=qt.QLabel("spectResampled")
|
|
|
- infoLayout.addRow("Data field (PET):",self.spectField)
|
|
|
+ self.spectField=qt.QLabel("spect")
|
|
|
+ infoLayout.addRow("Data field (SPECT):",self.spectField)
|
|
|
|
|
|
self.userField=qt.QLabel("Loading")
|
|
|
infoLayout.addRow("User",self.userField)
|
|
@@ -110,8 +110,8 @@ class imageBrowserWidget(ScriptedLoadableModuleWidget):
|
|
|
self.ctCode=qt.QLabel("ctCode")
|
|
|
patientsFormLayout.addRow("CT:",self.ctCode)
|
|
|
|
|
|
- self.petCode=qt.QLabel("petCode")
|
|
|
- patientsFormLayout.addRow("PET:",self.petCode)
|
|
|
+ self.spectCode=qt.QLabel("spectCode")
|
|
|
+ patientsFormLayout.addRow("SPECT:",self.spectCode)
|
|
|
|
|
|
|
|
|
self.patientLoad=qt.QPushButton("Load")
|
|
@@ -158,7 +158,7 @@ class imageBrowserWidget(ScriptedLoadableModuleWidget):
|
|
|
#self.setupList.addItem("limfomiPET_iBrowser_selected.json")
|
|
|
#self.setupList.addItem("iraemm_iBrowserProspective.json")
|
|
|
#self.setupList.addItem("iraemm_iBrowserRetrospective.json")
|
|
|
- self.setupList.addItem("cardiacSpect_iBrowser.json")
|
|
|
+ self.setupList.addItem("cardiacSPECT_iBrowser.json")
|
|
|
self.setupList.currentIndexChanged.connect(self.onSetupListChanged)
|
|
|
setupFormLayout.addRow("Setup:",self.setupList)
|
|
|
|
|
@@ -227,25 +227,27 @@ class imageBrowserWidget(ScriptedLoadableModuleWidget):
|
|
|
self.serverList.setStyleSheet('background-color: green')
|
|
|
|
|
|
def onPatientListChanged(self,i):
|
|
|
+ dt=datetime.datetime
|
|
|
self.visitList.clear()
|
|
|
- self.petCode.setText("")
|
|
|
+ self.spectCode.setText("")
|
|
|
self.ctCode.setText("")
|
|
|
|
|
|
#add potential filters from setup to dbFilter
|
|
|
ds=self.logic.getDataset(dbFilter={'participant':self.patientList.currentText})
|
|
|
|
|
|
visitVar=self.logic.getVarName(var='visitField')
|
|
|
- dt=datetime.datetime
|
|
|
-
|
|
|
+
|
|
|
+ studyDateVar=self.logic.getVarName(var='studyDateField')
|
|
|
#label is a combination of sequence number and date of imaging
|
|
|
+
|
|
|
+
|
|
|
try:
|
|
|
seq={row['SequenceNum']:
|
|
|
- {'label':row[visitVar],
|
|
|
- 'date': dt.strptime(row['studyDate'],'%Y/%m/%d %H:%M:%S')}
|
|
|
- for row in ds['rows']}
|
|
|
+ {'label':row[visitVar],'date': parseDate(row[studyDateVar])} for row in ds['rows']}
|
|
|
except TypeError:
|
|
|
- #if studyDate is empty, this will return no possible visits
|
|
|
- return
|
|
|
+ #if studyDate is empty, this will return no possible visits
|
|
|
+ return
|
|
|
+
|
|
|
|
|
|
#apply lookup to visitVar if available
|
|
|
try:
|
|
@@ -315,7 +317,7 @@ class imageBrowserWidget(ScriptedLoadableModuleWidget):
|
|
|
self.segmentEditorWidget.setSegmentationNode(
|
|
|
self.logic.volumeNode['Segmentation'])
|
|
|
self.segmentEditorWidget.setMasterVolumeNode(
|
|
|
- self.logic.volumeNode['PET'])
|
|
|
+ self.logic.volumeNode['SPECT'])
|
|
|
|
|
|
def onReviewSegmentChanged(self):
|
|
|
pass
|
|
@@ -360,6 +362,22 @@ def loadLibrary(name):
|
|
|
return nixWrapper.loadLibrary(name)
|
|
|
|
|
|
|
|
|
+def parseDate(x):
|
|
|
+
|
|
|
+ print(f'Parsing date from {x}')
|
|
|
+ dt=datetime.datetime
|
|
|
+ try:
|
|
|
+ return dt.strptime(x,'%Y/%m/%d %H:%M:%S.%f')
|
|
|
+ except ValueError:
|
|
|
+ pass
|
|
|
+
|
|
|
+ try:
|
|
|
+ return dt.strptime(x,'%Y-%m-%d %H:%M:%S.%f')
|
|
|
+ except ValueError:
|
|
|
+ pass
|
|
|
+
|
|
|
+ #raise TypeError(f'Could not convert date {x}')
|
|
|
+ return dt.fromtimestamp(0)
|
|
|
#
|
|
|
# imageBrowserLogic
|
|
|
#
|
|
@@ -473,18 +491,18 @@ class imageBrowserLogic(ScriptedLoadableModuleLogic):
|
|
|
|
|
|
#look for entries where segmentation was already done
|
|
|
dsSet=self.getDataset('SegmentationsMaster')
|
|
|
- segMap={'{}:{}'.format(r['ParticipantId'],r['visitCode']):r['comments']
|
|
|
+ segMap={'{}:{}'.format(r['patientCode'],r['visitCode']):r['comments']
|
|
|
for r in dsSet['rows']}
|
|
|
ids=[]
|
|
|
for r in ds['rows']:
|
|
|
- code='{}:{}'.format(r['ParticipantId'],r['visitCode'])
|
|
|
+ code='{}:{}'.format(r['patientCode'],r['visitCode'])
|
|
|
try:
|
|
|
comment=segMap[code]
|
|
|
except KeyError:
|
|
|
- ids.append(r['ParticipantId'])
|
|
|
+ ids.append(r['patientCode'])
|
|
|
continue
|
|
|
if comment==filterValue:
|
|
|
- ids.append(r['ParticipantId'])
|
|
|
+ ids.append(r['patientCode'])
|
|
|
status['ids']=list(set(ids))
|
|
|
return status
|
|
|
|
|
@@ -492,7 +510,7 @@ class imageBrowserLogic(ScriptedLoadableModuleLogic):
|
|
|
|
|
|
def getVarName(self,name="Imaging",var="visitField"):
|
|
|
dset=self.isetup['datasets'][name]
|
|
|
- defaults={"visitField":"imagingVisitId"}
|
|
|
+ defaults={"visitField":"imagingVisitId","studyDateField":"studyDate"}
|
|
|
try:
|
|
|
return dset[var]
|
|
|
except KeyError:
|
|
@@ -759,7 +777,7 @@ class imageBrowserLogic(ScriptedLoadableModuleLogic):
|
|
|
format(entry['patientCode'],entry['visitCode'],uName))
|
|
|
slicer.mrmlScene.AddNode(segNode)
|
|
|
segNode.CreateDefaultDisplayNodes()
|
|
|
- segNode.SetReferenceImageGeometryParameterFromVolumeNode(self.volumeNode['PET'])
|
|
|
+ segNode.SetReferenceImageGeometryParameterFromVolumeNode(self.volumeNode['SPECT'])
|
|
|
try:
|
|
|
segmentList=self.isetup['segmentList']
|
|
|
except KeyError:
|