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