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