ITS new Geometry files. Not yet ready for uses, committed to allow additional
[u/mrichter/AliRoot.git] / ITS / AliITSGeometrySSDCone.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 Revision 1.1  2003/02/10 17:03:52  nilsen
19 New version and structure of ITS V11 geometry. Work still in progress.
20
21 $Id$
22 */
23
24 #include <Riostream.h>
25 #include <stdio.h>
26 #include <stdlib.h>
27 #include <TMath.h>
28 #include <TGeometry.h>
29 #include <TNode.h>
30 #include <TTUBE.h>
31 #include <TTUBS.h>
32 #include <TPCON.h>
33 #include <TFile.h>    // only required for Tracking function?
34 #include <TCanvas.h>
35 #include <TObjArray.h>
36 #include <TLorentzVector.h>
37 #include <TObjString.h>
38 #include <TClonesArray.h>
39 #include <TBRIK.h>
40 #include <TSystem.h>
41 #include <TVector3.h>
42 #include <AliRun.h>
43 #include <AliITS.h>
44
45 #include "AliITSGeometrySSDCone.h"
46
47 ClassImp(AliITSGeometrySSDCone)
48
49 //______________________________________________________________________
50 AliITSGeometrySSDCone::AliITSGeometrySSDCone() : AliITSBaseGeometry(){
51     //Default Constructor for SSD Cone geometry
52
53     SetScalemm();
54 }
55 //______________________________________________________________________
56 AliITSGeometrySSDCone::AliITSGeometrySSDCone(AliITS *its,TVector3 &tran,
57                                              const char *moth,Int_t mat0):
58     AliITSBaseGeometry(its,0){
59     //Standard Constructor for SSD Cone geometry
60     // Inputs:
61     //   Double_t z0  Z-axis shift of this volume
62     // Outputs:
63     //   none.
64     // Return:
65     //   none.
66     Double_t t; // some general angle and coordinates [degrees].
67     Double_t Z,Rmin,Rmax; // additional point not needed in call to pcons.
68
69     fThickness = 13.0; //mm, Thickness of Rohacell+carbon fiber
70     fCthick=1.5; //mm, Carbon finber thickness
71     fRcurv=15.0; // mm, Radius of curvature.
72     fTc=51.0; // angle of SSD cone [degrees].
73     fSintc=Sind(fTc);fCostc=Cosd(fTc);fTantc=Tand(fTc);
74     fZ0=0.0;fZouterMilled=13.5-5.0;fZcylinder=170.0;fZposts=196.0;
75     fNspoaks=12;fNposts=4;fNmounts=4;
76     fRoutMax=0.5*985.0;fRoutHole=0.5*965.0;fRoutMin=0.5*945.0;
77     fRholeMax=0.5*890.0;fRholeMin=0.5*740.0;
78     fRpostMin=316.0;fdRpost=23.0;fZpostMax=196.0;fPhi0Post=30.0;
79     fRinMax=0.5*590.0;fRinCylinder=0.5*597.0;fRinHole=0.5*575.0;
80     fRinMin=0.5*562.0;fdZin=15.0;
81     // SSD-SDD Thermal/Mechanical cylinder mounts
82     fNinScrews=40;
83     fPhi0Screws=0.5*360.0/((Double_t)fNinScrews);fRcylinderScrews= 0.5*570.0;
84     fDscrewHead=8.0;fDscrewShaft=4.6;fThScrewHeadHole=8.5;
85     // SDD mounting bracket, SSD part
86     fNssdSupports=3;fPhi0SDDsupports=90.0;
87     fRsddSupportPlate = 0.5*585.0;fThSDDsupportPlate=4.0;
88     fWsddSupportPlate = 70.0;
89     fSSDcf=26; // SSD support cone Carbon Fiber materal number.
90     fSSDfs=25; // SSD support cone inserto stesalite 4411w.
91     fSSDfo=68; // SSD support cone foam, Rohacell 50A.
92     fSSDsw=14; // SSD support cone screw material,Stainless steal
93     fNcD=0; // number of screw ends (copy number)
94     fNcE=0; // number of pin end (copy number)
95
96     SetScalemm();
97     // Poly-cone Volume A. Top part of SSD cone Carbon Fiber.
98     fA.Size(7,"SSD Suport cone Carbon Fiber Surface outer left");
99      // Poly-cone Volume B. Stesalite inside volume A.
100     fB.Size(6,"SSD Suport cone Inserto Stesalite left edge");
101     // Poly-cone Volume C. Foam inside volume A.
102     fC.Size(4,"SSD Suport cone Rohacell foam left edge");
103     fD.SetName("Screw+stud used to mount things to the SSD support cone");
104     fE.SetName("pin used to mount things to the SSD support cone");
105     // Poly-cone Volume F. Foam in spoak reagion, inside volume A.
106     fF.Size(4,"SSD Top Suport cone Rohacell foam Spoak");
107     fG.Size(4,"SSD spoak carbon fiber surfaces"); // Poly-cone Volume G.
108     fH.Size(4,"SSD support cone Rohacell foam Spoak"); // Poly-cone Volume H.
109     fI.Size(9,"SSD lower/inner right part of SSD cone"); //Poly-cone Volume I.
110     fJ.Size(4,"SSD inner most foam core"); // Poly-cone Volume J.
111     fK.Size(7,"SSD inner most inserto material"); // Poly-cone Volume K.
112     fL.Size(4,"SSD Bottom cone Rohacell foam Spoak"); // Poly-cone Volume L.
113     fM.Size(4,"SSD mounting post foam substitute, Inserto");//Poly-cone Vol. M
114     fN.Size(4,"SSD mounting post CF subsititute, Inserto");//Poly-cone Vol. N
115     fO.Size(3,"SSD mounting post, carbon fiber"); // Poly-cone Volume O.
116     fP.Size(3,"SSD mounting post, Inserto"); // Poly-cone Volume P.
117     fQ.Size(4,"SSD Thermal sheal stainless steel bolts");//Poly-cone Volume Q.
118     fR.SetName("Air in front of bolt (in stasolit)");
119     fS.SetName("Air in front of Stainless Steal Screw end, N6");
120     fT.Size(2,"SSD-SDD mounting bracket Inserto-> Al."); //Poly-cone Volume T.
121     fU.Size(4,"SSD-SDD mounting bracket CF->Al."); // Poly-cone Volume U.
122     // Lets start with the upper left outer carbon fiber surface.
123     // Between za[2],rmaxa[2] and za[4],rmaxa[4] there is a curved section
124     // given by rmaxa = rmaxa[2]-r*Sind(t) for 0<=t<=fTc and 
125     // za = za[2] + r*Cosd(t) for 0<=t<=fTc. Simularly between za[1],rmina[1
126     // and za[3],rmina[3] there is a curve section given by
127     // rmina = rmina[1]-r*Sind(t) for 0<=t<=fTc and za = za[1]+r&Sind(t)
128     // for t<=0<=fTc. These curves have been replaced by straight lines
129     // between the equivelent points for simplicity.
130     Double_t dza = fThickness/fSintc-(fRoutMax-fRoutMin)/fTantc;
131     if(dza<=0){ // The number or order of the points are in error for a proper
132         // call to pcons!
133         Error("SSDcone","The definition of the points for a call to PCONS is"
134               " in error. abort.");
135         return;
136     } // end if
137     fA.P0() = 0.0;
138     fA.dP() = 360.0;
139     fA.Z(0) = fZ0;
140     fA.Rn(0) = fRoutMin;
141     fA.Rx(0) = fRoutMax;
142     fA.Z(1)  = fA.ZAt(0)+fZouterMilled - dza; // za[2] - dza.
143     fA.Rn(1) = fA.Rmin(0);
144     fA.Rx(1) = fA.Rmax(0);
145     fA.Z(2)  = fA.ZAt(0)+fZouterMilled; //From Drawing ALR-0767 and ALR-0767/3
146     fA.Rx(2) = fA.Rmax(0);
147     RadiusOfCurvature(fRcurv,0.0,fA.ZAt(1),fA.Rmin(1),fTc,fA.Z(3),fA.Rn(3));
148     fA.Rn(2) = RminFrom2Points(fA,3,1,fA.ZAt(2));
149     RadiusOfCurvature(fRcurv,0.0,fA.ZAt(2),fA.Rmax(2),fTc,fA.Z(4),fA.Rx(4));
150     fA.Rn(4) = RminFromZSSDcone(fA.ZAt(4));
151     fA.Rx(3) = RmaxFrom2Points(fA,4,2,fA.ZAt(3));
152     fA.Rn(5) = fRholeMax;
153     fA.Z(5)  = Zfrom2MinPoints(fA,4,3,fA.Rmin(5));
154     fA.Rx(5) = RmaxFromZSSDcone(fA.ZAt(5));
155     fA.Rn(6) = fRholeMax;
156     fA.Rx(6) = fA.Rmin(6);
157     fA.Z(6)  = ZFromRmaxSSDcone(fA.Rmax(6));
158     //
159     // Now lets define the Inserto Stesalite 4411w material volume.
160     fB.P0() = 0.0;
161     fB.dP() = 360.0;
162     fB.Z(0) = fA.ZAt(0);
163     fB.Rn(0) = fA.Rmin(0)+fCthick;
164     fB.Rx(0) = fA.Rmax(0)-fCthick;
165     fB.Z(1)  = fA.ZAt(1);
166     fB.Rn(1) = fB.Rmin(0);
167     fB.Rx(1) = fB.Rmax(0);
168     fB.Z(2)  = fA.ZAt(2);
169     fB.Rx(2) = fB.Rmax(1);
170     RadiusOfCurvature(fRcurv-fCthick,0.,fB.ZAt(2),fB.Rmax(2),
171                                     fTc,fB.Z(3),fB.Rx(3));
172     RadiusOfCurvature(fRcurv+fCthick,0.,fB.ZAt(1),fB.Rmin(1),
173                                     fTc,fB.Z(4),fB.Rn(4));
174     fB.Rn(2) = RminFrom2Points(fB,4,1,fB.ZAt(2));
175     fB.Rn(3) = RminFrom2Points(fB,4,1,fB.ZAt(3));
176     fB.Z(5)  = fB.ZAt(4)+(fThickness-2.0*fCthick)/fSintc;
177     fB.Rn(5) = RmaxFromZSSDcone(fB.ZAt(5),-fCthick);
178     fB.Rx(5) = fB.Rmin(5);
179     fB.Rx(4) = RmaxFrom2Points(fB,5,3,fB.ZAt(4));
180     //
181     // Now lets define the Rohacell foam material volume.
182     fC.P0() = 0.0;
183     fC.dP() = 360.0;
184     fC.Z(0) = fB.ZAt(4);
185     fC.Rn(0) = fB.Rmin(4);
186     fC.Rx(0) = fC.Rmin(0);
187     fC.Z(1)  = fB.ZAt(5);
188     fC.Rx(1) = fB.Rmin(5);
189     fC.Rn(2) = fA.Rmin(5)+fCthick;//leave space for carbon fiber covering hole
190     fC.Z(2)  = ZFromRminSSDcone(fC.Rn(2),+fCthick);
191     fC.Rn(1) = RminFrom2Points(fC,2,0,fC.ZAt(1));
192     fC.Rx(3) = fA.Rmin(6)+fCthick;
193     fC.Rn(3) = fC.Rmax(3);
194     fC.Z(3)  = ZFromRmaxSSDcone(fC.Rx(3),-fCthick);
195     fC.Rx(2) = RmaxFrom2Points(fC,3,1,fC.ZAt(2));
196     //
197     // In volume SCB, th Inserto Stesalite 4411w material volume, there
198     // are a number of Stainless steel screw and pin studs which will be
199     // filled with screws/studs.
200     fD.Rn()=0.0,fD.Rx()=6.0,fD.Z()=0.5*10.0; // mm
201     fE.Rn()=0.0;fE.Rx()=6.0;fE.Z()=0.5*12.0; // mm
202     //
203     // There is no carbon fiber between this upper left section and the
204     // SSD spoaks. We remove it by replacing it with Rohacell foam.
205     t = fCthick/(0.5*(fRholeMax+fRholeMin));// It is not posible to get the
206     // carbon fiber thickness uniform in this phi direction. We can only
207     // make it a fixed angular thickness.
208     t *= 180.0/TMath::Pi();
209     fF.P0()  = 12.5+t; // degrees see drawing ALR-0767.
210     fF.dP()  = 5.0 - 2.0*t; // degrees
211     fF.Z(0)  = fC.ZAt(2);
212     fF.Rn(0) = fC.Rmin(3);
213     fF.Rx(0) = fF.Rmin(0);
214     fF.Rn(1) = fA.Rmin(5);
215     fF.Rx(1) = fF.Rmin(0);
216     fF.Z(1)  = RminFromZSSDcone(fF.ZAt(1),+fCthick);
217     fF.Z(2)  = fC.ZAt(3);
218     fF.Rn(2) = fF.Rmin(1);
219     fF.Rx(2) = fF.Rmax(1);
220     fF.Rn(3) = fA.Rmin(6);
221     fF.Rx(3) = fF.Rmin(3);
222     fF.Z(3)  = ZFromRmaxSSDcone(fF.Rmax(3),-fCthick);
223     //=================================================================
224     // Now for the spoak part of the SSD cone.
225     // It is not posible to inclue the radius of curvature between
226     // the spoak part and the upper left part of the SSD cone or lowwer right
227     // part. This would be discribed by the following curves.
228     // R = Rmax - (5mm)*Sin(t) phi = phi0+(5mm*180/(Pi*fRoutHole))*Sin(t) 
229     // where 0<=t<=90 For the inner curve a simular equiation holds.
230     fG.P0()  = 12.5; // degrees see drawing ALR-0767.
231     fG.dP()  = 5.0; // degrees
232     fG.Z(0)  = fA.ZAt(5);
233     fG.Rn(0) = fA.Rmin(5);
234     fG.Rx(0) = fG.Rn(0);
235     fG.Z(1)  = fA.ZAt(6);
236     fG.Rn(1) = RminFromZSSDcone(fG.ZAt(1));
237     fG.Rx(1) = fG.Rmax(0);
238     fG.Rn(2) = fRholeMin;
239     fG.Z(2)  = ZFromRminSSDcone(fG.Rmin(2));
240     fG.Rx(2) = RmaxFromZSSDcone(fG.ZAt(2));
241     fG.Rn(3) = fG.Rmin(2);
242     fG.Rx(3) = fG.Rmin(3);
243     fG.Z(3)  = ZFromRmaxSSDcone(fG.Rmax(3));
244     // For the foam core.
245     t = fCthick/(0.5*(fRholeMax+fRholeMin));// It is not posible to get the
246     // carbon fiber thickness uniform in this phi direction. We can only
247     // make it a fixed angular thickness.
248     t *= 180.0/TMath::Pi();
249     fH.P0()  = 5.0 - 2.0*t; // degrees
250     fH.dP()  = 12.5+t; // degrees see drawing ALR-0767.
251     fH.Z(0)  = fF.ZAt(1);
252     fH.Rn(0) = fG.Rmin(0);
253     fH.Rx(0) = fH.Rmin(0);
254     fH.Z(1)  = fF.ZAt(3);
255     fH.Rn(1) = RminFromZSSDcone(fH.Z(1),-fCthick);
256     fH.Rx(1) = fH.Rmax(0);
257     fH.Z(2)  = ZFromRminSSDcone(fG.Rmin(2),+fCthick);
258     fH.Rn(2) = fG.Rmin(2);
259     fH.Rx(2) = RmaxFromZSSDcone(fH.Z(2),-fCthick);
260     fH.Z(3)  = ZFromRmaxSSDcone(fG.Rmin(3),-fCthick);
261     fH.Rn(3) = fG.Rmin(3);
262     fH.Rx(3) = fH.Rn(3);
263     //
264     //==================================================================
265     // Now for the Inner most part of the SSD cone.
266     fI.P0()  = 0.0;
267     fI.dP()  = 360.0;
268     fI.Z(0)  = fG.ZAt(2);
269     fI.Rn(0) = fG.Rmin(2);
270     fI.Rx(0) = fI.Rmin(0);
271     fI.Z(1)  = fG.ZAt(3);
272     fI.Rn(1) = RminFromZSSDcone(fI.ZAt(1));
273     fI.Rx(1) = fI.Rmax(0);
274     fI.Rn(4) = fRinMin;
275     fI.Rn(5) = fRinMin;
276     RadiusOfCurvature(fRcurv,90.0,0.0,fRinMin,90.0-fTc,Z,fI.Rx(5)); // z dummy
277     fI.Z(5)  = ZFromRmaxSSDcone(fI.Rx(5));
278     fI.Z(6)  = fZcylinder;
279     fI.Rn(6) = fRinMin;
280     fI.Z(7)  = fI.Z(6);
281     fI.Rn(7) = fRinCylinder;
282     fI.Rn(8) = fRinCylinder;
283     fI.Rx(8) = fI.Rmin(8);
284     Rmin = fI.Rmin(5);
285     RadiusOfCurvature(fRcurv,90.0-fTc,fI.Z(5),fI.Rmax(5),90.0,Z,Rmax);
286     Rmax = fRinMax;
287     fI.Z(8)  = Z+(fI.ZAt(5)-Z)*(fI.Rmax(8)-Rmax)/(fI.Rmax(7)-Rmax);
288     fI.Rx(6) = RmaxFrom2Points(fI,8,5,fI.ZAt(6));
289     fI.Rx(7) = fI.Rmax(6);
290     fI.Z(3)  = Z-fdZin;
291     fI.Z(4)  = fI.ZAt(3);
292     fI.Rx(3) = RmaxFromZSSDcone(fI.ZAt(3));
293     fI.Rx(4) = fI.Rx(3);
294     //rmin dummy
295     RadiusOfCurvature(fRcurv,90.,fI.ZAt(3),0.,90.-fTc,fI.Z(2),Rmin);
296     fI.Rn(2) = RminFromZSSDcone(fI.ZAt(2));
297     fI.Rx(2) = RmaxFromZSSDcone(fI.ZAt(2));
298     // z dummy
299     RadiusOfCurvature(fRcurv,90.-fTc,0.0,fI.Rmin(2),90.0,Z,fI.Rn(3)); 
300     // Now for Inserto volume at the inner most radius.
301     fK.P0()  = 0.0;
302     fK.dP()  = 360.0;
303     fK.Z(1)  = fI.ZAt(3)+fCthick;
304     fK.Rn(1) = fI.Rmin(3);
305     fK.Z(2)  = fK.ZAt(1);
306     fK.Rn(2) = fI.Rmin(4);
307     fK.Rn(3) = fK.Rmin(2);
308     fK.Rn(4) = fK.Rmin(2);
309     fK.Rn(5) = fK.Rmin(2);
310     fK.Rx(5) = fI.Rmin(8);
311     fK.Z(6)  = fI.ZAt(6);
312     fK.Rn(6) = fI.Rmin(6);
313     fK.Rx(6) = fI.Rmin(7);
314     RadiusOfCurvature(fRcurv+fCthick,90.0,fK.ZAt(1),fK.Rmin(1),
315                                 90.0-fTc,fK.Z(0),fK.Rn(0));
316     fK.Rx(0) = fK.Rmin(0);
317     fK.Z(3)  = fK.ZAt(0)+(fThickness+2.0*fCthick)*fCostc;;
318     fK.Rx(3) = fK.Rmax(0)+(fThickness+2.0*fCthick)*fSintc;
319     fK.Rx(1) = RmaxFrom2Points(fK,3,0,fK.ZAt(1));
320     fK.Rx(2) = fK.Rmax(1);
321     fK.Rx(4) = fI.Rmax(5)-fCthick*fSintc;
322     fK.Z(4)  = ZFromRmaxSSDcone(fK.Rmax(4),-fCthick);
323     fK.Z(5)  = fI.ZAt(5)-fRcurv*fCostc-fCthick;
324     // Now for foam core at the inner most radius.
325     fJ.P0() = 0.0;
326     fJ.dP() = 360.0;
327     fJ.Rn(0) = fI.Rmin(0)-fCthick;
328     fJ.Z(0)  = ZFromRminSSDcone(fJ.Rmin(0),+fCthick);
329     fJ.Rx(0) = fJ.Rmin(0);
330     fJ.Rx(1) = fJ.Rmax(0);
331     fJ.Z(1)  = ZFromRmaxSSDcone(fJ.Rmax(1),-fCthick);
332     fJ.Rn(1) = RminFromZSSDcone(fJ.ZAt(1),-fCthick);
333     fJ.Z(2)  = fK.ZAt(0);
334     fJ.Rn(2) = fK.Rmin(0);
335     fJ.Rx(2) = RmaxFromZSSDcone(fJ.ZAt(2),-fCthick);
336     fJ.Z(3)  = fK.ZAt(3);
337     fJ.Rn(3) = fK.Rmax(3);
338     fJ.Rx(3) = fJ.Rmin(3);
339     // Now for foam core at the top of the inner most radius where 
340     // the spoaks are.
341     t = fCthick/(0.5*(fRholeMax+fRholeMin));// It is not posible to get the
342     // carbon fiber thickness uniform in this phi direction. We can only
343     // make it a fixed angular thickness.
344     t *= 180.0/TMath::Pi();
345     fL.P0() = 5.0 - 2.0*t; // degrees
346     fL.dP() = 12.5+t; // degrees see drawing ALR-0767.
347     fL.Z(0) = fH.ZAt(2);
348     fL.Rn(0) = fI.Rmin(0);
349     fL.Rx(0) = fL.Rmin(0);
350     fL.Z(1)  = fJ.ZAt(0);
351     fL.Rn(1) = fJ.Rmin(1);
352     fL.Rx(1) = fI.Rmax(1);
353     fL.Z(2)  = fH.ZAt(3);
354     fL.Rn(2) = fL.Rmin(1);
355     fL.Rx(2) = fL.Rmax(1);
356     fL.Z(3)  = fJ.ZAt(1);
357     fL.Rn(3) = fL.Rmin(2);
358     fL.Rx(3) = fL.Rmin(3);
359     // Now for the SSD mounting posts
360     fO.P0()  = 180.0*fdRpost/(fRpostMin+0.5*fdRpost)/TMath::Pi(); // degrees
361     fO.dP()  = fPhi0Post; //
362     fO.Rn(0) = fRpostMin+fdRpost;
363     fO.Rx(0) = fO.Rmin(0);
364     fO.Z(0)  = ZFromRmaxSSDcone(fO.Rmax(0));
365     fO.Rn(1) = fRpostMin;
366     fO.Z(1)  = ZFromRmaxSSDcone(fO.Rmin(1));
367     fO.Rx(1) = fO.Rmax(0);
368     fO.Z(2)  = fZ0+fZpostMax;
369     fO.Rn(2) = fRpostMin;
370     fO.Rx(2) = fO.Rmin(2)+fdRpost;
371     // Now for the SSD mounting posts
372     t = 180.0*fCthick/(fRpostMin+0.5*fdRpost)/TMath::Pi();
373     fP.dP()  = fO.DPhi()-2.0*t; // degrees
374     fP.P0()  = fO.Phi0()+t; //
375     fP.Rn(0) = fO.Rmin(0)-fCthick;
376     fP.Rx(0) = fP.Rmin(0);
377     fP.Z(0)  = ZFromRmaxSSDcone(fP.Rmax(0));
378     fP.Rn(1) = fO.Rmin(0)+fCthick;
379     fP.Rx(1) = fO.Rmin(0)-fCthick;
380     fP.Z(1)  = ZFromRminSSDcone(fP.Rmin(1));
381     fP.Rn(2) = fP.Rmin(1);
382     fP.Rx(2) = fP.Rmax(1);
383     fP.Z(2)  = fZ0+fZpostMax;
384     // This insrto continues into the SSD cone displacing the foam
385     // and the carbon fiber surface at those points where the posts are.
386     fM.P0()  = fP.Phi0();
387     fM.dP()  = fP.DPhi();
388     fM.Rn(0) = fRpostMin+fdRpost-fCthick;
389     fM.Rx(0) = fM.Rmin(0);
390     fM.Z(0)  = ZFromRminSSDcone(fM.Rmin(0),+fCthick);
391     fM.Rx(1) = fM.Rmax(0);
392     fM.Z(1)  = ZFromRmaxSSDcone(fM.Rmax(1),-fCthick);
393     fM.Rn(1) = RminFromZSSDcone(fM.ZAt(1),+fCthick);
394     fM.Rn(2) = fRpostMin+fCthick;
395     fM.Z(2)  = ZFromRminSSDcone(fM.Rmin(2),+fCthick);
396     fM.Rx(2) = RmaxFromZSSDcone(fM.ZAt(2),-fCthick);
397     fM.Rn(3) = fM.Rmin(2);
398     fM.Rx(3) = fM.Rmin(3);
399     fM.Z(3)  = ZFromRmaxSSDcone(fM.Rmax(3),-fCthick);
400     //
401     fN.P0()  = fP.Phi0();
402     fN.dP()  = fP.DPhi();
403     fN.Z(0)  = fM.ZAt(1);
404     fN.Rn(0) = fM.Rmax(1);
405     fN.Rx(0) = fN.Rmin(0);
406     fN.Rx(1) = fN.Rmax(0);
407     fN.Z(1)  = ZFromRmaxSSDcone(fN.Rmax(1));
408     fN.Rn(1) = RminFromZSSDcone(fN.ZAt(1),-fCthick);
409     fN.Z(2)  = fM.ZAt(3);
410     fN.Rn(2) = fM.Rmin(3);
411     fN.Rx(2) = RmaxFromZSSDcone(fN.ZAt(2));
412     fN.Rn(3) = fN.Rmin(2);
413     fN.Rx(3) = fN.Rmin(3);
414     fN.Z(3)  = ZFromRmaxSSDcone(fN.Rmax(3));
415     // Bolt heads holding the SSD-SDD tube to the SSD cone.
416     // Bolt -- PolyCone
417     fQ.P0()  = 0.0;
418     fQ.dP()  = 360.0;
419     fQ.Z(0)  = fI.ZAt(4)-fThSDDsupportPlate;
420     fQ.Rn(0) = 0.0;
421     fQ.Rx(0) = 0.5*fDscrewHead;
422     fQ.Z(1)  = fI.ZAt(4)-fThScrewHeadHole;
423     fQ.Rn(1) = 0.0;
424     fQ.Rx(1) = 0.5*fDscrewHead;
425     fQ.Z(2)  = fQ.ZAt(1);
426     fQ.Rn(2) = 0.0;
427     fQ.Rx(2) = 0.5*fDscrewShaft;
428     fQ.Z(3)  = fQ.ZAt(2);
429     fQ.Rn(3) = 0.0;
430     fQ.Rx(3) = fQ.Rmax(2);
431     // air infront of bolt (stasolit Volume K) -- Tube
432     fR.Z() = 0.5*(fThickness-fThScrewHeadHole);
433     fR.Rn() = 0.0;
434     fR.Rx() = 0.5*fDscrewHead;
435     // air infront of bolt (carbon fiber volume I) -- Tube
436     fS.Z() = 0.5*fThickness;
437     fS.Rn() = 0.0;
438     fS.Rx() = fR.Rmax();
439     // SDD support plate, SSD side.
440     fT.dP()  = 180.0*fWsddSupportPlate/(fRsddSupportPlate*TMath::Pi());
441     fT.P0()  = fPhi0SDDsupports=90.0;
442     fT.Z(0)  = fK.ZAt(2);
443     fT.Rn(0) = fI.Rmin(4);
444     fT.Rx(0) = fRsddSupportPlate;
445     fT.Z(1)  = fI.ZAt(4) - fThSDDsupportPlate;
446     fT.Rn(1) = fT.Rmin(0);
447     fT.Rx(1) = fT.Rmax(0);
448     //
449     fU.dP() = fT.DPhi();
450     fU.P0() = fT.Phi0();
451     fU.Z(2) = fI.ZAt(4);
452     fU.Rn(2) = fT.Rmin(0);
453     fU.Rx(2) = fT.Rmax(0);
454     fU.Z(3)  = fT.ZAt(0);
455     fU.Rn(3) = fU.Rmin(2);
456     fU.Rx(3) = fU.Rmax(2);
457     fU.Z(1)  = fU.ZAt(2);
458     fU.Rn(1) = fI.Rmin(3);
459     fU.Rx(1) = fU.Rmax(3);
460     fU.Rx(0) = fT.Rmax(0);
461     fU.Rn(0) = fU.Rmax(0);
462     fU.Z(0)  = Zfrom2MinPoints(fI,2,3,fU.Rmax(0));
463     // Debuging
464     Print(&cout);
465 }
466 //______________________________________________________________________
467 void AliITSGeometrySSDCone::CreateG3Geometry(const char *moth,
468                                              TVector3 &trans){
469     // Calls Geant 3 geometry inilization routines with the information
470     // stored in this class.
471     // Inputs:
472     //    none.
473     // Outputs:
474     //    none.
475     // Return:
476     //    none.
477
478     PolyCone(fA,fSSDcf);
479     PolyCone(fB,fSSDfs);
480     PolyCone(fC,fSSDfo);
481     Tube(fD,fSSDsw);
482     Tube(fE,fSSDsw);
483     PolyCone(fF,fSSDfo);
484     PolyCone(fG,fSSDcf);
485     PolyCone(fH,fSSDfo);
486     PolyCone(fI,fSSDcf);
487     PolyCone(fJ,fSSDfo);
488     PolyCone(fK,fSSDfs);
489     PolyCone(fL,fSSDfo);
490     PolyCone(fM,fSSDfo);
491     PolyCone(fN,fSSDfo);
492     PolyCone(fO,fSSDcf);
493     PolyCone(fP,fSSDfs);
494     PolyCone(fQ,fSSDfo);
495     Tube(fR,fSSDsw);
496     Tube(fS,fSSDsw);
497     PolyCone(fT,fSSDfo);
498     PolyCone(fU,fSSDfo);
499     return;
500 }
501 //______________________________________________________________________
502 void AliITSGeometrySSDCone::PositionG3Geometry(AliITSBaseVolParams &moth,
503                                                Int_t cn,TVector3 &trans,
504                                                Int_t irot){
505     // Positions ths whole object at t with rotatin irot coply number cn
506     // into volume moth.
507     // Inputs:
508     //   const AliITSBaseVolParams *moth   Mother volume where this object 
509     //                                     is to be placed.
510     //   Int_t      cn      Copy number.
511     //   TVector3   &t      Translation vector for this whole volume
512     //   Int_t      irot    rotation matrix number to be applyed to this
513     //                      volume.
514     // Output:
515     //   none.
516     // Return:
517     //   none.
518     Int_t i,j,k,l,irotSpoaks,irotPost;
519     Double_t t;
520     Bool_t init=kFALSE;
521     TVector3 zero(0.0,0.0,0.0),v(0.0,0.0,0.0);
522
523     if(cn<=0) return;
524     if(cn==1) init=kTRUE;
525     Pos(fA,cn,moth,trans,0);
526     Pos(fI,cn,moth,trans,0);
527     Pos(fG,fNspoaks*(cn-1)+1,fA,trans,0);
528     irotSpoaks = irot;
529     j = 0;
530     for(i=fNspoaks*(cn-1)+2;i<fNspoaks*cn+1;i++){
531         ZMatrix(++irot,((Double_t)j)*360./((Double_t)fNspoaks));
532         Pos(fG,i,fA,trans,irot);
533         j++;
534     } // end for i
535     Pos(fO,fNposts*(cn-1)+1,moth,trans,0);
536     irotPost = irot;
537     j = 0;
538     for(i=fNposts*(cn-1)+2;i<fNposts*cn+1;i++){
539         ZMatrix(++irot,((Double_t)j)*360./((Double_t)fNposts));
540         Pos(fO,i,moth,trans,irot);
541         j++;
542     } // end for
543     if(!init) return;
544     // Inside volume A.
545     Pos(fB,1,fA,zero,0);
546     Pos(fC,1,fA,zero,0);
547     // Inside Volume B
548     k=l=0;
549     for(i=0;i<2;i++){ // position for ITS-TPC mounting brackets
550         for(j=0;j<2;j++){ // 2 screws per bracket
551             fNcD++;
552             t = -5.0+10.0*((Double_t)j)+180.*((Double_t)i);
553             v.SetX(fRoutHole*Sind(t));
554             v.SetY(fRoutHole*Cosd(t));
555             v.SetZ(fD.DzAt());
556             Pos(fD,fNcD,fB,v,0);
557         } // end for j
558         for(j=0;j<3;j++){ // 3 pins per bracket
559             fNcE++;
560             t = -3.0+3.0*((Double_t)j)+180.*((Double_t)i);
561             v.SetX(fRoutHole*Sind(t));
562             v.SetY(fRoutHole*Cosd(t));
563             v.SetZ(fE.DzAt());
564             Pos(fE,fNcE,fB,v,0);
565         } // end for j
566     } // end for i
567     for(i=0;i<2;i++){ // position for ITS-rail mounting brackets
568         for(j=0;j<4;j++){ // 4 screws per bracket
569             Double_t a[4]={0.0,2.0,5.0,7.0}; // Relative angles.
570             fNcD++;
571             t = 90.0-a[j]+187.*((Double_t)i);
572             v.SetX(fRoutHole*Sind(t));
573             v.SetY(fRoutHole*Cosd(t));
574             v.SetZ(fD.DzAt());
575             Pos(fD,fNcD,fB,v,0);
576         } // end for j
577         for(j=0;j<2;j++){ // 2 pins per bracket
578             fNcE++;
579             t = 88+7.0*((Double_t)j)+184.*((Double_t)i);
580             v.SetX(fRoutHole*Sind(t));
581             v.SetY(fRoutHole*Cosd(t));
582             v.SetZ(fE.DzAt());
583             Pos(fE,fNcE,fB,v,0);
584         } // end for j
585     } // end for i
586     for(i=0;i<fNmounts;i++){ // mounting holes/screws for beam 
587         // pipe support and SPD cone support (dump side,non-dump 
588         // side has them to).
589         for(j=0;j<2;j++){ // 2 screws per bracket
590             fNcD++;
591             t = 180.*20./(fRoutHole*TMath::Pi());
592             t = 45.0+((Double_t)(j-1))*t+90.*((Double_t)i);
593             v.SetX(fRoutHole*Sind(t));
594             v.SetY(fRoutHole*Cosd(t));
595             v.SetZ(fD.DzAt());
596             Pos(fD,fNcD,fB,v,0);
597         } // end for j
598         for(j=0;j<1;j++){ // 1 pins per bracket
599             fNcE++;
600             t = 45.0+90.*((Double_t)i);
601             v.SetX(fRoutHole*Sind(t));
602             v.SetY(fRoutHole*Cosd(t));
603             v.SetZ(fE.DzAt());
604             Pos(fE,fNcE,fB,v,0);
605         } // end for j
606     } // end for i
607     Pos(fF,1,fA,zero,0);
608     Pos(fL,1,fI,zero,0);
609     for(i=1;i<fNspoaks;i++){
610         Pos(fF,i+1,fA,zero,irotSpoaks+i);
611         Pos(fL,i+1,fA,zero,irotSpoaks+i);
612     } // end for i
613     Pos(fH,1,fG,zero,0);
614     Pos(fK,1,fI,zero,0);
615     Pos(fJ,1,fI,zero,0);
616     Pos(fP,1,fO,zero,0);
617     Pos(fM,1,fJ,zero,0);
618     Pos(fN,1,fI,zero,0);
619     for(i=1;i<fNposts;i++){
620         Pos(fN,i+1,fJ,zero,irotPost+i);
621         Pos(fM,i+1,fI,zero,irotPost+i);
622     } // end for i
623     return;
624 }
625 //______________________________________________________________________
626 void AliITSGeometrySSDCone::CreateG3Materials(){
627     // Fills the Geant 3 banks with Material and Medium definisions.
628     // Inputs:
629     //   none.
630     // Outputs:
631     //   none.
632     // Returns:
633     //   none.
634     Int_t i;
635     Int_t Z[5],N[5];
636     Double_t W[5],dens;
637
638     // epoxy
639     dens = 10.*GetA(1)+13.*GetA(6)+3.*GetA(8);
640     Z[0] = 1; W[0] = 10.*GetA(Z[0])/dens; // Hydrogen Content
641     Z[1] = 6; W[1] = 13.*GetA(Z[1])/dens; // Carbon Content
642     Z[2] = 8; W[2] =  3.*GetA(Z[2])/dens; // Oxegen
643     // Carbon fiber is about 64% carbon fiber and 36% epoxy by volume.
644     // Now need to add in the carbon fiber
645     W[0] *= 0.36*GetA(Z[0]);
646     W[1]  = 0.36*W[1]*dens*GetA(Z[1]) + 0.64*GetA(Z[1]);
647     W[2] *= 0.36*GetA(Z[2]);
648     // Renormilize the weights
649     dens = 0.0;
650     for(i=0;i<3;i++){dens += W[i];}
651     for(i=0;i<3;i++){W[i] /= dens;}
652     dens = 1.7; // grams/cm^3 taken as density of G10 PDG book.
653     MixtureByWeight(fSSDcf,"Carbon Fiber for SSD support cone",Z,W,dens,3,0);
654     // epoxy 
655     dens = 10.*GetA(1)+13.*GetA(6)+3.*GetA(8);
656     Z[0] = 1; W[0] = 10.*GetA(Z[0])/dens; // Hydrogen Content
657     Z[1] = 6; W[1] = 13.*GetA(Z[1])/dens; // Carbon Content
658     Z[2] = 8; W[2] =  3.*GetA(Z[2])/dens; // Oxegen
659     Z[3] = 14;W[3] = 0.0; // no Silicon in epoxy.
660     // glass fiber is about 64% carbon fiber and 36% epoxy by volume.
661     // Now need to add in the glass fiber
662     W[0] *= 0.36*GetA(Z[0]);
663     W[1] *= 0.36*GetA(Z[1]);
664     W[2]  = 0.36*W[2]*dens*GetA(Z[2]) + 0.64*2.0*GetA(Z[2]);
665     W[3]  = 0.64*GetA(Z[3]); // Si
666     // Renormilize the weights
667     dens = 0.0;
668     for(i=0;i<4;i++){dens += W[i];}
669     for(i=0;i<4;i++){W[i] /= dens;}
670     dens = 1.7; // grams/cm^3 taken as density of G10 PDG book.
671     MixtureByWeight(fSSDfs,"Inserto stealite 4411w for SSD support cone",
672                     Z,W,dens,4,0);
673     // Rohacell 51 C14 H10 N2 O6 from Flavio Tosello
674     // http://cesweb.grantadesign.com/demo/index.do
675     Z[0] = 1; N[0] = 10; // Hydrogen Content
676     Z[1] = 6; N[1] = 14; // Carbon Content
677     Z[2] = 7; N[2] =  2; // Nitrogen Content
678     Z[3] = 8; N[3] =  6; // Oxigen Content
679     dens = 0.0513; // grams/cm^3 From Flavio Tosello 
680     //  http://www.emkayplatics.co.uk/roh51.html
681     MixtureByNumber(fSSDfo,"Foam core (Rohacell 51) for SSD support cone",
682                     Z,N,dens,4,0);
683     // Stainless steel. Temperary values.
684     Z[0] =  6; W[0] = 0.5; // Carbon Content
685     Z[1] = 25; W[1] = 0.5; // Iron Content
686     dens = 7.87; // Grams/cm^3  density of iron used.
687     MixtureByWeight(fSSDsw,"Stainless steal screw, pin, and stud material",
688                     Z,W,dens,2,0);
689 }
690 //______________________________________________________________________
691 void AliITSGeometrySSDCone::BuildDisplayGeometry(){
692     // Fill Root geometry banks for fast simple ITS simulation event
693     // display. See Display.C, and related code, for more details.
694     // Inputs:
695     //    none.
696     // Outputs:
697     //   none.
698     // Return:
699     //  none.
700
701     // No need to display ITS cones.
702 }
703 //______________________________________________________________________
704 void AliITSGeometrySSDCone::Print(ostream *os){
705     // Prints out the data kept in this class
706     // Inputs:
707     //   ostream *os pointer to the output stream
708     // Outputs:
709     //   none.
710     // Return:
711     //   none.
712
713     *os << "Object AliITSGeometrySSDCone" << endl;
714     *os << " Object fA" << endl << fA << endl;
715     *os << " Object fB" << endl << fB << endl;
716     *os << " Object fC" << endl << fC << endl;
717     *os << " Object fD" << endl << fD << endl;
718     *os << " Object fE" << endl << fE << endl;
719     *os << " Object fF" << endl << fF << endl;
720     *os << " Object fG" << endl << fG << endl;
721     *os << " Object fH" << endl << fH << endl;
722     *os << " Object fI" << endl << fI << endl;
723     *os << " Object fJ" << endl << fJ << endl;
724     *os << " Object fK" << endl << fK << endl;
725     *os << " Object fL" << endl << fL << endl;
726     *os << " Object fM" << endl << fM << endl;
727     *os << " Object fN" << endl << fN << endl;
728     *os << " Object fO" << endl << fO << endl;
729     *os << " Object fP" << endl << fP << endl;
730     *os << " Object fQ" << endl << fQ << endl;
731     *os << " Object fR" << endl << fR << endl;
732     *os << " Object fS" << endl << fS << endl;
733     *os << " Object fT" << endl << fT << endl;
734     *os << " Object fU" << endl << fU << endl;
735     return;
736 }
737 //______________________________________________________________________
738 void AliITSGeometrySSDCone::Read(istream *is){
739     // Read in data written with Print above.
740     // Inputs:
741     //   istream *is Input stream pointer
742     // Output:
743     //   none.
744     // Return:
745     //   none.
746     char s[50];
747
748     is->getline(s,49);
749     is->getline(s,49);
750     *is >> fA;
751     is->getline(s,49);
752     *is >> fB;
753     is->getline(s,49);
754     *is >> fC;
755     is->getline(s,49);
756     *is >> fD;
757     is->getline(s,49);
758     *is >> fE;
759     is->getline(s,49);
760     *is >> fF;
761     is->getline(s,49);
762     *is >> fG;
763     is->getline(s,49);
764     *is >> fH;
765     is->getline(s,49);
766     *is >> fI;
767     is->getline(s,49);
768     *is >> fJ;
769     is->getline(s,49);
770     *is >> fK;
771     is->getline(s,49);
772     *is >> fL;
773     is->getline(s,49);
774     *is >> fM;
775     is->getline(s,49);
776     *is >> fN;
777     is->getline(s,49);
778     *is >> fO;
779     is->getline(s,49);
780     *is >> fP;
781     is->getline(s,49);
782     *is >> fQ;
783     is->getline(s,49);
784     *is >> fR;
785     is->getline(s,49);
786     *is >> fS;
787     is->getline(s,49);
788     *is >> fT;
789     is->getline(s,49);
790     *is >> fU;
791     return;
792 }
793 //______________________________________________________________________
794 ostream &operator<<(ostream &os,AliITSGeometrySSDCone &s){
795     // Operator << for C++ like output of AliITSGeometrySSDCone class.
796     // Inputs:
797     //   ostream &os              The output stream
798     //   AliITSGeometrySSDCone &s The class to be outputed
799     // Outputs:
800     //   none.
801     // Return:
802     //  ostream &os  The address of the output stream
803
804     s.Print(&os);
805     return os;
806 }
807 //______________________________________________________________________
808 istream &operator>>(istream &is,AliITSGeometrySSDCone &s){
809     // Operator >> for C++ like input of AliITSGeometrySSDCone class.
810     // Inputs:
811     //   istream &is              The input stream
812     //   AliITSGeometrySSDCone &s The class to be inputed
813     // Outputs:
814     //   none.
815     // Return:
816     //  istream &is  The address of the input stream
817
818     s.Read(&is);
819     return is;
820 }