bash-dicom-전송 받은 dicom 의 tag 값에 따라 원하는 tag에 특정값 부여하고 다시 전송하기

  1. storescp를 띄워놓고 DICOM을 받는다.
  2. DICOM tag 0011,1003 의 값을 확인한다
  3. 값이 ("SCMAPAUGMENTED" "SCREPORTAUGMENTED" "SC_ADDITIONAL") 중 하나면
  4. 0008,103E tag의 값을 COMPARISON 으로 추가한다
  5. 수정한 DICOM 파일을 다른 서버로 전송한다.

sc-tag-editor.env

필요한 변수를 저장한다.

ROOT_DIR="/opt/jihoon/bin/sc-tag-editor"  

# AE_tittle of the sc-tag-editor service
AE_TITLE="JIHOON"

# Listen port to receive DICOM files
LISTEN_PORT=13823

# New tag to input to the received DICOM
NEW_SC_TAG_NUMBER="(0008,103E)"
NEW_SC_TAG_VALUE="COMPARISON"

#Store Destination config
PACS_IP=10.10.60.40
PACS_PORT=14025
PACS_AETITLE="PACSNAME"

dicom-receiver

  • DICOM을 전달받을 storescp 를 실행하는 스크립트
  • sc-tag-editor.env 의 변수를 불러온다
  • DICOM file을 받으면 sc-tag-editor 스크립트를 실행한다
  • storescp 옵션에 따라 DICOM을 전달받으면 파라미터로 1. AE title, 2. DICOM file name 을 받는다
#!/bin/bash

. /etc/sc-tag-editor.env

echo_with_time() {
    echo $(date "+%F %T") $1
}

/usr/bin/storescp +xa +uf -dhl -xs --aetitle $AE_TITLE $LISTEN_PORT --exec-on-reception "$ROOT_DIR/sc-tag-editor #a #f"
echo
echo "--------------------Setting INFO------------------------"
echo "ROOT Directory    : $ROOT_DIR"
echo "STORE PORT        : $LISTEN_PORT "
echo "AE TITLE          : $AE_TITLE"
echo "PACS IP           : $PACS_IP"
echo "PACS PORT         : $PACS_PORT"
echo "PACS AETITLE      : $PACS_AETITLE"
echo "---------------------------------------------------------"
echo

sc-tag-editor

  • 전송받은 DICOM 의 tag 정보를 체크하고 tag 값을 추가하는 스크립트
  • 0011,1003 tag의 값을 변수 TARGET로 저장한다.
  • 변수 TARGET의 값이 변수 SC에 저장된 값 중에 하나와 일치하는지 비교한다
    • 일치하면 sc-tag-editor.env에 저장된 NEWSCTAGNUMBER tag Number의 값을 NEWSCTAGVALUE로 입력한다
    • 일치 하지 않으면 0011,1003 tag내용을 출력하고 tag 수정을 하지 않는다
  • env 값에 저장된 PACS 정보로 DICOM을 전송한다
#!/bin/bash

. /etc/sc-tag-editor.env

echo_with_time() {
        echo $(date "+%F %T") $1
}

AETITLE=$1
DICOM=$2

ACCNO=`dcmdump -s +P 0008,"0050" "$DICOM" | cut -d "[" -f2 | cut -d "]" -f1`
TARGET=`dcmdump +P 0011,"1003" "$DICOM" | cut -d "[" -f2 | cut -d "]" -f1`
SC=("SC_MAP_AUGMENTED" "SC_REPORT_AUGMENTED" "SC_ADDITIONAL")

if [[ " ${SC[@]} " =~ " $TARGET " ]]; then

  echo_with_time "Auto-comparison result is received....... : file = $DICOM / account no. = $ACCNO"

  #Modify tag
  dcmodify -i "$NEW_SC_TAG_NUMBER=$NEW_SC_TAG_VALUE" $DICOM
  echo "Modified $NEW_SC_TAG_NUMBER tag to $NEW_SC_TAG_VALUE"

else

  echo_with_time "Received image is not the auto-comparison result. 0011,1003 is $TARGET"

fi


#Send Modified SC to Destination
echo "Sending DICOM.....to Destination"
dcmsend --aetitle $AETITLE --call $PACS_AETITLE $PACS_IP $PACS_PORT $DICOM
echo "Sent ACCNO: $ACCNO , AETITLE: $AETITLE SC to Destination($PACS_AETITLE , $PACS_IP , $PACS_PORT)!"

sc-tag-editor.service

  • sc-tag-editor 와 dicom-receiver 스크립트를 서비스로 관리한다.
  • 네트워크가 연결된 상태면 실행된다
  • 문제가 생기면 3초마다 재시작을 시도한다
  • /opt/jihoon/bin/sc-tag-editor/dicom-receiver 스크립트를 실행한다
[Unit]
Description = SC tag editor
After = network.target

[Service]
Type = simple
Restart=always
RestartSec=3
WorkingDirectory = /opt/jihoon/bin/sc-tag-editor
ExecStart = /opt/jihoon/bin/sc-tag-editor/dicom-receiver

[Install]
WantedBy = default.target

setup

  • /opt/jihoon/bin/sc-tag-editor 디렉토리를 생성하고 모든 파일을 복사한다
  • sc-tag-editor 서비스를 실행한다
#!/bin/bash

mkdir -p /opt/jihoon/bin/sc-tag-editor

if [ $? -ne 0 ]; then
    echo "failed to make sc-tag-editor directory... please check permission in /opt/jihoon"
    exit 1
fi

#Transfer scripts
cp dicom-receiver /opt/jihoon/bin/sc-tag-editor/
cp sc-tag-editor /opt/jihoon/bin/sc-tag-editor/
cp sc-tag-editor.env /etc/
cp sc-tag-editor.service /usr/lib/systemd/system/
cp sc-tag-editor.env /etc/

ln -s /etc/sc-tag-editor.env .env

#Start sc-tag-editor
systemctl start sc-tag-editor
systemctl status sc-tag-editor

댓글 쓰기

0 댓글