Geant4 Cross Reference |
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 89027 2015-03-18 08:37:30Z gcosmo $ >> 28 // 28 29 29 #include "G4ScoringCylinder.hh" 30 #include "G4ScoringCylinder.hh" 30 31 31 #include "G4LogicalVolume.hh" << 32 #include "G4MultiFunctionalDetector.hh" << 33 #include "G4PVDivision.hh" << 34 #include "G4PVPlacement.hh" << 35 #include "G4PVReplica.hh" << 36 #include "G4PhysicalConstants.hh" 32 #include "G4PhysicalConstants.hh" 37 #include "G4SDManager.hh" << 38 #include "G4ScoringManager.hh" << 39 #include "G4StatDouble.hh" << 40 #include "G4SystemOfUnits.hh" 33 #include "G4SystemOfUnits.hh" >> 34 #include "G4VPhysicalVolume.hh" 41 #include "G4Tubs.hh" 35 #include "G4Tubs.hh" >> 36 #include "G4LogicalVolume.hh" 42 #include "G4VPhysicalVolume.hh" 37 #include "G4VPhysicalVolume.hh" 43 #include "G4VPrimitiveScorer.hh" << 38 #include "G4PVPlacement.hh" 44 #include "G4VScoreColorMap.hh" << 39 #include "G4PVReplica.hh" 45 #include "G4VVisManager.hh" << 40 #include "G4PVDivision.hh" 46 #include "G4VisAttributes.hh" 41 #include "G4VisAttributes.hh" >> 42 #include "G4VVisManager.hh" >> 43 #include "G4VScoreColorMap.hh" 47 44 48 #include "G4LogicalVolumeStore.hh" << 45 #include "G4SDManager.hh" 49 #include "G4Material.hh" << 46 #include "G4MultiFunctionalDetector.hh" 50 #include "G4PhysicalVolumeStore.hh" << 47 #include "G4SDParticleFilter.hh" 51 #include "G4SolidStore.hh" << 48 #include "G4VPrimitiveScorer.hh" 52 #include "G4UnitsTable.hh" << 49 #include "G4PSEnergyDeposit.hh" 53 #include "G4VSensitiveDetector.hh" << 50 #include "G4PSTrackLength.hh" 54 #include "G4VSolid.hh" << 51 #include "G4PSNofStep.hh" >> 52 #include "G4ScoringManager.hh" 55 53 56 54 57 G4ScoringCylinder::G4ScoringCylinder(const G4S << 55 G4ScoringCylinder::G4ScoringCylinder(G4String wName) 58 : G4VScoringMesh(wName) << 56 :G4VScoringMesh(wName) 59 { 57 { 60 fShape = MeshShape::cylinder; << 58 fShape = cylinderMesh; 61 59 62 fDivisionAxisNames[0] = "Z"; 60 fDivisionAxisNames[0] = "Z"; 63 fDivisionAxisNames[1] = "PHI"; 61 fDivisionAxisNames[1] = "PHI"; 64 fDivisionAxisNames[2] = "R"; 62 fDivisionAxisNames[2] = "R"; 65 } 63 } 66 64 67 void G4ScoringCylinder::SetupGeometry(G4VPhysi << 65 G4ScoringCylinder::~G4ScoringCylinder() 68 { << 66 {;} 69 if(verboseLevel > 9) << 67 70 G4cout << "G4ScoringCylinder::SetupGeometr << 68 void G4ScoringCylinder::SetupGeometry(G4VPhysicalVolume * fWorldPhys) { >> 69 >> 70 if(verboseLevel > 9) G4cout << "G4ScoringCylinder::SetupGeometry() ..." << G4endl; 71 71 72 // World 72 // World 73 G4VPhysicalVolume* scoringWorld = fWorldPhys << 73 G4VPhysicalVolume * scoringWorld = fWorldPhys; 74 G4LogicalVolume* worldLogical = scoringWor << 74 G4LogicalVolume * worldLogical = scoringWorld->GetLogicalVolume(); 75 75 76 // Scoring Mesh 76 // Scoring Mesh 77 if(verboseLevel > 9) << 77 if(verboseLevel > 9) G4cout << fWorldName << G4endl; 78 G4cout << fWorldName << G4endl; << 78 G4String tubsName = fWorldName+"_mesh"; 79 G4String tubsName = fWorldName + "_mesh"; << 80 79 81 if(verboseLevel > 9) << 80 if(verboseLevel > 9) G4cout << "R max., Dz =: " << fSize[0] << ", " << fSize[1] << G4endl; 82 { << 81 G4VSolid * tubsSolid = new G4Tubs(tubsName+"0", // name 83 G4cout << "R min, R max., Dz =: " << fSize << 82 0., // R min 84 << ", " << 83 fSize[0], // R max 85 } << 84 fSize[1], // Dz 86 G4VSolid* tubsSolid = new G4Tubs(tu << 85 0., // starting phi 87 fSize[0], << 86 twopi*rad); // segment phi 88 fSize[1], << 87 G4LogicalVolume * tubsLogical = new G4LogicalVolume(tubsSolid, 0, tubsName); 89 fSize[2], << 88 new G4PVPlacement(fRotationMatrix, fCenterPosition, 90 fAngle[0], << 89 tubsLogical, tubsName+"0", worldLogical, false, 0); 91 fAngle[1]); << 90 92 auto tubsLogical = new G4LogicalVolume(tubs << 91 if(verboseLevel > 9) G4cout << " # of segments : r, phi, z =: " 93 new G4PVPlacement(fRotationMatrix, fCenterPo << 92 << fNSegment[IR] << ", " << fNSegment[IPHI] << ", " << fNSegment[IZ] << G4endl; 94 tubsName + "0", worldLogic << 93 95 << 94 G4String layerName[2] = {tubsName + "1", tubsName + "2"}; 96 if(verboseLevel > 9) << 95 G4VSolid * layerSolid[2]; 97 G4cout << " # of segments : r, phi, z =: " << 96 G4LogicalVolume * layerLogical[2]; 98 << fNSegment[IPHI] << ", " << fNSeg << 99 << 100 G4String layerName[2] = { tubsName + "1", tu << 101 G4VSolid* layerSolid[2]; << 102 G4LogicalVolume* layerLogical[2]; << 103 97 104 //-- fisrt nested layer (replicated along z 98 //-- fisrt nested layer (replicated along z direction) 105 if(verboseLevel > 9) << 99 if(verboseLevel > 9) G4cout << "layer 1 :" << G4endl; 106 G4cout << "layer 1 :" << G4endl; << 100 layerSolid[0] = new G4Tubs(layerName[0], // name 107 layerSolid[0] = new G4Tubs(layerName[0], << 101 0., // inner radius 108 fSize[0], << 102 fSize[0], // outer radius 109 fSize[1], << 103 fSize[1]/fNSegment[IZ], // half len. in z 110 fSize[2] / fNSegm << 104 0., // starting phi angle 111 fAngle[0], << 105 twopi*rad); // delta angle of the segment 112 fAngle[1]); // d << 106 layerLogical[0] = new G4LogicalVolume(layerSolid[0], 0, layerName[0]); 113 layerLogical[0] = new G4LogicalVolume(layerS << 107 if(fNSegment[IZ] > 1) { 114 if(fNSegment[IZ] > 1) << 108 if(verboseLevel > 9) G4cout << "G4ScoringCylinder::Construct() : Replicate along z direction" << G4endl; 115 { << 109 if(G4ScoringManager::GetReplicaLevel()>0) { 116 if(verboseLevel > 9) << 110 if(verboseLevel > 9) G4cout << "G4ScoringCylinder::Construct() : Replica" << G4endl; 117 G4cout << "G4ScoringCylinder::Construct( << 111 new G4PVReplica(layerName[0], layerLogical[0], tubsLogical, kZAxis, fNSegment[IZ], 2.*fSize[1]/fNSegment[IZ]); 118 << G4endl; << 112 } else { 119 if(G4ScoringManager::GetReplicaLevel() > 0 << 113 if(verboseLevel > 9) G4cout << "G4ScoringCylinder::Construct() : Division" << G4endl; 120 { << 114 new G4PVDivision(layerName[0], layerLogical[0], tubsLogical, kZAxis, fNSegment[IZ], 0.); 121 if(verboseLevel > 9) << 115 } 122 G4cout << "G4ScoringCylinder::Construc << 116 } else if(fNSegment[IZ] == 1) { 123 new G4PVReplica(layerName[0], layerLogic << 117 if(verboseLevel > 9) G4cout << "G4ScoringCylinder::Construct() : Placement" << G4endl; 124 fNSegment[IZ], 2. * fSiz << 118 new G4PVPlacement(0, G4ThreeVector(0.,0.,0.), layerLogical[0], layerName[0], tubsLogical, false, 0); 125 } << 119 } 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 120 G4cerr << "G4ScoringCylinder::SetupGeometry() : invalid parameter (" 144 << fNSegment[IZ] << ") " << 121 << fNSegment[IZ] << ") " 145 << "in placement of the first neste << 122 << "in placement of the first nested layer." << G4endl; 146 } 123 } 147 124 148 // second nested layer (replicated along phi 125 // second nested layer (replicated along phi direction) 149 if(verboseLevel > 9) << 126 if(verboseLevel > 9) G4cout << "layer 2 :" << G4endl; 150 G4cout << "layer 2 :" << G4endl; << 127 layerSolid[1] = new G4Tubs(layerName[1], 151 layerSolid[1] = << 128 0., 152 new G4Tubs(layerName[1], fSize[0], fSize[1 << 129 fSize[0], 153 fAngle[0], fAngle[1] / fNSegmen << 130 fSize[1]/fNSegment[IZ], 154 layerLogical[1] = new G4LogicalVolume(layerS << 131 0., 155 if(fNSegment[IPHI] > 1) << 132 twopi*rad/fNSegment[IPHI]); 156 { << 133 layerLogical[1] = new G4LogicalVolume(layerSolid[1], 0, layerName[1]); 157 if(verboseLevel > 9) << 134 if(fNSegment[IPHI] > 1) { 158 G4cout << "G4ScoringCylinder::Construct( << 135 if(verboseLevel > 9) G4cout << "G4ScoringCylinder::Construct() : Replicate along phi direction" << G4endl; 159 << G4endl; << 136 if(G4ScoringManager::GetReplicaLevel()>1) { 160 if(G4ScoringManager::GetReplicaLevel() > 1 << 137 if(verboseLevel > 9) G4cout << "G4ScoringCylinder::Construct() : Replica" << G4endl; 161 { << 162 if(verboseLevel > 9) << 163 G4cout << "G4ScoringCylinder::Construc << 164 new G4PVReplica(layerName[1], layerLogic 138 new G4PVReplica(layerName[1], layerLogical[1], layerLogical[0], kPhi, 165 fNSegment[IPHI], fAngle[ << 139 fNSegment[IPHI], twopi*rad/fNSegment[IPHI]); 166 } << 140 } else { 167 else << 141 if(verboseLevel > 9) G4cout << "G4ScoringCylinder::Construct() : Division" << G4endl; 168 { << 142 new G4PVDivision(layerName[1], layerLogical[1], layerLogical[0], kPhi, fNSegment[IPHI], 0.); 169 if(verboseLevel > 9) << 143 } 170 G4cout << "G4ScoringCylinder::Construc << 144 } else if(fNSegment[IPHI] == 1) { 171 new G4PVDivision(layerName[1], layerLogi << 145 if(verboseLevel > 9) G4cout << "G4ScoringCylinder::Construct() : Placement" << G4endl; 172 fNSegment[IPHI], 0.); << 146 new G4PVPlacement(0, G4ThreeVector(0.,0.,0.), layerLogical[1], layerName[1], layerLogical[0], false, 0); 173 } << 147 } 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 148 G4cerr << "ERROR : G4ScoringCylinder::SetupGeometry() : invalid parameter (" 184 << fNSegment[IPHI] << ") " << 149 << fNSegment[IPHI] << ") " 185 << "in placement of the second nest << 150 << "in placement of the second nested layer." << G4endl; 186 151 187 // mesh elements 152 // mesh elements 188 if(verboseLevel > 9) << 153 if(verboseLevel > 9) G4cout << "mesh elements :" << G4endl; 189 G4cout << "mesh elements :" << G4endl; << 154 G4String elementName = tubsName +"3"; 190 G4String elementName = tubsName + "3"; << 155 G4VSolid * elementSolid = new G4Tubs(elementName, 191 G4VSolid* elementSolid = new G4Tubs( << 156 0., 192 elementName, fSize[0], (fSize[1] - fSize[0 << 157 fSize[0]/fNSegment[IR], 193 fSize[2] / fNSegment[IZ], fAngle[0], fAngl << 158 fSize[1]/fNSegment[IZ], 194 fMeshElementLogical = new G4LogicalVolume(el << 159 0., 195 if(fNSegment[IR] >= 1) << 160 twopi*rad/fNSegment[IPHI]); 196 { << 161 fMeshElementLogical = new G4LogicalVolume(elementSolid, 0, elementName); 197 if(verboseLevel > 9) << 162 if(fNSegment[IR] > 1) { 198 G4cout << "G4ScoringCylinder::Construct( << 163 199 << G4endl; << 164 if(verboseLevel > 9) G4cout << "G4ScoringCylinder::Construct() : Replicate along r direction" << G4endl; 200 << 165 201 if(G4ScoringManager::GetReplicaLevel() > 2 << 166 if(G4ScoringManager::GetReplicaLevel()>2) { 202 { << 167 if(verboseLevel > 9) G4cout << "G4ScoringCylinder::Construct() : Replica" << G4endl; 203 if(verboseLevel > 9) << 204 G4cout << "G4ScoringCylinder::Construc << 205 new G4PVReplica(elementName, fMeshElemen 168 new G4PVReplica(elementName, fMeshElementLogical, layerLogical[1], kRho, 206 fNSegment[IR], (fSize[1] << 169 fNSegment[IR], fSize[0]/fNSegment[IR]); 207 fSize[0]); << 170 } else { 208 } << 171 if(verboseLevel > 9) G4cout << "G4ScoringCylinder::Construct() : Division" << G4endl; 209 else << 172 new G4PVDivision(elementName, fMeshElementLogical, layerLogical[1], kRho, fNSegment[IR], 0.); 210 { << 173 } 211 if(verboseLevel > 9) << 174 } else if(fNSegment[IR] == 1) { 212 G4cout << "G4ScoringCylinder::Construc << 175 if(verboseLevel > 9) G4cout << "G4ScoringCylinder::Construct() : Placement" << G4endl; 213 new G4PVDivision(elementName, fMeshEleme << 176 new G4PVPlacement(0, G4ThreeVector(0.,0.,0.), fMeshElementLogical, elementName, layerLogical[1], false, 0); 214 fNSegment[IR], 0.); << 177 } else { 215 } << 216 } << 217 else << 218 { << 219 G4cerr << "G4ScoringCylinder::SetupGeometr 178 G4cerr << "G4ScoringCylinder::SetupGeometry() : " 220 << "invalid parameter (" << fNSegme << 179 << "invalid parameter (" << fNSegment[IR] << ") " 221 << "in mesh element placement." << << 180 << "in mesh element placement." << G4endl; 222 } 181 } 223 182 224 // set the sensitive detector 183 // set the sensitive detector 225 fMeshElementLogical->SetSensitiveDetector(fM 184 fMeshElementLogical->SetSensitiveDetector(fMFD); >> 185 226 186 227 // vis. attributes 187 // vis. attributes 228 auto visatt = new G4VisAttributes(G4Colour( << 188 G4VisAttributes * visatt = new G4VisAttributes(G4Colour(.5,.5,.5)); 229 visatt->SetVisibility(true); 189 visatt->SetVisibility(true); 230 layerLogical[0]->SetVisAttributes(visatt); 190 layerLogical[0]->SetVisAttributes(visatt); 231 layerLogical[1]->SetVisAttributes(visatt); 191 layerLogical[1]->SetVisAttributes(visatt); 232 visatt = new G4VisAttributes(G4Colour(.5, .5 << 192 visatt = new G4VisAttributes(G4Colour(.5,.5,.5,0.01)); 233 // visatt->SetForceSolid(true); << 193 //visatt->SetForceSolid(true); 234 fMeshElementLogical->SetVisAttributes(visatt 194 fMeshElementLogical->SetVisAttributes(visatt); 235 << 236 if(verboseLevel > 9) << 237 DumpVolumes(); << 238 } 195 } 239 196 240 void G4ScoringCylinder::List() const << 197 void G4ScoringCylinder::List() const { 241 { << 198 G4cout << "G4ScoringCylinder : " << fWorldName << " --- Shape: Cylindrical mesh" << G4endl; 242 G4cout << "G4ScoringCylinder : " << fWorldNa << 243 << " --- Shape: Cylindrical mesh" << << 244 199 245 G4cout << " Size (Rmin, Rmax, Dz): (" << fSi << 200 G4cout << " Size (R, Dz): (" 246 << fSize[1] / cm << ", " << fSize[2] << 201 << fSize[0]/cm << ", " 247 G4cout << " Angle (start, span): (" << fAngl << 202 << fSize[1]/cm << ") [cm]" 248 << fAngle[1] / deg << ") [deg]" << G4 << 203 << G4endl; 249 204 250 G4VScoringMesh::List(); 205 G4VScoringMesh::List(); 251 } 206 } 252 207 253 void G4ScoringCylinder::Draw(RunScore* map, G4 << 208 254 G4int axflg) << 209 void G4ScoringCylinder::Draw(std::map<G4int, G4double*> * map, 255 { << 210 G4VScoreColorMap* colorMap, G4int axflg) { 256 G4VVisManager* pVisManager = G4VVisManager:: << 211 257 if(pVisManager != nullptr) << 212 G4VVisManager * pVisManager = G4VVisManager::GetConcreteInstance(); 258 { << 213 if(pVisManager) { >> 214 259 // cell vectors 215 // cell vectors 260 std::vector<G4double> ephi; << 216 std::vector<double> ephi; 261 for(G4int phi = 0; phi < fNSegment[IPHI]; << 217 for(int phi = 0; phi < fNSegment[IPHI]; phi++) ephi.push_back(0.); 262 ephi.push_back(0.); << 263 //- 218 //- 264 std::vector<std::vector<G4double>> zphicel << 219 std::vector<std::vector<double> > zphicell; // zphicell[Z][PHI] 265 for(G4int z = 0; z < fNSegment[IZ]; z++) << 220 for(int z = 0; z < fNSegment[IZ]; z++) zphicell.push_back(ephi); 266 zphicell.push_back(ephi); << 267 //- 221 //- 268 std::vector<std::vector<G4double>> rphicel << 222 std::vector<std::vector<double> > rphicell; // rphicell[R][PHI] 269 for(G4int r = 0; r < fNSegment[IR]; r++) << 223 for(int r = 0; r < fNSegment[IR]; r++) rphicell.push_back(ephi); 270 rphicell.push_back(ephi); << 224 271 << 272 // projections 225 // projections 273 G4int q[3]; 226 G4int q[3]; 274 auto itr = map->GetMap()->begin(); << 227 std::map<G4int, G4double*>::iterator itr = map->begin(); 275 for(; itr != map->GetMap()->end(); itr++) << 228 for(; itr != map->end(); itr++) { 276 { << 229 if(itr->first < 0) { 277 if(itr->first < 0) << 278 { << 279 G4cout << itr->first << G4endl; 230 G4cout << itr->first << G4endl; 280 continue; 231 continue; 281 } 232 } 282 GetRZPhi(itr->first, q); 233 GetRZPhi(itr->first, q); 283 << 234 284 zphicell[q[IZ]][q[IPHI]] += (itr->second << 235 zphicell[q[IZ]][q[IPHI]] += *(itr->second)/fDrawUnitValue; 285 rphicell[q[IR]][q[IPHI]] += (itr->second << 236 rphicell[q[IR]][q[IPHI]] += *(itr->second)/fDrawUnitValue; 286 } 237 } 287 << 238 288 // search min./max. values 239 // search min./max. values 289 G4double zphimin = DBL_MAX, rphimin = DBL_ 240 G4double zphimin = DBL_MAX, rphimin = DBL_MAX; 290 G4double zphimax = 0., rphimax = 0.; 241 G4double zphimax = 0., rphimax = 0.; 291 for(G4int iphi = 0; iphi < fNSegment[IPHI] << 242 for(int iphi = 0; iphi < fNSegment[IPHI]; iphi++) { 292 { << 243 for(int iz = 0; iz < fNSegment[IZ]; iz++) { 293 for(G4int iz = 0; iz < fNSegment[IZ]; iz << 244 if(zphimin > zphicell[iz][iphi]) zphimin = zphicell[iz][iphi]; 294 { << 245 if(zphimax < zphicell[iz][iphi]) zphimax = zphicell[iz][iphi]; 295 if(zphimin > zphicell[iz][iphi]) << 246 } 296 zphimin = zphicell[iz][iphi]; << 247 for(int ir = 0; ir < fNSegment[IR]; ir++) { 297 if(zphimax < zphicell[iz][iphi]) << 248 if(rphimin > rphicell[ir][iphi]) rphimin = rphicell[ir][iphi]; 298 zphimax = zphicell[iz][iphi]; << 249 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 } 250 } 307 } 251 } 308 << 252 309 G4VisAttributes att; 253 G4VisAttributes att; 310 att.SetForceSolid(true); 254 att.SetForceSolid(true); 311 att.SetForceAuxEdgeVisible(true); 255 att.SetForceAuxEdgeVisible(true); 312 << 256 >> 257 313 G4Scale3D scale; 258 G4Scale3D scale; 314 if(axflg / 100 == 1) << 259 if(axflg/100==1) { 315 { << 316 // rz plane 260 // rz plane 317 } 261 } 318 axflg = axflg % 100; << 262 axflg = axflg%100; 319 if(axflg / 10 == 1) << 263 if(axflg/10==1) { 320 { << 321 pVisManager->BeginDraw(); 264 pVisManager->BeginDraw(); 322 << 265 323 // z-phi plane 266 // z-phi plane 324 if(colorMap->IfFloatMinMax()) << 267 if(colorMap->IfFloatMinMax()) { colorMap->SetMinMax(zphimin, zphimax); } 325 { << 268 326 colorMap->SetMinMax(zphimin, zphimax); << 269 G4double zhalf = fSize[1]/fNSegment[IZ]; 327 } << 270 for(int phi = 0; phi < fNSegment[IPHI]; phi++) { 328 << 271 for(int z = 0; z < fNSegment[IZ]; z++) { 329 G4double zhalf = fSize[2] / fNSegment[IZ << 330 for(G4int phi = 0; phi < fNSegment[IPHI] << 331 { << 332 for(G4int z = 0; z < fNSegment[IZ]; z+ << 333 { << 334 //- 272 //- 335 G4double angle = fAngle[0] + fAngle[ << 273 G4double angle = twopi/fNSegment[IPHI]*phi; 336 G4double dphi = fAngle[1] / fNSegme << 274 G4double dphi = twopi/fNSegment[IPHI]; 337 G4Tubs cylinder( << 275 G4Tubs cylinder("z-phi", // name 338 "z-phi", // nam << 276 fSize[0]*0.99, fSize[0], // inner radius, outer radius 339 fSize[1] * 0.99, fSize[1], // inn << 277 zhalf, // half length in z 340 zhalf, // hal << 278 angle, dphi*0.99999); // starting phi angle, delta angle 341 angle, dphi * 0.99999); // sta << 342 //- 279 //- 343 G4ThreeVector zpos( << 280 G4ThreeVector zpos(0., 0., -fSize[1] + fSize[1]/fNSegment[IZ]*(1 + 2.*z)); 344 0., 0., -fSize[2] + fSize[2] / fNS << 345 G4Transform3D trans; 281 G4Transform3D trans; 346 if(fRotationMatrix != nullptr) << 282 if(fRotationMatrix) { 347 { << 283 trans = G4Rotate3D(*fRotationMatrix).inverse()*G4Translate3D(zpos); 348 trans = << 284 trans = G4Translate3D(fCenterPosition)*trans; 349 G4Rotate3D(*fRotationMatrix).inv << 285 } else { 350 trans = G4Translate3D(fCenterPosit << 286 trans = G4Translate3D(zpos)*G4Translate3D(fCenterPosition); 351 } << 352 else << 353 { << 354 trans = G4Translate3D(zpos) * G4Tr << 355 } 287 } 356 G4double c[4]; 288 G4double c[4]; 357 colorMap->GetMapColor(zphicell[z][ph 289 colorMap->GetMapColor(zphicell[z][phi], c); 358 att.SetColour(c[0], c[1], c[2]); // << 290 att.SetColour(c[0], c[1], c[2]);//, c[3]); 359 //- 291 //- 360 G4Polyhedron* poly = cylinder.GetPol << 292 G4Polyhedron * poly = cylinder.GetPolyhedron(); 361 poly->Transform(trans); 293 poly->Transform(trans); 362 poly->SetVisAttributes(att); 294 poly->SetVisAttributes(att); 363 pVisManager->Draw(*poly); 295 pVisManager->Draw(*poly); 364 } 296 } 365 } 297 } 366 pVisManager->EndDraw(); 298 pVisManager->EndDraw(); 367 } 299 } 368 axflg = axflg % 10; << 300 axflg = axflg%10; 369 if(axflg == 1) << 301 if(axflg==1) { 370 { << 371 pVisManager->BeginDraw(); 302 pVisManager->BeginDraw(); 372 << 303 373 // r-phi plane 304 // r-phi plane 374 if(colorMap->IfFloatMinMax()) << 305 if(colorMap->IfFloatMinMax()) { colorMap->SetMinMax(rphimin, rphimax); } 375 { << 306 376 colorMap->SetMinMax(rphimin, rphimax); << 307 G4double rsize = fSize[0]/fNSegment[IR]; 377 } << 308 for(int phi = 0; phi < fNSegment[IPHI]; phi++) { 378 << 309 for(int r = 0; r < fNSegment[IR]; r++) { 379 G4double rsize = (fSize[1] - fSize[0]) / << 310 380 for(G4int phi = 0; phi < fNSegment[IPHI] << 311 G4double rs[2] = {rsize*r, rsize*(r+1)}; 381 { << 312 G4double angle = twopi/fNSegment[IPHI]*phi; 382 for(G4int r = 0; r < fNSegment[IR]; r+ << 313 G4double dphi = twopi/fNSegment[IPHI]; 383 { << 314 G4Tubs cylindern("z-phi", rs[0], rs[1], 0.001, 384 G4double rs[2] = { fSize[0] + rsize << 315 angle, dphi*0.99999); 385 G4double angle = fAngle[0] + fAngle[ << 386 G4double dphi = fAngle[1] / fNSegme << 387 G4Tubs cylindern("z-phi", rs[0], rs[ << 388 G4Tubs cylinderp = cylindern; 316 G4Tubs cylinderp = cylindern; 389 << 317 390 G4ThreeVector zposn(0., 0., -fSize[2 << 318 G4ThreeVector zposn(0., 0., -fSize[1]); 391 G4ThreeVector zposp(0., 0., fSize[2] << 319 G4ThreeVector zposp(0., 0., fSize[1]); 392 G4Transform3D transn, transp; 320 G4Transform3D transn, transp; 393 if(fRotationMatrix != nullptr) << 321 if(fRotationMatrix) { 394 { << 322 transn = G4Rotate3D(*fRotationMatrix).inverse()*G4Translate3D(zposn); 395 transn = << 323 transn = G4Translate3D(fCenterPosition)*transn; 396 G4Rotate3D(*fRotationMatrix).inv << 324 transp = G4Rotate3D(*fRotationMatrix).inverse()*G4Translate3D(zposp); 397 transn = G4Translate3D(fCenterPosi << 325 transp = G4Translate3D(fCenterPosition)*transp; 398 transp = << 326 } else { 399 G4Rotate3D(*fRotationMatrix).inv << 327 transn = G4Translate3D(zposn)*G4Translate3D(fCenterPosition); 400 transp = G4Translate3D(fCenterPosi << 328 transp = G4Translate3D(zposp)*G4Translate3D(fCenterPosition); 401 } << 402 else << 403 { << 404 transn = G4Translate3D(zposn) * G4 << 405 transp = G4Translate3D(zposp) * G4 << 406 } 329 } 407 G4double c[4]; 330 G4double c[4]; 408 colorMap->GetMapColor(rphicell[r][ph 331 colorMap->GetMapColor(rphicell[r][phi], c); 409 att.SetColour(c[0], c[1], c[2]); // << 332 att.SetColour(c[0], c[1], c[2]);//, c[3]); 410 333 411 G4Polyhedron* polyn = cylindern.GetP << 334 G4Polyhedron * polyn = cylindern.GetPolyhedron(); 412 polyn->Transform(transn); 335 polyn->Transform(transn); 413 polyn->SetVisAttributes(att); 336 polyn->SetVisAttributes(att); 414 pVisManager->Draw(*polyn); 337 pVisManager->Draw(*polyn); 415 338 416 G4Polyhedron* polyp = cylinderp.GetP << 339 G4Polyhedron * polyp = cylinderp.GetPolyhedron(); 417 polyp->Transform(transp); 340 polyp->Transform(transp); 418 polyp->SetVisAttributes(att); 341 polyp->SetVisAttributes(att); 419 pVisManager->Draw(*polyp); 342 pVisManager->Draw(*polyp); 420 } 343 } 421 } 344 } 422 << 345 423 pVisManager->EndDraw(); 346 pVisManager->EndDraw(); 424 } 347 } 425 << 348 426 colorMap->SetPSUnit(fDrawUnit); 349 colorMap->SetPSUnit(fDrawUnit); 427 colorMap->SetPSName(fDrawPSName); 350 colorMap->SetPSName(fDrawPSName); 428 colorMap->DrawColorChart(); 351 colorMap->DrawColorChart(); >> 352 429 } 353 } 430 } 354 } 431 355 432 void G4ScoringCylinder::DrawColumn(RunScore* m << 356 void G4ScoringCylinder::DrawColumn(std::map<G4int, G4double*> * map, G4VScoreColorMap* colorMap, 433 G4int idxPr << 357 G4int idxProj, G4int idxColumn) 434 { 358 { 435 G4int projAxis = 0; 359 G4int projAxis = 0; 436 switch(idxProj) << 360 switch(idxProj) { 437 { << 438 case 0: 361 case 0: 439 projAxis = IR; 362 projAxis = IR; 440 break; 363 break; 441 case 1: 364 case 1: 442 projAxis = IZ; 365 projAxis = IZ; 443 break; 366 break; 444 case 2: 367 case 2: 445 projAxis = IPHI; 368 projAxis = IPHI; 446 break; 369 break; 447 } 370 } 448 << 371 449 if(idxColumn < 0 || idxColumn >= fNSegment[p << 372 if(idxColumn<0 || idxColumn>=fNSegment[projAxis]) 450 { 373 { 451 G4cerr << "Warning : Column number " << id << 374 G4cerr << "Warning : Column number " << idxColumn << " is out of scoring mesh [0," << fNSegment[projAxis]-1 << 452 << " is out of scoring mesh [0," << << 375 "]. Method ignored." << G4endl; 453 << "]. Method ignored." << G4endl; << 454 return; 376 return; 455 } 377 } 456 G4VVisManager* pVisManager = G4VVisManager:: << 378 G4VVisManager * pVisManager = G4VVisManager::GetConcreteInstance(); 457 if(pVisManager != nullptr) << 379 if(pVisManager) { 458 { << 380 459 // cell vectors 381 // cell vectors 460 std::vector<std::vector<std::vector<G4doub << 382 std::vector<std::vector<std::vector<double> > > cell; // cell[R][Z][PHI] 461 std::vector<G4double> ephi; << 383 std::vector<double> ephi; 462 for(G4int phi = 0; phi < fNSegment[IPHI]; << 384 for(int phi = 0; phi < fNSegment[IPHI]; phi++) ephi.push_back(0.); 463 ephi.push_back(0.); << 385 std::vector<std::vector<double> > ezphi; 464 std::vector<std::vector<G4double>> ezphi; << 386 for(int z = 0; z < fNSegment[IZ]; z++) ezphi.push_back(ephi); 465 for(G4int z = 0; z < fNSegment[IZ]; z++) << 387 for(int r = 0; r < fNSegment[IR]; r++) cell.push_back(ezphi); 466 ezphi.push_back(ephi); << 388 467 for(G4int r = 0; r < fNSegment[IR]; r++) << 389 std::vector<std::vector<double> > rzcell; // rzcell[R][Z] 468 cell.push_back(ezphi); << 390 std::vector<double> ez; 469 << 391 for(int z = 0; z < fNSegment[IZ]; z++) ez.push_back(0.); 470 std::vector<std::vector<G4double>> rzcell; << 392 for(int r = 0; r < fNSegment[IR]; r++) rzcell.push_back(ez); 471 std::vector<G4double> ez; << 393 472 for(G4int z = 0; z < fNSegment[IZ]; z++) << 394 std::vector<std::vector<double> > zphicell; // zphicell[Z][PHI] 473 ez.push_back(0.); << 395 for(int z = 0; z < fNSegment[IZ]; z++) zphicell.push_back(ephi); 474 for(G4int r = 0; r < fNSegment[IR]; r++) << 396 475 rzcell.push_back(ez); << 397 std::vector<std::vector<double> > rphicell; // rphicell[R][PHI] 476 << 398 for(int r = 0; r < fNSegment[IR]; r++) rphicell.push_back(ephi); 477 std::vector<std::vector<G4double>> zphicel << 399 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 << 485 // projections 400 // projections 486 G4int q[3]; 401 G4int q[3]; 487 auto itr = map->GetMap()->begin(); << 402 std::map<G4int, G4double*>::iterator itr = map->begin(); 488 for(; itr != map->GetMap()->end(); itr++) << 403 for(; itr != map->end(); itr++) { 489 { << 404 if(itr->first < 0) { 490 if(itr->first < 0) << 491 { << 492 G4cout << itr->first << G4endl; 405 G4cout << itr->first << G4endl; 493 continue; 406 continue; 494 } 407 } 495 GetRZPhi(itr->first, q); 408 GetRZPhi(itr->first, q); 496 << 409 497 if(projAxis == IR && q[IR] == idxColumn) << 410 if(projAxis == IR && q[IR] == idxColumn) { // zphi plane 498 { // zphi plane << 411 zphicell[q[IZ]][q[IPHI]] += *(itr->second)/fDrawUnitValue; 499 zphicell[q[IZ]][q[IPHI]] += (itr->seco << 412 } 500 } << 413 if(projAxis == IZ && q[IZ] == idxColumn) { // rphi plane 501 if(projAxis == IZ && q[IZ] == idxColumn) << 414 rphicell[q[IR]][q[IPHI]] += *(itr->second)/fDrawUnitValue; 502 { // rphi plane << 415 } 503 rphicell[q[IR]][q[IPHI]] += (itr->seco << 416 if(projAxis == IPHI && q[IPHI] == idxColumn) { // rz plane 504 } << 417 rzcell[q[IR]][q[IZ]] += *(itr->second)/fDrawUnitValue; 505 if(projAxis == IPHI && q[IPHI] == idxCol << 506 { // rz plane << 507 rzcell[q[IR]][q[IZ]] += (itr->second-> << 508 } 418 } 509 } 419 } 510 << 420 511 // search min./max. values 421 // search min./max. values 512 G4double rzmin = DBL_MAX, zphimin = DBL_MA 422 G4double rzmin = DBL_MAX, zphimin = DBL_MAX, rphimin = DBL_MAX; 513 G4double rzmax = 0., zphimax = 0., rphimax 423 G4double rzmax = 0., zphimax = 0., rphimax = 0.; 514 for(G4int r = 0; r < fNSegment[IR]; r++) << 424 for(int r = 0; r < fNSegment[IR]; r++) { 515 { << 425 for(int phi = 0; phi < fNSegment[IPHI]; phi++) { 516 for(G4int phi = 0; phi < fNSegment[IPHI] << 426 if(rphimin > rphicell[r][phi]) rphimin = rphicell[r][phi]; 517 { << 427 if(rphimax < rphicell[r][phi]) rphimax = rphicell[r][phi]; 518 if(rphimin > rphicell[r][phi]) << 428 } 519 rphimin = rphicell[r][phi]; << 429 for(int z = 0; z < fNSegment[IZ]; z++) { 520 if(rphimax < rphicell[r][phi]) << 430 if(rzmin > rzcell[r][z]) rzmin = rzcell[r][z]; 521 rphimax = rphicell[r][phi]; << 431 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 } << 530 } << 531 for(G4int z = 0; z < fNSegment[IZ]; z++) << 532 { << 533 for(G4int phi = 0; phi < fNSegment[IPHI] << 534 { << 535 if(zphimin > zphicell[z][phi]) << 536 zphimin = zphicell[z][phi]; << 537 if(zphimax < zphicell[z][phi]) << 538 zphimax = zphicell[z][phi]; << 539 } 432 } 540 } 433 } 541 << 434 for(int z = 0; z < fNSegment[IZ]; z++) { >> 435 for(int phi = 0; phi < fNSegment[IPHI]; phi++) { >> 436 if(zphimin > zphicell[z][phi]) zphimin = zphicell[z][phi]; >> 437 if(zphimax < zphicell[z][phi]) zphimax = zphicell[z][phi]; >> 438 } >> 439 } >> 440 >> 441 542 G4VisAttributes att; 442 G4VisAttributes att; 543 att.SetForceSolid(true); 443 att.SetForceSolid(true); 544 att.SetForceAuxEdgeVisible(true); 444 att.SetForceAuxEdgeVisible(true); 545 << 445 546 pVisManager->BeginDraw(); 446 pVisManager->BeginDraw(); 547 << 447 548 G4Scale3D scale; 448 G4Scale3D scale; 549 // z-phi plane 449 // z-phi plane 550 if(projAxis == IR) << 450 if(projAxis == IR) { 551 { << 451 552 if(colorMap->IfFloatMinMax()) << 452 if(colorMap->IfFloatMinMax()) { colorMap->SetMinMax(zphimin,zphimax); } 553 { << 453 554 colorMap->SetMinMax(zphimin, zphimax); << 454 G4double zhalf = fSize[1]/fNSegment[IZ]; 555 } << 455 G4double rsize[2] = {fSize[0]/fNSegment[IR]*idxColumn, 556 << 456 fSize[0]/fNSegment[IR]*(idxColumn+1)}; 557 G4double zhalf = fSize[2] / fNSegment << 457 for(int phi = 0; phi < fNSegment[IPHI]; phi++) { 558 G4double rsize[2] = { << 458 for(int z = 0; z < fNSegment[IZ]; z++) { 559 fSize[0] + (fSize[1] - fSize[0]) / fNS << 459 560 fSize[0] + (fSize[1] - fSize[0]) / fNS << 460 G4double angle = twopi/fNSegment[IPHI]*phi*radian; 561 }; << 461 G4double dphi = twopi/fNSegment[IPHI]*radian; 562 for(int phi = 0; phi < fNSegment[IPHI]; << 462 G4Tubs cylinder("z-phi", rsize[0], rsize[1], zhalf, 563 { << 463 angle, dphi*0.99999); 564 for(int z = 0; z < fNSegment[IZ]; z++) << 464 565 { << 465 G4ThreeVector zpos(0., 0., -fSize[1] + fSize[1]/fNSegment[IZ]*(1 + 2.*z)); 566 G4double angle = fAngle[0] + fAngle[ << 567 G4double dphi = fAngle[1] / fNSegme << 568 G4Tubs cylinder("z-phi", rsize[0], r << 569 dphi * 0.99999); << 570 << 571 G4ThreeVector zpos( << 572 0., 0., -fSize[2] + fSize[2] / fNS << 573 G4Transform3D trans; 466 G4Transform3D trans; 574 if(fRotationMatrix != nullptr) << 467 if(fRotationMatrix) { 575 { << 468 trans = G4Rotate3D(*fRotationMatrix).inverse()*G4Translate3D(zpos); 576 trans = << 469 trans = G4Translate3D(fCenterPosition)*trans; 577 G4Rotate3D(*fRotationMatrix).inv << 470 } else { 578 trans = G4Translate3D(fCenterPosit << 471 trans = G4Translate3D(zpos)*G4Translate3D(fCenterPosition); 579 } << 580 else << 581 { << 582 trans = G4Translate3D(zpos) * G4Tr << 583 } 472 } 584 G4double c[4]; 473 G4double c[4]; 585 colorMap->GetMapColor(zphicell[z][ph 474 colorMap->GetMapColor(zphicell[z][phi], c); 586 att.SetColour(c[0], c[1], c[2]); // << 475 att.SetColour(c[0], c[1], c[2]);//, c[3]); 587 << 476 588 G4Polyhedron* poly = cylinder.GetPol << 477 G4Polyhedron * poly = cylinder.GetPolyhedron(); 589 poly->Transform(trans); 478 poly->Transform(trans); 590 poly->SetVisAttributes(att); 479 poly->SetVisAttributes(att); 591 pVisManager->Draw(*poly); 480 pVisManager->Draw(*poly); 592 } 481 } 593 } 482 } 594 << 483 595 // r-phi plane 484 // r-phi plane 596 } << 485 } else if(projAxis == IZ) { 597 else if(projAxis == IZ) << 486 if(colorMap->IfFloatMinMax()) { colorMap->SetMinMax(rphimin,rphimax); } 598 { << 487 599 if(colorMap->IfFloatMinMax()) << 488 G4double rsize = fSize[0]/fNSegment[IR]; 600 { << 489 for(int phi = 0; phi < fNSegment[IPHI]; phi++) { 601 colorMap->SetMinMax(rphimin, rphimax); << 490 for(int r = 0; r < fNSegment[IR]; r++) { 602 } << 491 603 << 492 G4double rs[2] = {rsize*r, rsize*(r+1)}; 604 G4double rsize = (fSize[1] - fSize[0]) / << 493 G4double angle = twopi/fNSegment[IPHI]*phi*radian; 605 for(G4int phi = 0; phi < fNSegment[IPHI] << 494 G4double dz = fSize[1]/fNSegment[IZ]; 606 { << 495 G4double dphi = twopi/fNSegment[IPHI]*radian; 607 for(G4int r = 0; r < fNSegment[IR]; r+ << 496 G4Tubs cylinder("r-phi", rs[0], rs[1], dz, 608 { << 497 angle, dphi*0.99999); 609 G4double rs[2] = { fSize[0] + rsize << 498 G4ThreeVector zpos(0., 0., 610 G4double angle = fAngle[0] + fAngle[ << 499 -fSize[1]+fSize[1]/fNSegment[IZ]*(idxColumn*2+1)); 611 G4double dz = fSize[2] / fNSegmen << 612 G4double dphi = fAngle[1] / fNSegme << 613 G4Tubs cylinder("r-phi", rs[0], rs[1 << 614 G4ThreeVector zpos( << 615 0., 0., -fSize[2] + fSize[2] / fNS << 616 G4Transform3D trans; 500 G4Transform3D trans; 617 if(fRotationMatrix != nullptr) << 501 if(fRotationMatrix) { 618 { << 502 trans = G4Rotate3D(*fRotationMatrix).inverse()*G4Translate3D(zpos); 619 trans = << 503 trans = G4Translate3D(fCenterPosition)*trans; 620 G4Rotate3D(*fRotationMatrix).inv << 504 } else { 621 trans = G4Translate3D(fCenterPosit << 505 trans = G4Translate3D(zpos)*G4Translate3D(fCenterPosition); 622 } << 623 else << 624 { << 625 trans = G4Translate3D(zpos) * G4Tr << 626 } 506 } 627 G4double c[4]; 507 G4double c[4]; 628 colorMap->GetMapColor(rphicell[r][ph 508 colorMap->GetMapColor(rphicell[r][phi], c); 629 att.SetColour(c[0], c[1], c[2]); // << 509 att.SetColour(c[0], c[1], c[2]);//, c[3]); 630 510 631 G4Polyhedron* poly = cylinder.GetPol << 511 G4Polyhedron * poly = cylinder.GetPolyhedron(); 632 poly->Transform(trans); 512 poly->Transform(trans); 633 poly->SetVisAttributes(att); 513 poly->SetVisAttributes(att); 634 pVisManager->Draw(*poly); 514 pVisManager->Draw(*poly); 635 } 515 } 636 } 516 } 637 << 517 638 // r-z plane 518 // r-z plane 639 } << 519 } else if(projAxis == IPHI) { 640 else if(projAxis == IPHI) << 520 if(colorMap->IfFloatMinMax()) { colorMap->SetMinMax(rzmin,rzmax); } 641 { << 521 642 if(colorMap->IfFloatMinMax()) << 522 G4double rsize = fSize[0]/fNSegment[IR]; 643 { << 523 G4double zhalf = fSize[1]/fNSegment[IZ]; 644 colorMap->SetMinMax(rzmin, rzmax); << 524 G4double angle = twopi/fNSegment[IPHI]*idxColumn*radian; 645 } << 525 G4double dphi = twopi/fNSegment[IPHI]*radian; 646 << 526 for(int z = 0; z < fNSegment[IZ]; z++) { 647 G4double rsize = (fSize[1] - fSize[0]) / << 527 for(int r = 0; r < fNSegment[IR]; r++) { 648 G4double zhalf = fSize[2] / fNSegment[IZ << 528 649 G4double angle = fAngle[0] + fAngle[1] / << 529 G4double rs[2] = {rsize*r, rsize*(r+1)}; 650 G4double dphi = fAngle[1] / fNSegment[I << 530 G4Tubs cylinder("z-phi", rs[0], rs[1], zhalf, 651 for(G4int z = 0; z < fNSegment[IZ]; z++) << 531 angle, dphi); 652 { << 532 653 for(G4int r = 0; r < fNSegment[IR]; r+ << 533 G4ThreeVector zpos(0., 0., 654 { << 534 -fSize[1]+fSize[1]/fNSegment[IZ]*(2.*z+1)); 655 G4double rs[2] = { fSize[0] + rsize << 656 G4Tubs cylinder("z-phi", rs[0], rs[1 << 657 << 658 G4ThreeVector zpos( << 659 0., 0., -fSize[2] + fSize[2] / fNS << 660 G4Transform3D trans; 535 G4Transform3D trans; 661 if(fRotationMatrix != nullptr) << 536 if(fRotationMatrix) { 662 { << 537 trans = G4Rotate3D(*fRotationMatrix).inverse()*G4Translate3D(zpos); 663 trans = << 538 trans = G4Translate3D(fCenterPosition)*trans; 664 G4Rotate3D(*fRotationMatrix).inv << 539 } else { 665 trans = G4Translate3D(fCenterPosit << 540 trans = G4Translate3D(zpos)*G4Translate3D(fCenterPosition); 666 } << 667 else << 668 { << 669 trans = G4Translate3D(zpos) * G4Tr << 670 } 541 } 671 G4double c[4]; 542 G4double c[4]; 672 colorMap->GetMapColor(rzcell[r][z], 543 colorMap->GetMapColor(rzcell[r][z], c); 673 att.SetColour(c[0], c[1], c[2]); // << 544 att.SetColour(c[0], c[1], c[2]);//, c[3]); 674 545 675 G4Polyhedron* poly = cylinder.GetPol << 546 G4Polyhedron * poly = cylinder.GetPolyhedron(); 676 poly->Transform(trans); 547 poly->Transform(trans); 677 poly->SetVisAttributes(att); 548 poly->SetVisAttributes(att); 678 pVisManager->Draw(*poly); 549 pVisManager->Draw(*poly); 679 } 550 } 680 } 551 } 681 } 552 } 682 pVisManager->EndDraw(); 553 pVisManager->EndDraw(); 683 } 554 } 684 << 555 685 colorMap->SetPSUnit(fDrawUnit); 556 colorMap->SetPSUnit(fDrawUnit); 686 colorMap->SetPSName(fDrawPSName); 557 colorMap->SetPSName(fDrawPSName); 687 colorMap->DrawColorChart(); 558 colorMap->DrawColorChart(); >> 559 688 } 560 } 689 561 690 void G4ScoringCylinder::GetRZPhi(G4int index, << 562 void G4ScoringCylinder::GetRZPhi(G4int index, G4int q[3]) const { 691 { << 692 // index = k + j * k-size + i * jk-plane-siz 563 // index = k + j * k-size + i * jk-plane-size 693 564 694 // nested : z -> phi -> r 565 // nested : z -> phi -> r 695 G4int i = IZ; << 566 G4int i = IZ; 696 G4int j = IPHI; << 567 G4int j = IPHI; 697 G4int k = IR; << 568 G4int k = IR; 698 G4int jk = fNSegment[j] * fNSegment[k]; << 569 G4int jk = fNSegment[j]*fNSegment[k]; 699 q[i] = index / jk; << 570 q[i] = index/jk; 700 q[j] = (index - q[i] * jk) / fNSegment[k << 571 q[j] = (index - q[i]*jk)/fNSegment[k]; 701 q[k] = index - q[j] * fNSegment[k] - q[i << 572 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 } 573 } 867 574