Blog

  • SNOMED 코드 치환

    Athena 에서 SNOMED 코드를 검색하면 편하다. 링크를 타고 다른 것들도 검색해 볼 수 있다. 그런데 검색을 하면 시간이 많이 소요된다. 이럴 경우에는 SNOMED 파일을 받아서 직접 검색을 하면 빠르다. 이렇게 vocabulary 파일을 받아서 DB에 import 할 경우 다음 사항을 고려해야 한다.

    • CSV가 아닌 TSV로 파일이 생성된다. 수 많은 콤마가 있는 것을 고려하면 당연한 것이다.
    • 겹 따옴표와 홑 따옴표가 모두 사용된다. 이것은 import 과정에서 예외 처리에 영향을 미쳐서 불완전하게 데이터가 들어온다.

    concept_name에서 따옴표는 대세에 영향을 주지 않기 때문에 삭제한 후 import 시키도록 한다.

    sed -i "s/\"//g" CONCEPT.csv
    sed -i "s/\'//g" CONCEPT.csv
  • Orthanc

    최근 버전 업그레이드 됨에 따라서 원격 접속이 매우 제한된 것 같다. HTTPS를 지원하지 못하면 원격 접속을 이용할 수 없게 된다. Orthanc 에서는 리버스 프록시와 자체적으로 지원하는데 자체적으로 지원하는 방법을 이용을 아무리 해봐도 안되었다. 그래서 익숙한 nginx 를 이용하여 리버스 프록시로 구현하였다.

    Web 화면보다는 Rest API가 더 중요하기 때문이 이를 이용할 수 있도록 설정을 하는 것을 목표로 했다.

    늘 하듯이 도커 이미지를 이용하여 컨테이너를 생성하고 orthanc와 필요한 패키지들을 설치한다. Orthanc 도움말을 보면 성능을 위해서는 SQLite가 아닌 MySQL이나 PostgreSQL을 이용하라고 한다. PostgreSQL을 좋아하기 때문에 이를 이용하기 위해서 설치한다.

    sudo docker run -it -p 8042:8042 -p 4242:4242 -p 443:443 --name orthanc --restart always -v /home/ysrcc/ext:/root/OrthancStorage debian
    
    echo 'Acquire::http::Proxy "http://rcc.work:3142";' > /etc/apt/apt.conf
    rm -rf /etc/localtime
    ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime 
    apt -y update && apt -y upgrade
    
    apt -y install locales
    sed -i 's/^# *\(en_US.UTF-8\)/\1/' /etc/locale.gen
    locale-gen
    
    apt -y install orthanc orthanc-postgresql \
            procps nano ftp curl postgresql nginx sudo

    웹 접속에서는 문제가 생기지 않는데 curl 명령어를 이용할 경우 주소가 일치하지 않으면 인증서와 관련된 오류가 생긴다. -k 를 이용하여 검증을 안함으로 해도 되기는 하지만, 정석대로 인증서를 이용하는 것을 전제로 한다.

    인증서는 다음과 같이 생성한다.

    openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /tmp/private.key -out /tmp/certificate.crt -subj "/CN=10.10.10.171"
    cat /tmp/private.key /tmp/certificate.crt > /tmp/certificate.pem

    /etc/orthanc/orthanc.json 에서 다음의 내용을 수정한다. 리버스 프록시를 이용하여 접속을 할 것이기 때문에 설정을 건드릴 부분이 별로 없다.

    "StorageDirectory" : "/root/OrthancStorage",
    ...
    "DefaultEncoding" : "Korean",
    
    or
    
    sed -i 's/Latin1/Korean/g' /etc/orthanc/orthanc.json

    /etc/orthanc/postgresql.json 파일에서 다음을 수정한다. username과 password 부분을 수정한다.

    "EnableIndex" : true,
    "Username" : "postgres",
    "Password" : "postgres",

    설정을 했으면 PostgreSQL 에서도 수정해야 한다는 것을 알 수 있다.

    $ service postgresql start
    $ sudo -u postgres psql
    # \password postgres
    # create database orthanc_db;
    # \q

    nginx.conf 파일에서 gzip off로 설정한다. 미리 작성한 파일을 가져와도 된다.

    http {
          ...
          gzip off;
          ...
    }
    
    or
    
    curl -s http://rcc.work:3143/nginx_orthanc.conf > /etc/nginx/nginx.conf

    /etc/nginx/sites-available/default 를 다음과 같이 수정한다.

    server {
            listen 80 default_server;
            listen [::]:80 default_server;
    
            listen 443 ssl default_server;
            listen [::]:443 ssl default_server;
            ssl_certificate /tmp/certificate.crt;
            ssl_certificate_key /tmp/private.key;
            ssl_protocols TLSv1.3;
            ssl_prefer_server_ciphers on;
            ssl_ciphers "TLS-AES-128-GCM-SHA256:ECDHE-RSA-AES128-SHA256";
    
            root /var/www/blog;
    
            index index.html index.htm index.nginx-debian.html;
    
            server_name _;
    
            location / {
                    proxy_pass http://localhost:8042;
                    proxy_set_header HOST $host;
                    proxy_set_header X-Real-IP $remote_addr;
            }
    
    or
    
    curl -s http://rcc.work:3143/default_orthanc > /etc/nginx/sites-available/default

    컨테이너가 예기치 않게 종료될 수 있으므로 .bashrc 에 다음을 추가해서 실행시에 문제가 없도록 한다.

    echo "cd /root" >> /root/.bashrc
    echo "service postgresql start" >> /root/.bashrc
    echo "service nginx start" >> /root/.bashrc
    echo "Orthanc /etc/orthanc/ &" >> /root/.bashrc
  • DICOM tags 내용 삭제

    공동 연구를 할 경우 DICOM 태그를 삭제해야 한다. 숫자 좌표로는 오류가 발생하는 태그가 있기 때문에 문자를 이용하는 것이 좋다. 다음과 같이 DICOM 파일을 읽은 후에 태그를 수정하고 저장해주면 된다.

    ds = pydicom.dcmread("/tmp/RAW/" + instances + ".dcm")
    ds.StudyDate = ''
    ds.SeriesDate = ''
    ds.AcquisitionDate = ''
    ds.ContentDate = ''
    ds.StudyTime = ''
    ds.SeriesTime = ''
    ds.AcquisitionTime = ''
    ds.ContentTime = ''
    ds.AccessionNumber = ''
    
    ds.PatientName = ''
    ds.PatientID = ''
    ds.PatientBirthDate = ''
    ds.PatientSex = ''
    ds.PatientAge = ''
    ds.PatientSize = ''
    ds.PatientWeight = ''
    
    ds.save_as("/tmp/MOD/" + instances + ".dcm")
  • requests using self-signed certificates

    그런거 없다.

    분명히 방법은 있는 것 같은데 단기간에 해결할 수 있는 방법은 없는 것 같다. curl 에서는 -k 나 –insecure를 이용해서 인증서 검증을 안 할 수 있다. 아니면 자가 서명한 인증서를 직접 제시할 수도 있다. 그런데 파이썬의 requests 에서는 인증서 검증을 하지 않는 것 외에는 단시간에 해결할 수 있는 방법은 없는 것 같다. 인증서 검증을 하지 않으려면 verify=False를 이용한다.

    requests.get("https://10.10.10.171/studies", verify = False)