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