]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TOF/AliTOFv5T0.cxx
Possibility for partial TOF geometry (S.Arcelli)
[u/mrichter/AliRoot.git] / TOF / AliTOFv5T0.cxx
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 Revision 1.8  2006/04/20 22:30:50  hristov
19 Coding conventions (Annalisa)
20
21 Revision 1.7  2006/04/16 22:29:05  hristov
22 Coding conventions (Annalisa)
23
24 Revision 1.6  2006/03/20 08:20:35  decaro
25 Al layer: positioning correction
26
27 Revision 1.5  2006/03/20 07:54:20  decaro
28 Correction of some layer thickness
29
30 Revision 1.4  2006/03/13 12:35:44  decaro
31 Suppression of fractional Z warning
32
33 Revision 1.3  2006/02/28 10:38:00  decaro
34 AliTOFGeometry::fAngles, AliTOFGeometry::fHeights,
35 AliTOFGeometry::fDistances arrays: dimension definition in the right
36 location
37
38 Revision 1.2  2006/02/27 18:12:14  decaro
39 Remove in StepManager the dependence of hit indexes from parametrized
40 TOF position
41
42 Revision 1.1  2005/12/15 08:55:33  decaro
43 New TOF geometry description (V5) -G. Cara Romeo and A. De Caro
44
45
46 Revision 0.1 2004 November G. Cara Romeo and A. De Caro
47         Implement new TOF geometry version
48         in order to
49            suppress few volume overlaps
50                 (in the 4th TOF geometry version),
51            insert the realistic strip numbers and positions
52
53 */
54
55 ///////////////////////////////////////////////////////////////////////////////
56 //                                                                           //
57 //  This class contains the functions for version 5 of the Time Of Flight    //
58 //  detector.                                                                //
59 //                                                                           //
60 //  VERSION WITH 5 MODULES AND TILTED STRIPS                                 //
61 //                                                                           //
62 //  FULL COVERAGE VERSION + OPTION for PHOS holes                            //
63 //                                                                           //
64 //                                                                           //
65 //Begin_Html                                                                 //
66 /*                                                                           //
67 <img src="picts/AliTOFv5T0Class.gif">                                        //
68 */                                                                           //
69 //End_Html                                                                   //
70 //                                                                           //
71 ///////////////////////////////////////////////////////////////////////////////
72
73 #include "TBRIK.h"
74 #include "TGeometry.h"
75 #include "TLorentzVector.h"
76 #include "TNode.h"
77 #include "TVirtualMC.h"
78
79 #include "AliConst.h"
80 #include "AliLog.h"
81 #include "AliMagF.h"
82 #include "AliMC.h"
83 #include "AliRun.h"
84
85 #include "AliTOFGeometry.h"
86 #include "AliTOFGeometryV5.h"
87 #include "AliTOFv5T0.h"
88
89 extern TDirectory *gDirectory;
90 extern TVirtualMC *gMC;
91
92 extern AliRun *gAlice;
93
94 ClassImp(AliTOFv5T0)
95
96 //_____________________________________________________________________________
97 AliTOFv5T0::AliTOFv5T0()
98 {
99   //
100   // Default constructor
101   //
102 }
103  
104 //_____________________________________________________________________________
105 AliTOFv5T0::AliTOFv5T0(const char *name, const char *title)
106         : AliTOF(name,title,"tzero")
107 {
108   //
109   // Standard constructor
110   //
111   //
112   // Check that FRAME is there otherwise we have no place where to
113   // put TOF
114
115
116   AliModule* frame = (AliModule*)gAlice->GetModule("FRAME");
117   if(!frame) {
118     AliFatal("TOF needs FRAME to be present");
119   } else{
120     
121     if (fTOFGeometry) delete fTOFGeometry;
122     fTOFGeometry = new AliTOFGeometryV5();
123
124     if(frame->IsVersion()==1) {
125       AliInfo(Form("Frame version %d", frame->IsVersion())); 
126       AliInfo("Full Coverage for TOF");
127       fTOFHoles=false;}    
128     else {
129       AliInfo(Form("Frame version %d", frame->IsVersion())); 
130       AliInfo("TOF with Holes for PHOS");
131       fTOFHoles=true;}      
132   }
133   fTOFGeometry->SetHoles(fTOFHoles);
134
135   //AliTOF::fTOFGeometry = fTOFGeometry;
136
137   // Save the geometry
138   TDirectory* saveDir = gDirectory;
139   gAlice->GetRunLoader()->CdGAFile();
140   fTOFGeometry->Write("TOFgeometry");
141   saveDir->cd();
142
143
144
145 //____________________________________________________________________________
146 void AliTOFv5T0::BuildGeometry()
147 {
148   //
149   // Build TOF ROOT geometry for the ALICE event display
150   //
151   TNode *node, *top;
152   const int kColorTOF  = 27;
153   
154   TGeometry *globalGeometry = (TGeometry*)gAlice->GetGeometry();
155
156   // Find top TNODE
157   top = globalGeometry->GetNode("alice");
158   
159   // Position the different copies
160   const Float_t krTof  =(fTOFGeometry->Rmax()+fTOFGeometry->Rmin())/2.;
161   const Float_t khTof  = fTOFGeometry->Rmax()-fTOFGeometry->Rmin();
162   const Int_t   kNTof  = fTOFGeometry->NSectors();
163   const Float_t kangle = k2PI/kNTof;
164
165   const Float_t kInterCentrModBorder1 = 49.5;
166   const Float_t kInterCentrModBorder2 = 57.5;
167
168   Float_t ang;
169   
170   // define offset for nodes
171   Float_t zOffsetB = (fTOFGeometry->ZlenA()*0.5 + (kInterCentrModBorder1+kInterCentrModBorder2)*0.5)*0.5;
172   Float_t zOffsetA = 0.;
173   // Define TOF basic volume
174   
175   char nodeName0[7], nodeName1[7], nodeName2[7];
176   char nodeName3[7], nodeName4[7], rotMatNum[7];
177
178   if (fTOFHoles) {
179     new TBRIK("S_TOF_B","TOF box","void",
180               fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenB()*0.5);
181     new TBRIK("S_TOF_C","TOF box","void",
182               fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenB()*0.5);
183   }
184   new TBRIK("S_TOF_A","TOF box","void",
185             fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenA()*0.5);
186   
187   for (Int_t nodeNum=1;nodeNum<19;nodeNum++){
188     
189     if (nodeNum<10) {
190       sprintf(rotMatNum,"rot50%i",nodeNum);
191       sprintf(nodeName0,"FTO00%i",nodeNum);
192       sprintf(nodeName1,"FTO10%i",nodeNum);
193       sprintf(nodeName2,"FTO20%i",nodeNum);
194       sprintf(nodeName3,"FTO30%i",nodeNum);
195       sprintf(nodeName4,"FTO40%i",nodeNum);
196     }
197     if (nodeNum>9) {
198       sprintf(rotMatNum,"rot5%i",nodeNum);
199       sprintf(nodeName0,"FTO0%i",nodeNum);
200       sprintf(nodeName1,"FTO1%i",nodeNum);
201       sprintf(nodeName2,"FTO2%i",nodeNum);
202       sprintf(nodeName3,"FTO3%i",nodeNum);
203       sprintf(nodeName4,"FTO4%i",nodeNum);
204     }
205     
206     new TRotMatrix(rotMatNum,rotMatNum,90,-20*nodeNum,90,90-20*nodeNum,0,0);
207     ang = (4.5-nodeNum) * kangle;
208
209     if (fTOFHoles) {   
210       top->cd();
211       node = new TNode(nodeName2,nodeName2,"S_TOF_B", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang), zOffsetB,rotMatNum);
212       node->SetLineColor(kColorTOF);
213       fNodes->Add(node);
214       
215       top->cd();
216       node = new TNode(nodeName3,nodeName3,"S_TOF_C", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang),-zOffsetB,rotMatNum);
217       node->SetLineColor(kColorTOF);
218       fNodes->Add(node);
219     }
220
221     top->cd();
222     node = new TNode(nodeName4,nodeName4,"S_TOF_A", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang), zOffsetA,rotMatNum);
223     node->SetLineColor(kColorTOF);
224     fNodes->Add(node);
225   } // end loop on nodeNum
226
227 }
228
229 //_____________________________________________________________________________
230 void AliTOFv5T0::CreateGeometry()
231 {
232   //
233   // Create geometry for Time Of Flight version 0
234   //
235   //Begin_Html
236   /*
237     <img src="picts/AliTOFv5T0.gif">
238   */
239   //End_Html
240   //
241   // Creates common geometry
242   //
243   AliTOF::CreateGeometry();
244 }
245  
246
247 //_____________________________________________________________________________
248 void AliTOFv5T0::TOFpc(Float_t xtof,  Float_t ytof, Float_t zlenA,
249                        Float_t zlenB)
250 {
251   //
252   // Definition of the Time Of Fligh Resistive Plate Chambers
253   //
254
255   const Float_t kPi = TMath::Pi();
256
257   const Float_t kInterCentrModBorder1 = 49.5;
258   const Float_t kInterCentrModBorder2 = 57.5;
259   const Float_t kExterInterModBorder1 = 196.0;
260   const Float_t kExterInterModBorder2 = 203.5;
261
262   const Float_t kLengthExInModBorder  = 4.7;
263   const Float_t kLengthInCeModBorder  = 7.0;
264
265   // Al layers over all internal module walls (cm)
266   const Float_t khAlWall = 0.03;
267
268   // module wall thickness (cm)
269   const Float_t kModuleWallThickness = 0.3;
270
271   // Al honeycomb layer between strips and cards (cm)
272   const Float_t kHoneycombLayerThickness = 1.5;
273
274   AliDebug(2,Form("zlenA*0.5 = %d", zlenA*0.5));
275   AliDebug(1, "************************* TOF geometry **************************");
276   
277   // Definition of the Time Of Fligh Resistive Plate Chambers
278   // xFLT, yFLT, zFLT - sizes of TOF modules (large)
279   
280   Float_t  xcoor, ycoor, zcoor;
281   Float_t  par[3];
282   Int_t    *idtmed = fIdtmed->GetArray()-499;
283   Int_t    idrotm[100];
284
285   par[0] =  xtof * 0.5;
286   par[1] =  ytof * 0.5;
287   par[2] = zlenA * 0.5;
288   gMC->Gsvolu("FTOA", "BOX ", idtmed[503], par, 3);  // fibre glass
289   
290   if (fTOFHoles) {
291     par[0] =  xtof * 0.5;
292     par[1] =  ytof * 0.5;
293     par[2] = (zlenA*0.5 - kInterCentrModBorder1)*0.5;
294     gMC->Gsvolu("FTOB", "BOX ", idtmed[503], par, 3);  // fibre glass
295     gMC->Gsvolu("FTOC", "BOX ", idtmed[503], par, 3);  // fibre glass
296   }
297
298   // Positioning of fibre glass modules (FTOA, FTOB and FTOC)
299   
300   //AliMatrix(idrotm[0], 90.,  0., 0., 0., 90.,-90.);
301   AliMatrix(idrotm[0], 90.,  0., 0., 0., 90.,270.);
302
303   xcoor = 0.;
304   ycoor = 0.;
305   zcoor = 0.;
306   for(Int_t isec=0;isec<18;isec++){
307     if(fTOFSectors[isec]==-1)continue;
308     char name[6];
309     sprintf(name, "BTOF%d",isec);
310     if (fTOFHoles && (isec==16||isec==17)) {
311       xcoor = 0.;
312       ycoor = (zlenA*0.5 + kInterCentrModBorder1)*0.5;
313       zcoor = 0.;
314       gMC->Gspos("FTOB", 0, name, xcoor, ycoor, zcoor, idrotm[0], "ONLY");
315       gMC->Gspos("FTOC", 0, name, xcoor,-ycoor, zcoor, idrotm[0], "ONLY");
316     }
317     else gMC->Gspos("FTOA", 0,name, xcoor, ycoor, zcoor, idrotm[0], "ONLY");
318   }
319   // Large not sensitive volumes with Insensitive Freon (FLTA, FLTB and FLTC)
320   
321   Float_t xFLT, yFLT, zFLTA;
322   
323   xFLT  = xtof  - kModuleWallThickness*2.;
324   yFLT  = ytof  - kModuleWallThickness*2.;
325   zFLTA = zlenA - kModuleWallThickness*2.;
326   
327   par[0] = xFLT*0.5;
328   par[1] = yFLT*0.5;
329   par[2] = zFLTA*0.5;
330   gMC->Gsvolu("FLTA", "BOX ", idtmed[507], par, 3); //  Freon mix
331
332   xcoor = 0.;
333   ycoor = 0.;
334   zcoor = 0.;
335   gMC->Gspos ("FLTA", 0, "FTOA", xcoor, ycoor, zcoor, 0, "ONLY");
336
337   if (fTOFHoles) {
338     par[0] = xFLT*0.5;
339     par[1] = yFLT*0.5;
340     par[2] = (zlenA*0.5 - kInterCentrModBorder1-kModuleWallThickness)*0.5;
341     gMC->Gsvolu("FLTB", "BOX ", idtmed[507], par, 3); // Freon mix
342     gMC->Gsvolu("FLTC", "BOX ", idtmed[507], par, 3); // Freon mix
343
344     xcoor = 0.;
345     ycoor = 0.;
346     zcoor = kModuleWallThickness*0.5;
347     gMC->Gspos ("FLTB", 0, "FTOB", xcoor, ycoor, zcoor, 0, "ONLY");
348     gMC->Gspos ("FLTC", 0, "FTOC", xcoor, ycoor,-zcoor, 0, "ONLY");
349   }
350
351   // Layer of Aluminum before detector (FALA, FALB and FALC)
352
353   par[0] = xFLT*0.5;
354   par[1] = khAlWall*0.5;
355   par[2] = kInterCentrModBorder1 - (kModuleWallThickness + khAlWall);
356   gMC->Gsvolu("FALA", "BOX ", idtmed[505], par, 3); // Alluminium
357
358   xcoor = 0.;
359   ycoor = (-yFLT + khAlWall)*0.5;
360   zcoor = 0.;
361   gMC->Gspos ("FALA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
362
363   par[0] = xFLT*0.5;
364   par[1] = khAlWall*0.5;
365   par[2] = (kExterInterModBorder2 - kInterCentrModBorder1 - 2.*(kModuleWallThickness + khAlWall))*0.5;
366   gMC->Gsvolu("FALB", "BOX ", idtmed[505], par, 3); // Alluminium
367
368   xcoor = 0.;
369   ycoor = (-yFLT + khAlWall)*0.5;
370   zcoor = (kExterInterModBorder2 + kInterCentrModBorder1)*0.5;
371   gMC->Gspos ("FALB", 1, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
372   gMC->Gspos ("FALB", 2, "FLTA", xcoor, ycoor,-zcoor, 0, "ONLY");
373
374   par[0] = xFLT*0.5;
375   par[1] = khAlWall*0.5;
376   par[2] = (zlenA*0.5 - kExterInterModBorder2 - 2.*(kModuleWallThickness + khAlWall))*0.5;
377   gMC->Gsvolu("FALC", "BOX ", idtmed[505], par, 3); // Alluminium
378
379   xcoor = 0.;
380   ycoor = (-yFLT + khAlWall)*0.5;
381   zcoor = (kExterInterModBorder2+zlenA*0.5)*0.5;
382   gMC->Gspos ("FALC", 1, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
383   gMC->Gspos ("FALC", 2, "FLTA", xcoor, ycoor,-zcoor, 0, "ONLY");
384
385   if (fTOFHoles) {
386     xcoor = 0.;
387     ycoor = (-yFLT + khAlWall)*0.5;
388     zcoor = (zlenA*0.5 - kExterInterModBorder2)*0.5 - kModuleWallThickness*0.5;
389     gMC->Gspos ("FALB", 1, "FLTB", xcoor, ycoor, zcoor, 0, "ONLY");
390     gMC->Gspos ("FALB", 2, "FLTC", xcoor, ycoor,-zcoor, 0, "ONLY");
391
392     xcoor = 0.;
393     ycoor = (-yFLT + khAlWall)*0.5;
394     zcoor = (kExterInterModBorder2 - kInterCentrModBorder1)*0.5 + kModuleWallThickness*0.5;
395     gMC->Gspos ("FALC", 1, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
396     gMC->Gspos ("FALC", 2, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
397   }
398
399   Float_t y0, alpha, tgal, beta, tgbe, trpa[11];
400
401   // Fibre glass walls between central and intermediate modules (FWZ1 and FWZ2; holes -> FZ1B, FZ1C, FZ2B)
402
403   tgal = (yFLT*0.5 - 2.*kLengthInCeModBorder)/(kInterCentrModBorder2 - kInterCentrModBorder1);
404   alpha = TMath::ATan(tgal);
405   beta = (kPi*0.5 - alpha)*0.5;
406   tgbe = TMath::Tan(beta);
407   trpa[0]  = xFLT*0.5;
408   trpa[1]  = 0.;
409   trpa[2]  = 0.;
410   trpa[3]  = kModuleWallThickness;
411   trpa[4]  = (kLengthInCeModBorder - kModuleWallThickness*tgbe)*0.5;
412   trpa[5]  = (kLengthInCeModBorder + kModuleWallThickness*tgbe)*0.5;
413   trpa[6]  = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
414   trpa[7]  = kModuleWallThickness;
415   trpa[8]  = (kLengthInCeModBorder - kModuleWallThickness*tgbe)*0.5;
416   trpa[9]  = (kLengthInCeModBorder + kModuleWallThickness*tgbe)*0.5;
417   trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
418   gMC->Gsvolu("FWZ1","TRAP", idtmed[503], trpa, 11);   // fibre glass
419
420   AliMatrix (idrotm[1],90., 90.,180.,0.,90.,180.);
421   AliMatrix (idrotm[4],90., 90.,  0.,0.,90.,  0.);
422
423   xcoor = 0.;
424   ycoor = -yFLT*0.5 + kLengthInCeModBorder*0.5;
425   zcoor = kInterCentrModBorder1;
426   gMC->Gspos("FWZ1", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[1],"ONLY");
427   gMC->Gspos("FWZ1", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[4],"ONLY");
428
429   if (fTOFHoles) {
430     y0 = kLengthInCeModBorder - kModuleWallThickness*0.5*tgbe;
431     trpa[0]  = xFLT*0.5;
432     trpa[1]  = 0.;
433     trpa[2]  = 0.;
434     trpa[3]  = kModuleWallThickness*0.5;
435     trpa[4]  = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
436     trpa[5]  = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
437     trpa[6]  = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
438     trpa[7]  = kModuleWallThickness*0.5;
439     trpa[8]  = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
440     trpa[9]  = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
441     trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
442     gMC->Gsvolu("FZ1B","TRAP", idtmed[503], trpa, 11);   // fibre glass
443
444     xcoor = 0.;
445     ycoor = -yFLT*0.5 + kLengthInCeModBorder*0.5 - kModuleWallThickness*0.25*tgbe;
446     zcoor = -kInterCentrModBorder1 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
447     gMC->Gspos("FZ1B", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[4],"ONLY");
448     gMC->Gspos("FZ1B", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[1],"ONLY");
449   }
450
451   AliMatrix (idrotm[2],90.,270.,  0.,0.,90.,180.);
452   AliMatrix (idrotm[5],90.,270.,180.,0.,90.,  0.);
453
454   xcoor = 0.;
455   ycoor = -kLengthInCeModBorder*0.5;
456   zcoor = kInterCentrModBorder2;
457   gMC->Gspos("FWZ1", 3,"FLTA", xcoor, ycoor, zcoor,idrotm[2],"ONLY");
458   gMC->Gspos("FWZ1", 4,"FLTA", xcoor, ycoor,-zcoor,idrotm[5],"ONLY");
459
460   if (fTOFHoles) {
461     y0 = kLengthInCeModBorder + kModuleWallThickness*0.5*tgbe;
462     trpa[0]  = xFLT*0.5;
463     trpa[1]  = 0.;
464     trpa[2]  = 0.;
465     trpa[3]  = kModuleWallThickness*0.5;
466     trpa[4]  = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
467     trpa[5]  = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
468     trpa[6]  = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
469     trpa[7]  = kModuleWallThickness*0.5;
470     trpa[8]  = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
471     trpa[9]  = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
472     trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
473     gMC->Gsvolu("FZ1C","TRAP", idtmed[503], trpa, 11);   // fibre glass
474
475     xcoor = 0.;
476     ycoor = -kLengthInCeModBorder*0.5 - kModuleWallThickness*0.25*tgbe;
477     zcoor = -kInterCentrModBorder2 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
478     gMC->Gspos("FZ1C", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[5],"ONLY");
479     gMC->Gspos("FZ1C", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[2],"ONLY");
480   }
481
482   trpa[0] = 0.5*(kInterCentrModBorder2 - kInterCentrModBorder1)/TMath::Cos(alpha);
483   trpa[1] = kModuleWallThickness;
484   trpa[2] = xFLT*0.5;
485   trpa[3] = -beta*kRaddeg;
486   trpa[4] = 0.;
487   trpa[5] = 0.;
488   gMC->Gsvolu("FWZ2","PARA", idtmed[503], trpa, 6);    // fibre glass
489
490   AliMatrix (idrotm[3],     alpha*kRaddeg,90.,90.+alpha*kRaddeg,90.,90.,180.);
491   AliMatrix (idrotm[6],180.-alpha*kRaddeg,90.,90.-alpha*kRaddeg,90.,90.,  0.);
492
493   xcoor = 0.;
494   ycoor = -yFLT*0.25;
495   zcoor = (kInterCentrModBorder2 + kInterCentrModBorder1)*0.5;
496   gMC->Gspos("FWZ2", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[3],"ONLY");
497   gMC->Gspos("FWZ2", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[6],"ONLY");
498
499   if (fTOFHoles) {
500     trpa[0] = 0.5*(kInterCentrModBorder2 - kInterCentrModBorder1)/TMath::Cos(alpha);
501     trpa[1] = kModuleWallThickness*0.5;
502     trpa[2] = xFLT*0.5;
503     trpa[3] = -beta*kRaddeg;
504     trpa[4] = 0.;
505     trpa[5] = 0.;
506     gMC->Gsvolu("FZ2B","PARA", idtmed[503], trpa, 6);    // fibre glass
507
508     xcoor = 0.;
509     ycoor = -yFLT*0.25 - kModuleWallThickness*0.5*tgbe;
510     zcoor = -(kInterCentrModBorder2 + kInterCentrModBorder1)*0.5 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
511     gMC->Gspos("FZ2B", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[6],"ONLY");
512     gMC->Gspos("FZ2B", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[3],"ONLY");
513   }
514
515   // Fibre glass walls between intermediate and lateral modules (FWZ3 and FWZ4)
516
517   tgal = (yFLT*0.5 - 2.*kLengthExInModBorder)/(kExterInterModBorder2 - kExterInterModBorder1);
518   alpha = TMath::ATan(tgal);
519   beta = (kPi*0.5 - alpha)*0.5;
520   tgbe = TMath::Tan(beta);
521   trpa[0]  = xFLT*0.5;
522   trpa[1]  = 0.;
523   trpa[2]  = 0.;
524   trpa[3]  = kModuleWallThickness;
525   trpa[4]  = (kLengthExInModBorder - kModuleWallThickness*tgbe)*0.5;
526   trpa[5]  = (kLengthExInModBorder + kModuleWallThickness*tgbe)*0.5;
527   trpa[6]  = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
528   trpa[7]  = kModuleWallThickness;
529   trpa[8]  = (kLengthExInModBorder - kModuleWallThickness*tgbe)*0.5;
530   trpa[9]  = (kLengthExInModBorder + kModuleWallThickness*tgbe)*0.5;
531   trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
532   gMC->Gsvolu("FWZ3","TRAP", idtmed[503], trpa, 11);    // fibre glass
533
534   xcoor = 0.;
535   ycoor = -kLengthExInModBorder*0.5;
536   zcoor = kExterInterModBorder1;
537   gMC->Gspos("FWZ3", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[5],"ONLY");
538   gMC->Gspos("FWZ3", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[2],"ONLY");
539
540   if (fTOFHoles) {
541     xcoor = 0.;
542     ycoor = -kLengthExInModBorder*0.5;
543     zcoor = -kExterInterModBorder1 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
544     gMC->Gspos("FWZ3", 5,"FLTB", xcoor, ycoor, zcoor,idrotm[2],"ONLY");
545     gMC->Gspos("FWZ3", 6,"FLTC", xcoor, ycoor,-zcoor,idrotm[5],"ONLY");
546   }
547
548   xcoor = 0.;
549   ycoor = -yFLT*0.5 + kLengthExInModBorder*0.5;
550   zcoor = kExterInterModBorder2;
551   gMC->Gspos("FWZ3", 3,"FLTA", xcoor, ycoor, zcoor,idrotm[4],"ONLY");
552   gMC->Gspos("FWZ3", 4,"FLTA", xcoor, ycoor,-zcoor,idrotm[1],"ONLY");
553
554   if (fTOFHoles) {
555     xcoor = 0.;
556     ycoor = -yFLT*0.5 + kLengthExInModBorder*0.5;
557     zcoor = -kExterInterModBorder2 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
558     gMC->Gspos("FWZ3", 7,"FLTB", xcoor, ycoor, zcoor,idrotm[1],"ONLY");
559     gMC->Gspos("FWZ3", 8,"FLTC", xcoor, ycoor,-zcoor,idrotm[4],"ONLY");
560   }
561
562   trpa[0] = 0.5*(kExterInterModBorder2 - kExterInterModBorder1)/TMath::Cos(alpha);
563   trpa[1] = kModuleWallThickness;
564   trpa[2] = xFLT*0.5;
565   trpa[3] = -beta*kRaddeg;
566   trpa[4] = 0.;
567   trpa[5] = 0.;
568   gMC->Gsvolu("FWZ4","PARA", idtmed[503], trpa, 6);    // fibre glass
569
570   AliMatrix (idrotm[13],alpha*kRaddeg,90.,90.+alpha*kRaddeg,90.,90.,180.);
571   AliMatrix (idrotm[16],180.-alpha*kRaddeg,90.,90.-alpha*kRaddeg,90.,90.,0.);
572
573   xcoor = 0.;
574   ycoor = -yFLT*0.25;
575   zcoor = (kExterInterModBorder2 + kExterInterModBorder1)*0.5;
576   gMC->Gspos("FWZ4", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[16],"ONLY");
577   gMC->Gspos("FWZ4", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[13],"ONLY");
578
579   if (fTOFHoles) {
580     xcoor = 0.;
581     ycoor = -yFLT*0.25;
582     zcoor = -(kExterInterModBorder2 + kExterInterModBorder1)*0.5 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
583     gMC->Gspos("FWZ4", 3,"FLTB", xcoor, ycoor, zcoor,idrotm[13],"ONLY");
584     gMC->Gspos("FWZ4", 4,"FLTC", xcoor, ycoor,-zcoor,idrotm[16],"ONLY");
585   }
586
587
588   ///////////////// Detector itself //////////////////////
589
590   const Int_t    knx   = fTOFGeometry->NpadX();  // number of pads along x
591   const Int_t    knz   = fTOFGeometry->NpadZ();  // number of pads along z
592   const Float_t  kPadX = fTOFGeometry->XPad();   // pad length along x
593   const Float_t  kPadZ = fTOFGeometry->ZPad();   // pad length along z
594
595   // new description for strip volume -double stack strip-
596   // -- all constants are expressed in cm
597   // heigth of different layers
598   const Float_t khhony   = 1.0    ;   // heigth of HONY  Layer
599   const Float_t khpcby   = 0.08   ;   // heigth of PCB   Layer
600   const Float_t khrgly   = 0.055  ;   // heigth of RED GLASS  Layer
601
602   const Float_t khfiliy  = 0.125  ;   // heigth of FISHLINE  Layer
603   const Float_t khglassy = 0.160*0.5; // heigth of GLASS  Layer
604   const Float_t khglfy   = khfiliy+2.*khglassy;// heigth of GLASS+FISHLINE  Layer
605
606   const Float_t khcpcby  = 0.16   ;   // heigth of PCB  Central Layer
607   const Float_t kwhonz   = 8.1    ;   // z dimension of HONEY  Layer
608   const Float_t kwpcbz1  = 10.6   ;   // z dimension of PCB  Lower Layer
609   const Float_t kwpcbz2  = 11.6   ;   // z dimension of PCB  Upper Layer
610   const Float_t kwcpcbz  = 12.4   ;   // z dimension of PCB  Central Layer
611   const Float_t kwrglz   = 8.     ;   // z dimension of RED GLASS  Layer
612   const Float_t kwglfz   = 7.     ;   // z dimension of GLASS+FISHLN Layer
613   const Float_t klsensmx = knx*kPadX; // length of Sensitive Layer
614   const Float_t khsensmy = 0.05;//0.11;//0.16;// heigth of Sensitive Layer
615   const Float_t kwsensmz = knz*kPadZ; // width of Sensitive Layer
616   
617   // heigth of the FSTR Volume (the strip volume)
618   const Float_t khstripy = 2.*khhony+2.*khpcby+4.*khrgly+2.*khglfy+khcpcby;
619
620   // width  of the FSTR Volume (the strip volume)
621   const Float_t kwstripz = kwcpcbz;
622   // length of the FSTR Volume (the strip volume)
623   const Float_t klstripx = fTOFGeometry->StripLength();
624   
625   Float_t parfp[3]={klstripx*0.5,khstripy*0.5,kwstripz*0.5};
626   // Coordinates of the strip center in the strip reference frame;
627   // used for positioning internal strip volumes
628   Float_t posfp[3]={0.,0.,0.};  
629
630   // FSTR volume definition-filling this volume with non sensitive Gas Mixture
631   gMC->Gsvolu("FSTR","BOX",idtmed[507],parfp,3);     // Freon mix
632
633   //-- HONY Layer definition
634   parfp[1] = khhony*0.5;
635   parfp[2] = kwhonz*0.5;
636   gMC->Gsvolu("FHON","BOX",idtmed[501],parfp,3);     // honeycomb (Nomex)
637   // positioning 2 HONY Layers on FSTR volume
638   posfp[1] =-khstripy*0.5+parfp[1];
639   gMC->Gspos("FHON",1,"FSTR",0., posfp[1],0.,0,"ONLY");
640   gMC->Gspos("FHON",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
641   
642   //-- PCB Layer definition
643   parfp[1] = khpcby*0.5;
644   parfp[2] = kwpcbz1*0.5;
645   gMC->Gsvolu("FPC1","BOX",idtmed[502],parfp,3);     // G10
646   parfp[2] = kwpcbz2*0.5;
647   gMC->Gsvolu("FPC2","BOX",idtmed[502],parfp,3);     // G10
648   // positioning 2 PCB Layers on FSTR volume
649   posfp[1] =-khstripy*0.5+khhony+parfp[1];
650   gMC->Gspos("FPC1",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
651   gMC->Gspos("FPC2",1,"FSTR",0., posfp[1],0.,0,"ONLY");
652
653   //-- central PCB layer definition
654   parfp[1] = khcpcby*0.5;
655   parfp[2] = kwcpcbz*0.5;
656   gMC->Gsvolu("FPCB","BOX",idtmed[502],parfp,3);     // G10
657   // positioning the central PCB layer
658   gMC->Gspos("FPCB",1,"FSTR",0.,0.,0.,0,"ONLY");
659   
660   //      Sensitive volume
661   Float_t parfs[3] = {klsensmx*0.5, khsensmy*0.5, kwsensmz*0.5};
662   gMC->Gsvolu("FSEN","BOX",idtmed[508],parfs,3);     // sensitive ...
663   // dividing FSEN along z in knz=2 and along x in knx=48
664   gMC->Gsdvn("FSEZ","FSEN",knz,3);
665   gMC->Gsdvn("FPAD","FSEZ",knx,1);
666   // positioning a Sensitive layer inside FPCB
667   gMC->Gspos("FSEN",1,"FPCB",0.,0.,0.,0,"ONLY");
668
669   //-- RED GLASS Layer definition
670   parfp[1] = khrgly*0.5;
671   parfp[2] = kwrglz*0.5;
672   gMC->Gsvolu("FRGL","BOX",idtmed[509],parfp,3);     // glass
673   // positioning 4 RED GLASS Layers on FSTR volume
674   posfp[1] = -khstripy*0.5+khhony+khpcby+parfp[1];
675   gMC->Gspos("FRGL",1,"FSTR",0., posfp[1],0.,0,"ONLY");
676   gMC->Gspos("FRGL",4,"FSTR",0.,-posfp[1],0.,0,"ONLY");
677   posfp[1] = (khcpcby+khrgly)*0.5;
678   gMC->Gspos("FRGL",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
679   gMC->Gspos("FRGL",3,"FSTR",0., posfp[1],0.,0,"ONLY");
680
681   //-- GLASS Layer definition
682   parfp[1] = khglassy*0.5;
683   parfp[2] = kwglfz*0.5;
684   gMC->Gsvolu("FGLA","BOX",idtmed[509],parfp,3);     // glass
685
686   // positioning 4 GLASS Layers on FSTR volume
687   posfp[1] = -khstripy*0.5+khhony+khpcby+khrgly+parfp[1];
688   gMC->Gspos("FGLA",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
689   gMC->Gspos("FGLA",4,"FSTR",0., posfp[1],0.,0,"ONLY");
690   posfp[1] = khcpcby*0.5+khrgly+khglassy*0.5;
691   gMC->Gspos("FGLA",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
692   gMC->Gspos("FGLA",3,"FSTR",0., posfp[1],0.,0,"ONLY");
693
694   //-- FREON Layer definition
695   parfp[1] = khfiliy*0.5;
696   gMC->Gsvolu("FFIS","BOX",idtmed[507],parfp,3);     // freon
697
698   // positioning 2 FREON Layers on FSTR volume
699   posfp[1] = -khstripy*0.5+khhony+khpcby+khrgly+khglassy+parfp[1];
700   gMC->Gspos("FFIS",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
701   gMC->Gspos("FFIS",2,"FSTR",0., posfp[1],0.,0,"ONLY");
702
703   /*
704   //-- GLASS+FISHLINE Layer definition
705   parfp[1] = khglfy*0.5;
706   parfp[2] = kwglfz*0.5;
707   gMC->Gsvolu("FGLF","BOX",idtmed[504],parfp,3);
708
709   // positioning 2 GLASS+FISHLINE Layers on FSTR volume
710   posfp[1] = (khcpcby+khglfy)*0.5+khrgly;
711   gMC->Gspos("FGLF",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
712   gMC->Gspos("FGLF",2,"FSTR",0., posfp[1],0.,0,"ONLY");
713   */
714
715   //  Positioning the Strips  (FSTR) in the FLT volumes
716   Int_t maxStripNumbers [5] ={fTOFGeometry->NStripC(),
717                               fTOFGeometry->NStripB(),
718                               fTOFGeometry->NStripA(),
719                               fTOFGeometry->NStripB(),
720                               fTOFGeometry->NStripC()};
721
722   Int_t totalStrip = 0;
723   Float_t xpos, zpos, ypos, ang;
724   for(Int_t iplate =0; iplate < fTOFGeometry->NPlates(); iplate++){
725     if (iplate>0) totalStrip += maxStripNumbers[iplate-1];
726     for(Int_t istrip =0; istrip < maxStripNumbers[iplate]; istrip++){
727
728       ang = fTOFGeometry->GetAngles(iplate,istrip);
729       AliDebug(1, Form(" iplate = %1i, istrip = %2i ---> ang = %f", iplate, istrip, ang));
730  
731       if (ang>0.)       AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.+ang,90., ang, 90.);
732       else if (ang==0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.,90., 0., 0.);
733       else if (ang<0.)  AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.+ang,90.,-ang,270.);
734
735       xpos = 0.;
736       zpos = fTOFGeometry->GetDistances(iplate,istrip);
737       ypos = fTOFGeometry->GetHeights(iplate,istrip);
738
739       gMC->Gspos("FSTR",istrip+totalStrip+1,"FLTA", xpos, ypos,-zpos,idrotm[istrip+totalStrip+1],  "ONLY");
740
741       if (fTOFHoles) {
742         if (istrip+totalStrip+1>53) gMC->Gspos("FSTR",istrip+totalStrip+1,"FLTC", xpos, ypos,-zpos-(zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5,idrotm[istrip+totalStrip+1],"ONLY");
743         if (istrip+totalStrip+1<39) gMC->Gspos("FSTR",istrip+totalStrip+1,"FLTB", xpos, ypos,-zpos+(zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5,idrotm[istrip+totalStrip+1],"ONLY");
744       }
745     }
746   }
747
748   //  1.5 cm Al honeycomb layer between strips and cards
749   par[0] = xFLT*0.5;
750   par[1] = kHoneycombLayerThickness*0.5;
751   par[2] = zFLTA*0.5;
752   gMC->Gsvolu("FPEA", "BOX ", idtmed[506], par, 3);   // Al honeycomb
753
754   xcoor = 0.;
755   ycoor = kHoneycombLayerThickness*0.5;
756   zcoor = 0.;
757   gMC->Gspos ("FPEA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
758
759   if (fTOFHoles) {
760     par[0] = xFLT*0.5;
761     par[1] = kHoneycombLayerThickness*0.5;
762     par[2] = (zlenA*0.5 - kInterCentrModBorder2-kModuleWallThickness)*0.5;
763     gMC->Gsvolu("FPEB", "BOX ", idtmed[506], par, 3);   // Al honeycomb
764
765     xcoor = 0.;
766     ycoor = kHoneycombLayerThickness*0.5;
767     zcoor = (kInterCentrModBorder2-kInterCentrModBorder1)*0.5;
768     gMC->Gspos ("FPEB", 1, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
769     gMC->Gspos ("FPEB", 2, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
770   }
771
772   // frame of Air
773   par[0] = xFLT*0.5;
774   par[1] = (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
775   par[2] = zFLTA *0.5;
776   gMC->Gsvolu("FAIA", "BOX ", idtmed[500], par, 3); // Air
777
778   xcoor = 0.;
779   ycoor = kHoneycombLayerThickness + (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
780   zcoor = 0.;
781   gMC->Gspos ("FAIA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
782
783   if (fTOFHoles) {
784     par[0] = xFLT*0.5;
785     par[1] = (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
786     par[2] = (zlenA*0.5 - kInterCentrModBorder2 - kModuleWallThickness)*0.5;
787     gMC->Gsvolu("FAIB", "BOX ", idtmed[500], par, 3); // Air
788     gMC->Gsvolu("FAIC", "BOX ", idtmed[500], par, 3); // Air
789
790     xcoor = 0.;
791     ycoor = kHoneycombLayerThickness + (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
792     zcoor = (kInterCentrModBorder2-kInterCentrModBorder1)*0.5;
793     gMC->Gspos ("FAIB", 0, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
794     gMC->Gspos ("FAIC", 0, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
795   }
796
797   // start with cards and cooling tubes
798   // finally, cards, cooling tubes and layer for thermal dispersion
799   // 3 volumes
800   
801   // see GEOM200 in GEANT manual
802
803   Float_t cardpar[3];
804
805   // card volume definition
806   cardpar[0]= xFLT*0.5;
807   cardpar[1]= 5.;
808   cardpar[2]= 0.1;
809   gMC->Gsvolu("FCAR", "BOX ", idtmed[502], cardpar, 3); // PCB Card 
810
811   //alu plate volume definition
812   cardpar[1]= 3.5;
813   cardpar[2]= 0.05;
814   gMC->Gsvolu("FALP", "BOX ", idtmed[505], cardpar, 3); // Alu Plate
815
816   // tube volume definition
817   Float_t tubepar[3];
818   tubepar[0]= 0.;
819   tubepar[1]= 0.4;
820   tubepar[2]= 61.;
821   gMC->Gsvolu("FTUB", "TUBE", idtmed[511], tubepar, 3); // cooling tubes (steel)
822
823   //tubepar[0]= 0.;
824   tubepar[1]= 0.35;
825   //tubepar[2]= 61.;
826   gMC->Gsvolu("FITU", "TUBE", idtmed[510], tubepar, 3); // cooling water
827   // positioning water tube into the steel one
828   gMC->Gspos("FITU",1,"FTUB",0.,0.,0.,0,"ONLY");
829
830   // rotation matrix
831   AliMatrix(idrotm[99], 180., 90., 90., 90., 90., 0.);
832
833   // central module positioning
834   Float_t cardpos[3], aplpos2;
835   Float_t stepforcardA = 6.625;
836   Float_t tdis = 0.6;
837   Float_t aplpos1 = -2.;
838
839   cardpos[0]= 0.;
840   cardpos[1]= -0.5;
841   cardpos[2]= -53.;
842   //  tubepos= -53.+tdis;
843   Int_t icard;
844   for (icard=39; icard<54; ++icard) {
845     cardpos[2]= cardpos[2]+stepforcardA;
846     aplpos2 = cardpos[2]+0.15;
847     gMC->Gspos("FCAR",icard,"FAIA",cardpos[0],cardpos[1],     cardpos[2],         0,"ONLY"); 
848     gMC->Gspos("FALP",icard,"FAIA",cardpos[0],   aplpos1,        aplpos2,         0,"ONLY");
849     gMC->Gspos("FTUB",icard,"FAIA",        0.,cardpos[1],cardpos[2]+tdis,idrotm[99],"ONLY");
850   }
851   
852   // intermediate module positioning
853   Float_t stepforcardB= 7.05;
854   Float_t offs = 53.;
855
856   cardpos[2]= offs;
857   for (icard=20; icard<39; ++icard) {
858     cardpos[2]= cardpos[2]+stepforcardB;
859     aplpos2 = cardpos[2]+0.15;
860
861     gMC->Gspos("FCAR",icard+34,"FAIA",cardpos[0],cardpos[1],      cardpos[2],         0,"ONLY");
862     gMC->Gspos("FALP",icard+34,"FAIA",cardpos[0],   aplpos1,         aplpos2,         0,"ONLY");
863     gMC->Gspos("FTUB",icard+34,"FAIA",        0.,cardpos[1], cardpos[2]+tdis,idrotm[99],"ONLY");
864     gMC->Gspos("FCAR",58-icard,"FAIA",cardpos[0],cardpos[1],     -cardpos[2],         0,"ONLY");
865     gMC->Gspos("FALP",58-icard,"FAIA",cardpos[0],   aplpos1,        -aplpos2,         0,"ONLY");
866     gMC->Gspos("FTUB",58-icard,"FAIA",        0.,cardpos[1],-cardpos[2]-tdis,idrotm[99],"ONLY");
867
868     if (fTOFHoles) {
869       gMC->Gspos("FCAR",icard+34+182,"FAIC",cardpos[0],cardpos[1],      cardpos[2]-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,         0,"ONLY");
870       gMC->Gspos("FALP",icard+34+182,"FAIC",cardpos[0],   aplpos1,         aplpos2-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,         0,"ONLY");
871       gMC->Gspos("FTUB",icard+34+182,"FAIC",        0.,cardpos[1], cardpos[2]+tdis-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
872       gMC->Gspos("FCAR",58-icard+ 91,"FAIB",cardpos[0],cardpos[1],     -cardpos[2]+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,         0,"ONLY");
873       gMC->Gspos("FALP",58-icard+ 91,"FAIB",cardpos[0],   aplpos1,        -aplpos2+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,         0,"ONLY");
874       gMC->Gspos("FTUB",58-icard+ 91,"FAIB",        0.,cardpos[1],-cardpos[2]-tdis+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
875     }
876     
877   }
878
879   // outer module positioning
880   Float_t stepforcardC= 8.45238;
881   offs += zlenB;
882   cardpos[2]= offs;
883   for (icard=1; icard<20; ++icard) {
884     cardpos[2]= cardpos[2]+stepforcardC;
885     aplpos2 = cardpos[2]+0.15;
886
887     gMC->Gspos("FCAR",icard+72,"FAIA",cardpos[0],cardpos[1],      cardpos[2],         0,"ONLY"); 
888     gMC->Gspos("FALP",icard+72,"FAIA",cardpos[0],   aplpos1,         aplpos2,         0,"ONLY");
889     gMC->Gspos("FTUB",icard+72,"FAIA",        0.,cardpos[1], cardpos[2]+tdis,idrotm[99],"ONLY");
890     gMC->Gspos("FCAR",20-icard,"FAIA",cardpos[0],cardpos[1],     -cardpos[2],         0,"ONLY");
891     gMC->Gspos("FALP",20-icard,"FAIA",cardpos[0],   aplpos1,        -aplpos2,         0,"ONLY");
892     gMC->Gspos("FTUB",20-icard,"FAIA",        0.,cardpos[1],-cardpos[2]-tdis,idrotm[99],"ONLY");
893
894     if (fTOFHoles) {
895       gMC->Gspos("FCAR",icard+72+182,"FAIC",cardpos[0],cardpos[1],      cardpos[2]-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,         0,"ONLY");
896       gMC->Gspos("FALP",icard+72+182,"FAIC",cardpos[0],   aplpos1,         aplpos2-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,         0,"ONLY");
897       gMC->Gspos("FTUB",icard+72+182,"FAIC",        0.,cardpos[1], cardpos[2]+tdis-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
898       gMC->Gspos("FCAR",20-icard+ 91,"FAIB",cardpos[0],cardpos[1],     -cardpos[2]+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,         0,"ONLY");
899       gMC->Gspos("FALP",20-icard+ 91,"FAIB",cardpos[0],   aplpos1,        -aplpos2+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,         0,"ONLY");
900       gMC->Gspos("FTUB",20-icard+ 91,"FAIB",        0.,cardpos[1],-cardpos[2]-tdis+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
901     }
902   }
903
904 }
905 //_____________________________________________________________________________
906 void AliTOFv5T0::DrawModule() const
907 {
908   //
909   // Draw a shaded view of the Time Of Flight version 4
910   //
911
912   // Set everything unseen
913   gMC->Gsatt("*", "seen", -1);
914
915   //
916   //Set volumes visible
917   // 
918
919   //Set ALIC mother transparent
920   gMC->Gsatt("ALIC","SEEN", 0);
921
922 //=====> Level 1
923   // Level 1 for TOF volumes
924   gMC->Gsatt("B077","seen", 0);
925
926 //=====> Level 2
927   // Level 2 for TOF volumes
928   gMC->Gsatt("B071","seen", 0);
929   gMC->Gsatt("B074","seen", 0);
930   gMC->Gsatt("B075","seen", 0);
931   gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
932   gMC->Gsatt("B080","seen", 0);  // B080 does not has sub-level                
933
934   // Level 2 of B071
935   gMC->Gsatt("B056","seen", 0);  // B056 does not has sub-levels  -
936   gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped   -
937   gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped   -
938   gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped   -
939   gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped   -
940
941   gMC->Gsatt("BTR1","seen", 0);  // all BTR1 sub-levels skipped   -
942   gMC->Gsatt("BTO1","seen", 0);
943
944   // Level 2 of B074
945   gMC->Gsatt("BTR2","seen", 0);  // all BTR1 sub-levels skipped   -
946   gMC->Gsatt("BTO2","seen", 0);
947
948   // Level 2 of B075
949   gMC->Gsatt("BTR3","seen", 0);  // all BTR1 sub-levels skipped   -
950   gMC->Gsatt("BTO3","seen", 0);
951
952   // Level 3 of B071, B074 and B075
953   gMC->Gsatt("FTOA","SEEN", 0);
954   if (fTOFHoles) gMC->Gsatt("FTOB","SEEN", 0);
955
956   // Level 4 of B071, B074 and B075
957   gMC->Gsatt("FLTA","SEEN", 0);
958   if (fTOFHoles) gMC->Gsatt("FLTB","SEEN",0);
959   if (fTOFHoles) gMC->Gsatt("FLTC","SEEN",0);
960
961   // Level 5 of B071, B074 and B075
962   gMC->Gsatt("FAIA","SEEN",-1);  // all FAIA sub-levels skipped   -
963   if (fTOFHoles) gMC->Gsatt("FAIB","SEEN",-1);  // all FAIB sub-levels skipped   -
964   if (fTOFHoles) gMC->Gsatt("FAIC","SEEN",-1);  // all FAIC sub-levels skipped   -
965
966   gMC->Gsatt("FALA","SEEN", 0);
967   if (fTOFHoles) gMC->Gsatt("FALB","SEEN", 0);
968
969   gMC->Gsatt("FPEA","SEEN", 1);
970   if (fTOFHoles) gMC->Gsatt("FPEB","SEEN", 1);
971
972   gMC->Gsatt("FSTR","SEEN",-1);  // all FSTR sub-levels skipped   -
973
974   gMC->Gsatt("FWZ1","SEEN", 0);
975   gMC->Gsatt("FWZ2","SEEN", 0);
976   gMC->Gsatt("FWZ3","SEEN", 0);
977   gMC->Gsatt("FWZ4","SEEN", 0);
978   if (fTOFHoles) {
979     gMC->Gsatt("FZ1B","SEEN", 0);
980     gMC->Gsatt("FZ1C","SEEN", 0);
981     gMC->Gsatt("FZ2B","SEEN", 0);
982   }
983
984   gMC->Gdopt("hide", "on");
985   gMC->Gdopt("shad", "on");
986   gMC->Gsatt("*", "fill", 7);
987   gMC->SetClipBox(".");
988   gMC->SetClipBox("*", 100, 1000, 100, 1000, 100, 1000);
989   gMC->DefaultRange();
990   gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
991   gMC->Gdhead(1111, "Time Of Flight");
992   gMC->Gdman(18, 3, "MAN");
993   gMC->Gdopt("hide","off");
994 }
995 //_____________________________________________________________________________
996 void AliTOFv5T0::DrawDetectorModules() const
997 {
998   //
999   // Draw a shaded view of the TOF detector version 4
1000   //
1001  
1002   // Set everything unseen
1003   gMC->Gsatt("*", "seen", -1);
1004
1005   //
1006   //Set volumes visible
1007   // 
1008
1009   //Set ALIC mother transparent
1010   gMC->Gsatt("ALIC","SEEN", 0);
1011
1012 //=====> Level 1
1013   // Level 1 for TOF volumes
1014   gMC->Gsatt("B077","seen", 0);
1015
1016 //=====> Level 2
1017   // Level 2 for TOF volumes
1018   gMC->Gsatt("B071","seen", 0);
1019   gMC->Gsatt("B074","seen", 0);
1020   gMC->Gsatt("B075","seen", 0);
1021   gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
1022   gMC->Gsatt("B080","seen", 0);  // B080 does not has sub-level                
1023
1024   // Level 2 of B071
1025   gMC->Gsatt("B056","seen", 0);  // B056 does not has sub-levels  -
1026   gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped   -
1027   gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped   -
1028   gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped   -
1029   gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped   -
1030
1031   gMC->Gsatt("BTR1","seen", 0);  // all BTR1 sub-levels skipped   -
1032   gMC->Gsatt("BTO1","seen", 0);
1033
1034   // Level 2 of B074
1035   gMC->Gsatt("BTR2","seen", 0);  // all BTR1 sub-levels skipped   -
1036   gMC->Gsatt("BTO2","seen", 0);
1037
1038   // Level 2 of B075
1039   gMC->Gsatt("BTR3","seen", 0);  // all BTR1 sub-levels skipped   -
1040   gMC->Gsatt("BTO3","seen", 0);
1041
1042   // Level 3 of B071, B075 and B074
1043   gMC->Gsatt("FTOA","seen",-2);  // all FTOA sub-levels skipped   -
1044   if (fTOFHoles) {
1045     gMC->Gsatt("FTOB","seen",-2);  // all FTOB sub-levels skipped   -
1046     gMC->Gsatt("FTOC","seen",-2);  // all FTOC sub-levels skipped   -
1047   }
1048
1049   gMC->Gdopt("hide","on");
1050   gMC->Gdopt("shad","on");
1051   gMC->Gsatt("*", "fill", 5);
1052   gMC->SetClipBox(".");
1053   gMC->SetClipBox("*", 100, 1000, 100, 1000, 0, 1000);
1054   gMC->DefaultRange();
1055   gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
1056   gMC->Gdhead(1111,"TOF detector");
1057   gMC->Gdman(18, 3, "MAN");
1058   gMC->Gdopt("hide","off");
1059 }                                 
1060
1061 //_____________________________________________________________________________
1062 void AliTOFv5T0::DrawDetectorStrips() const
1063 {
1064   //
1065   // Draw a shaded view of the TOF strips for version 4
1066   //
1067
1068   // Set everything unseen
1069   gMC->Gsatt("*", "seen", -1);
1070
1071   //
1072   //Set volumes visible
1073   // 
1074   
1075   //Set ALIC mother transparent
1076   gMC->Gsatt("ALIC","SEEN", 0);
1077   
1078 //=====> Level 1
1079   // Level 1 for TOF volumes
1080   gMC->Gsatt("B077","seen", 0);
1081
1082 //=====> Level 2
1083   // Level 2 for TOF volumes
1084   gMC->Gsatt("B071","seen", 0);
1085   gMC->Gsatt("B074","seen", 0);
1086   gMC->Gsatt("B075","seen", 0);
1087   gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
1088   gMC->Gsatt("B080","seen", 0);  // B080 does not has sub-level                
1089
1090   // Level 2 of B071
1091   gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped   -
1092   gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped   -
1093   gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped   -
1094   gMC->Gsatt("B056","seen", 0);  // B056 does not has sub-levels  -
1095   gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped   -
1096
1097   gMC->Gsatt("BTR1","seen", 0);  // all BTR1 sub-levels skipped   -
1098   gMC->Gsatt("BTO1","seen", 0);
1099
1100   // Level 2 of B074
1101   gMC->Gsatt("BTR2","seen", 0);  // all BTR1 sub-levels skipped   -
1102   gMC->Gsatt("BTO2","seen", 0);
1103
1104   // Level 2 of B075
1105   gMC->Gsatt("BTR3","seen", 0);  // all BTR1 sub-levels skipped   -
1106   gMC->Gsatt("BTO3","seen", 0);
1107
1108   // Level 3 of B071, B074 and B075
1109   gMC->Gsatt("FTOA","SEEN", 0);
1110   if (fTOFHoles) {
1111     gMC->Gsatt("FTOB","SEEN", 0);
1112     gMC->Gsatt("FTOC","SEEN", 0);
1113   }
1114
1115   // Level 4 of B071, B074 and B075
1116   gMC->Gsatt("FLTA","SEEN", 0);
1117   if (fTOFHoles) {
1118     gMC->Gsatt("FLTB","SEEN", 0);
1119     gMC->Gsatt("FLTC","SEEN", 0);
1120   }
1121
1122   // Level 5 of B071, B074 and B075
1123   gMC->Gsatt("FAIA","SEEN",-1);  // all FAIA sub-levels skipped   -
1124   if (fTOFHoles) {
1125     gMC->Gsatt("FAIB","SEEN",-1);  // all FAIB sub-levels skipped   -
1126     gMC->Gsatt("FAIC","SEEN",-1);  // all FAIC sub-levels skipped   -
1127   }
1128
1129   gMC->Gsatt("FALA","SEEN", 0);
1130   if (fTOFHoles) gMC->Gsatt("FALB","SEEN", 0);
1131
1132   gMC->Gsatt("FPEA","SEEN", 0);
1133   if (fTOFHoles) gMC->Gsatt("FPEB","SEEN", 0);
1134
1135   gMC->Gsatt("FSTR","SEEN",-2);  // all FSTR sub-levels skipped   -
1136
1137   gMC->Gsatt("FWZ1","SEEN", 0);
1138   gMC->Gsatt("FWZ2","SEEN", 0);
1139   gMC->Gsatt("FWZ3","SEEN", 0);
1140   gMC->Gsatt("FWZ4","SEEN", 0);
1141   if (fTOFHoles){
1142     gMC->Gsatt("FZ1B","SEEN", 0);
1143     gMC->Gsatt("FZ1C","SEEN", 0);
1144     gMC->Gsatt("FZ2B","SEEN", 0);
1145   }
1146
1147   /*
1148   // Level 2 of FAIA
1149   // Level 2 of FAIB
1150   // Level 2 of FAIC
1151   gMC->Gsatt("FALP","SEEN",0);
1152   gMC->Gsatt("FCAR","SEEN",0);
1153   gMC->Gsatt("FTUB","SEEN",-1);  // all FTUB sub-levels skipped   -
1154
1155   // Level 2 of FTUB
1156   gMC->Gsatt("FITU","SEEN",0);
1157   */
1158
1159   /*
1160   // Level 2 of FSTR
1161   gMC->Gsatt("FGLF","SEEN",0);
1162   gMC->Gsatt("FHON","SEEN",0);
1163   gMC->Gsatt("FPC1","SEEN",0);
1164   gMC->Gsatt("FPC2","SEEN",0);
1165   gMC->Gsatt("FPCB","SEEN",0);
1166   gMC->Gsatt("FRGL","SEEN",0);
1167
1168   // Level 2 of FPCB => Level 3 of FSTR
1169   gMC->Gsatt("FSEN","SEEN",0);
1170   gMC->Gsatt("FSEZ","SEEN",0);
1171   gMC->Gsatt("FPAD","SEEN",1);
1172   */
1173
1174   gMC->Gdopt("hide","on");
1175   gMC->Gdopt("shad","on");
1176   gMC->Gsatt("*", "fill", 5);
1177   gMC->SetClipBox(".");
1178   gMC->SetClipBox("*", 0, 1000, 0, 1000, 0, 1000);
1179   gMC->DefaultRange();
1180   gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
1181   gMC->Gdhead(1111,"TOF Strips");
1182   gMC->Gdman(18, 3, "MAN");
1183   gMC->Gdopt("hide","off");
1184 }
1185
1186 //_____________________________________________________________________________
1187 void AliTOFv5T0::CreateMaterials()
1188 {
1189   //
1190   // Define materials for the Time Of Flight
1191   //
1192
1193   //AliTOF::CreateMaterials();
1194
1195   AliMagF *magneticField = (AliMagF*)gAlice->Field();
1196
1197   Int_t   isxfld = magneticField->Integ();
1198   Float_t sxmgmx = magneticField->Max();
1199
1200   Float_t we[7], ae[7], na[7], fr[7], vl[7];
1201   Int_t i;
1202
1203   //--- Quartz (SiO2) to simulate float glass
1204   //    density tuned to have correct float glass 
1205   //    radiation length
1206   Float_t   aq[2] = { 28.0855,15.9994 };
1207   Float_t   zq[2] = { 14.,8. };
1208   Float_t   wq[2] = { 1.,2. };
1209   Float_t   dq = 2.55; // std value: 2.2
1210   Int_t nq = -2;
1211
1212   // --- Nomex
1213   Float_t anox[4] = {12.01,1.01,16.00,14.01};
1214   Float_t znox[4] = { 6.,  1.,  8.,  7.};
1215   Float_t wnox[4] = {14., 22., 2., 2.};
1216   Float_t dnox  = 0.048;
1217   Int_t nnox   = -4;
1218
1219   //  { Si, C, H, O }
1220   Float_t ag10[4] = {28.09,12.01,1.01,16.00};
1221   Float_t zg10[4] = {14.,  6.,  1.,  8.};
1222   Float_t wmatg10[4];
1223   Int_t nlmatg10  = 4;
1224   for (i = 0; i < nlmatg10; ++i) {
1225     ae[i] = ag10[i];
1226     vl[i] = 1.;
1227   }
1228   ae[4] = 16.00;
1229   vl[4] = 1.;
1230   na[0] = 1.; 
1231   na[1] = 14.;
1232   na[2] = 20.;
1233   na[3] = 2.;
1234   na[4] = 3.;
1235   fr[0] = 0.6;
1236   fr[1] = 0.4;
1237   fr[2] = 0.4;
1238   fr[3] = 0.6;
1239   fr[4] = 0.4;
1240   MaterialMixer(we,ae,na,fr,vl,5);
1241   we[3] += we[4];
1242   wmatg10[0]= we[0];
1243   wmatg10[1]= we[1];
1244   wmatg10[2]= we[2];
1245   wmatg10[3]= we[3];
1246   Float_t densg10 = 1.7;
1247
1248   // -- Water
1249   Float_t awa[2] = {  1., 16. };
1250   Float_t zwa[2] = {  1.,  8. };
1251   Float_t wwa[2] = {  2.,  1. };
1252   Float_t dwa    = 1.0;
1253   Int_t nwa = -2;
1254
1255   // stainless steel
1256   Float_t asteel[4] = { 55.847,51.9961,58.6934,28.0855 };
1257   Float_t zsteel[4] = { 26.,24.,28.,14. };
1258   Float_t wsteel[4] = { .715,.18,.1,.005 };
1259
1260   // AIR
1261   Float_t aAir[4]={12.0107,14.0067,15.9994,39.948};
1262   Float_t zAir[4]={6.,7.,8.,18.};
1263   Float_t wAir[4]={0.000124,0.755267,0.231781,0.012827};
1264   Float_t dAir = 1.20479E-3;
1265
1266   // --- fibre glass
1267   Float_t afg[4] = {28.09,16.00,12.01,1.01};
1268   Float_t zfg[4] = {14., 8., 6., 1.};
1269   Float_t wfg[4] = {0.12906,0.29405,0.51502,0.06187};
1270   Float_t dfg  = 1.111;
1271   Int_t nfg   = 4;
1272
1273   // --- Freon C2F4H2 + SF6
1274   Float_t afre[4]= {12.01,1.01,19.00,32.07};
1275   Float_t zfre[4]= { 6., 1., 9., 16.};
1276   Float_t wfre[4]= {0.21250,0.01787,0.74827,0.021355};
1277   Float_t densfre= 0.00375;
1278   Int_t nfre  = 4;
1279
1280   //char namat[15] = "            ";
1281   //Float_t ama[2], zma[2], dma, radl, absl, buf[1];
1282   //Int_t nbuf;
1283
1284   AliMixture ( 0, "Air$", aAir, zAir, dAir, 4, wAir);
1285   AliMixture ( 1, "Nomex$", anox, znox, dnox, nnox, wnox);
1286   AliMixture ( 2, "G10$", ag10, zg10, densg10, nlmatg10, wmatg10);
1287   AliMixture ( 3, "fibre glass$", afg, zfg, dfg, nfg, wfg);
1288   AliMaterial( 4, "Al $", 26.98, 13., 2.7, 8.9, 37.2);
1289   AliMaterial( 5, "Al honeycomb$", 26.98, 13., 0.0496, 483., 2483.);
1290   AliMixture ( 6, "Freon$",  afre, zfre, densfre, nfre, wfre);
1291   AliMixture ( 7, "Glass$", aq, zq, dq, nq, wq);
1292   /*
1293   // get freon and glass
1294   gMC->Gfmate((*fIdmate)[6],namat,ama[0],zma[0],dma,radl,absl,buf,nbuf);
1295   gMC->Gfmate((*fIdmate)[7],namat,ama[1],zma[1],dma,radl,absl,buf,nbuf);
1296
1297   // --- glass-freon
1298   Float_t wgfr[2]= {0.0011,0.9989};
1299   Float_t dgfr = 1.434;
1300   Int_t ngfr  = 2;
1301   AliMixture ( 8, "glass-freon$", ama, zma, dgfr, ngfr, wgfr);
1302   */
1303   AliMixture ( 9, "Water$",  awa, zwa, dwa, nwa, wwa);
1304   AliMixture (10, "STAINLESS STEEL$", asteel, zsteel, 7.88, 4, wsteel);
1305
1306   Float_t epsil, stmin, deemax, stemax;
1307  
1308   //   Previous data
1309   //       EPSIL  = 0.1   ! Tracking precision,
1310   //       STEMAX = 0.1   ! Maximum displacement for multiple scattering
1311   //       DEEMAX = 0.1   ! Maximum fractional energy loss, DLS
1312   //       STMIN  = 0.1
1313
1314   //   New data
1315   epsil  = .001;  // Tracking precision,
1316   stemax = -1.;   // Maximum displacement for multiple scattering
1317   deemax = -.3;   // Maximum fractional energy loss, DLS
1318   stmin  = -.8;
1319
1320   AliMedium( 1, "Air$",         0, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1321   AliMedium( 2,"Nomex$",        1, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1322   AliMedium( 3,"G10$",          2, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1323   AliMedium( 4,"fibre glass$",  3, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1324   //AliMedium( 5,"glass-freon$",  8, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1325   AliMedium( 6,"Al Frame$",     4, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1326   AliMedium( 7,"Al honeycomb$", 5, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1327   AliMedium( 8,"Fre$",          6, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1328   AliMedium( 9,"PCB-S$",        2, 1, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1329   AliMedium(10,"Glass$",        7, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1330   AliMedium(11,"Water$",        9, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1331   AliMedium(12,"STEEL$",       10, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1332
1333 }
1334 //_____________________________________________________________________________
1335 void AliTOFv5T0::Init()
1336 {
1337   //
1338   // Initialise the detector after the geometry has been defined
1339   //
1340   AliDebug(1, "**************************************"
1341            "  TOF  "
1342            "**************************************");
1343   AliDebug(1, "  Version 4 of TOF initialing, "
1344            "symmetric TOF - Full Coverage version");
1345   
1346   AliTOF::Init();
1347   
1348   fIdFTOA = gMC->VolId("FTOA");
1349   if (fTOFHoles) {
1350     fIdFTOB = gMC->VolId("FTOB");
1351     fIdFTOC = gMC->VolId("FTOC");
1352   }
1353   fIdFLTA = gMC->VolId("FLTA");
1354   if (fTOFHoles) {
1355     fIdFLTB = gMC->VolId("FLTB");
1356     fIdFLTC = gMC->VolId("FLTC");
1357   }
1358
1359   AliDebug(1, "**************************************"
1360            "  TOF  "
1361            "**************************************");
1362 }
1363  
1364 //_____________________________________________________________________________
1365 void AliTOFv5T0::StepManager()
1366 {
1367
1368   //
1369   // Procedure called at each step in the Time Of Flight
1370   //
1371
1372   TLorentzVector mom, pos;
1373   Float_t xm[3],pm[3],xpad[3],ppad[3];
1374   Float_t hits[14];
1375   Int_t   vol[5];
1376   Int_t   sector, plate, padx, padz, strip;
1377   Int_t   copy, padzid, padxid, stripid, i;
1378   Int_t   *idtmed = fIdtmed->GetArray()-499;
1379   Float_t incidenceAngle;
1380
1381   const char* volpath;
1382
1383   Int_t index = 0;
1384
1385   if(
1386      gMC->IsTrackEntering()
1387      && gMC->TrackCharge()
1388      //&& gMC->GetMedium()==idtmed[508]
1389      && gMC->CurrentMedium()==idtmed[508]
1390      && gMC->CurrentVolID(copy)==fIdSens
1391      )
1392   {
1393
1394     AliMC *mcApplication = (AliMC*)gAlice->GetMCApp();
1395
1396     AddTrackReference(mcApplication->GetCurrentTrackNumber());
1397     //AddTrackReference(gAlice->GetMCApp()->GetCurrentTrackNumber());
1398
1399     // getting information about hit volumes
1400     
1401     padzid=gMC->CurrentVolOffID(1,copy);
1402     padz=copy;
1403     padz--;
1404
1405     padxid=gMC->CurrentVolOffID(0,copy);
1406     padx=copy; 
1407     padx--;
1408     
1409     stripid=gMC->CurrentVolOffID(4,copy);
1410     strip=copy; 
1411     strip--;
1412
1413     gMC->TrackPosition(pos);
1414     gMC->TrackMomentum(mom);
1415
1416     Double_t normMom=1./mom.Rho();
1417
1418     //  getting the coordinates in pad ref system
1419
1420     xm[0] = (Float_t)pos.X();
1421     xm[1] = (Float_t)pos.Y();
1422     xm[2] = (Float_t)pos.Z();
1423
1424     pm[0] = (Float_t)mom.X()*normMom;
1425     pm[1] = (Float_t)mom.Y()*normMom;
1426     pm[2] = (Float_t)mom.Z()*normMom;
1427  
1428     gMC->Gmtod(xm,xpad,1); // from MRS to DRS: coordinates convertion
1429     gMC->Gmtod(pm,ppad,2); // from MRS to DRS: direction cosinus convertion
1430
1431
1432     if (TMath::Abs(ppad[1])>1) {
1433       AliWarning("Abs(ppad) > 1");
1434       ppad[1]=TMath::Sign((Float_t)1,ppad[1]);
1435     }
1436     incidenceAngle = TMath::ACos(ppad[1])*kRaddeg;
1437
1438     plate = -1;
1439     if      (strip <  fTOFGeometry->NStripC()) {
1440       plate = 0;
1441       //strip = strip;
1442     }
1443     else if (strip >= fTOFGeometry->NStripC() && 
1444              strip <  fTOFGeometry->NStripC() + fTOFGeometry->NStripB()) {
1445       plate = 1;
1446       strip = strip - fTOFGeometry->NStripC();
1447     }
1448     else if (strip >= fTOFGeometry->NStripC() + fTOFGeometry->NStripB() &&
1449              strip <  fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA()) {
1450       plate = 2;
1451       strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB();
1452     }
1453     else if (strip >= fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA() &&
1454              strip <  fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA() + fTOFGeometry->NStripB()) {
1455       plate = 3;
1456       strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB() - fTOFGeometry->NStripA();
1457     }
1458     else                                {
1459       plate = 4;
1460       strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB() - fTOFGeometry->NStripA() - fTOFGeometry->NStripB();
1461     }
1462
1463     volpath=gMC->CurrentVolOffName(7);
1464     index=atoi(&volpath[4]);
1465     sector=-1;
1466   
1467     if(index<5){
1468       sector=index+13;
1469         }
1470     else{
1471       sector=index-5;
1472     } 
1473  
1474     for(i=0;i<3;++i) {
1475       hits[i]   = pos[i];
1476       hits[i+3] = pm[i];
1477     }
1478
1479     hits[6] = mom.Rho();
1480     hits[7] = pos[3];
1481     hits[8] = xpad[0];
1482     hits[9] = xpad[1];
1483     hits[10]= xpad[2];
1484     hits[11]= incidenceAngle;
1485     hits[12]= gMC->Edep();
1486     hits[13]= gMC->TrackLength();
1487     
1488     vol[0]= sector;
1489     vol[1]= plate;
1490     vol[2]= strip;
1491     vol[3]= padx;
1492     vol[4]= padz;    
1493
1494     AddT0Hit(mcApplication->GetCurrentTrackNumber(),vol, hits);
1495     //AddT0Hit(gAlice->GetMCApp()->GetCurrentTrackNumber(),vol, hits);
1496   }
1497 }
1498 //-------------------------------------------------------------------
1499 void AliTOFv5T0::MaterialMixer(Float_t* p,Float_t* a,Float_t* m,Float_t* d,Float_t* s,Int_t n) const
1500 {
1501   // a[] atomic weights vector  (in)
1502   //     (atoms present in more compound appear separately)
1503   // m[] number of corresponding atoms in the mixture  (in)
1504   // d[] fraction of the compound relative to the corresponding atoms  (in)
1505   // s[] further possible weights     "        "        "        "     (in)
1506   Float_t t = 0.;
1507   for (Int_t i = 0; i < n; ++i) {
1508     p[i] = a[i]*m[i]*d[i]*s[i];
1509     t  += p[i];
1510   }
1511   for (Int_t i = 0; i < n; ++i) {
1512     p[i] = p[i]/t;
1513     //    AliInfo(Form((\n weight[%i] = %f (,i,p[i]));
1514   }
1515 }