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