52 #define LITTLE_ENDIAN 1234 53 #define BYTE_ORDER LITTLE_ENDIAN 75 if (
this == &_right)
return *
this;
76 for(
int i = 0; i < 3; i++) {
77 kSize[i] = _right.
kSize[i];
81 for(
int i = 0; i < 2; i++) kMinmax[i] = _right.
kMinmax[i];
82 int num = kSize[0]*kSize[1];
84 for(
int z = 0;
z < kSize[2];
z++) {
86 for(
int i = 0; i < num; i++) img[i] =_right.
kImage[
z][i];
87 kImage.push_back(img);
97 for(
int i = 0; i < 3; i++) {
98 if(kSize[i] != _right.
kSize[i]) stat =
false;
99 if(kCenter[i] != _right.
kCenter[i]) stat =
false;
103 G4cout <<
"Warning: operator + " 104 <<
" Cannot do the operator +" 112 T mms[2] = {9e100,-9e100};
116 int num = kSize[0]*kSize[1];
117 for(
int z = 0;
z < kSize[2];
z++) {
118 T * img =
new T[num];
119 for(
int xy = 0; xy < num; xy++) {
120 img[xy] = kImage[
z][xy] + _right.
kImage[
z][xy];
121 if(mms[0] > img[xy]) mms[0] = img[xy];
122 if(mms[1] < img[xy]) mms[1] = img[xy];
138 for(
int i = 0; i < 3; i++) {
139 if(kSize[i] != _right.
kSize[i]) stat =
false;
140 if(kCenter[i] != _right.
kCenter[i]) stat =
false;
145 <<
" Cannot do the operator +=" 150 if(kMinmax[0] > _right.
kMinmax[0]) kMinmax[0] = _right.
kMinmax[0];
151 if(kMinmax[1] < _right.
kMinmax[1]) kMinmax[1] = _right.
kMinmax[1];
153 int num = kSize[0]*kSize[1];
154 for(
int z = 0;
z < kSize[2];
z++) {
155 for(
int xy = 0; xy < num; xy++) {
156 kImage[
z][xy] += _right.
kImage[
z][xy];
157 if(kMinmax[0] > kImage[
z][xy]) kMinmax[0] = kImage[
z][xy];
158 if(kMinmax[1] < kImage[
z][xy]) kMinmax[1] = kImage[
z][xy];
167 template <
typename T>
169 for(
int i = 0; i < 3; i++) {
174 kMinmax[0] = (T)32109;
175 kMinmax[1] = (T)-32109;
179 template <
typename T>
181 typename std::vector<T *>::iterator itr;
182 for(itr = kImage.begin(); itr != kImage.end(); itr++) {
187 template <
typename T>
189 for(
int i = 0; i < 3; i++) kSize[i] = _size[i];
191 template <
typename T>
193 for(
int i = 0; i < 3; i++) _size[i] = kSize[i];
195 template <
typename T>
199 template <
typename T>
203 template <
typename T>
205 for(
int i = 0; i < 2; i++) kMinmax[i] = _minmax[i];
207 template <
typename T>
209 for(
int i = 0; i < 2; i++) _minmax[i] = kMinmax[i];
212 template <
typename T>
216 template <
typename T>
218 kImage.push_back(_image);
220 template <
typename T>
224 template <
typename T>
226 if(_z >= (
int)kImage.size())
return 0;
229 template <
typename T>
231 for(
int i = 0; i < 3; i++) kCenter[i] = _center[i];
233 template <
typename T>
235 for(
int i = 0; i < 3; i++) _center[i] = kCenter[i];
237 template <
typename T>
241 template <
typename T>
252 for(
int i = 0; i < 3; i++)
kColor[i] = 0;
256 float _endx,
float _endy,
float _endz) {
267 float & _endx,
float & _endy,
float & _endz,
269 if(_num >= (
int)
kTrack.size()) {
271 G4cout <<
"GMocrenTrack::getStep(...) Error: " 272 <<
"invalid step # : " << _num <<
G4endl;
276 _startx =
kTrack[_num].startPoint[0];
277 _starty =
kTrack[_num].startPoint[1];
278 _startz =
kTrack[_num].startPoint[2];
279 _endx =
kTrack[_num].endPoint[0];
280 _endy =
kTrack[_num].endPoint[1];
281 _endz =
kTrack[_num].endPoint[2];
284 std::vector<struct Step>::iterator itr =
kTrack.begin();
285 for(; itr !=
kTrack.end(); itr++) {
286 for(
int i = 0; i < 3; i++ ) {
287 itr->startPoint[i] += _translate[i];
288 itr->endPoint[i] += _translate[i];
303 for(
int i = 0; i < 3; i++)
kColor[i] = 0;
307 float _endx,
float _endy,
float _endz) {
315 kDetector.push_back(edge);
318 float & _endx,
float & _endy,
float & _endz,
320 if(_num >= (
int)kDetector.size()) {
322 G4cout <<
"GMocrenDetector::getEdge(...) Error: " 323 <<
"invalid edge # : " << _num <<
G4endl;
327 _startx = kDetector[_num].startPoint[0];
328 _starty = kDetector[_num].startPoint[1];
329 _startz = kDetector[_num].startPoint[2];
330 _endx = kDetector[_num].endPoint[0];
331 _endy = kDetector[_num].endPoint[1];
332 _endz = kDetector[_num].endPoint[2];
335 std::vector<struct Edge>::iterator itr = kDetector.begin();
336 for(; itr != kDetector.end(); itr++) {
337 for(
int i = 0; i < 3; i++) {
338 itr->startPoint[i] += _translate[i];
339 itr->endPoint[i] += _translate[i];
358 #if BYTE_ORDER == LITTLE_ENDIAN 403 : kTracksWillBeStored(true) {
418 kLittleEndianInput =
true;
419 #if BYTE_ORDER == LITTLE_ENDIAN 420 kLittleEndianOutput =
true;
422 kLittleEndianOutput =
false;
425 kFileName =
"dose.gdd";
426 kPointerToModalityData = 0;
427 kPointerToDoseDistData.clear();
428 kPointerToROIData = 0;
429 kPointerToTrackData = 0;
431 for(
int i = 0; i < 3; i++) kVoxelSpacing[i] = 0.;
433 kModalityImageDensityMap.clear();
434 kModalityUnit =
"g/cm3 ";
441 std::vector<float *>::iterator itr;
442 for(itr = kSteps.begin(); itr != kSteps.end(); itr++)
delete [] *itr;
444 std::vector<unsigned char *>::iterator citr;
445 for(citr = kStepColors.begin(); citr != kStepColors.end(); citr++)
448 kTracksWillBeStored =
true;
459 return storeData4(_filename);
466 if(DEBUG || kVerbose > 0)
467 G4cout <<
">>>>>>> store data (ver.4) <<<<<<<" <<
G4endl;
468 if(DEBUG || kVerbose > 0)
472 std::ofstream
ofile(kFileName.c_str(),
473 std::ios_base::out|std::ios_base::binary);
474 if(DEBUG || kVerbose > 0)
478 ofile.write(
"gMocren ", 8);
481 unsigned char ver = 0x04;
482 ofile.write((
char *)&ver, 1);
486 char littleEndian = 0x01;
487 ofile.write((
char *)&littleEndian,
sizeof(
char));
488 if(DEBUG || kVerbose > 0) {
490 G4cout <<
"Endian: " << (int)littleEndian << G4endl;
499 int commentLength = 1024;
500 if(kLittleEndianOutput) {
501 ofile.write((
char *)&commentLength, 4);
503 invertByteOrder((
char *)&commentLength, itmp[0]);
504 ofile.write((
char *)itmp, 4);
509 for(
int i = 0; i < 1025; i++) cmt[i] =
'\0';
511 const char * cmnt = kComment.c_str();
512 size_t lcm = std::strlen(cmnt);
513 if(lcm > 1024) lcm = 1024;
514 std::strncpy(cmt, cmnt, lcm);
515 ofile.write((
char *)cmt, 1024);
516 if(DEBUG || kVerbose > 0) {
517 G4cout <<
"Data comment : " 522 if(kLittleEndianOutput) {
523 ofile.write((
char *)kVoxelSpacing, 12);
525 for(
int j = 0; j < 3; j++)
526 invertByteOrder((
char *)&kVoxelSpacing[j], ftmp[j]);
527 ofile.write((
char *)ftmp, 12);
529 if(DEBUG || kVerbose > 0) {
530 G4cout <<
"Voxel spacing : (" 531 << kVoxelSpacing[0] <<
", " 532 << kVoxelSpacing[1] <<
", " 538 if(!kTracksWillBeStored) kPointerToTrackData = 0;
541 if(kLittleEndianOutput) {
542 ofile.write((
char *)&kPointerToModalityData, 4);
544 invertByteOrder((
char *)&kPointerToModalityData, itmp[0]);
545 ofile.write((
char *)itmp, 4);
550 int nDoseDist = getNumDoseDist();
551 if(kLittleEndianOutput) {
552 ofile.write((
char *)&nDoseDist, 4);
554 invertByteOrder((
char *)&nDoseDist, itmp[0]);
555 ofile.write((
char *)itmp, 4);
559 if(kLittleEndianOutput) {
560 for(
int i = 0; i < nDoseDist; i++) {
561 ofile.write((
char *)&kPointerToDoseDistData[i], 4);
564 for(
int i = 0; i < nDoseDist; i++) {
565 invertByteOrder((
char *)&kPointerToDoseDistData[i], itmp[0]);
566 ofile.write((
char *)itmp, 4);
571 if(kLittleEndianOutput) {
572 ofile.write((
char *)&kPointerToROIData, 4);
574 invertByteOrder((
char *)&kPointerToROIData, itmp[0]);
575 ofile.write((
char *)itmp, 4);
579 if(kLittleEndianOutput) {
580 ofile.write((
char *)&kPointerToTrackData, 4);
582 invertByteOrder((
char *)&kPointerToTrackData, itmp[0]);
583 ofile.write((
char *)itmp, 4);
587 if(kLittleEndianOutput) {
588 ofile.write((
char *)&kPointerToDetectorData, 4);
590 invertByteOrder((
char *)&kPointerToDetectorData, itmp[0]);
591 ofile.write((
char *)itmp, 4);
594 if(DEBUG || kVerbose > 0) {
595 G4cout <<
"Each pointer to data : " 596 << kPointerToModalityData <<
", ";
597 for(
int i = 0; i < nDoseDist; i++) {
598 G4cout << kPointerToDoseDistData[i] <<
", ";
600 G4cout << kPointerToROIData <<
", " 601 << kPointerToTrackData <<
", " 602 << kPointerToDetectorData
614 kModality.getSize(size);
616 if(kLittleEndianOutput) {
617 ofile.write((
char *)size, 3*
sizeof(
int));
619 for(
int j = 0; j < 3; j++)
620 invertByteOrder((
char *)&size[j], itmp[j]);
621 ofile.write((
char *)itmp, 12);
624 if(DEBUG || kVerbose > 0) {
625 G4cout <<
"Modality image size : (" 633 kModality.getMinMax(minmax);
634 if(kLittleEndianOutput) {
635 ofile.write((
char *)minmax, 4);
637 for(
int j = 0; j < 2; j++)
638 invertByteOrder((
char *)&minmax[j], stmp[j]);
639 ofile.write((
char *)stmp, 4);
643 char munit[13] =
"g/cm3\0";
644 ofile.write((
char *)munit, 12);
647 scale = (float)kModality.getScale();
648 if(kLittleEndianOutput) {
649 ofile.write((
char *)&scale, 4);
651 invertByteOrder((
char *)&scale, ftmp[0]);
652 ofile.write((
char *)ftmp, 4);
654 if(DEBUG || kVerbose > 0) {
655 G4cout <<
"Modality image min., max., scale : " 662 int psize = size[0]*size[1];
663 if(DEBUG || kVerbose > 0)
G4cout <<
"Modality image : ";
664 for(
int i = 0; i < size[2]; i++) {
665 short * image = kModality.getImage(i);
666 if(kLittleEndianOutput) {
667 ofile.write((
char *)image, psize*
sizeof(
short));
669 for(
int j = 0; j < psize; j++) {
670 invertByteOrder((
char *)&image[j], stmp[0]);
671 ofile.write((
char *)stmp, 2);
675 if(DEBUG || kVerbose > 0)
G4cout <<
"[" << i <<
"]" << image[(size_t)(psize*0.55)] <<
", ";
680 size_t msize = minmax[1] - minmax[0]+1;
681 if(DEBUG || kVerbose > 0)
682 G4cout <<
"modality image : " << minmax[0] <<
", " << minmax[1] <<
G4endl;
683 float * pdmap =
new float[msize];
684 for(
int i = 0; i < (int)msize; i++) pdmap[i] =kModalityImageDensityMap[i];
686 if(kLittleEndianOutput) {
687 ofile.write((
char *)pdmap, msize*
sizeof(
float));
689 for(
int j = 0; j < (int)msize; j++) {
690 invertByteOrder((
char *)&pdmap[j], ftmp[0]);
691 ofile.write((
char *)ftmp, 4);
695 if(DEBUG || kVerbose > 0) {
696 G4cout <<
"density map : " << std::ends;
697 for(
int i = 0; i < (int)msize; i+=50)
698 G4cout <<kModalityImageDensityMap[i] <<
", ";
710 for(
int ndose = 0; ndose < nDoseDist; ndose++) {
712 kDose[ndose].getSize(size);
713 if(kLittleEndianOutput) {
714 ofile.write((
char *)size, 3*
sizeof(
int));
716 for(
int j = 0; j < 3; j++)
717 invertByteOrder((
char *)&size[j], itmp[j]);
718 ofile.write((
char *)itmp, 12);
720 if(DEBUG || kVerbose > 0) {
721 G4cout <<
"Dose dist. [" << ndose <<
"] image size : (" 729 getShortDoseDistMinMax(minmax, ndose);
730 if(kLittleEndianOutput) {
731 ofile.write((
char *)minmax, 2*2);
733 for(
int j = 0; j < 2; j++)
734 invertByteOrder((
char *)&minmax[j], stmp[j]);
735 ofile.write((
char *)stmp, 4);
740 for(
int i = 0; i < 13; i++) cdunit[i] =
'\0';
741 const char * cu = kDoseUnit.c_str();
742 size_t lcu = std::strlen(cu);
743 if(lcu > 12) lcu = 12;
744 std::strncpy(cdunit, cu, lcu);
745 ofile.write((
char *)cdunit, 12);
746 if(DEBUG || kVerbose > 0) {
752 dscale = getDoseDistScale(ndose);
753 scale = float(dscale);
754 if(kLittleEndianOutput) {
755 ofile.write((
char *)&scale, 4);
757 invertByteOrder((
char *)&scale, ftmp[0]);
758 ofile.write((
char *)ftmp, 4);
760 if(DEBUG || kVerbose > 0) {
761 G4cout <<
"Dose dist. [" << ndose
762 <<
"] image min., max., scale : " 769 int dsize = size[0]*size[1];
770 short * dimage =
new short[dsize];
771 for(
int z = 0;
z < size[2];
z++) {
772 getShortDoseDist(dimage,
z, ndose);
773 if(kLittleEndianOutput) {
774 ofile.write((
char *)dimage, dsize*2);
776 for(
int j = 0; j < dsize; j++) {
777 invertByteOrder((
char *)&dimage[j], stmp[0]);
778 ofile.write((
char *)stmp, 2);
782 if(DEBUG || kVerbose > 0) {
783 for(
int j = 0; j < dsize; j++) {
785 G4cout <<
"[" << j <<
"," <<
z <<
"]" 786 << dimage[j] <<
", ";
795 getDoseDistCenterPosition(fCenter, ndose);
796 for(
int i = 0; i < 3; i++) iCenter[i] = (
int)fCenter[i];
797 if(kLittleEndianOutput) {
798 ofile.write((
char *)iCenter, 3*4);
800 for(
int j = 0; j < 3; j++)
801 invertByteOrder((
char *)&iCenter[j], itmp[j]);
802 ofile.write((
char *)itmp, 12);
804 if(DEBUG || kVerbose > 0) {
805 G4cout <<
"Dose dist. [" << ndose
806 <<
"]image relative location : (" 807 << iCenter[0] <<
", " 808 << iCenter[1] <<
", " 809 << iCenter[2] <<
")" <<
G4endl;
813 std::string
name = getDoseDistName(ndose);
814 if(name.size() == 0) name =
"dose";
816 ofile.write((
char *)name.c_str(), 80);
817 if(DEBUG || kVerbose > 0) {
827 kRoi[0].getSize(size);
828 if(kLittleEndianOutput) {
829 ofile.write((
char *)size, 3*
sizeof(
int));
831 for(
int j = 0; j < 3; j++)
832 invertByteOrder((
char *)&size[j], itmp[j]);
833 ofile.write((
char *)itmp, 12);
835 if(DEBUG || kVerbose > 0) {
836 G4cout <<
"ROI image size : (" 844 kRoi[0].getMinMax(minmax);
845 if(kLittleEndianOutput) {
846 ofile.write((
char *)minmax,
sizeof(
short)*2);
848 for(
int j = 0; j < 2; j++)
849 invertByteOrder((
char *)&minmax[j], stmp[j]);
850 ofile.write((
char *)stmp, 4);
854 scale = (float)kRoi[0].getScale();
855 if(kLittleEndianOutput) {
856 ofile.write((
char *)&scale,
sizeof(
float));
858 invertByteOrder((
char *)&scale, ftmp[0]);
859 ofile.write((
char *)ftmp, 4);
861 if(DEBUG || kVerbose > 0) {
862 G4cout <<
"ROI image min., max., scale : " 869 int rsize = size[0]*size[1];
870 for(
int i = 0; i < size[2]; i++) {
871 short * rimage = kRoi[0].getImage(i);
872 if(kLittleEndianOutput) {
873 ofile.write((
char *)rimage, rsize*
sizeof(
short));
875 for(
int j = 0; j < rsize; j++) {
876 invertByteOrder((
char *)&rimage[j], stmp[0]);
877 ofile.write((
char *)stmp, 2);
884 kRoi[0].getCenterPosition(fCenter);
885 for(
int i = 0; i < 3; i++) iCenter[i] = (
int)fCenter[i];
886 if(kLittleEndianOutput) {
887 ofile.write((
char *)iCenter, 3*
sizeof(
int));
889 for(
int j = 0; j < 3; j++)
890 invertByteOrder((
char *)&iCenter[j], itmp[j]);
891 ofile.write((
char *)itmp, 12);
893 if(DEBUG || kVerbose > 0) {
894 G4cout <<
"ROI image relative location : (" 895 << iCenter[0] <<
", " 896 << iCenter[1] <<
", " 897 << iCenter[2] <<
")" <<
G4endl;
903 if(kPointerToTrackData > 0) {
905 int ntrk = kTracks.size();
906 if(kLittleEndianOutput) {
907 ofile.write((
char *)&ntrk,
sizeof(
int));
909 invertByteOrder((
char *)&ntrk, itmp[0]);
910 ofile.write((
char *)itmp, 4);
912 if(DEBUG || kVerbose > 0) {
913 G4cout <<
"# of tracks : " 917 for(
int nt = 0; nt < ntrk; nt++) {
920 int nsteps = kTracks[nt].getNumberOfSteps();
921 if(kLittleEndianOutput) {
922 ofile.write((
char *)&nsteps,
sizeof(
int));
924 invertByteOrder((
char *)&nsteps, itmp[0]);
925 ofile.write((
char *)itmp, 4);
927 if(DEBUG || kVerbose > 0) {
932 unsigned char tcolor[3];
933 kTracks[nt].getColor(tcolor);
934 ofile.write((
char *)tcolor, 3);
938 for(
int isteps = 0; isteps < nsteps; isteps++) {
939 kTracks[nt].getStep(stepPoints[0], stepPoints[1], stepPoints[2],
940 stepPoints[3], stepPoints[4], stepPoints[5],
943 if(kLittleEndianOutput) {
944 ofile.write((
char *)stepPoints,
sizeof(
float)*6);
946 for(
int j = 0; j < 6; j++)
947 invertByteOrder((
char *)&stepPoints[j], ftmp[j]);
948 ofile.write((
char *)ftmp, 24);
956 if(kPointerToDetectorData > 0) {
957 int ndet = kDetectors.size();
958 if(kLittleEndianOutput) {
959 ofile.write((
char *)&ndet,
sizeof(
int));
961 invertByteOrder((
char *)&ndet, itmp[0]);
962 ofile.write((
char *)itmp, 4);
964 if(DEBUG || kVerbose > 0) {
965 G4cout <<
"# of detectors : " 969 for(
int nd = 0; nd < ndet; nd++) {
972 int nedges = kDetectors[nd].getNumberOfEdges();
973 if(kLittleEndianOutput) {
974 ofile.write((
char *)&nedges,
sizeof(
int));
976 invertByteOrder((
char *)&nedges, itmp[0]);
977 ofile.write((
char *)itmp, 4);
979 if(DEBUG || kVerbose > 0) {
980 G4cout <<
"# of edges in a detector : " << nedges <<
G4endl;
985 for(
int ne = 0; ne < nedges; ne++) {
986 kDetectors[nd].getEdge(edgePoints[0], edgePoints[1], edgePoints[2],
987 edgePoints[3], edgePoints[4], edgePoints[5],
990 if(kLittleEndianOutput) {
991 ofile.write((
char *)edgePoints,
sizeof(
float)*6);
993 for(
int j = 0; j < 6; j++)
994 invertByteOrder((
char *)&edgePoints[j], ftmp[j]);
995 ofile.write((
char *)ftmp, 24);
998 if(DEBUG || kVerbose > 0) {
1000 G4cout <<
" edge : (" << edgePoints[0] <<
", " 1001 << edgePoints[1] <<
", " 1002 << edgePoints[2] <<
") - (" 1003 << edgePoints[3] <<
", " 1004 << edgePoints[4] <<
", " 1005 << edgePoints[5] <<
")" <<
G4endl;
1011 unsigned char dcolor[3];
1012 kDetectors[nd].getColor(dcolor);
1013 ofile.write((
char *)dcolor, 3);
1014 if(DEBUG || kVerbose > 0) {
1015 G4cout <<
" rgb : (" << (int)dcolor[0] <<
", " 1016 << (
int)dcolor[1] <<
", " 1017 << (int)dcolor[2] <<
")" << G4endl;
1021 std::string dname = kDetectors[nd].getName();
1023 ofile.write((
char *)dname.c_str(), 80);
1024 if(DEBUG || kVerbose > 0) {
1032 ofile.write(
"END", 3);
1035 if(DEBUG || kVerbose > 0)
1036 G4cout <<
">>>> closed gdd file: " << kFileName <<
G4endl;
1042 if(kVerbose > 0)
G4cout <<
">>>>>>> store data (ver.3) <<<<<<<" <<
G4endl;
1048 std::ofstream
ofile(kFileName.c_str(),
1049 std::ios_base::out|std::ios_base::binary);
1052 ofile.write(
"gMocren ", 8);
1055 unsigned char ver = 0x03;
1056 ofile.write((
char *)&ver, 1);
1059 ofile.write((
char *)&kLittleEndianOutput,
sizeof(
char));
1062 int commentLength = 1024;
1063 ofile.write((
char *)&commentLength, 4);
1067 std::strncpy(cmt, kComment.c_str(), 1024);
1068 ofile.write((
char *)cmt, 1024);
1069 if(DEBUG || kVerbose > 0) {
1070 G4cout <<
"Data comment : " 1075 ofile.write((
char *)kVoxelSpacing, 12);
1076 if(DEBUG || kVerbose > 0) {
1077 G4cout <<
"Voxel spacing : (" 1078 << kVoxelSpacing[0] <<
", " 1079 << kVoxelSpacing[1] <<
", " 1087 ofile.write((
char *)&kPointerToModalityData, 4);
1091 int nDoseDist = getNumDoseDist();
1092 ofile.write((
char *)&nDoseDist, 4);
1095 for(
int i = 0; i < nDoseDist; i++) {
1096 ofile.write((
char *)&kPointerToDoseDistData[i], 4);
1100 ofile.write((
char *)&kPointerToROIData, 4);
1103 ofile.write((
char *)&kPointerToTrackData, 4);
1104 if(DEBUG || kVerbose > 0) {
1105 G4cout <<
"Each pointer to data : " 1106 << kPointerToModalityData <<
", ";
1107 for(
int i = 0; i < nDoseDist; i++) {
1108 G4cout << kPointerToDoseDistData[i] <<
", ";
1110 G4cout << kPointerToROIData <<
", " 1111 << kPointerToTrackData <<
G4endl;
1122 kModality.getSize(size);
1123 ofile.write((
char *)size, 3*
sizeof(
int));
1124 if(DEBUG || kVerbose > 0) {
1125 G4cout <<
"Modality image size : (" 1133 kModality.getMinMax(minmax);
1134 ofile.write((
char *)minmax, 4);
1137 char munit[13] =
"g/cm3 ";
1138 ofile.write((
char *)munit, 12);
1141 scale = (float)kModality.getScale();
1142 ofile.write((
char *)&scale, 4);
1143 if(DEBUG || kVerbose > 0) {
1144 G4cout <<
"Modality image min., max., scale : " 1145 << minmax[0] <<
", " 1146 << minmax[1] <<
", " 1151 int psize = size[0]*size[1];
1152 if(DEBUG || kVerbose > 0)
G4cout <<
"Modality image : ";
1153 for(
int i = 0; i < size[2]; i++) {
1154 short * image = kModality.getImage(i);
1155 ofile.write((
char *)image, psize*
sizeof(
short));
1157 if(DEBUG || kVerbose > 0)
G4cout <<
"[" << i <<
"]" << image[(size_t)(psize*0.55)] <<
", ";
1162 size_t msize = minmax[1] - minmax[0]+1;
1163 float * pdmap =
new float[msize];
1164 for(
int i = 0; i < (int)msize; i++) pdmap[i] =kModalityImageDensityMap[i];
1165 ofile.write((
char *)pdmap, msize*
sizeof(
float));
1166 if(DEBUG || kVerbose > 0) {
1167 G4cout <<
"density map : " << std::ends;
1168 for(
int i = 0; i < (int)msize; i+=50)
1169 G4cout <<kModalityImageDensityMap[i] <<
", ";
1177 if(!isDoseEmpty()) {
1179 calcDoseDistScale();
1181 for(
int ndose = 0; ndose < nDoseDist; ndose++) {
1183 kDose[ndose].getSize(size);
1184 ofile.write((
char *)size, 3*
sizeof(
int));
1185 if(DEBUG || kVerbose > 0) {
1186 G4cout <<
"Dose dist. [" << ndose <<
"] image size : (" 1194 getShortDoseDistMinMax(minmax, ndose);
1195 ofile.write((
char *)minmax, 2*2);
1198 ofile.write((
char *)kDoseUnit.c_str(), 12);
1199 if(DEBUG || kVerbose > 0) {
1205 dscale = getDoseDistScale(ndose);
1206 scale = float(dscale);
1207 ofile.write((
char *)&scale, 4);
1208 if(DEBUG || kVerbose > 0) {
1209 G4cout <<
"Dose dist. [" << ndose
1210 <<
"] image min., max., scale : " 1211 << minmax[0] <<
", " 1212 << minmax[1] <<
", " 1217 int dsize = size[0]*size[1];
1218 short * dimage =
new short[dsize];
1219 for(
int z = 0;
z < size[2];
z++) {
1220 getShortDoseDist(dimage,
z, ndose);
1221 ofile.write((
char *)dimage, dsize*2);
1223 if(DEBUG || kVerbose > 0) {
1224 for(
int j = 0; j < dsize; j++) {
1226 G4cout <<
"[" << j <<
"," <<
z <<
"]" 1227 << dimage[j] <<
", ";
1236 getDoseDistCenterPosition(fCenter, ndose);
1237 for(
int i = 0; i < 3; i++) iCenter[i] = (
int)fCenter[i];
1238 ofile.write((
char *)iCenter, 3*4);
1239 if(DEBUG || kVerbose > 0) {
1240 G4cout <<
"Dose dist. [" << ndose
1241 <<
"]image relative location : (" 1242 << iCenter[0] <<
", " 1243 << iCenter[1] <<
", " 1244 << iCenter[2] <<
")" <<
G4endl;
1252 kRoi[0].getSize(size);
1253 ofile.write((
char *)size, 3*
sizeof(
int));
1254 if(DEBUG || kVerbose > 0) {
1255 G4cout <<
"ROI image size : (" 1263 kRoi[0].getMinMax(minmax);
1264 ofile.write((
char *)minmax,
sizeof(
short)*2);
1267 scale = (float)kRoi[0].getScale();
1268 ofile.write((
char *)&scale,
sizeof(
float));
1269 if(DEBUG || kVerbose > 0) {
1270 G4cout <<
"ROI image min., max., scale : " 1271 << minmax[0] <<
", " 1272 << minmax[1] <<
", " 1277 int rsize = size[0]*size[1];
1278 for(
int i = 0; i < size[2]; i++) {
1279 short * rimage = kRoi[0].getImage(i);
1280 ofile.write((
char *)rimage, rsize*
sizeof(
short));
1285 kRoi[0].getCenterPosition(fCenter);
1286 for(
int i = 0; i < 3; i++) iCenter[i] = (
int)fCenter[i];
1287 ofile.write((
char *)iCenter, 3*
sizeof(
int));
1288 if(DEBUG || kVerbose > 0) {
1289 G4cout <<
"ROI image relative location : (" 1290 << iCenter[0] <<
", " 1291 << iCenter[1] <<
", " 1292 << iCenter[2] <<
")" <<
G4endl;
1298 int ntrk = kSteps.size();
1299 ofile.write((
char *)&ntrk,
sizeof(
int));
1300 if(DEBUG || kVerbose > 0) {
1301 G4cout <<
"# of tracks : " 1305 for(
int i = 0; i < ntrk; i++) {
1306 float *
tp = kSteps[i];
1307 ofile.write((
char *)tp,
sizeof(
float)*6);
1310 int ntcolor = int(kStepColors.size());
1313 G4cout <<
"# of track color information must be the same as # of tracks." 1315 unsigned char white[3] = {255,255,255};
1316 for(
int i = 0; i < ntrk; i++) {
1318 unsigned char * tcolor = kStepColors[i];
1319 ofile.write((
char *)tcolor, 3);
1321 ofile.write((
char *)white, 3);
1326 ofile.write(
"END", 3);
1334 kFileName = _filename;
1335 return storeData4();
1341 if(kVerbose > 0)
G4cout <<
">>>>>>> store data (ver.2) <<<<<<<" <<
G4endl;
1347 std::ofstream
ofile(kFileName.c_str(),
1348 std::ios_base::out|std::ios_base::binary);
1351 ofile.write(
"GRAPE ", 8);
1354 unsigned char ver = 0x02;
1355 ofile.write((
char *)&ver, 1);
1361 ofile.write((
char *)&kLittleEndianOutput,
sizeof(
char));
1375 ofile.write((
char *)kVoxelSpacing, 12);
1376 if(DEBUG || kVerbose > 0) {
1377 G4cout <<
"Voxel spacing : (" 1378 << kVoxelSpacing[0] <<
", " 1379 << kVoxelSpacing[1] <<
", " 1386 ofile.write((
char *)&kPointerToModalityData, 4);
1389 ofile.write((
char *)&kPointerToDoseDistData[0], 4);
1392 ofile.write((
char *)&kPointerToROIData, 4);
1395 ofile.write((
char *)&kPointerToTrackData, 4);
1396 if(DEBUG || kVerbose > 0) {
1397 G4cout <<
"Each pointer to data : " 1398 << kPointerToModalityData <<
", " 1399 << kPointerToDoseDistData[0] <<
", " 1400 << kPointerToROIData <<
", " 1401 << kPointerToTrackData <<
G4endl;
1412 kModality.getSize(size);
1413 ofile.write((
char *)size, 3*
sizeof(
int));
1414 if(DEBUG || kVerbose > 0) {
1415 G4cout <<
"Modality image size : (" 1423 kModality.getMinMax(minmax);
1424 ofile.write((
char *)minmax, 4);
1431 scale = (float)kModality.getScale();
1432 ofile.write((
char *)&scale, 4);
1433 if(DEBUG || kVerbose > 0) {
1434 G4cout <<
"Modality image min., max., scale : " 1435 << minmax[0] <<
", " 1436 << minmax[1] <<
", " 1441 int psize = size[0]*size[1];
1442 if(DEBUG || kVerbose > 0)
G4cout <<
"Modality image : ";
1443 for(
int i = 0; i < size[2]; i++) {
1444 short * image =kModality.getImage(i);
1445 ofile.write((
char *)image, psize*
sizeof(
short));
1447 if(DEBUG || kVerbose > 0)
G4cout <<
"[" << i <<
"]" << image[(size_t)(psize*0.55)] <<
", ";
1452 size_t msize = minmax[1] - minmax[0]+1;
1453 float * pdmap =
new float[msize];
1454 for(
int i = 0; i < (int)msize; i++) pdmap[i] =kModalityImageDensityMap[i];
1455 ofile.write((
char *)pdmap, msize*
sizeof(
float));
1456 if(DEBUG || kVerbose > 0) {
1457 G4cout <<
"density map : " << std::ends;
1458 for(
int i = 0; i < (int)msize; i+=50)
1459 G4cout <<kModalityImageDensityMap[i] <<
", ";
1467 if(!isDoseEmpty()) {
1468 calcDoseDistScale();
1471 kDose[0].getSize(size);
1472 ofile.write((
char *)size, 3*
sizeof(
int));
1473 if(DEBUG || kVerbose > 0) {
1474 G4cout <<
"Dose dist. image size : (" 1482 getShortDoseDistMinMax(minmax);
1483 ofile.write((
char *)minmax,
sizeof(
short)*2);
1486 scale = (float)kDose[0].getScale();
1487 ofile.write((
char *)&scale,
sizeof(
float));
1488 if(DEBUG || kVerbose > 0) {
1489 G4cout <<
"Dose dist. image min., max., scale : " 1490 << minmax[0] <<
", " 1491 << minmax[1] <<
", " 1496 int dsize = size[0]*size[1];
1497 short * dimage =
new short[dsize];
1498 for(
int z = 0;
z < size[2];
z++) {
1499 getShortDoseDist(dimage,
z);
1500 ofile.write((
char *)dimage, dsize*
sizeof(
short));
1502 if(DEBUG || kVerbose > 0) {
1503 for(
int j = 0; j < dsize; j++) {
1505 G4cout <<
"[" << j <<
"," <<
z <<
"]" 1506 << dimage[j] <<
", ";
1515 kDose[0].getCenterPosition(fCenter);
1516 for(
int i = 0; i < 3; i++) iCenter[i] = (
int)fCenter[i];
1517 ofile.write((
char *)iCenter, 3*
sizeof(
int));
1518 if(DEBUG || kVerbose > 0) {
1519 G4cout <<
"Dose dist. image relative location : (" 1520 << iCenter[0] <<
", " 1521 << iCenter[1] <<
", " 1522 << iCenter[2] <<
")" <<
G4endl;
1530 kRoi[0].getSize(size);
1531 ofile.write((
char *)size, 3*
sizeof(
int));
1532 if(DEBUG || kVerbose > 0) {
1533 G4cout <<
"ROI image size : (" 1541 kRoi[0].getMinMax(minmax);
1542 ofile.write((
char *)minmax,
sizeof(
short)*2);
1545 scale = (float)kRoi[0].getScale();
1546 ofile.write((
char *)&scale,
sizeof(
float));
1547 if(DEBUG || kVerbose > 0) {
1548 G4cout <<
"ROI image min., max., scale : " 1549 << minmax[0] <<
", " 1550 << minmax[1] <<
", " 1555 int rsize = size[0]*size[1];
1556 for(
int i = 0; i < size[2]; i++) {
1557 short * rimage = kRoi[0].getImage(i);
1558 ofile.write((
char *)rimage, rsize*
sizeof(
short));
1563 kRoi[0].getCenterPosition(fCenter);
1564 for(
int i = 0; i < 3; i++) iCenter[i] = (
int)fCenter[i];
1565 ofile.write((
char *)iCenter, 3*
sizeof(
int));
1566 if(DEBUG || kVerbose > 0) {
1567 G4cout <<
"ROI image relative location : (" 1568 << iCenter[0] <<
", " 1569 << iCenter[1] <<
", " 1570 << iCenter[2] <<
")" <<
G4endl;
1577 int ntrk = kSteps.size();
1578 ofile.write((
char *)&ntrk,
sizeof(
int));
1579 if(DEBUG || kVerbose > 0) {
1580 G4cout <<
"# of tracks : " 1583 for(
int i = 0; i < ntrk; i++) {
1584 float *
tp = kSteps[i];
1585 ofile.write((
char *)tp,
sizeof(
float)*6);
1590 ofile.write(
"END", 3);
1598 kFileName = _filename;
1605 std::ifstream ifile(kFileName.c_str(),
std::ios_base::in|std::ios_base::binary);
1608 G4cout <<
"Cannot open file: " << kFileName
1609 <<
" in G4GMocrenIO::retrieveData()." <<
G4endl;
1615 ifile.read((
char *)verid, 8);
1618 ifile.read((
char *)&ver, 1);
1621 if(std::strncmp(verid,
"gMocren", 7) == 0) {
1623 G4cout <<
">>>>>>> retrieve data (ver.3) <<<<<<<" <<
G4endl;
1626 }
else if (ver == 0x04) {
1627 G4cout <<
">>>>>>> retrieve data (ver.4) <<<<<<<" <<
G4endl;
1632 G4cout <<
"Error -- invalid file version : " << (int)ver
1641 }
else if(std::strncmp(verid,
"GRAPE", 5) == 0) {
1642 G4cout <<
">>>>>>> retrieve data (ver.2) <<<<<<<" <<
G4endl;
1655 kFileName = _filename;
1656 return retrieveData();
1665 std::ifstream ifile(kFileName.c_str(),
std::ios_base::in|std::ios_base::binary);
1668 G4cout <<
"Cannot open file: " << kFileName
1669 <<
" in G4GMocrenIO::retrieveData3()." <<
G4endl;
1678 ifile.read((
char *)verid, 8);
1682 ifile.read((
char *)&ver, 1);
1683 std::stringstream ss;
1685 kVersion = ss.str();
1686 if(DEBUG || kVerbose > 0)
G4cout <<
"File version : " << kVersion <<
G4endl;
1689 ifile.read((
char *)&kLittleEndianInput,
sizeof(
char));
1690 if(DEBUG || kVerbose > 0) {
1692 if(kLittleEndianInput == 1)
1701 ifile.read((
char *)ctmp, 4);
1702 convertEndian(ctmp, clength);
1705 ifile.read((
char *)cmt, clength);
1706 std::string scmt = cmt;
1709 if(DEBUG || kVerbose > 0) {
1710 G4cout <<
"Data comment : " 1715 ifile.read((
char *)ctmp, 12);
1716 convertEndian(ctmp, kVoxelSpacing[0]);
1717 convertEndian(ctmp+4, kVoxelSpacing[1]);
1718 convertEndian(ctmp+8, kVoxelSpacing[2]);
1719 if(DEBUG || kVerbose > 0) {
1720 G4cout <<
"Voxel spacing : (" 1721 << kVoxelSpacing[0] <<
", " 1722 << kVoxelSpacing[1] <<
", " 1729 ifile.read((
char *)ctmp, 4);
1730 convertEndian(ctmp, kPointerToModalityData);
1733 ifile.read((
char *)ctmp, 4);
1735 convertEndian(ctmp, nDoseDist);
1738 for(
int i = 0; i < nDoseDist; i++) {
1739 ifile.read((
char *)ctmp, 4);
1741 convertEndian(ctmp, dptr);
1742 addPointerToDoseDistData(dptr);
1746 ifile.read((
char *)ctmp, 4);
1747 convertEndian(ctmp, kPointerToROIData);
1750 ifile.read((
char *)ctmp, 4);
1751 convertEndian(ctmp, kPointerToTrackData);
1754 ifile.read((
char *)ctmp, 4);
1755 convertEndian(ctmp, kPointerToDetectorData);
1757 if(DEBUG || kVerbose > 0) {
1758 G4cout <<
"Each pointer to data : " 1759 << kPointerToModalityData <<
", ";
1760 for(
int i = 0; i < nDoseDist; i++)
1761 G4cout << kPointerToDoseDistData[i] <<
", ";
1762 G4cout << kPointerToROIData <<
", " 1763 << kPointerToTrackData <<
", " 1764 << kPointerToDetectorData
1770 if(kPointerToModalityData == 0 && kPointerToDoseDistData.size() == 0 &&
1771 kPointerToROIData == 0 && kPointerToTrackData == 0) {
1772 if(DEBUG || kVerbose > 0) {
1793 ifile.read(ctmp, 3*
sizeof(
int));
1794 convertEndian(ctmp, size[0]);
1795 convertEndian(ctmp+
sizeof(
int), size[1]);
1796 convertEndian(ctmp+2*
sizeof(
int), size[2]);
1797 if(DEBUG || kVerbose > 0) {
1798 G4cout <<
"Modality image size : (" 1804 kModality.setSize(size);
1814 if(kPointerToModalityData != 0) {
1817 ifile.read((
char *)ctmp, 4);
1818 convertEndian(ctmp, minmax[0]);
1819 convertEndian(ctmp+2, minmax[1]);
1820 kModality.setMinMax(minmax);
1825 ifile.read((
char *)munit, 12);
1826 std::string smunit = munit;
1827 setModalityImageUnit(smunit);
1830 ifile.read((
char *)ctmp, 4);
1831 convertEndian(ctmp, scale);
1832 kModality.setScale(dscale = scale);
1833 if(DEBUG || kVerbose > 0) {
1834 G4cout <<
"Modality image min., max., scale : " 1835 << minmax[0] <<
", " 1836 << minmax[1] <<
", " 1841 int psize = size[0]*size[1];
1842 if(DEBUG || kVerbose > 0)
G4cout <<
"Modality image (" << psize <<
"): ";
1843 char * cimage =
new char[psize*
sizeof(short)];
1844 for(
int i = 0; i < size[2]; i++) {
1845 ifile.read((
char *)cimage, psize*
sizeof(
short));
1846 short * mimage =
new short[psize];
1847 for(
int j = 0; j < psize; j++) {
1848 convertEndian(cimage+j*
sizeof(
short), mimage[j]);
1850 kModality.addImage(mimage);
1852 if(DEBUG || kVerbose > 0)
G4cout <<
"[" << i <<
"]" << mimage[(size_t)(psize*0.55)] <<
", ";
1858 size_t msize = minmax[1]-minmax[0]+1;
1859 if(DEBUG || kVerbose > 0)
G4cout <<
"msize: " << msize <<
G4endl;
1860 char * pdmap =
new char[msize*
sizeof(float)];
1861 ifile.read((
char *)pdmap, msize*
sizeof(
float));
1863 for(
int i = 0; i < (int)msize; i++) {
1864 convertEndian(pdmap+i*
sizeof(
float), ftmp);
1865 kModalityImageDensityMap.push_back(ftmp);
1869 if(DEBUG || kVerbose > 0) {
1870 G4cout <<
"density map : " << std::ends;
1871 for(
int i = 0; i < 10; i++)
1872 G4cout <<kModalityImageDensityMap[i] <<
", ";
1874 for(
int i = 0; i < 10; i++)
G4cout <<
"..";
1876 for(
size_t i =kModalityImageDensityMap.size() - 10; i <kModalityImageDensityMap.size(); i++)
1877 G4cout <<kModalityImageDensityMap[i] <<
", ";
1885 for(
int ndose = 0; ndose < nDoseDist; ndose++) {
1890 ifile.read((
char *)ctmp, 3*
sizeof(
int));
1891 convertEndian(ctmp, size[0]);
1892 convertEndian(ctmp+
sizeof(
int), size[1]);
1893 convertEndian(ctmp+2*
sizeof(
int), size[2]);
1894 if(DEBUG || kVerbose > 0) {
1895 G4cout <<
"Dose dist. image size : (" 1901 kDose[ndose].setSize(size);
1904 ifile.read((
char *)ctmp,
sizeof(
short)*2);
1905 convertEndian(ctmp, minmax[0]);
1906 convertEndian(ctmp+2, minmax[1]);
1911 ifile.read((
char *)dunit, 12);
1912 std::string sdunit = dunit;
1913 setDoseDistUnit(sdunit, ndose);
1914 if(DEBUG || kVerbose > 0) {
1919 ifile.read((
char *)ctmp, 4);
1920 convertEndian(ctmp, scale);
1921 kDose[ndose].setScale(dscale = scale);
1924 for(
int i = 0; i < 2; i++) dminmax[i] = minmax[i]*dscale;
1925 kDose[ndose].setMinMax(dminmax);
1927 if(DEBUG || kVerbose > 0) {
1928 G4cout <<
"Dose dist. image min., max., scale : " 1929 << dminmax[0] <<
", " 1930 << dminmax[1] <<
", " 1935 int dsize = size[0]*size[1];
1936 if(DEBUG || kVerbose > 0)
G4cout <<
"Dose dist. (" << dsize <<
"): ";
1937 char * di =
new char[dsize*
sizeof(short)];
1938 short * shimage =
new short[dsize];
1939 for(
int z = 0;
z < size[2];
z++) {
1940 ifile.read((
char *)di, dsize*
sizeof(
short));
1941 double * dimage =
new double[dsize];
1942 for(
int xy = 0; xy < dsize; xy++) {
1943 convertEndian(di+xy*
sizeof(
short), shimage[xy]);
1944 dimage[xy] = shimage[xy]*dscale;
1946 kDose[ndose].addImage(dimage);
1948 if(DEBUG || kVerbose > 0)
G4cout <<
"[" <<
z <<
"]" << dimage[(size_t)(dsize*0.55)] <<
", ";
1950 if(DEBUG || kVerbose > 0) {
1951 for(
int j = 0; j < dsize; j++) {
1953 G4cout <<
"[" << j <<
"," <<
z <<
"]" 1954 << dimage[j] <<
", ";
1962 ifile.read((
char *)ctmp, 3*4);
1963 convertEndian(ctmp, iCenter[0]);
1964 convertEndian(ctmp+4, iCenter[1]);
1965 convertEndian(ctmp+8, iCenter[2]);
1966 for(
int i = 0; i < 3; i++) fCenter[i] = (
float)iCenter[i];
1967 kDose[ndose].setCenterPosition(fCenter);
1969 if(DEBUG || kVerbose > 0) {
1970 G4cout <<
"Dose dist. image relative location : (" 1971 << fCenter[0] <<
", " 1972 << fCenter[1] <<
", " 1973 << fCenter[2] <<
")" <<
G4endl;
1979 ifile.read((
char *)cname, 80);
1980 std::string dosename = cname;
1981 setDoseDistName(dosename, ndose);
1982 if(DEBUG || kVerbose > 0) {
1989 if(kPointerToROIData != 0) {
1994 ifile.read((
char *)ctmp, 3*
sizeof(
int));
1995 convertEndian(ctmp, size[0]);
1996 convertEndian(ctmp+
sizeof(
int), size[1]);
1997 convertEndian(ctmp+2*
sizeof(
int), size[2]);
1998 kRoi[0].setSize(size);
1999 if(DEBUG || kVerbose > 0) {
2000 G4cout <<
"ROI image size : (" 2008 ifile.read((
char *)ctmp,
sizeof(
short)*2);
2009 convertEndian(ctmp, minmax[0]);
2010 convertEndian(ctmp+
sizeof(
short), minmax[1]);
2011 kRoi[0].setMinMax(minmax);
2014 ifile.read((
char *)ctmp,
sizeof(
float));
2015 convertEndian(ctmp, scale);
2016 kRoi[0].setScale(dscale = scale);
2017 if(DEBUG || kVerbose > 0) {
2018 G4cout <<
"ROI image min., max., scale : " 2019 << minmax[0] <<
", " 2020 << minmax[1] <<
", " 2025 int rsize = size[0]*size[1];
2026 char * ri =
new char[rsize*
sizeof(short)];
2027 for(
int i = 0; i < size[2]; i++) {
2028 ifile.read((
char *)ri, rsize*
sizeof(
short));
2029 short * rimage =
new short[rsize];
2030 for(
int j = 0; j < rsize; j++) {
2031 convertEndian(ri+j*
sizeof(
short), rimage[j]);
2033 kRoi[0].addImage(rimage);
2039 ifile.read((
char *)ctmp, 3*
sizeof(
int));
2040 convertEndian(ctmp, iCenter[0]);
2041 convertEndian(ctmp+
sizeof(
int), iCenter[1]);
2042 convertEndian(ctmp+2*
sizeof(
int), iCenter[2]);
2043 for(
int i = 0; i < 3; i++) fCenter[i] = iCenter[i];
2044 kRoi[0].setCenterPosition(fCenter);
2045 if(DEBUG || kVerbose > 0) {
2046 G4cout <<
"ROI image relative location : (" 2047 << fCenter[0] <<
", " 2048 << fCenter[1] <<
", " 2049 << fCenter[2] <<
")" <<
G4endl;
2055 if(kPointerToTrackData != 0) {
2058 ifile.read((
char *)ctmp,
sizeof(
int));
2060 convertEndian(ctmp, ntrk);
2061 if(DEBUG || kVerbose > 0) {
2066 unsigned char rgb[3];
2067 for(
int i = 0; i < ntrk; i++) {
2071 ifile.read((
char *)ctmp,
sizeof(
int));
2073 convertEndian(ctmp, nsteps);
2076 ifile.read((
char *)rgb, 3);
2078 std::vector<float *> steps;
2080 for(
int j = 0; j < nsteps; j++) {
2082 float * steppoint =
new float[6];
2083 ifile.read((
char *)ctmp,
sizeof(
float)*6);
2085 for(
int k = 0; k < 6; k++) {
2086 convertEndian(ctmp+k*
sizeof(
float), steppoint[k]);
2089 steps.push_back(steppoint);
2093 addTrack(steps, rgb);
2095 if(DEBUG || kVerbose > 0) {
2098 for(
int j = 0; j < 3; j++)
G4cout << steps[0][j] <<
" ";
2099 int nstp = steps.size();
2101 for(
int j = 3; j < 6; j++)
G4cout << steps[nstp-1][j] <<
" ";
2103 for(
int j = 0; j < 3; j++)
G4cout << (
int)rgb[j] <<
" ";
2114 if(kPointerToDetectorData != 0) {
2117 ifile.read((
char *)ctmp,
sizeof(
int));
2119 convertEndian(ctmp, ndet);
2121 if(DEBUG || kVerbose > 0) {
2122 G4cout <<
"# of detectors : " 2126 for(
int nd = 0; nd < ndet; nd++) {
2129 ifile.read((
char *)ctmp,
sizeof(
int));
2131 convertEndian(ctmp, nedges);
2132 if(DEBUG || kVerbose > 0) {
2133 G4cout <<
"# of edges in a detector : " << nedges <<
G4endl;
2137 std::vector<float *> detector;
2139 for(
int ne = 0; ne < nedges; ne++) {
2141 ifile.read((
char *)cftmp,
sizeof(
float)*6);
2142 float * edgePoints =
new float[6];
2143 for(
int j = 0; j < 6; j++) convertEndian(&cftmp[
sizeof(
float)*j], edgePoints[j]);
2144 detector.push_back(edgePoints);
2148 if(DEBUG || kVerbose > 0) {
2149 G4cout <<
" first edge : (" << detector[0][0] <<
", " 2150 << detector[0][1] <<
", " 2151 << detector[0][2] <<
") - (" 2152 << detector[0][3] <<
", " 2153 << detector[0][4] <<
", " 2154 << detector[0][5] <<
")" <<
G4endl;
2158 unsigned char dcolor[3];
2159 ifile.read((
char *)dcolor, 3);
2160 if(DEBUG || kVerbose > 0) {
2161 G4cout <<
" detector color : rgb(" 2162 << (int)dcolor[0] <<
", " 2163 << (
int)dcolor[1] <<
", " 2164 << (int)dcolor[2] << G4endl;
2170 ifile.read((
char *)cname, 80);
2171 std::string dname = cname;
2172 if(DEBUG || kVerbose > 0) {
2177 addDetector(dname, detector, dcolor);
2188 kFileName = _filename;
2189 return retrieveData();
2198 std::ifstream ifile(kFileName.c_str(),
std::ios_base::in|std::ios_base::binary);
2201 G4cout <<
"Cannot open file: " << kFileName
2202 <<
" in G4GMocrenIO::retrieveData3()." <<
G4endl;
2211 ifile.read((
char *)verid, 8);
2215 ifile.read((
char *)&ver, 1);
2216 std::stringstream ss;
2218 kVersion = ss.str();
2219 if(DEBUG || kVerbose > 0)
G4cout <<
"File version : " << kVersion <<
G4endl;
2222 ifile.read((
char *)&kLittleEndianInput,
sizeof(
char));
2223 if(DEBUG || kVerbose > 0) {
2225 if(kLittleEndianInput == 1)
2234 ifile.read((
char *)ctmp, 4);
2235 convertEndian(ctmp, clength);
2238 ifile.read((
char *)cmt, clength);
2239 std::string scmt = cmt;
2241 if(DEBUG || kVerbose > 0) {
2242 G4cout <<
"Data comment : " 2247 ifile.read((
char *)ctmp, 12);
2248 convertEndian(ctmp, kVoxelSpacing[0]);
2249 convertEndian(ctmp+4, kVoxelSpacing[1]);
2250 convertEndian(ctmp+8, kVoxelSpacing[2]);
2251 if(DEBUG || kVerbose > 0) {
2252 G4cout <<
"Voxel spacing : (" 2253 << kVoxelSpacing[0] <<
", " 2254 << kVoxelSpacing[1] <<
", " 2261 ifile.read((
char *)ctmp, 4);
2262 convertEndian(ctmp, kPointerToModalityData);
2265 ifile.read((
char *)ctmp, 4);
2267 convertEndian(ctmp, nDoseDist);
2270 for(
int i = 0; i < nDoseDist; i++) {
2271 ifile.read((
char *)ctmp, 4);
2273 convertEndian(ctmp, dptr);
2274 addPointerToDoseDistData(dptr);
2278 ifile.read((
char *)ctmp, 4);
2279 convertEndian(ctmp, kPointerToROIData);
2282 ifile.read((
char *)ctmp, 4);
2283 convertEndian(ctmp, kPointerToTrackData);
2284 if(DEBUG || kVerbose > 0) {
2285 G4cout <<
"Each pointer to data : " 2286 << kPointerToModalityData <<
", ";
2287 for(
int i = 0; i < nDoseDist; i++)
2288 G4cout << kPointerToDoseDistData[0] <<
", ";
2289 G4cout << kPointerToROIData <<
", " 2290 << kPointerToTrackData <<
G4endl;
2293 if(kPointerToModalityData == 0 && kPointerToDoseDistData.size() == 0 &&
2294 kPointerToROIData == 0 && kPointerToTrackData == 0) {
2295 if(DEBUG || kVerbose > 0) {
2316 ifile.read(ctmp, 3*
sizeof(
int));
2317 convertEndian(ctmp, size[0]);
2318 convertEndian(ctmp+
sizeof(
int), size[1]);
2319 convertEndian(ctmp+2*
sizeof(
int), size[2]);
2320 if(DEBUG || kVerbose > 0) {
2321 G4cout <<
"Modality image size : (" 2327 kModality.setSize(size);
2337 if(kPointerToModalityData != 0) {
2340 ifile.read((
char *)ctmp, 4);
2341 convertEndian(ctmp, minmax[0]);
2342 convertEndian(ctmp+2, minmax[1]);
2343 kModality.setMinMax(minmax);
2347 ifile.read((
char *)munit, 12);
2348 std::string smunit = munit;
2349 setModalityImageUnit(smunit);
2352 ifile.read((
char *)ctmp, 4);
2353 convertEndian(ctmp, scale);
2354 kModality.setScale(dscale = scale);
2355 if(DEBUG || kVerbose > 0) {
2356 G4cout <<
"Modality image min., max., scale : " 2357 << minmax[0] <<
", " 2358 << minmax[1] <<
", " 2363 int psize = size[0]*size[1];
2364 if(DEBUG || kVerbose > 0)
G4cout <<
"Modality image (" << psize <<
"): ";
2365 char * cimage =
new char[psize*
sizeof(short)];
2366 for(
int i = 0; i < size[2]; i++) {
2367 ifile.read((
char *)cimage, psize*
sizeof(
short));
2368 short * mimage =
new short[psize];
2369 for(
int j = 0; j < psize; j++) {
2370 convertEndian(cimage+j*
sizeof(
short), mimage[j]);
2372 kModality.addImage(mimage);
2374 if(DEBUG || kVerbose > 0)
G4cout <<
"[" << i <<
"]" << mimage[(size_t)(psize*0.55)] <<
", ";
2380 size_t msize = minmax[1]-minmax[0]+1;
2381 if(DEBUG || kVerbose > 0)
G4cout <<
"msize: " << msize <<
G4endl;
2382 char * pdmap =
new char[msize*
sizeof(float)];
2383 ifile.read((
char *)pdmap, msize*
sizeof(
float));
2385 for(
int i = 0; i < (int)msize; i++) {
2386 convertEndian(pdmap+i*
sizeof(
float), ftmp);
2387 kModalityImageDensityMap.push_back(ftmp);
2390 if(DEBUG || kVerbose > 0) {
2391 G4cout <<
"density map : " << std::ends;
2392 for(
int i = 0; i < 10; i++)
2393 G4cout <<kModalityImageDensityMap[i] <<
", ";
2395 for(
int i = 0; i < 10; i++)
G4cout <<
"..";
2397 for(
size_t i =kModalityImageDensityMap.size() - 10; i <kModalityImageDensityMap.size(); i++)
2398 G4cout <<kModalityImageDensityMap[i] <<
", ";
2406 for(
int ndose = 0; ndose < nDoseDist; ndose++) {
2411 ifile.read((
char *)ctmp, 3*
sizeof(
int));
2412 convertEndian(ctmp, size[0]);
2413 convertEndian(ctmp+
sizeof(
int), size[1]);
2414 convertEndian(ctmp+2*
sizeof(
int), size[2]);
2415 if(DEBUG || kVerbose > 0) {
2416 G4cout <<
"Dose dist. image size : (" 2422 kDose[ndose].setSize(size);
2425 ifile.read((
char *)ctmp,
sizeof(
short)*2);
2426 convertEndian(ctmp, minmax[0]);
2427 convertEndian(ctmp+2, minmax[1]);
2431 ifile.read((
char *)dunit, 12);
2432 std::string sdunit = dunit;
2433 setDoseDistUnit(sdunit, ndose);
2434 if(DEBUG || kVerbose > 0) {
2439 ifile.read((
char *)ctmp, 4);
2440 convertEndian(ctmp, scale);
2441 kDose[ndose].setScale(dscale = scale);
2444 for(
int i = 0; i < 2; i++) dminmax[i] = minmax[i]*dscale;
2445 kDose[ndose].setMinMax(dminmax);
2447 if(DEBUG || kVerbose > 0) {
2448 G4cout <<
"Dose dist. image min., max., scale : " 2449 << dminmax[0] <<
", " 2450 << dminmax[1] <<
", " 2455 int dsize = size[0]*size[1];
2456 if(DEBUG || kVerbose > 0)
G4cout <<
"Dose dist. (" << dsize <<
"): ";
2457 char * di =
new char[dsize*
sizeof(short)];
2458 short * shimage =
new short[dsize];
2459 for(
int z = 0;
z < size[2];
z++) {
2460 ifile.read((
char *)di, dsize*
sizeof(
short));
2461 double * dimage =
new double[dsize];
2462 for(
int xy = 0; xy < dsize; xy++) {
2463 convertEndian(di+xy*
sizeof(
short), shimage[xy]);
2464 dimage[xy] = shimage[xy]*dscale;
2466 kDose[ndose].addImage(dimage);
2468 if(DEBUG || kVerbose > 0)
G4cout <<
"[" <<
z <<
"]" << dimage[(size_t)(dsize*0.55)] <<
", ";
2470 if(DEBUG || kVerbose > 0) {
2471 for(
int j = 0; j < dsize; j++) {
2473 G4cout <<
"[" << j <<
"," <<
z <<
"]" 2474 << dimage[j] <<
", ";
2482 ifile.read((
char *)ctmp, 3*4);
2483 convertEndian(ctmp, iCenter[0]);
2484 convertEndian(ctmp+4, iCenter[1]);
2485 convertEndian(ctmp+8, iCenter[2]);
2486 for(
int i = 0; i < 3; i++) fCenter[i] = (
float)iCenter[i];
2487 kDose[ndose].setCenterPosition(fCenter);
2489 if(DEBUG || kVerbose > 0) {
2490 G4cout <<
"Dose dist. image relative location : (" 2491 << fCenter[0] <<
", " 2492 << fCenter[1] <<
", " 2493 << fCenter[2] <<
")" <<
G4endl;
2500 if(kPointerToROIData != 0) {
2505 ifile.read((
char *)ctmp, 3*
sizeof(
int));
2506 convertEndian(ctmp, size[0]);
2507 convertEndian(ctmp+
sizeof(
int), size[1]);
2508 convertEndian(ctmp+2*
sizeof(
int), size[2]);
2509 kRoi[0].setSize(size);
2510 if(DEBUG || kVerbose > 0) {
2511 G4cout <<
"ROI image size : (" 2519 ifile.read((
char *)ctmp,
sizeof(
short)*2);
2520 convertEndian(ctmp, minmax[0]);
2521 convertEndian(ctmp+
sizeof(
short), minmax[1]);
2522 kRoi[0].setMinMax(minmax);
2525 ifile.read((
char *)ctmp,
sizeof(
float));
2526 convertEndian(ctmp, scale);
2527 kRoi[0].setScale(dscale = scale);
2528 if(DEBUG || kVerbose > 0) {
2529 G4cout <<
"ROI image min., max., scale : " 2530 << minmax[0] <<
", " 2531 << minmax[1] <<
", " 2536 int rsize = size[0]*size[1];
2537 char * ri =
new char[rsize*
sizeof(short)];
2538 for(
int i = 0; i < size[2]; i++) {
2539 ifile.read((
char *)ri, rsize*
sizeof(
short));
2540 short * rimage =
new short[rsize];
2541 for(
int j = 0; j < rsize; j++) {
2542 convertEndian(ri+j*
sizeof(
short), rimage[j]);
2544 kRoi[0].addImage(rimage);
2550 ifile.read((
char *)ctmp, 3*
sizeof(
int));
2551 convertEndian(ctmp, iCenter[0]);
2552 convertEndian(ctmp+
sizeof(
int), iCenter[1]);
2553 convertEndian(ctmp+2*
sizeof(
int), iCenter[2]);
2554 for(
int i = 0; i < 3; i++) fCenter[i] = iCenter[i];
2555 kRoi[0].setCenterPosition(fCenter);
2556 if(DEBUG || kVerbose > 0) {
2557 G4cout <<
"ROI image relative location : (" 2558 << fCenter[0] <<
", " 2559 << fCenter[1] <<
", " 2560 << fCenter[2] <<
")" <<
G4endl;
2566 if(kPointerToTrackData != 0) {
2569 ifile.read((
char *)ctmp,
sizeof(
int));
2571 convertEndian(ctmp, ntrk);
2572 if(DEBUG || kVerbose > 0) {
2577 std::vector<float *> trkv4;
2580 for(
int i = 0; i < ntrk; i++) {
2581 float *
tp =
new float[6];
2583 ifile.read((
char *)ctmp,
sizeof(
float)*3);
2584 if(DEBUG || kVerbose > 0)
if(i < 10)
G4cout << i <<
": " ;
2585 for(
int j = 0; j < 3; j++) {
2586 convertEndian(ctmp+j*
sizeof(
float), tp[j]);
2587 if(DEBUG || kVerbose > 0)
if(i < 10)
G4cout << tp[j] <<
", ";
2590 ifile.read((
char *)ctmp,
sizeof(
float)*3);
2591 for(
int j = 0; j < 3; j++) {
2592 convertEndian(ctmp+j*
sizeof(
float), tp[j+3]);
2593 if(DEBUG || kVerbose > 0)
if(i < 10)
G4cout << tp[j+3] <<
", ";
2599 trkv4.push_back(tp);
2603 unsigned char trkcolorv4[3];
2606 for(
int i = 0; i < ntrk; i++) {
2607 unsigned char * rgb =
new unsigned char[3];
2608 ifile.read((
char *)rgb, 3);
2612 for(
int j = 0; j < 3; j++) trkcolorv4[j] = rgb[j];
2613 std::vector<float *> trk;
2614 trk.push_back(trkv4[i]);
2615 addTrack(trk, trkcolorv4);
2626 kFileName = _filename;
2627 return retrieveData();
2636 std::ifstream ifile(kFileName.c_str(),
std::ios_base::in|std::ios_base::binary);
2639 G4cout <<
"Cannot open file: " << kFileName
2640 <<
" in G4GMocrenIO::retrieveData2()." <<
G4endl;
2649 ifile.read((
char *)verid, 8);
2653 ifile.read((
char *)&ver, 1);
2654 std::stringstream ss;
2656 kVersion = ss.str();
2657 if(DEBUG || kVerbose > 0)
G4cout <<
"File version : " << kVersion <<
G4endl;
2661 ifile.read((
char *)idtmp,
IDLENGTH);
2668 ifile.read((
char *)&kLittleEndianInput,
sizeof(
char));
2669 if(DEBUG || kVerbose > 0) {
2671 if(kLittleEndianInput == 1)
2679 ifile.read((
char *)ctmp, 12);
2680 convertEndian(ctmp, kVoxelSpacing[0]);
2681 convertEndian(ctmp+4, kVoxelSpacing[1]);
2682 convertEndian(ctmp+8, kVoxelSpacing[2]);
2683 if(DEBUG || kVerbose > 0) {
2684 G4cout <<
"Voxel spacing : (" 2685 << kVoxelSpacing[0] <<
", " 2686 << kVoxelSpacing[1] <<
", " 2693 ifile.read((
char *)ctmp, 4);
2694 convertEndian(ctmp, kPointerToModalityData);
2698 ifile.read((
char *)ctmp, 4);
2699 convertEndian(ctmp, ptddd);
2700 kPointerToDoseDistData.push_back(ptddd);
2703 ifile.read((
char *)ctmp, 4);
2704 convertEndian(ctmp, kPointerToROIData);
2707 ifile.read((
char *)ctmp, 4);
2708 convertEndian(ctmp, kPointerToTrackData);
2709 if(DEBUG || kVerbose > 0) {
2710 G4cout <<
"Each pointer to data : " 2711 << kPointerToModalityData <<
", " 2712 << kPointerToDoseDistData[0] <<
", " 2713 << kPointerToROIData <<
", " 2714 << kPointerToTrackData <<
G4endl;
2717 if(kPointerToModalityData == 0 && kPointerToDoseDistData.size() == 0 &&
2718 kPointerToROIData == 0 && kPointerToTrackData == 0) {
2719 if(DEBUG || kVerbose > 0) {
2740 ifile.read(ctmp, 3*
sizeof(
int));
2741 convertEndian(ctmp, size[0]);
2742 convertEndian(ctmp+
sizeof(
int), size[1]);
2743 convertEndian(ctmp+2*
sizeof(
int), size[2]);
2744 if(DEBUG || kVerbose > 0) {
2745 G4cout <<
"Modality image size : (" 2751 kModality.setSize(size);
2761 if(kPointerToModalityData != 0) {
2764 ifile.read((
char *)ctmp, 4);
2765 convertEndian(ctmp, minmax[0]);
2766 convertEndian(ctmp+2, minmax[1]);
2767 kModality.setMinMax(minmax);
2770 ifile.read((
char *)ctmp, 4);
2771 convertEndian(ctmp, scale);
2772 kModality.setScale(dscale = scale);
2773 if(DEBUG || kVerbose > 0) {
2774 G4cout <<
"Modality image min., max., scale : " 2775 << minmax[0] <<
", " 2776 << minmax[1] <<
", " 2781 int psize = size[0]*size[1];
2782 if(DEBUG || kVerbose > 0)
G4cout <<
"Modality image (" << psize <<
"): ";
2783 char * cimage =
new char[psize*
sizeof(short)];
2784 for(
int i = 0; i < size[2]; i++) {
2785 ifile.read((
char *)cimage, psize*
sizeof(
short));
2786 short * mimage =
new short[psize];
2787 for(
int j = 0; j < psize; j++) {
2788 convertEndian(cimage+j*
sizeof(
short), mimage[j]);
2790 kModality.addImage(mimage);
2792 if(DEBUG || kVerbose > 0)
G4cout <<
"[" << i <<
"]" << mimage[(size_t)(psize*0.55)] <<
", ";
2798 size_t msize = minmax[1]-minmax[0]+1;
2799 if(DEBUG || kVerbose > 0)
G4cout <<
"msize: " << msize <<
G4endl;
2800 char * pdmap =
new char[msize*
sizeof(float)];
2801 ifile.read((
char *)pdmap, msize*
sizeof(
float));
2803 for(
int i = 0; i < (int)msize; i++) {
2804 convertEndian(pdmap+i*
sizeof(
float), ftmp);
2805 kModalityImageDensityMap.push_back(ftmp);
2808 if(DEBUG || kVerbose > 0) {
2809 G4cout <<
"density map : " << std::ends;
2810 for(
int i = 0; i < 10; i++)
2811 G4cout <<kModalityImageDensityMap[i] <<
", ";
2813 for(
int i = 0; i < 10; i++)
G4cout <<
"..";
2815 for(
size_t i =kModalityImageDensityMap.size() - 10; i <kModalityImageDensityMap.size(); i++)
2816 G4cout <<kModalityImageDensityMap[i] <<
", ";
2824 if(kPointerToDoseDistData[0] != 0) {
2829 ifile.read((
char *)ctmp, 3*
sizeof(
int));
2830 convertEndian(ctmp, size[0]);
2831 convertEndian(ctmp+
sizeof(
int), size[1]);
2832 convertEndian(ctmp+2*
sizeof(
int), size[2]);
2833 if(DEBUG || kVerbose > 0) {
2834 G4cout <<
"Dose dist. image size : (" 2840 kDose[0].setSize(size);
2843 ifile.read((
char *)ctmp,
sizeof(
short)*2);
2844 convertEndian(ctmp, minmax[0]);
2845 convertEndian(ctmp+2, minmax[1]);
2847 ifile.read((
char *)ctmp,
sizeof(
float));
2848 convertEndian(ctmp, scale);
2849 kDose[0].setScale(dscale = scale);
2852 for(
int i = 0; i < 2; i++) dminmax[i] = minmax[i]*dscale;
2853 kDose[0].setMinMax(dminmax);
2855 if(DEBUG || kVerbose > 0) {
2856 G4cout <<
"Dose dist. image min., max., scale : " 2857 << dminmax[0] <<
", " 2858 << dminmax[1] <<
", " 2863 int dsize = size[0]*size[1];
2864 if(DEBUG || kVerbose > 0)
G4cout <<
"Dose dist. (" << dsize <<
"): ";
2865 char * di =
new char[dsize*
sizeof(short)];
2866 short * shimage =
new short[dsize];
2867 for(
int z = 0;
z < size[2];
z++) {
2868 ifile.read((
char *)di, dsize*
sizeof(
short));
2869 double * dimage =
new double[dsize];
2870 for(
int xy = 0; xy < dsize; xy++) {
2871 convertEndian(di+xy*
sizeof(
short), shimage[xy]);
2872 dimage[xy] = shimage[xy]*dscale;
2874 kDose[0].addImage(dimage);
2876 if(DEBUG || kVerbose > 0)
G4cout <<
"[" <<
z <<
"]" << dimage[(size_t)(dsize*0.55)] <<
", ";
2878 if(DEBUG || kVerbose > 0) {
2879 for(
int j = 0; j < dsize; j++) {
2881 G4cout <<
"[" << j <<
"," <<
z <<
"]" 2882 << dimage[j] <<
", ";
2924 ifile.read((
char *)ctmp, 3*
sizeof(
int));
2925 convertEndian(ctmp, iCenter[0]);
2926 convertEndian(ctmp+
sizeof(
int), iCenter[1]);
2927 convertEndian(ctmp+2*
sizeof(
int), iCenter[2]);
2928 for(
int i = 0; i < 3; i++) fCenter[i] = (
float)iCenter[i];
2929 kDose[0].setCenterPosition(fCenter);
2931 if(DEBUG || kVerbose > 0) {
2932 G4cout <<
"Dose dist. image relative location : (" 2933 << fCenter[0] <<
", " 2934 << fCenter[1] <<
", " 2935 << fCenter[2] <<
")" <<
G4endl;
2942 if(kPointerToROIData != 0) {
2947 ifile.read((
char *)ctmp, 3*
sizeof(
int));
2948 convertEndian(ctmp, size[0]);
2949 convertEndian(ctmp+
sizeof(
int), size[1]);
2950 convertEndian(ctmp+2*
sizeof(
int), size[2]);
2951 kRoi[0].setSize(size);
2952 if(DEBUG || kVerbose > 0) {
2953 G4cout <<
"ROI image size : (" 2961 ifile.read((
char *)ctmp,
sizeof(
short)*2);
2962 convertEndian(ctmp, minmax[0]);
2963 convertEndian(ctmp+
sizeof(
short), minmax[1]);
2964 kRoi[0].setMinMax(minmax);
2967 ifile.read((
char *)ctmp,
sizeof(
float));
2968 convertEndian(ctmp, scale);
2969 kRoi[0].setScale(dscale = scale);
2970 if(DEBUG || kVerbose > 0) {
2971 G4cout <<
"ROI image min., max., scale : " 2972 << minmax[0] <<
", " 2973 << minmax[1] <<
", " 2978 int rsize = size[0]*size[1];
2979 char * ri =
new char[rsize*
sizeof(short)];
2980 for(
int i = 0; i < size[2]; i++) {
2981 ifile.read((
char *)ri, rsize*
sizeof(
short));
2982 short * rimage =
new short[rsize];
2983 for(
int j = 0; j < rsize; j++) {
2984 convertEndian(ri+j*
sizeof(
short), rimage[j]);
2986 kRoi[0].addImage(rimage);
2992 ifile.read((
char *)ctmp, 3*
sizeof(
int));
2993 convertEndian(ctmp, iCenter[0]);
2994 convertEndian(ctmp+
sizeof(
int), iCenter[1]);
2995 convertEndian(ctmp+2*
sizeof(
int), iCenter[2]);
2996 for(
int i = 0; i < 3; i++) fCenter[i] = iCenter[i];
2997 kRoi[0].setCenterPosition(fCenter);
2998 if(DEBUG || kVerbose > 0) {
2999 G4cout <<
"ROI image relative location : (" 3000 << fCenter[0] <<
", " 3001 << fCenter[1] <<
", " 3002 << fCenter[2] <<
")" <<
G4endl;
3008 if(kPointerToTrackData != 0) {
3011 ifile.read((
char *)ctmp,
sizeof(
int));
3013 convertEndian(ctmp, ntrk);
3014 if(DEBUG || kVerbose > 0) {
3019 unsigned char trkcolorv4[3] = {255, 0, 0};
3021 for(
int i = 0; i < ntrk; i++) {
3022 float *
tp =
new float[6];
3024 std::vector<float *> trkv4;
3026 ifile.read((
char *)ctmp,
sizeof(
float)*3);
3027 if(DEBUG || kVerbose > 0)
if(i < 10)
G4cout << i <<
": " ;
3028 for(
int j = 0; j < 3; j++) {
3029 convertEndian(ctmp+j*
sizeof(
float), tp[j]);
3030 if(DEBUG || kVerbose > 0)
if(i < 10)
G4cout << tp[j] <<
", ";
3033 ifile.read((
char *)ctmp,
sizeof(
float)*3);
3034 for(
int j = 0; j < 3; j++) {
3035 convertEndian(ctmp+j*
sizeof(
float), tp[j+3]);
3036 if(DEBUG || kVerbose > 0)
if(i < 10)
G4cout << tp[j+3] <<
", ";
3039 kSteps.push_back(tp);
3041 trkv4.push_back(tp);
3042 addTrack(trkv4, trkcolorv4);
3097 kFileName = _filename;
3098 return retrieveData();
3108 char cmonth[12][4] = {
"Jan",
"Feb",
"Mar",
"Apr",
3109 "May",
"Jun",
"Jul",
"Aug",
3110 "Sep",
"Oct",
"Nov",
"Dec"};
3111 std::stringstream ss;
3112 ss << std::setfill(
'0')
3114 << ti->tm_hour <<
":" 3116 << ti->tm_min <<
":" 3118 << ti->tm_sec <<
"," 3119 << cmonth[ti->tm_mon] <<
"." 3121 << ti->tm_mday <<
"," 3122 << ti->tm_year+1900;
3137 for(
int i = 0; i < 3; i++) kVoxelSpacing[i] = _spacing[i];
3140 for(
int i = 0; i < 3; i++) _spacing[i] = kVoxelSpacing[i];
3145 return kNumberOfEvents;
3148 kNumberOfEvents = _numberOfEvents;
3156 kPointerToModalityData = _pointer;
3159 return kPointerToModalityData;
3163 kPointerToDoseDistData.push_back(_pointer);
3166 if(kPointerToDoseDistData.size() == 0 ||
3167 kPointerToDoseDistData.size() < (size_t)_elem)
3170 return kPointerToDoseDistData[_elem];
3175 kPointerToROIData = _pointer;
3178 return kPointerToROIData;
3182 kPointerToTrackData = _pointer;
3185 return kPointerToTrackData;
3192 unsigned int pointer = 1070;
3193 int nDoseDist = getNumDoseDist();
3194 pointer += nDoseDist*4;
3196 setPointerToModalityData(pointer);
3201 getModalityImageSize(msize);
3203 getModalityImageMinMax(mminmax);
3204 int pmsize = 2*msize[0]*msize[1]*msize[2];
3205 int pmmap = 4*(mminmax[1] - mminmax[0] + 1);
3206 pointer += 32 + pmsize + pmmap;
3208 kPointerToDoseDistData.clear();
3209 if(nDoseDist == 0) {
3210 unsigned int pointer0 = 0;
3211 addPointerToDoseDistData(pointer0);
3213 for(
int ndose = 0; ndose < nDoseDist; ndose++) {
3214 addPointerToDoseDistData(pointer);
3216 getDoseDistSize(dsize);
3217 pointer += 44 + dsize[0]*dsize[1]*dsize[2]*2 + 80;
3222 setPointerToROIData(pointer);
3226 int prsize = 2*rsize[0]*rsize[1]*rsize[2];
3227 pointer += 20 + prsize + 12;
3229 unsigned int pointer0 = 0;
3230 setPointerToROIData(pointer0);
3234 int ntrk = kTracks.size();
3236 setPointerToTrackData(pointer);
3239 for(
int nt = 0; nt < ntrk; nt++) {
3240 int nsteps = kTracks[nt].getNumberOfSteps();
3241 pointer += 4 + 3 + nsteps*(4*6);
3244 unsigned int pointer0 = 0;
3245 setPointerToTrackData(pointer0);
3247 if(kVerbose > 0)
G4cout <<
" pointer to the track data :" 3248 << kPointerToTrackData <<
G4endl;
3251 int ndet = kDetectors.size();
3253 kPointerToDetectorData = pointer;
3255 kPointerToDetectorData = 0;
3257 if(kVerbose > 0)
G4cout <<
" pointer to the detector data :" 3258 << kPointerToDetectorData <<
G4endl;
3266 unsigned int pointer = 1066;
3267 int nDoseDist = getNumDoseDist();
3268 pointer += nDoseDist*4;
3270 setPointerToModalityData(pointer);
3275 getModalityImageSize(msize);
3277 getModalityImageMinMax(mminmax);
3278 int pmsize = 2*msize[0]*msize[1]*msize[2];
3279 int pmmap = 4*(mminmax[1] - mminmax[0] + 1);
3280 pointer += 32 + pmsize + pmmap;
3282 kPointerToDoseDistData.clear();
3283 if(nDoseDist == 0) {
3284 unsigned int pointer0 = 0;
3285 addPointerToDoseDistData(pointer0);
3287 for(
int ndose = 0; ndose < nDoseDist; ndose++) {
3288 addPointerToDoseDistData(pointer);
3290 getDoseDistSize(dsize);
3291 pointer += 44 + dsize[0]*dsize[1]*dsize[2]*2;
3296 setPointerToROIData(pointer);
3300 int prsize = 2*rsize[0]*rsize[1]*rsize[2];
3301 pointer += 20 + prsize + 12;
3303 unsigned int pointer0 = 0;
3304 setPointerToROIData(pointer0);
3308 if(getNumTracks() != 0)
3309 setPointerToTrackData(pointer);
3311 unsigned int pointer0 = 0;
3312 setPointerToTrackData(pointer0);
3321 unsigned int pointer = 65;
3322 setPointerToModalityData(pointer);
3326 getModalityImageSize(msize);
3328 getModalityImageMinMax(mminmax);
3329 int pmsize = 2*msize[0]*msize[1]*msize[2];
3330 int pmmap = 4*(mminmax[1] - mminmax[0] + 1);
3331 pointer += 20 + pmsize + pmmap;
3333 getDoseDistSize(dsize);
3334 kPointerToDoseDistData.clear();
3336 kPointerToDoseDistData.push_back(pointer);
3338 int pdsize = 2*dsize[0]*dsize[1]*dsize[2];
3339 pointer += 20 + pdsize + 12;
3341 unsigned int pointer0 = 0;
3342 kPointerToDoseDistData.push_back(pointer0);
3349 setPointerToROIData(pointer);
3350 int prsize = 2*rsize[0]*rsize[1]*rsize[2];
3351 pointer += 20 + prsize + 12;
3354 unsigned int pointer0 = 0;
3355 setPointerToROIData(pointer0);
3359 if(getNumTracks() != 0)
3360 setPointerToTrackData(pointer);
3362 unsigned int pointer0 = 0;
3363 setPointerToTrackData(pointer0);
3372 kModality.getSize(_size);
3376 kModality.setSize(_size);
3382 kModality.setScale(_scale);
3386 return kModality.getScale();
3392 kModality.addImage(_image);
3396 return kModality.getImage(_z);
3400 kModality.clearImage();
3404 kModalityImageDensityMap = _map;
3407 return kModalityImageDensityMap;
3412 kModality.setMinMax(_minmax);
3418 kModality.getMinMax(minmax);
3419 for(
int i = 0; i < 2; i++) _minmax[i] = minmax[i];
3424 kModality.getMinMax(minmax);
3430 kModality.getMinMax(minmax);
3436 kModality.setCenterPosition(_center);
3441 for(
int i = 0; i < 3; i++) _center[i] = 0;
3443 kModality.getCenterPosition(_center);
3447 return kModalityUnit;
3450 kModalityUnit = _unit;
3455 int nmap = (int)kModalityImageDensityMap.size();
3458 kModality.getMinMax(minmax);
3460 for(
int i = 0; i < nmap; i++) {
3462 if(_dens <= kModalityImageDensityMap[i]) {
3463 rval = i + minmax[0];
3476 kDose.push_back(doseData);
3479 return (
int)kDose.size();
3485 if(kDoseUnit.size() >
static_cast<size_t>(_num))
return kDoseUnit;
3491 if(_unit.size() >
static_cast<size_t>(_num)) kDoseUnit = _unit;
3501 for(
int i = 0; i < 3; i++) _size[i] = 0;
3503 kDose[_num].getSize(_size);
3507 kDose[_num].setSize(_size);
3515 double scale = kDose[_num].getScale();
3516 for(
int i = 0; i < 2; i++) minmax[i] = (
double)_minmax[i]*
scale;
3517 kDose[_num].setMinMax(minmax);
3522 for(
int i = 0; i < 2; i++) _minmax[i] = 0;
3525 kDose[_num].getMinMax(minmax);
3526 double scale = kDose[_num].getScale();
3527 for(
int i = 0; i < 2; i++) _minmax[i] = (
short)(minmax[i]/scale+0.5);
3532 kDose[_num].setMinMax(_minmax);
3537 for(
int i = 0; i < 2; i++) _minmax[i] = 0.;
3539 kDose[_num].getMinMax(_minmax);
3545 kDose[_num].setScale(_scale);
3552 return kDose[_num].getScale();
3567 kDose[_num].getSize(size);
3568 int dsize = size[0]*size[1];
3569 double * ddata =
new double[dsize];
3570 double scale = kDose[_num].getScale();
3572 kDose[_num].getMinMax(minmax);
3573 for(
int xy = 0; xy < dsize; xy++) {
3574 ddata[xy] = _image[xy]*
scale;
3575 if(ddata[xy] < minmax[0]) minmax[0] = ddata[xy];
3576 if(ddata[xy] > minmax[1]) minmax[1] = ddata[xy];
3578 kDose[_num].addImage(ddata);
3581 kDose[_num].setMinMax(minmax);
3587 G4cout <<
"In G4GMocrenIO::getShortDoseDist(), " 3588 <<
"first argument is NULL pointer. " 3589 <<
"The argument must be allocated array." 3598 kDose[_num].getSize(size);
3600 double * ddata = kDose[_num].getImage(_z);
3601 double scale = kDose[_num].getScale();
3602 for(
int xy = 0; xy < size[0]*size[1]; xy++) {
3603 _data[xy] = (short)(ddata[xy]/scale+0.5);
3607 double scale = kDose[_num].getScale();
3609 kDose[_num].getMinMax(minmax);
3610 for(
int i = 0; i < 2; i++)
3611 _minmax[i] = (
short)(minmax[i]/scale+0.5);
3616 kDose[_num].addImage(_image);
3624 image = kDose[_num].getImage(_z);
3644 getDoseDistSize(size, _num);
3645 std::vector<double *> dosedist = kDose[_num].getImage();
3647 int nimg = size[0]*size[1];
3648 for(
int z = 0;
z < size[2];
z++) {
3649 for(
int xy = 0; xy < nimg; xy++) {
3650 dosedist[
z][xy] += _image[
z][xy];
3660 kDose[_num].setCenterPosition(_center);
3665 for(
int i = 0; i < 3; i++) _center[i] = 0;
3667 kDose[_num].getCenterPosition(_center);
3672 kDose[_num].setName(_name);
3680 return kDose[_num].getName();
3684 std::vector<class GMocrenDataPrimitive<double> >::iterator itr;
3685 for(itr = kDose.begin(); itr != kDose.end(); itr++) {
3686 _dose.push_back(*itr);
3691 if(kDose.size() != _dose.size()) {
3693 G4cout <<
"G4GMocrenIO::mergeDoseDist() : Error" <<
G4endl;
3694 G4cout <<
" Unable to merge the dose distributions,"<<
G4endl;
3695 G4cout <<
" because of different size of dose maps."<<
G4endl;
3700 int num = kDose.size();
3701 std::vector<class GMocrenDataPrimitive<double> >::iterator itr1 = kDose.begin();
3702 std::vector<class GMocrenDataPrimitive<double> >::iterator itr2 = _dose.begin();
3703 for(
int i = 0; i < num; i++, itr1++, itr2++) {
3706 G4cout <<
"merged dose distribution [" << i <<
"]" <<
G4endl;
3715 if(!isDoseEmpty()) {
3716 for(
int i = 0; i < getNumDoseDist(); i++) {
3739 for(
int i = 0; i < (int)kDose.size(); i++) {
3740 kDose[i].getMinMax(minmax);
3742 kDose[i].setScale(scale);
3752 kRoi.push_back(roiData);
3755 return (
int)kRoi.size();
3761 kRoi[_num].setScale(_scale);
3768 return kRoi[_num].getScale();
3773 kRoi[_num].addImage(_image);
3780 return kRoi[_num].getImage(_z);
3785 return kRoi[_num].setSize(_size);
3790 for(
int i = 0; i < 3; i++) _size[i] = 0;
3792 return kRoi[_num].getSize(_size);
3797 kRoi[_num].setMinMax(_minmax);
3802 for(
int i = 0; i < 2; i++) _minmax[i] = 0;
3804 kRoi[_num].getMinMax(_minmax);
3809 kRoi[_num].setCenterPosition(_center);
3814 for(
int i = 0; i < 3; i++) _center[i] = 0;
3816 kRoi[_num].getCenterPosition(_center);
3822 for(
int i = 0; i < getNumROI(); i++) {
3844 return (
int)kSteps.size();
3847 return (
int)kTracks.size();
3850 kSteps.push_back(_tracks);
3859 kStepColors.push_back(_colors);
3862 kStepColors = _trackColors;
3868 std::vector<unsigned char *> & _colors) {
3869 std::vector<float *>::iterator titr;
3870 for(titr = kSteps.begin(); titr != kSteps.end(); titr++) {
3871 float * pts =
new float[6];
3872 for(
int i = 0; i < 6; i++) {
3873 pts[i] = (*titr)[i];
3875 _tracks.push_back(pts);
3878 std::vector<unsigned char *>::iterator citr;
3879 for(citr = kStepColors.begin(); citr != kStepColors.end(); citr++) {
3880 unsigned char * pts =
new unsigned char[3];
3881 for(
int i = 0; i < 3; i++) {
3882 pts[i] = (*citr)[i];
3884 _colors.push_back(pts);
3888 std::vector<unsigned char *> & _colors) {
3889 std::vector<float *>::iterator titr;
3890 for(titr = _tracks.begin(); titr != _tracks.end(); titr++) {
3894 std::vector<unsigned char *>::iterator citr;
3895 for(citr = _colors.begin(); citr != _colors.end(); citr++) {
3896 addTrackColor(*citr);
3901 std::vector<float *>::iterator itr = _steps.begin();
3902 std::vector<struct GMocrenTrack::Step> steps;
3903 for(; itr != _steps.end(); itr++) {
3905 for(
int i = 0; i < 3; i++) {
3909 steps.push_back(step);
3914 kTracks.push_back(track);
3918 std::vector<unsigned char *> & _color) {
3920 if(_num > (
int)kTracks.size()) {
3927 unsigned char * color =
new unsigned char[3];
3928 kTracks[_num].getColor(color);
3929 _color.push_back(color);
3932 int nsteps = kTracks[_num].getNumberOfSteps();
3933 for(
int isteps = 0; isteps < nsteps; isteps++) {
3934 float * stepPoints =
new float[6];
3935 kTracks[_num].getStep(stepPoints[0], stepPoints[1], stepPoints[2],
3936 stepPoints[3], stepPoints[4], stepPoints[5],
3938 _steps.push_back(stepPoints);
3943 std::vector<class GMocrenTrack>::iterator itr = kTracks.begin();
3944 for(; itr != kTracks.end(); itr++) {
3945 itr->translate(_translate);
3954 return (
int)kDetectors.size();
3957 std::vector<float *> & _det,
3958 unsigned char _color[3]) {
3960 std::vector<float *>::iterator itr = _det.begin();
3961 std::vector<struct GMocrenDetector::Edge> edges;
3962 for(; itr != _det.end(); itr++) {
3964 for(
int i = 0; i < 3; i++) {
3968 edges.push_back(edge);
3974 kDetectors.push_back(detector);
3979 std::vector<unsigned char *> & _color,
3980 std::string & _detName) {
3982 if(_num > (
int)kDetectors.size()) {
3991 _detName = kDetectors[_num].getName();
3993 unsigned char * color =
new unsigned char[3];
3994 kDetectors[_num].getColor(color);
3995 _color.push_back(color);
3998 int nedges = kDetectors[_num].getNumberOfEdges();
3999 for(
int ne = 0; ne < nedges; ne++) {
4000 float * edgePoints =
new float[6];
4001 kDetectors[_num].getEdge(edgePoints[0], edgePoints[1], edgePoints[2],
4002 edgePoints[3], edgePoints[4], edgePoints[5],
4004 _edges.push_back(edgePoints);
4009 std::vector<class GMocrenDetector>::iterator itr = kDetectors.begin();
4010 for(; itr != kDetectors.end(); itr++) {
4011 itr->translate(_translate);
4016 template <
typename T>
4019 if((kLittleEndianOutput && !kLittleEndianInput) ||
4020 (!kLittleEndianOutput && kLittleEndianInput)) {
4022 const int SIZE =
sizeof(_rval);
4024 for(
int i = 0; i < SIZE/2; i++) {
4026 _val[i] = _val[SIZE - 1 - i];
4027 _val[SIZE - 1 - i] = ctemp;
4034 template <
typename T>
4037 const int SIZE =
sizeof(_rval);
4043 for(
int i = 0; i < SIZE; i++) {
4044 uni.cu[i] = _val[SIZE-1-i];
void getEdge(float &_startx, float &_starty, float &_startz, float &_endx, float &_endy, float &_endz, int _num)
void getModalityImageSize(int _size[3])
std::vector< T * > kImage
void convertEndian(char *, Type &)
unsigned int getPointerToTrackData()
static std::vector< float > kModalityImageDensityMap
void getModalityCenterPosition(float _center[3])
void setVerboseLevel(int _level)
short convertDensityToHU(float &_dens)
void setDoseDistUnit(std::string &_unit, int _num=0)
double getModalityImageScale()
unsigned int getPointerToROIData()
void setVersion(std::string &_version)
double getDoseDistScale(int _num=0)
void clearModalityImage()
static char kLittleEndianOutput
void addDetector(std::string &_name, std::vector< float *> &_det, unsigned char _color[3])
double getROIScale(int _num=0)
void setROI(short *_image, int _num=0)
void addTrack(float *_tracks)
std::vector< float > & getModalityImageDensityMap()
std::vector< float * > & getTracks()
unsigned int getPointerToModalityData()
void invertByteOrder(char *_val, T &_rval)
short * getROI(int _z, int _num=0)
void setDoseDistMinMax(short _minmax[2], int _num=0)
void setModalityImageUnit(std::string &_unit)
static std::vector< class GMocrenDataPrimitive< short > > kRoi
void setTrack(std::vector< struct Step > &_aTrack)
void setModalityImageSize(int _size[3])
void getShortDoseDist(short *_data, int _z, int _num=0)
void setTracks(std::vector< float *> &_tracks)
short getModalityImageMax()
std::vector< struct Step > kTrack
std::vector< unsigned char * > & getTrackColors()
GMocrenDataPrimitive< T > & operator=(const GMocrenDataPrimitive< T > &_right)
void getROICenterPosition(float _center[3], int _num=0)
GMocrenDataPrimitive< T > & operator+(const GMocrenDataPrimitive< T > &_right)
static std::vector< class GMocrenDataPrimitive< double > > kDose
void translate(std::vector< float > &_tranlate)
std::string getDoseDistName(int _num=0)
void setROIMinMax(short _minmax[2], int _num=0)
void setTrackColors(std::vector< unsigned char *> &_trackColors)
static std::vector< unsigned char * > kStepColors
void translateDetector(std::vector< float > &_translate)
void getDoseDistSize(int _size[3], int _num=0)
static std::vector< class GMocrenDetector > kDetectors
static float kVoxelSpacing[3]
void setDoseDist(double *_image, int _num=0)
double * getDoseDist(int _z, int _num=0)
void setColor(unsigned char _color[3])
void setPointerToROIData(unsigned int &_pointer)
void addTrackColor(unsigned char *_colors)
G4GLOB_DLL std::ostream G4cout
static char kLittleEndianInput
static std::string kVersion
std::vector< T * > & getImage()
void getShortDoseDistMinMax(short _minmax[2], int _num=0)
void setScale(double &_scale)
void getCenterPosition(float _center[3])
void setMinMax(T _minmax[2])
void setROICenterPosition(float _center[3], int _num=0)
static int kNumberOfEvents
GMocrenDataPrimitive< T > & operator+=(const GMocrenDataPrimitive< T > &_right)
void addEdge(float _startx, float _starty, float _startz, float _endx, float _endy, float _endz)
void setImage(std::vector< T *> &_image)
void getROISize(int _size[3], int _num=0)
void setModalityImageMinMax(short _minmax[2])
std::string getDoseDistUnit(int _num=0)
std::string & getVersion()
void setModalityImage(short *_image)
void setCenterPosition(float _center[3])
void setVoxelSpacing(float _spacing[3])
void getTrack(int _num, std::vector< float *> &_steps, std::vector< unsigned char * > &_color)
void setSize(int _size[3])
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
void copyDoseDist(std::vector< class GMocrenDataPrimitive< double > > &_dose)
static unsigned int kPointerToModalityData
void getDetector(int _num, std::vector< float *> &_edges, std::vector< unsigned char *> &_color, std::string &_detectorName)
static std::vector< class GMocrenTrack > kTracks
void getMinMax(T _minmax[2])
short * getModalityImage(int _z)
void getModalityImageMinMax(short _minmax[2])
void translate(std::vector< float > &_tranlate)
bool addDoseDist(std::vector< double *> &_image, int _num=0)
void getStep(float &_startx, float &_starty, float &_startz, float &_endx, float &_endy, float &_endz, int _num)
void setModalityImageScale(double &_scale)
static std::string kFileName
static std::string kDoseUnit
bool mergeDoseDist(std::vector< class GMocrenDataPrimitive< double > > &_dose)
void getVoxelSpacing(float _spacing[3])
void setDoseDistCenterPosition(float _center[3], int _num=0)
void translateTracks(std::vector< float > &_translateo)
unsigned int getPointerToDoseDistData(int _elem=0)
void setNumberOfEvents(int &_numberOfEvents)
static Verbosity GetVerbosity()
void setPointerToModalityData(unsigned int &_pointer)
void setName(std::string &_name)
void getROIMinMax(short _minmax[2], int _num=0)
int & getNumberOfEvents()
void setShortDoseDist(short *_image, int _num=0)
void setDoseDistScale(double &_scale, int _num=0)
void setLittleEndianInput(bool _little)
void setColor(unsigned char _color[3])
void setDoseDistSize(int _size[3], int _num=0)
static std::string kComment
static std::vector< unsigned int > kPointerToDoseDistData
static unsigned int kPointerToDetectorData
void setModalityCenterPosition(float _center[3])
void setROISize(int _size[3], int _num=0)
void setDetector(std::vector< struct Edge > &_aDetector)
static std::vector< float * > kSteps
void setROIScale(double &_scale, int _num=0)
void copyTracks(std::vector< float *> &_tracks, std::vector< unsigned char *> &_colors)
void getDoseDistCenterPosition(float _center[3], int _num=0)
void getSize(int _size[3])
void setName(std::string &_name)
void setPointerToTrackData(unsigned int &_pointer)
void addPointerToDoseDistData(unsigned int &_pointer)
void getDoseDistMinMax(short _minmax[2], int _num=0)
void setLittleEndianOutput(bool _little)
void setDoseDistName(std::string _name, int _num=0)
short getModalityImageMin()
int getNumberOfDetectors()
std::string getModalityImageUnit()
static std::string kModalityUnit
void setModalityImageDensityMap(std::vector< float > &_map)
void addStep(float _startx, float _starty, float _startz, float _endx, float _endy, float _endz)
void mergeTracks(std::vector< float *> &_tracks, std::vector< unsigned char *> &_colors)
static unsigned int kPointerToROIData
static unsigned int kPointerToTrackData