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