Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/digits_hits/utils/src/G4ScoringCylinder.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /digits_hits/utils/src/G4ScoringCylinder.cc (Version 11.3.0) and /digits_hits/utils/src/G4ScoringCylinder.cc (Version 9.4.p3)


  1 //                                                  1 //
  2 // *******************************************      2 // ********************************************************************
  3 // * License and Disclaimer                         3 // * License and Disclaimer                                           *
  4 // *                                                4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of th      5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided      6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License      7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/      8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.           9 // * include a list of copyright holders.                             *
 10 // *                                               10 // *                                                                  *
 11 // * Neither the authors of this software syst     11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing fin     12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warran     13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assum     14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file      15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitatio     16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                               17 // *                                                                  *
 18 // * This  code  implementation is the result      18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboratio     19 // * technical work of the GEANT4 collaboration.                      *
 20 // * By using,  copying,  modifying or  distri     20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  ag     21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publicati     22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Sof     23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // *******************************************     24 // ********************************************************************
 25 //                                                 25 //
 26 // G4ScoringCylinder                           <<  26 //
 27 // ------------------------------------------- <<  27 // $Id: G4ScoringCylinder.cc,v 1.16 2010-08-30 08:15:20 akimura Exp $
                                                   >>  28 // GEANT4 tag $Name: not supported by cvs2svn $
                                                   >>  29 //
 28                                                    30 
 29 #include "G4ScoringCylinder.hh"                    31 #include "G4ScoringCylinder.hh"
                                                   >>  32 #include "G4VPhysicalVolume.hh"
 30                                                    33 
                                                   >>  34 #include "G4Tubs.hh"
 31 #include "G4LogicalVolume.hh"                      35 #include "G4LogicalVolume.hh"
 32 #include "G4MultiFunctionalDetector.hh"        <<  36 #include "G4VPhysicalVolume.hh"
 33 #include "G4PVDivision.hh"                     << 
 34 #include "G4PVPlacement.hh"                        37 #include "G4PVPlacement.hh"
 35 #include "G4PVReplica.hh"                          38 #include "G4PVReplica.hh"
 36 #include "G4PhysicalConstants.hh"              <<  39 #include "G4PVDivision.hh"
 37 #include "G4SDManager.hh"                      << 
 38 #include "G4ScoringManager.hh"                 << 
 39 #include "G4StatDouble.hh"                     << 
 40 #include "G4SystemOfUnits.hh"                  << 
 41 #include "G4Tubs.hh"                           << 
 42 #include "G4VPhysicalVolume.hh"                << 
 43 #include "G4VPrimitiveScorer.hh"               << 
 44 #include "G4VScoreColorMap.hh"                 << 
 45 #include "G4VVisManager.hh"                    << 
 46 #include "G4VisAttributes.hh"                      40 #include "G4VisAttributes.hh"
                                                   >>  41 #include "G4VVisManager.hh"
                                                   >>  42 #include "G4VScoreColorMap.hh"
 47                                                    43 
 48 #include "G4LogicalVolumeStore.hh"             <<  44 #include "G4SDManager.hh"
 49 #include "G4Material.hh"                       <<  45 #include "G4MultiFunctionalDetector.hh"
 50 #include "G4PhysicalVolumeStore.hh"            <<  46 #include "G4SDParticleFilter.hh"
 51 #include "G4SolidStore.hh"                     <<  47 #include "G4VPrimitiveScorer.hh"
 52 #include "G4UnitsTable.hh"                     <<  48 #include "G4PSEnergyDeposit.hh"
 53 #include "G4VSensitiveDetector.hh"             <<  49 #include "G4PSTrackLength.hh"
 54 #include "G4VSolid.hh"                         <<  50 #include "G4PSNofStep.hh"
                                                   >>  51 #include "G4ScoringManager.hh"
 55                                                    52 
 56                                                    53 
 57 G4ScoringCylinder::G4ScoringCylinder(const G4S <<  54 G4ScoringCylinder::G4ScoringCylinder(G4String wName)
 58   : G4VScoringMesh(wName)                      <<  55   :G4VScoringMesh(wName), fMeshElementLogical(0)
 59 {                                                  56 {
 60   fShape = MeshShape::cylinder;                <<  57   fShape = cylinderMesh;
 61                                                    58 
 62   fDivisionAxisNames[0] = "Z";                     59   fDivisionAxisNames[0] = "Z";
 63   fDivisionAxisNames[1] = "PHI";                   60   fDivisionAxisNames[1] = "PHI";
 64   fDivisionAxisNames[2] = "R";                     61   fDivisionAxisNames[2] = "R";
 65 }                                                  62 }
 66                                                    63 
 67 void G4ScoringCylinder::SetupGeometry(G4VPhysi <<  64 G4ScoringCylinder::~G4ScoringCylinder()
                                                   >>  65 {;}
                                                   >>  66 
                                                   >>  67 void G4ScoringCylinder::Construct(G4VPhysicalVolume* fWorldPhys)
 68 {                                                  68 {
 69   if(verboseLevel > 9)                         <<  69   if(fConstructed) {
 70     G4cout << "G4ScoringCylinder::SetupGeometr <<  70 
                                                   >>  71     if(verboseLevel > 0) 
                                                   >>  72       G4cout << fWorldPhys->GetName() << " --- All quantities are reset." << G4endl;
                                                   >>  73     ResetScore();
                                                   >>  74 
                                                   >>  75   } else {
                                                   >>  76     fConstructed = true;
                                                   >>  77     SetupGeometry(fWorldPhys);
                                                   >>  78   }
                                                   >>  79 }
                                                   >>  80 
                                                   >>  81 
                                                   >>  82 
                                                   >>  83 void G4ScoringCylinder::SetupGeometry(G4VPhysicalVolume * fWorldPhys) {
                                                   >>  84 
                                                   >>  85   if(verboseLevel > 9) G4cout << "G4ScoringCylinder::SetupGeometry() ..." << G4endl;
 71                                                    86 
 72   // World                                         87   // World
 73   G4VPhysicalVolume* scoringWorld = fWorldPhys <<  88   G4VPhysicalVolume * scoringWorld = fWorldPhys;
 74   G4LogicalVolume* worldLogical   = scoringWor <<  89   G4LogicalVolume * worldLogical = scoringWorld->GetLogicalVolume();
 75                                                    90 
 76   // Scoring Mesh                                  91   // Scoring Mesh
 77   if(verboseLevel > 9)                         <<  92   if(verboseLevel > 9) G4cout << fWorldName << G4endl;
 78     G4cout << fWorldName << G4endl;            <<  93   G4String tubsName = fWorldName+"_mesh";
 79   G4String tubsName = fWorldName + "_mesh";    << 
 80                                                    94 
 81   if(verboseLevel > 9)                         <<  95   if(verboseLevel > 9) G4cout << "R max., Dz =: " << fSize[0] << ", " << fSize[1] << G4endl;
 82   {                                            <<  96   G4VSolid * tubsSolid = new G4Tubs(tubsName+"0", // name
 83     G4cout << "R min, R max., Dz =: " << fSize <<  97             0.,           // R min
 84                                       << ", "  <<  98             fSize[0],     // R max
 85   }                                            <<  99             fSize[1],     // Dz
 86   G4VSolid* tubsSolid          = new G4Tubs(tu << 100             0.,           // starting phi
 87                                    fSize[0],   << 101                                     twopi*rad);   // segment phi
 88                                    fSize[1],   << 102   G4LogicalVolume *  tubsLogical = new G4LogicalVolume(tubsSolid, 0, tubsName);
 89                                    fSize[2],   << 103   new G4PVPlacement(fRotationMatrix, fCenterPosition,
 90                                    fAngle[0],  << 104         tubsLogical, tubsName+"0", worldLogical, false, 0);
 91                                    fAngle[1]); << 105 
 92   auto  tubsLogical = new G4LogicalVolume(tubs << 106   if(verboseLevel > 9) G4cout << " # of segments : r, phi, z =: "
 93   new G4PVPlacement(fRotationMatrix, fCenterPo << 107    << fNSegment[IR] << ", " << fNSegment[IPHI] << ", " << fNSegment[IZ] << G4endl;
 94                     tubsName + "0", worldLogic << 108 
 95                                                << 109   G4String layerName[2] = {tubsName + "1",  tubsName + "2"};
 96   if(verboseLevel > 9)                         << 110   G4VSolid * layerSolid[2]; 
 97     G4cout << " # of segments : r, phi, z =: " << 111   G4LogicalVolume * layerLogical[2];
 98            << fNSegment[IPHI] << ", " << fNSeg << 
 99                                                << 
100   G4String layerName[2] = { tubsName + "1", tu << 
101   G4VSolid* layerSolid[2];                     << 
102   G4LogicalVolume* layerLogical[2];            << 
103                                                   112 
104   //-- fisrt nested layer (replicated along z     113   //-- fisrt nested layer (replicated along z direction)
105   if(verboseLevel > 9)                         << 114   if(verboseLevel > 9) G4cout << "layer 1 :" << G4endl;
106     G4cout << "layer 1 :" << G4endl;           << 115   layerSolid[0] = new G4Tubs(layerName[0],           // name
107   layerSolid[0]   = new G4Tubs(layerName[0],   << 116            0.,                     // inner radius
108                              fSize[0],         << 117            fSize[0],               // outer radius
109                              fSize[1],         << 118            fSize[1]/fNSegment[IZ], // half len. in z
110                              fSize[2] / fNSegm << 119            0.,                     // starting phi angle
111                              fAngle[0],        << 120            twopi*rad);             // delta angle of the segment
112                              fAngle[1]);  // d << 121   layerLogical[0] = new G4LogicalVolume(layerSolid[0], 0, layerName[0]);
113   layerLogical[0] = new G4LogicalVolume(layerS << 122   if(fNSegment[IZ] > 1) {
114   if(fNSegment[IZ] > 1)                        << 123     if(verboseLevel > 9) G4cout << "G4ScoringCylinder::Construct() : Replicate along z direction" << G4endl;
115   {                                            << 124     if(G4ScoringManager::GetReplicaLevel()>0) {
116     if(verboseLevel > 9)                       << 125       if(verboseLevel > 9) G4cout << "G4ScoringCylinder::Construct() : Replica" << G4endl;
117       G4cout << "G4ScoringCylinder::Construct( << 126       new G4PVReplica(layerName[0], layerLogical[0], tubsLogical, kZAxis, fNSegment[IZ], 2.*fSize[1]/fNSegment[IZ]);
118              << G4endl;                        << 127     } else {
119     if(G4ScoringManager::GetReplicaLevel() > 0 << 128       if(verboseLevel > 9) G4cout << "G4ScoringCylinder::Construct() : Division" << G4endl;
120     {                                          << 129       new G4PVDivision(layerName[0], layerLogical[0], tubsLogical, kZAxis, fNSegment[IZ], 0.);
121       if(verboseLevel > 9)                     << 130     }
122         G4cout << "G4ScoringCylinder::Construc << 131   } else if(fNSegment[IZ] == 1) {
123       new G4PVReplica(layerName[0], layerLogic << 132     if(verboseLevel > 9) G4cout << "G4ScoringCylinder::Construct() : Placement" << G4endl;
124                       fNSegment[IZ], 2. * fSiz << 133     new G4PVPlacement(0, G4ThreeVector(0.,0.,0.), layerLogical[0], layerName[0], tubsLogical, false, 0);
125     }                                          << 134   } else {
126     else                                       << 
127     {                                          << 
128       if(verboseLevel > 9)                     << 
129         G4cout << "G4ScoringCylinder::Construc << 
130       new G4PVDivision(layerName[0], layerLogi << 
131                        fNSegment[IZ], 0.);     << 
132     }                                          << 
133   }                                            << 
134   else if(fNSegment[IZ] == 1)                  << 
135   {                                            << 
136     if(verboseLevel > 9)                       << 
137       G4cout << "G4ScoringCylinder::Construct( << 
138     new G4PVPlacement(nullptr, G4ThreeVector(0 << 
139                       layerName[0], tubsLogica << 
140   }                                            << 
141   else                                         << 
142   {                                            << 
143     G4cerr << "G4ScoringCylinder::SetupGeometr    135     G4cerr << "G4ScoringCylinder::SetupGeometry() : invalid parameter ("
144            << fNSegment[IZ] << ") "            << 136      << fNSegment[IZ] << ") "
145            << "in placement of the first neste << 137      << "in placement of the first nested layer." << G4endl;
146   }                                               138   }
147                                                   139 
148   // second nested layer (replicated along phi    140   // second nested layer (replicated along phi direction)
149   if(verboseLevel > 9)                         << 141   if(verboseLevel > 9) G4cout << "layer 2 :" << G4endl;
150     G4cout << "layer 2 :" << G4endl;           << 142   layerSolid[1] = new G4Tubs(layerName[1],
151   layerSolid[1] =                              << 143            0.,
152     new G4Tubs(layerName[1], fSize[0], fSize[1 << 144            fSize[0],
153                fAngle[0], fAngle[1] / fNSegmen << 145            fSize[1]/fNSegment[IZ],
154   layerLogical[1] = new G4LogicalVolume(layerS << 146            0.,
155   if(fNSegment[IPHI] > 1)                      << 147                              twopi*rad/fNSegment[IPHI]);
156   {                                            << 148   layerLogical[1] = new G4LogicalVolume(layerSolid[1], 0, layerName[1]);
157     if(verboseLevel > 9)                       << 149   if(fNSegment[IPHI] > 1)  {
158       G4cout << "G4ScoringCylinder::Construct( << 150     if(verboseLevel > 9) G4cout << "G4ScoringCylinder::Construct() : Replicate along phi direction" << G4endl;
159              << G4endl;                        << 151     if(G4ScoringManager::GetReplicaLevel()>1) {
160     if(G4ScoringManager::GetReplicaLevel() > 1 << 152       if(verboseLevel > 9) G4cout << "G4ScoringCylinder::Construct() : Replica" << G4endl;
161     {                                          << 
162       if(verboseLevel > 9)                     << 
163         G4cout << "G4ScoringCylinder::Construc << 
164       new G4PVReplica(layerName[1], layerLogic    153       new G4PVReplica(layerName[1], layerLogical[1], layerLogical[0], kPhi,
165                       fNSegment[IPHI], fAngle[ << 154           fNSegment[IPHI], twopi*rad/fNSegment[IPHI]);
166     }                                          << 155     } else {
167     else                                       << 156       if(verboseLevel > 9) G4cout << "G4ScoringCylinder::Construct() : Division" << G4endl;
168     {                                          << 157       new G4PVDivision(layerName[1], layerLogical[1], layerLogical[0], kPhi, fNSegment[IPHI], 0.);
169       if(verboseLevel > 9)                     << 158     }
170         G4cout << "G4ScoringCylinder::Construc << 159   } else if(fNSegment[IPHI] == 1) {
171       new G4PVDivision(layerName[1], layerLogi << 160     if(verboseLevel > 9) G4cout << "G4ScoringCylinder::Construct() : Placement" << G4endl;
172                        fNSegment[IPHI], 0.);   << 161     new G4PVPlacement(0, G4ThreeVector(0.,0.,0.), layerLogical[1], layerName[1], layerLogical[0], false, 0);
173     }                                          << 162   } else
174   }                                            << 
175   else if(fNSegment[IPHI] == 1)                << 
176   {                                            << 
177     if(verboseLevel > 9)                       << 
178       G4cout << "G4ScoringCylinder::Construct( << 
179     new G4PVPlacement(nullptr, G4ThreeVector(0 << 
180                       layerName[1], layerLogic << 
181   }                                            << 
182   else                                         << 
183     G4cerr << "ERROR : G4ScoringCylinder::Setu    163     G4cerr << "ERROR : G4ScoringCylinder::SetupGeometry() : invalid parameter ("
184            << fNSegment[IPHI] << ") "          << 164      << fNSegment[IPHI] << ") "
185            << "in placement of the second nest << 165      << "in placement of the second nested layer." << G4endl;
186                                                   166 
187   // mesh elements                                167   // mesh elements
188   if(verboseLevel > 9)                         << 168   if(verboseLevel > 9) G4cout << "mesh elements :" << G4endl;
189     G4cout << "mesh elements :" << G4endl;     << 169   G4String elementName = tubsName +"3";
190   G4String elementName   = tubsName + "3";     << 170   G4VSolid * elementSolid = new G4Tubs(elementName,
191   G4VSolid* elementSolid = new G4Tubs(         << 171                0.,
192     elementName, fSize[0], (fSize[1] - fSize[0 << 172                fSize[0]/fNSegment[IR],
193     fSize[2] / fNSegment[IZ], fAngle[0], fAngl << 173                fSize[1]/fNSegment[IZ],
194   fMeshElementLogical = new G4LogicalVolume(el << 174                0.,
195   if(fNSegment[IR] >= 1)                       << 175                                        twopi*rad/fNSegment[IPHI]);
196   {                                            << 176   fMeshElementLogical = new G4LogicalVolume(elementSolid, 0, elementName);
197     if(verboseLevel > 9)                       << 177   if(fNSegment[IR] > 1) {
198       G4cout << "G4ScoringCylinder::Construct( << 178 
199              << G4endl;                        << 179     if(verboseLevel > 9) G4cout << "G4ScoringCylinder::Construct() : Replicate along r direction" << G4endl;
200                                                << 180 
201     if(G4ScoringManager::GetReplicaLevel() > 2 << 181     if(G4ScoringManager::GetReplicaLevel()>2) {
202     {                                          << 182       if(verboseLevel > 9) G4cout << "G4ScoringCylinder::Construct() : Replica" << G4endl;
203       if(verboseLevel > 9)                     << 
204         G4cout << "G4ScoringCylinder::Construc << 
205       new G4PVReplica(elementName, fMeshElemen    183       new G4PVReplica(elementName, fMeshElementLogical, layerLogical[1], kRho,
206                       fNSegment[IR], (fSize[1] << 184       fNSegment[IR], fSize[0]/fNSegment[IR]);
207                       fSize[0]);               << 185     } else {
208     }                                          << 186       if(verboseLevel > 9) G4cout << "G4ScoringCylinder::Construct() : Division" << G4endl;
209     else                                       << 187       new G4PVDivision(elementName, fMeshElementLogical, layerLogical[1], kRho, fNSegment[IR], 0.);
210     {                                          << 188     }
211       if(verboseLevel > 9)                     << 189   } else if(fNSegment[IR] == 1) {
212         G4cout << "G4ScoringCylinder::Construc << 190     if(verboseLevel > 9) G4cout << "G4ScoringCylinder::Construct() : Placement" << G4endl;
213       new G4PVDivision(elementName, fMeshEleme << 191     new G4PVPlacement(0, G4ThreeVector(0.,0.,0.), fMeshElementLogical, elementName, layerLogical[1], false, 0);
214                        fNSegment[IR], 0.);     << 192   } else {
215     }                                          << 
216   }                                            << 
217   else                                         << 
218   {                                            << 
219     G4cerr << "G4ScoringCylinder::SetupGeometr    193     G4cerr << "G4ScoringCylinder::SetupGeometry() : "
220            << "invalid parameter (" << fNSegme << 194      << "invalid parameter (" << fNSegment[IR] << ") "
221            << "in mesh element placement." <<  << 195      << "in mesh element placement." << G4endl;
222   }                                               196   }
223                                                   197 
224   // set the sensitive detector                   198   // set the sensitive detector
225   fMeshElementLogical->SetSensitiveDetector(fM    199   fMeshElementLogical->SetSensitiveDetector(fMFD);
                                                   >> 200   
226                                                   201 
227   // vis. attributes                              202   // vis. attributes
228   auto  visatt = new G4VisAttributes(G4Colour( << 203   G4VisAttributes * visatt = new G4VisAttributes(G4Colour(.5,.5,.5));
229   visatt->SetVisibility(true);                    204   visatt->SetVisibility(true);
230   layerLogical[0]->SetVisAttributes(visatt);      205   layerLogical[0]->SetVisAttributes(visatt);
231   layerLogical[1]->SetVisAttributes(visatt);      206   layerLogical[1]->SetVisAttributes(visatt);
232   visatt = new G4VisAttributes(G4Colour(.5, .5 << 207   visatt = new G4VisAttributes(G4Colour(.5,.5,.5,0.01));
233   // visatt->SetForceSolid(true);              << 208   //visatt->SetForceSolid(true);
234   fMeshElementLogical->SetVisAttributes(visatt    209   fMeshElementLogical->SetVisAttributes(visatt);
235                                                << 
236   if(verboseLevel > 9)                         << 
237     DumpVolumes();                             << 
238 }                                                 210 }
239                                                   211 
240 void G4ScoringCylinder::List() const           << 212 void G4ScoringCylinder::List() const {
241 {                                              << 213   G4cout << "G4ScoringCylinder : " << fWorldName << " --- Shape: Cylindrical mesh" << G4endl;
242   G4cout << "G4ScoringCylinder : " << fWorldNa << 
243          << " --- Shape: Cylindrical mesh" <<  << 
244                                                   214 
245   G4cout << " Size (Rmin, Rmax, Dz): (" << fSi << 215   G4cout << " Size (R, Dz): ("
246          << fSize[1] / cm << ", " << fSize[2]  << 216    << fSize[0]/cm << ", "
247   G4cout << " Angle (start, span): (" << fAngl << 217    << fSize[1]/cm << ") [cm]"
248          << fAngle[1] / deg << ") [deg]" << G4 << 218    << G4endl;
249                                                   219 
250   G4VScoringMesh::List();                         220   G4VScoringMesh::List();
251 }                                                 221 }
252                                                   222 
253 void G4ScoringCylinder::Draw(RunScore* map, G4 << 223 
254                              G4int axflg)      << 224 void G4ScoringCylinder::Draw(std::map<G4int, G4double*> * map, G4VScoreColorMap* colorMap, G4int axflg) {
255 {                                              << 225 
256   G4VVisManager* pVisManager = G4VVisManager:: << 226   G4VVisManager * pVisManager = G4VVisManager::GetConcreteInstance();
257   if(pVisManager != nullptr)                   << 227   if(pVisManager) {
258   {                                            << 228     
259     // cell vectors                               229     // cell vectors
260     std::vector<G4double> ephi;                << 230     std::vector<double> ephi;
261     for(G4int phi = 0; phi < fNSegment[IPHI];  << 231     for(int phi = 0; phi < fNSegment[IPHI]; phi++) ephi.push_back(0.);
262       ephi.push_back(0.);                      << 
263     //-                                           232     //-
264     std::vector<std::vector<G4double>> zphicel << 233     std::vector<std::vector<double> > zphicell; // zphicell[Z][PHI]
265     for(G4int z = 0; z < fNSegment[IZ]; z++)   << 234     for(int z = 0; z < fNSegment[IZ]; z++) zphicell.push_back(ephi);
266       zphicell.push_back(ephi);                << 
267     //-                                           235     //-
268     std::vector<std::vector<G4double>> rphicel << 236     std::vector<std::vector<double> > rphicell; // rphicell[R][PHI]
269     for(G4int r = 0; r < fNSegment[IR]; r++)   << 237     for(int r = 0; r < fNSegment[IR]; r++) rphicell.push_back(ephi);
270       rphicell.push_back(ephi);                << 
271                                                   238 
272     // projections                                239     // projections
273     G4int q[3];                                   240     G4int q[3];
274     auto itr = map->GetMap()->begin();         << 241     std::map<G4int, G4double*>::iterator itr = map->begin();
275     for(; itr != map->GetMap()->end(); itr++)  << 242     for(; itr != map->end(); itr++) {
276     {                                          << 243       if(itr->first < 0) {
277       if(itr->first < 0)                       << 244   G4cout << itr->first << G4endl;
278       {                                        << 245   continue;
279         G4cout << itr->first << G4endl;        << 
280         continue;                              << 
281       }                                           246       }
282       GetRZPhi(itr->first, q);                    247       GetRZPhi(itr->first, q);
283                                                   248 
284       zphicell[q[IZ]][q[IPHI]] += (itr->second << 249       zphicell[q[IZ]][q[IPHI]] += *(itr->second)/fDrawUnitValue;
285       rphicell[q[IR]][q[IPHI]] += (itr->second << 250       rphicell[q[IR]][q[IPHI]] += *(itr->second)/fDrawUnitValue;
286     }                                          << 251     }  
287                                                << 252     
288     // search min./max. values                    253     // search min./max. values
289     G4double zphimin = DBL_MAX, rphimin = DBL_    254     G4double zphimin = DBL_MAX, rphimin = DBL_MAX;
290     G4double zphimax = 0., rphimax = 0.;          255     G4double zphimax = 0., rphimax = 0.;
291     for(G4int iphi = 0; iphi < fNSegment[IPHI] << 256     for(int iphi = 0; iphi < fNSegment[IPHI]; iphi++) {
292     {                                          << 257       for(int iz = 0; iz < fNSegment[IZ]; iz++) {
293       for(G4int iz = 0; iz < fNSegment[IZ]; iz << 258   if(zphimin > zphicell[iz][iphi]) zphimin = zphicell[iz][iphi];
294       {                                        << 259   if(zphimax < zphicell[iz][iphi]) zphimax = zphicell[iz][iphi];
295         if(zphimin > zphicell[iz][iphi])       << 260       }
296           zphimin = zphicell[iz][iphi];        << 261       for(int ir = 0; ir < fNSegment[IR]; ir++) {
297         if(zphimax < zphicell[iz][iphi])       << 262   if(rphimin > rphicell[ir][iphi]) rphimin = rphicell[ir][iphi];
298           zphimax = zphicell[iz][iphi];        << 263   if(rphimax < rphicell[ir][iphi]) rphimax = rphicell[ir][iphi];
299       }                                        << 
300       for(G4int ir = 0; ir < fNSegment[IR]; ir << 
301       {                                        << 
302         if(rphimin > rphicell[ir][iphi])       << 
303           rphimin = rphicell[ir][iphi];        << 
304         if(rphimax < rphicell[ir][iphi])       << 
305           rphimax = rphicell[ir][iphi];        << 
306       }                                           264       }
307     }                                             265     }
308                                                   266 
309     G4VisAttributes att;                          267     G4VisAttributes att;
310     att.SetForceSolid(true);                      268     att.SetForceSolid(true);
311     att.SetForceAuxEdgeVisible(true);             269     att.SetForceAuxEdgeVisible(true);
312                                                   270 
                                                   >> 271 
313     G4Scale3D scale;                              272     G4Scale3D scale;
314     if(axflg / 100 == 1)                       << 273     if(axflg/100==1) {
315     {                                          << 
316       // rz plane                                 274       // rz plane
317     }                                             275     }
318     axflg = axflg % 100;                       << 276     axflg = axflg%100;
319     if(axflg / 10 == 1)                        << 277     if(axflg/10==1) {
320     {                                          << 
321       pVisManager->BeginDraw();                << 
322                                                << 
323       // z-phi plane                              278       // z-phi plane
324       if(colorMap->IfFloatMinMax())            << 279       if(colorMap->IfFloatMinMax()) { colorMap->SetMinMax(zphimin, zphimax); }
325       {                                        << 280 
326         colorMap->SetMinMax(zphimin, zphimax); << 281       G4double zhalf = fSize[1]/fNSegment[IZ];
327       }                                        << 282       for(int phi = 0; phi < fNSegment[IPHI]; phi++) {
328                                                << 283   for(int z = 0; z < fNSegment[IZ]; z++) {
329       G4double zhalf = fSize[2] / fNSegment[IZ << 284     //-
330       for(G4int phi = 0; phi < fNSegment[IPHI] << 285     G4double angle = twopi/fNSegment[IPHI]*phi;
331       {                                        << 286     G4double dphi = twopi/fNSegment[IPHI];
332         for(G4int z = 0; z < fNSegment[IZ]; z+ << 287     G4Tubs cylinder("z-phi",                    // name
333         {                                      << 288         fSize[0]*0.99, fSize[0],  // inner radius, outer radius
334           //-                                  << 289         zhalf,                      // half length in z
335           G4double angle = fAngle[0] + fAngle[ << 290         angle, dphi*0.99999);       // starting phi angle, delta angle
336           G4double dphi  = fAngle[1] / fNSegme << 291     //-
337           G4Tubs cylinder(                     << 292     G4ThreeVector zpos(0., 0., -fSize[1] + fSize[1]/fNSegment[IZ]*(1 + 2.*z));
338             "z-phi",                    // nam << 293     G4Transform3D trans;
339             fSize[1] * 0.99, fSize[1],  // inn << 294     if(fRotationMatrix) {
340             zhalf,                      // hal << 295       trans = G4Rotate3D(*fRotationMatrix).inverse()*G4Translate3D(zpos);
341             angle, dphi * 0.99999);     // sta << 296       trans = G4Translate3D(fCenterPosition)*trans;
342           //-                                  << 297     } else {
343           G4ThreeVector zpos(                  << 298       trans = G4Translate3D(zpos)*G4Translate3D(fCenterPosition);
344             0., 0., -fSize[2] + fSize[2] / fNS << 299     }
345           G4Transform3D trans;                 << 300     G4double c[4];
346           if(fRotationMatrix != nullptr)       << 301     colorMap->GetMapColor(zphicell[z][phi], c);
347           {                                    << 302     att.SetColour(c[0], c[1], c[2]);//, c[3]);
348             trans =                            << 303     //-
349               G4Rotate3D(*fRotationMatrix).inv << 304     pVisManager->Draw(cylinder, att, trans);
350             trans = G4Translate3D(fCenterPosit << 305   }
351           }                                    << 
352           else                                 << 
353           {                                    << 
354             trans = G4Translate3D(zpos) * G4Tr << 
355           }                                    << 
356           G4double c[4];                       << 
357           colorMap->GetMapColor(zphicell[z][ph << 
358           att.SetColour(c[0], c[1], c[2]);  // << 
359           //-                                  << 
360           G4Polyhedron* poly = cylinder.GetPol << 
361           poly->Transform(trans);              << 
362           poly->SetVisAttributes(att);         << 
363           pVisManager->Draw(*poly);            << 
364         }                                      << 
365       }                                           306       }
366       pVisManager->EndDraw();                  << 
367     }                                             307     }
368     axflg = axflg % 10;                        << 308     axflg = axflg%10;
369     if(axflg == 1)                             << 309     if(axflg==1) {
370     {                                          << 
371       pVisManager->BeginDraw();                << 
372                                                << 
373       // r-phi plane                              310       // r-phi plane
374       if(colorMap->IfFloatMinMax())            << 311       if(colorMap->IfFloatMinMax()) { colorMap->SetMinMax(rphimin, rphimax); }
375       {                                        << 
376         colorMap->SetMinMax(rphimin, rphimax); << 
377       }                                        << 
378                                                << 
379       G4double rsize = (fSize[1] - fSize[0]) / << 
380       for(G4int phi = 0; phi < fNSegment[IPHI] << 
381       {                                        << 
382         for(G4int r = 0; r < fNSegment[IR]; r+ << 
383         {                                      << 
384           G4double rs[2] = { fSize[0] + rsize  << 
385           G4double angle = fAngle[0] + fAngle[ << 
386           G4double dphi  = fAngle[1] / fNSegme << 
387           G4Tubs cylindern("z-phi", rs[0], rs[ << 
388           G4Tubs cylinderp = cylindern;        << 
389                                                << 
390           G4ThreeVector zposn(0., 0., -fSize[2 << 
391           G4ThreeVector zposp(0., 0., fSize[2] << 
392           G4Transform3D transn, transp;        << 
393           if(fRotationMatrix != nullptr)       << 
394           {                                    << 
395             transn =                           << 
396               G4Rotate3D(*fRotationMatrix).inv << 
397             transn = G4Translate3D(fCenterPosi << 
398             transp =                           << 
399               G4Rotate3D(*fRotationMatrix).inv << 
400             transp = G4Translate3D(fCenterPosi << 
401           }                                    << 
402           else                                 << 
403           {                                    << 
404             transn = G4Translate3D(zposn) * G4 << 
405             transp = G4Translate3D(zposp) * G4 << 
406           }                                    << 
407           G4double c[4];                       << 
408           colorMap->GetMapColor(rphicell[r][ph << 
409           att.SetColour(c[0], c[1], c[2]);  // << 
410                                                << 
411           G4Polyhedron* polyn = cylindern.GetP << 
412           polyn->Transform(transn);            << 
413           polyn->SetVisAttributes(att);        << 
414           pVisManager->Draw(*polyn);           << 
415                                                << 
416           G4Polyhedron* polyp = cylinderp.GetP << 
417           polyp->Transform(transp);            << 
418           polyp->SetVisAttributes(att);        << 
419           pVisManager->Draw(*polyp);           << 
420         }                                      << 
421       }                                        << 
422                                                   312 
423       pVisManager->EndDraw();                  << 313       G4double rsize = fSize[0]/fNSegment[IR];
                                                   >> 314       for(int phi = 0; phi < fNSegment[IPHI]; phi++) {
                                                   >> 315   for(int r = 0; r < fNSegment[IR]; r++) {
                                                   >> 316 
                                                   >> 317     G4double rs[2] = {rsize*r, rsize*(r+1)};
                                                   >> 318     G4double angle = twopi/fNSegment[IPHI]*phi;
                                                   >> 319     G4double dphi = twopi/fNSegment[IPHI];
                                                   >> 320     G4Tubs cylinder("z-phi", rs[0], rs[1], 0.001,
                                                   >> 321         angle, dphi*0.99999);
                                                   >> 322     /*
                                                   >> 323     G4cout << ">>>> "
                                                   >> 324      << rs[0] << " - " << rs[1] << " : "
                                                   >> 325      << angle << " - " << angle + dphi
                                                   >> 326      << G4endl;
                                                   >> 327     */
                                                   >> 328 
                                                   >> 329     G4ThreeVector zposn(0., 0., -fSize[1]);
                                                   >> 330     G4ThreeVector zposp(0., 0.,  fSize[1]);
                                                   >> 331     G4Transform3D transn, transp;
                                                   >> 332     if(fRotationMatrix) {
                                                   >> 333       transn = G4Rotate3D(*fRotationMatrix).inverse()*G4Translate3D(zposn);
                                                   >> 334       transn = G4Translate3D(fCenterPosition)*transn;
                                                   >> 335       transp = G4Rotate3D(*fRotationMatrix).inverse()*G4Translate3D(zposp);
                                                   >> 336       transp = G4Translate3D(fCenterPosition)*transp;
                                                   >> 337     } else {
                                                   >> 338       transn = G4Translate3D(zposn)*G4Translate3D(fCenterPosition);
                                                   >> 339       transp = G4Translate3D(zposp)*G4Translate3D(fCenterPosition);
                                                   >> 340     }
                                                   >> 341     G4double c[4];
                                                   >> 342     colorMap->GetMapColor(rphicell[r][phi], c);
                                                   >> 343     att.SetColour(c[0], c[1], c[2]);//, c[3]);
                                                   >> 344     /*
                                                   >> 345     G4cout << "   " << c[0] << ", "
                                                   >> 346      << c[1] << ", " << c[2] << G4endl;
                                                   >> 347     */
                                                   >> 348     pVisManager->Draw(cylinder, att, transn);
                                                   >> 349     pVisManager->Draw(cylinder, att, transp);
                                                   >> 350   }
                                                   >> 351       }
424     }                                             352     }
425                                                   353 
426     colorMap->SetPSUnit(fDrawUnit);               354     colorMap->SetPSUnit(fDrawUnit);
427     colorMap->SetPSName(fDrawPSName);             355     colorMap->SetPSName(fDrawPSName);
428     colorMap->DrawColorChart();                   356     colorMap->DrawColorChart();
                                                   >> 357 
429   }                                               358   }
430 }                                                 359 }
431                                                   360 
432 void G4ScoringCylinder::DrawColumn(RunScore* m << 361 void G4ScoringCylinder::DrawColumn(std::map<G4int, G4double*> * map, G4VScoreColorMap* colorMap, 
433                                    G4int idxPr << 362            G4int idxProj, G4int idxColumn) 
434 {                                                 363 {
435   G4int projAxis = 0;                             364   G4int projAxis = 0;
436   switch(idxProj)                              << 365   switch(idxProj) {
437   {                                            << 366   case 0: 
438     case 0:                                    << 367     projAxis = IR;
439       projAxis = IR;                           << 368     break;
440       break;                                   << 369   case 1:
441     case 1:                                    << 370     projAxis = IZ;
442       projAxis = IZ;                           << 371     break;
443       break;                                   << 372   case 2:
444     case 2:                                    << 373     projAxis = IPHI;
445       projAxis = IPHI;                         << 374     break;
446       break;                                   << 
447   }                                               375   }
448                                                   376 
449   if(idxColumn < 0 || idxColumn >= fNSegment[p << 377   if(idxColumn<0 || idxColumn>=fNSegment[projAxis])
450   {                                               378   {
451     G4cerr << "Warning : Column number " << id << 379     G4cerr << "Warning : Column number " << idxColumn << " is out of scoring mesh [0," << fNSegment[projAxis]-1 <<
452            << " is out of scoring mesh [0," << << 380     "]. Method ignored." << G4endl;
453            << "]. Method ignored." << G4endl;  << 
454     return;                                       381     return;
455   }                                               382   }
456   G4VVisManager* pVisManager = G4VVisManager:: << 383   G4VVisManager * pVisManager = G4VVisManager::GetConcreteInstance();
457   if(pVisManager != nullptr)                   << 384   if(pVisManager) {
458   {                                            << 385 
459     // cell vectors                               386     // cell vectors
460     std::vector<std::vector<std::vector<G4doub << 387     std::vector<std::vector<std::vector<double> > > cell; // cell[R][Z][PHI]
461     std::vector<G4double> ephi;                << 388     std::vector<double> ephi;
462     for(G4int phi = 0; phi < fNSegment[IPHI];  << 389     for(int phi = 0; phi < fNSegment[IPHI]; phi++) ephi.push_back(0.);
463       ephi.push_back(0.);                      << 390     std::vector<std::vector<double> > ezphi;
464     std::vector<std::vector<G4double>> ezphi;  << 391     for(int z = 0; z < fNSegment[IZ]; z++) ezphi.push_back(ephi);
465     for(G4int z = 0; z < fNSegment[IZ]; z++)   << 392     for(int r = 0; r < fNSegment[IR]; r++) cell.push_back(ezphi);
466       ezphi.push_back(ephi);                   << 393 
467     for(G4int r = 0; r < fNSegment[IR]; r++)   << 394     std::vector<std::vector<double> > rzcell; // rzcell[R][Z]
468       cell.push_back(ezphi);                   << 395     std::vector<double> ez;
469                                                << 396     for(int z = 0; z < fNSegment[IZ]; z++) ez.push_back(0.);
470     std::vector<std::vector<G4double>> rzcell; << 397     for(int r = 0; r < fNSegment[IR]; r++) rzcell.push_back(ez);
471     std::vector<G4double> ez;                  << 398 
472     for(G4int z = 0; z < fNSegment[IZ]; z++)   << 399     std::vector<std::vector<double> > zphicell; // zphicell[Z][PHI]
473       ez.push_back(0.);                        << 400     for(int z = 0; z < fNSegment[IZ]; z++) zphicell.push_back(ephi);
474     for(G4int r = 0; r < fNSegment[IR]; r++)   << 401 
475       rzcell.push_back(ez);                    << 402     std::vector<std::vector<double> > rphicell; // rphicell[R][PHI]
476                                                << 403     for(int r = 0; r < fNSegment[IR]; r++) rphicell.push_back(ephi);
477     std::vector<std::vector<G4double>> zphicel << 
478     for(G4int z = 0; z < fNSegment[IZ]; z++)   << 
479       zphicell.push_back(ephi);                << 
480                                                << 
481     std::vector<std::vector<G4double>> rphicel << 
482     for(G4int r = 0; r < fNSegment[IR]; r++)   << 
483       rphicell.push_back(ephi);                << 
484                                                   404 
485     // projections                                405     // projections
486     G4int q[3];                                   406     G4int q[3];
487     auto itr = map->GetMap()->begin();         << 407     std::map<G4int, G4double*>::iterator itr = map->begin();
488     for(; itr != map->GetMap()->end(); itr++)  << 408     for(; itr != map->end(); itr++) {
489     {                                          << 409       if(itr->first < 0) {
490       if(itr->first < 0)                       << 410   G4cout << itr->first << G4endl;
491       {                                        << 411   continue;
492         G4cout << itr->first << G4endl;        << 
493         continue;                              << 
494       }                                           412       }
495       GetRZPhi(itr->first, q);                    413       GetRZPhi(itr->first, q);
496                                                   414 
497       if(projAxis == IR && q[IR] == idxColumn) << 415       if(projAxis == IR && q[IR] == idxColumn) { // zphi plane
498       {  // zphi plane                         << 416   zphicell[q[IZ]][q[IPHI]] += *(itr->second)/fDrawUnitValue;
499         zphicell[q[IZ]][q[IPHI]] += (itr->seco << 
500       }                                        << 
501       if(projAxis == IZ && q[IZ] == idxColumn) << 
502       {  // rphi plane                         << 
503         rphicell[q[IR]][q[IPHI]] += (itr->seco << 
504       }                                        << 
505       if(projAxis == IPHI && q[IPHI] == idxCol << 
506       {  // rz plane                           << 
507         rzcell[q[IR]][q[IZ]] += (itr->second-> << 
508       }                                           417       }
509     }                                          << 418       if(projAxis == IZ && q[IZ] == idxColumn) { // rphi plane
                                                   >> 419   rphicell[q[IR]][q[IPHI]] += *(itr->second)/fDrawUnitValue;
                                                   >> 420       }
                                                   >> 421       if(projAxis == IPHI && q[IPHI] == idxColumn) { // rz plane
                                                   >> 422   rzcell[q[IR]][q[IZ]] += *(itr->second)/fDrawUnitValue; 
                                                   >> 423       }
                                                   >> 424     }  
510                                                   425 
511     // search min./max. values                    426     // search min./max. values
512     G4double rzmin = DBL_MAX, zphimin = DBL_MA    427     G4double rzmin = DBL_MAX, zphimin = DBL_MAX, rphimin = DBL_MAX;
513     G4double rzmax = 0., zphimax = 0., rphimax    428     G4double rzmax = 0., zphimax = 0., rphimax = 0.;
514     for(G4int r = 0; r < fNSegment[IR]; r++)   << 429     for(int r = 0; r < fNSegment[IR]; r++) {
515     {                                          << 430       for(int phi = 0; phi < fNSegment[IPHI]; phi++) {
516       for(G4int phi = 0; phi < fNSegment[IPHI] << 431   if(rphimin > rphicell[r][phi]) rphimin = rphicell[r][phi];
517       {                                        << 432   if(rphimax < rphicell[r][phi]) rphimax = rphicell[r][phi];
518         if(rphimin > rphicell[r][phi])         << 433       }
519           rphimin = rphicell[r][phi];          << 434       for(int z = 0; z < fNSegment[IZ]; z++) {
520         if(rphimax < rphicell[r][phi])         << 435   if(rzmin > rzcell[r][z]) rzmin = rzcell[r][z];
521           rphimax = rphicell[r][phi];          << 436   if(rzmax < rzcell[r][z]) rzmax = rzcell[r][z];
522       }                                        << 
523       for(G4int z = 0; z < fNSegment[IZ]; z++) << 
524       {                                        << 
525         if(rzmin > rzcell[r][z])               << 
526           rzmin = rzcell[r][z];                << 
527         if(rzmax < rzcell[r][z])               << 
528           rzmax = rzcell[r][z];                << 
529       }                                           437       }
530     }                                             438     }
531     for(G4int z = 0; z < fNSegment[IZ]; z++)   << 439     for(int z = 0; z < fNSegment[IZ]; z++) {
532     {                                          << 440       for(int phi = 0; phi < fNSegment[IPHI]; phi++) {
533       for(G4int phi = 0; phi < fNSegment[IPHI] << 441   if(zphimin > zphicell[z][phi]) zphimin = zphicell[z][phi];
534       {                                        << 442   if(zphimax < zphicell[z][phi]) zphimax = zphicell[z][phi];
535         if(zphimin > zphicell[z][phi])         << 
536           zphimin = zphicell[z][phi];          << 
537         if(zphimax < zphicell[z][phi])         << 
538           zphimax = zphicell[z][phi];          << 
539       }                                           443       }
540     }                                             444     }
541                                                   445 
                                                   >> 446 
542     G4VisAttributes att;                          447     G4VisAttributes att;
543     att.SetForceSolid(true);                      448     att.SetForceSolid(true);
544     att.SetForceAuxEdgeVisible(true);             449     att.SetForceAuxEdgeVisible(true);
545                                                   450 
546     pVisManager->BeginDraw();                  << 
547                                                   451 
548     G4Scale3D scale;                              452     G4Scale3D scale;
549     // z-phi plane                                453     // z-phi plane
550     if(projAxis == IR)                         << 454     if(projAxis == IR) {
551     {                                          << 455       if(colorMap->IfFloatMinMax()) { colorMap->SetMinMax(zphimin,zphimax); }
552       if(colorMap->IfFloatMinMax())            << 456 
553       {                                        << 457       G4double zhalf = fSize[1]/fNSegment[IZ];
554         colorMap->SetMinMax(zphimin, zphimax); << 458       G4double rsize[2] = {fSize[0]/fNSegment[IR]*idxColumn,
555       }                                        << 459           fSize[0]/fNSegment[IR]*(idxColumn+1)};
556                                                << 460       for(int phi = 0; phi < fNSegment[IPHI]; phi++) {
557       G4double zhalf    = fSize[2] / fNSegment << 461   for(int z = 0; z < fNSegment[IZ]; z++) {
558       G4double rsize[2] = {                    << 462 
559         fSize[0] + (fSize[1] - fSize[0]) / fNS << 463     G4double angle = twopi/fNSegment[IPHI]*phi*radian;
560         fSize[0] + (fSize[1] - fSize[0]) / fNS << 464     G4double dphi = twopi/fNSegment[IPHI]*radian;
561       };                                       << 465     G4Tubs cylinder("z-phi", rsize[0], rsize[1], zhalf,
562       for(int phi = 0; phi < fNSegment[IPHI];  << 466         angle, dphi*0.99999);
563       {                                        << 467 
564         for(int z = 0; z < fNSegment[IZ]; z++) << 468     G4ThreeVector zpos(0., 0., -fSize[1] + fSize[1]/fNSegment[IZ]*(1 + 2.*z));
565         {                                      << 469     G4Transform3D trans;
566           G4double angle = fAngle[0] + fAngle[ << 470     if(fRotationMatrix) {
567           G4double dphi  = fAngle[1] / fNSegme << 471       trans = G4Rotate3D(*fRotationMatrix).inverse()*G4Translate3D(zpos);
568           G4Tubs cylinder("z-phi", rsize[0], r << 472       trans = G4Translate3D(fCenterPosition)*trans;
569                           dphi * 0.99999);     << 473     } else {
570                                                << 474       trans = G4Translate3D(zpos)*G4Translate3D(fCenterPosition);
571           G4ThreeVector zpos(                  << 475     }
572             0., 0., -fSize[2] + fSize[2] / fNS << 476     G4double c[4];
573           G4Transform3D trans;                 << 477     colorMap->GetMapColor(zphicell[z][phi], c);
574           if(fRotationMatrix != nullptr)       << 478     att.SetColour(c[0], c[1], c[2]);//, c[3]);
575           {                                    << 479     pVisManager->Draw(cylinder, att, trans);
576             trans =                            << 480   }
577               G4Rotate3D(*fRotationMatrix).inv << 
578             trans = G4Translate3D(fCenterPosit << 
579           }                                    << 
580           else                                 << 
581           {                                    << 
582             trans = G4Translate3D(zpos) * G4Tr << 
583           }                                    << 
584           G4double c[4];                       << 
585           colorMap->GetMapColor(zphicell[z][ph << 
586           att.SetColour(c[0], c[1], c[2]);  // << 
587                                                << 
588           G4Polyhedron* poly = cylinder.GetPol << 
589           poly->Transform(trans);              << 
590           poly->SetVisAttributes(att);         << 
591           pVisManager->Draw(*poly);            << 
592         }                                      << 
593       }                                           481       }
594                                                   482 
595       // r-phi plane                              483       // r-phi plane
596     }                                          << 484     } else if(projAxis == IZ) {
597     else if(projAxis == IZ)                    << 485       if(colorMap->IfFloatMinMax()) { colorMap->SetMinMax(rphimin,rphimax); }
598     {                                          << 486 
599       if(colorMap->IfFloatMinMax())            << 487       G4double rsize = fSize[0]/fNSegment[IR];
600       {                                        << 488       for(int phi = 0; phi < fNSegment[IPHI]; phi++) {
601         colorMap->SetMinMax(rphimin, rphimax); << 489   for(int r = 0; r < fNSegment[IR]; r++) {
602       }                                        << 490 
603                                                << 491     G4double rs[2] = {rsize*r, rsize*(r+1)};
604       G4double rsize = (fSize[1] - fSize[0]) / << 492     G4double angle = twopi/fNSegment[IPHI]*phi*radian;
605       for(G4int phi = 0; phi < fNSegment[IPHI] << 493     G4double dz = fSize[1]/fNSegment[IZ];
606       {                                        << 494     G4double dphi = twopi/fNSegment[IPHI]*radian;
607         for(G4int r = 0; r < fNSegment[IR]; r+ << 495     G4Tubs cylinder("r-phi", rs[0], rs[1], dz,
608         {                                      << 496         angle, dphi*0.99999);
609           G4double rs[2] = { fSize[0] + rsize  << 497     G4ThreeVector zpos(0., 0.,
610           G4double angle = fAngle[0] + fAngle[ << 498            -fSize[1]+fSize[1]/fNSegment[IZ]*(idxColumn*2+1));
611           G4double dz    = fSize[2] / fNSegmen << 499     G4Transform3D trans;
612           G4double dphi  = fAngle[1] / fNSegme << 500     if(fRotationMatrix) {
613           G4Tubs cylinder("r-phi", rs[0], rs[1 << 501       trans = G4Rotate3D(*fRotationMatrix).inverse()*G4Translate3D(zpos);
614           G4ThreeVector zpos(                  << 502       trans = G4Translate3D(fCenterPosition)*trans;
615             0., 0., -fSize[2] + fSize[2] / fNS << 503     } else {
616           G4Transform3D trans;                 << 504       trans = G4Translate3D(zpos)*G4Translate3D(fCenterPosition);
617           if(fRotationMatrix != nullptr)       << 505     }
618           {                                    << 506     G4double c[4];
619             trans =                            << 507     colorMap->GetMapColor(rphicell[r][phi], c);
620               G4Rotate3D(*fRotationMatrix).inv << 508     att.SetColour(c[0], c[1], c[2]);//, c[3]);
621             trans = G4Translate3D(fCenterPosit << 509     pVisManager->Draw(cylinder, att, trans);
622           }                                    << 510   }
623           else                                 << 
624           {                                    << 
625             trans = G4Translate3D(zpos) * G4Tr << 
626           }                                    << 
627           G4double c[4];                       << 
628           colorMap->GetMapColor(rphicell[r][ph << 
629           att.SetColour(c[0], c[1], c[2]);  // << 
630                                                << 
631           G4Polyhedron* poly = cylinder.GetPol << 
632           poly->Transform(trans);              << 
633           poly->SetVisAttributes(att);         << 
634           pVisManager->Draw(*poly);            << 
635         }                                      << 
636       }                                           511       }
637                                                   512 
638       // r-z plane                                513       // r-z plane
639     }                                          << 514     } else if(projAxis == IPHI) {
640     else if(projAxis == IPHI)                  << 515       if(colorMap->IfFloatMinMax()) { colorMap->SetMinMax(rzmin,rzmax); }
641     {                                          << 516 
642       if(colorMap->IfFloatMinMax())            << 517       G4double rsize = fSize[0]/fNSegment[IR];
643       {                                        << 518       G4double zhalf = fSize[1]/fNSegment[IZ];
644         colorMap->SetMinMax(rzmin, rzmax);     << 519       G4double angle = twopi/fNSegment[IPHI]*idxColumn*radian;
645       }                                        << 520       G4double dphi = twopi/fNSegment[IPHI]*radian;
646                                                << 521       for(int z = 0; z < fNSegment[IZ]; z++) {
647       G4double rsize = (fSize[1] - fSize[0]) / << 522   for(int r = 0; r < fNSegment[IR]; r++) {
648       G4double zhalf = fSize[2] / fNSegment[IZ << 523 
649       G4double angle = fAngle[0] + fAngle[1] / << 524     G4double rs[2] = {rsize*r, rsize*(r+1)};
650       G4double dphi  = fAngle[1] / fNSegment[I << 525     G4Tubs cylinder("z-phi", rs[0], rs[1], zhalf,
651       for(G4int z = 0; z < fNSegment[IZ]; z++) << 526         angle, dphi);
652       {                                        << 527 
653         for(G4int r = 0; r < fNSegment[IR]; r+ << 528     G4ThreeVector zpos(0., 0.,
654         {                                      << 529            -fSize[1]+fSize[1]/fNSegment[IZ]*(2.*z+1));
655           G4double rs[2] = { fSize[0] + rsize  << 530     G4Transform3D trans;
656           G4Tubs cylinder("z-phi", rs[0], rs[1 << 531     if(fRotationMatrix) {
657                                                << 532       trans = G4Rotate3D(*fRotationMatrix).inverse()*G4Translate3D(zpos);
658           G4ThreeVector zpos(                  << 533       trans = G4Translate3D(fCenterPosition)*trans;
659             0., 0., -fSize[2] + fSize[2] / fNS << 534     } else {
660           G4Transform3D trans;                 << 535       trans = G4Translate3D(zpos)*G4Translate3D(fCenterPosition);
661           if(fRotationMatrix != nullptr)       << 536     }
662           {                                    << 537     G4double c[4];
663             trans =                            << 538     colorMap->GetMapColor(rzcell[r][z], c);
664               G4Rotate3D(*fRotationMatrix).inv << 539     att.SetColour(c[0], c[1], c[2]);//, c[3]);
665             trans = G4Translate3D(fCenterPosit << 540     pVisManager->Draw(cylinder, att, trans);
666           }                                    << 541   }
667           else                                 << 
668           {                                    << 
669             trans = G4Translate3D(zpos) * G4Tr << 
670           }                                    << 
671           G4double c[4];                       << 
672           colorMap->GetMapColor(rzcell[r][z],  << 
673           att.SetColour(c[0], c[1], c[2]);  // << 
674                                                << 
675           G4Polyhedron* poly = cylinder.GetPol << 
676           poly->Transform(trans);              << 
677           poly->SetVisAttributes(att);         << 
678           pVisManager->Draw(*poly);            << 
679         }                                      << 
680       }                                           542       }
681     }                                             543     }
682     pVisManager->EndDraw();                    << 
683   }                                               544   }
684                                                   545 
685   colorMap->SetPSUnit(fDrawUnit);                 546   colorMap->SetPSUnit(fDrawUnit);
686   colorMap->SetPSName(fDrawPSName);               547   colorMap->SetPSName(fDrawPSName);
687   colorMap->DrawColorChart();                     548   colorMap->DrawColorChart();
                                                   >> 549 
688 }                                                 550 }
689                                                   551 
690 void G4ScoringCylinder::GetRZPhi(G4int index,  << 552 void G4ScoringCylinder::GetRZPhi(G4int index, G4int q[3]) const {
691 {                                              << 
692   // index = k + j * k-size + i * jk-plane-siz    553   // index = k + j * k-size + i * jk-plane-size
693                                                   554 
694   // nested : z -> phi -> r                       555   // nested : z -> phi -> r
695   G4int i  = IZ;                               << 556   G4int i = IZ;
696   G4int j  = IPHI;                             << 557   G4int j = IPHI;
697   G4int k  = IR;                               << 558   G4int k = IR;
698   G4int jk = fNSegment[j] * fNSegment[k];      << 559   G4int jk = fNSegment[j]*fNSegment[k];
699   q[i]     = index / jk;                       << 560   q[i] = index/jk;
700   q[j]     = (index - q[i] * jk) / fNSegment[k << 561   q[j] = (index - q[i]*jk)/fNSegment[k];
701   q[k]     = index - q[j] * fNSegment[k] - q[i << 562   q[k] = index - q[j]*fNSegment[k] - q[i]*jk;
702 }                                              << 
703                                                << 
704 void G4ScoringCylinder::DumpVolumes()          << 
705 {                                              << 
706   G4int lvl = 2;                               << 
707   DumpSolids(lvl);                             << 
708   DumpLogVols(lvl);                            << 
709   DumpPhysVols(lvl);                           << 
710 }                                              << 
711                                                << 
712 void G4ScoringCylinder::DumpSolids(G4int lvl)  << 
713 {                                              << 
714   G4cout << "*********** List of registered so << 
715   auto store = G4SolidStore::GetInstance();    << 
716   auto itr   = store->begin();                 << 
717   for(; itr != store->end(); itr++)            << 
718   {                                            << 
719     switch(lvl)                                << 
720     {                                          << 
721       case 0:                                  << 
722         G4cout << (*itr)->GetName() << G4endl; << 
723         break;                                 << 
724       case 1:                                  << 
725         G4cout << (*itr)->GetName() << "\t vol << 
726                << G4BestUnit((*itr)->GetCubicV << 
727                << "\t surface = "              << 
728                << G4BestUnit((*itr)->GetSurfac << 
729         break;                                 << 
730       default:                                 << 
731         (*itr)->DumpInfo();                    << 
732         break;                                 << 
733     }                                          << 
734   }                                            << 
735 }                                              << 
736                                                << 
737 void G4ScoringCylinder::DumpLogVols(G4int lvl) << 
738 {                                              << 
739   G4cout << "*********** List of registered lo << 
740          << G4endl;                            << 
741   auto store = G4LogicalVolumeStore::GetInstan << 
742   auto itr   = store->begin();                 << 
743   for(; itr != store->end(); itr++)            << 
744   {                                            << 
745     G4cout << (*itr)->GetName()                << 
746            << "\t Solid = " << (*itr)->GetSoli << 
747     if((*itr)->GetMaterial() != nullptr)       << 
748     {                                          << 
749       G4cout << "\t Material = " << (*itr)->Ge << 
750     }                                          << 
751     else                                       << 
752     {                                          << 
753       G4cout << "\t Material : not defined " < << 
754     }                                          << 
755     if(lvl < 1)                                << 
756       continue;                                << 
757     G4cout << "\t region = ";                  << 
758     if((*itr)->GetRegion() != nullptr)         << 
759     {                                          << 
760       G4cout << (*itr)->GetRegion()->GetName() << 
761     }                                          << 
762     else                                       << 
763     {                                          << 
764       G4cout << "not defined";                 << 
765     }                                          << 
766     G4cout << "\t sensitive detector = ";      << 
767     if((*itr)->GetSensitiveDetector() != nullp << 
768     {                                          << 
769       G4cout << (*itr)->GetSensitiveDetector() << 
770     }                                          << 
771     else                                       << 
772     {                                          << 
773       G4cout << "not defined";                 << 
774     }                                          << 
775     G4cout << G4endl;                          << 
776     G4cout << "\t daughters = " << (*itr)->Get << 
777     if((*itr)->GetNoDaughters() > 0)           << 
778     {                                          << 
779       switch((*itr)->CharacteriseDaughters())  << 
780       {                                        << 
781         case kNormal:                          << 
782           G4cout << " (placement)";            << 
783           break;                               << 
784         case kReplica:                         << 
785           G4cout << " (replica : " << (*itr)-> << 
786                  << ")";                       << 
787           break;                               << 
788         case kParameterised:                   << 
789           G4cout << " (parameterized : "       << 
790                  << (*itr)->GetDaughter(0)->Ge << 
791           break;                               << 
792         default:;                              << 
793       }                                        << 
794     }                                          << 
795     G4cout << G4endl;                          << 
796     if(lvl < 2)                                << 
797       continue;                                << 
798     if((*itr)->GetMaterial() != nullptr)       << 
799     {                                          << 
800       G4cout << "\t weight = " << G4BestUnit(( << 
801              << G4endl;                        << 
802     }                                          << 
803     else                                       << 
804     {                                          << 
805       G4cout << "\t weight : not available" << << 
806     }                                          << 
807   }                                            << 
808 }                                              << 
809                                                << 
810 void G4ScoringCylinder::DumpPhysVols(G4int lvl << 
811 {                                              << 
812   G4cout << "*********** List of registered ph << 
813          << G4endl;                            << 
814   auto store = G4PhysicalVolumeStore::GetInsta << 
815   auto itr   = store->begin();                 << 
816   for(; itr != store->end(); itr++)            << 
817   {                                            << 
818     switch(lvl)                                << 
819     {                                          << 
820       case 0:                                  << 
821         G4cout << (*itr)->GetName() << G4endl; << 
822         break;                                 << 
823       case 1:                                  << 
824         G4cout << (*itr)->GetName() << "\t log << 
825                << (*itr)->GetLogicalVolume()-> << 
826                << "\t mother logical = ";      << 
827         if((*itr)->GetMotherLogical() != nullp << 
828         {                                      << 
829           G4cout << (*itr)->GetMotherLogical() << 
830         }                                      << 
831         else                                   << 
832         {                                      << 
833           G4cout << "not defined";             << 
834         }                                      << 
835         G4cout << G4endl;                      << 
836         break;                                 << 
837       default:                                 << 
838         G4cout << (*itr)->GetName() << "\t log << 
839                << (*itr)->GetLogicalVolume()-> << 
840                << "\t mother logical = ";      << 
841         if((*itr)->GetMotherLogical() != nullp << 
842         {                                      << 
843           G4cout << (*itr)->GetMotherLogical() << 
844         }                                      << 
845         else                                   << 
846         {                                      << 
847           G4cout << "not defined";             << 
848         }                                      << 
849         G4cout << "\t type = ";                << 
850         switch((*itr)->VolumeType())           << 
851         {                                      << 
852           case kNormal:                        << 
853             G4cout << "placement";             << 
854             break;                             << 
855           case kReplica:                       << 
856             G4cout << "replica";               << 
857             break;                             << 
858           case kParameterised:                 << 
859             G4cout << "parameterized";         << 
860             break;                             << 
861           default:;                            << 
862         }                                      << 
863         G4cout << G4endl;                      << 
864     }                                          << 
865   }                                            << 
866 }                                                 563 }
867                                                   564