Mercurial > hg > orthanc-stone
annotate OrthancStone/Sources/Toolbox/DicomInstanceParameters.cpp @ 2177:4d21befb1501 default tip
clarify DICOMweb version check
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 23 Oct 2024 19:27:56 +0200 |
parents | 43ef60388fa2 |
children |
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 | |
2124
16c01cc201e7
updated copyright, as Osimis is not active on Orthanc anymore
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2114
diff
changeset
|
5 * Copyright (C) 2017-2023 Osimis S.A., Belgium |
2114
c23eef785569
update year to 2024
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2077
diff
changeset
|
6 * Copyright (C) 2021-2024 Sebastien Jodogne, ICTEAM UCLouvain, Belgium |
746 | 7 * |
8 * 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
|
9 * modify it under the terms of the GNU Lesser General Public License |
746 | 10 * as published by the Free Software Foundation, either version 3 of |
11 * the License, or (at your option) any later version. | |
12 * | |
13 * This program is distributed in the hope that it will be useful, but | |
14 * 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
|
15 * 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
|
16 * Lesser General Public License for more details. |
1596
4fb8fdf03314
removed annoying whitespace
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1571
diff
changeset
|
17 * |
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
|
18 * 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
|
19 * 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
|
20 * <http://www.gnu.org/licenses/>. |
746 | 21 **/ |
22 | |
23 | |
24 #include "DicomInstanceParameters.h" | |
25 | |
26 #include "../Scene2D/ColorTextureSceneLayer.h" | |
27 #include "../Scene2D/FloatTextureSceneLayer.h" | |
1750 | 28 #include "GeometryToolbox.h" |
29 #include "ImageToolbox.h" | |
2174
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
30 #include "OrthancDatasets/DicomDatasetReader.h" |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
31 #include "OrthancDatasets/DicomWebDataset.h" |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
32 #include "OrthancDatasets/OrthancNativeDataset.h" |
746 | 33 |
1455
30deba7bc8e2
simplifying include_directories
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1353
diff
changeset
|
34 #include <Images/Image.h> |
30deba7bc8e2
simplifying include_directories
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1353
diff
changeset
|
35 #include <Images/ImageProcessing.h> |
30deba7bc8e2
simplifying include_directories
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1353
diff
changeset
|
36 #include <Logging.h> |
30deba7bc8e2
simplifying include_directories
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1353
diff
changeset
|
37 #include <OrthancException.h> |
2171
8e3c403cc643
Improved support of the (0028,9132) tag for Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2169
diff
changeset
|
38 #include <SerializationToolbox.h> |
1455
30deba7bc8e2
simplifying include_directories
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1353
diff
changeset
|
39 #include <Toolbox.h> |
746 | 40 |
41 | |
42 namespace OrthancStone | |
43 { | |
1636 | 44 static void ExtractFrameOffsets(Vector& target, |
45 const Orthanc::DicomMap& dicom, | |
46 unsigned int numberOfFrames) | |
746 | 47 { |
48 // http://dicom.nema.org/medical/Dicom/2016a/output/chtml/part03/sect_C.8.8.3.2.html | |
49 | |
1634
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
50 std::string increment; |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
51 |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
52 if (dicom.LookupStringValue(increment, Orthanc::DICOM_TAG_FRAME_INCREMENT_POINTER, false)) |
746 | 53 { |
1634
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
54 Orthanc::Toolbox::ToUpperCase(increment); |
1635
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
55 |
1746
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
56 // We only support volumes where the FrameIncrementPointer (0028,0009) (required) contains |
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
57 // the "Grid Frame Offset Vector" tag (DICOM_TAG_GRID_FRAME_OFFSET_VECTOR) |
1635
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
58 if (increment != "3004,000C") |
746 | 59 { |
1634
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
60 LOG(WARNING) << "Bad value for the FrameIncrementPointer tags in a multiframe image"; |
1636 | 61 target.resize(0); |
1634
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
62 return; |
746 | 63 } |
64 } | |
65 | |
1636 | 66 if (!LinearAlgebra::ParseVector(target, dicom, Orthanc::DICOM_TAG_GRID_FRAME_OFFSET_VECTOR) || |
67 target.size() != numberOfFrames) | |
746 | 68 { |
1746
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
69 LOG(ERROR) << "The frame offset information (GridFrameOffsetVector (3004,000C)) is missing in a multiframe image"; |
1635
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
70 |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
71 // DO NOT use ".clear()" here, as the "Vector" class doesn't behave like std::vector! |
1636 | 72 target.resize(0); |
746 | 73 } |
74 } | |
75 | |
76 | |
1642
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
77 DicomInstanceParameters::Data::Data(const Orthanc::DicomMap& dicom) |
746 | 78 { |
994
1f74bc3459ba
fix build due to rename in Orthanc::DicomMap
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
980
diff
changeset
|
79 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
|
80 !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
|
81 !dicom.LookupStringValue(sopInstanceUid_, Orthanc::DICOM_TAG_SOP_INSTANCE_UID, false)) |
746 | 82 { |
83 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); | |
84 } | |
85 | |
86 std::string s; | |
1635
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
87 if (dicom.LookupStringValue(s, Orthanc::DICOM_TAG_SOP_CLASS_UID, false)) |
746 | 88 { |
1635
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
89 sopClassUid_ = StringToSopClassUid(s); |
746 | 90 } |
91 else | |
92 { | |
1635
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
93 sopClassUid_ = SopClassUid_Other; |
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 |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
96 uint32_t n; |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
97 if (dicom.ParseUnsignedInteger32(n, Orthanc::DICOM_TAG_NUMBER_OF_FRAMES)) |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
98 { |
1846
2789b4b0e0a8
DicomInstanceParameters::HasNumberOfFrames() and DicomInstanceParameters::GetInstanceNumber()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1822
diff
changeset
|
99 hasNumberOfFrames_ = true; |
1635
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
100 numberOfFrames_ = n; |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
101 } |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
102 else |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
103 { |
1846
2789b4b0e0a8
DicomInstanceParameters::HasNumberOfFrames() and DicomInstanceParameters::GetInstanceNumber()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1822
diff
changeset
|
104 hasNumberOfFrames_ = false; |
1635
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
105 numberOfFrames_ = 1; |
746 | 106 } |
107 | |
1635
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
108 if (!dicom.HasTag(Orthanc::DICOM_TAG_COLUMNS) || |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
109 !dicom.GetValue(Orthanc::DICOM_TAG_COLUMNS).ParseFirstUnsignedInteger(width_)) |
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 width_ = 0; |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
112 } |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
113 |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
114 if (!dicom.HasTag(Orthanc::DICOM_TAG_ROWS) || |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
115 !dicom.GetValue(Orthanc::DICOM_TAG_ROWS).ParseFirstUnsignedInteger(height_)) |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
116 { |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
117 height_ = 0; |
1772
6c246f862b00
unit test VolumeRendering.Basic
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1750
diff
changeset
|
118 } |
1635
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
119 |
1746
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
120 |
2076
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
121 if (dicom.ParseDouble(sliceThickness_, Orthanc::DICOM_TAG_SLICE_THICKNESS)) |
746 | 122 { |
2076
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
123 hasSliceThickness_ = true; |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
124 } |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
125 else |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
126 { |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
127 hasSliceThickness_ = false; |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
128 |
1772
6c246f862b00
unit test VolumeRendering.Basic
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1750
diff
changeset
|
129 if (numberOfFrames_ > 1) |
6c246f862b00
unit test VolumeRendering.Basic
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1750
diff
changeset
|
130 { |
6c246f862b00
unit test VolumeRendering.Basic
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1750
diff
changeset
|
131 LOG(INFO) << "The (non-madatory) slice thickness information is missing in a multiframe image"; |
6c246f862b00
unit test VolumeRendering.Basic
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1750
diff
changeset
|
132 } |
746 | 133 } |
134 | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1817
diff
changeset
|
135 hasPixelSpacing_ = GeometryToolbox::GetPixelSpacing(pixelSpacingX_, pixelSpacingY_, dicom); |
746 | 136 |
137 std::string position, orientation; | |
994
1f74bc3459ba
fix build due to rename in Orthanc::DicomMap
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
980
diff
changeset
|
138 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
|
139 dicom.LookupStringValue(orientation, Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, false)) |
746 | 140 { |
141 geometry_ = CoordinateSystem3D(position, orientation); | |
142 } | |
143 | |
1635
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
144 // Must be AFTER setting "numberOfFrames_" |
1639 | 145 if (numberOfFrames_ > 1) |
146 { | |
147 ExtractFrameOffsets(frameOffsets_, dicom, numberOfFrames_); | |
148 } | |
1634
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
149 |
746 | 150 if (sopClassUid_ == SopClassUid_RTDose) |
151 { | |
1091
5a18e6a395bc
Added DoseUnit tag retrieval to DicomInstanceParameters
Benjamin Golinvaux <bgo@osimis.io>
parents:
1027
diff
changeset
|
152 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
|
153 |
5a18e6a395bc
Added DoseUnit tag retrieval to DicomInstanceParameters
Benjamin Golinvaux <bgo@osimis.io>
parents:
1027
diff
changeset
|
154 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
|
155 { |
1141
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
156 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
|
157 doseUnits_.clear(); |
1091
5a18e6a395bc
Added DoseUnit tag retrieval to DicomInstanceParameters
Benjamin Golinvaux <bgo@osimis.io>
parents:
1027
diff
changeset
|
158 } |
746 | 159 } |
160 | |
161 if (dicom.ParseDouble(rescaleIntercept_, Orthanc::DICOM_TAG_RESCALE_INTERCEPT) && | |
162 dicom.ParseDouble(rescaleSlope_, Orthanc::DICOM_TAG_RESCALE_SLOPE)) | |
163 { | |
1141
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
164 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
|
165 { |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
166 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
|
167 // 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
|
168 hasRescale_ = false; |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
169 } |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
170 else |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
171 { |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
172 hasRescale_ = true; |
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 |
746 | 175 } |
176 else | |
177 { | |
178 hasRescale_ = false; | |
179 } | |
180 | |
1141
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
181 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
|
182 { |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
183 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
|
184 { |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
185 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
|
186 } |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
187 } |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
188 else |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
189 { |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
190 doseGridScaling_ = 1.0; |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
191 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
|
192 { |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
193 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
|
194 } |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
195 } |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
196 |
2169
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
197 |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
198 windowingPresets_.clear(); |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
199 |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
200 Vector centers, widths; |
1677
51bab5188a13
start multiple preset windowings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1646
diff
changeset
|
201 |
2169
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
202 if (LinearAlgebra::ParseVector(centers, dicom, Orthanc::DICOM_TAG_WINDOW_CENTER) && |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
203 LinearAlgebra::ParseVector(widths, dicom, Orthanc::DICOM_TAG_WINDOW_WIDTH)) |
746 | 204 { |
2169
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
205 if (centers.size() == widths.size()) |
1677
51bab5188a13
start multiple preset windowings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1646
diff
changeset
|
206 { |
2169
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
207 windowingPresets_.resize(centers.size()); |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
208 |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
209 for (size_t i = 0; i < centers.size(); i++) |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
210 { |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
211 windowingPresets_[i] = Windowing(centers[i], widths[i]); |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
212 } |
1677
51bab5188a13
start multiple preset windowings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1646
diff
changeset
|
213 } |
51bab5188a13
start multiple preset windowings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1646
diff
changeset
|
214 else |
51bab5188a13
start multiple preset windowings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1646
diff
changeset
|
215 { |
51bab5188a13
start multiple preset windowings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1646
diff
changeset
|
216 LOG(ERROR) << "Mismatch in the number of preset windowing widths/centers, ignoring this"; |
51bab5188a13
start multiple preset windowings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1646
diff
changeset
|
217 } |
746 | 218 } |
1677
51bab5188a13
start multiple preset windowings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1646
diff
changeset
|
219 |
980
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
220 // This computes the "IndexInSeries" metadata from Orthanc (check |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
221 // out "Orthanc::ServerIndex::Store()") |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
222 hasIndexInSeries_ = ( |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
223 dicom.ParseUnsignedInteger32(indexInSeries_, Orthanc::DICOM_TAG_INSTANCE_NUMBER) || |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
224 dicom.ParseUnsignedInteger32(indexInSeries_, Orthanc::DICOM_TAG_IMAGE_INDEX)); |
1646
4e14735e98f8
preparing to remove FrameExtent
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1642
diff
changeset
|
225 |
4e14735e98f8
preparing to remove FrameExtent
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1642
diff
changeset
|
226 if (!dicom.LookupStringValue( |
4e14735e98f8
preparing to remove FrameExtent
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1642
diff
changeset
|
227 frameOfReferenceUid_, Orthanc::DICOM_TAG_FRAME_OF_REFERENCE_UID, false)) |
4e14735e98f8
preparing to remove FrameExtent
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1642
diff
changeset
|
228 { |
4e14735e98f8
preparing to remove FrameExtent
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1642
diff
changeset
|
229 frameOfReferenceUid_.clear(); |
4e14735e98f8
preparing to remove FrameExtent
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1642
diff
changeset
|
230 } |
1846
2789b4b0e0a8
DicomInstanceParameters::HasNumberOfFrames() and DicomInstanceParameters::GetInstanceNumber()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1822
diff
changeset
|
231 |
2789b4b0e0a8
DicomInstanceParameters::HasNumberOfFrames() and DicomInstanceParameters::GetInstanceNumber()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1822
diff
changeset
|
232 if (!dicom.HasTag(Orthanc::DICOM_TAG_INSTANCE_NUMBER) || |
2789b4b0e0a8
DicomInstanceParameters::HasNumberOfFrames() and DicomInstanceParameters::GetInstanceNumber()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1822
diff
changeset
|
233 !dicom.GetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER).ParseInteger32(instanceNumber_)) |
2789b4b0e0a8
DicomInstanceParameters::HasNumberOfFrames() and DicomInstanceParameters::GetInstanceNumber()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1822
diff
changeset
|
234 { |
2789b4b0e0a8
DicomInstanceParameters::HasNumberOfFrames() and DicomInstanceParameters::GetInstanceNumber()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1822
diff
changeset
|
235 instanceNumber_ = 0; |
2789b4b0e0a8
DicomInstanceParameters::HasNumberOfFrames() and DicomInstanceParameters::GetInstanceNumber()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1822
diff
changeset
|
236 } |
2174
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
237 } |
2171
8e3c403cc643
Improved support of the (0028,9132) tag for Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2169
diff
changeset
|
238 |
8e3c403cc643
Improved support of the (0028,9132) tag for Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2169
diff
changeset
|
239 |
2174
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
240 void DicomInstanceParameters::InjectSequenceTags(const IDicomDataset& dataset) |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
241 { |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
242 /** |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
243 * Use DICOM tag "SequenceOfUltrasoundRegions" (0018,6011) in |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
244 * order to derive the pixel spacing on ultrasound (US) images |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
245 **/ |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
246 |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
247 static const Orthanc::DicomTag DICOM_TAG_SEQUENCE_OF_ULTRASOUND_REGIONS(0x0018, 0x6011); |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
248 static const Orthanc::DicomTag DICOM_TAG_PHYSICAL_UNITS_X_DIRECTION(0x0018, 0x6024); |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
249 static const Orthanc::DicomTag DICOM_TAG_PHYSICAL_UNITS_Y_DIRECTION(0x0018, 0x6026); |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
250 static const Orthanc::DicomTag DICOM_TAG_PHYSICAL_DELTA_X(0x0018, 0x602c); |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
251 static const Orthanc::DicomTag DICOM_TAG_PHYSICAL_DELTA_Y(0x0018, 0x602e); |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
252 |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
253 DicomDatasetReader reader(dataset); |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
254 |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
255 size_t size; |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
256 |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
257 if (!data_.hasPixelSpacing_ && |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
258 dataset.GetSequenceSize(size, Orthanc::DicomPath(DICOM_TAG_SEQUENCE_OF_ULTRASOUND_REGIONS)) && |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
259 size == 1) |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
260 { |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
261 int directionX, directionY; |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
262 double deltaX, deltaY; |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
263 |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
264 if (reader.GetIntegerValue(directionX, Orthanc::DicomPath(DICOM_TAG_SEQUENCE_OF_ULTRASOUND_REGIONS, |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
265 0, DICOM_TAG_PHYSICAL_UNITS_X_DIRECTION)) && |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
266 reader.GetIntegerValue(directionY, Orthanc::DicomPath(DICOM_TAG_SEQUENCE_OF_ULTRASOUND_REGIONS, |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
267 0, DICOM_TAG_PHYSICAL_UNITS_Y_DIRECTION)) && |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
268 reader.GetDoubleValue(deltaX, Orthanc::DicomPath(DICOM_TAG_SEQUENCE_OF_ULTRASOUND_REGIONS, |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
269 0, DICOM_TAG_PHYSICAL_DELTA_X)) && |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
270 reader.GetDoubleValue(deltaY, Orthanc::DicomPath(DICOM_TAG_SEQUENCE_OF_ULTRASOUND_REGIONS, |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
271 0, DICOM_TAG_PHYSICAL_DELTA_Y)) && |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
272 directionX == 0x0003 && // Centimeters |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
273 directionY == 0x0003) // Centimeters |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
274 { |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
275 // Scene coordinates are expressed in millimeters => multiplication by 10 |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
276 SetPixelSpacing(10.0 * deltaX, 10.0 * deltaY); |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
277 } |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
278 } |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
279 |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
280 |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
281 /** |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
282 * New in Stone Web viewer 2.2: Deal with Philips multiframe |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
283 * (cf. mail from Tomas Kenda on 2021-08-17). This cannot be done |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
284 * in LoadSeriesDetailsFromInstance, as the "Per Frame Functional |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
285 * Groups Sequence" is not available at that point. |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
286 **/ |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
287 |
2171
8e3c403cc643
Improved support of the (0028,9132) tag for Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2169
diff
changeset
|
288 static const Orthanc::DicomTag DICOM_TAG_PER_FRAME_FUNCTIONAL_GROUPS_SEQUENCE(0x5200, 0x9230); |
8e3c403cc643
Improved support of the (0028,9132) tag for Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2169
diff
changeset
|
289 static const Orthanc::DicomTag DICOM_TAG_FRAME_VOI_LUT_SEQUENCE_ATTRIBUTE(0x0028, 0x9132); |
8e3c403cc643
Improved support of the (0028,9132) tag for Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2169
diff
changeset
|
290 |
2174
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
291 if (dataset.GetSequenceSize(size, Orthanc::DicomPath(DICOM_TAG_PER_FRAME_FUNCTIONAL_GROUPS_SEQUENCE))) |
2171
8e3c403cc643
Improved support of the (0028,9132) tag for Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2169
diff
changeset
|
292 { |
2174
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
293 data_.perFrameWindowing_.resize(data_.numberOfFrames_); |
2171
8e3c403cc643
Improved support of the (0028,9132) tag for Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2169
diff
changeset
|
294 |
8e3c403cc643
Improved support of the (0028,9132) tag for Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2169
diff
changeset
|
295 // This corresponds to "ParsedDicomFile::GetDefaultWindowing()" |
2174
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
296 for (size_t i = 0; i < size; i++) |
2171
8e3c403cc643
Improved support of the (0028,9132) tag for Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2169
diff
changeset
|
297 { |
2174
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
298 size_t tmp; |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
299 double center, width; |
2171
8e3c403cc643
Improved support of the (0028,9132) tag for Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2169
diff
changeset
|
300 |
2174
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
301 if (dataset.GetSequenceSize(tmp, Orthanc::DicomPath(DICOM_TAG_PER_FRAME_FUNCTIONAL_GROUPS_SEQUENCE, i, |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
302 DICOM_TAG_FRAME_VOI_LUT_SEQUENCE_ATTRIBUTE)) && |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
303 tmp == 1 && |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
304 reader.GetDoubleValue(center, Orthanc::DicomPath(DICOM_TAG_PER_FRAME_FUNCTIONAL_GROUPS_SEQUENCE, i, |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
305 DICOM_TAG_FRAME_VOI_LUT_SEQUENCE_ATTRIBUTE, 0, |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
306 Orthanc::DICOM_TAG_WINDOW_CENTER)) && |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
307 reader.GetDoubleValue(width, Orthanc::DicomPath(DICOM_TAG_PER_FRAME_FUNCTIONAL_GROUPS_SEQUENCE, i, |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
308 DICOM_TAG_FRAME_VOI_LUT_SEQUENCE_ATTRIBUTE, 0, |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
309 Orthanc::DICOM_TAG_WINDOW_WIDTH))) |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
310 { |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
311 data_.perFrameWindowing_[i] = Windowing(center, width); |
2171
8e3c403cc643
Improved support of the (0028,9132) tag for Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2169
diff
changeset
|
312 } |
8e3c403cc643
Improved support of the (0028,9132) tag for Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2169
diff
changeset
|
313 } |
8e3c403cc643
Improved support of the (0028,9132) tag for Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2169
diff
changeset
|
314 } |
746 | 315 } |
316 | |
317 | |
2174
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
318 DicomInstanceParameters::DicomInstanceParameters(const DicomInstanceParameters& other) : |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
319 data_(other.data_), |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
320 tags_(other.tags_->Clone()) |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
321 { |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
322 } |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
323 |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
324 |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
325 DicomInstanceParameters::DicomInstanceParameters(const Orthanc::DicomMap& dicom) : |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
326 data_(dicom), |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
327 tags_(dicom.Clone()) |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
328 { |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
329 OrthancNativeDataset dataset(dicom); |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
330 InjectSequenceTags(dataset); |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
331 } |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
332 |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
333 |
2076
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
334 double DicomInstanceParameters::GetSliceThickness() const |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
335 { |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
336 if (data_.hasSliceThickness_) |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
337 { |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
338 return data_.sliceThickness_; |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
339 } |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
340 else |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
341 { |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
342 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
343 } |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
344 } |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
345 |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
346 |
1642
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
347 const Orthanc::DicomImageInformation& DicomInstanceParameters::GetImageInformation() const |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
348 { |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
349 assert(tags_.get() != NULL); |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
350 |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
351 if (imageInformation_.get() == NULL) |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
352 { |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
353 const_cast<DicomInstanceParameters&>(*this).imageInformation_. |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
354 reset(new Orthanc::DicomImageInformation(GetTags())); |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
355 |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
356 assert(imageInformation_->GetWidth() == GetWidth()); |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
357 assert(imageInformation_->GetHeight() == GetHeight()); |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
358 assert(imageInformation_->GetNumberOfFrames() == GetNumberOfFrames()); |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
359 } |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
360 |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
361 assert(imageInformation_.get() != NULL); |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
362 return *imageInformation_; |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
363 } |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
364 |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
365 |
1636 | 366 CoordinateSystem3D DicomInstanceParameters::GetFrameGeometry(unsigned int frame) const |
746 | 367 { |
1636 | 368 if (frame >= data_.numberOfFrames_) |
746 | 369 { |
370 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
371 } | |
1636 | 372 else if (data_.frameOffsets_.empty()) |
746 | 373 { |
1636 | 374 return data_.geometry_; |
1634
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
375 } |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
376 else |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
377 { |
1636 | 378 assert(data_.frameOffsets_.size() == data_.numberOfFrames_); |
746 | 379 |
380 return CoordinateSystem3D( | |
1636 | 381 data_.geometry_.GetOrigin() + data_.frameOffsets_[frame] * data_.geometry_.GetNormal(), |
382 data_.geometry_.GetAxisX(), | |
383 data_.geometry_.GetAxisY()); | |
746 | 384 } |
385 } | |
386 | |
387 | |
1636 | 388 bool DicomInstanceParameters::IsPlaneWithinSlice(unsigned int frame, |
389 const CoordinateSystem3D& plane) const | |
746 | 390 { |
1636 | 391 if (frame >= data_.numberOfFrames_) |
746 | 392 { |
393 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
394 } | |
395 | |
1636 | 396 CoordinateSystem3D tmp = data_.geometry_; |
746 | 397 |
398 if (frame != 0) | |
399 { | |
400 tmp = GetFrameGeometry(frame); | |
401 } | |
402 | |
403 double distance; | |
404 | |
757 | 405 return (CoordinateSystem3D::ComputeDistance(distance, tmp, plane) && |
1636 | 406 distance <= data_.sliceThickness_ / 2.0); |
746 | 407 } |
408 | |
1637 | 409 |
410 bool DicomInstanceParameters::IsColor() const | |
411 { | |
412 Orthanc::PhotometricInterpretation photometric = | |
1642
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
413 GetImageInformation().GetPhotometricInterpretation(); |
1637 | 414 |
415 return (photometric != Orthanc::PhotometricInterpretation_Monochrome1 && | |
416 photometric != Orthanc::PhotometricInterpretation_Monochrome2); | |
417 } | |
418 | |
419 | |
1636 | 420 void DicomInstanceParameters::ApplyRescaleAndDoseScaling(Orthanc::ImageAccessor& image, |
421 bool useDouble) const | |
746 | 422 { |
423 if (image.GetFormat() != Orthanc::PixelFormat_Float32) | |
424 { | |
425 throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); | |
426 } | |
1141
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
427 |
1924
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
428 double scaling = data_.doseGridScaling_; |
1141
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
429 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
|
430 |
1636 | 431 if (data_.hasRescale_) |
746 | 432 { |
1924
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
433 scaling *= data_.rescaleSlope_; |
1636 | 434 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
|
435 } |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
436 |
1924
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
437 Orthanc::ImageProcessing::ShiftScale2(image, offset, scaling, false); |
746 | 438 } |
1924
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
439 |
746 | 440 |
441 double DicomInstanceParameters::GetRescaleIntercept() const | |
442 { | |
443 if (data_.hasRescale_) | |
444 { | |
445 return data_.rescaleIntercept_; | |
446 } | |
447 else | |
448 { | |
956
a7351ad54960
Made IsContextLost automatically set the flag by checking with the emscripten
Benjamin Golinvaux <bgo@osimis.io>
parents:
949
diff
changeset
|
449 LOG(ERROR) << "DicomInstanceParameters::GetRescaleIntercept(): !data_.hasRescale_"; |
746 | 450 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
451 } | |
452 } | |
453 | |
454 | |
455 double DicomInstanceParameters::GetRescaleSlope() const | |
456 { | |
457 if (data_.hasRescale_) | |
458 { | |
459 return data_.rescaleSlope_; | |
460 } | |
461 else | |
462 { | |
956
a7351ad54960
Made IsContextLost automatically set the flag by checking with the emscripten
Benjamin Golinvaux <bgo@osimis.io>
parents:
949
diff
changeset
|
463 LOG(ERROR) << "DicomInstanceParameters::GetRescaleSlope(): !data_.hasRescale_"; |
746 | 464 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
465 } | |
466 } | |
467 | |
468 | |
1637 | 469 Orthanc::PixelFormat DicomInstanceParameters::GetExpectedPixelFormat() const |
470 { | |
471 if (GetSopClassUid() == SopClassUid_RTDose) | |
472 { | |
473 switch (GetImageInformation().GetBitsStored()) | |
474 { | |
475 case 16: | |
476 return Orthanc::PixelFormat_Grayscale16; | |
477 | |
478 case 32: | |
479 return Orthanc::PixelFormat_Grayscale32; | |
480 | |
481 default: | |
482 return Orthanc::PixelFormat_Grayscale16; // Rough guess | |
483 } | |
484 } | |
485 else if (IsColor()) | |
486 { | |
487 return Orthanc::PixelFormat_RGB24; | |
488 } | |
489 else if (GetImageInformation().IsSigned()) | |
490 { | |
491 return Orthanc::PixelFormat_SignedGrayscale16; | |
492 } | |
493 else | |
494 { | |
495 return Orthanc::PixelFormat_Grayscale16; // Rough guess | |
496 } | |
497 } | |
498 | |
499 | |
2169
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
500 Windowing DicomInstanceParameters::GetFallbackWindowing() const |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
501 { |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
502 double a, b; |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
503 if (tags_->ParseDouble(a, Orthanc::DICOM_TAG_SMALLEST_IMAGE_PIXEL_VALUE) && |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
504 tags_->ParseDouble(b, Orthanc::DICOM_TAG_LARGEST_IMAGE_PIXEL_VALUE)) |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
505 { |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
506 const double center = (a + b) / 2.0f; |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
507 const double width = (b - a); |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
508 return Windowing(center, width); |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
509 } |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
510 |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
511 // Added in Stone Web viewer > 2.5 |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
512 uint32_t bitsStored, pixelRepresentation; |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
513 if (tags_->ParseUnsignedInteger32(bitsStored, Orthanc::DICOM_TAG_BITS_STORED) && |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
514 tags_->ParseUnsignedInteger32(pixelRepresentation, Orthanc::DICOM_TAG_PIXEL_REPRESENTATION)) |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
515 { |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
516 const bool isSigned = (pixelRepresentation != 0); |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
517 const float maximum = powf(2.0, bitsStored); |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
518 return Windowing(isSigned ? 0.0f : maximum / 2.0f, maximum); |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
519 } |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
520 else |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
521 { |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
522 // Cannot infer a suitable windowing from the available tags |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
523 return Windowing(); |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
524 } |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
525 } |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
526 |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
527 |
1679
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
528 size_t DicomInstanceParameters::GetWindowingPresetsCount() const |
746 | 529 { |
2169
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
530 return data_.windowingPresets_.size(); |
1677
51bab5188a13
start multiple preset windowings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1646
diff
changeset
|
531 } |
51bab5188a13
start multiple preset windowings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1646
diff
changeset
|
532 |
51bab5188a13
start multiple preset windowings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1646
diff
changeset
|
533 |
2169
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
534 Windowing DicomInstanceParameters::GetWindowingPreset(size_t i) const |
1677
51bab5188a13
start multiple preset windowings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1646
diff
changeset
|
535 { |
1679
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
536 if (i < GetWindowingPresetsCount()) |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
537 { |
2169
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
538 return data_.windowingPresets_[i]; |
1679
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
539 } |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
540 else |
746 | 541 { |
1679
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
542 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
543 } |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
544 } |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
545 |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
546 |
2169
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
547 Windowing DicomInstanceParameters::GetWindowingPresetsUnion() const |
746 | 548 { |
1679
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
549 assert(tags_.get() != NULL); |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
550 size_t s = GetWindowingPresetsCount(); |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
551 |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
552 if (s > 0) |
746 | 553 { |
1679
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
554 // Use the largest windowing given all the preset windowings |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
555 // that are available in the DICOM tags |
2169
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
556 double low, high; |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
557 GetWindowingPreset(0).GetBounds(low, high); |
1679
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
558 |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
559 for (size_t i = 1; i < s; i++) |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
560 { |
2169
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
561 double a, b; |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
562 GetWindowingPreset(i).GetBounds(a, b); |
1679
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
563 low = std::min(low, a); |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
564 high = std::max(high, b); |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
565 } |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
566 |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
567 assert(low <= high); |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
568 |
2169
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
569 if (!LinearAlgebra::IsNear(low, high)) |
1679
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
570 { |
2169
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
571 const double center = (low + high) / 2.0f; |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
572 const double width = (high - low); |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
573 return Windowing(center, width); |
1679
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
574 } |
746 | 575 } |
2169
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
576 |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
577 // No preset, or presets with an empty range |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
578 return GetFallbackWindowing(); |
746 | 579 } |
580 | |
1679
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
581 |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
582 Orthanc::ImageAccessor* DicomInstanceParameters::ConvertToFloat(const Orthanc::ImageAccessor& pixelData) const |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
583 { |
1298
8a0a62189f46
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1291
diff
changeset
|
584 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
|
585 pixelData.GetWidth(), |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
586 pixelData.GetHeight(), |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
587 false)); |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
588 Orthanc::ImageProcessing::Convert(*converted, pixelData); |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
589 |
1287
8e82fdc6200e
Heavy (temporary) logging in the path that leads
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
590 |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
591 // Correct rescale slope/intercept if need be |
1636 | 592 //ApplyRescaleAndDoseScaling(*converted, (pixelData.GetFormat() == Orthanc::PixelFormat_Grayscale32)); |
593 ApplyRescaleAndDoseScaling(*converted, false); | |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
594 |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
595 return converted.release(); |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
596 } |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
597 |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
598 |
1919
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
599 TextureBaseSceneLayer* DicomInstanceParameters::CreateTexture( |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
600 const Orthanc::ImageAccessor& pixelData) const |
746 | 601 { |
1353
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
602 // { |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
603 // const Orthanc::ImageAccessor& source = pixelData; |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
604 // const void* sourceBuffer = source.GetConstBuffer(); |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
605 // intptr_t sourceBufferInt = reinterpret_cast<intptr_t>(sourceBuffer); |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
606 // int sourceWidth = source.GetWidth(); |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
607 // int sourceHeight = source.GetHeight(); |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
608 // int sourcePitch = source.GetPitch(); |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
609 |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
610 // // TODO: turn error into trace below |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
611 // LOG(ERROR) << "ConvertGrayscaleToFloat | source:" |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
612 // << " W = " << sourceWidth << " H = " << sourceHeight |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
613 // << " P = " << sourcePitch << " B = " << sourceBufferInt |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
614 // << " B % 4 == " << sourceBufferInt % 4; |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
615 // } |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
616 |
746 | 617 assert(sizeof(float) == 4); |
618 | |
619 Orthanc::PixelFormat sourceFormat = pixelData.GetFormat(); | |
620 | |
621 if (sourceFormat != GetExpectedPixelFormat()) | |
622 { | |
623 throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); | |
624 } | |
625 | |
1911
898774b4e02d
DicomInstanceParameters::CreateTexture() now sets pixel spacing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
626 std::unique_ptr<TextureBaseSceneLayer> texture; |
898774b4e02d
DicomInstanceParameters::CreateTexture() now sets pixel spacing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
627 |
746 | 628 if (sourceFormat == Orthanc::PixelFormat_RGB24) |
629 { | |
630 // This is the case of a color image. No conversion has to be done. | |
1911
898774b4e02d
DicomInstanceParameters::CreateTexture() now sets pixel spacing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
631 texture.reset(new ColorTextureSceneLayer(pixelData)); |
746 | 632 } |
633 else | |
634 { | |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
635 // This is the case of a grayscale frame. Convert it to Float32. |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
636 if (pixelData.GetFormat() == Orthanc::PixelFormat_Float32) |
746 | 637 { |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
638 texture.reset(new FloatTextureSceneLayer(pixelData)); |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
639 } |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
640 else |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
641 { |
1298
8a0a62189f46
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1291
diff
changeset
|
642 std::unique_ptr<Orthanc::ImageAccessor> converted(ConvertToFloat(pixelData)); |
746 | 643 texture.reset(new FloatTextureSceneLayer(*converted)); |
644 } | |
645 | |
1911
898774b4e02d
DicomInstanceParameters::CreateTexture() now sets pixel spacing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
646 FloatTextureSceneLayer& floatTexture = dynamic_cast<FloatTextureSceneLayer&>(*texture); |
898774b4e02d
DicomInstanceParameters::CreateTexture() now sets pixel spacing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
647 |
1679
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
648 if (GetWindowingPresetsCount() > 0) |
746 | 649 { |
2169
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
650 Windowing preset = GetWindowingPreset(0); |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
651 floatTexture.SetCustomWindowing(preset.GetCenter(), preset.GetWidth()); |
746 | 652 } |
1206
c93a6218f0cd
Fixed photometric interpretation in texture creation
Benjamin Golinvaux <bgo@osimis.io>
parents:
1141
diff
changeset
|
653 |
1642
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
654 switch (GetImageInformation().GetPhotometricInterpretation()) |
1206
c93a6218f0cd
Fixed photometric interpretation in texture creation
Benjamin Golinvaux <bgo@osimis.io>
parents:
1141
diff
changeset
|
655 { |
1634
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
656 case Orthanc::PhotometricInterpretation_Monochrome1: |
1911
898774b4e02d
DicomInstanceParameters::CreateTexture() now sets pixel spacing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
657 floatTexture.SetInverted(true); |
1634
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
658 break; |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
659 |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
660 case Orthanc::PhotometricInterpretation_Monochrome2: |
1911
898774b4e02d
DicomInstanceParameters::CreateTexture() now sets pixel spacing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
661 floatTexture.SetInverted(false); |
1634
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
662 break; |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
663 |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
664 default: |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
665 break; |
1206
c93a6218f0cd
Fixed photometric interpretation in texture creation
Benjamin Golinvaux <bgo@osimis.io>
parents:
1141
diff
changeset
|
666 } |
1911
898774b4e02d
DicomInstanceParameters::CreateTexture() now sets pixel spacing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
667 } |
1206
c93a6218f0cd
Fixed photometric interpretation in texture creation
Benjamin Golinvaux <bgo@osimis.io>
parents:
1141
diff
changeset
|
668 |
1911
898774b4e02d
DicomInstanceParameters::CreateTexture() now sets pixel spacing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
669 if (HasPixelSpacing()) |
898774b4e02d
DicomInstanceParameters::CreateTexture() now sets pixel spacing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
670 { |
898774b4e02d
DicomInstanceParameters::CreateTexture() now sets pixel spacing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
671 texture->SetPixelSpacing(GetPixelSpacingX(), GetPixelSpacingY()); |
746 | 672 } |
1911
898774b4e02d
DicomInstanceParameters::CreateTexture() now sets pixel spacing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
673 |
898774b4e02d
DicomInstanceParameters::CreateTexture() now sets pixel spacing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
674 return texture.release(); |
746 | 675 } |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
676 |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
677 |
1919
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
678 LookupTableTextureSceneLayer* DicomInstanceParameters::CreateLookupTableTexture( |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
679 const Orthanc::ImageAccessor& pixelData) const |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
680 { |
1919
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
681 std::unique_ptr<LookupTableTextureSceneLayer> texture; |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
682 |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
683 if (pixelData.GetFormat() == Orthanc::PixelFormat_Float32) |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
684 { |
1919
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
685 texture.reset(new LookupTableTextureSceneLayer(pixelData)); |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
686 } |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
687 else |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
688 { |
1298
8a0a62189f46
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1291
diff
changeset
|
689 std::unique_ptr<Orthanc::ImageAccessor> converted(ConvertToFloat(pixelData)); |
1919
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
690 texture.reset(new LookupTableTextureSceneLayer(*converted)); |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
691 } |
1919
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
692 |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
693 if (HasPixelSpacing()) |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
694 { |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
695 texture->SetPixelSpacing(GetPixelSpacingX(), GetPixelSpacingY()); |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
696 } |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
697 |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
698 return texture.release(); |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
699 } |
980
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
700 |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
701 |
1919
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
702 LookupTableTextureSceneLayer* DicomInstanceParameters::CreateOverlayTexture( |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
703 int originX, |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
704 int originY, |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
705 const Orthanc::ImageAccessor& overlay) const |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
706 { |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
707 if (overlay.GetFormat() != Orthanc::PixelFormat_Grayscale8) |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
708 { |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
709 throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
710 } |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
711 |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
712 std::unique_ptr<LookupTableTextureSceneLayer> texture(CreateLookupTableTexture(overlay)); |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
713 |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
714 texture->SetOrigin(static_cast<double>(originX - 1) * texture->GetPixelSpacingX(), |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
715 static_cast<double>(originY - 1) * texture->GetPixelSpacingY()); |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
716 |
1924
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
717 std::vector<uint8_t> lut(4 * 256); |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
718 for (size_t i = 0; i < 256; i++) |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
719 { |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
720 if (i < 127) |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
721 { |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
722 // Black pixels are converted to transparent pixels |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
723 lut[4 * i] = 0; |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
724 lut[4 * i + 1] = 0; |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
725 lut[4 * i + 2] = 0; |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
726 lut[4 * i + 3] = 0; // alpha |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
727 } |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
728 else |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
729 { |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
730 // White pixels are converted to opaque white |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
731 lut[4 * i] = 255; |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
732 lut[4 * i + 1] = 255; |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
733 lut[4 * i + 2] = 255; |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
734 lut[4 * i + 3] = 255; // alpha |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
735 } |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
736 } |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
737 |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
738 texture->SetLookupTable(lut); |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
739 |
1919
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
740 return texture.release(); |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
741 } |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
742 |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
743 |
980
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
744 unsigned int DicomInstanceParameters::GetIndexInSeries() const |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
745 { |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
746 if (data_.hasIndexInSeries_) |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
747 { |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
748 return data_.indexInSeries_; |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
749 } |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
750 else |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
751 { |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
752 LOG(ERROR) << "DicomInstanceParameters::GetIndexInSeries(): !data_.hasIndexInSeries_"; |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
753 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
754 } |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
755 } |
1159
acb399643945
DicomInstanceParameters::ApplyRescale()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1141
diff
changeset
|
756 |
acb399643945
DicomInstanceParameters::ApplyRescale()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1141
diff
changeset
|
757 |
1636 | 758 double DicomInstanceParameters::ApplyRescale(double value) const |
1159
acb399643945
DicomInstanceParameters::ApplyRescale()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1141
diff
changeset
|
759 { |
1924
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
760 double scaling = data_.doseGridScaling_; |
1159
acb399643945
DicomInstanceParameters::ApplyRescale()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1141
diff
changeset
|
761 double offset = 0.0; |
acb399643945
DicomInstanceParameters::ApplyRescale()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1141
diff
changeset
|
762 |
1636 | 763 if (data_.hasRescale_) |
1159
acb399643945
DicomInstanceParameters::ApplyRescale()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1141
diff
changeset
|
764 { |
1924
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
765 scaling *= data_.rescaleSlope_; |
1636 | 766 offset = data_.rescaleIntercept_; |
1159
acb399643945
DicomInstanceParameters::ApplyRescale()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1141
diff
changeset
|
767 } |
acb399643945
DicomInstanceParameters::ApplyRescale()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1141
diff
changeset
|
768 |
1924
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
769 return (value * scaling + offset); |
1159
acb399643945
DicomInstanceParameters::ApplyRescale()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1141
diff
changeset
|
770 } |
1161
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
771 |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
772 |
2076
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
773 bool DicomInstanceParameters::ComputeFrameOffsetsSpacing(double& spacing) const |
1161
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
774 { |
1636 | 775 if (data_.frameOffsets_.size() == 0) // Not a RT-DOSE |
1161
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
776 { |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
777 return false; |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
778 } |
1636 | 779 else if (data_.frameOffsets_.size() == 1) |
1161
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
780 { |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
781 spacing = 1; // Edge case: RT-DOSE with one single frame |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
782 return true; |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
783 } |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
784 else |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
785 { |
2076
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
786 static double THRESHOLD = 0.001; |
1636 | 787 |
2076
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
788 if (data_.frameOffsets_.size() != GetNumberOfFrames()) |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
789 { |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
790 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
791 } |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
792 |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
793 double a = data_.frameOffsets_[1] - data_.frameOffsets_[0]; |
1161
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
794 |
1636 | 795 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
|
796 { |
2076
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
797 double b = data_.frameOffsets_[i + 1] - data_.frameOffsets_[i]; |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
798 if (!LinearAlgebra::IsNear(a, b, THRESHOLD)) |
1161
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
799 { |
2076
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
800 LOG(ERROR) << "Unable to extract slice thickness from GridFrameOffsetVector (3004,000C) (reason: varying spacing)"; |
1161
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
801 return false; |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
802 } |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
803 } |
2076
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
804 |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
805 spacing = std::abs(a); |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
806 |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
807 if (HasSliceThickness() && |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
808 !LinearAlgebra::IsNear(spacing, GetSliceThickness(), THRESHOLD)) |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
809 { |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
810 LOG(WARNING) << "SliceThickness and GridFrameOffsetVector (3004,000C) do not match"; |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
811 } |
1161
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
812 |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
813 return true; |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
814 } |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
815 } |
1822
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
816 |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
817 |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
818 void DicomInstanceParameters::SetPixelSpacing(double pixelSpacingX, |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
819 double pixelSpacingY) |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
820 { |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
821 data_.hasPixelSpacing_ = true; |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
822 data_.pixelSpacingX_ = pixelSpacingX; |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
823 data_.pixelSpacingY_ = pixelSpacingY; |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
824 } |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
825 |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
826 |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
827 void DicomInstanceParameters::EnrichUsingDicomWeb(const Json::Value& dicomweb) |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
828 { |
2174
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
829 DicomWebDataset dataset(dicomweb); |
2410a171ebfb
refactoring using DicomWebDataset and OrthancNativeDataset
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2171
diff
changeset
|
830 InjectSequenceTags(dataset); |
1822
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
831 } |
2076
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
832 |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
833 |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
834 CoordinateSystem3D DicomInstanceParameters::GetMultiFrameGeometry() const |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
835 { |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
836 if (data_.frameOffsets_.empty()) |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
837 { |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
838 return data_.geometry_; |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
839 } |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
840 else |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
841 { |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
842 assert(data_.frameOffsets_.size() == data_.numberOfFrames_); |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
843 |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
844 double lowest = data_.frameOffsets_[0]; |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
845 for (size_t i = 1; i < data_.frameOffsets_.size(); i++) |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
846 { |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
847 lowest = std::min(lowest, data_.frameOffsets_[i]); |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
848 } |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
849 |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
850 return CoordinateSystem3D( |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
851 data_.geometry_.GetOrigin() + lowest * data_.geometry_.GetNormal(), |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
852 data_.geometry_.GetAxisX(), |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
853 data_.geometry_.GetAxisY()); |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
854 } |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
855 } |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
856 |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
857 |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
858 bool DicomInstanceParameters::IsReversedFrameOffsets() const |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
859 { |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
860 if (data_.frameOffsets_.size() < 2) |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
861 { |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
862 return false; |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
863 } |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
864 else |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
865 { |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
866 return (data_.frameOffsets_[0] > data_.frameOffsets_[1]); |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
867 } |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
868 } |
2171
8e3c403cc643
Improved support of the (0028,9132) tag for Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2169
diff
changeset
|
869 |
8e3c403cc643
Improved support of the (0028,9132) tag for Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2169
diff
changeset
|
870 |
8e3c403cc643
Improved support of the (0028,9132) tag for Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2169
diff
changeset
|
871 bool DicomInstanceParameters::LookupPerFrameWindowing(Windowing& windowing, |
8e3c403cc643
Improved support of the (0028,9132) tag for Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2169
diff
changeset
|
872 unsigned int frame) const |
8e3c403cc643
Improved support of the (0028,9132) tag for Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2169
diff
changeset
|
873 { |
8e3c403cc643
Improved support of the (0028,9132) tag for Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2169
diff
changeset
|
874 if (frame < data_.perFrameWindowing_.size()) |
8e3c403cc643
Improved support of the (0028,9132) tag for Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2169
diff
changeset
|
875 { |
8e3c403cc643
Improved support of the (0028,9132) tag for Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2169
diff
changeset
|
876 windowing = data_.perFrameWindowing_[frame]; |
8e3c403cc643
Improved support of the (0028,9132) tag for Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2169
diff
changeset
|
877 return true; |
8e3c403cc643
Improved support of the (0028,9132) tag for Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2169
diff
changeset
|
878 } |
8e3c403cc643
Improved support of the (0028,9132) tag for Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2169
diff
changeset
|
879 else |
8e3c403cc643
Improved support of the (0028,9132) tag for Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2169
diff
changeset
|
880 { |
8e3c403cc643
Improved support of the (0028,9132) tag for Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2169
diff
changeset
|
881 return false; |
8e3c403cc643
Improved support of the (0028,9132) tag for Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2169
diff
changeset
|
882 } |
8e3c403cc643
Improved support of the (0028,9132) tag for Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2169
diff
changeset
|
883 } |
746 | 884 } |