Loading...
Searching...
No Matches
DicomPhantomZSliceHeader.hh
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26//
27/// \file medical/DICOM/include/DicomPhantomZSliceHeader.hh
28/// \brief Definition of the DicomPhantomZSliceHeader class
29//
30
31#ifndef DicomPhantomZSliceHeader_h
32#define DicomPhantomZSliceHeader_h 1
33
34#include <fstream>
35#include <vector>
36#include "globals.hh"
37
38class G4material;
39
40//*******************************************************
41/// DicomPhantomZSliceHeader class
42///
43/// Contains the meta data information corresponding to one or several
44/// Z slices (number of voxels, dimension)
45///
46/// History: 30.11.07 First version
47/// \author P. Arce
48//*******************************************************
49
51{
52public:
54
56 // build object copying an existing one (except Z dimensions)
57
58 DicomPhantomZSliceHeader( std::ifstream& fin );
59 // build object reading data from a file
60
62
63 // Get and set methods
64 G4int GetNoVoxelsX() const { return fNoVoxelsX; };
65 G4int GetNoVoxelsY() const { return fNoVoxelsY; };
66 G4int GetNoVoxelsZ() const { return fNoVoxelsZ; };
67 G4int GetNoVoxels() const { return fNoVoxelsX*fNoVoxelsY*fNoVoxelsZ; };
68
69 G4double GetMinX() const { return fMinX; };
70 G4double GetMinY() const { return fMinY; };
71 G4double GetMinZ() const { return fMinZ; };
72 G4double GetMaxX() const { return fMaxX; };
73 G4double GetMaxY() const { return fMaxY; };
74 G4double GetMaxZ() const { return fMaxZ; };
75
76 G4double GetVoxelHalfX() const { return (fMaxX-fMinX)/fNoVoxelsX/2.; };
77 G4double GetVoxelHalfY() const { return (fMaxY-fMinY)/fNoVoxelsY/2.; };
78 G4double GetVoxelHalfZ() const { return (fMaxZ-fMinZ)/fNoVoxelsZ/2.; };
79
80 const std::vector<G4String>& GetMaterialNames() const { return fMaterialNames; };
81
82 void SetNoVoxelsX(const G4int& val) { fNoVoxelsX = val; }
83 void SetNoVoxelsY(const G4int& val) { fNoVoxelsY = val; }
84 void SetNoVoxelsZ(const G4int& val) { fNoVoxelsZ = val; }
85
86 void SetMinX(const G4double& val) { fMinX = val; };
87 void SetMaxX(const G4double& val) { fMaxX = val; };
88 void SetMinY(const G4double& val) { fMinY = val; };
89 void SetMaxY(const G4double& val) { fMaxY = val; };
90 void SetMinZ(const G4double& val) { fMinZ = val; };
91 void SetMaxZ(const G4double& val) { fMaxZ = val; };
92
93 void SetMaterialNames(std::vector<G4String>& mn ){ fMaterialNames = mn; }
94
95 void operator+=( const DicomPhantomZSliceHeader& rhs );
97 // add two slices that have the same dimensions, merging them in Z
98
99 //=================================================================
100 // NEW REVISION ( Jonathan Madsen - jonathan.madsen@cern.ch )
101 // December 2012
102 //
103 // New data handling format -> movement away from file-based to class based
104 // -- If density and mate ID data is not present -> read from file
105 //
106 // REASONING:
107 // -- DICOM data can contain inconsistencies, handling via class
108 // instead of via file
109 // allows safe/easy modification
110 //
111 // Adding Data to densities and fMateIDs
112 //
113 void SetFilename(const G4String& val) { fFilename = val; }
114 void SetSliceLocation(const G4double& val) { fSliceLocation = val; }
115 void AddMaterial(const G4String& val) { fMaterialNames.push_back(val); }
116
117 const G4double& GetSliceLocation() const { return fSliceLocation; }
118
119 void AddRow() { fValues.push_back(std::vector<G4double>(0));
120 fMateIDs.push_back(std::vector<G4int>(0)); }
121
122 void AddValue(G4double val) { (fValues.size() > 0) ?
123 fValues.back().push_back(val) :
124 fValues.push_back(std::vector<G4double>(1,val)); }
125 void AddValue(const std::vector<G4double>& val) { fValues.push_back(val); }
126 void AddValue(const std::vector<std::vector<G4double> >& val) {
127 for(unsigned int i = 0; i < val.size(); ++i) { fValues.push_back(val.at(i)); }
128 }
129
130 void AddMateID(G4int val) { (fMateIDs.size() > 0) ?
131 fMateIDs.back().push_back(val) :
132 fMateIDs.push_back(std::vector<G4int>(1,val)); }
133 void AddMateID(const std::vector<G4int>& val) { fMateIDs.push_back(val); }
134 void AddMateID(const std::vector<std::vector<G4int> >& val) {
135 for(unsigned int i = 0; i < val.size(); ++i) { fMateIDs.push_back(val.at(i)); }
136 }
137
138 const std::vector<std::vector<G4double> >& GetValues() const { return fValues; }
139 const std::vector<std::vector<G4int> >& GetMateIDs() const { return fMateIDs; }
140
141 void DumpToFile();
142 void ReadDataFromFile();
143
145 if(fFilename.length() != 0) { fValues.clear(); fMateIDs.clear(); } }
146
147 void FlipData();
148
149private:
150 inline G4bool IsInteger(const G4String&);
151 template <typename T>
152 inline void Print(std::ostream&, const std::vector<T>&, const G4String&,
153 G4int breakLine = -1);
154 template <typename T> inline T G4s2n(const G4String&);
155 template <typename T> inline bool CheckConsistency(const T&, const T&, G4String);
156 //
157 // END NEW REVISION
158 //=======================================================================
159
160private:
161 G4bool CheckMaterialExists( const G4String& mateName );
162 // check that material read exists as a G4Material
163
164private:
165 G4int fNoVoxelsX, fNoVoxelsY, fNoVoxelsZ; // number of voxels in each dimensions
166 G4double fMinX,fMinY,fMinZ; // minimum extension of voxels (position of wall)
167 G4double fMaxX,fMaxY,fMaxZ; // maximum extension of voxels (position of wall)
168
169 std::vector<G4String> fMaterialNames; // list of material names
170
172 std::vector<std::vector<G4double> > fValues;
173 std::vector<std::vector<G4int> > fMateIDs;
175
176};
177
178//============================================================================
179// This function flips all the data
180// Otherwise, the image is upside-down
182{
183 std::reverse(fValues.begin(), fValues.end());
184 std::reverse(fMateIDs.begin(), fMateIDs.end());
185}
186//=============================================================================
188{
189 return (str.find_first_not_of("0123456789") == std::string::npos) ? true : false;
190}
191//============================================================================
192template <typename T>
194{
195 std::istringstream iss(str);
196 T val;
197 iss >> val;
198 return val;
199}
200
201//============================================================================
202template <typename T>
203inline bool DicomPhantomZSliceHeader::CheckConsistency(const T& val1, const T& val2,
204 G4String category) {
205 if(val1 != val2) {
206 G4Exception("DicomPhantomSliceZHeader::CheckConsistency",
207 "Consistency Mismatch : Keeping previous value if nonzero",
208 JustWarning, category.c_str());
209 return false;
210 }
211 return true;
212}
213//============================================================================
214template <typename T>
215inline void DicomPhantomZSliceHeader::Print(std::ostream& out, const std::vector<T>& val,
216 const G4String& delim, G4int breakLine)
217{
218 for(unsigned int i = 0; i < val.size(); ++i) {
219 out << val.at(i);
220 if(breakLine < 0) {
221 if(i+1 < val.size()) { out << delim; }
222 else { out << G4endl; }
223 } else {
224 ((i != 0 && i%breakLine == 0) ? (out << G4endl) : (out << delim)); }
225 }
226}
227//==========================================================================
228
229#endif
DicomPhantomZSliceHeader class.
void SetMinZ(const G4double &val)
void Print(std::ostream &, const std::vector< T > &, const G4String &, G4int breakLine=-1)
const std::vector< std::vector< G4double > > & GetValues() const
G4bool CheckMaterialExists(const G4String &mateName)
std::vector< std::vector< G4int > > fMateIDs
void AddMaterial(const G4String &val)
G4bool IsInteger(const G4String &)
void AddValue(const std::vector< std::vector< G4double > > &val)
void SetSliceLocation(const G4double &val)
void SetMinX(const G4double &val)
void SetNoVoxelsX(const G4int &val)
void SetMaxX(const G4double &val)
DicomPhantomZSliceHeader(const DicomPhantomZSliceHeader &)=default
void SetMaxY(const G4double &val)
DicomPhantomZSliceHeader operator+(const DicomPhantomZSliceHeader &rhs)
const std::vector< G4String > & GetMaterialNames() const
void AddMateID(const std::vector< G4int > &val)
std::vector< G4String > fMaterialNames
const G4double & GetSliceLocation() const
void SetNoVoxelsY(const G4int &val)
void SetFilename(const G4String &val)
void AddMateID(const std::vector< std::vector< G4int > > &val)
void SetMaterialNames(std::vector< G4String > &mn)
void SetMinY(const G4double &val)
std::vector< std::vector< G4double > > fValues
void operator+=(const DicomPhantomZSliceHeader &rhs)
void AddValue(const std::vector< G4double > &val)
void SetNoVoxelsZ(const G4int &val)
const std::vector< std::vector< G4int > > & GetMateIDs() const
void SetMaxZ(const G4double &val)
bool CheckConsistency(const T &, const T &, G4String)

Applications | User Support | Publications | Collaboration