Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4ScoringBox.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//
28
29#include "G4ScoringBox.hh"
30
31#include "G4Box.hh"
32#include "G4LogicalVolume.hh"
33#include "G4VPhysicalVolume.hh"
34#include "G4PVPlacement.hh"
35#include "G4PVReplica.hh"
36#include "G4PVDivision.hh"
37#include "G4VisAttributes.hh"
38#include "G4VVisManager.hh"
39#include "G4VScoreColorMap.hh"
40
42#include "G4VPrimitiveScorer.hh"
43#include "G4Polyhedron.hh"
44
45#include "G4ScoringManager.hh"
46#include "G4StatDouble.hh"
47
48#include "G4SystemOfUnits.hh"
49
50#include <map>
51#include <fstream>
52
54 : G4VScoringMesh(wName)
55 , fSegmentDirection(-1)
56{
58 fDivisionAxisNames[0] = "X";
59 fDivisionAxisNames[1] = "Y";
60 fDivisionAxisNames[2] = "Z";
61}
62
64{
65 if(verboseLevel > 9)
66 G4cout << "G4ScoringBox::SetupGeometry() ..." << G4endl;
67
68 // World
69 G4VPhysicalVolume* scoringWorld = fWorldPhys;
70 G4LogicalVolume* worldLogical = scoringWorld->GetLogicalVolume();
71
72 // Scoring Mesh
73 if(verboseLevel > 9)
75 G4String boxName = fWorldName;
76
77 if(verboseLevel > 9)
78 G4cout << fSize[0] << ", " << fSize[1] << ", " << fSize[2] << G4endl;
79 G4VSolid* boxSolid = new G4Box(boxName + "0", fSize[0], fSize[1], fSize[2]);
80 auto boxLogical =
81 new G4LogicalVolume(boxSolid, nullptr, boxName + "_0");
82 new G4PVPlacement(fRotationMatrix, fCenterPosition, boxLogical, boxName + "0",
83 worldLogical, false, 0);
84
85 G4String layerName[2] = { boxName + "_1", boxName + "_2" };
86 G4VSolid* layerSolid[2];
87 G4LogicalVolume* layerLogical[2];
88
89 //-- fisrt nested layer (replicated to x direction)
90 if(verboseLevel > 9)
91 G4cout << "layer 1 :" << G4endl;
92 layerSolid[0] =
93 new G4Box(layerName[0], fSize[0] / fNSegment[0], fSize[1], fSize[2]);
94 layerLogical[0] = new G4LogicalVolume(layerSolid[0], nullptr, layerName[0]);
95 if(fNSegment[0] > 1)
96 {
97 if(verboseLevel > 9)
98 G4cout << "G4ScoringBox::Construct() : Replicate to x direction"
99 << G4endl;
101 {
102 new G4PVReplica(layerName[0], layerLogical[0], boxLogical, kXAxis,
103 fNSegment[0], fSize[0] / fNSegment[0] * 2.);
104 }
105 else
106 {
107 new G4PVDivision(layerName[0], layerLogical[0], boxLogical, kXAxis,
108 fNSegment[0], 0.);
109 }
110 }
111 else if(fNSegment[0] == 1)
112 {
113 if(verboseLevel > 9)
114 G4cout << "G4ScoringBox::Construct() : Placement" << G4endl;
115 new G4PVPlacement(nullptr, G4ThreeVector(0., 0., 0.), layerLogical[0],
116 layerName[0], boxLogical, false, 0);
117 }
118 else
119 G4cerr << "ERROR : G4ScoringBox::SetupGeometry() : invalid parameter ("
120 << fNSegment[0] << ") "
121 << "in placement of the first nested layer." << G4endl;
122
123 if(verboseLevel > 9)
124 {
125 G4cout << fSize[0] / fNSegment[0] << ", " << fSize[1] << ", " << fSize[2]
126 << G4endl;
127 G4cout << layerName[0] << ": kXAxis, " << fNSegment[0] << ", "
128 << 2. * fSize[0] / fNSegment[0] << G4endl;
129 }
130
131 // second nested layer (replicated to y direction)
132 if(verboseLevel > 9)
133 G4cout << "layer 2 :" << G4endl;
134 layerSolid[1] = new G4Box(layerName[1], fSize[0] / fNSegment[0],
135 fSize[1] / fNSegment[1], fSize[2]);
136 layerLogical[1] = new G4LogicalVolume(layerSolid[1], nullptr, layerName[1]);
137 if(fNSegment[1] > 1)
138 {
139 if(verboseLevel > 9)
140 G4cout << "G4ScoringBox::Construct() : Replicate to y direction"
141 << G4endl;
143 {
144 new G4PVReplica(layerName[1], layerLogical[1], layerLogical[0], kYAxis,
145 fNSegment[1], fSize[1] / fNSegment[1] * 2.);
146 }
147 else
148 {
149 new G4PVDivision(layerName[1], layerLogical[1], layerLogical[0], kYAxis,
150 fNSegment[1], 0.);
151 }
152 }
153 else if(fNSegment[1] == 1)
154 {
155 if(verboseLevel > 9)
156 G4cout << "G4ScoringBox::Construct() : Placement" << G4endl;
157 new G4PVPlacement(nullptr, G4ThreeVector(0., 0., 0.), layerLogical[1],
158 layerName[1], layerLogical[0], false, 0);
159 }
160 else
161 G4cerr << "ERROR : G4ScoringBox::SetupGeometry() : invalid parameter ("
162 << fNSegment[1] << ") "
163 << "in placement of the second nested layer." << G4endl;
164
165 if(verboseLevel > 9)
166 {
167 G4cout << fSize[0] / fNSegment[0] << ", " << fSize[1] / fNSegment[1] << ", "
168 << fSize[2] << G4endl;
169 G4cout << layerName[1] << ": kYAxis, " << fNSegment[1] << ", "
170 << 2. * fSize[1] / fNSegment[1] << G4endl;
171 }
172
173 // mesh elements (replicated to z direction)
174 if(verboseLevel > 9)
175 G4cout << "mesh elements :" << G4endl;
176 G4String elementName = boxName + "_3";
177 G4VSolid* elementSolid =
178 new G4Box(elementName, fSize[0] / fNSegment[0], fSize[1] / fNSegment[1],
179 fSize[2] / fNSegment[2]);
180 fMeshElementLogical = new G4LogicalVolume(elementSolid, nullptr, elementName);
181 if(fNSegment[2] > 1)
182 {
183 if(verboseLevel > 9)
184 G4cout << "G4ScoringBox::Construct() : Replicate to z direction"
185 << G4endl;
186
188 {
189 new G4PVReplica(elementName, fMeshElementLogical, layerLogical[1], kZAxis,
190 fNSegment[2], 2. * fSize[2] / fNSegment[2]);
191 }
192 else
193 {
194 new G4PVDivision(elementName, fMeshElementLogical, layerLogical[1],
195 kZAxis, fNSegment[2], 0.);
196 }
197 }
198 else if(fNSegment[2] == 1)
199 {
200 if(verboseLevel > 9)
201 G4cout << "G4ScoringBox::Construct() : Placement" << G4endl;
202 new G4PVPlacement(nullptr, G4ThreeVector(0., 0., 0.), fMeshElementLogical,
203 elementName, layerLogical[1], false, 0);
204 }
205 else
206 G4cerr << "ERROR : G4ScoringBox::SetupGeometry() : "
207 << "invalid parameter (" << fNSegment[2] << ") "
208 << "in mesh element placement." << G4endl;
209
210 if(verboseLevel > 9)
211 {
212 G4cout << fSize[0] / fNSegment[0] << ", " << fSize[1] / fNSegment[1] << ", "
213 << fSize[2] / fNSegment[2] << G4endl;
214 G4cout << elementName << ": kZAxis, " << fNSegment[2] << ", "
215 << 2. * fSize[2] / fNSegment[2] << G4endl;
216 }
217
218 // set the sensitive detector
220
221 // vis. attributes
222 auto visatt = new G4VisAttributes(G4Colour(.5, .5, .5));
223 visatt->SetVisibility(false);
224 layerLogical[0]->SetVisAttributes(visatt);
225 layerLogical[1]->SetVisAttributes(visatt);
226 visatt->SetVisibility(true);
228}
229
231{
232 G4cout << "G4ScoringBox : " << fWorldName << " --- Shape: Box mesh" << G4endl;
233 G4cout << " Size (x, y, z): (" << fSize[0] / cm << ", " << fSize[1] / cm
234 << ", " << fSize[2] / cm << ") [cm]" << G4endl;
235
237}
238
240{
242 if(pVisManager != nullptr)
243 {
244 // cell vectors
245 std::vector<std::vector<std::vector<double>>> cell; // cell[X][Y][Z]
246 std::vector<double> ez;
247 for(int z = 0; z < fNSegment[2]; z++)
248 ez.push_back(0.);
249 std::vector<std::vector<double>> eyz;
250 for(int y = 0; y < fNSegment[1]; y++)
251 eyz.push_back(ez);
252 for(int x = 0; x < fNSegment[0]; x++)
253 cell.push_back(eyz);
254
255 std::vector<std::vector<double>> xycell; // xycell[X][Y]
256 std::vector<double> ey;
257 for(int y = 0; y < fNSegment[1]; y++)
258 ey.push_back(0.);
259 for(int x = 0; x < fNSegment[0]; x++)
260 xycell.push_back(ey);
261
262 std::vector<std::vector<double>> yzcell; // yzcell[Y][Z]
263 for(int y = 0; y < fNSegment[1]; y++)
264 yzcell.push_back(ez);
265
266 std::vector<std::vector<double>> xzcell; // xzcell[X][Z]
267 for(int x = 0; x < fNSegment[0]; x++)
268 xzcell.push_back(ez);
269
270 // projections
271 G4int q[3];
272 auto itr = map->GetMap()->begin();
273 for(; itr != map->GetMap()->end(); itr++)
274 {
275 GetXYZ(itr->first, q);
276
277 xycell[q[0]][q[1]] += (itr->second->sum_wx()) / fDrawUnitValue;
278 yzcell[q[1]][q[2]] += (itr->second->sum_wx()) / fDrawUnitValue;
279 xzcell[q[0]][q[2]] += (itr->second->sum_wx()) / fDrawUnitValue;
280 }
281
282 // search max. & min. values in each slice
283 G4double xymin = DBL_MAX, yzmin = DBL_MAX, xzmin = DBL_MAX;
284 G4double xymax = 0., yzmax = 0., xzmax = 0.;
285 for(int x = 0; x < fNSegment[0]; x++)
286 {
287 for(int y = 0; y < fNSegment[1]; y++)
288 {
289 if(xymin > xycell[x][y])
290 xymin = xycell[x][y];
291 if(xymax < xycell[x][y])
292 xymax = xycell[x][y];
293 }
294 for(int z = 0; z < fNSegment[2]; z++)
295 {
296 if(xzmin > xzcell[x][z])
297 xzmin = xzcell[x][z];
298 if(xzmax < xzcell[x][z])
299 xzmax = xzcell[x][z];
300 }
301 }
302 for(int y = 0; y < fNSegment[1]; y++)
303 {
304 for(int z = 0; z < fNSegment[2]; z++)
305 {
306 if(yzmin > yzcell[y][z])
307 yzmin = yzcell[y][z];
308 if(yzmax < yzcell[y][z])
309 yzmax = yzcell[y][z];
310 }
311 }
312
313 G4VisAttributes att;
314 att.SetForceSolid(true);
315 att.SetForceAuxEdgeVisible(true);
316 G4double thick = 0.01;
317
318 G4Scale3D scale;
319 if(axflg / 100 == 1)
320 {
321 pVisManager->BeginDraw();
322
323 // xy plane
324 if(colorMap->IfFloatMinMax())
325 {
326 colorMap->SetMinMax(xymin, xymax);
327 }
328 G4ThreeVector zhalf(0., 0., fSize[2] / fNSegment[2] - thick);
329 for(int x = 0; x < fNSegment[0]; x++)
330 {
331 for(int y = 0; y < fNSegment[1]; y++)
332 {
333 G4ThreeVector pos(GetReplicaPosition(x, y, 0) - zhalf);
334 G4ThreeVector pos2(GetReplicaPosition(x, y, fNSegment[2] - 1) +
335 zhalf);
336 G4Transform3D trans, trans2;
337 if(fRotationMatrix != nullptr)
338 {
339 trans = G4Rotate3D(*fRotationMatrix).inverse() * G4Translate3D(pos);
340 trans = G4Translate3D(fCenterPosition) * trans;
341 trans2 =
342 G4Rotate3D(*fRotationMatrix).inverse() * G4Translate3D(pos2);
343 trans2 = G4Translate3D(fCenterPosition) * trans2;
344 }
345 else
346 {
349 }
350 G4double c[4];
351 colorMap->GetMapColor(xycell[x][y], c);
352 att.SetColour(c[0], c[1], c[2]); //, c[3]);
353
354 G4Box xyplate("xy", fSize[0] / fNSegment[0], fSize[1] / fNSegment[1],
355 thick);
356 G4Polyhedron* poly = xyplate.GetPolyhedron();
357 poly->Transform(trans);
358 poly->SetVisAttributes(&att);
359 pVisManager->Draw(*poly);
360
361 G4Box xyplate2 = xyplate;
362 G4Polyhedron* poly2 = xyplate2.GetPolyhedron();
363 poly2->Transform(trans2);
364 poly2->SetVisAttributes(&att);
365 pVisManager->Draw(*poly2);
366 }
367 }
368 pVisManager->EndDraw();
369 }
370 axflg = axflg % 100;
371 if(axflg / 10 == 1)
372 {
373 pVisManager->BeginDraw();
374
375 // yz plane
376 if(colorMap->IfFloatMinMax())
377 {
378 colorMap->SetMinMax(yzmin, yzmax);
379 }
380 G4ThreeVector xhalf(fSize[0] / fNSegment[0] - thick, 0., 0.);
381 for(int y = 0; y < fNSegment[1]; y++)
382 {
383 for(int z = 0; z < fNSegment[2]; z++)
384 {
385 G4ThreeVector pos(GetReplicaPosition(0, y, z) - xhalf);
386 G4ThreeVector pos2(GetReplicaPosition(fNSegment[0] - 1, y, z) +
387 xhalf);
388 G4Transform3D trans, trans2;
389 if(fRotationMatrix != nullptr)
390 {
391 trans = G4Rotate3D(*fRotationMatrix).inverse() * G4Translate3D(pos);
392 trans = G4Translate3D(fCenterPosition) * trans;
393 trans2 =
394 G4Rotate3D(*fRotationMatrix).inverse() * G4Translate3D(pos2);
395 trans2 = G4Translate3D(fCenterPosition) * trans2;
396 }
397 else
398 {
401 }
402 G4double c[4];
403 colorMap->GetMapColor(yzcell[y][z], c);
404 att.SetColour(c[0], c[1], c[2]); //, c[3]);
405
406 G4Box yzplate("yz", thick, // fSize[0]/fNSegment[0]*0.001,
407 fSize[1] / fNSegment[1], fSize[2] / fNSegment[2]);
408 G4Polyhedron* poly = yzplate.GetPolyhedron();
409 poly->Transform(trans);
410 poly->SetVisAttributes(&att);
411 pVisManager->Draw(*poly);
412
413 G4Box yzplate2 = yzplate;
414 G4Polyhedron* poly2 = yzplate2.GetPolyhedron();
415 poly2->Transform(trans2);
416 poly2->SetVisAttributes(&att);
417 pVisManager->Draw(*poly2);
418 }
419 }
420 pVisManager->EndDraw();
421 }
422 axflg = axflg % 10;
423 if(axflg == 1)
424 {
425 pVisManager->BeginDraw();
426
427 // xz plane
428 if(colorMap->IfFloatMinMax())
429 {
430 colorMap->SetMinMax(xzmin, xzmax);
431 }
432 G4ThreeVector yhalf(0., fSize[1] / fNSegment[1] - thick, 0.);
433 for(int x = 0; x < fNSegment[0]; x++)
434 {
435 for(int z = 0; z < fNSegment[2]; z++)
436 {
437 G4ThreeVector pos(GetReplicaPosition(x, 0, z) - yhalf);
438 G4ThreeVector pos2(GetReplicaPosition(x, fNSegment[1] - 1, z) +
439 yhalf);
440 G4Transform3D trans, trans2;
441 if(fRotationMatrix != nullptr)
442 {
443 trans = G4Rotate3D(*fRotationMatrix).inverse() * G4Translate3D(pos);
444 trans = G4Translate3D(fCenterPosition) * trans;
445 trans2 =
446 G4Rotate3D(*fRotationMatrix).inverse() * G4Translate3D(pos2);
447 trans2 = G4Translate3D(fCenterPosition) * trans2;
448 }
449 else
450 {
453 }
454 G4double c[4];
455 colorMap->GetMapColor(xzcell[x][z], c);
456 att.SetColour(c[0], c[1], c[2]); //, c[3]);
457
458 G4Box xzplate("xz", fSize[0] / fNSegment[0],
459 thick, // fSize[1]/fNSegment[1]*0.001,
460 fSize[2] / fNSegment[2]);
461 G4Polyhedron* poly = xzplate.GetPolyhedron();
462 poly->Transform(trans);
463 poly->SetVisAttributes(&att);
464 pVisManager->Draw(*poly);
465
466 G4Box xzplate2 = xzplate;
467 G4Polyhedron* poly2 = xzplate2.GetPolyhedron();
468 poly2->Transform(trans2);
469 poly2->SetVisAttributes(&att);
470 pVisManager->Draw(*poly2);
471 }
472 }
473 pVisManager->EndDraw();
474 }
475 }
476 colorMap->SetPSUnit(fDrawUnit);
477 colorMap->SetPSName(fDrawPSName);
478 colorMap->DrawColorChart();
479}
480
481G4ThreeVector G4ScoringBox::GetReplicaPosition(G4int x, G4int y, G4int z)
482{
483 G4ThreeVector width(fSize[0] / fNSegment[0], fSize[1] / fNSegment[1],
484 fSize[2] / fNSegment[2]);
485 G4ThreeVector pos(-fSize[0] + 2 * (x + 0.5) * width.x(),
486 -fSize[1] + 2 * (y + 0.5) * width.y(),
487 -fSize[2] + 2 * (z + 0.5) * width.z());
488
489 return pos;
490}
491
492void G4ScoringBox::GetXYZ(G4int index, G4int q[3]) const
493{
494 q[0] = index / (fNSegment[2] * fNSegment[1]);
495 q[1] = (index - q[0] * fNSegment[2] * fNSegment[1]) / fNSegment[2];
496 q[2] = index - q[1] * fNSegment[2] - q[0] * fNSegment[2] * fNSegment[1];
497}
498
499G4int G4ScoringBox::GetIndex(G4int x, G4int y, G4int z) const
500{
501 return x + y * fNSegment[0] + z * fNSegment[0] * fNSegment[1];
502}
503
505 G4int idxProj, G4int idxColumn)
506{
507 G4int iColumn[3] = { 2, 0, 1 };
508 if(idxColumn < 0 || idxColumn >= fNSegment[iColumn[idxProj]])
509 {
510 G4cerr << "ERROR : Column number " << idxColumn
511 << " is out of scoring mesh [0," << fNSegment[iColumn[idxProj]] - 1
512 << "]. Method ignored." << G4endl;
513 return;
514 }
516 if(pVisManager != nullptr)
517 {
518 pVisManager->BeginDraw();
519
520 // cell vectors
521 std::vector<std::vector<std::vector<double>>> cell; // cell[X][Y][Z]
522 std::vector<double> ez;
523 for(int z = 0; z < fNSegment[2]; z++)
524 ez.push_back(0.);
525 std::vector<std::vector<double>> eyz;
526 for(int y = 0; y < fNSegment[1]; y++)
527 eyz.push_back(ez);
528 for(int x = 0; x < fNSegment[0]; x++)
529 cell.push_back(eyz);
530
531 std::vector<std::vector<double>> xycell; // xycell[X][Y]
532 std::vector<double> ey;
533 for(int y = 0; y < fNSegment[1]; y++)
534 ey.push_back(0.);
535 for(int x = 0; x < fNSegment[0]; x++)
536 xycell.push_back(ey);
537
538 std::vector<std::vector<double>> yzcell; // yzcell[Y][Z]
539 for(int y = 0; y < fNSegment[1]; y++)
540 yzcell.push_back(ez);
541
542 std::vector<std::vector<double>> xzcell; // xzcell[X][Z]
543 for(int x = 0; x < fNSegment[0]; x++)
544 xzcell.push_back(ez);
545
546 // projections
547 G4int q[3];
548 auto itr = map->GetMap()->begin();
549 for(; itr != map->GetMap()->end(); itr++)
550 {
551 GetXYZ(itr->first, q);
552
553 if(idxProj == 0 && q[2] == idxColumn)
554 { // xy plane
555 xycell[q[0]][q[1]] += (itr->second->sum_wx()) / fDrawUnitValue;
556 }
557 if(idxProj == 1 && q[0] == idxColumn)
558 { // yz plane
559 yzcell[q[1]][q[2]] += (itr->second->sum_wx()) / fDrawUnitValue;
560 }
561 if(idxProj == 2 && q[1] == idxColumn)
562 { // zx plane
563 xzcell[q[0]][q[2]] += (itr->second->sum_wx()) / fDrawUnitValue;
564 }
565 }
566
567 // search max. & min. values in each slice
568 G4double xymin = DBL_MAX, yzmin = DBL_MAX, xzmin = DBL_MAX;
569 G4double xymax = 0., yzmax = 0., xzmax = 0.;
570 for(int x = 0; x < fNSegment[0]; x++)
571 {
572 for(int y = 0; y < fNSegment[1]; y++)
573 {
574 if(xymin > xycell[x][y])
575 xymin = xycell[x][y];
576 if(xymax < xycell[x][y])
577 xymax = xycell[x][y];
578 }
579 for(int z = 0; z < fNSegment[2]; z++)
580 {
581 if(xzmin > xzcell[x][z])
582 xzmin = xzcell[x][z];
583 if(xzmax < xzcell[x][z])
584 xzmax = xzcell[x][z];
585 }
586 }
587 for(int y = 0; y < fNSegment[1]; y++)
588 {
589 for(int z = 0; z < fNSegment[2]; z++)
590 {
591 if(yzmin > yzcell[y][z])
592 yzmin = yzcell[y][z];
593 if(yzmax < yzcell[y][z])
594 yzmax = yzcell[y][z];
595 }
596 }
597
598 G4VisAttributes att;
599 att.SetForceSolid(true);
600 att.SetForceAuxEdgeVisible(true);
601
602 G4Scale3D scale;
603 // xy plane
604 if(idxProj == 0)
605 {
606 if(colorMap->IfFloatMinMax())
607 {
608 colorMap->SetMinMax(xymin, xymax);
609 }
610 for(int x = 0; x < fNSegment[0]; x++)
611 {
612 for(int y = 0; y < fNSegment[1]; y++)
613 {
614 G4Box xyplate("xy", fSize[0] / fNSegment[0], fSize[1] / fNSegment[1],
615 fSize[2] / fNSegment[2]);
616
617 G4ThreeVector pos(GetReplicaPosition(x, y, idxColumn));
618 G4Transform3D trans;
619 if(fRotationMatrix != nullptr)
620 {
621 trans = G4Rotate3D(*fRotationMatrix).inverse() * G4Translate3D(pos);
622 trans = G4Translate3D(fCenterPosition) * trans;
623 }
624 else
625 {
627 }
628 G4double c[4];
629 colorMap->GetMapColor(xycell[x][y], c);
630 att.SetColour(c[0], c[1], c[2]);
631
632 G4Polyhedron* poly = xyplate.GetPolyhedron();
633 poly->Transform(trans);
634 poly->SetVisAttributes(att);
635 pVisManager->Draw(*poly);
636 }
637 }
638 }
639 else
640 // yz plane
641 if(idxProj == 1)
642 {
643 if(colorMap->IfFloatMinMax())
644 {
645 colorMap->SetMinMax(yzmin, yzmax);
646 }
647 for(int y = 0; y < fNSegment[1]; y++)
648 {
649 for(int z = 0; z < fNSegment[2]; z++)
650 {
651 G4Box yzplate("yz", fSize[0] / fNSegment[0], fSize[1] / fNSegment[1],
652 fSize[2] / fNSegment[2]);
653
654 G4ThreeVector pos(GetReplicaPosition(idxColumn, y, z));
655 G4Transform3D trans;
656 if(fRotationMatrix != nullptr)
657 {
658 trans = G4Rotate3D(*fRotationMatrix).inverse() * G4Translate3D(pos);
659 trans = G4Translate3D(fCenterPosition) * trans;
660 }
661 else
662 {
664 }
665 G4double c[4];
666 colorMap->GetMapColor(yzcell[y][z], c);
667 att.SetColour(c[0], c[1], c[2]); //, c[3]);
668
669 G4Polyhedron* poly = yzplate.GetPolyhedron();
670 poly->Transform(trans);
671 poly->SetVisAttributes(att);
672 pVisManager->Draw(*poly);
673 }
674 }
675 }
676 else
677 // xz plane
678 if(idxProj == 2)
679 {
680 if(colorMap->IfFloatMinMax())
681 {
682 colorMap->SetMinMax(xzmin, xzmax);
683 }
684 for(int x = 0; x < fNSegment[0]; x++)
685 {
686 for(int z = 0; z < fNSegment[2]; z++)
687 {
688 G4Box xzplate("xz", fSize[0] / fNSegment[0], fSize[1] / fNSegment[1],
689 fSize[2] / fNSegment[2]);
690
691 G4ThreeVector pos(GetReplicaPosition(x, idxColumn, z));
692 G4Transform3D trans;
693 if(fRotationMatrix != nullptr)
694 {
695 trans = G4Rotate3D(*fRotationMatrix).inverse() * G4Translate3D(pos);
696 trans = G4Translate3D(fCenterPosition) * trans;
697 }
698 else
699 {
701 }
702 G4double c[4];
703 colorMap->GetMapColor(xzcell[x][z], c);
704 att.SetColour(c[0], c[1], c[2]); //, c[3]);
705
706 G4Polyhedron* poly = xzplate.GetPolyhedron();
707 poly->Transform(trans);
708 poly->SetVisAttributes(att);
709 pVisManager->Draw(*poly);
710 }
711 }
712 }
713 pVisManager->EndDraw();
714 }
715
716 colorMap->SetPSUnit(fDrawUnit);
717 colorMap->SetPSName(fDrawPSName);
718 colorMap->DrawColorChart();
719}
CLHEP::Hep3Vector G4ThreeVector
HepGeom::Translate3D G4Translate3D
HepGeom::Rotate3D G4Rotate3D
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
G4GLOB_DLL std::ostream G4cerr
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
Definition: G4Box.hh:56
virtual G4Polyhedron * GetPolyhedron() const
Definition: G4CSGSolid.cc:129
void SetVisAttributes(const G4VisAttributes *pVA)
void SetSensitiveDetector(G4VSensitiveDetector *pSDetector)
void Draw(RunScore *map, G4VScoreColorMap *colorMap, G4int axflg=111) override
void DrawColumn(RunScore *map, G4VScoreColorMap *colorMap, G4int idxProj, G4int idxColumn) override
void SetupGeometry(G4VPhysicalVolume *fWorldPhys) override
Definition: G4ScoringBox.cc:63
G4ScoringBox(G4String wName)
Definition: G4ScoringBox.cc:53
void List() const override
static G4int GetReplicaLevel()
G4LogicalVolume * GetLogicalVolume() const
virtual void DrawColorChart(G4int nPoint=5)
G4bool IfFloatMinMax() const
void SetMinMax(G4double minVal, G4double maxVal)
void SetPSUnit(G4String &unit)
virtual void GetMapColor(G4double val, G4double color[4])=0
void SetPSName(G4String &psName)
G4RotationMatrix * fRotationMatrix
virtual void List() const
G4double fDrawUnitValue
G4String fDrawPSName
G4MultiFunctionalDetector * fMFD
G4String fDivisionAxisNames[3]
G4LogicalVolume * fMeshElementLogical
G4double fSize[3]
G4ThreeVector fCenterPosition
Map_t * GetMap() const
Definition: G4THitsMap.hh:155
virtual void EndDraw()=0
static G4VVisManager * GetConcreteInstance()
virtual void Draw(const G4Circle &, const G4Transform3D &objectTransformation=G4Transform3D())=0
virtual void BeginDraw(const G4Transform3D &objectTransformation=G4Transform3D())=0
void SetColour(const G4Colour &)
void SetForceAuxEdgeVisible(G4bool=true)
void SetForceSolid(G4bool=true)
void SetVisAttributes(const G4VisAttributes *)
Definition: G4Visible.cc:98
Transform3D inverse() const
Definition: Transform3D.cc:141
HepPolyhedron & Transform(const G4Transform3D &t)
@ kYAxis
Definition: geomdefs.hh:56
@ kXAxis
Definition: geomdefs.hh:55
@ kZAxis
Definition: geomdefs.hh:57
#define DBL_MAX
Definition: templates.hh:62