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