source: trunk/source/visualization/gMocren/include/G4GMocrenIO.hh @ 1242

Last change on this file since 1242 was 1228, checked in by garnier, 14 years ago

update geant4.9.3 tag

File size: 13.8 KB
Line 
1//
2// File I/O manager class for writing or reading calcuated dose
3// distribution and some event information
4//
5//
6//  Mar. 31, 2009 :  release for the gMocrenFile driver
7//
8//                               Akinori Kimura
9//
10//                               gMocren home page:
11//                               http://geant4.kek.jp/gMocren/
12//
13#ifndef GMOCRENIO_HH
14#define GMOCRENIO_HH
15
16#include <vector>
17#include <string>
18#include <fstream>
19#include <map>
20
21//
22//----- GMocrenDataPrimitive class -----//
23// data primitive class for volume data
24//
25template <typename T> class GMocrenDataPrimitive {
26protected:
27  int kSize[3];
28  double kScale;
29  T kMinmax[2];
30  float kCenter[3];
31  std::vector<T *> kImage;
32  std::string kDataName;
33  //std::vector<std::vector<T>> image;
34
35public:
36  GMocrenDataPrimitive();
37  //GMocrenDataPrimitive(GMocrenDataPrimitive<T> & _prim);
38  ~GMocrenDataPrimitive();
39
40  GMocrenDataPrimitive<T> & operator = (const GMocrenDataPrimitive<T> & _right);
41  GMocrenDataPrimitive<T> & operator + (const GMocrenDataPrimitive<T> & _right);
42  GMocrenDataPrimitive<T> & operator += (const GMocrenDataPrimitive<T> & _right);
43
44  void clear();
45  void clearImage();
46  void setSize(int _size[3]);
47  void getSize(int _size[3]);
48  void setScale(double & _scale);
49  double getScale();
50  void setMinMax(T _minmax[2]);
51  void getMinMax(T _minmax[2]);
52  void setImage(std::vector<T *> & _image);
53  void addImage(T * _image);
54  std::vector<T *> & getImage();
55  T * getImage(int _z);  // get image of each layer
56  void setCenterPosition(float _center[3]);
57  void getCenterPosition(float _center[3]);
58  void setName(std::string & _name);
59  std::string getName();
60};
61
62
63//
64//----- GMocrenTrack class -----//
65//
66class GMocrenTrack {
67public:
68  struct Step {
69    float startPoint[3];
70    float endPoint[3];
71  };
72protected:
73  std::vector<struct Step> kTrack;
74  unsigned char kColor[3];
75
76public:
77  GMocrenTrack();
78  ~GMocrenTrack(){;}
79
80 
81  int getNumberOfSteps() {return (int)kTrack.size();}
82  void addStep(float _startx, float _starty, float _startz,
83               float _endx, float _endy, float _endz);
84  void getStep(float & _startx, float & _starty, float & _startz,
85               float & _endx, float & _endy, float & _endz,
86               int _num);
87  void setTrack(std::vector<struct Step> & _aTrack) {kTrack = _aTrack;}
88  void setColor(unsigned char _color[3]) {
89    for(int i = 0; i < 3; i++) kColor[i] = _color[i];
90  }
91  void getColor(unsigned char _color[3]) {
92    for(int i = 0; i < 3; i++) _color[i] = kColor[i];
93  }
94  void translate(std::vector<float> & _tranlate);
95};
96
97
98
99//
100//----- GMocrenDetector class -----//
101//
102class GMocrenDetector {
103public:
104  struct Edge {
105    float startPoint[3];
106    float endPoint[3];
107  };
108protected:
109  std::vector<struct Edge> kDetector;
110  unsigned char kColor[3];
111  std::string kName;
112
113public:
114  GMocrenDetector();
115  ~GMocrenDetector(){;}
116
117 
118  int getNumberOfEdges() {return (int)kDetector.size();}
119  void addEdge(float _startx, float _starty, float _startz,
120               float _endx, float _endy, float _endz);
121  void getEdge(float & _startx, float & _starty, float & _startz,
122               float & _endx, float & _endy, float & _endz,
123               int _num);
124  void setDetector(std::vector<struct Edge> & _aDetector) {kDetector = _aDetector;}
125  void setColor(unsigned char _color[3]) {
126    for(int i = 0; i < 3; i++) kColor[i] = _color[i];
127  }
128  void getColor(unsigned char _color[3]) {
129    for(int i = 0; i < 3; i++) _color[i] = kColor[i];
130  }
131  void setName(std::string & _name) { kName = _name;}
132  std::string getName() {return kName;}
133
134  void translate(std::vector<float> & _tranlate);
135};
136
137
138//
139//----- G4GMocrenIO class -----//
140//
141class G4GMocrenIO {
142public:
143  // file id
144  static std::string kId;
145
146  // file version
147  static std::string kVersion;
148
149  // data file name
150  static std::string kFileName;
151
152  // file data endian: little or not
153  static char kLittleEndianInput;
154  static char kLittleEndianOutput;
155
156  static std::string kComment;
157
158  // number of events
159  static int kNumberOfEvents;
160
161  // pointer to the modality image data
162  static unsigned int kPointerToModalityData;
163  // pointer to the dose distribution image data
164  static std::vector<unsigned int> kPointerToDoseDistData;
165  // pointer to the ROI image data
166  static unsigned int kPointerToROIData;
167  // pointer to the track data
168  static unsigned int kPointerToTrackData;
169  // pointer to the detector data
170  static unsigned int kPointerToDetectorData;
171
172  // voxel spacing (universal size)
173  static float kVoxelSpacing[3];
174
175  //----- modality image -----//
176  static class GMocrenDataPrimitive<short> kModality;
177  // density map to modality (CT) values
178  static std::vector<float> kModalityImageDensityMap;
179  static std::string kModalityUnit;
180
181  //----- dose distribution -----//
182  static std::vector<class GMocrenDataPrimitive<double> > kDose;
183  //std::vector<short *> kShortDose;
184  static std::string kDoseUnit;
185
186  //----- RoI -----//
187  static std::vector<class GMocrenDataPrimitive<short> > kRoi;
188
189  //----- track information -----//
190  static std::vector<float *> kSteps; // begin (x,y,z), end (x,y,z)
191  static std::vector<unsigned char *> kStepColors; // r, g, b
192
193  static std::vector<class GMocrenTrack> kTracks;
194  bool kTracksWillBeStored;
195
196  //----- detector information -----//
197  static std::vector<class GMocrenDetector> kDetectors;
198
199  //----- verbose information -----//
200  static int kVerbose; // verbose level :  0 - 5 (none - overtalk)
201
202public:
203  // constructor
204  G4GMocrenIO();
205  // destructor
206  ~G4GMocrenIO();
207
208  // initialize
209  void initialize();
210
211  // set the gMocren data file name
212  void setFileName(std::string & _filename) {kFileName = _filename;}
213  void setFileName(char * _filename) {kFileName = _filename;}
214  // get the gMocren data file name
215  std::string & getFileName() {return kFileName;}
216  // store all data in the gMocren data file
217  bool storeData(char * _filename); // interface for version 4
218  bool storeData();
219  bool storeData2(char * _filename); // version 2
220  bool storeData2();
221  bool storeData3(char * _filename); // version 3
222  bool storeData3();
223  bool storeData4(char * _filename); // version 4
224  bool storeData4();
225  // retrieve all data from the gMocren data file
226  bool retrieveData(char * _filename); // interface
227  bool retrieveData();
228  bool retrieveData2(char * _filename); //version 2
229  bool retrieveData2();
230  bool retrieveData3(char * _filename); // version 3
231  bool retrieveData3();
232  bool retrieveData4(char * _filename); // version 4
233  bool retrieveData4();
234   
235  // get & set the file id
236  std::string & getID() {return kId;}
237  void setID();
238  void setID(std::string & _id) {kId = _id;}
239
240  // get & set the file version
241  std::string & getVersion();
242  void setVersion(std::string & _version);
243
244  // set endians of input/output data
245  void setLittleEndianInput(bool _little);
246  void setLittleEndianOutput(bool _little);
247
248  // get & set comment
249  std::string & getComment() {return kComment;}
250  void setComment(std::string & _comment) {kComment = _comment;}
251 
252
253  // voxel spacing
254  void setVoxelSpacing(float _spacing[3]);
255  void getVoxelSpacing(float _spacing[3]);
256
257  // get & set number of events
258  int & getNumberOfEvents();
259  void setNumberOfEvents(int & _numberOfEvents);
260  void addOneEvent();
261
262  // set pointer the modality image data
263  void setPointerToModalityData(unsigned int & _pointer);
264  unsigned int getPointerToModalityData();
265  // set pointer the dose distribution image data
266  void addPointerToDoseDistData(unsigned int & _pointer);
267  unsigned int getPointerToDoseDistData(int _elem = 0);
268  // set pointer the ROI image data
269  void setPointerToROIData(unsigned int & _pointer);
270  unsigned int getPointerToROIData();
271  // set pointer the track data
272  void setPointerToTrackData(unsigned int & _pointer);
273  unsigned int getPointerToTrackData();
274private:
275  // calculate pointers
276  void calcPointers4();
277  void calcPointers3();
278  void calcPointers2();
279
280
281  //----- Modality image -----//
282public:
283  // get & set the modality image size
284  void getModalityImageSize(int _size[3]);
285  void setModalityImageSize(int _size[3]);
286  // get & set the modality image spacing size
287  void getModalityImageVoxelSpacing(float _size[3]); // un-usable
288  void setModalityImageVoxelSpacing(float _size[3]); // un-usable
289  // get & set the modality image size
290  void setModalityImageScale(double & _scale);
291  double getModalityImageScale();
292  // set the modality image in CT
293  void setModalityImage(short * _image);
294  short * getModalityImage(int _z);
295  void clearModalityImage();
296  // set/get the modality image density map
297  void setModalityImageDensityMap(std::vector<float> & _map);
298  std::vector<float> & getModalityImageDensityMap();
299  // set the modality image min./max.
300  void setModalityImageMinMax(short _minmax[2]);
301  // get min. & max. of the modality image
302  void getModalityImageMinMax(short _minmax[2]);
303  short getModalityImageMax();
304  short getModalityImageMin();
305  // set center of the modality image position
306  void setModalityCenterPosition(float _center[3]);
307  void getModalityCenterPosition(float _center[3]);
308  // get & set the modality image unit
309  std::string getModalityImageUnit();
310  void setModalityImageUnit(std::string & _unit);
311
312  short convertDensityToHU(float & _dens);
313
314  //----- Dose distribution -----//
315
316  // instanciate a dose distribution data object
317  void newDoseDist();
318  // get number of dose distribion data
319  int getNumDoseDist();
320  // get & set the dose distribution unit
321  std::string getDoseDistUnit(int _num = 0);
322  void setDoseDistUnit(std::string & _unit, int _num = 0);
323  // get & set the dose distribution image size
324  void getDoseDistSize(int _size[3], int _num = 0);
325  void setDoseDistSize(int _size[3], int _num = 0);
326  // get min. & max. of the dose distribution image
327  void setDoseDistMinMax(short _minmax[2], int _num = 0);
328  void getDoseDistMinMax(short _minmax[2], int _num = 0);
329  // get min. & max. of the dose distribution
330  void setDoseDistMinMax(double _minmax[2], int _num = 0);
331  void getDoseDistMinMax(double _minmax[2], int _num = 0);
332  // get & set scale value of the dose distribution for the image
333  void setDoseDistScale(double & _scale, int _num = 0);
334  double getDoseDistScale(int _num = 0);
335  // set the dose distribution image
336  void setShortDoseDist(short * _image, int _num = 0);
337  void getShortDoseDist(short * _data, int _z, int _num = 0);
338  void getShortDoseDistMinMax(short _minmax[2], int _num = 0);
339  // set the dose distribution
340  void setDoseDist(double * _image, int _num = 0);
341  double * getDoseDist(int _z, int _num = 0);
342  // add another dose ditribution map to this map
343  bool addDoseDist(std::vector<double *> & _image, int _num = 0);
344
345  // get & get center position of calculated dose region
346  void getDoseDistCenterPosition(float _center[3], int _num = 0);
347  void setDoseDistCenterPosition(float _center[3], int _num = 0);
348
349  // get & get name of calculated dose distribution
350  std::string getDoseDistName(int _num = 0);
351  void setDoseDistName(std::string _name, int _num = 0);
352
353  // copy dose distributions
354  void copyDoseDist(std::vector<class GMocrenDataPrimitive<double> > & _dose);
355  // merge two dose distributions
356  bool mergeDoseDist(std::vector<class GMocrenDataPrimitive<double> > & _dose);
357
358  // clear all dose distributions
359  void clearDoseDistAll();
360protected:
361  // check whether dose variable is empty or not
362  bool isDoseEmpty();
363  // calcuated scale value to convert dose distribution into image
364  void calcDoseDistScale();
365
366public:
367  //----- RoI -----//
368
369  // instanciate an RoI data object
370  void newROI();
371  // get number of RoI data
372  int getNumROI();
373  // get & set the ROI image scale
374  double getROIScale(int _num = 0);
375  void setROIScale(double & _scale, int _num = 0);
376  // get & set the ROI image
377  short * getROI(int _z, int _num = 0);
378  void setROI(short * _image, int _num = 0);
379  // get & set the ROI image size
380  void getROISize(int _size[3], int _num = 0);
381  void setROISize(int _size[3], int _num = 0);
382  // get & set position of the ROI region center
383  void getROICenterPosition(float _center[3], int _num = 0);
384  void setROICenterPosition(float _center[3], int _num = 0);
385  // get & set the ROI image min. and max.
386  void getROIMinMax(short _minmax[2], int _num = 0);
387  void setROIMinMax(short _minmax[2], int _num = 0);
388  void clearROIAll();
389protected:
390  // check whether RoI variable is empty or not
391  bool isROIEmpty();
392
393
394public:
395  //----- Track -----//
396  // get number of tracks
397  int getNumTracks();
398  int getNumTracks4();
399  // get & set tracks
400  std::vector<float *> & getTracks();
401  void getTrack(int _num, std::vector<float *> & _steps, 
402                std::vector<unsigned char * > & _color);
403  void addTrack(float * _tracks);
404  void setTracks(std::vector<float *> & _tracks);
405  std::vector<unsigned char *> & getTrackColors();
406  void addTrackColor(unsigned char * _colors);
407  void setTrackColors(std::vector<unsigned char *> & _trackColors);
408  void copyTracks(std::vector<float *> & _tracks, std::vector<unsigned char *> & _colors);
409  void mergeTracks(std::vector<float *> & _tracks, std::vector<unsigned char *> & _colors);
410  void addTrack(std::vector<float *> & _steps, unsigned char _color[3]);
411
412  void notStoredTracks() {kTracksWillBeStored = false;};
413  void translateTracks(std::vector<float> & _translateo);
414  void clearTracks() {kTracks.clear();}
415
416
417  //----- Detectors -----//
418  // get number of detectors
419  int getNumberOfDetectors();
420  // add one detector which consists of edges (float[6])
421  void addDetector(std::string & _name, std::vector<float *> & _det, unsigned char _color[3]);
422  void getDetector(int _num, std::vector<float *> & _edges,
423                   std::vector<unsigned char *> & _color,
424                   std::string & _detectorName);
425  void translateDetector(std::vector<float> & _translate);
426  void clearDetector() {kDetectors.clear();}
427
428protected:
429  // endian conversion
430  template <typename Type> void convertEndian(char *, Type &);
431  // byte order inversion
432  template <typename T> void invertByteOrder(char * _val, T & _rval);
433
434
435public:
436  //----- verbose information -----//
437  void setVerboseLevel(int _level);
438
439};
440
441#endif
442
Note: See TracBrowser for help on using the repository browser.