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 // $Id: DICOM.cc 83429 2014-08-21 15:47:32Z gcosmo $ 26 // 27 // 27 /// \file medical/DICOM/DICOM.cc 28 /// \file medical/DICOM/DICOM.cc 28 /// \brief Main program of the medical/DICOM e 29 /// \brief Main program of the medical/DICOM example 29 // 30 // 30 // The code was written by : 31 // The code was written by : 31 // *Louis Archambault louis.archambault 32 // *Louis Archambault louis.archambault@phy.ulaval.ca, 32 // *Luc Beaulieu beaulieu@phy.ulaval.ca 33 // *Luc Beaulieu beaulieu@phy.ulaval.ca 33 // +Vincent Hubert-Tremblay at tigre.2@sy 34 // +Vincent Hubert-Tremblay at tigre.2@sympatico.ca 34 // 35 // 35 // 36 // 36 // *Centre Hospitalier Universitaire de Quebec 37 // *Centre Hospitalier Universitaire de Quebec (CHUQ), 37 // Hotel-Dieu de Quebec, departement de Radio- 38 // Hotel-Dieu de Quebec, departement de Radio-oncologie 38 // 11 cote du palais. Quebec, QC, Canada, G1R 39 // 11 cote du palais. Quebec, QC, Canada, G1R 2J6 39 // tel (418) 525-4444 #6720 40 // tel (418) 525-4444 #6720 40 // fax (418) 691 5268 41 // fax (418) 691 5268 41 // 42 // 42 // + Université Laval, Québec (QC) Canada << 43 // + Université Laval, Québec (QC) Canada 43 // ******************************************* << 44 //*******************************************************// 44 #include "DicomActionInitialization.hh" << 45 #include "DicomNestedParamDetectorConstruction << 46 #include "DicomPartialDetectorConstruction.hh" << 47 #include "DicomRegularDetectorConstruction.hh" << 48 45 49 #include "G4GenericPhysicsList.hh" << 50 #include "G4RunManagerFactory.hh" << 51 #include "G4Types.hh" << 52 #include "G4UImanager.hh" << 53 #include "Randomize.hh" << 54 #include "globals.hh" << 55 46 56 #ifdef G4_DCMTK << 47 #ifdef G4MULTITHREADED 57 # include "DicomFileMgr.hh" << 48 #include "G4MTRunManager.hh" 58 #else 49 #else 59 # include "DicomHandler.hh" << 50 #include "G4RunManager.hh" 60 #endif 51 #endif 61 52 >> 53 #include "globals.hh" >> 54 #include "G4UImanager.hh" >> 55 #include "Randomize.hh" >> 56 >> 57 #include "G4GenericPhysicsList.hh" >> 58 >> 59 #include "DicomRegularDetectorConstruction.hh" >> 60 #include "DicomNestedParamDetectorConstruction.hh" >> 61 #include "DicomPartialDetectorConstruction.hh" >> 62 >> 63 #include "DicomActionInitialization.hh" >> 64 >> 65 #include "DicomHandler.hh" 62 #include "DicomIntersectVolume.hh" 66 #include "DicomIntersectVolume.hh" 63 #include "QGSP_BIC.hh" 67 #include "QGSP_BIC.hh" 64 #include "Shielding.hh" << 68 #include "G4tgrMessenger.hh" 65 69 66 #include "G4UIExecutive.hh" << 70 #ifdef G4VIS_USE 67 #include "G4VisExecutive.hh" 71 #include "G4VisExecutive.hh" 68 #include "G4tgrMessenger.hh" << 72 #endif >> 73 >> 74 #ifdef G4UI_USE >> 75 #include "G4UIExecutive.hh" >> 76 #endif 69 77 70 //....oooOO0OOooo........oooOO0OOooo........oo << 78 //================================================================================= 71 79 72 int main(int argc, char** argv) << 80 int main(int argc,char** argv) 73 { 81 { 74 // Instantiate G4UIExecutive if interactive << 75 G4UIExecutive* ui = nullptr; << 76 if (argc == 1) { << 77 ui = new G4UIExecutive(argc, argv); << 78 } << 79 << 80 new G4tgrMessenger; << 81 char* part = std::getenv("DICOM_PARTIAL_PARA << 82 G4bool bPartial = FALSE; << 83 if (part && G4String(part) == "1") { << 84 bPartial = TRUE; << 85 } << 86 << 87 CLHEP::HepRandom::setTheEngine(new CLHEP::Ra << 88 CLHEP::HepRandom::setTheSeed(G4long(24534575 << 89 G4long seeds[2]; << 90 seeds[0] = G4long(534524575674523); << 91 seeds[1] = G4long(526345623452457); << 92 CLHEP::HepRandom::setTheSeeds(seeds); << 93 << 94 // Construct the default run manager << 95 char* nthread_c = std::getenv("DICOM_NTHREAD << 96 << 97 unsigned nthreads = 4; << 98 unsigned env_threads = 0; << 99 << 100 if (nthread_c) { << 101 env_threads = unsigned(G4UIcommand::Conver << 102 } << 103 if (env_threads > 0) { << 104 nthreads = env_threads; << 105 } << 106 82 107 auto* runManager = G4RunManagerFactory::Crea << 83 new G4tgrMessenger; 108 runManager->SetNumberOfThreads(nthreads); << 84 char* part = getenv( "DICOM_PARTIAL_PARAM" ); >> 85 G4bool bPartial = FALSE; >> 86 if( part && G4String(part) == "1" ) { >> 87 bPartial = TRUE; >> 88 } >> 89 >> 90 CLHEP::HepRandom::setTheEngine(new CLHEP::RanecuEngine); >> 91 CLHEP::HepRandom::setTheSeed(24534575684783); >> 92 long seeds[2]; >> 93 seeds[0] = 534524575674523; >> 94 seeds[1] = 526345623452457; >> 95 CLHEP::HepRandom::setTheSeeds(seeds); >> 96 >> 97 // Construct the default run manager >> 98 #ifdef G4MULTITHREADED >> 99 char* nthread_c = getenv("DICOM_NTHREADS"); >> 100 >> 101 unsigned nthreads = 4; >> 102 unsigned env_threads = 0; >> 103 >> 104 if(nthread_c) { env_threads = G4UIcommand::ConvertToDouble(nthread_c); } >> 105 if(env_threads > 0) { nthreads = env_threads; } >> 106 >> 107 G4MTRunManager* runManager = new G4MTRunManager; >> 108 runManager->SetNumberOfThreads(nthreads); 109 109 110 DicomDetectorConstruction* theGeometry = 0; << 110 G4cout << "\n\n\tDICOM running in multithreaded mode with " << nthreads >> 111 << " threads\n\n" << G4endl; 111 112 112 #ifdef G4_DCMTK << 113 113 DicomFileMgr* theFileMgr = 0; << 114 #else 114 #else 115 DicomHandler* dcmHandler = 0; << 115 G4RunManager* runManager = new G4RunManager; >> 116 G4cout << "\n\n\tDICOM running in serial mode\n\n" << G4endl; >> 117 >> 118 #endif >> 119 >> 120 DicomDetectorConstruction* theGeometry = 0; >> 121 DicomHandler* dcmHandler = 0; >> 122 >> 123 if( !bPartial ){ >> 124 // Treatment of DICOM images before creating the G4runManager >> 125 dcmHandler = new DicomHandler; >> 126 dcmHandler->CheckFileFormat(); >> 127 >> 128 // Initialisation of physics, geometry, primary particles ... >> 129 char* nest = getenv( "DICOM_NESTED_PARAM" ); >> 130 if( nest && G4String(nest) == "1" ) { >> 131 theGeometry = new DicomNestedParamDetectorConstruction(); >> 132 } else { >> 133 theGeometry = new DicomRegularDetectorConstruction(); >> 134 } >> 135 } else { >> 136 theGeometry = new DicomPartialDetectorConstruction(); >> 137 } >> 138 runManager->SetUserInitialization(theGeometry); >> 139 >> 140 std::vector<G4String>* MyConstr = new std::vector<G4String>; >> 141 MyConstr->push_back("G4EmStandardPhysics"); >> 142 G4VModularPhysicsList* phys = new G4GenericPhysicsList(MyConstr); >> 143 runManager->SetUserInitialization(phys); >> 144 >> 145 // Set user action classes >> 146 runManager->SetUserInitialization(new DicomActionInitialization()); >> 147 >> 148 runManager->Initialize(); >> 149 >> 150 new DicomIntersectVolume(); >> 151 >> 152 #ifdef G4VIS_USE >> 153 // visualisation manager >> 154 G4VisManager* visManager = new G4VisExecutive; >> 155 visManager->Initialize(); 116 #endif 156 #endif 117 157 118 if (!bPartial) { << 119 #ifdef G4_DCMTK << 120 158 121 theFileMgr = DicomFileMgr::GetInstance(); << 159 G4UImanager* UImanager = G4UImanager::GetUIpointer(); 122 theFileMgr->Convert("Data.dat"); << 123 160 124 #else << 125 // Treatment of DICOM images before creati << 126 dcmHandler = DicomHandler::Instance(); << 127 dcmHandler->CheckFileFormat(); << 128 #endif << 129 161 130 // Initialisation of physics, geometry, pr << 162 if (argc==1) 131 char* nest = std::getenv("DICOM_NESTED_PAR << 163 { 132 if (nest && G4String(nest) == "1") { << 164 #ifdef G4UI_USE 133 theGeometry = new DicomNestedParamDetect << 165 G4UIExecutive* ui = new G4UIExecutive(argc, argv); >> 166 #ifdef G4VIS_USE >> 167 UImanager->ApplyCommand("/control/execute vis.mac"); >> 168 #endif >> 169 ui->SessionStart(); >> 170 delete ui; >> 171 #endif 134 } 172 } 135 else { << 173 else 136 theGeometry = new DicomRegularDetectorCo << 174 { >> 175 G4String command = "/control/execute "; >> 176 G4String fileName = argv[1]; >> 177 UImanager->ApplyCommand(command+fileName); 137 } 178 } 138 } << 179 139 else { << 180 delete runManager; 140 theGeometry = new DicomPartialDetectorCons << 181 141 } << 182 #ifdef G4VIS_USE 142 runManager->SetUserInitialization(theGeometr << 183 delete visManager; 143 << 144 // std::vector<G4String>* MyConstr = new << 145 // MyConstr->push_back("G4EmStandardPhysi << 146 // G4VModularPhysicsList* phys = new G4Ge << 147 G4VModularPhysicsList* phys = new Shielding( << 148 runManager->SetUserInitialization(phys); << 149 << 150 // Set user action classes << 151 runManager->SetUserInitialization(new DicomA << 152 << 153 runManager->Initialize(); << 154 << 155 new DicomIntersectVolume(); << 156 << 157 // visualisation manager << 158 G4VisManager* visManager = new G4VisExecutiv << 159 visManager->Initialize(); << 160 << 161 G4UImanager* UImanager = G4UImanager::GetUIp << 162 << 163 if (ui) { << 164 UImanager->ApplyCommand("/control/execute << 165 ui->SessionStart(); << 166 delete ui; << 167 } << 168 else { << 169 G4String command = "/control/execute "; << 170 G4String fileName = argv[1]; << 171 UImanager->ApplyCommand(command + fileName << 172 } << 173 << 174 delete visManager; << 175 delete runManager; << 176 << 177 if (!bPartial) { << 178 #ifdef G4_DCMTK << 179 delete theFileMgr; << 180 #endif 184 #endif 181 } << 185 182 << 186 if( !bPartial ) { delete dcmHandler; } 183 return 0; << 187 >> 188 return 0; 184 } 189 } >> 190 >> 191 >> 192 185 193