Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
clparse.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// modified by I.Hrivnacova
29// added G3SensVol
30
31#include "globals.hh"
32#include <fstream>
33#include "G4Tokenizer.hh"
34#include "G3toG4.hh"
35#include "G3EleTable.hh"
36#include "G3VolTable.hh"
37#include "G3MatTable.hh"
38#include "G3MedTable.hh"
39#include "G3RotTable.hh"
40#include "G3PartTable.hh"
41#include "G3DetTable.hh"
42#include "G3SensVolVector.hh"
43
44std::ofstream ofile;
45
46extern "C"
47{
48#include <stdlib.h>
49}
50
51extern std::ofstream ofile;
52
54G3MatTable G3Mat; // material G3 ID <-> G4 pointer table
55G3MedTable G3Med; // trk media G3 ID <-> G4 pointer table
56G3RotTable G3Rot; // rotation ID <-> G4 transform object table
57G3PartTable G3Part; // particle ID <-> ParticleDefinition pointer
58G3DetTable G3Det; // sensitive detector name <-> pointer
59G3EleTable G3Ele; // element names table
60G3SensVolVector G3SensVol; // vector of sensitive logical volumes
61char gSeparator('_');
62
64
65G4int Ipar[1000];
68
70void G3CLEval(G4String *tokens, char *select);
71
72// front-end decoders for G3 routines
73//
74void PG4gsvolu(G4String *tokens);
75void PG4gspos (G4String *tokens);
76void PG4gsposp(G4String *tokens);
77void PG4gsatt (G4String *tokens);
78void PG4gsrotm(G4String *tokens);
79void PG4gsdvn (G4String *tokens);
80void PG4gsdvt (G4String *tokens);
81void PG4gsdvx (G4String *tokens);
82void PG4gsdvn2(G4String *tokens);
83void PG4gsdvt2(G4String *tokens);
84void PG4gsmate(G4String *tokens);
85void PG4gsmixt(G4String *tokens);
86void PG4gstmed(G4String *tokens);
87void PG4gstpar(G4String *tokens);
88void PG4gspart(G4String *tokens);
89void PG4gsdk (G4String *tokens);
90void PG4gsdet (G4String *tokens);
91void PG4gsdetv(G4String *tokens);
92void PG4gsdeta(G4String *tokens);
93void PG4gsdeth(G4String *tokens);
94void PG4gsdetd(G4String *tokens);
95void PG4gsdetu(G4String *tokens);
96void PG4ggclos();
97
98void G3CLRead(G4String & fname, char *select = 0)
99{
100 //
101 // G3CLRead
102 // Read the call List file, parse the tokens, and pass the token
103 // List to the Geant4 interpreter
104 //
105 // fname: call List filename
106
107 G4String line;
108 G4String tokens[1000];
109
110 const char* ofname = "clparse.out";
111 ofile.open(ofname);
112 ofile << "Output file open\n";
113
114 G4int ntokens = 0;
115 std::ifstream istr(fname);
116
117 while (G4StrUtil::readline(istr, line) && ! istr.eof())
118 {
119 ntokens = G3CLTokens(&line,tokens); // tokenize the line
120 for (G4int i=0; i < ntokens; i++)
121 {
122 ofile << tokens[i] << G4endl;
123 }
124
125 // interpret the line as a Geant call
126 //
127 G3CLEval(tokens, select);
128 }
129}
130
131
133{
134 //
135 // G3CLTokens
136 //
137 // Tokenize line, returning tokens in tokens[]. Items in ".."
138 // are extracted as single tokens, despite embedded spaces.
139
140 G4Tokenizer next(*line);
141
142 // first tokenize using " to identify strings
143 //
144 G4int itok = 0;
145 G4int ntokens = 0;
146 G4String token1, token2;
147 while (!(token1=next("\"")).empty())
148 {
149 itok++;
150 if (itok%2 == 0 ) // even: inside a string
151 {
152 tokens[ntokens++] = token1;
153 }
154 else // not in a quoted string: finish tokenization
155 {
156 G4Tokenizer lev2(token1);
157 while (!(token2=lev2()).empty())
158 {
159 tokens[ntokens] = token2;
160 ntokens++;
161 }
162 }
163 }
164 return ntokens;
165}
166
167
168void G3CLEval(G4String tokens[], char *select)
169{
170 //
171 // G3CLEval
172 //
173 // Evaluate the token List as a Geant3 call, and execute it as
174 // a Geant4 call.
175
176 const char* context = tokens[0];
177 const char* routine = tokens[1];
178 const char* wcard = "*";
179
180 // If context is selected, return unless context matches
181 //
182 if ((select != 0) && (select != wcard))
183 {
184 if ( strcmp(select,context) ) { return; }
185 }
186
187 // Branch on Geant3 routine name
188 //
189 ofile << "Do routine " << routine << " in context " << context << G4endl;
190
191 if ( !strcmp(routine,"GSVOLU") ) { PG4gsvolu(&tokens[2]); return;}
192 if ( !strcmp(routine,"GSPOS") ) { PG4gspos (&tokens[2]); return;}
193 if ( !strcmp(routine,"GSPOSP") ) { PG4gsposp(&tokens[2]); return;}
194 if ( !strcmp(routine,"GSATT") ) { PG4gsatt (&tokens[2]); return;}
195 if ( !strcmp(routine,"GSROTM") ) { PG4gsrotm(&tokens[2]); return;}
196 if ( !strcmp(routine,"GSDVN") ) { PG4gsdvn (&tokens[2]); return;}
197 if ( !strcmp(routine,"GSDVT") ) { PG4gsdvt (&tokens[2]); return;}
198 if ( !strcmp(routine,"GSDVX") ) { PG4gsdvx (&tokens[2]); return;}
199 if ( !strcmp(routine,"GSDVN2") ) { PG4gsdvn2(&tokens[2]); return;}
200 if ( !strcmp(routine,"GSDVT2") ) { PG4gsdvt2(&tokens[2]); return;}
201 if ( !strcmp(routine,"GSMATE") ) { PG4gsmate(&tokens[2]); return;}
202 if ( !strcmp(routine,"GSMIXT") ) { PG4gsmixt(&tokens[2]); return;}
203 if ( !strcmp(routine,"GSTMED") ) { PG4gstmed(&tokens[2]); return;}
204 if ( !strcmp(routine,"GSTPAR") ) { PG4gstpar(&tokens[2]); return;}
205 if ( !strcmp(routine,"GSPART") ) { PG4gspart(&tokens[2]); return;}
206 if ( !strcmp(routine,"GSDK") ) { PG4gsdk (&tokens[2]); return;}
207 if ( !strcmp(routine,"GSDET") ) { PG4gsdet (&tokens[2]); return;}
208 if ( !strcmp(routine,"GSDETV") ) { PG4gsdetv(&tokens[2]); return;}
209 if ( !strcmp(routine,"GSDETA") ) { PG4gsdeta(&tokens[2]); return;}
210 if ( !strcmp(routine,"GSDETH") ) { PG4gsdeth(&tokens[2]); return;}
211 if ( !strcmp(routine,"GSDETD") ) { PG4gsdetd(&tokens[2]); return;}
212 if ( !strcmp(routine,"GSDETU") ) { PG4gsdetu(&tokens[2]); return;}
213 if ( !strcmp(routine,"GGCLOS") ) { PG4ggclos(); return;}
214}
215
216void G3fillParams(G4String *tokens, const char *ptypes)
217{
218 //
219 // G3fillParams
220 //
221 // Interpret tokens to fill call parameters, based on parameter types ptypes
222
223 // loop over ptypes
224 //
225 G4int i =0, ipt = 0, k = 0;
226 G4int ni =0, nr = 0, nq = 0;
227 while (ptypes[i] != '\0')
228 {
229 switch (ptypes[i])
230 {
231 case 'i':
232 Ipar[ni] = atoi(tokens[ipt].data());
233 narray = Ipar[ni];
234 ni++; ipt++;
235 break;
236 case 'r':
237 Rpar[nr] = atof(tokens[ipt].data());
238 nr++; ipt++;
239 break;
240 case 's':
241 Spar[nq] = tokens[ipt];
242 nq++; ipt++;
243 break;
244 case 'I':
245 for (k=0; k < narray; k++)
246 {
247 Ipar[ni] = atoi(tokens[ipt].data());
248 ni++; ipt++;
249 }
250 break;
251 case 'R':
252 for (k=0; k < narray; k++)
253 {
254 Rpar[nr] = atof(tokens[ipt].data());
255 nr++; ipt++;
256 }
257 break;
258 case 'Q':
259 // special case of reading three successive R arrays
260 // into one (used in gsmixt)
261 //
262 narray = 3 * std::abs(narray);
263 for (k=0; k < narray; k++)
264 {
265 Rpar[nr] = atof(tokens[ipt].data());
266 nr++; ipt++;
267 }
268 break;
269 case 'S':
270 for (k=0; k < narray; k++)
271 {
272 Spar[nq] = tokens[ipt];
273 nq++; ipt++;
274 }
275 break;
276 default:
277 ofile << "unidentified ptype '" << ptypes[i] << G4endl;
278 };
279 i++;
280 }
281}
std::vector< G4LogicalVolume * > G3SensVolVector
G3G4DLL_API char gSeparator
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
#define G4endl
Definition: G4ios.hh:57
G3MatTable G3Mat
Definition: clparse.cc:54
void PG4gsdk(G4String *tokens)
Definition: G4gsdk.cc:32
void PG4ggclos()
Definition: G4ggclos.cc:31
void PG4gsatt(G4String *tokens)
Definition: G4gsatt.cc:32
void G3CLEval(G4String *tokens, char *select)
G3SensVolVector G3SensVol
Definition: clparse.cc:60
void PG4gsdetd(G4String *tokens)
Definition: G4gsdetd.cc:33
void G3CLRead(G4String &fname, char *select=0)
Definition: clparse.cc:98
void PG4gsvolu(G4String *tokens)
Definition: G4gsvolu.cc:36
void PG4gsdeta(G4String *tokens)
Definition: G4gsdeta.cc:37
G4double Rpar[1000]
Definition: clparse.cc:66
void PG4gsrotm(G4String *tokens)
Definition: G4gsrotm.cc:34
G3PartTable G3Part
Definition: clparse.cc:57
G3EleTable G3Ele
Definition: clparse.cc:59
void PG4gsdvt2(G4String *tokens)
Definition: G4gsdvt2.cc:40
void PG4gsdeth(G4String *tokens)
Definition: G4gsdeth.cc:33
void PG4gsdvn2(G4String *tokens)
Definition: G4gsdvn2.cc:40
void PG4gsdvx(G4String *tokens)
Definition: G4gsdvx.cc:39
G4int narray
Definition: clparse.cc:63
G3MedTable G3Med
Definition: clparse.cc:55
void PG4gsmate(G4String *tokens)
Definition: G4gsmate.cc:41
void PG4gstmed(G4String *tokens)
Definition: G4gstmed.cc:43
G3RotTable G3Rot
Definition: clparse.cc:56
void PG4gsposp(G4String *tokens)
Definition: G4gsposp.cc:41
void G3fillParams(G4String *tokens, const char *ptypes)
Definition: clparse.cc:216
void PG4gsdetu(G4String *tokens)
Definition: G4gsdetu.cc:30
G4int G3CLTokens(G4String *line, G4String *tokens)
void PG4gsmixt(G4String *tokens)
Definition: G4gsmixt.cc:42
void PG4gspart(G4String *tokens)
Definition: G4gspart.cc:32
void PG4gspos(G4String *tokens)
Definition: G4gspos.cc:41
void PG4gsdvn(G4String *tokens)
Definition: G4gsdvn.cc:37
G4String Spar[1000]
Definition: clparse.cc:67
void PG4gstpar(G4String *tokens)
Definition: G4gstpar.cc:31
void PG4gsdvt(G4String *tokens)
Definition: G4gsdvt.cc:40
std::ofstream ofile
Definition: clparse.cc:44
G4int Ipar[1000]
Definition: clparse.cc:65
void PG4gsdetv(G4String *tokens)
Definition: G4gsdetv.cc:35
G3DetTable G3Det
Definition: clparse.cc:58
void PG4gsdet(G4String *tokens)
Definition: G4gsdet.cc:31
G3VolTable G3Vol
Definition: clparse.cc:53
std::istream & readline(std::istream &is, G4String &str, G4bool skipWhite=true)
Read characters into a G4String from an input stream until end-of-line.