1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 purpeateose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 Revision 1.29 2001/06/21 14:54:37 morsch
19 Put volumes of station 3 into DIPO if present. (A. de Falco)
21 Revision 1.28 2001/05/16 14:57:17 alibrary
22 New files for folders and Stack
24 Revision 1.27 2001/04/06 11:24:43 morsch
25 Dependency on implementations of AliSegmentation and AliMUONResponse moved to AliMUONFactory class.
26 Static method Build() builds the MUON system out of chambers, segmentation and response.
28 Revision 1.26 2001/03/17 10:07:20 morsch
29 Correct inconsistent variable name / method name / comments.
31 Revision 1.25 2001/03/16 15:32:06 morsch
32 Corrections of overlap with beam shield and dipole (A. de Falco)
34 Revision 1.24 2001/03/14 17:22:15 pcrochet
35 Geometry of the trigger chambers : a vertical gap of has been introduced around x=0 according fig.3.27 of the TDR (P.Dupieux)
37 Revision 1.23 2001/01/18 15:23:49 egangler
38 Bug correction in StepManager :
39 Now the systematic offset with angle is cured
41 Revision 1.22 2001/01/17 21:01:21 hristov
42 Unused variable removed
44 Revision 1.21 2000/12/20 13:00:22 egangler
46 Added charge correlation between cathods.
48 MUON->Chamber(chamber-1).SetChargeCorrel(0.11); to set the RMS of
49 q1/q2 to 11 % (number from Alberto)
50 This is stored in AliMUONChamber fChargeCorrel member.
51 At generation time, when a tracks enters the volume,
52 AliMUONv1::StepManager calls
53 AliMUONChamber::ChargeCorrelationInit() to set the current value of
54 fCurrentCorrel which is then used at Disintegration level to scale
55 appropriately the PadHit charges.
57 Revision 1.20 2000/12/04 17:48:23 gosset
58 Modifications for stations 1 et 2 mainly:
59 * station 1 with 4 mm gas gap and smaller cathode segmentation...
60 * stations 1 and 2 with "grey" frame crosses
61 * mean noise at 1.5 ADC channel
62 * Ar-CO2 gas (80%+20%)
64 Revision 1.19 2000/12/02 17:15:46 morsch
65 Correction of dead zones in inner regions of stations 3-5
66 Correction of length of slats 3 and 9 of station 4.
68 Revision 1.17 2000/11/24 12:57:10 morsch
69 New version of geometry for stations 3-5 "Slats" (A. de Falco)
70 - sensitive region at station 3 inner radius
71 - improved volume tree structure
73 Revision 1.16 2000/11/08 13:01:40 morsch
74 Chamber half-planes of stations 3-5 at different z-positions.
76 Revision 1.15 2000/11/06 11:39:02 morsch
77 Bug in StepManager() corrected.
79 Revision 1.14 2000/11/06 09:16:50 morsch
80 Avoid overlap of slat volumes.
82 Revision 1.13 2000/10/26 07:33:44 morsch
83 Correct x-position of slats in station 5.
85 Revision 1.12 2000/10/25 19:55:35 morsch
86 Switches for each station individually for debug and lego.
88 Revision 1.11 2000/10/22 16:44:01 morsch
89 Update of slat geometry for stations 3,4,5 (A. deFalco)
91 Revision 1.10 2000/10/12 16:07:04 gosset
93 * SigGenCond only called for tracking chambers,
94 hence no more division by 0,
95 and may use last ALIROOT/dummies.C with exception handling;
96 * "10" replaced by "AliMUONConstants::NTrackingCh()".
98 Revision 1.9 2000/10/06 15:37:22 morsch
99 Problems with variable redefinition in for-loop solved.
100 Variable names starting with u-case letters changed to l-case.
102 Revision 1.8 2000/10/06 09:06:31 morsch
103 Include Slat chambers (stations 3-5) into geometry (A. de Falco)
105 Revision 1.7 2000/10/02 21:28:09 fca
106 Removal of useless dependecies via forward declarations
108 Revision 1.6 2000/10/02 17:20:45 egangler
109 Cleaning of the code (continued ) :
110 -> coding conventions
112 -> some useless includes removed or replaced by "class" statement
114 Revision 1.5 2000/06/28 15:16:35 morsch
115 (1) Client code adapted to new method signatures in AliMUONSegmentation (see comments there)
116 to allow development of slat-muon chamber simulation and reconstruction code in the MUON
117 framework. The changes should have no side effects (mostly dummy arguments).
118 (2) Hit disintegration uses 3-dim hit coordinates to allow simulation
119 of chambers with overlapping modules (MakePadHits, Disintegration).
121 Revision 1.4 2000/06/26 14:02:38 morsch
122 Add class AliMUONConstants with MUON specific constants using static memeber data and access methods.
124 Revision 1.3 2000/06/22 14:10:05 morsch
125 HP scope problems corrected (PH)
127 Revision 1.2 2000/06/15 07:58:49 morsch
128 Code from MUON-dev joined
130 Revision 1.1.2.14 2000/06/14 14:37:25 morsch
131 Initialization of TriggerCircuit added (PC)
133 Revision 1.1.2.13 2000/06/09 21:55:47 morsch
134 Most coding rule violations corrected.
136 Revision 1.1.2.12 2000/05/05 11:34:29 morsch
139 Revision 1.1.2.11 2000/05/05 10:06:48 morsch
140 Coding Rule violations regarding trigger section corrected (CP)
141 Log messages included.
144 /////////////////////////////////////////////////////////
145 // Manager and hits classes for set:MUON version 0 //
146 /////////////////////////////////////////////////////////
151 #include <TLorentzVector.h>
152 #include <iostream.h>
154 #include "AliMUONv1.h"
158 #include "AliCallf77.h"
159 #include "AliConst.h"
160 #include "AliMUONChamber.h"
161 #include "AliMUONHit.h"
162 #include "AliMUONPadHit.h"
163 #include "AliMUONConstants.h"
164 #include "AliMUONTriggerCircuit.h"
165 #include "AliMUONFactory.h"
169 //___________________________________________
170 AliMUONv1::AliMUONv1() : AliMUON()
176 //___________________________________________
177 AliMUONv1::AliMUONv1(const char *name, const char *title)
178 : AliMUON(name,title)
181 AliMUONFactory::Build(this, title);
184 //___________________________________________
185 void AliMUONv1::CreateGeometry()
188 // Note: all chambers have the same structure, which could be
189 // easily parameterised. This was intentionally not done in order
190 // to give a starting point for the implementation of the actual
191 // design of each station.
192 Int_t *idtmed = fIdtmed->GetArray()-1099;
194 // Distance between Stations
198 // Float_t pgpar[10];
199 Float_t zpos1, zpos2, zfpos;
200 // Outer excess and inner recess for mother volume radius
201 // with respect to ROuter and RInner
202 Float_t dframep=.001; // Value for station 3 should be 6 ...
203 // Width (RdPhi) of the frame crosses for stations 1 and 2 (cm)
204 // Float_t dframep1=.001;
205 Float_t dframep1 = 11.0;
206 // Bool_t frameCrosses=kFALSE;
207 Bool_t frameCrosses=kTRUE;
209 // Float_t dframez=0.9;
210 // Half of the total thickness of frame crosses (including DAlu)
211 // for each chamber in stations 1 and 2:
212 // 3% of X0 of composite material,
213 // but taken as Aluminium here, with same thickness in number of X0
214 Float_t dframez = 3. * 8.9 / 100;
219 // Rotation matrices in the x-y plane
222 AliMatrix(idrotm[1100], 90., 0., 90., 90., 0., 0.);
224 AliMatrix(idrotm[1101], 90., 90., 90., 180., 0., 0.);
226 AliMatrix(idrotm[1102], 90., 180., 90., 270., 0., 0.);
228 AliMatrix(idrotm[1103], 90., 270., 90., 0., 0., 0.);
230 Float_t phi=2*TMath::Pi()/12/2;
233 // pointer to the current chamber
234 // pointer to the current chamber
235 Int_t idAlu1=idtmed[1103]; // medium 4
236 Int_t idAlu2=idtmed[1104]; // medium 5
237 // Int_t idAlu1=idtmed[1100];
238 // Int_t idAlu2=idtmed[1100];
239 Int_t idAir=idtmed[1100]; // medium 1
240 // Int_t idGas=idtmed[1105]; // medium 6 = Ar-isoC4H10 gas
241 Int_t idGas=idtmed[1108]; // medium 9 = Ar-CO2 gas (80%+20%)
244 AliMUONChamber *iChamber, *iChamber1, *iChamber2;
245 Int_t stations[5] = {1, 1, 1, 1, 1};
249 //********************************************************************
251 //********************************************************************
253 // indices 1 and 2 for first and second chambers in the station
254 // iChamber (first chamber) kept for other quanties than Z,
255 // assumed to be the same in both chambers
256 iChamber1 = iChamber = (AliMUONChamber*) (*fChambers)[0];
257 iChamber2 =(AliMUONChamber*) (*fChambers)[1];
258 zpos1=iChamber1->Z();
259 zpos2=iChamber2->Z();
260 dstation = zpos2 - zpos1;
261 // DGas decreased from standard one (0.5)
262 iChamber->SetDGas(0.4); iChamber2->SetDGas(0.4);
263 // DAlu increased from standard one (3% of X0),
264 // because more electronics with smaller pads
265 iChamber->SetDAlu(3.5 * 8.9 / 100.); iChamber2->SetDAlu(3.5 * 8.9 / 100.);
266 zfpos=-(iChamber->DGas()+dframez+iChamber->DAlu())/2;
270 tpar[0] = iChamber->RInner()-dframep;
271 tpar[1] = (iChamber->ROuter()+dframep)/TMath::Cos(phi);
272 tpar[2] = dstation/5;
274 gMC->Gsvolu("C01M", "TUBE", idAir, tpar, 3);
275 gMC->Gsvolu("C02M", "TUBE", idAir, tpar, 3);
276 gMC->Gspos("C01M", 1, "ALIC", 0., 0., zpos1 , 0, "ONLY");
277 gMC->Gspos("C02M", 1, "ALIC", 0., 0., zpos2 , 0, "ONLY");
278 // // Aluminium frames
280 // pgpar[0] = 360/12/2;
284 // pgpar[4] = -dframez/2;
285 // pgpar[5] = iChamber->ROuter();
286 // pgpar[6] = pgpar[5]+dframep1;
287 // pgpar[7] = +dframez/2;
288 // pgpar[8] = pgpar[5];
289 // pgpar[9] = pgpar[6];
290 // gMC->Gsvolu("C01O", "PGON", idAlu1, pgpar, 10);
291 // gMC->Gsvolu("C02O", "PGON", idAlu1, pgpar, 10);
292 // gMC->Gspos("C01O",1,"C01M", 0.,0.,-zfpos, 0,"ONLY");
293 // gMC->Gspos("C01O",2,"C01M", 0.,0.,+zfpos, 0,"ONLY");
294 // gMC->Gspos("C02O",1,"C02M", 0.,0.,-zfpos, 0,"ONLY");
295 // gMC->Gspos("C02O",2,"C02M", 0.,0.,+zfpos, 0,"ONLY");
298 // tpar[0]= iChamber->RInner()-dframep1;
299 // tpar[1]= iChamber->RInner();
300 // tpar[2]= dframez/2;
301 // gMC->Gsvolu("C01I", "TUBE", idAlu1, tpar, 3);
302 // gMC->Gsvolu("C02I", "TUBE", idAlu1, tpar, 3);
304 // gMC->Gspos("C01I",1,"C01M", 0.,0.,-zfpos, 0,"ONLY");
305 // gMC->Gspos("C01I",2,"C01M", 0.,0.,+zfpos, 0,"ONLY");
306 // gMC->Gspos("C02I",1,"C02M", 0.,0.,-zfpos, 0,"ONLY");
307 // gMC->Gspos("C02I",2,"C02M", 0.,0.,+zfpos, 0,"ONLY");
312 // security for inside mother volume
313 bpar[0] = (iChamber->ROuter() - iChamber->RInner())
314 * TMath::Cos(TMath::ASin(dframep1 /
315 (iChamber->ROuter() - iChamber->RInner())))
317 bpar[1] = dframep1/2;
318 // total thickness will be (4 * bpar[2]) for each chamber,
319 // which has to be equal to (2 * dframez) - DAlu
320 bpar[2] = (2.0 * dframez - iChamber->DAlu()) / 4.0;
321 gMC->Gsvolu("C01B", "BOX", idAlu1, bpar, 3);
322 gMC->Gsvolu("C02B", "BOX", idAlu1, bpar, 3);
324 gMC->Gspos("C01B",1,"C01M", +iChamber->RInner()+bpar[0] , 0,-zfpos,
325 idrotm[1100],"ONLY");
326 gMC->Gspos("C01B",2,"C01M", -iChamber->RInner()-bpar[0] , 0,-zfpos,
327 idrotm[1100],"ONLY");
328 gMC->Gspos("C01B",3,"C01M", 0, +iChamber->RInner()+bpar[0] ,-zfpos,
329 idrotm[1101],"ONLY");
330 gMC->Gspos("C01B",4,"C01M", 0, -iChamber->RInner()-bpar[0] ,-zfpos,
331 idrotm[1101],"ONLY");
332 gMC->Gspos("C01B",5,"C01M", +iChamber->RInner()+bpar[0] , 0,+zfpos,
333 idrotm[1100],"ONLY");
334 gMC->Gspos("C01B",6,"C01M", -iChamber->RInner()-bpar[0] , 0,+zfpos,
335 idrotm[1100],"ONLY");
336 gMC->Gspos("C01B",7,"C01M", 0, +iChamber->RInner()+bpar[0] ,+zfpos,
337 idrotm[1101],"ONLY");
338 gMC->Gspos("C01B",8,"C01M", 0, -iChamber->RInner()-bpar[0] ,+zfpos,
339 idrotm[1101],"ONLY");
341 gMC->Gspos("C02B",1,"C02M", +iChamber->RInner()+bpar[0] , 0,-zfpos,
342 idrotm[1100],"ONLY");
343 gMC->Gspos("C02B",2,"C02M", -iChamber->RInner()-bpar[0] , 0,-zfpos,
344 idrotm[1100],"ONLY");
345 gMC->Gspos("C02B",3,"C02M", 0, +iChamber->RInner()+bpar[0] ,-zfpos,
346 idrotm[1101],"ONLY");
347 gMC->Gspos("C02B",4,"C02M", 0, -iChamber->RInner()-bpar[0] ,-zfpos,
348 idrotm[1101],"ONLY");
349 gMC->Gspos("C02B",5,"C02M", +iChamber->RInner()+bpar[0] , 0,+zfpos,
350 idrotm[1100],"ONLY");
351 gMC->Gspos("C02B",6,"C02M", -iChamber->RInner()-bpar[0] , 0,+zfpos,
352 idrotm[1100],"ONLY");
353 gMC->Gspos("C02B",7,"C02M", 0, +iChamber->RInner()+bpar[0] ,+zfpos,
354 idrotm[1101],"ONLY");
355 gMC->Gspos("C02B",8,"C02M", 0, -iChamber->RInner()-bpar[0] ,+zfpos,
356 idrotm[1101],"ONLY");
359 // Chamber Material represented by Alu sheet
360 tpar[0]= iChamber->RInner();
361 tpar[1]= iChamber->ROuter();
362 tpar[2] = (iChamber->DGas()+iChamber->DAlu())/2;
363 gMC->Gsvolu("C01A", "TUBE", idAlu2, tpar, 3);
364 gMC->Gsvolu("C02A", "TUBE",idAlu2, tpar, 3);
365 gMC->Gspos("C01A", 1, "C01M", 0., 0., 0., 0, "ONLY");
366 gMC->Gspos("C02A", 1, "C02M", 0., 0., 0., 0, "ONLY");
369 // tpar[2] = iChamber->DGas();
370 tpar[2] = iChamber->DGas()/2;
371 gMC->Gsvolu("C01G", "TUBE", idGas, tpar, 3);
372 gMC->Gsvolu("C02G", "TUBE", idGas, tpar, 3);
373 gMC->Gspos("C01G", 1, "C01A", 0., 0., 0., 0, "ONLY");
374 gMC->Gspos("C02G", 1, "C02A", 0., 0., 0., 0, "ONLY");
376 // Frame Crosses to be placed inside gas
377 // NONE: chambers are sensitive everywhere
378 // if (frameCrosses) {
380 // dr = (iChamber->ROuter() - iChamber->RInner());
381 // bpar[0] = TMath::Sqrt(dr*dr-dframep1*dframep1/4)/2;
382 // bpar[1] = dframep1/2;
383 // bpar[2] = iChamber->DGas()/2;
384 // gMC->Gsvolu("C01F", "BOX", idAlu1, bpar, 3);
385 // gMC->Gsvolu("C02F", "BOX", idAlu1, bpar, 3);
387 // gMC->Gspos("C01F",1,"C01G", +iChamber->RInner()+bpar[0] , 0, 0,
388 // idrotm[1100],"ONLY");
389 // gMC->Gspos("C01F",2,"C01G", -iChamber->RInner()-bpar[0] , 0, 0,
390 // idrotm[1100],"ONLY");
391 // gMC->Gspos("C01F",3,"C01G", 0, +iChamber->RInner()+bpar[0] , 0,
392 // idrotm[1101],"ONLY");
393 // gMC->Gspos("C01F",4,"C01G", 0, -iChamber->RInner()-bpar[0] , 0,
394 // idrotm[1101],"ONLY");
396 // gMC->Gspos("C02F",1,"C02G", +iChamber->RInner()+bpar[0] , 0, 0,
397 // idrotm[1100],"ONLY");
398 // gMC->Gspos("C02F",2,"C02G", -iChamber->RInner()-bpar[0] , 0, 0,
399 // idrotm[1100],"ONLY");
400 // gMC->Gspos("C02F",3,"C02G", 0, +iChamber->RInner()+bpar[0] , 0,
401 // idrotm[1101],"ONLY");
402 // gMC->Gspos("C02F",4,"C02G", 0, -iChamber->RInner()-bpar[0] , 0,
403 // idrotm[1101],"ONLY");
408 //********************************************************************
410 //********************************************************************
411 // indices 1 and 2 for first and second chambers in the station
412 // iChamber (first chamber) kept for other quanties than Z,
413 // assumed to be the same in both chambers
414 iChamber1 = iChamber = (AliMUONChamber*) (*fChambers)[2];
415 iChamber2 =(AliMUONChamber*) (*fChambers)[3];
416 zpos1=iChamber1->Z();
417 zpos2=iChamber2->Z();
418 dstation = zpos2 - zpos1;
419 // DGas and DAlu not changed from standard values
420 zfpos=-(iChamber->DGas()+dframez+iChamber->DAlu())/2;
424 tpar[0] = iChamber->RInner()-dframep;
425 tpar[1] = (iChamber->ROuter()+dframep)/TMath::Cos(phi);
426 tpar[2] = dstation/5;
428 gMC->Gsvolu("C03M", "TUBE", idAir, tpar, 3);
429 gMC->Gsvolu("C04M", "TUBE", idAir, tpar, 3);
430 gMC->Gspos("C03M", 1, "ALIC", 0., 0., zpos1 , 0, "ONLY");
431 gMC->Gspos("C04M", 1, "ALIC", 0., 0., zpos2 , 0, "ONLY");
433 // // Aluminium frames
435 // pgpar[0] = 360/12/2;
439 // pgpar[4] = -dframez/2;
440 // pgpar[5] = iChamber->ROuter();
441 // pgpar[6] = pgpar[5]+dframep;
442 // pgpar[7] = +dframez/2;
443 // pgpar[8] = pgpar[5];
444 // pgpar[9] = pgpar[6];
445 // gMC->Gsvolu("C03O", "PGON", idAlu1, pgpar, 10);
446 // gMC->Gsvolu("C04O", "PGON", idAlu1, pgpar, 10);
447 // gMC->Gspos("C03O",1,"C03M", 0.,0.,-zfpos, 0,"ONLY");
448 // gMC->Gspos("C03O",2,"C03M", 0.,0.,+zfpos, 0,"ONLY");
449 // gMC->Gspos("C04O",1,"C04M", 0.,0.,-zfpos, 0,"ONLY");
450 // gMC->Gspos("C04O",2,"C04M", 0.,0.,+zfpos, 0,"ONLY");
453 // tpar[0]= iChamber->RInner()-dframep;
454 // tpar[1]= iChamber->RInner();
455 // tpar[2]= dframez/2;
456 // gMC->Gsvolu("C03I", "TUBE", idAlu1, tpar, 3);
457 // gMC->Gsvolu("C04I", "TUBE", idAlu1, tpar, 3);
459 // gMC->Gspos("C03I",1,"C03M", 0.,0.,-zfpos, 0,"ONLY");
460 // gMC->Gspos("C03I",2,"C03M", 0.,0.,+zfpos, 0,"ONLY");
461 // gMC->Gspos("C04I",1,"C04M", 0.,0.,-zfpos, 0,"ONLY");
462 // gMC->Gspos("C04I",2,"C04M", 0.,0.,+zfpos, 0,"ONLY");
467 // security for inside mother volume
468 bpar[0] = (iChamber->ROuter() - iChamber->RInner())
469 * TMath::Cos(TMath::ASin(dframep1 /
470 (iChamber->ROuter() - iChamber->RInner())))
472 bpar[1] = dframep1/2;
473 // total thickness will be (4 * bpar[2]) for each chamber,
474 // which has to be equal to (2 * dframez) - DAlu
475 bpar[2] = (2.0 * dframez - iChamber->DAlu()) / 4.0;
476 gMC->Gsvolu("C03B", "BOX", idAlu1, bpar, 3);
477 gMC->Gsvolu("C04B", "BOX", idAlu1, bpar, 3);
479 gMC->Gspos("C03B",1,"C03M", +iChamber->RInner()+bpar[0] , 0,-zfpos,
480 idrotm[1100],"ONLY");
481 gMC->Gspos("C03B",2,"C03M", -iChamber->RInner()-bpar[0] , 0,-zfpos,
482 idrotm[1100],"ONLY");
483 gMC->Gspos("C03B",3,"C03M", 0, +iChamber->RInner()+bpar[0] ,-zfpos,
484 idrotm[1101],"ONLY");
485 gMC->Gspos("C03B",4,"C03M", 0, -iChamber->RInner()-bpar[0] ,-zfpos,
486 idrotm[1101],"ONLY");
487 gMC->Gspos("C03B",5,"C03M", +iChamber->RInner()+bpar[0] , 0,+zfpos,
488 idrotm[1100],"ONLY");
489 gMC->Gspos("C03B",6,"C03M", -iChamber->RInner()-bpar[0] , 0,+zfpos,
490 idrotm[1100],"ONLY");
491 gMC->Gspos("C03B",7,"C03M", 0, +iChamber->RInner()+bpar[0] ,+zfpos,
492 idrotm[1101],"ONLY");
493 gMC->Gspos("C03B",8,"C03M", 0, -iChamber->RInner()-bpar[0] ,+zfpos,
494 idrotm[1101],"ONLY");
496 gMC->Gspos("C04B",1,"C04M", +iChamber->RInner()+bpar[0] , 0,-zfpos,
497 idrotm[1100],"ONLY");
498 gMC->Gspos("C04B",2,"C04M", -iChamber->RInner()-bpar[0] , 0,-zfpos,
499 idrotm[1100],"ONLY");
500 gMC->Gspos("C04B",3,"C04M", 0, +iChamber->RInner()+bpar[0] ,-zfpos,
501 idrotm[1101],"ONLY");
502 gMC->Gspos("C04B",4,"C04M", 0, -iChamber->RInner()-bpar[0] ,-zfpos,
503 idrotm[1101],"ONLY");
504 gMC->Gspos("C04B",5,"C04M", +iChamber->RInner()+bpar[0] , 0,+zfpos,
505 idrotm[1100],"ONLY");
506 gMC->Gspos("C04B",6,"C04M", -iChamber->RInner()-bpar[0] , 0,+zfpos,
507 idrotm[1100],"ONLY");
508 gMC->Gspos("C04B",7,"C04M", 0, +iChamber->RInner()+bpar[0] ,+zfpos,
509 idrotm[1101],"ONLY");
510 gMC->Gspos("C04B",8,"C04M", 0, -iChamber->RInner()-bpar[0] ,+zfpos,
511 idrotm[1101],"ONLY");
514 // Chamber Material represented by Alu sheet
515 tpar[0]= iChamber->RInner();
516 tpar[1]= iChamber->ROuter();
517 tpar[2] = (iChamber->DGas()+iChamber->DAlu())/2;
518 gMC->Gsvolu("C03A", "TUBE", idAlu2, tpar, 3);
519 gMC->Gsvolu("C04A", "TUBE", idAlu2, tpar, 3);
520 gMC->Gspos("C03A", 1, "C03M", 0., 0., 0., 0, "ONLY");
521 gMC->Gspos("C04A", 1, "C04M", 0., 0., 0., 0, "ONLY");
524 // tpar[2] = iChamber->DGas();
525 tpar[2] = iChamber->DGas()/2;
526 gMC->Gsvolu("C03G", "TUBE", idGas, tpar, 3);
527 gMC->Gsvolu("C04G", "TUBE", idGas, tpar, 3);
528 gMC->Gspos("C03G", 1, "C03A", 0., 0., 0., 0, "ONLY");
529 gMC->Gspos("C04G", 1, "C04A", 0., 0., 0., 0, "ONLY");
531 // Frame Crosses to be placed inside gas
532 // NONE: chambers are sensitive everywhere
533 // if (frameCrosses) {
535 // dr = (iChamber->ROuter() - iChamber->RInner());
536 // bpar[0] = TMath::Sqrt(dr*dr-dframep1*dframep1/4)/2;
537 // bpar[1] = dframep1/2;
538 // bpar[2] = iChamber->DGas()/2;
539 // gMC->Gsvolu("C03F", "BOX", idAlu1, bpar, 3);
540 // gMC->Gsvolu("C04F", "BOX", idAlu1, bpar, 3);
542 // gMC->Gspos("C03F",1,"C03G", +iChamber->RInner()+bpar[0] , 0, 0,
543 // idrotm[1100],"ONLY");
544 // gMC->Gspos("C03F",2,"C03G", -iChamber->RInner()-bpar[0] , 0, 0,
545 // idrotm[1100],"ONLY");
546 // gMC->Gspos("C03F",3,"C03G", 0, +iChamber->RInner()+bpar[0] , 0,
547 // idrotm[1101],"ONLY");
548 // gMC->Gspos("C03F",4,"C03G", 0, -iChamber->RInner()-bpar[0] , 0,
549 // idrotm[1101],"ONLY");
551 // gMC->Gspos("C04F",1,"C04G", +iChamber->RInner()+bpar[0] , 0, 0,
552 // idrotm[1100],"ONLY");
553 // gMC->Gspos("C04F",2,"C04G", -iChamber->RInner()-bpar[0] , 0, 0,
554 // idrotm[1100],"ONLY");
555 // gMC->Gspos("C04F",3,"C04G", 0, +iChamber->RInner()+bpar[0] , 0,
556 // idrotm[1101],"ONLY");
557 // gMC->Gspos("C04F",4,"C04G", 0, -iChamber->RInner()-bpar[0] , 0,
558 // idrotm[1101],"ONLY");
561 // define the id of tracking media:
562 Int_t idCopper = idtmed[1110];
563 Int_t idGlass = idtmed[1111];
564 Int_t idCarbon = idtmed[1112];
565 Int_t idRoha = idtmed[1113];
567 // sensitive area: 40*40 cm**2
568 const Float_t sensLength = 40.;
569 const Float_t sensHeight = 40.;
570 const Float_t sensWidth = 0.5; // according to TDR fig 2.120
571 const Int_t sensMaterial = idGas;
572 const Float_t yOverlap = 1.5;
574 // PCB dimensions in cm; width: 30 mum copper
575 const Float_t pcbLength = sensLength;
576 const Float_t pcbHeight = 60.;
577 const Float_t pcbWidth = 0.003;
578 const Int_t pcbMaterial = idCopper;
580 // Insulating material: 200 mum glass fiber glued to pcb
581 const Float_t insuLength = pcbLength;
582 const Float_t insuHeight = pcbHeight;
583 const Float_t insuWidth = 0.020;
584 const Int_t insuMaterial = idGlass;
586 // Carbon fiber panels: 200mum carbon/epoxy skin
587 const Float_t panelLength = sensLength;
588 const Float_t panelHeight = sensHeight;
589 const Float_t panelWidth = 0.020;
590 const Int_t panelMaterial = idCarbon;
592 // rohacell between the two carbon panels
593 const Float_t rohaLength = sensLength;
594 const Float_t rohaHeight = sensHeight;
595 const Float_t rohaWidth = 0.5;
596 const Int_t rohaMaterial = idRoha;
598 // Frame around the slat: 2 sticks along length,2 along height
599 // H: the horizontal ones
600 const Float_t hFrameLength = pcbLength;
601 const Float_t hFrameHeight = 1.5;
602 const Float_t hFrameWidth = sensWidth;
603 const Int_t hFrameMaterial = idGlass;
605 // V: the vertical ones
606 const Float_t vFrameLength = 4.0;
607 const Float_t vFrameHeight = sensHeight + hFrameHeight;
608 const Float_t vFrameWidth = sensWidth;
609 const Int_t vFrameMaterial = idGlass;
611 // B: the horizontal border filled with rohacell
612 const Float_t bFrameLength = hFrameLength;
613 const Float_t bFrameHeight = (pcbHeight - sensHeight)/2. - hFrameHeight;
614 const Float_t bFrameWidth = hFrameWidth;
615 const Int_t bFrameMaterial = idRoha;
617 // NULOC: 30 mum copper + 200 mum vetronite (same radiation length as 14mum copper)
618 const Float_t nulocLength = 2.5;
619 const Float_t nulocHeight = 7.5;
620 const Float_t nulocWidth = 0.0030 + 0.0014; // equivalent copper width of vetronite;
621 const Int_t nulocMaterial = idCopper;
623 const Float_t slatHeight = pcbHeight;
624 const Float_t slatWidth = sensWidth + 2.*(pcbWidth + insuWidth +
625 2.* panelWidth + rohaWidth);
626 const Int_t slatMaterial = idAir;
627 const Float_t dSlatLength = vFrameLength; // border on left and right
632 // the panel volume contains the rohacell
634 Float_t twidth = 2 * panelWidth + rohaWidth;
635 Float_t panelpar[3] = { panelLength/2., panelHeight/2., twidth/2. };
636 Float_t rohapar[3] = { rohaLength/2., rohaHeight/2., rohaWidth/2. };
638 // insulating material contains PCB-> gas-> 2 borders filled with rohacell
640 twidth = 2*(insuWidth + pcbWidth) + sensWidth;
641 Float_t insupar[3] = { insuLength/2., insuHeight/2., twidth/2. };
642 twidth -= 2 * insuWidth;
643 Float_t pcbpar[3] = { pcbLength/2., pcbHeight/2., twidth/2. };
644 Float_t senspar[3] = { sensLength/2., sensHeight/2., sensWidth/2. };
645 Float_t theight = 2*hFrameHeight + sensHeight;
646 Float_t hFramepar[3]={hFrameLength/2., theight/2., hFrameWidth/2.};
647 Float_t bFramepar[3]={bFrameLength/2., bFrameHeight/2., bFrameWidth/2.};
648 Float_t vFramepar[3]={vFrameLength/2., vFrameHeight/2., vFrameWidth/2.};
649 Float_t nulocpar[3]={nulocLength/2., nulocHeight/2., nulocWidth/2.};
651 Float_t xxmax = (bFrameLength - nulocLength)/2.;
656 //********************************************************************
658 //********************************************************************
659 // indices 1 and 2 for first and second chambers in the station
660 // iChamber (first chamber) kept for other quanties than Z,
661 // assumed to be the same in both chambers
662 iChamber1 = iChamber = (AliMUONChamber*) (*fChambers)[4];
663 iChamber2 =(AliMUONChamber*) (*fChambers)[5];
664 zpos1=iChamber1->Z();
665 zpos2=iChamber2->Z();
666 dstation = zpos2 - zpos1;
668 // zfpos=-(iChamber->DGas()+dframez+iChamber->DAlu())/2; // not used any more
671 tpar[0] = iChamber->RInner()-dframep;
672 tpar[1] = (iChamber->ROuter()+dframep)/TMath::Cos(phi);
673 tpar[2] = dstation/5;
675 char *slats5Mother = "C05M";
676 char *slats6Mother = "C06M";
680 if (gMC->VolId("DDIP")) {
688 gMC->Gsvolu("C05M", "TUBE", idAir, tpar, 3);
689 gMC->Gsvolu("C06M", "TUBE", idAir, tpar, 3);
690 gMC->Gspos("C05M", 1, "ALIC", 0., 0., zpos1 , 0, "ONLY");
691 gMC->Gspos("C06M", 1, "ALIC", 0., 0., zpos2 , 0, "ONLY");
694 // volumes for slat geometry (xx=5,..,10 chamber id):
695 // Sxx0 Sxx1 Sxx2 Sxx3 --> Slat Mother volumes
696 // SxxG --> Sensitive volume (gas)
697 // SxxP --> PCB (copper)
698 // SxxI --> Insulator (vetronite)
699 // SxxC --> Carbon panel
701 // SxxH, SxxV --> Horizontal and Vertical frames (vetronite)
702 // SB5x --> Volumes for the 35 cm long PCB
703 // slat dimensions: slat is a MOTHER volume!!! made of air
705 // only for chamber 5: slat 1 has a PCB shorter by 5cm!
707 Float_t tlength = 35.;
708 Float_t panelpar2[3] = { tlength/2., panelpar[1], panelpar[2]};
709 Float_t rohapar2[3] = { tlength/2., rohapar[1], rohapar[2]};
710 Float_t insupar2[3] = { tlength/2., insupar[1], insupar[2]};
711 Float_t pcbpar2[3] = { tlength/2., pcbpar[1], pcbpar[2]};
712 Float_t senspar2[3] = { tlength/2., senspar[1], senspar[2]};
713 Float_t hFramepar2[3] = { tlength/2., hFramepar[1], hFramepar[2]};
714 Float_t bFramepar2[3] = { tlength/2., bFramepar[1], bFramepar[2]};
716 const Int_t nSlats3 = 5; // number of slats per quadrant
717 const Int_t nPCB3[nSlats3] = {3,3,4,3,2}; // n PCB per slat
718 const Float_t xpos3[nSlats3] = {31., 40., 0., 0., 0.};
719 Float_t slatLength3[nSlats3];
721 // create and position the slat (mother) volumes
728 for (i = 0; i<nSlats3; i++){
729 slatLength3[i] = pcbLength * nPCB3[i] + 2. * dSlatLength;
730 xSlat3 = slatLength3[i]/2. - vFrameLength/2. + xpos3[i];
731 if (i==1 || i==0) slatLength3[i] -= 2. *dSlatLength; // frame out in PCB with circular border
732 Float_t ySlat31 = sensHeight * i - yOverlap * i;
733 Float_t ySlat32 = -sensHeight * i + yOverlap * i;
734 spar[0] = slatLength3[i]/2.;
735 spar[1] = slatHeight/2.;
736 spar[2] = slatWidth/2. * 1.01;
737 // take away 5 cm from the first slat in chamber 5
739 if (i==1 || i==2) { // 1 pcb is shortened by 5cm
740 spar2[0] = spar[0]-5./2.;
741 xSlat32 = xSlat3 - 5/2.;
749 Float_t dzCh3=spar[2] * 1.01;
750 // zSlat to be checked (odd downstream or upstream?)
751 Float_t zSlat = (i%2 ==0)? -spar[2] : spar[2];
752 sprintf(volNam5,"S05%d",i);
753 gMC->Gsvolu(volNam5,"BOX",slatMaterial,spar2,3);
754 gMC->Gspos(volNam5, i*4+1,slats5Mother, xSlat32, ySlat31, zoffs5+zSlat+2.*dzCh3, 0, "ONLY");
755 gMC->Gspos(volNam5, i*4+2,slats5Mother,-xSlat32, ySlat31, zoffs5+zSlat-2.*dzCh3, 0, "ONLY");
758 gMC->Gspos(volNam5, i*4+3,slats5Mother, xSlat32, ySlat32, zoffs5+zSlat+2.*dzCh3, 0, "ONLY");
759 gMC->Gspos(volNam5, i*4+4,slats5Mother,-xSlat32, ySlat32, zoffs5+zSlat-2.*dzCh3, 0, "ONLY");
761 sprintf(volNam6,"S06%d",i);
762 gMC->Gsvolu(volNam6,"BOX",slatMaterial,spar,3);
763 gMC->Gspos(volNam6, i*4+1,slats6Mother, xSlat3, ySlat31, zoffs6+zSlat+2.*dzCh3, 0, "ONLY");
764 gMC->Gspos(volNam6, i*4+2,slats6Mother,-xSlat3, ySlat31, zoffs6+zSlat-2.*dzCh3, 0, "ONLY");
766 gMC->Gspos(volNam6, i*4+3,slats6Mother, xSlat3, ySlat32, zoffs6+zSlat+2.*dzCh3, 0, "ONLY");
767 gMC->Gspos(volNam6, i*4+4,slats6Mother,-xSlat3, ySlat32, zoffs6+zSlat-2.*dzCh3, 0, "ONLY");
771 // create the panel volume
773 gMC->Gsvolu("S05C","BOX",panelMaterial,panelpar,3);
774 gMC->Gsvolu("SB5C","BOX",panelMaterial,panelpar2,3);
775 gMC->Gsvolu("S06C","BOX",panelMaterial,panelpar,3);
777 // create the rohacell volume
779 gMC->Gsvolu("S05R","BOX",rohaMaterial,rohapar,3);
780 gMC->Gsvolu("SB5R","BOX",rohaMaterial,rohapar2,3);
781 gMC->Gsvolu("S06R","BOX",rohaMaterial,rohapar,3);
783 // create the insulating material volume
785 gMC->Gsvolu("S05I","BOX",insuMaterial,insupar,3);
786 gMC->Gsvolu("SB5I","BOX",insuMaterial,insupar2,3);
787 gMC->Gsvolu("S06I","BOX",insuMaterial,insupar,3);
789 // create the PCB volume
791 gMC->Gsvolu("S05P","BOX",pcbMaterial,pcbpar,3);
792 gMC->Gsvolu("SB5P","BOX",pcbMaterial,pcbpar2,3);
793 gMC->Gsvolu("S06P","BOX",pcbMaterial,pcbpar,3);
795 // create the sensitive volumes,
796 gMC->Gsvolu("S05G","BOX",sensMaterial,0,0);
797 gMC->Gsvolu("S06G","BOX",sensMaterial,0,0);
800 // create the vertical frame volume
802 gMC->Gsvolu("S05V","BOX",vFrameMaterial,vFramepar,3);
803 gMC->Gsvolu("S06V","BOX",vFrameMaterial,vFramepar,3);
805 // create the horizontal frame volume
807 gMC->Gsvolu("S05H","BOX",hFrameMaterial,hFramepar,3);
808 gMC->Gsvolu("SB5H","BOX",hFrameMaterial,hFramepar2,3);
809 gMC->Gsvolu("S06H","BOX",hFrameMaterial,hFramepar,3);
811 // create the horizontal border volume
813 gMC->Gsvolu("S05B","BOX",bFrameMaterial,bFramepar,3);
814 gMC->Gsvolu("SB5B","BOX",bFrameMaterial,bFramepar2,3);
815 gMC->Gsvolu("S06B","BOX",bFrameMaterial,bFramepar,3);
818 for (i = 0; i<nSlats3; i++){
819 sprintf(volNam5,"S05%d",i);
820 sprintf(volNam6,"S06%d",i);
821 Float_t xvFrame = (slatLength3[i] - vFrameLength)/2.;
822 Float_t xvFrame2 = xvFrame;
823 if ( i==1 || i ==2 ) xvFrame2 -= 5./2.;
824 // position the vertical frames
826 gMC->Gspos("S05V",2*i-1,volNam5, xvFrame2, 0., 0. , 0, "ONLY");
827 gMC->Gspos("S05V",2*i ,volNam5,-xvFrame2, 0., 0. , 0, "ONLY");
828 gMC->Gspos("S06V",2*i-1,volNam6, xvFrame, 0., 0. , 0, "ONLY");
829 gMC->Gspos("S06V",2*i ,volNam6,-xvFrame, 0., 0. , 0, "ONLY");
831 // position the panels and the insulating material
832 for (j=0; j<nPCB3[i]; j++){
834 Float_t xx = sensLength * (-nPCB3[i]/2.+j+.5);
835 Float_t xx2 = xx + 5/2.;
837 Float_t zPanel = spar[2] - panelpar[2];
838 if ( (i==1 || i==2) && j == nPCB3[i]-1) { // 1 pcb is shortened by 5cm
839 gMC->Gspos("SB5C",2*index-1,volNam5, xx, 0., zPanel , 0, "ONLY");
840 gMC->Gspos("SB5C",2*index ,volNam5, xx, 0.,-zPanel , 0, "ONLY");
841 gMC->Gspos("SB5I",index ,volNam5, xx, 0., 0 , 0, "ONLY");
843 else if ( (i==1 || i==2) && j < nPCB3[i]-1) {
844 gMC->Gspos("S05C",2*index-1,volNam5, xx2, 0., zPanel , 0, "ONLY");
845 gMC->Gspos("S05C",2*index ,volNam5, xx2, 0.,-zPanel , 0, "ONLY");
846 gMC->Gspos("S05I",index ,volNam5, xx2, 0., 0 , 0, "ONLY");
849 gMC->Gspos("S05C",2*index-1,volNam5, xx, 0., zPanel , 0, "ONLY");
850 gMC->Gspos("S05C",2*index ,volNam5, xx, 0.,-zPanel , 0, "ONLY");
851 gMC->Gspos("S05I",index ,volNam5, xx, 0., 0 , 0, "ONLY");
853 gMC->Gspos("S06C",2*index-1,volNam6, xx, 0., zPanel , 0, "ONLY");
854 gMC->Gspos("S06C",2*index ,volNam6, xx, 0.,-zPanel , 0, "ONLY");
855 gMC->Gspos("S06I",index,volNam6, xx, 0., 0 , 0, "ONLY");
859 // position the rohacell volume inside the panel volume
860 gMC->Gspos("S05R",1,"S05C",0.,0.,0.,0,"ONLY");
861 gMC->Gspos("SB5R",1,"SB5C",0.,0.,0.,0,"ONLY");
862 gMC->Gspos("S06R",1,"S06C",0.,0.,0.,0,"ONLY");
864 // position the PCB volume inside the insulating material volume
865 gMC->Gspos("S05P",1,"S05I",0.,0.,0.,0,"ONLY");
866 gMC->Gspos("SB5P",1,"SB5I",0.,0.,0.,0,"ONLY");
867 gMC->Gspos("S06P",1,"S06I",0.,0.,0.,0,"ONLY");
868 // position the horizontal frame volume inside the PCB volume
869 gMC->Gspos("S05H",1,"S05P",0.,0.,0.,0,"ONLY");
870 gMC->Gspos("SB5H",1,"SB5P",0.,0.,0.,0,"ONLY");
871 gMC->Gspos("S06H",1,"S06P",0.,0.,0.,0,"ONLY");
872 // position the sensitive volume inside the horizontal frame volume
873 gMC->Gsposp("S05G",1,"S05H",0.,0.,0.,0,"ONLY",senspar,3);
874 gMC->Gsposp("S05G",1,"SB5H",0.,0.,0.,0,"ONLY",senspar2,3);
875 gMC->Gsposp("S06G",1,"S06H",0.,0.,0.,0,"ONLY",senspar,3);
876 // position the border volumes inside the PCB volume
877 Float_t yborder = ( pcbHeight - bFrameHeight ) / 2.;
878 gMC->Gspos("S05B",1,"S05P",0., yborder,0.,0,"ONLY");
879 gMC->Gspos("S05B",2,"S05P",0.,-yborder,0.,0,"ONLY");
880 gMC->Gspos("SB5B",1,"SB5P",0., yborder,0.,0,"ONLY");
881 gMC->Gspos("SB5B",2,"SB5P",0.,-yborder,0.,0,"ONLY");
882 gMC->Gspos("S06B",1,"S06P",0., yborder,0.,0,"ONLY");
883 gMC->Gspos("S06B",2,"S06P",0.,-yborder,0.,0,"ONLY");
885 // create the NULOC volume and position it in the horizontal frame
887 gMC->Gsvolu("S05N","BOX",nulocMaterial,nulocpar,3);
888 gMC->Gsvolu("S06N","BOX",nulocMaterial,nulocpar,3);
890 Float_t xxmax2 = xxmax - 5./2.;
891 for (xx = -xxmax; xx<=xxmax; xx+=2*nulocLength) {
893 gMC->Gspos("S05N",2*index-1,"S05B", xx, 0.,-bFrameWidth/4., 0, "ONLY");
894 gMC->Gspos("S05N",2*index ,"S05B", xx, 0., bFrameWidth/4., 0, "ONLY");
895 if (xx > -xxmax2 && xx< xxmax2) {
896 gMC->Gspos("S05N",2*index-1,"SB5B", xx, 0.,-bFrameWidth/4., 0, "ONLY");
897 gMC->Gspos("S05N",2*index ,"SB5B", xx, 0., bFrameWidth/4., 0, "ONLY");
899 gMC->Gspos("S06N",2*index-1,"S06B", xx, 0.,-bFrameWidth/4., 0, "ONLY");
900 gMC->Gspos("S06N",2*index ,"S06B", xx, 0., bFrameWidth/4., 0, "ONLY");
903 // position the volumes approximating the circular section of the pipe
904 Float_t yoffs = sensHeight/2. - yOverlap;
905 Float_t epsilon = 0.001;
908 Double_t dydiv= sensHeight/ndiv;
909 Double_t ydiv = yoffs -dydiv;
913 Float_t z1 = spar[2], z2=2*spar[2]*1.01;
914 for (Int_t idiv=0;idiv<ndiv; idiv++){
917 if (ydiv<rmin) xdiv= rmin * TMath::Sin( TMath::ACos(ydiv/rmin) );
918 divpar[0] = (pcbLength-xdiv)/2.;
919 divpar[1] = dydiv/2. - epsilon;
920 divpar[2] = sensWidth/2.;
921 Float_t xvol=(pcbLength+xdiv)/2.+1.999;
922 Float_t yvol=ydiv + dydiv/2.;
923 //printf ("y ll = %f y ur = %f \n",yvol - divpar[1], yvol + divpar[1]);
924 gMC->Gsposp("S05G",imax+4*idiv+1,slats5Mother, xvol, yvol, zoffs5+z1+z2, 0, "ONLY",divpar,3);
925 gMC->Gsposp("S06G",imax+4*idiv+1,slats6Mother, xvol, yvol, zoffs6+z1+z2, 0, "ONLY",divpar,3);
926 gMC->Gsposp("S05G",imax+4*idiv+2,slats5Mother, xvol,-yvol, zoffs5+z1+z2, 0, "ONLY",divpar,3);
927 gMC->Gsposp("S06G",imax+4*idiv+2,slats6Mother, xvol,-yvol, zoffs6+z1+z2, 0, "ONLY",divpar,3);
928 gMC->Gsposp("S05G",imax+4*idiv+3,slats5Mother,-xvol, yvol, zoffs5+z1-z2, 0, "ONLY",divpar,3);
929 gMC->Gsposp("S06G",imax+4*idiv+3,slats6Mother,-xvol, yvol, zoffs6+z1-z2, 0, "ONLY",divpar,3);
930 gMC->Gsposp("S05G",imax+4*idiv+4,slats5Mother,-xvol,-yvol, zoffs5+z1-z2, 0, "ONLY",divpar,3);
931 gMC->Gsposp("S06G",imax+4*idiv+4,slats6Mother,-xvol,-yvol, zoffs6+z1-z2, 0, "ONLY",divpar,3);
937 //********************************************************************
939 //********************************************************************
940 // indices 1 and 2 for first and second chambers in the station
941 // iChamber (first chamber) kept for other quanties than Z,
942 // assumed to be the same in both chambers
943 iChamber1 = iChamber = (AliMUONChamber*) (*fChambers)[6];
944 iChamber2 =(AliMUONChamber*) (*fChambers)[7];
945 zpos1=iChamber1->Z();
946 zpos2=iChamber2->Z();
947 dstation = zpos2 - zpos1;
948 // zfpos=-(iChamber->DGas()+dframez+iChamber->DAlu())/2; // not used any more
952 tpar[0] = iChamber->RInner()-dframep;
953 tpar[1] = (iChamber->ROuter()+dframep)/TMath::Cos(phi);
954 tpar[2] = dstation/4;
956 gMC->Gsvolu("C07M", "TUBE", idAir, tpar, 3);
957 gMC->Gsvolu("C08M", "TUBE", idAir, tpar, 3);
958 gMC->Gspos("C07M", 1, "ALIC", 0., 0., zpos1 , 0, "ONLY");
959 gMC->Gspos("C08M", 1, "ALIC", 0., 0., zpos2 , 0, "ONLY");
962 const Int_t nSlats4 = 6; // number of slats per quadrant
963 const Int_t nPCB4[nSlats4] = {4,4,5,5,4,3}; // n PCB per slat
964 const Float_t xpos4[nSlats4] = {38.5, 40., 0., 0., 0., 0.};
965 Float_t slatLength4[nSlats4];
967 // create and position the slat (mother) volumes
974 for (i = 0; i<nSlats4; i++){
975 slatLength4[i] = pcbLength * nPCB4[i] + 2. * dSlatLength;
976 xSlat4 = slatLength4[i]/2. - vFrameLength/2. + xpos4[i];
977 if (i==1) slatLength4[i] -= 2. *dSlatLength; // frame out in PCB with circular border
978 ySlat4 = sensHeight * i - yOverlap *i;
980 spar[0] = slatLength4[i]/2.;
981 spar[1] = slatHeight/2.;
982 spar[2] = slatWidth/2.*1.01;
983 Float_t dzCh4=spar[2]*1.01;
984 // zSlat to be checked (odd downstream or upstream?)
985 Float_t zSlat = (i%2 ==0)? spar[2] : -spar[2];
986 sprintf(volNam7,"S07%d",i);
987 gMC->Gsvolu(volNam7,"BOX",slatMaterial,spar,3);
988 gMC->Gspos(volNam7, i*4+1,"C07M", xSlat4, ySlat4, zSlat+2.*dzCh4, 0, "ONLY");
989 gMC->Gspos(volNam7, i*4+2,"C07M",-xSlat4, ySlat4, zSlat-2.*dzCh4, 0, "ONLY");
991 gMC->Gspos(volNam7, i*4+3,"C07M", xSlat4,-ySlat4, zSlat+2.*dzCh4, 0, "ONLY");
992 gMC->Gspos(volNam7, i*4+4,"C07M",-xSlat4,-ySlat4, zSlat-2.*dzCh4, 0, "ONLY");
994 sprintf(volNam8,"S08%d",i);
995 gMC->Gsvolu(volNam8,"BOX",slatMaterial,spar,3);
996 gMC->Gspos(volNam8, i*4+1,"C08M", xSlat4, ySlat4, zSlat+2.*dzCh4, 0, "ONLY");
997 gMC->Gspos(volNam8, i*4+2,"C08M",-xSlat4, ySlat4, zSlat-2.*dzCh4, 0, "ONLY");
999 gMC->Gspos(volNam8, i*4+3,"C08M", xSlat4,-ySlat4, zSlat+2.*dzCh4, 0, "ONLY");
1000 gMC->Gspos(volNam8, i*4+4,"C08M",-xSlat4,-ySlat4, zSlat-2.*dzCh4, 0, "ONLY");
1005 // create the panel volume
1007 gMC->Gsvolu("S07C","BOX",panelMaterial,panelpar,3);
1008 gMC->Gsvolu("S08C","BOX",panelMaterial,panelpar,3);
1010 // create the rohacell volume
1012 gMC->Gsvolu("S07R","BOX",rohaMaterial,rohapar,3);
1013 gMC->Gsvolu("S08R","BOX",rohaMaterial,rohapar,3);
1015 // create the insulating material volume
1017 gMC->Gsvolu("S07I","BOX",insuMaterial,insupar,3);
1018 gMC->Gsvolu("S08I","BOX",insuMaterial,insupar,3);
1020 // create the PCB volume
1022 gMC->Gsvolu("S07P","BOX",pcbMaterial,pcbpar,3);
1023 gMC->Gsvolu("S08P","BOX",pcbMaterial,pcbpar,3);
1025 // create the sensitive volumes,
1027 gMC->Gsvolu("S07G","BOX",sensMaterial,0,0);
1028 gMC->Gsvolu("S08G","BOX",sensMaterial,0,0);
1030 // create the vertical frame volume
1032 gMC->Gsvolu("S07V","BOX",vFrameMaterial,vFramepar,3);
1033 gMC->Gsvolu("S08V","BOX",vFrameMaterial,vFramepar,3);
1035 // create the horizontal frame volume
1037 gMC->Gsvolu("S07H","BOX",hFrameMaterial,hFramepar,3);
1038 gMC->Gsvolu("S08H","BOX",hFrameMaterial,hFramepar,3);
1040 // create the horizontal border volume
1042 gMC->Gsvolu("S07B","BOX",bFrameMaterial,bFramepar,3);
1043 gMC->Gsvolu("S08B","BOX",bFrameMaterial,bFramepar,3);
1046 for (i = 0; i<nSlats4; i++){
1047 sprintf(volNam7,"S07%d",i);
1048 sprintf(volNam8,"S08%d",i);
1049 Float_t xvFrame = (slatLength4[i] - vFrameLength)/2.;
1050 // position the vertical frames
1052 gMC->Gspos("S07V",2*i-1,volNam7, xvFrame, 0., 0. , 0, "ONLY");
1053 gMC->Gspos("S07V",2*i ,volNam7,-xvFrame, 0., 0. , 0, "ONLY");
1054 gMC->Gspos("S08V",2*i-1,volNam8, xvFrame, 0., 0. , 0, "ONLY");
1055 gMC->Gspos("S08V",2*i ,volNam8,-xvFrame, 0., 0. , 0, "ONLY");
1057 // position the panels and the insulating material
1058 for (j=0; j<nPCB4[i]; j++){
1060 Float_t xx = sensLength * (-nPCB4[i]/2.+j+.5);
1062 Float_t zPanel = spar[2] - panelpar[2];
1063 gMC->Gspos("S07C",2*index-1,volNam7, xx, 0., zPanel , 0, "ONLY");
1064 gMC->Gspos("S07C",2*index ,volNam7, xx, 0.,-zPanel , 0, "ONLY");
1065 gMC->Gspos("S08C",2*index-1,volNam8, xx, 0., zPanel , 0, "ONLY");
1066 gMC->Gspos("S08C",2*index ,volNam8, xx, 0.,-zPanel , 0, "ONLY");
1068 gMC->Gspos("S07I",index,volNam7, xx, 0., 0 , 0, "ONLY");
1069 gMC->Gspos("S08I",index,volNam8, xx, 0., 0 , 0, "ONLY");
1073 // position the rohacell volume inside the panel volume
1074 gMC->Gspos("S07R",1,"S07C",0.,0.,0.,0,"ONLY");
1075 gMC->Gspos("S08R",1,"S08C",0.,0.,0.,0,"ONLY");
1077 // position the PCB volume inside the insulating material volume
1078 gMC->Gspos("S07P",1,"S07I",0.,0.,0.,0,"ONLY");
1079 gMC->Gspos("S08P",1,"S08I",0.,0.,0.,0,"ONLY");
1080 // position the horizontal frame volume inside the PCB volume
1081 gMC->Gspos("S07H",1,"S07P",0.,0.,0.,0,"ONLY");
1082 gMC->Gspos("S08H",1,"S08P",0.,0.,0.,0,"ONLY");
1083 // position the sensitive volume inside the horizontal frame volume
1084 gMC->Gsposp("S07G",1,"S07H",0.,0.,0.,0,"ONLY",senspar,3);
1085 gMC->Gsposp("S08G",1,"S08H",0.,0.,0.,0,"ONLY",senspar,3);
1086 // position the border volumes inside the PCB volume
1087 Float_t yborder = ( pcbHeight - bFrameHeight ) / 2.;
1088 gMC->Gspos("S07B",1,"S07P",0., yborder,0.,0,"ONLY");
1089 gMC->Gspos("S07B",2,"S07P",0.,-yborder,0.,0,"ONLY");
1090 gMC->Gspos("S08B",1,"S08P",0., yborder,0.,0,"ONLY");
1091 gMC->Gspos("S08B",2,"S08P",0.,-yborder,0.,0,"ONLY");
1093 // create the NULOC volume and position it in the horizontal frame
1095 gMC->Gsvolu("S07N","BOX",nulocMaterial,nulocpar,3);
1096 gMC->Gsvolu("S08N","BOX",nulocMaterial,nulocpar,3);
1098 for (xx = -xxmax; xx<=xxmax; xx+=2*nulocLength) {
1100 gMC->Gspos("S07N",2*index-1,"S07B", xx, 0.,-bFrameWidth/4., 0, "ONLY");
1101 gMC->Gspos("S07N",2*index ,"S07B", xx, 0., bFrameWidth/4., 0, "ONLY");
1102 gMC->Gspos("S08N",2*index-1,"S08B", xx, 0.,-bFrameWidth/4., 0, "ONLY");
1103 gMC->Gspos("S08N",2*index ,"S08B", xx, 0., bFrameWidth/4., 0, "ONLY");
1106 // position the volumes approximating the circular section of the pipe
1107 Float_t yoffs = sensHeight/2. - yOverlap;
1108 Float_t epsilon = 0.001;
1111 Double_t dydiv= sensHeight/ndiv;
1112 Double_t ydiv = yoffs -dydiv;
1116 Float_t z1 = -spar[2], z2=2*spar[2]*1.01;
1117 for (Int_t idiv=0;idiv<ndiv; idiv++){
1120 if (ydiv<rmin) xdiv= rmin * TMath::Sin( TMath::ACos(ydiv/rmin) );
1121 divpar[0] = (pcbLength-xdiv)/2.;
1122 divpar[1] = dydiv/2. - epsilon;
1123 divpar[2] = sensWidth/2.;
1124 Float_t xvol=(pcbLength+xdiv)/2.+1.999;
1125 Float_t yvol=ydiv + dydiv/2.;
1126 gMC->Gsposp("S07G",imax+4*idiv+1,"C07M", xvol, yvol, z1+z2, 0, "ONLY",divpar,3);
1127 gMC->Gsposp("S08G",imax+4*idiv+1,"C08M", xvol, yvol, z1+z2, 0, "ONLY",divpar,3);
1128 gMC->Gsposp("S07G",imax+4*idiv+2,"C07M", xvol,-yvol, z1+z2, 0, "ONLY",divpar,3);
1129 gMC->Gsposp("S08G",imax+4*idiv+2,"C08M", xvol,-yvol, z1+z2, 0, "ONLY",divpar,3);
1130 gMC->Gsposp("S07G",imax+4*idiv+3,"C07M",-xvol, yvol, z1-z2, 0, "ONLY",divpar,3);
1131 gMC->Gsposp("S08G",imax+4*idiv+3,"C08M",-xvol, yvol, z1-z2, 0, "ONLY",divpar,3);
1132 gMC->Gsposp("S07G",imax+4*idiv+4,"C07M",-xvol,-yvol, z1-z2, 0, "ONLY",divpar,3);
1133 gMC->Gsposp("S08G",imax+4*idiv+4,"C08M",-xvol,-yvol, z1-z2, 0, "ONLY",divpar,3);
1145 //********************************************************************
1147 //********************************************************************
1148 // indices 1 and 2 for first and second chambers in the station
1149 // iChamber (first chamber) kept for other quanties than Z,
1150 // assumed to be the same in both chambers
1151 iChamber1 = iChamber = (AliMUONChamber*) (*fChambers)[8];
1152 iChamber2 =(AliMUONChamber*) (*fChambers)[9];
1153 zpos1=iChamber1->Z();
1154 zpos2=iChamber2->Z();
1155 dstation = zpos2 - zpos1;
1156 // zfpos=-(iChamber->DGas()+dframez+iChamber->DAlu())/2; // not used any more
1160 tpar[0] = iChamber->RInner()-dframep;
1161 tpar[1] = (iChamber->ROuter()+dframep)/TMath::Cos(phi);
1162 tpar[2] = dstation/5.;
1164 gMC->Gsvolu("C09M", "TUBE", idAir, tpar, 3);
1165 gMC->Gsvolu("C10M", "TUBE", idAir, tpar, 3);
1166 gMC->Gspos("C09M", 1, "ALIC", 0., 0., zpos1 , 0, "ONLY");
1167 gMC->Gspos("C10M", 1, "ALIC", 0., 0., zpos2 , 0, "ONLY");
1170 const Int_t nSlats5 = 7; // number of slats per quadrant
1171 const Int_t nPCB5[nSlats5] = {5,5,6,6,5,4,3}; // n PCB per slat
1172 const Float_t xpos5[nSlats5] = {38.5, 40., 0., 0., 0., 0., 0.};
1173 Float_t slatLength5[nSlats5];
1179 for (i = 0; i<nSlats5; i++){
1180 slatLength5[i] = pcbLength * nPCB5[i] + 2. * dSlatLength;
1181 xSlat5 = slatLength5[i]/2. - vFrameLength/2. +xpos5[i];
1182 if (i==1 || i==0) slatLength5[i] -= 2. *dSlatLength; // frame out in PCB with circular border
1183 ySlat5 = sensHeight * i - yOverlap * i;
1184 spar[0] = slatLength5[i]/2.;
1185 spar[1] = slatHeight/2.;
1186 spar[2] = slatWidth/2. * 1.01;
1187 Float_t dzCh5=spar[2]*1.01;
1188 // zSlat to be checked (odd downstream or upstream?)
1189 Float_t zSlat = (i%2 ==0)? -spar[2] : spar[2];
1190 sprintf(volNam9,"S09%d",i);
1191 gMC->Gsvolu(volNam9,"BOX",slatMaterial,spar,3);
1192 gMC->Gspos(volNam9, i*4+1,"C09M", xSlat5, ySlat5, zSlat+2.*dzCh5, 0, "ONLY");
1193 gMC->Gspos(volNam9, i*4+2,"C09M",-xSlat5, ySlat5, zSlat-2.*dzCh5, 0, "ONLY");
1195 gMC->Gspos(volNam9, i*4+3,"C09M", xSlat5,-ySlat5, zSlat+2.*dzCh5, 0, "ONLY");
1196 gMC->Gspos(volNam9, i*4+4,"C09M",-xSlat5,-ySlat5, zSlat-2.*dzCh5, 0, "ONLY");
1198 sprintf(volNam10,"S10%d",i);
1199 gMC->Gsvolu(volNam10,"BOX",slatMaterial,spar,3);
1200 gMC->Gspos(volNam10, i*4+1,"C10M", xSlat5, ySlat5, zSlat+2.*dzCh5, 0, "ONLY");
1201 gMC->Gspos(volNam10, i*4+2,"C10M",-xSlat5, ySlat5, zSlat-2.*dzCh5, 0, "ONLY");
1203 gMC->Gspos(volNam10, i*4+3,"C10M", xSlat5,-ySlat5, zSlat+2.*dzCh5, 0, "ONLY");
1204 gMC->Gspos(volNam10, i*4+4,"C10M",-xSlat5,-ySlat5, zSlat-2.*dzCh5, 0, "ONLY");
1208 // create the panel volume
1210 gMC->Gsvolu("S09C","BOX",panelMaterial,panelpar,3);
1211 gMC->Gsvolu("S10C","BOX",panelMaterial,panelpar,3);
1213 // create the rohacell volume
1215 gMC->Gsvolu("S09R","BOX",rohaMaterial,rohapar,3);
1216 gMC->Gsvolu("S10R","BOX",rohaMaterial,rohapar,3);
1218 // create the insulating material volume
1220 gMC->Gsvolu("S09I","BOX",insuMaterial,insupar,3);
1221 gMC->Gsvolu("S10I","BOX",insuMaterial,insupar,3);
1223 // create the PCB volume
1225 gMC->Gsvolu("S09P","BOX",pcbMaterial,pcbpar,3);
1226 gMC->Gsvolu("S10P","BOX",pcbMaterial,pcbpar,3);
1228 // create the sensitive volumes,
1230 gMC->Gsvolu("S09G","BOX",sensMaterial,0,0);
1231 gMC->Gsvolu("S10G","BOX",sensMaterial,0,0);
1233 // create the vertical frame volume
1235 gMC->Gsvolu("S09V","BOX",vFrameMaterial,vFramepar,3);
1236 gMC->Gsvolu("S10V","BOX",vFrameMaterial,vFramepar,3);
1238 // create the horizontal frame volume
1240 gMC->Gsvolu("S09H","BOX",hFrameMaterial,hFramepar,3);
1241 gMC->Gsvolu("S10H","BOX",hFrameMaterial,hFramepar,3);
1243 // create the horizontal border volume
1245 gMC->Gsvolu("S09B","BOX",bFrameMaterial,bFramepar,3);
1246 gMC->Gsvolu("S10B","BOX",bFrameMaterial,bFramepar,3);
1249 for (i = 0; i<nSlats5; i++){
1250 sprintf(volNam9,"S09%d",i);
1251 sprintf(volNam10,"S10%d",i);
1252 Float_t xvFrame = (slatLength5[i] - vFrameLength)/2.;
1253 // position the vertical frames
1255 gMC->Gspos("S09V",2*i-1,volNam9, xvFrame, 0., 0. , 0, "ONLY");
1256 gMC->Gspos("S09V",2*i ,volNam9,-xvFrame, 0., 0. , 0, "ONLY");
1257 gMC->Gspos("S10V",2*i-1,volNam10, xvFrame, 0., 0. , 0, "ONLY");
1258 gMC->Gspos("S10V",2*i ,volNam10,-xvFrame, 0., 0. , 0, "ONLY");
1261 // position the panels and the insulating material
1262 for (j=0; j<nPCB5[i]; j++){
1264 Float_t xx = sensLength * (-nPCB5[i]/2.+j+.5);
1266 Float_t zPanel = spar[2] - panelpar[2];
1267 gMC->Gspos("S09C",2*index-1,volNam9, xx, 0., zPanel , 0, "ONLY");
1268 gMC->Gspos("S09C",2*index ,volNam9, xx, 0.,-zPanel , 0, "ONLY");
1269 gMC->Gspos("S10C",2*index-1,volNam10, xx, 0., zPanel , 0, "ONLY");
1270 gMC->Gspos("S10C",2*index ,volNam10, xx, 0.,-zPanel , 0, "ONLY");
1272 gMC->Gspos("S09I",index,volNam9, xx, 0., 0 , 0, "ONLY");
1273 gMC->Gspos("S10I",index,volNam10, xx, 0., 0 , 0, "ONLY");
1277 // position the rohacell volume inside the panel volume
1278 gMC->Gspos("S09R",1,"S09C",0.,0.,0.,0,"ONLY");
1279 gMC->Gspos("S10R",1,"S10C",0.,0.,0.,0,"ONLY");
1281 // position the PCB volume inside the insulating material volume
1282 gMC->Gspos("S09P",1,"S09I",0.,0.,0.,0,"ONLY");
1283 gMC->Gspos("S10P",1,"S10I",0.,0.,0.,0,"ONLY");
1284 // position the horizontal frame volume inside the PCB volume
1285 gMC->Gspos("S09H",1,"S09P",0.,0.,0.,0,"ONLY");
1286 gMC->Gspos("S10H",1,"S10P",0.,0.,0.,0,"ONLY");
1287 // position the sensitive volume inside the horizontal frame volume
1288 gMC->Gsposp("S09G",1,"S09H",0.,0.,0.,0,"ONLY",senspar,3);
1289 gMC->Gsposp("S10G",1,"S10H",0.,0.,0.,0,"ONLY",senspar,3);
1290 // position the border volumes inside the PCB volume
1291 Float_t yborder = ( pcbHeight - bFrameHeight ) / 2.;
1292 gMC->Gspos("S09B",1,"S09P",0., yborder,0.,0,"ONLY");
1293 gMC->Gspos("S09B",2,"S09P",0.,-yborder,0.,0,"ONLY");
1294 gMC->Gspos("S10B",1,"S10P",0., yborder,0.,0,"ONLY");
1295 gMC->Gspos("S10B",2,"S10P",0.,-yborder,0.,0,"ONLY");
1297 // create the NULOC volume and position it in the horizontal frame
1299 gMC->Gsvolu("S09N","BOX",nulocMaterial,nulocpar,3);
1300 gMC->Gsvolu("S10N","BOX",nulocMaterial,nulocpar,3);
1302 for (xx = -xxmax; xx<=xxmax; xx+=2*nulocLength) {
1304 gMC->Gspos("S09N",2*index-1,"S09B", xx, 0.,-bFrameWidth/4., 0, "ONLY");
1305 gMC->Gspos("S09N",2*index ,"S09B", xx, 0., bFrameWidth/4., 0, "ONLY");
1306 gMC->Gspos("S10N",2*index-1,"S10B", xx, 0.,-bFrameWidth/4., 0, "ONLY");
1307 gMC->Gspos("S10N",2*index ,"S10B", xx, 0., bFrameWidth/4., 0, "ONLY");
1309 // position the volumes approximating the circular section of the pipe
1310 Float_t yoffs = sensHeight/2. - yOverlap;
1311 Float_t epsilon = 0.001;
1314 Double_t dydiv= sensHeight/ndiv;
1315 Double_t ydiv = yoffs -dydiv;
1317 // for (Int_t islat=0; islat<nSlats3; islat++) imax += nPCB3[islat];
1320 Float_t z1 = spar[2], z2=2*spar[2]*1.01;
1321 for (Int_t idiv=0;idiv<ndiv; idiv++){
1324 if (ydiv<rmin) xdiv= rmin * TMath::Sin( TMath::ACos(ydiv/rmin) );
1325 divpar[0] = (pcbLength-xdiv)/2.;
1326 divpar[1] = dydiv/2. - epsilon;
1327 divpar[2] = sensWidth/2.;
1328 Float_t xvol=(pcbLength+xdiv)/2. + 1.999;
1329 Float_t yvol=ydiv + dydiv/2.;
1330 gMC->Gsposp("S09G",imax+4*idiv+1,"C09M", xvol, yvol, z1+z2, 0, "ONLY",divpar,3);
1331 gMC->Gsposp("S10G",imax+4*idiv+1,"C10M", xvol, yvol, z1+z2, 0, "ONLY",divpar,3);
1332 gMC->Gsposp("S09G",imax+4*idiv+2,"C09M", xvol,-yvol, z1+z2, 0, "ONLY",divpar,3);
1333 gMC->Gsposp("S10G",imax+4*idiv+2,"C10M", xvol,-yvol, z1+z2, 0, "ONLY",divpar,3);
1334 gMC->Gsposp("S09G",imax+4*idiv+3,"C09M",-xvol, yvol, z1-z2, 0, "ONLY",divpar,3);
1335 gMC->Gsposp("S10G",imax+4*idiv+3,"C10M",-xvol, yvol, z1-z2, 0, "ONLY",divpar,3);
1336 gMC->Gsposp("S09G",imax+4*idiv+4,"C09M",-xvol,-yvol, z1-z2, 0, "ONLY",divpar,3);
1337 gMC->Gsposp("S10G",imax+4*idiv+4,"C10M",-xvol,-yvol, z1-z2, 0, "ONLY",divpar,3);
1343 ///////////////////////////////////////
1344 // GEOMETRY FOR THE TRIGGER CHAMBERS //
1345 ///////////////////////////////////////
1347 // 03/00 P. Dupieux : introduce a slighly more realistic
1348 // geom. of the trigger readout planes with
1349 // 2 Zpos per trigger plane (alternate
1350 // between left and right of the trigger)
1352 // Parameters of the Trigger Chambers
1354 // DP03-01 introduce dead zone of +/- 2 cm arround x=0 (as in TDR, fig3.27)
1355 const Float_t kDXZERO=2.;
1356 const Float_t kXMC1MIN=34.;
1357 const Float_t kXMC1MED=51.;
1358 const Float_t kXMC1MAX=272.;
1359 const Float_t kYMC1MIN=34.;
1360 const Float_t kYMC1MAX=51.;
1361 const Float_t kRMIN1=50.;
1362 // DP03-01 const Float_t kRMAX1=62.;
1363 const Float_t kRMAX1=64.;
1364 const Float_t kRMIN2=50.;
1365 // DP03-01 const Float_t kRMAX2=66.;
1366 const Float_t kRMAX2=68.;
1368 // zposition of the middle of the gas gap in mother vol
1369 const Float_t kZMCm=-3.6;
1370 const Float_t kZMCp=+3.6;
1373 // TRIGGER STATION 1 - TRIGGER STATION 1 - TRIGGER STATION 1
1375 // iChamber 1 and 2 for first and second chambers in the station
1376 // iChamber (first chamber) kept for other quanties than Z,
1377 // assumed to be the same in both chambers
1378 iChamber1 = iChamber = (AliMUONChamber*) (*fChambers)[10];
1379 iChamber2 =(AliMUONChamber*) (*fChambers)[11];
1382 // zpos1 and zpos2 are now the middle of the first and second
1383 // plane of station 1 :
1384 // zpos1=(16075+15995)/2=16035 mm, thick/2=40 mm
1385 // zpos2=(16225+16145)/2=16185 mm, thick/2=40 mm
1387 // zpos1m=15999 mm , zpos1p=16071 mm (middles of gas gaps)
1388 // zpos2m=16149 mm , zpos2p=16221 mm (middles of gas gaps)
1389 // rem : the total thickness accounts for 1 mm of al on both
1390 // side of the RPCs (see zpos1 and zpos2), as previously
1392 zpos1=iChamber1->Z();
1393 zpos2=iChamber2->Z();
1396 // Mother volume definition
1397 tpar[0] = iChamber->RInner();
1398 tpar[1] = iChamber->ROuter();
1400 gMC->Gsvolu("CM11", "TUBE", idAir, tpar, 3);
1401 gMC->Gsvolu("CM12", "TUBE", idAir, tpar, 3);
1403 // Definition of the flange between the beam shielding and the RPC
1408 gMC->Gsvolu("CF1A", "TUBE", idAlu1, tpar, 3); //Al
1409 gMC->Gspos("CF1A", 1, "CM11", 0., 0., 0., 0, "MANY");
1410 gMC->Gspos("CF1A", 2, "CM12", 0., 0., 0., 0, "MANY");
1413 // FIRST PLANE OF STATION 1
1415 // ratios of zpos1m/zpos1p and inverse for first plane
1416 Float_t zmp=(zpos1-3.6)/(zpos1+3.6);
1420 // Definition of prototype for chambers in the first plane
1426 gMC->Gsvolu("CC1A", "BOX ", idAlu1, tpar, 0); //Al
1427 gMC->Gsvolu("CB1A", "BOX ", idtmed[1107], tpar, 0); //Bakelite
1428 gMC->Gsvolu("CG1A", "BOX ", idtmed[1106], tpar, 0); //Gas streamer
1434 // DP03-01 const Float_t kXMC1A=kXMC1MED+(kXMC1MAX-kXMC1MED)/2.;
1435 const Float_t kXMC1A=kDXZERO+kXMC1MED+(kXMC1MAX-kXMC1MED)/2.;
1436 const Float_t kYMC1Am=0.;
1437 const Float_t kYMC1Ap=0.;
1440 gMC->Gsposp("CG1A", 1, "CB1A", 0., 0., 0., 0, "ONLY",tpar,3);
1442 gMC->Gsposp("CB1A", 1, "CC1A", 0., 0., 0., 0, "ONLY",tpar,3);
1445 tpar[0] = (kXMC1MAX-kXMC1MED)/2.;
1448 gMC->Gsposp("CC1A", 1, "CM11",kXMC1A,kYMC1Am,kZMCm, 0, "ONLY", tpar, 3);
1449 gMC->Gsposp("CC1A", 2, "CM11",-kXMC1A,kYMC1Ap,kZMCp, 0, "ONLY", tpar, 3);
1452 Float_t tpar1save=tpar[1];
1453 Float_t y1msave=kYMC1Am;
1454 Float_t y1psave=kYMC1Ap;
1456 tpar[0] = (kXMC1MAX-kXMC1MIN)/2.;
1457 tpar[1] = (kYMC1MAX-kYMC1MIN)/2.;
1459 // DP03-01 const Float_t kXMC1B=kXMC1MIN+tpar[0];
1460 const Float_t kXMC1B=kDXZERO+kXMC1MIN+tpar[0];
1461 const Float_t kYMC1Bp=(y1msave+tpar1save)*zpm+tpar[1];
1462 const Float_t kYMC1Bm=(y1psave+tpar1save)*zmp+tpar[1];
1464 gMC->Gsposp("CC1A", 3, "CM11",kXMC1B,kYMC1Bp,kZMCp, 0, "ONLY", tpar, 3);
1465 gMC->Gsposp("CC1A", 4, "CM11",-kXMC1B,kYMC1Bm,kZMCm, 0, "ONLY", tpar, 3);
1466 gMC->Gsposp("CC1A", 5, "CM11",kXMC1B,-kYMC1Bp,kZMCp, 0, "ONLY", tpar, 3);
1467 gMC->Gsposp("CC1A", 6, "CM11",-kXMC1B,-kYMC1Bm,kZMCm, 0, "ONLY", tpar, 3);
1469 // chamber type C (end of type B !!)
1474 tpar[0] = kXMC1MAX/2;
1475 tpar[1] = kYMC1MAX/2;
1478 // DP03-01 const Float_t kXMC1C=tpar[0];
1479 const Float_t kXMC1C=kDXZERO+tpar[0];
1480 // warning : same Z than type B
1481 const Float_t kYMC1Cp=(y1psave+tpar1save)*1.+tpar[1];
1482 const Float_t kYMC1Cm=(y1msave+tpar1save)*1.+tpar[1];
1484 gMC->Gsposp("CC1A", 7, "CM11",kXMC1C,kYMC1Cp,kZMCp, 0, "ONLY", tpar, 3);
1485 gMC->Gsposp("CC1A", 8, "CM11",-kXMC1C,kYMC1Cm,kZMCm, 0, "ONLY", tpar, 3);
1486 gMC->Gsposp("CC1A", 9, "CM11",kXMC1C,-kYMC1Cp,kZMCp, 0, "ONLY", tpar, 3);
1487 gMC->Gsposp("CC1A", 10, "CM11",-kXMC1C,-kYMC1Cm,kZMCm, 0, "ONLY", tpar, 3);
1489 // chamber type D, E and F (same size)
1494 tpar[0] = kXMC1MAX/2.;
1497 // DP03-01 const Float_t kXMC1D=tpar[0];
1498 const Float_t kXMC1D=kDXZERO+tpar[0];
1499 const Float_t kYMC1Dp=(y1msave+tpar1save)*zpm+tpar[1];
1500 const Float_t kYMC1Dm=(y1psave+tpar1save)*zmp+tpar[1];
1502 gMC->Gsposp("CC1A", 11, "CM11",kXMC1D,kYMC1Dm,kZMCm, 0, "ONLY", tpar, 3);
1503 gMC->Gsposp("CC1A", 12, "CM11",-kXMC1D,kYMC1Dp,kZMCp, 0, "ONLY", tpar, 3);
1504 gMC->Gsposp("CC1A", 13, "CM11",kXMC1D,-kYMC1Dm,kZMCm, 0, "ONLY", tpar, 3);
1505 gMC->Gsposp("CC1A", 14, "CM11",-kXMC1D,-kYMC1Dp,kZMCp, 0, "ONLY", tpar, 3);
1511 const Float_t kYMC1Ep=(y1msave+tpar1save)*zpm+tpar[1];
1512 const Float_t kYMC1Em=(y1psave+tpar1save)*zmp+tpar[1];
1514 gMC->Gsposp("CC1A", 15, "CM11",kXMC1D,kYMC1Ep,kZMCp, 0, "ONLY", tpar, 3);
1515 gMC->Gsposp("CC1A", 16, "CM11",-kXMC1D,kYMC1Em,kZMCm, 0, "ONLY", tpar, 3);
1516 gMC->Gsposp("CC1A", 17, "CM11",kXMC1D,-kYMC1Ep,kZMCp, 0, "ONLY", tpar, 3);
1517 gMC->Gsposp("CC1A", 18, "CM11",-kXMC1D,-kYMC1Em,kZMCm, 0, "ONLY", tpar, 3);
1522 const Float_t kYMC1Fp=(y1msave+tpar1save)*zpm+tpar[1];
1523 const Float_t kYMC1Fm=(y1psave+tpar1save)*zmp+tpar[1];
1525 gMC->Gsposp("CC1A", 19, "CM11",kXMC1D,kYMC1Fm,kZMCm, 0, "ONLY", tpar, 3);
1526 gMC->Gsposp("CC1A", 20, "CM11",-kXMC1D,kYMC1Fp,kZMCp, 0, "ONLY", tpar, 3);
1527 gMC->Gsposp("CC1A", 21, "CM11",kXMC1D,-kYMC1Fm,kZMCm, 0, "ONLY", tpar, 3);
1528 gMC->Gsposp("CC1A", 22, "CM11",-kXMC1D,-kYMC1Fp,kZMCp, 0, "ONLY", tpar, 3);
1530 // Positioning first plane in ALICE
1531 gMC->Gspos("CM11", 1, "ALIC", 0., 0., zpos1, 0, "ONLY");
1533 // End of geometry definition for the first plane of station 1
1537 // SECOND PLANE OF STATION 1 : proj ratio = zpos2/zpos1
1539 const Float_t kZ12=zpos2/zpos1;
1541 // Definition of prototype for chambers in the second plane of station 1
1547 gMC->Gsvolu("CC2A", "BOX ", idAlu1, tpar, 0); //Al
1548 gMC->Gsvolu("CB2A", "BOX ", idtmed[1107], tpar, 0); //Bakelite
1549 gMC->Gsvolu("CG2A", "BOX ", idtmed[1106], tpar, 0); //Gas streamer
1555 const Float_t kXMC2A=kXMC1A*kZ12;
1556 const Float_t kYMC2Am=0.;
1557 const Float_t kYMC2Ap=0.;
1560 gMC->Gsposp("CG2A", 1, "CB2A", 0., 0., 0., 0, "ONLY",tpar,3);
1562 gMC->Gsposp("CB2A", 1, "CC2A", 0., 0., 0., 0, "ONLY",tpar,3);
1565 tpar[0] = ((kXMC1MAX-kXMC1MED)/2.)*kZ12;
1566 tpar[1] = kYMC1MIN*kZ12;
1568 gMC->Gsposp("CC2A", 1, "CM12",kXMC2A,kYMC2Am,kZMCm, 0, "ONLY", tpar, 3);
1569 gMC->Gsposp("CC2A", 2, "CM12",-kXMC2A,kYMC2Ap,kZMCp, 0, "ONLY", tpar, 3);
1574 tpar[0] = ((kXMC1MAX-kXMC1MIN)/2.)*kZ12;
1575 tpar[1] = ((kYMC1MAX-kYMC1MIN)/2.)*kZ12;
1577 const Float_t kXMC2B=kXMC1B*kZ12;
1578 const Float_t kYMC2Bp=kYMC1Bp*kZ12;
1579 const Float_t kYMC2Bm=kYMC1Bm*kZ12;
1580 gMC->Gsposp("CC2A", 3, "CM12",kXMC2B,kYMC2Bp,kZMCp, 0, "ONLY", tpar, 3);
1581 gMC->Gsposp("CC2A", 4, "CM12",-kXMC2B,kYMC2Bm,kZMCm, 0, "ONLY", tpar, 3);
1582 gMC->Gsposp("CC2A", 5, "CM12",kXMC2B,-kYMC2Bp,kZMCp, 0, "ONLY", tpar, 3);
1583 gMC->Gsposp("CC2A", 6, "CM12",-kXMC2B,-kYMC2Bm,kZMCm, 0, "ONLY", tpar, 3);
1586 // chamber type C (end of type B !!)
1588 tpar[0] = (kXMC1MAX/2)*kZ12;
1589 tpar[1] = (kYMC1MAX/2)*kZ12;
1591 const Float_t kXMC2C=kXMC1C*kZ12;
1592 const Float_t kYMC2Cp=kYMC1Cp*kZ12;
1593 const Float_t kYMC2Cm=kYMC1Cm*kZ12;
1594 gMC->Gsposp("CC2A", 7, "CM12",kXMC2C,kYMC2Cp,kZMCp, 0, "ONLY", tpar, 3);
1595 gMC->Gsposp("CC2A", 8, "CM12",-kXMC2C,kYMC2Cm,kZMCm, 0, "ONLY", tpar, 3);
1596 gMC->Gsposp("CC2A", 9, "CM12",kXMC2C,-kYMC2Cp,kZMCp, 0, "ONLY", tpar, 3);
1597 gMC->Gsposp("CC2A", 10, "CM12",-kXMC2C,-kYMC2Cm,kZMCm, 0, "ONLY", tpar, 3);
1599 // chamber type D, E and F (same size)
1601 tpar[0] = (kXMC1MAX/2.)*kZ12;
1602 tpar[1] = kYMC1MIN*kZ12;
1604 const Float_t kXMC2D=kXMC1D*kZ12;
1605 const Float_t kYMC2Dp=kYMC1Dp*kZ12;
1606 const Float_t kYMC2Dm=kYMC1Dm*kZ12;
1607 gMC->Gsposp("CC2A", 11, "CM12",kXMC2D,kYMC2Dm,kZMCm, 0, "ONLY", tpar, 3);
1608 gMC->Gsposp("CC2A", 12, "CM12",-kXMC2D,kYMC2Dp,kZMCp, 0, "ONLY", tpar, 3);
1609 gMC->Gsposp("CC2A", 13, "CM12",kXMC2D,-kYMC2Dm,kZMCm, 0, "ONLY", tpar, 3);
1610 gMC->Gsposp("CC2A", 14, "CM12",-kXMC2D,-kYMC2Dp,kZMCp, 0, "ONLY", tpar, 3);
1612 const Float_t kYMC2Ep=kYMC1Ep*kZ12;
1613 const Float_t kYMC2Em=kYMC1Em*kZ12;
1614 gMC->Gsposp("CC2A", 15, "CM12",kXMC2D,kYMC2Ep,kZMCp, 0, "ONLY", tpar, 3);
1615 gMC->Gsposp("CC2A", 16, "CM12",-kXMC2D,kYMC2Em,kZMCm, 0, "ONLY", tpar, 3);
1616 gMC->Gsposp("CC2A", 17, "CM12",kXMC2D,-kYMC2Ep,kZMCp, 0, "ONLY", tpar, 3);
1617 gMC->Gsposp("CC2A", 18, "CM12",-kXMC2D,-kYMC2Em,kZMCm, 0, "ONLY", tpar, 3);
1620 const Float_t kYMC2Fp=kYMC1Fp*kZ12;
1621 const Float_t kYMC2Fm=kYMC1Fm*kZ12;
1622 gMC->Gsposp("CC2A", 19, "CM12",kXMC2D,kYMC2Fm,kZMCm, 0, "ONLY", tpar, 3);
1623 gMC->Gsposp("CC2A", 20, "CM12",-kXMC2D,kYMC2Fp,kZMCp, 0, "ONLY", tpar, 3);
1624 gMC->Gsposp("CC2A", 21, "CM12",kXMC2D,-kYMC2Fm,kZMCm, 0, "ONLY", tpar, 3);
1625 gMC->Gsposp("CC2A", 22, "CM12",-kXMC2D,-kYMC2Fp,kZMCp, 0, "ONLY", tpar, 3);
1627 // Positioning second plane of station 1 in ALICE
1629 gMC->Gspos("CM12", 1, "ALIC", 0., 0., zpos2, 0, "ONLY");
1631 // End of geometry definition for the second plane of station 1
1635 // TRIGGER STATION 2 - TRIGGER STATION 2 - TRIGGER STATION 2
1638 // zpos3 and zpos4 are now the middle of the first and second
1639 // plane of station 2 :
1640 // zpos3=(17075+16995)/2=17035 mm, thick/2=40 mm
1641 // zpos4=(17225+17145)/2=17185 mm, thick/2=40 mm
1643 // zpos3m=16999 mm , zpos3p=17071 mm (middles of gas gaps)
1644 // zpos4m=17149 mm , zpos4p=17221 mm (middles of gas gaps)
1645 // rem : the total thickness accounts for 1 mm of al on both
1646 // side of the RPCs (see zpos3 and zpos4), as previously
1647 iChamber1 = iChamber = (AliMUONChamber*) (*fChambers)[12];
1648 iChamber2 =(AliMUONChamber*) (*fChambers)[13];
1649 Float_t zpos3=iChamber1->Z();
1650 Float_t zpos4=iChamber2->Z();
1653 // Mother volume definition
1654 tpar[0] = iChamber->RInner();
1655 tpar[1] = iChamber->ROuter();
1658 gMC->Gsvolu("CM21", "TUBE", idAir, tpar, 3);
1659 gMC->Gsvolu("CM22", "TUBE", idAir, tpar, 3);
1661 // Definition of the flange between the beam shielding and the RPC
1662 // ???? interface shielding
1668 gMC->Gsvolu("CF2A", "TUBE", idAlu1, tpar, 3); //Al
1669 gMC->Gspos("CF2A", 1, "CM21", 0., 0., 0., 0, "MANY");
1670 gMC->Gspos("CF2A", 2, "CM22", 0., 0., 0., 0, "MANY");
1674 // FIRST PLANE OF STATION 2 : proj ratio = zpos3/zpos1
1676 const Float_t kZ13=zpos3/zpos1;
1678 // Definition of prototype for chambers in the first plane of station 2
1683 gMC->Gsvolu("CC3A", "BOX ", idAlu1, tpar, 0); //Al
1684 gMC->Gsvolu("CB3A", "BOX ", idtmed[1107], tpar, 0); //Bakelite
1685 gMC->Gsvolu("CG3A", "BOX ", idtmed[1106], tpar, 0); //Gas streamer
1692 const Float_t kXMC3A=kXMC1A*kZ13;
1693 const Float_t kYMC3Am=0.;
1694 const Float_t kYMC3Ap=0.;
1697 gMC->Gsposp("CG3A", 1, "CB3A", 0., 0., 0., 0, "ONLY",tpar,3);
1699 gMC->Gsposp("CB3A", 1, "CC3A", 0., 0., 0., 0, "ONLY",tpar,3);
1702 tpar[0] = ((kXMC1MAX-kXMC1MED)/2.)*kZ13;
1703 tpar[1] = kYMC1MIN*kZ13;
1704 gMC->Gsposp("CC3A", 1, "CM21",kXMC3A,kYMC3Am,kZMCm, 0, "ONLY", tpar, 3);
1705 gMC->Gsposp("CC3A", 2, "CM21",-kXMC3A,kYMC3Ap,kZMCp, 0, "ONLY", tpar, 3);
1709 tpar[0] = ((kXMC1MAX-kXMC1MIN)/2.)*kZ13;
1710 tpar[1] = ((kYMC1MAX-kYMC1MIN)/2.)*kZ13;
1712 const Float_t kXMC3B=kXMC1B*kZ13;
1713 const Float_t kYMC3Bp=kYMC1Bp*kZ13;
1714 const Float_t kYMC3Bm=kYMC1Bm*kZ13;
1715 gMC->Gsposp("CC3A", 3, "CM21",kXMC3B,kYMC3Bp,kZMCp, 0, "ONLY", tpar, 3);
1716 gMC->Gsposp("CC3A", 4, "CM21",-kXMC3B,kYMC3Bm,kZMCm, 0, "ONLY", tpar, 3);
1717 gMC->Gsposp("CC3A", 5, "CM21",kXMC3B,-kYMC3Bp,kZMCp, 0, "ONLY", tpar, 3);
1718 gMC->Gsposp("CC3A", 6, "CM21",-kXMC3B,-kYMC3Bm,kZMCm, 0, "ONLY", tpar, 3);
1721 // chamber type C (end of type B !!)
1722 tpar[0] = (kXMC1MAX/2)*kZ13;
1723 tpar[1] = (kYMC1MAX/2)*kZ13;
1725 const Float_t kXMC3C=kXMC1C*kZ13;
1726 const Float_t kYMC3Cp=kYMC1Cp*kZ13;
1727 const Float_t kYMC3Cm=kYMC1Cm*kZ13;
1728 gMC->Gsposp("CC3A", 7, "CM21",kXMC3C,kYMC3Cp,kZMCp, 0, "ONLY", tpar, 3);
1729 gMC->Gsposp("CC3A", 8, "CM21",-kXMC3C,kYMC3Cm,kZMCm, 0, "ONLY", tpar, 3);
1730 gMC->Gsposp("CC3A", 9, "CM21",kXMC3C,-kYMC3Cp,kZMCp, 0, "ONLY", tpar, 3);
1731 gMC->Gsposp("CC3A", 10, "CM21",-kXMC3C,-kYMC3Cm,kZMCm, 0, "ONLY", tpar, 3);
1734 // chamber type D, E and F (same size)
1736 tpar[0] = (kXMC1MAX/2.)*kZ13;
1737 tpar[1] = kYMC1MIN*kZ13;
1739 const Float_t kXMC3D=kXMC1D*kZ13;
1740 const Float_t kYMC3Dp=kYMC1Dp*kZ13;
1741 const Float_t kYMC3Dm=kYMC1Dm*kZ13;
1742 gMC->Gsposp("CC3A", 11, "CM21",kXMC3D,kYMC3Dm,kZMCm, 0, "ONLY", tpar, 3);
1743 gMC->Gsposp("CC3A", 12, "CM21",-kXMC3D,kYMC3Dp,kZMCp, 0, "ONLY", tpar, 3);
1744 gMC->Gsposp("CC3A", 13, "CM21",kXMC3D,-kYMC3Dm,kZMCm, 0, "ONLY", tpar, 3);
1745 gMC->Gsposp("CC3A", 14, "CM21",-kXMC3D,-kYMC3Dp,kZMCp, 0, "ONLY", tpar, 3);
1747 const Float_t kYMC3Ep=kYMC1Ep*kZ13;
1748 const Float_t kYMC3Em=kYMC1Em*kZ13;
1749 gMC->Gsposp("CC3A", 15, "CM21",kXMC3D,kYMC3Ep,kZMCp, 0, "ONLY", tpar, 3);
1750 gMC->Gsposp("CC3A", 16, "CM21",-kXMC3D,kYMC3Em,kZMCm, 0, "ONLY", tpar, 3);
1751 gMC->Gsposp("CC3A", 17, "CM21",kXMC3D,-kYMC3Ep,kZMCp, 0, "ONLY", tpar, 3);
1752 gMC->Gsposp("CC3A", 18, "CM21",-kXMC3D,-kYMC3Em,kZMCm, 0, "ONLY", tpar, 3);
1754 const Float_t kYMC3Fp=kYMC1Fp*kZ13;
1755 const Float_t kYMC3Fm=kYMC1Fm*kZ13;
1756 gMC->Gsposp("CC3A", 19, "CM21",kXMC3D,kYMC3Fm,kZMCm, 0, "ONLY", tpar, 3);
1757 gMC->Gsposp("CC3A", 20, "CM21",-kXMC3D,kYMC3Fp,kZMCp, 0, "ONLY", tpar, 3);
1758 gMC->Gsposp("CC3A", 21, "CM21",kXMC3D,-kYMC3Fm,kZMCm, 0, "ONLY", tpar, 3);
1759 gMC->Gsposp("CC3A", 22, "CM21",-kXMC3D,-kYMC3Fp,kZMCp, 0, "ONLY", tpar, 3);
1762 // Positioning first plane of station 2 in ALICE
1764 gMC->Gspos("CM21", 1, "ALIC", 0., 0., zpos3, 0, "ONLY");
1766 // End of geometry definition for the first plane of station 2
1771 // SECOND PLANE OF STATION 2 : proj ratio = zpos4/zpos1
1773 const Float_t kZ14=zpos4/zpos1;
1775 // Definition of prototype for chambers in the second plane of station 2
1781 gMC->Gsvolu("CC4A", "BOX ", idAlu1, tpar, 0); //Al
1782 gMC->Gsvolu("CB4A", "BOX ", idtmed[1107], tpar, 0); //Bakelite
1783 gMC->Gsvolu("CG4A", "BOX ", idtmed[1106], tpar, 0); //Gas streamer
1789 const Float_t kXMC4A=kXMC1A*kZ14;
1790 const Float_t kYMC4Am=0.;
1791 const Float_t kYMC4Ap=0.;
1794 gMC->Gsposp("CG4A", 1, "CB4A", 0., 0., 0., 0, "ONLY",tpar,3);
1796 gMC->Gsposp("CB4A", 1, "CC4A", 0., 0., 0., 0, "ONLY",tpar,3);
1799 tpar[0] = ((kXMC1MAX-kXMC1MED)/2.)*kZ14;
1800 tpar[1] = kYMC1MIN*kZ14;
1801 gMC->Gsposp("CC4A", 1, "CM22",kXMC4A,kYMC4Am,kZMCm, 0, "ONLY", tpar, 3);
1802 gMC->Gsposp("CC4A", 2, "CM22",-kXMC4A,kYMC4Ap,kZMCp, 0, "ONLY", tpar, 3);
1806 tpar[0] = ((kXMC1MAX-kXMC1MIN)/2.)*kZ14;
1807 tpar[1] = ((kYMC1MAX-kYMC1MIN)/2.)*kZ14;
1809 const Float_t kXMC4B=kXMC1B*kZ14;
1810 const Float_t kYMC4Bp=kYMC1Bp*kZ14;
1811 const Float_t kYMC4Bm=kYMC1Bm*kZ14;
1812 gMC->Gsposp("CC4A", 3, "CM22",kXMC4B,kYMC4Bp,kZMCp, 0, "ONLY", tpar, 3);
1813 gMC->Gsposp("CC4A", 4, "CM22",-kXMC4B,kYMC4Bm,kZMCm, 0, "ONLY", tpar, 3);
1814 gMC->Gsposp("CC4A", 5, "CM22",kXMC4B,-kYMC4Bp,kZMCp, 0, "ONLY", tpar, 3);
1815 gMC->Gsposp("CC4A", 6, "CM22",-kXMC4B,-kYMC4Bm,kZMCm, 0, "ONLY", tpar, 3);
1818 // chamber type C (end of type B !!)
1819 tpar[0] =(kXMC1MAX/2)*kZ14;
1820 tpar[1] = (kYMC1MAX/2)*kZ14;
1822 const Float_t kXMC4C=kXMC1C*kZ14;
1823 const Float_t kYMC4Cp=kYMC1Cp*kZ14;
1824 const Float_t kYMC4Cm=kYMC1Cm*kZ14;
1825 gMC->Gsposp("CC4A", 7, "CM22",kXMC4C,kYMC4Cp,kZMCp, 0, "ONLY", tpar, 3);
1826 gMC->Gsposp("CC4A", 8, "CM22",-kXMC4C,kYMC4Cm,kZMCm, 0, "ONLY", tpar, 3);
1827 gMC->Gsposp("CC4A", 9, "CM22",kXMC4C,-kYMC4Cp,kZMCp, 0, "ONLY", tpar, 3);
1828 gMC->Gsposp("CC4A", 10, "CM22",-kXMC4C,-kYMC4Cm,kZMCm, 0, "ONLY", tpar, 3);
1831 // chamber type D, E and F (same size)
1832 tpar[0] = (kXMC1MAX/2.)*kZ14;
1833 tpar[1] = kYMC1MIN*kZ14;
1835 const Float_t kXMC4D=kXMC1D*kZ14;
1836 const Float_t kYMC4Dp=kYMC1Dp*kZ14;
1837 const Float_t kYMC4Dm=kYMC1Dm*kZ14;
1838 gMC->Gsposp("CC4A", 11, "CM22",kXMC4D,kYMC4Dm,kZMCm, 0, "ONLY", tpar, 3);
1839 gMC->Gsposp("CC4A", 12, "CM22",-kXMC4D,kYMC4Dp,kZMCp, 0, "ONLY", tpar, 3);
1840 gMC->Gsposp("CC4A", 13, "CM22",kXMC4D,-kYMC4Dm,kZMCm, 0, "ONLY", tpar, 3);
1841 gMC->Gsposp("CC4A", 14, "CM22",-kXMC4D,-kYMC4Dp,kZMCp, 0, "ONLY", tpar, 3);
1843 const Float_t kYMC4Ep=kYMC1Ep*kZ14;
1844 const Float_t kYMC4Em=kYMC1Em*kZ14;
1845 gMC->Gsposp("CC4A", 15, "CM22",kXMC4D,kYMC4Ep,kZMCp, 0, "ONLY", tpar, 3);
1846 gMC->Gsposp("CC4A", 16, "CM22",-kXMC4D,kYMC4Em,kZMCm, 0, "ONLY", tpar, 3);
1847 gMC->Gsposp("CC4A", 17, "CM22",kXMC4D,-kYMC4Ep,kZMCp, 0, "ONLY", tpar, 3);
1848 gMC->Gsposp("CC4A", 18, "CM22",-kXMC4D,-kYMC4Em,kZMCm, 0, "ONLY", tpar, 3);
1850 const Float_t kYMC4Fp=kYMC1Fp*kZ14;
1851 const Float_t kYMC4Fm=kYMC1Fm*kZ14;
1852 gMC->Gsposp("CC4A", 19, "CM22",kXMC4D,kYMC4Fm,kZMCm, 0, "ONLY", tpar, 3);
1853 gMC->Gsposp("CC4A", 20, "CM22",-kXMC4D,kYMC4Fp,kZMCp, 0, "ONLY", tpar, 3);
1854 gMC->Gsposp("CC4A", 21, "CM22",kXMC4D,-kYMC4Fm,kZMCm, 0, "ONLY", tpar, 3);
1855 gMC->Gsposp("CC4A", 22, "CM22",-kXMC4D,-kYMC4Fp,kZMCp, 0, "ONLY", tpar, 3);
1858 // Positioning second plane of station 2 in ALICE
1860 gMC->Gspos("CM22", 1, "ALIC", 0., 0., zpos4, 0, "ONLY");
1862 // End of geometry definition for the second plane of station 2
1864 // End of trigger geometry definition
1870 //___________________________________________
1871 void AliMUONv1::CreateMaterials()
1873 // *** DEFINITION OF AVAILABLE MUON MATERIALS ***
1875 // Ar-CO2 gas (80%+20%)
1876 Float_t ag1[3] = { 39.95,12.01,16. };
1877 Float_t zg1[3] = { 18.,6.,8. };
1878 Float_t wg1[3] = { .8,.0667,.13333 };
1879 Float_t dg1 = .001821;
1881 // Ar-buthane-freon gas -- trigger chambers
1882 Float_t atr1[4] = { 39.95,12.01,1.01,19. };
1883 Float_t ztr1[4] = { 18.,6.,1.,9. };
1884 Float_t wtr1[4] = { .56,.1262857,.2857143,.028 };
1885 Float_t dtr1 = .002599;
1888 Float_t agas[3] = { 39.95,12.01,16. };
1889 Float_t zgas[3] = { 18.,6.,8. };
1890 Float_t wgas[3] = { .74,.086684,.173316 };
1891 Float_t dgas = .0018327;
1893 // Ar-Isobutane gas (80%+20%) -- tracking
1894 Float_t ag[3] = { 39.95,12.01,1.01 };
1895 Float_t zg[3] = { 18.,6.,1. };
1896 Float_t wg[3] = { .8,.057,.143 };
1897 Float_t dg = .0019596;
1899 // Ar-Isobutane-Forane-SF6 gas (49%+7%+40%+4%) -- trigger
1900 Float_t atrig[5] = { 39.95,12.01,1.01,19.,32.066 };
1901 Float_t ztrig[5] = { 18.,6.,1.,9.,16. };
1902 Float_t wtrig[5] = { .49,1.08,1.5,1.84,0.04 };
1903 Float_t dtrig = .0031463;
1907 Float_t abak[3] = {12.01 , 1.01 , 16.};
1908 Float_t zbak[3] = {6. , 1. , 8.};
1909 Float_t wbak[3] = {6. , 6. , 1.};
1912 Float_t epsil, stmin, deemax, tmaxfd, stemax;
1914 Int_t iSXFLD = gAlice->Field()->Integ();
1915 Float_t sXMGMX = gAlice->Field()->Max();
1917 // --- Define the various materials for GEANT ---
1918 AliMaterial(9, "ALUMINIUM$", 26.98, 13., 2.7, 8.9, 37.2);
1919 AliMaterial(10, "ALUMINIUM$", 26.98, 13., 2.7, 8.9, 37.2);
1920 AliMaterial(15, "AIR$ ", 14.61, 7.3, .001205, 30423.24, 67500);
1921 AliMixture(19, "Bakelite$", abak, zbak, dbak, -3, wbak);
1922 AliMixture(20, "ArC4H10 GAS$", ag, zg, dg, 3, wg);
1923 AliMixture(21, "TRIG GAS$", atrig, ztrig, dtrig, -5, wtrig);
1924 AliMixture(22, "ArCO2 80%$", ag1, zg1, dg1, 3, wg1);
1925 AliMixture(23, "Ar-freon $", atr1, ztr1, dtr1, 4, wtr1);
1926 AliMixture(24, "ArCO2 GAS$", agas, zgas, dgas, 3, wgas);
1927 // materials for slat:
1928 // Sensitive area: gas (already defined)
1930 // insulating material and frame: vetronite
1931 // walls: carbon, rohacell, carbon
1932 Float_t aglass[5]={12.01, 28.09, 16., 10.8, 23.};
1933 Float_t zglass[5]={ 6., 14., 8., 5., 11.};
1934 Float_t wglass[5]={ 0.5, 0.105, 0.355, 0.03, 0.01};
1935 Float_t dglass=1.74;
1937 // rohacell: C9 H13 N1 O2
1938 Float_t arohac[4] = {12.01, 1.01, 14.010, 16.};
1939 Float_t zrohac[4] = { 6., 1., 7., 8.};
1940 Float_t wrohac[4] = { 9., 13., 1., 2.};
1941 Float_t drohac = 0.03;
1943 AliMaterial(31, "COPPER$", 63.54, 29., 8.96, 1.4, 0.);
1944 AliMixture(32, "Vetronite$",aglass, zglass, dglass, 5, wglass);
1945 AliMaterial(33, "Carbon$", 12.01, 6., 2.265, 18.8, 49.9);
1946 AliMixture(34, "Rohacell$", arohac, zrohac, drohac, -4, wrohac);
1949 epsil = .001; // Tracking precision,
1950 stemax = -1.; // Maximum displacement for multiple scat
1951 tmaxfd = -20.; // Maximum angle due to field deflection
1952 deemax = -.3; // Maximum fractional energy loss, DLS
1956 AliMedium(1, "AIR_CH_US ", 15, 1, iSXFLD, sXMGMX, tmaxfd, stemax, deemax, epsil, stmin);
1960 AliMedium(4, "ALU_CH_US ", 9, 0, iSXFLD, sXMGMX, tmaxfd, fMaxStepAlu,
1961 fMaxDestepAlu, epsil, stmin);
1962 AliMedium(5, "ALU_CH_US ", 10, 0, iSXFLD, sXMGMX, tmaxfd, fMaxStepAlu,
1963 fMaxDestepAlu, epsil, stmin);
1967 AliMedium(6, "AR_CH_US ", 20, 1, iSXFLD, sXMGMX, tmaxfd, fMaxStepGas,
1968 fMaxDestepGas, epsil, stmin);
1970 // Ar-Isobuthane-Forane-SF6 gas
1972 AliMedium(7, "GAS_CH_TRIGGER ", 21, 1, iSXFLD, sXMGMX, tmaxfd, stemax, deemax, epsil, stmin);
1974 AliMedium(8, "BAKE_CH_TRIGGER ", 19, 0, iSXFLD, sXMGMX, tmaxfd, fMaxStepAlu,
1975 fMaxDestepAlu, epsil, stmin);
1977 AliMedium(9, "ARG_CO2 ", 22, 1, iSXFLD, sXMGMX, tmaxfd, fMaxStepGas,
1978 fMaxDestepAlu, epsil, stmin);
1979 // tracking media for slats: check the parameters!!
1980 AliMedium(11, "PCB_COPPER ", 31, 0, iSXFLD, sXMGMX, tmaxfd,
1981 fMaxStepAlu, fMaxDestepAlu, epsil, stmin);
1982 AliMedium(12, "VETRONITE ", 32, 0, iSXFLD, sXMGMX, tmaxfd,
1983 fMaxStepAlu, fMaxDestepAlu, epsil, stmin);
1984 AliMedium(13, "CARBON ", 33, 0, iSXFLD, sXMGMX, tmaxfd,
1985 fMaxStepAlu, fMaxDestepAlu, epsil, stmin);
1986 AliMedium(14, "Rohacell ", 34, 0, iSXFLD, sXMGMX, tmaxfd,
1987 fMaxStepAlu, fMaxDestepAlu, epsil, stmin);
1990 //___________________________________________
1992 void AliMUONv1::Init()
1995 // Initialize Tracking Chambers
1998 if(fDebug) printf("\n%s: Start Init for version 1 - CPC chamber type\n\n",ClassName());
2000 for (i=0; i<AliMUONConstants::NCh(); i++) {
2001 ( (AliMUONChamber*) (*fChambers)[i])->Init();
2005 // Set the chamber (sensitive region) GEANT identifier
2006 AliMC* gMC = AliMC::GetMC();
2007 ((AliMUONChamber*)(*fChambers)[0])->SetGid(gMC->VolId("C01G"));
2008 ((AliMUONChamber*)(*fChambers)[1])->SetGid(gMC->VolId("C02G"));
2010 ((AliMUONChamber*)(*fChambers)[2])->SetGid(gMC->VolId("C03G"));
2011 ((AliMUONChamber*)(*fChambers)[3])->SetGid(gMC->VolId("C04G"));
2013 ((AliMUONChamber*)(*fChambers)[4])->SetGid(gMC->VolId("S05G"));
2014 ((AliMUONChamber*)(*fChambers)[5])->SetGid(gMC->VolId("S06G"));
2016 ((AliMUONChamber*)(*fChambers)[6])->SetGid(gMC->VolId("S07G"));
2017 ((AliMUONChamber*)(*fChambers)[7])->SetGid(gMC->VolId("S08G"));
2019 ((AliMUONChamber*)(*fChambers)[8])->SetGid(gMC->VolId("S09G"));
2020 ((AliMUONChamber*)(*fChambers)[9])->SetGid(gMC->VolId("S10G"));
2022 ((AliMUONChamber*)(*fChambers)[10])->SetGid(gMC->VolId("CG1A"));
2023 ((AliMUONChamber*)(*fChambers)[11])->SetGid(gMC->VolId("CG2A"));
2024 ((AliMUONChamber*)(*fChambers)[12])->SetGid(gMC->VolId("CG3A"));
2025 ((AliMUONChamber*)(*fChambers)[13])->SetGid(gMC->VolId("CG4A"));
2027 if(fDebug) printf("\n%s: Finished Init for version 1 - CPC chamber type\n",ClassName());
2030 if(fDebug) printf("\n%s: Start Init for Trigger Circuits\n",ClassName());
2031 for (i=0; i<AliMUONConstants::NTriggerCircuit(); i++) {
2032 ( (AliMUONTriggerCircuit*) (*fTriggerCircuits)[i])->Init(i);
2034 if(fDebug) printf("%s: Finished Init for Trigger Circuits\n",ClassName());
2039 //___________________________________________
2040 void AliMUONv1::StepManager()
2044 static Int_t vol[2];
2049 Float_t destep, step;
2051 static Float_t eloss, eloss2, xhit, yhit, zhit, tof, tlength;
2052 const Float_t kBig = 1.e10;
2053 static Float_t hits[15];
2055 TClonesArray &lhits = *fHits;
2059 // Only charged tracks
2060 if( !(gMC->TrackCharge()) ) return;
2062 // Only gas gap inside chamber
2063 // Tag chambers and record hits when track enters
2065 id=gMC->CurrentVolID(copy);
2067 for (Int_t i = 1; i <= AliMUONConstants::NCh(); i++) {
2068 if(id==((AliMUONChamber*)(*fChambers)[i-1])->GetGid()){
2073 if (idvol == -1) return;
2075 // Get current particle id (ipart), track position (pos) and momentum (mom)
2076 gMC->TrackPosition(pos);
2077 gMC->TrackMomentum(mom);
2079 ipart = gMC->TrackPid();
2082 // momentum loss and steplength in last step
2083 destep = gMC->Edep();
2084 step = gMC->TrackStep();
2087 // record hits when track enters ...
2088 if( gMC->IsTrackEntering()) {
2089 gMC->SetMaxStep(fMaxStepGas);
2090 Double_t tc = mom[0]*mom[0]+mom[1]*mom[1];
2091 Double_t rt = TMath::Sqrt(tc);
2092 Double_t pmom = TMath::Sqrt(tc+mom[2]*mom[2]);
2093 Double_t tx = mom[0]/pmom;
2094 Double_t ty = mom[1]/pmom;
2095 Double_t tz = mom[2]/pmom;
2096 Double_t s = ((AliMUONChamber*)(*fChambers)[idvol])
2099 theta = Float_t(TMath::ATan2(rt,Double_t(mom[2])))*kRaddeg;
2100 phi = Float_t(TMath::ATan2(Double_t(mom[1]),Double_t(mom[0])))*kRaddeg;
2101 hits[0] = Float_t(ipart); // Geant3 particle type
2102 hits[1] = pos[0]+s*tx; // X-position for hit
2103 hits[2] = pos[1]+s*ty; // Y-position for hit
2104 hits[3] = pos[2]+s*tz; // Z-position for hit
2105 hits[4] = theta; // theta angle of incidence
2106 hits[5] = phi; // phi angle of incidence
2107 hits[8] = (Float_t) fNPadHits; // first padhit
2108 hits[9] = -1; // last pad hit
2109 hits[10] = mom[3]; // hit momentum P
2110 hits[11] = mom[0]; // Px
2111 hits[12] = mom[1]; // Py
2112 hits[13] = mom[2]; // Pz
2113 tof=gMC->TrackTime();
2114 hits[14] = tof; // Time of flight
2121 Chamber(idvol).ChargeCorrelationInit();
2122 // Only if not trigger chamber
2127 if(idvol < AliMUONConstants::NTrackingCh()) {
2129 // Initialize hit position (cursor) in the segmentation model
2130 ((AliMUONChamber*) (*fChambers)[idvol])
2131 ->SigGenInit(pos[0], pos[1], pos[2]);
2134 //printf("In the Trigger Chamber #%d\n",idvol-9);
2140 // Calculate the charge induced on a pad (disintegration) in case
2142 // Mip left chamber ...
2143 if( gMC->IsTrackExiting() || gMC->IsTrackStop() || gMC->IsTrackDisappeared()){
2144 gMC->SetMaxStep(kBig);
2149 Float_t localPos[3];
2150 Float_t globalPos[3] = {pos[0], pos[1], pos[2]};
2151 gMC->Gmtod(globalPos,localPos,1);
2153 if(idvol < AliMUONConstants::NTrackingCh()) {
2154 // tracking chambers
2155 x0 = 0.5*(xhit+pos[0]);
2156 y0 = 0.5*(yhit+pos[1]);
2157 z0 = 0.5*(zhit+pos[2]);
2166 if (eloss >0) MakePadHits(x0,y0,z0,eloss,tof,idvol);
2169 hits[6] = tlength; // track length
2170 hits[7] = eloss2; // de/dx energy loss
2172 if (fNPadHits > (Int_t)hits[8]) {
2173 hits[8] = hits[8]+1;
2174 hits[9] = (Float_t) fNPadHits;
2179 new(lhits[fNhits++])
2180 AliMUONHit(fIshunt, gAlice->CurrentTrack(), vol,hits);
2183 // Check additional signal generation conditions
2184 // defined by the segmentation
2185 // model (boundary crossing conditions)
2186 // only for tracking chambers
2188 ((idvol < AliMUONConstants::NTrackingCh()) &&
2189 ((AliMUONChamber*) (*fChambers)[idvol])->SigGenCond(pos[0], pos[1], pos[2]))
2191 ((AliMUONChamber*) (*fChambers)[idvol])
2192 ->SigGenInit(pos[0], pos[1], pos[2]);
2194 Float_t localPos[3];
2195 Float_t globalPos[3] = {pos[0], pos[1], pos[2]};
2196 gMC->Gmtod(globalPos,localPos,1);
2200 if (eloss > 0 && idvol < AliMUONConstants::NTrackingCh())
2201 MakePadHits(0.5*(xhit+pos[0]),0.5*(yhit+pos[1]),pos[2],eloss,tof,idvol);
2208 // nothing special happened, add up energy loss