Ë
    Eü´j…  ã                   óà  — d Z ddlZddlZddlZddlZddlZ ej                  e«      Z	ej                  dk(  Zi dd“dd“dd	“d
d“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“d d!“d"d#“d$d%“i d&d'“d(d)“d*d+“d,d-“d.d/“d0d1“d2d3“d4d5“d6d7“d8d9“d:d;“d<d=“d>d?“d@dA“dBdC“dDdE“dFdG“¥i dHdI“dJdK“dLdM“dNdO“dPdQ“dRdS“dTdU“dVdW“dXdY“dZd[“d\d]“d^d_“d`da“dbdc“ddde“dfdg“dhdi“¥djdki¥ZdlZdmZdnZ eej#                  «       D � cg c]  } | d   ‘Œ	 c} «      Z eej'                  «       D �cg c]  }|do   ‘Œ	 c}«      Z G dp„ dqe«      Z G dr„ dse«      Z G dt„ due«      Z G dv„ dwe«      Zdx„ Zd{dy„Zdz„ Zyc c} w c c}w )|zPlugin for reading DICOM files.é    NÚlittle)éà  é   )Ú	PixelDataÚOB)é   é    )Ú	StudyDateÚDA)r   é!   )Ú
SeriesDater   )r   é"   )ÚAcquisitionDater   )r   é#   )ÚContentDater   )r   é0   )Ú	StudyTimeÚTM)r   é1   )Ú
SeriesTimer   )r   é2   )ÚAcquisitionTimer   )r   é3   )ÚContentTimer   )r   é`   )ÚModalityÚCS)r   ép   )ÚManufacturerÚLO)r   é€   )ÚInstitutionNamer    )r   é0  )ÚStudyDescriptionr    )r   i>  )ÚSeriesDescriptionr    )r   é   )ÚSOPClassUIDÚUI)r   é   )ÚSOPInstanceUIDr(   )r	   é   )ÚStudyInstanceUIDr(   )r	   é   )ÚSeriesInstanceUIDr(   )r   i  )Ú
ContextUIDr(   )r	   é   )ÚSeriesNumberÚIS)r	   é   )ÚAcquisitionNumberr2   )r	   é   )ÚInstanceNumberr2   )r	   é   )ÚIsotopeNumberr2   )r	   é   )ÚPhaseNumberr2   )r	   r&   )ÚIntervalNumberr2   )r	   é   )ÚTimeSlotNumberr2   )r	   r)   )ÚAngleNumberr2   )r	   é   )Ú
ItemNumberr2   )r	   r	   )ÚPatientOrientationr   )r	   r   )ÚImagePositionr   )r	   r   )ÚImagePositionPatientr   )r	   é5   )ÚImageOrientationr   )r	   é7   )ÚImageOrientationPatientr   )r   r   )ÚPatientNameÚPN)r   r	   )Ú	PatientIDr    )r   r   )ÚPatientBirthDater   )r   é@   )Ú
PatientSexr   )r   i  )Ú
PatientAgeÚAS)r   i   )ÚPatientSizeÚDS)r   r#   )ÚPatientWeightrQ   )é(   é   )ÚSamplesPerPixelÚUS)rS   r   )ÚNumberOfFramesr2   )rS   é   )ÚBitsAllocatedrV   )rS   i  )Ú
BitsStoredrV   )rS   i  )ÚHighBitrV   )rS   i  )ÚPixelRepresentationrV   )rS   r   )ÚRowsrV   )rS   r0   )ÚColumnsrV   )rS   iR  )ÚRescaleInterceptrQ   )rS   iS  )ÚRescaleSloperQ   )rS   r   )ÚPixelSpacingrQ   )r)   éˆ   )ÚSliceSpacingrQ   )éþÿ  i à  )rd   ià  )rd   iÝà  é   c                   ó   — e Zd Zy)ÚNotADicomFileN©Ú__name__Ú
__module__Ú__qualname__© ó    úT/root/workspace/ytshorts/venv/lib/python3.12/site-packages/imageio/plugins/_dicom.pyrg   rg   e   ó   „ Ørm   rg   c                   ó   — e Zd Zy)ÚCompressedDicomNrh   rl   rm   rn   rq   rq   i   ro   rm   rq   c                   ó|   — e Zd ZdZd„ Zed„ «       Zd„ Zd„ Zd„ Z	d„ Z
d„ Zd	„ Zdd
„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚSimpleDicomReadera@  
    This class provides reading of pixel data from DICOM files. It is
    focussed on getting the pixel data, not the meta info.

    To use, first create an instance of this class (giving it
    a file object or filename). Next use the info attribute to
    get a dict of the meta data. The loading of pixel data is
    deferred until get_numpy_array() is called.

    Comparison with Pydicom
    -----------------------

    This code focusses on getting the pixel data out, which allows some
    shortcuts, resulting in the code being much smaller.

    Since the processing of data elements is much cheaper (it skips a lot
    of tags), this code is about 3x faster than pydicom (except for the
    deflated DICOM files).

    This class does borrow some code (and ideas) from the pydicom
    project, and (to the best of our knowledge) has the same limitations
    as pydicom with regard to the type of files that it can handle.

    Limitations
    -----------

    For more advanced DICOM processing, please check out pydicom.

      * Only a predefined subset of data elements (meta information) is read.
      * This is a reader; it can not write DICOM files.
      * (just like pydicom) it can handle none of the compressed DICOM
        formats except for "Deflated Explicit VR Little Endian"
        (1.2.840.10008.1.2.1.99).

    c                 ó*  ‡ — t        |t        «      r|‰ _        t        |d«      ‰ _        nd‰ _        |‰ _        d ‰ _        d‰ _        d‰ _        d‰ _        i ‰ _	        ˆ fd„ˆ fd„ˆ fd„ˆ fd	„d
„ d„ d„ d„ d„ ˆ fd„d„ dœ‰ _
        ‰ j                  «        y )NÚrbz<unknown file>FTú<c                 ó(   •— ‰j                  d| «      S )NÚH©Ú_unpack©ÚxÚselfs    €rn   ú<lambda>z,SimpleDicomReader.__init__.<locals>.<lambda>¥   ó   ø€ ˜DŸL™L¨¨aÓ0€ rm   c                 ó(   •— ‰j                  d| «      S )NÚLry   r{   s    €rn   r~   z,SimpleDicomReader.__init__.<locals>.<lambda>¦   r   rm   c                 ó2   •— ‰j                  | t        d«      S ©Nú\©Ú_splitValuesÚfloatr{   s    €rn   r~   z,SimpleDicomReader.__init__.<locals>.<lambda>¨   ó   ø€ ˜D×-Ñ-¨a´¸Ó=€ rm   c                 ó2   •— ‰j                  | t        d«      S rƒ   )r†   Úintr{   s    €rn   r~   z,SimpleDicomReader.__init__.<locals>.<lambda>©   s   ø€ ˜D×-Ñ-¨a´°dÓ;€ rm   c                 óD   — | j                  dd«      j                  d«      S ©NÚasciiÚignoreú ©ÚdecodeÚstrip©r|   s    rn   r~   z,SimpleDicomReader.__init__.<locals>.<lambda>«   ó   € ˜AŸH™H W¨hÓ7×=Ñ=¸fÓE€ rm   c                 óD   — | j                  dd«      j                  d«      S rŒ   r�   r“   s    rn   r~   z,SimpleDicomReader.__init__.<locals>.<lambda>¬   r”   rm   c                 óD   — | j                  dd«      j                  d«      S rŒ   r�   r“   s    rn   r~   z,SimpleDicomReader.__init__.<locals>.<lambda>­   r”   rm   c                 óD   — | j                  dd«      j                  d«      S rŒ   r�   r“   s    rn   r~   z,SimpleDicomReader.__init__.<locals>.<lambda>®   r”   rm   c                 ó`   — | j                  dd«      j                  d«      j                  «       S ©Nzutf-8rŽ   r�   ©r‘   r’   Úrstripr“   s    rn   r~   z,SimpleDicomReader.__init__.<locals>.<lambda>¯   ó%   € ˜AŸH™H W¨hÓ7×=Ñ=¸fÓE×LÑLÓN€ rm   c                 ó2   •— ‰j                  | t        d«      S rƒ   r…   r{   s    €rn   r~   z,SimpleDicomReader.__init__.<locals>.<lambda>°   rˆ   rm   c                 ó`   — | j                  dd«      j                  d«      j                  «       S r™   rš   r“   s    rn   r~   z,SimpleDicomReader.__init__.<locals>.<lambda>±   rœ   rm   )rV   ÚULrQ   r2   rO   r   r   r(   r    r   rI   )Ú
isinstanceÚstrÚ	_filenameÚopenÚ_fileÚ_pixel_data_locÚis_implicit_VRÚis_little_endianÚ_unpackPrefixÚ_infoÚ_convertersÚ_read)r}   Úfiles   ` rn   Ú__init__zSimpleDicomReader.__init__’   s�   ø€ ä�dœCÔ Ø!ˆDŒNÜ˜d DÓ)ˆD�Jà-ˆDŒNØˆDŒJà#ˆÔà#ˆÔØ $ˆÔØ ˆÔàˆŒ
ó 1Û0ã=Û;áEÙEÙEÙEÙNÛ=ÙNñ
ˆÔð$ 	�
‰
�rm   c                 ó   — | j                   S ©N©r©   ©r}   s    rn   ÚinfozSimpleDicomReader.info·   ó   € à�z‰zÐrm   c                 ó  — |j                  d«      j                  d«      }	 ||v r?t        |j                  |«      D �cg c]  }|j                  «       sŒ ||«      ‘Œ c}«      S  ||«      S c c}w # t        $ r |cY S w xY w)Nr�   r�   )r‘   r’   ÚtupleÚsplitÚ
ValueError)r}   r|   ÚtypeÚsplitterÚsÚvs         rn   r†   zSimpleDicomReader._splitValues»   sw   € Ø�H‰H�WÓ×#Ñ# FÓ+ˆð	Ø˜1‰}Ü¨q¯w©w°xÓ/@ÖN¨!ÀAÇGÁGÅI™d 1�gÒNÓOÐOá˜A“w�ùò Oøô ò 	ØŠHð	ús.   ¢A2 ¾A-Á
A-ÁA2 Á%A2 Á-A2 Á2B Á?B c                 óN   — t        j                  | j                  |z   |«      d   S )Nr   )ÚstructÚunpackr¨   )r}   ÚfmtÚvalues      rn   rz   zSimpleDicomReader._unpackÅ   s#   € Ü�}‰}˜T×/Ñ/°#Ñ5°uÓ=¸aÑ@Ð@rm   c                 óH   — t        | j                  j                  «       «      S r¯   )Úiterr©   Úkeysr±   s    rn   Ú__iter__zSimpleDicomReader.__iter__É   s   € Ü�D—J‘J—O‘OÓ%Ó&Ð&rm   c                 ól   — t         j                  | d«      }||v r||   S t         j                  | |«      S )Nr©   )ÚobjectÚ__getattribute__)r}   Úkeyr²   s      rn   Ú__getattr__zSimpleDicomReader.__getattr__Ì   s8   € Ü×&Ñ& t¨WÓ5ˆØ�$‰;Ø˜‘9ÐÜ×&Ñ& t¨SÓ1Ð1rm   c                 ór  — | j                   }|j                  d«       |j                  d«      dk7  rt        d«      ‚| j	                  «        | j                  «        | j                  «        t        j                  j                  | j                  «      r"| j                   j                  «        d | _         y y )Nr!   é   s   DICMzNot a valid DICOM file.)r¤   ÚseekÚreadrg   Ú_read_headerÚ_read_data_elementsÚ_get_shape_and_samplingÚosÚpathÚisfiler¢   Úclose)r}   Úfs     rn   r«   zSimpleDicomReader._readÒ   s†   € Ø�J‰Jˆà	�‰ˆsŒØ�6‰6�!‹9˜ÒÜÐ 9Ó:Ð:à×ÑÔØ× Ñ Ô"Ø×$Ñ$Ô&ä�7‰7�>‰>˜$Ÿ.™.Ô)Ø�J‰J×ÑÔØˆD�Jð *rm   c                 óœ  — | j                   }| j                  d|j                  d«      «      }| j                  d|j                  d«      «      }| j                  r"| j                  d|j                  d«      «      }ni|j                  d«      }|dv r3|j                  d«      }| j                  d|j                  d«      «      }n!| j                  d|j                  d«      «      }|dk(  r7|dk(  r2|j	                  «       }||f| _        |j                  ||z   «       ||dfS |d	k(  r| j                  «       }n|j                  |«      }|||fS )
Nrx   rT   ÚIrË   )s   OBs   OWs   SQs   UNr   r   s   Deferred loading of pixel dataì   ÿÿ )r¤   rz   rÍ   r¦   Útellr¥   rÌ   Ú_read_undefined_length_value)	r}   rÕ   ÚgroupÚelementÚvlÚvrÚreservedÚhererÀ   s	            rn   Ú_readDataElementz"SimpleDicomReader._readDataElementá   s"  € Ø�J‰Jˆà—‘˜S !§&¡&¨£)Ó,ˆØ—,‘,˜s A§F¡F¨1£IÓ.ˆà×ÒØ—‘˜c 1§6¡6¨!£9Ó-‰Bà—‘˜“ˆBØÐ1Ñ1ØŸ6™6 !›9�Ø—\‘\ # q§v¡v¨a£yÓ1‘à—\‘\ # q§v¡v¨a£yÓ1�à�FŠ?˜w¨&Ò0Ø—6‘6“8ˆDØ#'¨ 8ˆDÔ Ø�F‰F�4˜"‘9ÔØ˜'Ð#DÐDÐDà�ZÒØ×9Ñ9Ó;‘àŸ™˜r›
�Ø˜' 5Ð(Ð(rm   c                 óÚ  — | j                   }d}t        j                  | j                  dz   t        d   t        d   «      }d}g }|�s|j                  «       }|j                  |«      }t        |«      |k  r;|j                  |t        |«      z
  «      }	||	z  }t        |«      |k  rt        d«      ‚|j                  |«      }
|
dk7  rYd}|j                  |d	|
 «       |j                  ||
z   d
z   «       |j                  d
«      }|dk7  rMt        j                  d«       n7|j                  |j                  «       |z
  «       |j                  |d	|  «       |s�Œdj                  |«      S )zOCopied (in compacted form) from PyDicom
        Copyright Darcy Mason.
        é   ÚHHr   re   Fz4End of file reached before sequence delimiter found.éÿÿÿÿTNrË   s       z6Expected 4 zero bytes after undefined length delimiterrm   )r¤   r½   Úpackr¨   ÚSequenceDelimiterTagrÙ   rÍ   ÚlenÚEOFErrorÚfindÚappendrÌ   ÚloggerÚwarningÚjoin)r}   Ú	read_sizeÚfpÚsearch_rewindÚbytes_to_findÚfoundÚvalue_chunksÚchunk_startÚ
bytes_readÚ	new_bytesÚindexÚlengths               rn   rÚ   z.SimpleDicomReader._read_undefined_length_valueý   sc  € ð �Z‰ZˆàˆÜŸ™Ø×Ñ Ñ%Ô';¸AÑ'>Ô@TÐUVÑ@Wó
ˆð ˆØˆÚØŸ'™'›)ˆKØŸ™ Ó+ˆJÜ�:‹ Ò*ð ŸG™G I´°J³Ñ$?Ó@�	Ø˜iÑ'�
Ü�z“? YÒ.Ü"ØQóð ð —O‘O MÓ2ˆEØ˜Š{Ø�Ø×#Ñ# J¨v°Ð$6Ô7Ø—‘˜ eÑ+¨aÑ/Ô0ØŸ™ ›�Ø˜[Ò(Ü—N‘NØSõð —‘˜Ÿ™›	 MÑ1Ô2à×#Ñ# J¨°°Ð$?Ô@ó3 ð8 �x‰x˜Ó%Ð%rm   c                 ó   — | j                   }d }	 	 |j                  «       }| j                  «       \  }}}|dk(  r+|dk(  r8|dk(  r3|j                  d«      j	                  d«      }n|j                  |«       nŒg	 || j                  d<   |€d\  }}n|dk(  rd\  }}nt|d	k(  rd
\  }}ni|dk(  rd\  }}n^|dk(  rd\  }}| j                  «        nC|d}
}	d|	cxk  rdk  rn nd}
d|	cxk  rdk  rn nd}
|	dk(  rd}
|	dk(  rd}
t        d|	›|
›d�«      ‚|| _        || _        d|   | _        y # t        t        j                  f$ r t        d«      ‚w xY w)NrT   r   r�   r�   z*End of file reached while still in header.ÚTransferSyntaxUID)FTz1.2.840.10008.1.2.1z1.2.840.10008.1.2.2©FFz1.2.840.10008.1.2)TTz1.2.840.10008.1.2.1.99Ú z1.2.840.10008.1.2.4.50z1.2.840.10008.1.2.4.99z (JPEG)z1.2.840.10008.1.2.4.90z (JPEG 2000)z1.2.840.10008.1.2.5z (RLE)z1.2.840.10008.1.2.6.1z (RFC 2557)zHThe dicom reader can only read files with uncompressed image data - not z7. You can try using dcmtk or gdcm to convert the image.z><)r¤   rÙ   rá   r‘   r’   rÌ   ré   r½   ÚerrorÚRuntimeErrorr©   Ú_inflaterq   r¦   r§   r¨   )r}   rÕ   rû   Úfp_saverÛ   rÜ   rÀ   r¦   r§   ÚtÚ
extra_infos              rn   rÎ   zSimpleDicomReader._read_header(  s¬  € Ø�J‰JˆØ Ðð	MØØŸ&™&›(�à(,×(=Ñ(=Ó(?Ñ%��w Ø˜D’=Ø ’}¨°DªØ,1¯L©L¸Ó,A×,GÑ,GÈÓ,OÑ)ð —F‘F˜7”OØð ð ð
 +<ˆ�
‰
Ð&Ñ'àÐ$à/:Ñ,ˆNÑ,ØÐ"7Ò7à/:Ñ,ˆNÑ,ØÐ"7Ò7à/;Ñ,ˆNÑ,ØÐ"5Ò5à/9Ñ,ˆNÑ,ØÐ":Ò:à/:Ñ,ˆNÐ,Ø�M‰M�Oð .¨rˆzˆAØ'¨1ÔGÐ/GÕGØ&�
Ø'¨1ÔGÐ/GÕGØ+�
ØÐ)Ò)Ø%�
ØÐ+Ò+Ø*�
Ý!ñ šzð+óð ð -ˆÔØ 0ˆÔØ!Ð"2Ñ3ˆÕøôW œ&Ÿ,™,Ð'ò 	MÜÐKÓLÐLð	Mús   �A(D( Ä(%Ec                 ó$  — | j                   }	 	 | j                  «       \  }}}|t        v rG||f}t        j	                  |d«      \  }}|r(| j
                  j	                  |d„ «      } ||«      ||<   Œd# t        t        j                  f$ r Y y w xY w)N)NNc                 ó   — | S r¯   rl   r“   s    rn   r~   z7SimpleDicomReader._read_data_elements.<locals>.<lambda>t  s   € Àq€ rm   )	r©   rá   ÚGROUPSÚMINIDICTÚgetrª   ré   r½   rþ   )	r}   r²   rÛ   rÜ   rÀ   rÈ   ÚnamerÞ   Ú	converters	            rn   rÏ   z%SimpleDicomReader._read_data_elementsg  s˜   € Ø�z‰zˆð	Øà(,×(=Ñ(=Ó(?Ñ%��w àœF‘?Ø  'Ð*�CÜ'Ÿ|™|¨C°Ó>‘H�D˜"áà$(×$4Ñ$4×$8Ñ$8¸¹[Ó$I˜	Ù%.¨uÓ%5˜˜T™
ð øô œ&Ÿ,™,Ð'ò 	Ùð	ús   ŽA%A3 Á3BÂBc                 ól  — d| vrt        d«      ‚| j                  rèt        | j                  «      dk  rÐd}| j                  €d}t        | j                  d«      | _        | j                  j                  | j                  d   «       | j                  d	   d
k(  r| j                  «       }n(| j                  j                  | j                  d	   «      }|r!| j                  j                  «        d| _        || j                  d<   | j                  «       }| j                  |«      }d| j                  d<   |S )zsGet numpy arra for this DICOM file, with the correct shape,
        and pixel values scaled appropriately.
        r   ú$No pixel data found in this dataset.éd   FNTru   r   re   rØ   sB   Data converted to numpy array, raw data removed to preserve memory)Ú	TypeErrorr¥   rè   r   r¤   r£   r¢   rÌ   rÚ   rÍ   rÔ   r©   Ú_pixel_data_numpyÚ_apply_slope_and_offset)r}   Ú
close_filerÀ   Údatas       rn   Úget_numpy_arrayz!SimpleDicomReader.get_numpy_arrayy  s  € ð
 ˜dÑ"ÜÐBÓCÐCð ×Ò¤C¨¯©Ó$7¸#Ò$=àˆJØ�z‰zÐ!Ø!�
Ü! $§.¡.°$Ó7�”
à�J‰J�O‰O˜D×0Ñ0°Ñ3Ô4Ø×#Ñ# AÑ&¨*Ò4Ø×9Ñ9Ó;‘àŸ
™
Ÿ™¨×(<Ñ(<¸QÑ(?Ó@�áØ—
‘
× Ñ Ô"Ø!�”
à&+ˆD�J‰J�{Ñ#ð ×%Ñ%Ó'ˆØ×+Ñ+¨DÓ1ˆð
 Xð 	�
‰
�;Ñð ˆrm   c                 ó  — d| v rq| j                   dkD  rb| j                  dkD  r/| j                  | j                   | j                  | j                  f}n™| j                   | j                  | j                  f}nud| v rf| j                  dkD  r>| j                  dk(  r$| j                  | j                  | j                  f}n/t        d«      ‚| j                  | j                  f}nt        d«      ‚d| v r1t        | j                  d   «      t        | j                  d   «      f}nd	}d
| v rt        | j                  «      f|z   }dt        |«      t        |«      z
  z  |t        |«       d z   }|| j                  d<   || j                  d<   y)z¤Get shape and sampling without actuall using the pixel data.
        In this way, the user can get an idea what's inside without having
        to load it.
        rW   re   rU   r   zCDICOM plugin only handles SamplesPerPixel > 1 if Bits Allocated = 8z=DICOM file has no SamplesPerPixel (perhaps this is a report?)ra   r   )ç      ð?r  rc   )r  NÚshapeÚsampling)rW   rU   r]   r^   rY   ÚNotImplementedErrorrÿ   r‡   ra   Úabsrc   rè   r©   )r}   r  r  s      rn   rÐ   z)SimpleDicomReader._get_shape_and_sampling   s€  € ð ˜tÑ#¨×(;Ñ(;¸aÒ(?Ø×#Ñ# aÒ'à×(Ñ(Ø×'Ñ'Ø—I‘IØ—L‘Lð	‘ð ×+Ñ+¨T¯Y©Y¸¿¹ÐD‘Ø $Ñ&Ø×#Ñ# aÒ'Ø×%Ñ%¨Ò*Ø ×0Ñ0°$·)±)¸T¿\¹\ÐI‘Eä-ð(óð ð Ÿ	™	 4§<¡<Ð/‘äØRóð ð
 ˜TÑ!Ü˜T×.Ñ.¨qÑ1Ó2´E¸$×:KÑ:KÈAÑ:NÓ4OÐO‰HàˆHØ˜TÑ!Ü˜D×-Ñ-Ó.Ð0°8Ñ;ˆHð œS ›Z¬#¨h«-Ñ7Ñ8¸8ÄSÈÃZÀKÀMÐ;RÑRˆð $ˆ�
‰
�7ÑØ!)ˆ�
‰
�:Òrm   c                 óÐ  — d| vrt        d«      ‚| j                  t        k7  }dd| j                     | j                  fz  }	 t        j                  |«      }t        j                  | j                  |«      j                  «       }|r|j                  d«        |j                  | j                  d   Ž }|S # t         $ r& t        d| j                  | j                  fz  «      ‚w xY w)z'Return a NumPy array of the pixel data.r   r  z%sint%d)Úurý   zYData type not understood by NumPy: format='%s',  PixelRepresentation=%d, BitsAllocated=%dTr  )r  r§   Úsys_is_little_endianr\   rY   ÚnpÚdtypeÚ
frombufferr   ÚcopyÚbyteswapÚreshaper©   )r}   Úneed_byteswapÚ
format_strÚnumpy_formatÚarrs        rn   r  z#SimpleDicomReader._pixel_data_numpyÐ  sõ   € ð
 ˜dÑ"ÜÐBÓCÐCð ×-Ñ-Ô1EÑEˆð Ø�d×.Ñ.Ñ/Ø×Ñð"
ñ 
ˆ
ð	ÜŸ8™8 JÓ/ˆLô �m‰m˜DŸN™N¨LÓ9×>Ñ>Ó@ˆñ Ø�L‰L˜Ôð ˆc�k‰k˜4Ÿ:™: gÑ.Ð/ˆØˆ
øô# ò 	Üð<à ×!9Ñ!9¸4×;MÑ;MÐNñOóð ð	ús   ÁB6 Â6/C%c                 ó  — d\  }}d\  }}d| v rd}| j                   }d| v rd}| j                  }t        |«      |k7  st        |«      |k7  rd}|st        |«      t        |«      }}|�r¥|j                  t        j
                  t        j                  fv r�nm|r!|j                  t        j
                  «      }�nJ|j                  «       j                  «       |j                  «       j                  «       }}t        |||z  |z   ||z  |z   g«      }t        |||z  |z   ||z  |z   g«      }d}|dk  rat        | |g«      }|dk  rt        j                  }n�|d	k  rt        j                  }ny|d
k  rt        j                  }nct        j
                  }nR|dk  rt        j                  }n<|dk  rt        j                  }n&|dk  rt        j                  }nt        j
                  }||j                  k7  r|j                  |«      }||z  }||z  }|S )z–
        If RescaleSlope and RescaleIntercept are present in the data,
        apply them. The data type of the data is changed if necessary.
        )re   r   rü   r`   Tr_   Nr   r!   i €  l        rX   i   l        )r`   r_   rŠ   r  r  Úfloat32Úfloat64ÚastypeÚminÚitemÚmaxÚint8Úint16Úint32)	r}   r  ÚslopeÚoffsetÚ
needFloatsÚneedApplySlopeOffsetÚminReqÚmaxReqr  s	            rn   r  z)SimpleDicomReader._apply_slope_and_offsetø  så  € ð ‰ˆˆvØ+7Ñ(ˆ
Ð(Ø˜TÑ!Ø#'Ð Ø×%Ñ%ˆEØ Ñ%Ø#'Ð Ø×*Ñ*ˆFÜˆu‹:˜Ò¤# f£+°Ò"7ØˆJÙÜ ›J¬¨F«�6ˆEò  à�z‰zœbŸj™j¬"¯*©*Ð5Ñ5ÙÙØ—{‘{¤2§:¡:Ó.’ð "&§¡£§¡Ó!2°D·H±H³J·O±OÓ4E˜�Ü˜f f¨u¡n°vÑ&=¸vÈ¹~ÐPVÑ?VÐWÓX�Ü˜f f¨u¡n°vÑ&=¸vÈ¹~ÐPVÑ?VÐWÓX�ð �Ø˜A’:ä  6 '¨6Ð!2Ó3�FØ ’}Ü "§¡™Ø %šÜ "§¡™Ø %šÜ "§¡™ä "§
¡
™ð  ’}Ü "§¡™Ø %šÜ "§¡™Ø %šÜ "§¡™ä "§
¡
˜à˜DŸJ™JÒ&ØŸ;™; uÓ-�Dð �E‰MˆDØ�F‰NˆDð ˆrm   c                 ó    — dd l }ddlm} | j                  j	                  «       }|j                  ||j                   «      } ||«      | _        y )Nr   )ÚBytesIO)ÚzlibÚior8  r¤   rÍ   Ú
decompressÚ	MAX_WBITS)r}   r9  r8  ÚzippedÚunzippeds        rn   r   zSimpleDicomReader._inflate:  s@   € ó 	Ýð —‘—‘Ó"ˆð —?‘? 6¨D¯N©N¨?Ó;ˆÙ˜XÓ&ˆ�
rm   N)r!   )ri   rj   rk   Ú__doc__r­   Úpropertyr²   r†   rz   rÄ   rÉ   r«   rá   rÚ   rÎ   rÏ   r  rÐ   r  r  r   rl   rm   rn   rs   rs   m   sp   „ ñ"òH#ðJ ñó ðòòAò'ò2òò)ó8)&òV=4ò~ò$%òN.*ò`&òP@óD'rm   rs   c                   ó–   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zed„ «       Z	ed„ «       Z
ed„ «       Zed	„ «       Zed
„ «       Zd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚDicomSerieszÔDicomSeries
    This class represents a serie of dicom files (SimpleDicomReader
    objects) that belong together. If these are multiple files, they
    represent the slices of a volume (like for CT or MRI).
    c                 ó<   — g | _         || _        i | _        || _        y r¯   )Ú_entriesÚ_suidr©   Ú_progressIndicator)r}   ÚsuidÚprogressIndicators      rn   r­   zDicomSeries.__init__S  s!   € àˆŒð ˆŒ
ØˆŒ
Ø"3ˆÕrm   c                 ó,   — t        | j                  «      S r¯   )rè   rD  r±   s    rn   Ú__len__zDicomSeries.__len__\  s   € Ü�4—=‘=Ó!Ð!rm   c                 ó,   — t        | j                  «      S r¯   )rÂ   rD  r±   s    rn   rÄ   zDicomSeries.__iter___  s   € Ü�D—M‘MÓ"Ð"rm   c                 ó    — | j                   |   S r¯   )rD  )r}   rø   s     rn   Ú__getitem__zDicomSeries.__getitem__b  s   € Ø�}‰}˜UÑ#Ð#rm   c                 ó   — | j                   S r¯   )rE  r±   s    rn   rG  zDicomSeries.suide  r³   rm   c                 ó    — | j                   d   S )z#The shape of the data (nz, ny, nx).r  r°   r±   s    rn   r  zDicomSeries.shapei  s   € ð �z‰z˜'Ñ"Ð"rm   c                 ó    — | j                   d   S )z8The sampling (voxel distances) of the data (dz, dy, dx).r  r°   r±   s    rn   r  zDicomSeries.samplingn  s   € ð �z‰z˜*Ñ%Ð%rm   c                 ó   — | j                   S )z~A dictionary containing the information as present in the
        first dicomfile of this serie. None if there are no entries.r°   r±   s    rn   r²   zDicomSeries.infos  s   € ð �z‰zÐrm   c                 ó´  — | j                   }|sdt        | «      z  S g }d|v r|j                  d|d   z   «       | j                  rB| j                  D �cg c]  }t	        |«      ‘Œ }}|j                  dj                  |«      «       d|v r|j                  d|d   z   dz   «       d|v r|j                  d|d   z   dz   «       dj                  |«      S c c}w )	z‘A description of the dicom series. Used fields are
        PatientName, shape of the data, SeriesDescription, and
        ImageComments.
        z DicomSeries containing %i imagesrH   rý   r|   r%   ú'ÚImageCommentsú )r²   rè   rë   r  r¡   rî   )r}   r²   ÚfieldsÚdÚtmps        rn   ÚdescriptionzDicomSeries.descriptiony  s×   € ð �y‰yˆñ Ø5¼¸D»	ÑAÐAàˆà˜DÑ Ø�M‰M˜"˜t MÑ2Ñ2Ô3à�:Š:Ø#'§:¡:Ö.˜a”3�q•6Ð.ˆCÐ.Ø�M‰M˜#Ÿ(™( 3›-Ô(à $Ñ&Ø�M‰M˜# Ð%8Ñ 9Ñ9¸CÑ?Ô@Ø˜dÑ"Ø�M‰M˜#  _Ñ 5Ñ5¸Ñ;Ô<ð �x‰x˜ÓÐùò /s   ÁCc                 óf   — t        t        | «      «      j                  «       }dt        | «      |fz  S )Nz"<DicomSeries with %i images at %s>)ÚhexÚidÚupperrè   )r}   Úadrs     rn   Ú__repr__zDicomSeries.__repr__–  s,   € Ü”"�T“(‹m×!Ñ!Ó#ˆØ3´s¸4³yÀ#Ð6FÑFÐFrm   c                 ór  — t        | «      dk(  rt        d«      ‚t        | «      dk(  r| d   j                  «       S | j                  €t	        d«      ‚| d   j                  «       }t        j                  | j                  |j                  ¬«      }||d<   | j                  j                  ddt        | «      «       t        dt        | «      «      D ]6  }| |   j                  «       ||<   | j                  j                  |dz   «       Œ8 | j                  j                  «        ddl}|j                  «        |S )	zÄGet (load) the data that this DicomSeries represents, and return
        it as a numpy array. If this serie contains multiple images, the
        resulting array is 3D, otherwise it's 2D.
        r   z!Serie does not contain any files.re   Nz,Cannot return volume if series not finished.)r  zloading datarý   )rè   r·   r  r²   rÿ   r  Úzerosr  r  rF  ÚstartÚrangeÚset_progressÚfinishÚgcÚcollect)r}   ÚsliceÚvolÚzrf  s        rn   r  zDicomSeries.get_numpy_arrayš  s  € ô ˆt‹9˜Š>ÜÐ@ÓAÐAÜ�‹Y˜!Š^Ø˜‘7×*Ñ*Ó,Ð,ð �9‰9ÐÜÐMÓNÐNð �Q‘×'Ñ'Ó)ˆÜ�h‰h�t—z‘z¨¯©Ô5ˆØˆˆA‰ð 	×Ñ×%Ñ% n°b¼#¸d»)ÔDÜ�qœ#˜d›)Ó$ò 	8ˆAØ˜!‘W×,Ñ,Ó.ˆC�‰FØ×#Ñ#×0Ñ0°°Q±Õ7ð	8ð 	×Ñ×&Ñ&Ô(ó 	à
�
‰
ŒØˆ
rm   c                 ó:   — | j                   j                  |«       y r¯   )rD  rë   )r}   Údcms     rn   Ú_appendzDicomSeries._append¼  s   € Ø�‰×Ñ˜SÕ!rm   c                 ó>   — | j                   j                  d„ ¬«       y )Nc                 óV   — | j                   t        | d«      r| j                  d   fS d fS )NrC   rT   )r6   ÚhasattrrC   )Úks    rn   r~   z#DicomSeries._sort.<locals>.<lambda>Á  s;   € Ø× Ñ ô ˜qÐ"8Ô9ð ×*Ñ*¨1Ñ-ð€ ð
 ð€ rm   ©rÈ   )rD  Úsortr±   s    rn   Ú_sortzDicomSeries._sort¿  s   € Ø�‰×Ññð 	õ 		
rm   c                 óP  — | j                   }t        |«      dk(  ryt        |«      dk(  r|d   j                  | _        y|d   }d}|j                  |j
                  f}|j                  d   dd }t        t        |«      «      D ]¤  }||   }t        |j                  d   «      }t        |j                  d   «      }	|t        ||	z
  «      z  }|j                  |j
                  f}
|j                  d   dd }||
k7  rt        d«      ‚||k7  r| j                  j                  d«       |}Œ¦ |t        |«      dz
  z  }|d   j                  j                  «       | _        t        |«      fj                  d	   z   | j                  d	<   |f|j                  d   z   | j                  d<   y)
a  
        Evaluate the series of dicom files. Together they should make up
        a volumetric dataset. This means the files should meet certain
        conditions. Also some additional information has to be calculated,
        such as the distance between the slices. This method sets the
        attributes for "shape", "sampling" and "info".

        This method checks:
          * that there are no missing files
          * that the dimensions of all images match
          * that the pixel spacing of all images match
        r   Nre   g        r  rT   z$Dimensions of slices does not match.zWarn: sampling does not match.r  )rD  rè   r²   r©   r]   r^   rc  r‡   rC   r  r·   rF  Úwriter   )r}   r�   Úds1Údistance_sumÚ
dimensionsr  rø   Úds2Úpos1Úpos2Údimensions2Ú	sampling2Údistance_means                rn   Ú_finishzDicomSeries._finishË  sš  € ð �M‰MˆÜˆq‹6�QŠ;ØÜ�‹V�qŠ[Ø˜1™Ÿ™ˆDŒJØð �‰dˆàˆà—X‘X˜sŸ{™{Ð*ˆ
à—8‘8˜JÑ'¨¨Ð+ˆäœ3˜q›6“]ò 	ˆEð �E‘(ˆCä˜×1Ñ1°!Ñ4Ó5ˆDÜ˜×1Ñ1°!Ñ4Ó5ˆDàœC  t¡Ó,Ñ,ˆLàŸ(™( C§K¡KÐ/ˆKàŸ™ Ñ,¨R¨aÐ0ˆIØ˜[Ò(ä Ð!GÓHÐHØ˜9Ò$à×'Ñ'×-Ñ-Ð.NÔOà‰Cð+	ð2 %¬¨A«°©
Ñ3ˆð �q‘T—Y‘Y—^‘^Ó%ˆŒ
ô  # 1›v˜i¨#¯(©(°7Ñ*;Ñ;ˆ�
‰
�7ÑØ"/Ð!1°C·H±H¸ZÑ4HÑ!Hˆ�
‰
�:Òrm   N)ri   rj   rk   r?  r­   rJ  rÄ   rM  r@  rG  r  r  r²   rY  r_  r  rm  rt  r€  rl   rm   rn   rB  rB  L  s›   „ ñò4ò"ò#ò$ð ñó ðð ñ#ó ð#ð ñ&ó ð&ð ñó ðð
 ñ ó ð ò8Gò òD"ò

ó?Irm   rB  c                 ó2  — t        j                  |«      D ]  }t         j                  j                  ||«      }t         j                  j	                  |«      rt        | |«       ŒOt         j                  j                  |«      sŒo| j                  |«       Œ� y)z-List all files in the directory, recursively.N)rÑ   ÚlistdirrÒ   rî   ÚisdirÚ
list_filesrÓ   rë   )ÚfilesrÒ   r,  s      rn   r„  r„    sd   € ä—
‘
˜4Ó ò ˆÜ�w‰w�|‰|˜D $Ó'ˆÜ�7‰7�=‰=˜ÔÜ�u˜dÕ#Ü�W‰W�^‰^˜DÕ!Ø�L‰L˜Õñrm   c                 óØ  — t         j                  j                  | j                  «      r| j                  }n^t         j                  j	                  | j                  «      r*t         j                  j                  | j                  «      }nt        d«      ‚g }t        ||«       i }d}|j                  ddt        |«      «       |D ]j  }|dz  }|j                  |«       |j                  d«      rŒ+	 t        |«      }	 |j"                  }
|
|vrt'        |
|«      ||
<   ||
   j)                  |«       Œl t+        |j-                  «       «      }|j/                  d„ ¬	«       t1        |D �cg c]  }|‘Œ c}«      D ]  }t3        |||«       Œ g }t5        t        |«      «      D ]*  }	 ||   j7                  «        |j9                  ||   «       Œ, |j;                  d
t        |«      z  «       |S # t        $ r Y �Œ2t        $ r%}	|j                  t!        |	«      «       Y d}	~	�ŒZd}	~	ww xY w# t$        $ r Y �Œnw xY wc c}w # t        $ r$}|j                  t!        |«      «       Y d}~ŒÅd}~ww xY w)a¢  
    Reads dicom files and returns a list of DicomSeries objects, which
    contain information about the data, and can be used to load the
    image or volume data.

    if readPixelData is True, the pixel data of all series is read. By
    default the loading of pixeldata is deferred until it is requested
    using the DicomSeries.get_pixel_array() method. In general, both
    methods should be equally fast.
    z<Dicom plugin needs a valid filename to examine the directoryr   zexamining filesr…  re   ÚDICOMDIRNc                 ó   — | j                   S r¯   )rG  r“   s    rn   r~   z#process_directory.<locals>.<lambda>O  s
   € ˜aŸf™f€ rm   rr  zFound %i correct series.)rÑ   rÒ   rƒ  ÚfilenamerÓ   Údirnamer·   r„  rb  rè   rd  Úcountrs   rg   Ú	Exceptionrv  r¡   r.   ÚAttributeErrorrB  rm  ÚlistÚvaluesrs  ÚreversedÚsplitSerieIfRequiredrc  r€  rë   re  )ÚrequestrH  ÚreadPixelDatarÒ   r…  Úseriesr‹  r‰  rl  ÚwhyrG  ÚserieÚseries_ÚiÚerrs                  rn   Úprocess_directoryrš    s9  € ô 
‡w�w‡}�}�W×%Ñ%Ô&Ø×Ñ‰Ü	�‰�‰˜×(Ñ(Ô	)Ü�w‰w�‰˜w×/Ñ/Ó0‰äÐWÓXÐXð €EÜˆu�dÔð €FØ€EØ×ÑÐ-¨w¼¸E»
ÔCØò "ˆà�‰
ˆØ×&Ñ& uÔ-à�>‰>˜*Ô%Øð	Ü# HÓ-ˆCð	Ø×(Ñ(ˆDð �vÑÜ& tÐ->Ó?ˆF�4‰LØˆt‰×Ñ˜SÕ!ð-"ô8 �&—-‘-“/Ó"€FØ
‡K�KÑ$€KÔ%ô ¨fÖ5 Uš5Ò5Ó6ò ?ˆÜ˜U FÐ,=Õ>ð?ð
 €GÜ”3�v“;Óò ˆð	Ø�1‰I×ÑÔØ�N‰N˜6 !™9Õ%ðð ×ÑÐ7¼#¸g»,ÑFÔGð €NøôO ò 	ÚÜò 	Ø×#Ñ#¤C¨£HÔ-Ýûð	ûô ò 	Úð	üò 6øô ò 	Ø×#Ñ#¤C¨£HÔ-Üûð	úsN   Ã1G+Ã=H'Å'	H7Æ#'H<Ç+	H$Ç7H$Ç?HÈH$È'	H4È3H4È<	I)ÉI$É$I)c                 óæ  — | j                  «        | j                  }|d   }d|vry|gg}d}t        dt        |«      «      D ]£  }||   }t	        |j
                  d   «      }	t	        |j
                  d   «      }
t        |	|
z
  «      }|r|d|z  kD  r|j                  g «       d}n*|r&|d|z  kD  r|j                  d|j                  z  «       |}|d	   j                  |«       |}Œ¥ t        |«      dkD  r||j                  | «      }g }|D ]0  }t        | j                  |«      }||_        |j                  |«       Œ2 t        |«      D ]  }|j                  ||«       Œ |j                  | «       yy)
a  
    Split the serie in multiple series if this is required. The choice
    is based on examing the image position relative to the previous
    image. If it differs too much, it is assumed that there is a new
    dataset. This can happen for example in unspitted gated CT data.
    r   rC   Nre   rT   gÍÌÌÌÌÌ @g      ø?zWarning: missing file after %rrå   )rt  rD  rc  rè   r‡   rC   r  rë   rv  r¢   rø   rB  rG  r�  ÚinsertÚremove)r–  r”  rH  r�   rw  ÚL2Údistancerø   rz  r{  r|  ÚnewDistr˜  Úseries2insertÚnewSeries                  rn   r‘  r‘  f  s„  € ð 
‡K�K„MØ�‰€Aà
ˆA‰$€Cà SÑ(Øàˆ%ˆ€Bà€Hä�qœ#˜a›&Ó!ò ˆà�‰hˆä�S×-Ñ-¨aÑ0Ó1ˆÜ�S×-Ñ-¨aÑ0Ó1ˆä�d˜T‘kÓ"ˆñ ˜ #¨¡.Ò0Ø�I‰I�bŒMØ‰Hñ ˜G c¨H¡nÒ4Ø!×'Ñ'Ø4°s·}±}ÑDôð ˆHà
ˆ2‰�‰�cÔà‰ð1ô6 ˆ2ƒw�‚{à�L‰L˜ÓˆàˆØò 	+ˆAÜ" 5§:¡:Ð/@ÓAˆHØ !ˆHÔØ× Ñ  Õ*ð	+ô
 ! Ó/ò 	'ˆHØ�M‰M˜!˜XÕ&ð	'à�‰�eÕð rm   )F)r?  ÚsysrÑ   r½   ÚloggingÚnumpyr  Ú	getLoggerri   rì   Ú	byteorderr  r  ÚItemTagÚItemDelimiterTagrç   ÚsetrÃ   r  r�  ÚVRSrŒ  rg   rÿ   rq   rÆ   rs   rB  r„  rš  r‘  )rÈ   Úvals   00rn   ú<module>r­     sÁ  ðñ &ó Û 	Û Û ã à	ˆ×	Ñ	˜8Ó	$€ð —}‘}¨Ñ0Ð ð=ØÐ)ð=ð Ð)ð=ð Ð*ð	=ð
 Ð/ð=ð Ð+ð=ð Ð)ð=ð Ð*ð=ð Ð/ð=ð Ð+ð=ð Ð(ð=ð Ð,ð=ð Ð/ð=ð  Ð0ð!=ð" Ð1ð#=ð& Ð+ð'=ð( Ð.ð)=ð* Ð0ñ+=ð, Ð1ð-=ð. Ð*ð/=ð2 Ð,ð3=ð4 Ð1ð5=ð6 Ð.ð7=ð8 Ð-ð9=ð: Ð+ð;=ð< Ð.ð==ð> Ð.ð?=ð@ Ð+ðA=ðB Ð*ðC=ðD Ð2ðE=ðF Ð-ðG=ðH Ð4ðI=ðJ Ð0ðK=ðL Ð7ðM=ðP Ð+òQ=ðR Ð)ðS=ðT Ð0ðU=ðV Ð*ðW=ðX Ð*ðY=ðZ Ð+ð[=ð\ Ð-ð]=ð` Ð/ða=ðb Ð.ðc=ðd Ð-ðe=ðf Ð*ðg=ðh Ð'ði=ðj Ð3ðk=ðl �nðm=ðn Ð'ðo=ðp Ð0ðq=ðr Ð,ðs=ðv Ð,ñw=ðx Ð,ñy=€ðB €Ø#Ð Ø'Ð ñ 
 §¡£Ö0˜ˆc�!‹fÒ0Ó	1€Ù	˜XŸ_™_Ó.Ö
/�cˆ3ˆq‹6Ò
/Ó0€ô	�Iô 	ô	�lô 	ô\'˜ô \'ô~~I�&ô ~IòBóLó^<ùòK 1ùÚ
/s   Ã5E&ÄE+