Geant4  9.6.p02
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4tgrLineProcessor.cc
Go to the documentation of this file.
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 //
27 //
28 // class G4tgrLineProcessor
29 
30 // History:
31 // - Created. P.Arce, CIEMAT (November 2007)
32 // -------------------------------------------------------------------------
33 
34 #include "G4tgrLineProcessor.hh"
35 
36 #include "G4SystemOfUnits.hh"
37 #include "G4tgrParameterMgr.hh"
38 #include "G4tgrFileIn.hh"
39 #include "G4tgrElementSimple.hh"
41 #include "G4tgrVolume.hh"
42 #include "G4tgrVolumeDivision.hh"
43 #include "G4tgrVolumeAssembly.hh"
44 #include "G4tgrPlaceDivRep.hh"
46 #include "G4tgrVolumeMgr.hh"
47 #include "G4tgrUtils.hh"
48 #include "G4tgrMaterialFactory.hh"
50 #include "G4tgrMessenger.hh"
51 
52 
53 //---------------------------------------------------------------
55 {
56  volmgr = G4tgrVolumeMgr::GetInstance();
57 }
58 
59 
60 //---------------------------------------------------------------
62 {
63 }
64 
65 
66 //---------------------------------------------------------------
67 G4bool G4tgrLineProcessor::ProcessLine( const std::vector<G4String>& wl )
68 {
69 #ifdef G4VERBOSE
71  {
72  G4tgrUtils::DumpVS(wl, "@@@ Processing input line");
73  }
74 #endif
75 
76  G4String wl0 = wl[0];
77  for( size_t ii = 0; ii < wl0.length(); ii++ )
78  {
79  wl0[ii] = toupper( wl0[ii] );
80  }
81 
82  //------------------------------- parameter number
83  if( wl0 == ":P" )
84  {
86 
87  //------------------------------- parameter string
88  }
89  else if( wl0 == ":PS" )
90  {
92 
93  //------------------------------- isotope
94  }
95  else if( wl0 == ":ISOT" )
96  {
98  ->AddIsotope( wl );
99  volmgr->RegisterMe( isot );
100 
101  //------------------------------- element
102  }
103  else if( wl0 == ":ELEM" )
104  {
106  ->AddElementSimple( wl );
107  volmgr->RegisterMe( elem );
108 
109  //------------------------------- element from isotopes
110  }
111  else if( wl0 == ":ELEM_FROM_ISOT" )
112  {
113  //:ELEM_FROM_ISOT NAME SYMBOL N_ISOT (ISOT_NAME ISOT_ABUNDANCE)
115  ->AddElementFromIsotopes( wl );
116  volmgr->RegisterMe( elem );
117 
118  //------------------------------- material
119  }
120  else if( wl0 == ":MATE" )
121  {
122 
124  ->AddMaterialSimple( wl );
125  volmgr->RegisterMe( mate );
126 
127  //------------------------------- material mixtures & by weight
128  }
129  else if( (wl0 == ":MIXT") || (wl0 == ":MIXT_BY_WEIGHT") )
130  {
132  ->AddMaterialMixture( wl, "MaterialMixtureByWeight" );
133  volmgr->RegisterMe( mate );
134 
135  //------------------------------- material mixture by number of atoms
136  }
137  else if( wl0 == ":MIXT_BY_NATOMS" )
138  {
140  ->AddMaterialMixture(wl, "MaterialMixtureByNoAtoms");
141  volmgr->RegisterMe( mate );
142 
143  //------------------------------- material mixture by volume
144  }
145  else if( wl0 == ":MIXT_BY_VOLUME" )
146  {
148  ->AddMaterialMixture( wl, "MaterialMixtureByVolume" );
149  volmgr->RegisterMe( mate );
150 
151  //------------------------------- material Mean Excitation Energy of
152  // Ionisation Potential
153  }
154  else if( wl0 == ":MATE_MEE" )
155  {
157  ->FindMaterial( G4tgrUtils::GetString( wl[1] ) );
158  if( mate == 0 )
159  {
160  G4Exception("G4tgrLineProcessor::ProcessLine()", "Material not found",
162  return false;
163  }
165 
166  //------------------------------- material
167  }
168  else if( wl0 == ":MATE_STATE" )
169  {
171  ->FindMaterial( G4tgrUtils::GetString( wl[1] ) );
172  if( mate == 0 )
173  {
174  G4Exception("G4tgrLineProcessor::ProcessLine()", "Material not found",
175  FatalException, wl[1] );
176  }
177  mate->SetState( wl[2] );
178 
179  //------------------------------- material
180  }
181  else if( wl0 == ":MATE_TEMPERATURE" )
182  {
184  ->FindMaterial( G4tgrUtils::GetString( wl[1] ) );
185  if( mate == 0 )
186  {
187  G4Exception("G4tgrLineProcessor::ProcessLine()", "Material not found",
188  FatalException, wl[1] );
189  }
190  mate->SetTemperature( G4tgrUtils::GetDouble( wl[2], kelvin ) );
191 
192  //------------------------------- material
193  }
194  else if( wl0 == ":MATE_PRESSURE" )
195  {
197  ->FindMaterial( G4tgrUtils::GetString( wl[1] ) );
198  if( mate == 0 )
199  {
200  G4Exception("G4tgrLineProcessor::ProcessLine()", "Material not found",
201  FatalException, wl[1] );
202  }
203  mate->SetPressure( G4tgrUtils::GetDouble( wl[2], atmosphere ) );
204 
205  //------------------------------- solid
206  }
207  else if( wl0 == ":SOLID" )
208  { // called from here or from G4tgrVolume::G4tgrVolume
209  volmgr->CreateSolid( wl, 0 );
210 
211  //------------------------------- volume
212  }
213  else if( wl0 == ":VOLU" )
214  {
215  G4tgrVolume* vol = new G4tgrVolume( wl );
216  volmgr->RegisterMe( vol );
217 
218  //--------------------------------- single placement
219  }
220  else if( wl0 == ":PLACE" )
221  {
222  G4tgrVolume* vol = FindVolume( G4tgrUtils::GetString( wl[1] ) );
223  G4tgrPlace* vpl = vol->AddPlace( wl );
224  volmgr->RegisterMe( vpl );
225 
226  //--------------------------------- parameterisation
227  }
228  else if( wl0 == ":PLACE_PARAM" )
229  {
230  G4tgrVolume* vol = FindVolume( G4tgrUtils::GetString( wl[1] ) );
231  G4tgrPlaceParameterisation* vpl = vol->AddPlaceParam( wl );
232  volmgr->RegisterMe( vpl );
233 
234  //--------------------------------- division
235  }
236  else if( (wl0 == ":DIV_NDIV") || (wl0 == ":DIV_WIDTH")
237  || (wl0 == ":DIV_NDIV_WIDTH") )
238  {
239  //---------- Create G4tgrVolumeDivision and fill the volume params
240  G4tgrVolumeDivision* vol = new G4tgrVolumeDivision( wl );
241  volmgr->RegisterMe( vol );
242 
243  //--------------------------------- replica
244  }
245  else if( wl0 == ":REPL" )
246  {
247  G4tgrVolume* vol = FindVolume( G4tgrUtils::GetString( wl[1] ) );
248  G4tgrPlaceDivRep* vpl = vol->AddPlaceReplica( wl );
249  volmgr->RegisterMe( vpl );
250 
251  //----------------------------- assembly volume: definition of components
252  }
253  else if( wl0 == ":VOLU_ASSEMBLY" )
254  {
255  G4tgrVolumeAssembly* vol = new G4tgrVolumeAssembly( wl );
256  volmgr->RegisterMe( vol );
257 
258  //----------------------------- assembly volume: definition of components
259  }
260  else if( wl0 == ":PLACE_ASSEMBLY" )
261  {
262  G4tgrVolume* vol = FindVolume( G4tgrUtils::GetString( wl[1] ) );
263  G4tgrPlace* vpl = vol->AddPlace( wl );
264  volmgr->RegisterMe( vpl );
265 
266  //--------------------------------- rotation matrix
267  }
268  else if( wl0 == ":ROTM" )
269  {
270  //---------- When second word is ':NEXT/:MNXT' it is used for defining a
271  // rotation matrix that will be used for the next placement/s
273  ->AddRotMatrix( wl );
274  volmgr->RegisterMe( rm );
275 
276  //------------------------------- visualisation
277  }
278  else if( wl0 == ":VIS" )
279  {
280  std::vector<G4tgrVolume*> vols =
281  volmgr->FindVolumes( G4tgrUtils::GetString( wl[1] ), 1 );
282  for( size_t ii = 0; ii < vols.size(); ii++ )
283  {
284  vols[ii]->AddVisibility( wl );
285  }
286 
287  //--------------------------------- colour
288  }
289  else if( (wl0 == ":COLOUR") || (wl0 == ":COLOR") )
290  {
291  std::vector<G4tgrVolume*> vols =
292  volmgr->FindVolumes( G4tgrUtils::GetString( wl[1] ), 1 );
293  for( size_t ii = 0; ii < vols.size(); ii++ )
294  {
295  vols[ii]->AddRGBColour( wl );
296  }
297 
298  //--------------------------------- check overlaps
299  }
300  else if( wl0 == ":CHECK_OVERLAPS" )
301  {
302  std::vector<G4tgrVolume*> vols =
303  volmgr->FindVolumes( G4tgrUtils::GetString( wl[1] ), 1 );
304  for( size_t ii = 0; ii < vols.size(); ii++ )
305  {
306  vols[ii]->AddCheckOverlaps( wl );
307  }
308  //--------------------------------- ERROR
309  }
310  else
311  {
312  return 0;
313  }
314 
315  return 1;
316 }
317 
318 
319 //---------------------------------------------------------------
321 {
322  G4tgrVolume* vol = volmgr->FindVolume( volname, 1);
323 
324  if( vol->GetType() == "VOLDivision" )
325  {
326  G4Exception("G4tgrLineProcessor::FindVolume()",
327  "InvalidSetup", FatalException,
328  "Using 'PLACE' for a volume created by a division !");
329  }
330 
331  return vol;
332 }