New ITS geometry. Only a Skeleton for now.
[u/mrichter/AliRoot.git] / ITS / AliITSv11.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 $Id$
19 */
20
21 //////////////////////////////////////////////////////////////////////////////
22 //                                                                          //
23 //  Inner Traking System version 11                                         //
24 //  This class contains the base procedures for the Inner Tracking System   //
25 //                                                                          //
26 // Authors: R. Barbera                                                      //
27 // version 6.                                                               //
28 // Created  2000.                                                           //
29 //                                                                          //
30 //  NOTE: THIS IS THE  SYMMETRIC PPR geometry of the ITS.                   //
31 // THIS WILL NOT WORK                                                       //
32 // with the geometry or module classes or any analysis classes. You are     //
33 // strongly encouraged to uses AliITSv5.                                    //
34 //                                                                          //
35 //////////////////////////////////////////////////////////////////////////////
36 // See AliITSv11::StepManager().
37 #include <Riostream.h>
38 #include <stdio.h>
39 #include <stdlib.h>
40 #include <TMath.h>
41 #include <TGeometry.h>
42 #include <TNode.h>
43 #include <TTUBE.h>
44 #include <TTUBS.h>
45 #include <TPCON.h>
46 #include <TFile.h>    // only required for Tracking function?
47 #include <TCanvas.h>
48 #include <TObjArray.h>
49 #include <TLorentzVector.h>
50 #include <TObjString.h>
51 #include <TClonesArray.h>
52 #include <TBRIK.h>
53 #include <TSystem.h>
54
55
56 #include "AliRun.h"
57 #include "AliMagF.h"
58 #include "AliConst.h"
59 #include "AliITSGeant3Geometry.h"
60 #include "AliITShit.h"
61 #include "AliITS.h"
62 #include "AliITSv11.h"
63 #include "AliITSgeom.h"
64 #include "AliITSgeomSPD.h"
65 #include "AliITSgeomSDD.h"
66 #include "AliITSgeomSSD.h"
67 #include "AliITSDetType.h"
68 #include "AliITSresponseSPD.h"
69 #include "AliITSresponseSDD.h"
70 #include "AliITSresponseSSD.h"
71 #include "AliITSsegmentationSPD.h"
72 #include "AliITSsegmentationSDD.h"
73 #include "AliITSsegmentationSSD.h"
74 #include "AliITSsimulationSPD.h"
75 #include "AliITSsimulationSDD.h"
76 #include "AliITSsimulationSSD.h"
77 #include "AliITSClusterFinderSPD.h"
78 #include "AliITSClusterFinderSDD.h"
79 #include "AliITSClusterFinderSSD.h"
80
81
82 ClassImp(AliITSv11)
83
84 //______________________________________________________________________
85 AliITSv11::AliITSv11() : AliITS() {
86 ////////////////////////////////////////////////////////////////////////
87 //    Standard default constructor for the ITS version 11.
88 ////////////////////////////////////////////////////////////////////////
89 }
90 //______________________________________________________________________
91 AliITSv11::AliITSv11(const char *title) : AliITS("ITS", title){
92 ////////////////////////////////////////////////////////////////////////
93 //    Standard constructor for the ITS version 11.
94 ////////////////////////////////////////////////////////////////////////
95 }
96 //______________________________________________________________________
97 AliITSv11::~AliITSv11() {
98 ////////////////////////////////////////////////////////////////////////
99 //    Standard destructor for the ITS version 11.
100 ////////////////////////////////////////////////////////////////////////
101 }
102 //______________________________________________________________________
103 void AliITSv11::Box(const char gnam[3],const TString &dis,
104                     Double_t dx,Double_t dy,Double_t dz,Int_t med){
105     // Interface to TMC->Gsvolu() for ITS bos geometries. Box with faces
106     // perpendicular to the axes. It has 3 paramters. See SetScale() for
107     // units. Default units are geant 3 [cm].
108     // Inputs:
109     //    const char gnam[3]  3 character geant volume name. The letter "I"
110     //                        is appended to the front to indecate that this
111     //                        is an ITS volume.
112     //    TString &dis        String containging part discription.
113     //    Double_t dx         half-length of box in x-axis
114     //    Double_t dy         half-length of box in y-axis
115     //    Double_t dz         half-length of box in z-axis
116     //    Int_t    med        media index number.
117     // Output:
118     //    none.
119     // Return.
120     //    none.
121     char name[4];
122     Float_t param[3];
123
124     param[0] = fScale*dx;
125     param[1] = fScale*dy;
126     param[2] = fScale*dz;
127     name[0] = 'I';
128     for(Int_t i=0;i<3;i++) name[i+1] = gnam[i];
129     gMC->Gsvolu(name,"BOX ",fidmed[med],param,3);
130 }
131 //______________________________________________________________________
132 void AliITSv11::Trapezoid1(const char gnam[3],const TString &dis,
133                            Double_t dxn,Double_t dxp,Double_t dy,Double_t dz,
134                            Int_t med){
135     // Interface to TMC->Gsvolu() for ITS TRD1 geometries. Trapezoid with the 
136     // x dimension varing along z. It has 4 parameters. See SetScale() for
137     // units. Default units are geant 3 [cm].
138     // Inputs:
139     //    const char gnam[3]  3 character geant volume name. The letter "I"
140     //                        is appended to the front to indecate that this
141     //                        is an ITS volume.
142     //    TString &dis        String containging part discription.
143     //    Double_t dxn        half-length along x at the z surface positioned 
144     //                        at -DZ
145     //    Double_t dxp        half-length along x at the z surface positioned 
146     //                        at +DZ
147     //    Double_t dy         half-length along the y-axis
148     //    Double_t dz         half-length along the z-axis
149     //    Int_t    med        media index number.
150     // Output:
151     //    none.
152     // Return.
153     //    none.
154     char name[4];
155     Float_t param[4];
156
157     param[0] = fScale*dxn;
158     param[1] = fScale*dxp;
159     param[2] = fScale*dy;
160     param[3] = fScale*dz;
161     name[0] = 'I';
162     for(Int_t i=0;i<3;i++) name[i+1] = gnam[i];
163     gMC->Gsvolu(name,"TRD1",fidmed[med],param,4);
164 }
165 //______________________________________________________________________
166 void AliITSv11::Trapezoid2(const char gnam[3],const TString &dis,Double_t dxn,
167                            Double_t dxp,Double_t dyn,Double_t dyp,Double_t dz,
168                            Int_t med){
169     // Interface to TMC->Gsvolu() for ITS TRD2 geometries. Trapezoid with the 
170     // x and y dimension varing along z. It has 5 parameters. See SetScale() 
171     // for units. Default units are geant 3 [cm].
172     // Inputs:
173     //    const char gnam[3]  3 character geant volume name. The letter "I"
174     //                        is appended to the front to indecate that this
175     //                        is an ITS volume.
176     //    TString &dis        String containging part discription.
177     //    Double_t dxn        half-length along x at the z surface positioned 
178     //                        at -DZ
179     //    Double_t dxp        half-length along x at the z surface positioned 
180     //                        at +DZ
181     //    Double_t dyn        half-length along x at the z surface positioned 
182     //                        at -DZ
183     //    Double_t dyp        half-length along x at the z surface positioned 
184     //                        at +DZ
185     //    Double_t dz         half-length along the z-axis
186     //    Int_t    med        media index number.
187     // Output:
188     //    none.
189     // Return.
190     //    none.
191     char name[4];
192     Float_t param[5];
193
194     param[0] = fScale*dxn;
195     param[1] = fScale*dxp;
196     param[2] = fScale*dyn;
197     param[3] = fScale*dyp;
198     param[4] = fScale*dz;
199     name[0] = 'I';
200     for(Int_t i=0;i<3;i++) name[i+1] = gnam[i];
201     gMC->Gsvolu(name,"TRD2",fidmed[med],param,5);
202 }
203 //______________________________________________________________________
204 void AliITSv11::Trapezoid(const char gnam[3],const TString &dis,Double_t dz,
205                           Double_t thet,Double_t phi,Double_t h1,Double_t bl1,
206                           Double_t tl1,Double_t alp1,Double_t h2,Double_t bl2,
207                           Double_t tl2,Double_t alp2,Int_t med){
208     // Interface to TMC->Gsvolu() for ITS TRAP geometries. General Trapezoid, 
209     // The faces perpendicular to z are trapezia and their centers are not 
210     // necessarily on a line parallel to the z axis. This shape has 11 
211     // parameters, but only cosidering that the faces should be planar, only 9 
212     // are really independent. A check is performed on the user parameters and 
213     // a message is printed in case of non-planar faces. Ignoring this warning 
214     // may cause unpredictable effects at tracking time. See SetScale() 
215     // for units. Default units are geant 3 [cm].
216     // Inputs:
217     //    const char gnam[3]  3 character geant volume name. The letter "I"
218     //                        is appended to the front to indecate that this
219     //                        is an ITS volume.
220     //    TString &dis        String containging part discription.
221     //    Double_t dz         Half-length along the z-asix
222     //    Double_t thet       Polar angle of the line joing the center of the 
223     //                        face at -dz to the center of the one at dz 
224     //                        [degree].
225     //    Double_t phi        aximuthal angle of the line joing the center of 
226     //                        the face at -dz to the center of the one at +dz 
227     //                        [degree].
228     //    Double_t h1         half-length along y of the face at -dz.
229     //    Double_t bl1        half-length along x of the side at -h1 in y of 
230     //                        the face at -dz in z.
231     //    Double_t tl1        half-length along x of teh side at +h1 in y of 
232     //                        the face at -dz in z.
233     //    Double_t alp1       angle with respect to the y axis from the center 
234     //                        of the side at -h1 in y to the cetner of the 
235     //                        side at +h1 in y of the face at -dz in z 
236     //                        [degree].
237     //    Double_t h2         half-length along y of the face at +dz
238     //    Double_t bl2        half-length along x of the side at -h2 in y of
239     //                        the face at +dz in z.
240     //    Double_t tl2        half-length along x of the side at _h2 in y of 
241     //                        the face at +dz in z.
242     //    Double_t alp2       angle with respect to the y axis from the center 
243     //                        of the side at -h2 in y to the center of the 
244     //                        side at +h2 in y of the face at +dz in z 
245     //                        [degree].
246     //    Int_t    med        media index number.
247     // Output:
248     //    none.
249     // Return.
250     //    none.
251     char name[4];
252     Float_t param[11];
253
254     param[0] = fScale*dz;
255     param[1] = thet;
256     param[2] = phi;
257     param[3] = fScale*h1;
258     param[4] = fScale*bl1;
259     param[5] = fScale*tl1;
260     param[6] = alp1;
261     param[7] = fScale*h2;
262     param[8] = fScale*bl2;
263     param[9] = fScale*tl2;
264     param[10] = alp2;
265     name[0] = 'I';
266     for(Int_t i=0;i<3;i++) name[i+1] = gnam[i];
267     gMC->Gsvolu(name,"TRAP",fidmed[med],param,11);
268 }
269 //______________________________________________________________________
270 void AliITSv11::Tube(const char gnam[3],const TString &dis,Double_t rmin,
271                      Double_t rmax,Double_t dz,Int_t med){
272     // Interface to TMC->Gsvolu() for ITS TUBE geometries. Simple Tube. It has
273     // 3 parameters. See SetScale() 
274     // for units. Default units are geant 3 [cm].
275     // Inputs:
276     //    const char gnam[3]  3 character geant volume name. The letter "I"
277     //                        is appended to the front to indecate that this
278     //                        is an ITS volume.
279     //    TString &dis        String containging part discription.
280     //    Double_t rmin       Inside Radius.
281     //    Double_t rmax       Outside Radius.
282     //    Double_t dz         half-length along the z-axis
283     //    Int_t    med        media index number.
284     // Output:
285     //    none.
286     // Return.
287     //    none.
288     char name[4];
289     Float_t param[3];
290
291     param[0] = fScale*rmin;
292     param[1] = fScale*rmax;
293     param[2] = fScale*dz;
294     name[0] = 'I';
295     for(Int_t i=0;i<3;i++) name[i+1] = gnam[i];
296     gMC->Gsvolu(name,"TUBE",fidmed[med],param,3);
297 }
298 //______________________________________________________________________
299 void AliITSv11::TubeSegment(const char gnam[3],const TString &dis,
300                             Double_t rmin,Double_t rmax,Double_t dz,
301                             Double_t phi1,Double_t phi2,Int_t med){
302     // Interface to TMC->Gsvolu() for ITS TUBE geometries. Phi segment of a 
303     // tube. It has 5  parameters. Phi1 should be smaller than phi2. If this is
304     // not the case, the system adds 360 degrees to phi2. See SetScale() 
305     // for units. Default units are geant 3 [cm].
306     // Inputs:
307     //    const char gnam[3]  3 character geant volume name. The letter "I"
308     //                        is appended to the front to indecate that this
309     //                        is an ITS volume.
310     //    TString &dis        String containging part discription.
311     //    Double_t rmin       Inside Radius.
312     //    Double_t rmax       Outside Radius.
313     //    Double_t dz         half-length along the z-axis
314     //    Double_t phi1       Starting angle of the segment [degree].
315     //    Double_t phi2       Ending angle of the segment [degree].
316     //    Int_t    med        media index number.
317     // Output:
318     //    none.
319     // Return.
320     //    none.
321     char name[4];
322     Float_t param[5];
323
324     param[0] = fScale*rmin;
325     param[1] = fScale*rmax;
326     param[2] = fScale*dz;
327     param[3] = phi1;
328     param[4] = phi2;
329     name[0] = 'I';
330     for(Int_t i=0;i<3;i++) name[i+1] = gnam[i];
331     gMC->Gsvolu(name,"TUBS",fidmed[med],param,5);
332 }
333 //______________________________________________________________________
334 void AliITSv11::Cone(const char gnam[3],const TString &dis,Double_t dz,
335                      Double_t rmin1,Double_t rmax1,Double_t rmin2,
336                      Double_t rmax2,Int_t med){
337     // Interface to TMC->Gsvolu() for ITS Cone geometries. Conical tube. It 
338     // has 5 parameters. See SetScale() 
339     // for units. Default units are geant 3 [cm].
340     // Inputs:
341     //    const char gnam[3]  3 character geant volume name. The letter "I"
342     //                        is appended to the front to indecate that this
343     //                        is an ITS volume.
344     //    TString &dis        String containging part discription.
345     //    Double_t dz         half-length along the z-axis
346     //    Double_t rmin1      Inside Radius at -dz.
347     //    Double_t rmax1      Outside Radius at -dz.
348     //    Double_t rmin2      inside radius at +dz.
349     //    Double_t rmax2      outside radius at +dz.
350     //    Int_t    med        media index number.
351     // Output:
352     //    none.
353     // Return.
354     //    none.
355     char name[4];
356     Float_t param[5];
357
358     param[0] = fScale*dz;
359     param[1] = fScale*rmin1;
360     param[2] = fScale*rmax1;
361     param[3] = fScale*rmin2;
362     param[4] = fScale*rmax2;
363     name[0] = 'I';
364     for(Int_t i=0;i<3;i++) name[i+1] = gnam[i];
365     gMC->Gsvolu(name,"CONS",fidmed[med],param,5);
366 }
367 //______________________________________________________________________
368 void AliITSv11::ConeSegment(const char gnam[3],const TString &dis,Double_t dz,
369                             Double_t rmin1,Double_t rmax1,Double_t rmin2,
370                             Double_t rmax2,Double_t phi1,Double_t phi2,
371                             Int_t med){
372     // Interface to TMC->Gsvolu() for ITS ConS geometries. One segment of a 
373     // conical tube. It has 7 parameters. Phi1 should be smaller than phi2. If 
374     // this is not the case, the system adds 360 degrees to phi2. See 
375     // SetScale() for units. Default units are geant 3 [cm].
376     // Inputs:
377     //    const char gnam[3]  3 character geant volume name. The letter "I"
378     //                        is appended to the front to indecate that this
379     //                        is an ITS volume.
380     //    TString &dis        String containging part discription.
381     //    Double_t dz         half-length along the z-axis
382     //    Double_t rmin1      Inside Radius at -dz.
383     //    Double_t rmax1      Outside Radius at -dz.
384     //    Double_t rmin2      inside radius at +dz.
385     //    Double_t rmax2      outside radius at +dz.
386     //    Double_t phi1       Starting angle of the segment [degree].
387     //    Double_t phi2       Ending angle of the segment [degree].
388     //    Int_t    med        media index number.
389     // Output:
390     //    none.
391     // Return.
392     //    none.
393     char name[4];
394     Float_t param[7];
395
396     param[0] = fScale*dz;
397     param[1] = fScale*rmin1;
398     param[2] = fScale*rmax1;
399     param[3] = fScale*rmin2;
400     param[4] = fScale*rmax2;
401     param[5] = phi1;
402     param[6] = phi2;
403     name[0] = 'I';
404     for(Int_t i=0;i<3;i++) name[i+1] = gnam[i];
405     gMC->Gsvolu(name,"CONS",fidmed[med],param,7);
406 }
407 //______________________________________________________________________
408 void AliITSv11::Sphere(const char gnam[3],const TString &dis,Double_t rmin,
409                        Double_t rmax,Double_t the1,Double_t the2,Double_t phi1,
410                        Double_t phi2,Int_t med){
411     // Interface to TMC->Gsvolu() for ITS SPHE geometries. Segment of a 
412     // sphereical shell. It has 6 parameters. See SetScale() 
413     // for units. Default units are geant 3 [cm].
414     // Inputs:
415     //    const char gnam[3]  3 character geant volume name. The letter "I"
416     //                        is appended to the front to indecate that this
417     //                        is an ITS volume.
418     //    TString &dis        String containging part discription.
419     //    Double_t rmin       Inside Radius.
420     //    Double_t rmax       Outside Radius.
421     //    Double_t the1       staring polar angle of the shell [degree].
422     //    Double_t the2       ending polar angle of the shell [degree].
423     //    Double_t phui       staring asimuthal angle of the shell [degree].
424     //    Double_t phi2       ending asimuthal angle of the shell [degree].
425     //    Int_t    med        media index number.
426     // Output:
427     //    none.
428     // Return.
429     //    none.
430     char name[4];
431     Float_t param[6];
432
433     param[0] = fScale*rmin;
434     param[1] = fScale*rmax;
435     param[2] = the1;
436     param[3] = the2;
437     param[4] = phi1;
438     param[5] = phi2;
439     name[0] = 'I';
440     for(Int_t i=0;i<3;i++) name[i+1] = gnam[i];
441     gMC->Gsvolu(name,"SPHE",fidmed[med],param,6);
442 }
443 //______________________________________________________________________
444 void AliITSv11::Parallelepiped(const char gnam[3],const TString &dis,
445                                Double_t dx,Double_t dy,Double_t dz,
446                                Double_t alph,Double_t thet,Double_t phi,
447                                Int_t med){
448     // Interface to TMC->Gsvolu() for ITS PARA geometries. Parallelepiped. It 
449     // has 6 parameters. See SetScale() for units. Default units are geant 3 
450     // [cm].
451     // Inputs:
452     //    const char gnam[3]  3 character geant volume name. The letter "I"
453     //                        is appended to the front to indecate that this
454     //                        is an ITS volume.
455     //    TString &dis        String containging part discription.
456     //    Double_t dx         half-length allong x-axis
457     //    Double_t dy         half-length allong y-axis
458     //    Double_t dz         half-length allong z-axis
459     //    Double_t alpha      angle formed by the y axis and by the plane 
460     //                        joining the center of teh faces parallel to the 
461     //                        z-x plane at -dY and +dy [degree].
462     //    Double_t thet       polar angle of the line joining the centers of 
463     //                        the faces at -dz and +dz in z [degree].
464     //    Double_t phi        azimuthal angle of teh line joing the centers of 
465     //                        the faaces at -dz and +dz in z [degree].
466     //    Int_t    med        media index number.
467     // Output:
468     //    none.
469     // Return.
470     //    none.
471     char name[4];
472     Float_t param[6];
473
474     param[0] = fScale*dx;
475     param[1] = fScale*dy;
476     param[2] = fScale*dz;
477     param[3] = alpha;
478     param[4] = thet;
479     param[5] = phi;
480     name[0] = 'I';
481     for(Int_t i=0;i<3;i++) name[i+1] = gnam[i];
482     gMC->Gsvolu(name,"PARA",fidmed[med],param,6);
483 }
484 //______________________________________________________________________
485 void AliITSv11::Polygon(const char gnam[3],const TString &dis,Double_t phi1,
486                         Double_t dphi,Int_t npdv,Int_t nz,Double_t *z,
487                         Double_t *rmin,Double_t *rmax,Double_t ,Int_t med){
488     // Interface to TMC->Gsvolu() for ITS PGON geometry. Polygon It has 10 
489     // parameters or more. See SetScale() for units. Default units are geant 3 
490     // [cm].
491     // Inputs:
492     //    const char gnam[3]  3 character geant volume name. The letter "I"
493     //                        is appended to the front to indecate that this
494     //                        is an ITS volume.
495     //    TString &dis        String containging part discription.
496     //    Double_t phi1       the azimuthal angle at which the volume begins 
497     //                        (angles are counted clouterclockwise) [degrees].
498     //    Double_t dphi       opening angle of the volume, which extends from 
499     //                        phi1 to phi1+dphi [degree].
500     //    Int_t npdv          the number of sides of teh cross section between 
501     //                        the given phi limits.
502     //    Int_t nz            number of planes perpendicular to the z axis 
503     //                        where the dimension of the section is given - 
504     //                        this number should be at least 2 and NP triples 
505     //                        of number must follow.
506     //    Double_t *z         array [nz] of z coordiates of the sections..
507     //    Double_t *rmin      array [nz] of radius of teh circle tangent to 
508     //                        the sides of the inner polygon in teh 
509     //                        cross-section.
510     //    Double_t *rmax      array [nz] of radius of the circle tangent to 
511     //                        the sides of the outer polygon in the 
512     //                       cross-section.
513     //    Int_t    med        media index number.
514     // Output:
515     //    none.
516     // Return.
517     //    none.
518     char name[4];
519     Float_t *param;
520     Int_t n,i;
521
522     n = 4+3*nz;
523     param = new Float_t[n]
524     param[0] = phi1;
525     param[1] = dphi;
526     param[2] = (Float_t)npdv;
527     param[3] = (Float_t)nz;
528     for(i=0;i<nz;i++){
529         param[4+3*i] = z[i];
530         param[5+3*i] = rmin[i];
531         param[6+3*i] = rmax[i];
532     } // end for i
533     name[0] = 'I';
534     for(i=0;i<3;i++) name[i+1] = gnam[i];
535     gMC->Gsvolu(name,"PGON",fidmed[med],param,n);
536
537     delete[] param;
538 }
539 //______________________________________________________________________
540 void AliITSv11::PolyCone(const char gnam[3],const TString &dis,Double_t phi1,
541                          Double_t dphi,Int_t nz,Double_t *z,Double_t *rmin,
542                          Double_t *rmax,Int_t med){
543     // Interface to TMC->Gsvolu() for ITS PCON geometry. Poly-cone It has 9 
544     // parameters or more. See SetScale() for units. Default units are geant 3 
545     // [cm].
546     // Inputs:
547     //    const char gnam[3]  3 character geant volume name. The letter "I"
548     //                        is appended to the front to indecate that this
549     //                        is an ITS volume.
550     //    TString &dis        String containging part discription.
551     //    Double_t phi1       the azimuthal angle at which the volume begins 
552     //                        (angles are counted clouterclockwise) [degrees].
553     //    Double_t dphi       opening angle of the volume, which extends from 
554     //                        phi1 to phi1+dphi [degree].
555     //    Int_t nz            number of planes perpendicular to the z axis 
556     //                        where the dimension of the section is given - 
557     //                        this number should be at least 2 and NP triples 
558     //                        of number must follow.
559     //    Double_t *z         Array [nz] of z coordinate of the section.
560     //    Double_t *rmin      Array [nz] of radius of teh inner circle in the 
561     //                        cross-section.
562     //    Double_t *rmax      Array [nz] of radius of the outer circle in the 
563     //                        cross-section.
564     //    Int_t    med        media index number.
565     // Output:
566     //    none.
567     // Return.
568     //    none.
569     char name[4];
570     Float_t *param;
571     Int_t n,i;
572
573     n = 3+3*nz;
574     param = new Float_t[n];
575     param[0] = phi1;
576     param[1] = dphi;
577     param[2] = (Float_t) nz;
578     for(i=0;i<nz;i++){
579         param[3+3*i] = z[i];
580         param[4+3*i] = rmin[i];
581         param[5+3*i] = rmax[i];
582     } // end for i
583     name[0] = 'I';
584     for(i=0;i<3;i++) name[i+1] = gnam[i];
585     gMC->Gsvolu(name,"PCON",fidmed[med],param,n);
586
587     delete[] param;
588 }
589 //______________________________________________________________________
590 void AliITSv11::TubeElliptical(const char gnam[3],const TString &dis,
591                                Double_t p1,Double_t p2,Double_t dz,Int_t med){
592     // Interface to TMC->Gsvolu() for ITS ELTU geometries. Elliptical 
593     // cross-section Tube. It has 3 parameters. See SetScale() 
594     // for units. Default units are geant 3 [cm]. The equation of the surface 
595     // is x^2 * p1^-2 + y^2 * p2^-2 = 1.
596     // Inputs:
597     //    const char gnam[3]  3 character geant volume name. The letter "I"
598     //                        is appended to the front to indecate that this
599     //                        is an ITS volume.
600     //    TString &dis        String containging part discription.
601     //    Double_t p1         semi-axis of the elipse along x.
602     //    Double_t p2         semi-axis of the elipse along y.
603     //    Double_t dz         half-length along the z-axis
604     //    Int_t    med        media index number.
605     // Output:
606     //    none.
607     // Return.
608     //    none.
609     char name[4];
610     Float_t param[3];
611
612     param[0] = fScale*p1;
613     param[1] = fScale*p2;
614     param[2] = fScale*dz;
615     name[0] = 'I';
616     for(Int_t i=0;i<3;i++) name[i+1] = gnam[i];
617     gMC->Gsvolu(name,"ELTU",fidmed[med],param,3);
618 }
619 //______________________________________________________________________
620 void AliITSv11::HyperbolicTube(const char gnam[3],const TString &dis,
621                                Double_t rmin,Double_t rmax,Double_t dz,
622                                Double_t thet,Int_t med){
623     // Interface to TMC->Gsvolu() for ITS HYPE geometries. Hyperbolic tube. 
624     // Fore example the inner and outer surfaces are hyperboloids, as would be 
625     // foumed by a system of cylinderical wires which were then rotated 
626     // tangentially about their centers. It has 4 parameters. See SetScale() 
627     // for units. Default units are geant 3 [cm]. The hyperbolic surfaces are 
628     // given by r^2 = (ztan(thet)^2 + r(z=0)^2.
629     // Inputs:
630     //    const char gnam[3]  3 character geant volume name. The letter "I"
631     //                        is appended to the front to indecate that this
632     //                        is an ITS volume.
633     //    TString &dis        String containging part discription.
634     //    Double_t rmin       Inner radius at z=0 where tube is narrowest.
635     //    Double_t rmax       Outer radius at z=0 where tube is narrowest.
636     //    Double_t dz         half-length along the z-axis
637     //    Double_t thet       stero angel of rotation of the two faces 
638     //                       [degrees].
639     //    Int_t    med        media index number.
640     // Output:
641     //    none.
642     // Return.
643     //    none.
644     char name[4];
645     Float_t param[4];
646
647     param[0] = fScale*rmin;
648     param[1] = fScale*rmax;
649     param[2] = fScale*dz;
650     param[3] = thet;
651     name[0] = 'I';
652     for(Int_t i=0;i<3;i++) name[i+1] = gnam[i];
653     gMC->Gsvolu(name,"HYPE",fidmed[med],param,4);
654 }
655 //______________________________________________________________________
656 void AliITSv11::TwistedTrapezoid(const char gnam[3],const TString &dis,
657                                  Double_t dz,Double_t thet,Double_t phi,
658                                  Double_t twist,Double_t h1,Double_t bl1,
659                                  Double_t tl1,Double_t apl1,Double_t h2,
660                                  Double_t bl2,Double_t tl2,Double_t apl2,
661                                  Int_t med){
662     // Interface to TMC->Gsvolu() for ITS GTRA geometries. General twisted 
663     // trapazoid. The faces perpendicular to z are trapazia and their centers 
664     // are not necessarily on a line parallel to the z axis as the TRAP. 
665     // Additionally, the faces may be twisted so that none of their edges are 
666     // parallel. It is a TRAP shape, exept that it is twisted in the x-y plane 
667     // as a function of z. The parallel sides perpendicular to the x axis are 
668     // rotated with respect to the x axis by an angle TWIST, which is one of 
669     // the parameters. The shape is defined by the eight corners and is assumed
670     // to be constructed of straight lines joingin points on the boundry of the
671     // trapezoidal face at Z=-dz to the coresponding points on the face at 
672     // z=+dz. Divisions are not allowed. It has 12 parameters. See SetScale() 
673     // for units. Default units are geant 3 [cm]. Note: This shape suffers from
674     // the same limitations than the TRAP. The tracking routines assume that 
675     // the faces are planar, but htis constraint is not easily expressed in 
676     // terms of the 12 parameters. Additionally, no check on th efaces is 
677     // performed in this case. Users should avoid to use this shape as much as 
678     // possible, and if they have to do so, they should make sure that the 
679     // faces are really planes. If this is not the case, the result of the 
680     // trasport is unpredictable. To accelerat ethe computations necessary for 
681     // trasport, 18 additioanl parameters are calculated for this shape are
682     // 1 DXODZ dx/dz of the line joing the centers of the faces at z=+_dz.
683     // 2 DYODZ dy/dz of the line joing the centers of the faces at z=+_dz.
684     // 3 XO1    x at z=0 for line joing the + on parallel side, perpendicular 
685     //          corners at z=+_dz.
686     // 4 YO1    y at z=0 for line joing the + on parallel side, + on 
687     //          perpendicular corners at z=+-dz.
688     // 5 DXDZ1  dx/dz for line joing the + on parallel side, + on 
689     //          perpendicular corners at z=+-dz.
690     // 6 DYDZ1  dy/dz for line joing the + on parallel side, + on 
691     //          perpendicular corners at z=+-dz.
692     // 7 X02    x at z=0 for line joing the - on parallel side, + on 
693     //          perpendicular corners at z=+-dz.
694     // 8 YO2    y at z=0 for line joing the - on parallel side, + on 
695     //          perpendicular corners at z=+-dz.
696     // 9 DXDZ2  dx/dz for line joing the - on parallel side, + on 
697     //          perpendicular corners at z=+-dz.
698     // 10 DYDZ2dy/dz for line joing the - on parallel side, + on 
699     //          perpendicular corners at z=+-dz.
700     // 11 XO3   x at z=0 for line joing the - on parallel side, - on 
701     //          perpendicular corners at z=+-dz.
702     // 12 YO3   y at z=0 for line joing the - on parallel side, - on 
703     //          perpendicular corners at z=+-dz.
704     // 13 DXDZ3 dx/dzfor line joing the - on parallel side, - on 
705     //          perpendicular corners at z=+-dz.
706     // 14 DYDZ3 dydz for line joing the - on parallel side, - on 
707     //          perpendicular corners at z=+-dz.
708     // 15 XO4   x at z=0 for line joing the + on parallel side, - on 
709     //          perpendicular corners at z=+-dz.
710     // 16 YO4   y at z=0 for line joing the + on parallel side, - on 
711     //          perpendicular corners at z=+-dz.
712     // 17 DXDZ4 dx/dz for line joing the + on parallel side, - on 
713     //          perpendicular corners at z=+-dz.
714     // 18 DYDZ4 dydz for line joing the + on parallel side, - on 
715     //          perpendicular corners at z=+-dz.
716     // Inputs:
717     //    const char gnam[3]  3 character geant volume name. The letter "I"
718     //                        is appended to the front to indecate that this
719     //                        is an ITS volume.
720     //    TString &dis        String containging part discription.
721     //    Double_t dz         half-length along the z axis.
722     //    Double_t thet       polar angle of the line joing the center of the 
723     //                        face at -dz to the center of the one at +dz 
724     //                        [degrees].
725     //    Double_t phi        Azymuthal angle of teh line joing the centre of 
726     //                        the face at -dz to the center of the one at +dz 
727     //                        [degrees].
728     //    Double_t twist      Twist angle of the faces parallel to the x-y 
729     //                        plane at z=+-dz around an axis parallel to z 
730     //                        passing through their centre [degrees].
731     //    Double_t h1         Half-length along y of the face at -dz.
732     //    Double_t bl1        half-length along x of the side -h1 in y of the 
733     //                        face at -dz in z.
734     //    Double_t tl1        half-length along x of the side at +h1 in y of 
735     //                        the face at -dz in z.
736     //    Double_t apl1       Angle with respect to the y ais from the center 
737     //                        of the side at -h1 in y to the centere of the 
738     //                        side at +h1 in y of the face at -dz in z 
739     //                        [degrees].
740     //    Double_t h2         half-length along the face at +dz.
741     //    Double_t bl2        half-length along x of the side at -h2 in y of 
742     //                        the face at -dz in z.
743     //    Double_t tl2        half-length along x of the side at +h2 in y of 
744     //                        the face at +dz in z.
745     //    Double_t apl2       angle with respect to the y axis from the center 
746     //                        of the side at -h2 in y to the center of the side
747     //                        at +h2 in y of the face at +dz in z [degrees].
748     //    Int_t    med        media index number.
749     // Output:
750     //    none.
751     // Return.
752     //    none.
753     char name[4];
754     Float_t param[12];
755
756     param[0] = fScale*dz;
757     param[1] = thet;
758     param[2] = phi;
759     param[3] = twist;
760     param[4] = fScale*h1;
761     param[5] = fScale*bl1;
762     param[6] = fScale*tl1;
763     param[7] = alp1;
764     param[8] = fScale*h2;
765     param[9] = fScale*bl2;
766     param[10] = fScale*tl2;
767     param[11] = alp2;
768     name[0] = 'I';
769     for(Int_t i=0;i<3;i++) name[i+1] = gnam[i];
770     gMC->Gsvolu(name,"GTRA",fidmed[med],param,12);
771 }
772 //______________________________________________________________________
773 void AliITSv11::CutTube(const char gnam[3],const TString &dis,Double_t rmin,
774                         Double_t rmax,Double_t dz,Double_t phi1,Double_t phi2,
775                         Double_t lx,Double_t ly,Double_t lz,Double_t hx,
776                         Double_t hy,Double_t hz,Int_t med){
777     // Interface to TMC->Gsvolu() for ITS CTUB geometries. Cut tube. A tube cut
778     // at the extremities with planes not necessarily perpendicular tot he z 
779     // axis. It has 11 parameters. See SetScale() for units. Default units are 
780     // geant 3 [cm]. phi1 should be smaller than phi2. If this is not the case,
781     // the system adds 360 degrees to phi2.
782     // Inputs:
783     //    const char gnam[3]  3 character geant volume name. The letter "I"
784     //                        is appended to the front to indecate that this
785     //                        is an ITS volume.
786     //    TString &dis        String containging part discription.
787     //    Double_t rmin       Inner radius at z=0 where tube is narrowest.
788     //    Double_t rmax       Outer radius at z=0 where tube is narrowest.
789     //    Double_t dz         half-length along the z-axis
790     //    Double_t dz         half-length along the z-axis
791     //    Double_t phi1       Starting angle of the segment [degree].
792     //    Double_t phi2       Ending angle of the segment [degree].
793     //    Double_t lx         x component of a unit vector perpendicular to 
794     //                        the face at -dz.
795     //    Double_t ly         y component of a unit vector perpendicular to 
796     //                        the face at -dz.
797     //    Double_t lz         z component of a unit vector perpendicular to 
798     //                        the face at -dz.
799     //    Double_t hx         x component of a unit vector perpendicular to 
800     //                        the face at +dz.
801     //    Double_t hy         y component of a unit vector perpendicular to 
802     //                        the face at +dz.
803     //    Double_t hz         z component of a unit vector perpendicular to 
804     //                        the face at +dz.
805     //    Int_t    med        media index number.
806     // Output:
807     //    none.
808     // Return.
809     //    none.
810     char name[4];
811     Float_t param[11];
812
813     param[0] = fScale*rmin;
814     param[1] = fScale*rmax;
815     param[2] = fScale*dz;
816     param[3] = phi1;
817     param[4] = phi2;
818     param[5] = lx;
819     param[6] = ly;
820     param[7] = lz;
821     param[8] = hx;
822     param[9] = hy;
823     param[10] = hz;
824     name[0] = 'I';
825     for(Int_t i=0;i<3;i++) name[i+1] = gnam[i];
826     gMC->Gsvolu(name,"CTUB",fidmed[med],param,11);
827 }
828 //______________________________________________________________________
829 void AliITSv11::Pos(const char vol[3],Int_t cn,const char moth[3],Double_t x,
830                     Double_t y,Double_t z,Int_t irot){
831     // Place a copy of a volume previously defined by a call to GSVOLU inside 
832     // its mother volulme moth.
833     // Inputs:
834     //   const char vol[3]  3 character geant volume name. The letter "I"
835     //                      is appended to the front to indecate that this
836     //                      is an ITS volume.
837     //   const char moth[3] 3 character geant volume name of the mother volume 
838     //                      in which vol will be placed. The letter "I" is 
839     //                      appended to the front to indecate that this is an 
840     //                      ITS volume.
841     //   Double_t x         The x positon of the volume in the mother's 
842     //                      reference system
843     //   Double_t y         The y positon of the volume in the mother's 
844     //                      reference system
845     //   Double_t z         The z positon of the volume in the mother's 
846     //                      reference system
847     //   Int_t irot         the index for the rotation matrix to be used.
848     //                      irot=-1 => unit rotation.
849     // Outputs:
850     //    none.
851     // Return:
852     //    none.
853     char name[4],mother[4];
854     Float_t param[3];
855     Int_t r=0,i;
856
857     param[0] = x;
858     param[1] = y;
859     param[2] = z;
860     name[0] = 'I';
861     for(i=0;i<3;i++) name[i+1] = vol[i];
862     mother[0] = 'I';
863     for(i=0;i<3;i++) mother[i+1] = moth[i];
864     if(irot>=0) r=fidrot[irot];
865     fMC->Gspos(name,mother,param[0],param[1],param[2],r,"ONLY");
866 }
867 //______________________________________________________________________
868 void AliITSv11::Matrix(Int_t irot,Double_t thet1,Double_t phi1,
869                        Double_t thet2,Double_t phi2,
870                        Double_t thet3,Double_t phi3){
871     // Defines a Geant rotation matrix. checks to see if it is the unit
872     // matrix. If so, then no additonal matrix is defined. Stores rotation 
873     // matrix irot in the data structure JROTM. If the matrix is not 
874     // orthonormal, it will be corrected by setting y' perpendicular to x' 
875     // and z' = x' X y'. A warning message is printed in this case.
876     // Inputs:
877     //   Int_t irot     Intex specifing which rotation matrix.
878     //   Double_t thet1 Polar angle for axisw x [degrees].
879     //   Double_t phi1  azimuthal angle for axis x [degrees].
880     //   Double_t thet12Polar angle for axisw y [degrees].
881     //   Double_t phi2  azimuthal angle for axis y [degrees].
882     //   Double_t thet3 Polar angle for axisw z [degrees].
883     //   Double_t phi3  azimuthal angle for axis z [degrees].
884     // Outputs:
885     //    none.
886     // Return:
887     //    none.
888     Float_t t1,p1,t2,p2,t3,p3;
889
890     if(thet1==90.0&&phi1==0.0&&thet2==90.0&&phi2==90.0&&thet3==0.0&&phi3==0.0){
891         fidrot[irot] = 0; // Unit matrix
892     }else{
893         t1 = thet1;
894         p1 = phi1;
895         t2 = thet2;
896         p2 = phi2;
897         t3 = thet3;
898         p3 = phi3
899         AliMatrix(fidrot[irot],t1,p1,t2,p2,t3,p3);
900     } // end if
901 }
902 //______________________________________________________________________
903 void AliITSv11::Matrix(Int_t irot,Double_t rot[3][3]){
904     // Defines a Geant rotation matrix. checks to see if it is the unit
905     // matrix. If so, then no additonal matrix is defined. Stores rotation 
906     // matrix irot in the data structure JROTM. If the matrix is not 
907     // orthonormal, it will be corrected by setting y' perpendicular to x' 
908     // and z' = x' X y'. A warning message is printed in this case.
909     // Inputs:
910     //   Int_t irot         Intex specifing which rotation matrix.
911     //   Double_t rot[3][3] The 3 by 3 rotation matrix.
912     // Outputs:
913     //    none.
914     // Return:
915     //    none.
916
917     if(rot[0][0]==1.0&&rot[1][1]==1.0&&rot[2][2]==1.0&&
918        rot[0][1]==0.0&&rot[0][2]==0.0&&rot[1][0]==0.0&&
919        rot[1][2]==0.0&&rot[2][0]==0.0&&rot[2][1]==0.0){
920         fidrot[irot] = 0; // Unit matrix
921     }else{
922         Double_t si,c=180./TMath::Pi();
923         Double_t ang[6];
924
925         ang[1] = TMath::ATan2(rot[0][1],rot[0][0]);
926         if(TMath::Cos(ang[1])!=0.0) si = rot[0][0]/TMath::Cos(ang[1]);
927         else si = rot[0][1]/TMath::Sin(ang[1]);
928         ang[0] = TMath::ATan2(si,rot[0][2]);
929
930         ang[3] = TMath::ATan2(rot[1][1],rot[1][0]);
931         if(TMath::Cos(ang[3])!=0.0) si = rot[1][0]/TMath::Cos(ang[3]);
932         else si = rot[1][1]/TMath::Sin(ang[3]);
933         ang[2] = TMath::ATan2(si,rot[1][2]);
934
935         ang[5] = TMath::ATan2(rot[2][1],rot[2][0]);
936         if(TMath::Cos(ang[5])!=0.0) si = rot[2][0]/TMath::Cos(ang[5]);
937         else si = rot[2][1]/TMath::Sin(ang[5]);
938         ang[4] = TMath::ATan2(si,rot[2][2]);
939
940         for(Int_t i=0;i<6;i++) {ang[i] *= c; if(ang[i]<0.0) ang[i] += 360.;}
941         AliMatrix(fidrot[irot],ang[0],ang[1],ang[2],ang[3],ang[4],ang[5]);
942     } // end if
943 }
944 //______________________________________________________________________
945 void AliITSv11::Matrix(Int_t irot,Int_t axis,Double_t thet){
946     // Defines a Geant rotation matrix. checks to see if it is the unit
947     // matrix. If so, then no additonal matrix is defined. Stores rotation 
948     // matrix irot in the data structure JROTM. If the matrix is not 
949     // orthonormal, it will be corrected by setting y' perpendicular to x' 
950     // and z' = x' X y'. A warning message is printed in this case.
951     // Inputs:
952     //   Int_t irot         Intex specifing which rotation matrix.
953     //   Int_t axis         Axis about which rotation is to be done.
954     //   Double_t thet      Angle to rotate by [degrees].
955     // Outputs:
956     //    none.
957     // Return:
958     //    none.
959
960     if(thet==0.0){
961         fidrot[irot] = 0; // Unit matrix
962     }else{
963         switch (irot) {
964         case 0: //Rotate about x-axis, x-axis does not change.
965             AliMatrix(fidrot[irot],90.0,0.0,90.0+thet,90.0,thet,90.0);
966             break;
967         case 1: //Rotate about y-axis, y-axis does not change.
968             AliMatrix(fidrot[irot],-90.0-thet,0.0,90.0,90.0,thet,90.0);
969             break;
970         case 2: //Rotate about z-axis, z-axis does not change.
971             AliMatrix(fidrot[irot],90.0,thet,90.0,-thet-90.0,0.0,0.0);
972             break;
973         default:
974             Error("Matrix","axis must be either 0, 1, or 2. for matrix=%d",
975                   irot);
976             break;
977     } // end if
978 }
979 //______________________________________________________________________
980 void AliITSv11::CreateGeometry(){
981 ////////////////////////////////////////////////////////////////////////
982 //    This routine defines and Creates the geometry for version 9 of the ITS.
983 ////////////////////////////////////////////////////////////////////////
984 }