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.8 2006/04/20 22:30:50 hristov
19 Coding conventions (Annalisa)
21 Revision 1.7 2006/04/16 22:29:05 hristov
22 Coding conventions (Annalisa)
24 Revision 1.6 2006/03/20 08:20:35 decaro
25 Al layer: positioning correction
27 Revision 1.5 2006/03/20 07:54:20 decaro
28 Correction of some layer thickness
30 Revision 1.4 2006/03/13 12:35:44 decaro
31 Suppression of fractional Z warning
33 Revision 1.3 2006/02/28 10:38:00 decaro
34 AliTOFGeometry::fAngles, AliTOFGeometry::fHeights,
35 AliTOFGeometry::fDistances arrays: dimension definition in the right
38 Revision 1.2 2006/02/27 18:12:14 decaro
39 Remove in StepManager the dependence of hit indexes from parametrized
42 Revision 1.1 2005/12/15 08:55:33 decaro
43 New TOF geometry description (V5) -G. Cara Romeo and A. De Caro
46 Revision 0.1 2004 November G. Cara Romeo and A. De Caro
47 Implement new TOF geometry version
49 suppress few volume overlaps
50 (in the 4th TOF geometry version),
51 insert the realistic strip numbers and positions
55 ///////////////////////////////////////////////////////////////////////////////
57 // This class contains the functions for version 5 of the Time Of Flight //
60 // VERSION WITH 5 MODULES AND TILTED STRIPS //
62 // FULL COVERAGE VERSION + OPTION for PHOS holes //
67 <img src="picts/AliTOFv5T0Class.gif"> //
71 ///////////////////////////////////////////////////////////////////////////////
74 #include "TGeometry.h"
75 #include "TLorentzVector.h"
77 #include "TVirtualMC.h"
85 #include "AliTOFGeometry.h"
86 #include "AliTOFGeometryV5.h"
87 #include "AliTOFv5T0.h"
89 extern TDirectory *gDirectory;
90 extern TVirtualMC *gMC;
92 extern AliRun *gAlice;
96 //_____________________________________________________________________________
97 AliTOFv5T0::AliTOFv5T0()
100 // Default constructor
104 //_____________________________________________________________________________
105 AliTOFv5T0::AliTOFv5T0(const char *name, const char *title)
106 : AliTOF(name,title,"tzero")
109 // Standard constructor
112 // Check that FRAME is there otherwise we have no place where to
116 AliModule* frame = (AliModule*)gAlice->GetModule("FRAME");
118 AliFatal("TOF needs FRAME to be present");
121 if (fTOFGeometry) delete fTOFGeometry;
122 fTOFGeometry = new AliTOFGeometryV5();
124 if(frame->IsVersion()==1) {
125 AliInfo(Form("Frame version %d", frame->IsVersion()));
126 AliInfo("Full Coverage for TOF");
129 AliInfo(Form("Frame version %d", frame->IsVersion()));
130 AliInfo("TOF with Holes for PHOS");
133 fTOFGeometry->SetHoles(fTOFHoles);
135 //AliTOF::fTOFGeometry = fTOFGeometry;
138 TDirectory* saveDir = gDirectory;
139 gAlice->GetRunLoader()->CdGAFile();
140 fTOFGeometry->Write("TOFgeometry");
145 //____________________________________________________________________________
146 void AliTOFv5T0::BuildGeometry()
149 // Build TOF ROOT geometry for the ALICE event display
152 const int kColorTOF = 27;
154 TGeometry *globalGeometry = (TGeometry*)gAlice->GetGeometry();
157 top = globalGeometry->GetNode("alice");
159 // Position the different copies
160 const Float_t krTof =(fTOFGeometry->Rmax()+fTOFGeometry->Rmin())/2.;
161 const Float_t khTof = fTOFGeometry->Rmax()-fTOFGeometry->Rmin();
162 const Int_t kNTof = fTOFGeometry->NSectors();
163 const Float_t kangle = k2PI/kNTof;
165 const Float_t kInterCentrModBorder1 = 49.5;
166 const Float_t kInterCentrModBorder2 = 57.5;
170 // define offset for nodes
171 Float_t zOffsetB = (fTOFGeometry->ZlenA()*0.5 + (kInterCentrModBorder1+kInterCentrModBorder2)*0.5)*0.5;
172 Float_t zOffsetA = 0.;
173 // Define TOF basic volume
175 char nodeName0[7], nodeName1[7], nodeName2[7];
176 char nodeName3[7], nodeName4[7], rotMatNum[7];
179 new TBRIK("S_TOF_B","TOF box","void",
180 fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenB()*0.5);
181 new TBRIK("S_TOF_C","TOF box","void",
182 fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenB()*0.5);
184 new TBRIK("S_TOF_A","TOF box","void",
185 fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenA()*0.5);
187 for (Int_t nodeNum=1;nodeNum<19;nodeNum++){
190 sprintf(rotMatNum,"rot50%i",nodeNum);
191 sprintf(nodeName0,"FTO00%i",nodeNum);
192 sprintf(nodeName1,"FTO10%i",nodeNum);
193 sprintf(nodeName2,"FTO20%i",nodeNum);
194 sprintf(nodeName3,"FTO30%i",nodeNum);
195 sprintf(nodeName4,"FTO40%i",nodeNum);
198 sprintf(rotMatNum,"rot5%i",nodeNum);
199 sprintf(nodeName0,"FTO0%i",nodeNum);
200 sprintf(nodeName1,"FTO1%i",nodeNum);
201 sprintf(nodeName2,"FTO2%i",nodeNum);
202 sprintf(nodeName3,"FTO3%i",nodeNum);
203 sprintf(nodeName4,"FTO4%i",nodeNum);
206 new TRotMatrix(rotMatNum,rotMatNum,90,-20*nodeNum,90,90-20*nodeNum,0,0);
207 ang = (4.5-nodeNum) * kangle;
211 node = new TNode(nodeName2,nodeName2,"S_TOF_B", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang), zOffsetB,rotMatNum);
212 node->SetLineColor(kColorTOF);
216 node = new TNode(nodeName3,nodeName3,"S_TOF_C", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang),-zOffsetB,rotMatNum);
217 node->SetLineColor(kColorTOF);
222 node = new TNode(nodeName4,nodeName4,"S_TOF_A", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang), zOffsetA,rotMatNum);
223 node->SetLineColor(kColorTOF);
225 } // end loop on nodeNum
229 //_____________________________________________________________________________
230 void AliTOFv5T0::CreateGeometry()
233 // Create geometry for Time Of Flight version 0
237 <img src="picts/AliTOFv5T0.gif">
241 // Creates common geometry
243 AliTOF::CreateGeometry();
247 //_____________________________________________________________________________
248 void AliTOFv5T0::TOFpc(Float_t xtof, Float_t ytof, Float_t zlenA,
252 // Definition of the Time Of Fligh Resistive Plate Chambers
255 const Float_t kPi = TMath::Pi();
257 const Float_t kInterCentrModBorder1 = 49.5;
258 const Float_t kInterCentrModBorder2 = 57.5;
259 const Float_t kExterInterModBorder1 = 196.0;
260 const Float_t kExterInterModBorder2 = 203.5;
262 const Float_t kLengthExInModBorder = 4.7;
263 const Float_t kLengthInCeModBorder = 7.0;
265 // Al layers over all internal module walls (cm)
266 const Float_t khAlWall = 0.03;
268 // module wall thickness (cm)
269 const Float_t kModuleWallThickness = 0.3;
271 // Al honeycomb layer between strips and cards (cm)
272 const Float_t kHoneycombLayerThickness = 1.5;
274 AliDebug(2,Form("zlenA*0.5 = %d", zlenA*0.5));
275 AliDebug(1, "************************* TOF geometry **************************");
277 // Definition of the Time Of Fligh Resistive Plate Chambers
278 // xFLT, yFLT, zFLT - sizes of TOF modules (large)
280 Float_t xcoor, ycoor, zcoor;
282 Int_t *idtmed = fIdtmed->GetArray()-499;
287 par[2] = zlenA * 0.5;
288 gMC->Gsvolu("FTOA", "BOX ", idtmed[503], par, 3); // fibre glass
293 par[2] = (zlenA*0.5 - kInterCentrModBorder1)*0.5;
294 gMC->Gsvolu("FTOB", "BOX ", idtmed[503], par, 3); // fibre glass
295 gMC->Gsvolu("FTOC", "BOX ", idtmed[503], par, 3); // fibre glass
298 // Positioning of fibre glass modules (FTOA, FTOB and FTOC)
300 //AliMatrix(idrotm[0], 90., 0., 0., 0., 90.,-90.);
301 AliMatrix(idrotm[0], 90., 0., 0., 0., 90.,270.);
306 for(Int_t isec=0;isec<18;isec++){
307 if(fTOFSectors[isec]==-1)continue;
309 sprintf(name, "BTOF%d",isec);
310 if (fTOFHoles && (isec==16||isec==17)) {
312 ycoor = (zlenA*0.5 + kInterCentrModBorder1)*0.5;
314 gMC->Gspos("FTOB", 0, name, xcoor, ycoor, zcoor, idrotm[0], "ONLY");
315 gMC->Gspos("FTOC", 0, name, xcoor,-ycoor, zcoor, idrotm[0], "ONLY");
317 else gMC->Gspos("FTOA", 0,name, xcoor, ycoor, zcoor, idrotm[0], "ONLY");
319 // Large not sensitive volumes with Insensitive Freon (FLTA, FLTB and FLTC)
321 Float_t xFLT, yFLT, zFLTA;
323 xFLT = xtof - kModuleWallThickness*2.;
324 yFLT = ytof - kModuleWallThickness*2.;
325 zFLTA = zlenA - kModuleWallThickness*2.;
330 gMC->Gsvolu("FLTA", "BOX ", idtmed[507], par, 3); // Freon mix
335 gMC->Gspos ("FLTA", 0, "FTOA", xcoor, ycoor, zcoor, 0, "ONLY");
340 par[2] = (zlenA*0.5 - kInterCentrModBorder1-kModuleWallThickness)*0.5;
341 gMC->Gsvolu("FLTB", "BOX ", idtmed[507], par, 3); // Freon mix
342 gMC->Gsvolu("FLTC", "BOX ", idtmed[507], par, 3); // Freon mix
346 zcoor = kModuleWallThickness*0.5;
347 gMC->Gspos ("FLTB", 0, "FTOB", xcoor, ycoor, zcoor, 0, "ONLY");
348 gMC->Gspos ("FLTC", 0, "FTOC", xcoor, ycoor,-zcoor, 0, "ONLY");
351 // Layer of Aluminum before detector (FALA, FALB and FALC)
354 par[1] = khAlWall*0.5;
355 par[2] = kInterCentrModBorder1 - (kModuleWallThickness + khAlWall);
356 gMC->Gsvolu("FALA", "BOX ", idtmed[505], par, 3); // Alluminium
359 ycoor = (-yFLT + khAlWall)*0.5;
361 gMC->Gspos ("FALA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
364 par[1] = khAlWall*0.5;
365 par[2] = (kExterInterModBorder2 - kInterCentrModBorder1 - 2.*(kModuleWallThickness + khAlWall))*0.5;
366 gMC->Gsvolu("FALB", "BOX ", idtmed[505], par, 3); // Alluminium
369 ycoor = (-yFLT + khAlWall)*0.5;
370 zcoor = (kExterInterModBorder2 + kInterCentrModBorder1)*0.5;
371 gMC->Gspos ("FALB", 1, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
372 gMC->Gspos ("FALB", 2, "FLTA", xcoor, ycoor,-zcoor, 0, "ONLY");
375 par[1] = khAlWall*0.5;
376 par[2] = (zlenA*0.5 - kExterInterModBorder2 - 2.*(kModuleWallThickness + khAlWall))*0.5;
377 gMC->Gsvolu("FALC", "BOX ", idtmed[505], par, 3); // Alluminium
380 ycoor = (-yFLT + khAlWall)*0.5;
381 zcoor = (kExterInterModBorder2+zlenA*0.5)*0.5;
382 gMC->Gspos ("FALC", 1, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
383 gMC->Gspos ("FALC", 2, "FLTA", xcoor, ycoor,-zcoor, 0, "ONLY");
387 ycoor = (-yFLT + khAlWall)*0.5;
388 zcoor = (zlenA*0.5 - kExterInterModBorder2)*0.5 - kModuleWallThickness*0.5;
389 gMC->Gspos ("FALB", 1, "FLTB", xcoor, ycoor, zcoor, 0, "ONLY");
390 gMC->Gspos ("FALB", 2, "FLTC", xcoor, ycoor,-zcoor, 0, "ONLY");
393 ycoor = (-yFLT + khAlWall)*0.5;
394 zcoor = (kExterInterModBorder2 - kInterCentrModBorder1)*0.5 + kModuleWallThickness*0.5;
395 gMC->Gspos ("FALC", 1, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
396 gMC->Gspos ("FALC", 2, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
399 Float_t y0, alpha, tgal, beta, tgbe, trpa[11];
401 // Fibre glass walls between central and intermediate modules (FWZ1 and FWZ2; holes -> FZ1B, FZ1C, FZ2B)
403 tgal = (yFLT*0.5 - 2.*kLengthInCeModBorder)/(kInterCentrModBorder2 - kInterCentrModBorder1);
404 alpha = TMath::ATan(tgal);
405 beta = (kPi*0.5 - alpha)*0.5;
406 tgbe = TMath::Tan(beta);
410 trpa[3] = kModuleWallThickness;
411 trpa[4] = (kLengthInCeModBorder - kModuleWallThickness*tgbe)*0.5;
412 trpa[5] = (kLengthInCeModBorder + kModuleWallThickness*tgbe)*0.5;
413 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
414 trpa[7] = kModuleWallThickness;
415 trpa[8] = (kLengthInCeModBorder - kModuleWallThickness*tgbe)*0.5;
416 trpa[9] = (kLengthInCeModBorder + kModuleWallThickness*tgbe)*0.5;
417 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
418 gMC->Gsvolu("FWZ1","TRAP", idtmed[503], trpa, 11); // fibre glass
420 AliMatrix (idrotm[1],90., 90.,180.,0.,90.,180.);
421 AliMatrix (idrotm[4],90., 90., 0.,0.,90., 0.);
424 ycoor = -yFLT*0.5 + kLengthInCeModBorder*0.5;
425 zcoor = kInterCentrModBorder1;
426 gMC->Gspos("FWZ1", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[1],"ONLY");
427 gMC->Gspos("FWZ1", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[4],"ONLY");
430 y0 = kLengthInCeModBorder - kModuleWallThickness*0.5*tgbe;
434 trpa[3] = kModuleWallThickness*0.5;
435 trpa[4] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
436 trpa[5] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
437 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
438 trpa[7] = kModuleWallThickness*0.5;
439 trpa[8] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
440 trpa[9] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
441 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
442 gMC->Gsvolu("FZ1B","TRAP", idtmed[503], trpa, 11); // fibre glass
445 ycoor = -yFLT*0.5 + kLengthInCeModBorder*0.5 - kModuleWallThickness*0.25*tgbe;
446 zcoor = -kInterCentrModBorder1 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
447 gMC->Gspos("FZ1B", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[4],"ONLY");
448 gMC->Gspos("FZ1B", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[1],"ONLY");
451 AliMatrix (idrotm[2],90.,270., 0.,0.,90.,180.);
452 AliMatrix (idrotm[5],90.,270.,180.,0.,90., 0.);
455 ycoor = -kLengthInCeModBorder*0.5;
456 zcoor = kInterCentrModBorder2;
457 gMC->Gspos("FWZ1", 3,"FLTA", xcoor, ycoor, zcoor,idrotm[2],"ONLY");
458 gMC->Gspos("FWZ1", 4,"FLTA", xcoor, ycoor,-zcoor,idrotm[5],"ONLY");
461 y0 = kLengthInCeModBorder + kModuleWallThickness*0.5*tgbe;
465 trpa[3] = kModuleWallThickness*0.5;
466 trpa[4] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
467 trpa[5] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
468 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
469 trpa[7] = kModuleWallThickness*0.5;
470 trpa[8] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
471 trpa[9] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
472 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
473 gMC->Gsvolu("FZ1C","TRAP", idtmed[503], trpa, 11); // fibre glass
476 ycoor = -kLengthInCeModBorder*0.5 - kModuleWallThickness*0.25*tgbe;
477 zcoor = -kInterCentrModBorder2 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
478 gMC->Gspos("FZ1C", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[5],"ONLY");
479 gMC->Gspos("FZ1C", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[2],"ONLY");
482 trpa[0] = 0.5*(kInterCentrModBorder2 - kInterCentrModBorder1)/TMath::Cos(alpha);
483 trpa[1] = kModuleWallThickness;
485 trpa[3] = -beta*kRaddeg;
488 gMC->Gsvolu("FWZ2","PARA", idtmed[503], trpa, 6); // fibre glass
490 AliMatrix (idrotm[3], alpha*kRaddeg,90.,90.+alpha*kRaddeg,90.,90.,180.);
491 AliMatrix (idrotm[6],180.-alpha*kRaddeg,90.,90.-alpha*kRaddeg,90.,90., 0.);
495 zcoor = (kInterCentrModBorder2 + kInterCentrModBorder1)*0.5;
496 gMC->Gspos("FWZ2", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[3],"ONLY");
497 gMC->Gspos("FWZ2", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[6],"ONLY");
500 trpa[0] = 0.5*(kInterCentrModBorder2 - kInterCentrModBorder1)/TMath::Cos(alpha);
501 trpa[1] = kModuleWallThickness*0.5;
503 trpa[3] = -beta*kRaddeg;
506 gMC->Gsvolu("FZ2B","PARA", idtmed[503], trpa, 6); // fibre glass
509 ycoor = -yFLT*0.25 - kModuleWallThickness*0.5*tgbe;
510 zcoor = -(kInterCentrModBorder2 + kInterCentrModBorder1)*0.5 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
511 gMC->Gspos("FZ2B", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[6],"ONLY");
512 gMC->Gspos("FZ2B", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[3],"ONLY");
515 // Fibre glass walls between intermediate and lateral modules (FWZ3 and FWZ4)
517 tgal = (yFLT*0.5 - 2.*kLengthExInModBorder)/(kExterInterModBorder2 - kExterInterModBorder1);
518 alpha = TMath::ATan(tgal);
519 beta = (kPi*0.5 - alpha)*0.5;
520 tgbe = TMath::Tan(beta);
524 trpa[3] = kModuleWallThickness;
525 trpa[4] = (kLengthExInModBorder - kModuleWallThickness*tgbe)*0.5;
526 trpa[5] = (kLengthExInModBorder + kModuleWallThickness*tgbe)*0.5;
527 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
528 trpa[7] = kModuleWallThickness;
529 trpa[8] = (kLengthExInModBorder - kModuleWallThickness*tgbe)*0.5;
530 trpa[9] = (kLengthExInModBorder + kModuleWallThickness*tgbe)*0.5;
531 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
532 gMC->Gsvolu("FWZ3","TRAP", idtmed[503], trpa, 11); // fibre glass
535 ycoor = -kLengthExInModBorder*0.5;
536 zcoor = kExterInterModBorder1;
537 gMC->Gspos("FWZ3", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[5],"ONLY");
538 gMC->Gspos("FWZ3", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[2],"ONLY");
542 ycoor = -kLengthExInModBorder*0.5;
543 zcoor = -kExterInterModBorder1 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
544 gMC->Gspos("FWZ3", 5,"FLTB", xcoor, ycoor, zcoor,idrotm[2],"ONLY");
545 gMC->Gspos("FWZ3", 6,"FLTC", xcoor, ycoor,-zcoor,idrotm[5],"ONLY");
549 ycoor = -yFLT*0.5 + kLengthExInModBorder*0.5;
550 zcoor = kExterInterModBorder2;
551 gMC->Gspos("FWZ3", 3,"FLTA", xcoor, ycoor, zcoor,idrotm[4],"ONLY");
552 gMC->Gspos("FWZ3", 4,"FLTA", xcoor, ycoor,-zcoor,idrotm[1],"ONLY");
556 ycoor = -yFLT*0.5 + kLengthExInModBorder*0.5;
557 zcoor = -kExterInterModBorder2 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
558 gMC->Gspos("FWZ3", 7,"FLTB", xcoor, ycoor, zcoor,idrotm[1],"ONLY");
559 gMC->Gspos("FWZ3", 8,"FLTC", xcoor, ycoor,-zcoor,idrotm[4],"ONLY");
562 trpa[0] = 0.5*(kExterInterModBorder2 - kExterInterModBorder1)/TMath::Cos(alpha);
563 trpa[1] = kModuleWallThickness;
565 trpa[3] = -beta*kRaddeg;
568 gMC->Gsvolu("FWZ4","PARA", idtmed[503], trpa, 6); // fibre glass
570 AliMatrix (idrotm[13],alpha*kRaddeg,90.,90.+alpha*kRaddeg,90.,90.,180.);
571 AliMatrix (idrotm[16],180.-alpha*kRaddeg,90.,90.-alpha*kRaddeg,90.,90.,0.);
575 zcoor = (kExterInterModBorder2 + kExterInterModBorder1)*0.5;
576 gMC->Gspos("FWZ4", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[16],"ONLY");
577 gMC->Gspos("FWZ4", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[13],"ONLY");
582 zcoor = -(kExterInterModBorder2 + kExterInterModBorder1)*0.5 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
583 gMC->Gspos("FWZ4", 3,"FLTB", xcoor, ycoor, zcoor,idrotm[13],"ONLY");
584 gMC->Gspos("FWZ4", 4,"FLTC", xcoor, ycoor,-zcoor,idrotm[16],"ONLY");
588 ///////////////// Detector itself //////////////////////
590 const Int_t knx = fTOFGeometry->NpadX(); // number of pads along x
591 const Int_t knz = fTOFGeometry->NpadZ(); // number of pads along z
592 const Float_t kPadX = fTOFGeometry->XPad(); // pad length along x
593 const Float_t kPadZ = fTOFGeometry->ZPad(); // pad length along z
595 // new description for strip volume -double stack strip-
596 // -- all constants are expressed in cm
597 // heigth of different layers
598 const Float_t khhony = 1.0 ; // heigth of HONY Layer
599 const Float_t khpcby = 0.08 ; // heigth of PCB Layer
600 const Float_t khrgly = 0.055 ; // heigth of RED GLASS Layer
602 const Float_t khfiliy = 0.125 ; // heigth of FISHLINE Layer
603 const Float_t khglassy = 0.160*0.5; // heigth of GLASS Layer
604 const Float_t khglfy = khfiliy+2.*khglassy;// heigth of GLASS+FISHLINE Layer
606 const Float_t khcpcby = 0.16 ; // heigth of PCB Central Layer
607 const Float_t kwhonz = 8.1 ; // z dimension of HONEY Layer
608 const Float_t kwpcbz1 = 10.6 ; // z dimension of PCB Lower Layer
609 const Float_t kwpcbz2 = 11.6 ; // z dimension of PCB Upper Layer
610 const Float_t kwcpcbz = 12.4 ; // z dimension of PCB Central Layer
611 const Float_t kwrglz = 8. ; // z dimension of RED GLASS Layer
612 const Float_t kwglfz = 7. ; // z dimension of GLASS+FISHLN Layer
613 const Float_t klsensmx = knx*kPadX; // length of Sensitive Layer
614 const Float_t khsensmy = 0.05;//0.11;//0.16;// heigth of Sensitive Layer
615 const Float_t kwsensmz = knz*kPadZ; // width of Sensitive Layer
617 // heigth of the FSTR Volume (the strip volume)
618 const Float_t khstripy = 2.*khhony+2.*khpcby+4.*khrgly+2.*khglfy+khcpcby;
620 // width of the FSTR Volume (the strip volume)
621 const Float_t kwstripz = kwcpcbz;
622 // length of the FSTR Volume (the strip volume)
623 const Float_t klstripx = fTOFGeometry->StripLength();
625 Float_t parfp[3]={klstripx*0.5,khstripy*0.5,kwstripz*0.5};
626 // Coordinates of the strip center in the strip reference frame;
627 // used for positioning internal strip volumes
628 Float_t posfp[3]={0.,0.,0.};
630 // FSTR volume definition-filling this volume with non sensitive Gas Mixture
631 gMC->Gsvolu("FSTR","BOX",idtmed[507],parfp,3); // Freon mix
633 //-- HONY Layer definition
634 parfp[1] = khhony*0.5;
635 parfp[2] = kwhonz*0.5;
636 gMC->Gsvolu("FHON","BOX",idtmed[501],parfp,3); // honeycomb (Nomex)
637 // positioning 2 HONY Layers on FSTR volume
638 posfp[1] =-khstripy*0.5+parfp[1];
639 gMC->Gspos("FHON",1,"FSTR",0., posfp[1],0.,0,"ONLY");
640 gMC->Gspos("FHON",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
642 //-- PCB Layer definition
643 parfp[1] = khpcby*0.5;
644 parfp[2] = kwpcbz1*0.5;
645 gMC->Gsvolu("FPC1","BOX",idtmed[502],parfp,3); // G10
646 parfp[2] = kwpcbz2*0.5;
647 gMC->Gsvolu("FPC2","BOX",idtmed[502],parfp,3); // G10
648 // positioning 2 PCB Layers on FSTR volume
649 posfp[1] =-khstripy*0.5+khhony+parfp[1];
650 gMC->Gspos("FPC1",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
651 gMC->Gspos("FPC2",1,"FSTR",0., posfp[1],0.,0,"ONLY");
653 //-- central PCB layer definition
654 parfp[1] = khcpcby*0.5;
655 parfp[2] = kwcpcbz*0.5;
656 gMC->Gsvolu("FPCB","BOX",idtmed[502],parfp,3); // G10
657 // positioning the central PCB layer
658 gMC->Gspos("FPCB",1,"FSTR",0.,0.,0.,0,"ONLY");
661 Float_t parfs[3] = {klsensmx*0.5, khsensmy*0.5, kwsensmz*0.5};
662 gMC->Gsvolu("FSEN","BOX",idtmed[508],parfs,3); // sensitive ...
663 // dividing FSEN along z in knz=2 and along x in knx=48
664 gMC->Gsdvn("FSEZ","FSEN",knz,3);
665 gMC->Gsdvn("FPAD","FSEZ",knx,1);
666 // positioning a Sensitive layer inside FPCB
667 gMC->Gspos("FSEN",1,"FPCB",0.,0.,0.,0,"ONLY");
669 //-- RED GLASS Layer definition
670 parfp[1] = khrgly*0.5;
671 parfp[2] = kwrglz*0.5;
672 gMC->Gsvolu("FRGL","BOX",idtmed[509],parfp,3); // glass
673 // positioning 4 RED GLASS Layers on FSTR volume
674 posfp[1] = -khstripy*0.5+khhony+khpcby+parfp[1];
675 gMC->Gspos("FRGL",1,"FSTR",0., posfp[1],0.,0,"ONLY");
676 gMC->Gspos("FRGL",4,"FSTR",0.,-posfp[1],0.,0,"ONLY");
677 posfp[1] = (khcpcby+khrgly)*0.5;
678 gMC->Gspos("FRGL",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
679 gMC->Gspos("FRGL",3,"FSTR",0., posfp[1],0.,0,"ONLY");
681 //-- GLASS Layer definition
682 parfp[1] = khglassy*0.5;
683 parfp[2] = kwglfz*0.5;
684 gMC->Gsvolu("FGLA","BOX",idtmed[509],parfp,3); // glass
686 // positioning 4 GLASS Layers on FSTR volume
687 posfp[1] = -khstripy*0.5+khhony+khpcby+khrgly+parfp[1];
688 gMC->Gspos("FGLA",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
689 gMC->Gspos("FGLA",4,"FSTR",0., posfp[1],0.,0,"ONLY");
690 posfp[1] = khcpcby*0.5+khrgly+khglassy*0.5;
691 gMC->Gspos("FGLA",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
692 gMC->Gspos("FGLA",3,"FSTR",0., posfp[1],0.,0,"ONLY");
694 //-- FREON Layer definition
695 parfp[1] = khfiliy*0.5;
696 gMC->Gsvolu("FFIS","BOX",idtmed[507],parfp,3); // freon
698 // positioning 2 FREON Layers on FSTR volume
699 posfp[1] = -khstripy*0.5+khhony+khpcby+khrgly+khglassy+parfp[1];
700 gMC->Gspos("FFIS",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
701 gMC->Gspos("FFIS",2,"FSTR",0., posfp[1],0.,0,"ONLY");
704 //-- GLASS+FISHLINE Layer definition
705 parfp[1] = khglfy*0.5;
706 parfp[2] = kwglfz*0.5;
707 gMC->Gsvolu("FGLF","BOX",idtmed[504],parfp,3);
709 // positioning 2 GLASS+FISHLINE Layers on FSTR volume
710 posfp[1] = (khcpcby+khglfy)*0.5+khrgly;
711 gMC->Gspos("FGLF",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
712 gMC->Gspos("FGLF",2,"FSTR",0., posfp[1],0.,0,"ONLY");
715 // Positioning the Strips (FSTR) in the FLT volumes
716 Int_t maxStripNumbers [5] ={fTOFGeometry->NStripC(),
717 fTOFGeometry->NStripB(),
718 fTOFGeometry->NStripA(),
719 fTOFGeometry->NStripB(),
720 fTOFGeometry->NStripC()};
722 Int_t totalStrip = 0;
723 Float_t xpos, zpos, ypos, ang;
724 for(Int_t iplate =0; iplate < fTOFGeometry->NPlates(); iplate++){
725 if (iplate>0) totalStrip += maxStripNumbers[iplate-1];
726 for(Int_t istrip =0; istrip < maxStripNumbers[iplate]; istrip++){
728 ang = fTOFGeometry->GetAngles(iplate,istrip);
729 AliDebug(1, Form(" iplate = %1i, istrip = %2i ---> ang = %f", iplate, istrip, ang));
731 if (ang>0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.+ang,90., ang, 90.);
732 else if (ang==0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.,90., 0., 0.);
733 else if (ang<0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.+ang,90.,-ang,270.);
736 zpos = fTOFGeometry->GetDistances(iplate,istrip);
737 ypos = fTOFGeometry->GetHeights(iplate,istrip);
739 gMC->Gspos("FSTR",istrip+totalStrip+1,"FLTA", xpos, ypos,-zpos,idrotm[istrip+totalStrip+1], "ONLY");
742 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");
743 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");
748 // 1.5 cm Al honeycomb layer between strips and cards
750 par[1] = kHoneycombLayerThickness*0.5;
752 gMC->Gsvolu("FPEA", "BOX ", idtmed[506], par, 3); // Al honeycomb
755 ycoor = kHoneycombLayerThickness*0.5;
757 gMC->Gspos ("FPEA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
761 par[1] = kHoneycombLayerThickness*0.5;
762 par[2] = (zlenA*0.5 - kInterCentrModBorder2-kModuleWallThickness)*0.5;
763 gMC->Gsvolu("FPEB", "BOX ", idtmed[506], par, 3); // Al honeycomb
766 ycoor = kHoneycombLayerThickness*0.5;
767 zcoor = (kInterCentrModBorder2-kInterCentrModBorder1)*0.5;
768 gMC->Gspos ("FPEB", 1, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
769 gMC->Gspos ("FPEB", 2, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
774 par[1] = (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
776 gMC->Gsvolu("FAIA", "BOX ", idtmed[500], par, 3); // Air
779 ycoor = kHoneycombLayerThickness + (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
781 gMC->Gspos ("FAIA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
785 par[1] = (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
786 par[2] = (zlenA*0.5 - kInterCentrModBorder2 - kModuleWallThickness)*0.5;
787 gMC->Gsvolu("FAIB", "BOX ", idtmed[500], par, 3); // Air
788 gMC->Gsvolu("FAIC", "BOX ", idtmed[500], par, 3); // Air
791 ycoor = kHoneycombLayerThickness + (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
792 zcoor = (kInterCentrModBorder2-kInterCentrModBorder1)*0.5;
793 gMC->Gspos ("FAIB", 0, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
794 gMC->Gspos ("FAIC", 0, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
797 // start with cards and cooling tubes
798 // finally, cards, cooling tubes and layer for thermal dispersion
801 // see GEOM200 in GEANT manual
805 // card volume definition
806 cardpar[0]= xFLT*0.5;
809 gMC->Gsvolu("FCAR", "BOX ", idtmed[502], cardpar, 3); // PCB Card
811 //alu plate volume definition
814 gMC->Gsvolu("FALP", "BOX ", idtmed[505], cardpar, 3); // Alu Plate
816 // tube volume definition
821 gMC->Gsvolu("FTUB", "TUBE", idtmed[511], tubepar, 3); // cooling tubes (steel)
826 gMC->Gsvolu("FITU", "TUBE", idtmed[510], tubepar, 3); // cooling water
827 // positioning water tube into the steel one
828 gMC->Gspos("FITU",1,"FTUB",0.,0.,0.,0,"ONLY");
831 AliMatrix(idrotm[99], 180., 90., 90., 90., 90., 0.);
833 // central module positioning
834 Float_t cardpos[3], aplpos2;
835 Float_t stepforcardA = 6.625;
837 Float_t aplpos1 = -2.;
842 // tubepos= -53.+tdis;
844 for (icard=39; icard<54; ++icard) {
845 cardpos[2]= cardpos[2]+stepforcardA;
846 aplpos2 = cardpos[2]+0.15;
847 gMC->Gspos("FCAR",icard,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
848 gMC->Gspos("FALP",icard,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
849 gMC->Gspos("FTUB",icard,"FAIA", 0.,cardpos[1],cardpos[2]+tdis,idrotm[99],"ONLY");
852 // intermediate module positioning
853 Float_t stepforcardB= 7.05;
857 for (icard=20; icard<39; ++icard) {
858 cardpos[2]= cardpos[2]+stepforcardB;
859 aplpos2 = cardpos[2]+0.15;
861 gMC->Gspos("FCAR",icard+34,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
862 gMC->Gspos("FALP",icard+34,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
863 gMC->Gspos("FTUB",icard+34,"FAIA", 0.,cardpos[1], cardpos[2]+tdis,idrotm[99],"ONLY");
864 gMC->Gspos("FCAR",58-icard,"FAIA",cardpos[0],cardpos[1], -cardpos[2], 0,"ONLY");
865 gMC->Gspos("FALP",58-icard,"FAIA",cardpos[0], aplpos1, -aplpos2, 0,"ONLY");
866 gMC->Gspos("FTUB",58-icard,"FAIA", 0.,cardpos[1],-cardpos[2]-tdis,idrotm[99],"ONLY");
869 gMC->Gspos("FCAR",icard+34+182,"FAIC",cardpos[0],cardpos[1], cardpos[2]-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
870 gMC->Gspos("FALP",icard+34+182,"FAIC",cardpos[0], aplpos1, aplpos2-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
871 gMC->Gspos("FTUB",icard+34+182,"FAIC", 0.,cardpos[1], cardpos[2]+tdis-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
872 gMC->Gspos("FCAR",58-icard+ 91,"FAIB",cardpos[0],cardpos[1], -cardpos[2]+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
873 gMC->Gspos("FALP",58-icard+ 91,"FAIB",cardpos[0], aplpos1, -aplpos2+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
874 gMC->Gspos("FTUB",58-icard+ 91,"FAIB", 0.,cardpos[1],-cardpos[2]-tdis+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
879 // outer module positioning
880 Float_t stepforcardC= 8.45238;
883 for (icard=1; icard<20; ++icard) {
884 cardpos[2]= cardpos[2]+stepforcardC;
885 aplpos2 = cardpos[2]+0.15;
887 gMC->Gspos("FCAR",icard+72,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
888 gMC->Gspos("FALP",icard+72,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
889 gMC->Gspos("FTUB",icard+72,"FAIA", 0.,cardpos[1], cardpos[2]+tdis,idrotm[99],"ONLY");
890 gMC->Gspos("FCAR",20-icard,"FAIA",cardpos[0],cardpos[1], -cardpos[2], 0,"ONLY");
891 gMC->Gspos("FALP",20-icard,"FAIA",cardpos[0], aplpos1, -aplpos2, 0,"ONLY");
892 gMC->Gspos("FTUB",20-icard,"FAIA", 0.,cardpos[1],-cardpos[2]-tdis,idrotm[99],"ONLY");
895 gMC->Gspos("FCAR",icard+72+182,"FAIC",cardpos[0],cardpos[1], cardpos[2]-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
896 gMC->Gspos("FALP",icard+72+182,"FAIC",cardpos[0], aplpos1, aplpos2-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
897 gMC->Gspos("FTUB",icard+72+182,"FAIC", 0.,cardpos[1], cardpos[2]+tdis-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
898 gMC->Gspos("FCAR",20-icard+ 91,"FAIB",cardpos[0],cardpos[1], -cardpos[2]+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
899 gMC->Gspos("FALP",20-icard+ 91,"FAIB",cardpos[0], aplpos1, -aplpos2+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
900 gMC->Gspos("FTUB",20-icard+ 91,"FAIB", 0.,cardpos[1],-cardpos[2]-tdis+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
905 //_____________________________________________________________________________
906 void AliTOFv5T0::DrawModule() const
909 // Draw a shaded view of the Time Of Flight version 4
912 // Set everything unseen
913 gMC->Gsatt("*", "seen", -1);
916 //Set volumes visible
919 //Set ALIC mother transparent
920 gMC->Gsatt("ALIC","SEEN", 0);
923 // Level 1 for TOF volumes
924 gMC->Gsatt("B077","seen", 0);
927 // Level 2 for TOF volumes
928 gMC->Gsatt("B071","seen", 0);
929 gMC->Gsatt("B074","seen", 0);
930 gMC->Gsatt("B075","seen", 0);
931 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
932 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
935 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
936 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
937 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
938 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
939 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
941 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
942 gMC->Gsatt("BTO1","seen", 0);
945 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
946 gMC->Gsatt("BTO2","seen", 0);
949 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
950 gMC->Gsatt("BTO3","seen", 0);
952 // Level 3 of B071, B074 and B075
953 gMC->Gsatt("FTOA","SEEN", 0);
954 if (fTOFHoles) gMC->Gsatt("FTOB","SEEN", 0);
956 // Level 4 of B071, B074 and B075
957 gMC->Gsatt("FLTA","SEEN", 0);
958 if (fTOFHoles) gMC->Gsatt("FLTB","SEEN",0);
959 if (fTOFHoles) gMC->Gsatt("FLTC","SEEN",0);
961 // Level 5 of B071, B074 and B075
962 gMC->Gsatt("FAIA","SEEN",-1); // all FAIA sub-levels skipped -
963 if (fTOFHoles) gMC->Gsatt("FAIB","SEEN",-1); // all FAIB sub-levels skipped -
964 if (fTOFHoles) gMC->Gsatt("FAIC","SEEN",-1); // all FAIC sub-levels skipped -
966 gMC->Gsatt("FALA","SEEN", 0);
967 if (fTOFHoles) gMC->Gsatt("FALB","SEEN", 0);
969 gMC->Gsatt("FPEA","SEEN", 1);
970 if (fTOFHoles) gMC->Gsatt("FPEB","SEEN", 1);
972 gMC->Gsatt("FSTR","SEEN",-1); // all FSTR sub-levels skipped -
974 gMC->Gsatt("FWZ1","SEEN", 0);
975 gMC->Gsatt("FWZ2","SEEN", 0);
976 gMC->Gsatt("FWZ3","SEEN", 0);
977 gMC->Gsatt("FWZ4","SEEN", 0);
979 gMC->Gsatt("FZ1B","SEEN", 0);
980 gMC->Gsatt("FZ1C","SEEN", 0);
981 gMC->Gsatt("FZ2B","SEEN", 0);
984 gMC->Gdopt("hide", "on");
985 gMC->Gdopt("shad", "on");
986 gMC->Gsatt("*", "fill", 7);
987 gMC->SetClipBox(".");
988 gMC->SetClipBox("*", 100, 1000, 100, 1000, 100, 1000);
990 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
991 gMC->Gdhead(1111, "Time Of Flight");
992 gMC->Gdman(18, 3, "MAN");
993 gMC->Gdopt("hide","off");
995 //_____________________________________________________________________________
996 void AliTOFv5T0::DrawDetectorModules() const
999 // Draw a shaded view of the TOF detector version 4
1002 // Set everything unseen
1003 gMC->Gsatt("*", "seen", -1);
1006 //Set volumes visible
1009 //Set ALIC mother transparent
1010 gMC->Gsatt("ALIC","SEEN", 0);
1013 // Level 1 for TOF volumes
1014 gMC->Gsatt("B077","seen", 0);
1017 // Level 2 for TOF volumes
1018 gMC->Gsatt("B071","seen", 0);
1019 gMC->Gsatt("B074","seen", 0);
1020 gMC->Gsatt("B075","seen", 0);
1021 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
1022 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
1025 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
1026 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
1027 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
1028 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
1029 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
1031 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
1032 gMC->Gsatt("BTO1","seen", 0);
1035 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
1036 gMC->Gsatt("BTO2","seen", 0);
1039 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
1040 gMC->Gsatt("BTO3","seen", 0);
1042 // Level 3 of B071, B075 and B074
1043 gMC->Gsatt("FTOA","seen",-2); // all FTOA sub-levels skipped -
1045 gMC->Gsatt("FTOB","seen",-2); // all FTOB sub-levels skipped -
1046 gMC->Gsatt("FTOC","seen",-2); // all FTOC sub-levels skipped -
1049 gMC->Gdopt("hide","on");
1050 gMC->Gdopt("shad","on");
1051 gMC->Gsatt("*", "fill", 5);
1052 gMC->SetClipBox(".");
1053 gMC->SetClipBox("*", 100, 1000, 100, 1000, 0, 1000);
1054 gMC->DefaultRange();
1055 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
1056 gMC->Gdhead(1111,"TOF detector");
1057 gMC->Gdman(18, 3, "MAN");
1058 gMC->Gdopt("hide","off");
1061 //_____________________________________________________________________________
1062 void AliTOFv5T0::DrawDetectorStrips() const
1065 // Draw a shaded view of the TOF strips for version 4
1068 // Set everything unseen
1069 gMC->Gsatt("*", "seen", -1);
1072 //Set volumes visible
1075 //Set ALIC mother transparent
1076 gMC->Gsatt("ALIC","SEEN", 0);
1079 // Level 1 for TOF volumes
1080 gMC->Gsatt("B077","seen", 0);
1083 // Level 2 for TOF volumes
1084 gMC->Gsatt("B071","seen", 0);
1085 gMC->Gsatt("B074","seen", 0);
1086 gMC->Gsatt("B075","seen", 0);
1087 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
1088 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
1091 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
1092 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
1093 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
1094 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
1095 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
1097 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
1098 gMC->Gsatt("BTO1","seen", 0);
1101 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
1102 gMC->Gsatt("BTO2","seen", 0);
1105 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
1106 gMC->Gsatt("BTO3","seen", 0);
1108 // Level 3 of B071, B074 and B075
1109 gMC->Gsatt("FTOA","SEEN", 0);
1111 gMC->Gsatt("FTOB","SEEN", 0);
1112 gMC->Gsatt("FTOC","SEEN", 0);
1115 // Level 4 of B071, B074 and B075
1116 gMC->Gsatt("FLTA","SEEN", 0);
1118 gMC->Gsatt("FLTB","SEEN", 0);
1119 gMC->Gsatt("FLTC","SEEN", 0);
1122 // Level 5 of B071, B074 and B075
1123 gMC->Gsatt("FAIA","SEEN",-1); // all FAIA sub-levels skipped -
1125 gMC->Gsatt("FAIB","SEEN",-1); // all FAIB sub-levels skipped -
1126 gMC->Gsatt("FAIC","SEEN",-1); // all FAIC sub-levels skipped -
1129 gMC->Gsatt("FALA","SEEN", 0);
1130 if (fTOFHoles) gMC->Gsatt("FALB","SEEN", 0);
1132 gMC->Gsatt("FPEA","SEEN", 0);
1133 if (fTOFHoles) gMC->Gsatt("FPEB","SEEN", 0);
1135 gMC->Gsatt("FSTR","SEEN",-2); // all FSTR sub-levels skipped -
1137 gMC->Gsatt("FWZ1","SEEN", 0);
1138 gMC->Gsatt("FWZ2","SEEN", 0);
1139 gMC->Gsatt("FWZ3","SEEN", 0);
1140 gMC->Gsatt("FWZ4","SEEN", 0);
1142 gMC->Gsatt("FZ1B","SEEN", 0);
1143 gMC->Gsatt("FZ1C","SEEN", 0);
1144 gMC->Gsatt("FZ2B","SEEN", 0);
1151 gMC->Gsatt("FALP","SEEN",0);
1152 gMC->Gsatt("FCAR","SEEN",0);
1153 gMC->Gsatt("FTUB","SEEN",-1); // all FTUB sub-levels skipped -
1156 gMC->Gsatt("FITU","SEEN",0);
1161 gMC->Gsatt("FGLF","SEEN",0);
1162 gMC->Gsatt("FHON","SEEN",0);
1163 gMC->Gsatt("FPC1","SEEN",0);
1164 gMC->Gsatt("FPC2","SEEN",0);
1165 gMC->Gsatt("FPCB","SEEN",0);
1166 gMC->Gsatt("FRGL","SEEN",0);
1168 // Level 2 of FPCB => Level 3 of FSTR
1169 gMC->Gsatt("FSEN","SEEN",0);
1170 gMC->Gsatt("FSEZ","SEEN",0);
1171 gMC->Gsatt("FPAD","SEEN",1);
1174 gMC->Gdopt("hide","on");
1175 gMC->Gdopt("shad","on");
1176 gMC->Gsatt("*", "fill", 5);
1177 gMC->SetClipBox(".");
1178 gMC->SetClipBox("*", 0, 1000, 0, 1000, 0, 1000);
1179 gMC->DefaultRange();
1180 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
1181 gMC->Gdhead(1111,"TOF Strips");
1182 gMC->Gdman(18, 3, "MAN");
1183 gMC->Gdopt("hide","off");
1186 //_____________________________________________________________________________
1187 void AliTOFv5T0::CreateMaterials()
1190 // Define materials for the Time Of Flight
1193 //AliTOF::CreateMaterials();
1195 AliMagF *magneticField = (AliMagF*)gAlice->Field();
1197 Int_t isxfld = magneticField->Integ();
1198 Float_t sxmgmx = magneticField->Max();
1200 Float_t we[7], ae[7], na[7], fr[7], vl[7];
1203 //--- Quartz (SiO2) to simulate float glass
1204 // density tuned to have correct float glass
1206 Float_t aq[2] = { 28.0855,15.9994 };
1207 Float_t zq[2] = { 14.,8. };
1208 Float_t wq[2] = { 1.,2. };
1209 Float_t dq = 2.55; // std value: 2.2
1213 Float_t anox[4] = {12.01,1.01,16.00,14.01};
1214 Float_t znox[4] = { 6., 1., 8., 7.};
1215 Float_t wnox[4] = {14., 22., 2., 2.};
1216 Float_t dnox = 0.048;
1220 Float_t ag10[4] = {28.09,12.01,1.01,16.00};
1221 Float_t zg10[4] = {14., 6., 1., 8.};
1224 for (i = 0; i < nlmatg10; ++i) {
1240 MaterialMixer(we,ae,na,fr,vl,5);
1246 Float_t densg10 = 1.7;
1249 Float_t awa[2] = { 1., 16. };
1250 Float_t zwa[2] = { 1., 8. };
1251 Float_t wwa[2] = { 2., 1. };
1256 Float_t asteel[4] = { 55.847,51.9961,58.6934,28.0855 };
1257 Float_t zsteel[4] = { 26.,24.,28.,14. };
1258 Float_t wsteel[4] = { .715,.18,.1,.005 };
1261 Float_t aAir[4]={12.0107,14.0067,15.9994,39.948};
1262 Float_t zAir[4]={6.,7.,8.,18.};
1263 Float_t wAir[4]={0.000124,0.755267,0.231781,0.012827};
1264 Float_t dAir = 1.20479E-3;
1267 Float_t afg[4] = {28.09,16.00,12.01,1.01};
1268 Float_t zfg[4] = {14., 8., 6., 1.};
1269 Float_t wfg[4] = {0.12906,0.29405,0.51502,0.06187};
1270 Float_t dfg = 1.111;
1273 // --- Freon C2F4H2 + SF6
1274 Float_t afre[4]= {12.01,1.01,19.00,32.07};
1275 Float_t zfre[4]= { 6., 1., 9., 16.};
1276 Float_t wfre[4]= {0.21250,0.01787,0.74827,0.021355};
1277 Float_t densfre= 0.00375;
1280 //char namat[15] = " ";
1281 //Float_t ama[2], zma[2], dma, radl, absl, buf[1];
1284 AliMixture ( 0, "Air$", aAir, zAir, dAir, 4, wAir);
1285 AliMixture ( 1, "Nomex$", anox, znox, dnox, nnox, wnox);
1286 AliMixture ( 2, "G10$", ag10, zg10, densg10, nlmatg10, wmatg10);
1287 AliMixture ( 3, "fibre glass$", afg, zfg, dfg, nfg, wfg);
1288 AliMaterial( 4, "Al $", 26.98, 13., 2.7, 8.9, 37.2);
1289 AliMaterial( 5, "Al honeycomb$", 26.98, 13., 0.0496, 483., 2483.);
1290 AliMixture ( 6, "Freon$", afre, zfre, densfre, nfre, wfre);
1291 AliMixture ( 7, "Glass$", aq, zq, dq, nq, wq);
1293 // get freon and glass
1294 gMC->Gfmate((*fIdmate)[6],namat,ama[0],zma[0],dma,radl,absl,buf,nbuf);
1295 gMC->Gfmate((*fIdmate)[7],namat,ama[1],zma[1],dma,radl,absl,buf,nbuf);
1298 Float_t wgfr[2]= {0.0011,0.9989};
1299 Float_t dgfr = 1.434;
1301 AliMixture ( 8, "glass-freon$", ama, zma, dgfr, ngfr, wgfr);
1303 AliMixture ( 9, "Water$", awa, zwa, dwa, nwa, wwa);
1304 AliMixture (10, "STAINLESS STEEL$", asteel, zsteel, 7.88, 4, wsteel);
1306 Float_t epsil, stmin, deemax, stemax;
1309 // EPSIL = 0.1 ! Tracking precision,
1310 // STEMAX = 0.1 ! Maximum displacement for multiple scattering
1311 // DEEMAX = 0.1 ! Maximum fractional energy loss, DLS
1315 epsil = .001; // Tracking precision,
1316 stemax = -1.; // Maximum displacement for multiple scattering
1317 deemax = -.3; // Maximum fractional energy loss, DLS
1320 AliMedium( 1, "Air$", 0, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1321 AliMedium( 2,"Nomex$", 1, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1322 AliMedium( 3,"G10$", 2, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1323 AliMedium( 4,"fibre glass$", 3, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1324 //AliMedium( 5,"glass-freon$", 8, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1325 AliMedium( 6,"Al Frame$", 4, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1326 AliMedium( 7,"Al honeycomb$", 5, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1327 AliMedium( 8,"Fre$", 6, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1328 AliMedium( 9,"PCB-S$", 2, 1, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1329 AliMedium(10,"Glass$", 7, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1330 AliMedium(11,"Water$", 9, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1331 AliMedium(12,"STEEL$", 10, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1334 //_____________________________________________________________________________
1335 void AliTOFv5T0::Init()
1338 // Initialise the detector after the geometry has been defined
1340 AliDebug(1, "**************************************"
1342 "**************************************");
1343 AliDebug(1, " Version 4 of TOF initialing, "
1344 "symmetric TOF - Full Coverage version");
1348 fIdFTOA = gMC->VolId("FTOA");
1350 fIdFTOB = gMC->VolId("FTOB");
1351 fIdFTOC = gMC->VolId("FTOC");
1353 fIdFLTA = gMC->VolId("FLTA");
1355 fIdFLTB = gMC->VolId("FLTB");
1356 fIdFLTC = gMC->VolId("FLTC");
1359 AliDebug(1, "**************************************"
1361 "**************************************");
1364 //_____________________________________________________________________________
1365 void AliTOFv5T0::StepManager()
1369 // Procedure called at each step in the Time Of Flight
1372 TLorentzVector mom, pos;
1373 Float_t xm[3],pm[3],xpad[3],ppad[3];
1376 Int_t sector, plate, padx, padz, strip;
1377 Int_t copy, padzid, padxid, stripid, i;
1378 Int_t *idtmed = fIdtmed->GetArray()-499;
1379 Float_t incidenceAngle;
1381 const char* volpath;
1386 gMC->IsTrackEntering()
1387 && gMC->TrackCharge()
1388 //&& gMC->GetMedium()==idtmed[508]
1389 && gMC->CurrentMedium()==idtmed[508]
1390 && gMC->CurrentVolID(copy)==fIdSens
1394 AliMC *mcApplication = (AliMC*)gAlice->GetMCApp();
1396 AddTrackReference(mcApplication->GetCurrentTrackNumber());
1397 //AddTrackReference(gAlice->GetMCApp()->GetCurrentTrackNumber());
1399 // getting information about hit volumes
1401 padzid=gMC->CurrentVolOffID(1,copy);
1405 padxid=gMC->CurrentVolOffID(0,copy);
1409 stripid=gMC->CurrentVolOffID(4,copy);
1413 gMC->TrackPosition(pos);
1414 gMC->TrackMomentum(mom);
1416 Double_t normMom=1./mom.Rho();
1418 // getting the coordinates in pad ref system
1420 xm[0] = (Float_t)pos.X();
1421 xm[1] = (Float_t)pos.Y();
1422 xm[2] = (Float_t)pos.Z();
1424 pm[0] = (Float_t)mom.X()*normMom;
1425 pm[1] = (Float_t)mom.Y()*normMom;
1426 pm[2] = (Float_t)mom.Z()*normMom;
1428 gMC->Gmtod(xm,xpad,1); // from MRS to DRS: coordinates convertion
1429 gMC->Gmtod(pm,ppad,2); // from MRS to DRS: direction cosinus convertion
1432 if (TMath::Abs(ppad[1])>1) {
1433 AliWarning("Abs(ppad) > 1");
1434 ppad[1]=TMath::Sign((Float_t)1,ppad[1]);
1436 incidenceAngle = TMath::ACos(ppad[1])*kRaddeg;
1439 if (strip < fTOFGeometry->NStripC()) {
1443 else if (strip >= fTOFGeometry->NStripC() &&
1444 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB()) {
1446 strip = strip - fTOFGeometry->NStripC();
1448 else if (strip >= fTOFGeometry->NStripC() + fTOFGeometry->NStripB() &&
1449 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA()) {
1451 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB();
1453 else if (strip >= fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA() &&
1454 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA() + fTOFGeometry->NStripB()) {
1456 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB() - fTOFGeometry->NStripA();
1460 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB() - fTOFGeometry->NStripA() - fTOFGeometry->NStripB();
1463 volpath=gMC->CurrentVolOffName(7);
1464 index=atoi(&volpath[4]);
1479 hits[6] = mom.Rho();
1484 hits[11]= incidenceAngle;
1485 hits[12]= gMC->Edep();
1486 hits[13]= gMC->TrackLength();
1494 AddT0Hit(mcApplication->GetCurrentTrackNumber(),vol, hits);
1495 //AddT0Hit(gAlice->GetMCApp()->GetCurrentTrackNumber(),vol, hits);
1498 //-------------------------------------------------------------------
1499 void AliTOFv5T0::MaterialMixer(Float_t* p,Float_t* a,Float_t* m,Float_t* d,Float_t* s,Int_t n) const
1501 // a[] atomic weights vector (in)
1502 // (atoms present in more compound appear separately)
1503 // m[] number of corresponding atoms in the mixture (in)
1504 // d[] fraction of the compound relative to the corresponding atoms (in)
1505 // s[] further possible weights " " " " (in)
1507 for (Int_t i = 0; i < n; ++i) {
1508 p[i] = a[i]*m[i]*d[i]*s[i];
1511 for (Int_t i = 0; i < n; ++i) {
1513 // AliInfo(Form((\n weight[%i] = %f (,i,p[i]));