Let's say the structure of the file is as follows (dcmdump output)
Code: Select all
3006,0010) SQ (Sequence with undefined length #=2) # u/l, 1 ReferencedFrameOfReferenceSequence
(fffe,e000) na (Item with undefined length #=3) # u/l, 1 Item
(0020,0052) UI [1.3.12.2.1107.5.1.4.28334.4.0.4556475228861625] # 46, 1 FrameOfReferenceUID
(3006,0012) SQ (Sequence with undefined length #=1) # u/l, 1 RTReferencedStudySequence
(fffe,e000) na (Item with undefined length #=3) # u/l, 1 Item
(0008,1150) UI =StudyComponentManagementSOPClass # 24, 1 ReferencedSOPClassUID
(0008,1155) UI [1.2.840.113619.6.95.31.0.3.4.1.6013.13.2863364] # 46, 1 ReferencedSOPInstanceUID
(3006,0014) SQ (Sequence with undefined length #=1) # u/l, 1 RTReferencedSeriesSequence
(fffe,e000) na (Item with undefined length #=2) # u/l, 1 Item
(0020,000e) UI [1.3.12.2.1107.5.1.4.28334.4.0.4556490411543837] # 46, 1 SeriesInstanceUID
(3006,0016) SQ (Sequence with undefined length #=62) # u/l, 1 ContourImageSequence
(fffe,e000) na (Item with undefined length #=2) # u/l, 1 Item
(0008,1150) UI =CTImageStorage # 26, 1 ReferencedSOPClassUID
(0008,1155) UI [1.3.6.1.4.1.2452.6.3787560449.1085974281.3785418625.1983991160] # 62, 1 ReferencedSOPInstanceUID
(fffe,e00d) na (ItemDelimitationItem) # 0, 0 ItemDelimitationItem
.........
(fffe,e0dd) na (SequenceDelimitationItem) # 0, 0 SequenceDelimitationItem
(fffe,e00d) na (ItemDelimitationItem) # 0, 0 ItemDelimitationItem
(fffe,e0dd) na (SequenceDelimitationItem) # 0, 0 SequenceDelimitationItem
(fffe,e00d) na (ItemDelimitationItem) # 0, 0 ItemDelimitationItem
(fffe,e0dd) na (SequenceDelimitationItem) # 0, 0 SequenceDelimitationItem
(3006,00c0) SQ (Sequence with undefined length #=14) # u/l, 1 FrameOfReferenceRelationshipSequence
Code: Select all
DcmSequenceOfItems *image_sequence = NULL;
OFCondition cond;
cond = dset->findAndGetSequence(DCM_ContourImageSequence, image_sequence, true);
if (cond.good())
{
Uint16 numimages = image_sequence->card();
for(int i=0;i<numimages;i++)
{
DcmItem *image_item = image_sequence->getItem(i);
OFString SOPclassUID,SOPinstanceUID;
OFString &SOPclassUID_r =SOPclassUID;
OFString &SOPinstanceUID_r = SOPinstanceUID;
image_item->findAndGetOFString(DCM_ReferencedSOPInstanceUID,SOPinstanceUID_r);
image_item->findAndGetOFString(DCM_ReferencedSOPClassUID,SOPclassUID_r);
} // end numimages
} // end cond.good
The following code seems to me the "logical" way.
Code: Select all
DRTReferencedFrameOfReferenceSequence &seq = this->getReferencedFrameOfReferenceSequence();
Uint16 num_items = seq.getNumberOfItems();
for(int i = 0; i <= num_items; i++)
{
DRTReferencedFrameOfReferenceSequence::Item &item = seq.getItem(i);
OFString uid;
item.getFrameOfReferenceUID(uid);
DRTRTReferencedStudySequence &rss_ref = item.getRTReferencedStudySequence();
for (int j = 0; j <= rss_ref.getNumberOfItems(); j++)
{
DRTRTReferencedStudySequence::Item &rss_item = rss_ref.getItem(j);
DRTRTReferencedSeriesSequence &ref_series_seq = rss_item.getRTReferencedSeriesSequence();
Uint16 nssitem = ref_series_seq.getNumberOfItems();
for (int k = 0; k <= nssitem; k++)
{
DRTRTReferencedSeriesSequence::Item &ref_series_seq_item = ref_series_seq.getItem(k);
DRTContourImageSequence &image_sequence = ref_series_seq_item.getContourImageSequence();
Uint16 num_images_in_sequence = image_sequence.getNumberOfItems();
for (int l = 0; l <= num_images_in_sequence; l++)
{
DRTContourImageSequence::Item &image_contour_item = image_sequence.getItem(l);
OFString refframenum;
image_contour_item.getReferencedFrameNumber(refframenum);
std::cout << refframenum << std::endl;
}
}
}
}
Why is that? Is the logic of accessing the nested sequences wrong?
For the mid level API i would rather like to use the second style of data access because it reflects the data organisation and hierachy.