1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
18 Revision 1.5 2006/03/20 07:54:20 decaro
19 Correction of some layer thickness
21 Revision 1.4 2006/03/13 12:35:44 decaro
22 Suppression of fractional Z warning
24 Revision 1.3 2006/02/28 10:38:00 decaro
25 AliTOFGeometry::fAngles, AliTOFGeometry::fHeights,
26 AliTOFGeometry::fDistances arrays: dimension definition in the right
29 Revision 1.2 2006/02/27 18:12:14 decaro
30 Remove in StepManager the dependence of hit indexes from parametrized
33 Revision 1.1 2005/12/15 08:55:33 decaro
34 New TOF geometry description (V5) -G. Cara Romeo and A. De Caro
37 Revision 0.1 2004 November G. Cara Romeo and A. De Caro
38 Implement new TOF geometry version
40 suppress few volume overlaps
41 (in the 4th TOF geometry version),
42 insert the realistic strip numbers and positions
46 ///////////////////////////////////////////////////////////////////////////////
48 // This class contains the functions for version 5 of the Time Of Flight //
51 // VERSION WITH 5 MODULES AND TILTED STRIPS //
53 // FULL COVERAGE VERSION + OPTION for PHOS holes //
58 <img src="picts/AliTOFv5T0Class.gif"> //
62 ///////////////////////////////////////////////////////////////////////////////
64 #include "Riostream.h"
67 #include "TVirtualMC.h"
69 #include <TGeometry.h>
70 #include <TLorentzVector.h>
73 #include <TVirtualMC.h>
81 #include "AliTOFGeometry.h"
82 #include "AliTOFGeometryV5.h"
83 #include "AliTOFv5T0.h"
87 //_____________________________________________________________________________
88 AliTOFv5T0::AliTOFv5T0()
91 // Default constructor
95 //_____________________________________________________________________________
96 AliTOFv5T0::AliTOFv5T0(const char *name, const char *title)
97 : AliTOF(name,title,"tzero")
100 // Standard constructor
103 // Check that FRAME is there otherwise we have no place where to
107 AliModule* frame=gAlice->GetModule("FRAME");
109 AliFatal("TOF needs FRAME to be present");
112 if (fTOFGeometry) delete fTOFGeometry;
113 fTOFGeometry = new AliTOFGeometryV5();
115 if(frame->IsVersion()==1) {
116 AliInfo(Form("Frame version %d", frame->IsVersion()));
117 AliInfo("Full Coverage for TOF");
120 AliInfo(Form("Frame version %d", frame->IsVersion()));
121 AliInfo("TOF with Holes for PHOS");
124 fTOFGeometry->SetHoles(fTOFHoles);
126 //AliTOF::fTOFGeometry = fTOFGeometry;
129 TDirectory* saveDir = gDirectory;
130 gAlice->GetRunLoader()->CdGAFile();
131 fTOFGeometry->Write("TOFgeometry");
136 //____________________________________________________________________________
137 void AliTOFv5T0::BuildGeometry()
140 // Build TOF ROOT geometry for the ALICE event display
143 const int kColorTOF = 27;
146 top = gAlice->GetGeometry()->GetNode("alice");
148 // Position the different copies
149 const Float_t krTof =(fTOFGeometry->Rmax()+fTOFGeometry->Rmin())/2.;
150 const Float_t khTof = fTOFGeometry->Rmax()-fTOFGeometry->Rmin();
151 const Int_t kNTof = fTOFGeometry->NSectors();
152 const Float_t kangle = k2PI/kNTof;
154 const Float_t kInterCentrModBorder1 = 49.5;
155 const Float_t kInterCentrModBorder2 = 57.5;
159 // define offset for nodes
160 Float_t zOffsetB = (fTOFGeometry->ZlenA()*0.5 + (kInterCentrModBorder1+kInterCentrModBorder2)*0.5)*0.5;
161 Float_t zOffsetA = 0.;
162 // Define TOF basic volume
164 char nodeName0[7], nodeName1[7], nodeName2[7];
165 char nodeName3[7], nodeName4[7], rotMatNum[7];
168 new TBRIK("S_TOF_B","TOF box","void",
169 fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenB()*0.5);
170 new TBRIK("S_TOF_C","TOF box","void",
171 fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenB()*0.5);
173 new TBRIK("S_TOF_A","TOF box","void",
174 fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenA()*0.5);
176 for (Int_t nodeNum=1;nodeNum<19;nodeNum++){
179 sprintf(rotMatNum,"rot50%i",nodeNum);
180 sprintf(nodeName0,"FTO00%i",nodeNum);
181 sprintf(nodeName1,"FTO10%i",nodeNum);
182 sprintf(nodeName2,"FTO20%i",nodeNum);
183 sprintf(nodeName3,"FTO30%i",nodeNum);
184 sprintf(nodeName4,"FTO40%i",nodeNum);
187 sprintf(rotMatNum,"rot5%i",nodeNum);
188 sprintf(nodeName0,"FTO0%i",nodeNum);
189 sprintf(nodeName1,"FTO1%i",nodeNum);
190 sprintf(nodeName2,"FTO2%i",nodeNum);
191 sprintf(nodeName3,"FTO3%i",nodeNum);
192 sprintf(nodeName4,"FTO4%i",nodeNum);
195 new TRotMatrix(rotMatNum,rotMatNum,90,-20*nodeNum,90,90-20*nodeNum,0,0);
196 ang = (4.5-nodeNum) * kangle;
200 node = new TNode(nodeName2,nodeName2,"S_TOF_B", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang), zOffsetB,rotMatNum);
201 node->SetLineColor(kColorTOF);
205 node = new TNode(nodeName3,nodeName3,"S_TOF_C", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang),-zOffsetB,rotMatNum);
206 node->SetLineColor(kColorTOF);
211 node = new TNode(nodeName4,nodeName4,"S_TOF_A", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang), zOffsetA,rotMatNum);
212 node->SetLineColor(kColorTOF);
214 } // end loop on nodeNum
218 //_____________________________________________________________________________
219 void AliTOFv5T0::CreateGeometry()
222 // Create geometry for Time Of Flight version 0
226 <img src="picts/AliTOFv5T0.gif">
230 // Creates common geometry
232 AliTOF::CreateGeometry();
236 //_____________________________________________________________________________
237 void AliTOFv5T0::TOFpc(Float_t xtof, Float_t ytof, Float_t zlenA,
241 const Float_t kPi = TMath::Pi();
243 const Float_t kInterCentrModBorder1 = 49.5;
244 const Float_t kInterCentrModBorder2 = 57.5;
245 const Float_t kExterInterModBorder1 = 196.0;
246 const Float_t kExterInterModBorder2 = 203.5;
248 const Float_t kLengthExInModBorder = 4.7;
249 const Float_t kLengthInCeModBorder = 7.0;
251 // Al layers over all internal module walls (cm)
252 const Float_t khAlWall = 0.03;
254 // module wall thickness (cm)
255 const Float_t kModuleWallThickness = 0.3;
257 // Al honeycomb layer between strips and cards (cm)
258 const Float_t kHoneycombLayerThickness = 1.5;
260 AliDebug(2,Form("zlenA*0.5 = %d", zlenA*0.5));
261 AliDebug(1, "************************* TOF geometry **************************");
263 // Definition of the Time Of Fligh Resistive Plate Chambers
264 // xFLT, yFLT, zFLT - sizes of TOF modules (large)
266 Float_t xcoor, ycoor, zcoor;
268 Int_t *idtmed = fIdtmed->GetArray()-499;
273 par[2] = zlenA * 0.5;
274 gMC->Gsvolu("FTOA", "BOX ", idtmed[503], par, 3); // fibre glass
279 par[2] = (zlenA*0.5 - kInterCentrModBorder1)*0.5;
280 gMC->Gsvolu("FTOB", "BOX ", idtmed[503], par, 3); // fibre glass
281 gMC->Gsvolu("FTOC", "BOX ", idtmed[503], par, 3); // fibre glass
284 // Positioning of fibre glass modules (FTOA, FTOB and FTOC)
286 //AliMatrix(idrotm[0], 90., 0., 0., 0., 90.,-90.);
287 AliMatrix(idrotm[0], 90., 0., 0., 0., 90.,270.);
292 gMC->Gspos("FTOA", 0, "BTO1", xcoor, ycoor, zcoor, idrotm[0], "ONLY");
293 gMC->Gspos("FTOA", 0, "BTO3", xcoor, ycoor, zcoor, idrotm[0], "ONLY");
297 ycoor = (zlenA*0.5 + kInterCentrModBorder1)*0.5;
299 gMC->Gspos("FTOB", 0, "BTO2", xcoor, ycoor, zcoor, idrotm[0], "ONLY");
300 gMC->Gspos("FTOC", 0, "BTO2", xcoor,-ycoor, zcoor, idrotm[0], "ONLY");
302 else gMC->Gspos("FTOA", 0, "BTO2", xcoor, ycoor, zcoor, idrotm[0], "ONLY");
304 // Large not sensitive volumes with Insensitive Freon (FLTA, FLTB and FLTC)
306 Float_t xFLT, yFLT, zFLTA;
308 xFLT = xtof - kModuleWallThickness*2.;
309 yFLT = ytof - kModuleWallThickness*2.;
310 zFLTA = zlenA - kModuleWallThickness*2.;
315 gMC->Gsvolu("FLTA", "BOX ", idtmed[507], par, 3); // Freon mix
320 gMC->Gspos ("FLTA", 0, "FTOA", xcoor, ycoor, zcoor, 0, "ONLY");
325 par[2] = (zlenA*0.5 - kInterCentrModBorder1-kModuleWallThickness)*0.5;
326 gMC->Gsvolu("FLTB", "BOX ", idtmed[507], par, 3); // Freon mix
327 gMC->Gsvolu("FLTC", "BOX ", idtmed[507], par, 3); // Freon mix
331 zcoor = kModuleWallThickness*0.5;
332 gMC->Gspos ("FLTB", 0, "FTOB", xcoor, ycoor, zcoor, 0, "ONLY");
333 gMC->Gspos ("FLTC", 0, "FTOC", xcoor, ycoor,-zcoor, 0, "ONLY");
336 // Layer of Aluminum before detector (FALA, FALB and FALC)
339 par[1] = khAlWall*0.5;
340 par[2] = kInterCentrModBorder1 - (kModuleWallThickness + khAlWall);
341 gMC->Gsvolu("FALA", "BOX ", idtmed[505], par, 3); // Alluminium
344 ycoor = (-yFLT + khAlWall)*0.5;
346 gMC->Gspos ("FALA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
349 par[1] = khAlWall*0.5;
350 par[2] = (kExterInterModBorder2 - kInterCentrModBorder1 - 2.*(kModuleWallThickness + khAlWall))*0.5;
351 gMC->Gsvolu("FALB", "BOX ", idtmed[505], par, 3); // Alluminium
354 ycoor = (-yFLT + khAlWall)*0.5;
355 zcoor = (kExterInterModBorder2 + kInterCentrModBorder1)*0.5;
356 gMC->Gspos ("FALB", 1, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
357 gMC->Gspos ("FALB", 2, "FLTA", xcoor, ycoor,-zcoor, 0, "ONLY");
360 par[1] = khAlWall*0.5;
361 par[2] = (zlenA*0.5 - kExterInterModBorder2 - 2.*(kModuleWallThickness + khAlWall))*0.5;
362 gMC->Gsvolu("FALC", "BOX ", idtmed[505], par, 3); // Alluminium
365 ycoor = (-yFLT + khAlWall)*0.5;
366 zcoor = (kExterInterModBorder2+zlenA*0.5)*0.5;
367 gMC->Gspos ("FALC", 1, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
368 gMC->Gspos ("FALC", 2, "FLTA", xcoor, ycoor,-zcoor, 0, "ONLY");
372 ycoor = (-yFLT + khAlWall)*0.5;
373 zcoor = (zlenA*0.5 - kExterInterModBorder2)*0.5 - kModuleWallThickness*0.5;
374 gMC->Gspos ("FALB", 1, "FLTB", xcoor, ycoor, zcoor, 0, "ONLY");
375 gMC->Gspos ("FALB", 2, "FLTC", xcoor, ycoor,-zcoor, 0, "ONLY");
378 ycoor = (-yFLT + khAlWall)*0.5;
379 zcoor = (kExterInterModBorder2 - kInterCentrModBorder1)*0.5 + kModuleWallThickness*0.5;
380 gMC->Gspos ("FALC", 1, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
381 gMC->Gspos ("FALC", 2, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
384 Float_t y0, alpha, tgal, beta, tgbe, trpa[11];
386 // Fibre glass walls between central and intermediate modules (FWZ1 and FWZ2; holes -> FZ1B, FZ1C, FZ2B)
388 tgal = (yFLT*0.5 - 2.*kLengthInCeModBorder)/(kInterCentrModBorder2 - kInterCentrModBorder1);
389 alpha = TMath::ATan(tgal);
390 beta = (kPi*0.5 - alpha)*0.5;
391 tgbe = TMath::Tan(beta);
395 trpa[3] = kModuleWallThickness;
396 trpa[4] = (kLengthInCeModBorder - kModuleWallThickness*tgbe)*0.5;
397 trpa[5] = (kLengthInCeModBorder + kModuleWallThickness*tgbe)*0.5;
398 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
399 trpa[7] = kModuleWallThickness;
400 trpa[8] = (kLengthInCeModBorder - kModuleWallThickness*tgbe)*0.5;
401 trpa[9] = (kLengthInCeModBorder + kModuleWallThickness*tgbe)*0.5;
402 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
403 gMC->Gsvolu("FWZ1","TRAP", idtmed[503], trpa, 11); // fibre glass
405 AliMatrix (idrotm[1],90., 90.,180.,0.,90.,180.);
406 AliMatrix (idrotm[4],90., 90., 0.,0.,90., 0.);
409 ycoor = -yFLT*0.5 + kLengthInCeModBorder*0.5;
410 zcoor = kInterCentrModBorder1;
411 gMC->Gspos("FWZ1", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[1],"ONLY");
412 gMC->Gspos("FWZ1", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[4],"ONLY");
415 y0 = kLengthInCeModBorder - kModuleWallThickness*0.5*tgbe;
419 trpa[3] = kModuleWallThickness*0.5;
420 trpa[4] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
421 trpa[5] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
422 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
423 trpa[7] = kModuleWallThickness*0.5;
424 trpa[8] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
425 trpa[9] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
426 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
427 gMC->Gsvolu("FZ1B","TRAP", idtmed[503], trpa, 11); // fibre glass
430 ycoor = -yFLT*0.5 + kLengthInCeModBorder*0.5 - kModuleWallThickness*0.25*tgbe;
431 zcoor = -kInterCentrModBorder1 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
432 gMC->Gspos("FZ1B", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[4],"ONLY");
433 gMC->Gspos("FZ1B", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[1],"ONLY");
436 AliMatrix (idrotm[2],90.,270., 0.,0.,90.,180.);
437 AliMatrix (idrotm[5],90.,270.,180.,0.,90., 0.);
440 ycoor = -kLengthInCeModBorder*0.5;
441 zcoor = kInterCentrModBorder2;
442 gMC->Gspos("FWZ1", 3,"FLTA", xcoor, ycoor, zcoor,idrotm[2],"ONLY");
443 gMC->Gspos("FWZ1", 4,"FLTA", xcoor, ycoor,-zcoor,idrotm[5],"ONLY");
446 y0 = kLengthInCeModBorder + kModuleWallThickness*0.5*tgbe;
450 trpa[3] = kModuleWallThickness*0.5;
451 trpa[4] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
452 trpa[5] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
453 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
454 trpa[7] = kModuleWallThickness*0.5;
455 trpa[8] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
456 trpa[9] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
457 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
458 gMC->Gsvolu("FZ1C","TRAP", idtmed[503], trpa, 11); // fibre glass
461 ycoor = -kLengthInCeModBorder*0.5 - kModuleWallThickness*0.25*tgbe;
462 zcoor = -kInterCentrModBorder2 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
463 gMC->Gspos("FZ1C", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[5],"ONLY");
464 gMC->Gspos("FZ1C", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[2],"ONLY");
467 trpa[0] = 0.5*(kInterCentrModBorder2 - kInterCentrModBorder1)/TMath::Cos(alpha);
468 trpa[1] = kModuleWallThickness;
470 trpa[3] = -beta*kRaddeg;
473 gMC->Gsvolu("FWZ2","PARA", idtmed[503], trpa, 6); // fibre glass
475 AliMatrix (idrotm[3], alpha*kRaddeg,90.,90.+alpha*kRaddeg,90.,90.,180.);
476 AliMatrix (idrotm[6],180.-alpha*kRaddeg,90.,90.-alpha*kRaddeg,90.,90., 0.);
480 zcoor = (kInterCentrModBorder2 + kInterCentrModBorder1)*0.5;
481 gMC->Gspos("FWZ2", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[3],"ONLY");
482 gMC->Gspos("FWZ2", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[6],"ONLY");
485 trpa[0] = 0.5*(kInterCentrModBorder2 - kInterCentrModBorder1)/TMath::Cos(alpha);
486 trpa[1] = kModuleWallThickness*0.5;
488 trpa[3] = -beta*kRaddeg;
491 gMC->Gsvolu("FZ2B","PARA", idtmed[503], trpa, 6); // fibre glass
494 ycoor = -yFLT*0.25 - kModuleWallThickness*0.5*tgbe;
495 zcoor = -(kInterCentrModBorder2 + kInterCentrModBorder1)*0.5 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
496 gMC->Gspos("FZ2B", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[6],"ONLY");
497 gMC->Gspos("FZ2B", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[3],"ONLY");
500 // Fibre glass walls between intermediate and lateral modules (FWZ3 and FWZ4)
502 tgal = (yFLT*0.5 - 2.*kLengthExInModBorder)/(kExterInterModBorder2 - kExterInterModBorder1);
503 alpha = TMath::ATan(tgal);
504 beta = (kPi*0.5 - alpha)*0.5;
505 tgbe = TMath::Tan(beta);
509 trpa[3] = kModuleWallThickness;
510 trpa[4] = (kLengthExInModBorder - kModuleWallThickness*tgbe)*0.5;
511 trpa[5] = (kLengthExInModBorder + kModuleWallThickness*tgbe)*0.5;
512 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
513 trpa[7] = kModuleWallThickness;
514 trpa[8] = (kLengthExInModBorder - kModuleWallThickness*tgbe)*0.5;
515 trpa[9] = (kLengthExInModBorder + kModuleWallThickness*tgbe)*0.5;
516 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
517 gMC->Gsvolu("FWZ3","TRAP", idtmed[503], trpa, 11); // fibre glass
520 ycoor = -kLengthExInModBorder*0.5;
521 zcoor = kExterInterModBorder1;
522 gMC->Gspos("FWZ3", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[5],"ONLY");
523 gMC->Gspos("FWZ3", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[2],"ONLY");
527 ycoor = -kLengthExInModBorder*0.5;
528 zcoor = -kExterInterModBorder1 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
529 gMC->Gspos("FWZ3", 5,"FLTB", xcoor, ycoor, zcoor,idrotm[2],"ONLY");
530 gMC->Gspos("FWZ3", 6,"FLTC", xcoor, ycoor,-zcoor,idrotm[5],"ONLY");
534 ycoor = -yFLT*0.5 + kLengthExInModBorder*0.5;
535 zcoor = kExterInterModBorder2;
536 gMC->Gspos("FWZ3", 3,"FLTA", xcoor, ycoor, zcoor,idrotm[4],"ONLY");
537 gMC->Gspos("FWZ3", 4,"FLTA", xcoor, ycoor,-zcoor,idrotm[1],"ONLY");
541 ycoor = -yFLT*0.5 + kLengthExInModBorder*0.5;
542 zcoor = -kExterInterModBorder2 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
543 gMC->Gspos("FWZ3", 7,"FLTB", xcoor, ycoor, zcoor,idrotm[1],"ONLY");
544 gMC->Gspos("FWZ3", 8,"FLTC", xcoor, ycoor,-zcoor,idrotm[4],"ONLY");
547 trpa[0] = 0.5*(kExterInterModBorder2 - kExterInterModBorder1)/TMath::Cos(alpha);
548 trpa[1] = kModuleWallThickness;
550 trpa[3] = -beta*kRaddeg;
553 gMC->Gsvolu("FWZ4","PARA", idtmed[503], trpa, 6); // fibre glass
555 AliMatrix (idrotm[13],alpha*kRaddeg,90.,90.+alpha*kRaddeg,90.,90.,180.);
556 AliMatrix (idrotm[16],180.-alpha*kRaddeg,90.,90.-alpha*kRaddeg,90.,90.,0.);
560 zcoor = (kExterInterModBorder2 + kExterInterModBorder1)*0.5;
561 gMC->Gspos("FWZ4", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[16],"ONLY");
562 gMC->Gspos("FWZ4", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[13],"ONLY");
567 zcoor = -(kExterInterModBorder2 + kExterInterModBorder1)*0.5 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
568 gMC->Gspos("FWZ4", 3,"FLTB", xcoor, ycoor, zcoor,idrotm[13],"ONLY");
569 gMC->Gspos("FWZ4", 4,"FLTC", xcoor, ycoor,-zcoor,idrotm[16],"ONLY");
573 ///////////////// Detector itself //////////////////////
575 const Int_t knx = fTOFGeometry->NpadX(); // number of pads along x
576 const Int_t knz = fTOFGeometry->NpadZ(); // number of pads along z
577 const Float_t kPadX = fTOFGeometry->XPad(); // pad length along x
578 const Float_t kPadZ = fTOFGeometry->ZPad(); // pad length along z
580 // new description for strip volume -double stack strip-
581 // -- all constants are expressed in cm
582 // heigth of different layers
583 const Float_t khhony = 1.0 ; // heigth of HONY Layer
584 const Float_t khpcby = 0.08 ; // heigth of PCB Layer
585 const Float_t khrgly = 0.055 ; // heigth of RED GLASS Layer
587 const Float_t khfiliy = 0.125 ; // heigth of FISHLINE Layer
588 const Float_t khglassy = 0.160*0.5; // heigth of GLASS Layer
589 const Float_t khglfy = khfiliy+2.*khglassy;// heigth of GLASS+FISHLINE Layer
591 const Float_t khcpcby = 0.16 ; // heigth of PCB Central Layer
592 const Float_t kwhonz = 8.1 ; // z dimension of HONEY Layer
593 const Float_t kwpcbz1 = 10.6 ; // z dimension of PCB Lower Layer
594 const Float_t kwpcbz2 = 11.6 ; // z dimension of PCB Upper Layer
595 const Float_t kwcpcbz = 12.4 ; // z dimension of PCB Central Layer
596 const Float_t kwrglz = 8. ; // z dimension of RED GLASS Layer
597 const Float_t kwglfz = 7. ; // z dimension of GLASS+FISHLN Layer
598 const Float_t klsensmx = knx*kPadX; // length of Sensitive Layer
599 const Float_t khsensmy = 0.05;//0.11;//0.16;// heigth of Sensitive Layer
600 const Float_t kwsensmz = knz*kPadZ; // width of Sensitive Layer
602 // heigth of the FSTR Volume (the strip volume)
603 const Float_t khstripy = 2.*khhony+2.*khpcby+4.*khrgly+2.*khglfy+khcpcby;
605 // width of the FSTR Volume (the strip volume)
606 const Float_t kwstripz = kwcpcbz;
607 // length of the FSTR Volume (the strip volume)
608 const Float_t klstripx = fTOFGeometry->StripLength();
610 Float_t parfp[3]={klstripx*0.5,khstripy*0.5,kwstripz*0.5};
611 // Coordinates of the strip center in the strip reference frame;
612 // used for positioning internal strip volumes
613 Float_t posfp[3]={0.,0.,0.};
615 // FSTR volume definition-filling this volume with non sensitive Gas Mixture
616 gMC->Gsvolu("FSTR","BOX",idtmed[507],parfp,3); // Freon mix
618 //-- HONY Layer definition
619 parfp[1] = khhony*0.5;
620 parfp[2] = kwhonz*0.5;
621 gMC->Gsvolu("FHON","BOX",idtmed[501],parfp,3); // honeycomb (Nomex)
622 // positioning 2 HONY Layers on FSTR volume
623 posfp[1] =-khstripy*0.5+parfp[1];
624 gMC->Gspos("FHON",1,"FSTR",0., posfp[1],0.,0,"ONLY");
625 gMC->Gspos("FHON",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
627 //-- PCB Layer definition
628 parfp[1] = khpcby*0.5;
629 parfp[2] = kwpcbz1*0.5;
630 gMC->Gsvolu("FPC1","BOX",idtmed[502],parfp,3); // G10
631 parfp[2] = kwpcbz2*0.5;
632 gMC->Gsvolu("FPC2","BOX",idtmed[502],parfp,3); // G10
633 // positioning 2 PCB Layers on FSTR volume
634 posfp[1] =-khstripy*0.5+khhony+parfp[1];
635 gMC->Gspos("FPC1",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
636 gMC->Gspos("FPC2",1,"FSTR",0., posfp[1],0.,0,"ONLY");
638 //-- central PCB layer definition
639 parfp[1] = khcpcby*0.5;
640 parfp[2] = kwcpcbz*0.5;
641 gMC->Gsvolu("FPCB","BOX",idtmed[502],parfp,3); // G10
642 // positioning the central PCB layer
643 gMC->Gspos("FPCB",1,"FSTR",0.,0.,0.,0,"ONLY");
646 Float_t parfs[3] = {klsensmx*0.5, khsensmy*0.5, kwsensmz*0.5};
647 gMC->Gsvolu("FSEN","BOX",idtmed[508],parfs,3); // sensitive ...
648 // dividing FSEN along z in knz=2 and along x in knx=48
649 gMC->Gsdvn("FSEZ","FSEN",knz,3);
650 gMC->Gsdvn("FPAD","FSEZ",knx,1);
651 // positioning a Sensitive layer inside FPCB
652 gMC->Gspos("FSEN",1,"FPCB",0.,0.,0.,0,"ONLY");
654 //-- RED GLASS Layer definition
655 parfp[1] = khrgly*0.5;
656 parfp[2] = kwrglz*0.5;
657 gMC->Gsvolu("FRGL","BOX",idtmed[509],parfp,3); // glass
658 // positioning 4 RED GLASS Layers on FSTR volume
659 posfp[1] = -khstripy*0.5+khhony+khpcby+parfp[1];
660 gMC->Gspos("FRGL",1,"FSTR",0., posfp[1],0.,0,"ONLY");
661 gMC->Gspos("FRGL",4,"FSTR",0.,-posfp[1],0.,0,"ONLY");
662 posfp[1] = (khcpcby+khrgly)*0.5;
663 gMC->Gspos("FRGL",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
664 gMC->Gspos("FRGL",3,"FSTR",0., posfp[1],0.,0,"ONLY");
666 //-- GLASS Layer definition
667 parfp[1] = khglassy*0.5;
668 parfp[2] = kwglfz*0.5;
669 gMC->Gsvolu("FGLA","BOX",idtmed[509],parfp,3); // glass
671 // positioning 4 GLASS Layers on FSTR volume
672 posfp[1] = -khstripy*0.5+khhony+khpcby+khrgly+parfp[1];
673 gMC->Gspos("FGLA",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
674 gMC->Gspos("FGLA",4,"FSTR",0., posfp[1],0.,0,"ONLY");
675 posfp[1] = khcpcby*0.5+khrgly+khglassy*0.5;
676 gMC->Gspos("FGLA",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
677 gMC->Gspos("FGLA",3,"FSTR",0., posfp[1],0.,0,"ONLY");
679 //-- FREON Layer definition
680 parfp[1] = khfiliy*0.5;
681 gMC->Gsvolu("FFIS","BOX",idtmed[507],parfp,3); // freon
683 // positioning 2 FREON Layers on FSTR volume
684 posfp[1] = -khstripy*0.5+khhony+khpcby+khrgly+khglassy+parfp[1];
685 gMC->Gspos("FFIS",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
686 gMC->Gspos("FFIS",2,"FSTR",0., posfp[1],0.,0,"ONLY");
689 //-- GLASS+FISHLINE Layer definition
690 parfp[1] = khglfy*0.5;
691 parfp[2] = kwglfz*0.5;
692 gMC->Gsvolu("FGLF","BOX",idtmed[504],parfp,3);
694 // positioning 2 GLASS+FISHLINE Layers on FSTR volume
695 posfp[1] = (khcpcby+khglfy)*0.5+khrgly;
696 gMC->Gspos("FGLF",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
697 gMC->Gspos("FGLF",2,"FSTR",0., posfp[1],0.,0,"ONLY");
700 // Positioning the Strips (FSTR) in the FLT volumes
701 Int_t maxStripNumbers [5] ={fTOFGeometry->NStripC(),
702 fTOFGeometry->NStripB(),
703 fTOFGeometry->NStripA(),
704 fTOFGeometry->NStripB(),
705 fTOFGeometry->NStripC()};
707 Int_t totalStrip = 0;
708 Float_t xpos, zpos, ypos, ang;
709 for(Int_t iplate =0; iplate < fTOFGeometry->NPlates(); iplate++){
710 if (iplate>0) totalStrip += maxStripNumbers[iplate-1];
711 for(Int_t istrip =0; istrip < maxStripNumbers[iplate]; istrip++){
713 ang = fTOFGeometry->GetAngles(iplate,istrip);
714 AliDebug(1, Form(" iplate = %1i, istrip = %2i ---> ang = %f", iplate, istrip, ang));
716 if (ang>0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.+ang,90., ang, 90.);
717 else if (ang==0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.,90., 0., 0.);
718 else if (ang<0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.+ang,90.,-ang,270.);
721 zpos = fTOFGeometry->GetDistances(iplate,istrip);
722 ypos = fTOFGeometry->GetHeights(iplate,istrip);
724 gMC->Gspos("FSTR",istrip+totalStrip+1,"FLTA", xpos, ypos,-zpos,idrotm[istrip+totalStrip+1], "ONLY");
727 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");
728 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");
733 // 1.5 cm Al honeycomb layer between strips and cards
735 par[1] = kHoneycombLayerThickness*0.5;
737 gMC->Gsvolu("FPEA", "BOX ", idtmed[506], par, 3); // Al honeycomb
740 ycoor = kHoneycombLayerThickness*0.5;
742 gMC->Gspos ("FPEA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
746 par[1] = kHoneycombLayerThickness*0.5;
747 par[2] = (zlenA*0.5 - kInterCentrModBorder2-kModuleWallThickness)*0.5;
748 gMC->Gsvolu("FPEB", "BOX ", idtmed[506], par, 3); // Al honeycomb
751 ycoor = kHoneycombLayerThickness*0.5;
752 zcoor = (kInterCentrModBorder2-kInterCentrModBorder1)*0.5;
753 gMC->Gspos ("FPEB", 1, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
754 gMC->Gspos ("FPEB", 2, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
759 par[1] = (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
761 gMC->Gsvolu("FAIA", "BOX ", idtmed[500], par, 3); // Air
764 ycoor = kHoneycombLayerThickness + (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
766 gMC->Gspos ("FAIA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
770 par[1] = (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
771 par[2] = (zlenA*0.5 - kInterCentrModBorder2 - kModuleWallThickness)*0.5;
772 gMC->Gsvolu("FAIB", "BOX ", idtmed[500], par, 3); // Air
773 gMC->Gsvolu("FAIC", "BOX ", idtmed[500], par, 3); // Air
776 ycoor = kHoneycombLayerThickness + (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
777 zcoor = (kInterCentrModBorder2-kInterCentrModBorder1)*0.5;
778 gMC->Gspos ("FAIB", 0, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
779 gMC->Gspos ("FAIC", 0, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
782 // start with cards and cooling tubes
783 // finally, cards, cooling tubes and layer for thermal dispersion
786 // see GEOM200 in GEANT manual
790 // card volume definition
791 cardpar[0]= xFLT*0.5;
794 gMC->Gsvolu("FCAR", "BOX ", idtmed[502], cardpar, 3); // PCB Card
796 //alu plate volume definition
799 gMC->Gsvolu("FALP", "BOX ", idtmed[505], cardpar, 3); // Alu Plate
801 // tube volume definition
806 gMC->Gsvolu("FTUB", "TUBE", idtmed[511], tubepar, 3); // cooling tubes (steel)
811 gMC->Gsvolu("FITU", "TUBE", idtmed[510], tubepar, 3); // cooling water
812 // positioning water tube into the steel one
813 gMC->Gspos("FITU",1,"FTUB",0.,0.,0.,0,"ONLY");
816 AliMatrix(idrotm[99], 180., 90., 90., 90., 90., 0.);
818 // central module positioning
819 Float_t cardpos[3], aplpos2;
820 Float_t stepforcardA = 6.625;
822 Float_t aplpos1 = -2.;
827 // tubepos= -53.+tdis;
829 for (icard=39; icard<54; ++icard) {
830 cardpos[2]= cardpos[2]+stepforcardA;
831 aplpos2 = cardpos[2]+0.15;
832 gMC->Gspos("FCAR",icard,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
833 gMC->Gspos("FALP",icard,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
834 gMC->Gspos("FTUB",icard,"FAIA", 0.,cardpos[1],cardpos[2]+tdis,idrotm[99],"ONLY");
837 // intermediate module positioning
838 Float_t stepforcardB= 7.05;
842 for (icard=20; icard<39; ++icard) {
843 cardpos[2]= cardpos[2]+stepforcardB;
844 aplpos2 = cardpos[2]+0.15;
846 gMC->Gspos("FCAR",icard+34,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
847 gMC->Gspos("FALP",icard+34,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
848 gMC->Gspos("FTUB",icard+34,"FAIA", 0.,cardpos[1], cardpos[2]+tdis,idrotm[99],"ONLY");
849 gMC->Gspos("FCAR",58-icard,"FAIA",cardpos[0],cardpos[1], -cardpos[2], 0,"ONLY");
850 gMC->Gspos("FALP",58-icard,"FAIA",cardpos[0], aplpos1, -aplpos2, 0,"ONLY");
851 gMC->Gspos("FTUB",58-icard,"FAIA", 0.,cardpos[1],-cardpos[2]-tdis,idrotm[99],"ONLY");
854 gMC->Gspos("FCAR",icard+34+182,"FAIC",cardpos[0],cardpos[1], cardpos[2]-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
855 gMC->Gspos("FALP",icard+34+182,"FAIC",cardpos[0], aplpos1, aplpos2-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
856 gMC->Gspos("FTUB",icard+34+182,"FAIC", 0.,cardpos[1], cardpos[2]+tdis-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
857 gMC->Gspos("FCAR",58-icard+ 91,"FAIB",cardpos[0],cardpos[1], -cardpos[2]+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
858 gMC->Gspos("FALP",58-icard+ 91,"FAIB",cardpos[0], aplpos1, -aplpos2+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
859 gMC->Gspos("FTUB",58-icard+ 91,"FAIB", 0.,cardpos[1],-cardpos[2]-tdis+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
864 // outer module positioning
865 Float_t stepforcardC= 8.45238;
868 for (icard=1; icard<20; ++icard) {
869 cardpos[2]= cardpos[2]+stepforcardC;
870 aplpos2 = cardpos[2]+0.15;
872 gMC->Gspos("FCAR",icard+72,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
873 gMC->Gspos("FALP",icard+72,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
874 gMC->Gspos("FTUB",icard+72,"FAIA", 0.,cardpos[1], cardpos[2]+tdis,idrotm[99],"ONLY");
875 gMC->Gspos("FCAR",20-icard,"FAIA",cardpos[0],cardpos[1], -cardpos[2], 0,"ONLY");
876 gMC->Gspos("FALP",20-icard,"FAIA",cardpos[0], aplpos1, -aplpos2, 0,"ONLY");
877 gMC->Gspos("FTUB",20-icard,"FAIA", 0.,cardpos[1],-cardpos[2]-tdis,idrotm[99],"ONLY");
880 gMC->Gspos("FCAR",icard+72+182,"FAIC",cardpos[0],cardpos[1], cardpos[2]-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
881 gMC->Gspos("FALP",icard+72+182,"FAIC",cardpos[0], aplpos1, aplpos2-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
882 gMC->Gspos("FTUB",icard+72+182,"FAIC", 0.,cardpos[1], cardpos[2]+tdis-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
883 gMC->Gspos("FCAR",20-icard+ 91,"FAIB",cardpos[0],cardpos[1], -cardpos[2]+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
884 gMC->Gspos("FALP",20-icard+ 91,"FAIB",cardpos[0], aplpos1, -aplpos2+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
885 gMC->Gspos("FTUB",20-icard+ 91,"FAIB", 0.,cardpos[1],-cardpos[2]-tdis+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
890 //_____________________________________________________________________________
891 void AliTOFv5T0::DrawModule() const
894 // Draw a shaded view of the Time Of Flight version 4
897 // Set everything unseen
898 gMC->Gsatt("*", "seen", -1);
901 //Set volumes visible
904 //Set ALIC mother transparent
905 gMC->Gsatt("ALIC","SEEN", 0);
908 // Level 1 for TOF volumes
909 gMC->Gsatt("B077","seen", 0);
912 // Level 2 for TOF volumes
913 gMC->Gsatt("B071","seen", 0);
914 gMC->Gsatt("B074","seen", 0);
915 gMC->Gsatt("B075","seen", 0);
916 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
917 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
920 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
921 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
922 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
923 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
924 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
926 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
927 gMC->Gsatt("BTO1","seen", 0);
930 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
931 gMC->Gsatt("BTO2","seen", 0);
934 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
935 gMC->Gsatt("BTO3","seen", 0);
937 // Level 3 of B071, B074 and B075
938 gMC->Gsatt("FTOA","SEEN", 0);
939 if (fTOFHoles) gMC->Gsatt("FTOB","SEEN", 0);
941 // Level 4 of B071, B074 and B075
942 gMC->Gsatt("FLTA","SEEN", 0);
943 if (fTOFHoles) gMC->Gsatt("FLTB","SEEN",0);
944 if (fTOFHoles) gMC->Gsatt("FLTC","SEEN",0);
946 // Level 5 of B071, B074 and B075
947 gMC->Gsatt("FAIA","SEEN",-1); // all FAIA sub-levels skipped -
948 if (fTOFHoles) gMC->Gsatt("FAIB","SEEN",-1); // all FAIB sub-levels skipped -
949 if (fTOFHoles) gMC->Gsatt("FAIC","SEEN",-1); // all FAIC sub-levels skipped -
951 gMC->Gsatt("FALA","SEEN", 0);
952 if (fTOFHoles) gMC->Gsatt("FALB","SEEN", 0);
954 gMC->Gsatt("FPEA","SEEN", 1);
955 if (fTOFHoles) gMC->Gsatt("FPEB","SEEN", 1);
957 gMC->Gsatt("FSTR","SEEN",-1); // all FSTR sub-levels skipped -
959 gMC->Gsatt("FWZ1","SEEN", 0);
960 gMC->Gsatt("FWZ2","SEEN", 0);
961 gMC->Gsatt("FWZ3","SEEN", 0);
962 gMC->Gsatt("FWZ4","SEEN", 0);
964 gMC->Gsatt("FZ1B","SEEN", 0);
965 gMC->Gsatt("FZ1C","SEEN", 0);
966 gMC->Gsatt("FZ2B","SEEN", 0);
969 gMC->Gdopt("hide", "on");
970 gMC->Gdopt("shad", "on");
971 gMC->Gsatt("*", "fill", 7);
972 gMC->SetClipBox(".");
973 gMC->SetClipBox("*", 100, 1000, 100, 1000, 100, 1000);
975 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
976 gMC->Gdhead(1111, "Time Of Flight");
977 gMC->Gdman(18, 3, "MAN");
978 gMC->Gdopt("hide","off");
980 //_____________________________________________________________________________
981 void AliTOFv5T0::DrawDetectorModules()
984 // Draw a shaded view of the TOF detector version 4
987 // Set everything unseen
988 gMC->Gsatt("*", "seen", -1);
991 //Set volumes visible
994 //Set ALIC mother transparent
995 gMC->Gsatt("ALIC","SEEN", 0);
998 // Level 1 for TOF volumes
999 gMC->Gsatt("B077","seen", 0);
1002 // Level 2 for TOF volumes
1003 gMC->Gsatt("B071","seen", 0);
1004 gMC->Gsatt("B074","seen", 0);
1005 gMC->Gsatt("B075","seen", 0);
1006 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
1007 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
1010 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
1011 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
1012 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
1013 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
1014 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
1016 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
1017 gMC->Gsatt("BTO1","seen", 0);
1020 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
1021 gMC->Gsatt("BTO2","seen", 0);
1024 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
1025 gMC->Gsatt("BTO3","seen", 0);
1027 // Level 3 of B071, B075 and B074
1028 gMC->Gsatt("FTOA","seen",-2); // all FTOA sub-levels skipped -
1030 gMC->Gsatt("FTOB","seen",-2); // all FTOB sub-levels skipped -
1031 gMC->Gsatt("FTOC","seen",-2); // all FTOC sub-levels skipped -
1034 gMC->Gdopt("hide","on");
1035 gMC->Gdopt("shad","on");
1036 gMC->Gsatt("*", "fill", 5);
1037 gMC->SetClipBox(".");
1038 gMC->SetClipBox("*", 100, 1000, 100, 1000, 0, 1000);
1039 gMC->DefaultRange();
1040 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
1041 gMC->Gdhead(1111,"TOF detector");
1042 gMC->Gdman(18, 3, "MAN");
1043 gMC->Gdopt("hide","off");
1046 //_____________________________________________________________________________
1047 void AliTOFv5T0::DrawDetectorStrips()
1050 // Draw a shaded view of the TOF strips for version 4
1053 // Set everything unseen
1054 gMC->Gsatt("*", "seen", -1);
1057 //Set volumes visible
1060 //Set ALIC mother transparent
1061 gMC->Gsatt("ALIC","SEEN", 0);
1064 // Level 1 for TOF volumes
1065 gMC->Gsatt("B077","seen", 0);
1068 // Level 2 for TOF volumes
1069 gMC->Gsatt("B071","seen", 0);
1070 gMC->Gsatt("B074","seen", 0);
1071 gMC->Gsatt("B075","seen", 0);
1072 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
1073 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
1076 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
1077 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
1078 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
1079 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
1080 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
1082 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
1083 gMC->Gsatt("BTO1","seen", 0);
1086 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
1087 gMC->Gsatt("BTO2","seen", 0);
1090 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
1091 gMC->Gsatt("BTO3","seen", 0);
1093 // Level 3 of B071, B074 and B075
1094 gMC->Gsatt("FTOA","SEEN", 0);
1096 gMC->Gsatt("FTOB","SEEN", 0);
1097 gMC->Gsatt("FTOC","SEEN", 0);
1100 // Level 4 of B071, B074 and B075
1101 gMC->Gsatt("FLTA","SEEN", 0);
1103 gMC->Gsatt("FLTB","SEEN", 0);
1104 gMC->Gsatt("FLTC","SEEN", 0);
1107 // Level 5 of B071, B074 and B075
1108 gMC->Gsatt("FAIA","SEEN",-1); // all FAIA sub-levels skipped -
1110 gMC->Gsatt("FAIB","SEEN",-1); // all FAIB sub-levels skipped -
1111 gMC->Gsatt("FAIC","SEEN",-1); // all FAIC sub-levels skipped -
1114 gMC->Gsatt("FALA","SEEN", 0);
1115 if (fTOFHoles) gMC->Gsatt("FALB","SEEN", 0);
1117 gMC->Gsatt("FPEA","SEEN", 0);
1118 if (fTOFHoles) gMC->Gsatt("FPEB","SEEN", 0);
1120 gMC->Gsatt("FSTR","SEEN",-2); // all FSTR sub-levels skipped -
1122 gMC->Gsatt("FWZ1","SEEN", 0);
1123 gMC->Gsatt("FWZ2","SEEN", 0);
1124 gMC->Gsatt("FWZ3","SEEN", 0);
1125 gMC->Gsatt("FWZ4","SEEN", 0);
1127 gMC->Gsatt("FZ1B","SEEN", 0);
1128 gMC->Gsatt("FZ1C","SEEN", 0);
1129 gMC->Gsatt("FZ2B","SEEN", 0);
1136 gMC->Gsatt("FALP","SEEN",0);
1137 gMC->Gsatt("FCAR","SEEN",0);
1138 gMC->Gsatt("FTUB","SEEN",-1); // all FTUB sub-levels skipped -
1141 gMC->Gsatt("FITU","SEEN",0);
1146 gMC->Gsatt("FGLF","SEEN",0);
1147 gMC->Gsatt("FHON","SEEN",0);
1148 gMC->Gsatt("FPC1","SEEN",0);
1149 gMC->Gsatt("FPC2","SEEN",0);
1150 gMC->Gsatt("FPCB","SEEN",0);
1151 gMC->Gsatt("FRGL","SEEN",0);
1153 // Level 2 of FPCB => Level 3 of FSTR
1154 gMC->Gsatt("FSEN","SEEN",0);
1155 gMC->Gsatt("FSEZ","SEEN",0);
1156 gMC->Gsatt("FPAD","SEEN",1);
1159 gMC->Gdopt("hide","on");
1160 gMC->Gdopt("shad","on");
1161 gMC->Gsatt("*", "fill", 5);
1162 gMC->SetClipBox(".");
1163 gMC->SetClipBox("*", 0, 1000, 0, 1000, 0, 1000);
1164 gMC->DefaultRange();
1165 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
1166 gMC->Gdhead(1111,"TOF Strips");
1167 gMC->Gdman(18, 3, "MAN");
1168 gMC->Gdopt("hide","off");
1171 //_____________________________________________________________________________
1172 void AliTOFv5T0::CreateMaterials()
1175 // Define materials for the Time Of Flight
1178 //AliTOF::CreateMaterials();
1180 Int_t isxfld = gAlice->Field()->Integ();
1181 Float_t sxmgmx = gAlice->Field()->Max();
1182 Float_t we[7], ae[7], na[7], fr[7], vl[7];
1186 //--- Quartz (SiO2) to simulate float glass
1187 // density tuned to have correct float glass
1189 Float_t aq[2] = { 28.0855,15.9994 };
1190 Float_t zq[2] = { 14.,8. };
1191 Float_t wq[2] = { 1.,2. };
1192 Float_t dq = 2.55; // std value: 2.2
1196 Float_t anox[4] = {12.01,1.01,16.00,14.01};
1197 Float_t znox[4] = { 6., 1., 8., 7.};
1198 Float_t wnox[4] = {14., 22., 2., 2.};
1199 Float_t dnox = 0.048;
1203 Float_t ag10[4] = {28.09,12.01,1.01,16.00};
1204 Float_t zg10[4] = {14., 6., 1., 8.};
1207 for (i = 0; i < nlmatg10; ++i) {
1223 MaterialMixer(we,ae,na,fr,vl,5);
1229 Float_t densg10 = 1.7;
1232 Float_t awa[2] = { 1., 16. };
1233 Float_t zwa[2] = { 1., 8. };
1234 Float_t wwa[2] = { 2., 1. };
1239 Float_t asteel[4] = { 55.847,51.9961,58.6934,28.0855 };
1240 Float_t zsteel[4] = { 26.,24.,28.,14. };
1241 Float_t wsteel[4] = { .715,.18,.1,.005 };
1244 Float_t aAir[4]={12.0107,14.0067,15.9994,39.948};
1245 Float_t zAir[4]={6.,7.,8.,18.};
1246 Float_t wAir[4]={0.000124,0.755267,0.231781,0.012827};
1247 Float_t dAir = 1.20479E-3;
1250 Float_t afg[4] = {28.09,16.00,12.01,1.01};
1251 Float_t zfg[4] = {14., 8., 6., 1.};
1252 Float_t wfg[4] = {0.12906,0.29405,0.51502,0.06187};
1253 Float_t dfg = 1.111;
1256 // --- Freon C2F4H2 + SF6
1257 Float_t afre[4]= {12.01,1.01,19.00,32.07};
1258 Float_t zfre[4]= { 6., 1., 9., 16.};
1259 Float_t wfre[4]= {0.21250,0.01787,0.74827,0.021355};
1260 Float_t densfre= 0.00375;
1263 //char namat[15] = " ";
1264 //Float_t ama[2], zma[2], dma, radl, absl, buf[1];
1267 AliMixture ( 0, "Air$", aAir, zAir, dAir, 4, wAir);
1268 AliMixture ( 1, "Nomex$", anox, znox, dnox, nnox, wnox);
1269 AliMixture ( 2, "G10$", ag10, zg10, densg10, nlmatg10, wmatg10);
1270 AliMixture ( 3, "fibre glass$", afg, zfg, dfg, nfg, wfg);
1271 AliMaterial( 4, "Al $", 26.98, 13., 2.7, 8.9, 37.2);
1272 AliMaterial( 5, "Al honeycomb$", 26.98, 13., 0.0496, 483., 2483.);
1273 AliMixture ( 6, "Freon$", afre, zfre, densfre, nfre, wfre);
1274 AliMixture ( 7, "Glass$", aq, zq, dq, nq, wq);
1276 // get freon and glass
1277 gMC->Gfmate((*fIdmate)[6],namat,ama[0],zma[0],dma,radl,absl,buf,nbuf);
1278 gMC->Gfmate((*fIdmate)[7],namat,ama[1],zma[1],dma,radl,absl,buf,nbuf);
1281 Float_t wgfr[2]= {0.0011,0.9989};
1282 Float_t dgfr = 1.434;
1284 AliMixture ( 8, "glass-freon$", ama, zma, dgfr, ngfr, wgfr);
1286 AliMixture ( 9, "Water$", awa, zwa, dwa, nwa, wwa);
1287 AliMixture (10, "STAINLESS STEEL$", asteel, zsteel, 7.88, 4, wsteel);
1289 Float_t epsil, stmin, deemax, stemax;
1292 // EPSIL = 0.1 ! Tracking precision,
1293 // STEMAX = 0.1 ! Maximum displacement for multiple scattering
1294 // DEEMAX = 0.1 ! Maximum fractional energy loss, DLS
1298 epsil = .001; // Tracking precision,
1299 stemax = -1.; // Maximum displacement for multiple scattering
1300 deemax = -.3; // Maximum fractional energy loss, DLS
1303 AliMedium( 1, "Air$", 0, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1304 AliMedium( 2,"Nomex$", 1, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1305 AliMedium( 3,"G10$", 2, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1306 AliMedium( 4,"fibre glass$", 3, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1307 //AliMedium( 5,"glass-freon$", 8, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1308 AliMedium( 6,"Al Frame$", 4, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1309 AliMedium( 7,"Al honeycomb$", 5, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1310 AliMedium( 8,"Fre$", 6, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1311 AliMedium( 9,"PCB-S$", 2, 1, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1312 AliMedium(10,"Glass$", 7, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1313 AliMedium(11,"Water$", 9, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1314 AliMedium(12,"STEEL$", 10, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1317 //_____________________________________________________________________________
1318 void AliTOFv5T0::Init()
1321 // Initialise the detector after the geometry has been defined
1323 AliDebug(1, "**************************************"
1325 "**************************************");
1326 AliDebug(1, " Version 4 of TOF initialing, "
1327 "symmetric TOF - Full Coverage version");
1331 fIdFTOA = gMC->VolId("FTOA");
1333 fIdFTOB = gMC->VolId("FTOB");
1334 fIdFTOC = gMC->VolId("FTOC");
1336 fIdFLTA = gMC->VolId("FLTA");
1338 fIdFLTB = gMC->VolId("FLTB");
1339 fIdFLTC = gMC->VolId("FLTC");
1342 AliDebug(1, "**************************************"
1344 "**************************************");
1347 //_____________________________________________________________________________
1348 void AliTOFv5T0::StepManager()
1352 // Procedure called at each step in the Time Of Flight
1355 TLorentzVector mom, pos;
1356 Float_t xm[3],pm[3],xpad[3],ppad[3];
1359 Int_t sector, plate, padx, padz, strip;
1360 Int_t copy, padzid, padxid, stripid, i;
1361 Int_t *idtmed = fIdtmed->GetArray()-499;
1362 Float_t incidenceAngle;
1364 const char * path71 = "B071";
1365 const char * path75 = "B075";
1366 const char * path74 = "B074";
1367 const char* volpath;
1372 gMC->IsTrackEntering()
1373 && gMC->TrackCharge()
1374 //&& gMC->GetMedium()==idtmed[508]
1375 && gMC->CurrentMedium()==idtmed[508]
1376 && gMC->CurrentVolID(copy)==fIdSens
1380 AddTrackReference(gAlice->GetMCApp()->GetCurrentTrackNumber());
1382 // getting information about hit volumes
1384 padzid=gMC->CurrentVolOffID(1,copy);
1388 padxid=gMC->CurrentVolOffID(0,copy);
1392 stripid=gMC->CurrentVolOffID(4,copy);
1396 gMC->TrackPosition(pos);
1397 gMC->TrackMomentum(mom);
1399 Double_t normMom=1./mom.Rho();
1401 // getting the coordinates in pad ref system
1403 xm[0] = (Float_t)pos.X();
1404 xm[1] = (Float_t)pos.Y();
1405 xm[2] = (Float_t)pos.Z();
1407 pm[0] = (Float_t)mom.X()*normMom;
1408 pm[1] = (Float_t)mom.Y()*normMom;
1409 pm[2] = (Float_t)mom.Z()*normMom;
1411 gMC->Gmtod(xm,xpad,1); // from MRS to DRS: coordinates convertion
1412 gMC->Gmtod(pm,ppad,2); // from MRS to DRS: direction cosinus convertion
1415 if (TMath::Abs(ppad[1])>1) {
1416 AliWarning("Abs(ppad) > 1");
1417 ppad[1]=TMath::Sign((Float_t)1,ppad[1]);
1419 incidenceAngle = TMath::ACos(ppad[1])*kRaddeg;
1422 if (strip < fTOFGeometry->NStripC()) {
1426 else if (strip >= fTOFGeometry->NStripC() &&
1427 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB()) {
1429 strip = strip - fTOFGeometry->NStripC();
1431 else if (strip >= fTOFGeometry->NStripC() + fTOFGeometry->NStripB() &&
1432 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA()) {
1434 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB();
1436 else if (strip >= fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA() &&
1437 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA() + fTOFGeometry->NStripB()) {
1439 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB() - fTOFGeometry->NStripA();
1443 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB() - fTOFGeometry->NStripA() - fTOFGeometry->NStripB();
1446 volpath=gMC->CurrentVolOffName(8);
1447 index=gMC->CurrentVolOffID(8,copy);
1451 if(strcmp(path71,volpath)==0 && index <6) sector=12+index;
1452 if(strcmp(path71,volpath)==0 && index >=6) sector=index-3;
1453 if(strcmp(path75,volpath)==0) sector=index-1;
1454 if(strcmp(path74,volpath)==0) sector=10+index;
1461 hits[6] = mom.Rho();
1466 hits[11]= incidenceAngle;
1467 hits[12]= gMC->Edep();
1468 hits[13]= gMC->TrackLength();
1476 AddT0Hit(gAlice->GetMCApp()->GetCurrentTrackNumber(),vol, hits);
1479 //-------------------------------------------------------------------
1480 void AliTOFv5T0::MaterialMixer(Float_t* p,Float_t* a,Float_t* m,Float_t* d,Float_t* s,Int_t n) {
1481 // a[] atomic weights vector (in)
1482 // (atoms present in more compound appear separately)
1483 // m[] number of corresponding atoms in the mixture (in)
1484 // d[] fraction of the compound relative to the corresponding atoms (in)
1485 // s[] further possible weights " " " " (in)
1487 for (Int_t i = 0; i < n; ++i) {
1488 p[i] = a[i]*m[i]*d[i]*s[i];
1491 for (Int_t i = 0; i < n; ++i) {
1493 // AliInfo(Form((\n weight[%i] = %f (,i,p[i]));