4c039060 |
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$ |
1cedd08a |
18 | Revision 1.6 1999/09/29 09:24:07 fca |
19 | Introduction of the Copyright and cvs Log |
20 | |
4c039060 |
21 | */ |
22 | |
fe4da5cc |
23 | /////////////////////////////////////////////////////////////////////////////// |
24 | // // |
25 | // CASTOR // |
26 | // This class contains the description of the CASTOR detector // |
27 | // // |
28 | //Begin_Html |
29 | /* |
1439f98e |
30 | <img src="picts/AliCASTORClass.gif"> |
fe4da5cc |
31 | </pre> |
32 | <br clear=left> |
33 | <font size=+2 color=red> |
34 | <p>The responsible person for this module is |
35 | <a href="mailto:aris.angelis@cern.ch">Aris Angelis</a>. |
36 | </font> |
37 | <pre> |
38 | */ |
39 | //End_Html |
40 | // // |
41 | // // |
42 | /////////////////////////////////////////////////////////////////////////////// |
43 | |
44 | |
45 | #include "AliCASTOR.h" |
46 | #include <TNode.h> |
47 | #include <TPGON.h> |
48 | #include "AliRun.h" |
49 | #include "AliMC.h" |
50 | #include "AliConst.h" |
51 | |
52 | ClassImp(AliCASTOR) |
53 | |
54 | //_____________________________________________________________________________ |
55 | AliCASTOR::AliCASTOR() |
56 | { |
57 | // |
58 | // Default constructor for CASTOR |
59 | // |
60 | fIshunt = 0; |
61 | } |
62 | |
63 | //_____________________________________________________________________________ |
64 | AliCASTOR::AliCASTOR(const char *name, const char *title) |
65 | : AliDetector(name,title) |
66 | { |
67 | // |
68 | // Standard constructor for CASTOR |
69 | // |
70 | |
71 | // |
72 | // Create a tree of castor hits |
73 | fHits = new TClonesArray("AliCASTORhit", 405); |
1cedd08a |
74 | gAlice->AddHitList(fHits); |
fe4da5cc |
75 | |
76 | fIshunt = 0; |
77 | |
78 | SetMarkerColor(7); |
79 | SetMarkerStyle(2); |
80 | SetMarkerSize(0.4); |
81 | } |
82 | |
83 | //_____________________________________________________________________________ |
84 | void AliCASTOR::AddHit(Int_t track, Int_t *vol, Float_t *hits) |
85 | { |
86 | // |
87 | // Add a CASTOR hit |
88 | // |
89 | TClonesArray &lhits = *fHits; |
90 | new(lhits[fNhits++]) AliCASTORhit(fIshunt,track,vol,hits); |
91 | } |
92 | |
93 | //_____________________________________________________________________________ |
94 | void AliCASTOR::BuildGeometry() |
95 | { |
96 | // |
97 | // Build CASTOR ROOT TNode geometry for event display |
98 | TNode *Node, *Top; |
99 | TPGON *pgon; |
100 | const int kColorCASTOR = 4; |
101 | // |
102 | Top=gAlice->GetGeometry()->GetNode("alice"); |
103 | |
104 | // CASTOR |
105 | pgon = new TPGON("S_CASTOR","S_CASTOR","void",22.5,360,8,2); |
106 | pgon->DefineSection(0,-69.05885,2.598121,12.86874); |
107 | pgon->DefineSection(1,69.05885,2.787778,13.88912); |
108 | new TRotMatrix("rotcas","rotcas",90,180,90,90,180,0); |
109 | |
110 | Top->cd(); |
111 | Node = new TNode("CASTOR","CASTOR","S_CASTOR",0,0,-1809.59,"rotcas"); |
112 | Node->SetLineColor(kColorCASTOR); |
113 | fNodes->Add(Node); |
114 | } |
115 | |
116 | //_____________________________________________________________________________ |
117 | Int_t AliCASTOR::DistancetoPrimitive(Int_t , Int_t ) |
118 | { |
119 | return 9999; |
120 | } |
121 | |
122 | |
123 | ClassImp(AliCASTORv1) |
124 | |
125 | //_____________________________________________________________________________ |
126 | AliCASTORv1::AliCASTORv1() : AliCASTOR() |
127 | { |
128 | // |
129 | // Default constructor for CASTOR version 1 |
130 | // |
131 | fOdFiber = 0; |
132 | fOdCladding = 0; |
133 | fOdAbsorber = 0; |
134 | fOctants = 0; |
135 | fLayersEM = 0; |
136 | fLayersHad = 0; |
137 | fPhiOct = 0; |
138 | fRadCore = 0; |
139 | fRadFactor = 0; |
140 | } |
141 | |
142 | //_____________________________________________________________________________ |
143 | AliCASTORv1::AliCASTORv1(const char *name, const char *title) |
144 | : AliCASTOR(name,title) |
145 | { |
146 | // |
147 | // Standard constructor for CASTOR version 1 |
148 | // |
149 | fOdFiber = 0; |
150 | fOdCladding = 0; |
151 | fOdAbsorber = 0; |
152 | fOctants = 0; |
153 | fLayersEM = 0; |
154 | fLayersHad = 0; |
155 | fPhiOct = 0; |
156 | fRadCore = 0; |
157 | fRadFactor = 0; |
158 | } |
159 | |
160 | //_____________________________________________________________________________ |
161 | void AliCASTORv1::CreateGeometry() |
162 | { |
163 | // |
164 | // Creation of the geometry of the CASTOR detector |
165 | // |
166 | //Begin_Html |
167 | /* |
1439f98e |
168 | <img src="picts/AliCASTORTree.gif"> |
fe4da5cc |
169 | */ |
170 | //End_Html |
171 | //Begin_Html |
172 | /* |
1439f98e |
173 | <img src="picts/AliCASTOR.gif"> |
fe4da5cc |
174 | */ |
175 | //End_Html |
176 | // |
177 | // 28 March 1997 23 February 1998 Aris L. S. Angelis * |
178 | // >--------------------------------------------------------------------<* |
179 | |
fe4da5cc |
180 | |
181 | Float_t dhad[11], dcal[3], beta, doct[11], alfa1, alfa2, fact1, fact2,fact3; |
182 | Float_t dclha[3], dcoha[3], dclem[3], dbxha[3], dcoem[3], dcalt[5], dcalv[5], dbxem[3]; |
183 | Float_t rzhig; |
184 | Float_t s1, s2, s3, rxyin, rzlow, rxyut, facemd, facein, dlayha, dlayem, doctem, doctha, faceut, zendha, phicov; |
185 | Float_t doctnt; |
186 | Float_t zemhad; |
187 | Int_t idrotm[100]; |
188 | Float_t thecen, xp, xxmdhi, zp, yp, rinbeg; |
189 | Float_t rutbeg, xxinhi, rinend, rutend, xxmdlo; |
190 | Float_t dztotl, xxinlo, xxuthi; |
191 | Float_t xxutlo, dem[11], ang; |
192 | Int_t nfx; |
193 | Float_t rxy; |
194 | // Angle (deg) of inclination of quartz fibres w.r.t. to beam (Cerenkov angle). |
195 | const Float_t kBetaD = 45; |
196 | //Rapidity range covered by the calorimeter. |
197 | const Float_t kEtaLow = 5.6; |
198 | const Float_t kEtaHigh = 7.2; |
199 | // Z position (cm) of beginning of calorimeter EM section (the tip. |
200 | const Float_t kZbegem = 1740; |
201 | // Number of azimuthal calorimeter sectors: octants. |
202 | fOctants = 8; |
203 | // Number of e-m and hadronic layers (each layer comprises a slice |
204 | // of absorber material followed by a slice of active quartz fibres). |
205 | // DATA NLAYEM,NLAYHA /9,69/ ! 0.64 + 9.73 lambda_i |
206 | fLayersEM = 8; |
207 | fLayersHad = 72; // 0.57 + 10.15 lambda_i |
208 | // Number of planes of quartz fibres within each active slice for |
209 | // e-m and hadronic sections. |
210 | const Int_t kFibersEM = 2; |
211 | const Int_t kFibersHad = 4; |
212 | // Thickness (cm) of absorber material for e-m and hadronic layers. |
213 | const Float_t kAbsorberEM = 0.5; |
214 | const Float_t kAbsorberHad = 1; |
215 | // Diameter (cm) of fibre core and of fibre with cladding. |
216 | const Float_t kDiamCore = 0.043; |
217 | const Float_t kDiamCladding = 0.045; |
218 | |
219 | Int_t i; |
220 | static Int_t debugFlag = 0; |
221 | |
ad51aeb0 |
222 | Int_t *idtmed = fIdtmed->GetArray()-1499; |
fe4da5cc |
223 | |
224 | |
225 | // >--------------------------------------------------------------------<* |
226 | // **> Note: ALICE frame XYZ, proper ref. frame of a trapezoid X'Y'Z'. |
227 | // --- Common which contains debug flags for the various detectors --- |
228 | // --- Also control flags (JPAWF,JOUTF) for each detector added --- |
229 | |
230 | // **> Common containing some of the Castor FCAL geometry data. |
231 | |
232 | //**> Angle (deg) of inclination of quartz fibres w.r.t. to beam |
233 | //**> (Cerenkovangle). |
234 | // **> Rapidity range covered by the calorimeter. |
235 | // **> Z position (cm) of beginning of calorimeter EM section (the tip. |
236 | // **> Number of planes of quartz fibres within each active slice for |
237 | // **> e-m and hadronic sections. |
238 | // **> Thickness (cm) of absorber material for e-m and hadronic layers. |
239 | // **> Diameter (cm) of fibre core and of fibre with cladding. |
240 | // **> E-M and hadronic sections of an octant and complete octant module |
241 | // **> (general trapezoids). |
242 | // **> Imaginary box to hold the complete calorimeter. |
243 | // **> Imaginary rectangular boxes containing the trapezoids of the |
244 | // **> EM and Hadronic sections of an Octant. |
245 | // **> Cylindrical volumes for clad fibres and fibre cores in the |
246 | // **> EM and Had sections. |
247 | //**> Narrow stainless steel conical beam tube traversing the calorimeter. |
248 | // **> Print calorimeter parameters. |
249 | // **> Number of azimuthal calorimeter sectors: octants. |
250 | // DATA NOCTS / 16 / |
251 | // **> Number of e-m and hadronic layers (each layer comprises a slice |
252 | // **> of absorber material followed by a slice of active quartz fibres). |
253 | // DATA NLAYEM,NLAYHA /9,69/ ! 0.64 + 9.73 lambda_i |
254 | // 0.57 + 10.15 lambda_i |
255 | if (debugFlag > 0) { |
256 | printf("----------------------------------\n"); |
257 | printf(" EtaLo = %f, EtaHigh = %f, ZbegEM =%f\n",kEtaLow, kEtaHigh,kZbegem); |
258 | printf(" Nocts =%d, NlayEM=%d, NlayHad = %d\n",fOctants,fLayersEM,fLayersHad); |
259 | printf("----------------------------------\n"); |
260 | } |
261 | // **> Radius of sensitive fibre core. |
262 | fRadCore = kDiamCore/2; |
263 | // **> Radius normalised to radius of 0.5 mm used in the calculation of |
264 | // **> the Cherenkov tables. |
265 | fRadFactor = fRadCore / .05; |
266 | // **> Total number of sensitive QF plane layers. |
267 | //nqemly = fLayersEM*kFibersEM; |
268 | //nqhaly = fLayersHad*kFibersHad; |
269 | beta = kBetaD*kDegrad; // **> Conversions to radians. |
270 | // **> Thickness of e-m and hadronic layers: |
271 | // **> Thickness = Thickness_of_Absorber + Thickness_of_N_Fibre_Planes |
272 | // **> For N pair: Thickness_of_N_Fibre_Planes = N/2 * [2+TMath::Sqrt(3)]*R_fibre |
273 | // **> taking into account staggering of fibres in adjacent planes. |
274 | //**> For simplicity staggering not yet introduced, use TMath::Sqrt(4) temporarily. |
275 | dlayem = kAbsorberEM +(0.5*kFibersEM )*(2+TMath::Sqrt(4.))*kDiamCladding/2; |
276 | dlayha = kAbsorberHad+(0.5*kFibersHad)*(2+TMath::Sqrt(4.))*kDiamCladding/2; |
277 | if (debugFlag > 0) { |
278 | printf(" Layer Thickness. EM = %f, Had = %f\n",dlayem,dlayha); |
279 | } |
280 | // **> Thickness of complete octant, along the line perpendicular |
281 | // **> to the layers. |
282 | // **> Thickness = NlayerEM*DlayerEM + NlayerHad*DlayerHad (DeltaZ'). |
283 | doctem = fLayersEM*dlayem; |
284 | doctha = fLayersHad*dlayha; |
285 | doctnt = doctem + doctha; |
286 | if (debugFlag > 0) { |
287 | printf(" Octant Thickness. EM = %f, Had = %f, Total = %f\n",doctem,doctha,doctnt); |
288 | } |
289 | // **> Construct one octant module: general trapezoid, rotated such |
290 | // **> that the fibre planes are perpenicular to the Z axis of the |
291 | // **> proper reference frame (X'Y'Z' frame). |
292 | // **> Calculation of the length of the faces at +/- DeltaZ'/2 of an |
293 | // **> octant, projected onto the Y'Z' plane (see notes dated 4/4/97). |
294 | alfa1 = TMath::ATan(exp(-kEtaLow)) * 2.; |
295 | alfa2 = TMath::ATan(exp(-kEtaHigh)) * 2.; |
296 | fact1 = (TMath::Tan(alfa1) - TMath::Tan(alfa2)) * TMath::Cos(alfa1) / TMath::Sin(beta - alfa1); |
297 | if (debugFlag > 0) { |
298 | printf(" Beta =%f,Fact1 =%f\n",kBetaD, fact1); |
299 | printf(" EtaLow=%f, EtaHigh=%f, Alfa1=%f, Alfa2=%f\n",kEtaLow,kEtaHigh,alfa1*kRaddeg,alfa2*kRaddeg); |
300 | } |
301 | // **> Face at entrance to E-M section (-DeltaZ'/2). |
302 | facein = fact1 * kZbegem; |
303 | // **> Face at interface from E-M to Hadronic section. |
304 | facemd = (doctem / TMath::Sin(beta) + kZbegem) * fact1; |
305 | // **> Face at exit of Hadronic section (+DeltaZ'/2). |
306 | faceut = (doctnt / TMath::Sin(beta) + kZbegem) * fact1; |
307 | if (debugFlag > 0) { |
308 | printf(" Octant Face Length. Front: %f, Back: %f, EM-Had: %f\n",facein,faceut,facemd); |
309 | } |
310 | // **> Angular coverage of octant (360./8) projected onto plane |
311 | // **> tilted at angle Beta (see notes dated 28/3/97). |
312 | //**> PhiTilted = 2*atan[TMath::Tan(phi/2)TMath::Cos(beta)] = 32.65 deg for beta=45,phi=22.5. |
313 | fPhiOct = k2PI / fOctants; |
314 | phicov = TMath::ATan(TMath::Tan(fPhiOct / 2.) * TMath::Cos(beta)) * 2.; |
315 | if (debugFlag > 0) { |
316 | printf(" FPhiOct =%f, PhiCov =%f\n",fPhiOct * kRaddeg,phicov * kRaddeg); |
317 | } |
318 | // **> Dimensions along X' of front and back faces of calorimeter |
319 | // **> (see notes dated 8/4/97). |
320 | fact2 = TMath::Tan(alfa2) / TMath::Sin(beta); |
321 | fact3 = TMath::Cos(alfa2) / TMath::Sin(beta - alfa2); |
322 | zendha = doctnt * fact3 + kZbegem; |
323 | zemhad = doctem * fact3 + kZbegem; |
324 | if (debugFlag > 0) { |
325 | printf(" ZbegEM =%f, ZendHA =%f, ZEMHad =%f\n",kZbegem,zendha, zemhad); |
326 | printf(" Fact2 =%f, Fact3 =%f\n",fact2,fact3); |
327 | } |
328 | // **> DeltaX' at -DeltaY'/2, -DeltaZ'/2. |
329 | xxinlo = fact2 * 2*kZbegem * TMath::Tan(phicov / 2.); |
330 | // **> DeltaX' at +DeltaY'/2, -DeltaZ'/2. |
331 | xxinhi = (fact2 + fact1) * 2*kZbegem * TMath::Tan(phicov / 2.); |
332 | // **> DeltaX' at -DeltaY'/2, +DeltaZ'/2. |
333 | xxutlo = zendha * 2. * fact2 * TMath::Tan(phicov / 2.); |
334 | // **> DeltaX' at +DeltaY'/2, +DeltaZ'/2. |
335 | xxuthi = zendha * 2. * (fact2 + fact1) * TMath::Tan(phicov / 2.); |
336 | // **> DeltaX' at -DeltaY'/2, at EM/Had interface. |
337 | xxmdlo = zemhad * 2. * fact2 * TMath::Tan(phicov / 2.); |
338 | // **> DeltaX' at +DeltaY'/2, at EM/Had interface. |
339 | xxmdhi = zemhad * 2. * (fact2 + fact1) * TMath::Tan(phicov / 2.); |
340 | if (debugFlag > 0) { |
341 | printf(" XXinLo=%f, XXinHi=%f, XXutLo=%f, XXutHi=%f, XXmdLo=%f, XXmdHi=%f\n", |
342 | xxinlo,xxinhi,xxutlo,xxuthi,xxmdlo,xxmdhi); |
343 | } |
344 | //**> Calculate the polar angle in the X'Y'Z' frame of the line joining the |
345 | //**> centres of the front and back faces of the octant (see notes dated 9/4/97). |
346 | s1 = (1. - fact2 * TMath::Cos(beta)) * kZbegem; |
347 | s2 = (fact2 + fact1 / 2.) * kZbegem; |
348 | s3 = TMath::Sqrt(s1 * s1 + s2 * s2 - s1 * s2 * TMath::Cos(kPI - beta)); |
349 | ang = TMath::ASin(sin(kPI - beta) * s2 / s3); |
350 | thecen = kPI/2 - beta + ang; |
351 | if (debugFlag > 0) { |
352 | printf(" S1=%f, S2=%f, S3=%f, Ang=%f, TheCen=%f\n",s1,s2,s3,ang*kRaddeg,thecen*kRaddeg); |
353 | } |
354 | // **> Construct the octant volume. |
355 | doct[0] = 180*0.125; |
356 | doct[1] = 360.; |
357 | doct[2] = 8.; |
358 | doct[3] = 2.; |
359 | doct[4] = -(zendha - kZbegem + faceut * TMath::Cos(beta)) / 2.; |
360 | doct[5] = TMath::Tan(alfa2) * kZbegem; |
361 | doct[6] = TMath::Tan(alfa1) * kZbegem; |
362 | doct[7] = (zendha - kZbegem + faceut * TMath::Cos(beta)) / 2.; |
363 | doct[8] = zendha * TMath::Tan(alfa2); |
364 | doct[9] = (faceut + zendha * fact2) * TMath::Sin(beta); |
365 | |
366 | if (debugFlag > 0) { |
367 | printf("\n Doct(1-10) = "); |
368 | for (i = 1; i <= 10; ++i) { |
369 | printf("%f, ",doct[i - 1]); |
370 | } |
371 | printf(" \n"); |
372 | } |
cfce8870 |
373 | gMC->Gsvolu("OCTA", "PGON", idtmed[fOdAbsorber - 1], doct, 10); |
374 | gMC->Gsdvn("OCT ", "OCTA", 8, 2); |
fe4da5cc |
375 | // absorber material. |
376 | // **> Construct the E-M section volume. |
377 | dem[0] = doctem / 2.; // DeltaZ'/2 |
378 | dem[1] = thecen *kRaddeg; // Theta[(Centre(-DeltaZ')--Centre(+DeltaZ' |
379 | dem[2] = 90.; // Phi[(Centre(-DeltaZ')--Centre(+DeltaZ')] |
380 | dem[3] = facein / 2.; // DeltaY'/2 at -DeltaZ'/2. |
381 | dem[4] = xxinlo / 2.; // DeltaX'/2 at -DeltaY'/2 at -DeltaZ'/2. |
382 | dem[5] = xxinhi / 2.; // DeltaX'/2 at +DeltaY'/2 at -DeltaZ'/2. |
383 | dem[6] = 0.; // Angle w.r.t. Y axis of line joining cent |
384 | // at +/- DeltaY at -DeltaZ. // Angle w.r.t. Y axis of line joining cent |
385 | dem[7] = facemd / 2.; // DeltaY'/2 at +DeltaZ'. |
386 | dem[8] = xxmdlo / 2.; // DeltaX'/2 at -DeltaY'/2 at +DeltaZ'/2. |
387 | dem[9] = xxmdhi / 2.; // DeltaX'/2 at +DeltaY'/2 at +DeltaZ'/2. |
388 | dem[10] = 0.; // Angle w.r.t. Y axis of line joining cent |
389 | // at +/- DeltaY at +DeltaZ. |
390 | |
391 | if (debugFlag > 0) { |
392 | printf("\n De-m(1-11) ="); |
393 | for (i = 1; i <= 11; ++i) { |
394 | printf("%f, ",dem[i - 1]); |
395 | } |
396 | printf(" \n"); |
397 | } |
cfce8870 |
398 | gMC->Gsvolu("EM ", "TRAP", idtmed[fOdAbsorber - 1], dem, 11); |
fe4da5cc |
399 | // absorber material. |
400 | // **> Construct the Hadronic section volume. |
401 | // Fill with s |
402 | dhad[0] = doctha / 2.; // DeltaZ'/2 |
403 | dhad[1] = thecen *kRaddeg; // Theta[(Centre(-DeltaZ')--Centre(+DeltaZ' |
404 | dhad[2] = 90.; // Phi[(Centre(-DeltaZ')--Centre(+DeltaZ')] |
405 | dhad[3] = facemd / 2.; // DeltaY'/2 at -DeltaZ'/2. |
406 | dhad[4] = xxmdlo / 2.; // DeltaX'/2 at -DeltaY'/2 at -DeltaZ'/2. |
407 | dhad[5] = xxmdhi / 2.; // DeltaX'/2 at +DeltaY'/2 at -DeltaZ'/2. |
408 | dhad[6] = 0.; // Angle w.r.t. Y axis of line joining cent |
409 | // at +/- DeltaY at -DeltaZ. |
410 | dhad[7] = faceut / 2.; // DeltaY'/2 at +DeltaZ'. |
411 | dhad[8] = xxutlo / 2.; // DeltaX'/2 at -DeltaY'/2 at +DeltaZ'/2. |
412 | dhad[9] = xxuthi / 2.; // DeltaX'/2 at +DeltaY'/2 at +DeltaZ'/2. |
413 | dhad[10] = 0.; // Angle w.r.t. Y axis of line joining cent |
414 | // at +/- DeltaY at +DeltaZ. |
415 | |
416 | if (debugFlag > 0) { |
417 | printf("\n Dhad(1-11) = "); |
418 | for (i = 1; i <= 11; ++i) { |
419 | printf("%f, ",dhad[i - 1]); |
420 | } |
421 | printf(" \n"); |
422 | } |
cfce8870 |
423 | gMC->Gsvolu("HAD ", "TRAP", idtmed[fOdAbsorber - 1], dhad, 11); // absorber material. |
fe4da5cc |
424 | // **> Rotation matrix to rotate fibres verticaly to fit into holes. |
425 | // Fill with |
426 | AliMatrix(idrotm[0], 90., 0., 180., 0., 90., 90.); |
427 | // **> Internal structure of the EM section starts here. <--- |
428 | // **> Construct one sampling module |
cfce8870 |
429 | gMC->Gsdvn("SLEM", "EM ", fLayersEM, 3); |
430 | gMC->Gsatt("SLEM", "SEEN", 0); |
fe4da5cc |
431 | // **> Construct the (imaginary) rectangular box embedding the fibres |
432 | // **> Fill with air, make it invisible on the drawings. |
433 | dbxem[0] = xxmdhi / 2.; |
434 | dbxem[2] = kFibersEM*kDiamCladding/2; |
435 | dbxem[1] = facemd / 2. + dbxem[2] * TMath::Tan(thecen); |
436 | if (debugFlag > 0) { |
437 | printf(" DbxEM(1-3) ="); |
438 | for (i = 1; i <= 3; ++i) { |
439 | printf("%f, ",dbxem[i - 1]); |
440 | } |
441 | printf(" \n"); |
442 | } |
cfce8870 |
443 | gMC->Gsvolu("BXEM", "BOX ", idtmed[1501], dbxem, 3); |
444 | gMC->Gsatt("BXEM", "SEEN", 0); |
fe4da5cc |
445 | // **> Divide along Z to obtain one layer |
cfce8870 |
446 | gMC->Gsdvn("RWEM", "BXEM", 2, 3); |
447 | gMC->Gsatt("RWEM", "SEEN", 0); |
fe4da5cc |
448 | // **> Divide along X' to accomodate the maximum number of individual |
449 | //**> fibres packed along X', make the divisions invisible on the drawings. |
450 | nfx = Int_t(xxmdhi / .045); |
451 | if (debugFlag > 0) { |
452 | printf(" NfxEM = %d\n",nfx); |
453 | } |
cfce8870 |
454 | gMC->Gsdvn("FXEM", "RWEM", nfx, 1); |
455 | gMC->Gsatt("FXEM", "SEEN", 0); |
fe4da5cc |
456 | // **> Construct the fiber cladding |
457 | dclem[0] = 0.; |
458 | dclem[1] = kDiamCladding/2; |
459 | dclem[2] = dbxem[1]; |
460 | if (debugFlag > 0) { |
461 | printf(" DclEM(1-3) = \n"); |
462 | for (i = 1; i <= 3; ++i) { |
463 | printf("%f, ",dclem[i - 1]); |
464 | } |
465 | printf(" \n"); |
466 | } |
cfce8870 |
467 | gMC->Gsvolu("CLEM", "TUBE", idtmed[fOdCladding - 1], dclem,3); |
468 | gMC->Gsatt("CLEM", "SEEN", 0); |
fe4da5cc |
469 | //**> Construct the cylindrical volume for a fibre core in the EM section. |
470 | //**> Fill with selected fibre material, make it invisible on the drawings. |
471 | dcoem[0] = 0.; |
472 | dcoem[1] = kDiamCore/2; |
473 | dcoem[2] = dbxem[1]; |
474 | if (debugFlag > 0) { |
475 | printf(" DcoEM(1-3) = "); |
476 | for (i = 1; i <= 3; ++i) { |
477 | printf("%f, ",dcoem[i - 1]); |
478 | } |
479 | printf(" \n"); |
480 | } |
cfce8870 |
481 | gMC->Gsvolu("COEM", "TUBE", idtmed[fOdFiber - 1], dcoem,3); |
482 | gMC->Gsatt("COEM", "SEEN", 0); |
fe4da5cc |
483 | // **> Position the volumes |
484 | // **> Put the air section inside one sampling module |
485 | // **> Use MANY to obtain clipping of protruding edges. |
486 | xp = 0.; |
487 | zp = dlayem / 2. - 0.5*kFibersEM*kDiamCladding; |
488 | yp = zp * TMath::Tan(thecen); |
cfce8870 |
489 | gMC->Gspos("BXEM", 1, "SLEM", xp, yp, zp, 0, "MANY"); |
fe4da5cc |
490 | // **> Place the core fibre in the clad |
491 | xp = 0.; |
492 | yp = 0.; |
493 | zp = 0.; |
cfce8870 |
494 | gMC->Gspos("COEM", 1, "CLEM", xp, yp, zp, 0, "MANY"); |
fe4da5cc |
495 | // **> Put the fiber in its air box |
cfce8870 |
496 | gMC->Gspos("CLEM", 1, "FXEM", xp, yp, zp, idrotm[0], "MANY"); |
fe4da5cc |
497 | // **> Internal structure of the Hadronic section starts here. <--- |
cfce8870 |
498 | gMC->Gsdvn("SLHA", "HAD ", fLayersHad, 3); |
499 | gMC->Gsatt("SLHA", "SEEN", 0); |
fe4da5cc |
500 | // **> Construct the air section where the fibers are |
501 | dhad[0] = 0.5*kFibersEM*kDiamCladding; |
cfce8870 |
502 | gMC->Gsvolu("AIHA", "TRAP", idtmed[1501], dhad, 11); |
fe4da5cc |
503 | // **> Divide along z in the appropriate number of layers |
cfce8870 |
504 | gMC->Gsdvn("SAHA", "AIHA", 4, 3); |
fe4da5cc |
505 | //**> Construct the (imaginary) rectangular box embedding one lauer of fibres |
506 | // **> Fill with air, make it invisible on the drawings. |
507 | dbxha[0] = xxuthi / 2.; |
508 | dbxha[2] = 0.5*kFibersHad*kDiamCladding; |
509 | dbxha[1] = faceut / 2. + dbxha[2] * TMath::Tan(thecen); |
510 | if (debugFlag > 0) { |
511 | printf(" DbxHa(1-3) = "); |
512 | for (i = 1; i <= 3; ++i) { |
513 | printf("%f, ",dbxem[i - 1]); |
514 | } |
515 | printf(" \n"); |
516 | } |
cfce8870 |
517 | gMC->Gsvolu("BXHA", "BOX ", idtmed[1501], dbxha, 3); |
518 | gMC->Gsatt("BXHA", "SEEN", 0); |
fe4da5cc |
519 | // **> Divide along Z to obtain one layer |
cfce8870 |
520 | gMC->Gsdvn("RWHA", "BXHA", 4, 3); |
521 | gMC->Gsatt("RWHA", "SEEN", 0); |
fe4da5cc |
522 | // **> Divide along X' to accomodate the maximum number of individual |
523 | //**> fibres packed along X', make the divisions invisible on the drawings. |
524 | nfx = Int_t(xxuthi / .045); |
525 | if (debugFlag > 0) { |
526 | printf(" NfxHad = %d\n",nfx); |
527 | } |
cfce8870 |
528 | gMC->Gsdvn("FXHA", "RWHA", nfx, 1); |
529 | gMC->Gsatt("FXHA", "SEEN", 0); |
fe4da5cc |
530 | // **> Construct one fiber cladding |
531 | dclha[0] = 0.; |
532 | dclha[1] = 0.5*kDiamCladding; |
533 | dclha[2] = dbxha[1]; |
534 | if (debugFlag > 0) { |
535 | printf(" DclHa(1-3) = "); |
536 | for (i = 1; i <= 3; ++i) { |
537 | printf("%f, ",dclha[i - 1]); |
538 | } |
539 | printf(" \n"); |
540 | } |
cfce8870 |
541 | gMC->Gsvolu("CLHA", "TUBE", idtmed[fOdCladding - 1], dclha,3); |
542 | gMC->Gsatt("CLHA", "SEEN", 0); |
fe4da5cc |
543 | //**> Construct the cylindrical volume for a fibre core in the Had section. |
544 | //**> Fill with selected fibre material, make it invisible on the drawings. |
545 | dcoha[0] = 0.; |
546 | dcoha[1] = 0.5*kDiamCore; |
547 | dcoha[2] = dbxha[1]; |
548 | if (debugFlag > 0) { |
549 | printf(" DcoHa(1-3) = "); |
550 | for (i = 1; i <= 3; ++i) { |
551 | printf("%f, ",dcoha[i - 1]); |
552 | } |
553 | printf(" \n"); |
554 | } |
cfce8870 |
555 | gMC->Gsvolu("COHA", "TUBE", idtmed[fOdFiber - 1], dcoha,3); |
556 | gMC->Gsatt("COHA", "SEEN", 0); |
fe4da5cc |
557 | // **> Position the volumes |
558 | // **> Put the air section inside one sampling module |
559 | // **> Use MANY to obtain clipping of protruding edges. |
560 | xp = 0.; |
561 | zp = dlayha / 2. - 0.5*kFibersHad*kDiamCladding; |
562 | yp = zp * TMath::Tan(thecen); |
cfce8870 |
563 | gMC->Gspos("BXHA", 1, "SLHA", xp, yp, zp, 0, "MANY"); |
fe4da5cc |
564 | // **> Place the core fibre in the clad |
565 | xp = 0.; |
566 | yp = 0.; |
567 | zp = 0.; |
cfce8870 |
568 | gMC->Gspos("COHA", 1, "CLHA", xp, yp, zp, 0, "MANY"); |
fe4da5cc |
569 | // **> Place the fibre in its air box |
cfce8870 |
570 | gMC->Gspos("CLHA", 1, "FXHA", xp, yp, zp, idrotm[0], "MANY"); |
fe4da5cc |
571 | // **> Rotation matrices for consecutive calorimeter octants |
572 | // **> filling the imaginary box. |
573 | AliMatrix(idrotm[1], 90., -90., 45., 0., 45., 180.); |
574 | // **> Place the EM and Hadronic sections inside the Octant. |
575 | rzlow = (doct[5] + doct[6]) * .5; |
576 | rzhig = (doct[8] + doct[9]) * .5; |
577 | zp = doct[7] - (faceut * TMath::Cos(beta) + doctha * fact3) * .5; |
578 | yp = 0.; |
579 | xp = rzlow + (rzhig - rzlow) * .5 * (zp - doct[4]) / doct[7]; |
cfce8870 |
580 | gMC->Gspos("HAD ", 1, "OCT ", xp, yp, zp, idrotm[1], "ONLY"); |
fe4da5cc |
581 | yp = 0.; |
582 | zp = doct[7] - faceut * TMath::Cos(beta) * .5 - doctha * fact3 - doctem * fact3 * .5; |
583 | xp = rzlow + (rzhig - rzlow) * .5 * (zp - doct[4]) / doct[7]; |
cfce8870 |
584 | gMC->Gspos("EM ", 1, "OCT ", xp, yp, zp, idrotm[1], "ONLY"); |
fe4da5cc |
585 | // **> An imaginary box to hold the complete calorimeter. |
586 | dcal[0] = (faceut + zendha * fact2) * TMath::Sin(beta); |
587 | dcal[1] = dcal[0]; |
588 | dcal[2] = (zendha - kZbegem + faceut * TMath::Cos(beta)) / 2.; |
589 | if (debugFlag > 0) { |
590 | printf(" Dcal(1-3) = "); |
591 | for (i = 1; i <= 3; ++i) { |
592 | printf("%f, ",dcal[i - 1]); |
593 | } |
594 | printf(" \n"); |
595 | } |
cfce8870 |
596 | gMC->Gsvolu("CAL ", "BOX ", idtmed[1501], dcal, 3); |
fe4da5cc |
597 | // Fill with air |
598 | rinbeg = TMath::Tan(alfa2) * kZbegem; |
599 | rutbeg = TMath::Tan(alfa1) * kZbegem; |
600 | dztotl = dcal[2] * 2.; |
601 | rinend = (dztotl + kZbegem) * TMath::Tan(alfa2); |
602 | rutend = (dztotl + kZbegem) * TMath::Tan(alfa1); |
603 | if (debugFlag > 0) { |
604 | printf(" RinBeg=%f, RoutBeg=%f\n",rinbeg,rutbeg); |
605 | printf(" RinEnd=%f, RoutEnd=%f\n",rinend,rutend); |
606 | printf(" DeltaZtotal = %f\n",dztotl); |
607 | } |
608 | // **> Build the calorimeter inside the imaginary box. |
609 | rxyin = (fact2 + fact1 / 2.) * kZbegem; // Radius to centre of octant in X'Y' |
610 | // plane at calorimeter entrance. |
611 | rxyut = zendha * (fact2 + fact1 / 2.); // Radius to centre of octant in X'Y' |
612 | // plane at calorimeter exit. |
613 | rxy = (rxyin + rxyut) / 2.; // Radius to geometrical centre of octant in |
614 | rxy *= TMath::Sin(beta); // projected to the XY plane. |
615 | if (debugFlag > 0) { |
616 | printf(" \n"); |
617 | } |
cfce8870 |
618 | gMC->Gspos("OCTA", 1, "CAL ", 0., 0., 0., 0, "ONLY"); |
fe4da5cc |
619 | //**> Construct the narrow stainless steel conical beam tube traversing the |
620 | // **> calorimeter and its vacuum filling: WallThickness = 0.1 cm, |
621 | // **> Router = touching the inner side of the calorimeter, |
622 | // **> DeltaZ = all through the calorimeter box. |
623 | dcalt[0] = dcal[2]; |
624 | dcalt[2] = TMath::Tan(alfa2) * kZbegem; |
625 | dcalt[1] = dcalt[2] - .1 / TMath::Cos(alfa2); |
626 | dcalt[4] = (dcalt[0] * 2. + kZbegem) * TMath::Tan(alfa2); |
627 | dcalt[3] = dcalt[4] - .1 / TMath::Cos(alfa2); |
628 | dcalv[0] = dcalt[0]; |
629 | dcalv[2] = dcalt[1]; |
630 | dcalv[1] = 0.; |
631 | dcalv[4] = dcalt[3]; |
632 | dcalv[3] = 0.; |
cfce8870 |
633 | gMC->Gsvolu("CALT", "CONE", idtmed[1506], dcalt, 5); |
fe4da5cc |
634 | // Fe (steel a |
cfce8870 |
635 | gMC->Gsvolu("CALV", "CONE", idtmed[1500], dcalv, 5); |
fe4da5cc |
636 | // Vacuum. |
cfce8870 |
637 | gMC->Gsatt("CALV", "SEEN", 0); |
fe4da5cc |
638 | // **> Position at centre of calorimeter box. |
639 | zp = 0.; |
cfce8870 |
640 | gMC->Gspos("CALT", 1, "CAL ", 0., 0., zp, 0, "ONLY"); |
641 | gMC->Gspos("CALV", 1, "CAL ", 0., 0., zp, 0, "ONLY"); |
fe4da5cc |
642 | if (debugFlag > 0) { |
643 | printf(" Dcalt,Zp,-/+ = "); |
644 | for (i = 1; i <= 5; ++i) { |
645 | printf("%f, ",dcalt[i - 1]); |
646 | } |
647 | printf("%f, %f, %f\n",zp, zp - dcalt[0], zp + dcalt[0]); |
648 | printf(" Dcalt,Zp,-/+ = "); |
649 | for (i = 1; i <= 5; ++i) { |
650 | printf("%f, ",dcalt[i - 1]); |
651 | } |
652 | printf("%f, %f, %f\n",zp, zp - dcalt[0], zp + dcalt[0]); |
653 | } |
654 | // **> Rotate the imaginary box carrying the calorimeter and place it |
655 | // **> in the ALICE volume on the -Z side. |
656 | xp = 0.; |
657 | yp = 0.; |
658 | zp = dcal[2] + kZbegem; |
659 | AliMatrix(idrotm[2], 90., 180., 90., 90., 180., 0.); |
660 | // -X theta and phi w.r.t. to box XYZ. |
661 | // Y theta and phi w.r.t. to box XYZ. |
662 | // -Z theta and phi w.r.t. to box XYZ. |
cfce8870 |
663 | gMC->Gspos("CAL ", 1, "ALIC", xp, yp, -zp, idrotm[2], "ONLY"); |
fe4da5cc |
664 | if (debugFlag > 0) { |
665 | printf(" Dcal,Zp,-/+ = "); |
666 | for (i = 1; i <= 3; ++i) { |
667 | printf("%f, ",dcal[i - 1]); |
668 | } |
669 | printf("%f, %f, %f\n",zp, zp - dcal[2], zp + dcal[2]); |
670 | } |
671 | } |
672 | |
673 | //_____________________________________________________________________________ |
76aa0aaa |
674 | void AliCASTORv1::DrawModule() |
fe4da5cc |
675 | { |
676 | // |
677 | // Draw a shaded view of CASTOR version 1 |
678 | // |
679 | |
fe4da5cc |
680 | |
cfce8870 |
681 | gMC->Gsatt("*", "seen", -1); |
682 | gMC->Gsatt("alic", "seen", 0); |
fe4da5cc |
683 | // |
684 | // Set visibility of elements |
cfce8870 |
685 | gMC->Gsatt("OCTA","seen",0); |
686 | gMC->Gsatt("EM ","seen",0); |
687 | gMC->Gsatt("HAD ","seen",0); |
688 | gMC->Gsatt("CAL ","seen",0); |
689 | gMC->Gsatt("CALT","seen",1); |
690 | gMC->Gsatt("OCT ","seen",0); |
691 | gMC->Gsatt("SLEM","seen",1); |
692 | gMC->Gsatt("SLHA","seen",1); |
693 | gMC->Gsatt("SAHA","seen",1); |
fe4da5cc |
694 | // |
cfce8870 |
695 | gMC->Gdopt("hide", "on"); |
696 | gMC->Gdopt("shad", "on"); |
697 | gMC->Gsatt("*", "fill", 7); |
698 | gMC->SetClipBox("."); |
699 | gMC->SetClipBox("*", 0, 20, -20, 20, -1900, -1700); |
700 | gMC->DefaultRange(); |
701 | gMC->Gdraw("alic", 40, 30, 0, -191.5, -78, .19, .19); |
702 | gMC->Gdhead(1111, "CASTOR Version 1"); |
703 | gMC->Gdman(15,-2, "MAN"); |
704 | gMC->Gdopt("hide", "off"); |
fe4da5cc |
705 | } |
706 | |
707 | //_____________________________________________________________________________ |
708 | void AliCASTORv1::CreateMaterials() |
709 | { |
710 | // |
711 | // Create materials for CASTOR version 1 |
712 | // |
713 | // 30 March 1997 27 November 1997 Aris L. S. Angelis * |
714 | // >--------------------------------------------------------------------<* |
fe4da5cc |
715 | Int_t ISXFLD = gAlice->Field()->Integ(); |
716 | Float_t SXMGMX = gAlice->Field()->Max(); |
717 | |
ad51aeb0 |
718 | Int_t *idtmed = fIdtmed->GetArray()-1499; |
fe4da5cc |
719 | |
720 | Float_t cute, ubuf[1], cutg, epsil, awmix[3], dwmix, stmin; |
721 | Int_t isvol; |
722 | Float_t wwmix[3], zwmix[3], aq[2], dq, zq[2], wq[2]; |
723 | Float_t tmaxfd, stemax, deemax; |
724 | Int_t kod; |
725 | |
726 | |
727 | // **> Quartz and Wmixture. |
728 | // **> UBUF is the value of r0, used for calculation of the radii of |
729 | // **> the nuclei and the Woods-Saxon potential. |
730 | ubuf[0] = .68; |
731 | AliMaterial(1, "Vacuum$", 1e-16, 1e-16, 1e-16, 1e16, 1e16, ubuf, 1); |
732 | ubuf[0] = .68; |
733 | AliMaterial(2, "Air $", 14.61, 7.3, .001205, 30420., 67500., ubuf, 1); |
734 | //**> Quartz (SiO2) and fluorinated (?) quartz for cladding (insensitive). |
735 | dq = 2.64; |
736 | aq[0] = 28.086; |
737 | aq[1] = 15.9994; |
738 | zq[0] = 14.; |
739 | zq[1] = 8.; |
740 | wq[0] = 1.; |
741 | wq[1] = 2.; |
742 | AliMixture(3, "Quartz$", aq, zq, dq, -2, wq); |
743 | // After a call with ratios by number (negative number of elements), |
744 | // the ratio array is changed to the ratio by weight, so all successive |
745 | // calls with the same array must specify the number of elements as |
746 | // positive |
747 | AliMixture(4, "FQuartz$", aq, zq, dq, 2, wq); |
748 | // **> W mixture (90% W + 7.5% Ni + 2.5% Cu). |
749 | awmix[0] = 183.85; |
750 | zwmix[0] = 74.; |
751 | wwmix[0] = .9; |
752 | awmix[1] = 58.69; |
753 | zwmix[1] = 28.; |
754 | wwmix[1] = .075; |
755 | awmix[2] = 63.55; |
756 | zwmix[2] = 29.; |
757 | wwmix[2] = .025; |
758 | dwmix = 17.2; |
759 | // **> (Pure W and W mixture are given the same material number |
760 | // **> so that they can be used interchangeably). |
761 | ubuf[0] = 1.1; |
762 | AliMixture(5, "W Mix $", awmix, zwmix, dwmix, 3, wwmix); |
763 | // **> Lead. |
764 | ubuf[0] = 1.12; |
765 | AliMaterial(6, "Pb208 $", 207.19, 82., 11.35, .56, 18.5, ubuf, 1); |
766 | // **> Iron. |
767 | ubuf[0] = .99; |
768 | AliMaterial(7, "Fe56 $", 55.85, 26., 7.87, 1.76, 16.7, ubuf, 1); |
769 | // **> Copper. |
770 | ubuf[0] = 1.01; |
771 | AliMaterial(8, "Cu63 $", 63.54, 29., 8.96, 1.43, 15., ubuf, 1); |
772 | // **> Debug Printout. |
773 | // CALL GPRINT('MATE',0) |
774 | // **> (Negative values for automatic calculation in case of AUTO=0). |
775 | isvol = 0; // Sensitive volume flag. |
776 | tmaxfd = .1; // Max allowed angular deviation in 1 step due to field |
777 | stemax = -.5; // Maximum permitted step size (cm). |
778 | deemax = -.2; // Maximum permitted fractional energy loss. |
779 | epsil = .01; // Boundary crossing precision (cm). |
780 | stmin = -.1; // Minimum permitted step size inside absorber (cm). |
ad51aeb0 |
781 | AliMedium(1, "Vacuum$", 1, isvol, ISXFLD, SXMGMX, tmaxfd, stemax, deemax, epsil, stmin); |
782 | AliMedium(2, "Air $", 2, isvol, ISXFLD, SXMGMX, tmaxfd, stemax, deemax, epsil, stmin); |
fe4da5cc |
783 | |
784 | // **> Options for Cherenkov fibres and cladding. |
785 | isvol = 1; // Declare fibre core as sensitive. |
ad51aeb0 |
786 | AliMedium(3, "Quartz$", 3, isvol, ISXFLD, SXMGMX, tmaxfd, stemax, deemax, epsil, stmin); |
fe4da5cc |
787 | isvol = 0; // Declare fibre cladding as not sensitive. |
ad51aeb0 |
788 | AliMedium(4, "FQuartz$", 4, isvol, ISXFLD, SXMGMX, tmaxfd, stemax, deemax, epsil, stmin); |
fe4da5cc |
789 | |
790 | // **> Options for absorber material (not sensitive). |
791 | isvol = 0; // Sensitive volume flag. |
792 | stemax = .5; // Maximum permitted step size (cm). |
793 | deemax = .5; // Maximum permitted fractional energy loss. |
794 | stmin = .1; // Minimum permitted step size inside absorber (cm). |
ad51aeb0 |
795 | AliMedium(5, "W Mix $", 5, isvol, ISXFLD, SXMGMX, tmaxfd, stemax, deemax, epsil, stmin); |
796 | AliMedium(6, "Pb208 $", 6, isvol, ISXFLD, SXMGMX, tmaxfd, stemax, deemax, epsil, stmin); |
797 | AliMedium(7, "Fe56 $ ", 7, isvol, ISXFLD, SXMGMX, tmaxfd, stemax, deemax, epsil, stmin); |
798 | AliMedium(8, "Cu63 $ ", 8, isvol, ISXFLD, SXMGMX, tmaxfd, stemax, deemax, epsil, stmin); |
fe4da5cc |
799 | |
800 | // **> Select material for the Cherenkov fibres. |
801 | fOdFiber = 1503; |
802 | // CALL GPTMED(IDTMED(KODFBR)) |
803 | // **> Select material for the fibre cladding. |
804 | // Quartz. |
805 | fOdCladding = 1504; |
806 | // CALL GPTMED(IDTMED(KODCLD)) |
807 | // **> Select absorber material. |
808 | // FQuartz. |
809 | fOdAbsorber = 1505; // W184/Mix |
810 | // KODABS=1506 ! Pb208. |
811 | // KODABS=1507 ! Fe56. |
812 | // KODABS=1508 ! Cu63. |
813 | // CALL GPTMED(IDTMED(KODABS)) |
814 | // **> Set by default all interactions and decays explicitly ON |
815 | // **> and redefine the kinetic energy cutoffs: |
816 | // CUTE=0.0031 ! Allow beta >= 0.99 only. |
817 | cute = 7e-4; // Allow beta >= 0.67 only. |
818 | cutg = cute * 1.33; |
819 | |
820 | // **> Inside the absorber material, |
821 | for (kod = 1505; kod <= 1508; ++kod) { |
822 | Int_t absorber = idtmed[kod - 1]; |
cfce8870 |
823 | gMC->Gstpar(absorber, "CUTELE", cute); // Allow beta >= 0.xx |
824 | gMC->Gstpar(absorber, "CUTGAM", cutg); // = 1.33 cutele. |
825 | gMC->Gstpar(absorber, "CUTNEU", .01); // Default. |
826 | gMC->Gstpar(absorber, "CUTHAD", .01); // Default. |
827 | gMC->Gstpar(absorber, "CUTMUO", .01); // Default. |
828 | gMC->Gstpar(absorber, "BCUTE", cutg); // = cutgam. |
829 | gMC->Gstpar(absorber, "BCUTM", cutg); // = cutgam. |
830 | gMC->Gstpar(absorber, "DCUTE", cute); // = cutele. |
831 | gMC->Gstpar(absorber, "DCUTM", cute); // = cutele. |
832 | gMC->Gstpar(absorber, "PPCUTM", cutg); // = 1.33 cutele. |
833 | gMC->Gstpar(absorber, "DCAY", 1.); |
834 | gMC->Gstpar(absorber, "MULS", 1.); |
835 | gMC->Gstpar(absorber, "PFIS", 1.); |
836 | gMC->Gstpar(absorber, "MUNU", 1.); |
837 | gMC->Gstpar(absorber, "LOSS", 1.); |
838 | gMC->Gstpar(absorber, "PHOT", 1.); |
839 | gMC->Gstpar(absorber, "COMP", 1.); |
840 | gMC->Gstpar(absorber, "PAIR", 1.); |
841 | gMC->Gstpar(absorber, "BREM", 1.); |
842 | gMC->Gstpar(absorber, "RAYL", 1.); |
843 | gMC->Gstpar(absorber, "DRAY", 1.); |
844 | gMC->Gstpar(absorber, "ANNI", 1.); |
845 | gMC->Gstpar(absorber, "HADR", 1.); |
846 | gMC->Gstpar(absorber, "LABS", 1.); |
fe4da5cc |
847 | } |
848 | // **> Inside the cladding, |
849 | Int_t cladding = idtmed[fOdCladding - 1]; |
cfce8870 |
850 | gMC->Gstpar(cladding, "CUTELE", cute); // Allow beta >= 0.xx |
851 | gMC->Gstpar(cladding, "CUTGAM", cutg); // = 1.33 cutele. |
852 | gMC->Gstpar(cladding, "CUTNEU", .01); // Default. |
853 | gMC->Gstpar(cladding, "CUTHAD", .01); // Default. |
854 | gMC->Gstpar(cladding, "CUTMUO", .01); // Default. |
855 | gMC->Gstpar(cladding, "BCUTE", cutg); // = cutgam. |
856 | gMC->Gstpar(cladding, "BCUTM", cutg); // = cutgam. |
857 | gMC->Gstpar(cladding, "DCUTE", cute); // = cutele. |
858 | gMC->Gstpar(cladding, "DCUTM", cute); // = cutele. |
859 | gMC->Gstpar(cladding, "PPCUTM", cutg); // = 1.33 cutele. |
860 | gMC->Gstpar(cladding, "DCAY", 1.); |
861 | gMC->Gstpar(cladding, "MULS", 1.); |
862 | gMC->Gstpar(cladding, "PFIS", 1.); |
863 | gMC->Gstpar(cladding, "MUNU", 1.); |
864 | gMC->Gstpar(cladding, "LOSS", 1.); |
865 | gMC->Gstpar(cladding, "PHOT", 1.); |
866 | gMC->Gstpar(cladding, "COMP", 1.); |
867 | gMC->Gstpar(cladding, "PAIR", 1.); |
868 | gMC->Gstpar(cladding, "BREM", 1.); |
869 | gMC->Gstpar(cladding, "RAYL", 1.); |
870 | gMC->Gstpar(cladding, "DRAY", 1.); |
871 | gMC->Gstpar(cladding, "ANNI", 1.); |
872 | gMC->Gstpar(cladding, "HADR", 1.); |
873 | gMC->Gstpar(cladding, "LABS", 1.); |
fe4da5cc |
874 | |
875 | // **> and Inside the Cherenkov fibres, |
876 | Int_t fiber = idtmed[fOdFiber - 1]; |
cfce8870 |
877 | gMC->Gstpar(fiber, "CUTELE", cute); // Allow beta >= 0.xx |
878 | gMC->Gstpar(fiber, "CUTGAM", cutg); // = 1.33 cutele. |
879 | gMC->Gstpar(fiber, "CUTNEU", .01); // Default. |
880 | gMC->Gstpar(fiber, "CUTHAD", .01); // Default. |
881 | gMC->Gstpar(fiber, "CUTMUO", .01); // Default. |
882 | gMC->Gstpar(fiber, "BCUTE", cutg); // = cutgam. |
883 | gMC->Gstpar(fiber, "BCUTM", cutg); // = cutgam. |
884 | gMC->Gstpar(fiber, "DCUTE", cute); // = cutele. |
885 | gMC->Gstpar(fiber, "DCUTM", cute); // = cutele. |
886 | gMC->Gstpar(fiber, "PPCUTM", cutg); // = 1.33 cutele. |
887 | gMC->Gstpar(fiber, "DCAY", 1.); |
888 | gMC->Gstpar(fiber, "MULS", 1.); |
889 | gMC->Gstpar(fiber, "PFIS", 1.); |
890 | gMC->Gstpar(fiber, "MUNU", 1.); |
891 | gMC->Gstpar(fiber, "LOSS", 1.); |
892 | gMC->Gstpar(fiber, "PHOT", 1.); |
893 | gMC->Gstpar(fiber, "COMP", 1.); |
894 | gMC->Gstpar(fiber, "PAIR", 1.); |
895 | gMC->Gstpar(fiber, "BREM", 1.); |
896 | gMC->Gstpar(fiber, "RAYL", 1.); |
897 | gMC->Gstpar(fiber, "DRAY", 1.); |
898 | gMC->Gstpar(fiber, "ANNI", 1.); |
899 | gMC->Gstpar(fiber, "HADR", 1.); |
900 | gMC->Gstpar(fiber, "LABS", 1.); |
fe4da5cc |
901 | } |
902 | |
903 | //_____________________________________________________________________________ |
904 | void AliCASTORv1::StepManager() |
905 | { |
906 | // |
907 | // Called at every step in CASTOR |
908 | // |
909 | } |
910 | |
911 | //_____________________________________________________________________________ |
912 | void AliCASTORv1::Init() |
913 | { |
914 | // |
915 | // Initialise CASTOR detector after it has been built |
916 | // |
917 | Int_t i; |
918 | // |
919 | printf("\n"); |
920 | for(i=0;i<35;i++) printf("*"); |
921 | printf(" CASTOR_INIT "); |
922 | for(i=0;i<35;i++) printf("*"); |
923 | printf("\n"); |
924 | // |
925 | // Here the ABSO initialisation code (if any!) |
926 | for(i=0;i<80;i++) printf("*"); |
927 | printf("\n"); |
928 | } |
929 | |
930 | ClassImp(AliCASTORhit) |
931 | |
932 | //_____________________________________________________________________________ |
933 | AliCASTORhit::AliCASTORhit(Int_t shunt, Int_t track, Int_t *vol, Float_t *hits): |
934 | AliHit(shunt, track) |
935 | { |
936 | // |
937 | // Store a CASTOR hit |
938 | // |
939 | fVolume = vol[0]; |
940 | fX=hits[0]; |
941 | fY=hits[1]; |
942 | fZ=hits[2]; |
943 | } |
944 | |
945 | |