]>
Commit | Line | Data |
---|---|---|
ba030c0e | 1 | /************************************************************************** |
2 | * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * | |
3 | * * | |
4 | * Author: The ALICE Off-line Project. * | |
5 | * Contributors are mentioned in the code where appropriate. * | |
6 | * * | |
7 | * Permission to use, copy, modify and distribute this software and its * | |
8 | * documentation strictly for non-commercial purposes is hereby granted * | |
9 | * without fee, provided that the above copyright notice appears in all * | |
10 | * copies and that both the copyright notice and this permission notice * | |
11 | * appear in the supporting documentation. The authors make no claims * | |
12 | * about the suitability of this software for any purpose. It is * | |
13 | * provided "as is" without express or implied warranty. * | |
14 | **************************************************************************/ | |
15 | ||
16 | /* | |
17 | $Log$ | |
18 | */ | |
19 | ||
20 | // Authors: David Guez, Ivana Hrivnacova, Marion MacCormick; IPN Orsay | |
21 | // | |
22 | // Class AliMUONv2 | |
23 | // --------------- | |
24 | // Inherits from AliMUONv1 but with a more detailed | |
25 | // geometrical description of station 1 | |
26 | ||
27 | #include <algorithm> | |
28 | #include <vector> | |
29 | ||
30 | #include <string.h> | |
31 | ||
32 | #include <TVector2.h> | |
33 | #include <TClonesArray.h> | |
34 | #include <TLorentzVector.h> | |
35 | ||
36 | ||
37 | #include "AliMUONv2.h" | |
38 | #include "AliMUONConstants.h" | |
39 | #include "AliMUONHit.h" | |
40 | #include "AliRun.h" | |
41 | #include "AliMagF.h" | |
42 | #include "AliConst.h" | |
43 | ||
44 | #include <MReader.h> | |
45 | #include <MSector.h> | |
46 | #include <MRow.h> | |
47 | #include <MVRowSegment.h> | |
48 | #include <MVMotif.h> | |
49 | #include <MMotifMap.h> | |
50 | #include <MMotifPosition.h> | |
51 | #include <MMotifType.h> | |
52 | #include <MIntPair.h> | |
53 | ||
54 | ||
55 | #include <Riostream.h> | |
56 | ||
57 | ClassImp(AliMUONv2) | |
58 | ||
59 | ||
60 | ||
61 | const GReal_t AliMUONv2::fgkHzPadPlane=0.0148/2.; //Pad plane | |
62 | const GReal_t AliMUONv2::fgkHzFoam = 2.083/2.; // Foam of mechanicalplane | |
63 | const GReal_t AliMUONv2::fgkHzFR4 = 0.0031/2.; // FR4 of mechanical plane | |
64 | const GReal_t AliMUONv2::fgkHzSnPb = 0.0091/2.; //Pad/Kapton connection (66 pt) | |
65 | const GReal_t AliMUONv2::fgkHzKapton = 0.0122/2.; //Kapton | |
66 | const GReal_t AliMUONv2::fgkHzBergPlastic = 0.3062/2.; //Berg connector | |
67 | const GReal_t AliMUONv2::fgkHzBergCopper = 0.1882/2.; //Berg connector | |
68 | const GReal_t AliMUONv2::fgkHzDaughter = 0.0156/2.; //Daughter board | |
69 | const GReal_t AliMUONv2::fgkHzGas = 0.2/2.; //Gas | |
70 | const GReal_t AliMUONv2::fgkHxQuadrant = 94.69/2.; //Box surrounding quadrant | |
71 | const GReal_t AliMUONv2::fgkHyQuadrant = 100.31/2.; //Box surrounding quadrant | |
72 | const GReal_t AliMUONv2::fgkMotherIR = 18.3; | |
73 | const GReal_t AliMUONv2::fgkMotherOR = 104.974; | |
74 | const GReal_t AliMUONv2::fgkMotherThick = 6.5/2; //6.5cm between two quadrants | |
75 | const GReal_t AliMUONv2::fgkMotherPhiL = 0.; | |
76 | const GReal_t AliMUONv2::fgkMotherPhiU = 90.; | |
77 | ||
78 | ||
79 | const GReal_t AliMUONv2::fgkHxHole=1.5/2.; | |
80 | const GReal_t AliMUONv2::fgkHyHole=6./2.; | |
81 | const GReal_t AliMUONv2::fgkHxBergPlastic=0.74/2.; | |
82 | const GReal_t AliMUONv2::fgkHyBergPlastic=5.09/2.; | |
83 | const GReal_t AliMUONv2::fgkHxBergCopper=0.25/2.; | |
84 | const GReal_t AliMUONv2::fgkHyBergCopper=3.6/2.; | |
85 | const GReal_t AliMUONv2::fgkHxKapton=0.8/2.; | |
86 | const GReal_t AliMUONv2::fgkHyKapton=5.7/2.; | |
87 | const GReal_t AliMUONv2::fgkHxDaughter=2.3/2.; | |
88 | const GReal_t AliMUONv2::fgkHyDaughter=6.3/2.; | |
89 | const GReal_t AliMUONv2::fgkOffsetX=1.46; | |
90 | const GReal_t AliMUONv2::fgkOffsetY=0.71; | |
91 | const GReal_t AliMUONv2::fgkDeltaFilleEtamX=0.; | |
92 | const GReal_t AliMUONv2::fgkDeltaFilleEtamY=0.5; | |
93 | ||
94 | const char* AliMUONv2::fgkHoleName="MCHL"; | |
95 | const char* AliMUONv2::fgkDaughterName="MCDB"; | |
96 | const char AliMUONv2::fgkFoamLayerSuffix='F'; | |
97 | const char* AliMUONv2::fgkQuadrantName="QUA"; | |
98 | ||
99 | //___________________________________________ | |
100 | AliMUONv2::AliMUONv2() | |
101 | : AliMUONv1(), | |
102 | fIdSens(0) | |
103 | { | |
104 | // Default Constructor | |
105 | // | |
106 | ||
107 | // keep secondaries | |
108 | SetIshunt(0); | |
109 | } | |
110 | ||
111 | //___________________________________________ | |
112 | AliMUONv2::AliMUONv2(const char *name, const char *title) | |
113 | : AliMUONv1(name,title), | |
114 | fIdSens(0) | |
115 | { | |
116 | // keep secondaries | |
117 | SetIshunt(0); | |
118 | ||
119 | // create hits array | |
120 | fHits = new TClonesArray("AliMUONHit",1000); | |
121 | gAlice->AddHitList(fHits); | |
122 | } | |
123 | ||
124 | //___________________________________________ | |
125 | AliMUONv2::AliMUONv2(const AliMUONv2& rMUON) | |
126 | { | |
127 | // Dummy copy constructor | |
128 | } | |
129 | ||
130 | //___________________________________________ | |
131 | AliMUONv2::~AliMUONv2() | |
132 | { | |
133 | // Destructor | |
134 | if(fDebug) printf("%s: Calling AliMUONv2 destructor !!!\n",ClassName()); | |
135 | ||
136 | if (fHits) { | |
137 | fHits->Delete(); | |
138 | delete fHits; | |
139 | } | |
140 | } | |
141 | ||
142 | //___________________________________________ | |
143 | void AliMUONv2::CreateGeometry() | |
144 | { | |
145 | // Create the GEANT geometry for the dimuon arm. | |
146 | // Use the parent's method for stations 2, 3, 4 and 5. | |
147 | // Use the detailed code for the first station. | |
148 | // -- | |
149 | cout << "AliMUONv2::CreateGeometry()" << endl; | |
150 | cout << "_________________________________________" << endl; | |
151 | ||
152 | // tracking medias | |
153 | Int_t* idtmed = fIdtmed->GetArray()-1099; | |
154 | Int_t idAir = idtmed[1100]; // medium 1 | |
155 | ||
156 | ||
157 | ||
158 | //create reflexion matrix | |
159 | Int_t reflXZ,reflYZ,reflXY; | |
160 | AliMatrix(reflXZ, 90., 180., 90., 90., 180., 0.); | |
161 | AliMatrix(reflYZ, 90., 0., 90.,-90., 180., 0.); | |
162 | AliMatrix(reflXY, 90., 180., 90., 270., 0., 0.); | |
163 | ||
164 | CreateHole(); | |
165 | CreateDaughterBoard(); | |
166 | ||
167 | //build the quadrant | |
168 | CreateQuadrant(1); | |
169 | CreateQuadrant(2); | |
170 | GReal_t par[5]; | |
171 | par[0] = fgkMotherIR; | |
172 | par[1] = fgkMotherOR; | |
173 | par[2] = fgkHzGas; | |
174 | par[3] = fgkMotherPhiL; | |
175 | par[4] = fgkMotherPhiU; | |
176 | ||
177 | gMC->Gsvolu("S01G","TUBS",idAir,par,5); | |
178 | gMC->Gspos("S01G",1,QuadrantName(1),0,0,0,0,"ONLY"); | |
179 | gMC->Gsvolu("S02G","TUBS",idAir,par,5); | |
180 | gMC->Gspos("S02G",1,QuadrantName(2),0,0,0,0,"ONLY"); | |
181 | ||
182 | // place the four copies of it | |
183 | ||
184 | //parameters | |
185 | TVector3 pos[4]; | |
186 | Int_t rotm[4]; | |
187 | ||
188 | Double_t deltaZ = 6.5/2.; | |
189 | pos[0]=TVector3(-2.6,-2.6,AliMUONConstants::DefaultChamberZ(0)+deltaZ); | |
190 | rotm[0]=0; | |
191 | pos[1]=TVector3(2.6,-2.6,AliMUONConstants::DefaultChamberZ(0)-deltaZ); | |
192 | rotm[1]=reflXZ; | |
193 | pos[2]=TVector3(2.6,2.6,AliMUONConstants::DefaultChamberZ(0)+deltaZ); | |
194 | rotm[2]=reflXY; | |
195 | pos[3]=TVector3(-2.6,2.6,AliMUONConstants::DefaultChamberZ(0)-deltaZ); | |
196 | rotm[3]=reflYZ; | |
197 | ||
198 | //placing | |
199 | GReal_t posX,posY,posZ; | |
200 | for (Int_t i=0;i<4;i++){ | |
201 | posX=pos[i].X(); | |
202 | posY=pos[i].Y(); | |
203 | // the 1st chamber | |
204 | posZ=pos[i].Z(); | |
205 | gMC->Gspos(QuadrantName(1),i+1,"ALIC",posX,posY,posZ,rotm[i],"ONLY"); | |
206 | // the 2nd chamber | |
207 | posZ=pos[i].Z()+AliMUONConstants::DefaultChamberZ(1) | |
208 | -AliMUONConstants::DefaultChamberZ(0); | |
209 | gMC->Gspos(QuadrantName(2),i+5,"ALIC",posX,posY,posZ,rotm[i],"ONLY"); | |
210 | } | |
211 | static Int_t stations[5]={0,1,1,1,1}; | |
212 | fStations=stations; | |
213 | AliMUONv1::CreateGeometry(); | |
214 | } | |
215 | //___________________________________________ | |
216 | void AliMUONv2::CreateQuadrant(Int_t chamber) | |
217 | { | |
218 | // create the quadrant (bending and non-bending planes) | |
219 | // for the given chamber | |
220 | // -- | |
221 | CreateFrame(chamber); | |
222 | ||
223 | TSpecialMap specialMap; | |
224 | ||
225 | TVector3 where; | |
226 | specialMap[1001] = AliMUONSt1SpecialMotif(TVector2(0.1 ,0.84),90.); | |
227 | specialMap[1002] = AliMUONSt1SpecialMotif(TVector2(0.5 ,0.76)); | |
228 | specialMap[1003] = AliMUONSt1SpecialMotif(TVector2(1.01,0.76)); | |
229 | MReader reader1(kBendingPlane); | |
230 | MSector* sector1 = reader1.BuildSector(); | |
231 | where=TVector3(0.185+2.6,-0.52+2.6,totalHz()+fgkHzGas); | |
232 | PlaceSector(sector1,specialMap,where,chamber); | |
233 | ||
234 | ||
235 | specialMap.clear(); | |
236 | specialMap[4001] = AliMUONSt1SpecialMotif(TVector2(1.01,0.59),90.); | |
237 | specialMap[4002] = AliMUONSt1SpecialMotif(TVector2(1.96, 0.17)); | |
238 | specialMap[4003] = AliMUONSt1SpecialMotif(TVector2(1.61,-1.18)); | |
239 | specialMap[4004] = AliMUONSt1SpecialMotif(TVector2(0.2 ,-0.08)); | |
240 | specialMap[4005] = AliMUONSt1SpecialMotif(TVector2(0.2 , 0.25)); | |
241 | specialMap[4006] = AliMUONSt1SpecialMotif(TVector2(0.28, 0.21)); | |
242 | ||
243 | MReader reader2(kNonBendingPlane); | |
244 | MSector* sector2 = reader2.BuildSector(); | |
245 | where=TVector3(-0.13+2.6,-0.1775+2.6,-totalHz()-fgkHzGas); | |
246 | PlaceSector(sector2,specialMap,where,chamber); | |
247 | } | |
248 | ||
249 | //___________________________________________ | |
250 | void AliMUONv2::CreateMaterials() | |
251 | { | |
252 | // --- Define the various mixtures for GEANT --- | |
253 | ||
254 | // Ar-CO2 gas (80%+20%) | |
255 | Float_t ag1[2] = { 39.95,44.01}; | |
256 | Float_t zg1[2] = { 18.,22.}; | |
257 | Float_t dg1 = .001821; | |
258 | Float_t wg1[2] = { .8,0.2}; | |
259 | // use wg1 weighting factors (6th arg > 0) | |
260 | AliMixture(22, "ArCO2 80%$", ag1, zg1, dg1, 2, wg1); | |
261 | ||
262 | // Ar-buthane-freon gas -- trigger chambers | |
263 | Float_t atr1[4] = { 39.95,12.01,1.01,19. }; | |
264 | Float_t ztr1[4] = { 18.,6.,1.,9. }; | |
265 | Float_t wtr1[4] = { .56,.1262857,.2857143,.028 }; | |
266 | Float_t dtr1 = .002599; | |
267 | AliMixture(23, "Ar-freon $", atr1, ztr1, dtr1, 4, wtr1); | |
268 | ||
269 | // Rohacell 51 - imide methacrylique | |
270 | Float_t aRohacell51[4] = {12.01,1.01,16.00,14.01}; | |
271 | Float_t zRohacell51[4] = {6.,1.,8.,7.}; | |
272 | Float_t dRohacell51 = 0.052; | |
273 | Float_t wRohacell51[4] = {9.,13.,2.,1.}; | |
274 | // use relative A (molecular) values (6th arg < 0) | |
275 | AliMixture(32, "FOAM$",aRohacell51,zRohacell51,dRohacell51,-4,wRohacell51); | |
276 | ||
277 | Float_t aSnPb[2] = {118.69,207.19}; | |
278 | Float_t zSnPb[2] = {50,82}; | |
279 | Float_t dSnPb = 8.926; | |
280 | Float_t wSnPb[2] = {0.6, 0.4} ; | |
281 | // use wSnPb weighting factors (6th arg > 0) | |
282 | AliMixture(35, "SnPb$", aSnPb,zSnPb,dSnPb,2,wSnPb); | |
283 | ||
284 | // plastic definition from K5, Freiburg (found on web) | |
285 | Float_t aPlastic[2]={1.01,12.01}; | |
286 | Float_t zPlastic[2]={1,6}; | |
287 | Float_t denPlastic=1.107; | |
288 | Float_t wPlastic[2]={1,1}; | |
289 | // use relative A (molecular) values (6th arg < 0)...no other info... | |
290 | AliMixture( 33, "Plastic$",aPlastic,zPlastic,denPlastic,-2,wPlastic); | |
291 | ||
292 | // from CERN note NUFACT Note023, Oct.2000 | |
293 | // Inox/Stainless Steel (18%Cr, 9%Ni) | |
294 | Float_t aInox[3] = {55.847,51.9961,58.6934}; | |
295 | Float_t zInox[3] = {26.,24.,28.}; | |
296 | Float_t denInox = 7.930; | |
297 | Float_t wInox[3] = {0.73,0.18,0.09}; | |
298 | // use wInox weighting factors (6th arg > 0) | |
299 | AliMixture(37, "StainlessSteel$",aInox,zInox,denInox,3,wInox); | |
300 | ||
301 | // bakelite | |
302 | Float_t abak[3] = {12.01 , 1.01 , 16.}; | |
303 | Float_t zbak[3] = {6. , 1. , 8.}; | |
304 | Float_t wbak[3] = {6. , 6. , 1.}; | |
305 | Float_t dbak = 1.4; | |
306 | AliMixture(19, "Bakelite$", abak, zbak, dbak, -3, wbak); | |
307 | ||
308 | // Ar-Isobutane gas (80%+20%) | |
309 | Float_t ag[3] = { 39.95,12.01,1.01 }; | |
310 | Float_t zg[3] = { 18.,6.,1. }; | |
311 | Float_t wg[3] = { .8,.057,.143 }; | |
312 | Float_t dg = .0019596; | |
313 | AliMixture(20, "ArC4H10 GAS$", ag, zg, dg, 3, wg); | |
314 | ||
315 | // Ar-Isobutane-Forane-SF6 gas (49%+7%+40%+4%) -- trigger | |
316 | Float_t atrig[5] = { 39.95,12.01,1.01,19.,32.066 }; | |
317 | Float_t ztrig[5] = { 18.,6.,1.,9.,16. }; | |
318 | Float_t wtrig[5] = { .49,1.08,1.5,1.84,0.04 }; | |
319 | Float_t dtrig = .0031463; | |
320 | AliMixture(21, "TRIG GAS$", atrig, ztrig, dtrig, -5, wtrig); | |
321 | ||
322 | // Ar-CO2 gas | |
323 | Float_t agas[3] = { 39.95,12.01,16. }; | |
324 | Float_t zgas[3] = { 18.,6.,8. }; | |
325 | Float_t wgas[3] = { .74,.086684,.173316 }; | |
326 | Float_t dgas = .0018327; | |
327 | AliMixture(24, "ArCO2 GAS$", agas, zgas, dgas, 3, wgas); | |
328 | ||
329 | // --- Define the various AliMaterials for GEANT --- | |
330 | // from PDG and "The Particle Detector BriefBook", Bock and Vasilescu, P.18 | |
331 | AliMaterial( 9, "Aluminium$", 26.98, 13., 2.7, -8.9, 26.1); | |
332 | AliMaterial(10, "Aluminium$", 26.98, 13., 2.7, -8.9, 26.1); | |
333 | AliMaterial(15, "air$", 14.61, 7.3, .001205, -30423.24, 67500); | |
334 | AliMaterial(30, "Copper$", 63.546,29.,8.96,-1.43,9.6); | |
335 | AliMaterial(31, "FR4$", 17.749, 8.875, 1.7, -19.4, 999.); // from DPG | |
336 | AliMaterial(34, "Kapton$", 12.01,6,1.42,-28.6,999); // from DPG | |
337 | // Density of FrameEpoxy only from manufacturer's specifications | |
338 | // Frame composite epoxy , X0 in g/cm**2 (guestimation!) | |
339 | AliMaterial(36, "FrameEpoxy",12.24,6.0,1.85,-19.14,999); | |
340 | ||
341 | // --- Define the tracking medias (AliMediums) for GEANT --- | |
342 | GReal_t epsil = .001; // Tracking precision, | |
343 | GReal_t stemax = -1.; // Maximum displacement for multiple scat | |
344 | GReal_t tmaxfd = -20.; // Maximum angle due to field deflection | |
345 | GReal_t deemax = -.3; // Maximum fractional energy loss, DLS | |
346 | GReal_t stmin = -.8; | |
347 | GReal_t maxStepAlu = 0.001; // from AliMUON.cxx | |
348 | GReal_t maxDestepAlu = -1.; // from AliMUON.cxx | |
349 | GReal_t maxStepGas=0.01; // from AliMUON.cxx | |
350 | ||
351 | Int_t iSXFLD = gAlice->Field()->Integ(); | |
352 | Float_t sXMGMX = gAlice->Field()->Max(); | |
353 | ||
354 | AliMedium(1, "AIR_CH_US$", 15, 1, iSXFLD, sXMGMX, tmaxfd, | |
355 | stemax, deemax, epsil, stmin); | |
356 | AliMedium(4, "ALU_CH_US$", 9, 0, iSXFLD, sXMGMX, tmaxfd, | |
357 | maxStepAlu, maxDestepAlu, epsil, stmin); | |
358 | AliMedium(5, "ALU_CH_US$", 10, 0, iSXFLD, sXMGMX, tmaxfd, | |
359 | maxStepAlu,maxDestepAlu, epsil, stmin); | |
360 | AliMedium(6, "AR_CH_US ", 20, 1, iSXFLD, sXMGMX, | |
361 | tmaxfd, fMaxStepGas,fMaxDestepGas, epsil, stmin); | |
362 | ||
363 | // Ar-Isobuthane-Forane-SF6 gas | |
364 | AliMedium(7, "GAS_CH_TRIGGER ", 21, 1, iSXFLD, sXMGMX, | |
365 | tmaxfd, stemax, deemax, epsil, stmin); | |
366 | AliMedium(8, "BAKE_CH_TRIGGER ", 19, 0, iSXFLD, sXMGMX, | |
367 | tmaxfd, fMaxStepAlu, fMaxDestepAlu, epsil, stmin); | |
368 | ||
369 | AliMedium(9, "ARG_CO2$", 22, 1, iSXFLD, sXMGMX, tmaxfd, maxStepGas, | |
370 | maxDestepAlu, epsil, stmin); | |
371 | AliMedium(10, "COPPER_CH$", 30, 0, iSXFLD, sXMGMX, tmaxfd, | |
372 | maxStepAlu, maxDestepAlu, epsil, stmin); | |
373 | AliMedium(11, "PCB_COPPER ", 31, 0, iSXFLD, sXMGMX, tmaxfd, | |
374 | fMaxStepAlu, fMaxDestepAlu, epsil, stmin); | |
375 | AliMedium(12, "VETRONITE ", 32, 0, iSXFLD, sXMGMX, tmaxfd, | |
376 | fMaxStepAlu, fMaxDestepAlu, epsil, stmin); | |
377 | AliMedium(13, "CARBON ", 33, 0, iSXFLD, sXMGMX, tmaxfd, | |
378 | fMaxStepAlu, fMaxDestepAlu, epsil, stmin); | |
379 | AliMedium(14, "Rohacell ", 34, 0, iSXFLD, sXMGMX, tmaxfd, | |
380 | fMaxStepAlu, fMaxDestepAlu, epsil, stmin); | |
381 | AliMedium(15, "FR4_CH$", 31, 0,iSXFLD, sXMGMX, 10., .01,.1, .003, .003); | |
382 | AliMedium(16, "FOAM_CH$", 32, 0, | |
383 | iSXFLD, sXMGMX, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ; | |
384 | AliMedium(17, "Plastic$", 33, 0,iSXFLD, sXMGMX, 10., .01, 1., .003, .003); | |
385 | AliMedium(18, "Kapton$", 34, 0,iSXFLD, sXMGMX, 10., .01, 1., .003, .003); | |
386 | AliMedium(19, "SnPb$", 35, 0,iSXFLD, sXMGMX, 10., .01, 1., .003, .003); | |
387 | AliMedium(20, "FrameCH$", 36, 1,iSXFLD, sXMGMX, 10., .001, 0.001, .001, .001); | |
388 | AliMedium(21, "InoxBolts$", 37,1,iSXFLD, sXMGMX, 10., .01, 1., .003, .003); | |
389 | } | |
390 | ||
391 | void AliMUONv2::CreateFrame(Int_t chamber) | |
392 | { | |
393 | // Create the non-sensitive elements of the frame for the <chamber> | |
394 | ||
395 | ||
396 | // Matrices | |
397 | Int_t idrotm[1199]; | |
398 | // To Be Checked.... | |
399 | // Rotation matrices in the x-y plane | |
400 | // phi = -45 deg | |
401 | AliMatrix(idrotm[1101], 90., 315., 90., 45., 0., 0.); | |
402 | // phi = -90 deg | |
403 | AliMatrix(idrotm[1102], 90., 90., 90., 180., 0., 0.); | |
404 | // theta = +90 deg | |
405 | AliMatrix(idrotm[1103], 180., 0., 90., 90.,90., 0.); | |
406 | ||
407 | // phi = +45 deg | |
408 | AliMatrix(idrotm[1104], 90., 45., 90., 135., 0., 0.); | |
409 |