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 // 26 // 27 // 27 // 28 // Satoshi TANAKA 28 // Satoshi TANAKA 29 // DAWNFILE scene. 29 // DAWNFILE scene. 30 30 31 #define __G_ANSI_C__ 31 #define __G_ANSI_C__ 32 32 33 // #define DEBUG_FR_SCENE 33 // #define DEBUG_FR_SCENE 34 34 35 //----- header files 35 //----- header files 36 #include <fstream> 36 #include <fstream> 37 #include <stdlib.h> 37 #include <stdlib.h> 38 #include <string.h> 38 #include <string.h> 39 #include <sstream> 39 #include <sstream> 40 #include <iomanip> 40 #include <iomanip> 41 #include "globals.hh" 41 #include "globals.hh" 42 #include "G4VisManager.hh" 42 #include "G4VisManager.hh" 43 #include "G4FRConst.hh" 43 #include "G4FRConst.hh" 44 #include "G4DAWNFILE.hh" 44 #include "G4DAWNFILE.hh" 45 #include "G4DAWNFILESceneHandler.hh" 45 #include "G4DAWNFILESceneHandler.hh" 46 #include "G4DAWNFILEViewer.hh" 46 #include "G4DAWNFILEViewer.hh" 47 #include "G4Point3D.hh" 47 #include "G4Point3D.hh" 48 #include "G4VisAttributes.hh" 48 #include "G4VisAttributes.hh" 49 #include "G4Scene.hh" 49 #include "G4Scene.hh" 50 #include "G4Transform3D.hh" 50 #include "G4Transform3D.hh" 51 #include "G4Polyhedron.hh" 51 #include "G4Polyhedron.hh" 52 #include "G4Box.hh" 52 #include "G4Box.hh" 53 #include "G4Cons.hh" 53 #include "G4Cons.hh" 54 #include "G4Polyline.hh" 54 #include "G4Polyline.hh" 55 #include "G4Trd.hh" 55 #include "G4Trd.hh" 56 #include "G4Tubs.hh" 56 #include "G4Tubs.hh" 57 #include "G4Trap.hh" 57 #include "G4Trap.hh" 58 #include "G4Torus.hh" 58 #include "G4Torus.hh" 59 #include "G4Sphere.hh" 59 #include "G4Sphere.hh" 60 #include "G4Para.hh" 60 #include "G4Para.hh" 61 #include "G4Text.hh" 61 #include "G4Text.hh" 62 #include "G4Circle.hh" 62 #include "G4Circle.hh" 63 #include "G4Square.hh" 63 #include "G4Square.hh" 64 #include "G4VPhysicalVolume.hh" 64 #include "G4VPhysicalVolume.hh" 65 65 66 //----- constants 66 //----- constants 67 const char FR_ENV_CULL_INVISIBLE_OBJECTS[] = " 67 const char FR_ENV_CULL_INVISIBLE_OBJECTS[] = "G4DAWN_CULL_INVISIBLE_OBJECTS"; 68 const char G4PRIM_FILE_HEADER[] = " 68 const char G4PRIM_FILE_HEADER[] = "g4_"; 69 const char DEFAULT_G4PRIM_FILE_NAME[] = " 69 const char DEFAULT_G4PRIM_FILE_NAME[] = "g4_0000.prim"; 70 const int FR_MAX_FILE_NUM = 100; 70 const int FR_MAX_FILE_NUM = 100; 71 71 72 /////////////////////////// 72 /////////////////////////// 73 // Driver-dependent part // 73 // Driver-dependent part // 74 /////////////////////////// 74 /////////////////////////// 75 75 76 //----- G4DAWNFILESceneHandler, constructor 76 //----- G4DAWNFILESceneHandler, constructor 77 G4DAWNFILESceneHandler::G4DAWNFILESceneHandler 77 G4DAWNFILESceneHandler::G4DAWNFILESceneHandler(G4DAWNFILE& system, 78 78 const G4String& name) 79 : G4VSceneHandler(system, fSceneIdCount++, n 79 : G4VSceneHandler(system, fSceneIdCount++, name) 80 , fSystem(system) 80 , fSystem(system) 81 , fPrimDest() 81 , fPrimDest() 82 , FRflag_in_modeling(false) 82 , FRflag_in_modeling(false) 83 , flag_saving_g4_prim(false) 83 , flag_saving_g4_prim(false) 84 , COMMAND_BUF_SIZE(G4FRofstream::SEND_BUFMAX 84 , COMMAND_BUF_SIZE(G4FRofstream::SEND_BUFMAX) 85 , fPrec(9) 85 , fPrec(9) 86 , fPrec2(16) 86 , fPrec2(16) 87 { 87 { 88 // g4.prim filename and its directory 88 // g4.prim filename and its directory 89 if(std::getenv("G4DAWNFILE_DEST_DIR") == NUL 89 if(std::getenv("G4DAWNFILE_DEST_DIR") == NULL) 90 { 90 { 91 strcpy(fG4PrimDestDir, ""); 91 strcpy(fG4PrimDestDir, ""); // output dir 92 strcpy(fG4PrimFileName, DEFAULT_G4PRIM_FIL 92 strcpy(fG4PrimFileName, DEFAULT_G4PRIM_FILE_NAME); // filename 93 } 93 } 94 else 94 else 95 { 95 { 96 strcpy(fG4PrimDestDir, std::getenv("G4DAWN 96 strcpy(fG4PrimDestDir, std::getenv("G4DAWNFILE_DEST_DIR")); // output dir 97 strcpy(fG4PrimFileName, DEFAULT_G4PRIM_FIL 97 strcpy(fG4PrimFileName, DEFAULT_G4PRIM_FILE_NAME); // filename 98 } 98 } 99 99 100 // maximum number of g4.prim files in the de 100 // maximum number of g4.prim files in the dest directory 101 fMaxFileNum = FR_MAX_FILE_NUM; // initializ 101 fMaxFileNum = FR_MAX_FILE_NUM; // initialization 102 if(std::getenv("G4DAWNFILE_MAX_FILE_NUM") != 102 if(std::getenv("G4DAWNFILE_MAX_FILE_NUM") != NULL) 103 { 103 { 104 sscanf(std::getenv("G4DAWNFILE_MAX_FILE_NU 104 sscanf(std::getenv("G4DAWNFILE_MAX_FILE_NUM"), "%d", &fMaxFileNum); 105 } 105 } 106 else 106 else 107 { 107 { 108 fMaxFileNum = FR_MAX_FILE_NUM; 108 fMaxFileNum = FR_MAX_FILE_NUM; 109 } 109 } 110 if(fMaxFileNum < 1) 110 if(fMaxFileNum < 1) 111 { 111 { 112 fMaxFileNum = 1; 112 fMaxFileNum = 1; 113 } 113 } 114 114 115 //----- precision control 115 //----- precision control 116 if(std::getenv("G4DAWNFILE_PRECISION") != NU 116 if(std::getenv("G4DAWNFILE_PRECISION") != NULL) 117 { 117 { 118 sscanf(std::getenv("G4DAWNFILE_PRECISION") 118 sscanf(std::getenv("G4DAWNFILE_PRECISION"), "%d", &fPrec); 119 } 119 } 120 else 120 else 121 { 121 { 122 fPrec = 9; 122 fPrec = 9; 123 } 123 } 124 fPrec2 = fPrec + 7; 124 fPrec2 = fPrec + 7; 125 } 125 } 126 126 127 //----- G4DAWNFILESceneHandler, destructor 127 //----- G4DAWNFILESceneHandler, destructor 128 G4DAWNFILESceneHandler::~G4DAWNFILESceneHandle 128 G4DAWNFILESceneHandler::~G4DAWNFILESceneHandler() 129 { 129 { 130 #if defined DEBUG_FR_SCENE 130 #if defined DEBUG_FR_SCENE 131 if(G4VisManager::GetVerbosity() >= G4VisMana 131 if(G4VisManager::GetVerbosity() >= G4VisManager::errors) 132 G4cout << "***** ~G4DAWNFILESceneHandler" 132 G4cout << "***** ~G4DAWNFILESceneHandler" << G4endl; 133 #endif 133 #endif 134 if(fPrimDest.IsOpen()) 134 if(fPrimDest.IsOpen()) 135 { 135 { 136 //----- End of modeling 136 //----- End of modeling 137 // !EndModeling, !DrawAll, !CloseDevice, 137 // !EndModeling, !DrawAll, !CloseDevice, 138 // close g4.prim 138 // close g4.prim 139 FREndModeling(); 139 FREndModeling(); 140 } 140 } 141 } 141 } 142 142 143 //----- 143 //----- 144 void G4DAWNFILESceneHandler::SetG4PrimFileName 144 void G4DAWNFILESceneHandler::SetG4PrimFileName() 145 { 145 { 146 // g4_0000.prim, g4_0001.prim, ..., g4_MAX_F 146 // g4_0000.prim, g4_0001.prim, ..., g4_MAX_FILE_INDEX.prim 147 const int MAX_FILE_INDEX = fMaxFileNum - 1; 147 const int MAX_FILE_INDEX = fMaxFileNum - 1; 148 148 149 // dest directory (null if no environmental 149 // dest directory (null if no environmental variables is set) 150 strcpy(fG4PrimFileName, fG4PrimDestDir); 150 strcpy(fG4PrimFileName, fG4PrimDestDir); 151 151 152 // create full path name (default) 152 // create full path name (default) 153 strcat(fG4PrimFileName, DEFAULT_G4PRIM_FILE_ 153 strcat(fG4PrimFileName, DEFAULT_G4PRIM_FILE_NAME); 154 154 155 // Automatic updation of file names 155 // Automatic updation of file names 156 for(int i = 0; i < fMaxFileNum; i++) 156 for(int i = 0; i < fMaxFileNum; i++) 157 { 157 { 158 // Message in the final execution 158 // Message in the final execution 159 if(i == MAX_FILE_INDEX) 159 if(i == MAX_FILE_INDEX) 160 { 160 { 161 if(G4VisManager::GetVerbosity() >= G4Vis 161 if(G4VisManager::GetVerbosity() >= G4VisManager::errors) 162 { 162 { 163 G4cout << "=========================== 163 G4cout << "===========================================" << G4endl; 164 G4cout << "WARNING MESSAGE from DAWNFI 164 G4cout << "WARNING MESSAGE from DAWNFILE driver: " << G4endl; 165 G4cout << " This file name is the fin 165 G4cout << " This file name is the final one in the " << G4endl; 166 G4cout << " automatic updation of the 166 G4cout << " automatic updation of the output file name." << G4endl; 167 G4cout << " You may overwrite existin 167 G4cout << " You may overwrite existing files, i.e. " << G4endl; 168 G4cout << " g4_XXXX.prim and g4_XXXX. 168 G4cout << " g4_XXXX.prim and g4_XXXX.eps " << G4endl; 169 G4cout << "=========================== 169 G4cout << "===========================================" << G4endl; 170 } 170 } 171 } 171 } 172 172 173 // re-determine file name as G4DAWNFILE_DE 173 // re-determine file name as G4DAWNFILE_DEST_DIR/g4_XXXX.prim 174 std::ostringstream filename; 174 std::ostringstream filename; 175 filename << fG4PrimDestDir << G4PRIM_FILE_ 175 filename << fG4PrimDestDir << G4PRIM_FILE_HEADER << std::setw(4) 176 << std::setfill('0') << i << ".pr 176 << std::setfill('0') << i << ".prim"; 177 strncpy(fG4PrimFileName, filename.str().c_ 177 strncpy(fG4PrimFileName, filename.str().c_str(), 178 sizeof(fG4PrimFileName) - 1); 178 sizeof(fG4PrimFileName) - 1); 179 fG4PrimFileName[sizeof(fG4PrimFileName) - 179 fG4PrimFileName[sizeof(fG4PrimFileName) - 1] = '\0'; 180 180 181 // check validity of the file name 181 // check validity of the file name 182 std::ifstream fin; 182 std::ifstream fin; 183 fin.open(fG4PrimFileName); 183 fin.open(fG4PrimFileName); 184 if(!fin) 184 if(!fin) 185 { 185 { 186 // new file 186 // new file 187 fin.close(); 187 fin.close(); 188 break; 188 break; 189 } 189 } 190 else 190 else 191 { 191 { 192 // already exists (try next) 192 // already exists (try next) 193 fin.close(); 193 fin.close(); 194 } 194 } 195 195 196 } // for 196 } // for 197 197 198 G4cout << "================================= 198 G4cout << "=========================================== " << G4endl; 199 G4cout << "Output file: " << fG4PrimFileName 199 G4cout << "Output file: " << fG4PrimFileName << G4endl; 200 G4cout << "Destination directory (current di 200 G4cout << "Destination directory (current dir if NULL): " << fG4PrimDestDir 201 << G4endl; 201 << G4endl; 202 G4cout << "Maximal number of files in the de 202 G4cout << "Maximal number of files in the destination directory: " 203 << fMaxFileNum << G4endl; 203 << fMaxFileNum << G4endl; 204 G4cout << "Note: 204 G4cout << "Note: " << G4endl; 205 G4cout << " * The maximal number is customi 205 G4cout << " * The maximal number is customizable as: " << G4endl; 206 G4cout << " % setenv G4DAWNFILE_MAX_F 206 G4cout << " % setenv G4DAWNFILE_MAX_FILE_NUM number " << G4endl; 207 G4cout << " * The destination directory is 207 G4cout << " * The destination directory is customizable as:" << G4endl; 208 G4cout << " % setenv G4DAWNFILE_DEST_ 208 G4cout << " % setenv G4DAWNFILE_DEST_DIR dir_name/ " << G4endl; 209 G4cout << " ** Do not forget \"/\" at th 209 G4cout << " ** Do not forget \"/\" at the end of the " << G4endl; 210 G4cout << " dir_name, e.g. \"./tmp/\" 210 G4cout << " dir_name, e.g. \"./tmp/\". " << G4endl; 211 G4cout << "================================= 211 G4cout << "=========================================== " << G4endl; 212 212 213 } // G4DAWNFILESceneHandler::SetG4PrimFileNam 213 } // G4DAWNFILESceneHandler::SetG4PrimFileName() 214 214 215 //----- 215 //----- 216 void G4DAWNFILESceneHandler::BeginSavingG4Prim 216 void G4DAWNFILESceneHandler::BeginSavingG4Prim(void) 217 { 217 { 218 #if defined DEBUG_FR_SCENE 218 #if defined DEBUG_FR_SCENE 219 if(G4VisManager::GetVerbosity() >= G4VisMana 219 if(G4VisManager::GetVerbosity() >= G4VisManager::errors) 220 G4cout << "***** BeginSavingG4Prim (called 220 G4cout << "***** BeginSavingG4Prim (called)\n"; 221 #endif 221 #endif 222 222 223 if(!IsSavingG4Prim()) 223 if(!IsSavingG4Prim()) 224 { 224 { 225 #if defined DEBUG_FR_SCENE 225 #if defined DEBUG_FR_SCENE 226 if(G4VisManager::GetVerbosity() >= G4VisMa 226 if(G4VisManager::GetVerbosity() >= G4VisManager::errors) 227 { 227 { 228 G4cout << "***** (star 228 G4cout << "***** (started) "; 229 G4cout << "(open g4.prim, ##)" << G4endl 229 G4cout << "(open g4.prim, ##)" << G4endl; 230 } 230 } 231 #endif 231 #endif 232 SetG4PrimFileName(); // result set to fG4 232 SetG4PrimFileName(); // result set to fG4PrimFileName 233 fPrimDest.Open(fG4PrimFileName); 233 fPrimDest.Open(fG4PrimFileName); 234 234 235 SendStr(FR_G4_PRIM_HEADER); 235 SendStr(FR_G4_PRIM_HEADER); 236 flag_saving_g4_prim = true; 236 flag_saving_g4_prim = true; 237 } 237 } 238 } 238 } 239 239 240 void G4DAWNFILESceneHandler::EndSavingG4Prim(v 240 void G4DAWNFILESceneHandler::EndSavingG4Prim(void) 241 { 241 { 242 #if defined DEBUG_FR_SCENE 242 #if defined DEBUG_FR_SCENE 243 if(G4VisManager::GetVerbosity() >= G4VisMana 243 if(G4VisManager::GetVerbosity() >= G4VisManager::errors) 244 G4cout << "***** EndSavingG4Prim (called)\ 244 G4cout << "***** EndSavingG4Prim (called)\n"; 245 #endif 245 #endif 246 246 247 if(IsSavingG4Prim()) 247 if(IsSavingG4Prim()) 248 { 248 { 249 #if defined DEBUG_FR_SCENE 249 #if defined DEBUG_FR_SCENE 250 if(G4VisManager::GetVerbosity() >= G4VisMa 250 if(G4VisManager::GetVerbosity() >= G4VisManager::errors) 251 G4cout << "***** (starte 251 G4cout << "***** (started) (close g4.prim)" << G4endl; 252 #endif 252 #endif 253 fPrimDest.Close(); 253 fPrimDest.Close(); 254 flag_saving_g4_prim = false; 254 flag_saving_g4_prim = false; 255 } 255 } 256 } 256 } 257 257 258 //----- 258 //----- 259 void G4DAWNFILESceneHandler::FRBeginModeling(v 259 void G4DAWNFILESceneHandler::FRBeginModeling(void) 260 { 260 { 261 if(!FRIsInModeling()) 261 if(!FRIsInModeling()) 262 { 262 { 263 #if defined DEBUG_FR_SCENE 263 #if defined DEBUG_FR_SCENE 264 if(G4VisManager::GetVerbosity() >= G4VisMa 264 if(G4VisManager::GetVerbosity() >= G4VisManager::errors) 265 G4cout 265 G4cout 266 << "***** G4DAWNFILESceneHandler::FRBe 266 << "***** G4DAWNFILESceneHandler::FRBeginModeling (called & started)" 267 << G4endl; 267 << G4endl; 268 #endif 268 #endif 269 269 270 //----- Send saving command and heading co 270 //----- Send saving command and heading comment 271 BeginSavingG4Prim(); 271 BeginSavingG4Prim(); 272 272 273 //----- Send bounding box command 273 //----- Send bounding box command 274 SendBoundingBox(); 274 SendBoundingBox(); 275 275 276 //----- send SET_CAMERA command 276 //----- send SET_CAMERA command 277 #if defined DEBUG_FR_SCENE 277 #if defined DEBUG_FR_SCENE 278 if(G4VisManager::GetVerbosity() >= G4VisMa 278 if(G4VisManager::GetVerbosity() >= G4VisManager::errors) 279 G4cout << "***** (!SetCamera in FRBegi 279 G4cout << "***** (!SetCamera in FRBeginModeling())" << G4endl; 280 #endif 280 #endif 281 SendStr(FR_SET_CAMERA); 281 SendStr(FR_SET_CAMERA); 282 282 283 //----- open device 283 //----- open device 284 #if defined DEBUG_FR_SCENE 284 #if defined DEBUG_FR_SCENE 285 if(G4VisManager::GetVerbosity() >= G4VisMa 285 if(G4VisManager::GetVerbosity() >= G4VisManager::errors) 286 G4cout << "***** (!OpenDevice in FRBeg 286 G4cout << "***** (!OpenDevice in FRBeginModeling())" << G4endl; 287 #endif 287 #endif 288 SendStr(FR_OPEN_DEVICE); 288 SendStr(FR_OPEN_DEVICE); 289 289 290 //----- begin sending primitives 290 //----- begin sending primitives 291 #if defined DEBUG_FR_SCENE 291 #if defined DEBUG_FR_SCENE 292 if(G4VisManager::GetVerbosity() >= G4VisMa 292 if(G4VisManager::GetVerbosity() >= G4VisManager::errors) 293 G4cout << "***** (!BeginModeling in FR 293 G4cout << "***** (!BeginModeling in FRBeginModeling())" << G4endl; 294 #endif 294 #endif 295 SendStr(FR_BEGIN_MODELING); 295 SendStr(FR_BEGIN_MODELING); 296 FRflag_in_modeling = true; 296 FRflag_in_modeling = true; 297 297 298 } // if 298 } // if 299 } 299 } 300 300 301 ///////////////////////////////////////// 301 ///////////////////////////////////////// 302 // Common to DAWN and DAWNFILE drivers // 302 // Common to DAWN and DAWNFILE drivers // 303 ///////////////////////////////////////// 303 ///////////////////////////////////////// 304 304 305 #define G4FRSCENEHANDLER G4DAWNFILESceneHandle 305 #define G4FRSCENEHANDLER G4DAWNFILESceneHandler 306 #include "G4FRSceneFunc.icc" 306 #include "G4FRSceneFunc.icc" 307 #undef G4FRSCENEHANDLER 307 #undef G4FRSCENEHANDLER 308 308 309 ////////////////////// 309 ////////////////////// 310 // static variables // 310 // static variables // 311 ////////////////////// 311 ////////////////////// 312 312 313 //----- static variables 313 //----- static variables 314 G4int G4DAWNFILESceneHandler::fSceneIdCount = 314 G4int G4DAWNFILESceneHandler::fSceneIdCount = 0; 315 315