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