]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MUON/AliMUONSt2GeometryBuilder.cxx
Extendened class description to include at least 5 subsequent lines required by rule...
[u/mrichter/AliRoot.git] / MUON / AliMUONSt2GeometryBuilder.cxx
CommitLineData
d1cd2474 1// $Id$
2//
3// Class AliMUONSt2GeometryBuilder
4// -------------------------------
5f1df83a 5// MUON Station2 coarse geometry construction class.
6// Extracted from AliMUONv1
7// by Ivana Hrivnacova, IPN Orsay
8// Included in AliRoot 2004/01/23
d1cd2474 9
10#include <TVirtualMC.h>
11#include <TGeoMatrix.h>
12
13#include "AliMUONSt2GeometryBuilder.h"
14#include "AliMUON.h"
15#include "AliMUONChamber.h"
16#include "AliMUONChamberGeometry.h"
17
18ClassImp(AliMUONSt2GeometryBuilder)
19
20//______________________________________________________________________________
21AliMUONSt2GeometryBuilder::AliMUONSt2GeometryBuilder(AliMUON* muon)
22 : AliMUONVGeometryBuilder(&muon->Chamber(2), &muon->Chamber(3)),
23 fMUON(muon)
24{
25// Standard constructor
26
27}
28
29//______________________________________________________________________________
30AliMUONSt2GeometryBuilder::AliMUONSt2GeometryBuilder()
31 : AliMUONVGeometryBuilder(),
32 fMUON(0)
33{
34// Default constructor
35}
36
37
38//______________________________________________________________________________
39AliMUONSt2GeometryBuilder::AliMUONSt2GeometryBuilder(const AliMUONSt2GeometryBuilder& rhs)
40 : AliMUONVGeometryBuilder(rhs)
41{
42 Fatal("Copy constructor",
43 "Copy constructor is not implemented.");
44}
45
46//______________________________________________________________________________
47AliMUONSt2GeometryBuilder::~AliMUONSt2GeometryBuilder() {
48//
49}
50
51//______________________________________________________________________________
52AliMUONSt2GeometryBuilder&
53AliMUONSt2GeometryBuilder::operator = (const AliMUONSt2GeometryBuilder& rhs)
54{
55 // check assignement to self
56 if (this == &rhs) return *this;
57
58 Fatal("operator=",
59 "Assignment operator is not implemented.");
60
61 return *this;
62}
63
64//
65// public methods
66//
67
68//______________________________________________________________________________
69void AliMUONSt2GeometryBuilder::CreateGeometry()
70{
71// From AliMUONv1::CreateGeometry()
72
73//
74//********************************************************************
75// Station 2 **
76//********************************************************************
77 // indices 1 and 2 for first and second chambers in the station
78 // iChamber (first chamber) kept for other quanties than Z,
79 // assumed to be the same in both chambers
80
81 // Get tracking medias Ids
82 Int_t *idtmed = fMUON->GetIdtmed()->GetArray()-1099;
83 Int_t idAir= idtmed[1100]; // medium 1
84 Int_t idAlu1=idtmed[1103]; // medium 4
85 Int_t idAlu2=idtmed[1104]; // medium 5
86 Int_t idGas=idtmed[1108]; // medium 9 = Ar-CO2 gas (80%+20%)
87 Bool_t frameCrosses=kTRUE;
88
89 // Rotation matrices in the x-y plane
90 // phi= 0 deg
91 Int_t irot1;
92 fMUON->AliMatrix(irot1, 90., 0., 90., 90., 0., 0.);
93 // phi= 90 deg
94 Int_t irot2;
95 fMUON->AliMatrix(irot2, 90., 90., 90., 180., 0., 0.);
96
97 AliMUONChamber* iChamber = GetChamber(2);
98 AliMUONChamber* iChamber1 = iChamber;
99 AliMUONChamber* iChamber2 = GetChamber(3);
100
101 // Half of the total thickness of frame crosses (including DAlu)
102 // for each chamber in stations 1 and 2:
103 // 3% of X0 of composite material,
104 // but taken as Aluminium here, with same thickness in number of X0
105 Float_t dframez = 3. * 8.9 / 100;
106 // DGas and DAlu not changed from standard values
107 Double_t zfpos=-(iChamber->DGas()+dframez+iChamber->DAlu())/2;
108 // The same parameters are defined in builder for station 1
109
110 // Mother volume
111 // Outer excess and inner recess for mother volume radius
112 // with respect to ROuter and RInner
113 Float_t dframep=.001; // Value for station 3 should be 6 ...
114 // Width (RdPhi) of the frame crosses for stations 1 and 2 (cm)
115 // Float_t dframep1=.001;
116 Float_t phi=2*TMath::Pi()/12/2;
117 // The same parameters are defined in builder for station 1
118
119 Float_t tpar[3];
120 Double_t dstation = (-iChamber2->Z()) - (-iChamber1->Z());
121 tpar[0] = iChamber->RInner()-dframep;
122 tpar[1] = (iChamber->ROuter()+dframep)/TMath::Cos(phi);
123 tpar[2] = dstation/5;
124
125 gMC->Gsvolu("S03M", "TUBE", idAir, tpar, 3);
126 gMC->Gsvolu("S04M", "TUBE", idAir, tpar, 3);
127
128 // CHANGED
129 //gMC->Gspos("S03M", 1, "ALIC", 0., 0., zpos1 , 0, "ONLY");
130 //gMC->Gspos("S04M", 1, "ALIC", 0., 0., zpos2 , 0, "ONLY");
131 GetChamber(2)->GetGeometry()->AddEnvelope("S03M", false);
132 GetChamber(3)->GetGeometry()->AddEnvelope("S04M", false);
133
134 gMC->Gsbool("S03M", "L3DO");
135 gMC->Gsbool("S03M", "L3O1");
136 gMC->Gsbool("S03M", "L3O2");
137 gMC->Gsbool("S04M", "L3DO");
138 gMC->Gsbool("S04M", "L3O1");
139 gMC->Gsbool("S04M", "L3O2");
140
141// // Aluminium frames
142// // Outer frames
143// pgpar[0] = 360/12/2;
144// pgpar[1] = 360.;
145// pgpar[2] = 12.;
146// pgpar[3] = 2;
147// pgpar[4] = -dframez/2;
148// pgpar[5] = iChamber->ROuter();
149// pgpar[6] = pgpar[5]+dframep;
150// pgpar[7] = +dframez/2;
151// pgpar[8] = pgpar[5];
152// pgpar[9] = pgpar[6];
153// gMC->Gsvolu("S03O", "PGON", idAlu1, pgpar, 10);
154// gMC->Gsvolu("S04O", "PGON", idAlu1, pgpar, 10);
155// gMC->Gspos("S03O",1,"S03M", 0.,0.,-zfpos, 0,"ONLY");
156// gMC->Gspos("S03O",2,"S03M", 0.,0.,+zfpos, 0,"ONLY");
157// gMC->Gspos("S04O",1,"S04M", 0.,0.,-zfpos, 0,"ONLY");
158// gMC->Gspos("S04O",2,"S04M", 0.,0.,+zfpos, 0,"ONLY");
159// //
160// // Inner frame
161// tpar[0]= iChamber->RInner()-dframep;
162// tpar[1]= iChamber->RInner();
163// tpar[2]= dframez/2;
164// gMC->Gsvolu("S03I", "TUBE", idAlu1, tpar, 3);
165// gMC->Gsvolu("S04I", "TUBE", idAlu1, tpar, 3);
166
167// gMC->Gspos("S03I",1,"S03M", 0.,0.,-zfpos, 0,"ONLY");
168// gMC->Gspos("S03I",2,"S03M", 0.,0.,+zfpos, 0,"ONLY");
169// gMC->Gspos("S04I",1,"S04M", 0.,0.,-zfpos, 0,"ONLY");
170// gMC->Gspos("S04I",2,"S04M", 0.,0.,+zfpos, 0,"ONLY");
171//
172// Frame Crosses
173 if (frameCrosses) {
174 // outside gas
175 // security for inside mother volume
176
177 // ADDED !! Repeated
178 Float_t dframep1 = 11.0;
179 Float_t dframez = 3. * 8.9 / 100;
180
181 Float_t bpar[3];
182 bpar[0] = (iChamber->ROuter() - iChamber->RInner())
183 * TMath::Cos(TMath::ASin(dframep1 /
184 (iChamber->ROuter() - iChamber->RInner())))
185 / 2.0;
186 bpar[1] = dframep1/2;
187 // total thickness will be (4 * bpar[2]) for each chamber,
188 // which has to be equal to (2 * dframez) - DAlu
189 bpar[2] = (2.0 * dframez - iChamber->DAlu()) / 4.0;
190 gMC->Gsvolu("S03B", "BOX", idAlu1, bpar, 3);
191 gMC->Gsvolu("S04B", "BOX", idAlu1, bpar, 3);
192
193 gMC->Gspos("S03B",1,"S03M", +iChamber->RInner()+bpar[0] , 0,-zfpos,
194 irot1,"ONLY");
195 gMC->Gspos("S03B",2,"S03M", -iChamber->RInner()-bpar[0] , 0,-zfpos,
196 irot1,"ONLY");
197 gMC->Gspos("S03B",3,"S03M", 0, +iChamber->RInner()+bpar[0] ,-zfpos,
198 irot2,"ONLY");
199 gMC->Gspos("S03B",4,"S03M", 0, -iChamber->RInner()-bpar[0] ,-zfpos,
200 irot2,"ONLY");
201 gMC->Gspos("S03B",5,"S03M", +iChamber->RInner()+bpar[0] , 0,+zfpos,
202 irot1,"ONLY");
203 gMC->Gspos("S03B",6,"S03M", -iChamber->RInner()-bpar[0] , 0,+zfpos,
204 irot1,"ONLY");
205 gMC->Gspos("S03B",7,"S03M", 0, +iChamber->RInner()+bpar[0] ,+zfpos,
206 irot2,"ONLY");
207 gMC->Gspos("S03B",8,"S03M", 0, -iChamber->RInner()-bpar[0] ,+zfpos,
208 irot2,"ONLY");
209
210 gMC->Gspos("S04B",1,"S04M", +iChamber->RInner()+bpar[0] , 0,-zfpos,
211 irot1,"ONLY");
212 gMC->Gspos("S04B",2,"S04M", -iChamber->RInner()-bpar[0] , 0,-zfpos,
213 irot1,"ONLY");
214 gMC->Gspos("S04B",3,"S04M", 0, +iChamber->RInner()+bpar[0] ,-zfpos,
215 irot2,"ONLY");
216 gMC->Gspos("S04B",4,"S04M", 0, -iChamber->RInner()-bpar[0] ,-zfpos,
217 irot2,"ONLY");
218 gMC->Gspos("S04B",5,"S04M", +iChamber->RInner()+bpar[0] , 0,+zfpos,
219 irot1,"ONLY");
220 gMC->Gspos("S04B",6,"S04M", -iChamber->RInner()-bpar[0] , 0,+zfpos,
221 irot1,"ONLY");
222 gMC->Gspos("S04B",7,"S04M", 0, +iChamber->RInner()+bpar[0] ,+zfpos,
223 irot2,"ONLY");
224 gMC->Gspos("S04B",8,"S04M", 0, -iChamber->RInner()-bpar[0] ,+zfpos,
225 irot2,"ONLY");
226 }
227//
228// Chamber Material represented by Alu sheet
229 tpar[0]= iChamber->RInner();
230 tpar[1]= iChamber->ROuter();
231 tpar[2] = (iChamber->DGas()+iChamber->DAlu())/2;
232 gMC->Gsvolu("S03A", "TUBE", idAlu2, tpar, 3);
233 gMC->Gsvolu("S04A", "TUBE", idAlu2, tpar, 3);
234 gMC->Gspos("S03A", 1, "S03M", 0., 0., 0., 0, "ONLY");
235 gMC->Gspos("S04A", 1, "S04M", 0., 0., 0., 0, "ONLY");
236//
237// Sensitive volumes
238 // tpar[2] = iChamber->DGas();
239 tpar[2] = iChamber->DGas()/2;
240 gMC->Gsvolu("S03G", "TUBE", idGas, tpar, 3);
241 gMC->Gsvolu("S04G", "TUBE", idGas, tpar, 3);
242 gMC->Gspos("S03G", 1, "S03A", 0., 0., 0., 0, "ONLY");
243 gMC->Gspos("S04G", 1, "S04A", 0., 0., 0., 0, "ONLY");
244//
245// Frame Crosses to be placed inside gas
246 // NONE: chambers are sensitive everywhere
247// if (frameCrosses) {
248
249// dr = (iChamber->ROuter() - iChamber->RInner());
250// bpar[0] = TMath::Sqrt(dr*dr-dframep1*dframep1/4)/2;
251// bpar[1] = dframep1/2;
252// bpar[2] = iChamber->DGas()/2;
253// gMC->Gsvolu("S03F", "BOX", idAlu1, bpar, 3);
254// gMC->Gsvolu("S04F", "BOX", idAlu1, bpar, 3);
255
256// gMC->Gspos("S03F",1,"S03G", +iChamber->RInner()+bpar[0] , 0, 0,
257// irot1,"ONLY");
258// gMC->Gspos("S03F",2,"S03G", -iChamber->RInner()-bpar[0] , 0, 0,
259// irot1,"ONLY");
260// gMC->Gspos("S03F",3,"S03G", 0, +iChamber->RInner()+bpar[0] , 0,
261// irot2,"ONLY");
262// gMC->Gspos("S03F",4,"S03G", 0, -iChamber->RInner()-bpar[0] , 0,
263// irot2,"ONLY");
264
265// gMC->Gspos("S04F",1,"S04G", +iChamber->RInner()+bpar[0] , 0, 0,
266// irot1,"ONLY");
267// gMC->Gspos("S04F",2,"S04G", -iChamber->RInner()-bpar[0] , 0, 0,
268// irot1,"ONLY");
269// gMC->Gspos("S04F",3,"S04G", 0, +iChamber->RInner()+bpar[0] , 0,
270// irot2,"ONLY");
271// gMC->Gspos("S04F",4,"S04G", 0, -iChamber->RInner()-bpar[0] , 0,
272// irot2,"ONLY");
273// }
274/*
275 iChamber1 = iChamber = (AliMUONChamber*) (*fChambers)[2];
276 iChamber2 =(AliMUONChamber*) (*fChambers)[3];
277 zpos1=iChamber1->Z();
278 zpos2=iChamber2->Z();
279 dstation = zpos2 - zpos1;
280 // DGas and DAlu not changed from standard values
281 zfpos=-(iChamber->DGas()+dframez+iChamber->DAlu())/2;
282
283//
284// Mother volume
285 tpar[0] = iChamber->RInner()-dframep;
286 tpar[1] = (iChamber->ROuter()+dframep)/TMath::Cos(phi);
287 tpar[2] = dstation/5;
288
289 gMC->Gsvolu("S03M", "TUBE", idAir, tpar, 3);
290 gMC->Gsvolu("S04M", "TUBE", idAir, tpar, 3);
291 gMC->Gspos("S03M", 1, "ALIC", 0., 0., zpos1 , 0, "ONLY");
292 gMC->Gspos("S04M", 1, "ALIC", 0., 0., zpos2 , 0, "ONLY");
293 gMC->Gsbool("S03M", "L3DO");
294 gMC->Gsbool("S03M", "L3O1");
295 gMC->Gsbool("S03M", "L3O2");
296 gMC->Gsbool("S04M", "L3DO");
297 gMC->Gsbool("S04M", "L3O1");
298 gMC->Gsbool("S04M", "L3O2");
299
300// // Aluminium frames
301// // Outer frames
302// pgpar[0] = 360/12/2;
303// pgpar[1] = 360.;
304// pgpar[2] = 12.;
305// pgpar[3] = 2;
306// pgpar[4] = -dframez/2;
307// pgpar[5] = iChamber->ROuter();
308// pgpar[6] = pgpar[5]+dframep;
309// pgpar[7] = +dframez/2;
310// pgpar[8] = pgpar[5];
311// pgpar[9] = pgpar[6];
312// gMC->Gsvolu("S03O", "PGON", idAlu1, pgpar, 10);
313// gMC->Gsvolu("S04O", "PGON", idAlu1, pgpar, 10);
314// gMC->Gspos("S03O",1,"S03M", 0.,0.,-zfpos, 0,"ONLY");
315// gMC->Gspos("S03O",2,"S03M", 0.,0.,+zfpos, 0,"ONLY");
316// gMC->Gspos("S04O",1,"S04M", 0.,0.,-zfpos, 0,"ONLY");
317// gMC->Gspos("S04O",2,"S04M", 0.,0.,+zfpos, 0,"ONLY");
318// //
319// // Inner frame
320// tpar[0]= iChamber->RInner()-dframep;
321// tpar[1]= iChamber->RInner();
322// tpar[2]= dframez/2;
323// gMC->Gsvolu("S03I", "TUBE", idAlu1, tpar, 3);
324// gMC->Gsvolu("S04I", "TUBE", idAlu1, tpar, 3);
325
326// gMC->Gspos("S03I",1,"S03M", 0.,0.,-zfpos, 0,"ONLY");
327// gMC->Gspos("S03I",2,"S03M", 0.,0.,+zfpos, 0,"ONLY");
328// gMC->Gspos("S04I",1,"S04M", 0.,0.,-zfpos, 0,"ONLY");
329// gMC->Gspos("S04I",2,"S04M", 0.,0.,+zfpos, 0,"ONLY");
330//
331// Frame Crosses
332 if (frameCrosses) {
333 // outside gas
334 // security for inside mother volume
335 bpar[0] = (iChamber->ROuter() - iChamber->RInner())
336 * TMath::Cos(TMath::ASin(dframep1 /
337 (iChamber->ROuter() - iChamber->RInner())))
338 / 2.0;
339 bpar[1] = dframep1/2;
340 // total thickness will be (4 * bpar[2]) for each chamber,
341 // which has to be equal to (2 * dframez) - DAlu
342 bpar[2] = (2.0 * dframez - iChamber->DAlu()) / 4.0;
343 gMC->Gsvolu("S03B", "BOX", idAlu1, bpar, 3);
344 gMC->Gsvolu("S04B", "BOX", idAlu1, bpar, 3);
345
346 gMC->Gspos("S03B",1,"S03M", +iChamber->RInner()+bpar[0] , 0,-zfpos,
347 irot1,"ONLY");
348 gMC->Gspos("S03B",2,"S03M", -iChamber->RInner()-bpar[0] , 0,-zfpos,
349 irot1,"ONLY");
350 gMC->Gspos("S03B",3,"S03M", 0, +iChamber->RInner()+bpar[0] ,-zfpos,
351 irot2,"ONLY");
352 gMC->Gspos("S03B",4,"S03M", 0, -iChamber->RInner()-bpar[0] ,-zfpos,
353 irot2,"ONLY");
354 gMC->Gspos("S03B",5,"S03M", +iChamber->RInner()+bpar[0] , 0,+zfpos,
355 irot1,"ONLY");
356 gMC->Gspos("S03B",6,"S03M", -iChamber->RInner()-bpar[0] , 0,+zfpos,
357 irot1,"ONLY");
358 gMC->Gspos("S03B",7,"S03M", 0, +iChamber->RInner()+bpar[0] ,+zfpos,
359 irot2,"ONLY");
360 gMC->Gspos("S03B",8,"S03M", 0, -iChamber->RInner()-bpar[0] ,+zfpos,
361 irot2,"ONLY");
362
363 gMC->Gspos("S04B",1,"S04M", +iChamber->RInner()+bpar[0] , 0,-zfpos,
364 irot1,"ONLY");
365 gMC->Gspos("S04B",2,"S04M", -iChamber->RInner()-bpar[0] , 0,-zfpos,
366 irot1,"ONLY");
367 gMC->Gspos("S04B",3,"S04M", 0, +iChamber->RInner()+bpar[0] ,-zfpos,
368 irot2,"ONLY");
369 gMC->Gspos("S04B",4,"S04M", 0, -iChamber->RInner()-bpar[0] ,-zfpos,
370 irot2,"ONLY");
371 gMC->Gspos("S04B",5,"S04M", +iChamber->RInner()+bpar[0] , 0,+zfpos,
372 irot1,"ONLY");
373 gMC->Gspos("S04B",6,"S04M", -iChamber->RInner()-bpar[0] , 0,+zfpos,
374 irot1,"ONLY");
375 gMC->Gspos("S04B",7,"S04M", 0, +iChamber->RInner()+bpar[0] ,+zfpos,
376 irot2,"ONLY");
377 gMC->Gspos("S04B",8,"S04M", 0, -iChamber->RInner()-bpar[0] ,+zfpos,
378 irot2,"ONLY");
379 }
380//
381// Chamber Material represented by Alu sheet
382 tpar[0]= iChamber->RInner();
383 tpar[1]= iChamber->ROuter();
384 tpar[2] = (iChamber->DGas()+iChamber->DAlu())/2;
385 gMC->Gsvolu("S03A", "TUBE", idAlu2, tpar, 3);
386 gMC->Gsvolu("S04A", "TUBE", idAlu2, tpar, 3);
387 gMC->Gspos("S03A", 1, "S03M", 0., 0., 0., 0, "ONLY");
388 gMC->Gspos("S04A", 1, "S04M", 0., 0., 0., 0, "ONLY");
389//
390// Sensitive volumes
391 // tpar[2] = iChamber->DGas();
392 tpar[2] = iChamber->DGas()/2;
393 gMC->Gsvolu("S03G", "TUBE", idGas, tpar, 3);
394 gMC->Gsvolu("S04G", "TUBE", idGas, tpar, 3);
395 gMC->Gspos("S03G", 1, "S03A", 0., 0., 0., 0, "ONLY");
396 gMC->Gspos("S04G", 1, "S04A", 0., 0., 0., 0, "ONLY");
397//
398// Frame Crosses to be placed inside gas
399 // NONE: chambers are sensitive everywhere
400// if (frameCrosses) {
401
402// dr = (iChamber->ROuter() - iChamber->RInner());
403// bpar[0] = TMath::Sqrt(dr*dr-dframep1*dframep1/4)/2;
404// bpar[1] = dframep1/2;
405// bpar[2] = iChamber->DGas()/2;
406// gMC->Gsvolu("S03F", "BOX", idAlu1, bpar, 3);
407// gMC->Gsvolu("S04F", "BOX", idAlu1, bpar, 3);
408
409// gMC->Gspos("S03F",1,"S03G", +iChamber->RInner()+bpar[0] , 0, 0,
410// irot1,"ONLY");
411// gMC->Gspos("S03F",2,"S03G", -iChamber->RInner()-bpar[0] , 0, 0,
412// irot1,"ONLY");
413// gMC->Gspos("S03F",3,"S03G", 0, +iChamber->RInner()+bpar[0] , 0,
414// irot2,"ONLY");
415// gMC->Gspos("S03F",4,"S03G", 0, -iChamber->RInner()-bpar[0] , 0,
416// irot2,"ONLY");
417
418// gMC->Gspos("S04F",1,"S04G", +iChamber->RInner()+bpar[0] , 0, 0,
419// irot1,"ONLY");
420// gMC->Gspos("S04F",2,"S04G", -iChamber->RInner()-bpar[0] , 0, 0,
421// irot1,"ONLY");
422// gMC->Gspos("S04F",3,"S04G", 0, +iChamber->RInner()+bpar[0] , 0,
423// irot2,"ONLY");
424// gMC->Gspos("S04F",4,"S04G", 0, -iChamber->RInner()-bpar[0] , 0,
425// irot2,"ONLY");
426// }
427 }
428*/
429}
430
431//______________________________________________________________________________
432void AliMUONSt2GeometryBuilder::SetTransformations()
433{
434// Defines the transformations for the station2 chambers.
435// ---
436
437 AliMUONChamber* iChamber1 = GetChamber(2);
438 Double_t zpos1 = - iChamber1->Z();
439 iChamber1->GetGeometry()
440 ->SetTranslation(TGeoTranslation(0., 0., zpos1));
441
442 AliMUONChamber* iChamber2 = GetChamber(3);
443 Double_t zpos2 = - iChamber2->Z();
444 iChamber2->GetGeometry()
445 ->SetTranslation(TGeoTranslation(0., 0., zpos2));
446}
447
448//______________________________________________________________________________
449void AliMUONSt2GeometryBuilder::SetSensitiveVolumes()
450{
451// Defines the sensitive volumes for station2 chambers.
452// ---
453
454 GetChamber(2)->GetGeometry()->SetSensitiveVolume("S03G");
455 GetChamber(3)->GetGeometry()->SetSensitiveVolume("S04G");
456}