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