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.9 2006/05/04 19:41:42 hristov
19 Possibility for partial TOF geometry (S.Arcelli)
21 Revision 1.8 2006/04/20 22:30:50 hristov
22 Coding conventions (Annalisa)
24 Revision 1.7 2006/04/16 22:29:05 hristov
25 Coding conventions (Annalisa)
27 Revision 1.6 2006/03/20 08:20:35 decaro
28 Al layer: positioning correction
30 Revision 1.5 2006/03/20 07:54:20 decaro
31 Correction of some layer thickness
33 Revision 1.4 2006/03/13 12:35:44 decaro
34 Suppression of fractional Z warning
36 Revision 1.3 2006/02/28 10:38:00 decaro
37 AliTOFGeometry::fAngles, AliTOFGeometry::fHeights,
38 AliTOFGeometry::fDistances arrays: dimension definition in the right
41 Revision 1.2 2006/02/27 18:12:14 decaro
42 Remove in StepManager the dependence of hit indexes from parametrized
45 Revision 1.1 2005/12/15 08:55:33 decaro
46 New TOF geometry description (V5) -G. Cara Romeo and A. De Caro
49 Revision 0.1 2004 November G. Cara Romeo and A. De Caro
50 Implement new TOF geometry version
52 suppress few volume overlaps
53 (in the 4th TOF geometry version),
54 insert the realistic strip numbers and positions
58 ///////////////////////////////////////////////////////////////////////////////
60 // This class contains the functions for version 5 of the Time Of Flight //
63 // VERSION WITH 5 MODULES AND TILTED STRIPS //
65 // FULL COVERAGE VERSION + OPTION for PHOS holes //
70 <img src="picts/AliTOFv5T0Class.gif"> //
74 ///////////////////////////////////////////////////////////////////////////////
77 #include "TGeometry.h"
78 #include "TLorentzVector.h"
80 #include "TVirtualMC.h"
88 #include "AliTOFGeometry.h"
89 #include "AliTOFGeometryV5.h"
90 #include "AliTOFv5T0.h"
92 extern TDirectory *gDirectory;
93 extern TVirtualMC *gMC;
95 extern AliRun *gAlice;
99 //_____________________________________________________________________________
100 AliTOFv5T0::AliTOFv5T0()
103 // Default constructor
107 //_____________________________________________________________________________
108 AliTOFv5T0::AliTOFv5T0(const char *name, const char *title)
109 : AliTOF(name,title,"tzero")
112 // Standard constructor
115 // Check that FRAME is there otherwise we have no place where to
119 AliModule* frame = (AliModule*)gAlice->GetModule("FRAME");
121 AliFatal("TOF needs FRAME to be present");
124 if (fTOFGeometry) delete fTOFGeometry;
125 fTOFGeometry = new AliTOFGeometryV5();
127 if(frame->IsVersion()==1) {
128 AliInfo(Form("Frame version %d", frame->IsVersion()));
129 AliInfo("Full Coverage for TOF");
132 AliInfo(Form("Frame version %d", frame->IsVersion()));
133 AliInfo("TOF with Holes for PHOS");
136 fTOFGeometry->SetHoles(fTOFHoles);
138 //AliTOF::fTOFGeometry = fTOFGeometry;
141 TDirectory* saveDir = gDirectory;
142 gAlice->GetRunLoader()->CdGAFile();
143 fTOFGeometry->Write("TOFgeometry");
148 //____________________________________________________________________________
149 void AliTOFv5T0::BuildGeometry()
152 // Build TOF ROOT geometry for the ALICE event display
155 const int kColorTOF = 27;
157 TGeometry *globalGeometry = (TGeometry*)gAlice->GetGeometry();
160 top = globalGeometry->GetNode("alice");
162 // Position the different copies
163 const Float_t krTof =(fTOFGeometry->Rmax()+fTOFGeometry->Rmin())/2.;
164 const Float_t khTof = fTOFGeometry->Rmax()-fTOFGeometry->Rmin();
165 const Int_t kNTof = fTOFGeometry->NSectors();
166 const Float_t kangle = k2PI/kNTof;
168 const Float_t kInterCentrModBorder1 = 49.5;
169 const Float_t kInterCentrModBorder2 = 57.5;
173 // define offset for nodes
174 Float_t zOffsetB = (fTOFGeometry->ZlenA()*0.5 + (kInterCentrModBorder1+kInterCentrModBorder2)*0.5)*0.5;
175 Float_t zOffsetA = 0.;
176 // Define TOF basic volume
178 char nodeName0[16], nodeName1[16], nodeName2[16];
179 char nodeName3[16], nodeName4[16], rotMatNum[16];
182 new TBRIK("S_TOF_B","TOF box","void",
183 fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenB()*0.5);
184 new TBRIK("S_TOF_C","TOF box","void",
185 fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenB()*0.5);
187 new TBRIK("S_TOF_A","TOF box","void",
188 fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenA()*0.5);
190 for (Int_t nodeNum=1;nodeNum<19;nodeNum++){
193 sprintf(rotMatNum,"rot50%i",nodeNum);
194 sprintf(nodeName0,"FTO00%i",nodeNum);
195 sprintf(nodeName1,"FTO10%i",nodeNum);
196 sprintf(nodeName2,"FTO20%i",nodeNum);
197 sprintf(nodeName3,"FTO30%i",nodeNum);
198 sprintf(nodeName4,"FTO40%i",nodeNum);
201 sprintf(rotMatNum,"rot5%i",nodeNum);
202 sprintf(nodeName0,"FTO0%i",nodeNum);
203 sprintf(nodeName1,"FTO1%i",nodeNum);
204 sprintf(nodeName2,"FTO2%i",nodeNum);
205 sprintf(nodeName3,"FTO3%i",nodeNum);
206 sprintf(nodeName4,"FTO4%i",nodeNum);
209 new TRotMatrix(rotMatNum,rotMatNum,90,-20*nodeNum,90,90-20*nodeNum,0,0);
210 ang = (4.5-nodeNum) * kangle;
214 node = new TNode(nodeName2,nodeName2,"S_TOF_B", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang), zOffsetB,rotMatNum);
215 node->SetLineColor(kColorTOF);
219 node = new TNode(nodeName3,nodeName3,"S_TOF_C", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang),-zOffsetB,rotMatNum);
220 node->SetLineColor(kColorTOF);
225 node = new TNode(nodeName4,nodeName4,"S_TOF_A", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang), zOffsetA,rotMatNum);
226 node->SetLineColor(kColorTOF);
228 } // end loop on nodeNum
232 //_____________________________________________________________________________
233 void AliTOFv5T0::CreateGeometry()
236 // Create geometry for Time Of Flight version 0
240 <img src="picts/AliTOFv5T0.gif">
244 // Creates common geometry
246 AliTOF::CreateGeometry();
250 //_____________________________________________________________________________
251 void AliTOFv5T0::TOFpc(Float_t xtof, Float_t ytof, Float_t zlenA,
255 // Definition of the Time Of Fligh Resistive Plate Chambers
258 const Float_t kPi = TMath::Pi();
260 const Float_t kInterCentrModBorder1 = 49.5;
261 const Float_t kInterCentrModBorder2 = 57.5;
262 const Float_t kExterInterModBorder1 = 196.0;
263 const Float_t kExterInterModBorder2 = 203.5;
265 const Float_t kLengthExInModBorder = 4.7;
266 const Float_t kLengthInCeModBorder = 7.0;
268 // Al layers over all internal module walls (cm)
269 const Float_t khAlWall = 0.03;
271 // module wall thickness (cm)
272 const Float_t kModuleWallThickness = 0.3;
274 // Al honeycomb layer between strips and cards (cm)
275 const Float_t kHoneycombLayerThickness = 1.5;
277 AliDebug(2,Form("zlenA*0.5 = %d", zlenA*0.5));
278 AliDebug(1, "************************* TOF geometry **************************");
280 // Definition of the Time Of Fligh Resistive Plate Chambers
281 // xFLT, yFLT, zFLT - sizes of TOF modules (large)
283 Float_t xcoor, ycoor, zcoor;
285 Int_t *idtmed = fIdtmed->GetArray()-499;
290 par[2] = zlenA * 0.5;
291 gMC->Gsvolu("FTOA", "BOX ", idtmed[503], par, 3); // fibre glass
296 par[2] = (zlenA*0.5 - kInterCentrModBorder1)*0.5;
297 gMC->Gsvolu("FTOB", "BOX ", idtmed[503], par, 3); // fibre glass
298 gMC->Gsvolu("FTOC", "BOX ", idtmed[503], par, 3); // fibre glass
301 // Positioning of fibre glass modules (FTOA, FTOB and FTOC)
303 //AliMatrix(idrotm[0], 90., 0., 0., 0., 90.,-90.);
304 AliMatrix(idrotm[0], 90., 0., 0., 0., 90.,270.);
309 for(Int_t isec=0;isec<18;isec++){
310 if(fTOFSectors[isec]==-1)continue;
312 sprintf(name, "BTOF%d",isec);
313 if (fTOFHoles && (isec==16||isec==17)) {
315 ycoor = (zlenA*0.5 + kInterCentrModBorder1)*0.5;
317 gMC->Gspos("FTOB", 0, name, xcoor, ycoor, zcoor, idrotm[0], "ONLY");
318 gMC->Gspos("FTOC", 0, name, xcoor,-ycoor, zcoor, idrotm[0], "ONLY");
320 else gMC->Gspos("FTOA", 0,name, xcoor, ycoor, zcoor, idrotm[0], "ONLY");
322 // Large not sensitive volumes with Insensitive Freon (FLTA, FLTB and FLTC)
324 Float_t xFLT, yFLT, zFLTA;
326 xFLT = xtof - kModuleWallThickness*2.;
327 yFLT = ytof - kModuleWallThickness*2.;
328 zFLTA = zlenA - kModuleWallThickness*2.;
333 gMC->Gsvolu("FLTA", "BOX ", idtmed[507], par, 3); // Freon mix
338 gMC->Gspos ("FLTA", 0, "FTOA", xcoor, ycoor, zcoor, 0, "ONLY");
343 par[2] = (zlenA*0.5 - kInterCentrModBorder1-kModuleWallThickness)*0.5;
344 gMC->Gsvolu("FLTB", "BOX ", idtmed[507], par, 3); // Freon mix
345 gMC->Gsvolu("FLTC", "BOX ", idtmed[507], par, 3); // Freon mix
349 zcoor = kModuleWallThickness*0.5;
350 gMC->Gspos ("FLTB", 0, "FTOB", xcoor, ycoor, zcoor, 0, "ONLY");
351 gMC->Gspos ("FLTC", 0, "FTOC", xcoor, ycoor,-zcoor, 0, "ONLY");
354 // Layer of Aluminum before detector (FALA, FALB and FALC)
357 par[1] = khAlWall*0.5;
358 par[2] = kInterCentrModBorder1 - (kModuleWallThickness + khAlWall);
359 gMC->Gsvolu("FALA", "BOX ", idtmed[505], par, 3); // Alluminium
362 ycoor = (-yFLT + khAlWall)*0.5;
364 gMC->Gspos ("FALA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
367 par[1] = khAlWall*0.5;
368 par[2] = (kExterInterModBorder2 - kInterCentrModBorder1 - 2.*(kModuleWallThickness + khAlWall))*0.5;
369 gMC->Gsvolu("FALB", "BOX ", idtmed[505], par, 3); // Alluminium
372 ycoor = (-yFLT + khAlWall)*0.5;
373 zcoor = (kExterInterModBorder2 + kInterCentrModBorder1)*0.5;
374 gMC->Gspos ("FALB", 1, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
375 gMC->Gspos ("FALB", 2, "FLTA", xcoor, ycoor,-zcoor, 0, "ONLY");
378 par[1] = khAlWall*0.5;
379 par[2] = (zlenA*0.5 - kExterInterModBorder2 - 2.*(kModuleWallThickness + khAlWall))*0.5;
380 gMC->Gsvolu("FALC", "BOX ", idtmed[505], par, 3); // Alluminium
383 ycoor = (-yFLT + khAlWall)*0.5;
384 zcoor = (kExterInterModBorder2+zlenA*0.5)*0.5;
385 gMC->Gspos ("FALC", 1, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
386 gMC->Gspos ("FALC", 2, "FLTA", xcoor, ycoor,-zcoor, 0, "ONLY");
390 ycoor = (-yFLT + khAlWall)*0.5;
391 zcoor = (zlenA*0.5 - kExterInterModBorder2)*0.5 - kModuleWallThickness*0.5;
392 gMC->Gspos ("FALB", 1, "FLTB", xcoor, ycoor, zcoor, 0, "ONLY");
393 gMC->Gspos ("FALB", 2, "FLTC", xcoor, ycoor,-zcoor, 0, "ONLY");
396 ycoor = (-yFLT + khAlWall)*0.5;
397 zcoor = (kExterInterModBorder2 - kInterCentrModBorder1)*0.5 + kModuleWallThickness*0.5;
398 gMC->Gspos ("FALC", 1, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
399 gMC->Gspos ("FALC", 2, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
402 Float_t y0, alpha, tgal, beta, tgbe, trpa[11];
404 // Fibre glass walls between central and intermediate modules (FWZ1 and FWZ2; holes -> FZ1B, FZ1C, FZ2B)
406 tgal = (yFLT*0.5 - 2.*kLengthInCeModBorder)/(kInterCentrModBorder2 - kInterCentrModBorder1);
407 alpha = TMath::ATan(tgal);
408 beta = (kPi*0.5 - alpha)*0.5;
409 tgbe = TMath::Tan(beta);
413 trpa[3] = kModuleWallThickness;
414 trpa[4] = (kLengthInCeModBorder - kModuleWallThickness*tgbe)*0.5;
415 trpa[5] = (kLengthInCeModBorder + kModuleWallThickness*tgbe)*0.5;
416 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
417 trpa[7] = kModuleWallThickness;
418 trpa[8] = (kLengthInCeModBorder - kModuleWallThickness*tgbe)*0.5;
419 trpa[9] = (kLengthInCeModBorder + kModuleWallThickness*tgbe)*0.5;
420 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
421 gMC->Gsvolu("FWZ1","TRAP", idtmed[503], trpa, 11); // fibre glass
423 AliMatrix (idrotm[1],90., 90.,180.,0.,90.,180.);
424 AliMatrix (idrotm[4],90., 90., 0.,0.,90., 0.);
427 ycoor = -yFLT*0.5 + kLengthInCeModBorder*0.5;
428 zcoor = kInterCentrModBorder1;
429 gMC->Gspos("FWZ1", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[1],"ONLY");
430 gMC->Gspos("FWZ1", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[4],"ONLY");
433 y0 = kLengthInCeModBorder - kModuleWallThickness*0.5*tgbe;
437 trpa[3] = kModuleWallThickness*0.5;
438 trpa[4] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
439 trpa[5] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
440 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
441 trpa[7] = kModuleWallThickness*0.5;
442 trpa[8] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
443 trpa[9] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
444 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
445 gMC->Gsvolu("FZ1B","TRAP", idtmed[503], trpa, 11); // fibre glass
448 ycoor = -yFLT*0.5 + kLengthInCeModBorder*0.5 - kModuleWallThickness*0.25*tgbe;
449 zcoor = -kInterCentrModBorder1 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
450 gMC->Gspos("FZ1B", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[4],"ONLY");
451 gMC->Gspos("FZ1B", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[1],"ONLY");
454 AliMatrix (idrotm[2],90.,270., 0.,0.,90.,180.);
455 AliMatrix (idrotm[5],90.,270.,180.,0.,90., 0.);
458 ycoor = -kLengthInCeModBorder*0.5;
459 zcoor = kInterCentrModBorder2;
460 gMC->Gspos("FWZ1", 3,"FLTA", xcoor, ycoor, zcoor,idrotm[2],"ONLY");
461 gMC->Gspos("FWZ1", 4,"FLTA", xcoor, ycoor,-zcoor,idrotm[5],"ONLY");
464 y0 = kLengthInCeModBorder + kModuleWallThickness*0.5*tgbe;
468 trpa[3] = kModuleWallThickness*0.5;
469 trpa[4] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
470 trpa[5] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
471 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
472 trpa[7] = kModuleWallThickness*0.5;
473 trpa[8] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
474 trpa[9] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
475 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
476 gMC->Gsvolu("FZ1C","TRAP", idtmed[503], trpa, 11); // fibre glass
479 ycoor = -kLengthInCeModBorder*0.5 - kModuleWallThickness*0.25*tgbe;
480 zcoor = -kInterCentrModBorder2 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
481 gMC->Gspos("FZ1C", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[5],"ONLY");
482 gMC->Gspos("FZ1C", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[2],"ONLY");
485 trpa[0] = 0.5*(kInterCentrModBorder2 - kInterCentrModBorder1)/TMath::Cos(alpha);
486 trpa[1] = kModuleWallThickness;
488 trpa[3] = -beta*kRaddeg;
491 gMC->Gsvolu("FWZ2","PARA", idtmed[503], trpa, 6); // fibre glass
493 AliMatrix (idrotm[3], alpha*kRaddeg,90.,90.+alpha*kRaddeg,90.,90.,180.);
494 AliMatrix (idrotm[6],180.-alpha*kRaddeg,90.,90.-alpha*kRaddeg,90.,90., 0.);
498 zcoor = (kInterCentrModBorder2 + kInterCentrModBorder1)*0.5;
499 gMC->Gspos("FWZ2", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[3],"ONLY");
500 gMC->Gspos("FWZ2", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[6],"ONLY");
503 trpa[0] = 0.5*(kInterCentrModBorder2 - kInterCentrModBorder1)/TMath::Cos(alpha);
504 trpa[1] = kModuleWallThickness*0.5;
506 trpa[3] = -beta*kRaddeg;
509 gMC->Gsvolu("FZ2B","PARA", idtmed[503], trpa, 6); // fibre glass
512 ycoor = -yFLT*0.25 - kModuleWallThickness*0.5*tgbe;
513 zcoor = -(kInterCentrModBorder2 + kInterCentrModBorder1)*0.5 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
514 gMC->Gspos("FZ2B", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[6],"ONLY");
515 gMC->Gspos("FZ2B", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[3],"ONLY");
518 // Fibre glass walls between intermediate and lateral modules (FWZ3 and FWZ4)
520 tgal = (yFLT*0.5 - 2.*kLengthExInModBorder)/(kExterInterModBorder2 - kExterInterModBorder1);
521 alpha = TMath::ATan(tgal);
522 beta = (kPi*0.5 - alpha)*0.5;
523 tgbe = TMath::Tan(beta);
527 trpa[3] = kModuleWallThickness;
528 trpa[4] = (kLengthExInModBorder - kModuleWallThickness*tgbe)*0.5;
529 trpa[5] = (kLengthExInModBorder + kModuleWallThickness*tgbe)*0.5;
530 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
531 trpa[7] = kModuleWallThickness;
532 trpa[8] = (kLengthExInModBorder - kModuleWallThickness*tgbe)*0.5;
533 trpa[9] = (kLengthExInModBorder + kModuleWallThickness*tgbe)*0.5;
534 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
535 gMC->Gsvolu("FWZ3","TRAP", idtmed[503], trpa, 11); // fibre glass
538 ycoor = -kLengthExInModBorder*0.5;
539 zcoor = kExterInterModBorder1;
540 gMC->Gspos("FWZ3", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[5],"ONLY");
541 gMC->Gspos("FWZ3", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[2],"ONLY");
545 ycoor = -kLengthExInModBorder*0.5;
546 zcoor = -kExterInterModBorder1 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
547 gMC->Gspos("FWZ3", 5,"FLTB", xcoor, ycoor, zcoor,idrotm[2],"ONLY");
548 gMC->Gspos("FWZ3", 6,"FLTC", xcoor, ycoor,-zcoor,idrotm[5],"ONLY");
552 ycoor = -yFLT*0.5 + kLengthExInModBorder*0.5;
553 zcoor = kExterInterModBorder2;
554 gMC->Gspos("FWZ3", 3,"FLTA", xcoor, ycoor, zcoor,idrotm[4],"ONLY");
555 gMC->Gspos("FWZ3", 4,"FLTA", xcoor, ycoor,-zcoor,idrotm[1],"ONLY");
559 ycoor = -yFLT*0.5 + kLengthExInModBorder*0.5;
560 zcoor = -kExterInterModBorder2 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
561 gMC->Gspos("FWZ3", 7,"FLTB", xcoor, ycoor, zcoor,idrotm[1],"ONLY");
562 gMC->Gspos("FWZ3", 8,"FLTC", xcoor, ycoor,-zcoor,idrotm[4],"ONLY");
565 trpa[0] = 0.5*(kExterInterModBorder2 - kExterInterModBorder1)/TMath::Cos(alpha);
566 trpa[1] = kModuleWallThickness;
568 trpa[3] = -beta*kRaddeg;
571 gMC->Gsvolu("FWZ4","PARA", idtmed[503], trpa, 6); // fibre glass
573 AliMatrix (idrotm[13],alpha*kRaddeg,90.,90.+alpha*kRaddeg,90.,90.,180.);
574 AliMatrix (idrotm[16],180.-alpha*kRaddeg,90.,90.-alpha*kRaddeg,90.,90.,0.);
578 zcoor = (kExterInterModBorder2 + kExterInterModBorder1)*0.5;
579 gMC->Gspos("FWZ4", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[16],"ONLY");
580 gMC->Gspos("FWZ4", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[13],"ONLY");
585 zcoor = -(kExterInterModBorder2 + kExterInterModBorder1)*0.5 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
586 gMC->Gspos("FWZ4", 3,"FLTB", xcoor, ycoor, zcoor,idrotm[13],"ONLY");
587 gMC->Gspos("FWZ4", 4,"FLTC", xcoor, ycoor,-zcoor,idrotm[16],"ONLY");
591 ///////////////// Detector itself //////////////////////
593 const Int_t knx = fTOFGeometry->NpadX(); // number of pads along x
594 const Int_t knz = fTOFGeometry->NpadZ(); // number of pads along z
595 const Float_t kPadX = fTOFGeometry->XPad(); // pad length along x
596 const Float_t kPadZ = fTOFGeometry->ZPad(); // pad length along z
598 // new description for strip volume -double stack strip-
599 // -- all constants are expressed in cm
600 // heigth of different layers
601 const Float_t khhony = 1.0 ; // heigth of HONY Layer
602 const Float_t khpcby = 0.08 ; // heigth of PCB Layer
603 const Float_t khrgly = 0.055 ; // heigth of RED GLASS Layer
605 const Float_t khfiliy = 0.125 ; // heigth of FISHLINE Layer
606 const Float_t khglassy = 0.160*0.5; // heigth of GLASS Layer
607 const Float_t khglfy = khfiliy+2.*khglassy;// heigth of GLASS+FISHLINE Layer
609 const Float_t khcpcby = 0.16 ; // heigth of PCB Central Layer
610 const Float_t kwhonz = 8.1 ; // z dimension of HONEY Layer
611 const Float_t kwpcbz1 = 10.6 ; // z dimension of PCB Lower Layer
612 const Float_t kwpcbz2 = 11.6 ; // z dimension of PCB Upper Layer
613 const Float_t kwcpcbz = 12.4 ; // z dimension of PCB Central Layer
614 const Float_t kwrglz = 8. ; // z dimension of RED GLASS Layer
615 const Float_t kwglfz = 7. ; // z dimension of GLASS+FISHLN Layer
616 const Float_t klsensmx = knx*kPadX; // length of Sensitive Layer
617 const Float_t khsensmy = 0.05;//0.11;//0.16;// heigth of Sensitive Layer
618 const Float_t kwsensmz = knz*kPadZ; // width of Sensitive Layer
620 // heigth of the FSTR Volume (the strip volume)
621 const Float_t khstripy = 2.*khhony+2.*khpcby+4.*khrgly+2.*khglfy+khcpcby;
623 // width of the FSTR Volume (the strip volume)
624 const Float_t kwstripz = kwcpcbz;
625 // length of the FSTR Volume (the strip volume)
626 const Float_t klstripx = fTOFGeometry->StripLength();
628 Float_t parfp[3]={klstripx*0.5,khstripy*0.5,kwstripz*0.5};
629 // Coordinates of the strip center in the strip reference frame;
630 // used for positioning internal strip volumes
631 Float_t posfp[3]={0.,0.,0.};
633 // FSTR volume definition-filling this volume with non sensitive Gas Mixture
634 gMC->Gsvolu("FSTR","BOX",idtmed[507],parfp,3); // Freon mix
636 //-- HONY Layer definition
637 parfp[1] = khhony*0.5;
638 parfp[2] = kwhonz*0.5;
639 gMC->Gsvolu("FHON","BOX",idtmed[501],parfp,3); // honeycomb (Nomex)
640 // positioning 2 HONY Layers on FSTR volume
641 posfp[1] =-khstripy*0.5+parfp[1];
642 gMC->Gspos("FHON",1,"FSTR",0., posfp[1],0.,0,"ONLY");
643 gMC->Gspos("FHON",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
645 //-- PCB Layer definition
646 parfp[1] = khpcby*0.5;
647 parfp[2] = kwpcbz1*0.5;
648 gMC->Gsvolu("FPC1","BOX",idtmed[502],parfp,3); // G10
649 parfp[2] = kwpcbz2*0.5;
650 gMC->Gsvolu("FPC2","BOX",idtmed[502],parfp,3); // G10
651 // positioning 2 PCB Layers on FSTR volume
652 posfp[1] =-khstripy*0.5+khhony+parfp[1];
653 gMC->Gspos("FPC1",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
654 gMC->Gspos("FPC2",1,"FSTR",0., posfp[1],0.,0,"ONLY");
656 //-- central PCB layer definition
657 parfp[1] = khcpcby*0.5;
658 parfp[2] = kwcpcbz*0.5;
659 gMC->Gsvolu("FPCB","BOX",idtmed[502],parfp,3); // G10
660 // positioning the central PCB layer
661 gMC->Gspos("FPCB",1,"FSTR",0.,0.,0.,0,"ONLY");
664 Float_t parfs[3] = {klsensmx*0.5, khsensmy*0.5, kwsensmz*0.5};
665 gMC->Gsvolu("FSEN","BOX",idtmed[508],parfs,3); // sensitive ...
666 // dividing FSEN along z in knz=2 and along x in knx=48
667 gMC->Gsdvn("FSEZ","FSEN",knz,3);
668 gMC->Gsdvn("FPAD","FSEZ",knx,1);
669 // positioning a Sensitive layer inside FPCB
670 gMC->Gspos("FSEN",1,"FPCB",0.,0.,0.,0,"ONLY");
672 //-- RED GLASS Layer definition
673 parfp[1] = khrgly*0.5;
674 parfp[2] = kwrglz*0.5;
675 gMC->Gsvolu("FRGL","BOX",idtmed[509],parfp,3); // glass
676 // positioning 4 RED GLASS Layers on FSTR volume
677 posfp[1] = -khstripy*0.5+khhony+khpcby+parfp[1];
678 gMC->Gspos("FRGL",1,"FSTR",0., posfp[1],0.,0,"ONLY");
679 gMC->Gspos("FRGL",4,"FSTR",0.,-posfp[1],0.,0,"ONLY");
680 posfp[1] = (khcpcby+khrgly)*0.5;
681 gMC->Gspos("FRGL",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
682 gMC->Gspos("FRGL",3,"FSTR",0., posfp[1],0.,0,"ONLY");
684 //-- GLASS Layer definition
685 parfp[1] = khglassy*0.5;
686 parfp[2] = kwglfz*0.5;
687 gMC->Gsvolu("FGLA","BOX",idtmed[509],parfp,3); // glass
689 // positioning 4 GLASS Layers on FSTR volume
690 posfp[1] = -khstripy*0.5+khhony+khpcby+khrgly+parfp[1];
691 gMC->Gspos("FGLA",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
692 gMC->Gspos("FGLA",4,"FSTR",0., posfp[1],0.,0,"ONLY");
693 posfp[1] = khcpcby*0.5+khrgly+khglassy*0.5;
694 gMC->Gspos("FGLA",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
695 gMC->Gspos("FGLA",3,"FSTR",0., posfp[1],0.,0,"ONLY");
697 //-- FREON Layer definition
698 parfp[1] = khfiliy*0.5;
699 gMC->Gsvolu("FFIS","BOX",idtmed[507],parfp,3); // freon
701 // positioning 2 FREON Layers on FSTR volume
702 posfp[1] = -khstripy*0.5+khhony+khpcby+khrgly+khglassy+parfp[1];
703 gMC->Gspos("FFIS",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
704 gMC->Gspos("FFIS",2,"FSTR",0., posfp[1],0.,0,"ONLY");
707 //-- GLASS+FISHLINE Layer definition
708 parfp[1] = khglfy*0.5;
709 parfp[2] = kwglfz*0.5;
710 gMC->Gsvolu("FGLF","BOX",idtmed[504],parfp,3);
712 // positioning 2 GLASS+FISHLINE Layers on FSTR volume
713 posfp[1] = (khcpcby+khglfy)*0.5+khrgly;
714 gMC->Gspos("FGLF",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
715 gMC->Gspos("FGLF",2,"FSTR",0., posfp[1],0.,0,"ONLY");
718 // Positioning the Strips (FSTR) in the FLT volumes
719 Int_t maxStripNumbers [5] ={fTOFGeometry->NStripC(),
720 fTOFGeometry->NStripB(),
721 fTOFGeometry->NStripA(),
722 fTOFGeometry->NStripB(),
723 fTOFGeometry->NStripC()};
725 Int_t totalStrip = 0;
726 Float_t xpos, zpos, ypos, ang;
727 for(Int_t iplate =0; iplate < fTOFGeometry->NPlates(); iplate++){
728 if (iplate>0) totalStrip += maxStripNumbers[iplate-1];
729 for(Int_t istrip =0; istrip < maxStripNumbers[iplate]; istrip++){
731 ang = fTOFGeometry->GetAngles(iplate,istrip);
732 AliDebug(1, Form(" iplate = %1i, istrip = %2i ---> ang = %f", iplate, istrip, ang));
734 if (ang>0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.+ang,90., ang, 90.);
735 else if (ang==0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.,90., 0., 0.);
736 else if (ang<0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.+ang,90.,-ang,270.);
739 zpos = fTOFGeometry->GetDistances(iplate,istrip);
740 ypos = fTOFGeometry->GetHeights(iplate,istrip);
742 gMC->Gspos("FSTR",istrip+totalStrip+1,"FLTA", xpos, ypos,-zpos,idrotm[istrip+totalStrip+1], "ONLY");
745 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");
746 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");
751 // 1.5 cm Al honeycomb layer between strips and cards
753 par[1] = kHoneycombLayerThickness*0.5;
755 gMC->Gsvolu("FPEA", "BOX ", idtmed[506], par, 3); // Al honeycomb
758 ycoor = kHoneycombLayerThickness*0.5;
760 gMC->Gspos ("FPEA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
764 par[1] = kHoneycombLayerThickness*0.5;
765 par[2] = (zlenA*0.5 - kInterCentrModBorder2-kModuleWallThickness)*0.5;
766 gMC->Gsvolu("FPEB", "BOX ", idtmed[506], par, 3); // Al honeycomb
769 ycoor = kHoneycombLayerThickness*0.5;
770 zcoor = (kInterCentrModBorder2-kInterCentrModBorder1)*0.5;
771 gMC->Gspos ("FPEB", 1, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
772 gMC->Gspos ("FPEB", 2, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
777 par[1] = (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
779 gMC->Gsvolu("FAIA", "BOX ", idtmed[500], par, 3); // Air
782 ycoor = kHoneycombLayerThickness + (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
784 gMC->Gspos ("FAIA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
788 par[1] = (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
789 par[2] = (zlenA*0.5 - kInterCentrModBorder2 - kModuleWallThickness)*0.5;
790 gMC->Gsvolu("FAIB", "BOX ", idtmed[500], par, 3); // Air
791 gMC->Gsvolu("FAIC", "BOX ", idtmed[500], par, 3); // Air
794 ycoor = kHoneycombLayerThickness + (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
795 zcoor = (kInterCentrModBorder2-kInterCentrModBorder1)*0.5;
796 gMC->Gspos ("FAIB", 0, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
797 gMC->Gspos ("FAIC", 0, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
800 // start with cards and cooling tubes
801 // finally, cards, cooling tubes and layer for thermal dispersion
804 // see GEOM200 in GEANT manual
808 // card volume definition
809 cardpar[0]= xFLT*0.5;
812 gMC->Gsvolu("FCAR", "BOX ", idtmed[502], cardpar, 3); // PCB Card
814 //alu plate volume definition
817 gMC->Gsvolu("FALP", "BOX ", idtmed[505], cardpar, 3); // Alu Plate
819 // tube volume definition
824 gMC->Gsvolu("FTUB", "TUBE", idtmed[511], tubepar, 3); // cooling tubes (steel)
829 gMC->Gsvolu("FITU", "TUBE", idtmed[510], tubepar, 3); // cooling water
830 // positioning water tube into the steel one
831 gMC->Gspos("FITU",1,"FTUB",0.,0.,0.,0,"ONLY");
834 AliMatrix(idrotm[99], 180., 90., 90., 90., 90., 0.);
836 // central module positioning
837 Float_t cardpos[3], aplpos2;
838 Float_t stepforcardA = 6.625;
840 Float_t aplpos1 = -2.;
845 // tubepos= -53.+tdis;
847 for (icard=39; icard<54; ++icard) {
848 cardpos[2]= cardpos[2]+stepforcardA;
849 aplpos2 = cardpos[2]+0.15;
850 gMC->Gspos("FCAR",icard,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
851 gMC->Gspos("FALP",icard,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
852 gMC->Gspos("FTUB",icard,"FAIA", 0.,cardpos[1],cardpos[2]+tdis,idrotm[99],"ONLY");
855 // intermediate module positioning
856 Float_t stepforcardB= 7.05;
860 for (icard=20; icard<39; ++icard) {
861 cardpos[2]= cardpos[2]+stepforcardB;
862 aplpos2 = cardpos[2]+0.15;
864 gMC->Gspos("FCAR",icard+34,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
865 gMC->Gspos("FALP",icard+34,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
866 gMC->Gspos("FTUB",icard+34,"FAIA", 0.,cardpos[1], cardpos[2]+tdis,idrotm[99],"ONLY");
867 gMC->Gspos("FCAR",58-icard,"FAIA",cardpos[0],cardpos[1], -cardpos[2], 0,"ONLY");
868 gMC->Gspos("FALP",58-icard,"FAIA",cardpos[0], aplpos1, -aplpos2, 0,"ONLY");
869 gMC->Gspos("FTUB",58-icard,"FAIA", 0.,cardpos[1],-cardpos[2]-tdis,idrotm[99],"ONLY");
872 gMC->Gspos("FCAR",icard+34+182,"FAIC",cardpos[0],cardpos[1], cardpos[2]-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
873 gMC->Gspos("FALP",icard+34+182,"FAIC",cardpos[0], aplpos1, aplpos2-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
874 gMC->Gspos("FTUB",icard+34+182,"FAIC", 0.,cardpos[1], cardpos[2]+tdis-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
875 gMC->Gspos("FCAR",58-icard+ 91,"FAIB",cardpos[0],cardpos[1], -cardpos[2]+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
876 gMC->Gspos("FALP",58-icard+ 91,"FAIB",cardpos[0], aplpos1, -aplpos2+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
877 gMC->Gspos("FTUB",58-icard+ 91,"FAIB", 0.,cardpos[1],-cardpos[2]-tdis+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
882 // outer module positioning
883 Float_t stepforcardC= 8.45238;
886 for (icard=1; icard<20; ++icard) {
887 cardpos[2]= cardpos[2]+stepforcardC;
888 aplpos2 = cardpos[2]+0.15;
890 gMC->Gspos("FCAR",icard+72,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
891 gMC->Gspos("FALP",icard+72,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
892 gMC->Gspos("FTUB",icard+72,"FAIA", 0.,cardpos[1], cardpos[2]+tdis,idrotm[99],"ONLY");
893 gMC->Gspos("FCAR",20-icard,"FAIA",cardpos[0],cardpos[1], -cardpos[2], 0,"ONLY");
894 gMC->Gspos("FALP",20-icard,"FAIA",cardpos[0], aplpos1, -aplpos2, 0,"ONLY");
895 gMC->Gspos("FTUB",20-icard,"FAIA", 0.,cardpos[1],-cardpos[2]-tdis,idrotm[99],"ONLY");
898 gMC->Gspos("FCAR",icard+72+182,"FAIC",cardpos[0],cardpos[1], cardpos[2]-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
899 gMC->Gspos("FALP",icard+72+182,"FAIC",cardpos[0], aplpos1, aplpos2-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
900 gMC->Gspos("FTUB",icard+72+182,"FAIC", 0.,cardpos[1], cardpos[2]+tdis-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
901 gMC->Gspos("FCAR",20-icard+ 91,"FAIB",cardpos[0],cardpos[1], -cardpos[2]+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
902 gMC->Gspos("FALP",20-icard+ 91,"FAIB",cardpos[0], aplpos1, -aplpos2+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
903 gMC->Gspos("FTUB",20-icard+ 91,"FAIB", 0.,cardpos[1],-cardpos[2]-tdis+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
908 //_____________________________________________________________________________
909 void AliTOFv5T0::DrawModule() const
912 // Draw a shaded view of the Time Of Flight version 4
915 // Set everything unseen
916 gMC->Gsatt("*", "seen", -1);
919 //Set volumes visible
922 //Set ALIC mother transparent
923 gMC->Gsatt("ALIC","SEEN", 0);
926 // Level 1 for TOF volumes
927 gMC->Gsatt("B077","seen", 0);
930 // Level 2 for TOF volumes
931 gMC->Gsatt("B071","seen", 0);
932 gMC->Gsatt("B074","seen", 0);
933 gMC->Gsatt("B075","seen", 0);
934 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
935 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
938 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
939 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
940 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
941 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
942 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
944 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
945 gMC->Gsatt("BTO1","seen", 0);
948 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
949 gMC->Gsatt("BTO2","seen", 0);
952 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
953 gMC->Gsatt("BTO3","seen", 0);
955 // Level 3 of B071, B074 and B075
956 gMC->Gsatt("FTOA","SEEN", 0);
957 if (fTOFHoles) gMC->Gsatt("FTOB","SEEN", 0);
959 // Level 4 of B071, B074 and B075
960 gMC->Gsatt("FLTA","SEEN", 0);
961 if (fTOFHoles) gMC->Gsatt("FLTB","SEEN",0);
962 if (fTOFHoles) gMC->Gsatt("FLTC","SEEN",0);
964 // Level 5 of B071, B074 and B075
965 gMC->Gsatt("FAIA","SEEN",-1); // all FAIA sub-levels skipped -
966 if (fTOFHoles) gMC->Gsatt("FAIB","SEEN",-1); // all FAIB sub-levels skipped -
967 if (fTOFHoles) gMC->Gsatt("FAIC","SEEN",-1); // all FAIC sub-levels skipped -
969 gMC->Gsatt("FALA","SEEN", 0);
970 if (fTOFHoles) gMC->Gsatt("FALB","SEEN", 0);
972 gMC->Gsatt("FPEA","SEEN", 1);
973 if (fTOFHoles) gMC->Gsatt("FPEB","SEEN", 1);
975 gMC->Gsatt("FSTR","SEEN",-1); // all FSTR sub-levels skipped -
977 gMC->Gsatt("FWZ1","SEEN", 0);
978 gMC->Gsatt("FWZ2","SEEN", 0);
979 gMC->Gsatt("FWZ3","SEEN", 0);
980 gMC->Gsatt("FWZ4","SEEN", 0);
982 gMC->Gsatt("FZ1B","SEEN", 0);
983 gMC->Gsatt("FZ1C","SEEN", 0);
984 gMC->Gsatt("FZ2B","SEEN", 0);
987 gMC->Gdopt("hide", "on");
988 gMC->Gdopt("shad", "on");
989 gMC->Gsatt("*", "fill", 7);
990 gMC->SetClipBox(".");
991 gMC->SetClipBox("*", 100, 1000, 100, 1000, 100, 1000);
993 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
994 gMC->Gdhead(1111, "Time Of Flight");
995 gMC->Gdman(18, 3, "MAN");
996 gMC->Gdopt("hide","off");
998 //_____________________________________________________________________________
999 void AliTOFv5T0::DrawDetectorModules() const
1002 // Draw a shaded view of the TOF detector version 4
1005 // Set everything unseen
1006 gMC->Gsatt("*", "seen", -1);
1009 //Set volumes visible
1012 //Set ALIC mother transparent
1013 gMC->Gsatt("ALIC","SEEN", 0);
1016 // Level 1 for TOF volumes
1017 gMC->Gsatt("B077","seen", 0);
1020 // Level 2 for TOF volumes
1021 gMC->Gsatt("B071","seen", 0);
1022 gMC->Gsatt("B074","seen", 0);
1023 gMC->Gsatt("B075","seen", 0);
1024 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
1025 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
1028 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
1029 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
1030 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
1031 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
1032 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
1034 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
1035 gMC->Gsatt("BTO1","seen", 0);
1038 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
1039 gMC->Gsatt("BTO2","seen", 0);
1042 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
1043 gMC->Gsatt("BTO3","seen", 0);
1045 // Level 3 of B071, B075 and B074
1046 gMC->Gsatt("FTOA","seen",-2); // all FTOA sub-levels skipped -
1048 gMC->Gsatt("FTOB","seen",-2); // all FTOB sub-levels skipped -
1049 gMC->Gsatt("FTOC","seen",-2); // all FTOC sub-levels skipped -
1052 gMC->Gdopt("hide","on");
1053 gMC->Gdopt("shad","on");
1054 gMC->Gsatt("*", "fill", 5);
1055 gMC->SetClipBox(".");
1056 gMC->SetClipBox("*", 100, 1000, 100, 1000, 0, 1000);
1057 gMC->DefaultRange();
1058 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
1059 gMC->Gdhead(1111,"TOF detector");
1060 gMC->Gdman(18, 3, "MAN");
1061 gMC->Gdopt("hide","off");
1064 //_____________________________________________________________________________
1065 void AliTOFv5T0::DrawDetectorStrips() const
1068 // Draw a shaded view of the TOF strips for version 4
1071 // Set everything unseen
1072 gMC->Gsatt("*", "seen", -1);
1075 //Set volumes visible
1078 //Set ALIC mother transparent
1079 gMC->Gsatt("ALIC","SEEN", 0);
1082 // Level 1 for TOF volumes
1083 gMC->Gsatt("B077","seen", 0);
1086 // Level 2 for TOF volumes
1087 gMC->Gsatt("B071","seen", 0);
1088 gMC->Gsatt("B074","seen", 0);
1089 gMC->Gsatt("B075","seen", 0);
1090 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
1091 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
1094 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
1095 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
1096 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
1097 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
1098 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
1100 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
1101 gMC->Gsatt("BTO1","seen", 0);
1104 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
1105 gMC->Gsatt("BTO2","seen", 0);
1108 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
1109 gMC->Gsatt("BTO3","seen", 0);
1111 // Level 3 of B071, B074 and B075
1112 gMC->Gsatt("FTOA","SEEN", 0);
1114 gMC->Gsatt("FTOB","SEEN", 0);
1115 gMC->Gsatt("FTOC","SEEN", 0);
1118 // Level 4 of B071, B074 and B075
1119 gMC->Gsatt("FLTA","SEEN", 0);
1121 gMC->Gsatt("FLTB","SEEN", 0);
1122 gMC->Gsatt("FLTC","SEEN", 0);
1125 // Level 5 of B071, B074 and B075
1126 gMC->Gsatt("FAIA","SEEN",-1); // all FAIA sub-levels skipped -
1128 gMC->Gsatt("FAIB","SEEN",-1); // all FAIB sub-levels skipped -
1129 gMC->Gsatt("FAIC","SEEN",-1); // all FAIC sub-levels skipped -
1132 gMC->Gsatt("FALA","SEEN", 0);
1133 if (fTOFHoles) gMC->Gsatt("FALB","SEEN", 0);
1135 gMC->Gsatt("FPEA","SEEN", 0);
1136 if (fTOFHoles) gMC->Gsatt("FPEB","SEEN", 0);
1138 gMC->Gsatt("FSTR","SEEN",-2); // all FSTR sub-levels skipped -
1140 gMC->Gsatt("FWZ1","SEEN", 0);
1141 gMC->Gsatt("FWZ2","SEEN", 0);
1142 gMC->Gsatt("FWZ3","SEEN", 0);
1143 gMC->Gsatt("FWZ4","SEEN", 0);
1145 gMC->Gsatt("FZ1B","SEEN", 0);
1146 gMC->Gsatt("FZ1C","SEEN", 0);
1147 gMC->Gsatt("FZ2B","SEEN", 0);
1154 gMC->Gsatt("FALP","SEEN",0);
1155 gMC->Gsatt("FCAR","SEEN",0);
1156 gMC->Gsatt("FTUB","SEEN",-1); // all FTUB sub-levels skipped -
1159 gMC->Gsatt("FITU","SEEN",0);
1164 gMC->Gsatt("FGLF","SEEN",0);
1165 gMC->Gsatt("FHON","SEEN",0);
1166 gMC->Gsatt("FPC1","SEEN",0);
1167 gMC->Gsatt("FPC2","SEEN",0);
1168 gMC->Gsatt("FPCB","SEEN",0);
1169 gMC->Gsatt("FRGL","SEEN",0);
1171 // Level 2 of FPCB => Level 3 of FSTR
1172 gMC->Gsatt("FSEN","SEEN",0);
1173 gMC->Gsatt("FSEZ","SEEN",0);
1174 gMC->Gsatt("FPAD","SEEN",1);
1177 gMC->Gdopt("hide","on");
1178 gMC->Gdopt("shad","on");
1179 gMC->Gsatt("*", "fill", 5);
1180 gMC->SetClipBox(".");
1181 gMC->SetClipBox("*", 0, 1000, 0, 1000, 0, 1000);
1182 gMC->DefaultRange();
1183 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
1184 gMC->Gdhead(1111,"TOF Strips");
1185 gMC->Gdman(18, 3, "MAN");
1186 gMC->Gdopt("hide","off");
1189 //_____________________________________________________________________________
1190 void AliTOFv5T0::CreateMaterials()
1193 // Define materials for the Time Of Flight
1196 //AliTOF::CreateMaterials();
1198 AliMagF *magneticField = (AliMagF*)gAlice->Field();
1200 Int_t isxfld = magneticField->Integ();
1201 Float_t sxmgmx = magneticField->Max();
1203 Float_t we[7], ae[7], na[7], fr[7], vl[7];
1206 //--- Quartz (SiO2) to simulate float glass
1207 // density tuned to have correct float glass
1209 Float_t aq[2] = { 28.0855,15.9994 };
1210 Float_t zq[2] = { 14.,8. };
1211 Float_t wq[2] = { 1.,2. };
1212 Float_t dq = 2.55; // std value: 2.2
1216 Float_t anox[4] = {12.01,1.01,16.00,14.01};
1217 Float_t znox[4] = { 6., 1., 8., 7.};
1218 Float_t wnox[4] = {14., 22., 2., 2.};
1219 Float_t dnox = 0.048;
1223 Float_t ag10[4] = {28.09,12.01,1.01,16.00};
1224 Float_t zg10[4] = {14., 6., 1., 8.};
1227 for (i = 0; i < nlmatg10; ++i) {
1243 MaterialMixer(we,ae,na,fr,vl,5);
1249 Float_t densg10 = 1.7;
1252 Float_t awa[2] = { 1., 16. };
1253 Float_t zwa[2] = { 1., 8. };
1254 Float_t wwa[2] = { 2., 1. };
1259 Float_t asteel[4] = { 55.847,51.9961,58.6934,28.0855 };
1260 Float_t zsteel[4] = { 26.,24.,28.,14. };
1261 Float_t wsteel[4] = { .715,.18,.1,.005 };
1264 Float_t aAir[4]={12.0107,14.0067,15.9994,39.948};
1265 Float_t zAir[4]={6.,7.,8.,18.};
1266 Float_t wAir[4]={0.000124,0.755267,0.231781,0.012827};
1267 Float_t dAir = 1.20479E-3;
1270 Float_t afg[4] = {28.09,16.00,12.01,1.01};
1271 Float_t zfg[4] = {14., 8., 6., 1.};
1272 Float_t wfg[4] = {0.12906,0.29405,0.51502,0.06187};
1273 Float_t dfg = 1.111;
1276 // --- Freon C2F4H2 + SF6
1277 Float_t afre[4]= {12.01,1.01,19.00,32.07};
1278 Float_t zfre[4]= { 6., 1., 9., 16.};
1279 Float_t wfre[4]= {0.21250,0.01787,0.74827,0.021355};
1280 Float_t densfre= 0.00375;
1283 //char namat[15] = " ";
1284 //Float_t ama[2], zma[2], dma, radl, absl, buf[1];
1287 AliMixture ( 0, "Air$", aAir, zAir, dAir, 4, wAir);
1288 AliMixture ( 1, "Nomex$", anox, znox, dnox, nnox, wnox);
1289 AliMixture ( 2, "G10$", ag10, zg10, densg10, nlmatg10, wmatg10);
1290 AliMixture ( 3, "fibre glass$", afg, zfg, dfg, nfg, wfg);
1291 AliMaterial( 4, "Al $", 26.98, 13., 2.7, 8.9, 37.2);
1292 AliMaterial( 5, "Al honeycomb$", 26.98, 13., 0.0496, 483., 2483.);
1293 AliMixture ( 6, "Freon$", afre, zfre, densfre, nfre, wfre);
1294 AliMixture ( 7, "Glass$", aq, zq, dq, nq, wq);
1296 // get freon and glass
1297 gMC->Gfmate((*fIdmate)[6],namat,ama[0],zma[0],dma,radl,absl,buf,nbuf);
1298 gMC->Gfmate((*fIdmate)[7],namat,ama[1],zma[1],dma,radl,absl,buf,nbuf);
1301 Float_t wgfr[2]= {0.0011,0.9989};
1302 Float_t dgfr = 1.434;
1304 AliMixture ( 8, "glass-freon$", ama, zma, dgfr, ngfr, wgfr);
1306 AliMixture ( 9, "Water$", awa, zwa, dwa, nwa, wwa);
1307 AliMixture (10, "STAINLESS STEEL$", asteel, zsteel, 7.88, 4, wsteel);
1309 Float_t epsil, stmin, deemax, stemax;
1312 // EPSIL = 0.1 ! Tracking precision,
1313 // STEMAX = 0.1 ! Maximum displacement for multiple scattering
1314 // DEEMAX = 0.1 ! Maximum fractional energy loss, DLS
1318 epsil = .001; // Tracking precision,
1319 stemax = -1.; // Maximum displacement for multiple scattering
1320 deemax = -.3; // Maximum fractional energy loss, DLS
1323 AliMedium( 1, "Air$", 0, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1324 AliMedium( 2,"Nomex$", 1, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1325 AliMedium( 3,"G10$", 2, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1326 AliMedium( 4,"fibre glass$", 3, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1327 //AliMedium( 5,"glass-freon$", 8, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1328 AliMedium( 6,"Al Frame$", 4, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1329 AliMedium( 7,"Al honeycomb$", 5, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1330 AliMedium( 8,"Fre$", 6, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1331 AliMedium( 9,"PCB-S$", 2, 1, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1332 AliMedium(10,"Glass$", 7, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1333 AliMedium(11,"Water$", 9, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1334 AliMedium(12,"STEEL$", 10, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1337 //_____________________________________________________________________________
1338 void AliTOFv5T0::Init()
1341 // Initialise the detector after the geometry has been defined
1343 AliDebug(1, "**************************************"
1345 "**************************************");
1346 AliDebug(1, " Version 4 of TOF initialing, "
1347 "symmetric TOF - Full Coverage version");
1351 fIdFTOA = gMC->VolId("FTOA");
1353 fIdFTOB = gMC->VolId("FTOB");
1354 fIdFTOC = gMC->VolId("FTOC");
1356 fIdFLTA = gMC->VolId("FLTA");
1358 fIdFLTB = gMC->VolId("FLTB");
1359 fIdFLTC = gMC->VolId("FLTC");
1362 AliDebug(1, "**************************************"
1364 "**************************************");
1367 //_____________________________________________________________________________
1368 void AliTOFv5T0::StepManager()
1372 // Procedure called at each step in the Time Of Flight
1375 TLorentzVector mom, pos;
1376 Float_t xm[3],pm[3],xpad[3],ppad[3];
1379 Int_t sector, plate, padx, padz, strip;
1380 Int_t copy, padzid, padxid, stripid, i;
1381 Int_t *idtmed = fIdtmed->GetArray()-499;
1382 Float_t incidenceAngle;
1384 const char* volpath;
1389 gMC->IsTrackEntering()
1390 && gMC->TrackCharge()
1391 //&& gMC->GetMedium()==idtmed[508]
1392 && gMC->CurrentMedium()==idtmed[508]
1393 && gMC->CurrentVolID(copy)==fIdSens
1397 AliMC *mcApplication = (AliMC*)gAlice->GetMCApp();
1399 AddTrackReference(mcApplication->GetCurrentTrackNumber());
1400 //AddTrackReference(gAlice->GetMCApp()->GetCurrentTrackNumber());
1402 // getting information about hit volumes
1404 padzid=gMC->CurrentVolOffID(1,copy);
1408 padxid=gMC->CurrentVolOffID(0,copy);
1412 stripid=gMC->CurrentVolOffID(4,copy);
1416 gMC->TrackPosition(pos);
1417 gMC->TrackMomentum(mom);
1419 Double_t normMom=1./mom.Rho();
1421 // getting the coordinates in pad ref system
1423 xm[0] = (Float_t)pos.X();
1424 xm[1] = (Float_t)pos.Y();
1425 xm[2] = (Float_t)pos.Z();
1427 pm[0] = (Float_t)mom.X()*normMom;
1428 pm[1] = (Float_t)mom.Y()*normMom;
1429 pm[2] = (Float_t)mom.Z()*normMom;
1431 gMC->Gmtod(xm,xpad,1); // from MRS to DRS: coordinates convertion
1432 gMC->Gmtod(pm,ppad,2); // from MRS to DRS: direction cosinus convertion
1435 if (TMath::Abs(ppad[1])>1) {
1436 AliWarning("Abs(ppad) > 1");
1437 ppad[1]=TMath::Sign((Float_t)1,ppad[1]);
1439 incidenceAngle = TMath::ACos(ppad[1])*kRaddeg;
1442 if (strip < fTOFGeometry->NStripC()) {
1446 else if (strip >= fTOFGeometry->NStripC() &&
1447 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB()) {
1449 strip = strip - fTOFGeometry->NStripC();
1451 else if (strip >= fTOFGeometry->NStripC() + fTOFGeometry->NStripB() &&
1452 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA()) {
1454 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB();
1456 else if (strip >= fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA() &&
1457 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA() + fTOFGeometry->NStripB()) {
1459 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB() - fTOFGeometry->NStripA();
1463 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB() - fTOFGeometry->NStripA() - fTOFGeometry->NStripB();
1466 volpath=gMC->CurrentVolOffName(7);
1467 index=atoi(&volpath[4]);
1482 hits[6] = mom.Rho();
1487 hits[11]= incidenceAngle;
1488 hits[12]= gMC->Edep();
1489 hits[13]= gMC->TrackLength();
1497 AddT0Hit(mcApplication->GetCurrentTrackNumber(),vol, hits);
1498 //AddT0Hit(gAlice->GetMCApp()->GetCurrentTrackNumber(),vol, hits);
1501 //-------------------------------------------------------------------
1502 void AliTOFv5T0::MaterialMixer(Float_t* p,Float_t* a,Float_t* m,Float_t* d,Float_t* s,Int_t n) const
1504 // a[] atomic weights vector (in)
1505 // (atoms present in more compound appear separately)
1506 // m[] number of corresponding atoms in the mixture (in)
1507 // d[] fraction of the compound relative to the corresponding atoms (in)
1508 // s[] further possible weights " " " " (in)
1510 for (Int_t i = 0; i < n; ++i) {
1511 p[i] = a[i]*m[i]*d[i]*s[i];
1514 for (Int_t i = 0; i < n; ++i) {
1516 // AliInfo(Form((\n weight[%i] = %f (,i,p[i]));