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