Mercurial > hg > orthanc-stone
annotate OrthancStone/Sources/Toolbox/DicomInstanceParameters.cpp @ 1644:4796fb60999e
removing methods from SortedFrames to simplify api
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Tue, 10 Nov 2020 18:08:16 +0100 |
parents | 5cc589bfb385 |
children | 4e14735e98f8 |
rev | line source |
---|---|
746 | 1 /** |
2 * Stone of Orthanc | |
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics | |
4 * Department, University Hospital of Liege, Belgium | |
1270
2d8ab34c8c91
upgrade to year 2020
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1206
diff
changeset
|
5 * Copyright (C) 2017-2020 Osimis S.A., Belgium |
746 | 6 * |
7 * This program is free software: you can redistribute it and/or | |
1598
8563ea5d8ae4
relicensing some files, cf. osimis bm26 and chu agreement on 2020-05-20
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1596
diff
changeset
|
8 * modify it under the terms of the GNU Lesser General Public License |
746 | 9 * as published by the Free Software Foundation, either version 3 of |
10 * the License, or (at your option) any later version. | |
11 * | |
12 * This program is distributed in the hope that it will be useful, but | |
13 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
1598
8563ea5d8ae4
relicensing some files, cf. osimis bm26 and chu agreement on 2020-05-20
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1596
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
8563ea5d8ae4
relicensing some files, cf. osimis bm26 and chu agreement on 2020-05-20
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1596
diff
changeset
|
15 * Lesser General Public License for more details. |
1596
4fb8fdf03314
removed annoying whitespace
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1571
diff
changeset
|
16 * |
1598
8563ea5d8ae4
relicensing some files, cf. osimis bm26 and chu agreement on 2020-05-20
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1596
diff
changeset
|
17 * You should have received a copy of the GNU Lesser General Public |
8563ea5d8ae4
relicensing some files, cf. osimis bm26 and chu agreement on 2020-05-20
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1596
diff
changeset
|
18 * License along with this program. If not, see |
8563ea5d8ae4
relicensing some files, cf. osimis bm26 and chu agreement on 2020-05-20
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1596
diff
changeset
|
19 * <http://www.gnu.org/licenses/>. |
746 | 20 **/ |
21 | |
22 | |
23 #include "DicomInstanceParameters.h" | |
24 | |
25 #include "../Scene2D/ColorTextureSceneLayer.h" | |
26 #include "../Scene2D/FloatTextureSceneLayer.h" | |
27 #include "../Toolbox/GeometryToolbox.h" | |
1287
8e82fdc6200e
Heavy (temporary) logging in the path that leads
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
28 #include "../Toolbox/ImageToolbox.h" |
746 | 29 |
1455
30deba7bc8e2
simplifying include_directories
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1353
diff
changeset
|
30 #include <Images/Image.h> |
30deba7bc8e2
simplifying include_directories
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1353
diff
changeset
|
31 #include <Images/ImageProcessing.h> |
30deba7bc8e2
simplifying include_directories
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1353
diff
changeset
|
32 #include <Logging.h> |
30deba7bc8e2
simplifying include_directories
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1353
diff
changeset
|
33 #include <OrthancException.h> |
30deba7bc8e2
simplifying include_directories
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1353
diff
changeset
|
34 #include <Toolbox.h> |
746 | 35 |
36 | |
37 namespace OrthancStone | |
38 { | |
1636 | 39 static void ExtractFrameOffsets(Vector& target, |
40 const Orthanc::DicomMap& dicom, | |
41 unsigned int numberOfFrames) | |
746 | 42 { |
43 // http://dicom.nema.org/medical/Dicom/2016a/output/chtml/part03/sect_C.8.8.3.2.html | |
44 | |
1634
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
45 std::string increment; |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
46 |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
47 if (dicom.LookupStringValue(increment, Orthanc::DICOM_TAG_FRAME_INCREMENT_POINTER, false)) |
746 | 48 { |
1634
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
49 Orthanc::Toolbox::ToUpperCase(increment); |
1635
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
50 |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
51 // This is the "Grid Frame Offset Vector" tag (DICOM_TAG_GRID_FRAME_OFFSET_VECTOR) |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
52 if (increment != "3004,000C") |
746 | 53 { |
1634
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
54 LOG(WARNING) << "Bad value for the FrameIncrementPointer tags in a multiframe image"; |
1636 | 55 target.resize(0); |
1634
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
56 return; |
746 | 57 } |
58 } | |
59 | |
1636 | 60 if (!LinearAlgebra::ParseVector(target, dicom, Orthanc::DICOM_TAG_GRID_FRAME_OFFSET_VECTOR) || |
61 target.size() != numberOfFrames) | |
746 | 62 { |
1634
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
63 LOG(INFO) << "The frame offset information is missing in a multiframe image"; |
1635
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
64 |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
65 // DO NOT use ".clear()" here, as the "Vector" class doesn't behave like std::vector! |
1636 | 66 target.resize(0); |
746 | 67 } |
68 } | |
69 | |
70 | |
1642
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
71 DicomInstanceParameters::Data::Data(const Orthanc::DicomMap& dicom) |
746 | 72 { |
994
1f74bc3459ba
fix build due to rename in Orthanc::DicomMap
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
980
diff
changeset
|
73 if (!dicom.LookupStringValue(studyInstanceUid_, Orthanc::DICOM_TAG_STUDY_INSTANCE_UID, false) || |
1f74bc3459ba
fix build due to rename in Orthanc::DicomMap
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
980
diff
changeset
|
74 !dicom.LookupStringValue(seriesInstanceUid_, Orthanc::DICOM_TAG_SERIES_INSTANCE_UID, false) || |
1f74bc3459ba
fix build due to rename in Orthanc::DicomMap
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
980
diff
changeset
|
75 !dicom.LookupStringValue(sopInstanceUid_, Orthanc::DICOM_TAG_SOP_INSTANCE_UID, false)) |
746 | 76 { |
77 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); | |
78 } | |
79 | |
80 std::string s; | |
1635
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
81 if (dicom.LookupStringValue(s, Orthanc::DICOM_TAG_SOP_CLASS_UID, false)) |
746 | 82 { |
1635
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
83 sopClassUid_ = StringToSopClassUid(s); |
746 | 84 } |
85 else | |
86 { | |
1635
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
87 sopClassUid_ = SopClassUid_Other; |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
88 } |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
89 |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
90 uint32_t n; |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
91 if (dicom.ParseUnsignedInteger32(n, Orthanc::DICOM_TAG_NUMBER_OF_FRAMES)) |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
92 { |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
93 numberOfFrames_ = n; |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
94 } |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
95 else |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
96 { |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
97 numberOfFrames_ = 1; |
746 | 98 } |
99 | |
1635
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
100 if (!dicom.HasTag(Orthanc::DICOM_TAG_COLUMNS) || |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
101 !dicom.GetValue(Orthanc::DICOM_TAG_COLUMNS).ParseFirstUnsignedInteger(width_)) |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
102 { |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
103 width_ = 0; |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
104 } |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
105 |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
106 if (!dicom.HasTag(Orthanc::DICOM_TAG_ROWS) || |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
107 !dicom.GetValue(Orthanc::DICOM_TAG_ROWS).ParseFirstUnsignedInteger(height_)) |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
108 { |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
109 height_ = 0; |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
110 } |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
111 |
1634
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
112 if (!dicom.ParseDouble(sliceThickness_, Orthanc::DICOM_TAG_SLICE_THICKNESS)) |
746 | 113 { |
1634
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
114 sliceThickness_ = 100.0 * std::numeric_limits<double>::epsilon(); |
746 | 115 } |
116 | |
117 GeometryToolbox::GetPixelSpacing(pixelSpacingX_, pixelSpacingY_, dicom); | |
118 | |
119 std::string position, orientation; | |
994
1f74bc3459ba
fix build due to rename in Orthanc::DicomMap
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
980
diff
changeset
|
120 if (dicom.LookupStringValue(position, Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, false) && |
1f74bc3459ba
fix build due to rename in Orthanc::DicomMap
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
980
diff
changeset
|
121 dicom.LookupStringValue(orientation, Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, false)) |
746 | 122 { |
123 geometry_ = CoordinateSystem3D(position, orientation); | |
124 } | |
125 | |
1635
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
126 // Must be AFTER setting "numberOfFrames_" |
1639 | 127 if (numberOfFrames_ > 1) |
128 { | |
129 ExtractFrameOffsets(frameOffsets_, dicom, numberOfFrames_); | |
130 } | |
131 else | |
132 { | |
133 frameOffsets_.resize(0); | |
134 } | |
1634
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
135 |
746 | 136 if (sopClassUid_ == SopClassUid_RTDose) |
137 { | |
1091
5a18e6a395bc
Added DoseUnit tag retrieval to DicomInstanceParameters
Benjamin Golinvaux <bgo@osimis.io>
parents:
1027
diff
changeset
|
138 static const Orthanc::DicomTag DICOM_TAG_DOSE_UNITS(0x3004, 0x0002); |
5a18e6a395bc
Added DoseUnit tag retrieval to DicomInstanceParameters
Benjamin Golinvaux <bgo@osimis.io>
parents:
1027
diff
changeset
|
139 |
5a18e6a395bc
Added DoseUnit tag retrieval to DicomInstanceParameters
Benjamin Golinvaux <bgo@osimis.io>
parents:
1027
diff
changeset
|
140 if (!dicom.LookupStringValue(doseUnits_, DICOM_TAG_DOSE_UNITS, false)) |
5a18e6a395bc
Added DoseUnit tag retrieval to DicomInstanceParameters
Benjamin Golinvaux <bgo@osimis.io>
parents:
1027
diff
changeset
|
141 { |
1141
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
142 LOG(ERROR) << "Tag DoseUnits (0x3004, 0x0002) is missing in " << sopInstanceUid_; |
1634
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
143 doseUnits_.clear(); |
1091
5a18e6a395bc
Added DoseUnit tag retrieval to DicomInstanceParameters
Benjamin Golinvaux <bgo@osimis.io>
parents:
1027
diff
changeset
|
144 } |
746 | 145 } |
146 | |
147 if (dicom.ParseDouble(rescaleIntercept_, Orthanc::DICOM_TAG_RESCALE_INTERCEPT) && | |
148 dicom.ParseDouble(rescaleSlope_, Orthanc::DICOM_TAG_RESCALE_SLOPE)) | |
149 { | |
1141
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
150 if (sopClassUid_ == SopClassUid_RTDose) |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
151 { |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
152 LOG(INFO) << "DOSE HAS Rescale*: rescaleIntercept_ = " << rescaleIntercept_ << " rescaleSlope_ = " << rescaleSlope_; |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
153 // WE SHOULD NOT TAKE THE RESCALE VALUE INTO ACCOUNT IN THE CASE OF DOSES |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
154 hasRescale_ = false; |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
155 } |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
156 else |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
157 { |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
158 hasRescale_ = true; |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
159 } |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
160 |
746 | 161 } |
162 else | |
163 { | |
164 hasRescale_ = false; | |
165 } | |
166 | |
1141
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
167 if (dicom.ParseDouble(doseGridScaling_, Orthanc::DICOM_TAG_DOSE_GRID_SCALING)) |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
168 { |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
169 if (sopClassUid_ == SopClassUid_RTDose) |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
170 { |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
171 LOG(INFO) << "DOSE HAS DoseGridScaling: doseGridScaling_ = " << doseGridScaling_; |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
172 } |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
173 } |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
174 else |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
175 { |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
176 doseGridScaling_ = 1.0; |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
177 if (sopClassUid_ == SopClassUid_RTDose) |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
178 { |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
179 LOG(ERROR) << "Tag DoseGridScaling (0x3004, 0x000e) is missing in " << sopInstanceUid_ << " doseGridScaling_ will be set to 1.0"; |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
180 } |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
181 } |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
182 |
746 | 183 Vector c, w; |
184 if (LinearAlgebra::ParseVector(c, dicom, Orthanc::DICOM_TAG_WINDOW_CENTER) && | |
185 LinearAlgebra::ParseVector(w, dicom, Orthanc::DICOM_TAG_WINDOW_WIDTH) && | |
186 c.size() > 0 && | |
187 w.size() > 0) | |
188 { | |
189 hasDefaultWindowing_ = true; | |
190 defaultWindowingCenter_ = static_cast<float>(c[0]); | |
191 defaultWindowingWidth_ = static_cast<float>(w[0]); | |
192 } | |
193 else | |
194 { | |
195 hasDefaultWindowing_ = false; | |
1141
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
196 defaultWindowingCenter_ = 0; |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
197 defaultWindowingWidth_ = 0; |
746 | 198 } |
199 | |
980
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
200 // This computes the "IndexInSeries" metadata from Orthanc (check |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
201 // out "Orthanc::ServerIndex::Store()") |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
202 hasIndexInSeries_ = ( |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
203 dicom.ParseUnsignedInteger32(indexInSeries_, Orthanc::DICOM_TAG_INSTANCE_NUMBER) || |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
204 dicom.ParseUnsignedInteger32(indexInSeries_, Orthanc::DICOM_TAG_IMAGE_INDEX)); |
746 | 205 } |
206 | |
207 | |
1642
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
208 const Orthanc::DicomImageInformation& DicomInstanceParameters::GetImageInformation() const |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
209 { |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
210 assert(tags_.get() != NULL); |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
211 |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
212 if (imageInformation_.get() == NULL) |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
213 { |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
214 const_cast<DicomInstanceParameters&>(*this).imageInformation_. |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
215 reset(new Orthanc::DicomImageInformation(GetTags())); |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
216 |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
217 assert(imageInformation_->GetWidth() == GetWidth()); |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
218 assert(imageInformation_->GetHeight() == GetHeight()); |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
219 assert(imageInformation_->GetNumberOfFrames() == GetNumberOfFrames()); |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
220 } |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
221 |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
222 assert(imageInformation_.get() != NULL); |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
223 return *imageInformation_; |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
224 } |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
225 |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
226 |
1636 | 227 CoordinateSystem3D DicomInstanceParameters::GetFrameGeometry(unsigned int frame) const |
746 | 228 { |
1636 | 229 if (frame >= data_.numberOfFrames_) |
746 | 230 { |
231 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
232 } | |
1636 | 233 else if (data_.frameOffsets_.empty()) |
746 | 234 { |
1636 | 235 return data_.geometry_; |
1634
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
236 } |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
237 else |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
238 { |
1636 | 239 assert(data_.frameOffsets_.size() == data_.numberOfFrames_); |
746 | 240 |
241 return CoordinateSystem3D( | |
1636 | 242 data_.geometry_.GetOrigin() + data_.frameOffsets_[frame] * data_.geometry_.GetNormal(), |
243 data_.geometry_.GetAxisX(), | |
244 data_.geometry_.GetAxisY()); | |
746 | 245 } |
246 } | |
247 | |
248 | |
1636 | 249 bool DicomInstanceParameters::IsPlaneWithinSlice(unsigned int frame, |
250 const CoordinateSystem3D& plane) const | |
746 | 251 { |
1636 | 252 if (frame >= data_.numberOfFrames_) |
746 | 253 { |
254 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
255 } | |
256 | |
1636 | 257 CoordinateSystem3D tmp = data_.geometry_; |
746 | 258 |
259 if (frame != 0) | |
260 { | |
261 tmp = GetFrameGeometry(frame); | |
262 } | |
263 | |
264 double distance; | |
265 | |
757 | 266 return (CoordinateSystem3D::ComputeDistance(distance, tmp, plane) && |
1636 | 267 distance <= data_.sliceThickness_ / 2.0); |
746 | 268 } |
269 | |
1637 | 270 |
271 bool DicomInstanceParameters::IsColor() const | |
272 { | |
273 Orthanc::PhotometricInterpretation photometric = | |
1642
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
274 GetImageInformation().GetPhotometricInterpretation(); |
1637 | 275 |
276 return (photometric != Orthanc::PhotometricInterpretation_Monochrome1 && | |
277 photometric != Orthanc::PhotometricInterpretation_Monochrome2); | |
278 } | |
279 | |
280 | |
1636 | 281 void DicomInstanceParameters::ApplyRescaleAndDoseScaling(Orthanc::ImageAccessor& image, |
282 bool useDouble) const | |
746 | 283 { |
284 if (image.GetFormat() != Orthanc::PixelFormat_Float32) | |
285 { | |
286 throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); | |
287 } | |
1141
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
288 |
1636 | 289 double factor = data_.doseGridScaling_; |
1141
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
290 double offset = 0.0; |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
291 |
1636 | 292 if (data_.hasRescale_) |
746 | 293 { |
1636 | 294 factor *= data_.rescaleSlope_; |
295 offset = data_.rescaleIntercept_; | |
1141
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
296 } |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
297 |
1634
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
298 if (!LinearAlgebra::IsNear(factor, 1) || |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
299 !LinearAlgebra::IsNear(offset, 0)) |
1141
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
300 { |
746 | 301 const unsigned int width = image.GetWidth(); |
302 const unsigned int height = image.GetHeight(); | |
303 | |
304 for (unsigned int y = 0; y < height; y++) | |
305 { | |
306 float* p = reinterpret_cast<float*>(image.GetRow(y)); | |
307 | |
308 if (useDouble) | |
309 { | |
310 // Slower, accurate implementation using double | |
311 for (unsigned int x = 0; x < width; x++, p++) | |
312 { | |
313 double value = static_cast<double>(*p); | |
1141
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
314 *p = static_cast<float>(value * factor + offset); |
746 | 315 } |
316 } | |
317 else | |
318 { | |
319 // Fast, approximate implementation using float | |
320 for (unsigned int x = 0; x < width; x++, p++) | |
321 { | |
1141
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
322 *p = (*p) * static_cast<float>(factor) + static_cast<float>(offset); |
746 | 323 } |
324 } | |
325 } | |
326 } | |
327 } | |
328 | |
329 double DicomInstanceParameters::GetRescaleIntercept() const | |
330 { | |
331 if (data_.hasRescale_) | |
332 { | |
333 return data_.rescaleIntercept_; | |
334 } | |
335 else | |
336 { | |
956
a7351ad54960
Made IsContextLost automatically set the flag by checking with the emscripten
Benjamin Golinvaux <bgo@osimis.io>
parents:
949
diff
changeset
|
337 LOG(ERROR) << "DicomInstanceParameters::GetRescaleIntercept(): !data_.hasRescale_"; |
746 | 338 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
339 } | |
340 } | |
341 | |
342 | |
343 double DicomInstanceParameters::GetRescaleSlope() const | |
344 { | |
345 if (data_.hasRescale_) | |
346 { | |
347 return data_.rescaleSlope_; | |
348 } | |
349 else | |
350 { | |
956
a7351ad54960
Made IsContextLost automatically set the flag by checking with the emscripten
Benjamin Golinvaux <bgo@osimis.io>
parents:
949
diff
changeset
|
351 LOG(ERROR) << "DicomInstanceParameters::GetRescaleSlope(): !data_.hasRescale_"; |
746 | 352 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
353 } | |
354 } | |
355 | |
356 | |
1637 | 357 Orthanc::PixelFormat DicomInstanceParameters::GetExpectedPixelFormat() const |
358 { | |
359 if (GetSopClassUid() == SopClassUid_RTDose) | |
360 { | |
361 switch (GetImageInformation().GetBitsStored()) | |
362 { | |
363 case 16: | |
364 return Orthanc::PixelFormat_Grayscale16; | |
365 | |
366 case 32: | |
367 return Orthanc::PixelFormat_Grayscale32; | |
368 | |
369 default: | |
370 return Orthanc::PixelFormat_Grayscale16; // Rough guess | |
371 } | |
372 } | |
373 else if (IsColor()) | |
374 { | |
375 return Orthanc::PixelFormat_RGB24; | |
376 } | |
377 else if (GetImageInformation().IsSigned()) | |
378 { | |
379 return Orthanc::PixelFormat_SignedGrayscale16; | |
380 } | |
381 else | |
382 { | |
383 return Orthanc::PixelFormat_Grayscale16; // Rough guess | |
384 } | |
385 } | |
386 | |
387 | |
746 | 388 float DicomInstanceParameters::GetDefaultWindowingCenter() const |
389 { | |
390 if (data_.hasDefaultWindowing_) | |
391 { | |
392 return data_.defaultWindowingCenter_; | |
393 } | |
394 else | |
395 { | |
1481 | 396 LOG(ERROR) << "DicomInstanceParameters::GetDefaultWindowingCenter(): no default windowing"; |
746 | 397 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
398 } | |
399 } | |
400 | |
401 | |
402 float DicomInstanceParameters::GetDefaultWindowingWidth() const | |
403 { | |
404 if (data_.hasDefaultWindowing_) | |
405 { | |
406 return data_.defaultWindowingWidth_; | |
407 } | |
408 else | |
409 { | |
1481 | 410 LOG(ERROR) << "DicomInstanceParameters::GetDefaultWindowingWidth(): no default windowing"; |
746 | 411 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
412 } | |
413 } | |
414 | |
415 | |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
416 Orthanc::ImageAccessor* DicomInstanceParameters::ConvertToFloat(const Orthanc::ImageAccessor& pixelData) const |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
417 { |
1298
8a0a62189f46
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1291
diff
changeset
|
418 std::unique_ptr<Orthanc::Image> converted(new Orthanc::Image(Orthanc::PixelFormat_Float32, |
1634
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
419 pixelData.GetWidth(), |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
420 pixelData.GetHeight(), |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
421 false)); |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
422 Orthanc::ImageProcessing::Convert(*converted, pixelData); |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
423 |
1287
8e82fdc6200e
Heavy (temporary) logging in the path that leads
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
424 |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
425 // Correct rescale slope/intercept if need be |
1636 | 426 //ApplyRescaleAndDoseScaling(*converted, (pixelData.GetFormat() == Orthanc::PixelFormat_Grayscale32)); |
427 ApplyRescaleAndDoseScaling(*converted, false); | |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
428 |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
429 return converted.release(); |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
430 } |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
431 |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
432 |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
433 TextureBaseSceneLayer* DicomInstanceParameters::CreateTexture |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
434 (const Orthanc::ImageAccessor& pixelData) const |
746 | 435 { |
1353
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
436 // { |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
437 // const Orthanc::ImageAccessor& source = pixelData; |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
438 // const void* sourceBuffer = source.GetConstBuffer(); |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
439 // intptr_t sourceBufferInt = reinterpret_cast<intptr_t>(sourceBuffer); |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
440 // int sourceWidth = source.GetWidth(); |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
441 // int sourceHeight = source.GetHeight(); |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
442 // int sourcePitch = source.GetPitch(); |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
443 |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
444 // // TODO: turn error into trace below |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
445 // LOG(ERROR) << "ConvertGrayscaleToFloat | source:" |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
446 // << " W = " << sourceWidth << " H = " << sourceHeight |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
447 // << " P = " << sourcePitch << " B = " << sourceBufferInt |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
448 // << " B % 4 == " << sourceBufferInt % 4; |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
449 // } |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
450 |
746 | 451 assert(sizeof(float) == 4); |
452 | |
453 Orthanc::PixelFormat sourceFormat = pixelData.GetFormat(); | |
454 | |
455 if (sourceFormat != GetExpectedPixelFormat()) | |
456 { | |
457 throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); | |
458 } | |
459 | |
460 if (sourceFormat == Orthanc::PixelFormat_RGB24) | |
461 { | |
462 // This is the case of a color image. No conversion has to be done. | |
463 return new ColorTextureSceneLayer(pixelData); | |
464 } | |
465 else | |
466 { | |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
467 // This is the case of a grayscale frame. Convert it to Float32. |
1298
8a0a62189f46
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1291
diff
changeset
|
468 std::unique_ptr<FloatTextureSceneLayer> texture; |
746 | 469 |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
470 if (pixelData.GetFormat() == Orthanc::PixelFormat_Float32) |
746 | 471 { |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
472 texture.reset(new FloatTextureSceneLayer(pixelData)); |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
473 } |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
474 else |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
475 { |
1298
8a0a62189f46
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1291
diff
changeset
|
476 std::unique_ptr<Orthanc::ImageAccessor> converted(ConvertToFloat(pixelData)); |
746 | 477 texture.reset(new FloatTextureSceneLayer(*converted)); |
478 } | |
479 | |
480 if (data_.hasDefaultWindowing_) | |
481 { | |
482 texture->SetCustomWindowing(data_.defaultWindowingCenter_, | |
483 data_.defaultWindowingWidth_); | |
484 } | |
1206
c93a6218f0cd
Fixed photometric interpretation in texture creation
Benjamin Golinvaux <bgo@osimis.io>
parents:
1141
diff
changeset
|
485 |
1642
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
486 switch (GetImageInformation().GetPhotometricInterpretation()) |
1206
c93a6218f0cd
Fixed photometric interpretation in texture creation
Benjamin Golinvaux <bgo@osimis.io>
parents:
1141
diff
changeset
|
487 { |
1634
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
488 case Orthanc::PhotometricInterpretation_Monochrome1: |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
489 texture->SetInverted(true); |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
490 break; |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
491 |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
492 case Orthanc::PhotometricInterpretation_Monochrome2: |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
493 texture->SetInverted(false); |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
494 break; |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
495 |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
496 default: |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
497 break; |
1206
c93a6218f0cd
Fixed photometric interpretation in texture creation
Benjamin Golinvaux <bgo@osimis.io>
parents:
1141
diff
changeset
|
498 } |
c93a6218f0cd
Fixed photometric interpretation in texture creation
Benjamin Golinvaux <bgo@osimis.io>
parents:
1141
diff
changeset
|
499 |
746 | 500 return texture.release(); |
501 } | |
502 } | |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
503 |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
504 |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
505 LookupTableTextureSceneLayer* DicomInstanceParameters::CreateLookupTableTexture |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
506 (const Orthanc::ImageAccessor& pixelData) const |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
507 { |
1298
8a0a62189f46
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1291
diff
changeset
|
508 std::unique_ptr<FloatTextureSceneLayer> texture; |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
509 |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
510 if (pixelData.GetFormat() == Orthanc::PixelFormat_Float32) |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
511 { |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
512 return new LookupTableTextureSceneLayer(pixelData); |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
513 } |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
514 else |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
515 { |
1298
8a0a62189f46
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1291
diff
changeset
|
516 std::unique_ptr<Orthanc::ImageAccessor> converted(ConvertToFloat(pixelData)); |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
517 return new LookupTableTextureSceneLayer(*converted); |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
518 } |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
519 } |
980
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
520 |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
521 |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
522 unsigned int DicomInstanceParameters::GetIndexInSeries() const |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
523 { |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
524 if (data_.hasIndexInSeries_) |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
525 { |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
526 return data_.indexInSeries_; |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
527 } |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
528 else |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
529 { |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
530 LOG(ERROR) << "DicomInstanceParameters::GetIndexInSeries(): !data_.hasIndexInSeries_"; |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
531 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
532 } |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
533 } |
1159
acb399643945
DicomInstanceParameters::ApplyRescale()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1141
diff
changeset
|
534 |
acb399643945
DicomInstanceParameters::ApplyRescale()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1141
diff
changeset
|
535 |
1636 | 536 double DicomInstanceParameters::ApplyRescale(double value) const |
1159
acb399643945
DicomInstanceParameters::ApplyRescale()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1141
diff
changeset
|
537 { |
1636 | 538 double factor = data_.doseGridScaling_; |
1159
acb399643945
DicomInstanceParameters::ApplyRescale()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1141
diff
changeset
|
539 double offset = 0.0; |
acb399643945
DicomInstanceParameters::ApplyRescale()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1141
diff
changeset
|
540 |
1636 | 541 if (data_.hasRescale_) |
1159
acb399643945
DicomInstanceParameters::ApplyRescale()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1141
diff
changeset
|
542 { |
1636 | 543 factor *= data_.rescaleSlope_; |
544 offset = data_.rescaleIntercept_; | |
1159
acb399643945
DicomInstanceParameters::ApplyRescale()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1141
diff
changeset
|
545 } |
acb399643945
DicomInstanceParameters::ApplyRescale()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1141
diff
changeset
|
546 |
acb399643945
DicomInstanceParameters::ApplyRescale()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1141
diff
changeset
|
547 return (value * factor + offset); |
acb399643945
DicomInstanceParameters::ApplyRescale()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1141
diff
changeset
|
548 } |
1161
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
549 |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
550 |
1636 | 551 bool DicomInstanceParameters::ComputeRegularSpacing(double& spacing) const |
1161
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
552 { |
1636 | 553 if (data_.frameOffsets_.size() == 0) // Not a RT-DOSE |
1161
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
554 { |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
555 return false; |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
556 } |
1636 | 557 else if (data_.frameOffsets_.size() == 1) |
1161
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
558 { |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
559 spacing = 1; // Edge case: RT-DOSE with one single frame |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
560 return true; |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
561 } |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
562 else |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
563 { |
1636 | 564 assert(data_.frameOffsets_.size() == GetNumberOfFrames()); |
565 | |
566 spacing = std::abs(data_.frameOffsets_[1] - data_.frameOffsets_[0]); | |
1161
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
567 |
1636 | 568 for (size_t i = 1; i + 1 < data_.frameOffsets_.size(); i++) |
1161
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
569 { |
1636 | 570 double s = data_.frameOffsets_[i + 1] - data_.frameOffsets_[i]; |
1161
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
571 if (!LinearAlgebra::IsNear(spacing, s, 0.001)) |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
572 { |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
573 return false; |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
574 } |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
575 } |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
576 |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
577 return true; |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
578 } |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
579 } |
746 | 580 } |