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