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