Removing extra semicolons (FedoraCore3, gcc 3.4.2)
[u/mrichter/AliRoot.git] / FMD / AliFMD3Support.cxx
CommitLineData
a16179cb 1/**************************************************************************
2 * Copyright(c) 2004, 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/* $Id$ */
17
18//____________________________________________________________________
19//
20// Concrete implementation of AliFMDSubDetector
21//
22// This implements the geometry for FMD3
23//
24#include "TVirtualMC.h" // ROOT_TVirtualMC
25#include "AliFMD3Support.h" // ALIFMD3SUPPORT_H
26#include "AliLog.h" // ALILOG_H
27#include <Riostream.h> // ROOT_Riostream
81dbc750 28
a16179cb 29//____________________________________________________________________
925e6570 30ClassImp(AliFMD3Support)
a16179cb 31
32//____________________________________________________________________
33const Char_t* AliFMD3Support::fgkNoseName = "F3SN";
34const Char_t* AliFMD3Support::fgkBackName = "F3SB";
35const Char_t* AliFMD3Support::fgkBeamName = "F3SL";
36const Char_t* AliFMD3Support::fgkFlangeName = "F3SF";
37
38//____________________________________________________________________
39AliFMD3Support::AliFMD3Support()
40 : fZ(0),
41 fAlpha(-1),
42 fNoseId(-1),
43 fBeamId(-1),
44 fBackId(-1),
45 fFlangeId(-1)
46{
47 // Default constructor for the support of FMD3 sub-detector
48 SetNoseZ();
49 SetNoseLowR();
50 SetNoseHighR();
51 SetNoseLength();
52 SetBackLowR();
53 SetBackHighR();
54 SetBackLength();
55 SetBeamThickness();
56 SetBeamWidth();
57 SetConeLength();
58 SetFlangeR();
59 SetNBeam();
60 SetNFlange();
61}
62
63
64//____________________________________________________________________
65AliFMD3Support::~AliFMD3Support()
66{
67 // Destructor - does nothing
68}
69
70
71//____________________________________________________________________
72void
73AliFMD3Support::SetupGeometry(Int_t airId,
74 Int_t cId,
75 Double_t innerZl,
76 Double_t innerZh,
77 Double_t innerRl,
b5411538 78 Double_t /* outerZl */,
a16179cb 79 Double_t outerZh,
80 Double_t outerRl)
81{
82 // Setup the FMD3 sub-detector geometry
83 //
84 // Parameters:
85 //
86 // airId Id # of the Air medium
87 // cId Id # of the Carbon fibre medium
88 //
89
90 // Global stuff we need
91 Double_t zdist = fConeLength - fBackLength - fNoseLength;
92 Double_t tdist = fBackHighR - fNoseHighR;
93 Double_t beaml = TMath::Sqrt(zdist * zdist + tdist * tdist);
94 Double_t theta = -180. * TMath::ATan2(tdist, zdist) / TMath::Pi();
95 Double_t minZ = TMath::Min(fNoseZ - fConeLength, outerZh);
96 fAlpha = tdist / zdist;
97 fZ = fNoseZ + (minZ - fNoseZ) / 2;
81dbc750 98 AliDebug(30, Form("\tTheta = %lf", theta));
a16179cb 99
100 const Char_t* mother = "FMD3";
a16179cb 101 Double_t p[3 + 9 * 3];
102 Double_t eps = 0;
81dbc750 103 // ------------- Mother volume -------------------------------------
104 // The planes should be defined with increasing Z, as it will become
105 // invalid if not
a16179cb 106 // Global parameters
107 p[0] = 0;
108 p[1] = 360;
109 p[2] = 8;
81dbc750 110 // First plane (at back of back or outer ring)
111 p[3] = minZ - fZ - eps;
112 p[4] = outerRl - eps;
113 p[5] = fFlangeR + eps;
114 // Second plane (at front of back, at end of flanges)
115 p[6] = fNoseZ - zdist - fNoseLength - fZ + eps;
116 p[7] = p[4];
117 p[8] = p[5];
118 // Third plane (at front of back)
119 p[9] = p[6] - eps/2;
120 p[10] = p[7];
121 p[11] = ConeR(p[9] + fZ) + eps;
a16179cb 122 // Fourth plane (at back of inner ring)
81dbc750 123 p[12] = innerZh - fZ - eps;
124 p[13] = outerRl - eps;
a16179cb 125 p[14] = ConeR(p[12] + fZ) + eps;
126 // Fifth plane (at back of inner ring)
81dbc750 127 p[15] = p[12] - eps/2;
128 p[16] = innerRl - eps;
a16179cb 129 p[17] = ConeR(p[15] + fZ) + eps;
81dbc750 130 // Sixth plane (at front of inner ring)
131 p[18] = innerZl - fZ + eps;
132 p[19] = p[16];
133 p[20] = ConeR(p[18] + fZ) + eps;
134 // Seventh plane (at end of nose)
135 p[21] = fNoseZ - fNoseLength - fZ - eps;
136 p[22] = fNoseLowR - eps;
137 p[23] = ConeR(p[21] + fZ) + eps; // fNoseHighR;
138 // Eight (and final) plane (at start of nose)
139 p[24] = fNoseZ - fZ + eps;
140 p[25] = p[22];
141 p[26] = fNoseHighR + eps;
142
a16179cb 143 // The volume
144 gMC->Gsvolu(mother, "PCON", airId, p, 27);
a16179cb 145
146 // ------------- Support Structures --------------------------------
147 fRotations.Set(fNBeam + fNFlange);
148 Double_t par[3];
149
150 // The nose
151 par[0] = fNoseLowR;
152 par[1] = fNoseHighR;
153 par[2] = fNoseLength / 2;
154 fNoseId = gMC->Gsvolu(fgkNoseName, "TUBE", cId, par, 3);
155
156 // The Back
157 par[0] = fBackLowR;
158 par[1] = fBackHighR;
159 par[2] = fBackLength / 2;
160 fBackId = gMC->Gsvolu(fgkBackName, "TUBE", cId, par, 3);
161
162 // The Beams
163 par[0] = fBeamThickness / 2;
164 par[1] = fBeamWidth / 2;
165 par[2] = beaml / 2;
166 fBeamId = gMC->Gsvolu(fgkBeamName, "BOX", cId, par, 3);
167 for (Int_t i = 0; i < fNBeam; i++) {
168 // cout << "Making beam # " << i << endl;
169 Double_t phi = 360. / fNBeam * i;
170 Int_t id;
171 gMC->Matrix(id, 180 - theta, phi, 90, 90 + phi, theta, phi);
172 fRotations[i] = id;
173 }
174
175 // The Flanges
176 par[0] = (fFlangeR - fBackHighR) / 2;
177 par[1] = fBeamWidth / 2;
178 par[2] = fBackLength / 2;
179 fFlangeId = gMC->Gsvolu(fgkFlangeName, "BOX", cId, par, 3);
180 for (Int_t i = 0; i < fNFlange; i++) {
181 Double_t phi = 360. / fNFlange * i + 180. / fNFlange;
182 Int_t id;
183 gMC->Matrix(id, 90, phi, 90, 90+phi, 0, 0);
184 fRotations[fNBeam + i] = id;
185 }
186}
187
188//____________________________________________________________________
189void
190AliFMD3Support::Geometry(const char* mother, Int_t idRotId, Double_t zTop)
191{
192 // Position the FMD3 sub-detector volume
193 //
194 // Parameters
195 //
196 // mother name of the mother volume
197 // idRotId Identity rotation matrix ID
198 // z Z position
199 //
200
201 // Common parameters
202 Double_t zdist = fConeLength - fBackLength - fNoseLength;
203 Double_t tdist = fBackHighR - fNoseHighR;
204 const Char_t* name = "FMD3";
205 Double_t z = zTop;
206
207 // Placing mother volume
81dbc750 208 AliDebug(10, Form("\tPutting %s in %s at z=%lf", name, mother, zTop));
209 gMC->Gspos(name, 1, mother, 0, 0, zTop, idRotId, "ONLY");
a16179cb 210
211 // Placing the nose
212 z = fNoseZ - fNoseLength / 2 - fZ;
81dbc750 213 AliDebug(10, Form("\tPutting %s in %s at z=%lf-%lf/2-%lf=%lf",
a16179cb 214 fgkNoseName, name, fNoseZ, fNoseLength, fZ, z));
215 gMC->Gspos(fgkNoseName, 1, name, 0., 0., z, idRotId, "");
216
217 // Placing the back
218 z = fNoseZ - fNoseLength - zdist - fBackLength / 2 - fZ;
81dbc750 219 AliDebug(10, Form("\tPutting %s in %s at z=%lf-%lf-%lf-%lf/2-%lf=%lf",
a16179cb 220 fgkBackName, name, fNoseZ, fNoseLength, zdist,
221 fBackLength, fZ, z));
222 gMC->Gspos(fgkBackName, 1, name, 0., 0., z, idRotId, "");
223
224 // Placing the beams
225 z = fNoseZ - fNoseLength - zdist / 2 - fZ;
226 Double_t r = fNoseHighR + tdist / 2;
81dbc750 227 AliDebug(10, Form("\tPutting %s's in %s at z=%lf-%lf-%lf/2-%lf=%lf",
a16179cb 228 fgkBeamName, name, fNoseZ, fNoseLength, zdist, fZ, z));
229 for (Int_t i = 0; i < fNBeam; i++) {
230 // cout << "Making beam # " << i << endl;
231 Double_t phi = 360. / fNBeam * i;
232 gMC->Gspos(fgkBeamName, i, name,
233 r * TMath::Cos(TMath::Pi() / 180 * phi),
234 r * TMath::Sin(TMath::Pi() / 180 * phi),
235 z, fRotations[i], "");
236 }
237
238 // Placing the flanges
239 r = fBackHighR + (fFlangeR - fBackHighR) / 2;
240 z = fNoseZ - fNoseLength - zdist - fBackLength / 2 - fZ;
81dbc750 241 AliDebug(10, Form("\tPutting %s in %s at z=%lf-%lf-%lf-%lf/2-%lf=%lf",
a16179cb 242 fgkFlangeName, name, fNoseZ, fNoseLength, zdist,
243 fBackLength, fZ, z));
244 for (Int_t i = 0; i < fNFlange; i++) {
245 Double_t phi = 360. / fNFlange * i + 180. / fNFlange;
246 gMC->Gspos(fgkFlangeName, i, name,
247 r * TMath::Cos(TMath::Pi() / 180 * phi),
248 r * TMath::Sin(TMath::Pi() / 180 * phi),
249 z, fRotations[fNBeam + i], "");
250 }
81dbc750 251
a16179cb 252}
253
254//____________________________________________________________________
255Double_t
256AliFMD3Support::ConeR(Double_t z, Option_t* opt) const
257{
258 // Calculate the cone radius at Z
259 if (fAlpha < 0) {
260 Warning("ConeR", "alpha not set: %lf", fAlpha);
261 return -1;
262 }
263 if (z > fNoseZ) {
264 Warning("ConeR", "z=%lf is before start of cone %lf", z, fNoseZ);
265 return -1;
266 }
267 Double_t e = fBeamThickness / TMath::Cos(TMath::ATan(fAlpha));
268 if (opt[0] == 'I' || opt[1] == 'i') e *= -1;
269 if (z > fNoseZ - fNoseLength) return fNoseHighR + e;
270 if (z < fNoseZ - fConeLength + fBackLength) return fBackHighR + e;
271 Double_t r = fNoseHighR + fAlpha * TMath::Abs(z - fNoseZ + fNoseLength) + e;
272 return r;
273}
274
275//____________________________________________________________________
276void
81dbc750 277AliFMD3Support::Gsatt() const
a16179cb 278{
279 // Set drawing attributes for the FMD3 Support
280 gMC->Gsatt(fgkNoseName, "SEEN", 1);
281 gMC->Gsatt(fgkBeamName, "SEEN", 1);
282 gMC->Gsatt(fgkBackName, "SEEN", 1);
283 gMC->Gsatt(fgkFlangeName, "SEEN", 1);
284}
285
286
287//____________________________________________________________________
288//
289// EOF
290//