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