Dear Conquest&Lua users!
I want to use lua scripting with conquest to process patient datasets (CT/RTDOSE/RTSTRUC/RTPLAN) exported from TPS before they are imported in R&V. E.g. I want to delete some help structures used during the planning. I take deletebody.lua as example and do the following:
x = DicomObject:new()x.PatientName = ''x.PatientID = ''x.QueryRetrieveLevel = 'STUDY'x.StudyInstanceUID = '' -- you want these returned for the loopx.ModalitiesInStudy = ''b=dicomquery('CONQUESTSRV1', 'STUDY', x)for i=0, #b-1 do StudyUID = b[i].StudyInstanceUID Modality = b[i].Modality Modalities = b[i].ModalitiesInStudy print('Found ', b[i].PatientName, ' ', StudyUID, ' Modalities: ', Modalities, ' Modality: ', Modality) -- try to extract RTS if string.find(Modalities, "RTSTRUCT")~=NIL then local SeriesInst = dbquery('DICOMSeries', 'SeriesInst', 'StudyInsta = "'..StudyUID..'" and Modality = "RTSTRUCT"')[1][1] local StructSOP = dbquery('DICOMImages', 'SOPInstanc', 'SeriesInst = "'..SeriesInst..'"')[1][1] strucs = newdicomobject() strucs:Read(b[i].PatientID..':'..StructSOP); strucs:Dump('J:\\strucs0.txt') print(' strucs modality: ', strucs.Modality) -- loop over RTS print('#Structures:', #strucs.StructureSetROISequence) local roinumber, index for istruc=0, #strucs.StructureSetROISequence-1 do print(strucs.StructureSetROISequence[istruc].ROINumber, ' ', strucs.StructureSetROISequence[istruc].ROIName); -- find help contour if strucs.StructureSetROISequence[istruc].ROIName=='HC_Rektum' then roinumber = strucs.StructureSetROISequence[istruc].ROINumber index = istruc print(' Found ', strucs.StructureSetROISequence[istruc].ROIName, ' roi# ', roinumber, ' index ', index) end; -- if HC found end; -- istruc -- try to delete help contour print(' deleting in StructureSetROISequence') print(' before StructureSetROISequence[', index, ']:', strucs.StructureSetROISequence[index]) strucs.StructureSetROISequence[index]=nil print(' after StructureSetROISequence[', index, ']:', strucs.StructureSetROISequence[index]) print(' after StructureSetROISequence[', index, ']:', strucs.StructureSetROISequence[index]) print(' after StructureSetROISequence[', index, ']:', strucs.StructureSetROISequence[index]) for istruc=0, #strucs.ROIContourSequence-1 do if strucs.ROIContourSequence[istruc].ReferencedROINumber==roinumber then index = istruc print(' Found roi# ', roinumber, ' in ROIContourSequence, index ', index) end; end; print(' deleting in ROIContourSequence, index: ', index) strucs.ROIContourSequence[index]=0 for istruc=0, #strucs.RTROIObservationsSequence-1 do if strucs.RTROIObservationsSequence[istruc].ReferencedROINumber==roinumber then index = istruc print(' Found roi# ', roinumber, ' in RTROIObservationsSequence, index ', index) end; end; print(' deleting in RTROIObservationsSequence, index: ', index) strucs.RTROIObservationsSequence[index]=0 strucs:Dump('J:\\strucs1.txt') end; -- if RTSTRUCTend
Here's the output from CONQUESTSRV1 (1.4.17d):
[CONQUESTSRV1] UPACS THREAD 41: STARTED AT: Tue Nov 18 08:57:43 2014[CONQUESTSRV1] Calling Application Title : "CONQUESTSRV1 "[CONQUESTSRV1] Called Application Title : "CONQUESTSRV1 "[CONQUESTSRV1] Application Context : "1.2.840.10008.3.1.1.1", PDU length: 16384[CONQUESTSRV1] Presentation Context 0 "1.2.840.10008.5.1.4.1.2.2.1" 1[CONQUESTSRV1] (StudyRootQuery) search level: STUDY [CONQUESTSRV1] C-Find (StudyRoot) located 2 records[CONQUESTSRV1] UPACS THREAD 41: ENDED AT: Tue Nov 18 08:57:43 2014[CONQUESTSRV1] UPACS THREAD 41: TOTAL RUNNING TIME: 0 SECONDS[CONQUESTSRV1] Found HEAD EXP2 1.3.46.670589.5.2.10.2156913941.892665384.993397 Modalities: CT Modality: nil[CONQUESTSRV1] Found XXXX 1.3.12.2.1107.5.8.9.1010144715133114222.1008359 Modalities: RTSTRUCT\RTPLAN\RTDOSE\CT Modality: nil[CONQUESTSRV1] strucs modality: RTSTRUCT[CONQUESTSRV1] #Structures: 31[CONQUESTSRV1] 1 REF[CONQUESTSRV1] 2 1ISO[CONQUESTSRV1] 3 NORM[CONQUESTSRV1] 4 Rektum[CONQUESTSRV1] 5 Bladder[CONQUESTSRV1] 6 Hueftkopf li[CONQUESTSRV1] 7 Hueftkopf re[CONQUESTSRV1] 8 Prostatabett[CONQUESTSRV1] 9 Boost[CONQUESTSRV1] 10 PTV[CONQUESTSRV1] 11 TischModell_10mm[CONQUESTSRV1] 12 RV sine PTV[CONQUESTSRV1] 13 RV cum PTV[CONQUESTSRV1] 14 Blase-PTV[CONQUESTSRV1] 15 HC_Deckelung[CONQUESTSRV1] 16 HC_Rektum[CONQUESTSRV1] Found HC_Rektum roi# 16 index 15[CONQUESTSRV1] 17 h[CONQUESTSRV1] 18 HC_PTV_1-0[CONQUESTSRV1] 19 HC_PTV_2-1[CONQUESTSRV1] 20 Outline[CONQUESTSRV1] 21 Outline-0.5[CONQUESTSRV1] 22 Outline-(PTV+2)[CONQUESTSRV1] 23 _Boost-0.5[CONQUESTSRV1] 24 _Boost+0.5[CONQUESTSRV1] 25 _PTV-Boost[CONQUESTSRV1] 26 _(PTV-Boost)-0.5[CONQUESTSRV1] 27 _PTV-(Boost+0.5)[CONQUESTSRV1] 28 Grad[CONQUESTSRV1] 29 Boost-0.5[CONQUESTSRV1] 30 (PTV-Boost)-0.5[CONQUESTSRV1] 31 PTV-Boost[CONQUESTSRV1] deleting in StructureSetROISequence[CONQUESTSRV1] before StructureSetROISequence[ 15 ]: userdata:0253F8A0[CONQUESTSRV1] after StructureSetROISequence[ 15 ]: userdata:02542D10[CONQUESTSRV1] after StructureSetROISequence[ 15 ]: userdata:01278400[CONQUESTSRV1] after StructureSetROISequence[ 15 ]: userdata:0128E258[CONQUESTSRV1] Found roi# 16 in ROIContourSequence, index 15[CONQUESTSRV1] deleting in ROIContourSequence, index: 15[CONQUESTSRV1] Found roi# 16 in RTROIObservationsSequence, index 15[CONQUESTSRV1] deleting in RTROIObservationsSequence, index: 15
Questions:
1) The dumps in strucs0.txt and strucs1.txt are completely identical. The assignments of the kind:
do not seem to delete objects from memory. What am I doing wrong?
2) I don't understand the result of consequtive print statements:
What is "02542D10" in "userdata:02542D10"? If this is an object address, why does it differ from print statement to print statement?
Any help and advice is highly appreciated!
Kostya