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.
Files changed (46) hide show
  1. data/README.md +45 -0
  2. data/Rakefile +9 -0
  3. data/app/controllers/dcm4chee/api/v1/application_entities_controller.rb +178 -0
  4. data/app/controllers/dcm4chee/api/v1/base_controller.rb +15 -0
  5. data/app/controllers/dcm4chee/api/v1/dicom_objects_controller.rb +58 -0
  6. data/app/controllers/dcm4chee/api/v1/file_systems_controller.rb +37 -0
  7. data/app/controllers/dcm4chee/api/v1/instances_controller.rb +68 -0
  8. data/app/controllers/dcm4chee/api/v1/modalities_controller.rb +29 -0
  9. data/app/controllers/dcm4chee/api/v1/patients_controller.rb +77 -0
  10. data/app/controllers/dcm4chee/api/v1/series_controller.rb +69 -0
  11. data/app/controllers/dcm4chee/api/v1/source_aets_controller.rb +29 -0
  12. data/app/controllers/dcm4chee/api/v1/studies_controller.rb +69 -0
  13. data/app/controllers/dcm4chee/api/v1/trashed_instances_controller.rb +82 -0
  14. data/app/controllers/dcm4chee/api/v1/trashed_patients_controller.rb +84 -0
  15. data/app/controllers/dcm4chee/api/v1/trashed_series_controller.rb +81 -0
  16. data/app/controllers/dcm4chee/api/v1/trashed_studies_controller.rb +81 -0
  17. data/app/controllers/dcm4chee/api/v1/trashes_controller.rb +23 -0
  18. data/app/controllers/dcm4chee/application_controller.rb +4 -0
  19. data/app/models/dcm4chee/application_entity.rb +129 -0
  20. data/app/models/dcm4chee/dicom_file.rb +62 -0
  21. data/app/models/dcm4chee/file_system.rb +95 -0
  22. data/app/models/dcm4chee/instance.rb +69 -0
  23. data/app/models/dcm4chee/modality.rb +17 -0
  24. data/app/models/dcm4chee/patient.rb +42 -0
  25. data/app/models/dcm4chee/series.rb +78 -0
  26. data/app/models/dcm4chee/source_aet.rb +17 -0
  27. data/app/models/dcm4chee/study.rb +60 -0
  28. data/app/models/dcm4chee/trashed_dicom_file.rb +58 -0
  29. data/app/models/dcm4chee/trashed_instance.rb +56 -0
  30. data/app/models/dcm4chee/trashed_patient.rb +40 -0
  31. data/app/models/dcm4chee/trashed_series.rb +50 -0
  32. data/app/models/dcm4chee/trashed_study.rb +40 -0
  33. data/config/routes.rb +27 -0
  34. data/lib/dcm4chee.rb +58 -0
  35. data/lib/dcm4chee/api_constraints.rb +12 -0
  36. data/lib/dcm4chee/dicom_object_manager.rb +48 -0
  37. data/lib/dcm4chee/engine.rb +5 -0
  38. data/lib/dcm4chee/models/has_dicom_object.rb +71 -0
  39. data/lib/dcm4chee/services/application_entity_service.rb +113 -0
  40. data/lib/dcm4chee/services/content_edit_service.rb +37 -0
  41. data/lib/dcm4chee/services/file_system_management.rb +16 -0
  42. data/lib/dcm4chee/services/mbean.rb +11 -0
  43. data/lib/dcm4chee/services/move_scu_service.rb +54 -0
  44. data/lib/dcm4chee/version.rb +3 -0
  45. data/lib/tasks/dcm4chee_tasks.rake +4 -0
  46. 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