Mercurial > hg > orthanc-stone
annotate Framework/Deprecated/Loaders/OrthancMultiframeVolumeLoader.cpp @ 1318:cbfdba08e039 broker
removed SDL code in wasm + added undostack CTOR in Wasm viewport + build fix + ORTHANC_OVERRIDE
author | Benjamin Golinvaux <bgo@osimis.io> |
---|---|
date | Tue, 17 Mar 2020 08:40:13 +0100 |
parents | 9b126de2cde2 |
children |
rev | line source |
---|---|
815 | 1 /** |
2 * Stone of Orthanc | |
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics | |
4 * Department, University Hospital of Liege, Belgium | |
1271
0ca50d275b9a
upgrade to year 2020
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1225
diff
changeset
|
5 * Copyright (C) 2017-2020 Osimis S.A., Belgium |
815 | 6 * |
7 * This program is free software: you can redistribute it and/or | |
8 * modify it under the terms of the GNU Affero General Public License | |
9 * as published by the Free Software Foundation, either version 3 of | |
10 * the License, or (at your option) any later version. | |
11 * | |
12 * This program is distributed in the hope that it will be useful, but | |
13 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Affero General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Affero General Public License | |
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
19 **/ | |
20 | |
21 | |
22 #include "OrthancMultiframeVolumeLoader.h" | |
23 | |
816 | 24 #include <Core/Endianness.h> |
815 | 25 #include <Core/Toolbox.h> |
26 | |
1225
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1128
diff
changeset
|
27 namespace Deprecated |
815 | 28 { |
29 class OrthancMultiframeVolumeLoader::LoadRTDoseGeometry : public LoaderStateMachine::State | |
30 { | |
31 private: | |
1299
c38c89684d83
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1297
diff
changeset
|
32 std::unique_ptr<Orthanc::DicomMap> dicom_; |
815 | 33 |
34 public: | |
35 LoadRTDoseGeometry(OrthancMultiframeVolumeLoader& that, | |
36 Orthanc::DicomMap* dicom) : | |
37 State(that), | |
38 dicom_(dicom) | |
39 { | |
40 if (dicom == NULL) | |
41 { | |
42 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); | |
43 } | |
44 | |
45 } | |
46 | |
1225
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1128
diff
changeset
|
47 virtual void Handle(const OrthancStone::OrthancRestApiCommand::SuccessMessage& message) |
815 | 48 { |
49 // Complete the DICOM tags with just-received "Grid Frame Offset Vector" | |
50 std::string s = Orthanc::Toolbox::StripSpaces(message.GetAnswer()); | |
51 dicom_->SetValue(Orthanc::DICOM_TAG_GRID_FRAME_OFFSET_VECTOR, s, false); | |
52 | |
53 GetLoader<OrthancMultiframeVolumeLoader>().SetGeometry(*dicom_); | |
54 } | |
55 }; | |
56 | |
57 | |
58 static std::string GetSopClassUid(const Orthanc::DicomMap& dicom) | |
59 { | |
60 std::string s; | |
994
1f74bc3459ba
fix build due to rename in Orthanc::DicomMap
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
61 if (!dicom.LookupStringValue(s, Orthanc::DICOM_TAG_SOP_CLASS_UID, false)) |
815 | 62 { |
63 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, | |
64 "DICOM file without SOP class UID"); | |
65 } | |
66 else | |
67 { | |
68 return s; | |
69 } | |
70 } | |
71 | |
72 | |
73 class OrthancMultiframeVolumeLoader::LoadGeometry : public State | |
74 { | |
75 public: | |
76 LoadGeometry(OrthancMultiframeVolumeLoader& that) : | |
77 State(that) | |
78 { | |
79 } | |
80 | |
1225
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1128
diff
changeset
|
81 virtual void Handle(const OrthancStone::OrthancRestApiCommand::SuccessMessage& message) |
815 | 82 { |
83 OrthancMultiframeVolumeLoader& loader = GetLoader<OrthancMultiframeVolumeLoader>(); | |
84 | |
85 Json::Value body; | |
86 message.ParseJsonBody(body); | |
87 | |
88 if (body.type() != Json::objectValue) | |
89 { | |
90 throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); | |
91 } | |
92 | |
1299
c38c89684d83
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1297
diff
changeset
|
93 std::unique_ptr<Orthanc::DicomMap> dicom(new Orthanc::DicomMap); |
815 | 94 dicom->FromDicomAsJson(body); |
95 | |
1225
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1128
diff
changeset
|
96 if (OrthancStone::StringToSopClassUid(GetSopClassUid(*dicom)) == OrthancStone::SopClassUid_RTDose) |
815 | 97 { |
98 // Download the "Grid Frame Offset Vector" DICOM tag, that is | |
99 // mandatory for RT-DOSE, but is too long to be returned by default | |
100 | |
1299
c38c89684d83
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1297
diff
changeset
|
101 std::unique_ptr<OrthancStone::OrthancRestApiCommand> command(new OrthancStone::OrthancRestApiCommand); |
815 | 102 command->SetUri("/instances/" + loader.GetInstanceId() + "/content/" + |
103 Orthanc::DICOM_TAG_GRID_FRAME_OFFSET_VECTOR.Format()); | |
1128
8e3763d1736a
removing CustomOracleCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1117
diff
changeset
|
104 command->AcquirePayload(new LoadRTDoseGeometry(loader, dicom.release())); |
815 | 105 |
106 Schedule(command.release()); | |
107 } | |
108 else | |
109 { | |
110 loader.SetGeometry(*dicom); | |
111 } | |
112 } | |
113 }; | |
114 | |
115 class OrthancMultiframeVolumeLoader::LoadTransferSyntax : public State | |
116 { | |
117 public: | |
118 LoadTransferSyntax(OrthancMultiframeVolumeLoader& that) : | |
119 State(that) | |
120 { | |
121 } | |
122 | |
1225
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1128
diff
changeset
|
123 virtual void Handle(const OrthancStone::OrthancRestApiCommand::SuccessMessage& message) |
815 | 124 { |
125 GetLoader<OrthancMultiframeVolumeLoader>().SetTransferSyntax(message.GetAnswer()); | |
126 } | |
127 }; | |
925
4639d0bf6390
Added support for Grayscale16 in the multiframe loader (Victor)
Benjamin Golinvaux <bgo@osimis.io>
parents:
921
diff
changeset
|
128 |
815 | 129 class OrthancMultiframeVolumeLoader::LoadUncompressedPixelData : public State |
130 { | |
131 public: | |
132 LoadUncompressedPixelData(OrthancMultiframeVolumeLoader& that) : | |
133 State(that) | |
134 { | |
135 } | |
136 | |
1225
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1128
diff
changeset
|
137 virtual void Handle(const OrthancStone::OrthancRestApiCommand::SuccessMessage& message) |
815 | 138 { |
139 GetLoader<OrthancMultiframeVolumeLoader>().SetUncompressedPixelData(message.GetAnswer()); | |
140 } | |
141 }; | |
925
4639d0bf6390
Added support for Grayscale16 in the multiframe loader (Victor)
Benjamin Golinvaux <bgo@osimis.io>
parents:
921
diff
changeset
|
142 |
815 | 143 const std::string& OrthancMultiframeVolumeLoader::GetInstanceId() const |
144 { | |
145 if (IsActive()) | |
146 { | |
147 return instanceId_; | |
148 } | |
149 else | |
150 { | |
956
a7351ad54960
Made IsContextLost automatically set the flag by checking with the emscripten
Benjamin Golinvaux <bgo@osimis.io>
parents:
949
diff
changeset
|
151 LOG(ERROR) << "OrthancMultiframeVolumeLoader::GetInstanceId(): (!IsActive())"; |
815 | 152 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
153 } | |
154 } | |
155 | |
156 void OrthancMultiframeVolumeLoader::ScheduleFrameDownloads() | |
157 { | |
158 if (transferSyntaxUid_.empty() || | |
159 !volume_->HasGeometry()) | |
160 { | |
161 return; | |
162 } | |
163 /* | |
164 1.2.840.10008.1.2 Implicit VR Endian: Default Transfer Syntax for DICOM | |
165 1.2.840.10008.1.2.1 Explicit VR Little Endian | |
166 1.2.840.10008.1.2.2 Explicit VR Big Endian | |
167 | |
168 See https://www.dicomlibrary.com/dicom/transfer-syntax/ | |
169 */ | |
170 if (transferSyntaxUid_ == "1.2.840.10008.1.2" || | |
171 transferSyntaxUid_ == "1.2.840.10008.1.2.1" || | |
172 transferSyntaxUid_ == "1.2.840.10008.1.2.2") | |
173 { | |
1299
c38c89684d83
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1297
diff
changeset
|
174 std::unique_ptr<OrthancStone::OrthancRestApiCommand> command(new OrthancStone::OrthancRestApiCommand); |
815 | 175 command->SetHttpHeader("Accept-Encoding", "gzip"); |
176 command->SetUri("/instances/" + instanceId_ + "/content/" + | |
177 Orthanc::DICOM_TAG_PIXEL_DATA.Format() + "/0"); | |
1128
8e3763d1736a
removing CustomOracleCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1117
diff
changeset
|
178 command->AcquirePayload(new LoadUncompressedPixelData(*this)); |
815 | 179 Schedule(command.release()); |
180 } | |
181 else | |
182 { | |
183 throw Orthanc::OrthancException( | |
184 Orthanc::ErrorCode_NotImplemented, | |
185 "No support for multiframe instances with transfer syntax: " + transferSyntaxUid_); | |
186 } | |
187 } | |
188 | |
189 void OrthancMultiframeVolumeLoader::SetTransferSyntax(const std::string& transferSyntax) | |
190 { | |
191 transferSyntaxUid_ = Orthanc::Toolbox::StripSpaces(transferSyntax); | |
192 ScheduleFrameDownloads(); | |
193 } | |
194 | |
195 void OrthancMultiframeVolumeLoader::SetGeometry(const Orthanc::DicomMap& dicom) | |
196 { | |
1225
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1128
diff
changeset
|
197 OrthancStone::DicomInstanceParameters parameters(dicom); |
815 | 198 volume_->SetDicomParameters(parameters); |
199 | |
200 Orthanc::PixelFormat format; | |
201 if (!parameters.GetImageInformation().ExtractPixelFormat(format, true)) | |
202 { | |
203 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); | |
204 } | |
205 | |
206 double spacingZ; | |
207 switch (parameters.GetSopClassUid()) | |
208 { | |
1225
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1128
diff
changeset
|
209 case OrthancStone::SopClassUid_RTDose: |
815 | 210 spacingZ = parameters.GetThickness(); |
211 break; | |
212 | |
213 default: | |
214 throw Orthanc::OrthancException( | |
215 Orthanc::ErrorCode_NotImplemented, | |
216 "No support for multiframe instances with SOP class UID: " + GetSopClassUid(dicom)); | |
217 } | |
218 | |
219 const unsigned int width = parameters.GetImageInformation().GetWidth(); | |
220 const unsigned int height = parameters.GetImageInformation().GetHeight(); | |
221 const unsigned int depth = parameters.GetImageInformation().GetNumberOfFrames(); | |
222 | |
223 { | |
1225
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1128
diff
changeset
|
224 OrthancStone::VolumeImageGeometry geometry; |
949
32eaf4929b08
OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader now implement IGeometryProvider so that the geometry reference can be switched (CT or DOSE, for instance) + VolumeImageGeometry::SetSize renamed to VolumeImageGeometry::SetSizeInVoxels + prevent text layer update if text or properties do not change + a few stream operator<< for debug (Vector, Matrix,...) + fixed memory access aligment issues in ImageBuffer3D::ExtractSagittalSlice + fix for wrong screen Y offset of mpr slices in DicomVolumeImageMPRSlicer.
Benjamin Golinvaux <bgo@osimis.io>
parents:
937
diff
changeset
|
225 geometry.SetSizeInVoxels(width, height, depth); |
815 | 226 geometry.SetAxialGeometry(parameters.GetGeometry()); |
227 geometry.SetVoxelDimensions(parameters.GetPixelSpacingX(), | |
228 parameters.GetPixelSpacingY(), spacingZ); | |
1072
391fb6d6905d
OrthancMultiframeVolumeLoader asks volume image to compute range +
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
229 volume_->Initialize(geometry, format, true /* Do compute range */); |
815 | 230 } |
231 | |
232 volume_->GetPixelData().Clear(); | |
233 | |
234 ScheduleFrameDownloads(); | |
235 | |
949
32eaf4929b08
OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader now implement IGeometryProvider so that the geometry reference can be switched (CT or DOSE, for instance) + VolumeImageGeometry::SetSize renamed to VolumeImageGeometry::SetSizeInVoxels + prevent text layer update if text or properties do not change + a few stream operator<< for debug (Vector, Matrix,...) + fixed memory access aligment issues in ImageBuffer3D::ExtractSagittalSlice + fix for wrong screen Y offset of mpr slices in DicomVolumeImageMPRSlicer.
Benjamin Golinvaux <bgo@osimis.io>
parents:
937
diff
changeset
|
236 |
32eaf4929b08
OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader now implement IGeometryProvider so that the geometry reference can be switched (CT or DOSE, for instance) + VolumeImageGeometry::SetSize renamed to VolumeImageGeometry::SetSizeInVoxels + prevent text layer update if text or properties do not change + a few stream operator<< for debug (Vector, Matrix,...) + fixed memory access aligment issues in ImageBuffer3D::ExtractSagittalSlice + fix for wrong screen Y offset of mpr slices in DicomVolumeImageMPRSlicer.
Benjamin Golinvaux <bgo@osimis.io>
parents:
937
diff
changeset
|
237 |
1225
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1128
diff
changeset
|
238 BroadcastMessage(OrthancStone::DicomVolumeImage::GeometryReadyMessage(*volume_)); |
815 | 239 } |
240 | |
241 | |
242 ORTHANC_FORCE_INLINE | |
925
4639d0bf6390
Added support for Grayscale16 in the multiframe loader (Victor)
Benjamin Golinvaux <bgo@osimis.io>
parents:
921
diff
changeset
|
243 static void CopyPixel(uint32_t& target, const void* source) |
815 | 244 { |
245 // TODO - check alignement? | |
246 target = le32toh(*reinterpret_cast<const uint32_t*>(source)); | |
247 } | |
925
4639d0bf6390
Added support for Grayscale16 in the multiframe loader (Victor)
Benjamin Golinvaux <bgo@osimis.io>
parents:
921
diff
changeset
|
248 |
4639d0bf6390
Added support for Grayscale16 in the multiframe loader (Victor)
Benjamin Golinvaux <bgo@osimis.io>
parents:
921
diff
changeset
|
249 ORTHANC_FORCE_INLINE |
4639d0bf6390
Added support for Grayscale16 in the multiframe loader (Victor)
Benjamin Golinvaux <bgo@osimis.io>
parents:
921
diff
changeset
|
250 static void CopyPixel(uint16_t& target, const void* source) |
4639d0bf6390
Added support for Grayscale16 in the multiframe loader (Victor)
Benjamin Golinvaux <bgo@osimis.io>
parents:
921
diff
changeset
|
251 { |
4639d0bf6390
Added support for Grayscale16 in the multiframe loader (Victor)
Benjamin Golinvaux <bgo@osimis.io>
parents:
921
diff
changeset
|
252 // TODO - check alignement? |
4639d0bf6390
Added support for Grayscale16 in the multiframe loader (Victor)
Benjamin Golinvaux <bgo@osimis.io>
parents:
921
diff
changeset
|
253 target = le16toh(*reinterpret_cast<const uint16_t*>(source)); |
4639d0bf6390
Added support for Grayscale16 in the multiframe loader (Victor)
Benjamin Golinvaux <bgo@osimis.io>
parents:
921
diff
changeset
|
254 } |
815 | 255 |
1114
33b0a762e98a
Added support for signed 16-bit pixels/voxels in multiframe loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1072
diff
changeset
|
256 ORTHANC_FORCE_INLINE |
33b0a762e98a
Added support for signed 16-bit pixels/voxels in multiframe loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1072
diff
changeset
|
257 static void CopyPixel(int16_t& target, const void* source) |
33b0a762e98a
Added support for signed 16-bit pixels/voxels in multiframe loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1072
diff
changeset
|
258 { |
33b0a762e98a
Added support for signed 16-bit pixels/voxels in multiframe loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1072
diff
changeset
|
259 // byte swapping is the same for unsigned and signed integers |
33b0a762e98a
Added support for signed 16-bit pixels/voxels in multiframe loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1072
diff
changeset
|
260 // (the sign bit is always stored with the MSByte) |
33b0a762e98a
Added support for signed 16-bit pixels/voxels in multiframe loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1072
diff
changeset
|
261 uint16_t* targetUp = reinterpret_cast<uint16_t*>(&target); |
33b0a762e98a
Added support for signed 16-bit pixels/voxels in multiframe loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1072
diff
changeset
|
262 CopyPixel(*targetUp, source); |
33b0a762e98a
Added support for signed 16-bit pixels/voxels in multiframe loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1072
diff
changeset
|
263 } |
33b0a762e98a
Added support for signed 16-bit pixels/voxels in multiframe loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1072
diff
changeset
|
264 |
815 | 265 template <typename T> |
1260
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
266 void OrthancMultiframeVolumeLoader::CopyPixelDataAndComputeDistribution( |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
267 const std::string& pixelData, std::map<T,uint64_t>& distribution) |
815 | 268 { |
1225
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1128
diff
changeset
|
269 OrthancStone::ImageBuffer3D& target = volume_->GetPixelData(); |
815 | 270 |
271 const unsigned int bpp = target.GetBytesPerPixel(); | |
272 const unsigned int width = target.GetWidth(); | |
273 const unsigned int height = target.GetHeight(); | |
274 const unsigned int depth = target.GetDepth(); | |
275 | |
276 if (pixelData.size() != bpp * width * height * depth) | |
277 { | |
278 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, | |
279 "The pixel data has not the proper size"); | |
280 } | |
281 | |
282 if (pixelData.empty()) | |
283 { | |
284 return; | |
285 } | |
286 | |
1260
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
287 // first pass to initialize map |
815 | 288 { |
1260
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
289 const uint8_t* source = reinterpret_cast<const uint8_t*>(pixelData.c_str()); |
815 | 290 |
1260
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
291 for (unsigned int z = 0; z < depth; z++) |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
292 { |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
293 for (unsigned int y = 0; y < height; y++) |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
294 { |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
295 for (unsigned int x = 0; x < width; x++) |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
296 { |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
297 T value; |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
298 CopyPixel(value, source); |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
299 distribution[value] = 0; |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
300 source += bpp; |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
301 } |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
302 } |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
303 } |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
304 } |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
305 |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
306 { |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
307 const uint8_t* source = reinterpret_cast<const uint8_t*>(pixelData.c_str()); |
815 | 308 |
1260
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
309 for (unsigned int z = 0; z < depth; z++) |
815 | 310 { |
1279 | 311 OrthancStone::ImageBuffer3D::SliceWriter writer(target, OrthancStone::VolumeProjection_Axial, z); |
815 | 312 |
1260
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
313 assert(writer.GetAccessor().GetWidth() == width && |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
314 writer.GetAccessor().GetHeight() == height); |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
315 |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
316 for (unsigned int y = 0; y < height; y++) |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
317 { |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
318 assert(sizeof(T) == Orthanc::GetBytesPerPixel(target.GetFormat())); |
815 | 319 |
1260
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
320 T* target = reinterpret_cast<T*>(writer.GetAccessor().GetRow(y)); |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
321 |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
322 for (unsigned int x = 0; x < width; x++) |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
323 { |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
324 CopyPixel(*target, source); |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
325 |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
326 distribution[*target] += 1; |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
327 |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
328 target++; |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
329 source += bpp; |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
330 } |
815 | 331 } |
332 } | |
333 } | |
334 } | |
335 | |
1260
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
336 template <typename T> |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
337 void OrthancMultiframeVolumeLoader::ComputeMinMaxWithOutlierRejection( |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
338 const std::map<T, uint64_t>& distribution) |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
339 { |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
340 if (distribution.size() == 0) |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
341 { |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
342 LOG(ERROR) << "ComputeMinMaxWithOutlierRejection -- Volume image empty."; |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
343 } |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
344 else |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
345 { |
1279 | 346 OrthancStone::ImageBuffer3D& target = volume_->GetPixelData(); |
1260
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
347 |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
348 const uint64_t width = target.GetWidth(); |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
349 const uint64_t height = target.GetHeight(); |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
350 const uint64_t depth = target.GetDepth(); |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
351 const uint64_t voxelCount = width * height * depth; |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
352 |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
353 // now that we have distribution[pixelValue] == numberOfPixelsWithValue |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
354 // compute number of values and check (assertion) that it is equal to |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
355 // width * height * depth |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
356 { |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
357 typename std::map<T, uint64_t>::const_iterator it = distribution.begin(); |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
358 uint64_t totalCount = 0; |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
359 distributionRawMin_ = static_cast<float>(it->first); |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
360 |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
361 while (it != distribution.end()) |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
362 { |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
363 T pixelValue = it->first; |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
364 uint64_t count = it->second; |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
365 totalCount += count; |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
366 it++; |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
367 if (it == distribution.end()) |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
368 distributionRawMax_ = static_cast<float>(pixelValue); |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
369 } |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
370 LOG(INFO) << "Volume image. First distribution value = " |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
371 << static_cast<float>(distributionRawMin_) |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
372 << " | Last distribution value = " |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
373 << static_cast<float>(distributionRawMax_); |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
374 |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
375 if (totalCount != voxelCount) |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
376 { |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
377 LOG(ERROR) << "Internal error in dose distribution computation. TC (" |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
378 << totalCount << ") != VoxC (" << voxelCount; |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
379 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
380 } |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
381 } |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
382 |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
383 // compute the number of voxels to reject at each end of the distribution |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
384 uint64_t endRejectionCount = static_cast<uint64_t>( |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
385 outliersHalfRejectionRate_ * voxelCount); |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
386 |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
387 if (endRejectionCount > voxelCount) |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
388 { |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
389 LOG(ERROR) << "Internal error in dose distribution computation." |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
390 << " endRejectionCount = " << endRejectionCount |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
391 << " | voxelCount = " << voxelCount; |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
392 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
393 } |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
394 |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
395 // this will contain the actual distribution minimum after outlier |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
396 // rejection |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
397 T resultMin = 0; |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
398 |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
399 // then start from start and remove pixel values up to |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
400 // endRejectionCount voxels rejected |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
401 { |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
402 typename std::map<T, uint64_t>::const_iterator it = distribution.begin(); |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
403 |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
404 uint64_t currentCount = 0; |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
405 |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
406 while (it != distribution.end()) |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
407 { |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
408 T pixelValue = it->first; |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
409 uint64_t count = it->second; |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
410 |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
411 // if this pixelValue crosses the rejection threshold, let's set it |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
412 // and exit the loop |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
413 if ((currentCount <= endRejectionCount) && |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
414 (currentCount + count > endRejectionCount)) |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
415 { |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
416 resultMin = pixelValue; |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
417 break; |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
418 } |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
419 else |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
420 { |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
421 currentCount += count; |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
422 } |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
423 // and continue walking along the distribution |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
424 it++; |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
425 } |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
426 } |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
427 |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
428 // this will contain the actual distribution maximum after outlier |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
429 // rejection |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
430 T resultMax = 0; |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
431 // now start from END and remove pixel values up to |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
432 // endRejectionCount voxels rejected |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
433 { |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
434 typename std::map<T, uint64_t>::const_reverse_iterator it = distribution.rbegin(); |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
435 |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
436 uint64_t currentCount = 0; |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
437 |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
438 while (it != distribution.rend()) |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
439 { |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
440 T pixelValue = it->first; |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
441 uint64_t count = it->second; |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
442 |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
443 if ((currentCount <= endRejectionCount) && |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
444 (currentCount + count > endRejectionCount)) |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
445 { |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
446 resultMax = pixelValue; |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
447 break; |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
448 } |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
449 else |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
450 { |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
451 currentCount += count; |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
452 } |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
453 // and continue walking along the distribution |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
454 it++; |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
455 } |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
456 } |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
457 if (resultMin > resultMax) |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
458 { |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
459 LOG(ERROR) << "Internal error in dose distribution computation! " << |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
460 "resultMin (" << resultMin << ") > resultMax (" << resultMax << ")"; |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
461 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
462 } |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
463 computedDistributionMin_ = static_cast<float>(resultMin); |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
464 computedDistributionMax_ = static_cast<float>(resultMax); |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
465 } |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
466 } |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
467 |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
468 template <typename T> |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
469 void OrthancMultiframeVolumeLoader::CopyPixelDataAndComputeMinMax( |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
470 const std::string& pixelData) |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
471 { |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
472 std::map<T, uint64_t> distribution; |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
473 CopyPixelDataAndComputeDistribution(pixelData, distribution); |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
474 ComputeMinMaxWithOutlierRejection(distribution); |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
475 } |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
476 |
815 | 477 void OrthancMultiframeVolumeLoader::SetUncompressedPixelData(const std::string& pixelData) |
478 { | |
479 switch (volume_->GetPixelData().GetFormat()) | |
480 { | |
481 case Orthanc::PixelFormat_Grayscale32: | |
1260
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
482 CopyPixelDataAndComputeMinMax<uint32_t>(pixelData); |
815 | 483 break; |
925
4639d0bf6390
Added support for Grayscale16 in the multiframe loader (Victor)
Benjamin Golinvaux <bgo@osimis.io>
parents:
921
diff
changeset
|
484 case Orthanc::PixelFormat_Grayscale16: |
1260
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
485 CopyPixelDataAndComputeMinMax<uint16_t>(pixelData); |
925
4639d0bf6390
Added support for Grayscale16 in the multiframe loader (Victor)
Benjamin Golinvaux <bgo@osimis.io>
parents:
921
diff
changeset
|
486 break; |
1114
33b0a762e98a
Added support for signed 16-bit pixels/voxels in multiframe loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1072
diff
changeset
|
487 case Orthanc::PixelFormat_SignedGrayscale16: |
1260
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
488 CopyPixelDataAndComputeMinMax<int16_t>(pixelData); |
1114
33b0a762e98a
Added support for signed 16-bit pixels/voxels in multiframe loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1072
diff
changeset
|
489 break; |
815 | 490 default: |
491 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); | |
492 } | |
493 | |
494 volume_->IncrementRevision(); | |
495 | |
937
86ac61a040c9
Added getters and notifications to allow clients of the loaders (DicomStructureSetLoader, OrthancSeriesVolumeProgressiveLoader and OrthancMultiframeVolumeLoader) to know when the loading is finished + added ability for SDL event loop to execute a callback repeatedly (used to check the view loading state)
Benjamin Golinvaux <bgo@osimis.io>
parents:
935
diff
changeset
|
496 pixelDataLoaded_ = true; |
1225
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1128
diff
changeset
|
497 BroadcastMessage(OrthancStone::DicomVolumeImage::ContentUpdatedMessage(*volume_)); |
815 | 498 } |
949
32eaf4929b08
OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader now implement IGeometryProvider so that the geometry reference can be switched (CT or DOSE, for instance) + VolumeImageGeometry::SetSize renamed to VolumeImageGeometry::SetSizeInVoxels + prevent text layer update if text or properties do not change + a few stream operator<< for debug (Vector, Matrix,...) + fixed memory access aligment issues in ImageBuffer3D::ExtractSagittalSlice + fix for wrong screen Y offset of mpr slices in DicomVolumeImageMPRSlicer.
Benjamin Golinvaux <bgo@osimis.io>
parents:
937
diff
changeset
|
499 |
32eaf4929b08
OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader now implement IGeometryProvider so that the geometry reference can be switched (CT or DOSE, for instance) + VolumeImageGeometry::SetSize renamed to VolumeImageGeometry::SetSizeInVoxels + prevent text layer update if text or properties do not change + a few stream operator<< for debug (Vector, Matrix,...) + fixed memory access aligment issues in ImageBuffer3D::ExtractSagittalSlice + fix for wrong screen Y offset of mpr slices in DicomVolumeImageMPRSlicer.
Benjamin Golinvaux <bgo@osimis.io>
parents:
937
diff
changeset
|
500 bool OrthancMultiframeVolumeLoader::HasGeometry() const |
32eaf4929b08
OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader now implement IGeometryProvider so that the geometry reference can be switched (CT or DOSE, for instance) + VolumeImageGeometry::SetSize renamed to VolumeImageGeometry::SetSizeInVoxels + prevent text layer update if text or properties do not change + a few stream operator<< for debug (Vector, Matrix,...) + fixed memory access aligment issues in ImageBuffer3D::ExtractSagittalSlice + fix for wrong screen Y offset of mpr slices in DicomVolumeImageMPRSlicer.
Benjamin Golinvaux <bgo@osimis.io>
parents:
937
diff
changeset
|
501 { |
32eaf4929b08
OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader now implement IGeometryProvider so that the geometry reference can be switched (CT or DOSE, for instance) + VolumeImageGeometry::SetSize renamed to VolumeImageGeometry::SetSizeInVoxels + prevent text layer update if text or properties do not change + a few stream operator<< for debug (Vector, Matrix,...) + fixed memory access aligment issues in ImageBuffer3D::ExtractSagittalSlice + fix for wrong screen Y offset of mpr slices in DicomVolumeImageMPRSlicer.
Benjamin Golinvaux <bgo@osimis.io>
parents:
937
diff
changeset
|
502 return volume_->HasGeometry(); |
32eaf4929b08
OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader now implement IGeometryProvider so that the geometry reference can be switched (CT or DOSE, for instance) + VolumeImageGeometry::SetSize renamed to VolumeImageGeometry::SetSizeInVoxels + prevent text layer update if text or properties do not change + a few stream operator<< for debug (Vector, Matrix,...) + fixed memory access aligment issues in ImageBuffer3D::ExtractSagittalSlice + fix for wrong screen Y offset of mpr slices in DicomVolumeImageMPRSlicer.
Benjamin Golinvaux <bgo@osimis.io>
parents:
937
diff
changeset
|
503 } |
815 | 504 |
949
32eaf4929b08
OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader now implement IGeometryProvider so that the geometry reference can be switched (CT or DOSE, for instance) + VolumeImageGeometry::SetSize renamed to VolumeImageGeometry::SetSizeInVoxels + prevent text layer update if text or properties do not change + a few stream operator<< for debug (Vector, Matrix,...) + fixed memory access aligment issues in ImageBuffer3D::ExtractSagittalSlice + fix for wrong screen Y offset of mpr slices in DicomVolumeImageMPRSlicer.
Benjamin Golinvaux <bgo@osimis.io>
parents:
937
diff
changeset
|
505 const OrthancStone::VolumeImageGeometry& OrthancMultiframeVolumeLoader::GetImageGeometry() const |
32eaf4929b08
OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader now implement IGeometryProvider so that the geometry reference can be switched (CT or DOSE, for instance) + VolumeImageGeometry::SetSize renamed to VolumeImageGeometry::SetSizeInVoxels + prevent text layer update if text or properties do not change + a few stream operator<< for debug (Vector, Matrix,...) + fixed memory access aligment issues in ImageBuffer3D::ExtractSagittalSlice + fix for wrong screen Y offset of mpr slices in DicomVolumeImageMPRSlicer.
Benjamin Golinvaux <bgo@osimis.io>
parents:
937
diff
changeset
|
506 { |
32eaf4929b08
OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader now implement IGeometryProvider so that the geometry reference can be switched (CT or DOSE, for instance) + VolumeImageGeometry::SetSize renamed to VolumeImageGeometry::SetSizeInVoxels + prevent text layer update if text or properties do not change + a few stream operator<< for debug (Vector, Matrix,...) + fixed memory access aligment issues in ImageBuffer3D::ExtractSagittalSlice + fix for wrong screen Y offset of mpr slices in DicomVolumeImageMPRSlicer.
Benjamin Golinvaux <bgo@osimis.io>
parents:
937
diff
changeset
|
507 return volume_->GetGeometry(); |
32eaf4929b08
OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader now implement IGeometryProvider so that the geometry reference can be switched (CT or DOSE, for instance) + VolumeImageGeometry::SetSize renamed to VolumeImageGeometry::SetSizeInVoxels + prevent text layer update if text or properties do not change + a few stream operator<< for debug (Vector, Matrix,...) + fixed memory access aligment issues in ImageBuffer3D::ExtractSagittalSlice + fix for wrong screen Y offset of mpr slices in DicomVolumeImageMPRSlicer.
Benjamin Golinvaux <bgo@osimis.io>
parents:
937
diff
changeset
|
508 } |
815 | 509 |
1260
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
510 OrthancMultiframeVolumeLoader::OrthancMultiframeVolumeLoader( |
1310
9bea7e15b519
- first pass at changes to cope with the refactoring of the loading system
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
511 OrthancStone::ILoadersContext& loadersContext, |
1279 | 512 boost::shared_ptr<OrthancStone::DicomVolumeImage> volume, |
1310
9bea7e15b519
- first pass at changes to cope with the refactoring of the loading system
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
513 float outliersHalfRejectionRate) |
9bea7e15b519
- first pass at changes to cope with the refactoring of the loading system
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
514 : LoaderStateMachine(loadersContext) |
9bea7e15b519
- first pass at changes to cope with the refactoring of the loading system
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
515 , volume_(volume) |
9bea7e15b519
- first pass at changes to cope with the refactoring of the loading system
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
516 , pixelDataLoaded_(false) |
9bea7e15b519
- first pass at changes to cope with the refactoring of the loading system
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
517 , outliersHalfRejectionRate_(outliersHalfRejectionRate) |
9bea7e15b519
- first pass at changes to cope with the refactoring of the loading system
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
518 , distributionRawMin_(0) |
9bea7e15b519
- first pass at changes to cope with the refactoring of the loading system
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
519 , distributionRawMax_(0) |
9bea7e15b519
- first pass at changes to cope with the refactoring of the loading system
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
520 , computedDistributionMin_(0) |
9bea7e15b519
- first pass at changes to cope with the refactoring of the loading system
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
521 , computedDistributionMax_(0) |
815 | 522 { |
523 if (volume.get() == NULL) | |
524 { | |
525 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); | |
526 } | |
527 } | |
528 | |
1314
9b126de2cde2
Since the observer system now uses shared_ptr and many registrations are
Benjamin Golinvaux <bgo@osimis.io>
parents:
1310
diff
changeset
|
529 |
9b126de2cde2
Since the observer system now uses shared_ptr and many registrations are
Benjamin Golinvaux <bgo@osimis.io>
parents:
1310
diff
changeset
|
530 boost::shared_ptr<OrthancMultiframeVolumeLoader> |
9b126de2cde2
Since the observer system now uses shared_ptr and many registrations are
Benjamin Golinvaux <bgo@osimis.io>
parents:
1310
diff
changeset
|
531 OrthancMultiframeVolumeLoader::Create( |
9b126de2cde2
Since the observer system now uses shared_ptr and many registrations are
Benjamin Golinvaux <bgo@osimis.io>
parents:
1310
diff
changeset
|
532 OrthancStone::ILoadersContext& loadersContext, |
9b126de2cde2
Since the observer system now uses shared_ptr and many registrations are
Benjamin Golinvaux <bgo@osimis.io>
parents:
1310
diff
changeset
|
533 boost::shared_ptr<OrthancStone::DicomVolumeImage> volume, |
9b126de2cde2
Since the observer system now uses shared_ptr and many registrations are
Benjamin Golinvaux <bgo@osimis.io>
parents:
1310
diff
changeset
|
534 float outliersHalfRejectionRate /*= 0.0005*/) |
9b126de2cde2
Since the observer system now uses shared_ptr and many registrations are
Benjamin Golinvaux <bgo@osimis.io>
parents:
1310
diff
changeset
|
535 { |
9b126de2cde2
Since the observer system now uses shared_ptr and many registrations are
Benjamin Golinvaux <bgo@osimis.io>
parents:
1310
diff
changeset
|
536 boost::shared_ptr<OrthancMultiframeVolumeLoader> obj( |
9b126de2cde2
Since the observer system now uses shared_ptr and many registrations are
Benjamin Golinvaux <bgo@osimis.io>
parents:
1310
diff
changeset
|
537 new OrthancMultiframeVolumeLoader( |
9b126de2cde2
Since the observer system now uses shared_ptr and many registrations are
Benjamin Golinvaux <bgo@osimis.io>
parents:
1310
diff
changeset
|
538 loadersContext, |
9b126de2cde2
Since the observer system now uses shared_ptr and many registrations are
Benjamin Golinvaux <bgo@osimis.io>
parents:
1310
diff
changeset
|
539 volume, |
9b126de2cde2
Since the observer system now uses shared_ptr and many registrations are
Benjamin Golinvaux <bgo@osimis.io>
parents:
1310
diff
changeset
|
540 outliersHalfRejectionRate)); |
9b126de2cde2
Since the observer system now uses shared_ptr and many registrations are
Benjamin Golinvaux <bgo@osimis.io>
parents:
1310
diff
changeset
|
541 obj->LoaderStateMachine::PostConstructor(); |
9b126de2cde2
Since the observer system now uses shared_ptr and many registrations are
Benjamin Golinvaux <bgo@osimis.io>
parents:
1310
diff
changeset
|
542 return obj; |
9b126de2cde2
Since the observer system now uses shared_ptr and many registrations are
Benjamin Golinvaux <bgo@osimis.io>
parents:
1310
diff
changeset
|
543 } |
9b126de2cde2
Since the observer system now uses shared_ptr and many registrations are
Benjamin Golinvaux <bgo@osimis.io>
parents:
1310
diff
changeset
|
544 |
935
401808e7ff2e
Added traces in LoaderCache objects dtors + fuse to prevent dead weak ptrs to be calleds in VisitWdigets (in GuiAdapter.h)
Benjamin Golinvaux <bgo@osimis.io>
parents:
925
diff
changeset
|
545 OrthancMultiframeVolumeLoader::~OrthancMultiframeVolumeLoader() |
401808e7ff2e
Added traces in LoaderCache objects dtors + fuse to prevent dead weak ptrs to be calleds in VisitWdigets (in GuiAdapter.h)
Benjamin Golinvaux <bgo@osimis.io>
parents:
925
diff
changeset
|
546 { |
401808e7ff2e
Added traces in LoaderCache objects dtors + fuse to prevent dead weak ptrs to be calleds in VisitWdigets (in GuiAdapter.h)
Benjamin Golinvaux <bgo@osimis.io>
parents:
925
diff
changeset
|
547 LOG(TRACE) << "OrthancMultiframeVolumeLoader::~OrthancMultiframeVolumeLoader()"; |
401808e7ff2e
Added traces in LoaderCache objects dtors + fuse to prevent dead weak ptrs to be calleds in VisitWdigets (in GuiAdapter.h)
Benjamin Golinvaux <bgo@osimis.io>
parents:
925
diff
changeset
|
548 } |
1314
9b126de2cde2
Since the observer system now uses shared_ptr and many registrations are
Benjamin Golinvaux <bgo@osimis.io>
parents:
1310
diff
changeset
|
549 |
1260
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
550 void OrthancMultiframeVolumeLoader::GetDistributionMinMax |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
551 (float& minValue, float& maxValue) const |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
552 { |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
553 if (distributionRawMin_ == 0 && distributionRawMax_ == 0) |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
554 { |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
555 LOG(WARNING) << "GetDistributionMinMaxWithOutliersRejection called before computation!"; |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
556 } |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
557 minValue = distributionRawMin_; |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
558 maxValue = distributionRawMax_; |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
559 } |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
560 |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
561 void OrthancMultiframeVolumeLoader::GetDistributionMinMaxWithOutliersRejection |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
562 (float& minValue, float& maxValue) const |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
563 { |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
564 if (computedDistributionMin_ == 0 && computedDistributionMax_ == 0) |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
565 { |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
566 LOG(WARNING) << "GetDistributionMinMaxWithOutliersRejection called before computation!"; |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
567 } |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
568 minValue = computedDistributionMin_; |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
569 maxValue = computedDistributionMax_; |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
570 } |
5a2d5380148d
Added outlier rejection for min max computation in multiframe volume loader
Benjamin Golinvaux <bgo@osimis.io>
parents:
1114
diff
changeset
|
571 |
815 | 572 void OrthancMultiframeVolumeLoader::LoadInstance(const std::string& instanceId) |
573 { | |
574 Start(); | |
575 | |
576 instanceId_ = instanceId; | |
577 | |
578 { | |
1299
c38c89684d83
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1297
diff
changeset
|
579 std::unique_ptr<OrthancStone::OrthancRestApiCommand> command(new OrthancStone::OrthancRestApiCommand); |
815 | 580 command->SetHttpHeader("Accept-Encoding", "gzip"); |
581 command->SetUri("/instances/" + instanceId + "/tags"); | |
1128
8e3763d1736a
removing CustomOracleCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1117
diff
changeset
|
582 command->AcquirePayload(new LoadGeometry(*this)); |
815 | 583 Schedule(command.release()); |
584 } | |
585 | |
586 { | |
1299
c38c89684d83
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1297
diff
changeset
|
587 std::unique_ptr<OrthancStone::OrthancRestApiCommand> command(new OrthancStone::OrthancRestApiCommand); |
815 | 588 command->SetUri("/instances/" + instanceId + "/metadata/TransferSyntax"); |
1128
8e3763d1736a
removing CustomOracleCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1117
diff
changeset
|
589 command->AcquirePayload(new LoadTransferSyntax(*this)); |
815 | 590 Schedule(command.release()); |
591 } | |
592 } | |
593 } |