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.6 2006/03/20 08:20:35 decaro
19 Al layer: positioning correction
21 Revision 1.5 2006/03/20 07:54:20 decaro
22 Correction of some layer thickness
24 Revision 1.4 2006/03/13 12:35:44 decaro
25 Suppression of fractional Z warning
27 Revision 1.3 2006/02/28 10:38:00 decaro
28 AliTOFGeometry::fAngles, AliTOFGeometry::fHeights,
29 AliTOFGeometry::fDistances arrays: dimension definition in the right
32 Revision 1.2 2006/02/27 18:12:14 decaro
33 Remove in StepManager the dependence of hit indexes from parametrized
36 Revision 1.1 2005/12/15 08:55:33 decaro
37 New TOF geometry description (V5) -G. Cara Romeo and A. De Caro
40 Revision 0.1 2004 November G. Cara Romeo and A. De Caro
41 Implement new TOF geometry version
43 suppress few volume overlaps
44 (in the 4th TOF geometry version),
45 insert the realistic strip numbers and positions
49 ///////////////////////////////////////////////////////////////////////////////
51 // This class contains the functions for version 5 of the Time Of Flight //
54 // VERSION WITH 5 MODULES AND TILTED STRIPS //
56 // FULL COVERAGE VERSION + OPTION for PHOS holes //
61 <img src="picts/AliTOFv5T0Class.gif"> //
65 ///////////////////////////////////////////////////////////////////////////////
67 #include "Riostream.h"
70 #include "TVirtualMC.h"
72 #include <TGeometry.h>
73 #include <TLorentzVector.h>
76 #include <TVirtualMC.h>
84 #include "AliTOFGeometry.h"
85 #include "AliTOFGeometryV5.h"
86 #include "AliTOFv5T0.h"
90 //_____________________________________________________________________________
91 AliTOFv5T0::AliTOFv5T0()
94 // Default constructor
98 //_____________________________________________________________________________
99 AliTOFv5T0::AliTOFv5T0(const char *name, const char *title)
100 : AliTOF(name,title,"tzero")
103 // Standard constructor
106 // Check that FRAME is there otherwise we have no place where to
110 AliModule* frame=gAlice->GetModule("FRAME");
112 AliFatal("TOF needs FRAME to be present");
115 if (fTOFGeometry) delete fTOFGeometry;
116 fTOFGeometry = new AliTOFGeometryV5();
118 if(frame->IsVersion()==1) {
119 AliInfo(Form("Frame version %d", frame->IsVersion()));
120 AliInfo("Full Coverage for TOF");
123 AliInfo(Form("Frame version %d", frame->IsVersion()));
124 AliInfo("TOF with Holes for PHOS");
127 fTOFGeometry->SetHoles(fTOFHoles);
129 //AliTOF::fTOFGeometry = fTOFGeometry;
132 TDirectory* saveDir = gDirectory;
133 gAlice->GetRunLoader()->CdGAFile();
134 fTOFGeometry->Write("TOFgeometry");
139 //____________________________________________________________________________
140 void AliTOFv5T0::BuildGeometry()
143 // Build TOF ROOT geometry for the ALICE event display
146 const int kColorTOF = 27;
149 top = gAlice->GetGeometry()->GetNode("alice");
151 // Position the different copies
152 const Float_t krTof =(fTOFGeometry->Rmax()+fTOFGeometry->Rmin())/2.;
153 const Float_t khTof = fTOFGeometry->Rmax()-fTOFGeometry->Rmin();
154 const Int_t kNTof = fTOFGeometry->NSectors();
155 const Float_t kangle = k2PI/kNTof;
157 const Float_t kInterCentrModBorder1 = 49.5;
158 const Float_t kInterCentrModBorder2 = 57.5;
162 // define offset for nodes
163 Float_t zOffsetB = (fTOFGeometry->ZlenA()*0.5 + (kInterCentrModBorder1+kInterCentrModBorder2)*0.5)*0.5;
164 Float_t zOffsetA = 0.;
165 // Define TOF basic volume
167 char nodeName0[7], nodeName1[7], nodeName2[7];
168 char nodeName3[7], nodeName4[7], rotMatNum[7];
171 new TBRIK("S_TOF_B","TOF box","void",
172 fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenB()*0.5);
173 new TBRIK("S_TOF_C","TOF box","void",
174 fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenB()*0.5);
176 new TBRIK("S_TOF_A","TOF box","void",
177 fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenA()*0.5);
179 for (Int_t nodeNum=1;nodeNum<19;nodeNum++){
182 sprintf(rotMatNum,"rot50%i",nodeNum);
183 sprintf(nodeName0,"FTO00%i",nodeNum);
184 sprintf(nodeName1,"FTO10%i",nodeNum);
185 sprintf(nodeName2,"FTO20%i",nodeNum);
186 sprintf(nodeName3,"FTO30%i",nodeNum);
187 sprintf(nodeName4,"FTO40%i",nodeNum);
190 sprintf(rotMatNum,"rot5%i",nodeNum);
191 sprintf(nodeName0,"FTO0%i",nodeNum);
192 sprintf(nodeName1,"FTO1%i",nodeNum);
193 sprintf(nodeName2,"FTO2%i",nodeNum);
194 sprintf(nodeName3,"FTO3%i",nodeNum);
195 sprintf(nodeName4,"FTO4%i",nodeNum);
198 new TRotMatrix(rotMatNum,rotMatNum,90,-20*nodeNum,90,90-20*nodeNum,0,0);
199 ang = (4.5-nodeNum) * kangle;
203 node = new TNode(nodeName2,nodeName2,"S_TOF_B", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang), zOffsetB,rotMatNum);
204 node->SetLineColor(kColorTOF);
208 node = new TNode(nodeName3,nodeName3,"S_TOF_C", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang),-zOffsetB,rotMatNum);
209 node->SetLineColor(kColorTOF);
214 node = new TNode(nodeName4,nodeName4,"S_TOF_A", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang), zOffsetA,rotMatNum);
215 node->SetLineColor(kColorTOF);
217 } // end loop on nodeNum
221 //_____________________________________________________________________________
222 void AliTOFv5T0::CreateGeometry()
225 // Create geometry for Time Of Flight version 0
229 <img src="picts/AliTOFv5T0.gif">
233 // Creates common geometry
235 AliTOF::CreateGeometry();
239 //_____________________________________________________________________________
240 void AliTOFv5T0::TOFpc(Float_t xtof, Float_t ytof, Float_t zlenA,
244 // Definition of the Time Of Fligh Resistive Plate Chambers
247 const Float_t kPi = TMath::Pi();
249 const Float_t kInterCentrModBorder1 = 49.5;
250 const Float_t kInterCentrModBorder2 = 57.5;
251 const Float_t kExterInterModBorder1 = 196.0;
252 const Float_t kExterInterModBorder2 = 203.5;
254 const Float_t kLengthExInModBorder = 4.7;
255 const Float_t kLengthInCeModBorder = 7.0;
257 // Al layers over all internal module walls (cm)
258 const Float_t khAlWall = 0.03;
260 // module wall thickness (cm)
261 const Float_t kModuleWallThickness = 0.3;
263 // Al honeycomb layer between strips and cards (cm)
264 const Float_t kHoneycombLayerThickness = 1.5;
266 AliDebug(2,Form("zlenA*0.5 = %d", zlenA*0.5));
267 AliDebug(1, "************************* TOF geometry **************************");
269 // Definition of the Time Of Fligh Resistive Plate Chambers
270 // xFLT, yFLT, zFLT - sizes of TOF modules (large)
272 Float_t xcoor, ycoor, zcoor;
274 Int_t *idtmed = fIdtmed->GetArray()-499;
279 par[2] = zlenA * 0.5;
280 gMC->Gsvolu("FTOA", "BOX ", idtmed[503], par, 3); // fibre glass
285 par[2] = (zlenA*0.5 - kInterCentrModBorder1)*0.5;
286 gMC->Gsvolu("FTOB", "BOX ", idtmed[503], par, 3); // fibre glass
287 gMC->Gsvolu("FTOC", "BOX ", idtmed[503], par, 3); // fibre glass
290 // Positioning of fibre glass modules (FTOA, FTOB and FTOC)
292 //AliMatrix(idrotm[0], 90., 0., 0., 0., 90.,-90.);
293 AliMatrix(idrotm[0], 90., 0., 0., 0., 90.,270.);
298 gMC->Gspos("FTOA", 0, "BTO1", xcoor, ycoor, zcoor, idrotm[0], "ONLY");
299 gMC->Gspos("FTOA", 0, "BTO3", xcoor, ycoor, zcoor, idrotm[0], "ONLY");
303 ycoor = (zlenA*0.5 + kInterCentrModBorder1)*0.5;
305 gMC->Gspos("FTOB", 0, "BTO2", xcoor, ycoor, zcoor, idrotm[0], "ONLY");
306 gMC->Gspos("FTOC", 0, "BTO2", xcoor,-ycoor, zcoor, idrotm[0], "ONLY");
308 else gMC->Gspos("FTOA", 0, "BTO2", xcoor, ycoor, zcoor, idrotm[0], "ONLY");
310 // Large not sensitive volumes with Insensitive Freon (FLTA, FLTB and FLTC)
312 Float_t xFLT, yFLT, zFLTA;
314 xFLT = xtof - kModuleWallThickness*2.;
315 yFLT = ytof - kModuleWallThickness*2.;
316 zFLTA = zlenA - kModuleWallThickness*2.;
321 gMC->Gsvolu("FLTA", "BOX ", idtmed[507], par, 3); // Freon mix
326 gMC->Gspos ("FLTA", 0, "FTOA", xcoor, ycoor, zcoor, 0, "ONLY");
331 par[2] = (zlenA*0.5 - kInterCentrModBorder1-kModuleWallThickness)*0.5;
332 gMC->Gsvolu("FLTB", "BOX ", idtmed[507], par, 3); // Freon mix
333 gMC->Gsvolu("FLTC", "BOX ", idtmed[507], par, 3); // Freon mix
337 zcoor = kModuleWallThickness*0.5;
338 gMC->Gspos ("FLTB", 0, "FTOB", xcoor, ycoor, zcoor, 0, "ONLY");
339 gMC->Gspos ("FLTC", 0, "FTOC", xcoor, ycoor,-zcoor, 0, "ONLY");
342 // Layer of Aluminum before detector (FALA, FALB and FALC)
345 par[1] = khAlWall*0.5;
346 par[2] = kInterCentrModBorder1 - (kModuleWallThickness + khAlWall);
347 gMC->Gsvolu("FALA", "BOX ", idtmed[505], par, 3); // Alluminium
350 ycoor = (-yFLT + khAlWall)*0.5;
352 gMC->Gspos ("FALA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
355 par[1] = khAlWall*0.5;
356 par[2] = (kExterInterModBorder2 - kInterCentrModBorder1 - 2.*(kModuleWallThickness + khAlWall))*0.5;
357 gMC->Gsvolu("FALB", "BOX ", idtmed[505], par, 3); // Alluminium
360 ycoor = (-yFLT + khAlWall)*0.5;
361 zcoor = (kExterInterModBorder2 + kInterCentrModBorder1)*0.5;
362 gMC->Gspos ("FALB", 1, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
363 gMC->Gspos ("FALB", 2, "FLTA", xcoor, ycoor,-zcoor, 0, "ONLY");
366 par[1] = khAlWall*0.5;
367 par[2] = (zlenA*0.5 - kExterInterModBorder2 - 2.*(kModuleWallThickness + khAlWall))*0.5;
368 gMC->Gsvolu("FALC", "BOX ", idtmed[505], par, 3); // Alluminium
371 ycoor = (-yFLT + khAlWall)*0.5;
372 zcoor = (kExterInterModBorder2+zlenA*0.5)*0.5;
373 gMC->Gspos ("FALC", 1, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
374 gMC->Gspos ("FALC", 2, "FLTA", xcoor, ycoor,-zcoor, 0, "ONLY");
378 ycoor = (-yFLT + khAlWall)*0.5;
379 zcoor = (zlenA*0.5 - kExterInterModBorder2)*0.5 - kModuleWallThickness*0.5;
380 gMC->Gspos ("FALB", 1, "FLTB", xcoor, ycoor, zcoor, 0, "ONLY");
381 gMC->Gspos ("FALB", 2, "FLTC", xcoor, ycoor,-zcoor, 0, "ONLY");
384 ycoor = (-yFLT + khAlWall)*0.5;
385 zcoor = (kExterInterModBorder2 - kInterCentrModBorder1)*0.5 + kModuleWallThickness*0.5;
386 gMC->Gspos ("FALC", 1, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
387 gMC->Gspos ("FALC", 2, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
390 Float_t y0, alpha, tgal, beta, tgbe, trpa[11];
392 // Fibre glass walls between central and intermediate modules (FWZ1 and FWZ2; holes -> FZ1B, FZ1C, FZ2B)
394 tgal = (yFLT*0.5 - 2.*kLengthInCeModBorder)/(kInterCentrModBorder2 - kInterCentrModBorder1);
395 alpha = TMath::ATan(tgal);
396 beta = (kPi*0.5 - alpha)*0.5;
397 tgbe = TMath::Tan(beta);
401 trpa[3] = kModuleWallThickness;
402 trpa[4] = (kLengthInCeModBorder - kModuleWallThickness*tgbe)*0.5;
403 trpa[5] = (kLengthInCeModBorder + kModuleWallThickness*tgbe)*0.5;
404 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
405 trpa[7] = kModuleWallThickness;
406 trpa[8] = (kLengthInCeModBorder - kModuleWallThickness*tgbe)*0.5;
407 trpa[9] = (kLengthInCeModBorder + kModuleWallThickness*tgbe)*0.5;
408 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
409 gMC->Gsvolu("FWZ1","TRAP", idtmed[503], trpa, 11); // fibre glass
411 AliMatrix (idrotm[1],90., 90.,180.,0.,90.,180.);
412 AliMatrix (idrotm[4],90., 90., 0.,0.,90., 0.);
415 ycoor = -yFLT*0.5 + kLengthInCeModBorder*0.5;
416 zcoor = kInterCentrModBorder1;
417 gMC->Gspos("FWZ1", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[1],"ONLY");
418 gMC->Gspos("FWZ1", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[4],"ONLY");
421 y0 = kLengthInCeModBorder - kModuleWallThickness*0.5*tgbe;
425 trpa[3] = kModuleWallThickness*0.5;
426 trpa[4] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
427 trpa[5] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
428 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
429 trpa[7] = kModuleWallThickness*0.5;
430 trpa[8] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
431 trpa[9] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
432 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
433 gMC->Gsvolu("FZ1B","TRAP", idtmed[503], trpa, 11); // fibre glass
436 ycoor = -yFLT*0.5 + kLengthInCeModBorder*0.5 - kModuleWallThickness*0.25*tgbe;
437 zcoor = -kInterCentrModBorder1 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
438 gMC->Gspos("FZ1B", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[4],"ONLY");
439 gMC->Gspos("FZ1B", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[1],"ONLY");
442 AliMatrix (idrotm[2],90.,270., 0.,0.,90.,180.);
443 AliMatrix (idrotm[5],90.,270.,180.,0.,90., 0.);
446 ycoor = -kLengthInCeModBorder*0.5;
447 zcoor = kInterCentrModBorder2;
448 gMC->Gspos("FWZ1", 3,"FLTA", xcoor, ycoor, zcoor,idrotm[2],"ONLY");
449 gMC->Gspos("FWZ1", 4,"FLTA", xcoor, ycoor,-zcoor,idrotm[5],"ONLY");
452 y0 = kLengthInCeModBorder + kModuleWallThickness*0.5*tgbe;
456 trpa[3] = kModuleWallThickness*0.5;
457 trpa[4] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
458 trpa[5] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
459 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
460 trpa[7] = kModuleWallThickness*0.5;
461 trpa[8] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
462 trpa[9] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
463 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
464 gMC->Gsvolu("FZ1C","TRAP", idtmed[503], trpa, 11); // fibre glass
467 ycoor = -kLengthInCeModBorder*0.5 - kModuleWallThickness*0.25*tgbe;
468 zcoor = -kInterCentrModBorder2 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
469 gMC->Gspos("FZ1C", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[5],"ONLY");
470 gMC->Gspos("FZ1C", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[2],"ONLY");
473 trpa[0] = 0.5*(kInterCentrModBorder2 - kInterCentrModBorder1)/TMath::Cos(alpha);
474 trpa[1] = kModuleWallThickness;
476 trpa[3] = -beta*kRaddeg;
479 gMC->Gsvolu("FWZ2","PARA", idtmed[503], trpa, 6); // fibre glass
481 AliMatrix (idrotm[3], alpha*kRaddeg,90.,90.+alpha*kRaddeg,90.,90.,180.);
482 AliMatrix (idrotm[6],180.-alpha*kRaddeg,90.,90.-alpha*kRaddeg,90.,90., 0.);
486 zcoor = (kInterCentrModBorder2 + kInterCentrModBorder1)*0.5;
487 gMC->Gspos("FWZ2", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[3],"ONLY");
488 gMC->Gspos("FWZ2", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[6],"ONLY");
491 trpa[0] = 0.5*(kInterCentrModBorder2 - kInterCentrModBorder1)/TMath::Cos(alpha);
492 trpa[1] = kModuleWallThickness*0.5;
494 trpa[3] = -beta*kRaddeg;
497 gMC->Gsvolu("FZ2B","PARA", idtmed[503], trpa, 6); // fibre glass
500 ycoor = -yFLT*0.25 - kModuleWallThickness*0.5*tgbe;
501 zcoor = -(kInterCentrModBorder2 + kInterCentrModBorder1)*0.5 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
502 gMC->Gspos("FZ2B", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[6],"ONLY");
503 gMC->Gspos("FZ2B", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[3],"ONLY");
506 // Fibre glass walls between intermediate and lateral modules (FWZ3 and FWZ4)
508 tgal = (yFLT*0.5 - 2.*kLengthExInModBorder)/(kExterInterModBorder2 - kExterInterModBorder1);
509 alpha = TMath::ATan(tgal);
510 beta = (kPi*0.5 - alpha)*0.5;
511 tgbe = TMath::Tan(beta);
515 trpa[3] = kModuleWallThickness;
516 trpa[4] = (kLengthExInModBorder - kModuleWallThickness*tgbe)*0.5;
517 trpa[5] = (kLengthExInModBorder + kModuleWallThickness*tgbe)*0.5;
518 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
519 trpa[7] = kModuleWallThickness;
520 trpa[8] = (kLengthExInModBorder - kModuleWallThickness*tgbe)*0.5;
521 trpa[9] = (kLengthExInModBorder + kModuleWallThickness*tgbe)*0.5;
522 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
523 gMC->Gsvolu("FWZ3","TRAP", idtmed[503], trpa, 11); // fibre glass
526 ycoor = -kLengthExInModBorder*0.5;
527 zcoor = kExterInterModBorder1;
528 gMC->Gspos("FWZ3", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[5],"ONLY");
529 gMC->Gspos("FWZ3", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[2],"ONLY");
533 ycoor = -kLengthExInModBorder*0.5;
534 zcoor = -kExterInterModBorder1 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
535 gMC->Gspos("FWZ3", 5,"FLTB", xcoor, ycoor, zcoor,idrotm[2],"ONLY");
536 gMC->Gspos("FWZ3", 6,"FLTC", xcoor, ycoor,-zcoor,idrotm[5],"ONLY");
540 ycoor = -yFLT*0.5 + kLengthExInModBorder*0.5;
541 zcoor = kExterInterModBorder2;
542 gMC->Gspos("FWZ3", 3,"FLTA", xcoor, ycoor, zcoor,idrotm[4],"ONLY");
543 gMC->Gspos("FWZ3", 4,"FLTA", xcoor, ycoor,-zcoor,idrotm[1],"ONLY");
547 ycoor = -yFLT*0.5 + kLengthExInModBorder*0.5;
548 zcoor = -kExterInterModBorder2 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
549 gMC->Gspos("FWZ3", 7,"FLTB", xcoor, ycoor, zcoor,idrotm[1],"ONLY");
550 gMC->Gspos("FWZ3", 8,"FLTC", xcoor, ycoor,-zcoor,idrotm[4],"ONLY");
553 trpa[0] = 0.5*(kExterInterModBorder2 - kExterInterModBorder1)/TMath::Cos(alpha);
554 trpa[1] = kModuleWallThickness;
556 trpa[3] = -beta*kRaddeg;
559 gMC->Gsvolu("FWZ4","PARA", idtmed[503], trpa, 6); // fibre glass
561 AliMatrix (idrotm[13],alpha*kRaddeg,90.,90.+alpha*kRaddeg,90.,90.,180.);
562 AliMatrix (idrotm[16],180.-alpha*kRaddeg,90.,90.-alpha*kRaddeg,90.,90.,0.);
566 zcoor = (kExterInterModBorder2 + kExterInterModBorder1)*0.5;
567 gMC->Gspos("FWZ4", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[16],"ONLY");
568 gMC->Gspos("FWZ4", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[13],"ONLY");
573 zcoor = -(kExterInterModBorder2 + kExterInterModBorder1)*0.5 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
574 gMC->Gspos("FWZ4", 3,"FLTB", xcoor, ycoor, zcoor,idrotm[13],"ONLY");
575 gMC->Gspos("FWZ4", 4,"FLTC", xcoor, ycoor,-zcoor,idrotm[16],"ONLY");
579 ///////////////// Detector itself //////////////////////
581 const Int_t knx = fTOFGeometry->NpadX(); // number of pads along x
582 const Int_t knz = fTOFGeometry->NpadZ(); // number of pads along z
583 const Float_t kPadX = fTOFGeometry->XPad(); // pad length along x
584 const Float_t kPadZ = fTOFGeometry->ZPad(); // pad length along z
586 // new description for strip volume -double stack strip-
587 // -- all constants are expressed in cm
588 // heigth of different layers
589 const Float_t khhony = 1.0 ; // heigth of HONY Layer
590 const Float_t khpcby = 0.08 ; // heigth of PCB Layer
591 const Float_t khrgly = 0.055 ; // heigth of RED GLASS Layer
593 const Float_t khfiliy = 0.125 ; // heigth of FISHLINE Layer
594 const Float_t khglassy = 0.160*0.5; // heigth of GLASS Layer
595 const Float_t khglfy = khfiliy+2.*khglassy;// heigth of GLASS+FISHLINE Layer
597 const Float_t khcpcby = 0.16 ; // heigth of PCB Central Layer
598 const Float_t kwhonz = 8.1 ; // z dimension of HONEY Layer
599 const Float_t kwpcbz1 = 10.6 ; // z dimension of PCB Lower Layer
600 const Float_t kwpcbz2 = 11.6 ; // z dimension of PCB Upper Layer
601 const Float_t kwcpcbz = 12.4 ; // z dimension of PCB Central Layer
602 const Float_t kwrglz = 8. ; // z dimension of RED GLASS Layer
603 const Float_t kwglfz = 7. ; // z dimension of GLASS+FISHLN Layer
604 const Float_t klsensmx = knx*kPadX; // length of Sensitive Layer
605 const Float_t khsensmy = 0.05;//0.11;//0.16;// heigth of Sensitive Layer
606 const Float_t kwsensmz = knz*kPadZ; // width of Sensitive Layer
608 // heigth of the FSTR Volume (the strip volume)
609 const Float_t khstripy = 2.*khhony+2.*khpcby+4.*khrgly+2.*khglfy+khcpcby;
611 // width of the FSTR Volume (the strip volume)
612 const Float_t kwstripz = kwcpcbz;
613 // length of the FSTR Volume (the strip volume)
614 const Float_t klstripx = fTOFGeometry->StripLength();
616 Float_t parfp[3]={klstripx*0.5,khstripy*0.5,kwstripz*0.5};
617 // Coordinates of the strip center in the strip reference frame;
618 // used for positioning internal strip volumes
619 Float_t posfp[3]={0.,0.,0.};
621 // FSTR volume definition-filling this volume with non sensitive Gas Mixture
622 gMC->Gsvolu("FSTR","BOX",idtmed[507],parfp,3); // Freon mix
624 //-- HONY Layer definition
625 parfp[1] = khhony*0.5;
626 parfp[2] = kwhonz*0.5;
627 gMC->Gsvolu("FHON","BOX",idtmed[501],parfp,3); // honeycomb (Nomex)
628 // positioning 2 HONY Layers on FSTR volume
629 posfp[1] =-khstripy*0.5+parfp[1];
630 gMC->Gspos("FHON",1,"FSTR",0., posfp[1],0.,0,"ONLY");
631 gMC->Gspos("FHON",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
633 //-- PCB Layer definition
634 parfp[1] = khpcby*0.5;
635 parfp[2] = kwpcbz1*0.5;
636 gMC->Gsvolu("FPC1","BOX",idtmed[502],parfp,3); // G10
637 parfp[2] = kwpcbz2*0.5;
638 gMC->Gsvolu("FPC2","BOX",idtmed[502],parfp,3); // G10
639 // positioning 2 PCB Layers on FSTR volume
640 posfp[1] =-khstripy*0.5+khhony+parfp[1];
641 gMC->Gspos("FPC1",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
642 gMC->Gspos("FPC2",1,"FSTR",0., posfp[1],0.,0,"ONLY");
644 //-- central PCB layer definition
645 parfp[1] = khcpcby*0.5;
646 parfp[2] = kwcpcbz*0.5;
647 gMC->Gsvolu("FPCB","BOX",idtmed[502],parfp,3); // G10
648 // positioning the central PCB layer
649 gMC->Gspos("FPCB",1,"FSTR",0.,0.,0.,0,"ONLY");
652 Float_t parfs[3] = {klsensmx*0.5, khsensmy*0.5, kwsensmz*0.5};
653 gMC->Gsvolu("FSEN","BOX",idtmed[508],parfs,3); // sensitive ...
654 // dividing FSEN along z in knz=2 and along x in knx=48
655 gMC->Gsdvn("FSEZ","FSEN",knz,3);
656 gMC->Gsdvn("FPAD","FSEZ",knx,1);
657 // positioning a Sensitive layer inside FPCB
658 gMC->Gspos("FSEN",1,"FPCB",0.,0.,0.,0,"ONLY");
660 //-- RED GLASS Layer definition
661 parfp[1] = khrgly*0.5;
662 parfp[2] = kwrglz*0.5;
663 gMC->Gsvolu("FRGL","BOX",idtmed[509],parfp,3); // glass
664 // positioning 4 RED GLASS Layers on FSTR volume
665 posfp[1] = -khstripy*0.5+khhony+khpcby+parfp[1];
666 gMC->Gspos("FRGL",1,"FSTR",0., posfp[1],0.,0,"ONLY");
667 gMC->Gspos("FRGL",4,"FSTR",0.,-posfp[1],0.,0,"ONLY");
668 posfp[1] = (khcpcby+khrgly)*0.5;
669 gMC->Gspos("FRGL",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
670 gMC->Gspos("FRGL",3,"FSTR",0., posfp[1],0.,0,"ONLY");
672 //-- GLASS Layer definition
673 parfp[1] = khglassy*0.5;
674 parfp[2] = kwglfz*0.5;
675 gMC->Gsvolu("FGLA","BOX",idtmed[509],parfp,3); // glass
677 // positioning 4 GLASS Layers on FSTR volume
678 posfp[1] = -khstripy*0.5+khhony+khpcby+khrgly+parfp[1];
679 gMC->Gspos("FGLA",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
680 gMC->Gspos("FGLA",4,"FSTR",0., posfp[1],0.,0,"ONLY");
681 posfp[1] = khcpcby*0.5+khrgly+khglassy*0.5;
682 gMC->Gspos("FGLA",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
683 gMC->Gspos("FGLA",3,"FSTR",0., posfp[1],0.,0,"ONLY");
685 //-- FREON Layer definition
686 parfp[1] = khfiliy*0.5;
687 gMC->Gsvolu("FFIS","BOX",idtmed[507],parfp,3); // freon
689 // positioning 2 FREON Layers on FSTR volume
690 posfp[1] = -khstripy*0.5+khhony+khpcby+khrgly+khglassy+parfp[1];
691 gMC->Gspos("FFIS",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
692 gMC->Gspos("FFIS",2,"FSTR",0., posfp[1],0.,0,"ONLY");
695 //-- GLASS+FISHLINE Layer definition
696 parfp[1] = khglfy*0.5;
697 parfp[2] = kwglfz*0.5;
698 gMC->Gsvolu("FGLF","BOX",idtmed[504],parfp,3);
700 // positioning 2 GLASS+FISHLINE Layers on FSTR volume
701 posfp[1] = (khcpcby+khglfy)*0.5+khrgly;
702 gMC->Gspos("FGLF",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
703 gMC->Gspos("FGLF",2,"FSTR",0., posfp[1],0.,0,"ONLY");
706 // Positioning the Strips (FSTR) in the FLT volumes
707 Int_t maxStripNumbers [5] ={fTOFGeometry->NStripC(),
708 fTOFGeometry->NStripB(),
709 fTOFGeometry->NStripA(),
710 fTOFGeometry->NStripB(),
711 fTOFGeometry->NStripC()};
713 Int_t totalStrip = 0;
714 Float_t xpos, zpos, ypos, ang;
715 for(Int_t iplate =0; iplate < fTOFGeometry->NPlates(); iplate++){
716 if (iplate>0) totalStrip += maxStripNumbers[iplate-1];
717 for(Int_t istrip =0; istrip < maxStripNumbers[iplate]; istrip++){
719 ang = fTOFGeometry->GetAngles(iplate,istrip);
720 AliDebug(1, Form(" iplate = %1i, istrip = %2i ---> ang = %f", iplate, istrip, ang));
722 if (ang>0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.+ang,90., ang, 90.);
723 else if (ang==0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.,90., 0., 0.);
724 else if (ang<0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.+ang,90.,-ang,270.);
727 zpos = fTOFGeometry->GetDistances(iplate,istrip);
728 ypos = fTOFGeometry->GetHeights(iplate,istrip);
730 gMC->Gspos("FSTR",istrip+totalStrip+1,"FLTA", xpos, ypos,-zpos,idrotm[istrip+totalStrip+1], "ONLY");
733 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");
734 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");
739 // 1.5 cm Al honeycomb layer between strips and cards
741 par[1] = kHoneycombLayerThickness*0.5;
743 gMC->Gsvolu("FPEA", "BOX ", idtmed[506], par, 3); // Al honeycomb
746 ycoor = kHoneycombLayerThickness*0.5;
748 gMC->Gspos ("FPEA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
752 par[1] = kHoneycombLayerThickness*0.5;
753 par[2] = (zlenA*0.5 - kInterCentrModBorder2-kModuleWallThickness)*0.5;
754 gMC->Gsvolu("FPEB", "BOX ", idtmed[506], par, 3); // Al honeycomb
757 ycoor = kHoneycombLayerThickness*0.5;
758 zcoor = (kInterCentrModBorder2-kInterCentrModBorder1)*0.5;
759 gMC->Gspos ("FPEB", 1, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
760 gMC->Gspos ("FPEB", 2, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
765 par[1] = (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
767 gMC->Gsvolu("FAIA", "BOX ", idtmed[500], par, 3); // Air
770 ycoor = kHoneycombLayerThickness + (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
772 gMC->Gspos ("FAIA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
776 par[1] = (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
777 par[2] = (zlenA*0.5 - kInterCentrModBorder2 - kModuleWallThickness)*0.5;
778 gMC->Gsvolu("FAIB", "BOX ", idtmed[500], par, 3); // Air
779 gMC->Gsvolu("FAIC", "BOX ", idtmed[500], par, 3); // Air
782 ycoor = kHoneycombLayerThickness + (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
783 zcoor = (kInterCentrModBorder2-kInterCentrModBorder1)*0.5;
784 gMC->Gspos ("FAIB", 0, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
785 gMC->Gspos ("FAIC", 0, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
788 // start with cards and cooling tubes
789 // finally, cards, cooling tubes and layer for thermal dispersion
792 // see GEOM200 in GEANT manual
796 // card volume definition
797 cardpar[0]= xFLT*0.5;
800 gMC->Gsvolu("FCAR", "BOX ", idtmed[502], cardpar, 3); // PCB Card
802 //alu plate volume definition
805 gMC->Gsvolu("FALP", "BOX ", idtmed[505], cardpar, 3); // Alu Plate
807 // tube volume definition
812 gMC->Gsvolu("FTUB", "TUBE", idtmed[511], tubepar, 3); // cooling tubes (steel)
817 gMC->Gsvolu("FITU", "TUBE", idtmed[510], tubepar, 3); // cooling water
818 // positioning water tube into the steel one
819 gMC->Gspos("FITU",1,"FTUB",0.,0.,0.,0,"ONLY");
822 AliMatrix(idrotm[99], 180., 90., 90., 90., 90., 0.);
824 // central module positioning
825 Float_t cardpos[3], aplpos2;
826 Float_t stepforcardA = 6.625;
828 Float_t aplpos1 = -2.;
833 // tubepos= -53.+tdis;
835 for (icard=39; icard<54; ++icard) {
836 cardpos[2]= cardpos[2]+stepforcardA;
837 aplpos2 = cardpos[2]+0.15;
838 gMC->Gspos("FCAR",icard,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
839 gMC->Gspos("FALP",icard,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
840 gMC->Gspos("FTUB",icard,"FAIA", 0.,cardpos[1],cardpos[2]+tdis,idrotm[99],"ONLY");
843 // intermediate module positioning
844 Float_t stepforcardB= 7.05;
848 for (icard=20; icard<39; ++icard) {
849 cardpos[2]= cardpos[2]+stepforcardB;
850 aplpos2 = cardpos[2]+0.15;
852 gMC->Gspos("FCAR",icard+34,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
853 gMC->Gspos("FALP",icard+34,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
854 gMC->Gspos("FTUB",icard+34,"FAIA", 0.,cardpos[1], cardpos[2]+tdis,idrotm[99],"ONLY");
855 gMC->Gspos("FCAR",58-icard,"FAIA",cardpos[0],cardpos[1], -cardpos[2], 0,"ONLY");
856 gMC->Gspos("FALP",58-icard,"FAIA",cardpos[0], aplpos1, -aplpos2, 0,"ONLY");
857 gMC->Gspos("FTUB",58-icard,"FAIA", 0.,cardpos[1],-cardpos[2]-tdis,idrotm[99],"ONLY");
860 gMC->Gspos("FCAR",icard+34+182,"FAIC",cardpos[0],cardpos[1], cardpos[2]-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
861 gMC->Gspos("FALP",icard+34+182,"FAIC",cardpos[0], aplpos1, aplpos2-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
862 gMC->Gspos("FTUB",icard+34+182,"FAIC", 0.,cardpos[1], cardpos[2]+tdis-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
863 gMC->Gspos("FCAR",58-icard+ 91,"FAIB",cardpos[0],cardpos[1], -cardpos[2]+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
864 gMC->Gspos("FALP",58-icard+ 91,"FAIB",cardpos[0], aplpos1, -aplpos2+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
865 gMC->Gspos("FTUB",58-icard+ 91,"FAIB", 0.,cardpos[1],-cardpos[2]-tdis+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
870 // outer module positioning
871 Float_t stepforcardC= 8.45238;
874 for (icard=1; icard<20; ++icard) {
875 cardpos[2]= cardpos[2]+stepforcardC;
876 aplpos2 = cardpos[2]+0.15;
878 gMC->Gspos("FCAR",icard+72,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
879 gMC->Gspos("FALP",icard+72,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
880 gMC->Gspos("FTUB",icard+72,"FAIA", 0.,cardpos[1], cardpos[2]+tdis,idrotm[99],"ONLY");
881 gMC->Gspos("FCAR",20-icard,"FAIA",cardpos[0],cardpos[1], -cardpos[2], 0,"ONLY");
882 gMC->Gspos("FALP",20-icard,"FAIA",cardpos[0], aplpos1, -aplpos2, 0,"ONLY");
883 gMC->Gspos("FTUB",20-icard,"FAIA", 0.,cardpos[1],-cardpos[2]-tdis,idrotm[99],"ONLY");
886 gMC->Gspos("FCAR",icard+72+182,"FAIC",cardpos[0],cardpos[1], cardpos[2]-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
887 gMC->Gspos("FALP",icard+72+182,"FAIC",cardpos[0], aplpos1, aplpos2-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
888 gMC->Gspos("FTUB",icard+72+182,"FAIC", 0.,cardpos[1], cardpos[2]+tdis-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
889 gMC->Gspos("FCAR",20-icard+ 91,"FAIB",cardpos[0],cardpos[1], -cardpos[2]+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
890 gMC->Gspos("FALP",20-icard+ 91,"FAIB",cardpos[0], aplpos1, -aplpos2+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
891 gMC->Gspos("FTUB",20-icard+ 91,"FAIB", 0.,cardpos[1],-cardpos[2]-tdis+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
896 //_____________________________________________________________________________
897 void AliTOFv5T0::DrawModule() const
900 // Draw a shaded view of the Time Of Flight version 4
903 // Set everything unseen
904 gMC->Gsatt("*", "seen", -1);
907 //Set volumes visible
910 //Set ALIC mother transparent
911 gMC->Gsatt("ALIC","SEEN", 0);
914 // Level 1 for TOF volumes
915 gMC->Gsatt("B077","seen", 0);
918 // Level 2 for TOF volumes
919 gMC->Gsatt("B071","seen", 0);
920 gMC->Gsatt("B074","seen", 0);
921 gMC->Gsatt("B075","seen", 0);
922 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
923 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
926 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
927 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
928 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
929 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
930 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
932 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
933 gMC->Gsatt("BTO1","seen", 0);
936 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
937 gMC->Gsatt("BTO2","seen", 0);
940 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
941 gMC->Gsatt("BTO3","seen", 0);
943 // Level 3 of B071, B074 and B075
944 gMC->Gsatt("FTOA","SEEN", 0);
945 if (fTOFHoles) gMC->Gsatt("FTOB","SEEN", 0);
947 // Level 4 of B071, B074 and B075
948 gMC->Gsatt("FLTA","SEEN", 0);
949 if (fTOFHoles) gMC->Gsatt("FLTB","SEEN",0);
950 if (fTOFHoles) gMC->Gsatt("FLTC","SEEN",0);
952 // Level 5 of B071, B074 and B075
953 gMC->Gsatt("FAIA","SEEN",-1); // all FAIA sub-levels skipped -
954 if (fTOFHoles) gMC->Gsatt("FAIB","SEEN",-1); // all FAIB sub-levels skipped -
955 if (fTOFHoles) gMC->Gsatt("FAIC","SEEN",-1); // all FAIC sub-levels skipped -
957 gMC->Gsatt("FALA","SEEN", 0);
958 if (fTOFHoles) gMC->Gsatt("FALB","SEEN", 0);
960 gMC->Gsatt("FPEA","SEEN", 1);
961 if (fTOFHoles) gMC->Gsatt("FPEB","SEEN", 1);
963 gMC->Gsatt("FSTR","SEEN",-1); // all FSTR sub-levels skipped -
965 gMC->Gsatt("FWZ1","SEEN", 0);
966 gMC->Gsatt("FWZ2","SEEN", 0);
967 gMC->Gsatt("FWZ3","SEEN", 0);
968 gMC->Gsatt("FWZ4","SEEN", 0);
970 gMC->Gsatt("FZ1B","SEEN", 0);
971 gMC->Gsatt("FZ1C","SEEN", 0);
972 gMC->Gsatt("FZ2B","SEEN", 0);
975 gMC->Gdopt("hide", "on");
976 gMC->Gdopt("shad", "on");
977 gMC->Gsatt("*", "fill", 7);
978 gMC->SetClipBox(".");
979 gMC->SetClipBox("*", 100, 1000, 100, 1000, 100, 1000);
981 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
982 gMC->Gdhead(1111, "Time Of Flight");
983 gMC->Gdman(18, 3, "MAN");
984 gMC->Gdopt("hide","off");
986 //_____________________________________________________________________________
987 void AliTOFv5T0::DrawDetectorModules() const
990 // Draw a shaded view of the TOF detector version 4
993 // Set everything unseen
994 gMC->Gsatt("*", "seen", -1);
997 //Set volumes visible
1000 //Set ALIC mother transparent
1001 gMC->Gsatt("ALIC","SEEN", 0);
1004 // Level 1 for TOF volumes
1005 gMC->Gsatt("B077","seen", 0);
1008 // Level 2 for TOF volumes
1009 gMC->Gsatt("B071","seen", 0);
1010 gMC->Gsatt("B074","seen", 0);
1011 gMC->Gsatt("B075","seen", 0);
1012 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
1013 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
1016 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
1017 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
1018 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
1019 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
1020 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
1022 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
1023 gMC->Gsatt("BTO1","seen", 0);
1026 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
1027 gMC->Gsatt("BTO2","seen", 0);
1030 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
1031 gMC->Gsatt("BTO3","seen", 0);
1033 // Level 3 of B071, B075 and B074
1034 gMC->Gsatt("FTOA","seen",-2); // all FTOA sub-levels skipped -
1036 gMC->Gsatt("FTOB","seen",-2); // all FTOB sub-levels skipped -
1037 gMC->Gsatt("FTOC","seen",-2); // all FTOC sub-levels skipped -
1040 gMC->Gdopt("hide","on");
1041 gMC->Gdopt("shad","on");
1042 gMC->Gsatt("*", "fill", 5);
1043 gMC->SetClipBox(".");
1044 gMC->SetClipBox("*", 100, 1000, 100, 1000, 0, 1000);
1045 gMC->DefaultRange();
1046 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
1047 gMC->Gdhead(1111,"TOF detector");
1048 gMC->Gdman(18, 3, "MAN");
1049 gMC->Gdopt("hide","off");
1052 //_____________________________________________________________________________
1053 void AliTOFv5T0::DrawDetectorStrips() const
1056 // Draw a shaded view of the TOF strips for version 4
1059 // Set everything unseen
1060 gMC->Gsatt("*", "seen", -1);
1063 //Set volumes visible
1066 //Set ALIC mother transparent
1067 gMC->Gsatt("ALIC","SEEN", 0);
1070 // Level 1 for TOF volumes
1071 gMC->Gsatt("B077","seen", 0);
1074 // Level 2 for TOF volumes
1075 gMC->Gsatt("B071","seen", 0);
1076 gMC->Gsatt("B074","seen", 0);
1077 gMC->Gsatt("B075","seen", 0);
1078 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
1079 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
1082 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
1083 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
1084 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
1085 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
1086 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
1088 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
1089 gMC->Gsatt("BTO1","seen", 0);
1092 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
1093 gMC->Gsatt("BTO2","seen", 0);
1096 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
1097 gMC->Gsatt("BTO3","seen", 0);
1099 // Level 3 of B071, B074 and B075
1100 gMC->Gsatt("FTOA","SEEN", 0);
1102 gMC->Gsatt("FTOB","SEEN", 0);
1103 gMC->Gsatt("FTOC","SEEN", 0);
1106 // Level 4 of B071, B074 and B075
1107 gMC->Gsatt("FLTA","SEEN", 0);
1109 gMC->Gsatt("FLTB","SEEN", 0);
1110 gMC->Gsatt("FLTC","SEEN", 0);
1113 // Level 5 of B071, B074 and B075
1114 gMC->Gsatt("FAIA","SEEN",-1); // all FAIA sub-levels skipped -
1116 gMC->Gsatt("FAIB","SEEN",-1); // all FAIB sub-levels skipped -
1117 gMC->Gsatt("FAIC","SEEN",-1); // all FAIC sub-levels skipped -
1120 gMC->Gsatt("FALA","SEEN", 0);
1121 if (fTOFHoles) gMC->Gsatt("FALB","SEEN", 0);
1123 gMC->Gsatt("FPEA","SEEN", 0);
1124 if (fTOFHoles) gMC->Gsatt("FPEB","SEEN", 0);
1126 gMC->Gsatt("FSTR","SEEN",-2); // all FSTR sub-levels skipped -
1128 gMC->Gsatt("FWZ1","SEEN", 0);
1129 gMC->Gsatt("FWZ2","SEEN", 0);
1130 gMC->Gsatt("FWZ3","SEEN", 0);
1131 gMC->Gsatt("FWZ4","SEEN", 0);
1133 gMC->Gsatt("FZ1B","SEEN", 0);
1134 gMC->Gsatt("FZ1C","SEEN", 0);
1135 gMC->Gsatt("FZ2B","SEEN", 0);
1142 gMC->Gsatt("FALP","SEEN",0);
1143 gMC->Gsatt("FCAR","SEEN",0);
1144 gMC->Gsatt("FTUB","SEEN",-1); // all FTUB sub-levels skipped -
1147 gMC->Gsatt("FITU","SEEN",0);
1152 gMC->Gsatt("FGLF","SEEN",0);
1153 gMC->Gsatt("FHON","SEEN",0);
1154 gMC->Gsatt("FPC1","SEEN",0);
1155 gMC->Gsatt("FPC2","SEEN",0);
1156 gMC->Gsatt("FPCB","SEEN",0);
1157 gMC->Gsatt("FRGL","SEEN",0);
1159 // Level 2 of FPCB => Level 3 of FSTR
1160 gMC->Gsatt("FSEN","SEEN",0);
1161 gMC->Gsatt("FSEZ","SEEN",0);
1162 gMC->Gsatt("FPAD","SEEN",1);
1165 gMC->Gdopt("hide","on");
1166 gMC->Gdopt("shad","on");
1167 gMC->Gsatt("*", "fill", 5);
1168 gMC->SetClipBox(".");
1169 gMC->SetClipBox("*", 0, 1000, 0, 1000, 0, 1000);
1170 gMC->DefaultRange();
1171 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
1172 gMC->Gdhead(1111,"TOF Strips");
1173 gMC->Gdman(18, 3, "MAN");
1174 gMC->Gdopt("hide","off");
1177 //_____________________________________________________________________________
1178 void AliTOFv5T0::CreateMaterials()
1181 // Define materials for the Time Of Flight
1184 //AliTOF::CreateMaterials();
1186 Int_t isxfld = gAlice->Field()->Integ();
1187 Float_t sxmgmx = gAlice->Field()->Max();
1188 Float_t we[7], ae[7], na[7], fr[7], vl[7];
1192 //--- Quartz (SiO2) to simulate float glass
1193 // density tuned to have correct float glass
1195 Float_t aq[2] = { 28.0855,15.9994 };
1196 Float_t zq[2] = { 14.,8. };
1197 Float_t wq[2] = { 1.,2. };
1198 Float_t dq = 2.55; // std value: 2.2
1202 Float_t anox[4] = {12.01,1.01,16.00,14.01};
1203 Float_t znox[4] = { 6., 1., 8., 7.};
1204 Float_t wnox[4] = {14., 22., 2., 2.};
1205 Float_t dnox = 0.048;
1209 Float_t ag10[4] = {28.09,12.01,1.01,16.00};
1210 Float_t zg10[4] = {14., 6., 1., 8.};
1213 for (i = 0; i < nlmatg10; ++i) {
1229 MaterialMixer(we,ae,na,fr,vl,5);
1235 Float_t densg10 = 1.7;
1238 Float_t awa[2] = { 1., 16. };
1239 Float_t zwa[2] = { 1., 8. };
1240 Float_t wwa[2] = { 2., 1. };
1245 Float_t asteel[4] = { 55.847,51.9961,58.6934,28.0855 };
1246 Float_t zsteel[4] = { 26.,24.,28.,14. };
1247 Float_t wsteel[4] = { .715,.18,.1,.005 };
1250 Float_t aAir[4]={12.0107,14.0067,15.9994,39.948};
1251 Float_t zAir[4]={6.,7.,8.,18.};
1252 Float_t wAir[4]={0.000124,0.755267,0.231781,0.012827};
1253 Float_t dAir = 1.20479E-3;
1256 Float_t afg[4] = {28.09,16.00,12.01,1.01};
1257 Float_t zfg[4] = {14., 8., 6., 1.};
1258 Float_t wfg[4] = {0.12906,0.29405,0.51502,0.06187};
1259 Float_t dfg = 1.111;
1262 // --- Freon C2F4H2 + SF6
1263 Float_t afre[4]= {12.01,1.01,19.00,32.07};
1264 Float_t zfre[4]= { 6., 1., 9., 16.};
1265 Float_t wfre[4]= {0.21250,0.01787,0.74827,0.021355};
1266 Float_t densfre= 0.00375;
1269 //char namat[15] = " ";
1270 //Float_t ama[2], zma[2], dma, radl, absl, buf[1];
1273 AliMixture ( 0, "Air$", aAir, zAir, dAir, 4, wAir);
1274 AliMixture ( 1, "Nomex$", anox, znox, dnox, nnox, wnox);
1275 AliMixture ( 2, "G10$", ag10, zg10, densg10, nlmatg10, wmatg10);
1276 AliMixture ( 3, "fibre glass$", afg, zfg, dfg, nfg, wfg);
1277 AliMaterial( 4, "Al $", 26.98, 13., 2.7, 8.9, 37.2);
1278 AliMaterial( 5, "Al honeycomb$", 26.98, 13., 0.0496, 483., 2483.);
1279 AliMixture ( 6, "Freon$", afre, zfre, densfre, nfre, wfre);
1280 AliMixture ( 7, "Glass$", aq, zq, dq, nq, wq);
1282 // get freon and glass
1283 gMC->Gfmate((*fIdmate)[6],namat,ama[0],zma[0],dma,radl,absl,buf,nbuf);
1284 gMC->Gfmate((*fIdmate)[7],namat,ama[1],zma[1],dma,radl,absl,buf,nbuf);
1287 Float_t wgfr[2]= {0.0011,0.9989};
1288 Float_t dgfr = 1.434;
1290 AliMixture ( 8, "glass-freon$", ama, zma, dgfr, ngfr, wgfr);
1292 AliMixture ( 9, "Water$", awa, zwa, dwa, nwa, wwa);
1293 AliMixture (10, "STAINLESS STEEL$", asteel, zsteel, 7.88, 4, wsteel);
1295 Float_t epsil, stmin, deemax, stemax;
1298 // EPSIL = 0.1 ! Tracking precision,
1299 // STEMAX = 0.1 ! Maximum displacement for multiple scattering
1300 // DEEMAX = 0.1 ! Maximum fractional energy loss, DLS
1304 epsil = .001; // Tracking precision,
1305 stemax = -1.; // Maximum displacement for multiple scattering
1306 deemax = -.3; // Maximum fractional energy loss, DLS
1309 AliMedium( 1, "Air$", 0, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1310 AliMedium( 2,"Nomex$", 1, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1311 AliMedium( 3,"G10$", 2, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1312 AliMedium( 4,"fibre glass$", 3, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1313 //AliMedium( 5,"glass-freon$", 8, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1314 AliMedium( 6,"Al Frame$", 4, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1315 AliMedium( 7,"Al honeycomb$", 5, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1316 AliMedium( 8,"Fre$", 6, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1317 AliMedium( 9,"PCB-S$", 2, 1, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1318 AliMedium(10,"Glass$", 7, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1319 AliMedium(11,"Water$", 9, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1320 AliMedium(12,"STEEL$", 10, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1323 //_____________________________________________________________________________
1324 void AliTOFv5T0::Init()
1327 // Initialise the detector after the geometry has been defined
1329 AliDebug(1, "**************************************"
1331 "**************************************");
1332 AliDebug(1, " Version 4 of TOF initialing, "
1333 "symmetric TOF - Full Coverage version");
1337 fIdFTOA = gMC->VolId("FTOA");
1339 fIdFTOB = gMC->VolId("FTOB");
1340 fIdFTOC = gMC->VolId("FTOC");
1342 fIdFLTA = gMC->VolId("FLTA");
1344 fIdFLTB = gMC->VolId("FLTB");
1345 fIdFLTC = gMC->VolId("FLTC");
1348 AliDebug(1, "**************************************"
1350 "**************************************");
1353 //_____________________________________________________________________________
1354 void AliTOFv5T0::StepManager()
1358 // Procedure called at each step in the Time Of Flight
1361 TLorentzVector mom, pos;
1362 Float_t xm[3],pm[3],xpad[3],ppad[3];
1365 Int_t sector, plate, padx, padz, strip;
1366 Int_t copy, padzid, padxid, stripid, i;
1367 Int_t *idtmed = fIdtmed->GetArray()-499;
1368 Float_t incidenceAngle;
1370 const char * path71 = "B071";
1371 const char * path75 = "B075";
1372 const char * path74 = "B074";
1373 const char* volpath;
1378 gMC->IsTrackEntering()
1379 && gMC->TrackCharge()
1380 //&& gMC->GetMedium()==idtmed[508]
1381 && gMC->CurrentMedium()==idtmed[508]
1382 && gMC->CurrentVolID(copy)==fIdSens
1386 AddTrackReference(gAlice->GetMCApp()->GetCurrentTrackNumber());
1388 // getting information about hit volumes
1390 padzid=gMC->CurrentVolOffID(1,copy);
1394 padxid=gMC->CurrentVolOffID(0,copy);
1398 stripid=gMC->CurrentVolOffID(4,copy);
1402 gMC->TrackPosition(pos);
1403 gMC->TrackMomentum(mom);
1405 Double_t normMom=1./mom.Rho();
1407 // getting the coordinates in pad ref system
1409 xm[0] = (Float_t)pos.X();
1410 xm[1] = (Float_t)pos.Y();
1411 xm[2] = (Float_t)pos.Z();
1413 pm[0] = (Float_t)mom.X()*normMom;
1414 pm[1] = (Float_t)mom.Y()*normMom;
1415 pm[2] = (Float_t)mom.Z()*normMom;
1417 gMC->Gmtod(xm,xpad,1); // from MRS to DRS: coordinates convertion
1418 gMC->Gmtod(pm,ppad,2); // from MRS to DRS: direction cosinus convertion
1421 if (TMath::Abs(ppad[1])>1) {
1422 AliWarning("Abs(ppad) > 1");
1423 ppad[1]=TMath::Sign((Float_t)1,ppad[1]);
1425 incidenceAngle = TMath::ACos(ppad[1])*kRaddeg;
1428 if (strip < fTOFGeometry->NStripC()) {
1432 else if (strip >= fTOFGeometry->NStripC() &&
1433 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB()) {
1435 strip = strip - fTOFGeometry->NStripC();
1437 else if (strip >= fTOFGeometry->NStripC() + fTOFGeometry->NStripB() &&
1438 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA()) {
1440 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB();
1442 else if (strip >= fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA() &&
1443 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA() + fTOFGeometry->NStripB()) {
1445 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB() - fTOFGeometry->NStripA();
1449 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB() - fTOFGeometry->NStripA() - fTOFGeometry->NStripB();
1452 volpath=gMC->CurrentVolOffName(8);
1453 index=gMC->CurrentVolOffID(8,copy);
1457 if(strcmp(path71,volpath)==0 && index <6) sector=12+index;
1458 if(strcmp(path71,volpath)==0 && index >=6) sector=index-3;
1459 if(strcmp(path75,volpath)==0) sector=index-1;
1460 if(strcmp(path74,volpath)==0) sector=10+index;
1467 hits[6] = mom.Rho();
1472 hits[11]= incidenceAngle;
1473 hits[12]= gMC->Edep();
1474 hits[13]= gMC->TrackLength();
1482 AddT0Hit(gAlice->GetMCApp()->GetCurrentTrackNumber(),vol, hits);
1485 //-------------------------------------------------------------------
1486 void AliTOFv5T0::MaterialMixer(Float_t* p,Float_t* a,Float_t* m,Float_t* d,Float_t* s,Int_t n) const
1488 // a[] atomic weights vector (in)
1489 // (atoms present in more compound appear separately)
1490 // m[] number of corresponding atoms in the mixture (in)
1491 // d[] fraction of the compound relative to the corresponding atoms (in)
1492 // s[] further possible weights " " " " (in)
1494 for (Int_t i = 0; i < n; ++i) {
1495 p[i] = a[i]*m[i]*d[i]*s[i];
1498 for (Int_t i = 0; i < n; ++i) {
1500 // AliInfo(Form((\n weight[%i] = %f (,i,p[i]));