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.4 2006/03/13 12:35:44 decaro
19 Suppression of fractional Z warning
21 Revision 1.3 2006/02/28 10:38:00 decaro
22 AliTOFGeometry::fAngles, AliTOFGeometry::fHeights,
23 AliTOFGeometry::fDistances arrays: dimension definition in the right
26 Revision 1.2 2006/02/27 18:12:14 decaro
27 Remove in StepManager the dependence of hit indexes from parametrized
30 Revision 1.1 2005/12/15 08:55:33 decaro
31 New TOF geometry description (V5) -G. Cara Romeo and A. De Caro
34 Revision 0.1 2004 November G. Cara Romeo and A. De Caro
35 Implement new TOF geometry version
37 suppress few volume overlaps
38 (in the 4th TOF geometry version),
39 insert the realistic strip numbers and positions
43 ///////////////////////////////////////////////////////////////////////////////
45 // This class contains the functions for version 5 of the Time Of Flight //
48 // VERSION WITH 5 MODULES AND TILTED STRIPS //
50 // FULL COVERAGE VERSION + OPTION for PHOS holes //
55 <img src="picts/AliTOFv5T0Class.gif"> //
59 ///////////////////////////////////////////////////////////////////////////////
61 #include "Riostream.h"
64 #include "TVirtualMC.h"
66 #include <TGeometry.h>
67 #include <TLorentzVector.h>
70 #include <TVirtualMC.h>
78 #include "AliTOFGeometry.h"
79 #include "AliTOFGeometryV5.h"
80 #include "AliTOFv5T0.h"
84 //_____________________________________________________________________________
85 AliTOFv5T0::AliTOFv5T0()
88 // Default constructor
92 //_____________________________________________________________________________
93 AliTOFv5T0::AliTOFv5T0(const char *name, const char *title)
94 : AliTOF(name,title,"tzero")
97 // Standard constructor
100 // Check that FRAME is there otherwise we have no place where to
104 AliModule* frame=gAlice->GetModule("FRAME");
106 AliFatal("TOF needs FRAME to be present");
109 if (fTOFGeometry) delete fTOFGeometry;
110 fTOFGeometry = new AliTOFGeometryV5();
112 if(frame->IsVersion()==1) {
113 AliInfo(Form("Frame version %d", frame->IsVersion()));
114 AliInfo("Full Coverage for TOF");
117 AliInfo(Form("Frame version %d", frame->IsVersion()));
118 AliInfo("TOF with Holes for PHOS");
121 fTOFGeometry->SetHoles(fTOFHoles);
123 //AliTOF::fTOFGeometry = fTOFGeometry;
126 TDirectory* saveDir = gDirectory;
127 gAlice->GetRunLoader()->CdGAFile();
128 fTOFGeometry->Write("TOFgeometry");
133 //____________________________________________________________________________
134 void AliTOFv5T0::BuildGeometry()
137 // Build TOF ROOT geometry for the ALICE event display
140 const int kColorTOF = 27;
143 top = gAlice->GetGeometry()->GetNode("alice");
145 // Position the different copies
146 const Float_t krTof =(fTOFGeometry->Rmax()+fTOFGeometry->Rmin())/2.;
147 const Float_t khTof = fTOFGeometry->Rmax()-fTOFGeometry->Rmin();
148 const Int_t kNTof = fTOFGeometry->NSectors();
149 const Float_t kangle = k2PI/kNTof;
151 const Float_t kInterCentrModBorder1 = 49.5;
152 const Float_t kInterCentrModBorder2 = 57.5;
156 // define offset for nodes
157 Float_t zOffsetB = (fTOFGeometry->ZlenA()*0.5 + (kInterCentrModBorder1+kInterCentrModBorder2)*0.5)*0.5;
158 Float_t zOffsetA = 0.;
159 // Define TOF basic volume
161 char nodeName0[7], nodeName1[7], nodeName2[7];
162 char nodeName3[7], nodeName4[7], rotMatNum[7];
165 new TBRIK("S_TOF_B","TOF box","void",
166 fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenB()*0.5);
167 new TBRIK("S_TOF_C","TOF box","void",
168 fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenB()*0.5);
170 new TBRIK("S_TOF_A","TOF box","void",
171 fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenA()*0.5);
173 for (Int_t nodeNum=1;nodeNum<19;nodeNum++){
176 sprintf(rotMatNum,"rot50%i",nodeNum);
177 sprintf(nodeName0,"FTO00%i",nodeNum);
178 sprintf(nodeName1,"FTO10%i",nodeNum);
179 sprintf(nodeName2,"FTO20%i",nodeNum);
180 sprintf(nodeName3,"FTO30%i",nodeNum);
181 sprintf(nodeName4,"FTO40%i",nodeNum);
184 sprintf(rotMatNum,"rot5%i",nodeNum);
185 sprintf(nodeName0,"FTO0%i",nodeNum);
186 sprintf(nodeName1,"FTO1%i",nodeNum);
187 sprintf(nodeName2,"FTO2%i",nodeNum);
188 sprintf(nodeName3,"FTO3%i",nodeNum);
189 sprintf(nodeName4,"FTO4%i",nodeNum);
192 new TRotMatrix(rotMatNum,rotMatNum,90,-20*nodeNum,90,90-20*nodeNum,0,0);
193 ang = (4.5-nodeNum) * kangle;
197 node = new TNode(nodeName2,nodeName2,"S_TOF_B", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang), zOffsetB,rotMatNum);
198 node->SetLineColor(kColorTOF);
202 node = new TNode(nodeName3,nodeName3,"S_TOF_C", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang),-zOffsetB,rotMatNum);
203 node->SetLineColor(kColorTOF);
208 node = new TNode(nodeName4,nodeName4,"S_TOF_A", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang), zOffsetA,rotMatNum);
209 node->SetLineColor(kColorTOF);
211 } // end loop on nodeNum
215 //_____________________________________________________________________________
216 void AliTOFv5T0::CreateGeometry()
219 // Create geometry for Time Of Flight version 0
223 <img src="picts/AliTOFv5T0.gif">
227 // Creates common geometry
229 AliTOF::CreateGeometry();
233 //_____________________________________________________________________________
234 void AliTOFv5T0::TOFpc(Float_t xtof, Float_t ytof, Float_t zlenA,
238 const Float_t kPi = TMath::Pi();
240 const Float_t kInterCentrModBorder1 = 49.5;
241 const Float_t kInterCentrModBorder2 = 57.5;
242 const Float_t kExterInterModBorder1 = 196.0;
243 const Float_t kExterInterModBorder2 = 203.5;
245 const Float_t kLengthExInModBorder = 4.7;
246 const Float_t kLengthInCeModBorder = 7.0;
248 const Float_t khAlWall = 0.03
250 // module wall thickness (cm)
251 const Float_t kModuleWallThickness = 0.3;
253 // Al honeycomb layer between strips and cards (cm)
254 const Float_t kHoneycombLayerThickness = 1.5;
256 AliDebug(2,Form("zlenA*0.5 = %d", zlenA*0.5));
257 AliDebug(1, "************************* TOF geometry **************************");
259 // Definition of the Time Of Fligh Resistive Plate Chambers
260 // xFLT, yFLT, zFLT - sizes of TOF modules (large)
262 Float_t xcoor, ycoor, zcoor;
264 Int_t *idtmed = fIdtmed->GetArray()-499;
269 par[2] = zlenA * 0.5;
270 gMC->Gsvolu("FTOA", "BOX ", idtmed[503], par, 3); // fibre glass
275 par[2] = (zlenA*0.5 - kInterCentrModBorder1)*0.5;
276 gMC->Gsvolu("FTOB", "BOX ", idtmed[503], par, 3); // fibre glass
277 gMC->Gsvolu("FTOC", "BOX ", idtmed[503], par, 3); // fibre glass
280 // Positioning of fibre glass modules (FTOA, FTOB and FTOC)
282 //AliMatrix(idrotm[0], 90., 0., 0., 0., 90.,-90.);
283 AliMatrix(idrotm[0], 90., 0., 0., 0., 90.,270.);
288 gMC->Gspos("FTOA", 0, "BTO1", xcoor, ycoor, zcoor, idrotm[0], "ONLY");
289 gMC->Gspos("FTOA", 0, "BTO3", xcoor, ycoor, zcoor, idrotm[0], "ONLY");
293 ycoor = (zlenA*0.5 + kInterCentrModBorder1)*0.5;
295 gMC->Gspos("FTOB", 0, "BTO2", xcoor, ycoor, zcoor, idrotm[0], "ONLY");
296 gMC->Gspos("FTOC", 0, "BTO2", xcoor,-ycoor, zcoor, idrotm[0], "ONLY");
298 else gMC->Gspos("FTOA", 0, "BTO2", xcoor, ycoor, zcoor, idrotm[0], "ONLY");
300 // Large not sensitive volumes with Insensitive Freon (FLTA, FLTB and FLTC)
302 Float_t xFLT, yFLT, zFLTA;
304 xFLT = xtof - kModuleWallThickness*2.;
305 yFLT = ytof - kModuleWallThickness*2.;
306 zFLTA = zlenA - kModuleWallThickness*2.;
311 gMC->Gsvolu("FLTA", "BOX ", idtmed[507], par, 3); // Freon mix
316 gMC->Gspos ("FLTA", 0, "FTOA", xcoor, ycoor, zcoor, 0, "ONLY");
321 par[2] = (zlenA*0.5 - kInterCentrModBorder1-kModuleWallThickness)*0.5;
322 gMC->Gsvolu("FLTB", "BOX ", idtmed[507], par, 3); // Freon mix
323 gMC->Gsvolu("FLTC", "BOX ", idtmed[507], par, 3); // Freon mix
327 zcoor = kModuleWallThickness*0.5;
328 gMC->Gspos ("FLTB", 0, "FTOB", xcoor, ycoor, zcoor, 0, "ONLY");
329 gMC->Gspos ("FLTC", 0, "FTOC", xcoor, ycoor,-zcoor, 0, "ONLY");
332 // Layer of Aluminum after detector
334 par[1] = khAlWall*0.5;
337 ycoor = (-yFLT + khAlWall)*0.5;
339 gMC->Gsvolu("FALA", "BOX ", idtmed[505], par, 3); // Alluminium
340 gMC->Gspos ("FALA", 0, "FLTA", xcoor, -ycoor, zcoor, 0, "ONLY");
344 //par[1] = khAlWall*0.5;
345 par[2] = (zlenA*0.5 - kInterCentrModBorder2-kModuleWallThickness)*0.5;
347 ycoor = (-yFLT + khAlWall)*0.5;
348 zcoor = (kInterCentrModBorder2-kInterCentrModBorder1)*0.5;
349 gMC->Gsvolu("FALB", "BOX ", idtmed[505], par, 3); // Alluminium
350 gMC->Gspos ("FALB", 1, "FLTB", xcoor,-ycoor,-zcoor, 0, "ONLY");
351 gMC->Gspos ("FALB", 2, "FLTC", xcoor,-ycoor, zcoor, 0, "ONLY");
354 Float_t y0, alpha, tgal, beta, tgbe, trpa[11];
356 // Fibre glass walls between central and intermediate modules (FWZ1 and FWZ2; holes -> FZ1B, FZ1C, FZ2B)
358 tgal = (yFLT*0.5 - 2.*kLengthInCeModBorder)/(kInterCentrModBorder2 - kInterCentrModBorder1);
359 alpha = TMath::ATan(tgal);
360 beta = (kPi*0.5 - alpha)*0.5;
361 tgbe = TMath::Tan(beta);
365 trpa[3] = kModuleWallThickness;
366 trpa[4] = (kLengthInCeModBorder - kModuleWallThickness*tgbe)*0.5;
367 trpa[5] = (kLengthInCeModBorder + kModuleWallThickness*tgbe)*0.5;
368 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg;
369 trpa[7] = kModuleWallThickness;
370 trpa[8] = (kLengthInCeModBorder - kModuleWallThickness*tgbe)*0.5;
371 trpa[9] = (kLengthInCeModBorder + kModuleWallThickness*tgbe)*0.5;
372 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg;
373 gMC->Gsvolu("FWZ1","TRAP", idtmed[503], trpa, 11); // fibre glass
375 AliMatrix (idrotm[1],90., 90.,180.,0.,90.,180.);
376 AliMatrix (idrotm[4],90., 90., 0.,0.,90., 0.);
379 ycoor = -yFLT*0.5 + kLengthInCeModBorder*0.5;
380 zcoor = kInterCentrModBorder1;
381 gMC->Gspos("FWZ1", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[1],"ONLY");
382 gMC->Gspos("FWZ1", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[4],"ONLY");
385 y0 = kLengthInCeModBorder - kModuleWallThickness*0.5*tgbe;
389 trpa[3] = kModuleWallThickness*0.5;
390 trpa[4] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
391 trpa[5] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
392 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg;
393 trpa[7] = kModuleWallThickness*0.5;
394 trpa[8] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
395 trpa[9] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
396 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg;
397 gMC->Gsvolu("FZ1B","TRAP", idtmed[503], trpa, 11); // fibre glass
400 ycoor = -yFLT*0.5 + kLengthInCeModBorder*0.5 - kModuleWallThickness*0.25*tgbe;
401 zcoor = -kInterCentrModBorder1 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
402 gMC->Gspos("FZ1B", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[4],"ONLY");
403 gMC->Gspos("FZ1B", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[1],"ONLY");
406 AliMatrix (idrotm[2],90.,270., 0.,0.,90.,180.);
407 AliMatrix (idrotm[5],90.,270.,180.,0.,90., 0.);
410 ycoor = -kLengthInCeModBorder*0.5;
411 zcoor = kInterCentrModBorder2;
412 gMC->Gspos("FWZ1", 3,"FLTA", xcoor, ycoor, zcoor,idrotm[2],"ONLY");
413 gMC->Gspos("FWZ1", 4,"FLTA", xcoor, ycoor,-zcoor,idrotm[5],"ONLY");
416 y0 = kLengthInCeModBorder + kModuleWallThickness*0.5*tgbe;
420 trpa[3] = kModuleWallThickness*0.5;
421 trpa[4] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
422 trpa[5] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
423 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg;
424 trpa[7] = kModuleWallThickness*0.5;
425 trpa[8] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
426 trpa[9] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
427 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg;
428 gMC->Gsvolu("FZ1C","TRAP", idtmed[503], trpa, 11); // fibre glass
431 ycoor = -kLengthInCeModBorder*0.5 - kModuleWallThickness*0.25*tgbe;
432 zcoor = -kInterCentrModBorder2 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
433 gMC->Gspos("FZ1C", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[5],"ONLY");
434 gMC->Gspos("FZ1C", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[2],"ONLY");
437 trpa[0] = 0.5*(kInterCentrModBorder2 - kInterCentrModBorder1)/TMath::Cos(alpha);
438 trpa[1] = kModuleWallThickness;
440 trpa[3] = -beta*kRaddeg;
443 gMC->Gsvolu("FWZ2","PARA", idtmed[503], trpa, 6); // fibre glass
445 AliMatrix (idrotm[3], alpha*kRaddeg,90.,90.+alpha*kRaddeg,90.,90.,180.);
446 AliMatrix (idrotm[6],180.-alpha*kRaddeg,90.,90.-alpha*kRaddeg,90.,90., 0.);
450 zcoor = (kInterCentrModBorder2 + kInterCentrModBorder1)*0.5;
451 gMC->Gspos("FWZ2", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[3],"ONLY");
452 gMC->Gspos("FWZ2", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[6],"ONLY");
455 trpa[0] = 0.5*(kInterCentrModBorder2 - kInterCentrModBorder1)/TMath::Cos(alpha);
456 trpa[1] = kModuleWallThickness*0.5;
458 trpa[3] = -beta*kRaddeg;
461 gMC->Gsvolu("FZ2B","PARA", idtmed[503], trpa, 6); // fibre glass
464 ycoor = -yFLT*0.25 - kModuleWallThickness*0.5*tgbe;
465 zcoor = -(kInterCentrModBorder2 + kInterCentrModBorder1)*0.5 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
466 gMC->Gspos("FZ2B", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[6],"ONLY");
467 gMC->Gspos("FZ2B", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[3],"ONLY");
470 // wall between intermediate and lateral modules
471 tgal = (yFLT*0.5 - 2.*kLengthExInModBorder)/(kExterInterModBorder2 - kExterInterModBorder1);
472 alpha = TMath::ATan(tgal);
473 beta = (kPi*0.5 - alpha)*0.5;
474 tgbe = TMath::Tan(beta);
478 trpa[3] = kModuleWallThickness;
479 trpa[4] = (kLengthExInModBorder - kModuleWallThickness*tgbe)*0.5;
480 trpa[5] = (kLengthExInModBorder + kModuleWallThickness*tgbe)*0.5;
481 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg;
482 trpa[7] = kModuleWallThickness;
483 trpa[8] = (kLengthExInModBorder - kModuleWallThickness*tgbe)*0.5;
484 trpa[9] = (kLengthExInModBorder + kModuleWallThickness*tgbe)*0.5;
485 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg;
486 gMC->Gsvolu("FWZ3","TRAP", idtmed[503], trpa, 11); // fibre glass
489 ycoor = -kLengthExInModBorder*0.5;
490 zcoor = kExterInterModBorder1;
491 gMC->Gspos("FWZ3", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[5],"ONLY");
492 gMC->Gspos("FWZ3", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[2],"ONLY");
496 ycoor = -kLengthExInModBorder*0.5;
497 zcoor = -kExterInterModBorder1 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
498 gMC->Gspos("FWZ3", 5,"FLTB", xcoor, ycoor, zcoor,idrotm[2],"ONLY");
499 gMC->Gspos("FWZ3", 6,"FLTC", xcoor, ycoor,-zcoor,idrotm[5],"ONLY");
503 ycoor = -yFLT*0.5 + kLengthExInModBorder*0.5;
504 zcoor = kExterInterModBorder2;
505 gMC->Gspos("FWZ3", 3,"FLTA", xcoor, ycoor, zcoor,idrotm[4],"ONLY");
506 gMC->Gspos("FWZ3", 4,"FLTA", xcoor, ycoor,-zcoor,idrotm[1],"ONLY");
510 ycoor = -yFLT*0.5 + kLengthExInModBorder*0.5;
511 zcoor = -kExterInterModBorder2 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
512 gMC->Gspos("FWZ3", 7,"FLTB", xcoor, ycoor, zcoor,idrotm[1],"ONLY");
513 gMC->Gspos("FWZ3", 8,"FLTC", xcoor, ycoor,-zcoor,idrotm[4],"ONLY");
516 trpa[0] = 0.5*(kExterInterModBorder2 - kExterInterModBorder1)/TMath::Cos(alpha);
517 trpa[1] = kModuleWallThickness;
519 trpa[3] = -beta*kRaddeg;
522 gMC->Gsvolu("FWZ4","PARA", idtmed[503], trpa, 6); // fibre glass
524 AliMatrix (idrotm[13],alpha*kRaddeg,90.,90.+alpha*kRaddeg,90.,90.,180.);
525 AliMatrix (idrotm[16],180.-alpha*kRaddeg,90.,90.-alpha*kRaddeg,90.,90.,0.);
529 zcoor = (kExterInterModBorder2 + kExterInterModBorder1)*0.5;
530 gMC->Gspos("FWZ4", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[16],"ONLY");
531 gMC->Gspos("FWZ4", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[13],"ONLY");
536 zcoor = -(kExterInterModBorder2 + kExterInterModBorder1)*0.5 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
537 gMC->Gspos("FWZ4", 3,"FLTB", xcoor, ycoor, zcoor,idrotm[13],"ONLY");
538 gMC->Gspos("FWZ4", 4,"FLTC", xcoor, ycoor,-zcoor,idrotm[16],"ONLY");
542 ///////////////// Detector itself //////////////////////
544 const Int_t knx = fTOFGeometry->NpadX(); // number of pads along x
545 const Int_t knz = fTOFGeometry->NpadZ(); // number of pads along z
546 const Float_t kPadX = fTOFGeometry->XPad(); // pad length along x
547 const Float_t kPadZ = fTOFGeometry->ZPad(); // pad length along z
549 // new description for strip volume -double stack strip-
550 // -- all constants are expressed in cm
551 // heigth of different layers
552 const Float_t khhony = 1.0 ; // heigth of HONY Layer
553 const Float_t khpcby = 0.08 ; // heigth of PCB Layer
554 const Float_t khrgly = 0.055 ; // heigth of RED GLASS Layer
556 const Float_t khfiliy = 0.125 ; // heigth of FISHLINE Layer
557 const Float_t khglassy = 0.160*0.5; // heigth of GLASS Layer
558 const Float_t khglfy = khfiliy+2.*khglassy;// heigth of GLASS+FISHLINE Layer
560 const Float_t khcpcby = 0.16 ; // heigth of PCB Central Layer
561 const Float_t kwhonz = 8.1 ; // z dimension of HONEY Layer
562 const Float_t kwpcbz1 = 10.6 ; // z dimension of PCB Lower Layer
563 const Float_t kwpcbz2 = 11.6 ; // z dimension of PCB Upper Layer
564 const Float_t kwcpcbz = 12.4 ; // z dimension of PCB Central Layer
565 const Float_t kwrglz = 8. ; // z dimension of RED GLASS Layer
566 const Float_t kwglfz = 7. ; // z dimension of GLASS+FISHLN Layer
567 const Float_t klsensmx = knx*kPadX; // length of Sensitive Layer
568 const Float_t khsensmy = 0.05;//0.11;//0.16;// heigth of Sensitive Layer
569 const Float_t kwsensmz = knz*kPadZ; // width of Sensitive Layer
571 // heigth of the FSTR Volume (the strip volume)
572 const Float_t khstripy = 2.*khhony+2.*khpcby+4.*khrgly+2.*khglfy+khcpcby;
574 // width of the FSTR Volume (the strip volume)
575 const Float_t kwstripz = kwcpcbz;
576 // length of the FSTR Volume (the strip volume)
577 const Float_t klstripx = fTOFGeometry->StripLength();
579 Float_t parfp[3]={klstripx*0.5,khstripy*0.5,kwstripz*0.5};
580 // Coordinates of the strip center in the strip reference frame;
581 // used for positioning internal strip volumes
582 Float_t posfp[3]={0.,0.,0.};
584 // FSTR volume definition-filling this volume with non sensitive Gas Mixture
585 gMC->Gsvolu("FSTR","BOX",idtmed[507],parfp,3); // Freon mix
587 //-- HONY Layer definition
588 parfp[1] = khhony*0.5;
589 parfp[2] = kwhonz*0.5;
590 gMC->Gsvolu("FHON","BOX",idtmed[501],parfp,3); // honeycomb (Nomex)
591 // positioning 2 HONY Layers on FSTR volume
592 posfp[1] =-khstripy*0.5+parfp[1];
593 gMC->Gspos("FHON",1,"FSTR",0., posfp[1],0.,0,"ONLY");
594 gMC->Gspos("FHON",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
596 //-- PCB Layer definition
597 parfp[1] = khpcby*0.5;
598 parfp[2] = kwpcbz1*0.5;
599 gMC->Gsvolu("FPC1","BOX",idtmed[502],parfp,3); // G10
600 parfp[2] = kwpcbz2*0.5;
601 gMC->Gsvolu("FPC2","BOX",idtmed[502],parfp,3); // G10
602 // positioning 2 PCB Layers on FSTR volume
603 posfp[1] =-khstripy*0.5+khhony+parfp[1];
604 gMC->Gspos("FPC1",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
605 gMC->Gspos("FPC2",1,"FSTR",0., posfp[1],0.,0,"ONLY");
607 //-- central PCB layer definition
608 parfp[1] = khcpcby*0.5;
609 parfp[2] = kwcpcbz*0.5;
610 gMC->Gsvolu("FPCB","BOX",idtmed[502],parfp,3); // G10
611 // positioning the central PCB layer
612 gMC->Gspos("FPCB",1,"FSTR",0.,0.,0.,0,"ONLY");
615 Float_t parfs[3] = {klsensmx*0.5, khsensmy*0.5, kwsensmz*0.5};
616 gMC->Gsvolu("FSEN","BOX",idtmed[508],parfs,3); // sensitive ...
617 // dividing FSEN along z in knz=2 and along x in knx=48
618 gMC->Gsdvn("FSEZ","FSEN",knz,3);
619 gMC->Gsdvn("FPAD","FSEZ",knx,1);
620 // positioning a Sensitive layer inside FPCB
621 gMC->Gspos("FSEN",1,"FPCB",0.,0.,0.,0,"ONLY");
623 //-- RED GLASS Layer definition
624 parfp[1] = khrgly*0.5;
625 parfp[2] = kwrglz*0.5;
626 gMC->Gsvolu("FRGL","BOX",idtmed[509],parfp,3); // glass
627 // positioning 4 RED GLASS Layers on FSTR volume
628 posfp[1] = -khstripy*0.5+khhony+khpcby+parfp[1];
629 gMC->Gspos("FRGL",1,"FSTR",0., posfp[1],0.,0,"ONLY");
630 gMC->Gspos("FRGL",4,"FSTR",0.,-posfp[1],0.,0,"ONLY");
631 posfp[1] = (khcpcby+khrgly)*0.5;
632 gMC->Gspos("FRGL",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
633 gMC->Gspos("FRGL",3,"FSTR",0., posfp[1],0.,0,"ONLY");
635 //-- GLASS Layer definition
636 parfp[1] = khglassy*0.5;
637 parfp[2] = kwglfz*0.5;
638 gMC->Gsvolu("FGLA","BOX",idtmed[509],parfp,3); // glass
640 // positioning 4 GLASS Layers on FSTR volume
641 posfp[1] = -khstripy*0.5+khhony+khpcby+khrgly+parfp[1];
642 gMC->Gspos("FGLA",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
643 gMC->Gspos("FGLA",4,"FSTR",0., posfp[1],0.,0,"ONLY");
644 posfp[1] = khcpcby*0.5+khrgly+khglassy*0.5;
645 gMC->Gspos("FGLA",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
646 gMC->Gspos("FGLA",3,"FSTR",0., posfp[1],0.,0,"ONLY");
648 //-- FREON Layer definition
649 parfp[1] = khfiliy*0.5;
650 gMC->Gsvolu("FFIS","BOX",idtmed[507],parfp,3); // freon
652 // positioning 2 FREON Layers on FSTR volume
653 posfp[1] = -khstripy*0.5+khhony+khpcby+khrgly+khglassy+parfp[1];
654 gMC->Gspos("FFIS",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
655 gMC->Gspos("FFIS",2,"FSTR",0., posfp[1],0.,0,"ONLY");
658 //-- GLASS+FISHLINE Layer definition
659 parfp[1] = khglfy*0.5;
660 parfp[2] = kwglfz*0.5;
661 gMC->Gsvolu("FGLF","BOX",idtmed[504],parfp,3);
663 // positioning 2 GLASS+FISHLINE Layers on FSTR volume
664 posfp[1] = (khcpcby+khglfy)*0.5+khrgly;
665 gMC->Gspos("FGLF",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
666 gMC->Gspos("FGLF",2,"FSTR",0., posfp[1],0.,0,"ONLY");
669 // Positioning the Strips (FSTR) in the FLT volumes
670 Int_t maxStripNumbers [5] ={fTOFGeometry->NStripC(),
671 fTOFGeometry->NStripB(),
672 fTOFGeometry->NStripA(),
673 fTOFGeometry->NStripB(),
674 fTOFGeometry->NStripC()};
676 Int_t totalStrip = 0;
677 Float_t xpos, zpos, ypos, ang;
678 for(Int_t iplate =0; iplate < fTOFGeometry->NPlates(); iplate++){
679 if (iplate>0) totalStrip += maxStripNumbers[iplate-1];
680 for(Int_t istrip =0; istrip < maxStripNumbers[iplate]; istrip++){
682 ang = fTOFGeometry->GetAngles(iplate,istrip);
683 AliDebug(1, Form(" iplate = %1i, istrip = %2i ---> ang = %f", iplate, istrip, ang));
685 if (ang>0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.+ang,90., ang, 90.);
686 else if (ang==0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.,90., 0., 0.);
687 else if (ang<0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.+ang,90.,-ang,270.);
690 zpos = fTOFGeometry->GetDistances(iplate,istrip);
691 ypos = fTOFGeometry->GetHeights(iplate,istrip);
693 gMC->Gspos("FSTR",istrip+totalStrip+1,"FLTA", xpos, ypos,-zpos,idrotm[istrip+totalStrip+1], "ONLY");
696 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");
697 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");
702 // 1.5 cm Al honeycomb layer between strips and cards
704 par[1] = kHoneycombLayerThickness*0.5;
706 gMC->Gsvolu("FPEA", "BOX ", idtmed[506], par, 3); // Al honeycomb
709 ycoor = kHoneycombLayerThickness*0.5;
711 gMC->Gspos ("FPEA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
715 par[1] = kHoneycombLayerThickness*0.5;
716 par[2] = (zlenA*0.5 - kInterCentrModBorder2-kModuleWallThickness)*0.5;
717 gMC->Gsvolu("FPEB", "BOX ", idtmed[506], par, 3); // Al honeycomb
720 ycoor = kHoneycombLayerThickness*0.5;
721 zcoor = (kInterCentrModBorder2-kInterCentrModBorder1)*0.5;
722 gMC->Gspos ("FPEB", 1, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
723 gMC->Gspos ("FPEB", 2, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
728 par[1] = (yFLT*0.5 - kHoneycombLayerThickness - khAlWall)*0.5;
730 gMC->Gsvolu("FAIA", "BOX ", idtmed[500], par, 3); // Air
733 ycoor = kHoneycombLayerThickness + (yFLT*0.5 - kHoneycombLayerThickness-khAlWall)*0.5;
735 gMC->Gspos ("FAIA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
739 par[1] = (yFLT*0.5 - kHoneycombLayerThickness - khAlWall)*0.5;
740 par[2] = (zlenA*0.5 - kInterCentrModBorder2 - kModuleWallThickness)*0.5;
741 gMC->Gsvolu("FAIB", "BOX ", idtmed[500], par, 3); // Air
742 gMC->Gsvolu("FAIC", "BOX ", idtmed[500], par, 3); // Air
745 ycoor = kHoneycombLayerThickness + (yFLT*0.5 - kHoneycombLayerThickness - khAlWall)*0.5;
746 zcoor = (kInterCentrModBorder2-kInterCentrModBorder1)*0.5;
747 gMC->Gspos ("FAIB", 0, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
748 gMC->Gspos ("FAIC", 0, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
751 // start with cards and cooling tubes
752 // finally, cards, cooling tubes and layer for thermal dispersion
755 // see GEOM200 in GEANT manual
759 // card volume definition
760 cardpar[0]= xFLT*0.5;
763 gMC->Gsvolu("FCAR", "BOX ", idtmed[502], cardpar, 3); // PCB Card
765 //alu plate volume definition
768 gMC->Gsvolu("FALP", "BOX ", idtmed[505], cardpar, 3); // Alu Plate
770 // tube volume definition
775 gMC->Gsvolu("FTUB", "TUBE", idtmed[511], tubepar, 3); // cooling tubes (steel)
780 gMC->Gsvolu("FITU", "TUBE", idtmed[510], tubepar, 3); // cooling water
781 // positioning water tube into the steel one
782 gMC->Gspos("FITU",1,"FTUB",0.,0.,0.,0,"ONLY");
785 AliMatrix(idrotm[99], 180., 90., 90., 90., 90., 0.);
787 // central module positioning
788 Float_t cardpos[3], aplpos2;
789 Float_t stepforcardA = 6.625;
791 Float_t aplpos1 = -2.;
796 // tubepos= -53.+tdis;
798 for (icard=39; icard<54; ++icard) {
799 cardpos[2]= cardpos[2]+stepforcardA;
800 aplpos2 = cardpos[2]+0.15;
801 gMC->Gspos("FCAR",icard,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
802 gMC->Gspos("FALP",icard,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
803 gMC->Gspos("FTUB",icard,"FAIA", 0.,cardpos[1],cardpos[2]+tdis,idrotm[99],"ONLY");
806 // intermediate module positioning
807 Float_t stepforcardB= 7.05;
811 for (icard=20; icard<39; ++icard) {
812 cardpos[2]= cardpos[2]+stepforcardB;
813 aplpos2 = cardpos[2]+0.15;
815 gMC->Gspos("FCAR",icard+34,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
816 gMC->Gspos("FALP",icard+34,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
817 gMC->Gspos("FTUB",icard+34,"FAIA", 0.,cardpos[1], cardpos[2]+tdis,idrotm[99],"ONLY");
818 gMC->Gspos("FCAR",58-icard,"FAIA",cardpos[0],cardpos[1], -cardpos[2], 0,"ONLY");
819 gMC->Gspos("FALP",58-icard,"FAIA",cardpos[0], aplpos1, -aplpos2, 0,"ONLY");
820 gMC->Gspos("FTUB",58-icard,"FAIA", 0.,cardpos[1],-cardpos[2]-tdis,idrotm[99],"ONLY");
823 gMC->Gspos("FCAR",icard+34+182,"FAIC",cardpos[0],cardpos[1], cardpos[2]-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
824 gMC->Gspos("FALP",icard+34+182,"FAIC",cardpos[0], aplpos1, aplpos2-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
825 gMC->Gspos("FTUB",icard+34+182,"FAIC", 0.,cardpos[1], cardpos[2]+tdis-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
826 gMC->Gspos("FCAR",58-icard+ 91,"FAIB",cardpos[0],cardpos[1], -cardpos[2]+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
827 gMC->Gspos("FALP",58-icard+ 91,"FAIB",cardpos[0], aplpos1, -aplpos2+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
828 gMC->Gspos("FTUB",58-icard+ 91,"FAIB", 0.,cardpos[1],-cardpos[2]-tdis+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
833 // outer module positioning
834 Float_t stepforcardC= 8.45238;
837 for (icard=1; icard<20; ++icard) {
838 cardpos[2]= cardpos[2]+stepforcardC;
839 aplpos2 = cardpos[2]+0.15;
841 gMC->Gspos("FCAR",icard+72,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
842 gMC->Gspos("FALP",icard+72,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
843 gMC->Gspos("FTUB",icard+72,"FAIA", 0.,cardpos[1], cardpos[2]+tdis,idrotm[99],"ONLY");
844 gMC->Gspos("FCAR",20-icard,"FAIA",cardpos[0],cardpos[1], -cardpos[2], 0,"ONLY");
845 gMC->Gspos("FALP",20-icard,"FAIA",cardpos[0], aplpos1, -aplpos2, 0,"ONLY");
846 gMC->Gspos("FTUB",20-icard,"FAIA", 0.,cardpos[1],-cardpos[2]-tdis,idrotm[99],"ONLY");
849 gMC->Gspos("FCAR",icard+72+182,"FAIC",cardpos[0],cardpos[1], cardpos[2]-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
850 gMC->Gspos("FALP",icard+72+182,"FAIC",cardpos[0], aplpos1, aplpos2-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
851 gMC->Gspos("FTUB",icard+72+182,"FAIC", 0.,cardpos[1], cardpos[2]+tdis-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
852 gMC->Gspos("FCAR",20-icard+ 91,"FAIB",cardpos[0],cardpos[1], -cardpos[2]+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
853 gMC->Gspos("FALP",20-icard+ 91,"FAIB",cardpos[0], aplpos1, -aplpos2+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
854 gMC->Gspos("FTUB",20-icard+ 91,"FAIB", 0.,cardpos[1],-cardpos[2]-tdis+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
859 //_____________________________________________________________________________
860 void AliTOFv5T0::DrawModule() const
863 // Draw a shaded view of the Time Of Flight version 4
866 // Set everything unseen
867 gMC->Gsatt("*", "seen", -1);
870 //Set volumes visible
873 //Set ALIC mother transparent
874 gMC->Gsatt("ALIC","SEEN", 0);
877 // Level 1 for TOF volumes
878 gMC->Gsatt("B077","seen", 0);
881 // Level 2 for TOF volumes
882 gMC->Gsatt("B071","seen", 0);
883 gMC->Gsatt("B074","seen", 0);
884 gMC->Gsatt("B075","seen", 0);
885 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
886 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
889 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
890 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
891 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
892 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
893 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
895 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
896 gMC->Gsatt("BTO1","seen", 0);
899 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
900 gMC->Gsatt("BTO2","seen", 0);
903 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
904 gMC->Gsatt("BTO3","seen", 0);
906 // Level 3 of B071, B074 and B075
907 gMC->Gsatt("FTOA","SEEN", 0);
908 if (fTOFHoles) gMC->Gsatt("FTOB","SEEN", 0);
910 // Level 4 of B071, B074 and B075
911 gMC->Gsatt("FLTA","SEEN", 0);
912 if (fTOFHoles) gMC->Gsatt("FLTB","SEEN",0);
913 if (fTOFHoles) gMC->Gsatt("FLTC","SEEN",0);
915 // Level 5 of B071, B074 and B075
916 gMC->Gsatt("FAIA","SEEN",-1); // all FAIA sub-levels skipped -
917 if (fTOFHoles) gMC->Gsatt("FAIB","SEEN",-1); // all FAIB sub-levels skipped -
918 if (fTOFHoles) gMC->Gsatt("FAIC","SEEN",-1); // all FAIC sub-levels skipped -
920 gMC->Gsatt("FALA","SEEN", 0);
921 if (fTOFHoles) gMC->Gsatt("FALB","SEEN", 0);
923 gMC->Gsatt("FPEA","SEEN", 1);
924 if (fTOFHoles) gMC->Gsatt("FPEB","SEEN", 1);
926 gMC->Gsatt("FSTR","SEEN",-1); // all FSTR sub-levels skipped -
928 gMC->Gsatt("FWZ1","SEEN", 0);
929 gMC->Gsatt("FWZ2","SEEN", 0);
930 gMC->Gsatt("FWZ3","SEEN", 0);
931 gMC->Gsatt("FWZ4","SEEN", 0);
933 gMC->Gsatt("FZ1B","SEEN", 0);
934 gMC->Gsatt("FZ1C","SEEN", 0);
935 gMC->Gsatt("FZ2B","SEEN", 0);
938 gMC->Gdopt("hide", "on");
939 gMC->Gdopt("shad", "on");
940 gMC->Gsatt("*", "fill", 7);
941 gMC->SetClipBox(".");
942 gMC->SetClipBox("*", 100, 1000, 100, 1000, 100, 1000);
944 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
945 gMC->Gdhead(1111, "Time Of Flight");
946 gMC->Gdman(18, 3, "MAN");
947 gMC->Gdopt("hide","off");
949 //_____________________________________________________________________________
950 void AliTOFv5T0::DrawDetectorModules()
953 // Draw a shaded view of the TOF detector version 4
956 // Set everything unseen
957 gMC->Gsatt("*", "seen", -1);
960 //Set volumes visible
963 //Set ALIC mother transparent
964 gMC->Gsatt("ALIC","SEEN", 0);
967 // Level 1 for TOF volumes
968 gMC->Gsatt("B077","seen", 0);
971 // Level 2 for TOF volumes
972 gMC->Gsatt("B071","seen", 0);
973 gMC->Gsatt("B074","seen", 0);
974 gMC->Gsatt("B075","seen", 0);
975 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
976 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
979 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
980 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
981 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
982 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
983 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
985 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
986 gMC->Gsatt("BTO1","seen", 0);
989 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
990 gMC->Gsatt("BTO2","seen", 0);
993 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
994 gMC->Gsatt("BTO3","seen", 0);
996 // Level 3 of B071, B075 and B074
997 gMC->Gsatt("FTOA","seen",-2); // all FTOA sub-levels skipped -
999 gMC->Gsatt("FTOB","seen",-2); // all FTOB sub-levels skipped -
1000 gMC->Gsatt("FTOC","seen",-2); // all FTOC sub-levels skipped -
1003 gMC->Gdopt("hide","on");
1004 gMC->Gdopt("shad","on");
1005 gMC->Gsatt("*", "fill", 5);
1006 gMC->SetClipBox(".");
1007 gMC->SetClipBox("*", 100, 1000, 100, 1000, 0, 1000);
1008 gMC->DefaultRange();
1009 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
1010 gMC->Gdhead(1111,"TOF detector");
1011 gMC->Gdman(18, 3, "MAN");
1012 gMC->Gdopt("hide","off");
1015 //_____________________________________________________________________________
1016 void AliTOFv5T0::DrawDetectorStrips()
1019 // Draw a shaded view of the TOF strips for version 4
1022 // Set everything unseen
1023 gMC->Gsatt("*", "seen", -1);
1026 //Set volumes visible
1029 //Set ALIC mother transparent
1030 gMC->Gsatt("ALIC","SEEN", 0);
1033 // Level 1 for TOF volumes
1034 gMC->Gsatt("B077","seen", 0);
1037 // Level 2 for TOF volumes
1038 gMC->Gsatt("B071","seen", 0);
1039 gMC->Gsatt("B074","seen", 0);
1040 gMC->Gsatt("B075","seen", 0);
1041 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
1042 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
1045 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
1046 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
1047 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
1048 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
1049 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
1051 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
1052 gMC->Gsatt("BTO1","seen", 0);
1055 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
1056 gMC->Gsatt("BTO2","seen", 0);
1059 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
1060 gMC->Gsatt("BTO3","seen", 0);
1062 // Level 3 of B071, B074 and B075
1063 gMC->Gsatt("FTOA","SEEN", 0);
1065 gMC->Gsatt("FTOB","SEEN", 0);
1066 gMC->Gsatt("FTOC","SEEN", 0);
1069 // Level 4 of B071, B074 and B075
1070 gMC->Gsatt("FLTA","SEEN", 0);
1072 gMC->Gsatt("FLTB","SEEN", 0);
1073 gMC->Gsatt("FLTC","SEEN", 0);
1076 // Level 5 of B071, B074 and B075
1077 gMC->Gsatt("FAIA","SEEN",-1); // all FAIA sub-levels skipped -
1079 gMC->Gsatt("FAIB","SEEN",-1); // all FAIB sub-levels skipped -
1080 gMC->Gsatt("FAIC","SEEN",-1); // all FAIC sub-levels skipped -
1083 gMC->Gsatt("FALA","SEEN", 0);
1084 if (fTOFHoles) gMC->Gsatt("FALB","SEEN", 0);
1086 gMC->Gsatt("FPEA","SEEN", 0);
1087 if (fTOFHoles) gMC->Gsatt("FPEB","SEEN", 0);
1089 gMC->Gsatt("FSTR","SEEN",-2); // all FSTR sub-levels skipped -
1091 gMC->Gsatt("FWZ1","SEEN", 0);
1092 gMC->Gsatt("FWZ2","SEEN", 0);
1093 gMC->Gsatt("FWZ3","SEEN", 0);
1094 gMC->Gsatt("FWZ4","SEEN", 0);
1096 gMC->Gsatt("FZ1B","SEEN", 0);
1097 gMC->Gsatt("FZ1C","SEEN", 0);
1098 gMC->Gsatt("FZ2B","SEEN", 0);
1105 gMC->Gsatt("FALP","SEEN",0);
1106 gMC->Gsatt("FCAR","SEEN",0);
1107 gMC->Gsatt("FTUB","SEEN",-1); // all FTUB sub-levels skipped -
1110 gMC->Gsatt("FITU","SEEN",0);
1115 gMC->Gsatt("FGLF","SEEN",0);
1116 gMC->Gsatt("FHON","SEEN",0);
1117 gMC->Gsatt("FPC1","SEEN",0);
1118 gMC->Gsatt("FPC2","SEEN",0);
1119 gMC->Gsatt("FPCB","SEEN",0);
1120 gMC->Gsatt("FRGL","SEEN",0);
1122 // Level 2 of FPCB => Level 3 of FSTR
1123 gMC->Gsatt("FSEN","SEEN",0);
1124 gMC->Gsatt("FSEZ","SEEN",0);
1125 gMC->Gsatt("FPAD","SEEN",1);
1128 gMC->Gdopt("hide","on");
1129 gMC->Gdopt("shad","on");
1130 gMC->Gsatt("*", "fill", 5);
1131 gMC->SetClipBox(".");
1132 gMC->SetClipBox("*", 0, 1000, 0, 1000, 0, 1000);
1133 gMC->DefaultRange();
1134 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
1135 gMC->Gdhead(1111,"TOF Strips");
1136 gMC->Gdman(18, 3, "MAN");
1137 gMC->Gdopt("hide","off");
1140 //_____________________________________________________________________________
1141 void AliTOFv5T0::CreateMaterials()
1144 // Define materials for the Time Of Flight
1147 //AliTOF::CreateMaterials();
1149 Int_t isxfld = gAlice->Field()->Integ();
1150 Float_t sxmgmx = gAlice->Field()->Max();
1151 Float_t we[7], ae[7], na[7], fr[7], vl[7];
1155 //--- Quartz (SiO2) to simulate float glass
1156 // density tuned to have correct float glass
1158 Float_t aq[2] = { 28.0855,15.9994 };
1159 Float_t zq[2] = { 14.,8. };
1160 Float_t wq[2] = { 1.,2. };
1161 Float_t dq = 2.55; // std value: 2.2
1165 Float_t anox[4] = {12.01,1.01,16.00,14.01};
1166 Float_t znox[4] = { 6., 1., 8., 7.};
1167 Float_t wnox[4] = {14., 22., 2., 2.};
1168 Float_t dnox = 0.048;
1172 Float_t ag10[4] = {28.09,12.01,1.01,16.00};
1173 Float_t zg10[4] = {14., 6., 1., 8.};
1176 for (i = 0; i < nlmatg10; ++i) {
1192 MaterialMixer(we,ae,na,fr,vl,5);
1198 Float_t densg10 = 1.7;
1201 Float_t awa[2] = { 1., 16. };
1202 Float_t zwa[2] = { 1., 8. };
1203 Float_t wwa[2] = { 2., 1. };
1208 Float_t asteel[4] = { 55.847,51.9961,58.6934,28.0855 };
1209 Float_t zsteel[4] = { 26.,24.,28.,14. };
1210 Float_t wsteel[4] = { .715,.18,.1,.005 };
1213 Float_t aAir[4]={12.0107,14.0067,15.9994,39.948};
1214 Float_t zAir[4]={6.,7.,8.,18.};
1215 Float_t wAir[4]={0.000124,0.755267,0.231781,0.012827};
1216 Float_t dAir = 1.20479E-3;
1219 Float_t afg[4] = {28.09,16.00,12.01,1.01};
1220 Float_t zfg[4] = {14., 8., 6., 1.};
1221 Float_t wfg[4] = {0.12906,0.29405,0.51502,0.06187};
1222 Float_t dfg = 1.111;
1225 // --- Freon C2F4H2 + SF6
1226 Float_t afre[4]= {12.01,1.01,19.00,32.07};
1227 Float_t zfre[4]= { 6., 1., 9., 16.};
1228 Float_t wfre[4]= {0.21250,0.01787,0.74827,0.021355};
1229 Float_t densfre= 0.00375;
1232 //char namat[15] = " ";
1233 //Float_t ama[2], zma[2], dma, radl, absl, buf[1];
1236 AliMixture ( 0, "Air$", aAir, zAir, dAir, 4, wAir);
1237 AliMixture ( 1, "Nomex$", anox, znox, dnox, nnox, wnox);
1238 AliMixture ( 2, "G10$", ag10, zg10, densg10, nlmatg10, wmatg10);
1239 AliMixture ( 3, "fibre glass$", afg, zfg, dfg, nfg, wfg);
1240 AliMaterial( 4, "Al $", 26.98, 13., 2.7, 8.9, 37.2);
1241 AliMaterial( 5, "Al honeycomb$", 26.98, 13., 0.0496, 483., 2483.);
1242 AliMixture ( 6, "Freon$", afre, zfre, densfre, nfre, wfre);
1243 AliMixture ( 7, "Glass$", aq, zq, dq, nq, wq);
1245 // get freon and glass
1246 gMC->Gfmate((*fIdmate)[6],namat,ama[0],zma[0],dma,radl,absl,buf,nbuf);
1247 gMC->Gfmate((*fIdmate)[7],namat,ama[1],zma[1],dma,radl,absl,buf,nbuf);
1250 Float_t wgfr[2]= {0.0011,0.9989};
1251 Float_t dgfr = 1.434;
1253 AliMixture ( 8, "glass-freon$", ama, zma, dgfr, ngfr, wgfr);
1255 AliMixture ( 9, "Water$", awa, zwa, dwa, nwa, wwa);
1256 AliMixture (10, "STAINLESS STEEL$", asteel, zsteel, 7.88, 4, wsteel);
1258 Float_t epsil, stmin, deemax, stemax;
1261 // EPSIL = 0.1 ! Tracking precision,
1262 // STEMAX = 0.1 ! Maximum displacement for multiple scattering
1263 // DEEMAX = 0.1 ! Maximum fractional energy loss, DLS
1267 epsil = .001; // Tracking precision,
1268 stemax = -1.; // Maximum displacement for multiple scattering
1269 deemax = -.3; // Maximum fractional energy loss, DLS
1272 AliMedium( 1, "Air$", 0, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1273 AliMedium( 2,"Nomex$", 1, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1274 AliMedium( 3,"G10$", 2, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1275 AliMedium( 4,"fibre glass$", 3, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1276 //AliMedium( 5,"glass-freon$", 8, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1277 AliMedium( 6,"Al Frame$", 4, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1278 AliMedium( 7,"Al honeycomb$", 5, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1279 AliMedium( 8,"Fre$", 6, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1280 AliMedium( 9,"PCB-S$", 2, 1, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1281 AliMedium(10,"Glass$", 7, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1282 AliMedium(11,"Water$", 9, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1283 AliMedium(12,"STEEL$", 10, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1286 //_____________________________________________________________________________
1287 void AliTOFv5T0::Init()
1290 // Initialise the detector after the geometry has been defined
1292 AliDebug(1, "**************************************"
1294 "**************************************");
1295 AliDebug(1, " Version 4 of TOF initialing, "
1296 "symmetric TOF - Full Coverage version");
1300 fIdFTOA = gMC->VolId("FTOA");
1302 fIdFTOB = gMC->VolId("FTOB");
1303 fIdFTOC = gMC->VolId("FTOC");
1305 fIdFLTA = gMC->VolId("FLTA");
1307 fIdFLTB = gMC->VolId("FLTB");
1308 fIdFLTC = gMC->VolId("FLTC");
1311 AliDebug(1, "**************************************"
1313 "**************************************");
1316 //_____________________________________________________________________________
1317 void AliTOFv5T0::StepManager()
1321 // Procedure called at each step in the Time Of Flight
1324 TLorentzVector mom, pos;
1325 Float_t xm[3],pm[3],xpad[3],ppad[3];
1328 Int_t sector, plate, padx, padz, strip;
1329 Int_t copy, padzid, padxid, stripid, i;
1330 Int_t *idtmed = fIdtmed->GetArray()-499;
1331 Float_t incidenceAngle;
1333 const char * path71 = "B071";
1334 const char * path75 = "B075";
1335 const char * path74 = "B074";
1336 const char* volpath;
1341 gMC->IsTrackEntering()
1342 && gMC->TrackCharge()
1343 //&& gMC->GetMedium()==idtmed[508]
1344 && gMC->CurrentMedium()==idtmed[508]
1345 && gMC->CurrentVolID(copy)==fIdSens
1349 AddTrackReference(gAlice->GetMCApp()->GetCurrentTrackNumber());
1351 // getting information about hit volumes
1353 padzid=gMC->CurrentVolOffID(1,copy);
1357 padxid=gMC->CurrentVolOffID(0,copy);
1361 stripid=gMC->CurrentVolOffID(4,copy);
1365 gMC->TrackPosition(pos);
1366 gMC->TrackMomentum(mom);
1368 Double_t normMom=1./mom.Rho();
1370 // getting the coordinates in pad ref system
1372 xm[0] = (Float_t)pos.X();
1373 xm[1] = (Float_t)pos.Y();
1374 xm[2] = (Float_t)pos.Z();
1376 pm[0] = (Float_t)mom.X()*normMom;
1377 pm[1] = (Float_t)mom.Y()*normMom;
1378 pm[2] = (Float_t)mom.Z()*normMom;
1380 gMC->Gmtod(xm,xpad,1); // from MRS to DRS: coordinates convertion
1381 gMC->Gmtod(pm,ppad,2); // from MRS to DRS: direction cosinus convertion
1384 if (TMath::Abs(ppad[1])>1) {
1385 AliWarning("Abs(ppad) > 1");
1386 ppad[1]=TMath::Sign((Float_t)1,ppad[1]);
1388 incidenceAngle = TMath::ACos(ppad[1])*kRaddeg;
1391 if (strip < fTOFGeometry->NStripC()) {
1395 else if (strip >= fTOFGeometry->NStripC() &&
1396 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB()) {
1398 strip = strip - fTOFGeometry->NStripC();
1400 else if (strip >= fTOFGeometry->NStripC() + fTOFGeometry->NStripB() &&
1401 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA()) {
1403 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB();
1405 else if (strip >= fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA() &&
1406 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA() + fTOFGeometry->NStripB()) {
1408 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB() - fTOFGeometry->NStripA();
1412 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB() - fTOFGeometry->NStripA() - fTOFGeometry->NStripB();
1415 volpath=gMC->CurrentVolOffName(8);
1416 index=gMC->CurrentVolOffID(8,copy);
1420 if(strcmp(path71,volpath)==0 && index <6) sector=12+index;
1421 if(strcmp(path71,volpath)==0 && index >=6) sector=index-3;
1422 if(strcmp(path75,volpath)==0) sector=index-1;
1423 if(strcmp(path74,volpath)==0) sector=10+index;
1430 hits[6] = mom.Rho();
1435 hits[11]= incidenceAngle;
1436 hits[12]= gMC->Edep();
1437 hits[13]= gMC->TrackLength();
1445 AddT0Hit(gAlice->GetMCApp()->GetCurrentTrackNumber(),vol, hits);
1448 //-------------------------------------------------------------------
1449 void AliTOFv5T0::MaterialMixer(Float_t* p,Float_t* a,Float_t* m,Float_t* d,Float_t* s,Int_t n) {
1450 // a[] atomic weights vector (in)
1451 // (atoms present in more compound appear separately)
1452 // m[] number of corresponding atoms in the mixture (in)
1453 // d[] fraction of the compound relative to the corresponding atoms (in)
1454 // s[] further possible weights " " " " (in)
1456 for (Int_t i = 0; i < n; ++i) {
1457 p[i] = a[i]*m[i]*d[i]*s[i];
1460 for (Int_t i = 0; i < n; ++i) {
1462 // AliInfo(Form((\n weight[%i] = %f (,i,p[i]));