]> git.uio.no Git - u/mrichter/AliRoot.git/blob - STRUCT/AliALIFE.cxx
Helper class to write geometry in ALIFE format in parallel with Geant geometry defini...
[u/mrichter/AliRoot.git] / STRUCT / AliALIFE.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 /*
17 $Log$
18 */
19
20 #include <AliALIFE.h>
21
22 ClassImp(AliALIFE)
23
24     AliALIFE::AliALIFE(const char* file1, const char* file2)
25 {  
26 // Constructor
27     fNBodies = 0; 
28     fNVolumes= 0; 
29     fBodyFile   = file1;   // File for Fluka bodies
30     fVolumeFile = file2;
31     fFile1=fopen(fBodyFile,"w");
32     fFile2=fopen(fVolumeFile,"w");
33     BodyHeader();
34     VolumeHeader();
35     fDefaultVolume1 = "DEFAU1";
36     fDefaultVolume2 = "DEFAU2";    
37 }
38
39     AliALIFE::AliALIFE()
40 {
41 // Default constructor
42     fBodyFile   = "FlukaBody.inp";  
43     fVolumeFile = "FlukaVolume.inp";
44     fFile1=fopen(fBodyFile,"w");
45     fFile2=fopen(fVolumeFile,"w");
46     BodyHeader();
47     VolumeHeader();
48 }
49
50 void AliALIFE::BodyHeader()
51 {
52 // Write header for body definitions
53     fprintf(fFile1,"*\n");        
54     fprintf(fFile1,"GEOBEGIN                                                              COMBINAT\n");
55     fprintf(fFile1,"    0    0         AliRoot Generated\n");
56     fprintf(fFile1,"*\n");
57     fprintf(fFile1,"*== Body Definitions ================================================\n");
58     fprintf(fFile1,"*\n");
59                             
60 }
61
62
63 void AliALIFE::VolumeHeader()
64 {
65 // Write header for region (volume)  definitions
66     fprintf(fFile2,"REGIONS\n");
67     fprintf(fFile2,"*\n");
68     fprintf(fFile2,"*== Region Definitions =================================================\n");
69     fprintf(fFile2,"*\n");
70 }
71
72
73 void AliALIFE:: Cylinder(Float_t rmin, Float_t rmax, 
74                          Float_t zmin, Float_t zmax, 
75                          Float_t pos[3], 
76                          char* Material, char* Field, char* Cuts) 
77 {
78 // Simple cylinder
79 //
80 // Bodies
81 // ^^^^^^
82     char name1[5], name2[5], name3[5], name4[5];
83
84 //  outer radius
85     sprintf(name1, "R%4.4d", fNBodies++);
86     fprintf(fFile1,"%5s ZCC%10.3f%10.3f%10.3f\n",name1, pos[0], pos[1], rmax); // inner radius
87     sprintf(name2, "R%4.4d", fNBodies++);
88     fprintf(fFile1,"%5s ZCC%10.3f%10.3f%10.3f\n",name2, pos[0], pos[1], rmin); 
89 // z-max
90     sprintf(name3, "Z%4.4d", fNBodies++);
91     fprintf(fFile1,"%5s XYP%10.3f\n",name3, zmax); 
92 // z-min
93     sprintf(name4, "Z%4.4d", fNBodies++);
94     fprintf(fFile1,"%5s XYP%10.3f\n",name4, zmin); 
95 //
96 // Volumes
97 // ^^^^^^^
98
99     fprintf(fFile2,">%s:%s\n", Material, Field);
100     fprintf(fFile2,"EMFCUT=%s\n", Cuts);
101     fprintf(fFile2,"WW-FACTOR=%s\n", Cuts);
102     if (rmin >0) {
103         fprintf(fFile2,"+%s-%s+%s-%s\n", name1, name2, name3, name4);
104     } else {
105         fprintf(fFile2,"+%s+%s-%s\n", name1, name3, name4);
106     }
107     
108     fprintf(fFile2,"\n");    
109 }
110
111 void AliALIFE::OnionCylinder(Float_t* r, Int_t nr, Float_t zmin, Float_t zmax,
112                              Float_t pos[3], char** Materials, 
113                              char** Fields, char** Cuts) 
114 {
115 //
116 // Concentric cylinders
117 //
118
119 // Bodies
120 // ^^^^^^
121     char nameRin[6], nameRou[6], nameZin[6], nameZou[6];
122 // z-limits
123 // z-max
124     sprintf(nameZou, "Z%4.4d", fNBodies++);
125     nameZou[5]='\0';
126     
127     fprintf(fFile1,"%5s XYP%10.3f\n",nameZou, zmax); 
128 // z-min
129     sprintf(nameZin, "Z%4.4d", fNBodies++);
130     nameZin[5]='\0';
131     fprintf(fFile1,"%5s XYP%10.3f\n",nameZin, zmin); 
132
133 // inner radius
134     sprintf(nameRin, "R%4.4d", fNBodies++);
135     nameRin[5]='\0';
136     fprintf(fFile1,"%5s ZCC%10.3f%10.3f%10.3f\n",nameRin, pos[0], pos[1], r[0]); 
137
138     Int_t i;
139     for (i=1; i<nr; i++) {
140 //  outer radius
141         sprintf(nameRou, "R%4.4d", fNBodies++);
142         nameRou[5]='\0';
143         fprintf(fFile1,"%5s ZCC%10.3f%10.3f%10.3f\n",
144                 nameRou, pos[0], pos[1], r[i]);         
145 //
146 // Volumes
147 // ^^^^^^^
148         if (Fields && Cuts) {
149             fprintf(fFile2,">%s:%s\n", Materials[i-1], Fields[i-1]);
150             fprintf(fFile2,"EMFCUT=%s\n", Cuts[i-1]);
151             fprintf(fFile2,"WW-FACTOR=%s\n", Cuts[i-1]);
152         } else {
153             fprintf(fFile2,">%s:%s\n", Materials[i-1], "MF");
154             fprintf(fFile2,"EMFCUT=%s\n", "$UNSHIELDED");
155             fprintf(fFile2,"WW-FACTOR=%s\n", "$UNSHIELDED");
156         }
157         if (r[i-1] != 0.) {
158             fprintf(fFile2,"+%5s-%5s+%5s-%5s\n", nameZou, nameZin, nameRou, nameRin);
159         } else {
160             fprintf(fFile2,"+%5s-%5s+%5s\n", nameZou, nameZin, nameRou);
161         }
162         fprintf(fFile2,"\n");
163         nameRin=nameRou;
164     }
165 }
166
167
168 void AliALIFE::Cone(Float_t rmin1, Float_t rmin2, 
169                      Float_t rmax1, Float_t rmax2,
170                      Float_t zmin, Float_t zmax, 
171                      Float_t pos[3], 
172                      char* Material, char* Field, char* Cuts) 
173 {
174 // Simple cone 
175
176 //
177 // Bodies
178 // ^^^^^^
179     char nameCou[6], nameCin[6];
180     Float_t d, r1, r2;
181     char nameZin[6], nameZou[6];
182 // z-max
183     sprintf(nameZou, "Z%4.4d", fNBodies++);
184     fprintf(fFile1,"%5s XYP%10.3f\n",nameZou, zmax); 
185 // z-min
186     sprintf(nameZin, "Z%4.4d", fNBodies++);
187     fprintf(fFile1,"%5s XYP%10.3f\n",nameZin, zmin); 
188     
189 //  outer radius
190     d=zmax-zmin;
191     if (rmax1 >= 0. && rmax2 >= 0.) {
192         if (rmax1!=rmax2) {
193             if (rmax1 > rmax2) {
194                 pos[2]=zmin;
195                 r1=rmax1;
196                 r2=rmax2;
197             } else {
198                 d=-d;
199                 pos[2]=zmax;
200                 r1=rmax2;
201                 r2=rmax1;
202             }
203             sprintf(nameCou, "C%4.4d", fNBodies++);
204             fprintf(fFile1,"%5s TRC%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f\n",
205                     nameCou, pos[0], pos[1], pos[2], 0., 0., d); 
206             fprintf(fFile1,"         %10.3f%10.3f\n",r1,r2);
207         } else {
208             sprintf(nameCou, "C%4.4d", fNBodies++);
209             fprintf(fFile1,"%5s ZCC%10.3f%10.3f%10.3f\n",
210                     nameCou, pos[0], pos[1], rmax1); 
211         } 
212     }else {
213         strcpy(nameCou,fDefaultVolume1);
214     }
215
216     
217     
218 // inner radius
219     if (rmin1 >= 0. && rmin2 >= 0.) {
220         if (rmin1!=rmin2) {
221             if (rmin1 != 0 && rmin2 !=0) {
222                 d=zmax-zmin;
223                 if (rmin1 > rmin2) {
224                     pos[2]=zmin;
225                     r1=rmin1;
226                     r2=rmin2;
227                 } else {
228                     pos[2]=zmax;
229                     r1=rmin2;
230                     r2=rmin1;
231                     d=-d;
232                 }
233                 sprintf(nameCin, "C%4.4d", fNBodies++);
234                 fprintf(fFile1,"%5s TRC%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f\n",
235                         nameCin, pos[0], pos[1], pos[2], 0., 0., d); 
236                 fprintf(fFile1,"         %10.3f%10.3f\n",r1,r2);
237             } 
238         } else {
239             sprintf(nameCin, "C%4.4d", fNBodies++);
240             fprintf(fFile1,"%5s ZCC%10.3f%10.3f%10.3f\n",
241                     nameCin, pos[0], pos[1], rmin1); 
242         } 
243     }else {
244         strcpy(nameCin,fDefaultVolume2);
245     }
246
247
248
249 //
250 // Volumes
251 // ^^^^^^^
252     fprintf(fFile2,">%s:%s\n", Material, Field);
253     fprintf(fFile2,"EMFCUT=%s\n", Cuts);
254     fprintf(fFile2,"WW-FACTOR=%s\n", Cuts);
255     if (rmin1 != 0 && rmin2 !=0) {
256         fprintf(fFile2,"+%s-%s+%s-%s\n", nameCou, nameCin, nameZou, nameZin);
257     } else {
258         fprintf(fFile2,"+%s+%s-%s\n", nameCou, nameZou, nameZin);
259     }
260     fprintf(fFile2,"\n");        
261 }
262
263 void AliALIFE::OnionCone (Float_t* r1, Float_t* r2, Int_t nr, 
264                           Float_t zmin, Float_t zmax,
265                           Float_t pos[3], char** Materials, char** Fields,
266                           char** Cuts) 
267 {
268 // Concentric cones
269 //
270     char nameCin[6], nameCou[6], nameZin[6], nameZou[6];
271 //
272 // Bodies
273 // ^^^^^^
274     Float_t ri1, ri2, ro1, ro2, d;
275
276 // z-max
277     sprintf(nameZou, "Z%4.4d", fNBodies++);
278     fprintf(fFile1,"%5s XYP%10.3f\n",nameZou, zmax); 
279 // z-min
280     sprintf(nameZin, "Z%4.4d", fNBodies++);
281     fprintf(fFile1,"%5s XYP%10.3f\n",nameZin, zmin); 
282      
283 //  inner radius
284     d=zmax-zmin;
285     Bool_t hasInner=kFALSE;
286     Bool_t isCylinder=kFALSE;
287     if (r1[0]>=0 && r2[0]>=0) {
288         if (r1[0] != 0. &&  r2[0] !=0.) {
289             if (r1[0]!=r2[0]) {
290                 hasInner=kTRUE;
291                 if (r1[0] > r2[0]) {
292                     pos[2]=zmin;
293                     ri1=r1[0];
294                     ri2=r2[0];
295                 } else {
296                     d=-d;
297                     pos[2]=zmax;
298                     ri1=r2[0];
299                     ri2=r1[0];
300                 }
301                 sprintf(nameCin, "C%4.4d", fNBodies++);
302                 nameCin[5]='\0';
303                 fprintf(fFile1,"%5s TRC%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f\n",
304                         nameCin, pos[0], pos[1], pos[2], 0., 0., d); 
305                 fprintf(fFile1,"         %10.3f%10.3f\n",ri1,ri2);
306             } else {
307                 isCylinder=kTRUE;
308                 sprintf(nameCin, "C%4.4d", fNBodies++);
309                 nameCin[5]='\0';
310                 fprintf(fFile1,"%5s ZCC%10.3f%10.3f%10.3f\n",
311                         nameCin, pos[0], pos[1], r1[0]); 
312             }
313         }
314     } else {
315         strcpy(nameCin,fDefaultVolume1);
316     }
317     
318     
319     
320 // outer radius
321     Int_t i;
322     for (i=1; i<nr; i++) {
323         if (r1[i] >= 0. && r2[i] >=0) {
324             if (r1[i]!=r2[i]) {
325                 d=zmax-zmin;
326                 if (r1[i] > r2[i]) {
327                     pos[2]=zmin;
328                     ro1=r1[i];
329                     ro2=r2[i];
330                 } else {
331                     pos[2]=zmax;
332                     ro1=r2[i];
333                     ro2=r1[i];
334                     d=-d;
335                 }
336                 sprintf(nameCou, "C%4.4d", fNBodies++);
337                 nameCou[5]='\0';
338                 fprintf(fFile1,"%5s TRC%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f\n",
339                         nameCou, pos[0], pos[1], pos[2], 0., 0., d); 
340                 fprintf(fFile1,"         %10.3f%10.3f\n",ro1,ro2);
341             } else {
342                 isCylinder=kTRUE;
343                 sprintf(nameCou, "C%4.4d", fNBodies++);
344                 nameCou[5]='\0';
345                 fprintf(fFile1,"%5s ZCC%10.3f%10.3f%10.3f\n",
346                         nameCou, pos[0], pos[1], r1[i]); 
347             }
348         } else {
349             strcpy(nameCou,fDefaultVolume1);
350         }
351         
352 // Volumes
353 // ^^^^^^^
354         if (Fields && Cuts) {
355             fprintf(fFile2,">%s:%s\n", Materials[i-1], Fields[i-1]);
356             fprintf(fFile2,"EMFCUT=%s\n", Cuts[i-1]);
357             fprintf(fFile2,"WW-FACTOR=%s\n", Cuts[i-1]);
358         } else {
359             fprintf(fFile2,">%s:%s\n", Materials[i-1], "MF");
360             fprintf(fFile2,"EMFCUT=%s\n", "$UNSHIELDED");
361             fprintf(fFile2,"WW-FACTOR=%s\n", "$UNSHIELDED");
362         }
363         if (hasInner) {
364             fprintf(fFile2,"+%5s-%5s+%5s-%5s\n", 
365                     nameCou, nameCin, nameZou, nameZin);
366         } else {
367             fprintf(fFile2,"+%5s\n", nameCou);
368             hasInner=kTRUE;
369         }
370         fprintf(fFile2,"\n");        
371         nameCin=nameCou;
372     }
373 }
374
375
376 void AliALIFE::PolyCone(Float_t* rmin, Float_t* rmax, Float_t* z, 
377                         Int_t nz,
378                         Float_t pos[3], 
379                         char* Material, char* Field, char* Cuts) 
380 {
381 //
382 // Equivalent to the Geant3 PCON
383     Int_t i;
384     for (i=0; i<nz-1; i++) {
385 // skip (z_i = z_i+1)
386         if (z[i] == z[i+1]) continue;
387         Cone(rmin[i], rmin[i+1], rmax[i], rmax[i+1], z[i], z[i+1], pos,
388              Material, Field, Cuts);
389     }
390 }
391
392 void AliALIFE::OnionPolyCone(Float_t** r, Float_t* z,
393                              Int_t nr, Int_t nz,
394                              Float_t pos[3], 
395                              char** Materials, char** Fields=0, char** Cuts)
396 {
397 //
398 // Concentric PCONS
399     Int_t i, j;
400     for (i=0; i<nz-1; i++) {
401 // skip (z_i = z_i+1)
402         if (z[i] == z[i+1]) continue;
403         for (j=0; j<nr-1; j++) {
404             if (Fields && Cuts) {
405                 Cone(r[i][j], r[i+1][j], r[i][j+1], r[i+1][j+1], 
406                      z[i], z[i+1], pos,
407                      Materials[i], Fields[i], Cuts[i]);
408             } else {
409                 Cone(r[i][j], r[i+1][j], r[i][j+1], r[i+1][j+1], 
410                      z[i], z[i+1], pos,
411                      Materials[i]);
412             }
413         }
414     }
415 }
416
417 void AliALIFE::Comment(char* Comment)
418 {
419 // Insert comment line
420     fprintf(fFile1,"*%s\n", Comment);        
421     fprintf(fFile2,"*%s\n", Comment);        
422 }
423
424
425 void AliALIFE::Finish()
426 {
427 // Finish geometry definition
428     char s[BUFSIZ];
429     fprintf(fFile1,"      END\n");
430     fclose(fFile2);
431     fFile2=fopen(fVolumeFile,"r");
432     while (fgets(s, BUFSIZ, fFile2)) {
433         fputs(s,fFile1);
434     }
435     
436     fclose(fFile1);
437     fclose(fFile2);    
438 }
439
440
441
442
443
444
445
446
447
448
449