Geant4 Cross Reference |
1 // 2 // ******************************************************************** 3 // * License and Disclaimer * 4 // * * 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. * 10 // * * 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitation of liability. * 17 // * * 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************************************** 25 // 26 /// \file persistency/gdml/G01/load_gdml.cc 27 /// \brief Main program of the persistency/gdml/G01 example 28 // 29 // 30 // 31 // 32 // -------------------------------------------------------------- 33 // GEANT 4 - load_gdml 34 // 35 // -------------------------------------------------------------- 36 37 #include "FTFP_BERT.hh" 38 #include "G01ActionInitialization.hh" 39 #include "G01DetectorConstruction.hh" 40 #include "G01PrimaryGeneratorAction.hh" 41 42 #include "G4GDMLParser.hh" 43 #include "G4LogicalVolumeStore.hh" 44 #include "G4RunManagerFactory.hh" 45 #include "G4TransportationManager.hh" 46 #include "G4Types.hh" 47 #include "G4UIExecutive.hh" 48 #include "G4UImanager.hh" 49 #include "G4VisExecutive.hh" 50 51 #include <vector> 52 53 void print_aux(const G4GDMLAuxListType* auxInfoList, G4String prepend = "|") 54 { 55 for (std::vector<G4GDMLAuxStructType>::const_iterator iaux = auxInfoList->begin(); 56 iaux != auxInfoList->end(); iaux++) 57 { 58 G4String str = iaux->type; 59 G4String val = iaux->value; 60 G4String unit = iaux->unit; 61 62 G4cout << prepend << str << " : " << val << " " << unit << G4endl; 63 64 if (iaux->auxList) print_aux(iaux->auxList, prepend + "|"); 65 } 66 return; 67 } 68 69 // -------------------------------------------------------------- 70 71 int main(int argc, char** argv) 72 { 73 G4cout << G4endl; 74 G4cout << "Usage: load_gdml <intput_gdml_file:mandatory>" 75 << " <output_gdml_file:optional>" << G4endl; 76 G4cout << G4endl; 77 78 if (argc < 2) { 79 G4cout << "Error! Mandatory input file is not specified!" << G4endl; 80 G4cout << G4endl; 81 return -1; 82 } 83 84 G4GDMLParser parser; 85 86 // Uncomment the following if wish to avoid names stripping 87 // parser.SetStripFlag(false); 88 89 // Uncomment the following and set a string with proper absolute path and 90 // schema filename if wishing to use alternative schema for parsing validation 91 // parser.SetImportSchema(""); 92 93 parser.SetOverlapCheck(true); 94 parser.Read(argv[1]); 95 96 if (argc > 4) { 97 G4cout << "Error! Too many arguments!" << G4endl; 98 G4cout << G4endl; 99 return -1; 100 } 101 102 auto* runManager = G4RunManagerFactory::CreateRunManager(); 103 104 runManager->SetUserInitialization(new G01DetectorConstruction(parser.GetWorldVolume())); 105 runManager->SetUserInitialization(new FTFP_BERT); 106 runManager->SetUserInitialization(new G01ActionInitialization()); 107 108 runManager->Initialize(); 109 110 // Initialize visualization 111 G4VisManager* visManager = new G4VisExecutive; 112 visManager->Initialize(); 113 114 // Get the pointer to the User Interface manager 115 G4UImanager* UImanager = G4UImanager::GetUIpointer(); 116 117 /////////////////////////////////////////////////////////////////////// 118 // 119 // Example how to retrieve Auxiliary Information 120 // 121 122 G4cout << std::endl; 123 124 const G4LogicalVolumeStore* lvs = G4LogicalVolumeStore::GetInstance(); 125 std::vector<G4LogicalVolume*>::const_iterator lvciter; 126 for (lvciter = lvs->begin(); lvciter != lvs->end(); lvciter++) { 127 G4GDMLAuxListType auxInfo = parser.GetVolumeAuxiliaryInformation(*lvciter); 128 129 if (auxInfo.size() > 0) 130 G4cout << "Auxiliary Information is found for Logical Volume : " << (*lvciter)->GetName() 131 << G4endl; 132 133 print_aux(&auxInfo); 134 } 135 136 // now the 'global' auxiliary info 137 G4cout << std::endl; 138 G4cout << "Global auxiliary info:" << std::endl; 139 G4cout << std::endl; 140 141 print_aux(parser.GetAuxList()); 142 143 G4cout << std::endl; 144 145 // 146 // End of Auxiliary Information block 147 // 148 //////////////////////////////////////////////////////////////////////// 149 150 runManager->BeamOn(0); 151 152 // example of writing out 153 154 if (argc >= 3) { 155 /* 156 G4GDMLAuxStructType mysubaux = {"mysubtype", "mysubvalue", "mysubunit", 0}; 157 G4GDMLAuxListType* myauxlist = new G4GDMLAuxListType(); 158 myauxlist->push_back(mysubaux); 159 160 G4GDMLAuxStructType myaux = {"mytype", "myvalue", "myunit", myauxlist}; 161 parser.AddAuxiliary(myaux); 162 163 164 // example of setting auxiliary info for world volume 165 // (can be set for any volume) 166 167 G4GDMLAuxStructType mylocalaux = {"sometype", "somevalue", "someunit", 0}; 168 169 parser.AddVolumeAuxiliary(mylocalaux, 170 G4TransportationManager::GetTransportationManager() 171 ->GetNavigatorForTracking()->GetWorldVolume()->GetLogicalVolume()); 172 */ 173 174 parser.SetRegionExport(true); 175 // parser.SetEnergyCutsExport(true); 176 // parser.SetOutputFileOverwrite(true); 177 parser.Write(argv[2], G4TransportationManager::GetTransportationManager() 178 ->GetNavigatorForTracking() 179 ->GetWorldVolume() 180 ->GetLogicalVolume()); 181 } 182 183 if (argc == 4) // batch mode 184 { 185 G4String command = "/control/execute "; 186 G4String fileName = argv[3]; 187 UImanager->ApplyCommand(command + fileName); 188 } 189 else // interactive mode 190 { 191 G4UIExecutive* ui = new G4UIExecutive(argc, argv); 192 UImanager->ApplyCommand("/control/execute vis.mac"); 193 ui->SessionStart(); 194 delete ui; 195 } 196 197 delete visManager; 198 delete runManager; 199 200 return 0; 201 } 202