Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4GMocrenIO.cc
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// $Id$
28//
29//
30// File I/O manager class for writing or reading calcuated dose
31// distribution and some event information
32//
33// Created: Mar. 31, 2009 Akinori Kimura : release for the gMocrenFile driver
34//
35// Akinori Kimura
36// gMocren home page:
37// http://geant4.kek.jp/gMocren/
38//
39//
40#include "G4GMocrenIO.hh"
41#include <iostream>
42#include <ctime>
43#include <sstream>
44#include <iomanip>
45#include <cstdlib>
46#include <cstring>
47
48#include "globals.hh"
49#include "G4VisManager.hh"
50
51#if defined(_WIN32)
52#define LITTLE_ENDIAN 1234
53#define BYTE_ORDER LITTLE_ENDIAN
54#endif
55
56const int DOSERANGE = 25000;
57
58//----- GMocrenDataPrimitive class in the GMocrenDataIO class-----//
59template <typename T>
61 clear();
62}
63template <typename T>
65 /*
66 std::vector<short *>::iterator itr = image.begin();
67 for(; itr != image.end(); itr++) {
68 delete [] *itr;
69 }
70 */
73template <typename T> GMocrenDataPrimitive<T> &
75 for(int i = 0; i < 3; i++) {
76 kSize[i] = _right.kSize[i];
77 kCenter[i] = _right.kCenter[i];
78 }
79 kScale = _right.kScale;
80 for(int i = 0; i < 2; i++) kMinmax[i] = _right.kMinmax[i];
81 int num = kSize[0]*kSize[1];
82 kImage.clear();
83 for(int z = 0; z < kSize[2]; z++) {
84 T * img = new T[num];
85 for(int i = 0; i < num; i++) img[i] =_right.kImage[z][i];
86 kImage.push_back(img);
87 }
88 return *this;
89}
90
91template <typename T> GMocrenDataPrimitive<T> &
93
95 bool stat = true;
96 for(int i = 0; i < 3; i++) {
97 if(kSize[i] != _right.kSize[i]) stat = false;
98 if(kCenter[i] != _right.kCenter[i]) stat = false;
99 }
100 if(!stat) {
102 G4cout << "Warning: operator + "
103 << " Cannot do the operator +"
104 << G4endl;
105 return *this;
106 }
107
108 rprim.setSize(kSize);
109 rprim.setCenterPosition(kCenter);
110
111 T mms[2] = {9e100,-9e100};
112 //if(mms[0] > _right.minmax[0]) mms[0] = _right.minmax[0];
113 //if(mms[1] < _right.minmax[1]) mms[1] = _right.minmax[1];
114
115 int num = kSize[0]*kSize[1];
116 for(int z = 0; z < kSize[2]; z++) {
117 T * img = new T[num];
118 for(int xy = 0; xy < num; xy++) {
119 img[xy] = kImage[z][xy] + _right.kImage[z][xy];
120 if(mms[0] > img[xy]) mms[0] = img[xy];
121 if(mms[1] < img[xy]) mms[1] = img[xy];
122 }
123 rprim.addImage(img);
124 }
125 rprim.setMinMax(mms);
126
127 T scl = mms[1]/DOSERANGE;
128 rprim.setScale(scl);
129
130 return rprim;
131}
132
133template <typename T> GMocrenDataPrimitive<T> &
135
136 bool stat = true;
137 for(int i = 0; i < 3; i++) {
138 if(kSize[i] != _right.kSize[i]) stat = false;
139 if(kCenter[i] != _right.kCenter[i]) stat = false;
140 }
141 if(!stat) {
143 G4cout << "Warning: operator += " << G4endl
144 << " Cannot do the operator +="
145 << G4endl;
146 return *this;
147 }
148
149 if(kMinmax[0] > _right.kMinmax[0]) kMinmax[0] = _right.kMinmax[0];
150 if(kMinmax[1] < _right.kMinmax[1]) kMinmax[1] = _right.kMinmax[1];
151
152 int num = kSize[0]*kSize[1];
153 for(int z = 0; z < kSize[2]; z++) {
154 for(int xy = 0; xy < num; xy++) {
155 kImage[z][xy] += _right.kImage[z][xy];
156 if(kMinmax[0] > kImage[z][xy]) kMinmax[0] = kImage[z][xy];
157 if(kMinmax[1] < kImage[z][xy]) kMinmax[1] = kImage[z][xy];
158 }
159 }
160
161 kScale = kMinmax[1]/DOSERANGE;
162
163 return *this;
164}
165
166template <typename T>
168 for(int i = 0; i < 3; i++) {
169 kSize[i] = 0;
170 kCenter[i] = 0.;
171 }
172 kScale = 1.;
173 kMinmax[0] = (T)32109;
174 kMinmax[1] = (T)-32109;
175
176 clearImage();
177}
178template <typename T>
180 typename std::vector<T *>::iterator itr;
181 for(itr = kImage.begin(); itr != kImage.end(); itr++) {
182 delete [] *itr;
183 }
184 kImage.clear();
185}
186template <typename T>
188 for(int i = 0; i < 3; i++) kSize[i] = _size[i];
189}
190template <typename T>
192 for(int i = 0; i < 3; i++) _size[i] = kSize[i];
193}
194template <typename T>
196 kScale = _scale;
197}
198template <typename T>
200 return kScale;
201}
202template <typename T>
204 for(int i = 0; i < 2; i++) kMinmax[i] = _minmax[i];
205}
206template <typename T>
208 for(int i = 0; i < 2; i++) _minmax[i] = kMinmax[i];
209
210}
211template <typename T>
212void GMocrenDataPrimitive<T>::setImage(std::vector<T *> & _image) {
213 kImage = _image;
214}
215template <typename T>
217 kImage.push_back(_image);
218}
219template <typename T>
221 return kImage;
222}
223template <typename T>
225 if(_z >= (int)kImage.size()) return 0;
226 return kImage[_z];
227}
228template <typename T>
230 for(int i = 0; i < 3; i++) kCenter[i] = _center[i];
231}
232template <typename T>
234 for(int i = 0; i < 3; i++) _center[i] = kCenter[i];
235}
236template <typename T>
237void GMocrenDataPrimitive<T>::setName(std::string & _name) {
238 kDataName = _name;
239}
240template <typename T>
242 return kDataName;
243}
244
245
246
247
248
250 kTrack.clear();
251 for(int i = 0; i < 3; i++) kColor[i] = 0;
252}
253
254void GMocrenTrack::addStep(float _startx, float _starty, float _startz,
255 float _endx, float _endy, float _endz) {
256 struct Step step;
257 step.startPoint[0] = _startx;
258 step.startPoint[1] = _starty;
259 step.startPoint[2] = _startz;
260 step.endPoint[0] = _endx;
261 step.endPoint[1] = _endy;
262 step.endPoint[2] = _endz;
263 kTrack.push_back(step);
264}
265void GMocrenTrack::getStep(float & _startx, float & _starty, float & _startz,
266 float & _endx, float & _endy, float & _endz,
267 int _num) {
268 if(_num >= (int)kTrack.size()) {
270 G4cout << "GMocrenTrack::getStep(...) Error: "
271 << "invalid step # : " << _num << G4endl;
272 return;
273 }
274
275 _startx = kTrack[_num].startPoint[0];
276 _starty = kTrack[_num].startPoint[1];
277 _startz = kTrack[_num].startPoint[2];
278 _endx = kTrack[_num].endPoint[0];
279 _endy = kTrack[_num].endPoint[1];
280 _endz = kTrack[_num].endPoint[2];
281}
282void GMocrenTrack::translate(std::vector<float> & _translate) {
283 std::vector<struct Step>::iterator itr = kTrack.begin();
284 for(; itr != kTrack.end(); itr++) {
285 for(int i = 0; i < 3; i++ ) {
286 itr->startPoint[i] += _translate[i];
287 itr->endPoint[i] += _translate[i];
288 }
289 }
290}
291
292
293
294
295
296
297
298
299
301 kDetector.clear();
302 for(int i = 0; i < 3; i++) kColor[i] = 0;
303}
304
305void GMocrenDetector::addEdge(float _startx, float _starty, float _startz,
306 float _endx, float _endy, float _endz) {
307 struct Edge edge;
308 edge.startPoint[0] = _startx;
309 edge.startPoint[1] = _starty;
310 edge.startPoint[2] = _startz;
311 edge.endPoint[0] = _endx;
312 edge.endPoint[1] = _endy;
313 edge.endPoint[2] = _endz;
314 kDetector.push_back(edge);
315}
316void GMocrenDetector::getEdge(float & _startx, float & _starty, float & _startz,
317 float & _endx, float & _endy, float & _endz,
318 int _num) {
319 if(_num >= (int)kDetector.size()) {
321 G4cout << "GMocrenDetector::getEdge(...) Error: "
322 << "invalid edge # : " << _num << G4endl;
323 return;
324 }
325
326 _startx = kDetector[_num].startPoint[0];
327 _starty = kDetector[_num].startPoint[1];
328 _startz = kDetector[_num].startPoint[2];
329 _endx = kDetector[_num].endPoint[0];
330 _endy = kDetector[_num].endPoint[1];
331 _endz = kDetector[_num].endPoint[2];
332}
333void GMocrenDetector::translate(std::vector<float> & _translate) {
334 std::vector<struct Edge>::iterator itr = kDetector.begin();
335 for(; itr != kDetector.end(); itr++) {
336 for(int i = 0; i < 3; i++) {
337 itr->startPoint[i] += _translate[i];
338 itr->endPoint[i] += _translate[i];
339 }
340 }
341}
342
343
344
345
346
347
348
349
350
351// file information
352std::string G4GMocrenIO::kId;
353std::string G4GMocrenIO::kVersion = "2.0.0";
356
357#if BYTE_ORDER == LITTLE_ENDIAN
359#else
360char G4GMocrenIO::kLittleEndianOutput = false; // Big endian
361#endif
362std::string G4GMocrenIO::kComment;
363//
364std::string G4GMocrenIO::kFileName = "dose.gdd";
365
366//
368std::vector<unsigned int> G4GMocrenIO::kPointerToDoseDistData;
369unsigned int G4GMocrenIO::kPointerToROIData = 0;
370unsigned int G4GMocrenIO::kPointerToTrackData = 0;
372
373// modality
374float G4GMocrenIO::kVoxelSpacing[3] = {0., 0., 0.};
375class GMocrenDataPrimitive<short> G4GMocrenIO::kModality;
377std::string G4GMocrenIO::kModalityUnit = "g/cm3 "; // 12 Bytes
378
379// dose
380std::vector<class GMocrenDataPrimitive<double> > G4GMocrenIO::kDose;
381std::string G4GMocrenIO::kDoseUnit = "keV "; // 12 Bytes
382
383// ROI
384std::vector<class GMocrenDataPrimitive<short> > G4GMocrenIO::kRoi;
385
386// track
387std::vector<float *> G4GMocrenIO::kSteps;
388std::vector<unsigned char *> G4GMocrenIO::kStepColors;
389std::vector<class GMocrenTrack> G4GMocrenIO::kTracks;
390
391// detector
392std::vector<class GMocrenDetector> G4GMocrenIO::kDetectors;
393
394// verbose
396
399
400// constructor
402 : kTracksWillBeStored(true) {
403 ;
404}
405
406// destructor
408 ;
409}
410
411// initialize
413
414 kId.clear();
415 kVersion = "2.0.0";
416 kNumberOfEvents = 0;
417 kLittleEndianInput = true;
418#if BYTE_ORDER == LITTLE_ENDIAN
419 kLittleEndianOutput = true;
420#else // Big endian
421 kLittleEndianOutput = false;
422#endif
423 kComment.clear();
424 kFileName = "dose.gdd";
429 // modality
430 for(int i = 0; i < 3; i++) kVoxelSpacing[i] = 0.;
433 kModalityUnit = "g/cm3 "; // 12 Bytes
434 // dose
435 kDose.clear();
436 kDoseUnit = "keV "; // 12 Bytes
437 // ROI
438 kRoi.clear();
439 // track
440 std::vector<float *>::iterator itr;
441 for(itr = kSteps.begin(); itr != kSteps.end(); itr++) delete [] *itr;
442 kSteps.clear();
443 std::vector<unsigned char *>::iterator citr;
444 for(citr = kStepColors.begin(); citr != kStepColors.end(); citr++)
445 delete [] *citr;
446 kStepColors.clear();
447 kTracksWillBeStored = true;
448
449 // verbose
450 kVerbose = 0;
451}
452
454 return storeData4();
455}
456//
457bool G4GMocrenIO::storeData(char * _filename) {
458 return storeData4(_filename);
459}
460
462
463 bool DEBUG = false;//
464
465 if(DEBUG || kVerbose > 0)
466 G4cout << ">>>>>>> store data (ver.4) <<<<<<<" << G4endl;
467 if(DEBUG || kVerbose > 0)
468 G4cout << " " << kFileName << G4endl;
469
470 // output file open
471 std::ofstream ofile(kFileName.c_str(),
472 std::ios_base::out|std::ios_base::binary);
473 if(DEBUG || kVerbose > 0)
474 G4cout << " file open status: " << ofile << G4endl;
475
476 // file identifier
477 ofile.write("gMocren ", 8);
478
479 // file version
480 unsigned char ver = 0x04;
481 ofile.write((char *)&ver, 1);
482
483 // endian
484 //ofile.write((char *)&kLittleEndianOutput, sizeof(char));
485 char littleEndian = 0x01;
486 ofile.write((char *)&littleEndian, sizeof(char));
487 if(DEBUG || kVerbose > 0) {
488 //G4cout << "Endian: " << (int)kLittleEndianOutput << G4endl;
489 G4cout << "Endian: " << (int)littleEndian << G4endl;
490 }
491
492 // for inverting the byte order
493 float ftmp[6];
494 int itmp[6];
495 short stmp[6];
496
497 // comment length (fixed size)
498 int commentLength = 1024;
500 ofile.write((char *)&commentLength, 4);
501 } else {
502 invertByteOrder((char *)&commentLength, itmp[0]);
503 ofile.write((char *)itmp, 4);
504 }
505
506 // comment
507 char cmt[1025];
508 for(int i = 0; i < 1025; i++) cmt[i] = '\0';
509 //std::strncpy(cmt, kComment.c_str(), 1024);
510 const char * cmnt = kComment.c_str();
511 size_t lcm = std::strlen(cmnt);
512 if(lcm > 1024) lcm = 1024;
513 std::strncpy(cmt, cmnt, lcm);
514 ofile.write((char *)cmt, 1024);
515 if(DEBUG || kVerbose > 0) {
516 G4cout << "Data comment : "
517 << kComment << G4endl;
518 }
519
520 // voxel spacings for all images
522 ofile.write((char *)kVoxelSpacing, 12);
523 } else {
524 for(int j = 0; j < 3; j++)
525 invertByteOrder((char *)&kVoxelSpacing[j], ftmp[j]);
526 ofile.write((char *)ftmp, 12);
527 }
528 if(DEBUG || kVerbose > 0) {
529 G4cout << "Voxel spacing : ("
530 << kVoxelSpacing[0] << ", "
531 << kVoxelSpacing[1] << ", "
532 << kVoxelSpacing[2]
533 << ") mm " << G4endl;
534 }
535
536 calcPointers4();
538
539 // offset from file starting point to the modality image data
541 ofile.write((char *)&kPointerToModalityData, 4);
542 } else {
543 invertByteOrder((char *)&kPointerToModalityData, itmp[0]);
544 ofile.write((char *)itmp, 4);
545 }
546
547 // # of dose distributions
548 //int nDoseDist = (int)pointerToDoseDistData.size();
549 int nDoseDist = getNumDoseDist();
551 ofile.write((char *)&nDoseDist, 4);
552 } else {
553 invertByteOrder((char *)&nDoseDist, itmp[0]);
554 ofile.write((char *)itmp, 4);
555 }
556
557 // offset from file starting point to the dose image data
559 for(int i = 0; i < nDoseDist; i++) {
560 ofile.write((char *)&kPointerToDoseDistData[i], 4);
561 }
562 } else {
563 for(int i = 0; i < nDoseDist; i++) {
564 invertByteOrder((char *)&kPointerToDoseDistData[i], itmp[0]);
565 ofile.write((char *)itmp, 4);
566 }
567 }
568
569 // offset from file starting point to the ROI image data
571 ofile.write((char *)&kPointerToROIData, 4);
572 } else {
573 invertByteOrder((char *)&kPointerToROIData, itmp[0]);
574 ofile.write((char *)itmp, 4);
575 }
576
577 // offset from file starting point to the track data
579 ofile.write((char *)&kPointerToTrackData, 4);
580 } else {
581 invertByteOrder((char *)&kPointerToTrackData, itmp[0]);
582 ofile.write((char *)itmp, 4);
583 }
584
585 // offset from file starting point to the detector data
587 ofile.write((char *)&kPointerToDetectorData, 4);
588 } else {
589 invertByteOrder((char *)&kPointerToDetectorData, itmp[0]);
590 ofile.write((char *)itmp, 4);
591 }
592
593 if(DEBUG || kVerbose > 0) {
594 G4cout << "Each pointer to data : "
595 << kPointerToModalityData << ", ";
596 for(int i = 0; i < nDoseDist; i++) {
597 G4cout << kPointerToDoseDistData[i] << ", ";
598 }
599 G4cout << kPointerToROIData << ", "
600 << kPointerToTrackData << ", "
602 << G4endl;
603 }
604
605 //----- modality image -----//
606
607 int size[3];
608 float scale;
609 short minmax[2];
610 float fCenter[3];
611 int iCenter[3];
612 // modality image size
613 kModality.getSize(size);
614
616 ofile.write((char *)size, 3*sizeof(int));
617 } else {
618 for(int j = 0; j < 3; j++)
619 invertByteOrder((char *)&size[j], itmp[j]);
620 ofile.write((char *)itmp, 12);
621 }
622
623 if(DEBUG || kVerbose > 0) {
624 G4cout << "Modality image size : ("
625 << size[0] << ", "
626 << size[1] << ", "
627 << size[2] << ")"
628 << G4endl;
629 }
630
631 // modality image max. & min.
632 kModality.getMinMax(minmax);
634 ofile.write((char *)minmax, 4);
635 } else {
636 for(int j = 0; j < 2; j++)
637 invertByteOrder((char *)&minmax[j], stmp[j]);
638 ofile.write((char *)stmp, 4);
639 }
640
641 // modality image unit
642 char munit[13] = "g/cm3\0";
643 ofile.write((char *)munit, 12);
644
645 // modality image scale
646 scale = (float)kModality.getScale();
648 ofile.write((char *)&scale, 4);
649 } else {
650 invertByteOrder((char *)&scale, ftmp[0]);
651 ofile.write((char *)ftmp, 4);
652 }
653 if(DEBUG || kVerbose > 0) {
654 G4cout << "Modality image min., max., scale : "
655 << minmax[0] << ", "
656 << minmax[1] << ", "
657 << scale << G4endl;
658 }
659
660 // modality image
661 int psize = size[0]*size[1];
662 if(DEBUG || kVerbose > 0) G4cout << "Modality image : ";
663 for(int i = 0; i < size[2]; i++) {
664 short * image = kModality.getImage(i);
666 ofile.write((char *)image, psize*sizeof(short));
667 } else {
668 for(int j = 0; j < psize; j++) {
669 invertByteOrder((char *)&image[j], stmp[0]);
670 ofile.write((char *)stmp, 2);
671 }
672 }
673
674 if(DEBUG || kVerbose > 0) G4cout << "[" << i << "]" << image[(size_t)(psize*0.55)] << ", ";
675 }
676 if(DEBUG || kVerbose > 0) G4cout << G4endl;
677
678 // modality desity map for CT value
679 size_t msize = minmax[1] - minmax[0]+1;
680 if(DEBUG || kVerbose > 0)
681 G4cout << "modality image : " << minmax[0] << ", " << minmax[1] << G4endl;
682 float * pdmap = new float[msize];
683 for(int i = 0; i < (int)msize; i++) pdmap[i] =kModalityImageDensityMap[i];
684
686 ofile.write((char *)pdmap, msize*sizeof(float));
687 } else {
688 for(int j = 0; j < (int)msize; j++) {
689 invertByteOrder((char *)&pdmap[j], ftmp[0]);
690 ofile.write((char *)ftmp, 4);
691 }
692 }
693
694 if(DEBUG || kVerbose > 0) {
695 G4cout << "density map : " << std::ends;
696 for(int i = 0; i < (int)msize; i+=50)
697 G4cout <<kModalityImageDensityMap[i] << ", ";
698 G4cout << G4endl;
699 }
700 delete [] pdmap;
701
702
703 //----- dose distribution image -----//
704
705 if(!isDoseEmpty()) {
706
708
709 for(int ndose = 0; ndose < nDoseDist; ndose++) {
710 // dose distrbution image size
711 kDose[ndose].getSize(size);
713 ofile.write((char *)size, 3*sizeof(int));
714 } else {
715 for(int j = 0; j < 3; j++)
716 invertByteOrder((char *)&size[j], itmp[j]);
717 ofile.write((char *)itmp, 12);
718 }
719 if(DEBUG || kVerbose > 0) {
720 G4cout << "Dose dist. [" << ndose << "] image size : ("
721 << size[0] << ", "
722 << size[1] << ", "
723 << size[2] << ")"
724 << G4endl;
725 }
726
727 // dose distribution max. & min.
728 getShortDoseDistMinMax(minmax, ndose);
730 ofile.write((char *)minmax, 2*2); // sizeof(shorft)*2
731 } else {
732 for(int j = 0; j < 2; j++)
733 invertByteOrder((char *)&minmax[j], stmp[j]);
734 ofile.write((char *)stmp, 4);
735 }
736
737 // dose distribution unit
738 char cdunit[13];
739 for(int i = 0; i < 13; i++) cdunit[i] = '\0';
740 const char * cu = kDoseUnit.c_str();
741 size_t lcu = std::strlen(cu);
742 if(lcu > 1024) lcu = 1024;
743 std::strncpy(cdunit, cu, lcu);
744 ofile.write((char *)cdunit, 12);
745 if(DEBUG || kVerbose > 0) {
746 G4cout << "Dose dist. unit : " << kDoseUnit << G4endl;
747 }
748
749 // dose distribution scaling
750 double dscale;
751 dscale = getDoseDistScale(ndose);
752 scale = float(dscale);
754 ofile.write((char *)&scale, 4);
755 } else {
756 invertByteOrder((char *)&scale, ftmp[0]);
757 ofile.write((char *)ftmp, 4);
758 }
759 if(DEBUG || kVerbose > 0) {
760 G4cout << "Dose dist. [" << ndose
761 << "] image min., max., scale : "
762 << minmax[0] << ", "
763 << minmax[1] << ", "
764 << scale << G4endl;
765 }
766
767 // dose distribution image
768 int dsize = size[0]*size[1];
769 short * dimage = new short[dsize];
770 for(int z = 0; z < size[2]; z++) {
771 getShortDoseDist(dimage, z, ndose);
773 ofile.write((char *)dimage, dsize*2); //sizeof(short)
774 } else {
775 for(int j = 0; j < dsize; j++) {
776 invertByteOrder((char *)&dimage[j], stmp[0]);
777 ofile.write((char *)stmp, 2);
778 }
779 }
780
781 if(DEBUG || kVerbose > 0) {
782 for(int j = 0; j < dsize; j++) {
783 if(dimage[j] < 0)
784 G4cout << "[" << j << "," << z << "]"
785 << dimage[j] << ", ";
786 }
787 }
788 }
789 if(DEBUG || kVerbose > 0) G4cout << G4endl;
790 delete [] dimage;
791
792 // relative location of the dose distribution image for
793 // the modality image
794 getDoseDistCenterPosition(fCenter, ndose);
795 for(int i = 0; i < 3; i++) iCenter[i] = (int)fCenter[i];
797 ofile.write((char *)iCenter, 3*4); // 3*sizeof(int)
798 } else {
799 for(int j = 0; j < 3; j++)
800 invertByteOrder((char *)&iCenter[j], itmp[j]);
801 ofile.write((char *)itmp, 12);
802 }
803 if(DEBUG || kVerbose > 0) {
804 G4cout << "Dose dist. [" << ndose
805 << "]image relative location : ("
806 << iCenter[0] << ", "
807 << iCenter[1] << ", "
808 << iCenter[2] << ")" << G4endl;
809 }
810
811 // dose distribution name
812 std::string name = getDoseDistName(ndose);
813 if(name.size() == 0) name = "dose";
814 name.resize(80);
815 ofile.write((char *)name.c_str(), 80);
816 if(DEBUG || kVerbose > 0) {
817 G4cout << "Dose dist. name : " << name << G4endl;
818 }
819
820 }
821 }
822
823 //----- ROI image -----//
824 if(!isROIEmpty()) {
825 // ROI image size
826 kRoi[0].getSize(size);
828 ofile.write((char *)size, 3*sizeof(int));
829 } else {
830 for(int j = 0; j < 3; j++)
831 invertByteOrder((char *)&size[j], itmp[j]);
832 ofile.write((char *)itmp, 12);
833 }
834 if(DEBUG || kVerbose > 0) {
835 G4cout << "ROI image size : ("
836 << size[0] << ", "
837 << size[1] << ", "
838 << size[2] << ")"
839 << G4endl;
840 }
841
842 // ROI max. & min.
843 kRoi[0].getMinMax(minmax);
845 ofile.write((char *)minmax, sizeof(short)*2);
846 } else {
847 for(int j = 0; j < 2; j++)
848 invertByteOrder((char *)&minmax[j], stmp[j]);
849 ofile.write((char *)stmp, 4);
850 }
851
852 // ROI distribution scaling
853 scale = (float)kRoi[0].getScale();
855 ofile.write((char *)&scale, sizeof(float));
856 } else {
857 invertByteOrder((char *)&scale, ftmp[0]);
858 ofile.write((char *)ftmp, 4);
859 }
860 if(DEBUG || kVerbose > 0) {
861 G4cout << "ROI image min., max., scale : "
862 << minmax[0] << ", "
863 << minmax[1] << ", "
864 << scale << G4endl;
865 }
866
867 // ROI image
868 int rsize = size[0]*size[1];
869 for(int i = 0; i < size[2]; i++) {
870 short * rimage = kRoi[0].getImage(i);
872 ofile.write((char *)rimage, rsize*sizeof(short));
873 } else {
874 for(int j = 0; j < rsize; j++) {
875 invertByteOrder((char *)&rimage[j], stmp[0]);
876 ofile.write((char *)stmp, 2);
877 }
878 }
879
880 }
881
882 // ROI relative location
883 kRoi[0].getCenterPosition(fCenter);
884 for(int i = 0; i < 3; i++) iCenter[i] = (int)fCenter[i];
886 ofile.write((char *)iCenter, 3*sizeof(int));
887 } else {
888 for(int j = 0; j < 3; j++)
889 invertByteOrder((char *)&iCenter[j], itmp[j]);
890 ofile.write((char *)itmp, 12);
891 }
892 if(DEBUG || kVerbose > 0) {
893 G4cout << "ROI image relative location : ("
894 << iCenter[0] << ", "
895 << iCenter[1] << ", "
896 << iCenter[2] << ")" << G4endl;
897 }
898 }
899
900 //----- track information -----//
901 // number of track
902 if(kPointerToTrackData > 0) {
903
904 int ntrk = kTracks.size();
906 ofile.write((char *)&ntrk, sizeof(int));
907 } else {
908 invertByteOrder((char *)&ntrk, itmp[0]);
909 ofile.write((char *)itmp, 4);
910 }
911 if(DEBUG || kVerbose > 0) {
912 G4cout << "# of tracks : "
913 << ntrk << G4endl;
914 }
915
916 for(int nt = 0; nt < ntrk; nt++) {
917
918 // # of steps in a track
919 int nsteps = kTracks[nt].getNumberOfSteps();
921 ofile.write((char *)&nsteps, sizeof(int));
922 } else {
923 invertByteOrder((char *)&nsteps, itmp[0]);
924 ofile.write((char *)itmp, 4);
925 }
926 if(DEBUG || kVerbose > 0) {
927 G4cout << "# of steps : " << nsteps << G4endl;
928 }
929
930 // track color
931 unsigned char tcolor[3];
932 kTracks[nt].getColor(tcolor);
933 ofile.write((char *)tcolor, 3);
934
935 // steps
936 float stepPoints[6];
937 for(int isteps = 0; isteps < nsteps; isteps++) {
938 kTracks[nt].getStep(stepPoints[0], stepPoints[1], stepPoints[2],
939 stepPoints[3], stepPoints[4], stepPoints[5],
940 isteps);
941
943 ofile.write((char *)stepPoints, sizeof(float)*6);
944 } else {
945 for(int j = 0; j < 6; j++)
946 invertByteOrder((char *)&stepPoints[j], ftmp[j]);
947 ofile.write((char *)ftmp, 24);
948 }
949 }
950 }
951 }
952
953 //----- detector information -----//
954 // number of detectors
955 if(kPointerToDetectorData > 0) {
956 int ndet = kDetectors.size();
958 ofile.write((char *)&ndet, sizeof(int));
959 } else {
960 invertByteOrder((char *)&ndet, itmp[0]);
961 ofile.write((char *)itmp, 4);
962 }
963 if(DEBUG || kVerbose > 0) {
964 G4cout << "# of detectors : "
965 << ndet << G4endl;
966 }
967
968 for(int nd = 0; nd < ndet; nd++) {
969
970 // # of edges of a detector
971 int nedges = kDetectors[nd].getNumberOfEdges();
973 ofile.write((char *)&nedges, sizeof(int));
974 } else {
975 invertByteOrder((char *)&nedges, itmp[0]);
976 ofile.write((char *)itmp, 4);
977 }
978 if(DEBUG || kVerbose > 0) {
979 G4cout << "# of edges in a detector : " << nedges << G4endl;
980 }
981
982 // edges
983 float edgePoints[6];
984 for(int ne = 0; ne < nedges; ne++) {
985 kDetectors[nd].getEdge(edgePoints[0], edgePoints[1], edgePoints[2],
986 edgePoints[3], edgePoints[4], edgePoints[5],
987 ne);
988
990 ofile.write((char *)edgePoints, sizeof(float)*6);
991 } else {
992 for(int j = 0; j < 6; j++)
993 invertByteOrder((char *)&edgePoints[j], ftmp[j]);
994 ofile.write((char *)ftmp, 24);
995 }
996
997 if(DEBUG || kVerbose > 0) {
998 if(ne < 1) {
999 G4cout << " edge : (" << edgePoints[0] << ", "
1000 << edgePoints[1] << ", "
1001 << edgePoints[2] << ") - ("
1002 << edgePoints[3] << ", "
1003 << edgePoints[4] << ", "
1004 << edgePoints[5] << ")" << G4endl;
1005 }
1006 }
1007 }
1008
1009 // detector color
1010 unsigned char dcolor[3];
1011 kDetectors[nd].getColor(dcolor);
1012 ofile.write((char *)dcolor, 3);
1013 if(DEBUG || kVerbose > 0) {
1014 G4cout << " rgb : (" << (int)dcolor[0] << ", "
1015 << (int)dcolor[1] << ", "
1016 << (int)dcolor[2] << ")" << G4endl;
1017 }
1018
1019 // detector name
1020 std::string dname = kDetectors[nd].getName();
1021 dname.resize(80);
1022 ofile.write((char *)dname.c_str(), 80);
1023 if(DEBUG || kVerbose > 0) {
1024 G4cout << " detector name : " << dname << G4endl;
1025
1026 }
1027 }
1028 }
1029
1030 // file end mark
1031 ofile.write("END", 3);
1032
1033 ofile.close();
1034 if(DEBUG || kVerbose > 0)
1035 G4cout << ">>>> closed gdd file: " << kFileName << G4endl;
1036
1037 return true;
1038}
1040
1041 if(kVerbose > 0) G4cout << ">>>>>>> store data (ver.3) <<<<<<<" << G4endl;
1042 if(kVerbose > 0) G4cout << " " << kFileName << G4endl;
1043
1044 bool DEBUG = false;//
1045
1046 // output file open
1047 std::ofstream ofile(kFileName.c_str(),
1048 std::ios_base::out|std::ios_base::binary);
1049
1050 // file identifier
1051 ofile.write("gMocren ", 8);
1052
1053 // file version
1054 unsigned char ver = 0x03;
1055 ofile.write((char *)&ver, 1);
1056
1057 // endian
1058 ofile.write((char *)&kLittleEndianOutput, sizeof(char));
1059
1060 // comment length (fixed size)
1061 int commentLength = 1024;
1062 ofile.write((char *)&commentLength, 4);
1063
1064 // comment
1065 char cmt[1025];
1066 std::strncpy(cmt, kComment.c_str(), 1024);
1067 ofile.write((char *)cmt, 1024);
1068 if(DEBUG || kVerbose > 0) {
1069 G4cout << "Data comment : "
1070 << kComment << G4endl;
1071 }
1072
1073 // voxel spacings for all images
1074 ofile.write((char *)kVoxelSpacing, 12);
1075 if(DEBUG || kVerbose > 0) {
1076 G4cout << "Voxel spacing : ("
1077 << kVoxelSpacing[0] << ", "
1078 << kVoxelSpacing[1] << ", "
1079 << kVoxelSpacing[2]
1080 << ") mm " << G4endl;
1081 }
1082
1083 calcPointers3();
1084
1085 // offset from file starting point to the modality image data
1086 ofile.write((char *)&kPointerToModalityData, 4);
1087
1088 // # of dose distributions
1089 //int nDoseDist = (int)pointerToDoseDistData.size();
1090 int nDoseDist = getNumDoseDist();
1091 ofile.write((char *)&nDoseDist, 4);
1092
1093 // offset from file starting point to the dose image data
1094 for(int i = 0; i < nDoseDist; i++) {
1095 ofile.write((char *)&kPointerToDoseDistData[i], 4);
1096 }
1097
1098 // offset from file starting point to the ROI image data
1099 ofile.write((char *)&kPointerToROIData, 4);
1100
1101 // offset from file starting point to the track data
1102 ofile.write((char *)&kPointerToTrackData, 4);
1103 if(DEBUG || kVerbose > 0) {
1104 G4cout << "Each pointer to data : "
1105 << kPointerToModalityData << ", ";
1106 for(int i = 0; i < nDoseDist; i++) {
1107 G4cout << kPointerToDoseDistData[i] << ", ";
1108 }
1109 G4cout << kPointerToROIData << ", "
1111 }
1112
1113 //----- modality image -----//
1114
1115 int size[3];
1116 float scale;
1117 short minmax[2];
1118 float fCenter[3];
1119 int iCenter[3];
1120 // modality image size
1121 kModality.getSize(size);
1122 ofile.write((char *)size, 3*sizeof(int));
1123 if(DEBUG || kVerbose > 0) {
1124 G4cout << "Modality image size : ("
1125 << size[0] << ", "
1126 << size[1] << ", "
1127 << size[2] << ")"
1128 << G4endl;
1129 }
1130
1131 // modality image max. & min.
1132 kModality.getMinMax(minmax);
1133 ofile.write((char *)minmax, 4);
1134
1135 // modality image unit
1136 char munit[13] = "g/cm3 ";
1137 ofile.write((char *)munit, 12);
1138
1139 // modality image scale
1140 scale = (float)kModality.getScale();
1141 ofile.write((char *)&scale, 4);
1142 if(DEBUG || kVerbose > 0) {
1143 G4cout << "Modality image min., max., scale : "
1144 << minmax[0] << ", "
1145 << minmax[1] << ", "
1146 << scale << G4endl;
1147 }
1148
1149 // modality image
1150 int psize = size[0]*size[1];
1151 if(DEBUG || kVerbose > 0) G4cout << "Modality image : ";
1152 for(int i = 0; i < size[2]; i++) {
1153 short * image = kModality.getImage(i);
1154 ofile.write((char *)image, psize*sizeof(short));
1155
1156 if(DEBUG || kVerbose > 0) G4cout << "[" << i << "]" << image[(size_t)(psize*0.55)] << ", ";
1157 }
1158 if(DEBUG || kVerbose > 0) G4cout << G4endl;
1159
1160 // modality desity map for CT value
1161 size_t msize = minmax[1] - minmax[0]+1;
1162 float * pdmap = new float[msize];
1163 for(int i = 0; i < (int)msize; i++) pdmap[i] =kModalityImageDensityMap[i];
1164 ofile.write((char *)pdmap, msize*sizeof(float));
1165 if(DEBUG || kVerbose > 0) {
1166 G4cout << "density map : " << std::ends;
1167 for(int i = 0; i < (int)msize; i+=50)
1168 G4cout <<kModalityImageDensityMap[i] << ", ";
1169 G4cout << G4endl;
1170 }
1171 delete [] pdmap;
1172
1173
1174 //----- dose distribution image -----//
1175
1176 if(!isDoseEmpty()) {
1177
1179
1180 for(int ndose = 0; ndose < nDoseDist; ndose++) {
1181 // dose distrbution image size
1182 kDose[ndose].getSize(size);
1183 ofile.write((char *)size, 3*sizeof(int));
1184 if(DEBUG || kVerbose > 0) {
1185 G4cout << "Dose dist. [" << ndose << "] image size : ("
1186 << size[0] << ", "
1187 << size[1] << ", "
1188 << size[2] << ")"
1189 << G4endl;
1190 }
1191
1192 // dose distribution max. & min.
1193 getShortDoseDistMinMax(minmax, ndose);
1194 ofile.write((char *)minmax, 2*2); // sizeof(shorft)*2
1195
1196 // dose distribution unit
1197 ofile.write((char *)kDoseUnit.c_str(), 12);
1198 if(DEBUG || kVerbose > 0) {
1199 G4cout << "Dose dist. unit : " << kDoseUnit << G4endl;
1200 }
1201
1202 // dose distribution scaling
1203 double dscale;
1204 dscale = getDoseDistScale(ndose);
1205 scale = float(dscale);
1206 ofile.write((char *)&scale, 4);
1207 if(DEBUG || kVerbose > 0) {
1208 G4cout << "Dose dist. [" << ndose
1209 << "] image min., max., scale : "
1210 << minmax[0] << ", "
1211 << minmax[1] << ", "
1212 << scale << G4endl;
1213 }
1214
1215 // dose distribution image
1216 int dsize = size[0]*size[1];
1217 short * dimage = new short[dsize];
1218 for(int z = 0; z < size[2]; z++) {
1219 getShortDoseDist(dimage, z, ndose);
1220 ofile.write((char *)dimage, dsize*2); //sizeof(short)
1221
1222 if(DEBUG || kVerbose > 0) {
1223 for(int j = 0; j < dsize; j++) {
1224 if(dimage[j] < 0)
1225 G4cout << "[" << j << "," << z << "]"
1226 << dimage[j] << ", ";
1227 }
1228 }
1229 }
1230 if(DEBUG || kVerbose > 0) G4cout << G4endl;
1231 delete [] dimage;
1232
1233 // relative location of the dose distribution image for
1234 // the modality image
1235 getDoseDistCenterPosition(fCenter, ndose);
1236 for(int i = 0; i < 3; i++) iCenter[i] = (int)fCenter[i];
1237 ofile.write((char *)iCenter, 3*4); // 3*sizeof(int)
1238 if(DEBUG || kVerbose > 0) {
1239 G4cout << "Dose dist. [" << ndose
1240 << "]image relative location : ("
1241 << iCenter[0] << ", "
1242 << iCenter[1] << ", "
1243 << iCenter[2] << ")" << G4endl;
1244 }
1245 }
1246 }
1247
1248 //----- ROI image -----//
1249 if(!isROIEmpty()) {
1250 // ROI image size
1251 kRoi[0].getSize(size);
1252 ofile.write((char *)size, 3*sizeof(int));
1253 if(DEBUG || kVerbose > 0) {
1254 G4cout << "ROI image size : ("
1255 << size[0] << ", "
1256 << size[1] << ", "
1257 << size[2] << ")"
1258 << G4endl;
1259 }
1260
1261 // ROI max. & min.
1262 kRoi[0].getMinMax(minmax);
1263 ofile.write((char *)minmax, sizeof(short)*2);
1264
1265 // ROI distribution scaling
1266 scale = (float)kRoi[0].getScale();
1267 ofile.write((char *)&scale, sizeof(float));
1268 if(DEBUG || kVerbose > 0) {
1269 G4cout << "ROI image min., max., scale : "
1270 << minmax[0] << ", "
1271 << minmax[1] << ", "
1272 << scale << G4endl;
1273 }
1274
1275 // ROI image
1276 int rsize = size[0]*size[1];
1277 for(int i = 0; i < size[2]; i++) {
1278 short * rimage = kRoi[0].getImage(i);
1279 ofile.write((char *)rimage, rsize*sizeof(short));
1280
1281 }
1282
1283 // ROI relative location
1284 kRoi[0].getCenterPosition(fCenter);
1285 for(int i = 0; i < 3; i++) iCenter[i] = (int)fCenter[i];
1286 ofile.write((char *)iCenter, 3*sizeof(int));
1287 if(DEBUG || kVerbose > 0) {
1288 G4cout << "ROI image relative location : ("
1289 << iCenter[0] << ", "
1290 << iCenter[1] << ", "
1291 << iCenter[2] << ")" << G4endl;
1292 }
1293 }
1294
1295 //----- track information -----//
1296 // number of track
1297 int ntrk = kSteps.size();
1298 ofile.write((char *)&ntrk, sizeof(int));
1299 if(DEBUG || kVerbose > 0) {
1300 G4cout << "# of tracks : "
1301 << ntrk << G4endl;
1302 }
1303 // track position
1304 for(int i = 0; i < ntrk; i++) {
1305 float * tp = kSteps[i];
1306 ofile.write((char *)tp, sizeof(float)*6);
1307 }
1308 // track color
1309 int ntcolor = int(kStepColors.size());
1310 if(ntrk != ntcolor)
1312 G4cout << "# of track color information must be the same as # of tracks."
1313 << G4endl;
1314 unsigned char white[3] = {255,255,255}; // default color
1315 for(int i = 0; i < ntrk; i++) {
1316 if(i < ntcolor) {
1317 unsigned char * tcolor = kStepColors[i];
1318 ofile.write((char *)tcolor, 3);
1319 } else {
1320 ofile.write((char *)white, 3);
1321 }
1322 }
1323
1324 // file end mark
1325 ofile.write("END", 3);
1326
1327 ofile.close();
1328
1329 return true;
1330}
1331//
1332bool G4GMocrenIO::storeData4(char * _filename) {
1333 kFileName = _filename;
1334 return storeData4();
1335}
1336
1337// version 2
1339
1340 if(kVerbose > 0) G4cout << ">>>>>>> store data (ver.2) <<<<<<<" << G4endl;
1341 if(kVerbose > 0) G4cout << " " << kFileName << G4endl;
1342
1343 bool DEBUG = false;//
1344
1345 // output file open
1346 std::ofstream ofile(kFileName.c_str(),
1347 std::ios_base::out|std::ios_base::binary);
1348
1349 // file identifier
1350 ofile.write("GRAPE ", 8);
1351
1352 // file version
1353 unsigned char ver = 0x02;
1354 ofile.write((char *)&ver, 1);
1355 // file id for old file format support
1356 ofile.write(kId.c_str(), IDLENGTH);
1357 // file version for old file format support
1358 ofile.write(kVersion.c_str(), VERLENGTH);
1359 // endian
1360 ofile.write((char *)&kLittleEndianOutput, sizeof(char));
1361
1362 /*
1363 // event number
1364 ofile.write((char *)&numberOfEvents, sizeof(int));
1365 float imageSpacing[3];
1366 imageSpacing[0] = modalityImageVoxelSpacing[0];
1367 imageSpacing[1] = modalityImageVoxelSpacing[1];
1368 imageSpacing[2] = modalityImageVoxelSpacing[2];
1369 ofile.write((char *)imageSpacing, 12);
1370 */
1371
1372
1373 // voxel spacings for all images
1374 ofile.write((char *)kVoxelSpacing, 12);
1375 if(DEBUG || kVerbose > 0) {
1376 G4cout << "Voxel spacing : ("
1377 << kVoxelSpacing[0] << ", "
1378 << kVoxelSpacing[1] << ", "
1379 << kVoxelSpacing[2]
1380 << ") mm " << G4endl;
1381 }
1382
1383 calcPointers2();
1384 // offset from file starting point to the modality image data
1385 ofile.write((char *)&kPointerToModalityData, 4);
1386
1387 // offset from file starting point to the dose image data
1388 ofile.write((char *)&kPointerToDoseDistData[0], 4);
1389
1390 // offset from file starting point to the ROI image data
1391 ofile.write((char *)&kPointerToROIData, 4);
1392
1393 // offset from file starting point to the track data
1394 ofile.write((char *)&kPointerToTrackData, 4);
1395 if(DEBUG || kVerbose > 0) {
1396 G4cout << "Each pointer to data : "
1397 << kPointerToModalityData << ", "
1398 << kPointerToDoseDistData[0] << ", "
1399 << kPointerToROIData << ", "
1401 }
1402
1403 //----- modality image -----//
1404
1405 int size[3];
1406 float scale;
1407 short minmax[2];
1408 float fCenter[3];
1409 int iCenter[3];
1410 // modality image size
1411 kModality.getSize(size);
1412 ofile.write((char *)size, 3*sizeof(int));
1413 if(DEBUG || kVerbose > 0) {
1414 G4cout << "Modality image size : ("
1415 << size[0] << ", "
1416 << size[1] << ", "
1417 << size[2] << ")"
1418 << G4endl;
1419 }
1420
1421 // modality image max. & min.
1422 kModality.getMinMax(minmax);
1423 ofile.write((char *)minmax, 4);
1424
1425 // modality image unit
1426 //char munit[13] = "g/cm3 ";
1427 //ofile.write((char *)&munit, 12);
1428
1429 // modality image scale
1430 scale = (float)kModality.getScale();
1431 ofile.write((char *)&scale, 4);
1432 if(DEBUG || kVerbose > 0) {
1433 G4cout << "Modality image min., max., scale : "
1434 << minmax[0] << ", "
1435 << minmax[1] << ", "
1436 << scale << G4endl;
1437 }
1438
1439 // modality image
1440 int psize = size[0]*size[1];
1441 if(DEBUG || kVerbose > 0) G4cout << "Modality image : ";
1442 for(int i = 0; i < size[2]; i++) {
1443 short * image =kModality.getImage(i);
1444 ofile.write((char *)image, psize*sizeof(short));
1445
1446 if(DEBUG || kVerbose > 0) G4cout << "[" << i << "]" << image[(size_t)(psize*0.55)] << ", ";
1447 }
1448 if(DEBUG || kVerbose > 0) G4cout << G4endl;
1449
1450 // modality desity map for CT value
1451 size_t msize = minmax[1] - minmax[0]+1;
1452 float * pdmap = new float[msize];
1453 for(int i = 0; i < (int)msize; i++) pdmap[i] =kModalityImageDensityMap[i];
1454 ofile.write((char *)pdmap, msize*sizeof(float));
1455 if(DEBUG || kVerbose > 0) {
1456 G4cout << "density map : " << std::ends;
1457 for(int i = 0; i < (int)msize; i+=50)
1458 G4cout <<kModalityImageDensityMap[i] << ", ";
1459 G4cout << G4endl;
1460 }
1461 delete [] pdmap;
1462
1463
1464 //----- dose distribution image -----//
1465
1466 if(!isDoseEmpty()) {
1468
1469 // dose distrbution image size
1470 kDose[0].getSize(size);
1471 ofile.write((char *)size, 3*sizeof(int));
1472 if(DEBUG || kVerbose > 0) {
1473 G4cout << "Dose dist. image size : ("
1474 << size[0] << ", "
1475 << size[1] << ", "
1476 << size[2] << ")"
1477 << G4endl;
1478 }
1479
1480 // dose distribution max. & min.
1481 getShortDoseDistMinMax(minmax);
1482 ofile.write((char *)minmax, sizeof(short)*2);
1483
1484 // dose distribution scaling
1485 scale = (float)kDose[0].getScale();
1486 ofile.write((char *)&scale, sizeof(float));
1487 if(DEBUG || kVerbose > 0) {
1488 G4cout << "Dose dist. image min., max., scale : "
1489 << minmax[0] << ", "
1490 << minmax[1] << ", "
1491 << scale << G4endl;
1492 }
1493
1494 // dose distribution image
1495 int dsize = size[0]*size[1];
1496 short * dimage = new short[dsize];
1497 for(int z = 0; z < size[2]; z++) {
1498 getShortDoseDist(dimage, z);
1499 ofile.write((char *)dimage, dsize*sizeof(short));
1500
1501 if(DEBUG || kVerbose > 0) {
1502 for(int j = 0; j < dsize; j++) {
1503 if(dimage[j] < 0)
1504 G4cout << "[" << j << "," << z << "]"
1505 << dimage[j] << ", ";
1506 }
1507 }
1508 }
1509 if(DEBUG || kVerbose > 0) G4cout << G4endl;
1510 delete [] dimage;
1511
1512 // relative location of the dose distribution image for
1513 // the modality image
1514 kDose[0].getCenterPosition(fCenter);
1515 for(int i = 0; i < 3; i++) iCenter[i] = (int)fCenter[i];
1516 ofile.write((char *)iCenter, 3*sizeof(int));
1517 if(DEBUG || kVerbose > 0) {
1518 G4cout << "Dose dist. image relative location : ("
1519 << iCenter[0] << ", "
1520 << iCenter[1] << ", "
1521 << iCenter[2] << ")" << G4endl;
1522 }
1523
1524 }
1525
1526 //----- ROI image -----//
1527 if(!isROIEmpty()) {
1528 // ROI image size
1529 kRoi[0].getSize(size);
1530 ofile.write((char *)size, 3*sizeof(int));
1531 if(DEBUG || kVerbose > 0) {
1532 G4cout << "ROI image size : ("
1533 << size[0] << ", "
1534 << size[1] << ", "
1535 << size[2] << ")"
1536 << G4endl;
1537 }
1538
1539 // ROI max. & min.
1540 kRoi[0].getMinMax(minmax);
1541 ofile.write((char *)minmax, sizeof(short)*2);
1542
1543 // ROI distribution scaling
1544 scale = (float)kRoi[0].getScale();
1545 ofile.write((char *)&scale, sizeof(float));
1546 if(DEBUG || kVerbose > 0) {
1547 G4cout << "ROI image min., max., scale : "
1548 << minmax[0] << ", "
1549 << minmax[1] << ", "
1550 << scale << G4endl;
1551 }
1552
1553 // ROI image
1554 int rsize = size[0]*size[1];
1555 for(int i = 0; i < size[2]; i++) {
1556 short * rimage = kRoi[0].getImage(i);
1557 ofile.write((char *)rimage, rsize*sizeof(short));
1558
1559 }
1560
1561 // ROI relative location
1562 kRoi[0].getCenterPosition(fCenter);
1563 for(int i = 0; i < 3; i++) iCenter[i] = (int)fCenter[i];
1564 ofile.write((char *)iCenter, 3*sizeof(int));
1565 if(DEBUG || kVerbose > 0) {
1566 G4cout << "ROI image relative location : ("
1567 << iCenter[0] << ", "
1568 << iCenter[1] << ", "
1569 << iCenter[2] << ")" << G4endl;
1570 }
1571 }
1572
1573
1574 //----- track information -----//
1575 // track
1576 int ntrk = kSteps.size();
1577 ofile.write((char *)&ntrk, sizeof(int));
1578 if(DEBUG || kVerbose > 0) {
1579 G4cout << "# of tracks : "
1580 << ntrk << G4endl;
1581 }
1582 for(int i = 0; i < ntrk; i++) {
1583 float * tp = kSteps[i];
1584 ofile.write((char *)tp, sizeof(float)*6);
1585 }
1586
1587
1588 // file end mark
1589 ofile.write("END", 3);
1590
1591 ofile.close();
1592
1593 return true;
1594}
1595//
1596bool G4GMocrenIO::storeData2(char * _filename) {
1597 kFileName = _filename;
1598 return storeData();
1599}
1600
1602
1603 // input file open
1604 std::ifstream ifile(kFileName.c_str(), std::ios_base::in|std::ios_base::binary);
1605 if(!ifile) {
1607 G4cout << "Cannot open file: " << kFileName
1608 << " in G4GMocrenIO::retrieveData()." << G4endl;
1609 return false;
1610 }
1611
1612 // file identifier
1613 char verid[9];
1614 ifile.read((char *)verid, 8);
1615 // file version
1616 unsigned char ver;
1617 ifile.read((char *)&ver, 1);
1618 ifile.close();
1619
1620 if(std::strncmp(verid, "gMocren", 7) == 0) {
1621 if(ver == 0x03) {
1622 G4cout << ">>>>>>> retrieve data (ver.3) <<<<<<<" << G4endl;
1623 G4cout << " " << kFileName << G4endl;
1624 retrieveData3();
1625 } else if (ver == 0x04) {
1626 G4cout << ">>>>>>> retrieve data (ver.4) <<<<<<<" << G4endl;
1627 G4cout << " " << kFileName << G4endl;
1628 retrieveData4();
1629 } else {
1631 G4cout << "Error -- invalid file version : " << (int)ver
1632 << G4endl;
1633 G4cout << " " << kFileName << G4endl;
1634 }
1635 std::exit(-1);
1636 }
1637 } else if(std::strncmp(verid, "GRAPE", 5) == 0) {
1638 G4cout << ">>>>>>> retrieve data (ver.2) <<<<<<<" << G4endl;
1639 G4cout << " " << kFileName << G4endl;
1640 retrieveData2();
1641 } else {
1643 G4cout << kFileName << " was not gdd file." << G4endl;
1644 return false;
1645 }
1646
1647 return true;
1648}
1649
1650bool G4GMocrenIO::retrieveData(char * _filename) {
1651 kFileName = _filename;
1652 return retrieveData();
1653}
1654
1655//
1657
1658 bool DEBUG = false;//
1659
1660 // input file open
1661 std::ifstream ifile(kFileName.c_str(), std::ios_base::in|std::ios_base::binary);
1662 if(!ifile) {
1664 G4cout << "Cannot open file: " << kFileName
1665 << " in G4GMocrenIO::retrieveData3()." << G4endl;
1666 return false;
1667 }
1668
1669 // data buffer
1670 char ctmp[24];
1671
1672 // file identifier
1673 char verid[9];
1674 ifile.read((char *)verid, 8);
1675
1676 // file version
1677 unsigned char ver;
1678 ifile.read((char *)&ver, 1);
1679 std::stringstream ss;
1680 ss << (int)ver;
1681 kVersion = ss.str();
1682 if(DEBUG || kVerbose > 0) G4cout << "File version : " << kVersion << G4endl;
1683
1684 // endian
1685 ifile.read((char *)&kLittleEndianInput, sizeof(char));
1686 if(DEBUG || kVerbose > 0) {
1687 G4cout << "Endian : ";
1688 if(kLittleEndianInput == 1)
1689 G4cout << " little" << G4endl;
1690 else {
1691 G4cout << " big" << G4endl;
1692 }
1693 }
1694
1695 // comment length (fixed size)
1696 int clength;
1697 ifile.read((char *)ctmp, 4);
1698 convertEndian(ctmp, clength);
1699 // comment
1700 char cmt[1025];
1701 ifile.read((char *)cmt, clength);
1702 std::string scmt = cmt;
1703 scmt += '\0';
1704 setComment(scmt);
1705 if(DEBUG || kVerbose > 0) {
1706 G4cout << "Data comment : "
1707 << kComment << G4endl;
1708 }
1709
1710 // voxel spacings for all images
1711 ifile.read((char *)ctmp, 12);
1712 convertEndian(ctmp, kVoxelSpacing[0]);
1713 convertEndian(ctmp+4, kVoxelSpacing[1]);
1714 convertEndian(ctmp+8, kVoxelSpacing[2]);
1715 if(DEBUG || kVerbose > 0) {
1716 G4cout << "Voxel spacing : ("
1717 << kVoxelSpacing[0] << ", "
1718 << kVoxelSpacing[1] << ", "
1719 << kVoxelSpacing[2]
1720 << ") mm " << G4endl;
1721 }
1722
1723
1724 // offset from file starting point to the modality image data
1725 ifile.read((char *)ctmp, 4);
1727
1728 // # of dose distributions
1729 ifile.read((char *)ctmp, 4);
1730 int nDoseDist;
1731 convertEndian(ctmp, nDoseDist);
1732
1733 // offset from file starting point to the dose image data
1734 for(int i = 0; i < nDoseDist; i++) {
1735 ifile.read((char *)ctmp, 4);
1736 unsigned int dptr;
1737 convertEndian(ctmp, dptr);
1739 }
1740
1741 // offset from file starting point to the ROI image data
1742 ifile.read((char *)ctmp, 4);
1744
1745 // offset from file starting point to the track data
1746 ifile.read((char *)ctmp, 4);
1748
1749 // offset from file starting point to the detector data
1750 ifile.read((char *)ctmp, 4);
1752
1753 if(DEBUG || kVerbose > 0) {
1754 G4cout << "Each pointer to data : "
1755 << kPointerToModalityData << ", ";
1756 for(int i = 0; i < nDoseDist; i++)
1757 G4cout << kPointerToDoseDistData[i] << ", ";
1758 G4cout << kPointerToROIData << ", "
1759 << kPointerToTrackData << ", "
1761 << G4endl;
1762 }
1763
1764
1765
1766 if(kPointerToModalityData == 0 && kPointerToDoseDistData.size() == 0 &&
1768 if(DEBUG || kVerbose > 0) {
1769 G4cout << "No data." << G4endl;
1770 }
1771 return false;
1772 }
1773
1774 // event number
1775 /* ver 1
1776 ifile.read(ctmp, sizeof(int));
1777 convertEndian(ctmp, numberOfEvents);
1778 */
1779
1780 int size[3];
1781 float scale;
1782 double dscale;
1783 short minmax[2];
1784 float fCenter[3];
1785 int iCenter[3];
1786
1787 //----- Modality image -----//
1788 // modality image size
1789 ifile.read(ctmp, 3*sizeof(int));
1790 convertEndian(ctmp, size[0]);
1791 convertEndian(ctmp+sizeof(int), size[1]);
1792 convertEndian(ctmp+2*sizeof(int), size[2]);
1793 if(DEBUG || kVerbose > 0) {
1794 G4cout << "Modality image size : ("
1795 << size[0] << ", "
1796 << size[1] << ", "
1797 << size[2] << ")"
1798 << G4endl;
1799 }
1800 kModality.setSize(size);
1801
1802 // modality image voxel spacing
1803 /*
1804 ifile.read(ctmp, 3*sizeof(float));
1805 convertEndian(ctmp, modalityImageVoxelSpacing[0]);
1806 convertEndian(ctmp+sizeof(float), modalityImageVoxelSpacing[1]);
1807 convertEndian(ctmp+2*sizeof(float), modalityImageVoxelSpacing[2]);
1808 */
1809
1810 if(kPointerToModalityData != 0) {
1811
1812 // modality density max. & min.
1813 ifile.read((char *)ctmp, 4);
1814 convertEndian(ctmp, minmax[0]);
1815 convertEndian(ctmp+2, minmax[1]);
1816 kModality.setMinMax(minmax);
1817
1818 // modality image unit
1819 char munit[13];
1820 munit[12] = '\0';
1821 ifile.read((char *)munit, 12);
1822 std::string smunit = munit;
1823 setModalityImageUnit(smunit);
1824
1825 // modality density scale
1826 ifile.read((char *)ctmp, 4);
1827 convertEndian(ctmp, scale);
1828 kModality.setScale(dscale = scale);
1829 if(DEBUG || kVerbose > 0) {
1830 G4cout << "Modality image min., max., scale : "
1831 << minmax[0] << ", "
1832 << minmax[1] << ", "
1833 << scale << G4endl;
1834 }
1835
1836 // modality density
1837 int psize = size[0]*size[1];
1838 if(DEBUG || kVerbose > 0) G4cout << "Modality image (" << psize << "): ";
1839 char * cimage = new char[psize*sizeof(short)];
1840 for(int i = 0; i < size[2]; i++) {
1841 ifile.read((char *)cimage, psize*sizeof(short));
1842 short * mimage = new short[psize];
1843 for(int j = 0; j < psize; j++) {
1844 convertEndian(cimage+j*sizeof(short), mimage[j]);
1845 }
1846 kModality.addImage(mimage);
1847
1848 if(DEBUG || kVerbose > 0) G4cout << "[" << i << "]" << mimage[(size_t)(psize*0.55)] << ", ";
1849 }
1850 if(DEBUG || kVerbose > 0) G4cout << G4endl;
1851 delete [] cimage;
1852
1853 // modality desity map for CT value
1854 size_t msize = minmax[1]-minmax[0]+1;
1855 if(DEBUG || kVerbose > 0) G4cout << "msize: " << msize << G4endl;
1856 char * pdmap = new char[msize*sizeof(float)];
1857 ifile.read((char *)pdmap, msize*sizeof(float));
1858 float ftmp;
1859 for(int i = 0; i < (int)msize; i++) {
1860 convertEndian(pdmap+i*sizeof(float), ftmp);
1861 kModalityImageDensityMap.push_back(ftmp);
1862 }
1863 delete [] pdmap;
1864
1865 if(DEBUG || kVerbose > 0) {
1866 G4cout << "density map : " << std::ends;
1867 for(int i = 0; i < 10; i++)
1868 G4cout <<kModalityImageDensityMap[i] << ", ";
1869 G4cout << G4endl;
1870 for(int i = 0; i < 10; i++) G4cout << "..";
1871 G4cout << G4endl;
1872 for(size_t i =kModalityImageDensityMap.size() - 10; i <kModalityImageDensityMap.size(); i++)
1873 G4cout <<kModalityImageDensityMap[i] << ", ";
1874 G4cout << G4endl;
1875 }
1876
1877 }
1878
1879
1880 //----- dose distribution image -----//
1881 for(int ndose = 0; ndose < nDoseDist; ndose++) {
1882
1883 newDoseDist();
1884
1885 // dose distrbution image size
1886 ifile.read((char *)ctmp, 3*sizeof(int));
1887 convertEndian(ctmp, size[0]);
1888 convertEndian(ctmp+sizeof(int), size[1]);
1889 convertEndian(ctmp+2*sizeof(int), size[2]);
1890 if(DEBUG || kVerbose > 0) {
1891 G4cout << "Dose dist. image size : ("
1892 << size[0] << ", "
1893 << size[1] << ", "
1894 << size[2] << ")"
1895 << G4endl;
1896 }
1897 kDose[ndose].setSize(size);
1898
1899 // dose distribution max. & min.
1900 ifile.read((char *)ctmp, sizeof(short)*2);
1901 convertEndian(ctmp, minmax[0]);
1902 convertEndian(ctmp+2, minmax[1]);
1903
1904 // dose distribution unit
1905 char dunit[13];
1906 dunit[12] = '\0';
1907 ifile.read((char *)dunit, 12);
1908 std::string sdunit = dunit;
1909 setDoseDistUnit(sdunit, ndose);
1910 if(DEBUG || kVerbose > 0) {
1911 G4cout << "Dose dist. unit : " << kDoseUnit << G4endl;
1912 }
1913
1914 // dose distribution scaling
1915 ifile.read((char *)ctmp, 4); // sizeof(float)
1916 convertEndian(ctmp, scale);
1917 kDose[ndose].setScale(dscale = scale);
1918
1919 double dminmax[2];
1920 for(int i = 0; i < 2; i++) dminmax[i] = minmax[i]*dscale;
1921 kDose[ndose].setMinMax(dminmax);
1922
1923 if(DEBUG || kVerbose > 0) {
1924 G4cout << "Dose dist. image min., max., scale : "
1925 << dminmax[0] << ", "
1926 << dminmax[1] << ", "
1927 << scale << G4endl;
1928 }
1929
1930 // dose distribution image
1931 int dsize = size[0]*size[1];
1932 if(DEBUG || kVerbose > 0) G4cout << "Dose dist. (" << dsize << "): ";
1933 char * di = new char[dsize*sizeof(short)];
1934 short * shimage = new short[dsize];
1935 for(int z = 0; z < size[2]; z++) {
1936 ifile.read((char *)di, dsize*sizeof(short));
1937 double * dimage = new double[dsize];
1938 for(int xy = 0; xy < dsize; xy++) {
1939 convertEndian(di+xy*sizeof(short), shimage[xy]);
1940 dimage[xy] = shimage[xy]*dscale;
1941 }
1942 kDose[ndose].addImage(dimage);
1943
1944 if(DEBUG || kVerbose > 0) G4cout << "[" << z << "]" << dimage[(size_t)(dsize*0.55)] << ", ";
1945
1946 if(DEBUG || kVerbose > 0) {
1947 for(int j = 0; j < dsize; j++) {
1948 if(dimage[j] < 0)
1949 G4cout << "[" << j << "," << z << "]"
1950 << dimage[j] << ", ";
1951 }
1952 }
1953 }
1954 delete [] shimage;
1955 delete [] di;
1956 if(DEBUG || kVerbose > 0) G4cout << G4endl;
1957
1958 ifile.read((char *)ctmp, 3*4); // 3*sizeof(int)
1959 convertEndian(ctmp, iCenter[0]);
1960 convertEndian(ctmp+4, iCenter[1]);
1961 convertEndian(ctmp+8, iCenter[2]);
1962 for(int i = 0; i < 3; i++) fCenter[i] = (float)iCenter[i];
1963 kDose[ndose].setCenterPosition(fCenter);
1964
1965 if(DEBUG || kVerbose > 0) {
1966 G4cout << "Dose dist. image relative location : ("
1967 << fCenter[0] << ", "
1968 << fCenter[1] << ", "
1969 << fCenter[2] << ")" << G4endl;
1970 }
1971
1972
1973 // dose distribution name
1974 char cname[81];
1975 ifile.read((char *)cname, 80);
1976 std::string dosename = cname;
1977 setDoseDistName(dosename, ndose);
1978 if(DEBUG || kVerbose > 0) {
1979 G4cout << "Dose dist. name : " << dosename << G4endl;
1980 }
1981
1982 }
1983
1984 //----- ROI image -----//
1985 if(kPointerToROIData != 0) {
1986
1987 newROI();
1988
1989 // ROI image size
1990 ifile.read((char *)ctmp, 3*sizeof(int));
1991 convertEndian(ctmp, size[0]);
1992 convertEndian(ctmp+sizeof(int), size[1]);
1993 convertEndian(ctmp+2*sizeof(int), size[2]);
1994 kRoi[0].setSize(size);
1995 if(DEBUG || kVerbose > 0) {
1996 G4cout << "ROI image size : ("
1997 << size[0] << ", "
1998 << size[1] << ", "
1999 << size[2] << ")"
2000 << G4endl;
2001 }
2002
2003 // ROI max. & min.
2004 ifile.read((char *)ctmp, sizeof(short)*2);
2005 convertEndian(ctmp, minmax[0]);
2006 convertEndian(ctmp+sizeof(short), minmax[1]);
2007 kRoi[0].setMinMax(minmax);
2008
2009 // ROI distribution scaling
2010 ifile.read((char *)ctmp, sizeof(float));
2011 convertEndian(ctmp, scale);
2012 kRoi[0].setScale(dscale = scale);
2013 if(DEBUG || kVerbose > 0) {
2014 G4cout << "ROI image min., max., scale : "
2015 << minmax[0] << ", "
2016 << minmax[1] << ", "
2017 << scale << G4endl;
2018 }
2019
2020 // ROI image
2021 int rsize = size[0]*size[1];
2022 char * ri = new char[rsize*sizeof(short)];
2023 for(int i = 0; i < size[2]; i++) {
2024 ifile.read((char *)ri, rsize*sizeof(short));
2025 short * rimage = new short[rsize];
2026 for(int j = 0; j < rsize; j++) {
2027 convertEndian(ri+j*sizeof(short), rimage[j]);
2028 }
2029 kRoi[0].addImage(rimage);
2030
2031 }
2032 delete [] ri;
2033
2034 // ROI relative location
2035 ifile.read((char *)ctmp, 3*sizeof(int));
2036 convertEndian(ctmp, iCenter[0]);
2037 convertEndian(ctmp+sizeof(int), iCenter[1]);
2038 convertEndian(ctmp+2*sizeof(int), iCenter[2]);
2039 for(int i = 0; i < 3; i++) fCenter[i] = iCenter[i];
2040 kRoi[0].setCenterPosition(fCenter);
2041 if(DEBUG || kVerbose > 0) {
2042 G4cout << "ROI image relative location : ("
2043 << fCenter[0] << ", "
2044 << fCenter[1] << ", "
2045 << fCenter[2] << ")" << G4endl;
2046 }
2047
2048 }
2049
2050 //----- track information -----//
2051 if(kPointerToTrackData != 0) {
2052
2053 // track
2054 ifile.read((char *)ctmp, sizeof(int));
2055 int ntrk;
2056 convertEndian(ctmp, ntrk);
2057 if(DEBUG || kVerbose > 0) {
2058 G4cout << "# of tracks: " << ntrk << G4endl;
2059 }
2060
2061 // track position
2062 unsigned char rgb[3];
2063 for(int i = 0; i < ntrk; i++) {
2064
2065
2066 // # of steps in a track
2067 ifile.read((char *)ctmp, sizeof(int));
2068 int nsteps;
2069 convertEndian(ctmp, nsteps);
2070
2071 // track color
2072 ifile.read((char *)rgb, 3);
2073
2074 std::vector<float *> steps;
2075 // steps
2076 for(int j = 0; j < nsteps; j++) {
2077
2078 float * steppoint = new float[6];
2079 ifile.read((char *)ctmp, sizeof(float)*6);
2080
2081 for(int k = 0; k < 6; k++) {
2082 convertEndian(ctmp+k*sizeof(float), steppoint[k]);
2083 }
2084
2085 steps.push_back(steppoint);
2086 }
2087
2088 // add a track to the track container
2089 addTrack(steps, rgb);
2090
2091 if(DEBUG || kVerbose > 0) {
2092 if(i < 5) {
2093 G4cout << i << ": " ;
2094 for(int j = 0; j < 3; j++) G4cout << steps[0][j] << " ";
2095 int nstp = steps.size();
2096 G4cout << "<-> ";
2097 for(int j = 3; j < 6; j++) G4cout << steps[nstp-1][j] << " ";
2098 G4cout << " rgb( ";
2099 for(int j = 0; j < 3; j++) G4cout << (int)rgb[j] << " ";
2100 G4cout << ")" << G4endl;
2101 }
2102 }
2103 }
2104
2105
2106 }
2107
2108
2109 //----- detector information -----//
2110 if(kPointerToDetectorData != 0) {
2111
2112 // number of detectors
2113 ifile.read((char *)ctmp, sizeof(int));
2114 int ndet;
2115 convertEndian(ctmp, ndet);
2116
2117 if(DEBUG || kVerbose > 0) {
2118 G4cout << "# of detectors : "
2119 << ndet << G4endl;
2120 }
2121
2122 for(int nd = 0; nd < ndet; nd++) {
2123
2124 // # of edges of a detector
2125 ifile.read((char *)ctmp, sizeof(int));
2126 int nedges;
2127 convertEndian(ctmp, nedges);
2128 if(DEBUG || kVerbose > 0) {
2129 G4cout << "# of edges in a detector : " << nedges << G4endl;
2130 }
2131
2132 // edges
2133 std::vector<float *> detector;
2134 char cftmp[24];
2135 for(int ne = 0; ne < nedges; ne++) {
2136
2137 ifile.read((char *)cftmp, sizeof(float)*6);
2138 float * edgePoints = new float[6];
2139 for(int j = 0; j < 6; j++) convertEndian(&cftmp[sizeof(float)*j], edgePoints[j]);
2140 detector.push_back(edgePoints);
2141
2142 }
2143
2144 if(DEBUG || kVerbose > 0) {
2145 G4cout << " first edge : (" << detector[0][0] << ", "
2146 << detector[0][1] << ", "
2147 << detector[0][2] << ") - ("
2148 << detector[0][3] << ", "
2149 << detector[0][4] << ", "
2150 << detector[0][5] << ")" << G4endl;
2151 }
2152
2153 // detector color
2154 unsigned char dcolor[3];
2155 ifile.read((char *)dcolor, 3);
2156 if(DEBUG || kVerbose > 0) {
2157 G4cout << " detector color : rgb("
2158 << (int)dcolor[0] << ", "
2159 << (int)dcolor[1] << ", "
2160 << (int)dcolor[2] << G4endl;
2161 }
2162
2163
2164 // detector name
2165 char cname[80];
2166 ifile.read((char *)cname, 80);
2167 std::string dname = cname;
2168 if(DEBUG || kVerbose > 0) {
2169 G4cout << " detector name : " << dname << G4endl;
2170 }
2171
2172
2173 addDetector(dname, detector, dcolor);
2174
2175 }
2176 }
2177
2178
2179 ifile.close();
2180
2181 return true;
2182}
2183bool G4GMocrenIO::retrieveData4(char * _filename) {
2184 kFileName = _filename;
2185 return retrieveData();
2186}
2187
2188//
2190
2191 bool DEBUG = false;//
2192
2193 // input file open
2194 std::ifstream ifile(kFileName.c_str(), std::ios_base::in|std::ios_base::binary);
2195 if(!ifile) {
2197 G4cout << "Cannot open file: " << kFileName
2198 << " in G4GMocrenIO::retrieveData3()." << G4endl;
2199 return false;
2200 }
2201
2202 // data buffer
2203 char ctmp[12];
2204
2205 // file identifier
2206 char verid[9];
2207 ifile.read((char *)verid, 8);
2208
2209 // file version
2210 unsigned char ver;
2211 ifile.read((char *)&ver, 1);
2212 std::stringstream ss;
2213 ss << (int)ver;
2214 kVersion = ss.str();
2215 if(DEBUG || kVerbose > 0) G4cout << "File version : " << kVersion << G4endl;
2216
2217 // endian
2218 ifile.read((char *)&kLittleEndianInput, sizeof(char));
2219 if(DEBUG || kVerbose > 0) {
2220 G4cout << "Endian : ";
2221 if(kLittleEndianInput == 1)
2222 G4cout << " little" << G4endl;
2223 else {
2224 G4cout << " big" << G4endl;
2225 }
2226 }
2227
2228 // comment length (fixed size)
2229 int clength;
2230 ifile.read((char *)ctmp, 4);
2231 convertEndian(ctmp, clength);
2232 // comment
2233 char cmt[1025];
2234 ifile.read((char *)cmt, clength);
2235 std::string scmt = cmt;
2236 setComment(scmt);
2237 if(DEBUG || kVerbose > 0) {
2238 G4cout << "Data comment : "
2239 << kComment << G4endl;
2240 }
2241
2242 // voxel spacings for all images
2243 ifile.read((char *)ctmp, 12);
2244 convertEndian(ctmp, kVoxelSpacing[0]);
2245 convertEndian(ctmp+4, kVoxelSpacing[1]);
2246 convertEndian(ctmp+8, kVoxelSpacing[2]);
2247 if(DEBUG || kVerbose > 0) {
2248 G4cout << "Voxel spacing : ("
2249 << kVoxelSpacing[0] << ", "
2250 << kVoxelSpacing[1] << ", "
2251 << kVoxelSpacing[2]
2252 << ") mm " << G4endl;
2253 }
2254
2255
2256 // offset from file starting point to the modality image data
2257 ifile.read((char *)ctmp, 4);
2259
2260 // # of dose distributions
2261 ifile.read((char *)ctmp, 4);
2262 int nDoseDist;
2263 convertEndian(ctmp, nDoseDist);
2264
2265 // offset from file starting point to the dose image data
2266 for(int i = 0; i < nDoseDist; i++) {
2267 ifile.read((char *)ctmp, 4);
2268 unsigned int dptr;
2269 convertEndian(ctmp, dptr);
2271 }
2272
2273 // offset from file starting point to the ROI image data
2274 ifile.read((char *)ctmp, 4);
2276
2277 // offset from file starting point to the track data
2278 ifile.read((char *)ctmp, 4);
2280 if(DEBUG || kVerbose > 0) {
2281 G4cout << "Each pointer to data : "
2282 << kPointerToModalityData << ", ";
2283 for(int i = 0; i < nDoseDist; i++)
2284 G4cout << kPointerToDoseDistData[0] << ", ";
2285 G4cout << kPointerToROIData << ", "
2287 }
2288
2289 if(kPointerToModalityData == 0 && kPointerToDoseDistData.size() == 0 &&
2291 if(DEBUG || kVerbose > 0) {
2292 G4cout << "No data." << G4endl;
2293 }
2294 return false;
2295 }
2296
2297 // event number
2298 /* ver 1
2299 ifile.read(ctmp, sizeof(int));
2300 convertEndian(ctmp, numberOfEvents);
2301 */
2302
2303 int size[3];
2304 float scale;
2305 double dscale;
2306 short minmax[2];
2307 float fCenter[3];
2308 int iCenter[3];
2309
2310 //----- Modality image -----//
2311 // modality image size
2312 ifile.read(ctmp, 3*sizeof(int));
2313 convertEndian(ctmp, size[0]);
2314 convertEndian(ctmp+sizeof(int), size[1]);
2315 convertEndian(ctmp+2*sizeof(int), size[2]);
2316 if(DEBUG || kVerbose > 0) {
2317 G4cout << "Modality image size : ("
2318 << size[0] << ", "
2319 << size[1] << ", "
2320 << size[2] << ")"
2321 << G4endl;
2322 }
2323 kModality.setSize(size);
2324
2325 // modality image voxel spacing
2326 /*
2327 ifile.read(ctmp, 3*sizeof(float));
2328 convertEndian(ctmp, modalityImageVoxelSpacing[0]);
2329 convertEndian(ctmp+sizeof(float), modalityImageVoxelSpacing[1]);
2330 convertEndian(ctmp+2*sizeof(float), modalityImageVoxelSpacing[2]);
2331 */
2332
2333 if(kPointerToModalityData != 0) {
2334
2335 // modality density max. & min.
2336 ifile.read((char *)ctmp, 4);
2337 convertEndian(ctmp, minmax[0]);
2338 convertEndian(ctmp+2, minmax[1]);
2339 kModality.setMinMax(minmax);
2340
2341 // modality image unit
2342 char munit[13];
2343 ifile.read((char *)munit, 12);
2344 std::string smunit = munit;
2345 setModalityImageUnit(smunit);
2346
2347 // modality density scale
2348 ifile.read((char *)ctmp, 4);
2349 convertEndian(ctmp, scale);
2350 kModality.setScale(dscale = scale);
2351 if(DEBUG || kVerbose > 0) {
2352 G4cout << "Modality image min., max., scale : "
2353 << minmax[0] << ", "
2354 << minmax[1] << ", "
2355 << scale << G4endl;
2356 }
2357
2358 // modality density
2359 int psize = size[0]*size[1];
2360 if(DEBUG || kVerbose > 0) G4cout << "Modality image (" << psize << "): ";
2361 char * cimage = new char[psize*sizeof(short)];
2362 for(int i = 0; i < size[2]; i++) {
2363 ifile.read((char *)cimage, psize*sizeof(short));
2364 short * mimage = new short[psize];
2365 for(int j = 0; j < psize; j++) {
2366 convertEndian(cimage+j*sizeof(short), mimage[j]);
2367 }
2368 kModality.addImage(mimage);
2369
2370 if(DEBUG || kVerbose > 0) G4cout << "[" << i << "]" << mimage[(size_t)(psize*0.55)] << ", ";
2371 }
2372 if(DEBUG || kVerbose > 0) G4cout << G4endl;
2373 delete [] cimage;
2374
2375 // modality desity map for CT value
2376 size_t msize = minmax[1]-minmax[0]+1;
2377 if(DEBUG || kVerbose > 0) G4cout << "msize: " << msize << G4endl;
2378 char * pdmap = new char[msize*sizeof(float)];
2379 ifile.read((char *)pdmap, msize*sizeof(float));
2380 float ftmp;
2381 for(int i = 0; i < (int)msize; i++) {
2382 convertEndian(pdmap+i*sizeof(float), ftmp);
2383 kModalityImageDensityMap.push_back(ftmp);
2384 }
2385 delete [] pdmap;
2386 if(DEBUG || kVerbose > 0) {
2387 G4cout << "density map : " << std::ends;
2388 for(int i = 0; i < 10; i++)
2389 G4cout <<kModalityImageDensityMap[i] << ", ";
2390 G4cout << G4endl;
2391 for(int i = 0; i < 10; i++) G4cout << "..";
2392 G4cout << G4endl;
2393 for(size_t i =kModalityImageDensityMap.size() - 10; i <kModalityImageDensityMap.size(); i++)
2394 G4cout <<kModalityImageDensityMap[i] << ", ";
2395 G4cout << G4endl;
2396 }
2397
2398 }
2399
2400
2401 //----- dose distribution image -----//
2402 for(int ndose = 0; ndose < nDoseDist; ndose++) {
2403
2404 newDoseDist();
2405
2406 // dose distrbution image size
2407 ifile.read((char *)ctmp, 3*sizeof(int));
2408 convertEndian(ctmp, size[0]);
2409 convertEndian(ctmp+sizeof(int), size[1]);
2410 convertEndian(ctmp+2*sizeof(int), size[2]);
2411 if(DEBUG || kVerbose > 0) {
2412 G4cout << "Dose dist. image size : ("
2413 << size[0] << ", "
2414 << size[1] << ", "
2415 << size[2] << ")"
2416 << G4endl;
2417 }
2418 kDose[ndose].setSize(size);
2419
2420 // dose distribution max. & min.
2421 ifile.read((char *)ctmp, sizeof(short)*2);
2422 convertEndian(ctmp, minmax[0]);
2423 convertEndian(ctmp+2, minmax[1]);
2424
2425 // dose distribution unit
2426 char dunit[13];
2427 ifile.read((char *)dunit, 12);
2428 std::string sdunit = dunit;
2429 setDoseDistUnit(sdunit, ndose);
2430 if(DEBUG || kVerbose > 0) {
2431 G4cout << "Dose dist. unit : " << kDoseUnit << G4endl;
2432 }
2433
2434 // dose distribution scaling
2435 ifile.read((char *)ctmp, 4); // sizeof(float)
2436 convertEndian(ctmp, scale);
2437 kDose[ndose].setScale(dscale = scale);
2438
2439 double dminmax[2];
2440 for(int i = 0; i < 2; i++) dminmax[i] = minmax[i]*dscale;
2441 kDose[ndose].setMinMax(dminmax);
2442
2443 if(DEBUG || kVerbose > 0) {
2444 G4cout << "Dose dist. image min., max., scale : "
2445 << dminmax[0] << ", "
2446 << dminmax[1] << ", "
2447 << scale << G4endl;
2448 }
2449
2450 // dose distribution image
2451 int dsize = size[0]*size[1];
2452 if(DEBUG || kVerbose > 0) G4cout << "Dose dist. (" << dsize << "): ";
2453 char * di = new char[dsize*sizeof(short)];
2454 short * shimage = new short[dsize];
2455 for(int z = 0; z < size[2]; z++) {
2456 ifile.read((char *)di, dsize*sizeof(short));
2457 double * dimage = new double[dsize];
2458 for(int xy = 0; xy < dsize; xy++) {
2459 convertEndian(di+xy*sizeof(short), shimage[xy]);
2460 dimage[xy] = shimage[xy]*dscale;
2461 }
2462 kDose[ndose].addImage(dimage);
2463
2464 if(DEBUG || kVerbose > 0) G4cout << "[" << z << "]" << dimage[(size_t)(dsize*0.55)] << ", ";
2465
2466 if(DEBUG || kVerbose > 0) {
2467 for(int j = 0; j < dsize; j++) {
2468 if(dimage[j] < 0)
2469 G4cout << "[" << j << "," << z << "]"
2470 << dimage[j] << ", ";
2471 }
2472 }
2473 }
2474 delete [] shimage;
2475 delete [] di;
2476 if(DEBUG || kVerbose > 0) G4cout << G4endl;
2477
2478 ifile.read((char *)ctmp, 3*4); // 3*sizeof(int)
2479 convertEndian(ctmp, iCenter[0]);
2480 convertEndian(ctmp+4, iCenter[1]);
2481 convertEndian(ctmp+8, iCenter[2]);
2482 for(int i = 0; i < 3; i++) fCenter[i] = (float)iCenter[i];
2483 kDose[ndose].setCenterPosition(fCenter);
2484
2485 if(DEBUG || kVerbose > 0) {
2486 G4cout << "Dose dist. image relative location : ("
2487 << fCenter[0] << ", "
2488 << fCenter[1] << ", "
2489 << fCenter[2] << ")" << G4endl;
2490 }
2491
2492
2493 }
2494
2495 //----- ROI image -----//
2496 if(kPointerToROIData != 0) {
2497
2498 newROI();
2499
2500 // ROI image size
2501 ifile.read((char *)ctmp, 3*sizeof(int));
2502 convertEndian(ctmp, size[0]);
2503 convertEndian(ctmp+sizeof(int), size[1]);
2504 convertEndian(ctmp+2*sizeof(int), size[2]);
2505 kRoi[0].setSize(size);
2506 if(DEBUG || kVerbose > 0) {
2507 G4cout << "ROI image size : ("
2508 << size[0] << ", "
2509 << size[1] << ", "
2510 << size[2] << ")"
2511 << G4endl;
2512 }
2513
2514 // ROI max. & min.
2515 ifile.read((char *)ctmp, sizeof(short)*2);
2516 convertEndian(ctmp, minmax[0]);
2517 convertEndian(ctmp+sizeof(short), minmax[1]);
2518 kRoi[0].setMinMax(minmax);
2519
2520 // ROI distribution scaling
2521 ifile.read((char *)ctmp, sizeof(float));
2522 convertEndian(ctmp, scale);
2523 kRoi[0].setScale(dscale = scale);
2524 if(DEBUG || kVerbose > 0) {
2525 G4cout << "ROI image min., max., scale : "
2526 << minmax[0] << ", "
2527 << minmax[1] << ", "
2528 << scale << G4endl;
2529 }
2530
2531 // ROI image
2532 int rsize = size[0]*size[1];
2533 char * ri = new char[rsize*sizeof(short)];
2534 for(int i = 0; i < size[2]; i++) {
2535 ifile.read((char *)ri, rsize*sizeof(short));
2536 short * rimage = new short[rsize];
2537 for(int j = 0; j < rsize; j++) {
2538 convertEndian(ri+j*sizeof(short), rimage[j]);
2539 }
2540 kRoi[0].addImage(rimage);
2541
2542 }
2543 delete [] ri;
2544
2545 // ROI relative location
2546 ifile.read((char *)ctmp, 3*sizeof(int));
2547 convertEndian(ctmp, iCenter[0]);
2548 convertEndian(ctmp+sizeof(int), iCenter[1]);
2549 convertEndian(ctmp+2*sizeof(int), iCenter[2]);
2550 for(int i = 0; i < 3; i++) fCenter[i] = iCenter[i];
2551 kRoi[0].setCenterPosition(fCenter);
2552 if(DEBUG || kVerbose > 0) {
2553 G4cout << "ROI image relative location : ("
2554 << fCenter[0] << ", "
2555 << fCenter[1] << ", "
2556 << fCenter[2] << ")" << G4endl;
2557 }
2558
2559 }
2560
2561 //----- track information -----//
2562 if(kPointerToTrackData != 0) {
2563
2564 // track
2565 ifile.read((char *)ctmp, sizeof(int));
2566 int ntrk;
2567 convertEndian(ctmp, ntrk);
2568 if(DEBUG || kVerbose > 0) {
2569 G4cout << "# of tracks: " << ntrk << G4endl;
2570 }
2571
2572 // v4
2573 std::vector<float *> trkv4;
2574
2575 // track position
2576 for(int i = 0; i < ntrk; i++) {
2577 float * tp = new float[6];
2578
2579 ifile.read((char *)ctmp, sizeof(float)*3);
2580 if(DEBUG || kVerbose > 0) if(i < 10) G4cout << i << ": " ;
2581 for(int j = 0; j < 3; j++) {
2582 convertEndian(ctmp+j*sizeof(float), tp[j]);
2583 if(DEBUG || kVerbose > 0) if(i < 10) G4cout << tp[j] << ", ";
2584 }
2585
2586 ifile.read((char *)ctmp, sizeof(float)*3);
2587 for(int j = 0; j < 3; j++) {
2588 convertEndian(ctmp+j*sizeof(float), tp[j+3]);
2589 if(DEBUG || kVerbose > 0) if(i < 10) G4cout << tp[j+3] << ", ";
2590 }
2591 addTrack(tp);
2592 if(DEBUG || kVerbose > 0) if(i < 10) G4cout << G4endl;
2593
2594 // v4
2595 trkv4.push_back(tp);
2596 }
2597
2598 //v4
2599 unsigned char trkcolorv4[3];
2600
2601 // track color
2602 for(int i = 0; i < ntrk; i++) {
2603 unsigned char * rgb = new unsigned char[3];
2604 ifile.read((char *)rgb, 3);
2605 addTrackColor(rgb);
2606
2607 // v4
2608 for(int j = 0; j < 3; j++) trkcolorv4[j] = rgb[j];
2609 std::vector<float *> trk;
2610 trk.push_back(trkv4[i]);
2611 addTrack(trk, trkcolorv4);
2612
2613 }
2614
2615 }
2616
2617 ifile.close();
2618
2619 return true;
2620}
2621bool G4GMocrenIO::retrieveData3(char * _filename) {
2622 kFileName = _filename;
2623 return retrieveData();
2624}
2625
2626//
2628
2629 bool DEBUG = false;//
2630
2631 // input file open
2632 std::ifstream ifile(kFileName.c_str(), std::ios_base::in|std::ios_base::binary);
2633 if(!ifile) {
2635 G4cout << "Cannot open file: " << kFileName
2636 << " in G4GMocrenIO::retrieveData2()." << G4endl;
2637 return false;
2638 }
2639
2640 // data buffer
2641 char ctmp[12];
2642
2643 // file identifier
2644 char verid[9];
2645 ifile.read((char *)verid, 8);
2646
2647 // file version
2648 unsigned char ver;
2649 ifile.read((char *)&ver, 1);
2650 std::stringstream ss;
2651 ss << (int)ver;
2652 kVersion = ss.str();
2653 if(DEBUG || kVerbose > 0) G4cout << "File version : " << kVersion << G4endl;
2654
2655 // id of version 1
2656 char idtmp[IDLENGTH];
2657 ifile.read((char *)idtmp, IDLENGTH);
2658 kId = idtmp;
2659 // version of version 1
2660 char vertmp[VERLENGTH];
2661 ifile.read((char *)vertmp, VERLENGTH);
2662
2663 // endian
2664 ifile.read((char *)&kLittleEndianInput, sizeof(char));
2665 if(DEBUG || kVerbose > 0) {
2666 G4cout << "Endian : ";
2667 if(kLittleEndianInput == 1)
2668 G4cout << " little" << G4endl;
2669 else {
2670 G4cout << " big" << G4endl;
2671 }
2672 }
2673
2674 // voxel spacings for all images
2675 ifile.read((char *)ctmp, 12);
2676 convertEndian(ctmp, kVoxelSpacing[0]);
2677 convertEndian(ctmp+4, kVoxelSpacing[1]);
2678 convertEndian(ctmp+8, kVoxelSpacing[2]);
2679 if(DEBUG || kVerbose > 0) {
2680 G4cout << "Voxel spacing : ("
2681 << kVoxelSpacing[0] << ", "
2682 << kVoxelSpacing[1] << ", "
2683 << kVoxelSpacing[2]
2684 << ") mm " << G4endl;
2685 }
2686
2687
2688 // offset from file starting point to the modality image data
2689 ifile.read((char *)ctmp, 4);
2691
2692 // offset from file starting point to the dose image data
2693 unsigned int ptddd;
2694 ifile.read((char *)ctmp, 4);
2695 convertEndian(ctmp, ptddd);
2696 kPointerToDoseDistData.push_back(ptddd);
2697
2698 // offset from file starting point to the ROI image data
2699 ifile.read((char *)ctmp, 4);
2701
2702 // offset from file starting point to the track data
2703 ifile.read((char *)ctmp, 4);
2705 if(DEBUG || kVerbose > 0) {
2706 G4cout << "Each pointer to data : "
2707 << kPointerToModalityData << ", "
2708 << kPointerToDoseDistData[0] << ", "
2709 << kPointerToROIData << ", "
2711 }
2712
2713 if(kPointerToModalityData == 0 && kPointerToDoseDistData.size() == 0 &&
2715 if(DEBUG || kVerbose > 0) {
2716 G4cout << "No data." << G4endl;
2717 }
2718 return false;
2719 }
2720
2721 // event number
2722 /* ver 1
2723 ifile.read(ctmp, sizeof(int));
2724 convertEndian(ctmp, numberOfEvents);
2725 */
2726
2727 int size[3];
2728 float scale;
2729 double dscale;
2730 short minmax[2];
2731 float fCenter[3];
2732 int iCenter[3];
2733
2734 //----- Modality image -----//
2735 // modality image size
2736 ifile.read(ctmp, 3*sizeof(int));
2737 convertEndian(ctmp, size[0]);
2738 convertEndian(ctmp+sizeof(int), size[1]);
2739 convertEndian(ctmp+2*sizeof(int), size[2]);
2740 if(DEBUG || kVerbose > 0) {
2741 G4cout << "Modality image size : ("
2742 << size[0] << ", "
2743 << size[1] << ", "
2744 << size[2] << ")"
2745 << G4endl;
2746 }
2747 kModality.setSize(size);
2748
2749 // modality image voxel spacing
2750 /*
2751 ifile.read(ctmp, 3*sizeof(float));
2752 convertEndian(ctmp, modalityImageVoxelSpacing[0]);
2753 convertEndian(ctmp+sizeof(float), modalityImageVoxelSpacing[1]);
2754 convertEndian(ctmp+2*sizeof(float), modalityImageVoxelSpacing[2]);
2755 */
2756
2757 if(kPointerToModalityData != 0) {
2758
2759 // modality density max. & min.
2760 ifile.read((char *)ctmp, 4);
2761 convertEndian(ctmp, minmax[0]);
2762 convertEndian(ctmp+2, minmax[1]);
2763 kModality.setMinMax(minmax);
2764
2765 // modality density scale
2766 ifile.read((char *)ctmp, 4);
2767 convertEndian(ctmp, scale);
2768 kModality.setScale(dscale = scale);
2769 if(DEBUG || kVerbose > 0) {
2770 G4cout << "Modality image min., max., scale : "
2771 << minmax[0] << ", "
2772 << minmax[1] << ", "
2773 << scale << G4endl;
2774 }
2775
2776 // modality density
2777 int psize = size[0]*size[1];
2778 if(DEBUG || kVerbose > 0) G4cout << "Modality image (" << psize << "): ";
2779 char * cimage = new char[psize*sizeof(short)];
2780 for(int i = 0; i < size[2]; i++) {
2781 ifile.read((char *)cimage, psize*sizeof(short));
2782 short * mimage = new short[psize];
2783 for(int j = 0; j < psize; j++) {
2784 convertEndian(cimage+j*sizeof(short), mimage[j]);
2785 }
2786 kModality.addImage(mimage);
2787
2788 if(DEBUG || kVerbose > 0) G4cout << "[" << i << "]" << mimage[(size_t)(psize*0.55)] << ", ";
2789 }
2790 if(DEBUG || kVerbose > 0) G4cout << G4endl;
2791 delete [] cimage;
2792
2793 // modality desity map for CT value
2794 size_t msize = minmax[1]-minmax[0]+1;
2795 if(DEBUG || kVerbose > 0) G4cout << "msize: " << msize << G4endl;
2796 char * pdmap = new char[msize*sizeof(float)];
2797 ifile.read((char *)pdmap, msize*sizeof(float));
2798 float ftmp;
2799 for(int i = 0; i < (int)msize; i++) {
2800 convertEndian(pdmap+i*sizeof(float), ftmp);
2801 kModalityImageDensityMap.push_back(ftmp);
2802 }
2803 delete [] pdmap;
2804 if(DEBUG || kVerbose > 0) {
2805 G4cout << "density map : " << std::ends;
2806 for(int i = 0; i < 10; i++)
2807 G4cout <<kModalityImageDensityMap[i] << ", ";
2808 G4cout << G4endl;
2809 for(int i = 0; i < 10; i++) G4cout << "..";
2810 G4cout << G4endl;
2811 for(size_t i =kModalityImageDensityMap.size() - 10; i <kModalityImageDensityMap.size(); i++)
2812 G4cout <<kModalityImageDensityMap[i] << ", ";
2813 G4cout << G4endl;
2814 }
2815
2816 }
2817
2818
2819 //----- dose distribution image -----//
2820 if(kPointerToDoseDistData[0] != 0) {
2821
2822 newDoseDist();
2823
2824 // dose distrbution image size
2825 ifile.read((char *)ctmp, 3*sizeof(int));
2826 convertEndian(ctmp, size[0]);
2827 convertEndian(ctmp+sizeof(int), size[1]);
2828 convertEndian(ctmp+2*sizeof(int), size[2]);
2829 if(DEBUG || kVerbose > 0) {
2830 G4cout << "Dose dist. image size : ("
2831 << size[0] << ", "
2832 << size[1] << ", "
2833 << size[2] << ")"
2834 << G4endl;
2835 }
2836 kDose[0].setSize(size);
2837
2838 // dose distribution max. & min.
2839 ifile.read((char *)ctmp, sizeof(short)*2);
2840 convertEndian(ctmp, minmax[0]);
2841 convertEndian(ctmp+2, minmax[1]);
2842 // dose distribution scaling
2843 ifile.read((char *)ctmp, sizeof(float));
2844 convertEndian(ctmp, scale);
2845 kDose[0].setScale(dscale = scale);
2846
2847 double dminmax[2];
2848 for(int i = 0; i < 2; i++) dminmax[i] = minmax[i]*dscale;
2849 kDose[0].setMinMax(dminmax);
2850
2851 if(DEBUG || kVerbose > 0) {
2852 G4cout << "Dose dist. image min., max., scale : "
2853 << dminmax[0] << ", "
2854 << dminmax[1] << ", "
2855 << scale << G4endl;
2856 }
2857
2858 // dose distribution image
2859 int dsize = size[0]*size[1];
2860 if(DEBUG || kVerbose > 0) G4cout << "Dose dist. (" << dsize << "): ";
2861 char * di = new char[dsize*sizeof(short)];
2862 short * shimage = new short[dsize];
2863 for(int z = 0; z < size[2]; z++) {
2864 ifile.read((char *)di, dsize*sizeof(short));
2865 double * dimage = new double[dsize];
2866 for(int xy = 0; xy < dsize; xy++) {
2867 convertEndian(di+xy*sizeof(short), shimage[xy]);
2868 dimage[xy] = shimage[xy]*dscale;
2869 }
2870 kDose[0].addImage(dimage);
2871
2872 if(DEBUG || kVerbose > 0) G4cout << "[" << z << "]" << dimage[(size_t)(dsize*0.55)] << ", ";
2873
2874 if(DEBUG || kVerbose > 0) {
2875 for(int j = 0; j < dsize; j++) {
2876 if(dimage[j] < 0)
2877 G4cout << "[" << j << "," << z << "]"
2878 << dimage[j] << ", ";
2879 }
2880 }
2881 }
2882 delete [] shimage;
2883 delete [] di;
2884 if(DEBUG || kVerbose > 0) G4cout << G4endl;
2885
2886 /* ver 1
2887 float doseDist;
2888 int dosePid;
2889 double * doseData = new double[numDoseImageVoxels];
2890 for(int i = 0; i < numDose; i++) {
2891 ifile.read(ctmp, sizeof(int));
2892 convertEndian(ctmp, dosePid);
2893 for(int j = 0; j < numDoseImageVoxels; j++) {
2894 ifile.read(ctmp, sizeof(float));
2895 convertEndian(ctmp, doseDist);
2896 doseData[j] = doseDist;
2897 }
2898 setDose(dosePid, doseData);
2899 }
2900 delete [] doseData;
2901 if(totalDose == NULL) totalDose = new double[numDoseImageVoxels];
2902 for(int i = 0; i < numDoseImageVoxels; i++) {
2903 ifile.read(ctmp, sizeof(float));
2904 convertEndian(ctmp, doseDist);
2905 totalDose[i] = doseDist;
2906 }
2907 */
2908
2909 /* ver 1
2910 // relative location between the two images
2911 ifile.read(ctmp, 3*sizeof(float));
2912 convertEndian(ctmp, relativeLocation[0]);
2913 convertEndian(ctmp+sizeof(float), relativeLocation[1]);
2914 convertEndian(ctmp+2*sizeof(float), relativeLocation[2]);
2915 */
2916
2917 // relative location of the dose distribution image for
2918 // the modality image
2919 //ofile.write((char *)relativeLocation, 3*sizeof(float));
2920 ifile.read((char *)ctmp, 3*sizeof(int));
2921 convertEndian(ctmp, iCenter[0]);
2922 convertEndian(ctmp+sizeof(int), iCenter[1]);
2923 convertEndian(ctmp+2*sizeof(int), iCenter[2]);
2924 for(int i = 0; i < 3; i++) fCenter[i] = (float)iCenter[i];
2925 kDose[0].setCenterPosition(fCenter);
2926
2927 if(DEBUG || kVerbose > 0) {
2928 G4cout << "Dose dist. image relative location : ("
2929 << fCenter[0] << ", "
2930 << fCenter[1] << ", "
2931 << fCenter[2] << ")" << G4endl;
2932 }
2933
2934
2935 }
2936
2937 //----- ROI image -----//
2938 if(kPointerToROIData != 0) {
2939
2940 newROI();
2941
2942 // ROI image size
2943 ifile.read((char *)ctmp, 3*sizeof(int));
2944 convertEndian(ctmp, size[0]);
2945 convertEndian(ctmp+sizeof(int), size[1]);
2946 convertEndian(ctmp+2*sizeof(int), size[2]);
2947 kRoi[0].setSize(size);
2948 if(DEBUG || kVerbose > 0) {
2949 G4cout << "ROI image size : ("
2950 << size[0] << ", "
2951 << size[1] << ", "
2952 << size[2] << ")"
2953 << G4endl;
2954 }
2955
2956 // ROI max. & min.
2957 ifile.read((char *)ctmp, sizeof(short)*2);
2958 convertEndian(ctmp, minmax[0]);
2959 convertEndian(ctmp+sizeof(short), minmax[1]);
2960 kRoi[0].setMinMax(minmax);
2961
2962 // ROI distribution scaling
2963 ifile.read((char *)ctmp, sizeof(float));
2964 convertEndian(ctmp, scale);
2965 kRoi[0].setScale(dscale = scale);
2966 if(DEBUG || kVerbose > 0) {
2967 G4cout << "ROI image min., max., scale : "
2968 << minmax[0] << ", "
2969 << minmax[1] << ", "
2970 << scale << G4endl;
2971 }
2972
2973 // ROI image
2974 int rsize = size[0]*size[1];
2975 char * ri = new char[rsize*sizeof(short)];
2976 for(int i = 0; i < size[2]; i++) {
2977 ifile.read((char *)ri, rsize*sizeof(short));
2978 short * rimage = new short[rsize];
2979 for(int j = 0; j < rsize; j++) {
2980 convertEndian(ri+j*sizeof(short), rimage[j]);
2981 }
2982 kRoi[0].addImage(rimage);
2983
2984 }
2985 delete [] ri;
2986
2987 // ROI relative location
2988 ifile.read((char *)ctmp, 3*sizeof(int));
2989 convertEndian(ctmp, iCenter[0]);
2990 convertEndian(ctmp+sizeof(int), iCenter[1]);
2991 convertEndian(ctmp+2*sizeof(int), iCenter[2]);
2992 for(int i = 0; i < 3; i++) fCenter[i] = iCenter[i];
2993 kRoi[0].setCenterPosition(fCenter);
2994 if(DEBUG || kVerbose > 0) {
2995 G4cout << "ROI image relative location : ("
2996 << fCenter[0] << ", "
2997 << fCenter[1] << ", "
2998 << fCenter[2] << ")" << G4endl;
2999 }
3000
3001 }
3002
3003 //----- track information -----//
3004 if(kPointerToTrackData != 0) {
3005
3006 // track
3007 ifile.read((char *)ctmp, sizeof(int));
3008 int ntrk;
3009 convertEndian(ctmp, ntrk);
3010 if(DEBUG || kVerbose > 0) {
3011 G4cout << "# of tracks: " << ntrk << G4endl;
3012 }
3013
3014 //v4
3015 unsigned char trkcolorv4[3] = {255, 0, 0};
3016
3017 for(int i = 0; i < ntrk; i++) {
3018 float * tp = new float[6];
3019 // v4
3020 std::vector<float *> trkv4;
3021
3022 ifile.read((char *)ctmp, sizeof(float)*3);
3023 if(DEBUG || kVerbose > 0) if(i < 10) G4cout << i << ": " ;
3024 for(int j = 0; j < 3; j++) {
3025 convertEndian(ctmp+j*sizeof(float), tp[j]);
3026 if(DEBUG || kVerbose > 0) if(i < 10) G4cout << tp[j] << ", ";
3027 }
3028
3029 ifile.read((char *)ctmp, sizeof(float)*3);
3030 for(int j = 0; j < 3; j++) {
3031 convertEndian(ctmp+j*sizeof(float), tp[j+3]);
3032 if(DEBUG || kVerbose > 0) if(i < 10) G4cout << tp[j+3] << ", ";
3033 }
3034
3035 kSteps.push_back(tp);
3036 // v4
3037 trkv4.push_back(tp);
3038 addTrack(trkv4, trkcolorv4);
3039
3040 if(DEBUG || kVerbose > 0) if(i < 10) G4cout << G4endl;
3041 }
3042
3043 }
3044
3045 /* ver 1
3046 // track
3047 int ntracks;
3048 ifile.read(ctmp, sizeof(int));
3049 convertEndian(ctmp, ntracks);
3050 // track displacement
3051 ifile.read(ctmp, 3*sizeof(float));
3052 convertEndian(ctmp, trackDisplacement[0]);
3053 convertEndian(ctmp+sizeof(float), trackDisplacement[2]); // exchanged with [1]
3054 convertEndian(ctmp+2*sizeof(float), trackDisplacement[1]);
3055 //
3056 //for(int i = 0; i < ntracks && i < 100; i++) {
3057 for(int i = 0; i < ntracks; i++) {
3058 DicomDoseTrack trk;
3059 short trackid, parentid, pid;
3060 int npoints;
3061 ifile.read(ctmp, sizeof(short));
3062 convertEndian(ctmp, trackid);
3063 trk.setID(trackid);
3064 ifile.read(ctmp, sizeof(short));
3065 convertEndian(ctmp, parentid);
3066 trk.setParentID(parentid);
3067 ifile.read(ctmp, sizeof(short));
3068 convertEndian(ctmp, pid);
3069 trk.setPID(pid);
3070 ifile.read(ctmp, sizeof(int));
3071 convertEndian(ctmp, npoints);
3072 for(int i = 0; i < npoints; i++) {
3073 ifile.read(ctmp, 3*sizeof(float));
3074 // storing only start and end points
3075 //if(i == 0 || i == npoints - 1) {
3076 float * point = new float[3];
3077 convertEndian(ctmp, point[0]);
3078 convertEndian(ctmp+sizeof(float), point[1]);
3079 convertEndian(ctmp+2*sizeof(float), point[2]);
3080 trk.addPoint(point);
3081 //}
3082 }
3083 track.push_back(trk);
3084 }
3085 */
3086
3087 ifile.close();
3088
3089 return true;
3090}
3091
3092bool G4GMocrenIO::retrieveData2(char * _filename) {
3093 kFileName = _filename;
3094 return retrieveData();
3095}
3096
3098 time_t t;
3099 time(&t);
3100
3101 tm * ti;
3102 ti = localtime(&t);
3103
3104 char cmonth[12][4] = {"Jan", "Feb", "Mar", "Apr",
3105 "May", "Jun", "Jul", "Aug",
3106 "Sep", "Oct", "Nov", "Dec"};
3107 std::stringstream ss;
3108 ss << std::setfill('0')
3109 << std::setw(2)
3110 << ti->tm_hour << ":"
3111 << std::setw(2)
3112 << ti->tm_min << ":"
3113 << std::setw(2)
3114 << ti->tm_sec << ","
3115 << cmonth[ti->tm_mon] << "."
3116 << std::setw(2)
3117 << ti->tm_mday << ","
3118 << ti->tm_year+1900;
3119
3120 kId = ss.str();
3121}
3122
3123// get & set the file version
3124std::string & G4GMocrenIO::getVersion() {return kVersion;}
3125void G4GMocrenIO::setVersion(std::string & _version) {kVersion = _version;}
3126
3127// set endians of input/output data
3130
3131// voxel spacing
3132void G4GMocrenIO::setVoxelSpacing(float _spacing[3]) {
3133 for(int i = 0; i < 3; i++) kVoxelSpacing[i] = _spacing[i];
3134}
3135void G4GMocrenIO::getVoxelSpacing(float _spacing[3]) {
3136 for(int i = 0; i < 3; i++) _spacing[i] = kVoxelSpacing[i];
3137}
3138
3139// get & set number of events
3141 return kNumberOfEvents;
3142}
3143void G4GMocrenIO::setNumberOfEvents(int & _numberOfEvents) {
3144 kNumberOfEvents = _numberOfEvents;
3145}
3148}
3149
3150// set/get pointer the modality image data
3151void G4GMocrenIO::setPointerToModalityData(unsigned int & _pointer) {
3152 kPointerToModalityData = _pointer;
3153}
3156}
3157// set/get pointer the dose distribution image data
3158void G4GMocrenIO::addPointerToDoseDistData(unsigned int & _pointer) {
3159 kPointerToDoseDistData.push_back(_pointer);
3160}
3162 if(kPointerToDoseDistData.size() == 0 ||
3163 kPointerToDoseDistData.size() < (size_t)_elem)
3164 return 0;
3165 else
3166 return kPointerToDoseDistData[_elem];
3167}
3168
3169// set/get pointer the ROI image data
3170void G4GMocrenIO::setPointerToROIData(unsigned int & _pointer) {
3171 kPointerToROIData = _pointer;
3172}
3174 return kPointerToROIData;
3175}
3176// set/get pointer the track data
3177void G4GMocrenIO::setPointerToTrackData(unsigned int & _pointer) {
3178 kPointerToTrackData = _pointer;
3179}
3181 return kPointerToTrackData;
3182}
3183
3184// calculate pointers for version 4
3185void G4GMocrenIO::calcPointers4() {
3186
3187 // pointer to modality data
3188 unsigned int pointer = 1070; // up to "pointer to the detector data" except for "pointer to the dose dist data"
3189 int nDoseDist = getNumDoseDist();
3190 pointer += nDoseDist*4;
3191
3192 setPointerToModalityData(pointer);
3193
3194 // pointer to dose data
3195 // ct-density map for modality data
3196 int msize[3];
3197 getModalityImageSize(msize);
3198 short mminmax[2];
3199 getModalityImageMinMax(mminmax);
3200 int pmsize = 2*msize[0]*msize[1]*msize[2];
3201 int pmmap = 4*(mminmax[1] - mminmax[0] + 1);
3202 pointer += 32 + pmsize + pmmap;
3203 //
3204 kPointerToDoseDistData.clear();
3205 if(nDoseDist == 0) {
3206 unsigned int pointer0 = 0;
3207 addPointerToDoseDistData(pointer0);
3208 }
3209 for(int ndose = 0; ndose < nDoseDist; ndose++) {
3210 addPointerToDoseDistData(pointer);
3211 int dsize[3];
3212 getDoseDistSize(dsize);
3213 pointer += 44 + dsize[0]*dsize[1]*dsize[2]*2 + 80;
3214 }
3215
3216 // pointer to roi data
3217 if(!isROIEmpty()) {
3218 setPointerToROIData(pointer);
3219
3220 int rsize[3];
3221 getROISize(rsize);
3222 int prsize = 2*rsize[0]*rsize[1]*rsize[2];
3223 pointer += 20 + prsize + 12;
3224 } else {
3225 unsigned int pointer0 = 0;
3226 setPointerToROIData(pointer0);
3227 }
3228
3229 // pointer to track data
3230 int ntrk = kTracks.size();
3231 if(ntrk != 0) {
3232 setPointerToTrackData(pointer);
3233
3234 pointer += 4; // # of tracks
3235 for(int nt = 0; nt < ntrk; nt++) {
3236 int nsteps = kTracks[nt].getNumberOfSteps();
3237 pointer += 4 + 3 + nsteps*(4*6); // # of steps + color + steps(float*6)
3238 }
3239 } else {
3240 unsigned int pointer0 = 0;
3241 setPointerToTrackData(pointer0);
3242 }
3243 if(kVerbose > 0) G4cout << " pointer to the track data :"
3245
3246 // pointer to detector data
3247 int ndet = kDetectors.size();
3248 if(ndet != 0) {
3249 kPointerToDetectorData = pointer;
3250 } else {
3252 }
3253 if(kVerbose > 0) G4cout << " pointer to the detector data :"
3255
3256}
3257
3258// calculate pointers for ver.3
3259void G4GMocrenIO::calcPointers3() {
3260
3261 // pointer to modality data
3262 unsigned int pointer = 1066; // up to "pointer to the track data" except for "pointer to the dose dist data"
3263 int nDoseDist = getNumDoseDist();
3264 pointer += nDoseDist*4;
3265
3266 setPointerToModalityData(pointer);
3267
3268 // pointer to dose data
3269 // ct-density map for modality data
3270 int msize[3];
3271 getModalityImageSize(msize);
3272 short mminmax[2];
3273 getModalityImageMinMax(mminmax);
3274 int pmsize = 2*msize[0]*msize[1]*msize[2];
3275 int pmmap = 4*(mminmax[1] - mminmax[0] + 1);
3276 pointer += 32 + pmsize + pmmap;
3277 //
3278 kPointerToDoseDistData.clear();
3279 if(nDoseDist == 0) {
3280 unsigned int pointer0 = 0;
3281 addPointerToDoseDistData(pointer0);
3282 }
3283 for(int ndose = 0; ndose < nDoseDist; ndose++) {
3284 addPointerToDoseDistData(pointer);
3285 int dsize[3];
3286 getDoseDistSize(dsize);
3287 pointer += 44 + dsize[0]*dsize[1]*dsize[2]*2;
3288 }
3289
3290 // pointer to roi data
3291 if(!isROIEmpty()) {
3292 setPointerToROIData(pointer);
3293
3294 int rsize[3];
3295 getROISize(rsize);
3296 int prsize = 2*rsize[0]*rsize[1]*rsize[2];
3297 pointer += 20 + prsize + 12;
3298 } else {
3299 unsigned int pointer0 = 0;
3300 setPointerToROIData(pointer0);
3301 }
3302
3303 //
3304 if(getNumTracks() != 0)
3305 setPointerToTrackData(pointer);
3306 else {
3307 unsigned int pointer0 = 0;
3308 setPointerToTrackData(pointer0);
3309 }
3310
3311}
3312
3313// calculate pointers for ver.2
3314void G4GMocrenIO::calcPointers2() {
3315
3316 // pointer to modality data
3317 unsigned int pointer = 65;
3318 setPointerToModalityData(pointer);
3319
3320 // pointer to dose data
3321 int msize[3];
3322 getModalityImageSize(msize);
3323 short mminmax[2];
3324 getModalityImageMinMax(mminmax);
3325 int pmsize = 2*msize[0]*msize[1]*msize[2];
3326 int pmmap = 4*(mminmax[1] - mminmax[0] + 1);
3327 pointer += 20 + pmsize + pmmap;
3328 int dsize[3];
3329 getDoseDistSize(dsize);
3330 kPointerToDoseDistData.clear();
3331 if(dsize[0] != 0) {
3332 kPointerToDoseDistData.push_back(pointer);
3333
3334 int pdsize = 2*dsize[0]*dsize[1]*dsize[2];
3335 pointer += 20 + pdsize + 12;
3336 } else {
3337 unsigned int pointer0 = 0;
3338 kPointerToDoseDistData.push_back(pointer0);
3339 }
3340
3341 // pointer to roi data
3342 if(!isROIEmpty()) {
3343 int rsize[3];
3344 getROISize(rsize);
3345 setPointerToROIData(pointer);
3346 int prsize = 2*rsize[0]*rsize[1]*rsize[2];
3347 pointer += 20 + prsize + 12;
3348
3349 } else {
3350 unsigned int pointer0 = 0;
3351 setPointerToROIData(pointer0);
3352 }
3353
3354 //
3355 if(getNumTracks() != 0)
3356 setPointerToTrackData(pointer);
3357 else {
3358 unsigned int pointer0 = 0;
3359 setPointerToTrackData(pointer0);
3360 }
3361
3362}
3363
3364
3365//----- Modality image -----//
3367
3368 kModality.getSize(_size);
3369}
3371
3372 kModality.setSize(_size);
3373}
3374
3375// get & set the modality image size
3377
3378 kModality.setScale(_scale);
3379}
3381
3382 return kModality.getScale();
3383}
3384
3385// set the modality image in CT
3386void G4GMocrenIO::setModalityImage(short * _image) {
3387
3388 kModality.addImage(_image);
3389}
3391
3392 return kModality.getImage(_z);
3393}
3395
3397}
3398// set/get the modality image density map
3399void G4GMocrenIO::setModalityImageDensityMap(std::vector<float> & _map) {
3401}
3404}
3405// set the modality image min./max.
3407
3408 kModality.setMinMax(_minmax);
3409}
3410// get the modality image min./max.
3412
3413 short minmax[2];
3414 kModality.getMinMax(minmax);
3415 for(int i = 0; i < 2; i++) _minmax[i] = minmax[i];
3416}
3418
3419 short minmax[2];
3420 kModality.getMinMax(minmax);
3421 return minmax[1];
3422}
3424
3425 short minmax[2];
3426 kModality.getMinMax(minmax);
3427 return minmax[0];
3428}
3429// set/get position of the modality image center
3431
3433}
3435
3436 if(isROIEmpty())
3437 for(int i = 0; i < 3; i++) _center[i] = 0;
3438 else
3440}
3441// get & set the modality image unit
3443 return kModalityUnit;
3444}
3445void G4GMocrenIO::setModalityImageUnit(std::string & _unit) {
3446 kModalityUnit = _unit;
3447}
3448//
3450 short rval = -1024; // default: air
3451 int nmap = (int)kModalityImageDensityMap.size();
3452 if(nmap != 0) {
3453 short minmax[2];
3454 kModality.getMinMax(minmax);
3455 rval = minmax[1];
3456 for(int i = 0; i < nmap; i++) {
3457 //G4cout << kModalityImageDensityMap[i] << G4endl;
3458 if(_dens <= kModalityImageDensityMap[i]) {
3459 rval = i + minmax[0];
3460 break;
3461 }
3462 }
3463 }
3464 return rval;
3465}
3466
3467
3468//----- Dose distribution -----//
3469//
3472 kDose.push_back(doseData);
3473}
3475 return (int)kDose.size();
3476}
3477
3478// get & set the dose distribution unit
3479std::string G4GMocrenIO::getDoseDistUnit(int _num) {
3480 // to avoid a warning in the compile process
3481 if(kDoseUnit.size() > static_cast<size_t>(_num)) return kDoseUnit;
3482
3483 return kDoseUnit;
3484}
3485void G4GMocrenIO::setDoseDistUnit(std::string & _unit, int _num) {
3486 // to avoid a warning in the compile process
3487 if(_unit.size() > static_cast<size_t>(_num)) kDoseUnit = _unit;
3488
3489 //char unit[13];
3490 //std::strncpy(unit, _unit.c_str(), 12);
3491 //doseUnit = unit;
3492 kDoseUnit = _unit;
3493}
3494//
3495void G4GMocrenIO::getDoseDistSize(int _size[3], int _num) {
3496 if(isDoseEmpty())
3497 for(int i = 0; i < 3; i++) _size[i] = 0;
3498 else
3499 kDose[_num].getSize(_size);
3500}
3501void G4GMocrenIO::setDoseDistSize(int _size[3], int _num) {
3502
3503 kDose[_num].setSize(_size);
3504
3505 //resetDose();
3506}
3507
3508void G4GMocrenIO::setDoseDistMinMax(short _minmax[2], int _num) {
3509
3510 double minmax[2];
3511 double scale = kDose[_num].getScale();
3512 for(int i = 0; i < 2; i++) minmax[i] = (double)_minmax[i]*scale;
3513 kDose[_num].setMinMax(minmax);
3514}
3515void G4GMocrenIO::getDoseDistMinMax(short _minmax[2], int _num) {
3516
3517 if(isDoseEmpty())
3518 for(int i = 0; i < 2; i++) _minmax[i] = 0;
3519 else {
3520 double minmax[2];
3521 kDose[_num].getMinMax(minmax);
3522 double scale = kDose[_num].getScale();
3523 for(int i = 0; i < 2; i++) _minmax[i] = (short)(minmax[i]/scale+0.5);
3524 }
3525}
3526void G4GMocrenIO::setDoseDistMinMax(double _minmax[2], int _num) {
3527
3528 kDose[_num].setMinMax(_minmax);
3529}
3530void G4GMocrenIO::getDoseDistMinMax(double _minmax[2], int _num) {
3531
3532 if(isDoseEmpty())
3533 for(int i = 0; i < 2; i++) _minmax[i] = 0.;
3534 else
3535 kDose[_num].getMinMax(_minmax);
3536}
3537
3538// get & set the dose distribution image scale
3539void G4GMocrenIO::setDoseDistScale(double & _scale, int _num) {
3540
3541 kDose[_num].setScale(_scale);
3542}
3544
3545 if(isDoseEmpty())
3546 return 0.;
3547 else
3548 return kDose[_num].getScale();
3549}
3550
3551/*
3552 void G4GMocrenIO::initializeShortDoseDist() {
3553 ;
3554 }
3555 void G4GMocrenIO::finalizeShortDoseDist() {
3556 ;
3557 }
3558*/
3559// set the dose distribution image
3560void G4GMocrenIO::setShortDoseDist(short * _image, int _num) {
3561
3562 int size[3];
3563 kDose[_num].getSize(size);
3564 int dsize = size[0]*size[1];
3565 double * ddata = new double[dsize];
3566 double scale = kDose[_num].getScale();
3567 double minmax[2];
3568 kDose[_num].getMinMax(minmax);
3569 for(int xy = 0; xy < dsize; xy++) {
3570 ddata[xy] = _image[xy]*scale;
3571 if(ddata[xy] < minmax[0]) minmax[0] = ddata[xy];
3572 if(ddata[xy] > minmax[1]) minmax[1] = ddata[xy];
3573 }
3574 kDose[_num].addImage(ddata);
3575
3576 // set min./max.
3577 kDose[_num].setMinMax(minmax);
3578}
3579void G4GMocrenIO::getShortDoseDist(short * _data, int _z, int _num) {
3580
3581 if(_data == NULL) {
3583 G4cout << "In G4GMocrenIO::getShortDoseDist(), "
3584 << "first argument is NULL pointer. "
3585 << "The argument must be allocated array."
3586 << G4endl;
3587 std::exit(-1);
3588 }
3589
3590 int size[3];
3591 kDose[_num].getSize(size);
3592 //short * shdata = new short[size[0]*size[1]];
3593 double * ddata = kDose[_num].getImage(_z);
3594 double scale = kDose[_num].getScale();
3595 for(int xy = 0; xy < size[0]*size[1]; xy++) {
3596 _data[xy] = (short)(ddata[xy]/scale+0.5); //there is never negative value
3597 }
3598}
3599void G4GMocrenIO::getShortDoseDistMinMax(short _minmax[2], int _num) {
3600 double scale = kDose[_num].getScale();
3601 double minmax[2];
3602 kDose[_num].getMinMax(minmax);
3603 for(int i = 0; i < 2; i++)
3604 _minmax[i] = (short)(minmax[i]/scale+0.5);
3605}
3606//
3607void G4GMocrenIO::setDoseDist(double * _image, int _num) {
3608
3609 kDose[_num].addImage(_image);
3610}
3611double * G4GMocrenIO::getDoseDist(int _z, int _num) {
3612
3613 double * image;
3614 if(isDoseEmpty()) {
3615 image = 0;
3616 } else {
3617 image = kDose[_num].getImage(_z);
3618 }
3619 return image;
3620}
3621/*
3622 void G4GMocrenIO::getDoseDist(double * & _image, int _z, int _num) {
3623
3624 G4cout << " <" << (void*)_image << "> ";
3625 if(isDoseEmpty()) {
3626 _image = 0;
3627 } else {
3628 _image = kDose[_num].getImage(_z);
3629 G4cout << " <" << (void*)_image << "> ";
3630 G4cout << _image[100] << " ";
3631 }
3632 }
3633*/
3634bool G4GMocrenIO::addDoseDist(std::vector<double *> & _image, int _num) {
3635
3636 int size[3];
3637 getDoseDistSize(size, _num);
3638 std::vector<double *> dosedist = kDose[_num].getImage();
3639
3640 int nimg = size[0]*size[1];
3641 for(int z = 0; z < size[2]; z++) {
3642 for(int xy = 0; xy < nimg; xy++) {
3643 dosedist[z][xy] += _image[z][xy];
3644 }
3645 }
3646
3647 return true;
3648}
3649//void setDoseDistDensityMap(float * _map) {doseImageDensityMap = _map;};
3650// set the dose distribution image displacement
3651void G4GMocrenIO::setDoseDistCenterPosition(float _center[3], int _num) {
3652
3653 kDose[_num].setCenterPosition(_center);
3654}
3655void G4GMocrenIO::getDoseDistCenterPosition(float _center[3], int _num) {
3656
3657 if(isDoseEmpty())
3658 for(int i = 0; i < 3; i++) _center[i] = 0;
3659 else
3660 kDose[_num].getCenterPosition(_center);
3661}
3662// set & get name of dose distribution
3663void G4GMocrenIO::setDoseDistName(std::string _name, int _num) {
3664
3665 kDose[_num].setName(_name);
3666}
3667std::string G4GMocrenIO::getDoseDistName(int _num) {
3668
3669 std::string name;
3670 if(isDoseEmpty())
3671 return name;
3672 else
3673 return kDose[_num].getName();
3674}
3675// copy dose distributions
3677 std::vector<class GMocrenDataPrimitive<double> >::iterator itr;
3678 for(itr = kDose.begin(); itr != kDose.end(); itr++) {
3679 _dose.push_back(*itr);
3680 }
3681}
3682// merge two dose distributions
3684 if(kDose.size() != _dose.size()) {
3686 G4cout << "G4GMocrenIO::mergeDoseDist() : Error" << G4endl;
3687 G4cout << " Unable to merge the dose distributions,"<< G4endl;
3688 G4cout << " because of different size of dose maps."<< G4endl;
3689 }
3690 return false;
3691 }
3692
3693 int num = kDose.size();
3694 std::vector<class GMocrenDataPrimitive<double> >::iterator itr1 = kDose.begin();
3695 std::vector<class GMocrenDataPrimitive<double> >::iterator itr2 = _dose.begin();
3696 for(int i = 0; i < num; i++, itr1++, itr2++) {
3698 if(kVerbose > 0)
3699 G4cout << "merged dose distribution [" << i << "]" << G4endl;
3700 *itr1 += *itr2;
3701 }
3702
3703 return true;
3704}
3705//
3707
3708 if(!isDoseEmpty()) {
3709 for(int i = 0; i < getNumDoseDist(); i++) {
3710 kDose[i].clear();
3711 }
3712 kDose.clear();
3713 }
3714}
3715//
3717 if(kDose.empty()) {
3718 //if (G4VisManager::GetVerbosity() >= G4VisManager::errors)
3719 // G4cout << "!!! dose distribution data is empty." << G4endl;
3720 return true;
3721 } else {
3722 return false;
3723 }
3724}
3725
3726//
3728
3729 double scale;
3730 double minmax[2];
3731
3732 for(int i = 0; i < (int)kDose.size(); i++) {
3733 kDose[i].getMinMax(minmax);
3734 scale = minmax[1]/DOSERANGE;
3735 kDose[i].setScale(scale);
3736 }
3737}
3738
3739
3740//----- RoI -----//
3741
3742// add one RoI data
3745 kRoi.push_back(roiData);
3746}
3748 return (int)kRoi.size();
3749}
3750
3751// set/get the ROI image scale
3752void G4GMocrenIO::setROIScale(double & _scale, int _num) {
3753
3754 kRoi[_num].setScale(_scale);
3755}
3757
3758 if(isROIEmpty())
3759 return 0.;
3760 else
3761 return kRoi[_num].getScale();
3762}
3763// set the ROI image
3764void G4GMocrenIO::setROI(short * _image, int _num) {
3765
3766 kRoi[_num].addImage(_image);
3767}
3768short * G4GMocrenIO::getROI(int _z, int _num) {
3769
3770 if(isROIEmpty())
3771 return 0;
3772 else
3773 return kRoi[_num].getImage(_z);
3774}
3775// set/get the ROI image size
3776void G4GMocrenIO::setROISize(int _size[3], int _num) {
3777
3778 return kRoi[_num].setSize(_size);
3779}
3780void G4GMocrenIO::getROISize(int _size[3], int _num) {
3781
3782 if(isROIEmpty())
3783 for(int i = 0; i < 3; i++) _size[i] = 0;
3784 else
3785 return kRoi[_num].getSize(_size);
3786}
3787// set/get the ROI image min. and max.
3788void G4GMocrenIO::setROIMinMax(short _minmax[2], int _num) {
3789
3790 kRoi[_num].setMinMax(_minmax);
3791}
3792void G4GMocrenIO::getROIMinMax(short _minmax[2], int _num) {
3793
3794 if(isROIEmpty())
3795 for(int i = 0; i < 2; i++) _minmax[i] = 0;
3796 else
3797 kRoi[_num].getMinMax(_minmax);
3798}
3799// set/get the ROI image displacement
3800void G4GMocrenIO::setROICenterPosition(float _center[3], int _num) {
3801
3802 kRoi[_num].setCenterPosition(_center);
3803}
3804void G4GMocrenIO::getROICenterPosition(float _center[3], int _num) {
3805
3806 if(isROIEmpty())
3807 for(int i = 0; i < 3; i++) _center[i] = 0;
3808 else
3809 kRoi[_num].getCenterPosition(_center);
3810}
3811//
3813
3814 if(!isROIEmpty()) {
3815 for(int i = 0; i < getNumROI(); i++) {
3816 kRoi[i].clear();
3817 }
3818 kRoi.clear();
3819 }
3820}
3821//
3823 if(kRoi.empty()) {
3824 //if (G4VisManager::GetVerbosity() >= G4VisManager::errors)
3825 // G4cout << "!!! ROI data is empty." << G4endl;
3826 return true;
3827 } else {
3828 return false;
3829 }
3830}
3831
3832
3833
3834//----- Track information -----//
3835
3837 return (int)kSteps.size();
3838}
3840 return (int)kTracks.size();
3841}
3842void G4GMocrenIO::addTrack(float * _tracks) {
3843 kSteps.push_back(_tracks);
3844}
3845void G4GMocrenIO::setTracks(std::vector<float *> & _tracks) {
3846 kSteps = _tracks;
3847}
3848std::vector<float *> & G4GMocrenIO::getTracks() {
3849 return kSteps;
3850}
3851void G4GMocrenIO::addTrackColor(unsigned char * _colors) {
3852 kStepColors.push_back(_colors);
3853}
3854void G4GMocrenIO::setTrackColors(std::vector<unsigned char *> & _trackColors) {
3855 kStepColors = _trackColors;
3856}
3857std::vector<unsigned char *> & G4GMocrenIO::getTrackColors() {
3858 return kStepColors;
3859}
3860void G4GMocrenIO::copyTracks(std::vector<float *> & _tracks,
3861 std::vector<unsigned char *> & _colors) {
3862 std::vector<float *>::iterator titr;
3863 for(titr = kSteps.begin(); titr != kSteps.end(); titr++) {
3864 float * pts = new float[6];
3865 for(int i = 0; i < 6; i++) {
3866 pts[i] = (*titr)[i];
3867 }
3868 _tracks.push_back(pts);
3869 }
3870
3871 std::vector<unsigned char *>::iterator citr;
3872 for(citr = kStepColors.begin(); citr != kStepColors.end(); citr++) {
3873 unsigned char * pts = new unsigned char[3];
3874 for(int i = 0; i < 3; i++) {
3875 pts[i] = (*citr)[i];
3876 }
3877 _colors.push_back(pts);
3878 }
3879}
3880void G4GMocrenIO::mergeTracks(std::vector<float *> & _tracks,
3881 std::vector<unsigned char *> & _colors) {
3882 std::vector<float *>::iterator titr;
3883 for(titr = _tracks.begin(); titr != _tracks.end(); titr++) {
3884 addTrack(*titr);
3885 }
3886
3887 std::vector<unsigned char *>::iterator citr;
3888 for(citr = _colors.begin(); citr != _colors.end(); citr++) {
3889 addTrackColor(*citr);
3890 }
3891}
3892void G4GMocrenIO::addTrack(std::vector<float *> & _steps, unsigned char _color[3]) {
3893
3894 std::vector<float *>::iterator itr = _steps.begin();
3895 std::vector<struct GMocrenTrack::Step> steps;
3896 for(; itr != _steps.end(); itr++) {
3897 struct GMocrenTrack::Step step;
3898 for(int i = 0; i < 3; i++) {
3899 step.startPoint[i] = (*itr)[i];
3900 step.endPoint[i] = (*itr)[i+3];
3901 }
3902 steps.push_back(step);
3903 }
3904 GMocrenTrack track;
3905 track.setTrack(steps);
3906 track.setColor(_color);
3907 kTracks.push_back(track);
3908
3909}
3910void G4GMocrenIO::getTrack(int _num, std::vector<float *> & _steps,
3911 std::vector<unsigned char *> & _color) {
3912
3913 if(_num > (int)kTracks.size()) {
3915 G4cout << "ERROR in getTrack() : " << G4endl;
3916 std::exit(-1);
3917 }
3918 unsigned char * color = new unsigned char[3];
3919 kTracks[_num].getColor(color);
3920 _color.push_back(color);
3921
3922 // steps
3923 int nsteps = kTracks[_num].getNumberOfSteps();
3924 for(int isteps = 0; isteps < nsteps; isteps++) {
3925 float * stepPoints = new float[6];
3926 kTracks[_num].getStep(stepPoints[0], stepPoints[1], stepPoints[2],
3927 stepPoints[3], stepPoints[4], stepPoints[5],
3928 isteps);
3929 _steps.push_back(stepPoints);
3930 }
3931}
3932
3933void G4GMocrenIO::translateTracks(std::vector<float> & _translate) {
3934 std::vector<class GMocrenTrack>::iterator itr = kTracks.begin();
3935 for(; itr != kTracks.end(); itr++) {
3936 itr->translate(_translate);
3937 }
3938}
3939
3940
3941
3942
3943//----- Detector information -----//
3945 return (int)kDetectors.size();
3946}
3947void G4GMocrenIO::addDetector(std::string & _name,
3948 std::vector<float *> & _det,
3949 unsigned char _color[3]) {
3950
3951 std::vector<float *>::iterator itr = _det.begin();
3952 std::vector<struct GMocrenDetector::Edge> edges;
3953 for(; itr != _det.end(); itr++) {
3954 struct GMocrenDetector::Edge edge;
3955 for(int i = 0; i < 3; i++) {
3956 edge.startPoint[i] = (*itr)[i];
3957 edge.endPoint[i] = (*itr)[i+3];
3958 }
3959 edges.push_back(edge);
3960 }
3961 GMocrenDetector detector;
3962 detector.setDetector(edges);
3963 detector.setColor(_color);
3964 detector.setName(_name);
3965 kDetectors.push_back(detector);
3966
3967}
3968
3969void G4GMocrenIO::getDetector(int _num, std::vector<float *> & _edges,
3970 std::vector<unsigned char *> & _color,
3971 std::string & _detName) {
3972
3973 if(_num > (int)kDetectors.size()) {
3975 G4cout << "ERROR in getDetector() : " << G4endl;
3976 std::exit(-1);
3977 }
3978
3979 _detName = kDetectors[_num].getName();
3980
3981 unsigned char * color = new unsigned char[3];
3982 kDetectors[_num].getColor(color);
3983 _color.push_back(color);
3984
3985 // edges
3986 int nedges = kDetectors[_num].getNumberOfEdges();
3987 for(int ne = 0; ne < nedges; ne++) {
3988 float * edgePoints = new float[6];
3989 kDetectors[_num].getEdge(edgePoints[0], edgePoints[1], edgePoints[2],
3990 edgePoints[3], edgePoints[4], edgePoints[5],
3991 ne);
3992 _edges.push_back(edgePoints);
3993 }
3994}
3995
3996void G4GMocrenIO::translateDetector(std::vector<float> & _translate) {
3997 std::vector<class GMocrenDetector>::iterator itr = kDetectors.begin();
3998 for(; itr != kDetectors.end(); itr++) {
3999 itr->translate(_translate);
4000 }
4001}
4002
4003// endian conversion
4004template <typename T>
4005void G4GMocrenIO::convertEndian(char * _val, T & _rval) {
4006
4007 if((kLittleEndianOutput && !kLittleEndianInput) || // big endian
4008 (!kLittleEndianOutput && kLittleEndianInput)) { // little endian
4009
4010 const int SIZE = sizeof(_rval);
4011 char ctemp;
4012 for(int i = 0; i < SIZE/2; i++) {
4013 ctemp = _val[i];
4014 _val[i] = _val[SIZE - 1 - i];
4015 _val[SIZE - 1 - i] = ctemp;
4016 }
4017 }
4018 _rval = *(T *)_val;
4019}
4020
4021// inversion of byte order
4022template <typename T>
4023void G4GMocrenIO::invertByteOrder(char * _val, T & _rval) {
4024
4025 const int SIZE = sizeof(_rval);
4026 //char * cval = new char[SIZE];
4027 union {
4028 char cu[16];
4029 T tu;
4030 } uni;
4031 for(int i = 0; i < SIZE; i++) {
4032 uni.cu[i] = _val[SIZE-1-i];
4033 //cval[i] = _val[SIZE-i-1];
4034 }
4035 //_rval = *(T *)cval;
4036 _rval = uni.tu;
4037 //delete [] cval;
4038}
4039
4040//----- kVerbose information -----//
4042 kVerbose = _level;
4043}
4044
const int IDLENGTH
Definition: G4GMocrenIO.cc:397
const int VERLENGTH
Definition: G4GMocrenIO.cc:398
const int DOSERANGE
Definition: G4GMocrenIO.cc:56
#define DEBUG(x)
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
void setTracks(std::vector< float * > &_tracks)
void setLittleEndianInput(bool _little)
void setModalityImageSize(int _size[3])
void setDoseDistUnit(std::string &_unit, int _num=0)
short convertDensityToHU(float &_dens)
void copyDoseDist(std::vector< class GMocrenDataPrimitive< double > > &_dose)
unsigned int getPointerToTrackData()
void setDoseDistMinMax(short _minmax[2], int _num=0)
static int kVerbose
Definition: G4GMocrenIO.hh:225
void setDoseDistScale(double &_scale, int _num=0)
void getShortDoseDist(short *_data, int _z, int _num=0)
static char kLittleEndianOutput
Definition: G4GMocrenIO.hh:179
void clearModalityImage()
void setVerboseLevel(int _level)
void setROISize(int _size[3], int _num=0)
void setModalityImageDensityMap(std::vector< float > &_map)
int getNumDoseDist()
void translateDetector(std::vector< float > &_translate)
void setDoseDistCenterPosition(float _center[3], int _num=0)
void getROISize(int _size[3], int _num=0)
void setPointerToROIData(unsigned int &_pointer)
void getROICenterPosition(float _center[3], int _num=0)
static std::vector< unsigned int > kPointerToDoseDistData
Definition: G4GMocrenIO.hh:189
void setNumberOfEvents(int &_numberOfEvents)
bool storeData3()
bool retrieveData()
bool kTracksWillBeStored
Definition: G4GMocrenIO.hh:219
std::vector< float > & getModalityImageDensityMap()
std::string getDoseDistName(int _num=0)
static unsigned int kPointerToModalityData
Definition: G4GMocrenIO.hh:187
std::string getModalityImageUnit()
void setComment(std::string &_comment)
Definition: G4GMocrenIO.hh:275
void clearROIAll()
double getROIScale(int _num=0)
void setVoxelSpacing(float _spacing[3])
unsigned int getPointerToROIData()
void setDoseDistName(std::string _name, int _num=0)
static std::vector< float * > kSteps
Definition: G4GMocrenIO.hh:215
std::vector< unsigned char * > & getTrackColors()
static std::vector< float > kModalityImageDensityMap
Definition: G4GMocrenIO.hh:203
double getModalityImageScale()
bool isROIEmpty()
void getVoxelSpacing(float _spacing[3])
bool storeData2()
bool mergeDoseDist(std::vector< class GMocrenDataPrimitive< double > > &_dose)
void setModalityImage(short *_image)
unsigned int getPointerToModalityData()
void convertEndian(char *, Type &)
void setTrackColors(std::vector< unsigned char * > &_trackColors)
void setVersion(std::string &_version)
void getModalityImageMinMax(short _minmax[2])
void getModalityCenterPosition(float _center[3])
void setModalityCenterPosition(float _center[3])
double getDoseDistScale(int _num=0)
short getModalityImageMax()
std::vector< float * > & getTracks()
void setPointerToTrackData(unsigned int &_pointer)
void setDoseDistSize(int _size[3], int _num=0)
static int kNumberOfEvents
Definition: G4GMocrenIO.hh:184
int getNumTracks()
static std::vector< class GMocrenDataPrimitive< double > > kDose
Definition: G4GMocrenIO.hh:207
void getDoseDistMinMax(short _minmax[2], int _num=0)
void setModalityImageUnit(std::string &_unit)
void setModalityImageMinMax(short _minmax[2])
static unsigned int kPointerToROIData
Definition: G4GMocrenIO.hh:191
void setROIMinMax(short _minmax[2], int _num=0)
void getTrack(int _num, std::vector< float * > &_steps, std::vector< unsigned char * > &_color)
void setPointerToModalityData(unsigned int &_pointer)
bool addDoseDist(std::vector< double * > &_image, int _num=0)
unsigned int getPointerToDoseDistData(int _elem=0)
bool storeData4()
Definition: G4GMocrenIO.cc:461
void setShortDoseDist(short *_image, int _num=0)
bool storeData()
Definition: G4GMocrenIO.cc:453
static unsigned int kPointerToDetectorData
Definition: G4GMocrenIO.hh:195
void getDoseDistSize(int _size[3], int _num=0)
void addPointerToDoseDistData(unsigned int &_pointer)
static std::vector< class GMocrenDataPrimitive< short > > kRoi
Definition: G4GMocrenIO.hh:212
void newDoseDist()
bool retrieveData3()
int getNumTracks4()
static std::vector< class GMocrenTrack > kTracks
Definition: G4GMocrenIO.hh:218
static unsigned int kPointerToTrackData
Definition: G4GMocrenIO.hh:193
short * getModalityImage(int _z)
void clearDoseDistAll()
bool retrieveData4()
void mergeTracks(std::vector< float * > &_tracks, std::vector< unsigned char * > &_colors)
static std::string kVersion
Definition: G4GMocrenIO.hh:172
void setROICenterPosition(float _center[3], int _num=0)
int & getNumberOfEvents()
static float kVoxelSpacing[3]
Definition: G4GMocrenIO.hh:198
void initialize()
Definition: G4GMocrenIO.cc:412
void setLittleEndianOutput(bool _little)
std::string & getVersion()
static std::vector< unsigned char * > kStepColors
Definition: G4GMocrenIO.hh:216
static std::vector< class GMocrenDetector > kDetectors
Definition: G4GMocrenIO.hh:222
std::string getDoseDistUnit(int _num=0)
void calcDoseDistScale()
static char kLittleEndianInput
Definition: G4GMocrenIO.hh:178
void copyTracks(std::vector< float * > &_tracks, std::vector< unsigned char * > &_colors)
bool isDoseEmpty()
void addDetector(std::string &_name, std::vector< float * > &_det, unsigned char _color[3])
void getDoseDistCenterPosition(float _center[3], int _num=0)
void getROIMinMax(short _minmax[2], int _num=0)
short getModalityImageMin()
void getModalityImageSize(int _size[3])
int getNumberOfDetectors()
void addTrackColor(unsigned char *_colors)
void setROI(short *_image, int _num=0)
static std::string kDoseUnit
Definition: G4GMocrenIO.hh:209
static std::string kComment
Definition: G4GMocrenIO.hh:181
void setDoseDist(double *_image, int _num=0)
bool retrieveData2()
void translateTracks(std::vector< float > &_translateo)
void invertByteOrder(char *_val, T &_rval)
void addTrack(float *_tracks)
static std::string kModalityUnit
Definition: G4GMocrenIO.hh:204
void getDetector(int _num, std::vector< float * > &_edges, std::vector< unsigned char * > &_color, std::string &_detectorName)
short * getROI(int _z, int _num=0)
void setModalityImageScale(double &_scale)
static class GMocrenDataPrimitive< short > kModality
Definition: G4GMocrenIO.hh:201
void getShortDoseDistMinMax(short _minmax[2], int _num=0)
static std::string kId
Definition: G4GMocrenIO.hh:169
double * getDoseDist(int _z, int _num=0)
static std::string kFileName
Definition: G4GMocrenIO.hh:175
void addOneEvent()
void setROIScale(double &_scale, int _num=0)
static Verbosity GetVerbosity()
GMocrenDataPrimitive< T > & operator=(const GMocrenDataPrimitive< T > &_right)
Definition: G4GMocrenIO.cc:74
void setImage(std::vector< T * > &_image)
Definition: G4GMocrenIO.cc:212
std::string getName()
Definition: G4GMocrenIO.cc:241
std::vector< T * > & getImage()
Definition: G4GMocrenIO.cc:220
void setSize(int _size[3])
Definition: G4GMocrenIO.cc:187
void getMinMax(T _minmax[2])
Definition: G4GMocrenIO.cc:207
GMocrenDataPrimitive< T > & operator+=(const GMocrenDataPrimitive< T > &_right)
Definition: G4GMocrenIO.cc:134
void setMinMax(T _minmax[2])
Definition: G4GMocrenIO.cc:203
void getCenterPosition(float _center[3])
Definition: G4GMocrenIO.cc:233
void setName(std::string &_name)
Definition: G4GMocrenIO.cc:237
void setCenterPosition(float _center[3])
Definition: G4GMocrenIO.cc:229
GMocrenDataPrimitive< T > & operator+(const GMocrenDataPrimitive< T > &_right)
Definition: G4GMocrenIO.cc:92
void getSize(int _size[3])
Definition: G4GMocrenIO.cc:191
void setScale(double &_scale)
Definition: G4GMocrenIO.cc:195
std::vector< T * > kImage
Definition: G4GMocrenIO.hh:56
void addImage(T *_image)
Definition: G4GMocrenIO.cc:216
void setColor(unsigned char _color[3])
Definition: G4GMocrenIO.hh:150
unsigned char kColor[3]
Definition: G4GMocrenIO.hh:135
void setName(std::string &_name)
Definition: G4GMocrenIO.hh:156
void translate(std::vector< float > &_tranlate)
Definition: G4GMocrenIO.cc:333
void addEdge(float _startx, float _starty, float _startz, float _endx, float _endy, float _endz)
Definition: G4GMocrenIO.cc:305
void getEdge(float &_startx, float &_starty, float &_startz, float &_endx, float &_endy, float &_endz, int _num)
Definition: G4GMocrenIO.cc:316
std::vector< struct Edge > kDetector
Definition: G4GMocrenIO.hh:134
void setDetector(std::vector< struct Edge > &_aDetector)
Definition: G4GMocrenIO.hh:149
void getStep(float &_startx, float &_starty, float &_startz, float &_endx, float &_endy, float &_endz, int _num)
Definition: G4GMocrenIO.cc:265
void translate(std::vector< float > &_tranlate)
Definition: G4GMocrenIO.cc:282
void setColor(unsigned char _color[3])
Definition: G4GMocrenIO.hh:113
void setTrack(std::vector< struct Step > &_aTrack)
Definition: G4GMocrenIO.hh:112
void addStep(float _startx, float _starty, float _startz, float _endx, float _endy, float _endz)
Definition: G4GMocrenIO.cc:254
unsigned char kColor[3]
Definition: G4GMocrenIO.hh:99
std::vector< struct Step > kTrack
Definition: G4GMocrenIO.hh:98
std::ofstream ofile
Definition: clparse.cc:45
#define const
Definition: zconf.h:118