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.10 2006/05/10 18:40:17 hristov
19 Larger strings for the names
21 Revision 1.9 2006/05/04 19:41:42 hristov
22 Possibility for partial TOF geometry (S.Arcelli)
24 Revision 1.8 2006/04/20 22:30:50 hristov
25 Coding conventions (Annalisa)
27 Revision 1.7 2006/04/16 22:29:05 hristov
28 Coding conventions (Annalisa)
30 Revision 1.6 2006/03/20 08:20:35 decaro
31 Al layer: positioning correction
33 Revision 1.5 2006/03/20 07:54:20 decaro
34 Correction of some layer thickness
36 Revision 1.4 2006/03/13 12:35:44 decaro
37 Suppression of fractional Z warning
39 Revision 1.3 2006/02/28 10:38:00 decaro
40 AliTOFGeometry::fAngles, AliTOFGeometry::fHeights,
41 AliTOFGeometry::fDistances arrays: dimension definition in the right
44 Revision 1.2 2006/02/27 18:12:14 decaro
45 Remove in StepManager the dependence of hit indexes from parametrized
48 Revision 1.1 2005/12/15 08:55:33 decaro
49 New TOF geometry description (V5) -G. Cara Romeo and A. De Caro
52 Revision 0.1 2004 November G. Cara Romeo and A. De Caro
53 Implement new TOF geometry version
55 suppress few volume overlaps
56 (in the 4th TOF geometry version),
57 insert the realistic strip numbers and positions
61 ///////////////////////////////////////////////////////////////////////////////
63 // This class contains the functions for version 5 of the Time Of Flight //
66 // VERSION WITH 5 MODULES AND TILTED STRIPS //
68 // FULL COVERAGE VERSION + OPTION for PHOS holes //
73 <img src="picts/AliTOFv5T0Class.gif"> //
77 ///////////////////////////////////////////////////////////////////////////////
80 #include "TGeometry.h"
81 #include "TLorentzVector.h"
83 #include "TVirtualMC.h"
91 #include "AliTOFGeometry.h"
92 #include "AliTOFGeometryV5.h"
93 #include "AliTOFv5T0.h"
95 extern TDirectory *gDirectory;
96 extern TVirtualMC *gMC;
98 extern AliRun *gAlice;
102 //_____________________________________________________________________________
103 AliTOFv5T0::AliTOFv5T0()
106 // Default constructor
110 //_____________________________________________________________________________
111 AliTOFv5T0::AliTOFv5T0(const char *name, const char *title)
112 : AliTOF(name,title,"tzero")
115 // Standard constructor
118 // Check that FRAME is there otherwise we have no place where to
122 AliModule* frame = (AliModule*)gAlice->GetModule("FRAME");
124 AliFatal("TOF needs FRAME to be present");
127 if (fTOFGeometry) delete fTOFGeometry;
128 fTOFGeometry = new AliTOFGeometryV5();
130 if(frame->IsVersion()==1) {
131 AliInfo(Form("Frame version %d", frame->IsVersion()));
132 AliInfo("Full Coverage for TOF");
135 AliInfo(Form("Frame version %d", frame->IsVersion()));
136 AliInfo("TOF with Holes for PHOS");
139 fTOFGeometry->SetHoles(fTOFHoles);
141 //AliTOF::fTOFGeometry = fTOFGeometry;
144 TDirectory* saveDir = gDirectory;
145 gAlice->GetRunLoader()->CdGAFile();
146 fTOFGeometry->Write("TOFgeometry");
151 //____________________________________________________________________________
152 void AliTOFv5T0::BuildGeometry()
155 // Build TOF ROOT geometry for the ALICE event display
158 const int kColorTOF = 27;
160 TGeometry *globalGeometry = (TGeometry*)gAlice->GetGeometry();
163 top = globalGeometry->GetNode("alice");
165 // Position the different copies
166 const Float_t krTof =(fTOFGeometry->Rmax()+fTOFGeometry->Rmin())/2.;
167 const Float_t khTof = fTOFGeometry->Rmax()-fTOFGeometry->Rmin();
168 const Int_t kNTof = fTOFGeometry->NSectors();
169 const Float_t kangle = k2PI/kNTof;
171 const Float_t kInterCentrModBorder1 = 49.5;
172 const Float_t kInterCentrModBorder2 = 57.5;
176 // define offset for nodes
177 Float_t zOffsetB = (fTOFGeometry->ZlenA()*0.5 + (kInterCentrModBorder1+kInterCentrModBorder2)*0.5)*0.5;
178 Float_t zOffsetA = 0.;
179 // Define TOF basic volume
181 char nodeName0[16], nodeName1[16], nodeName2[16];
182 char nodeName3[16], nodeName4[16], rotMatNum[16];
185 new TBRIK("S_TOF_B","TOF box","void",
186 fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenB()*0.5);
187 new TBRIK("S_TOF_C","TOF box","void",
188 fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenB()*0.5);
190 new TBRIK("S_TOF_A","TOF box","void",
191 fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenA()*0.5);
193 for (Int_t nodeNum=1;nodeNum<19;nodeNum++){
196 sprintf(rotMatNum,"rot50%i",nodeNum);
197 sprintf(nodeName0,"FTO00%i",nodeNum);
198 sprintf(nodeName1,"FTO10%i",nodeNum);
199 sprintf(nodeName2,"FTO20%i",nodeNum);
200 sprintf(nodeName3,"FTO30%i",nodeNum);
201 sprintf(nodeName4,"FTO40%i",nodeNum);
204 sprintf(rotMatNum,"rot5%i",nodeNum);
205 sprintf(nodeName0,"FTO0%i",nodeNum);
206 sprintf(nodeName1,"FTO1%i",nodeNum);
207 sprintf(nodeName2,"FTO2%i",nodeNum);
208 sprintf(nodeName3,"FTO3%i",nodeNum);
209 sprintf(nodeName4,"FTO4%i",nodeNum);
212 new TRotMatrix(rotMatNum,rotMatNum,90,-20*nodeNum,90,90-20*nodeNum,0,0);
213 ang = (4.5-nodeNum) * kangle;
217 node = new TNode(nodeName2,nodeName2,"S_TOF_B", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang), zOffsetB,rotMatNum);
218 node->SetLineColor(kColorTOF);
222 node = new TNode(nodeName3,nodeName3,"S_TOF_C", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang),-zOffsetB,rotMatNum);
223 node->SetLineColor(kColorTOF);
228 node = new TNode(nodeName4,nodeName4,"S_TOF_A", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang), zOffsetA,rotMatNum);
229 node->SetLineColor(kColorTOF);
231 } // end loop on nodeNum
235 //_____________________________________________________________________________
236 void AliTOFv5T0::CreateGeometry()
239 // Create geometry for Time Of Flight version 0
243 <img src="picts/AliTOFv5T0.gif">
247 // Creates common geometry
249 AliTOF::CreateGeometry();
253 //_____________________________________________________________________________
254 void AliTOFv5T0::TOFpc(Float_t xtof, Float_t ytof, Float_t zlenA,
258 // Definition of the Time Of Fligh Resistive Plate Chambers
261 const Float_t kPi = TMath::Pi();
263 const Float_t kInterCentrModBorder1 = 49.5;
264 const Float_t kInterCentrModBorder2 = 57.5;
265 const Float_t kExterInterModBorder1 = 196.0;
266 const Float_t kExterInterModBorder2 = 203.5;
268 const Float_t kLengthExInModBorder = 4.7;
269 const Float_t kLengthInCeModBorder = 7.0;
271 // Al layers over all internal module walls (cm)
272 const Float_t khAlWall = 0.03;
274 // module wall thickness (cm)
275 const Float_t kModuleWallThickness = 0.3;
277 // Al honeycomb layer between strips and cards (cm)
278 const Float_t kHoneycombLayerThickness = 1.5;
280 AliDebug(2,Form("zlenA*0.5 = %d", zlenA*0.5));
281 AliDebug(1, "************************* TOF geometry **************************");
283 // Definition of the Time Of Fligh Resistive Plate Chambers
284 // xFLT, yFLT, zFLT - sizes of TOF modules (large)
286 Float_t xcoor, ycoor, zcoor;
288 Int_t *idtmed = fIdtmed->GetArray()-499;
293 par[2] = zlenA * 0.5;
294 gMC->Gsvolu("FTOA", "BOX ", idtmed[503], par, 3); // fibre glass
299 par[2] = (zlenA*0.5 - kInterCentrModBorder1)*0.5;
300 gMC->Gsvolu("FTOB", "BOX ", idtmed[503], par, 3); // fibre glass
301 gMC->Gsvolu("FTOC", "BOX ", idtmed[503], par, 3); // fibre glass
304 // Positioning of fibre glass modules (FTOA, FTOB and FTOC)
306 //AliMatrix(idrotm[0], 90., 0., 0., 0., 90.,-90.);
307 AliMatrix(idrotm[0], 90., 0., 0., 0., 90.,270.);
312 for(Int_t isec=0;isec<18;isec++){
313 if(fTOFSectors[isec]==-1)continue;
315 sprintf(name, "BTOF%d",isec);
316 if (fTOFHoles && (isec==11||isec==12)) {
317 // if (fTOFHoles && (isec==16||isec==17)) { \\Old 6h convention
319 ycoor = (zlenA*0.5 + kInterCentrModBorder1)*0.5;
321 gMC->Gspos("FTOB", 0, name, xcoor, ycoor, zcoor, idrotm[0], "ONLY");
322 gMC->Gspos("FTOC", 0, name, xcoor,-ycoor, zcoor, idrotm[0], "ONLY");
324 else gMC->Gspos("FTOA", 0,name, xcoor, ycoor, zcoor, idrotm[0], "ONLY");
326 // Large not sensitive volumes with Insensitive Freon (FLTA, FLTB and FLTC)
328 Float_t xFLT, yFLT, zFLTA;
330 xFLT = xtof - kModuleWallThickness*2.;
331 yFLT = ytof - kModuleWallThickness*2.;
332 zFLTA = zlenA - kModuleWallThickness*2.;
337 gMC->Gsvolu("FLTA", "BOX ", idtmed[507], par, 3); // Freon mix
342 gMC->Gspos ("FLTA", 0, "FTOA", xcoor, ycoor, zcoor, 0, "ONLY");
347 par[2] = (zlenA*0.5 - kInterCentrModBorder1-kModuleWallThickness)*0.5;
348 gMC->Gsvolu("FLTB", "BOX ", idtmed[507], par, 3); // Freon mix
349 gMC->Gsvolu("FLTC", "BOX ", idtmed[507], par, 3); // Freon mix
353 zcoor = kModuleWallThickness*0.5;
354 gMC->Gspos ("FLTB", 0, "FTOB", xcoor, ycoor, zcoor, 0, "ONLY");
355 gMC->Gspos ("FLTC", 0, "FTOC", xcoor, ycoor,-zcoor, 0, "ONLY");
358 // Layer of Aluminum before detector (FALA, FALB and FALC)
361 par[1] = khAlWall*0.5;
362 par[2] = kInterCentrModBorder1 - (kModuleWallThickness + khAlWall);
363 gMC->Gsvolu("FALA", "BOX ", idtmed[505], par, 3); // Alluminium
366 ycoor = (-yFLT + khAlWall)*0.5;
368 gMC->Gspos ("FALA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
371 par[1] = khAlWall*0.5;
372 par[2] = (kExterInterModBorder2 - kInterCentrModBorder1 - 2.*(kModuleWallThickness + khAlWall))*0.5;
373 gMC->Gsvolu("FALB", "BOX ", idtmed[505], par, 3); // Alluminium
376 ycoor = (-yFLT + khAlWall)*0.5;
377 zcoor = (kExterInterModBorder2 + kInterCentrModBorder1)*0.5;
378 gMC->Gspos ("FALB", 1, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
379 gMC->Gspos ("FALB", 2, "FLTA", xcoor, ycoor,-zcoor, 0, "ONLY");
382 par[1] = khAlWall*0.5;
383 par[2] = (zlenA*0.5 - kExterInterModBorder2 - 2.*(kModuleWallThickness + khAlWall))*0.5;
384 gMC->Gsvolu("FALC", "BOX ", idtmed[505], par, 3); // Alluminium
387 ycoor = (-yFLT + khAlWall)*0.5;
388 zcoor = (kExterInterModBorder2+zlenA*0.5)*0.5;
389 gMC->Gspos ("FALC", 1, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
390 gMC->Gspos ("FALC", 2, "FLTA", xcoor, ycoor,-zcoor, 0, "ONLY");
394 ycoor = (-yFLT + khAlWall)*0.5;
395 zcoor = (zlenA*0.5 - kExterInterModBorder2)*0.5 - kModuleWallThickness*0.5;
396 gMC->Gspos ("FALB", 1, "FLTB", xcoor, ycoor, zcoor, 0, "ONLY");
397 gMC->Gspos ("FALB", 2, "FLTC", xcoor, ycoor,-zcoor, 0, "ONLY");
400 ycoor = (-yFLT + khAlWall)*0.5;
401 zcoor = (kExterInterModBorder2 - kInterCentrModBorder1)*0.5 + kModuleWallThickness*0.5;
402 gMC->Gspos ("FALC", 1, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
403 gMC->Gspos ("FALC", 2, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
406 Float_t y0, alpha, tgal, beta, tgbe, trpa[11];
408 // Fibre glass walls between central and intermediate modules (FWZ1 and FWZ2; holes -> FZ1B, FZ1C, FZ2B)
410 tgal = (yFLT*0.5 - 2.*kLengthInCeModBorder)/(kInterCentrModBorder2 - kInterCentrModBorder1);
411 alpha = TMath::ATan(tgal);
412 beta = (kPi*0.5 - alpha)*0.5;
413 tgbe = TMath::Tan(beta);
417 trpa[3] = kModuleWallThickness;
418 trpa[4] = (kLengthInCeModBorder - kModuleWallThickness*tgbe)*0.5;
419 trpa[5] = (kLengthInCeModBorder + kModuleWallThickness*tgbe)*0.5;
420 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
421 trpa[7] = kModuleWallThickness;
422 trpa[8] = (kLengthInCeModBorder - kModuleWallThickness*tgbe)*0.5;
423 trpa[9] = (kLengthInCeModBorder + kModuleWallThickness*tgbe)*0.5;
424 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
425 gMC->Gsvolu("FWZ1","TRAP", idtmed[503], trpa, 11); // fibre glass
427 AliMatrix (idrotm[1],90., 90.,180.,0.,90.,180.);
428 AliMatrix (idrotm[4],90., 90., 0.,0.,90., 0.);
431 ycoor = -yFLT*0.5 + kLengthInCeModBorder*0.5;
432 zcoor = kInterCentrModBorder1;
433 gMC->Gspos("FWZ1", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[1],"ONLY");
434 gMC->Gspos("FWZ1", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[4],"ONLY");
437 y0 = kLengthInCeModBorder - kModuleWallThickness*0.5*tgbe;
441 trpa[3] = kModuleWallThickness*0.5;
442 trpa[4] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
443 trpa[5] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
444 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
445 trpa[7] = kModuleWallThickness*0.5;
446 trpa[8] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
447 trpa[9] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
448 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
449 gMC->Gsvolu("FZ1B","TRAP", idtmed[503], trpa, 11); // fibre glass
452 ycoor = -yFLT*0.5 + kLengthInCeModBorder*0.5 - kModuleWallThickness*0.25*tgbe;
453 zcoor = -kInterCentrModBorder1 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
454 gMC->Gspos("FZ1B", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[4],"ONLY");
455 gMC->Gspos("FZ1B", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[1],"ONLY");
458 AliMatrix (idrotm[2],90.,270., 0.,0.,90.,180.);
459 AliMatrix (idrotm[5],90.,270.,180.,0.,90., 0.);
462 ycoor = -kLengthInCeModBorder*0.5;
463 zcoor = kInterCentrModBorder2;
464 gMC->Gspos("FWZ1", 3,"FLTA", xcoor, ycoor, zcoor,idrotm[2],"ONLY");
465 gMC->Gspos("FWZ1", 4,"FLTA", xcoor, ycoor,-zcoor,idrotm[5],"ONLY");
468 y0 = kLengthInCeModBorder + kModuleWallThickness*0.5*tgbe;
472 trpa[3] = kModuleWallThickness*0.5;
473 trpa[4] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
474 trpa[5] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
475 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
476 trpa[7] = kModuleWallThickness*0.5;
477 trpa[8] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
478 trpa[9] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
479 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
480 gMC->Gsvolu("FZ1C","TRAP", idtmed[503], trpa, 11); // fibre glass
483 ycoor = -kLengthInCeModBorder*0.5 - kModuleWallThickness*0.25*tgbe;
484 zcoor = -kInterCentrModBorder2 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
485 gMC->Gspos("FZ1C", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[5],"ONLY");
486 gMC->Gspos("FZ1C", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[2],"ONLY");
489 trpa[0] = 0.5*(kInterCentrModBorder2 - kInterCentrModBorder1)/TMath::Cos(alpha);
490 trpa[1] = kModuleWallThickness;
492 trpa[3] = -beta*kRaddeg;
495 gMC->Gsvolu("FWZ2","PARA", idtmed[503], trpa, 6); // fibre glass
497 AliMatrix (idrotm[3], alpha*kRaddeg,90.,90.+alpha*kRaddeg,90.,90.,180.);
498 AliMatrix (idrotm[6],180.-alpha*kRaddeg,90.,90.-alpha*kRaddeg,90.,90., 0.);
502 zcoor = (kInterCentrModBorder2 + kInterCentrModBorder1)*0.5;
503 gMC->Gspos("FWZ2", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[3],"ONLY");
504 gMC->Gspos("FWZ2", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[6],"ONLY");
507 trpa[0] = 0.5*(kInterCentrModBorder2 - kInterCentrModBorder1)/TMath::Cos(alpha);
508 trpa[1] = kModuleWallThickness*0.5;
510 trpa[3] = -beta*kRaddeg;
513 gMC->Gsvolu("FZ2B","PARA", idtmed[503], trpa, 6); // fibre glass
516 ycoor = -yFLT*0.25 - kModuleWallThickness*0.5*tgbe;
517 zcoor = -(kInterCentrModBorder2 + kInterCentrModBorder1)*0.5 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
518 gMC->Gspos("FZ2B", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[6],"ONLY");
519 gMC->Gspos("FZ2B", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[3],"ONLY");
522 // Fibre glass walls between intermediate and lateral modules (FWZ3 and FWZ4)
524 tgal = (yFLT*0.5 - 2.*kLengthExInModBorder)/(kExterInterModBorder2 - kExterInterModBorder1);
525 alpha = TMath::ATan(tgal);
526 beta = (kPi*0.5 - alpha)*0.5;
527 tgbe = TMath::Tan(beta);
531 trpa[3] = kModuleWallThickness;
532 trpa[4] = (kLengthExInModBorder - kModuleWallThickness*tgbe)*0.5;
533 trpa[5] = (kLengthExInModBorder + kModuleWallThickness*tgbe)*0.5;
534 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
535 trpa[7] = kModuleWallThickness;
536 trpa[8] = (kLengthExInModBorder - kModuleWallThickness*tgbe)*0.5;
537 trpa[9] = (kLengthExInModBorder + kModuleWallThickness*tgbe)*0.5;
538 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
539 gMC->Gsvolu("FWZ3","TRAP", idtmed[503], trpa, 11); // fibre glass
542 ycoor = -kLengthExInModBorder*0.5;
543 zcoor = kExterInterModBorder1;
544 gMC->Gspos("FWZ3", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[5],"ONLY");
545 gMC->Gspos("FWZ3", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[2],"ONLY");
549 ycoor = -kLengthExInModBorder*0.5;
550 zcoor = -kExterInterModBorder1 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
551 gMC->Gspos("FWZ3", 5,"FLTB", xcoor, ycoor, zcoor,idrotm[2],"ONLY");
552 gMC->Gspos("FWZ3", 6,"FLTC", xcoor, ycoor,-zcoor,idrotm[5],"ONLY");
556 ycoor = -yFLT*0.5 + kLengthExInModBorder*0.5;
557 zcoor = kExterInterModBorder2;
558 gMC->Gspos("FWZ3", 3,"FLTA", xcoor, ycoor, zcoor,idrotm[4],"ONLY");
559 gMC->Gspos("FWZ3", 4,"FLTA", xcoor, ycoor,-zcoor,idrotm[1],"ONLY");
563 ycoor = -yFLT*0.5 + kLengthExInModBorder*0.5;
564 zcoor = -kExterInterModBorder2 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
565 gMC->Gspos("FWZ3", 7,"FLTB", xcoor, ycoor, zcoor,idrotm[1],"ONLY");
566 gMC->Gspos("FWZ3", 8,"FLTC", xcoor, ycoor,-zcoor,idrotm[4],"ONLY");
569 trpa[0] = 0.5*(kExterInterModBorder2 - kExterInterModBorder1)/TMath::Cos(alpha);
570 trpa[1] = kModuleWallThickness;
572 trpa[3] = -beta*kRaddeg;
575 gMC->Gsvolu("FWZ4","PARA", idtmed[503], trpa, 6); // fibre glass
577 AliMatrix (idrotm[13],alpha*kRaddeg,90.,90.+alpha*kRaddeg,90.,90.,180.);
578 AliMatrix (idrotm[16],180.-alpha*kRaddeg,90.,90.-alpha*kRaddeg,90.,90.,0.);
582 zcoor = (kExterInterModBorder2 + kExterInterModBorder1)*0.5;
583 gMC->Gspos("FWZ4", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[16],"ONLY");
584 gMC->Gspos("FWZ4", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[13],"ONLY");
589 zcoor = -(kExterInterModBorder2 + kExterInterModBorder1)*0.5 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
590 gMC->Gspos("FWZ4", 3,"FLTB", xcoor, ycoor, zcoor,idrotm[13],"ONLY");
591 gMC->Gspos("FWZ4", 4,"FLTC", xcoor, ycoor,-zcoor,idrotm[16],"ONLY");
595 ///////////////// Detector itself //////////////////////
597 const Int_t knx = fTOFGeometry->NpadX(); // number of pads along x
598 const Int_t knz = fTOFGeometry->NpadZ(); // number of pads along z
599 const Float_t kPadX = fTOFGeometry->XPad(); // pad length along x
600 const Float_t kPadZ = fTOFGeometry->ZPad(); // pad length along z
602 // new description for strip volume -double stack strip-
603 // -- all constants are expressed in cm
604 // heigth of different layers
605 const Float_t khhony = 1.0 ; // heigth of HONY Layer
606 const Float_t khpcby = 0.08 ; // heigth of PCB Layer
607 const Float_t khrgly = 0.055 ; // heigth of RED GLASS Layer
609 const Float_t khfiliy = 0.125 ; // heigth of FISHLINE Layer
610 const Float_t khglassy = 0.160*0.5; // heigth of GLASS Layer
611 const Float_t khglfy = khfiliy+2.*khglassy;// heigth of GLASS+FISHLINE Layer
613 const Float_t khcpcby = 0.16 ; // heigth of PCB Central Layer
614 const Float_t kwhonz = 8.1 ; // z dimension of HONEY Layer
615 const Float_t kwpcbz1 = 10.6 ; // z dimension of PCB Lower Layer
616 const Float_t kwpcbz2 = 11.6 ; // z dimension of PCB Upper Layer
617 const Float_t kwcpcbz = 12.4 ; // z dimension of PCB Central Layer
618 const Float_t kwrglz = 8. ; // z dimension of RED GLASS Layer
619 const Float_t kwglfz = 7. ; // z dimension of GLASS+FISHLN Layer
620 const Float_t klsensmx = knx*kPadX; // length of Sensitive Layer
621 const Float_t khsensmy = 0.05;//0.11;//0.16;// heigth of Sensitive Layer
622 const Float_t kwsensmz = knz*kPadZ; // width of Sensitive Layer
624 // heigth of the FSTR Volume (the strip volume)
625 const Float_t khstripy = 2.*khhony+2.*khpcby+4.*khrgly+2.*khglfy+khcpcby;
627 // width of the FSTR Volume (the strip volume)
628 const Float_t kwstripz = kwcpcbz;
629 // length of the FSTR Volume (the strip volume)
630 const Float_t klstripx = fTOFGeometry->StripLength();
632 Float_t parfp[3]={klstripx*0.5,khstripy*0.5,kwstripz*0.5};
633 // Coordinates of the strip center in the strip reference frame;
634 // used for positioning internal strip volumes
635 Float_t posfp[3]={0.,0.,0.};
637 // FSTR volume definition-filling this volume with non sensitive Gas Mixture
638 gMC->Gsvolu("FSTR","BOX",idtmed[507],parfp,3); // Freon mix
640 //-- HONY Layer definition
641 parfp[1] = khhony*0.5;
642 parfp[2] = kwhonz*0.5;
643 gMC->Gsvolu("FHON","BOX",idtmed[501],parfp,3); // honeycomb (Nomex)
644 // positioning 2 HONY Layers on FSTR volume
645 posfp[1] =-khstripy*0.5+parfp[1];
646 gMC->Gspos("FHON",1,"FSTR",0., posfp[1],0.,0,"ONLY");
647 gMC->Gspos("FHON",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
649 //-- PCB Layer definition
650 parfp[1] = khpcby*0.5;
651 parfp[2] = kwpcbz1*0.5;
652 gMC->Gsvolu("FPC1","BOX",idtmed[502],parfp,3); // G10
653 parfp[2] = kwpcbz2*0.5;
654 gMC->Gsvolu("FPC2","BOX",idtmed[502],parfp,3); // G10
655 // positioning 2 PCB Layers on FSTR volume
656 posfp[1] =-khstripy*0.5+khhony+parfp[1];
657 gMC->Gspos("FPC1",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
658 gMC->Gspos("FPC2",1,"FSTR",0., posfp[1],0.,0,"ONLY");
660 //-- central PCB layer definition
661 parfp[1] = khcpcby*0.5;
662 parfp[2] = kwcpcbz*0.5;
663 gMC->Gsvolu("FPCB","BOX",idtmed[502],parfp,3); // G10
664 // positioning the central PCB layer
665 gMC->Gspos("FPCB",1,"FSTR",0.,0.,0.,0,"ONLY");
668 Float_t parfs[3] = {klsensmx*0.5, khsensmy*0.5, kwsensmz*0.5};
669 gMC->Gsvolu("FSEN","BOX",idtmed[508],parfs,3); // sensitive ...
670 // dividing FSEN along z in knz=2 and along x in knx=48
671 gMC->Gsdvn("FSEZ","FSEN",knz,3);
672 gMC->Gsdvn("FPAD","FSEZ",knx,1);
673 // positioning a Sensitive layer inside FPCB
674 gMC->Gspos("FSEN",1,"FPCB",0.,0.,0.,0,"ONLY");
676 //-- RED GLASS Layer definition
677 parfp[1] = khrgly*0.5;
678 parfp[2] = kwrglz*0.5;
679 gMC->Gsvolu("FRGL","BOX",idtmed[509],parfp,3); // glass
680 // positioning 4 RED GLASS Layers on FSTR volume
681 posfp[1] = -khstripy*0.5+khhony+khpcby+parfp[1];
682 gMC->Gspos("FRGL",1,"FSTR",0., posfp[1],0.,0,"ONLY");
683 gMC->Gspos("FRGL",4,"FSTR",0.,-posfp[1],0.,0,"ONLY");
684 posfp[1] = (khcpcby+khrgly)*0.5;
685 gMC->Gspos("FRGL",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
686 gMC->Gspos("FRGL",3,"FSTR",0., posfp[1],0.,0,"ONLY");
688 //-- GLASS Layer definition
689 parfp[1] = khglassy*0.5;
690 parfp[2] = kwglfz*0.5;
691 gMC->Gsvolu("FGLA","BOX",idtmed[509],parfp,3); // glass
693 // positioning 4 GLASS Layers on FSTR volume
694 posfp[1] = -khstripy*0.5+khhony+khpcby+khrgly+parfp[1];
695 gMC->Gspos("FGLA",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
696 gMC->Gspos("FGLA",4,"FSTR",0., posfp[1],0.,0,"ONLY");
697 posfp[1] = khcpcby*0.5+khrgly+khglassy*0.5;
698 gMC->Gspos("FGLA",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
699 gMC->Gspos("FGLA",3,"FSTR",0., posfp[1],0.,0,"ONLY");
701 //-- FREON Layer definition
702 parfp[1] = khfiliy*0.5;
703 gMC->Gsvolu("FFIS","BOX",idtmed[507],parfp,3); // freon
705 // positioning 2 FREON Layers on FSTR volume
706 posfp[1] = -khstripy*0.5+khhony+khpcby+khrgly+khglassy+parfp[1];
707 gMC->Gspos("FFIS",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
708 gMC->Gspos("FFIS",2,"FSTR",0., posfp[1],0.,0,"ONLY");
711 //-- GLASS+FISHLINE Layer definition
712 parfp[1] = khglfy*0.5;
713 parfp[2] = kwglfz*0.5;
714 gMC->Gsvolu("FGLF","BOX",idtmed[504],parfp,3);
716 // positioning 2 GLASS+FISHLINE Layers on FSTR volume
717 posfp[1] = (khcpcby+khglfy)*0.5+khrgly;
718 gMC->Gspos("FGLF",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
719 gMC->Gspos("FGLF",2,"FSTR",0., posfp[1],0.,0,"ONLY");
722 // Positioning the Strips (FSTR) in the FLT volumes
723 Int_t maxStripNumbers [5] ={fTOFGeometry->NStripC(),
724 fTOFGeometry->NStripB(),
725 fTOFGeometry->NStripA(),
726 fTOFGeometry->NStripB(),
727 fTOFGeometry->NStripC()};
729 Int_t totalStrip = 0;
730 Float_t xpos, zpos, ypos, ang;
731 for(Int_t iplate =0; iplate < fTOFGeometry->NPlates(); iplate++){
732 if (iplate>0) totalStrip += maxStripNumbers[iplate-1];
733 for(Int_t istrip =0; istrip < maxStripNumbers[iplate]; istrip++){
735 ang = fTOFGeometry->GetAngles(iplate,istrip);
736 AliDebug(1, Form(" iplate = %1i, istrip = %2i ---> ang = %f", iplate, istrip, ang));
738 if (ang>0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.+ang,90., ang, 90.);
739 else if (ang==0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.,90., 0., 0.);
740 else if (ang<0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.+ang,90.,-ang,270.);
743 zpos = fTOFGeometry->GetDistances(iplate,istrip);
744 ypos = fTOFGeometry->GetHeights(iplate,istrip);
746 gMC->Gspos("FSTR",istrip+totalStrip+1,"FLTA", xpos, ypos,-zpos,idrotm[istrip+totalStrip+1], "ONLY");
749 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");
750 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");
755 // 1.5 cm Al honeycomb layer between strips and cards
757 par[1] = kHoneycombLayerThickness*0.5;
759 gMC->Gsvolu("FPEA", "BOX ", idtmed[506], par, 3); // Al honeycomb
762 ycoor = kHoneycombLayerThickness*0.5;
764 gMC->Gspos ("FPEA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
768 par[1] = kHoneycombLayerThickness*0.5;
769 par[2] = (zlenA*0.5 - kInterCentrModBorder2-kModuleWallThickness)*0.5;
770 gMC->Gsvolu("FPEB", "BOX ", idtmed[506], par, 3); // Al honeycomb
773 ycoor = kHoneycombLayerThickness*0.5;
774 zcoor = (kInterCentrModBorder2-kInterCentrModBorder1)*0.5;
775 gMC->Gspos ("FPEB", 1, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
776 gMC->Gspos ("FPEB", 2, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
781 par[1] = (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
783 gMC->Gsvolu("FAIA", "BOX ", idtmed[500], par, 3); // Air
786 ycoor = kHoneycombLayerThickness + (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
788 gMC->Gspos ("FAIA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
792 par[1] = (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
793 par[2] = (zlenA*0.5 - kInterCentrModBorder2 - kModuleWallThickness)*0.5;
794 gMC->Gsvolu("FAIB", "BOX ", idtmed[500], par, 3); // Air
795 gMC->Gsvolu("FAIC", "BOX ", idtmed[500], par, 3); // Air
798 ycoor = kHoneycombLayerThickness + (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
799 zcoor = (kInterCentrModBorder2-kInterCentrModBorder1)*0.5;
800 gMC->Gspos ("FAIB", 0, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
801 gMC->Gspos ("FAIC", 0, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
804 // start with cards and cooling tubes
805 // finally, cards, cooling tubes and layer for thermal dispersion
808 // see GEOM200 in GEANT manual
812 // card volume definition
813 cardpar[0]= xFLT*0.5;
816 gMC->Gsvolu("FCAR", "BOX ", idtmed[502], cardpar, 3); // PCB Card
818 //alu plate volume definition
821 gMC->Gsvolu("FALP", "BOX ", idtmed[505], cardpar, 3); // Alu Plate
823 // tube volume definition
828 gMC->Gsvolu("FTUB", "TUBE", idtmed[511], tubepar, 3); // cooling tubes (steel)
833 gMC->Gsvolu("FITU", "TUBE", idtmed[510], tubepar, 3); // cooling water
834 // positioning water tube into the steel one
835 gMC->Gspos("FITU",1,"FTUB",0.,0.,0.,0,"ONLY");
838 AliMatrix(idrotm[99], 180., 90., 90., 90., 90., 0.);
840 // central module positioning
841 Float_t cardpos[3], aplpos2;
842 Float_t stepforcardA = 6.625;
844 Float_t aplpos1 = -2.;
849 // tubepos= -53.+tdis;
851 for (icard=39; icard<54; ++icard) {
852 cardpos[2]= cardpos[2]+stepforcardA;
853 aplpos2 = cardpos[2]+0.15;
854 gMC->Gspos("FCAR",icard,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
855 gMC->Gspos("FALP",icard,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
856 gMC->Gspos("FTUB",icard,"FAIA", 0.,cardpos[1],cardpos[2]+tdis,idrotm[99],"ONLY");
859 // intermediate module positioning
860 Float_t stepforcardB= 7.05;
864 for (icard=20; icard<39; ++icard) {
865 cardpos[2]= cardpos[2]+stepforcardB;
866 aplpos2 = cardpos[2]+0.15;
868 gMC->Gspos("FCAR",icard+34,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
869 gMC->Gspos("FALP",icard+34,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
870 gMC->Gspos("FTUB",icard+34,"FAIA", 0.,cardpos[1], cardpos[2]+tdis,idrotm[99],"ONLY");
871 gMC->Gspos("FCAR",58-icard,"FAIA",cardpos[0],cardpos[1], -cardpos[2], 0,"ONLY");
872 gMC->Gspos("FALP",58-icard,"FAIA",cardpos[0], aplpos1, -aplpos2, 0,"ONLY");
873 gMC->Gspos("FTUB",58-icard,"FAIA", 0.,cardpos[1],-cardpos[2]-tdis,idrotm[99],"ONLY");
876 gMC->Gspos("FCAR",icard+34+182,"FAIC",cardpos[0],cardpos[1], cardpos[2]-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
877 gMC->Gspos("FALP",icard+34+182,"FAIC",cardpos[0], aplpos1, aplpos2-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
878 gMC->Gspos("FTUB",icard+34+182,"FAIC", 0.,cardpos[1], cardpos[2]+tdis-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
879 gMC->Gspos("FCAR",58-icard+ 91,"FAIB",cardpos[0],cardpos[1], -cardpos[2]+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
880 gMC->Gspos("FALP",58-icard+ 91,"FAIB",cardpos[0], aplpos1, -aplpos2+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
881 gMC->Gspos("FTUB",58-icard+ 91,"FAIB", 0.,cardpos[1],-cardpos[2]-tdis+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
886 // outer module positioning
887 Float_t stepforcardC= 8.45238;
890 for (icard=1; icard<20; ++icard) {
891 cardpos[2]= cardpos[2]+stepforcardC;
892 aplpos2 = cardpos[2]+0.15;
894 gMC->Gspos("FCAR",icard+72,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
895 gMC->Gspos("FALP",icard+72,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
896 gMC->Gspos("FTUB",icard+72,"FAIA", 0.,cardpos[1], cardpos[2]+tdis,idrotm[99],"ONLY");
897 gMC->Gspos("FCAR",20-icard,"FAIA",cardpos[0],cardpos[1], -cardpos[2], 0,"ONLY");
898 gMC->Gspos("FALP",20-icard,"FAIA",cardpos[0], aplpos1, -aplpos2, 0,"ONLY");
899 gMC->Gspos("FTUB",20-icard,"FAIA", 0.,cardpos[1],-cardpos[2]-tdis,idrotm[99],"ONLY");
902 gMC->Gspos("FCAR",icard+72+182,"FAIC",cardpos[0],cardpos[1], cardpos[2]-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
903 gMC->Gspos("FALP",icard+72+182,"FAIC",cardpos[0], aplpos1, aplpos2-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
904 gMC->Gspos("FTUB",icard+72+182,"FAIC", 0.,cardpos[1], cardpos[2]+tdis-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
905 gMC->Gspos("FCAR",20-icard+ 91,"FAIB",cardpos[0],cardpos[1], -cardpos[2]+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
906 gMC->Gspos("FALP",20-icard+ 91,"FAIB",cardpos[0], aplpos1, -aplpos2+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
907 gMC->Gspos("FTUB",20-icard+ 91,"FAIB", 0.,cardpos[1],-cardpos[2]-tdis+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
912 //_____________________________________________________________________________
913 void AliTOFv5T0::DrawModule() const
916 // Draw a shaded view of the Time Of Flight version 4
919 // Set everything unseen
920 gMC->Gsatt("*", "seen", -1);
923 //Set volumes visible
926 //Set ALIC mother transparent
927 gMC->Gsatt("ALIC","SEEN", 0);
930 // Level 1 for TOF volumes
931 gMC->Gsatt("B077","seen", 0);
934 // Level 2 for TOF volumes
935 gMC->Gsatt("B071","seen", 0);
936 gMC->Gsatt("B074","seen", 0);
937 gMC->Gsatt("B075","seen", 0);
938 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
939 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
942 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
943 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
944 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
945 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
946 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
948 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
949 gMC->Gsatt("BTO1","seen", 0);
952 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
953 gMC->Gsatt("BTO2","seen", 0);
956 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
957 gMC->Gsatt("BTO3","seen", 0);
959 // Level 3 of B071, B074 and B075
960 gMC->Gsatt("FTOA","SEEN", 0);
961 if (fTOFHoles) gMC->Gsatt("FTOB","SEEN", 0);
963 // Level 4 of B071, B074 and B075
964 gMC->Gsatt("FLTA","SEEN", 0);
965 if (fTOFHoles) gMC->Gsatt("FLTB","SEEN",0);
966 if (fTOFHoles) gMC->Gsatt("FLTC","SEEN",0);
968 // Level 5 of B071, B074 and B075
969 gMC->Gsatt("FAIA","SEEN",-1); // all FAIA sub-levels skipped -
970 if (fTOFHoles) gMC->Gsatt("FAIB","SEEN",-1); // all FAIB sub-levels skipped -
971 if (fTOFHoles) gMC->Gsatt("FAIC","SEEN",-1); // all FAIC sub-levels skipped -
973 gMC->Gsatt("FALA","SEEN", 0);
974 if (fTOFHoles) gMC->Gsatt("FALB","SEEN", 0);
976 gMC->Gsatt("FPEA","SEEN", 1);
977 if (fTOFHoles) gMC->Gsatt("FPEB","SEEN", 1);
979 gMC->Gsatt("FSTR","SEEN",-1); // all FSTR sub-levels skipped -
981 gMC->Gsatt("FWZ1","SEEN", 0);
982 gMC->Gsatt("FWZ2","SEEN", 0);
983 gMC->Gsatt("FWZ3","SEEN", 0);
984 gMC->Gsatt("FWZ4","SEEN", 0);
986 gMC->Gsatt("FZ1B","SEEN", 0);
987 gMC->Gsatt("FZ1C","SEEN", 0);
988 gMC->Gsatt("FZ2B","SEEN", 0);
991 gMC->Gdopt("hide", "on");
992 gMC->Gdopt("shad", "on");
993 gMC->Gsatt("*", "fill", 7);
994 gMC->SetClipBox(".");
995 gMC->SetClipBox("*", 100, 1000, 100, 1000, 100, 1000);
997 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
998 gMC->Gdhead(1111, "Time Of Flight");
999 gMC->Gdman(18, 3, "MAN");
1000 gMC->Gdopt("hide","off");
1002 //_____________________________________________________________________________
1003 void AliTOFv5T0::DrawDetectorModules() const
1006 // Draw a shaded view of the TOF detector version 4
1009 // Set everything unseen
1010 gMC->Gsatt("*", "seen", -1);
1013 //Set volumes visible
1016 //Set ALIC mother transparent
1017 gMC->Gsatt("ALIC","SEEN", 0);
1020 // Level 1 for TOF volumes
1021 gMC->Gsatt("B077","seen", 0);
1024 // Level 2 for TOF volumes
1025 gMC->Gsatt("B071","seen", 0);
1026 gMC->Gsatt("B074","seen", 0);
1027 gMC->Gsatt("B075","seen", 0);
1028 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
1029 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
1032 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
1033 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
1034 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
1035 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
1036 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
1038 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
1039 gMC->Gsatt("BTO1","seen", 0);
1042 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
1043 gMC->Gsatt("BTO2","seen", 0);
1046 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
1047 gMC->Gsatt("BTO3","seen", 0);
1049 // Level 3 of B071, B075 and B074
1050 gMC->Gsatt("FTOA","seen",-2); // all FTOA sub-levels skipped -
1052 gMC->Gsatt("FTOB","seen",-2); // all FTOB sub-levels skipped -
1053 gMC->Gsatt("FTOC","seen",-2); // all FTOC sub-levels skipped -
1056 gMC->Gdopt("hide","on");
1057 gMC->Gdopt("shad","on");
1058 gMC->Gsatt("*", "fill", 5);
1059 gMC->SetClipBox(".");
1060 gMC->SetClipBox("*", 100, 1000, 100, 1000, 0, 1000);
1061 gMC->DefaultRange();
1062 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
1063 gMC->Gdhead(1111,"TOF detector");
1064 gMC->Gdman(18, 3, "MAN");
1065 gMC->Gdopt("hide","off");
1068 //_____________________________________________________________________________
1069 void AliTOFv5T0::DrawDetectorStrips() const
1072 // Draw a shaded view of the TOF strips for version 4
1075 // Set everything unseen
1076 gMC->Gsatt("*", "seen", -1);
1079 //Set volumes visible
1082 //Set ALIC mother transparent
1083 gMC->Gsatt("ALIC","SEEN", 0);
1086 // Level 1 for TOF volumes
1087 gMC->Gsatt("B077","seen", 0);
1090 // Level 2 for TOF volumes
1091 gMC->Gsatt("B071","seen", 0);
1092 gMC->Gsatt("B074","seen", 0);
1093 gMC->Gsatt("B075","seen", 0);
1094 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
1095 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
1098 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
1099 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
1100 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
1101 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
1102 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
1104 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
1105 gMC->Gsatt("BTO1","seen", 0);
1108 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
1109 gMC->Gsatt("BTO2","seen", 0);
1112 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
1113 gMC->Gsatt("BTO3","seen", 0);
1115 // Level 3 of B071, B074 and B075
1116 gMC->Gsatt("FTOA","SEEN", 0);
1118 gMC->Gsatt("FTOB","SEEN", 0);
1119 gMC->Gsatt("FTOC","SEEN", 0);
1122 // Level 4 of B071, B074 and B075
1123 gMC->Gsatt("FLTA","SEEN", 0);
1125 gMC->Gsatt("FLTB","SEEN", 0);
1126 gMC->Gsatt("FLTC","SEEN", 0);
1129 // Level 5 of B071, B074 and B075
1130 gMC->Gsatt("FAIA","SEEN",-1); // all FAIA sub-levels skipped -
1132 gMC->Gsatt("FAIB","SEEN",-1); // all FAIB sub-levels skipped -
1133 gMC->Gsatt("FAIC","SEEN",-1); // all FAIC sub-levels skipped -
1136 gMC->Gsatt("FALA","SEEN", 0);
1137 if (fTOFHoles) gMC->Gsatt("FALB","SEEN", 0);
1139 gMC->Gsatt("FPEA","SEEN", 0);
1140 if (fTOFHoles) gMC->Gsatt("FPEB","SEEN", 0);
1142 gMC->Gsatt("FSTR","SEEN",-2); // all FSTR sub-levels skipped -
1144 gMC->Gsatt("FWZ1","SEEN", 0);
1145 gMC->Gsatt("FWZ2","SEEN", 0);
1146 gMC->Gsatt("FWZ3","SEEN", 0);
1147 gMC->Gsatt("FWZ4","SEEN", 0);
1149 gMC->Gsatt("FZ1B","SEEN", 0);
1150 gMC->Gsatt("FZ1C","SEEN", 0);
1151 gMC->Gsatt("FZ2B","SEEN", 0);
1158 gMC->Gsatt("FALP","SEEN",0);
1159 gMC->Gsatt("FCAR","SEEN",0);
1160 gMC->Gsatt("FTUB","SEEN",-1); // all FTUB sub-levels skipped -
1163 gMC->Gsatt("FITU","SEEN",0);
1168 gMC->Gsatt("FGLF","SEEN",0);
1169 gMC->Gsatt("FHON","SEEN",0);
1170 gMC->Gsatt("FPC1","SEEN",0);
1171 gMC->Gsatt("FPC2","SEEN",0);
1172 gMC->Gsatt("FPCB","SEEN",0);
1173 gMC->Gsatt("FRGL","SEEN",0);
1175 // Level 2 of FPCB => Level 3 of FSTR
1176 gMC->Gsatt("FSEN","SEEN",0);
1177 gMC->Gsatt("FSEZ","SEEN",0);
1178 gMC->Gsatt("FPAD","SEEN",1);
1181 gMC->Gdopt("hide","on");
1182 gMC->Gdopt("shad","on");
1183 gMC->Gsatt("*", "fill", 5);
1184 gMC->SetClipBox(".");
1185 gMC->SetClipBox("*", 0, 1000, 0, 1000, 0, 1000);
1186 gMC->DefaultRange();
1187 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
1188 gMC->Gdhead(1111,"TOF Strips");
1189 gMC->Gdman(18, 3, "MAN");
1190 gMC->Gdopt("hide","off");
1193 //_____________________________________________________________________________
1194 void AliTOFv5T0::CreateMaterials()
1197 // Define materials for the Time Of Flight
1200 //AliTOF::CreateMaterials();
1202 AliMagF *magneticField = (AliMagF*)gAlice->Field();
1204 Int_t isxfld = magneticField->Integ();
1205 Float_t sxmgmx = magneticField->Max();
1207 Float_t we[7], ae[7], na[7], fr[7], vl[7];
1210 //--- Quartz (SiO2) to simulate float glass
1211 // density tuned to have correct float glass
1213 Float_t aq[2] = { 28.0855,15.9994 };
1214 Float_t zq[2] = { 14.,8. };
1215 Float_t wq[2] = { 1.,2. };
1216 Float_t dq = 2.55; // std value: 2.2
1220 Float_t anox[4] = {12.01,1.01,16.00,14.01};
1221 Float_t znox[4] = { 6., 1., 8., 7.};
1222 Float_t wnox[4] = {14., 22., 2., 2.};
1223 Float_t dnox = 0.048;
1227 Float_t ag10[4] = {28.09,12.01,1.01,16.00};
1228 Float_t zg10[4] = {14., 6., 1., 8.};
1231 for (i = 0; i < nlmatg10; ++i) {
1247 MaterialMixer(we,ae,na,fr,vl,5);
1253 Float_t densg10 = 1.7;
1256 Float_t awa[2] = { 1., 16. };
1257 Float_t zwa[2] = { 1., 8. };
1258 Float_t wwa[2] = { 2., 1. };
1263 Float_t asteel[4] = { 55.847,51.9961,58.6934,28.0855 };
1264 Float_t zsteel[4] = { 26.,24.,28.,14. };
1265 Float_t wsteel[4] = { .715,.18,.1,.005 };
1268 Float_t aAir[4]={12.0107,14.0067,15.9994,39.948};
1269 Float_t zAir[4]={6.,7.,8.,18.};
1270 Float_t wAir[4]={0.000124,0.755267,0.231781,0.012827};
1271 Float_t dAir = 1.20479E-3;
1274 Float_t afg[4] = {28.09,16.00,12.01,1.01};
1275 Float_t zfg[4] = {14., 8., 6., 1.};
1276 Float_t wfg[4] = {0.12906,0.29405,0.51502,0.06187};
1277 Float_t dfg = 1.111;
1280 // --- Freon C2F4H2 + SF6
1281 Float_t afre[4]= {12.01,1.01,19.00,32.07};
1282 Float_t zfre[4]= { 6., 1., 9., 16.};
1283 Float_t wfre[4]= {0.21250,0.01787,0.74827,0.021355};
1284 Float_t densfre= 0.00375;
1287 //char namat[15] = " ";
1288 //Float_t ama[2], zma[2], dma, radl, absl, buf[1];
1291 AliMixture ( 0, "Air$", aAir, zAir, dAir, 4, wAir);
1292 AliMixture ( 1, "Nomex$", anox, znox, dnox, nnox, wnox);
1293 AliMixture ( 2, "G10$", ag10, zg10, densg10, nlmatg10, wmatg10);
1294 AliMixture ( 3, "fibre glass$", afg, zfg, dfg, nfg, wfg);
1295 AliMaterial( 4, "Al $", 26.98, 13., 2.7, 8.9, 37.2);
1296 AliMaterial( 5, "Al honeycomb$", 26.98, 13., 0.0496, 483., 2483.);
1297 AliMixture ( 6, "Freon$", afre, zfre, densfre, nfre, wfre);
1298 AliMixture ( 7, "Glass$", aq, zq, dq, nq, wq);
1300 // get freon and glass
1301 gMC->Gfmate((*fIdmate)[6],namat,ama[0],zma[0],dma,radl,absl,buf,nbuf);
1302 gMC->Gfmate((*fIdmate)[7],namat,ama[1],zma[1],dma,radl,absl,buf,nbuf);
1305 Float_t wgfr[2]= {0.0011,0.9989};
1306 Float_t dgfr = 1.434;
1308 AliMixture ( 8, "glass-freon$", ama, zma, dgfr, ngfr, wgfr);
1310 AliMixture ( 9, "Water$", awa, zwa, dwa, nwa, wwa);
1311 AliMixture (10, "STAINLESS STEEL$", asteel, zsteel, 7.88, 4, wsteel);
1313 Float_t epsil, stmin, deemax, stemax;
1316 // EPSIL = 0.1 ! Tracking precision,
1317 // STEMAX = 0.1 ! Maximum displacement for multiple scattering
1318 // DEEMAX = 0.1 ! Maximum fractional energy loss, DLS
1322 epsil = .001; // Tracking precision,
1323 stemax = -1.; // Maximum displacement for multiple scattering
1324 deemax = -.3; // Maximum fractional energy loss, DLS
1327 AliMedium( 1, "Air$", 0, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1328 AliMedium( 2,"Nomex$", 1, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1329 AliMedium( 3,"G10$", 2, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1330 AliMedium( 4,"fibre glass$", 3, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1331 //AliMedium( 5,"glass-freon$", 8, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1332 AliMedium( 6,"Al Frame$", 4, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1333 AliMedium( 7,"Al honeycomb$", 5, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1334 AliMedium( 8,"Fre$", 6, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1335 AliMedium( 9,"PCB-S$", 2, 1, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1336 AliMedium(10,"Glass$", 7, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1337 AliMedium(11,"Water$", 9, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1338 AliMedium(12,"STEEL$", 10, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1341 //_____________________________________________________________________________
1342 void AliTOFv5T0::Init()
1345 // Initialise the detector after the geometry has been defined
1347 AliDebug(1, "**************************************"
1349 "**************************************");
1350 AliDebug(1, " Version 4 of TOF initialing, "
1351 "symmetric TOF - Full Coverage version");
1355 fIdFTOA = gMC->VolId("FTOA");
1357 fIdFTOB = gMC->VolId("FTOB");
1358 fIdFTOC = gMC->VolId("FTOC");
1360 fIdFLTA = gMC->VolId("FLTA");
1362 fIdFLTB = gMC->VolId("FLTB");
1363 fIdFLTC = gMC->VolId("FLTC");
1366 AliDebug(1, "**************************************"
1368 "**************************************");
1371 //_____________________________________________________________________________
1372 void AliTOFv5T0::StepManager()
1376 // Procedure called at each step in the Time Of Flight
1379 TLorentzVector mom, pos;
1380 Float_t xm[3],pm[3],xpad[3],ppad[3];
1383 Int_t sector, plate, padx, padz, strip;
1384 Int_t copy, padzid, padxid, stripid, i;
1385 Int_t *idtmed = fIdtmed->GetArray()-499;
1386 Float_t incidenceAngle;
1388 const char* volpath;
1393 gMC->IsTrackEntering()
1394 && gMC->TrackCharge()
1395 //&& gMC->GetMedium()==idtmed[508]
1396 && gMC->CurrentMedium()==idtmed[508]
1397 && gMC->CurrentVolID(copy)==fIdSens
1401 AliMC *mcApplication = (AliMC*)gAlice->GetMCApp();
1403 AddTrackReference(mcApplication->GetCurrentTrackNumber());
1404 //AddTrackReference(gAlice->GetMCApp()->GetCurrentTrackNumber());
1406 // getting information about hit volumes
1408 padzid=gMC->CurrentVolOffID(1,copy);
1412 padxid=gMC->CurrentVolOffID(0,copy);
1416 stripid=gMC->CurrentVolOffID(4,copy);
1420 gMC->TrackPosition(pos);
1421 gMC->TrackMomentum(mom);
1423 Double_t normMom=1./mom.Rho();
1425 // getting the coordinates in pad ref system
1427 xm[0] = (Float_t)pos.X();
1428 xm[1] = (Float_t)pos.Y();
1429 xm[2] = (Float_t)pos.Z();
1431 pm[0] = (Float_t)mom.X()*normMom;
1432 pm[1] = (Float_t)mom.Y()*normMom;
1433 pm[2] = (Float_t)mom.Z()*normMom;
1435 gMC->Gmtod(xm,xpad,1); // from MRS to DRS: coordinates convertion
1436 gMC->Gmtod(pm,ppad,2); // from MRS to DRS: direction cosinus convertion
1439 if (TMath::Abs(ppad[1])>1) {
1440 AliWarning("Abs(ppad) > 1");
1441 ppad[1]=TMath::Sign((Float_t)1,ppad[1]);
1443 incidenceAngle = TMath::ACos(ppad[1])*kRaddeg;
1446 if (strip < fTOFGeometry->NStripC()) {
1450 else if (strip >= fTOFGeometry->NStripC() &&
1451 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB()) {
1453 strip = strip - fTOFGeometry->NStripC();
1455 else if (strip >= fTOFGeometry->NStripC() + fTOFGeometry->NStripB() &&
1456 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA()) {
1458 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB();
1460 else if (strip >= fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA() &&
1461 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA() + fTOFGeometry->NStripB()) {
1463 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB() - fTOFGeometry->NStripA();
1467 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB() - fTOFGeometry->NStripA() - fTOFGeometry->NStripB();
1470 volpath=gMC->CurrentVolOffName(7);
1471 index=atoi(&volpath[4]);
1488 hits[6] = mom.Rho();
1493 hits[11]= incidenceAngle;
1494 hits[12]= gMC->Edep();
1495 hits[13]= gMC->TrackLength();
1503 AddT0Hit(mcApplication->GetCurrentTrackNumber(),vol, hits);
1504 //AddT0Hit(gAlice->GetMCApp()->GetCurrentTrackNumber(),vol, hits);
1507 //-------------------------------------------------------------------
1508 void AliTOFv5T0::MaterialMixer(Float_t* p,Float_t* a,Float_t* m,Float_t* d,Float_t* s,Int_t n) const
1510 // a[] atomic weights vector (in)
1511 // (atoms present in more compound appear separately)
1512 // m[] number of corresponding atoms in the mixture (in)
1513 // d[] fraction of the compound relative to the corresponding atoms (in)
1514 // s[] further possible weights " " " " (in)
1516 for (Int_t i = 0; i < n; ++i) {
1517 p[i] = a[i]*m[i]*d[i]*s[i];
1520 for (Int_t i = 0; i < n; ++i) {
1522 // AliInfo(Form((\n weight[%i] = %f (,i,p[i]));