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.11 2006/07/12 16:03:44 arcelli
19 updates to match the new numbering of the TOF/TRD mother volumes in FRAME (ALICE convention)
21 Revision 1.10 2006/05/10 18:40:17 hristov
22 Larger strings for the names
24 Revision 1.9 2006/05/04 19:41:42 hristov
25 Possibility for partial TOF geometry (S.Arcelli)
27 Revision 1.8 2006/04/20 22:30:50 hristov
28 Coding conventions (Annalisa)
30 Revision 1.7 2006/04/16 22:29:05 hristov
31 Coding conventions (Annalisa)
33 Revision 1.6 2006/03/20 08:20:35 decaro
34 Al layer: positioning correction
36 Revision 1.5 2006/03/20 07:54:20 decaro
37 Correction of some layer thickness
39 Revision 1.4 2006/03/13 12:35:44 decaro
40 Suppression of fractional Z warning
42 Revision 1.3 2006/02/28 10:38:00 decaro
43 AliTOFGeometry::fAngles, AliTOFGeometry::fHeights,
44 AliTOFGeometry::fDistances arrays: dimension definition in the right
47 Revision 1.2 2006/02/27 18:12:14 decaro
48 Remove in StepManager the dependence of hit indexes from parametrized
51 Revision 1.1 2005/12/15 08:55:33 decaro
52 New TOF geometry description (V5) -G. Cara Romeo and A. De Caro
55 Revision 0.1 2004 November G. Cara Romeo and A. De Caro
56 Implement new TOF geometry version
58 suppress few volume overlaps
59 (in the 4th TOF geometry version),
60 insert the realistic strip numbers and positions
64 ///////////////////////////////////////////////////////////////////////////////
66 // This class contains the functions for version 5 of the Time Of Flight //
69 // VERSION WITH 5 MODULES AND TILTED STRIPS //
71 // FULL COVERAGE VERSION + OPTION for PHOS holes //
76 <img src="picts/AliTOFv5T0Class.gif"> //
80 ///////////////////////////////////////////////////////////////////////////////
83 #include "TGeometry.h"
84 #include "TLorentzVector.h"
86 #include "TVirtualMC.h"
94 #include "AliTOFGeometry.h"
95 #include "AliTOFGeometryV5.h"
96 #include "AliTOFv5T0.h"
98 extern TDirectory *gDirectory;
99 extern TVirtualMC *gMC;
101 extern AliRun *gAlice;
105 //_____________________________________________________________________________
106 AliTOFv5T0::AliTOFv5T0():
116 // Default constructor
120 //_____________________________________________________________________________
121 AliTOFv5T0::AliTOFv5T0(const char *name, const char *title):
122 AliTOF(name,title,"tzero"),
132 // Standard constructor
135 // Check that FRAME is there otherwise we have no place where to
139 AliModule* frame = (AliModule*)gAlice->GetModule("FRAME");
141 AliFatal("TOF needs FRAME to be present");
144 if (fTOFGeometry) delete fTOFGeometry;
145 fTOFGeometry = new AliTOFGeometryV5();
147 if(frame->IsVersion()==1) {
148 AliInfo(Form("Frame version %d", frame->IsVersion()));
149 AliInfo("Full Coverage for TOF");
152 AliInfo(Form("Frame version %d", frame->IsVersion()));
153 AliInfo("TOF with Holes for PHOS");
156 fTOFGeometry->SetHoles(fTOFHoles);
158 //AliTOF::fTOFGeometry = fTOFGeometry;
161 TDirectory* saveDir = gDirectory;
162 gAlice->GetRunLoader()->CdGAFile();
163 fTOFGeometry->Write("TOFgeometry");
168 //____________________________________________________________________________
169 void AliTOFv5T0::BuildGeometry()
172 // Build TOF ROOT geometry for the ALICE event display
175 const int kColorTOF = 27;
177 TGeometry *globalGeometry = (TGeometry*)gAlice->GetGeometry();
180 top = globalGeometry->GetNode("alice");
182 // Position the different copies
183 const Float_t krTof =(fTOFGeometry->Rmax()+fTOFGeometry->Rmin())/2.;
184 const Float_t khTof = fTOFGeometry->Rmax()-fTOFGeometry->Rmin();
185 const Int_t kNTof = fTOFGeometry->NSectors();
186 const Float_t kangle = k2PI/kNTof;
188 const Float_t kInterCentrModBorder1 = 49.5;
189 const Float_t kInterCentrModBorder2 = 57.5;
193 // define offset for nodes
194 Float_t zOffsetB = (fTOFGeometry->ZlenA()*0.5 + (kInterCentrModBorder1+kInterCentrModBorder2)*0.5)*0.5;
195 Float_t zOffsetA = 0.;
196 // Define TOF basic volume
198 char nodeName0[16], nodeName1[16], nodeName2[16];
199 char nodeName3[16], nodeName4[16], rotMatNum[16];
202 new TBRIK("S_TOF_B","TOF box","void",
203 fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenB()*0.5);
204 new TBRIK("S_TOF_C","TOF box","void",
205 fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenB()*0.5);
207 new TBRIK("S_TOF_A","TOF box","void",
208 fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenA()*0.5);
210 for (Int_t nodeNum=1;nodeNum<19;nodeNum++){
213 sprintf(rotMatNum,"rot50%i",nodeNum);
214 sprintf(nodeName0,"FTO00%i",nodeNum);
215 sprintf(nodeName1,"FTO10%i",nodeNum);
216 sprintf(nodeName2,"FTO20%i",nodeNum);
217 sprintf(nodeName3,"FTO30%i",nodeNum);
218 sprintf(nodeName4,"FTO40%i",nodeNum);
221 sprintf(rotMatNum,"rot5%i",nodeNum);
222 sprintf(nodeName0,"FTO0%i",nodeNum);
223 sprintf(nodeName1,"FTO1%i",nodeNum);
224 sprintf(nodeName2,"FTO2%i",nodeNum);
225 sprintf(nodeName3,"FTO3%i",nodeNum);
226 sprintf(nodeName4,"FTO4%i",nodeNum);
229 new TRotMatrix(rotMatNum,rotMatNum,90,-20*nodeNum,90,90-20*nodeNum,0,0);
230 ang = (4.5-nodeNum) * kangle;
234 node = new TNode(nodeName2,nodeName2,"S_TOF_B", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang), zOffsetB,rotMatNum);
235 node->SetLineColor(kColorTOF);
239 node = new TNode(nodeName3,nodeName3,"S_TOF_C", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang),-zOffsetB,rotMatNum);
240 node->SetLineColor(kColorTOF);
245 node = new TNode(nodeName4,nodeName4,"S_TOF_A", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang), zOffsetA,rotMatNum);
246 node->SetLineColor(kColorTOF);
248 } // end loop on nodeNum
252 //_____________________________________________________________________________
253 void AliTOFv5T0::CreateGeometry()
256 // Create geometry for Time Of Flight version 0
260 <img src="picts/AliTOFv5T0.gif">
264 // Creates common geometry
266 AliTOF::CreateGeometry();
270 //_____________________________________________________________________________
271 void AliTOFv5T0::TOFpc(Float_t xtof, Float_t ytof, Float_t zlenA,
275 // Definition of the Time Of Fligh Resistive Plate Chambers
278 const Float_t kPi = TMath::Pi();
280 const Float_t kInterCentrModBorder1 = 49.5;
281 const Float_t kInterCentrModBorder2 = 57.5;
282 const Float_t kExterInterModBorder1 = 196.0;
283 const Float_t kExterInterModBorder2 = 203.5;
285 const Float_t kLengthExInModBorder = 4.7;
286 const Float_t kLengthInCeModBorder = 7.0;
288 // Al layers over all internal module walls (cm)
289 const Float_t khAlWall = 0.03;
291 // module wall thickness (cm)
292 const Float_t kModuleWallThickness = 0.3;
294 // Al honeycomb layer between strips and cards (cm)
295 const Float_t kHoneycombLayerThickness = 1.5;
297 AliDebug(2,Form("zlenA*0.5 = %d", zlenA*0.5));
298 AliDebug(1, "************************* TOF geometry **************************");
300 // Definition of the Time Of Fligh Resistive Plate Chambers
301 // xFLT, yFLT, zFLT - sizes of TOF modules (large)
303 Float_t xcoor, ycoor, zcoor;
305 Int_t *idtmed = fIdtmed->GetArray()-499;
310 par[2] = zlenA * 0.5;
311 gMC->Gsvolu("FTOA", "BOX ", idtmed[503], par, 3); // fibre glass
316 par[2] = (zlenA*0.5 - kInterCentrModBorder1)*0.5;
317 gMC->Gsvolu("FTOB", "BOX ", idtmed[503], par, 3); // fibre glass
318 gMC->Gsvolu("FTOC", "BOX ", idtmed[503], par, 3); // fibre glass
321 // Positioning of fibre glass modules (FTOA, FTOB and FTOC)
323 //AliMatrix(idrotm[0], 90., 0., 0., 0., 90.,-90.);
324 AliMatrix(idrotm[0], 90., 0., 0., 0., 90.,270.);
329 for(Int_t isec=0;isec<18;isec++){
330 if(fTOFSectors[isec]==-1)continue;
332 sprintf(name, "BTOF%d",isec);
333 if (fTOFHoles && (isec==11||isec==12)) {
334 // if (fTOFHoles && (isec==16||isec==17)) { \\Old 6h convention
336 ycoor = (zlenA*0.5 + kInterCentrModBorder1)*0.5;
338 gMC->Gspos("FTOB", 0, name, xcoor, ycoor, zcoor, idrotm[0], "ONLY");
339 gMC->Gspos("FTOC", 0, name, xcoor,-ycoor, zcoor, idrotm[0], "ONLY");
341 else gMC->Gspos("FTOA", 0,name, xcoor, ycoor, zcoor, idrotm[0], "ONLY");
343 // Large not sensitive volumes with Insensitive Freon (FLTA, FLTB and FLTC)
345 Float_t xFLT, yFLT, zFLTA;
347 xFLT = xtof - kModuleWallThickness*2.;
348 yFLT = ytof - kModuleWallThickness*2.;
349 zFLTA = zlenA - kModuleWallThickness*2.;
354 gMC->Gsvolu("FLTA", "BOX ", idtmed[507], par, 3); // Freon mix
359 gMC->Gspos ("FLTA", 0, "FTOA", xcoor, ycoor, zcoor, 0, "ONLY");
364 par[2] = (zlenA*0.5 - kInterCentrModBorder1-kModuleWallThickness)*0.5;
365 gMC->Gsvolu("FLTB", "BOX ", idtmed[507], par, 3); // Freon mix
366 gMC->Gsvolu("FLTC", "BOX ", idtmed[507], par, 3); // Freon mix
370 zcoor = kModuleWallThickness*0.5;
371 gMC->Gspos ("FLTB", 0, "FTOB", xcoor, ycoor, zcoor, 0, "ONLY");
372 gMC->Gspos ("FLTC", 0, "FTOC", xcoor, ycoor,-zcoor, 0, "ONLY");
375 // Layer of Aluminum before detector (FALA, FALB and FALC)
378 par[1] = khAlWall*0.5;
379 par[2] = kInterCentrModBorder1 - (kModuleWallThickness + khAlWall);
380 gMC->Gsvolu("FALA", "BOX ", idtmed[505], par, 3); // Alluminium
383 ycoor = (-yFLT + khAlWall)*0.5;
385 gMC->Gspos ("FALA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
388 par[1] = khAlWall*0.5;
389 par[2] = (kExterInterModBorder2 - kInterCentrModBorder1 - 2.*(kModuleWallThickness + khAlWall))*0.5;
390 gMC->Gsvolu("FALB", "BOX ", idtmed[505], par, 3); // Alluminium
393 ycoor = (-yFLT + khAlWall)*0.5;
394 zcoor = (kExterInterModBorder2 + kInterCentrModBorder1)*0.5;
395 gMC->Gspos ("FALB", 1, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
396 gMC->Gspos ("FALB", 2, "FLTA", xcoor, ycoor,-zcoor, 0, "ONLY");
399 par[1] = khAlWall*0.5;
400 par[2] = (zlenA*0.5 - kExterInterModBorder2 - 2.*(kModuleWallThickness + khAlWall))*0.5;
401 gMC->Gsvolu("FALC", "BOX ", idtmed[505], par, 3); // Alluminium
404 ycoor = (-yFLT + khAlWall)*0.5;
405 zcoor = (kExterInterModBorder2+zlenA*0.5)*0.5;
406 gMC->Gspos ("FALC", 1, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
407 gMC->Gspos ("FALC", 2, "FLTA", xcoor, ycoor,-zcoor, 0, "ONLY");
411 ycoor = (-yFLT + khAlWall)*0.5;
412 zcoor = (zlenA*0.5 - kExterInterModBorder2)*0.5 - kModuleWallThickness*0.5;
413 gMC->Gspos ("FALB", 1, "FLTB", xcoor, ycoor, zcoor, 0, "ONLY");
414 gMC->Gspos ("FALB", 2, "FLTC", xcoor, ycoor,-zcoor, 0, "ONLY");
417 ycoor = (-yFLT + khAlWall)*0.5;
418 zcoor = (kExterInterModBorder2 - kInterCentrModBorder1)*0.5 + kModuleWallThickness*0.5;
419 gMC->Gspos ("FALC", 1, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
420 gMC->Gspos ("FALC", 2, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
423 Float_t y0, alpha, tgal, beta, tgbe, trpa[11];
425 // Fibre glass walls between central and intermediate modules (FWZ1 and FWZ2; holes -> FZ1B, FZ1C, FZ2B)
427 tgal = (yFLT*0.5 - 2.*kLengthInCeModBorder)/(kInterCentrModBorder2 - kInterCentrModBorder1);
428 alpha = TMath::ATan(tgal);
429 beta = (kPi*0.5 - alpha)*0.5;
430 tgbe = TMath::Tan(beta);
434 trpa[3] = kModuleWallThickness;
435 trpa[4] = (kLengthInCeModBorder - kModuleWallThickness*tgbe)*0.5;
436 trpa[5] = (kLengthInCeModBorder + kModuleWallThickness*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;
439 trpa[8] = (kLengthInCeModBorder - kModuleWallThickness*tgbe)*0.5;
440 trpa[9] = (kLengthInCeModBorder + kModuleWallThickness*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("FWZ1","TRAP", idtmed[503], trpa, 11); // fibre glass
444 AliMatrix (idrotm[1],90., 90.,180.,0.,90.,180.);
445 AliMatrix (idrotm[4],90., 90., 0.,0.,90., 0.);
448 ycoor = -yFLT*0.5 + kLengthInCeModBorder*0.5;
449 zcoor = kInterCentrModBorder1;
450 gMC->Gspos("FWZ1", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[1],"ONLY");
451 gMC->Gspos("FWZ1", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[4],"ONLY");
454 y0 = kLengthInCeModBorder - kModuleWallThickness*0.5*tgbe;
458 trpa[3] = kModuleWallThickness*0.5;
459 trpa[4] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
460 trpa[5] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
461 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
462 trpa[7] = kModuleWallThickness*0.5;
463 trpa[8] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
464 trpa[9] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
465 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
466 gMC->Gsvolu("FZ1B","TRAP", idtmed[503], trpa, 11); // fibre glass
469 ycoor = -yFLT*0.5 + kLengthInCeModBorder*0.5 - kModuleWallThickness*0.25*tgbe;
470 zcoor = -kInterCentrModBorder1 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
471 gMC->Gspos("FZ1B", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[4],"ONLY");
472 gMC->Gspos("FZ1B", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[1],"ONLY");
475 AliMatrix (idrotm[2],90.,270., 0.,0.,90.,180.);
476 AliMatrix (idrotm[5],90.,270.,180.,0.,90., 0.);
479 ycoor = -kLengthInCeModBorder*0.5;
480 zcoor = kInterCentrModBorder2;
481 gMC->Gspos("FWZ1", 3,"FLTA", xcoor, ycoor, zcoor,idrotm[2],"ONLY");
482 gMC->Gspos("FWZ1", 4,"FLTA", xcoor, ycoor,-zcoor,idrotm[5],"ONLY");
485 y0 = kLengthInCeModBorder + kModuleWallThickness*0.5*tgbe;
489 trpa[3] = kModuleWallThickness*0.5;
490 trpa[4] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
491 trpa[5] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
492 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
493 trpa[7] = kModuleWallThickness*0.5;
494 trpa[8] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
495 trpa[9] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
496 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
497 gMC->Gsvolu("FZ1C","TRAP", idtmed[503], trpa, 11); // fibre glass
500 ycoor = -kLengthInCeModBorder*0.5 - kModuleWallThickness*0.25*tgbe;
501 zcoor = -kInterCentrModBorder2 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
502 gMC->Gspos("FZ1C", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[5],"ONLY");
503 gMC->Gspos("FZ1C", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[2],"ONLY");
506 trpa[0] = 0.5*(kInterCentrModBorder2 - kInterCentrModBorder1)/TMath::Cos(alpha);
507 trpa[1] = kModuleWallThickness;
509 trpa[3] = -beta*kRaddeg;
512 gMC->Gsvolu("FWZ2","PARA", idtmed[503], trpa, 6); // fibre glass
514 AliMatrix (idrotm[3], alpha*kRaddeg,90.,90.+alpha*kRaddeg,90.,90.,180.);
515 AliMatrix (idrotm[6],180.-alpha*kRaddeg,90.,90.-alpha*kRaddeg,90.,90., 0.);
519 zcoor = (kInterCentrModBorder2 + kInterCentrModBorder1)*0.5;
520 gMC->Gspos("FWZ2", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[3],"ONLY");
521 gMC->Gspos("FWZ2", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[6],"ONLY");
524 trpa[0] = 0.5*(kInterCentrModBorder2 - kInterCentrModBorder1)/TMath::Cos(alpha);
525 trpa[1] = kModuleWallThickness*0.5;
527 trpa[3] = -beta*kRaddeg;
530 gMC->Gsvolu("FZ2B","PARA", idtmed[503], trpa, 6); // fibre glass
533 ycoor = -yFLT*0.25 - kModuleWallThickness*0.5*tgbe;
534 zcoor = -(kInterCentrModBorder2 + kInterCentrModBorder1)*0.5 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
535 gMC->Gspos("FZ2B", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[6],"ONLY");
536 gMC->Gspos("FZ2B", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[3],"ONLY");
539 // Fibre glass walls between intermediate and lateral modules (FWZ3 and FWZ4)
541 tgal = (yFLT*0.5 - 2.*kLengthExInModBorder)/(kExterInterModBorder2 - kExterInterModBorder1);
542 alpha = TMath::ATan(tgal);
543 beta = (kPi*0.5 - alpha)*0.5;
544 tgbe = TMath::Tan(beta);
548 trpa[3] = kModuleWallThickness;
549 trpa[4] = (kLengthExInModBorder - kModuleWallThickness*tgbe)*0.5;
550 trpa[5] = (kLengthExInModBorder + kModuleWallThickness*tgbe)*0.5;
551 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
552 trpa[7] = kModuleWallThickness;
553 trpa[8] = (kLengthExInModBorder - kModuleWallThickness*tgbe)*0.5;
554 trpa[9] = (kLengthExInModBorder + kModuleWallThickness*tgbe)*0.5;
555 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
556 gMC->Gsvolu("FWZ3","TRAP", idtmed[503], trpa, 11); // fibre glass
559 ycoor = -kLengthExInModBorder*0.5;
560 zcoor = kExterInterModBorder1;
561 gMC->Gspos("FWZ3", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[5],"ONLY");
562 gMC->Gspos("FWZ3", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[2],"ONLY");
566 ycoor = -kLengthExInModBorder*0.5;
567 zcoor = -kExterInterModBorder1 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
568 gMC->Gspos("FWZ3", 5,"FLTB", xcoor, ycoor, zcoor,idrotm[2],"ONLY");
569 gMC->Gspos("FWZ3", 6,"FLTC", xcoor, ycoor,-zcoor,idrotm[5],"ONLY");
573 ycoor = -yFLT*0.5 + kLengthExInModBorder*0.5;
574 zcoor = kExterInterModBorder2;
575 gMC->Gspos("FWZ3", 3,"FLTA", xcoor, ycoor, zcoor,idrotm[4],"ONLY");
576 gMC->Gspos("FWZ3", 4,"FLTA", xcoor, ycoor,-zcoor,idrotm[1],"ONLY");
580 ycoor = -yFLT*0.5 + kLengthExInModBorder*0.5;
581 zcoor = -kExterInterModBorder2 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
582 gMC->Gspos("FWZ3", 7,"FLTB", xcoor, ycoor, zcoor,idrotm[1],"ONLY");
583 gMC->Gspos("FWZ3", 8,"FLTC", xcoor, ycoor,-zcoor,idrotm[4],"ONLY");
586 trpa[0] = 0.5*(kExterInterModBorder2 - kExterInterModBorder1)/TMath::Cos(alpha);
587 trpa[1] = kModuleWallThickness;
589 trpa[3] = -beta*kRaddeg;
592 gMC->Gsvolu("FWZ4","PARA", idtmed[503], trpa, 6); // fibre glass
594 AliMatrix (idrotm[13],alpha*kRaddeg,90.,90.+alpha*kRaddeg,90.,90.,180.);
595 AliMatrix (idrotm[16],180.-alpha*kRaddeg,90.,90.-alpha*kRaddeg,90.,90.,0.);
599 zcoor = (kExterInterModBorder2 + kExterInterModBorder1)*0.5;
600 gMC->Gspos("FWZ4", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[16],"ONLY");
601 gMC->Gspos("FWZ4", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[13],"ONLY");
606 zcoor = -(kExterInterModBorder2 + kExterInterModBorder1)*0.5 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
607 gMC->Gspos("FWZ4", 3,"FLTB", xcoor, ycoor, zcoor,idrotm[13],"ONLY");
608 gMC->Gspos("FWZ4", 4,"FLTC", xcoor, ycoor,-zcoor,idrotm[16],"ONLY");
612 ///////////////// Detector itself //////////////////////
614 const Int_t knx = fTOFGeometry->NpadX(); // number of pads along x
615 const Int_t knz = fTOFGeometry->NpadZ(); // number of pads along z
616 const Float_t kPadX = fTOFGeometry->XPad(); // pad length along x
617 const Float_t kPadZ = fTOFGeometry->ZPad(); // pad length along z
619 // new description for strip volume -double stack strip-
620 // -- all constants are expressed in cm
621 // heigth of different layers
622 const Float_t khhony = 1.0 ; // heigth of HONY Layer
623 const Float_t khpcby = 0.08 ; // heigth of PCB Layer
624 const Float_t khrgly = 0.055 ; // heigth of RED GLASS Layer
626 const Float_t khfiliy = 0.125 ; // heigth of FISHLINE Layer
627 const Float_t khglassy = 0.160*0.5; // heigth of GLASS Layer
628 const Float_t khglfy = khfiliy+2.*khglassy;// heigth of GLASS+FISHLINE Layer
630 const Float_t khcpcby = 0.16 ; // heigth of PCB Central Layer
631 const Float_t kwhonz = 8.1 ; // z dimension of HONEY Layer
632 const Float_t kwpcbz1 = 10.6 ; // z dimension of PCB Lower Layer
633 const Float_t kwpcbz2 = 11.6 ; // z dimension of PCB Upper Layer
634 const Float_t kwcpcbz = 12.4 ; // z dimension of PCB Central Layer
635 const Float_t kwrglz = 8. ; // z dimension of RED GLASS Layer
636 const Float_t kwglfz = 7. ; // z dimension of GLASS+FISHLN Layer
637 const Float_t klsensmx = knx*kPadX; // length of Sensitive Layer
638 const Float_t khsensmy = 0.05;//0.11;//0.16;// heigth of Sensitive Layer
639 const Float_t kwsensmz = knz*kPadZ; // width of Sensitive Layer
641 // heigth of the FSTR Volume (the strip volume)
642 const Float_t khstripy = 2.*khhony+2.*khpcby+4.*khrgly+2.*khglfy+khcpcby;
644 // width of the FSTR Volume (the strip volume)
645 const Float_t kwstripz = kwcpcbz;
646 // length of the FSTR Volume (the strip volume)
647 const Float_t klstripx = fTOFGeometry->StripLength();
649 Float_t parfp[3]={klstripx*0.5,khstripy*0.5,kwstripz*0.5};
650 // Coordinates of the strip center in the strip reference frame;
651 // used for positioning internal strip volumes
652 Float_t posfp[3]={0.,0.,0.};
654 // FSTR volume definition-filling this volume with non sensitive Gas Mixture
655 gMC->Gsvolu("FSTR","BOX",idtmed[507],parfp,3); // Freon mix
657 //-- HONY Layer definition
658 parfp[1] = khhony*0.5;
659 parfp[2] = kwhonz*0.5;
660 gMC->Gsvolu("FHON","BOX",idtmed[501],parfp,3); // honeycomb (Nomex)
661 // positioning 2 HONY Layers on FSTR volume
662 posfp[1] =-khstripy*0.5+parfp[1];
663 gMC->Gspos("FHON",1,"FSTR",0., posfp[1],0.,0,"ONLY");
664 gMC->Gspos("FHON",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
666 //-- PCB Layer definition
667 parfp[1] = khpcby*0.5;
668 parfp[2] = kwpcbz1*0.5;
669 gMC->Gsvolu("FPC1","BOX",idtmed[502],parfp,3); // G10
670 parfp[2] = kwpcbz2*0.5;
671 gMC->Gsvolu("FPC2","BOX",idtmed[502],parfp,3); // G10
672 // positioning 2 PCB Layers on FSTR volume
673 posfp[1] =-khstripy*0.5+khhony+parfp[1];
674 gMC->Gspos("FPC1",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
675 gMC->Gspos("FPC2",1,"FSTR",0., posfp[1],0.,0,"ONLY");
677 //-- central PCB layer definition
678 parfp[1] = khcpcby*0.5;
679 parfp[2] = kwcpcbz*0.5;
680 gMC->Gsvolu("FPCB","BOX",idtmed[502],parfp,3); // G10
681 // positioning the central PCB layer
682 gMC->Gspos("FPCB",1,"FSTR",0.,0.,0.,0,"ONLY");
685 Float_t parfs[3] = {klsensmx*0.5, khsensmy*0.5, kwsensmz*0.5};
686 gMC->Gsvolu("FSEN","BOX",idtmed[508],parfs,3); // sensitive ...
687 // dividing FSEN along z in knz=2 and along x in knx=48
688 gMC->Gsdvn("FSEZ","FSEN",knz,3);
689 gMC->Gsdvn("FPAD","FSEZ",knx,1);
690 // positioning a Sensitive layer inside FPCB
691 gMC->Gspos("FSEN",1,"FPCB",0.,0.,0.,0,"ONLY");
693 //-- RED GLASS Layer definition
694 parfp[1] = khrgly*0.5;
695 parfp[2] = kwrglz*0.5;
696 gMC->Gsvolu("FRGL","BOX",idtmed[509],parfp,3); // glass
697 // positioning 4 RED GLASS Layers on FSTR volume
698 posfp[1] = -khstripy*0.5+khhony+khpcby+parfp[1];
699 gMC->Gspos("FRGL",1,"FSTR",0., posfp[1],0.,0,"ONLY");
700 gMC->Gspos("FRGL",4,"FSTR",0.,-posfp[1],0.,0,"ONLY");
701 posfp[1] = (khcpcby+khrgly)*0.5;
702 gMC->Gspos("FRGL",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
703 gMC->Gspos("FRGL",3,"FSTR",0., posfp[1],0.,0,"ONLY");
705 //-- GLASS Layer definition
706 parfp[1] = khglassy*0.5;
707 parfp[2] = kwglfz*0.5;
708 gMC->Gsvolu("FGLA","BOX",idtmed[509],parfp,3); // glass
710 // positioning 4 GLASS Layers on FSTR volume
711 posfp[1] = -khstripy*0.5+khhony+khpcby+khrgly+parfp[1];
712 gMC->Gspos("FGLA",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
713 gMC->Gspos("FGLA",4,"FSTR",0., posfp[1],0.,0,"ONLY");
714 posfp[1] = khcpcby*0.5+khrgly+khglassy*0.5;
715 gMC->Gspos("FGLA",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
716 gMC->Gspos("FGLA",3,"FSTR",0., posfp[1],0.,0,"ONLY");
718 //-- FREON Layer definition
719 parfp[1] = khfiliy*0.5;
720 gMC->Gsvolu("FFIS","BOX",idtmed[507],parfp,3); // freon
722 // positioning 2 FREON Layers on FSTR volume
723 posfp[1] = -khstripy*0.5+khhony+khpcby+khrgly+khglassy+parfp[1];
724 gMC->Gspos("FFIS",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
725 gMC->Gspos("FFIS",2,"FSTR",0., posfp[1],0.,0,"ONLY");
728 //-- GLASS+FISHLINE Layer definition
729 parfp[1] = khglfy*0.5;
730 parfp[2] = kwglfz*0.5;
731 gMC->Gsvolu("FGLF","BOX",idtmed[504],parfp,3);
733 // positioning 2 GLASS+FISHLINE Layers on FSTR volume
734 posfp[1] = (khcpcby+khglfy)*0.5+khrgly;
735 gMC->Gspos("FGLF",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
736 gMC->Gspos("FGLF",2,"FSTR",0., posfp[1],0.,0,"ONLY");
739 // Positioning the Strips (FSTR) in the FLT volumes
740 Int_t maxStripNumbers [5] ={fTOFGeometry->NStripC(),
741 fTOFGeometry->NStripB(),
742 fTOFGeometry->NStripA(),
743 fTOFGeometry->NStripB(),
744 fTOFGeometry->NStripC()};
746 Int_t totalStrip = 0;
747 Float_t xpos, zpos, ypos, ang;
748 for(Int_t iplate =0; iplate < fTOFGeometry->NPlates(); iplate++){
749 if (iplate>0) totalStrip += maxStripNumbers[iplate-1];
750 for(Int_t istrip =0; istrip < maxStripNumbers[iplate]; istrip++){
752 ang = fTOFGeometry->GetAngles(iplate,istrip);
753 AliDebug(1, Form(" iplate = %1i, istrip = %2i ---> ang = %f", iplate, istrip, ang));
755 if (ang>0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.+ang,90., ang, 90.);
756 else if (ang==0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.,90., 0., 0.);
757 else if (ang<0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.+ang,90.,-ang,270.);
760 zpos = fTOFGeometry->GetDistances(iplate,istrip);
761 ypos = fTOFGeometry->GetHeights(iplate,istrip);
763 gMC->Gspos("FSTR",istrip+totalStrip+1,"FLTA", xpos, ypos,-zpos,idrotm[istrip+totalStrip+1], "ONLY");
766 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");
767 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");
772 // 1.5 cm Al honeycomb layer between strips and cards
774 par[1] = kHoneycombLayerThickness*0.5;
776 gMC->Gsvolu("FPEA", "BOX ", idtmed[506], par, 3); // Al honeycomb
779 ycoor = kHoneycombLayerThickness*0.5;
781 gMC->Gspos ("FPEA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
785 par[1] = kHoneycombLayerThickness*0.5;
786 par[2] = (zlenA*0.5 - kInterCentrModBorder2-kModuleWallThickness)*0.5;
787 gMC->Gsvolu("FPEB", "BOX ", idtmed[506], par, 3); // Al honeycomb
790 ycoor = kHoneycombLayerThickness*0.5;
791 zcoor = (kInterCentrModBorder2-kInterCentrModBorder1)*0.5;
792 gMC->Gspos ("FPEB", 1, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
793 gMC->Gspos ("FPEB", 2, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
798 par[1] = (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
800 gMC->Gsvolu("FAIA", "BOX ", idtmed[500], par, 3); // Air
803 ycoor = kHoneycombLayerThickness + (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
805 gMC->Gspos ("FAIA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
809 par[1] = (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
810 par[2] = (zlenA*0.5 - kInterCentrModBorder2 - kModuleWallThickness)*0.5;
811 gMC->Gsvolu("FAIB", "BOX ", idtmed[500], par, 3); // Air
812 gMC->Gsvolu("FAIC", "BOX ", idtmed[500], par, 3); // Air
815 ycoor = kHoneycombLayerThickness + (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
816 zcoor = (kInterCentrModBorder2-kInterCentrModBorder1)*0.5;
817 gMC->Gspos ("FAIB", 0, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
818 gMC->Gspos ("FAIC", 0, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
821 // start with cards and cooling tubes
822 // finally, cards, cooling tubes and layer for thermal dispersion
825 // see GEOM200 in GEANT manual
829 // card volume definition
830 cardpar[0]= xFLT*0.5;
833 gMC->Gsvolu("FCAR", "BOX ", idtmed[502], cardpar, 3); // PCB Card
835 //alu plate volume definition
838 gMC->Gsvolu("FALP", "BOX ", idtmed[505], cardpar, 3); // Alu Plate
840 // tube volume definition
845 gMC->Gsvolu("FTUB", "TUBE", idtmed[511], tubepar, 3); // cooling tubes (steel)
850 gMC->Gsvolu("FITU", "TUBE", idtmed[510], tubepar, 3); // cooling water
851 // positioning water tube into the steel one
852 gMC->Gspos("FITU",1,"FTUB",0.,0.,0.,0,"ONLY");
855 AliMatrix(idrotm[99], 180., 90., 90., 90., 90., 0.);
857 // central module positioning
858 Float_t cardpos[3], aplpos2;
859 Float_t stepforcardA = 6.625;
861 Float_t aplpos1 = -2.;
866 // tubepos= -53.+tdis;
868 for (icard=39; icard<54; ++icard) {
869 cardpos[2]= cardpos[2]+stepforcardA;
870 aplpos2 = cardpos[2]+0.15;
871 gMC->Gspos("FCAR",icard,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
872 gMC->Gspos("FALP",icard,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
873 gMC->Gspos("FTUB",icard,"FAIA", 0.,cardpos[1],cardpos[2]+tdis,idrotm[99],"ONLY");
876 // intermediate module positioning
877 Float_t stepforcardB= 7.05;
881 for (icard=20; icard<39; ++icard) {
882 cardpos[2]= cardpos[2]+stepforcardB;
883 aplpos2 = cardpos[2]+0.15;
885 gMC->Gspos("FCAR",icard+34,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
886 gMC->Gspos("FALP",icard+34,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
887 gMC->Gspos("FTUB",icard+34,"FAIA", 0.,cardpos[1], cardpos[2]+tdis,idrotm[99],"ONLY");
888 gMC->Gspos("FCAR",58-icard,"FAIA",cardpos[0],cardpos[1], -cardpos[2], 0,"ONLY");
889 gMC->Gspos("FALP",58-icard,"FAIA",cardpos[0], aplpos1, -aplpos2, 0,"ONLY");
890 gMC->Gspos("FTUB",58-icard,"FAIA", 0.,cardpos[1],-cardpos[2]-tdis,idrotm[99],"ONLY");
893 gMC->Gspos("FCAR",icard+34+182,"FAIC",cardpos[0],cardpos[1], cardpos[2]-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
894 gMC->Gspos("FALP",icard+34+182,"FAIC",cardpos[0], aplpos1, aplpos2-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
895 gMC->Gspos("FTUB",icard+34+182,"FAIC", 0.,cardpos[1], cardpos[2]+tdis-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
896 gMC->Gspos("FCAR",58-icard+ 91,"FAIB",cardpos[0],cardpos[1], -cardpos[2]+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
897 gMC->Gspos("FALP",58-icard+ 91,"FAIB",cardpos[0], aplpos1, -aplpos2+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
898 gMC->Gspos("FTUB",58-icard+ 91,"FAIB", 0.,cardpos[1],-cardpos[2]-tdis+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
903 // outer module positioning
904 Float_t stepforcardC= 8.45238;
907 for (icard=1; icard<20; ++icard) {
908 cardpos[2]= cardpos[2]+stepforcardC;
909 aplpos2 = cardpos[2]+0.15;
911 gMC->Gspos("FCAR",icard+72,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
912 gMC->Gspos("FALP",icard+72,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
913 gMC->Gspos("FTUB",icard+72,"FAIA", 0.,cardpos[1], cardpos[2]+tdis,idrotm[99],"ONLY");
914 gMC->Gspos("FCAR",20-icard,"FAIA",cardpos[0],cardpos[1], -cardpos[2], 0,"ONLY");
915 gMC->Gspos("FALP",20-icard,"FAIA",cardpos[0], aplpos1, -aplpos2, 0,"ONLY");
916 gMC->Gspos("FTUB",20-icard,"FAIA", 0.,cardpos[1],-cardpos[2]-tdis,idrotm[99],"ONLY");
919 gMC->Gspos("FCAR",icard+72+182,"FAIC",cardpos[0],cardpos[1], cardpos[2]-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
920 gMC->Gspos("FALP",icard+72+182,"FAIC",cardpos[0], aplpos1, aplpos2-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
921 gMC->Gspos("FTUB",icard+72+182,"FAIC", 0.,cardpos[1], cardpos[2]+tdis-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
922 gMC->Gspos("FCAR",20-icard+ 91,"FAIB",cardpos[0],cardpos[1], -cardpos[2]+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
923 gMC->Gspos("FALP",20-icard+ 91,"FAIB",cardpos[0], aplpos1, -aplpos2+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
924 gMC->Gspos("FTUB",20-icard+ 91,"FAIB", 0.,cardpos[1],-cardpos[2]-tdis+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
929 //_____________________________________________________________________________
930 void AliTOFv5T0::DrawModule() const
933 // Draw a shaded view of the Time Of Flight version 4
936 // Set everything unseen
937 gMC->Gsatt("*", "seen", -1);
940 //Set volumes visible
943 //Set ALIC mother transparent
944 gMC->Gsatt("ALIC","SEEN", 0);
947 // Level 1 for TOF volumes
948 gMC->Gsatt("B077","seen", 0);
951 // Level 2 for TOF volumes
952 gMC->Gsatt("B071","seen", 0);
953 gMC->Gsatt("B074","seen", 0);
954 gMC->Gsatt("B075","seen", 0);
955 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
956 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
959 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
960 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
961 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
962 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
963 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
965 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
966 gMC->Gsatt("BTO1","seen", 0);
969 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
970 gMC->Gsatt("BTO2","seen", 0);
973 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
974 gMC->Gsatt("BTO3","seen", 0);
976 // Level 3 of B071, B074 and B075
977 gMC->Gsatt("FTOA","SEEN", 0);
978 if (fTOFHoles) gMC->Gsatt("FTOB","SEEN", 0);
980 // Level 4 of B071, B074 and B075
981 gMC->Gsatt("FLTA","SEEN", 0);
982 if (fTOFHoles) gMC->Gsatt("FLTB","SEEN",0);
983 if (fTOFHoles) gMC->Gsatt("FLTC","SEEN",0);
985 // Level 5 of B071, B074 and B075
986 gMC->Gsatt("FAIA","SEEN",-1); // all FAIA sub-levels skipped -
987 if (fTOFHoles) gMC->Gsatt("FAIB","SEEN",-1); // all FAIB sub-levels skipped -
988 if (fTOFHoles) gMC->Gsatt("FAIC","SEEN",-1); // all FAIC sub-levels skipped -
990 gMC->Gsatt("FALA","SEEN", 0);
991 if (fTOFHoles) gMC->Gsatt("FALB","SEEN", 0);
993 gMC->Gsatt("FPEA","SEEN", 1);
994 if (fTOFHoles) gMC->Gsatt("FPEB","SEEN", 1);
996 gMC->Gsatt("FSTR","SEEN",-1); // all FSTR sub-levels skipped -
998 gMC->Gsatt("FWZ1","SEEN", 0);
999 gMC->Gsatt("FWZ2","SEEN", 0);
1000 gMC->Gsatt("FWZ3","SEEN", 0);
1001 gMC->Gsatt("FWZ4","SEEN", 0);
1003 gMC->Gsatt("FZ1B","SEEN", 0);
1004 gMC->Gsatt("FZ1C","SEEN", 0);
1005 gMC->Gsatt("FZ2B","SEEN", 0);
1008 gMC->Gdopt("hide", "on");
1009 gMC->Gdopt("shad", "on");
1010 gMC->Gsatt("*", "fill", 7);
1011 gMC->SetClipBox(".");
1012 gMC->SetClipBox("*", 100, 1000, 100, 1000, 100, 1000);
1013 gMC->DefaultRange();
1014 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
1015 gMC->Gdhead(1111, "Time Of Flight");
1016 gMC->Gdman(18, 3, "MAN");
1017 gMC->Gdopt("hide","off");
1019 //_____________________________________________________________________________
1020 void AliTOFv5T0::DrawDetectorModules() const
1023 // Draw a shaded view of the TOF detector version 4
1026 // Set everything unseen
1027 gMC->Gsatt("*", "seen", -1);
1030 //Set volumes visible
1033 //Set ALIC mother transparent
1034 gMC->Gsatt("ALIC","SEEN", 0);
1037 // Level 1 for TOF volumes
1038 gMC->Gsatt("B077","seen", 0);
1041 // Level 2 for TOF volumes
1042 gMC->Gsatt("B071","seen", 0);
1043 gMC->Gsatt("B074","seen", 0);
1044 gMC->Gsatt("B075","seen", 0);
1045 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
1046 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
1049 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
1050 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
1051 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
1052 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
1053 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
1055 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
1056 gMC->Gsatt("BTO1","seen", 0);
1059 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
1060 gMC->Gsatt("BTO2","seen", 0);
1063 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
1064 gMC->Gsatt("BTO3","seen", 0);
1066 // Level 3 of B071, B075 and B074
1067 gMC->Gsatt("FTOA","seen",-2); // all FTOA sub-levels skipped -
1069 gMC->Gsatt("FTOB","seen",-2); // all FTOB sub-levels skipped -
1070 gMC->Gsatt("FTOC","seen",-2); // all FTOC sub-levels skipped -
1073 gMC->Gdopt("hide","on");
1074 gMC->Gdopt("shad","on");
1075 gMC->Gsatt("*", "fill", 5);
1076 gMC->SetClipBox(".");
1077 gMC->SetClipBox("*", 100, 1000, 100, 1000, 0, 1000);
1078 gMC->DefaultRange();
1079 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
1080 gMC->Gdhead(1111,"TOF detector");
1081 gMC->Gdman(18, 3, "MAN");
1082 gMC->Gdopt("hide","off");
1085 //_____________________________________________________________________________
1086 void AliTOFv5T0::DrawDetectorStrips() const
1089 // Draw a shaded view of the TOF strips for version 4
1092 // Set everything unseen
1093 gMC->Gsatt("*", "seen", -1);
1096 //Set volumes visible
1099 //Set ALIC mother transparent
1100 gMC->Gsatt("ALIC","SEEN", 0);
1103 // Level 1 for TOF volumes
1104 gMC->Gsatt("B077","seen", 0);
1107 // Level 2 for TOF volumes
1108 gMC->Gsatt("B071","seen", 0);
1109 gMC->Gsatt("B074","seen", 0);
1110 gMC->Gsatt("B075","seen", 0);
1111 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
1112 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
1115 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
1116 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
1117 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
1118 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
1119 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
1121 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
1122 gMC->Gsatt("BTO1","seen", 0);
1125 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
1126 gMC->Gsatt("BTO2","seen", 0);
1129 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
1130 gMC->Gsatt("BTO3","seen", 0);
1132 // Level 3 of B071, B074 and B075
1133 gMC->Gsatt("FTOA","SEEN", 0);
1135 gMC->Gsatt("FTOB","SEEN", 0);
1136 gMC->Gsatt("FTOC","SEEN", 0);
1139 // Level 4 of B071, B074 and B075
1140 gMC->Gsatt("FLTA","SEEN", 0);
1142 gMC->Gsatt("FLTB","SEEN", 0);
1143 gMC->Gsatt("FLTC","SEEN", 0);
1146 // Level 5 of B071, B074 and B075
1147 gMC->Gsatt("FAIA","SEEN",-1); // all FAIA sub-levels skipped -
1149 gMC->Gsatt("FAIB","SEEN",-1); // all FAIB sub-levels skipped -
1150 gMC->Gsatt("FAIC","SEEN",-1); // all FAIC sub-levels skipped -
1153 gMC->Gsatt("FALA","SEEN", 0);
1154 if (fTOFHoles) gMC->Gsatt("FALB","SEEN", 0);
1156 gMC->Gsatt("FPEA","SEEN", 0);
1157 if (fTOFHoles) gMC->Gsatt("FPEB","SEEN", 0);
1159 gMC->Gsatt("FSTR","SEEN",-2); // all FSTR sub-levels skipped -
1161 gMC->Gsatt("FWZ1","SEEN", 0);
1162 gMC->Gsatt("FWZ2","SEEN", 0);
1163 gMC->Gsatt("FWZ3","SEEN", 0);
1164 gMC->Gsatt("FWZ4","SEEN", 0);
1166 gMC->Gsatt("FZ1B","SEEN", 0);
1167 gMC->Gsatt("FZ1C","SEEN", 0);
1168 gMC->Gsatt("FZ2B","SEEN", 0);
1175 gMC->Gsatt("FALP","SEEN",0);
1176 gMC->Gsatt("FCAR","SEEN",0);
1177 gMC->Gsatt("FTUB","SEEN",-1); // all FTUB sub-levels skipped -
1180 gMC->Gsatt("FITU","SEEN",0);
1185 gMC->Gsatt("FGLF","SEEN",0);
1186 gMC->Gsatt("FHON","SEEN",0);
1187 gMC->Gsatt("FPC1","SEEN",0);
1188 gMC->Gsatt("FPC2","SEEN",0);
1189 gMC->Gsatt("FPCB","SEEN",0);
1190 gMC->Gsatt("FRGL","SEEN",0);
1192 // Level 2 of FPCB => Level 3 of FSTR
1193 gMC->Gsatt("FSEN","SEEN",0);
1194 gMC->Gsatt("FSEZ","SEEN",0);
1195 gMC->Gsatt("FPAD","SEEN",1);
1198 gMC->Gdopt("hide","on");
1199 gMC->Gdopt("shad","on");
1200 gMC->Gsatt("*", "fill", 5);
1201 gMC->SetClipBox(".");
1202 gMC->SetClipBox("*", 0, 1000, 0, 1000, 0, 1000);
1203 gMC->DefaultRange();
1204 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
1205 gMC->Gdhead(1111,"TOF Strips");
1206 gMC->Gdman(18, 3, "MAN");
1207 gMC->Gdopt("hide","off");
1210 //_____________________________________________________________________________
1211 void AliTOFv5T0::CreateMaterials()
1214 // Define materials for the Time Of Flight
1217 //AliTOF::CreateMaterials();
1219 AliMagF *magneticField = (AliMagF*)gAlice->Field();
1221 Int_t isxfld = magneticField->Integ();
1222 Float_t sxmgmx = magneticField->Max();
1224 Float_t we[7], ae[7], na[7], fr[7], vl[7];
1227 //--- Quartz (SiO2) to simulate float glass
1228 // density tuned to have correct float glass
1230 Float_t aq[2] = { 28.0855,15.9994 };
1231 Float_t zq[2] = { 14.,8. };
1232 Float_t wq[2] = { 1.,2. };
1233 Float_t dq = 2.55; // std value: 2.2
1237 Float_t anox[4] = {12.01,1.01,16.00,14.01};
1238 Float_t znox[4] = { 6., 1., 8., 7.};
1239 Float_t wnox[4] = {14., 22., 2., 2.};
1240 Float_t dnox = 0.048;
1244 Float_t ag10[4] = {28.09,12.01,1.01,16.00};
1245 Float_t zg10[4] = {14., 6., 1., 8.};
1248 for (i = 0; i < nlmatg10; ++i) {
1264 MaterialMixer(we,ae,na,fr,vl,5);
1270 Float_t densg10 = 1.7;
1273 Float_t awa[2] = { 1., 16. };
1274 Float_t zwa[2] = { 1., 8. };
1275 Float_t wwa[2] = { 2., 1. };
1280 Float_t asteel[4] = { 55.847,51.9961,58.6934,28.0855 };
1281 Float_t zsteel[4] = { 26.,24.,28.,14. };
1282 Float_t wsteel[4] = { .715,.18,.1,.005 };
1285 Float_t aAir[4]={12.0107,14.0067,15.9994,39.948};
1286 Float_t zAir[4]={6.,7.,8.,18.};
1287 Float_t wAir[4]={0.000124,0.755267,0.231781,0.012827};
1288 Float_t dAir = 1.20479E-3;
1291 Float_t afg[4] = {28.09,16.00,12.01,1.01};
1292 Float_t zfg[4] = {14., 8., 6., 1.};
1293 Float_t wfg[4] = {0.12906,0.29405,0.51502,0.06187};
1294 Float_t dfg = 1.111;
1297 // --- Freon C2F4H2 + SF6
1298 Float_t afre[4]= {12.01,1.01,19.00,32.07};
1299 Float_t zfre[4]= { 6., 1., 9., 16.};
1300 Float_t wfre[4]= {0.21250,0.01787,0.74827,0.021355};
1301 Float_t densfre= 0.00375;
1304 //char namat[15] = " ";
1305 //Float_t ama[2], zma[2], dma, radl, absl, buf[1];
1308 AliMixture ( 0, "Air$", aAir, zAir, dAir, 4, wAir);
1309 AliMixture ( 1, "Nomex$", anox, znox, dnox, nnox, wnox);
1310 AliMixture ( 2, "G10$", ag10, zg10, densg10, nlmatg10, wmatg10);
1311 AliMixture ( 3, "fibre glass$", afg, zfg, dfg, nfg, wfg);
1312 AliMaterial( 4, "Al $", 26.98, 13., 2.7, 8.9, 37.2);
1313 AliMaterial( 5, "Al honeycomb$", 26.98, 13., 0.0496, 483., 2483.);
1314 AliMixture ( 6, "Freon$", afre, zfre, densfre, nfre, wfre);
1315 AliMixture ( 7, "Glass$", aq, zq, dq, nq, wq);
1317 // get freon and glass
1318 gMC->Gfmate((*fIdmate)[6],namat,ama[0],zma[0],dma,radl,absl,buf,nbuf);
1319 gMC->Gfmate((*fIdmate)[7],namat,ama[1],zma[1],dma,radl,absl,buf,nbuf);
1322 Float_t wgfr[2]= {0.0011,0.9989};
1323 Float_t dgfr = 1.434;
1325 AliMixture ( 8, "glass-freon$", ama, zma, dgfr, ngfr, wgfr);
1327 AliMixture ( 9, "Water$", awa, zwa, dwa, nwa, wwa);
1328 AliMixture (10, "STAINLESS STEEL$", asteel, zsteel, 7.88, 4, wsteel);
1330 Float_t epsil, stmin, deemax, stemax;
1333 // EPSIL = 0.1 ! Tracking precision,
1334 // STEMAX = 0.1 ! Maximum displacement for multiple scattering
1335 // DEEMAX = 0.1 ! Maximum fractional energy loss, DLS
1339 epsil = .001; // Tracking precision,
1340 stemax = -1.; // Maximum displacement for multiple scattering
1341 deemax = -.3; // Maximum fractional energy loss, DLS
1344 AliMedium( 1, "Air$", 0, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1345 AliMedium( 2,"Nomex$", 1, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1346 AliMedium( 3,"G10$", 2, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1347 AliMedium( 4,"fibre glass$", 3, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1348 //AliMedium( 5,"glass-freon$", 8, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1349 AliMedium( 6,"Al Frame$", 4, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1350 AliMedium( 7,"Al honeycomb$", 5, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1351 AliMedium( 8,"Fre$", 6, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1352 AliMedium( 9,"PCB-S$", 2, 1, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1353 AliMedium(10,"Glass$", 7, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1354 AliMedium(11,"Water$", 9, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1355 AliMedium(12,"STEEL$", 10, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1358 //_____________________________________________________________________________
1359 void AliTOFv5T0::Init()
1362 // Initialise the detector after the geometry has been defined
1364 AliDebug(1, "**************************************"
1366 "**************************************");
1367 AliDebug(1, " Version 4 of TOF initialing, "
1368 "symmetric TOF - Full Coverage version");
1372 fIdFTOA = gMC->VolId("FTOA");
1374 fIdFTOB = gMC->VolId("FTOB");
1375 fIdFTOC = gMC->VolId("FTOC");
1377 fIdFLTA = gMC->VolId("FLTA");
1379 fIdFLTB = gMC->VolId("FLTB");
1380 fIdFLTC = gMC->VolId("FLTC");
1383 AliDebug(1, "**************************************"
1385 "**************************************");
1388 //_____________________________________________________________________________
1389 void AliTOFv5T0::StepManager()
1393 // Procedure called at each step in the Time Of Flight
1396 TLorentzVector mom, pos;
1397 Float_t xm[3],pm[3],xpad[3],ppad[3];
1400 Int_t sector, plate, padx, padz, strip;
1401 Int_t copy, padzid, padxid, stripid, i;
1402 Int_t *idtmed = fIdtmed->GetArray()-499;
1403 Float_t incidenceAngle;
1405 const char* volpath;
1410 gMC->IsTrackEntering()
1411 && gMC->TrackCharge()
1412 //&& gMC->GetMedium()==idtmed[508]
1413 && gMC->CurrentMedium()==idtmed[508]
1414 && gMC->CurrentVolID(copy)==fIdSens
1418 AliMC *mcApplication = (AliMC*)gAlice->GetMCApp();
1420 AddTrackReference(mcApplication->GetCurrentTrackNumber());
1421 //AddTrackReference(gAlice->GetMCApp()->GetCurrentTrackNumber());
1423 // getting information about hit volumes
1425 padzid=gMC->CurrentVolOffID(1,copy);
1429 padxid=gMC->CurrentVolOffID(0,copy);
1433 stripid=gMC->CurrentVolOffID(4,copy);
1437 gMC->TrackPosition(pos);
1438 gMC->TrackMomentum(mom);
1440 Double_t normMom=1./mom.Rho();
1442 // getting the coordinates in pad ref system
1444 xm[0] = (Float_t)pos.X();
1445 xm[1] = (Float_t)pos.Y();
1446 xm[2] = (Float_t)pos.Z();
1448 pm[0] = (Float_t)mom.X()*normMom;
1449 pm[1] = (Float_t)mom.Y()*normMom;
1450 pm[2] = (Float_t)mom.Z()*normMom;
1452 gMC->Gmtod(xm,xpad,1); // from MRS to DRS: coordinates convertion
1453 gMC->Gmtod(pm,ppad,2); // from MRS to DRS: direction cosinus convertion
1456 if (TMath::Abs(ppad[1])>1) {
1457 AliWarning("Abs(ppad) > 1");
1458 ppad[1]=TMath::Sign((Float_t)1,ppad[1]);
1460 incidenceAngle = TMath::ACos(ppad[1])*kRaddeg;
1463 if (strip < fTOFGeometry->NStripC()) {
1467 else if (strip >= fTOFGeometry->NStripC() &&
1468 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB()) {
1470 strip = strip - fTOFGeometry->NStripC();
1472 else if (strip >= fTOFGeometry->NStripC() + fTOFGeometry->NStripB() &&
1473 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA()) {
1475 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB();
1477 else if (strip >= fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA() &&
1478 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA() + fTOFGeometry->NStripB()) {
1480 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB() - fTOFGeometry->NStripA();
1484 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB() - fTOFGeometry->NStripA() - fTOFGeometry->NStripB();
1487 volpath=gMC->CurrentVolOffName(7);
1488 index=atoi(&volpath[4]);
1505 hits[6] = mom.Rho();
1510 hits[11]= incidenceAngle;
1511 hits[12]= gMC->Edep();
1512 hits[13]= gMC->TrackLength();
1520 AddT0Hit(mcApplication->GetCurrentTrackNumber(),vol, hits);
1521 //AddT0Hit(gAlice->GetMCApp()->GetCurrentTrackNumber(),vol, hits);
1524 //-------------------------------------------------------------------
1525 void AliTOFv5T0::MaterialMixer(Float_t* p,Float_t* a,Float_t* m,Float_t* d,Float_t* s,Int_t n) const
1527 // a[] atomic weights vector (in)
1528 // (atoms present in more compound appear separately)
1529 // m[] number of corresponding atoms in the mixture (in)
1530 // d[] fraction of the compound relative to the corresponding atoms (in)
1531 // s[] further possible weights " " " " (in)
1533 for (Int_t i = 0; i < n; ++i) {
1534 p[i] = a[i]*m[i]*d[i]*s[i];
1537 for (Int_t i = 0; i < n; ++i) {
1539 // AliInfo(Form((\n weight[%i] = %f (,i,p[i]));