Presentation Contexts
장치 또는 시스템 간의 통신에서 중요한 역할
두 개의 장치가 통신하는 방법 -데이터의 콘텐츠와 인코딩-을 정의하기 위해 사용된다.
- 컨텍스트 ID
- 추상 구문
- 전송 구문
3가지로 구성된다.
from pynetdicom.presentation import PresentationContext
cx = PresentationContext()
cx.context_id = 1
cx.abstract_syntax = '1.2.840.10008.1.1'
cx.transfer_syntax = ['1.2.840.10008.1.2', '1.2.840.10008.1.2.4.50']
########## 위의 프레젠트 컨텍스트 결과
ID: 1
Abstract Syntax: Verification SOP Class
Transfer Syntax(ex):
= Implicit VR Little Endian
= JPEG Baseline (Precess 1)
Context ID
1~255 사이의 홀수 정수이며 컨텍스트를 식별한다.
추상 구문 (Abstract syntax)
데이터가 나타내는 내용
C-ECHO
1.2.840.10008.1.1 : Verification SOP Class
from pynetdicom.sop_class import Verification
1.2.840.10008.5.1.4.1.1 : CT Image Storage
from pydicom.uid import CTImageStorage
전송 구문 (Transfer syntax)
데이터가 인코딩되는 방식
from pydicom.uid import ExplicitVRLittleEndian, ImplicitVRLittleEndian,ExplicitVRBigEndian
- Explicit VR Little Endian
- Implicit VR Little Endian
- Explicit VR Big Endian
간단하게 설명하자면 Explicit VR은 명시된 VR로 VR에 대한 정보가 사용자에게 보이는 것이고
Implicit VR은 VR에 대한 정보가 암시적, 숨겨져 있는 것이다.
당연하게도 Implicit 이 VR에 대한 정보가 보이지 않아 상대적으로 크기가 작다.
Endian은 데이터에 관한 크기라고 이해하면 쉬운데, Little은 데이터가 작은 순으로 저장되는 방식이고 Big Endian은 데이터가 큰 순으로 저장되는 방식이라 이해하면 쉽다. 같은 엔디안 사이의 통신에선 문제가 없으나 다른 엔디안 사이에선 문제가 발생한다. 특히 네트워크에선 Big Endian이, DICOM에선 Little Endian을 사용한다.
정확한 내용은 직접 구글링하여 여러 블로그들의 좋은 글을 참고하길 바란다.
SCU에서 사용하고자 할 때
연결 요청자인 경우 연결 프로세스에 association 해줄 프레젠테이션 컨텍스트를 제안해야 하며 아래의 규칙을 따라야한다.
- 제안된 프레젠테이션 컨텍스트는 1~128개까지여야 한다.
- 만약 그 이상이면 ValueError 가 발생하게 된다.
- 둘 이상의 프레젠테이션 컨텍스트는 동일한 추상 구문을 사용할 수 있다.
- 각 프레젠테이션 컨텍스트는 전송 구문이 하나 이상 있어야 한다.
설정 방법은 아래와 같다.
associate메서드의 contexts 파라미터에 직접 설정하기
ae = AE()
# ...
requested = [build_conext(Verification)]
assoc = ae.associate('IP', port, contexts=requested)
add_requested_context 메서드를 사용
ae = AE()
# ...
ae.add_requested_contexts(Verification)
requested_contexts 속성에 직접 설정
ae = AE()
# ...
ae.requested_contexts = [build_conext(Verification)]
제안하는 추상 구문은 사용하려는 서비스에 해당하는 SOP Class 또는 메타 SOP Class와 일치해야 한다.
예를 들어, 스토리지 서비스를 사용하려는 경우 해당 SOP Class UID에서 하나 이상의 추상 구문을 제안할 수 있다.
각 추상 구문에 대해 제안하는 전송 구문은 전송하려는 데이터의 전송 구문과 일치해야 한다.
SCP에서 사용하고자 할 때
연결 수락자인 경우 지원되는 프레젠테이션 컨텍스트를 정의해야 한다. SCU와 달리 지원되는 프레젠테이션 컨텍스트를 무제한으로 정의할 수 있다.
설정 방법은 아래와 같다.
start_server메서드의 contexts 파라미터에 직접 설정하기
ae = AE()
# ...
supported = [build_conext(Verification)]
ae.start_server(('IP', port), contexts=supported)
add_supported_context 메서드를 사용
ae = AE()
# ...
ae.add_supported_contexts(Verification)
supported_contexts 속성에 직접 설정
ae = AE()
# ...
ae.supported_contexts = [build_conext(Verification)]
- 지원하는 추상 구문은 제공되는 서비스 클래스와 일치해야 한다. 스토리지 서비스를 제공하는 경우 SOP Class 중 하나 이상을 지원해야 한다.
- 각 추상 구문에 대한 전송 구문은 지원하는 데이터 인코딩과 일치해야 한다.
C-DIMSE 를 다루다보니 모호했던 내용을 정리하는 시간을 가졌다. 사실 아직도 잘 모르겠지만 ,,,
'의료' 카테고리의 다른 글
Dicom 파일 핸들링 라이브러리 (feat. js) (0) | 2023.08.28 |
---|---|
방사선 단위 - 그레이, 시버트 (0) | 2023.08.13 |
DICOM 의 기본 개념 (0) | 2023.07.23 |
DICOM 네트워킹 용어 (0) | 2023.07.16 |