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