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