Skip to main content

My first python repo for kk.

Project description

一些关于Orthanc学习使用中的记录

何为Orthanc?

orthanc是一款能够提供RESTful API的迷你影像服务器,orthanc提供了数据库存储dicom索引的插件(Postgresql,Mysql,SQLlite)。

  • 关于 RESTful API

    https://www.runoob.com/w3cnote/restful-architecture.html

    REST全称是Representational State Transfer,即表征性状态转移。它首次出现在2000年Roy Fiedling(HTTP规范的主要编写者之一)的博士论文中,他在论文中提到:“我这篇文章的写作目的,就是想在符合架构原理的前提下,理解和评估以网络为基础的应用软件的架构设计,得到一个功能强、性能好、适宜通信的架构。REST指的是一组架构约束条件和原则。”如果一个架构符合REST的约束条件和原则,我们就称它为RESTful架构。

    REST本身没有创造新的技术、组件或服务,而隐藏在RESTful背后的理念就是使用Web的现有特征和能力,更好地使用现有Web标准的中的一些准则和约束。虽然REST本身受Web技术的影响很深,但是理论上REST架构风格并不是绑定在HTTP上,只不过目前HTTP是唯一与REST相关的实例。所以我们这里描述的REST也是通过HTTP实现的REST。

    https://www.jianshu.com/p/dbee5199cf23

    REST,简单来说,就是用URI(Uniform Resource Identifier)表示资源,用HTTP方法(GET,POST,PUT,DELETE)表征对这些资源的操作。

    RESTful API就是REST风格的API,它要求前端以一种预定义的语法格式发送请求。

  • 关于RESTful架构遵循的统一接口原则

    接口应该使用标准的HTTP方法如:GET,PUT,POST和DELETE等,考虑安全性和幂等性(多次操作,结果一致),但并不阻止扩展带特殊语义的方法,只要方法对资源的操作有着具体的、可识别的语义即可,并能够保持整个接口的统一性。

  • 关于REST中的状态转移

    REST原则中包含无状态通信原则(指服务端不应该保存客户端状态)。实际上,状态应该区分应用状态和资源状态,客户端负责维护应用状态,而服务端维护资源状态。客户端与服务端端交互必须是无状态的,并在每一次请求中包含处理该请求所需的一切信息。服务端不需要在请求间保留应用状态,只有在接收到实际请求的时候,服务端才会关注应用状态。这种无状态通信原则,使得服务端和中介能够理解独立的请求和响应。在多次请求中,同一客户端也不再需要依赖于同一服务器,方便实现高可扩展和高可用性的服务端。“会话”状态不是作为资源状态保存在服务端的,而是被客户端作为应用状态进行跟踪的。客户端应用状态在服务端提供的超媒体的指引下发生变迁。服务端通过超媒体告诉客户端当前状态有哪些后续状态可以进入。

  • 关于dicom

    DICOM(Digital Imaging and Communications in Medicine),即医学数字成像和通信,是医学图像和相关信息的国际标准(ISO 12052),它定义了质量能满足临床需要的可用于数据交换的医学图像格式。(扩展名:.dcm)

关于docker

https://baike.baidu.com/item/Docker/13344470

Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

一个完整的Docker有以下几个部分组成:

  • Docker Client客户端
  • Docker Daemon守护进程
  • Docker Image镜像
  • Docker Container容器

Docker架构

Docker使用客户端-服务器架构模式,使用远程API来管理和创建Docker容器。Docker容器通过Docker镜像来创建。容器与镜像的关系类似于面向对象编程中的对象与类。

Docker采用C/S架构,Docker daemon作为服务端接受来自客户的请求,并处理这些请求(创建、运行、分发容器)。客户端和服务端既可以运行在一个机器上,也可通过socket或者RESTful API来进行通信。

Docker daemon一般在宿主主机后台运行,等待接收来自客户端的消息。Docker客户端则为用户提供一系列可执行命令,用户用这些命令实现跟Docker daemon交互。

关于docker和orthanc的浅薄认识

orthanc是一个服务器(服务端),它如果想要运行并提供服务(客户端是浏览器),则需要有相应的资源。docker作为一个C/S架构模式的应用容器引擎,通过orthanc的镜像来创建orthanc容器,相当于利用docker分配了本地资源给orthanc服务器,并且依靠docker管理相应的资源(因为在docker-orthanc这层关系中,实际的资源是由docker掌握,orthanc服务器只是作为客户请求资源)。之所以我在本地上用浏览器(也就是客户端)访问http://localhost:8042/之后点击Lookup却不显示任何信息,是因为我没有在docker管理的本地orthanc服务器上上传过任何资源。由于orthanc能提供RESTful API,而REST是通过HTTP实现的,那么本次的任务是在orthanc服务端,在遵循RESTful架构的统一接口原则的前提下,使用标准的HTTP方法,尝试扩展带特殊语义的方法(例如直接调出病人的uid一类的)。

首先,我们需要做到资源和容器的分离,所以相当于我们运行orthanc容器的时候,我们的资源不需要再镜像中本来就有,所以我们可以以挂载的方式,将我们需要的数据文件夹挂载到容器的目录中,然后通过修改配置文件中orthanc的数据库路径来实现数据storage的设置(docker本身就是使用了linux的文件管理方式)。——李浩学长

关于在docker中启动orthanc

docker启动orthanc,默认端口:8042

$ docker run -p 4242:4242 -p 8042:8042 --rm jodogne/orthanc

修改配置文件

docker run --rm --entrypoint=cat jodogne/orthanc /etc/orthanc/orthanc.json > /tmp/orthanc.json

使用更新的配置文件启动Orthanc

$ docker run -p 4242:4242 -p 8042:8042 --rm -v /tmp/orthanc.json:/etc/orthanc/orthanc.json:ro jodogne/orthanc

关于Orthanc接口

Orthanc的主要优势在于其内置的RESTful API,该API可用于从外部应用程序驱动orthanc,并且与开发应用的编程语言无关。重要的是,Orthanc Explorer(一个Orthanc嵌入式管理接口)完全依赖于上述RESTful API来实现它的所有功能。

Note:所有示例都使用cURL命令行工具进行说明,但等效调用可以很容易地转换为任何同时支持HTTP和JSON的编程语言(比如python)。(cURL:一个利用URL语法在命令行下工作的文件传输工具,支持文件上传和下载)

发送DICOM图片

$ curl -X POST http://localhost:8042/instances --data-binary @CT.X.1.2.276.0.7230010.dcm

orthanc将使用带有存储实例位置的JSON文件作为回应,例如

{
  "ID" : "e87da270-c52b-4f2a-b8c6-bae25928d0b0",
  "Path" : "/instances/e87da270-c52b-4f2a-b8c6-bae25928d0b0",
  "Status" : "Success"
}

Orthanc的代码分发包含了一个使用REST API来递归地上传某些文件中的内容到Orhtanc的示例python脚本。(https://hg.orthanc-server.com/orthanc/file/Orthanc-1.9.7/OrthancServer/Resources/Samples/ImportDicomFiles/ImportDicomFiles.py)

python ImportDicomFiles.py localhost 8042 ~/DICOM/

从Orthanc1.8.1开始,Orthanc的源分发包含了另一个python脚本OrthancImport.py,该脚本相比ImportDicomFiles.py提供了更多的功能。它可以显著导入.zip、.tar.gz或.tar.bz2档案的内容,而无需先解压缩它们。它还提供了更全面的命令行选项。(https://hg.orthanc-server.com/orthanc/file/Orthanc-1.9.7/OrthancServer/Resources/Samples/ImportDicomFiles/OrthancImport.py)

如果使用Powershell (>= 3.0),可以通过以下内容向Orthanc发送单个Dicom实例:

# disabling the progress bar makes the Invoke-RestMethod call MUCH faster
$ProgressPreference = 'SilentlyContinue'

# upload it to Orthanc
$reply = Invoke-RestMethod http://localhost:8042/instances -Method POST -InFile CT.X.1.2.276.0.7230010.dcm

# display the result
Write-Host "The instance can be retrieved at http://localhost:8042$($reply.Path)"

访问Orthanc内容

Orthanc使用“患者,研究,系列,实例”的DICOM标准模型来组织存储的DICOM资源。每个DICOM资源都与唯一的标识符相关联。

列出所有的DICOM资源

以下是如何列出存储在本地Orthanc实例中的所有DICOM资源的方法:

$ curl http://localhost:8042/patients
$ curl http://localhost:8042/studies
$ curl http://localhost:8042/series
$ curl http://localhost:8042/instances

请注意,此命令的结果是一个JSON文件,其中包含资源标识符数组。

访问一个患者

要访问单个资源,将其标识符添加到URI中。例如,通过如下示例检索一位患者的主要信息:

$ curl localhost:8042/patients/8c4d0f60-4c7b0273-785ba198-aded6ba3-a47a89a7

Orthanc回应的JSON文件:

{
   "ID" : "8c4d0f60-4c7b0273-785ba198-aded6ba3-a47a89a7",
   "IsStable" : true,
   "LastUpdate" : "20220120T074119",
   "MainDicomTags" : {
      "PatientBirthDate" : "20210223",
      "PatientID" : "#00385",
      "PatientName" : "急诊",
      "PatientSex" : "Male"
   },
   "Studies" : [ "2b15e950-33980cf9-cde6a7a4-acfbf97d-3b31639c" ],
   "Type" : "Patient"
}

从患者向下浏览到实例

Studies信息域列出了与患者相关的所有DICOM研究。因此,考虑到上面的病人,按照以下方式进入她的DICOM等级体系:

$ curl http://localhost:8042/studies/9ad2b0da-a406c43c-6e0df76d-1204b86f-78d12c15

Orthanc回应的JSON文件:

{
   "ID" : "2b15e950-33980cf9-cde6a7a4-acfbf97d-3b31639c",
   "IsStable" : true,
   "LastUpdate" : "20220120T074119",
   "MainDicomTags" : {
      "AccessionNumber" : "",
      "InstitutionName" : "BMEC RFLab of USTC",
      "ReferringPhysicianName" : "magforce",
      "StudyDate" : "20210223",
      "StudyDescription" : "哈哈哈哈,你好啊",
      "StudyID" : "#00385",
      "StudyInstanceUID" : "1.2.276.0.7230010.3.1.2.1824580983.36480.1628595363.853",
      "StudyTime" : "151712"
   },
   "ParentPatient" : "8c4d0f60-4c7b0273-785ba198-aded6ba3-a47a89a7",
   "PatientMainDicomTags" : {
      "PatientBirthDate" : "20210223",
      "PatientID" : "#00385",
      "PatientName" : "急诊",
      "PatientSex" : "Male"
   },
   "Series" : [ "9b9a96f5-f8d4a65c-9666d5b0-cc5eba6b-d84abd95" ],
   "Type" : "Study"
}

MainDicomTags标签现在是那些与study层级相关的标签。可以在ParentPatient字段中检索患者的标识符,该标识符可用于向上移动DICOM层次结构。但我们宁愿使用series数组进入series层级。下一个命令将返回有关刚刚报告的series信息:

$ curl localhost:8042/series/9b9a96f5-f8d4a65c-9666d5b0-cc5eba6b-d84abd95

Orthanc回应的JSON文件:

{
   "ExpectedNumberOfInstances" : null,
   "ID" : "9b9a96f5-f8d4a65c-9666d5b0-cc5eba6b-d84abd95",
   "Instances" : [
      "5dbdad22-d21b8e67-83358204-fc591c97-55571dda",
      "33cef45b-b3599f87-797a7187-b3500703-834c0260",
      "a7400f1c-ce35011a-e8dc5f8f-47e26419-ae09dad2",
      "a07c8988-12d751ff-a2f99af0-373e70e4-d4bf7d8a",
      "30b11298-e4a50e64-92060427-2f8f7744-1d1baef3",
      "a8ed5a60-bbca3aa2-0d143ce9-ede2e62f-feb7043a",
      "251719c8-0a57ee0d-1605da9d-1c660ba5-2a9b8dc9",
      "846d44b5-5eadd8a7-2e6eb133-e197e2af-4e98c4bd",
      "1a306711-4050498e-ace2bb12-b88cd82c-c431b779"
   ],
   "IsStable" : true,
   "LastUpdate" : "20220120T074119",
   "MainDicomTags" : {
      "BodyPartExamined" : "Head",
      "ImageOrientationPatient" : "1\\0\\0\\0\\1\\0",
      "Manufacturer" : "Fuqing Company",
      "Modality" : "MR",
      "OperatorsName" : "迈力,magforce,医疗科技",
      "ProtocolName" : "LocGRE",
      "SeriesDate" : "20210223",
      "SeriesDescription" : "This is my auto generated LocGRE sequence library.",
      "SeriesInstanceUID" : "1.2.276.0.7230010.3.1.3.1824580983.36480.1628595363.854",
      "SeriesNumber" : "",
      "SeriesTime" : "151723",
      "StationName" : "RFLab"
   },
   "ParentStudy" : "2b15e950-33980cf9-cde6a7a4-acfbf97d-3b31639c",
   "Status" : "Unknown",
   "Type" : "Series"
}

实例层级:

$ curl localhost:8042/instances/5dbdad22-d21b8e67-83358204-fc591c97-55571dda

Orthanc回应的JSON文件:

{
   "FileSize" : 525970,
   "FileUuid" : "9f28a7cd-f080-48f1-8e70-93ded32e585b",
   "ID" : "5dbdad22-d21b8e67-83358204-fc591c97-55571dda",
   "IndexInSeries" : 3,
   "MainDicomTags" : {
      "ImageOrientationPatient" : "1\\0\\0\\0\\1\\0",
      "ImagePositionPatient" : "-135\\-134.4726562\\10",
      "InstanceCreationDate" : "20210223",
      "InstanceCreationTime" : "151723.439892",
      "InstanceNumber" : "3",
      "SOPInstanceUID" : "1.2.276.0.7230010.3.1.4.1824580983.36480.1628595363.863"
   },
   "ParentSeries" : "9b9a96f5-f8d4a65c-9666d5b0-cc5eba6b-d84abd95",
   "Type" : "Instance"
}

该实例的父系列中的索引为3。该实例存储为525970字节的原始DICOM文件。使用以下命令下载此DICOM文件:(下载路径为当前位置)

$ curl http://localhost:8042/instances/5dbdad22-d21b8e67-83358204-fc591c97-55571dda/file > Instance.dcm

关于如何写一个自己的库

https://zhuanlan.zhihu.com/p/288557764

1.下载一个发布库的官方模版

git clone https://github.com/navdeep-G/setup.py

2.修改模块名称和setup.py中的信息

3.在core.py中编写自己的代码

4.将库打包(在项目根目录下)

python setup.py sdist 

5.将库安装在本地(在dist目录下)

pip install Qtool-0.0.1.tar.gz

6.验证

在命令行中导入写的模块

import xxx
help(xxx.xxx)

7.发布到PyPI官网上(https://pypi.org/manage/projects/)

首先Add API token,然后修改.pypirc文件(https://pypi.org/help/#apitoken)

open ~/.pypirc

[pypi]
  username = __token__
  password = pypi-AgEIcHlwaS5vcmcCJGE4ZjAyOGQ3LTRlM2EtNGE1Mi05NmE4LThiOTkxNzIyMjUyOAACJXsicGVybWlzc2lvbnMiOiAidXNlciIsICJ2ZXJzaW9uIjogMX0AAAYg3xYmVIbyBzOB9IPXaqz-LPgS6KseDPZ-h4j_eO9xH0I

8.将打包的tar.gz文件发布(在项目根目录下)(每次更新要更新版本号—setup.py)

python3 -m twine upload dist/* 

另:使用正确的pip安装

python3 -m pip install KkOrthanc

使用pip更新库

python3 -m pip install --upgrade KkOrthanc

关于上传到github库

https://blog.csdn.net/caseywei/article/details/81051946

1.新建文件夹

mkdir KkOrthanc
cd KkOrthanc

2.初始化

git init
git status

3.将本地文件复制进KkOrthanc

4.上传

git add .
git commit -m "xxx"
git remote add origin git@github.com:iridiumine/KkOrthanc.git
git push -f origin master

Requests库

https://docs.python-requests.org/en/latest/

  • 基于Apache开源协议

    • 五种开源协议:BSD,Apache,GPL,LGPL,MIT
  • HTTP的八种请求类型

    • OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送'*'的请求来测试服务器的功能性。

    • HEAD:向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。

    • GET:向特定的资源发出请求。

      • 请求结果常见API

        response=requests.get(url)
        print(response.status_code)   #响应结果状态码:200(成功)
        print(response.text)          #响应结果文本内容
        print(response.content)       #响应结果二进制内容(处理图片等)
        print(response.url)           #响应结果的请求url
        print(response.json())        #响应结果转成json字符串
        print(response.encoding)      #响应结果编码
        
    • POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的创建和/或已有资源的修改。

    • PUT:向指定资源位置上传其最新内容。

    • DELETE:请求服务器删除Request-URI所标识的资源。

    • TRACE:回显服务器收到的请求,主要用于测试或诊断。

    • CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。

  • JSON相应内容

    • 如果 JSON 解码失败, r.json() 就会抛出一个异常。例如,响应内容是 401 (Unauthorized),尝试访问 r.json() 将会抛出 ValueError: No JSON object could be decoded 异常。
    • 需要注意的是,成功调用 r.json() 并不意味着响应的成功。有的服务器会在失败的响应中包含一个 JSON 对象(比如 HTTP 500 的错误细节)。这种 JSON 会被解码返回。要检查请求是否成功,请使用 r.raise_for_status() 或者检查 r.status_code 是否和你的期望相同。
  • 相应状态码

    • 检测响应状态码:

      >>> r = requests.get('http://httpbin.org/get')
      >>> r.status_code
      200
      
    • 为方便引用,Requests还附带了一个内置的状态码查询对象:

      >>> r.status_code == requests.codes.ok
      True
      
    • 如果发送了一个错误请求(一个 4XX 客户端错误,或者 5XX 服务器错误响应),可以通过Response.raise_for_status() 来抛出异常:

      >>> bad_r = requests.get('http://httpbin.org/status/404')
      >>> bad_r.status_code
      404
      
      >>> bad_r.raise_for_status()
      Traceback (most recent call last):
        File "requests/models.py", line 832, in raise_for_status
          raise http_error
      requests.exceptions.HTTPError: 404 Client Error
      
  • 响应头

    • 查看以一个 Python 字典形式展示的服务器响应头:

      >>> r.headers
      {
          'content-encoding': 'gzip',
          'transfer-encoding': 'chunked',
          'connection': 'close',
          'server': 'nginx/1.0.4',
          'x-runtime': '148ms',
          'etag': '"e1ca502697e5c9317743dc078f67693f"',
          'content-type': 'application/json'
      }
      
    • 使用任意形式来访问这些响应头字段:

      >>> r.headers['Content-Type']
      'application/json'
      
      >>> r.headers.get('content-type')
      'application/json'
      
  • Cookie

    • 快速访问某个响应中可能包含的cookie:

      >>> url = 'http://example.com/some/cookie/setting/url'
      >>> r = requests.get(url)
      
      >>> r.cookies['example_cookie_name']
      'example_cookie_value'
      
    • 发送cookies到服务器:

      >>> url = 'http://httpbin.org/cookies'
      >>> cookies = dict(cookies_are='working')
      
      >>> r = requests.get(url, cookies=cookies)
      >>> r.text
      '{"cookies": {"cookies_are": "working"}}'
      
    • Cookie 的返回对象为 RequestsCookieJar,它的行为和字典类似,但接口更为完整,适合跨域名跨路径使用。还可以把 Cookie Jar 传到 Requests 中:

      >>> jar = requests.cookies.RequestsCookieJar()
      >>> jar.set('tasty_cookie', 'yum', domain='httpbin.org', path='/cookies')
      >>> jar.set('gross_cookie', 'blech', domain='httpbin.org', path='/elsewhere')
      >>> url = 'http://httpbin.org/cookies'
      >>> r = requests.get(url, cookies=jar)
      >>> r.text
      '{"cookies": {"tasty_cookie": "yum"}}'
      
  • 错误与异常:所有Requests显式抛出的异常都继承自 requests.exceptions.RequestException。

    • 遇到网络问题(如:DNS 查询失败、拒绝连接等)时,Requests 会抛出一个 ConnectionError 异常。
    • 如果 HTTP 请求返回了不成功的状态码, Response.raise_for_status() 会抛出一个 HTTPError 异常。
    • 若请求超时,则抛出一个 Timeout 异常。
    • 若请求超过了设定的最大重定向次数,则会抛出一个 TooManyRedirects 异常。

关于python模块化开发

https://blog.csdn.net/qq_42992919/article/details/96852814

什么是模块化开发

  • 模块化是代码组成的一种方式,Python中的每一个文件就是一个模块
  • 在Python中,文件有三种方式进行组织:Python文件(也就是Python模块)、目录(directory)、包(package)

如何进行模块化开发以及注意点

  • 功能模块的分类
  • 功能模块接口的定义
  • 异常捕获

python文件与普通文件的区别

python中的文件也就是以.py后缀名结尾的文件,每一个.py后缀名结尾的文件就是python的一个模块,能够被其他模块所导入

包和目录的区别

包内部多一个__init__.py文件,使得包能够被模块导入,而目录不能

相对导入和绝对导入

  • 绝对导入:从python的搜索路径中导入对应的包中的模块
  • 相对导入:必须在包内部使用,且有相对导入的模块,无法直接运行,必须使用python -m package.module这样的方式运行,或者被__main__模块导入,之后使用
  • 类似绝对路径和相对路径的区别

使用all过滤模块属性的可见性

  • 在模块导入中,模块的属性都能够被导入,没有私有和保护属性的概念
  • 但是在使用from package import *的时候,保护属性和私有属性不会被导入
  • 使用__all__ = ['a', 'b']可以显示声明能够被导入的属性

关于if __name__ == '__main__:

  • 用于测试,功能调试,不让测试代码污染模块
  • if __name__ == '__main__'相当于是Python模拟的程序入口。由于模块之间相互引用,不同模块可能都有这样的定义,而入口程序只能有一个,哪个入口程序被选中取决于 __name__的值,__name__是内置变量,用于表示当前模块的名字。如果一个模块被直接运行,其 __name__ 值为__main__,如果是其他模块导入该模块的话,该模块的__name__属性值为包名。

模块的内置属性

  • __doc__:模块中用于描述的文档字符串
  • __name__:模块名
  • __file__:模块保存的路径

模块设计的一般原则

  • 先设计API,再实现模块
  • 控制模块规模,只提供需要的函数,降低复杂性
  • 在模块中编写测试代码
  • 使用私有函数实现不被外部客户端调用的模块函数
  • 通过文档获取模块帮助信息

python面向对象

简介

  • 类:用来描述具有相同的属性和方法对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
  • 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类内且在函数体之外。类变量通常不作为实例变量使用(使用类的名称访问类变量)。
  • 数据成员:类变量或者实例变量,用于处理类及其实例对象的相关的数据。
  • 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
  • 局部变量:定义在方法中的变量,只作用于当前实例的类。
  • 实例变量:在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。
  • 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。
  • 实例化:创建一个类的实例,类的具体对象。
  • 方法:类中定义的函数。
  • 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。

一些知识

  • __init()__方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法。
  • self 代表类的实例,self 在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数。
  • 使用.来访问对象的属性。
  • 在调用基类的方法时,需要加上基类的类名前缀,且需要带上 self 参数变量。区别在于类中调用普通函数时并不需要带上 self 参数。
  • __private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。
  • 在类的内部,使用 def 关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数。
  • __private_method:两个下划线开头,声明该方法为私有方法,不能在类的外部调用。在类的内部调用 self.__private_methods
  • 单下划线、双下划线、头尾双下划线说明:
    • __foo__: 定义的是特殊方法,一般是系统定义名字 ,类似 __init__()之类的。
    • _foo: 以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于 from module import *。
    • __foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。

关于PyOrthanc

PyOrthanc包装了Orthanc的REST API来更方便实用的使用数据。

访问患者、研究、系列和实例信息

from pyorthanc import Orthanc

orthanc = Orthanc('http://localhost:8042')
orthanc.setup_credentials('username', 'password')  # If needed

# To get patients identifier and main information
patients_identifiers = orthanc.get_patients()

for patient_identifier in patients_identifiers:
    patient_information = orthanc.get_patient_information(patient_identifier)

    patient_name = patient_information['MainDicomTags']['name']
    ...
    study_identifiers = patient_information['Studies']    

# To get patient's studies identifier and main information
for study_identifier in study_identifiers:
    study_information = orthanc.get_study_information(study_identifier)
    
    study_date = study_information['MainDicomTags']['StudyDate']
    ...
    series_identifiers = study_information['Series']

# To get study's series identifier and main information
for series_identifier in series_identifiers:
    series_information = orthanc.get_series_information(series_identifier)
    
    modality = series_information['MainDicomTags']['Modality']
    ...
    instance_identifiers = series_information['Instances']

# and so on ...
for instance_identifier in instance_identifiers:
    instance_information = orthanc.get_instance_information(instance_identifier)
    ...

患者树

在Orthanc实例中为每一个患者建立一个患者树,多个患者树形成了一个患者树森林,树的每一层为$Patient\rightarrow Study\rightarrow Series\rightarrow Instance$。

from pyorthanc import Orthanc, build_patient_forest

patient_forest = build_patient_forest(
    Orthanc('http://localhost:8042/')
)    

for patient in patient_forest:
    patient_info = patient.get_main_information()
    patient.get_name()
    patient.get_zip()
    ...
    
    for study in patient.get_studies():
        study.get_date()
        study.get_referring_physician_name()
        ...

        for series in study.get_series():
            ...

向Orthanc服务器上传DICOM文件

from pyorthanc import Orthanc

orthanc = Orthanc('http://localhost:8042')
orthanc.setup_credentials('username', 'password')  # If needed

with open('A_DICOM_INSTANCE_PATH.dcm', 'rb') as file_handler:
    orthanc.post_instances(file_handler.read())

获取已连接的远程登录状态的列表

from pyorthanc import Orthanc

orthanc = Orthanc('http://localhost:8042')
orthanc.setup_credentials('username', 'password')  # If needed

orthanc.get_modalities()

从远程登录设备查询(C-Find)和检索(C-Move)

from pyorthanc import RemoteModality, Orthanc

orthanc = Orthanc('http://localhost:8042')
orthanc.setup_credentials('username', 'password')  # If needed

remote_modality = RemoteModality(orthanc, 'modality')

# Query (C-Find) on modality
data = {'Level': 'Study', 'Query': {'PatientID': '*'}}
query_response = remote_modality.query(data=data)

# Retrieve (C-Move) results of query on a target modality (AET)
remote_modality.move(query_response['QUERY_ID'], 'target_modality')

匿名化患者并获取文件

from pyorthanc import Orthanc

orthanc = Orthanc('http://localhost:8042')
orthanc.setup_credentials('username', 'password')  # If needed

a_patient_identifier = orthanc.get_patients()[0]

orthanc.anonymize_patient(a_patient_identifier)

# result is: (you can retrieve DICOM file from ID)
# {'ID': 'dd41f2f1-24838e1e-f01746fc-9715072f-189eb0a2',
#  'Path': '/patients/dd41f2f1-24838e1e-f01746fc-9715072f-189eb0a2',
#  'PatientID': 'dd41f2f1-24838e1e-f01746fc-9715072f-189eb0a2',
#  'Type': 'Patient'}

关于整体思路

Orthanc的接口

官方文档中的演示均通过curl完成。

内容访问

  • 列出不同层次的Orthanc资源,Orthanc中包含四种资源类型:Patient、Study、Series、Instance

    $ curl http://localhost:8042/patients
    $ curl http://localhost:8042/studies
    $ curl http://localhost:8042/series
    $ curl http://localhost:8042/instances
    
  • 通过ID访问单个的某资源,可通过患者信息向下逐步浏览直至到实例层

    $ curl localhost:8042/patients/8c4d0f60-4c7b0273-785ba198-aded6ba3-a47a89a7
    $ curl http://localhost:8042/studies/9ad2b0da-a406c43c-6e0df76d-1204b86f-78d12c15
    $ curl localhost:8042/series/9b9a96f5-f8d4a65c-9666d5b0-cc5eba6b-d84abd95
    $ curl localhost:8042/instances/5dbdad22-d21b8e67-83358204-fc591c97-55571dda
    

返回JSON文件

不同的资源类型返回的JSON文件不同,但都包含ID、MainDicomTags和Type。可以将JSON文件转化为字典,便于操作。

上传和下载DICOM文件

  • 上传
$ curl -X POST http://localhost:8042/instances --data-binary @CT.X.1.2.276.0.7230010.dcm
  • 下载
$ curl http://localhost:8042/instances/5dbdad22-d21b8e67-83358204-fc591c97-55571dda/file > Instance.dcm

Requests库的使用方法

可能使用的方法主要有get()、post()、put()和delete(),以及一些HTTP的错误和异常处理。

python库模块化开发的方式

  • 建立package
  • 具体分为哪几个类
  • 编写每个类的属性和接口,并编写接口文档
  • 实现模块,使用私有函数实现不被外部调用的模块函数
  • 更改__init__.py
  • 编写测试代码,提供测试文件

需求分析

类、属性、方法

接口文档

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

KkOrthanc-0.1.3.tar.gz (41.2 kB view hashes)

Uploaded Source

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page