New macro for impact parameter determination in pp events using reconstructed tracks
[u/mrichter/AliRoot.git] / ITS / AliITSGeometrySSDCone.cxx
CommitLineData
aa9bc63b 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$
162acd47 18Revision 1.1 2003/02/10 17:03:52 nilsen
19New version and structure of ITS V11 geometry. Work still in progress.
20
aa9bc63b 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>
162acd47 42#include <AliRun.h>
43#include <AliITS.h>
aa9bc63b 44
45#include "AliITSGeometrySSDCone.h"
46
47ClassImp(AliITSGeometrySSDCone)
48
49//______________________________________________________________________
162acd47 50AliITSGeometrySSDCone::AliITSGeometrySSDCone() : AliITSBaseGeometry(){
aa9bc63b 51 //Default Constructor for SSD Cone geometry
52
53 SetScalemm();
54}
55//______________________________________________________________________
162acd47 56AliITSGeometrySSDCone::AliITSGeometrySSDCone(AliITS *its,TVector3 &tran,
57 const char *moth,Int_t mat0):
58 AliITSBaseGeometry(its,0){
aa9bc63b 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].
162acd47 67 Double_t Z,Rmin,Rmax; // additional point not needed in call to pcons.
aa9bc63b 68
162acd47 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)
aa9bc63b 95
96 SetScalemm();
162acd47 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.
aa9bc63b 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
162acd47 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
aa9bc63b 126 // and za[3],rmina[3] there is a curve section given by
162acd47 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
aa9bc63b 129 // between the equivelent points for simplicity.
162acd47 130 Double_t dza = fThickness/fSintc-(fRoutMax-fRoutMin)/fTantc;
aa9bc63b 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
162acd47 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));
aa9bc63b 158 //
159 // Now lets define the Inserto Stesalite 4411w material volume.
162acd47 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));
aa9bc63b 180 //
181 // Now lets define the Rohacell foam material volume.
162acd47 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));
aa9bc63b 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.
162acd47 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
aa9bc63b 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.
162acd47 205 t = fCthick/(0.5*(fRholeMax+fRholeMin));// It is not posible to get the
aa9bc63b 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();
162acd47 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);
aa9bc63b 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.
162acd47 228 // R = Rmax - (5mm)*Sin(t) phi = phi0+(5mm*180/(Pi*fRoutHole))*Sin(t)
aa9bc63b 229 // where 0<=t<=90 For the inner curve a simular equiation holds.
162acd47 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));
aa9bc63b 244 // For the foam core.
162acd47 245 t = fCthick/(0.5*(fRholeMax+fRholeMin));// It is not posible to get the
aa9bc63b 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();
162acd47 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);
aa9bc63b 263 //
264 //==================================================================
265 // Now for the Inner most part of the SSD cone.
162acd47 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));
aa9bc63b 300 // Now for Inserto volume at the inner most radius.
162acd47 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;
aa9bc63b 324 // Now for foam core at the inner most radius.
162acd47 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);
aa9bc63b 339 // Now for foam core at the top of the inner most radius where
340 // the spoaks are.
162acd47 341 t = fCthick/(0.5*(fRholeMax+fRholeMin));// It is not posible to get the
aa9bc63b 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();
162acd47 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);
aa9bc63b 359 // Now for the SSD mounting posts
162acd47 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;
aa9bc63b 371 // Now for the SSD mounting posts
162acd47 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;
aa9bc63b 384 // This insrto continues into the SSD cone displacing the foam
385 // and the carbon fiber surface at those points where the posts are.
162acd47 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);
aa9bc63b 465}
466//______________________________________________________________________
162acd47 467void AliITSGeometrySSDCone::CreateG3Geometry(const char *moth,
aa9bc63b 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
162acd47 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//______________________________________________________________________
502void 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
aa9bc63b 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
162acd47 551 fNcD++;
aa9bc63b 552 t = -5.0+10.0*((Double_t)j)+180.*((Double_t)i);
162acd47 553 v.SetX(fRoutHole*Sind(t));
554 v.SetY(fRoutHole*Cosd(t));
555 v.SetZ(fD.DzAt());
556 Pos(fD,fNcD,fB,v,0);
aa9bc63b 557 } // end for j
558 for(j=0;j<3;j++){ // 3 pins per bracket
162acd47 559 fNcE++;
aa9bc63b 560 t = -3.0+3.0*((Double_t)j)+180.*((Double_t)i);
162acd47 561 v.SetX(fRoutHole*Sind(t));
562 v.SetY(fRoutHole*Cosd(t));
563 v.SetZ(fE.DzAt());
564 Pos(fE,fNcE,fB,v,0);
aa9bc63b 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
162acd47 569 Double_t a[4]={0.0,2.0,5.0,7.0}; // Relative angles.
570 fNcD++;
aa9bc63b 571 t = 90.0-a[j]+187.*((Double_t)i);
162acd47 572 v.SetX(fRoutHole*Sind(t));
573 v.SetY(fRoutHole*Cosd(t));
574 v.SetZ(fD.DzAt());
575 Pos(fD,fNcD,fB,v,0);
aa9bc63b 576 } // end for j
577 for(j=0;j<2;j++){ // 2 pins per bracket
162acd47 578 fNcE++;
aa9bc63b 579 t = 88+7.0*((Double_t)j)+184.*((Double_t)i);
162acd47 580 v.SetX(fRoutHole*Sind(t));
581 v.SetY(fRoutHole*Cosd(t));
582 v.SetZ(fE.DzAt());
583 Pos(fE,fNcE,fB,v,0);
aa9bc63b 584 } // end for j
585 } // end for i
162acd47 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).
aa9bc63b 589 for(j=0;j<2;j++){ // 2 screws per bracket
162acd47 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);
aa9bc63b 597 } // end for j
598 for(j=0;j<1;j++){ // 1 pins per bracket
162acd47 599 fNcE++;
aa9bc63b 600 t = 45.0+90.*((Double_t)i);
162acd47 601 v.SetX(fRoutHole*Sind(t));
602 v.SetY(fRoutHole*Cosd(t));
603 v.SetZ(fE.DzAt());
604 Pos(fE,fNcE,fB,v,0);
aa9bc63b 605 } // end for j
606 } // end for i
162acd47 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);
aa9bc63b 612 } // end for i
162acd47 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);
aa9bc63b 622 } // end for i
623 return;
624}
625//______________________________________________________________________
162acd47 626void AliITSGeometrySSDCone::CreateG3Materials(){
aa9bc63b 627 // Fills the Geant 3 banks with Material and Medium definisions.
628 // Inputs:
629 // none.
630 // Outputs:
631 // none.
632 // Returns:
633 // none.
162acd47 634 Int_t i;
635 Int_t Z[5],N[5];
636 Double_t W[5],dens;
aa9bc63b 637
162acd47 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);
aa9bc63b 689}
690//______________________________________________________________________
691void 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}
162acd47 703//______________________________________________________________________
704void 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//______________________________________________________________________
738void 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//______________________________________________________________________
794ostream &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//______________________________________________________________________
808istream &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}