]>
Commit | Line | Data |
---|---|---|
fe4da5cc | 1 | * |
2 | * $Id$ | |
3 | * | |
4 | * $Log$ | |
5 | * Revision 1.1.1.1 1995/10/24 10:20:47 cernlib | |
6 | * Geant | |
7 | * | |
8 | * | |
9 | #include "geant321/pilot.h" | |
10 | #if defined(CERNLIB_DOC) | |
11 | *CMZ : 3.21/02 29/03/94 15.41.28 by S.Giani | |
12 | *-- Author : | |
13 | * | |
14 | ************************************************************************ | |
15 | * * | |
16 | * Introduction to the Geometry package * | |
17 | * ------------------------------------ * | |
18 | * * | |
19 | * * | |
20 | * THE GEOMETRY PACKAGE * | |
21 | * * | |
22 | * The geometry package consists of subroutines which can be used in * | |
23 | * the initialisation phase of the program to describe the geometry * | |
24 | * of the experimental set-up, and of subroutines which ensure the * | |
25 | * communication with the tracking package during the event * | |
26 | * processing phase. * | |
27 | * The following paragraphs review the concepts of the geometry * | |
28 | * package and explain how the geometrical information should be * | |
29 | * provided by the user. * | |
30 | * It is important to point out that, once the set-up has been * | |
31 | * initialized, the tracking of particles through the different media * | |
32 | * can proceed without any other intervention from the user [TRAK]. * | |
33 | * The connection between the geometry and tracking packages is * | |
34 | * established by the subprograms GMEDIA/GTMEDI, GNEXT/GTNEXT and * | |
35 | * GINVOL which answer respecti- vely the questions : * | |
36 | * * | |
37 | * - In which medium is a given point ? * | |
38 | * - What is the path length to the next medium ? * | |
39 | * - Is a given point still in the current medium ? * | |
40 | * * | |
41 | * (The routines GTMEDI and GTNEXT are used in a dynamic context at * | |
42 | * tracking time, where information about the direction of the * | |
43 | * particle can be used to save time). * | |
44 | * * | |
45 | * THE VOLUME DEFINITION * | |
46 | * * | |
47 | * Experimental set-ups, as complex as the detectors prepared for * | |
48 | * LEP, can be described rather accurately through the definition of * | |
49 | * a set of simple VOLUMES. Each VOLUME is given a NAME and is * | |
50 | * characterized by: * | |
51 | * * | |
52 | * - a SHAPE identifier, specifying one of the basic geometrical * | |
53 | * shapes available [GEOM010], the shape parameters, giving the * | |
54 | * dimensions of the volume, * | |
55 | * - a local reference system, whose origin and axes are the ones * | |
56 | * defined for the given shape (cartesian, cylindrical or spherical * | |
57 | * coord.), * | |
58 | * - its physical properties, given by a set of constants for the * | |
59 | * homogeneous MATERIAL which fills the volume [CONS], * | |
60 | * - additional properties, known as 'TRACKING MEDIUM' constants, * | |
61 | * which depend on the characteristics of the volume itself (the * | |
62 | * MATERIAL identifier is one of the constants) and on its * | |
63 | * geometrical and physical environment (properties of the * | |
64 | * neighbour media, magnetic field, etc.) [CONS,TRAK], * | |
65 | * - a set of attributes, in connection with the drawing package and * | |
66 | * the detector response package [DRAW,HITS]. * | |
67 | * * | |
68 | * As long as it is not 'positioned' in a given reference frame, a * | |
69 | * VOLUME is an entity which has no spatial relation with the set-up. * | |
70 | * By convention, a unique initial volume has to be defined which * | |
71 | * should match (or surround) the outside boundaries of the entire * | |
72 | * set-up. The reference frame attached to this volume is considered * | |
73 | * to be the master reference frame. * | |
74 | * * | |
75 | * VOLUMES WITH CONTENTS * | |
76 | * * | |
77 | * A VOLUME can be declared to have 'contents' and become a 'mother' * | |
78 | * volume. The contents are either predefined volumes which are * | |
79 | * explicitly positioned inside the mother, or new volumes which are * | |
80 | * implicitly defined by a division mechanism applied to the mother. * | |
81 | * Positioning a volume with given shape and dimensions inside a * | |
82 | * mother volume is achieved by specifying its translation and * | |
83 | * rotation with respect to the mother reference frame. The user * | |
84 | * should make sure that no volume overlaps the boundaries of its * | |
85 | * mother. When a volume is positioned, the user gives it a NUMBER. * | |
86 | * Multiple copies of a given volume, with different numbers, can be * | |
87 | * positioned inside a mother or inside different mothers and the * | |
88 | * contents of the volume are reproduced implicitly in all copies. * | |
89 | * Divisions can be performed along any of the three axes of the * | |
90 | * mother volume. The definition of the axes (X,Y,Z or R..,.,Z or * | |
91 | * R,.,.) depends on the shape. The mother volume can be partially * | |
92 | * or totally divided. The division generates a cell, which is * | |
93 | * considered as a new volume with (usually) the same shape as the * | |
94 | * mother. Its dimensions are computed according to the declared * | |
95 | * division number and/or step size. This cell, as any volume, can * | |
96 | * again be divided along any of its proper axes, or have other * | |
97 | * volumes positioned into it. Volumes positioned within a cell are * | |
98 | * reproduced implicitly in all cells. * | |
99 | * These operations permit a physical tree to be defined of volumes * | |
100 | * at deeper and deeper levels. * | |
101 | * It is assumed that the 'tracking medium' properties of the * | |
102 | * contents replace the ones of the mother within the space region * | |
103 | * they occupy. * | |
104 | * A VOLUME is therefore defined not only by its intrinsic * | |
105 | * characteristics but also by the definition of its 'descendants', * | |
106 | * namely its contents, the contents of its contents, etc. * | |
107 | * * | |
108 | * OVERLAPPING VOLUMES * | |
109 | * * | |
110 | * The user may define volumes which have nothing to do with the * | |
111 | * real physical structure. It is sometimes convenient to make use * | |
112 | * of such volumes, to artificially delimit regions with simple * | |
113 | * shapes. As a consequence, it may happen that volumes overlap each * | |
114 | * other. (A volume positioned inside a mother is obviously not * | |
115 | * regarded as overlapping the mother). * | |
116 | * The handling of overlapping volumes has some implications that * | |
117 | * the user should be aware of: * | |
118 | * A flag 'ONLY/MANY' is attached to each positioned volume. The * | |
119 | * 'MANY' option indicates that a point found to be in this volume * | |
120 | * could also be in other volumes which are not direct descendants of * | |
121 | * it. The user is free to declare one of the overlapping volumes as * | |
122 | * 'ONLY', in which case the medium searching subroutines will give * | |
123 | * priority to this volume. * | |
124 | * If a point is inside several 'MANY' volumes and outside all * | |
125 | * 'ONLY' ones, priority will be given to the first volume found at * | |
126 | * the deepest level and, in order to avoid ambiguities, two * | |
127 | * overlapping 'MANY' volumes should in general be assigned the same * | |
128 | * default tracking medium. * | |
129 | * * | |
130 | * THE PHYSICAL TREE * | |
131 | * * | |
132 | * The package accepts a maximum of 15 levels, which should be quite * | |
133 | * enough to represent even the fine details of a complex set-up. * | |
134 | * * | |
135 | * THE DATA STRUCTURE JVOLUM AND THE COMMON BLOCK /GCVOLU/ * | |
136 | * * | |
137 | * In practice, the physical tree is represented by a logical tree * | |
138 | * structure, the JVOLUM data structure [GEOM 199], which describes * | |
139 | * the arrangement of volumes in a compact and recurrent way. Each * | |
140 | * generic volume appears once, and once only, and carries the * | |
141 | * information relevant to the volume itself and to its contents, if * | |
142 | * any, by reference to the generic volumes corresponding to those * | |
143 | * contents. * | |
144 | * In the situation where division or multiple copies occur, there * | |
145 | * is no longer a one-to-one correspondence between a given volume in * | |
146 | * the logical tree and a unique region in space. Information has to * | |
147 | * be kept at tracking time to identify which division cell or which * | |
148 | * copy was considered at each depth level along the path through the * | |
149 | * physical tree. This information is stored by the subroutine * | |
150 | * GTMEDI, for the current point of the current track, in the COMMON * | |
151 | * /GCVOLU/. It contains the current LEVEL and, for each level, * | |
152 | * starting from the first initial reference volume, the * | |
153 | * identification of the corresponding volume, e.g.: NAME, NUMBER, * | |
154 | * 'ONLY/MANY' flag, translation and rotation with respect to the * | |
155 | * master reference frame. The SHAPE parameters and the number of * | |
156 | * parameters (initialy stored in /GCVOLU/) are stored in the * | |
157 | * separate structure JGPAR. * | |
158 | * * | |
159 | * THE BASIC USER TOOLS * | |
160 | * * | |
161 | * The rules of the game being established, it is easy to introduce * | |
162 | * the set of subroutines which ensure the functionality of the * | |
163 | * package. The user can define a volume through a call to the * | |
164 | * subroutine: * | |
165 | * * | |
166 | * GSVOLU Input arguments specify the NAME, SHAPE and parameters * | |
167 | * of the volume. An output argument returns the position * | |
168 | * of the volume inside the bank JVOLUM. * | |
169 | * * | |
170 | * The user can position a volume through a call to either one of the * | |
171 | * following subroutines: * | |
172 | * * | |
173 | * GSPOS Input arguments specify the NAME and copy NUMBER of the * | |
174 | * volume to be positioned, the NAME of the mother, the * | |
175 | * translation and the rotation matrix, and the 'ONLY/MANY' * | |
176 | * flag. * | |
177 | * GSPOSP In case the user has to position , inside a mother, a * | |
178 | * large number of volumes with the same shape but * | |
179 | * different dimensions (lead glass blocks, BGO crystals, * | |
180 | * etc.) an alternative is proposed which consists of * | |
181 | * defining the generic volume once, with the number of * | |
182 | * shape parameters set to zero, and to call GSPOSP for * | |
183 | * each volume in turn, with the same arguments as GSPOS * | |
184 | * plus the shape parameters. The volumes will be * | |
185 | * identified by their NAME+NUMBER as for the multiple * | |
186 | * copies. * | |
187 | * * | |
188 | * The user can divide a volume through a call to either one of the * | |
189 | * following subroutines: * | |
190 | * * | |
191 | * GSDVN Input arguments specify the NAME of the cell volume, the * | |
192 | * name of the MOTHER being divided, the number of * | |
193 | * divisions NDIV and the axis along which the division is * | |
194 | * performed. In this simple case, the cell tracking * | |
195 | * medium is assumed to be the same as for the mother. * | |
196 | * GSDVS The division STEP is given instead of NDIV and the cell * | |
197 | * tracking medium is specified. * | |
198 | * GSDVX In addition to both STEP and NDIV , the origin of the * | |
199 | * first cell and the cell tracking medium are specified. * | |
200 | * * | |
201 | * THE OPTIMISATION TOOLS * | |
202 | * * | |
203 | * When a track enters a volume with contents, the search time to * | |
204 | * identify whether the current point is in the mother or in any of * | |
205 | * the contents is very short when the contents are division cells * | |
206 | * (straightforward computation along the relevant axis). When the * | |
207 | * contents have been positioned, the search time can be quite large. * | |
208 | * In order to save time the user can make use of either of the * | |
209 | * following facilities: * | |
210 | * * | |
211 | * GSORD/GGORD * | |
212 | * From the known position of the contents inside a given volume * | |
213 | * the subroutine GGORD computes fictitious boundaries along the * | |
214 | * specified coordinate, simulating a division with non regular * | |
215 | * step size. A binary search technique is used to identify within * | |
216 | * which pseudo-cell the current point is. The slow process of * | |
217 | * computing whether the point is inside or outside the contents is * | |
218 | * therefore limited to the few (if any) volumes sitting in that * | |
219 | * pseudo-cell. The coordinate selected for the pseudo division * | |
220 | * can be any of X, Y, Z, Rxy, R, Phi or Theta. GSORD is called by * | |
221 | * the user to flag which volume should have its contents ordered * | |
222 | * and along which axis. GGORD is called by GGCLOS. The user can * | |
223 | * select via the data record OPTIM to automatically call GSORD for * | |
224 | * all the volumes with content. In this case the system will try * | |
225 | * to choose the best axis along which to order the contents of * | |
226 | * every mother in the tree. * | |
227 | * * | |
228 | * GSNEXT - GSNEAR * | |
229 | * When a particle enters a mother volume, the contents are scanned * | |
230 | * initially in the order they have been positioned, and the user * | |
231 | * should take care over the best sequence of GSPOS calls. * | |
232 | * However, when the particle comes back inside the mother from any * | |
233 | * one of the contents, it is usually possible to limit the search * | |
234 | * to the neighbour contents. The subroutines GSNEXT,GSNEAR permit * | |
235 | * the user to inject at initialisation time, for each content in * | |
236 | * turn, the list of neighbours to search for. A proper use of * | |
237 | * this facility can reduce the search time significantly. * | |
238 | * * | |
239 | * GSUNEA/GUNEAR * | |
240 | * To specify any user ordering for the contents of a given volume. * | |
241 | * * | |
242 | * Labelled COMMON blocks related to section GEOM * | |
243 | * ---------------------------------------------- * | |
244 | * * | |
245 | * COMMON /GCPOLY/ IZSEC, IPSEC * | |
246 | * C * | |
247 | * IZSEC Z-section number * | |
248 | * IPSEC Phi-sector number * | |
249 | * * | |
250 | * COMMON/GCVOLU/NLEVEL,NAMES(15),NUMBER(15), * | |
251 | * +LVOLUM(15),LINDEX(15),INFROM,NLEVMX,NLDEV(15),LINMX(15), * | |
252 | * +GTRAN(3,15),GRMAT(10,15),GONLY(15),GLX(3) * | |
253 | * C * | |
254 | * NLEVEL Level number at which the last medium search stopped. * | |
255 | * NAMES Volume names at each level. * | |
256 | * NUMBER User volume numbers at each level. * | |
257 | * LVOLUM System volume numbers at each level. * | |
258 | * LINDEX Physical tree volume indices at each level. * | |
259 | * INFROM Number of the content a particle has just left, when * | |
260 | * relevant * | |
261 | * NLEVMX Maximum number of levels in given geometry tree * | |
262 | * NLDEV Levels where local development take place, if non 0 * | |
263 | * LINMX numbers of contents (position) or cells (division) * | |
264 | * GTRAN X,Y,Z offsets of the cumulative coordinate * | |
265 | * transformation from the master system to the system at * | |
266 | * each level. * | |
267 | * GRMAT Rotation matrix elements for the cumulative * | |
268 | * transformation from the master system to the system at * | |
269 | * each level. GRMAT(10,LEVEL) equal to 0.0 indicates the * | |
270 | * null rotation. * | |
271 | * GONLY Uniqueness flags at each level. * | |
272 | * GLS Current point in the local coordinates of level NLEVEL. * | |
273 | * * | |
274 | * The System Shapes * | |
275 | * ----------------- * | |
276 | * * | |
277 | * The system shapes supported at present are as follows: * | |
278 | * * | |
279 | * 'BOX ' is a box. It has 3 parameters, the half lengths in x, y * | |
280 | * and z. * | |
281 | * 'TRD1' is a trapezoid with only the x length varying with z. It * | |
282 | * has 4 parameters, the half length in x at the low z * | |
283 | * surface, that at the high z surface, the half length in y * | |
284 | * and in z. * | |
285 | * 'TRD2' is a trapezoid with both x and y lengths varying with z. * | |
286 | * It has 5 parameters, the half length in x at the low z * | |
287 | * surface, that at the high z surface, the half length in y * | |
288 | * at the low z surface, that at the high z surface, the half * | |
289 | * length in z. * | |
290 | * 'TRAP' is a general trapezoid, i.e. one for which the faces * | |
291 | * perpendicular to z are trapezia and their centres are not * | |
292 | * at the same x, y. It has 11 parameters: Dz the half length * | |
293 | * in z, Th & Phi the polar angles from the centre of the face * | |
294 | * at z=-Dz to that at z=+Dz, H1 the half length in y at * | |
295 | * z=-Dz, LB1 the half length in x at z=-Dz and y=low edge, * | |
296 | * LH1 the half length in x at z=-Dz and y= high edge, Th1 the * | |
297 | * angle w.r.t. the y axis from the centre of the low y edge * | |
298 | * to the centre of the high y edge, and H2, LB2, LH2, Th2 the * | |
299 | * corresponding quantities to the 1s but at z=+Dz. * | |
300 | * 'TUBE' is a tube. It has 3 parameters, the inside radius, the * | |
301 | * outside radius and the half length in z. * | |
302 | * 'TUBS' is a phi segment of a tube. It has 5 parameters, the same * | |
303 | * 3 as 'TUBE' plus the phi limits. The segment starts at the * | |
304 | * first limit and includes increasing phi value up to the * | |
305 | * second limit or that plus 360 degrees. * | |
306 | * 'CONE' is a conical tube. It has 5 parameters, the half length in * | |
307 | * z, the inside and outside radii at the low z limit and * | |
308 | * those at the high z limit. * | |
309 | * 'CONS' is a phi segment of a conical tube. It has 7 parameters, * | |
310 | * the same 5 as 'CONE' plus the phi limits. * | |
311 | * 'SPHE' is a segment of a spherical shell. It has 6 parameters, * | |
312 | * the inside radius, the outside radius, the theta limits and * | |
313 | * the phi limits. At present, for the drawing package only * | |
314 | * first two parameters are significant (inside radius and * | |
315 | * outside radius) and such a shape is always drawn as a full * | |
316 | * sphere. * | |
317 | * 'PARA' is a parallelpiped. It has 6 parameters, the half length * | |
318 | * in x, the half length in y, the half length in z, the angle * | |
319 | * w.r.t. the y axis from the centre of the low y edge to the * | |
320 | * centre of the high y edge, and the theta phi polar angles * | |
321 | * from the centre of the low z face to the centre of the high * | |
322 | * z face. * | |
323 | * 'PGON' is a polygon. It has at least 10 parameters, the lower phi * | |
324 | * limit, the range in phi, the number of straight sides (of * | |
325 | * equal length) between those phi limits, the number of z * | |
326 | * planes (at least two) where the distances to the z axis are * | |
327 | * changing, z coordinate of first plane, the shortest * | |
328 | * distances RMIN & RMAX from the z axis to the inside * | |
329 | * straight edge and the outside straight edge for the first * | |
330 | * plane, Z, RMIN, RMAX for the second plane, and so on. * | |
331 | * 'PCON' is a polycone. It has at least 9 parameters, the lower phi * | |
332 | * limit, the range in phi, the number of z planes (at least * | |
333 | * two) where the radius are changing, the z coordinate and * | |
334 | * the minimum and maximum radius for each z boundary. * | |
335 | * 'ELTU' is a cylinder with an elliptical section. It has three * | |
336 | * parameters: the ellipse semi-axis in X, the ellipse * | |
337 | * semi-axis in Y and the half length in Z. The equation of * | |
338 | * the conical curve is: * | |
339 | * X**2/PAR(1)**2 + Y**2/PAR(2)**2 = 1 * | |
340 | * ELTU is not divisible. * | |
341 | * 'HYPE' is a hyperbolic tube, ie the inner and outer surfaces are * | |
342 | * hyperboloids, as would be formed by a system of cylindrical * | |
343 | * wires which were then rotated tangentially about their * | |
344 | * centres. The 4 parameters are the inner and outer radii, * | |
345 | * the half lenght in z, and the "stereo angle" theta in * | |
346 | * degrees, such that the hyperbolic surfaces are given by * | |
347 | * r**2 = (z*tan(theta))**2 + (r at z=0)**2 * | |
348 | * 'CTUB' is a cut tube with 11 parameters. The first 5 parameters * | |
349 | * are the same as for the TUBS. The remaining 6 parameters * | |
350 | * are the director cosines of the surfaces cutting the tube * | |
351 | * respectively at the low and high Z values. * | |
352 | * * | |
353 | * Shapes BOX,TRD1,TRD2,TRAP * | |
354 | * Shapes TUBE,TUBS,CONE,CONS * | |
355 | * Shapes PARA,SPHE,PGON,PCON * | |
356 | * Shapes ELTU,HYPE,CTUB * | |
357 | * * | |
358 | * The Volume data structure JVOLUM * | |
359 | * -------------------------------- * | |
360 | * * | |
361 | * ISHAPE system shape number * | |
362 | * NIN number of volumes imbedded in the mother volume. If it * | |
363 | * is negative then the volume is divided into slices * | |
364 | * NMED medium number for the volume * | |
365 | * NPAR number of shape parameters * | |
366 | * NATT number of drawing attributes * | |
367 | * PAR array of shape parameters * | |
368 | * IAT array of drawing attributes * | |
369 | * IAXIS defines the direction of the slices (1,2,3) in the case * | |
370 | * of slice division (NIN < 0): * | |
371 | * IVO system volume number * | |
372 | * NDIV number of slices * | |
373 | * C0 minimum coordinate limit * | |
374 | * STEP coordinate step from slice to slice * | |
375 | * IVO system volume number in the case of object insertion * | |
376 | * (NIN > 0): * | |
377 | * NR user number * | |
378 | * IROT rotation matrix number defining the orientation of the * | |
379 | * volume * | |
380 | * X,Y,Z define the position of the volume * | |
381 | * KONLY indicates whether it is sufficient to find a point * | |
382 | * within this volume or whether there may be some * | |
383 | * ambiguity with other volumes at the same level * | |
384 | * * | |
385 | * User bits in the bank status word are used with the following * | |
386 | * meaning (the least significant bit is number 1): * | |
387 | * * | |
388 | * Bit Meaning when set * | |
389 | * * | |
390 | * 1 Content of the volume has been ordered by GSORD * | |
391 | * 2 Content of the volume has been developed by GGDVLP * | |
392 | * 3 Volume is convex * | |
393 | * 4 User routines GSNEAR or GSNEXT have been called * | |
394 | * 5 Bit used to exclude a volume from the search in the * | |
395 | * geometrical tree. * | |
396 | * * | |
397 | * * | |
398 | * | JVOLUM * | |
399 | * NVOLUM IVO IVO v NVOLUM * | |
400 | * ............................................. (*) * | |
401 | * | | | | | | | Volume names |-->nlevmx * | |
402 | * ............................................. * | |
403 | * | | * | |
404 | * | v JVO = LQ(JVOLUM-IVO) {NIN < 0} * | |
405 | * | ........................................... (**) * | |
406 | * | | | |ishape|nin|numed|npar|natt|pars|atts.|->dev * | |
407 | * | ........................................... * | |
408 | * | | * | |
409 | * | v JDIV=LQ(JVO-1) * | |
410 | * | ................................. * | |
411 | * | | | IAXIS |IVO |NDIV| C0 | STEP | * | |
412 | * | ................................. * | |
413 | * | * | |
414 | * ..... * | |
415 | * | * | |
416 | * NIN IN v JVO = LQ(JVOLUM-IVO) {NIN>0} * | |
417 | * ........................................................ (**) * | |
418 | * | | | | | | |ishape| nin |numed|npar|natt|pars.|atts.|->dev * | |
419 | * ........................................................ * | |
420 | * | | | * | |
421 | * | | v JIN = LQ(JVO-IN) * | |
422 | * | | ....................................................... * | |
423 | * | | | | |-| ivo | nr |irot| x | y | z |konly|npar| pars.. | * | |
424 | * | | ....................................................... * | |
425 | * | | | * | |
426 | * | | v JNUP = LQ(JIN-1) option GSNEXT only * | |
427 | * | | ............................. * | |
428 | * | | | | nus | in(1) ... in(nus) | * | |
429 | * | | ............................. * | |
430 | * | | * | |
431 | * | v JNDW = LQ(JVO-NIN-1) JSB = LQ(JNDW) * | |
432 | * |............................ ............................. * | |
433 | * || | nin | in(1) .. in(nin) | --| |IAXIS | NSB | C1.. | * | |
434 | * |............................ ............................. * | |
435 | * | option GSORD only * | |
436 | * | * | |
437 | * | JSC0 = LQ(JVO-NIN-2) option GSORD only * | |
438 | * .............. * | |
439 | * | * | |
440 | * NSB-1 IDIV v NSB-1 * | |
441 | * ...................................... * | |
442 | * | | | | | NCONT1... | * | |
443 | * ...................................... * | |
444 | * | * | |
445 | * | JSCV = LQ(JSC0-IDIV) * | |
446 | * v NCONT * | |
447 | * ............................ * | |
448 | * | | IN1... | * | |
449 | * ............................ * | |
450 | * * | |
451 | * (*) * | |
452 | * Next of same type of JVOLUM filled in by routine GGNLEV/GGCLOS * | |
453 | * (**) * | |
454 | * Next of same type of JVO, for local development, filled in by * | |
455 | * GGDVLP/GGCLOS * | |
456 | * * | |
457 | ************************************************************************ | |
458 | #endif |