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