3 // Class AliMUONSt2GeometryBuilder
4 // -------------------------------
5 // Abstract base class for geometry construction per chamber.
7 // Author: Ivana Hrivnacova, IPN Orsay
9 #include <TVirtualMC.h>
10 #include <TGeoMatrix.h>
12 #include "AliMUONSt2GeometryBuilder.h"
14 #include "AliMUONChamber.h"
15 #include "AliMUONChamberGeometry.h"
17 ClassImp(AliMUONSt2GeometryBuilder)
19 //______________________________________________________________________________
20 AliMUONSt2GeometryBuilder::AliMUONSt2GeometryBuilder(AliMUON* muon)
21 : AliMUONVGeometryBuilder(&muon->Chamber(2), &muon->Chamber(3)),
24 // Standard constructor
28 //______________________________________________________________________________
29 AliMUONSt2GeometryBuilder::AliMUONSt2GeometryBuilder()
30 : AliMUONVGeometryBuilder(),
33 // Default constructor
37 //______________________________________________________________________________
38 AliMUONSt2GeometryBuilder::AliMUONSt2GeometryBuilder(const AliMUONSt2GeometryBuilder& rhs)
39 : AliMUONVGeometryBuilder(rhs)
41 Fatal("Copy constructor",
42 "Copy constructor is not implemented.");
45 //______________________________________________________________________________
46 AliMUONSt2GeometryBuilder::~AliMUONSt2GeometryBuilder() {
50 //______________________________________________________________________________
51 AliMUONSt2GeometryBuilder&
52 AliMUONSt2GeometryBuilder::operator = (const AliMUONSt2GeometryBuilder& rhs)
54 // check assignement to self
55 if (this == &rhs) return *this;
58 "Assignment operator is not implemented.");
67 //______________________________________________________________________________
68 void AliMUONSt2GeometryBuilder::CreateGeometry()
70 // From AliMUONv1::CreateGeometry()
73 //********************************************************************
75 //********************************************************************
76 // indices 1 and 2 for first and second chambers in the station
77 // iChamber (first chamber) kept for other quanties than Z,
78 // assumed to be the same in both chambers
80 // Get tracking medias Ids
81 Int_t *idtmed = fMUON->GetIdtmed()->GetArray()-1099;
82 Int_t idAir= idtmed[1100]; // medium 1
83 Int_t idAlu1=idtmed[1103]; // medium 4
84 Int_t idAlu2=idtmed[1104]; // medium 5
85 Int_t idGas=idtmed[1108]; // medium 9 = Ar-CO2 gas (80%+20%)
86 Bool_t frameCrosses=kTRUE;
88 // Rotation matrices in the x-y plane
91 fMUON->AliMatrix(irot1, 90., 0., 90., 90., 0., 0.);
94 fMUON->AliMatrix(irot2, 90., 90., 90., 180., 0., 0.);
96 AliMUONChamber* iChamber = GetChamber(2);
97 AliMUONChamber* iChamber1 = iChamber;
98 AliMUONChamber* iChamber2 = GetChamber(3);
100 // Half of the total thickness of frame crosses (including DAlu)
101 // for each chamber in stations 1 and 2:
102 // 3% of X0 of composite material,
103 // but taken as Aluminium here, with same thickness in number of X0
104 Float_t dframez = 3. * 8.9 / 100;
105 // DGas and DAlu not changed from standard values
106 Double_t zfpos=-(iChamber->DGas()+dframez+iChamber->DAlu())/2;
107 // The same parameters are defined in builder for station 1
110 // Outer excess and inner recess for mother volume radius
111 // with respect to ROuter and RInner
112 Float_t dframep=.001; // Value for station 3 should be 6 ...
113 // Width (RdPhi) of the frame crosses for stations 1 and 2 (cm)
114 // Float_t dframep1=.001;
115 Float_t phi=2*TMath::Pi()/12/2;
116 // The same parameters are defined in builder for station 1
119 Double_t dstation = (-iChamber2->Z()) - (-iChamber1->Z());
120 tpar[0] = iChamber->RInner()-dframep;
121 tpar[1] = (iChamber->ROuter()+dframep)/TMath::Cos(phi);
122 tpar[2] = dstation/5;
124 gMC->Gsvolu("S03M", "TUBE", idAir, tpar, 3);
125 gMC->Gsvolu("S04M", "TUBE", idAir, tpar, 3);
128 //gMC->Gspos("S03M", 1, "ALIC", 0., 0., zpos1 , 0, "ONLY");
129 //gMC->Gspos("S04M", 1, "ALIC", 0., 0., zpos2 , 0, "ONLY");
130 GetChamber(2)->GetGeometry()->AddEnvelope("S03M", false);
131 GetChamber(3)->GetGeometry()->AddEnvelope("S04M", false);
133 gMC->Gsbool("S03M", "L3DO");
134 gMC->Gsbool("S03M", "L3O1");
135 gMC->Gsbool("S03M", "L3O2");
136 gMC->Gsbool("S04M", "L3DO");
137 gMC->Gsbool("S04M", "L3O1");
138 gMC->Gsbool("S04M", "L3O2");
140 // // Aluminium frames
142 // pgpar[0] = 360/12/2;
146 // pgpar[4] = -dframez/2;
147 // pgpar[5] = iChamber->ROuter();
148 // pgpar[6] = pgpar[5]+dframep;
149 // pgpar[7] = +dframez/2;
150 // pgpar[8] = pgpar[5];
151 // pgpar[9] = pgpar[6];
152 // gMC->Gsvolu("S03O", "PGON", idAlu1, pgpar, 10);
153 // gMC->Gsvolu("S04O", "PGON", idAlu1, pgpar, 10);
154 // gMC->Gspos("S03O",1,"S03M", 0.,0.,-zfpos, 0,"ONLY");
155 // gMC->Gspos("S03O",2,"S03M", 0.,0.,+zfpos, 0,"ONLY");
156 // gMC->Gspos("S04O",1,"S04M", 0.,0.,-zfpos, 0,"ONLY");
157 // gMC->Gspos("S04O",2,"S04M", 0.,0.,+zfpos, 0,"ONLY");
160 // tpar[0]= iChamber->RInner()-dframep;
161 // tpar[1]= iChamber->RInner();
162 // tpar[2]= dframez/2;
163 // gMC->Gsvolu("S03I", "TUBE", idAlu1, tpar, 3);
164 // gMC->Gsvolu("S04I", "TUBE", idAlu1, tpar, 3);
166 // gMC->Gspos("S03I",1,"S03M", 0.,0.,-zfpos, 0,"ONLY");
167 // gMC->Gspos("S03I",2,"S03M", 0.,0.,+zfpos, 0,"ONLY");
168 // gMC->Gspos("S04I",1,"S04M", 0.,0.,-zfpos, 0,"ONLY");
169 // gMC->Gspos("S04I",2,"S04M", 0.,0.,+zfpos, 0,"ONLY");
174 // security for inside mother volume
177 Float_t dframep1 = 11.0;
178 Float_t dframez = 3. * 8.9 / 100;
181 bpar[0] = (iChamber->ROuter() - iChamber->RInner())
182 * TMath::Cos(TMath::ASin(dframep1 /
183 (iChamber->ROuter() - iChamber->RInner())))
185 bpar[1] = dframep1/2;
186 // total thickness will be (4 * bpar[2]) for each chamber,
187 // which has to be equal to (2 * dframez) - DAlu
188 bpar[2] = (2.0 * dframez - iChamber->DAlu()) / 4.0;
189 gMC->Gsvolu("S03B", "BOX", idAlu1, bpar, 3);
190 gMC->Gsvolu("S04B", "BOX", idAlu1, bpar, 3);
192 gMC->Gspos("S03B",1,"S03M", +iChamber->RInner()+bpar[0] , 0,-zfpos,
194 gMC->Gspos("S03B",2,"S03M", -iChamber->RInner()-bpar[0] , 0,-zfpos,
196 gMC->Gspos("S03B",3,"S03M", 0, +iChamber->RInner()+bpar[0] ,-zfpos,
198 gMC->Gspos("S03B",4,"S03M", 0, -iChamber->RInner()-bpar[0] ,-zfpos,
200 gMC->Gspos("S03B",5,"S03M", +iChamber->RInner()+bpar[0] , 0,+zfpos,
202 gMC->Gspos("S03B",6,"S03M", -iChamber->RInner()-bpar[0] , 0,+zfpos,
204 gMC->Gspos("S03B",7,"S03M", 0, +iChamber->RInner()+bpar[0] ,+zfpos,
206 gMC->Gspos("S03B",8,"S03M", 0, -iChamber->RInner()-bpar[0] ,+zfpos,
209 gMC->Gspos("S04B",1,"S04M", +iChamber->RInner()+bpar[0] , 0,-zfpos,
211 gMC->Gspos("S04B",2,"S04M", -iChamber->RInner()-bpar[0] , 0,-zfpos,
213 gMC->Gspos("S04B",3,"S04M", 0, +iChamber->RInner()+bpar[0] ,-zfpos,
215 gMC->Gspos("S04B",4,"S04M", 0, -iChamber->RInner()-bpar[0] ,-zfpos,
217 gMC->Gspos("S04B",5,"S04M", +iChamber->RInner()+bpar[0] , 0,+zfpos,
219 gMC->Gspos("S04B",6,"S04M", -iChamber->RInner()-bpar[0] , 0,+zfpos,
221 gMC->Gspos("S04B",7,"S04M", 0, +iChamber->RInner()+bpar[0] ,+zfpos,
223 gMC->Gspos("S04B",8,"S04M", 0, -iChamber->RInner()-bpar[0] ,+zfpos,
227 // Chamber Material represented by Alu sheet
228 tpar[0]= iChamber->RInner();
229 tpar[1]= iChamber->ROuter();
230 tpar[2] = (iChamber->DGas()+iChamber->DAlu())/2;
231 gMC->Gsvolu("S03A", "TUBE", idAlu2, tpar, 3);
232 gMC->Gsvolu("S04A", "TUBE", idAlu2, tpar, 3);
233 gMC->Gspos("S03A", 1, "S03M", 0., 0., 0., 0, "ONLY");
234 gMC->Gspos("S04A", 1, "S04M", 0., 0., 0., 0, "ONLY");
237 // tpar[2] = iChamber->DGas();
238 tpar[2] = iChamber->DGas()/2;
239 gMC->Gsvolu("S03G", "TUBE", idGas, tpar, 3);
240 gMC->Gsvolu("S04G", "TUBE", idGas, tpar, 3);
241 gMC->Gspos("S03G", 1, "S03A", 0., 0., 0., 0, "ONLY");
242 gMC->Gspos("S04G", 1, "S04A", 0., 0., 0., 0, "ONLY");
244 // Frame Crosses to be placed inside gas
245 // NONE: chambers are sensitive everywhere
246 // if (frameCrosses) {
248 // dr = (iChamber->ROuter() - iChamber->RInner());
249 // bpar[0] = TMath::Sqrt(dr*dr-dframep1*dframep1/4)/2;
250 // bpar[1] = dframep1/2;
251 // bpar[2] = iChamber->DGas()/2;
252 // gMC->Gsvolu("S03F", "BOX", idAlu1, bpar, 3);
253 // gMC->Gsvolu("S04F", "BOX", idAlu1, bpar, 3);
255 // gMC->Gspos("S03F",1,"S03G", +iChamber->RInner()+bpar[0] , 0, 0,
257 // gMC->Gspos("S03F",2,"S03G", -iChamber->RInner()-bpar[0] , 0, 0,
259 // gMC->Gspos("S03F",3,"S03G", 0, +iChamber->RInner()+bpar[0] , 0,
261 // gMC->Gspos("S03F",4,"S03G", 0, -iChamber->RInner()-bpar[0] , 0,
264 // gMC->Gspos("S04F",1,"S04G", +iChamber->RInner()+bpar[0] , 0, 0,
266 // gMC->Gspos("S04F",2,"S04G", -iChamber->RInner()-bpar[0] , 0, 0,
268 // gMC->Gspos("S04F",3,"S04G", 0, +iChamber->RInner()+bpar[0] , 0,
270 // gMC->Gspos("S04F",4,"S04G", 0, -iChamber->RInner()-bpar[0] , 0,
274 iChamber1 = iChamber = (AliMUONChamber*) (*fChambers)[2];
275 iChamber2 =(AliMUONChamber*) (*fChambers)[3];
276 zpos1=iChamber1->Z();
277 zpos2=iChamber2->Z();
278 dstation = zpos2 - zpos1;
279 // DGas and DAlu not changed from standard values
280 zfpos=-(iChamber->DGas()+dframez+iChamber->DAlu())/2;
284 tpar[0] = iChamber->RInner()-dframep;
285 tpar[1] = (iChamber->ROuter()+dframep)/TMath::Cos(phi);
286 tpar[2] = dstation/5;
288 gMC->Gsvolu("S03M", "TUBE", idAir, tpar, 3);
289 gMC->Gsvolu("S04M", "TUBE", idAir, tpar, 3);
290 gMC->Gspos("S03M", 1, "ALIC", 0., 0., zpos1 , 0, "ONLY");
291 gMC->Gspos("S04M", 1, "ALIC", 0., 0., zpos2 , 0, "ONLY");
292 gMC->Gsbool("S03M", "L3DO");
293 gMC->Gsbool("S03M", "L3O1");
294 gMC->Gsbool("S03M", "L3O2");
295 gMC->Gsbool("S04M", "L3DO");
296 gMC->Gsbool("S04M", "L3O1");
297 gMC->Gsbool("S04M", "L3O2");
299 // // Aluminium frames
301 // pgpar[0] = 360/12/2;
305 // pgpar[4] = -dframez/2;
306 // pgpar[5] = iChamber->ROuter();
307 // pgpar[6] = pgpar[5]+dframep;
308 // pgpar[7] = +dframez/2;
309 // pgpar[8] = pgpar[5];
310 // pgpar[9] = pgpar[6];
311 // gMC->Gsvolu("S03O", "PGON", idAlu1, pgpar, 10);
312 // gMC->Gsvolu("S04O", "PGON", idAlu1, pgpar, 10);
313 // gMC->Gspos("S03O",1,"S03M", 0.,0.,-zfpos, 0,"ONLY");
314 // gMC->Gspos("S03O",2,"S03M", 0.,0.,+zfpos, 0,"ONLY");
315 // gMC->Gspos("S04O",1,"S04M", 0.,0.,-zfpos, 0,"ONLY");
316 // gMC->Gspos("S04O",2,"S04M", 0.,0.,+zfpos, 0,"ONLY");
319 // tpar[0]= iChamber->RInner()-dframep;
320 // tpar[1]= iChamber->RInner();
321 // tpar[2]= dframez/2;
322 // gMC->Gsvolu("S03I", "TUBE", idAlu1, tpar, 3);
323 // gMC->Gsvolu("S04I", "TUBE", idAlu1, tpar, 3);
325 // gMC->Gspos("S03I",1,"S03M", 0.,0.,-zfpos, 0,"ONLY");
326 // gMC->Gspos("S03I",2,"S03M", 0.,0.,+zfpos, 0,"ONLY");
327 // gMC->Gspos("S04I",1,"S04M", 0.,0.,-zfpos, 0,"ONLY");
328 // gMC->Gspos("S04I",2,"S04M", 0.,0.,+zfpos, 0,"ONLY");
333 // security for inside mother volume
334 bpar[0] = (iChamber->ROuter() - iChamber->RInner())
335 * TMath::Cos(TMath::ASin(dframep1 /
336 (iChamber->ROuter() - iChamber->RInner())))
338 bpar[1] = dframep1/2;
339 // total thickness will be (4 * bpar[2]) for each chamber,
340 // which has to be equal to (2 * dframez) - DAlu
341 bpar[2] = (2.0 * dframez - iChamber->DAlu()) / 4.0;
342 gMC->Gsvolu("S03B", "BOX", idAlu1, bpar, 3);
343 gMC->Gsvolu("S04B", "BOX", idAlu1, bpar, 3);
345 gMC->Gspos("S03B",1,"S03M", +iChamber->RInner()+bpar[0] , 0,-zfpos,
347 gMC->Gspos("S03B",2,"S03M", -iChamber->RInner()-bpar[0] , 0,-zfpos,
349 gMC->Gspos("S03B",3,"S03M", 0, +iChamber->RInner()+bpar[0] ,-zfpos,
351 gMC->Gspos("S03B",4,"S03M", 0, -iChamber->RInner()-bpar[0] ,-zfpos,
353 gMC->Gspos("S03B",5,"S03M", +iChamber->RInner()+bpar[0] , 0,+zfpos,
355 gMC->Gspos("S03B",6,"S03M", -iChamber->RInner()-bpar[0] , 0,+zfpos,
357 gMC->Gspos("S03B",7,"S03M", 0, +iChamber->RInner()+bpar[0] ,+zfpos,
359 gMC->Gspos("S03B",8,"S03M", 0, -iChamber->RInner()-bpar[0] ,+zfpos,
362 gMC->Gspos("S04B",1,"S04M", +iChamber->RInner()+bpar[0] , 0,-zfpos,
364 gMC->Gspos("S04B",2,"S04M", -iChamber->RInner()-bpar[0] , 0,-zfpos,
366 gMC->Gspos("S04B",3,"S04M", 0, +iChamber->RInner()+bpar[0] ,-zfpos,
368 gMC->Gspos("S04B",4,"S04M", 0, -iChamber->RInner()-bpar[0] ,-zfpos,
370 gMC->Gspos("S04B",5,"S04M", +iChamber->RInner()+bpar[0] , 0,+zfpos,
372 gMC->Gspos("S04B",6,"S04M", -iChamber->RInner()-bpar[0] , 0,+zfpos,
374 gMC->Gspos("S04B",7,"S04M", 0, +iChamber->RInner()+bpar[0] ,+zfpos,
376 gMC->Gspos("S04B",8,"S04M", 0, -iChamber->RInner()-bpar[0] ,+zfpos,
380 // Chamber Material represented by Alu sheet
381 tpar[0]= iChamber->RInner();
382 tpar[1]= iChamber->ROuter();
383 tpar[2] = (iChamber->DGas()+iChamber->DAlu())/2;
384 gMC->Gsvolu("S03A", "TUBE", idAlu2, tpar, 3);
385 gMC->Gsvolu("S04A", "TUBE", idAlu2, tpar, 3);
386 gMC->Gspos("S03A", 1, "S03M", 0., 0., 0., 0, "ONLY");
387 gMC->Gspos("S04A", 1, "S04M", 0., 0., 0., 0, "ONLY");
390 // tpar[2] = iChamber->DGas();
391 tpar[2] = iChamber->DGas()/2;
392 gMC->Gsvolu("S03G", "TUBE", idGas, tpar, 3);
393 gMC->Gsvolu("S04G", "TUBE", idGas, tpar, 3);
394 gMC->Gspos("S03G", 1, "S03A", 0., 0., 0., 0, "ONLY");
395 gMC->Gspos("S04G", 1, "S04A", 0., 0., 0., 0, "ONLY");
397 // Frame Crosses to be placed inside gas
398 // NONE: chambers are sensitive everywhere
399 // if (frameCrosses) {
401 // dr = (iChamber->ROuter() - iChamber->RInner());
402 // bpar[0] = TMath::Sqrt(dr*dr-dframep1*dframep1/4)/2;
403 // bpar[1] = dframep1/2;
404 // bpar[2] = iChamber->DGas()/2;
405 // gMC->Gsvolu("S03F", "BOX", idAlu1, bpar, 3);
406 // gMC->Gsvolu("S04F", "BOX", idAlu1, bpar, 3);
408 // gMC->Gspos("S03F",1,"S03G", +iChamber->RInner()+bpar[0] , 0, 0,
410 // gMC->Gspos("S03F",2,"S03G", -iChamber->RInner()-bpar[0] , 0, 0,
412 // gMC->Gspos("S03F",3,"S03G", 0, +iChamber->RInner()+bpar[0] , 0,
414 // gMC->Gspos("S03F",4,"S03G", 0, -iChamber->RInner()-bpar[0] , 0,
417 // gMC->Gspos("S04F",1,"S04G", +iChamber->RInner()+bpar[0] , 0, 0,
419 // gMC->Gspos("S04F",2,"S04G", -iChamber->RInner()-bpar[0] , 0, 0,
421 // gMC->Gspos("S04F",3,"S04G", 0, +iChamber->RInner()+bpar[0] , 0,
423 // gMC->Gspos("S04F",4,"S04G", 0, -iChamber->RInner()-bpar[0] , 0,
430 //______________________________________________________________________________
431 void AliMUONSt2GeometryBuilder::SetTransformations()
433 // Defines the transformations for the station2 chambers.
436 AliMUONChamber* iChamber1 = GetChamber(2);
437 Double_t zpos1 = - iChamber1->Z();
438 iChamber1->GetGeometry()
439 ->SetTranslation(TGeoTranslation(0., 0., zpos1));
441 AliMUONChamber* iChamber2 = GetChamber(3);
442 Double_t zpos2 = - iChamber2->Z();
443 iChamber2->GetGeometry()
444 ->SetTranslation(TGeoTranslation(0., 0., zpos2));
447 //______________________________________________________________________________
448 void AliMUONSt2GeometryBuilder::SetSensitiveVolumes()
450 // Defines the sensitive volumes for station2 chambers.
453 GetChamber(2)->GetGeometry()->SetSensitiveVolume("S03G");
454 GetChamber(3)->GetGeometry()->SetSensitiveVolume("S04G");