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