Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4GMocrenFileSceneHandler.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// Created: Mar. 31, 2009 Akinori Kimura
31// Sep. 22, 2009 Akinori Kimura : modify and fix code to support
32// PrimitiveScorers and clean up
33//
34// GMocrenFile scene handler
35
36
37//----- header files
38#include <fstream>
39#include <cstdlib>
40#include <cstring>
41#include <sstream>
42
43#include "globals.hh"
45#include "G4SystemOfUnits.hh"
46#include "G4VisManager.hh"
47
48#include "G4GMocrenFile.hh"
51#include "G4Point3D.hh"
52#include "G4VisAttributes.hh"
53#include "G4Scene.hh"
54#include "G4Transform3D.hh"
55#include "G4Polyhedron.hh"
56#include "G4Box.hh"
57#include "G4Cons.hh"
58#include "G4Polyline.hh"
59#include "G4Trd.hh"
60#include "G4Tubs.hh"
61#include "G4Trap.hh"
62#include "G4Torus.hh"
63#include "G4Sphere.hh"
64#include "G4Para.hh"
65#include "G4Text.hh"
66#include "G4Circle.hh"
67#include "G4Square.hh"
68#include "G4VPhysicalVolume.hh"
70#include "G4LogicalVolume.hh"
71#include "G4Material.hh"
72
75#include "G4VisTrajContext.hh"
77#include "G4VTrajectoryModel.hh"
79#include "G4HitsModel.hh"
80#include "G4GMocrenMessenger.hh"
81//#include "G4PSHitsModel.hh"
82#include "G4GMocrenIO.hh"
84#include "G4GMocrenTouchable.hh"
87
88#include "G4ScoringManager.hh"
89#include "G4ScoringBox.hh"
90
91//----- constants
92const char GDD_FILE_HEADER [] = "g4_";
93const char DEFAULT_GDD_FILE_NAME[] = "g4_00.gdd";
94
97
98//-- for a debugging
99const G4bool GFDEBUG = false;
100const G4bool GFDEBUG_TRK = false;//true;
101const G4bool GFDEBUG_HIT = false;//true;
102const G4bool GFDEBUG_DIGI = false;//true;
103const G4int GFDEBUG_DET = 0; // 0: false
104
105//////////////////////
106// static variables //
107//////////////////////
108
109//----- static variables
110G4int G4GMocrenFileSceneHandler::kSceneIdCount = 0;
111
112///////////////////////////
113// Driver-dependent part //
114///////////////////////////
115
116
117//----- G4GMocrenFileSceneHandler, constructor
119 G4GMocrenMessenger & messenger,
120 const G4String& name)
121 : G4VSceneHandler(system, kSceneIdCount++, name),
122 kSystem(system),
123 kMessenger(messenger),
124 kgMocrenIO(new G4GMocrenIO()),
125 kbSetModalityVoxelSize(false),
126 kbModelingTrajectory(false),
127// kGddDest(0),
128 kFlagInModeling(false),
129 kFlagSaving_g4_gdd(false),
130 kFlagParameterization(0),
131 kFLagProcessedInteractiveScorer(false) {
132
133 // g4.gdd filename and its directory
134 if(getenv("G4GMocrenFile_DEST_DIR") == NULL) {
135 kGddDestDir[0] = '\0';
136 //std::strcpy(kGddDestDir , ""); // output dir
137 //std::strcpy(kGddFileName, DEFAULT_GDD_FILE_NAME); // filename
138 std::strncpy(kGddFileName, DEFAULT_GDD_FILE_NAME, std::strlen(DEFAULT_GDD_FILE_NAME)); // filename
139 } else {
140 const char * env = getenv("G4GMocrenFile_DEST_DIR");
141 std::strncpy(kGddDestDir, env, std::strlen(env)); // output dir
142 std::strncpy(kGddFileName, DEFAULT_GDD_FILE_NAME, std::strlen(DEFAULT_GDD_FILE_NAME)); // filename
143 }
144
145 // maximum number of g4.gdd files in the dest directory
146 kMaxFileNum = FR_MAX_FILE_NUM ; // initialization
147 if ( std::getenv( "G4GMocrenFile_MAX_FILE_NUM" ) != NULL ) {
148
149 std::sscanf( getenv("G4GMocrenFile_MAX_FILE_NUM"), "%d", &kMaxFileNum ) ;
150
151 } else {
152 kMaxFileNum = FR_MAX_FILE_NUM ;
153 }
154 if( kMaxFileNum < 1 ) { kMaxFileNum = 1 ; }
155
156 InitializeParameters();
157
158}
159
160
161//----- G4GMocrenFileSceneHandler, destructor
163{
165 G4cout << "***** ~G4GMocrenFileSceneHandler" << G4endl;
166
167 if(kGddDest) {
168 //----- End of modeling
169 // close g4.gdd
171 }
172}
173
174//----- initialize all parameters
175void G4GMocrenFileSceneHandler::InitializeParameters() {
176
177 kbSetModalityVoxelSize = false;
178
179 for(G4int i = 0; i < 3; i++) {
180 kModalitySize[i] = 0;
181 kNestedVolumeDimension[i] = 0;
182 kNestedVolumeDirAxis[i] = -1;
183 }
184
185 // delete kgMocrenIO;
186
187}
188
189//-----
191{
192 // g4_00.gdd, g4_01.gdd, ..., g4_MAX_FILE_INDEX.gdd
193 const G4int MAX_FILE_INDEX = kMaxFileNum - 1 ;
194
195 // dest directory (null if no environmental variables is set)
196 std::strncpy(kGddFileName, kGddDestDir, std::strlen(kGddDestDir));
197
198 // create full path name (default)
199 std::strncat ( kGddFileName, DEFAULT_GDD_FILE_NAME, std::strlen(DEFAULT_GDD_FILE_NAME));
200
201 // Automatic updation of file names
202 static G4int currentNumber = 0;
203 for( G4int i = currentNumber ; i < kMaxFileNum ; i++) {
204
205 // Message in the final execution
206 if( i == MAX_FILE_INDEX )
207 {
209 G4cout << "===========================================" << G4endl;
210 G4cout << "WARNING MESSAGE from GMocrenFile driver: " << G4endl;
211 G4cout << " This file name is the final one in the " << G4endl;
212 G4cout << " automatic updation of the output file name." << G4endl;
213 G4cout << " You may overwrite existing files, i.e. " << G4endl;
214 G4cout << " g4_XX.gdd." << G4endl;
215 G4cout << "===========================================" << G4endl;
216 }
217 }
218
219 // re-determine file name as G4GMocrenFile_DEST_DIR/g4_XX.gdd
220 if( i >= 0 && i <= 9 ) {
221 std::sprintf( kGddFileName, "%s%s%s%d.gdd" , kGddDestDir, GDD_FILE_HEADER, "0", i );
222 } else {
223 std::sprintf( kGddFileName, "%s%s%d.gdd" , kGddDestDir, GDD_FILE_HEADER, i );
224 }
225
226 // check validity of the file name
227 std::ifstream fin(kGddFileName);
228 if(GFDEBUG)
229 G4cout << "FILEOPEN: " << i << " : " << kGddFileName << fin.fail() << G4endl;
230 if(!fin) {
231 // new file
232 fin.close();
233 currentNumber = i+1;
234 break;
235 } else {
236 // already exists (try next)
237 fin.close();
238 }
239
240 } // for
241
242 G4cout << "======================================================================" << G4endl;
243 G4cout << "Output file: " << kGddFileName << G4endl;
244 G4cout << "Destination directory (current dir if NULL): " << kGddDestDir << G4endl;
245 G4cout << "Maximum number of files in the destination directory: " << kMaxFileNum << G4endl;
246 G4cout << "Note:" << G4endl;
247 G4cout << " * The maximum number is customizable as: " << G4endl;
248 G4cout << " % setenv G4GMocrenFile_MAX_FILE_NUM number " << G4endl;
249 G4cout << " * The destination directory is customizable as:" << G4endl;
250 G4cout << " % setenv G4GMocrenFile_DEST_DIR dir_name/ " << G4endl;
251 G4cout << " ** Do not forget \"/\" at the end of the dir_name, e.g. \"./tmp/\"." << G4endl;
252 //G4cout << " dir_name, e.g. \"./tmp/\"." << G4endl;
253 G4cout << G4endl;
254 G4cout << "Maximum number of trajectories is set to " << MAX_NUM_TRAJECTORIES << "."<< G4endl;
255 G4cout << "======================================================================" << G4endl;
256
257} // G4GMocrenFileSceneHandler::SetGddFileName()
258
259
260//-----
262{
264 G4cout << "***** BeginSavingGdd (called)" << G4endl;
265
266 if( !IsSavingGdd() ) {
267
269 G4cout << "***** (started) " ;
270 G4cout << "(open g4.gdd, ##)" << G4endl;
271 }
272
273 SetGddFileName() ; // result set to kGddFileName
274 kFlagSaving_g4_gdd = true;
275
276
278 short minmax[2];
279 minmax[0] = ctdens.GetMinCT();
280 minmax[1] = ctdens.GetMaxCT();
281 kgMocrenIO->setModalityImageMinMax(minmax);
282 std::vector<G4float> map;
283 G4float dens;
284 for(G4int i = minmax[0]; i <= minmax[1]; i++) {
285 dens = ctdens.GetDensity(i);
286 map.push_back(dens);
287 }
288 kgMocrenIO->setModalityImageDensityMap(map);
289
290 /*
291 G4String fname = "modality-map.dat";
292 std::ifstream ifile(fname);
293 if(ifile) {
294 short minmax[2];
295 ifile >> minmax[0] >> minmax[1];
296 kgMocrenIO->setModalityImageMinMax(minmax);
297 std::vector<G4float> map;
298 G4float dens;
299 for(G4int i = minmax[0]; i <= minmax[1]; i++) {
300 ifile >> dens;
301 map.push_back(dens);
302 }
303 kgMocrenIO->setModalityImageDensityMap(map);
304
305 } else {
306 G4cout << "cann't open the file : " << fname << G4endl;
307 }
308 */
309
310 // mesh size
311 //kMessenger.getNoVoxels(kModalitySize[0], kModalitySize[1], kModalitySize[2]);
312 //kgMocrenIO->setModalityImageSize(kModalitySize);
313
314 // initializations
315 //kgMocrenIO->clearModalityImage();
316 kgMocrenIO->clearDoseDistAll();
317 kgMocrenIO->clearROIAll();
318 kgMocrenIO->clearTracks();
319 kgMocrenIO->clearDetector();
320 std::vector<Detector>::iterator itr = kDetectors.begin();
321 for(; itr != kDetectors.end(); itr++) {
322 itr->clear();
323 }
324 kDetectors.clear();
325
326 kNestedHitsList.clear();
327 kNestedVolumeNames.clear();
328
329 }
330}
331
333{
335 G4cout << "***** EndSavingGdd (called)" << G4endl;
336
337 if(IsSavingGdd()) {
339 G4cout << "***** (started) (close "
340 << kGddFileName << ")" << G4endl;
341
342 if(kGddDest) kGddDest.close();
343 kFlagSaving_g4_gdd = false;
344
345 std::map<Index3D, G4float>::iterator itr = kNestedModality.begin();
346 G4int xmax=0, ymax=0, zmax=0;
347 for(; itr != kNestedModality.end(); itr++) {
348 if(itr->first.x > xmax) xmax = itr->first.x;
349 if(itr->first.y > ymax) ymax = itr->first.y;
350 if(itr->first.z > zmax) zmax = itr->first.z;
351 }
352 // mesh size
353 kModalitySize[0] = xmax+1;
354 kModalitySize[1] = ymax+1;
355 kModalitySize[2] = zmax+1;
356 kgMocrenIO->setModalityImageSize(kModalitySize);
357 if(GFDEBUG) G4cout << "gMocren-file driver : modality size : "
358 << kModalitySize[0] << " x "
359 << kModalitySize[1] << " x "
360 << kModalitySize[2] << G4endl;
361
362 G4int nxy = kModalitySize[0]*kModalitySize[1];
363 //std::map<G4int, G4float>::iterator itr;
364 for(G4int z = 0; z < kModalitySize[2]; z++) {
365 short * modality = new short[nxy];
366 for(G4int y = 0; y < kModalitySize[1]; y++) {
367 for(G4int x = 0; x < kModalitySize[0]; x++) {
368 //for(G4int x = kModalitySize[0]-1; x >= 0 ; x--) {
369 //G4int ixy = x + (kModalitySize[1]-y-1)*kModalitySize[0];
370
371 G4int ixy = x + y*kModalitySize[0];
372 Index3D idx(x,y,z);
373 itr = kNestedModality.find(idx);
374 if(itr != kNestedModality.end()) {
375
376 modality[ixy] = kgMocrenIO->convertDensityToHU(itr->second);
377 } else {
378 modality[ixy] = -1024;
379 }
380
381 }
382 }
383 kgMocrenIO->setModalityImage(modality);
384 }
385
386 //-- dose
387 size_t nhits = kNestedHitsList.size();
388 if(GFDEBUG) G4cout << "gMocren-file driver : # hits = " << nhits << G4endl;
389
390 std::map<Index3D, G4double>::iterator hitsItr;
391 std::map<G4String, std::map<Index3D, G4double> >::iterator hitsListItr = kNestedHitsList.begin();
392
393 for(G4int n = 0; hitsListItr != kNestedHitsList.end(); hitsListItr++, n++) {
394
395 kgMocrenIO->newDoseDist();
396 kgMocrenIO->setDoseDistName(hitsListItr->first, n);
397 kgMocrenIO->setDoseDistSize(kModalitySize, n);
398
399 G4double minmax[2] = {DBL_MAX, -DBL_MAX};
400 for(G4int z = 0 ; z < kModalitySize[2]; z++) {
401 G4double * values = new G4double[nxy];
402 for(G4int y = 0; y < kModalitySize[1]; y++) {
403 for(G4int x = 0; x < kModalitySize[0]; x++) {
404
405 G4int ixy = x + y*kModalitySize[0];
406 Index3D idx(x,y,z);
407 hitsItr = hitsListItr->second.find(idx);
408 if(hitsItr != hitsListItr->second.end()) {
409
410 values[ixy] = hitsItr->second;
411 } else {
412 values[ixy] = 0.;
413 }
414 if(values[ixy] < minmax[0]) minmax[0] = values[ixy];
415 if(values[ixy] > minmax[1]) minmax[1] = values[ixy];
416 }
417 }
418 kgMocrenIO->setDoseDist(values, n);
419 }
420 kgMocrenIO->setDoseDistMinMax(minmax, n);
421 G4double lower = 0.;
422 if(minmax[0] < 0) lower = minmax[0];
423 G4double scale = (minmax[1]-lower)/25000.;
424 kgMocrenIO->setDoseDistScale(scale, n);
425 G4String sunit("unit?"); //temporarily
426 kgMocrenIO->setDoseDistUnit(sunit, n);
427 }
428
429
430 //-- draw axes
431 if(false) {//true,false
432 G4ThreeVector trans;
434 trans = kVolumeTrans3D.getTranslation();
435 rot = kVolumeTrans3D.getRotation().inverse();
436 // x
437 std::vector<G4float *> tracks;
438 unsigned char colors[3];
439 G4float * trk = new G4float[6];
440 tracks.push_back(trk);
441
442 G4ThreeVector orig(0.,0.,0), xa(2000.,0.,0.), ya(0.,2000.,0.), za(0.,0.,2000.);
443 orig -= trans;
444 orig.transform(rot);
445 xa -= trans;
446 xa.transform(rot);
447 ya -= trans;
448 ya.transform(rot);
449 za -= trans;
450 za.transform(rot);
451 for(G4int i = 0; i < 3; i++) trk[i] = orig[i];
452 for(G4int i = 0; i < 3; i++) trk[i+3] = xa[i];
453 colors[0] = 255; colors[1] = 0; colors[2] = 0;
454 kgMocrenIO->addTrack(tracks, colors);
455 // y
456 for(G4int i = 0; i < 3; i++) trk[i+3] = ya[i];
457 colors[0] = 0; colors[1] = 255; colors[2] = 0;
458 kgMocrenIO->addTrack(tracks, colors);
459 // z
460 for(G4int i = 0; i < 3; i++) trk[i+3] = za[i];
461 colors[0] = 0; colors[1] = 0; colors[2] = 255;
462 kgMocrenIO->addTrack(tracks, colors);
463 }
464
465 //-- detector
466 ExtractDetector();
467
468
469 if(GFDEBUG_DET) G4cout << ">>>>>>>>>>>>>>>>>>>>>> (";
470 std::vector<G4float> transformObjects;
471 for(G4int i = 0; i < 3; i++) {
472 // need to check!!
473 transformObjects.push_back((kVolumeSize[i]/2. - kVoxelDimension[i]/2.));
474 if(GFDEBUG_DET) G4cout << transformObjects[i] << ", ";
475 }
476 if(GFDEBUG_DET) G4cout << ")" << G4endl;
477
478
479 kgMocrenIO->translateTracks(transformObjects);
480 kgMocrenIO->translateDetector(transformObjects);
481
482 // store
483 kgMocrenIO->storeData(kGddFileName);
484 }
485
486}
487
488
489//-----
491{
493
494 if( !GFIsInModeling() ) {
495
496
498 G4cout << "***** G4GMocrenFileSceneHandler::GFBeginModeling (called & started)" << G4endl;
499
500 //----- Send saving command and heading comment
502
503 kFlagInModeling = true ;
504
505 // These models are entrusted to user commands /vis/scene/add/psHits or hits
506 //GetScene()->AddEndOfEventModel(new G4PSHitsModel());
507 //GetScene()->AddEndOfRunModel(new G4PSHitsModel());
508 //scene->AddEndOfEventModel(new G4HitsModel());
509 if(GFDEBUG_HIT) {
510 G4Scene * scene = GetScene();
511 std::vector<G4Scene::Model> vmodel = scene->GetEndOfEventModelList();
512 std::vector<G4Scene::Model>::iterator itr = vmodel.begin();
513 for(; itr != vmodel.end(); itr++) {
514 G4cout << " IIIIII model name: " << itr->fpModel->GetGlobalTag() << G4endl;
515 }
516 }
517
518 } // if
519}
520
521
522//========== AddPrimitive() functions ==========//
523
524//----- Add polyline
526{
528 G4cout << "***** AddPrimitive" << G4endl;
529
530 if (fProcessing2D) {
531 static G4bool warned = false;
532 if (!warned) {
533 warned = true;
535 ("G4GMocrenFileSceneHandler::AddPrimitive (const G4Polyline&)",
536 "gMocren1001", JustWarning,
537 "2D polylines not implemented. Ignored.");
538 }
539 return;
540 }
541
542 //----- Initialize if necessary
544
545 static G4int numTrajectories = 0;
546 if(numTrajectories >= MAX_NUM_TRAJECTORIES) return;
547
548 // draw trajectories
549 if(kbModelingTrajectory) {
550
551 G4TrajectoriesModel * pTrModel = dynamic_cast<G4TrajectoriesModel*>(fpModel);
552 if (!pTrModel) {
554 ("G4VSceneHandler::AddCompound(const G4Polyline&)",
555 "gMocren0002", FatalException, "Not a G4TrajectoriesModel.");
556 }
557
558 G4ThreeVector trans;
560 trans = kVolumeTrans3D.getTranslation();
561 rot = kVolumeTrans3D.getRotation().inverse();
562
563 if(GFDEBUG_TRK) G4cout << " trajectory points : " << G4endl;
564 std::vector<G4float *> trajectory;
565 if(polyline.size() < 2) return;
566 G4Polyline::const_iterator preitr = polyline.begin();
567 G4Polyline::const_iterator postitr = preitr; postitr++;
568 for(; postitr != polyline.end(); preitr++, postitr++) {
569 G4ThreeVector prePts(preitr->x(), preitr->y(), preitr->z());
570 prePts -= trans;
571 prePts.transform(rot);
572 G4ThreeVector postPts(postitr->x(), postitr->y(), postitr->z());
573 postPts -= trans;
574 postPts.transform(rot);
575 G4float * stepPts = new G4float[6];
576 stepPts[0] = prePts.x();
577 stepPts[1] = prePts.y();
578 stepPts[2] = prePts.z();
579 stepPts[3] = postPts.x();
580 stepPts[4] = postPts.y();
581 stepPts[5] = postPts.z();
582 trajectory.push_back(stepPts);
583
584 if(GFDEBUG_TRK) {
585 G4cout << " ("
586 << stepPts[0] << ", "
587 << stepPts[1] << ", "
588 << stepPts[2] << ") - ("
589 << stepPts[3] << ", "
590 << stepPts[4] << ", "
591 << stepPts[5] << ")" << G4endl;
592 }
593 }
594
595 const G4VisAttributes * att = polyline.GetVisAttributes();
596 G4Color color = att->GetColor();
597 unsigned char trkcolor[3];
598 trkcolor[0] = (unsigned char)(color.GetRed()*255);
599 trkcolor[1] = (unsigned char)(color.GetGreen()*255);
600 trkcolor[2] = (unsigned char)(color.GetBlue()*255);
601 if(GFDEBUG_TRK) {
602 G4cout << " color : ["
603 << color.GetRed() << ", "
604 << color.GetGreen() << ", "
605 << color.GetBlue() << "]" << G4endl;
606 }
607
608 kgMocrenIO->addTrack(trajectory, trkcolor);
609
610 numTrajectories++;
611 }
612
613} // G4GMocrenFileSceneHandler::AddPrimitive (polyline)
614
615
616//----- Add nurbes
618{
619 //-----
621 G4cout << "***** AddPrimitive( G4NURBS )" << G4endl;
622
623 //----- Initialize if necessary
625
626}
627
628
629
630//----- Add text
632{
633 if (fProcessing2D) {
634 static G4bool warned = false;
635 if (!warned) {
636 warned = true;
638 ("G4GMocrenFileSceneHandler::AddPrimitive (const G4Text&)",
639 "gMocren1002", JustWarning,
640 "2D text not implemented. Ignored.");
641 }
642 return;
643 }
644
645 // to avoid a warning in the compile process
646 G4Text dummytext = text;
647
648 //-----
650 G4cout << "***** AddPrimitive( G4Text )" << G4endl;
651
652 //----- Initialize IF NECESSARY
654
655} // G4GMocrenFileSceneHandler::AddPrimitive ( text )
656
657
658//----- Add circle
660{
661 // to avoid a warning in the compile process
662 G4Circle dummycircle = mark_circle;
663
664 if (fProcessing2D) {
665 static G4bool warned = false;
666 if (!warned) {
667 warned = true;
669 ("G4GMocrenFileSceneHandler::AddPrimitive (const G4Circle&)",
670 "gMocren1003", JustWarning,
671 "2D circles not implemented. Ignored.");
672 }
673 return;
674 }
675
676 //-----
678 G4cout << "***** AddPrimitive( G4Circle )" << G4endl;
679
680 //----- Initialize IF NECESSARY
682
683
684} // G4GMocrenFileSceneHandler::AddPrimitive ( mark_circle )
685
686
687//----- Add square
689{
690 // to avoid a warning in the compile process
691 G4Square dummysquare = mark_square;
692
693 if (fProcessing2D) {
694 static G4bool warned = false;
695 if (!warned) {
696 warned = true;
698 ("G4GMocrenFileSceneHandler::AddPrimitive (const G4Square&)",
699 "gMocren1004", JustWarning,
700 "2D squares not implemented. Ignored.");
701 }
702 return;
703 }
704
705 //-----
707 G4cout << "***** AddPrimitive( G4Square )" << G4endl;
708
709 //----- Initialize if necessary
711
712} // G4GMocrenFileSceneHandler::AddPrimitive ( mark_square )
713
714
715//----- Add polyhedron
717{
718 //-----
720 G4cout << "***** AddPrimitive( G4Polyhedron )" << G4endl;
721
722
723 if (polyhedron.GetNoFacets() == 0) return;
724
725 if (fProcessing2D) {
726 static G4bool warned = false;
727 if (!warned) {
728 warned = true;
730 ("G4GMocrenFileSceneHandler::AddPrimitive (const G4Polyhedron&)",
731 "gMocren1005", JustWarning,
732 "2D polyhedra not implemented. Ignored.");
733 }
734 return;
735 }
736
737 //----- Initialize if necessary
739
740 //---------- (3) Facet block
741 for (G4int f = polyhedron.GetNoFacets(); f; f--){
742 G4bool notLastEdge = true;
743 G4int index = -1; // initialization
744 G4int edgeFlag = 1;
745 //G4int preedgeFlag = 1;
746 //G4int work[4], i = 0;
747 G4int i = 0;
748 do {
749 //preedgeFlag = edgeFlag;
750 notLastEdge = polyhedron.GetNextVertexIndex(index, edgeFlag);
751 //work[i++] = index;
752 i++;
753 }while (notLastEdge);
754 switch (i){
755 case 3:
756 //SendStrInt3(FR_FACET, work[0], work[1], work[2] );
757 break;
758 case 4:
759 //SendStrInt4(FR_FACET, work[0], work[1], work[2], work[3] );
760 break;
761 default:
763 G4cout <<
764 "ERROR G4GMocrenFileSceneHandler::AddPrimitive(G4Polyhedron)" << G4endl;
765 G4PhysicalVolumeModel* pPVModel =
766 dynamic_cast<G4PhysicalVolumeModel*>(fpModel);
767 if (pPVModel)
769 G4cout << "Volume " << pPVModel->GetCurrentPV()->GetName() <<
770 ", Solid " << pPVModel->GetCurrentLV()->GetSolid()->GetName() <<
771 " (" << pPVModel->GetCurrentLV()->GetSolid()->GetEntityType();
772
774 G4cout <<
775 "\nG4Polyhedron facet with " << i << " edges" << G4endl;
776 }
777 }
778
779} // G4GMocrenFileSceneHandler::AddPrimitive (polyhedron)
780
781
782//-----
784{
786
787 //-----
789 G4cout << "***** GFEndModeling (called)" << G4endl;
790
791 if( GFIsInModeling() ) {
792
794 G4cout << "***** GFEndModeling (started) " ;
795 G4cout << "(/EndModeling, /DrawAll, /CloseDevice)" << G4endl;
796 }
797
798 //----- End saving data to g4.gdd
799 EndSavingGdd() ;
800
801 //------ Reset flag
802 kFlagInModeling = false ;
803
804 }
805
806}
807
808
809//-----
811{
813 G4cout << "***** BeginPrimitives " << G4endl;
814
816
817 G4VSceneHandler::BeginPrimitives (objectTransformation);
818
819}
820
821
822//-----
824{
826 G4cout << "***** EndPrimitives " << G4endl;
827
829}
830
831
832//========== AddSolid() functions ==========//
833
834//----- Add box
836{
838 G4cout << "***** AddSolid ( box )" << G4endl;
839
840 if(GFDEBUG_DET > 0)
841 G4cout << "G4GMocrenFileSceneHandler::AddSolid(const G4Box&) : "
842 << box.GetName() << G4endl;
843
844 //----- skip drawing invisible primitive
845 if( !IsVisible() ) { return ; }
846
847 //----- Initialize if necessary
849
850
851 //--
852 if(GFDEBUG_DET > 1) {
853 G4cout << "-------" << G4endl;
854 G4cout << " " << box.GetName() << G4endl;
855 G4Polyhedron * poly = box.CreatePolyhedron();
857 //G4int nv = poly->GetNoVertices();
858 G4Point3D v1, v2;
859 G4int next;
860 //while(1) { // next flag isn't functional.
861 for(G4int i = 0; i < 12; i++) { // # of edges is 12.
862 poly->GetNextEdge(v1, v2, next);
863 if(next == 0) break;
864 G4cout << " (" << v1.x() << ", "
865 << v1.y() << ", "
866 << v1.z() << ") - ("
867 << v2.x() << ", "
868 << v2.y() << ", "
869 << v2.z() << ") [" << next << "]"
870 << G4endl;
871 }
872 delete poly;
873 }
874
875
876 // the volume name set by /vis/gMocren/setVolumeName
877 G4String volName = kMessenger.getVolumeName();
878
879 if(kFlagParameterization != 2) {
881 if(pScrMan) {
882 G4ScoringBox * pScBox = dynamic_cast<G4ScoringBox*>(pScrMan->FindMesh(volName));
883 G4bool bMesh = false;
884 if(pScBox != NULL) bMesh = true;
885 if(bMesh) kFlagParameterization = 2;
886 if(GFDEBUG_DET > 0) G4cout << " G4ScoringManager::FindMesh() : "
887 << volName << " - " << bMesh << G4endl;
888 }
889 }
890
891 const G4VModel* pv_model = GetModel();
892 if (!pv_model) { return ; }
893 G4PhysicalVolumeModel* pPVModel =
894 dynamic_cast<G4PhysicalVolumeModel*>(fpModel);
895 if (!pPVModel) { return ; }
896
897
898 //-- debug information
899 if(GFDEBUG_DET > 0) {
900 G4Material * mat = pPVModel->GetCurrentMaterial();
901 G4String name = mat->GetName();
902 G4double dens = mat->GetDensity()/(g/cm3);
903 G4int copyNo = pPVModel->GetCurrentPV()->GetCopyNo();
904 G4int depth = pPVModel->GetCurrentDepth();
905 G4cout << " copy no.: " << copyNo << G4endl;
906 G4cout << " depth : " << depth << G4endl;
907 G4cout << " density : " << dens << " [g/cm3]" << G4endl;
908 G4cout << " location: " << pPVModel->GetCurrentPV()->GetObjectTranslation() << G4endl;
909 G4cout << " Multiplicity : " << pPVModel->GetCurrentPV()->GetMultiplicity() << G4endl;
910 G4cout << " Is replicated? : " << pPVModel->GetCurrentPV()->IsReplicated() << G4endl;
911 G4cout << " Is parameterised? : " << pPVModel->GetCurrentPV()->IsParameterised() << G4endl;
912 G4cout << " top phys. vol. name : " << pPVModel->GetTopPhysicalVolume()->GetName() << G4endl;
913 }
914
915 //-- check the parameterised volume
916 if(box.GetName() == volName) {
917
918 kVolumeTrans3D = fObjectTransformation;
919 // coordination system correction for gMocren
920 G4ThreeVector raxis(1., 0., 0.), dummy(0.,0.,0.);
921 G4RotationMatrix rot(raxis, pi*rad);
922 G4Transform3D trot(rot, dummy);
923 if(GFDEBUG_DET) {
924 G4ThreeVector trans1 = kVolumeTrans3D.getTranslation();
925 G4RotationMatrix rot1 = kVolumeTrans3D.getRotation().inverse();
926 G4cout << "kVolumeTrans3D: " << trans1 << G4endl << rot1 << G4endl;
927 }
928 kVolumeTrans3D = kVolumeTrans3D*trot;
929 if(GFDEBUG_DET) G4cout << " Parameterised volume : " << box.GetName() << G4endl;
930
931
932
933 //
934 G4VPhysicalVolume * pv[3] = {0,0,0};
935 pv[0] = pPVModel->GetCurrentPV()->GetLogicalVolume()->GetDaughter(0);
936 if(!pv[0]) {
937 G4Exception("G4GMocrenFileSceneHandler::AddSolid( const G4Box& box )",
938 "gMocren0003", FatalException, "Unexpected volume.");
939 }
940 G4int dirAxis[3] = {-1,-1,-1};
941 G4int nDaughters[3] = {0,0,0};
942
943 EAxis axis; G4int nReplicas; G4double width; G4double offset; G4bool consuming;
944 pv[0]->GetReplicationData(axis, nReplicas, width, offset, consuming);
945 nDaughters[0] = nReplicas;
946 switch(axis) {
947 case kXAxis: dirAxis[0] = 0; break;
948 case kYAxis: dirAxis[0] = 1; break;
949 case kZAxis: dirAxis[0] = 2; break;
950 default:
951 G4Exception("G4GMocrenFileSceneHandler::AddSolid( const G4Box& box )",
952 "gMocren0004", FatalException, "Error.");
953 }
954 kNestedVolumeNames.push_back(pv[0]->GetName());
955 if(GFDEBUG_DET)
956 G4cout << " daughter name : " << pv[0]->GetName()
957 << " # : " << nDaughters[0] << G4endl;
958
959 //
960 if(GFDEBUG_DET) {
961 if(pv[0]->GetLogicalVolume()->GetNoDaughters()) {
962 G4cout << "# of daughters : "
963 << pv[0]->GetLogicalVolume()->GetNoDaughters() << G4endl;
964 } else {
965 //G4Exception("G4GMocrenFileSceneHandler::AddSolid( const G4Box& box )",
966 // "gMocren0005", FatalException, "Error.");
967 }
968 }
969
970 // check whether nested or regular parameterization
971 if(GFDEBUG_DET) G4cout << "# of daughters : "
972 << pv[0]->GetLogicalVolume()->GetNoDaughters() << G4endl;
973 if(pv[0]->GetLogicalVolume()->GetNoDaughters() == 0) {
974 kFlagParameterization = 1;
975 //G4Exception("G4GMocrenFileSceneHandler::AddSolid( const G4Box& box )",
976 // "gMocren0006", FatalException, "Error.");
977 }
978
979 if(kFlagParameterization == 0) {
980
981 pv[1] = pv[0]->GetLogicalVolume()->GetDaughter(0);
982 if(pv[1]) {
983 pv[1]->GetReplicationData(axis, nReplicas, width, offset, consuming);
984 nDaughters[1] = nReplicas;
985 switch(axis) {
986 case kXAxis: dirAxis[1] = 0; break;
987 case kYAxis: dirAxis[1] = 1; break;
988 case kZAxis: dirAxis[1] = 2; break;
989 default:
990 G4Exception("G4GMocrenFileSceneHandler::AddSolid( const G4Box& box )",
991 "gMocren0007", FatalException, "Error.");
992 }
993 kNestedVolumeNames.push_back(pv[1]->GetName());
994 if(GFDEBUG_DET)
995 G4cout << " sub-daughter name : " << pv[1]->GetName()
996 << " # : " << nDaughters[1]<< G4endl;
997
998 //
999 pv[2] = pv[1]->GetLogicalVolume()->GetDaughter(0);
1000 if(pv[2]) {
1001 nDaughters[2] = pv[2]->GetMultiplicity();
1002 kNestedVolumeNames.push_back(pv[2]->GetName());
1003 if(GFDEBUG_DET)
1004 G4cout << " sub-sub-daughter name : " << pv[2]->GetName()
1005 << " # : " << nDaughters[2] << G4endl;
1006
1007 if(nDaughters[2] > 1) {
1008 G4VNestedParameterisation * nestPara
1009 = dynamic_cast<G4VNestedParameterisation*>(pv[2]->GetParameterisation());
1010 if(nestPara == NULL)
1011 G4Exception("G4GMocrenFileSceneHandler::AddSolid( const G4Box& box )",
1012 "gMocren0008", FatalException, "Non-nested parameterisation");
1013
1014 nestPara->ComputeTransformation(0, pv[2]);
1015 G4ThreeVector trans0 = pv[2]->GetObjectTranslation();
1016 nestPara->ComputeTransformation(1, pv[2]);
1017 G4ThreeVector trans1 = pv[2]->GetObjectTranslation();
1018 G4ThreeVector diff(trans0 - trans1);
1019 if(GFDEBUG_DET)
1020 G4cout << trans0 << " - " << trans1 << " - " << diff << G4endl;
1021
1022 if(diff.x() != 0.) dirAxis[2] = 0;
1023 else if(diff.y() != 0.) dirAxis[2] = 1;
1024 else if(diff.z() != 0.) dirAxis[2] = 2;
1025 else
1026 G4Exception("G4GMocrenFileSceneHandler::AddSolid( const G4Box& box )",
1027 "gMocren0009", FatalException, "Unexpected nested parameterisation");
1028 }
1029 }
1030 }
1031
1032 for(G4int i = 0; i < 3; i++) {
1033 kNestedVolumeDimension[i] = nDaughters[i];
1034 //kNestedVolumeDimension[i] = nDaughters[dirAxis[i]];
1035 kNestedVolumeDirAxis[i] = dirAxis[i];
1036 }
1037 //G4cout << "@@@@@@@@@ "
1038 // << dirAxis[0] << ", " << dirAxis[1] << ", " << dirAxis[2] << G4endl;
1039
1040 // get densities
1041 G4VNestedParameterisation * nestPara
1042 = dynamic_cast<G4VNestedParameterisation*>(pv[2]->GetParameterisation());
1043 if(nestPara != NULL) {
1044 G4double prexyz[3] = {0.,0.,0.}, xyz[3] = {0.,0.,0.};
1045 for(G4int n0 = 0; n0 < nDaughters[0]; n0++) {
1046 for(G4int n1 = 0; n1 < nDaughters[1]; n1++) {
1047 for(G4int n2 = 0; n2 < nDaughters[2]; n2++) {
1048
1049 G4GMocrenTouchable * touch = new G4GMocrenTouchable(n1, n0);
1050 if(GFDEBUG_DET)
1051 G4cout << " retrieve volume : copy # : " << n0
1052 << ", " << n1 << ", " << n2 << G4endl;
1053 G4Material * mat = nestPara->ComputeMaterial(pv[2], n2, touch);
1054 delete touch;
1055 G4double dens = mat->GetDensity()/(g/cm3);
1056
1057 if(GFDEBUG_DET)
1058 G4cout << " density :" << dens << " [g/cm3]" << G4endl;
1059
1060 G4Box tbox(box);
1061 nestPara->ComputeDimensions(tbox, n2, pv[2]);
1062 xyz[0] = tbox.GetXHalfLength()/mm;
1063 xyz[1] = tbox.GetYHalfLength()/mm;
1064 xyz[2] = tbox.GetZHalfLength()/mm;
1065 if(n0 != 0 || n1 != 0 || n2 != 0) {
1066 for(G4int i = 0; i < 3; i++) {
1067 if(xyz[i] != prexyz[i])
1068 G4Exception("G4GMocrenFileSceneHandler::AddSolid( const G4Box& box )",
1069 "gMocren0010", FatalException, "Unsupported parameterisation");
1070 }
1071 }
1072 if(GFDEBUG_DET)
1073 G4cout << " size : " << tbox.GetXHalfLength()/mm << " x "
1074 << tbox.GetYHalfLength()/mm << " x "
1075 << tbox.GetZHalfLength()/mm << " [mm3]" << G4endl;
1076
1077 G4int idx[3];
1078 idx[dirAxis[0]] = n0;
1079 idx[dirAxis[1]] = n1;
1080 idx[dirAxis[2]] = n2;
1081 Index3D i3d(idx[0],idx[1],idx[2]);
1082 kNestedModality[i3d] = dens;
1083 if(GFDEBUG_DET)
1084 G4cout << " index: " << idx[0] << ", " << idx[1] << ", " << idx[2]
1085 << " density: " << dens << G4endl;
1086
1087 for(G4int i = 0; i < 3; i++) prexyz[i] = xyz[i];
1088 }
1089 }
1090 }
1091
1092 kVolumeSize.set(box.GetXHalfLength()*2/mm,
1093 box.GetYHalfLength()*2/mm,
1094 box.GetZHalfLength()*2/mm);
1095 // mesh size
1096 if(!kbSetModalityVoxelSize) {
1097 G4float spacing[3] = {static_cast<G4float>(2*xyz[0]),
1098 static_cast<G4float>(2*xyz[1]),
1099 static_cast<G4float>(2*xyz[2])};
1100 kgMocrenIO->setVoxelSpacing(spacing);
1101 kVoxelDimension.set(spacing[0], spacing[1], spacing[2]);
1102 kbSetModalityVoxelSize = true;
1103 }
1104
1105 } else {
1106 if(GFDEBUG_DET)
1107 G4cout << pv[2]->GetName() << G4endl;
1108 G4Exception("G4GMocrenFileSceneHandler::AddSolid( const G4Box& box )",
1109 "gMocren0011", FatalException, "Non-nested parameterisation");
1110 }
1111
1112
1113
1114 //-- debug
1115 if(GFDEBUG_DET > 1) {
1116 if(pPVModel->GetCurrentPV()->IsParameterised()) {
1118 G4cout << " Is nested parameterisation? : " << para->IsNested() << G4endl;
1119
1120
1121 G4int npvp = pPVModel->GetDrawnPVPath().size();
1122 G4cout << " physical volume node id : "
1123 << "size: " << npvp << ", PV name: ";
1124 for(G4int i = 0; i < npvp; i++) {
1125 G4cout << pPVModel->GetDrawnPVPath()[i].GetPhysicalVolume()->GetName()
1126 << " [param:"
1127 << pPVModel->GetDrawnPVPath()[i].GetPhysicalVolume()->IsParameterised()
1128 << ",rep:"
1129 << pPVModel->GetDrawnPVPath()[i].GetPhysicalVolume()->IsReplicated();
1130 if(pPVModel->GetDrawnPVPath()[i].GetPhysicalVolume()->GetParameterisation()) {
1131 G4cout << ",nest:"
1132 << pPVModel->GetDrawnPVPath()[i].GetPhysicalVolume()->GetParameterisation()->IsNested();
1133 }
1134 G4cout << ",copyno:"
1135 << pPVModel->GetDrawnPVPath()[i].GetPhysicalVolume()->GetCopyNo();
1136 G4cout << "] - ";
1137 }
1138 G4cout << G4endl;
1139
1140
1141 pPVModel->GetCurrentPV()->GetReplicationData(axis, nReplicas, width, offset, consuming);
1142 G4cout << " # replicas : " << nReplicas << G4endl;
1143 G4double pareDims[3] = {0.,0.,0.};
1144 G4Box * pbox = dynamic_cast<G4Box *>(pPVModel->GetDrawnPVPath()[npvp-2].GetPhysicalVolume()->GetLogicalVolume()->GetSolid());
1145 if(pbox) {
1146 pareDims[0] = 2.*pbox->GetXHalfLength()*mm;
1147 pareDims[1] = 2.*pbox->GetYHalfLength()*mm;
1148 pareDims[2] = 2.*pbox->GetZHalfLength()*mm;
1149 G4cout << " mother size ["
1150 << pPVModel->GetDrawnPVPath()[npvp-2].GetPhysicalVolume()->GetName()
1151 << "] : "
1152 << pareDims[0] << " x "
1153 << pareDims[1] << " x "
1154 << pareDims[2] << " [mm3]"
1155 << G4endl;
1156 }
1157 G4double paraDims[3];
1158 G4Box * boxP = dynamic_cast<G4Box *>(pPVModel->GetDrawnPVPath()[npvp-1].GetPhysicalVolume()->GetLogicalVolume()->GetSolid());
1159 if(boxP) {
1160 paraDims[0] = 2.*boxP->GetXHalfLength()*mm;
1161 paraDims[1] = 2.*boxP->GetYHalfLength()*mm;
1162 paraDims[2] = 2.*boxP->GetZHalfLength()*mm;
1163 G4cout << " parameterised volume? ["
1164 << pPVModel->GetDrawnPVPath()[npvp-1].GetPhysicalVolume()->GetName()
1165 << "] : "
1166 << paraDims[0] << " x "
1167 << paraDims[1] << " x "
1168 << paraDims[2] << " [mm3] : "
1169 << G4int(pareDims[0]/paraDims[0]) << " x "
1170 << G4int(pareDims[1]/paraDims[1]) << " x "
1171 << G4int(pareDims[2]/paraDims[2]) << G4endl;
1172 } else {
1173 G4cout << pPVModel->GetDrawnPVPath()[npvp-2].GetPhysicalVolume()->GetName()
1174 << " isn't a G4Box." << G4endl;
1175 }
1176 }
1177 }
1178
1179
1180 } else if(kFlagParameterization == 1) { // G4PhantomParameterisation based geom. construnction
1181
1182 // get the dimension of the parameterized patient geometry
1183 G4PhantomParameterisation * phantomPara
1184 = dynamic_cast<G4PhantomParameterisation*>(pv[0]->GetParameterisation());
1185 if(phantomPara == NULL) {
1186 G4Exception("G4GMocrenFileSceneHandler::AddSolid( const G4Box& box )",
1187 "gMocren0012", FatalException, "no G4PhantomParameterisation");
1188 } else {
1189 ;
1190 }
1191
1192 kNestedVolumeDimension[0] = phantomPara->GetNoVoxelX();
1193 kNestedVolumeDimension[1] = phantomPara->GetNoVoxelY();
1194 kNestedVolumeDimension[2] = phantomPara->GetNoVoxelZ();
1195 kNestedVolumeDirAxis[0] = 0;
1196 kNestedVolumeDirAxis[1] = 1;
1197 kNestedVolumeDirAxis[2] = 2;
1198
1199 // get densities of the parameterized patient geometry
1200 G4int nX = kNestedVolumeDimension[0];
1201 G4int nXY = kNestedVolumeDimension[0]*kNestedVolumeDimension[1];
1202
1203 for(G4int n0 = 0; n0 < kNestedVolumeDimension[0]; n0++) {
1204 for(G4int n1 = 0; n1 < kNestedVolumeDimension[1]; n1++) {
1205 for(G4int n2 = 0; n2 < kNestedVolumeDimension[2]; n2++) {
1206
1207 G4int repNo = n0 + n1*nX + n2*nXY;
1208 G4Material * mat = phantomPara->ComputeMaterial(repNo, pv[0]);
1209 G4double dens = mat->GetDensity()/(g/cm3);
1210
1211
1212 G4int idx[3];
1213 idx[kNestedVolumeDirAxis[0]] = n0;
1214 idx[kNestedVolumeDirAxis[1]] = n1;
1215 idx[kNestedVolumeDirAxis[2]] = n2;
1216 Index3D i3d(idx[0],idx[1],idx[2]);
1217 kNestedModality[i3d] = dens;
1218
1219 if(GFDEBUG_DET)
1220 G4cout << " index: " << idx[0] << ", " << idx[1] << ", " << idx[2]
1221 << " density: " << dens << G4endl;
1222
1223 }
1224 }
1225 }
1226
1227 kVolumeSize.set(box.GetXHalfLength()*2/mm,
1228 box.GetYHalfLength()*2/mm,
1229 box.GetZHalfLength()*2/mm);
1230
1231 // mesh size
1232 if(!kbSetModalityVoxelSize) {
1233 G4float spacing[3] = {static_cast<G4float>(2*phantomPara->GetVoxelHalfX()),
1234 static_cast<G4float>(2*phantomPara->GetVoxelHalfY()),
1235 static_cast<G4float>(2*phantomPara->GetVoxelHalfZ())};
1236 kgMocrenIO->setVoxelSpacing(spacing);
1237 kVoxelDimension.set(spacing[0], spacing[1], spacing[2]);
1238 kbSetModalityVoxelSize = true;
1239 }
1240 }
1241
1242 } // if(box.GetName() == volName)
1243
1244
1245 // processing geometry construction based on the interactive PS
1246 if(!kFLagProcessedInteractiveScorer) {
1247
1248
1249 // get the dimension of the geometry defined in G4VScoringMesh
1251 if(!pScrMan) return;
1252 G4ScoringBox * scoringBox
1253 = dynamic_cast<G4ScoringBox*>(pScrMan->FindMesh(volName));
1254 if(scoringBox == NULL) return;
1255
1256
1257 G4int nVoxels[3];
1258 scoringBox->GetNumberOfSegments(nVoxels);
1259 // this order depends on the G4ScoringBox
1260 kNestedVolumeDimension[0] = nVoxels[2];
1261 kNestedVolumeDimension[1] = nVoxels[1];
1262 kNestedVolumeDimension[2] = nVoxels[0];
1263 kNestedVolumeDirAxis[0] = 2;
1264 kNestedVolumeDirAxis[1] = 1;
1265 kNestedVolumeDirAxis[2] = 0;
1266
1267 // get densities of the parameterized patient geometry
1268 for(G4int n0 = 0; n0 < kNestedVolumeDimension[0]; n0++) {
1269 for(G4int n1 = 0; n1 < kNestedVolumeDimension[1]; n1++) {
1270 for(G4int n2 = 0; n2 < kNestedVolumeDimension[2]; n2++) {
1271
1272 G4double dens = 0.*(g/cm3);
1273
1274 G4int idx[3];
1275 idx[kNestedVolumeDirAxis[0]] = n0;
1276 idx[kNestedVolumeDirAxis[1]] = n1;
1277 idx[kNestedVolumeDirAxis[2]] = n2;
1278 Index3D i3d(idx[0],idx[1],idx[2]);
1279 kNestedModality[i3d] = dens;
1280
1281 }
1282 }
1283 }
1284
1285 G4ThreeVector boxSize = scoringBox->GetSize();
1286 if(GFDEBUG_DET > 1) {
1287 G4cout << "Interactive Scorer : size - "
1288 << boxSize.x()/cm << " x "
1289 << boxSize.y()/cm << " x "
1290 << boxSize.z()/cm << " [cm3]" << G4endl;
1291 G4cout << "Interactive Scorer : # voxels - "
1292 << nVoxels[0] << " x "
1293 << nVoxels[1] << " x "
1294 << nVoxels[2] << G4endl;
1295 }
1296 kVolumeSize.set(boxSize.x()*2,
1297 boxSize.y()*2,
1298 boxSize.z()*2);
1299
1300 // mesh size
1301 if(!kbSetModalityVoxelSize) {
1302 G4float spacing[3] = {static_cast<G4float>(boxSize.x()*2/nVoxels[0]),
1303 static_cast<G4float>(boxSize.y()*2/nVoxels[1]),
1304 static_cast<G4float>(boxSize.z()*2/nVoxels[2])};
1305
1306 kgMocrenIO->setVoxelSpacing(spacing);
1307 kVoxelDimension.set(spacing[0], spacing[1], spacing[2]);
1308 kbSetModalityVoxelSize = true;
1309
1310 }
1311
1312
1313 kVolumeTrans3D = fObjectTransformation;
1314
1315 // translation for the scoring mesh
1316 G4ThreeVector sbth = scoringBox->GetTranslation();
1317 G4Translate3D sbtranslate(sbth);
1318 kVolumeTrans3D = kVolumeTrans3D*sbtranslate;
1319
1320 // rotation matrix for the scoring mesh
1321 G4RotationMatrix sbrm;
1322 sbrm = scoringBox->GetRotationMatrix();
1323 if(!sbrm.isIdentity()) {
1324 G4ThreeVector sbdummy(0.,0.,0.);
1325 G4Transform3D sbrotate(sbrm.inverse(), sbdummy);
1326 kVolumeTrans3D = kVolumeTrans3D*sbrotate;
1327 }
1328
1329
1330 // coordination system correction for gMocren
1331 G4ThreeVector raxisY(0., 1., 0.), dummyY(0.,0.,0.);
1332 G4RotationMatrix rotY(raxisY, pi*rad);
1333 G4Transform3D trotY(rotY, dummyY);
1334 G4ThreeVector raxisZ(0., 0., 1.), dummyZ(0.,0.,0.);
1335 G4RotationMatrix rotZ(raxisZ, pi*rad);
1336 G4Transform3D trotZ(rotZ, dummyZ);
1337
1338 kVolumeTrans3D = kVolumeTrans3D*trotY*trotZ;
1339
1340
1341 //
1342 kFLagProcessedInteractiveScorer = true;
1343 }
1344
1345
1346
1347 //-- add detectors
1348 G4bool bAddDet = true;
1349 if(!kMessenger.getDrawVolumeGrid()) {
1350
1351 if(kFlagParameterization == 0) { // nested parameterisation
1352
1353 if(volName == box.GetName()) {
1354 bAddDet = false;
1355 }
1356
1357 std::vector<G4String>::iterator itr = kNestedVolumeNames.begin();
1358 for(; itr != kNestedVolumeNames.end(); itr++) {
1359 if(*itr == box.GetName()) {
1360 bAddDet = false;
1361 break;
1362 }
1363 }
1364 } else if(kFlagParameterization == 1) { // phantom paramemterisation
1365
1366 if(volName != box.GetName()) {
1367 bAddDet = false;
1368 }
1369
1370 } else if(kFlagParameterization == 2) { // interactive primitive scorer
1371 ;
1372 }
1373
1374 }
1375 if(bAddDet) AddDetector(box);
1376
1377
1378} // void G4GMocrenFileSceneHandler::AddSolid( const G4Box& box )
1379
1380
1381//----- Add tubes
1382void
1384{
1386 G4cout << "***** AddSolid ( tubes )" << G4endl;
1387
1388 //----- skip drawing invisible primitive
1389 if( !IsVisible() ) { return ; }
1390
1391 //----- Initialize if necessary
1393
1394 //
1395 AddDetector(tubes);
1396
1397
1398 // for a debug
1399 if(GFDEBUG_DET > 0) {
1400 G4cout << "-------" << G4endl;
1401 G4cout << " " << tubes.GetName() << G4endl;
1402 G4Polyhedron * poly = tubes.CreatePolyhedron();
1403 G4int nv = poly->GetNoVertices();
1404 for(G4int i = 0; i < nv; i++) {
1405 G4cout << " (" << poly->GetVertex(i).x() << ", "
1406 << poly->GetVertex(i).y() << ", "
1407 << poly->GetVertex(i).z() << ")" << G4endl;
1408 }
1409 delete poly;
1410 }
1411
1412 const G4VModel* pv_model = GetModel();
1413 if (!pv_model) { return ; }
1414 G4PhysicalVolumeModel* pPVModel =
1415 dynamic_cast<G4PhysicalVolumeModel*>(fpModel);
1416 if (!pPVModel) { return ; }
1417 G4Material * mat = pPVModel->GetCurrentMaterial();
1418 G4String name = mat->GetName();
1419
1420} // void G4GMocrenFileSceneHandler::AddSolid( const G4Tubs& )
1421
1422
1423
1424//----- Add cons
1425void
1427{
1429 G4cout << "***** AddSolid ( cons )" << G4endl;
1430
1431 //----- skip drawing invisible primitive
1432 if( !IsVisible() ) { return ; }
1433
1434 //----- Initialize if necessary
1436
1437 //
1438 AddDetector(cons);
1439
1440}// G4GMocrenFileSceneHandler::AddSolid( cons )
1441
1442
1443//----- Add trd
1445{
1447 G4cout << "***** AddSolid ( trd )" << G4endl;
1448
1449
1450 //----- skip drawing invisible primitive
1451 if( !IsVisible() ) { return ; }
1452
1453 //----- Initialize if necessary
1455
1456 //
1457 AddDetector(trd);
1458
1459} // G4GMocrenFileSceneHandler::AddSolid ( trd )
1460
1461
1462//----- Add sphere
1464{
1466 G4cout << "***** AddSolid ( sphere )" << G4endl;
1467
1468 //----- skip drawing invisible primitive
1469 if( !IsVisible() ) { return ; }
1470
1471 //----- Initialize if necessary
1473
1474 //
1475 AddDetector(sphere);
1476
1477} // G4GMocrenFileSceneHandler::AddSolid ( sphere )
1478
1479
1480//----- Add para
1482{
1484 G4cout << "***** AddSolid ( para )" << G4endl;
1485
1486 //----- skip drawing invisible primitive
1487 if( !IsVisible() ) { return ; }
1488
1489 //----- Initialize if necessary
1491
1492 //
1493 AddDetector(para);
1494
1495} // G4GMocrenFileSceneHandler::AddSolid ( para )
1496
1497
1498//----- Add trap
1500{
1502 G4cout << "***** AddSolid ( trap )" << G4endl;
1503
1504 //----- skip drawing invisible primitive
1505 if( !IsVisible() ) { return ; }
1506
1507 //----- Initialize if necessary
1509
1510 //
1511 AddDetector(trap);
1512
1513} // G4GMocrenFileSceneHandler::AddSolid (const G4Trap& trap)
1514
1515
1516//----- Add torus
1517void
1519{
1521 G4cout << "***** AddSolid ( torus )" << G4endl;
1522
1523 //----- skip drawing invisible primitive
1524 if( !IsVisible() ) { return ; }
1525
1526 //----- Initialize if necessary
1528
1529 //
1530 AddDetector(torus);
1531
1532} // void G4GMocrenFileSceneHandler::AddSolid( const G4Torus& )
1533
1534
1535
1536//----- Add a shape which is not treated above
1538{
1539 //----- skip drawing invisible primitive
1540 if( !IsVisible() ) { return ; }
1541
1542 //----- Initialize if necessary
1544
1545 //
1546 AddDetector(solid);
1547
1548 //----- Send a primitive
1549 G4VSceneHandler::AddSolid( solid ) ;
1550
1551} //G4GMocrenFileSceneHandler::AddSolid ( const G4VSolid& )
1552
1553#include "G4TrajectoriesModel.hh"
1554#include "G4VTrajectory.hh"
1555#include "G4VTrajectoryPoint.hh"
1556
1557//----- Add a trajectory
1559
1560 kbModelingTrajectory = true;
1561
1563
1564 if(GFDEBUG_TRK) {
1565 G4cout << " ::AddCompound(const G4VTrajectory&) >>>>>>>>> " << G4endl;
1566 G4TrajectoriesModel * pTrModel = dynamic_cast<G4TrajectoriesModel*>(fpModel);
1567 if (!pTrModel) {
1569 ("G4VSceneHandler::AddCompound(const G4VTrajectory&)",
1570 "gMocren0013", FatalException, "Not a G4TrajectoriesModel.");
1571 } else {
1572 traj.DrawTrajectory(pTrModel->GetDrawingMode());
1573
1574 const G4VTrajectory * trj = pTrModel->GetCurrentTrajectory();
1575 G4cout << "------ track" << G4endl;
1576 G4cout << " name: " << trj->GetParticleName() << G4endl;
1577 G4cout << " id: " << trj->GetTrackID() << G4endl;
1578 G4cout << " charge: " << trj->GetCharge() << G4endl;
1579 G4cout << " momentum: " << trj->GetInitialMomentum() << G4endl;
1580
1581 G4int nPnt = trj->GetPointEntries();
1582 G4cout << " point: ";
1583 for(G4int i = 0; i < nPnt; i++) {
1584 G4cout << trj->GetPoint(i)->GetPosition() << ", ";
1585 }
1586 G4cout << G4endl;
1587 }
1588 G4cout << G4endl;
1589 }
1590
1591 kbModelingTrajectory = false;
1592}
1593
1594#include <vector>
1595#include "G4VHit.hh"
1596#include "G4AttValue.hh"
1597//----- Add a hit
1599 if(GFDEBUG_HIT) G4cout << " ::AddCompound(const G4VHit&) >>>>>>>>> " << G4endl;
1600
1602
1603 /*
1604 const std::map<G4String, G4AttDef> * map = hit.GetAttDefs();
1605 if(!map) return;
1606 std::map<G4String, G4AttDef>::const_iterator itr = map->begin();
1607 for(; itr != map->end(); itr++) {
1608 G4cout << itr->first << " : " << itr->second.GetName()
1609 << " , " << itr->second.GetDesc() << G4endl;
1610 }
1611 */
1612
1613 std::vector<G4String> hitNames = kMessenger.getHitNames();
1614 if(GFDEBUG_HIT) {
1615 std::vector<G4String>::iterator itr = hitNames.begin();
1616 for(; itr != hitNames.end(); itr++)
1617 G4cout << " hit name : " << *itr << G4endl;
1618 }
1619
1620 std::vector<G4AttValue> * attval = hit.CreateAttValues();
1621 if(!attval) {G4cout << "0 empty " << (unsigned long)attval << G4endl;}
1622 else {
1623
1624 G4bool bid[3] = {false, false, false};
1625 Index3D id;
1626
1627 std::vector<G4AttValue>::iterator itr;
1628 // First, get IDs
1629 for(itr = attval->begin(); itr != attval->end(); itr++) {
1630 std::string stmp = itr->GetValue();
1631 std::istringstream sval(stmp.c_str());
1632
1633 if(itr->GetName() == G4String("XID")) {
1634 sval >> id.x;
1635 bid[0] = true;
1636 continue;
1637 }
1638 if(itr->GetName() == G4String("YID")) {
1639 sval >> id.y;
1640 bid[1] = true;
1641 continue;
1642 }
1643 if(itr->GetName() == G4String("ZID")) {
1644 sval >> id.z;
1645 bid[2] = true;
1646 continue;
1647 }
1648 }
1649
1650 G4int nhitname = (G4int)hitNames.size();
1651
1652 if(bid[0] && bid[1] && bid[2]) {
1653
1654 if(GFDEBUG_HIT)
1655 G4cout << " Hit : index(" << id.x << ", " << id.y << ", "
1656 << id.z << ")" << G4endl;
1657
1658 // Get attributes
1659 for(itr = attval->begin(); itr != attval->end(); itr++) {
1660 for(G4int i = 0; i < nhitname; i++) {
1661 if(itr->GetName() == hitNames[i]) {
1662
1663 std::string stmp = itr->GetValue();
1664 std::istringstream sval(stmp.c_str());
1665 G4double value;
1666 G4String unit;
1667 sval >> value >> unit;
1668
1669 std::map<G4String, std::map<Index3D, G4double> >::iterator kNestedHitsListItr;
1670 kNestedHitsListItr = kNestedHitsList.find(hitNames[i]);
1671 if(kNestedHitsListItr != kNestedHitsList.end()) {
1672 //fTempNestedHits = &kNestedHitsListItr->second;
1673 //(*fTempNestedHits)[id] = value;
1674 kNestedHitsListItr->second[id] = value;
1675 } else {
1676 std::map<Index3D, G4double> hits;
1677 hits.insert(std::map<Index3D, G4double>::value_type(id, value));
1678 kNestedHitsList[hitNames[i]] = hits;
1679 }
1680
1681
1682 if(GFDEBUG_HIT)
1683 G4cout << " : " << hitNames[i] << " -> " << value
1684 << " [" << unit << "]" << G4endl;
1685 }
1686 }
1687 }
1688 } else {
1689 G4Exception("G4GMocrenFileSceneHandler::AddCompound(const G4VHit &)",
1690 "gMocren0014", FatalException, "Error");
1691 }
1692
1693 delete attval;
1694 }
1695
1696}
1697
1699 if(GFDEBUG_DIGI) G4cout << " ::AddCompound(const G4VDigi&) >>>>>>>>> " << G4endl;
1701}
1702
1704 if(GFDEBUG_HIT)
1705 G4cout << " ::AddCompound(const std::map<G4int, G4double*> &) >>>>>>>>> " << G4endl;
1706
1707
1708 std::vector<G4String> hitScorerNames = kMessenger.getHitScorerNames();
1709 G4int nhitname = (G4int)hitScorerNames.size();
1710 G4String scorername = static_cast<G4VHitsCollection>(hits).GetName();
1711
1712 //-- --//
1713 /*
1714 std::vector<G4String> hitScorerNames = kMessenger.getHitScorerNames();
1715 if(GFDEBUG_HIT) {
1716 std::vector<G4String>::iterator itr = hitScorerNames.begin();
1717 for(; itr != hitScorerNames.end(); itr++)
1718 G4cout << " PS name : " << *itr << G4endl;
1719 }
1720 */
1721
1722 { // Scope bracket to avoid compiler messages about shadowing (JA).
1723 //for(G4int i = 0; i < nhitname; i++) { // this selection trusts
1724 //if(scorername == hitScorerNames[i]) { // thea command /vis/scene/add/psHits hit_name.
1725
1726 G4int idx[3];
1727 std::map<G4int, G4double*> * map = hits.GetMap();
1728 std::map<G4int, G4double*>::const_iterator itr = map->begin();
1729 for(; itr != map->end(); itr++) {
1730 GetNestedVolumeIndex(itr->first, idx);
1731 Index3D id(idx[0], idx[1], idx[2]);
1732
1733 std::map<G4String, std::map<Index3D, G4double> >::iterator nestedHitsListItr;
1734 nestedHitsListItr = kNestedHitsList.find(scorername);
1735 if(nestedHitsListItr != kNestedHitsList.end()) {
1736 nestedHitsListItr->second[id] = *itr->second;
1737 } else {
1738 std::map<Index3D, G4double> hit;
1739 hit.insert(std::map<Index3D, G4double>::value_type(id, *itr->second));
1740 kNestedHitsList[scorername] = hit;
1741 }
1742 }
1743
1744 //break;
1745 //}
1746 //}
1747 }
1748
1749 if(GFDEBUG_HIT) {
1750 G4String meshname = static_cast<G4VHitsCollection>(hits).GetSDname();
1751 G4cout << " >>>>> " << meshname << " : " << scorername << G4endl;
1752
1753 for(G4int i = 0; i < nhitname; i++)
1754 if(scorername == hitScorerNames[i])
1755 G4cout << " !!!! Hit scorer !!!! " << scorername << G4endl;
1756
1757 G4cout << " dimension: "
1758 << kNestedVolumeDimension[0] << " x "
1759 << kNestedVolumeDimension[1] << " x "
1760 << kNestedVolumeDimension[2] << G4endl;
1761
1762 G4int id[3];
1763 std::map<G4int, G4double*> * map = hits.GetMap();
1764 std::map<G4int, G4double*>::const_iterator itr = map->begin();
1765 for(; itr != map->end(); itr++) {
1766 GetNestedVolumeIndex(itr->first, id);
1767 G4cout << "[" << itr->first << "] "
1768 << "("<< id[0] << "," << id[1] << "," << id[2] << ")"
1769 << *itr->second << ", ";
1770 }
1771 G4cout << G4endl;
1772 }
1773
1774}
1775
1776//-----
1777G4bool G4GMocrenFileSceneHandler::IsVisible()
1778{
1779 //-----
1780 G4bool visibility = true ;
1781
1782 const G4VisAttributes* pVisAttribs =
1784
1785 if(pVisAttribs) {
1786 visibility = pVisAttribs->IsVisible();
1787 }
1788
1789 return visibility ;
1790
1791} // G4GMocrenFileSceneHandler::IsVisible()
1792
1793
1794//-----
1796{
1797 // This is typically called after an update and before drawing hits
1798 // of the next event. To simulate the clearing of "transients"
1799 // (hits, etc.) the detector is redrawn...
1800 if (fpViewer) {
1801 fpViewer -> SetView ();
1802 fpViewer -> ClearView ();
1803 fpViewer -> DrawView ();
1804 }
1805}
1806
1807//-----
1808void G4GMocrenFileSceneHandler::AddDetector(const G4VSolid & solid) {
1809
1810 Detector detector;
1811
1812 // detector name
1813 detector.name = solid.GetName();
1814 if(GFDEBUG_DET > 1)
1815 G4cout << "0 Detector name : " << detector.name << G4endl;
1816
1817 const G4VModel* pv_model = GetModel();
1818 if (!pv_model) { return ; }
1819 G4PhysicalVolumeModel* pPVModel =
1820 dynamic_cast<G4PhysicalVolumeModel*>(fpModel);
1821 if (!pPVModel) { return ; }
1822
1823 // edge points of the detector
1824 std::vector<G4float *> dedges;
1825 G4Polyhedron * poly = solid.CreatePolyhedron();
1826 detector.polyhedron = poly;
1827 detector.transform3D = fObjectTransformation;
1828
1829 // retrieve color
1830 unsigned char uccolor[3] = {30, 30, 30};
1831 if(pPVModel->GetCurrentLV()->GetVisAttributes()) {
1832 G4Color color = pPVModel->GetCurrentLV()->GetVisAttributes()->GetColor();
1833 uccolor[0] = (unsigned char)(color.GetRed()*255);
1834 uccolor[1] = (unsigned char)(color.GetGreen()*255);
1835 uccolor[2] = (unsigned char)(color.GetBlue()*255);
1836 //if(uccolor[0] < 2 && uccolor[1] < 2 && uccolor[2] < 2)
1837 //uccolor[0] = uccolor[1] = uccolor[2] = 30; // dark grey
1838 }
1839 for(G4int i = 0; i < 3; i++) detector.color[i] = uccolor[i];
1840 //
1841 kDetectors.push_back(detector);
1842
1843 if(GFDEBUG_DET > 1) {
1844 G4cout << "0 color: (" << (G4int)uccolor[0] << ", "
1845 << (G4int)uccolor[1] << ", " << (G4int)uccolor[2] << ")"
1846 << G4endl;
1847 }
1848
1849}
1850
1851//-----
1852void G4GMocrenFileSceneHandler::ExtractDetector() {
1853
1854 std::vector<Detector>::iterator itr = kDetectors.begin();
1855
1856 for(; itr != kDetectors.end(); itr++) {
1857
1858 // detector name
1859 G4String detname = itr->name;
1860 if(GFDEBUG_DET > 1)
1861 G4cout << "Detector name : " << detname << G4endl;
1862
1863 // edge points of the detector
1864 std::vector<G4float *> dedges;
1865 G4Polyhedron * poly = itr->polyhedron;
1866 poly->Transform(itr->transform3D);
1867 G4Transform3D invVolTrans = kVolumeTrans3D.inverse();
1868 poly->Transform(invVolTrans);
1869
1870 G4Point3D v1, v2;
1871 G4bool bnext = true;
1872 G4int next;
1873 G4int nedges = 0;
1874 //
1875 while(bnext) {
1876 if(!(poly->GetNextEdge(v1, v2, next))) bnext =false;
1877 G4float * edge = new G4float[6];
1878 edge[0] = v1.x()/mm;
1879 edge[1] = v1.y()/mm;
1880 edge[2] = v1.z()/mm;
1881 edge[3] = v2.x()/mm;
1882 edge[4] = v2.y()/mm;
1883 edge[5] = v2.z()/mm;
1884 dedges.push_back(edge);
1885 nedges++;
1886 }
1887 //delete poly;
1888 // detector color
1889 unsigned char uccolor[3] = {itr->color[0],
1890 itr->color[1],
1891 itr->color[2]};
1892 //
1893 kgMocrenIO->addDetector(detname, dedges, uccolor);
1894 for(G4int i = 0; i < nedges; i++) { // # of edges is 12.
1895 delete [] dedges[i];
1896 }
1897 dedges.clear();
1898
1899 if(GFDEBUG_DET > 1) {
1900 G4cout << " color: (" << (G4int)uccolor[0] << ", "
1901 << (G4int)uccolor[1] << ", " << (G4int)uccolor[2] << ")"
1902 << G4endl;
1903 }
1904 }
1905}
1906
1907void G4GMocrenFileSceneHandler::GetNestedVolumeIndex(G4int _idx, G4int _idx3d[3]) {
1908 if(kNestedVolumeDimension[0] == 0 ||
1909 kNestedVolumeDimension[1] == 0 ||
1910 kNestedVolumeDimension[2] == 0) {
1911 for(G4int i = 0; i < 3; i++) _idx3d[i] = 0;
1912 return;
1913 }
1914
1915
1916 if(kFlagParameterization == 0) {
1917
1918 G4int plane = kNestedVolumeDimension[2]*kNestedVolumeDimension[1];
1919 G4int line = kNestedVolumeDimension[2];
1920
1921 /*
1922 G4int idx3d[3];
1923 idx3d[0] = _idx/plane;
1924 idx3d[1] = (_idx%plane)/line;
1925 idx3d[2] = (_idx%plane)%line;
1926 _idx3d[0] = idx3d[kNestedVolumeDirAxis[0]];
1927 _idx3d[1] = idx3d[kNestedVolumeDirAxis[1]];
1928 _idx3d[2] = idx3d[kNestedVolumeDirAxis[2]];
1929 */
1930
1931 _idx3d[kNestedVolumeDirAxis[0]] = _idx/plane;
1932 _idx3d[kNestedVolumeDirAxis[1]] = (_idx%plane)/line;
1933 _idx3d[kNestedVolumeDirAxis[2]] = (_idx%plane)%line;
1934
1935
1936
1937 /*
1938
1939 G4cout << "G4GMocrenFileSceneHandler::GetNestedVolumeIndex : " << G4endl;
1940 G4cout << "(depi, depj, depk) : "
1941 << kNestedVolumeDirAxis[0] << ", "
1942 << kNestedVolumeDirAxis[1] << ", "
1943 << kNestedVolumeDirAxis[2] << G4endl;
1944 G4cout << "(ni, nj, nk) :"
1945 << kNestedVolumeDimension[0] << ", "
1946 << kNestedVolumeDimension[1] << ", "
1947 << kNestedVolumeDimension[2] << " - " << G4endl;
1948
1949 G4cout << " _idx = " << _idx << " : plane = "
1950 << plane << " , line = " << line << G4endl;
1951 G4cout << "(idx,idy,idz) + " << _idx3d[0] << ", "
1952 << _idx3d[1] << ", " << _idx3d[2] << " + " << G4endl;
1953
1954 */
1955
1956
1957
1958 } else {
1959
1960 G4int plane = kNestedVolumeDimension[0]*kNestedVolumeDimension[1];
1961 G4int line = kNestedVolumeDimension[0];
1962 _idx3d[kNestedVolumeDirAxis[2]] = _idx/plane;
1963 _idx3d[kNestedVolumeDirAxis[1]] = (_idx%plane)/line;
1964 _idx3d[kNestedVolumeDirAxis[0]] = (_idx%plane)%line;
1965
1966 }
1967
1968}
1969
1970
1971//-- --//
1972G4GMocrenFileSceneHandler::Detector::Detector()
1973 : polyhedron(0) {
1974 color[0] = color[1] = color[2] = 255;
1975}
1976G4GMocrenFileSceneHandler::Detector::~Detector() {
1977 if(!polyhedron) delete polyhedron;
1978}
1979void G4GMocrenFileSceneHandler::Detector::clear() {
1980 name.clear();
1981 if(!polyhedron) delete polyhedron;
1982 color[0] = color[1] = color[2] = 255;
1983 transform3D = G4Transform3D::Identity;
1984}
1985
1986//-- --//
1987G4GMocrenFileSceneHandler::Index3D::Index3D()
1988 : x(0), y(0), z(0) {
1989 ;
1990}
1991
1992G4GMocrenFileSceneHandler::Index3D::Index3D(const Index3D & _index3D)
1993 : x(_index3D.x), y(_index3D.y), z(_index3D.z) {
1994 //: x(_index3D.X()),
1995 //y(_index3D.Y()),
1996 //z(_index3D.Z()) {
1997 // : x(static_cast<Index3D>(_index3D).x),
1998 // y(static_cast<Index3D>(_index3D).y),
1999 // z(static_cast<Index3D>(_index3D).z) {
2000 ;
2001}
2002
2003G4GMocrenFileSceneHandler::Index3D::Index3D(G4int _x, G4int _y, G4int _z)
2004 : x(_x), y(_y), z(_z) {
2005 ;
2006}
2007G4bool G4GMocrenFileSceneHandler::Index3D::operator < (const Index3D & _right) const {
2008 if(z < static_cast<Index3D>(_right).z) {
2009 return true;
2010 } else if(z == _right.z) {
2011 if(y < static_cast<Index3D>(_right).y) return true;
2012 else if(y == _right.y)
2013 if(x < static_cast<Index3D>(_right).x) return true;
2014 }
2015 return false;
2016}
2017G4bool G4GMocrenFileSceneHandler::Index3D::operator == (const Index3D & _right) const {
2018 if(z == _right.z && y == _right.y && x == _right.x) return true;
2019 return false;
2020}
const int FR_MAX_FILE_NUM
@ JustWarning
@ FatalException
const G4bool GFDEBUG
const G4bool GFDEBUG_TRK
const G4bool GFDEBUG_DIGI
const G4bool GFDEBUG_HIT
const G4int FR_MAX_FILE_NUM
const G4int GFDEBUG_DET
const char GDD_FILE_HEADER[]
const char DEFAULT_GDD_FILE_NAME[]
const G4int MAX_NUM_TRAJECTORIES
double G4double
Definition: G4Types.hh:64
float G4float
Definition: G4Types.hh:65
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
double z() const
double x() const
double y() const
Hep3Vector & transform(const HepRotation &)
Definition: ThreeVectorR.cc:24
void set(double x, double y, double z)
HepRotation inverse() const
bool isIdentity() const
Definition: Rotation.cc:172
Definition: G4Box.hh:55
G4double GetYHalfLength() const
G4double GetZHalfLength() const
G4double GetXHalfLength() const
G4Polyhedron * CreatePolyhedron() const
Definition: G4Box.cc:1052
G4double GetBlue() const
Definition: G4Colour.hh:140
G4double GetRed() const
Definition: G4Colour.hh:138
G4double GetGreen() const
Definition: G4Colour.hh:139
Definition: G4Cons.hh:75
G4double GetDensity(G4int &_ct) const
G4GMocrenFileSceneHandler(G4GMocrenFile &system, G4GMocrenMessenger &messenger, const G4String &name="")
void AddCompound(const G4VTrajectory &traj)
virtual void BeginPrimitives(const G4Transform3D &objectTransformation)
void AddPrimitive(const G4Polyline &line)
void setModalityImageSize(int _size[3])
void setDoseDistUnit(std::string &_unit, int _num=0)
short convertDensityToHU(float &_dens)
void setDoseDistMinMax(short _minmax[2], int _num=0)
void setDoseDistScale(double &_scale, int _num=0)
void setModalityImageDensityMap(std::vector< float > &_map)
void translateDetector(std::vector< float > &_translate)
void clearDetector()
Definition: G4GMocrenIO.hh:451
void clearROIAll()
void setVoxelSpacing(float _spacing[3])
void setDoseDistName(std::string _name, int _num=0)
bool storeData(char *_filename)
Definition: G4GMocrenIO.cc:457
void setModalityImage(short *_image)
void setDoseDistSize(int _size[3], int _num=0)
void setModalityImageMinMax(short _minmax[2])
void newDoseDist()
void clearDoseDistAll()
void clearTracks()
Definition: G4GMocrenIO.hh:439
void addDetector(std::string &_name, std::vector< float * > &_det, unsigned char _color[3])
void setDoseDist(double *_image, int _num=0)
void translateTracks(std::vector< float > &_translateo)
void addTrack(float *_tracks)
virtual std::vector< G4String > getHitNames()
virtual std::vector< G4String > getHitScorerNames()
virtual G4bool getDrawVolumeGrid()
virtual G4String getVolumeName()
G4VSolid * GetSolid() const
const G4VisAttributes * GetVisAttributes() const
G4int GetNoDaughters() const
G4VPhysicalVolume * GetDaughter(const G4int i) const
G4double GetDensity() const
Definition: G4Material.hh:179
const G4String & GetName() const
Definition: G4Material.hh:177
Definition: G4Para.hh:77
size_t GetNoVoxelY() const
G4double GetVoxelHalfZ() const
G4double GetVoxelHalfY() const
virtual G4Material * ComputeMaterial(const G4int repNo, G4VPhysicalVolume *currentVol, const G4VTouchable *parentTouch=0)
G4double GetVoxelHalfX() const
size_t GetNoVoxelZ() const
size_t GetNoVoxelX() const
const std::vector< G4PhysicalVolumeNodeID > & GetDrawnPVPath() const
G4VPhysicalVolume * GetCurrentPV() const
G4LogicalVolume * GetCurrentLV() const
G4VPhysicalVolume * GetTopPhysicalVolume() const
G4Material * GetCurrentMaterial() const
const std::vector< Model > & GetEndOfEventModelList() const
G4VScoringMesh * FindMesh(const G4String &)
static G4ScoringManager * GetScoringManager()
std::map< G4int, T * > * GetMap() const
Definition: G4THitsMap.hh:68
Definition: G4Text.hh:73
const G4VTrajectory * GetCurrentTrajectory() const
Definition: G4Trd.hh:63
Definition: G4Tubs.hh:77
G4Polyhedron * CreatePolyhedron() const
Definition: G4Tubs.cc:1923
Definition: G4VHit.hh:49
virtual std::vector< G4AttValue > * CreateAttValues() const
Definition: G4VHit.hh:67
virtual void ComputeDimensions(G4Box &, const G4int, const G4VPhysicalVolume *) const
virtual void ComputeTransformation(const G4int no, G4VPhysicalVolume *currentPV) const =0
virtual G4Material * ComputeMaterial(G4VPhysicalVolume *currentVol, const G4int repNo, const G4VTouchable *parentTouch=0)=0
virtual G4bool IsNested() const
virtual G4bool IsReplicated() const =0
G4LogicalVolume * GetLogicalVolume() const
virtual G4int GetMultiplicity() const
virtual void GetReplicationData(EAxis &axis, G4int &nReplicas, G4double &width, G4double &offset, G4bool &consuming) const =0
virtual G4int GetCopyNo() const =0
const G4String & GetName() const
virtual G4VPVParameterisation * GetParameterisation() const =0
G4ThreeVector GetObjectTranslation() const
virtual G4bool IsParameterised() const =0
virtual void BeginModeling()
G4VModel * GetModel() const
G4Scene * GetScene() const
G4Transform3D fObjectTransformation
virtual void EndPrimitives()
virtual void EndModeling()
G4VViewer * fpViewer
const G4String & GetName() const
virtual void BeginPrimitives(const G4Transform3D &objectTransformation)
const G4VisAttributes * fpVisAttribs
virtual void AddSolid(const G4Box &)
virtual void AddCompound(const G4VTrajectory &)
G4ThreeVector GetTranslation() const
G4ThreeVector GetSize() const
void GetNumberOfSegments(G4int nSegment[3])
G4RotationMatrix GetRotationMatrix() const
G4String GetName() const
virtual G4Polyhedron * CreatePolyhedron() const
Definition: G4VSolid.cc:637
virtual G4GeometryType GetEntityType() const =0
virtual const G4ThreeVector GetPosition() const =0
virtual G4VTrajectoryPoint * GetPoint(G4int i) const =0
virtual int GetPointEntries() const =0
virtual G4String GetParticleName() const =0
virtual G4int GetTrackID() const =0
virtual void DrawTrajectory(G4int i_mode=0) const
virtual G4ThreeVector GetInitialMomentum() const =0
virtual G4double GetCharge() const =0
const G4VisAttributes * GetApplicableVisAttributes(const G4VisAttributes *) const
Definition: G4VViewer.cc:78
const G4Color & GetColor() const
G4bool IsVisible() const
static Verbosity GetVerbosity()
const G4VisAttributes * GetVisAttributes() const
static const Transform3D Identity
Definition: Transform3D.h:197
CLHEP::HepRotation getRotation() const
CLHEP::Hep3Vector getTranslation() const
Transform3D inverse() const
Definition: Transform3D.cc:142
G4Point3D GetVertex(G4int index) const
HepPolyhedron & Transform(const G4Transform3D &t)
G4int GetNoFacets() const
G4bool GetNextVertexIndex(G4int &index, G4int &edgeFlag) const
G4int GetNoVertices() const
G4bool GetNextEdge(G4Point3D &p1, G4Point3D &p2, G4int &edgeFlag) const
EAxis
Definition: geomdefs.hh:54
@ kYAxis
Definition: geomdefs.hh:54
@ kXAxis
Definition: geomdefs.hh:54
@ kZAxis
Definition: geomdefs.hh:54
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
#define DBL_MAX
Definition: templates.hh:83