dcm4chee 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +45 -0
- data/Rakefile +9 -0
- data/app/controllers/dcm4chee/api/v1/application_entities_controller.rb +178 -0
- data/app/controllers/dcm4chee/api/v1/base_controller.rb +15 -0
- data/app/controllers/dcm4chee/api/v1/dicom_objects_controller.rb +58 -0
- data/app/controllers/dcm4chee/api/v1/file_systems_controller.rb +37 -0
- data/app/controllers/dcm4chee/api/v1/instances_controller.rb +68 -0
- data/app/controllers/dcm4chee/api/v1/modalities_controller.rb +29 -0
- data/app/controllers/dcm4chee/api/v1/patients_controller.rb +77 -0
- data/app/controllers/dcm4chee/api/v1/series_controller.rb +69 -0
- data/app/controllers/dcm4chee/api/v1/source_aets_controller.rb +29 -0
- data/app/controllers/dcm4chee/api/v1/studies_controller.rb +69 -0
- data/app/controllers/dcm4chee/api/v1/trashed_instances_controller.rb +82 -0
- data/app/controllers/dcm4chee/api/v1/trashed_patients_controller.rb +84 -0
- data/app/controllers/dcm4chee/api/v1/trashed_series_controller.rb +81 -0
- data/app/controllers/dcm4chee/api/v1/trashed_studies_controller.rb +81 -0
- data/app/controllers/dcm4chee/api/v1/trashes_controller.rb +23 -0
- data/app/controllers/dcm4chee/application_controller.rb +4 -0
- data/app/models/dcm4chee/application_entity.rb +129 -0
- data/app/models/dcm4chee/dicom_file.rb +62 -0
- data/app/models/dcm4chee/file_system.rb +95 -0
- data/app/models/dcm4chee/instance.rb +69 -0
- data/app/models/dcm4chee/modality.rb +17 -0
- data/app/models/dcm4chee/patient.rb +42 -0
- data/app/models/dcm4chee/series.rb +78 -0
- data/app/models/dcm4chee/source_aet.rb +17 -0
- data/app/models/dcm4chee/study.rb +60 -0
- data/app/models/dcm4chee/trashed_dicom_file.rb +58 -0
- data/app/models/dcm4chee/trashed_instance.rb +56 -0
- data/app/models/dcm4chee/trashed_patient.rb +40 -0
- data/app/models/dcm4chee/trashed_series.rb +50 -0
- data/app/models/dcm4chee/trashed_study.rb +40 -0
- data/config/routes.rb +27 -0
- data/lib/dcm4chee.rb +58 -0
- data/lib/dcm4chee/api_constraints.rb +12 -0
- data/lib/dcm4chee/dicom_object_manager.rb +48 -0
- data/lib/dcm4chee/engine.rb +5 -0
- data/lib/dcm4chee/models/has_dicom_object.rb +71 -0
- data/lib/dcm4chee/services/application_entity_service.rb +113 -0
- data/lib/dcm4chee/services/content_edit_service.rb +37 -0
- data/lib/dcm4chee/services/file_system_management.rb +16 -0
- data/lib/dcm4chee/services/mbean.rb +11 -0
- data/lib/dcm4chee/services/move_scu_service.rb +54 -0
- data/lib/dcm4chee/version.rb +3 -0
- data/lib/tasks/dcm4chee_tasks.rake +4 -0
- metadata +241 -0
@@ -0,0 +1,17 @@
|
|
1
|
+
module Dcm4chee
|
2
|
+
class Modality
|
3
|
+
include ::Virtus
|
4
|
+
|
5
|
+
attribute :name, String
|
6
|
+
|
7
|
+
def self.all
|
8
|
+
modalities = []
|
9
|
+
|
10
|
+
(Series.modalities + TrashedSeries.modalities).uniq.each do |n|
|
11
|
+
modalities << Modality.new(name: n)
|
12
|
+
end
|
13
|
+
|
14
|
+
modalities
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
module Dcm4chee
|
3
|
+
class Patient
|
4
|
+
include DataMapper::Resource
|
5
|
+
include DataMapper::Searcher
|
6
|
+
|
7
|
+
include HasDicomObject
|
8
|
+
|
9
|
+
storage_names[Dcm4chee.config.repository_name] = 'patient'
|
10
|
+
|
11
|
+
# @return [Integer] primary key
|
12
|
+
property :id, Serial, field: 'pk'
|
13
|
+
|
14
|
+
# @return [Integer] ID of the patient
|
15
|
+
property :pid, String, field: 'pat_id'
|
16
|
+
|
17
|
+
# @return [String] Issuer of the patient id
|
18
|
+
property :pid_issuer, String, field: 'pat_id_issuer'
|
19
|
+
|
20
|
+
# @return [String] patient name
|
21
|
+
property :name, String, field: 'pat_name'
|
22
|
+
|
23
|
+
# @return [String] birthday
|
24
|
+
property :birthday, String, field: 'pat_birthdate'
|
25
|
+
|
26
|
+
# @return [String] gender
|
27
|
+
property :gender, String, field: 'pat_sex'
|
28
|
+
|
29
|
+
# @return [String] DICOM attributes
|
30
|
+
dicom_field 'pat_attrs'
|
31
|
+
|
32
|
+
has n, :studies, 'Dcm4chee::Study'
|
33
|
+
|
34
|
+
def move_to_trash
|
35
|
+
Dcm4chee.content_edit_service.move_patient_to_trash(id)
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.repository(name = nil, &block)
|
39
|
+
super(Dcm4chee.config.repository_name, &block)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
module Dcm4chee
|
3
|
+
class Series
|
4
|
+
include DataMapper::Resource
|
5
|
+
include DataMapper::Searcher
|
6
|
+
|
7
|
+
include HasDicomObject
|
8
|
+
|
9
|
+
storage_names[Dcm4chee.config.repository_name] = 'series'
|
10
|
+
|
11
|
+
# @return [Integer] primary key
|
12
|
+
property :id, Serial, field: 'pk'
|
13
|
+
|
14
|
+
# @return [Integer] foreign key of {Study}
|
15
|
+
property :study_id, Integer, field: 'study_fk'
|
16
|
+
|
17
|
+
# @return [String] DICOM Series Instance UID(0020,000E)
|
18
|
+
property :series_iuid, Text, field: 'series_iuid'
|
19
|
+
|
20
|
+
# @return [String] DICOM Series NO(0020,0011)
|
21
|
+
property :series_no, String, field: 'series_no'
|
22
|
+
|
23
|
+
# @return [String] Source AET
|
24
|
+
property :source_aet, String, field: 'src_aet'
|
25
|
+
|
26
|
+
# @return [String] DICOM Modality(0008,0060)
|
27
|
+
property :modality, String, field: 'modality'
|
28
|
+
|
29
|
+
# @return [String] DICOM Series Description(0008,103E)
|
30
|
+
property :description, Text, field: 'series_desc'
|
31
|
+
|
32
|
+
# @return [Integer] DICOM Instances count(0020,1209)
|
33
|
+
property :num_instances, Integer, field: 'num_instances'
|
34
|
+
|
35
|
+
# DICOM Availability(0008,0056)
|
36
|
+
# 0: ONLINE
|
37
|
+
# 1: NEARLINE
|
38
|
+
# 2: OFFLINE
|
39
|
+
# 3: UNAVAILABLE
|
40
|
+
#
|
41
|
+
# @return [Integer] Availability(0008,0056)
|
42
|
+
property :availability, Enum[0, 1, 2, 3], field: 'availability'
|
43
|
+
|
44
|
+
dicom_field 'series_attrs'
|
45
|
+
|
46
|
+
belongs_to :study, 'Dcm4chee::Study'
|
47
|
+
has n, :instances, 'Dcm4chee::Instance'
|
48
|
+
|
49
|
+
def study_iuid
|
50
|
+
study.study_iuid
|
51
|
+
end
|
52
|
+
|
53
|
+
def move_to_trash
|
54
|
+
Dcm4chee.content_edit_service.move_series_to_trash(id)
|
55
|
+
end
|
56
|
+
|
57
|
+
def as_json(opts = {})
|
58
|
+
opts[:methods] ||= []
|
59
|
+
opts[:methods] << :study_iuid
|
60
|
+
|
61
|
+
super(opts)
|
62
|
+
end
|
63
|
+
|
64
|
+
class << self
|
65
|
+
def repository(name = nil, &block)
|
66
|
+
super(Dcm4chee.config.repository_name, &block)
|
67
|
+
end
|
68
|
+
|
69
|
+
def modalities
|
70
|
+
Series.aggregate(:modality)
|
71
|
+
end
|
72
|
+
|
73
|
+
def source_aets
|
74
|
+
Series.aggregate(:source_aet)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Dcm4chee
|
2
|
+
class SourceAet
|
3
|
+
include ::Virtus
|
4
|
+
|
5
|
+
attribute :name, String
|
6
|
+
|
7
|
+
def self.all
|
8
|
+
source_aets = []
|
9
|
+
|
10
|
+
(Series.source_aets + TrashedSeries.source_aets).uniq.each do |n|
|
11
|
+
source_aets << SourceAet.new(name: n)
|
12
|
+
end
|
13
|
+
|
14
|
+
source_aets
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
module Dcm4chee
|
3
|
+
class Study
|
4
|
+
include DataMapper::Resource
|
5
|
+
include DataMapper::Searcher
|
6
|
+
|
7
|
+
include HasDicomObject
|
8
|
+
|
9
|
+
storage_names[Dcm4chee.config.repository_name] = 'study'
|
10
|
+
|
11
|
+
# @return [Integer] primary key
|
12
|
+
property :id, Serial, field: 'pk'
|
13
|
+
|
14
|
+
# @return [Integer] foreign key of {Patient}
|
15
|
+
property :patient_id, Integer, field: 'patient_fk'
|
16
|
+
|
17
|
+
# @return [String] DICOM Study Instance UID(0020,000D)
|
18
|
+
property :study_iuid, Text, field: 'study_iuid'
|
19
|
+
|
20
|
+
# @return [Integer] DICOM Study ID(0020,0010)
|
21
|
+
property :sid, Integer, field: 'study_id'
|
22
|
+
|
23
|
+
# @return [DateTime] DICOM timestamp, including date(0008,0020) and time(0008,0030)
|
24
|
+
property :study_at, DateTime, field: 'study_datetime'
|
25
|
+
|
26
|
+
# @return [String] DICOM Accession NO(0008,0050)
|
27
|
+
property :accession_no, String, field: 'accession_no'
|
28
|
+
|
29
|
+
# @return [String] DICOM Study Description(0008,1030)
|
30
|
+
property :description, Text, field: 'study_desc'
|
31
|
+
|
32
|
+
# @return [Integer] DICOM Series count(0020,1206)
|
33
|
+
property :num_series, Integer, field: 'num_series'
|
34
|
+
|
35
|
+
# @return [Integer] DICOM Instances count(0020,1208)
|
36
|
+
property :num_instances, Integer, field: 'num_instances'
|
37
|
+
|
38
|
+
# DICOM Availability(0008,0056)
|
39
|
+
# 0: ONLINE
|
40
|
+
# 1: NEARLINE
|
41
|
+
# 2: OFFLINE
|
42
|
+
# 3: UNAVAILABLE
|
43
|
+
#
|
44
|
+
# @return [Integer] DICOM Availability(0008,0056)
|
45
|
+
property :availability, Enum[0, 1, 2, 3], field: 'availability'
|
46
|
+
|
47
|
+
dicom_field 'study_attrs'
|
48
|
+
|
49
|
+
belongs_to :patient, 'Dcm4chee::Patient'
|
50
|
+
has n, :series, 'Dcm4chee::Series'
|
51
|
+
|
52
|
+
def move_to_trash
|
53
|
+
Dcm4chee.content_edit_service.move_study_to_trash(id)
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.repository(name = nil, &block)
|
57
|
+
super(Dcm4chee.config.repository_name, &block)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
module Dcm4chee
|
3
|
+
class TrashedDicomFile
|
4
|
+
include DataMapper::Resource
|
5
|
+
include DataMapper::Searcher
|
6
|
+
|
7
|
+
include HasDicomObject
|
8
|
+
|
9
|
+
storage_names[Dcm4chee.config.repository_name] = 'priv_file'
|
10
|
+
|
11
|
+
# @return [Integer] primary key
|
12
|
+
property :id, Serial, field: 'pk'
|
13
|
+
|
14
|
+
# @return [Integer] foreign key of {Instance}
|
15
|
+
property :trashed_instance_id, Integer, field: 'instance_fk'
|
16
|
+
|
17
|
+
# @return [Integer] foreign key of {FileSystem}
|
18
|
+
property :file_system_id, Integer, field: 'filesystem_fk'
|
19
|
+
|
20
|
+
# @return [String] path
|
21
|
+
property :path, Text, field: 'filepath'
|
22
|
+
|
23
|
+
# @return [String] DICOM Transfer Syntax UID(0002,0010)
|
24
|
+
property :transfer_syntax_uid, Text, field: 'file_tsuid'
|
25
|
+
|
26
|
+
# @return [String] MD5 of the file
|
27
|
+
property :md5, String, field: 'file_md5'
|
28
|
+
|
29
|
+
# @return [Integer] file size
|
30
|
+
property :size, Integer, field: 'file_size'
|
31
|
+
|
32
|
+
# Availability:
|
33
|
+
# -4: QUERY_HSM_FAILED
|
34
|
+
# -3: MD5_CHECK_FAILED
|
35
|
+
# -2: VERIFY_COMPRESS_FAILED
|
36
|
+
# -1: COMPRESS_FAILED
|
37
|
+
# 0: DEFAULT
|
38
|
+
# 1: TO_ARCHIVE
|
39
|
+
# 2: ARCHIVED
|
40
|
+
# 3: COMPRESSING
|
41
|
+
#
|
42
|
+
# @return [Integer] file status
|
43
|
+
property :availability, Enum[-4, -3, -2, -1, 0, 1, 2, 3], field: 'file_status'
|
44
|
+
|
45
|
+
belongs_to :trashed_instance, 'Dcm4chee::TrashedInstance'
|
46
|
+
belongs_to :file_system, 'Dcm4chee::FileSystem'
|
47
|
+
|
48
|
+
# Load the dicom object from file
|
49
|
+
# @return [DICOM::DObject] DICOM object
|
50
|
+
def dcm
|
51
|
+
@dcm ||= DICOM::DObject.read(File.join(file_system.path, path))
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.repository(name = nil, &block)
|
55
|
+
super(Dcm4chee.config.repository_name, &block)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
module Dcm4chee
|
3
|
+
class TrashedInstance
|
4
|
+
include DataMapper::Resource
|
5
|
+
include DataMapper::Searcher
|
6
|
+
|
7
|
+
include HasDicomObject
|
8
|
+
|
9
|
+
storage_names[Dcm4chee.config.repository_name] = 'priv_instance'
|
10
|
+
|
11
|
+
# @return [Integer] primary key
|
12
|
+
property :id, Serial, field: 'pk'
|
13
|
+
|
14
|
+
# @return [Integer] foreign key of {Series}
|
15
|
+
property :trashed_series_id, Integer, field: 'series_fk'
|
16
|
+
|
17
|
+
# @return [DateTime] created time
|
18
|
+
property :created_at, DateTime, field: 'created_time'
|
19
|
+
|
20
|
+
# @return [String] DICOM SOP Instance UID(0008,0018)
|
21
|
+
property :sop_iuid, Text, field: 'sop_iuid'
|
22
|
+
|
23
|
+
dicom_field 'inst_attrs'
|
24
|
+
|
25
|
+
belongs_to :trashed_series, 'Dcm4chee::TrashedSeries'
|
26
|
+
has n, :trashed_dicom_files, 'Dcm4chee::TrashedDicomFile'
|
27
|
+
|
28
|
+
def restore_from_trash
|
29
|
+
Dcm4chee.content_edit_service.undelete_instance(id)
|
30
|
+
end
|
31
|
+
|
32
|
+
def remove_from_trash
|
33
|
+
Dcm4chee.content_edit_service.delete_instance(id)
|
34
|
+
end
|
35
|
+
|
36
|
+
def study_iuid
|
37
|
+
trashed_series.trashed_study.study_iuid
|
38
|
+
end
|
39
|
+
|
40
|
+
def series_iuid
|
41
|
+
trashed_series.series_iuid
|
42
|
+
end
|
43
|
+
|
44
|
+
def as_json(opts = {})
|
45
|
+
opts[:methods] ||= []
|
46
|
+
opts[:methods] << :series_iuid
|
47
|
+
opts[:methods] << :study_iuid
|
48
|
+
|
49
|
+
super(opts)
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.repository(name = nil, &block)
|
53
|
+
super(Dcm4chee.config.repository_name, &block)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
module Dcm4chee
|
3
|
+
class TrashedPatient
|
4
|
+
include DataMapper::Resource
|
5
|
+
include DataMapper::Searcher
|
6
|
+
|
7
|
+
include HasDicomObject
|
8
|
+
|
9
|
+
storage_names[Dcm4chee.config.repository_name] = 'priv_patient'
|
10
|
+
|
11
|
+
# @return [Integer] primary key
|
12
|
+
property :id, Serial, field: 'pk'
|
13
|
+
|
14
|
+
# @return [Integer] patient id
|
15
|
+
property :pid, String, field: 'pat_id'
|
16
|
+
|
17
|
+
# @return [String] issuer of the patient id
|
18
|
+
property :pid_issuer, String, field: 'pat_id_issuer'
|
19
|
+
|
20
|
+
# @return [String] name
|
21
|
+
property :name, String, field: 'pat_name'
|
22
|
+
|
23
|
+
# @return [String] DICOM attributes
|
24
|
+
dicom_field 'pat_attrs'
|
25
|
+
|
26
|
+
has n, :trashed_studies, 'Dcm4chee::TrashedStudy'
|
27
|
+
|
28
|
+
def restore_from_trash
|
29
|
+
Dcm4chee.content_edit_service.undelete_patient(id)
|
30
|
+
end
|
31
|
+
|
32
|
+
def remove_from_trash
|
33
|
+
Dcm4chee.content_edit_service.delete_patient(id)
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.repository(name = nil, &block)
|
37
|
+
super(Dcm4chee.config.repository_name, &block)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
module Dcm4chee
|
3
|
+
class TrashedSeries
|
4
|
+
include DataMapper::Resource
|
5
|
+
include DataMapper::Searcher
|
6
|
+
|
7
|
+
include HasDicomObject
|
8
|
+
|
9
|
+
storage_names[Dcm4chee.config.repository_name] = 'priv_series'
|
10
|
+
|
11
|
+
# @return [Integer] primary key
|
12
|
+
property :id, Serial, field: 'pk'
|
13
|
+
|
14
|
+
# @return [Integer] foreign key of {Study}
|
15
|
+
property :trashed_study_id, Integer, field: 'study_fk'
|
16
|
+
|
17
|
+
# @return [String] DICOM Series Instance UID(0020,000E)
|
18
|
+
property :series_iuid, Text, field: 'series_iuid'
|
19
|
+
|
20
|
+
# @return [String] Source AET
|
21
|
+
property :source_aet, String, field: 'src_aet'
|
22
|
+
|
23
|
+
dicom_field 'series_attrs'
|
24
|
+
|
25
|
+
belongs_to :trashed_study, 'Dcm4chee::TrashedStudy'
|
26
|
+
has n, :trashed_instances, 'Dcm4chee::TrashedInstance'
|
27
|
+
|
28
|
+
def restore_from_trash
|
29
|
+
Dcm4chee.content_edit_service.undelete_series(id)
|
30
|
+
end
|
31
|
+
|
32
|
+
def remove_from_trash
|
33
|
+
Dcm4chee.content_edit_service.delete_series(id)
|
34
|
+
end
|
35
|
+
|
36
|
+
class << self
|
37
|
+
def modalities
|
38
|
+
Series.aggregate(:modality)
|
39
|
+
end
|
40
|
+
|
41
|
+
def source_aets
|
42
|
+
Series.aggregate(:source_aet)
|
43
|
+
end
|
44
|
+
|
45
|
+
def repository(name = nil, &block)
|
46
|
+
super(Dcm4chee.config.repository_name, &block)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
module Dcm4chee
|
3
|
+
class TrashedStudy
|
4
|
+
include DataMapper::Resource
|
5
|
+
include DataMapper::Searcher
|
6
|
+
|
7
|
+
include HasDicomObject
|
8
|
+
|
9
|
+
storage_names[Dcm4chee.config.repository_name] = 'priv_study'
|
10
|
+
|
11
|
+
# @return [Integer] primary key
|
12
|
+
property :id, Serial, field: 'pk'
|
13
|
+
|
14
|
+
# @return [Integer] foreign key of {Patient}
|
15
|
+
property :trashed_patient_id, Integer, field: 'patient_fk'
|
16
|
+
|
17
|
+
# @return [String] DICOM Study Instance UID(0020,000D)
|
18
|
+
property :study_iuid, Text, field: 'study_iuid'
|
19
|
+
|
20
|
+
# @return [String] DICOM Accesion NO(0008,0050)
|
21
|
+
property :accession_no, String, field: 'accession_no'
|
22
|
+
|
23
|
+
dicom_field 'study_attrs'
|
24
|
+
|
25
|
+
belongs_to :trashed_patient, 'Dcm4chee::TrashedPatient'
|
26
|
+
has n, :trashed_series, 'Dcm4chee::TrashedSeries'
|
27
|
+
|
28
|
+
def restore_from_trash
|
29
|
+
Dcm4chee.content_edit_service.undelete_study(id)
|
30
|
+
end
|
31
|
+
|
32
|
+
def remove_from_trash
|
33
|
+
Dcm4chee.content_edit_service.delete_study(id)
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.repository(name = nil, &block)
|
37
|
+
super(Dcm4chee.config.repository_name, &block)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|