@@ -23,6 +23,8 @@ const { naturalizeDataset } = dcmjs.data.DicomMetaDictionary
2323interface NaturalizedInstance {
2424 SeriesInstanceUID : string
2525 SOPInstanceUID : string
26+ FrameOfReferenceUID ?: string
27+ ContainerIdentifier ?: string
2628 ReferencedSeriesSequence ?: Array < {
2729 SeriesInstanceUID : string
2830 } >
@@ -40,11 +42,6 @@ interface NaturalizedInstance {
4042 } >
4143}
4244
43- interface ReferencedSlideResult {
44- slide : Slide | undefined
45- metadata : NaturalizedInstance
46- }
47-
4845const findSeriesSlide = ( slides : Slide [ ] , seriesInstanceUID : string ) : Slide | undefined => {
4946 return slides . find ( ( slide : Slide ) => {
5047 return slide . seriesInstanceUIDs . find ( ( uid : string ) => {
@@ -82,65 +79,57 @@ function ParametrizedSlideViewer ({
8279 const [ derivedDataset , setDerivedDataset ] = useState < NaturalizedInstance | null > ( null )
8380
8481 useEffect ( ( ) => {
85- const seriesSlide = findSeriesSlide ( slides , seriesInstanceUID )
86- if ( seriesSlide !== null ) {
87- setSelectedSlide ( seriesSlide )
88- }
89- } , [ seriesInstanceUID , slides ] )
82+ const currentSlideMatchesSeries = selectedSlide ?. seriesInstanceUIDs . some ( ( uid : string ) => uid === seriesInstanceUID ) ?? false
9083
91- useEffect ( ( ) => {
92- const findReferencedSlide = async ( { clients, studyInstanceUID, seriesInstanceUID } : {
93- clients : { [ key : string ] : DicomWebManager }
94- studyInstanceUID : string
95- seriesInstanceUID : string
96- } ) : Promise < ReferencedSlideResult | null > => await new Promise < ReferencedSlideResult | null > ( ( resolve , reject ) => {
97- try {
98- const allClients = Object . values ( StorageClasses ) . map ( ( storageClass ) => clients [ storageClass ] )
99- Promise . all ( allClients . map ( async ( client ) => {
100- const seriesMetadata = await client . retrieveSeriesMetadata ( {
101- studyInstanceUID : studyInstanceUID ,
102- seriesInstanceUID : seriesInstanceUID
103- } )
104- const [ naturalizedSeriesMetadata ] = seriesMetadata . map ( ( metadata ) => naturalizeDataset ( metadata ) ) as NaturalizedInstance [ ]
84+ if ( selectedSlide === null || selectedSlide === undefined || ! currentSlideMatchesSeries ) {
85+ const imageSlide = findSeriesSlide ( slides , seriesInstanceUID )
86+ if ( imageSlide !== null && imageSlide !== undefined ) {
87+ setSelectedSlide ( imageSlide )
88+ setDerivedDataset ( null )
89+ return
90+ }
10591
106- if ( naturalizedSeriesMetadata . ReferencedSeriesSequence != null ) {
107- const referencedSeriesInstanceUID = naturalizedSeriesMetadata . ReferencedSeriesSequence [ 0 ] . SeriesInstanceUID
92+ const findReferencedSlide = async ( ) : Promise < void > => {
93+ const client = clients [ StorageClasses . VL_WHOLE_SLIDE_MICROSCOPY_IMAGE ]
94+ const derivedSeriesMetadata = await client . retrieveSeriesMetadata ( {
95+ studyInstanceUID : studyInstanceUID ,
96+ seriesInstanceUID : seriesInstanceUID
97+ } )
98+ const naturalizedDerivedMetadata = naturalizeDataset ( derivedSeriesMetadata [ 0 ] ) as NaturalizedInstance
99+ if (
100+ naturalizedDerivedMetadata . ReferencedSeriesSequence != null &&
101+ naturalizedDerivedMetadata . ReferencedSeriesSequence . length > 0
102+ ) {
103+ for ( const referencedSeries of naturalizedDerivedMetadata . ReferencedSeriesSequence ) {
104+ const referencedImageSeriesUID = referencedSeries . SeriesInstanceUID
108105 const referencedSlide = slides . find ( ( slide : Slide ) => {
109- return slide . seriesInstanceUIDs . find ( ( uid : string ) => {
110- return uid === referencedSeriesInstanceUID
111- } )
106+ return slide . seriesInstanceUIDs . some ( ( uid : string ) => uid === referencedImageSeriesUID )
112107 } )
113- resolve ( { slide : referencedSlide , metadata : naturalizedSeriesMetadata } )
108+ if ( referencedSlide !== null && referencedSlide !== undefined ) {
109+ setSelectedSlide ( referencedSlide )
110+ setDerivedDataset ( naturalizedDerivedMetadata )
111+ console . log ( 'naturalizedDerivedMetadata' , naturalizedDerivedMetadata )
112+ return
113+ }
114114 }
115-
116- const IMAGE_LIBRARY_CONCEPT_NAME_CODE = '111028'
117- const imageLibrary = naturalizedSeriesMetadata . ContentSequence ?. find (
118- contentItem => contentItem . ConceptNameCodeSequence [ 0 ] . CodeValue === IMAGE_LIBRARY_CONCEPT_NAME_CODE
119- )
120- if ( ( imageLibrary ?. ContentSequence ?. [ 0 ] ?. ContentSequence ?. [ 0 ] ?. ReferencedSOPSequence ?. [ 0 ] ) != null ) {
121- const referencedSOPInstanceUID = imageLibrary . ContentSequence [ 0 ] . ContentSequence [ 0 ] . ReferencedSOPSequence [ 0 ] . ReferencedSOPInstanceUID
122- const referencedSlide = slides . find ( ( slide : Slide ) => {
123- return slide . volumeImages . find ( ( image : { SOPInstanceUID : string } ) => {
124- return image . SOPInstanceUID === referencedSOPInstanceUID
125- } )
115+ }
116+ const IMAGE_LIBRARY_CONCEPT_NAME_CODE = '111028'
117+ const imageLibrary = naturalizedDerivedMetadata . ContentSequence ?. find (
118+ contentItem => contentItem . ConceptNameCodeSequence [ 0 ] . CodeValue === IMAGE_LIBRARY_CONCEPT_NAME_CODE
119+ )
120+ if ( ( imageLibrary ?. ContentSequence ?. [ 0 ] ?. ContentSequence ?. [ 0 ] ?. ReferencedSOPSequence ?. [ 0 ] ) != null ) {
121+ const referencedSOPInstanceUID = imageLibrary . ContentSequence [ 0 ] . ContentSequence [ 0 ] . ReferencedSOPSequence [ 0 ] . ReferencedSOPInstanceUID
122+ const referencedSlide = slides . find ( ( slide : Slide ) => {
123+ return slide . volumeImages . find ( ( image : { SOPInstanceUID : string } ) => {
124+ return image . SOPInstanceUID === referencedSOPInstanceUID
126125 } )
127- resolve ( { slide : referencedSlide , metadata : naturalizedSeriesMetadata } )
128- }
129- } ) ) . catch ( reject )
130- } catch ( error ) {
131- reject ( error )
126+ } )
127+ setSelectedSlide ( referencedSlide )
128+ setDerivedDataset ( naturalizedDerivedMetadata )
129+ }
132130 }
133- } )
134131
135- if ( selectedSlide === null || selectedSlide === undefined ) {
136- void findReferencedSlide ( { clients, studyInstanceUID, seriesInstanceUID } ) . then ( ( result : ReferencedSlideResult | null ) => {
137- if ( result !== null && result !== undefined ) {
138- setSelectedSlide ( result . slide )
139- setDerivedDataset ( result . metadata )
140- }
141- } ) . catch ( error => {
142- console . error ( 'Error finding referenced slide:' , error )
143- } )
132+ void findReferencedSlide ( )
144133 }
145134 } , [ slides , clients , studyInstanceUID , seriesInstanceUID , selectedSlide ] )
146135
0 commit comments