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.14 2006/10/17 15:33:14 arcelli
19 Moving some printout from Info to Debug level
21 Revision 1.13 2006/10/12 16:35:43 arcelli
22 definition of the alignable volumes symbolic names added
24 Revision 1.12 2006/08/22 13:34:46 arcelli
25 removal of effective c++ warnings (C.Zampolli)
27 Revision 1.11 2006/07/12 16:03:44 arcelli
28 updates to match the new numbering of the TOF/TRD mother volumes in FRAME (ALICE convention)
30 Revision 1.10 2006/05/10 18:40:17 hristov
31 Larger strings for the names
33 Revision 1.9 2006/05/04 19:41:42 hristov
34 Possibility for partial TOF geometry (S.Arcelli)
36 Revision 1.8 2006/04/20 22:30:50 hristov
37 Coding conventions (Annalisa)
39 Revision 1.7 2006/04/16 22:29:05 hristov
40 Coding conventions (Annalisa)
42 Revision 1.6 2006/03/20 08:20:35 decaro
43 Al layer: positioning correction
45 Revision 1.5 2006/03/20 07:54:20 decaro
46 Correction of some layer thickness
48 Revision 1.4 2006/03/13 12:35:44 decaro
49 Suppression of fractional Z warning
51 Revision 1.3 2006/02/28 10:38:00 decaro
52 AliTOFGeometry::fAngles, AliTOFGeometry::fHeights,
53 AliTOFGeometry::fDistances arrays: dimension definition in the right
56 Revision 1.2 2006/02/27 18:12:14 decaro
57 Remove in StepManager the dependence of hit indexes from parametrized
60 Revision 1.1 2005/12/15 08:55:33 decaro
61 New TOF geometry description (V5) -G. Cara Romeo and A. De Caro
64 Revision 0.1 2004 November G. Cara Romeo and A. De Caro
65 Implement new TOF geometry version
67 suppress few volume overlaps
68 (in the 4th TOF geometry version),
69 insert the realistic strip numbers and positions
73 ///////////////////////////////////////////////////////////////////////////////
75 // This class contains the functions for version 5 of the Time Of Flight //
78 // VERSION WITH 5 MODULES AND TILTED STRIPS //
80 // FULL COVERAGE VERSION + OPTION for PHOS holes //
85 <img src="picts/AliTOFv5T0Class.gif"> //
89 ///////////////////////////////////////////////////////////////////////////////
92 #include "TGeometry.h"
93 #include "TLorentzVector.h"
95 #include "TVirtualMC.h"
96 #include "TGeoManager.h"
104 #include "AliTOFGeometry.h"
105 #include "AliTOFGeometryV5.h"
106 #include "AliTOFv5T0.h"
108 extern TDirectory *gDirectory;
109 extern TVirtualMC *gMC;
110 extern TGeoManager *gGeoManager;
112 extern AliRun *gAlice;
116 //_____________________________________________________________________________
117 AliTOFv5T0::AliTOFv5T0():
127 // Default constructor
131 //_____________________________________________________________________________
132 AliTOFv5T0::AliTOFv5T0(const char *name, const char *title):
133 AliTOF(name,title,"tzero"),
143 // Standard constructor
146 // Check that FRAME is there otherwise we have no place where to
150 AliModule* frame = (AliModule*)gAlice->GetModule("FRAME");
152 AliFatal("TOF needs FRAME to be present");
155 if (fTOFGeometry) delete fTOFGeometry;
156 fTOFGeometry = new AliTOFGeometryV5();
158 if(frame->IsVersion()==1) {
159 AliDebug(1,Form("Frame version %d", frame->IsVersion()));
160 AliDebug(1,"Full Coverage for TOF");
163 AliDebug(1,Form("Frame version %d", frame->IsVersion()));
164 AliDebug(1,"TOF with Holes for PHOS");
167 fTOFGeometry->SetHoles(fTOFHoles);
169 //AliTOF::fTOFGeometry = fTOFGeometry;
172 TDirectory* saveDir = gDirectory;
173 gAlice->GetRunLoader()->CdGAFile();
174 fTOFGeometry->Write("TOFgeometry");
179 //_____________________________________________________________________________
180 void AliTOFv5T0::AddAlignableVolumes() const
183 // Create entries for alignable volumes associating the symbolic volume
184 // name with the corresponding volume path. Needs to be syncronized with
185 // eventual changes in the geometry.
191 TString vpL0 = "ALIC_1/B077_1/BSEGMO";
192 TString vpL1 = "_1/BTOF";
194 TString vpL3 = "/FTOA_0";
195 TString vpL4 = "/FLTA_0/FSTR_";
197 TString snSM = "TOF/sm";
198 TString snSTRIP = "/strip";
200 Int_t nSectors=fTOFGeometry->NSectors();
201 Int_t nStrips =fTOFGeometry->NStripA()+
202 2*fTOFGeometry->NStripB()+
203 2*fTOFGeometry->NStripC();
206 // The TOF MRPC Strips
207 // The symbolic names are: TOF/sm00/strip01
213 for (Int_t isect = 0; isect < nSectors; isect++) {
214 for (Int_t istr = 1; istr <= nStrips; istr++) {
227 symName += Form("%02d",isect);
229 symName += Form("%02d",istr);
231 AliDebug(2,"--------------------------------------------");
232 AliDebug(2,Form("Alignable object %d", imod));
233 AliDebug(2,Form("volPath=%s\n",volPath.Data()));
234 AliDebug(2,Form("symName=%s\n",symName.Data()));
235 AliDebug(2,"--------------------------------------------");
237 gGeoManager->SetAlignableEntry(symName.Data(),volPath.Data());
244 // The TOF supermodules
245 // The symbolic names are: TOF/sm00
249 for (Int_t isect = 0; isect < nSectors; isect++) {
259 symName += Form("%02d",isect);
261 AliDebug(2,"--------------------------------------------");
262 AliDebug(2,Form("Alignable object %d", isect+imod));
263 AliDebug(2,Form("volPath=%s\n",volPath.Data()));
264 AliDebug(2,Form("symName=%s\n",symName.Data()));
265 AliDebug(2,"--------------------------------------------");
267 gGeoManager->SetAlignableEntry(symName.Data(),volPath.Data());
272 //____________________________________________________________________________
273 void AliTOFv5T0::BuildGeometry()
276 // Build TOF ROOT geometry for the ALICE event display
279 const int kColorTOF = 27;
281 TGeometry *globalGeometry = (TGeometry*)gAlice->GetGeometry();
284 top = globalGeometry->GetNode("alice");
286 // Position the different copies
287 const Float_t krTof =(fTOFGeometry->Rmax()+fTOFGeometry->Rmin())/2.;
288 const Float_t khTof = fTOFGeometry->Rmax()-fTOFGeometry->Rmin();
289 const Int_t kNTof = fTOFGeometry->NSectors();
290 const Float_t kangle = k2PI/kNTof;
292 const Float_t kInterCentrModBorder1 = 49.5;
293 const Float_t kInterCentrModBorder2 = 57.5;
297 // define offset for nodes
298 Float_t zOffsetB = (fTOFGeometry->ZlenA()*0.5 + (kInterCentrModBorder1+kInterCentrModBorder2)*0.5)*0.5;
299 Float_t zOffsetA = 0.;
300 // Define TOF basic volume
302 char nodeName0[16], nodeName1[16], nodeName2[16];
303 char nodeName3[16], nodeName4[16], rotMatNum[16];
306 new TBRIK("S_TOF_B","TOF box","void",
307 fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenB()*0.5);
308 new TBRIK("S_TOF_C","TOF box","void",
309 fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenB()*0.5);
311 new TBRIK("S_TOF_A","TOF box","void",
312 fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenA()*0.5);
314 for (Int_t nodeNum=1;nodeNum<19;nodeNum++){
317 sprintf(rotMatNum,"rot50%i",nodeNum);
318 sprintf(nodeName0,"FTO00%i",nodeNum);
319 sprintf(nodeName1,"FTO10%i",nodeNum);
320 sprintf(nodeName2,"FTO20%i",nodeNum);
321 sprintf(nodeName3,"FTO30%i",nodeNum);
322 sprintf(nodeName4,"FTO40%i",nodeNum);
325 sprintf(rotMatNum,"rot5%i",nodeNum);
326 sprintf(nodeName0,"FTO0%i",nodeNum);
327 sprintf(nodeName1,"FTO1%i",nodeNum);
328 sprintf(nodeName2,"FTO2%i",nodeNum);
329 sprintf(nodeName3,"FTO3%i",nodeNum);
330 sprintf(nodeName4,"FTO4%i",nodeNum);
333 new TRotMatrix(rotMatNum,rotMatNum,90,-20*nodeNum,90,90-20*nodeNum,0,0);
334 ang = (4.5-nodeNum) * kangle;
338 node = new TNode(nodeName2,nodeName2,"S_TOF_B", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang), zOffsetB,rotMatNum);
339 node->SetLineColor(kColorTOF);
343 node = new TNode(nodeName3,nodeName3,"S_TOF_C", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang),-zOffsetB,rotMatNum);
344 node->SetLineColor(kColorTOF);
349 node = new TNode(nodeName4,nodeName4,"S_TOF_A", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang), zOffsetA,rotMatNum);
350 node->SetLineColor(kColorTOF);
352 } // end loop on nodeNum
356 //_____________________________________________________________________________
357 void AliTOFv5T0::CreateGeometry()
360 // Create geometry for Time Of Flight version 0
364 <img src="picts/AliTOFv5T0.gif">
368 // Creates common geometry
370 AliTOF::CreateGeometry();
374 //_____________________________________________________________________________
375 void AliTOFv5T0::TOFpc(Float_t xtof, Float_t ytof, Float_t zlenA,
379 // Definition of the Time Of Fligh Resistive Plate Chambers
382 const Float_t kPi = TMath::Pi();
384 const Float_t kInterCentrModBorder1 = 49.5;
385 const Float_t kInterCentrModBorder2 = 57.5;
386 const Float_t kExterInterModBorder1 = 196.0;
387 const Float_t kExterInterModBorder2 = 203.5;
389 const Float_t kLengthExInModBorder = 4.7;
390 const Float_t kLengthInCeModBorder = 7.0;
392 // Al layers over all internal module walls (cm)
393 const Float_t khAlWall = 0.03;
395 // module wall thickness (cm)
396 const Float_t kModuleWallThickness = 0.3;
398 // Al honeycomb layer between strips and cards (cm)
399 const Float_t kHoneycombLayerThickness = 1.5;
401 AliDebug(2,Form("zlenA*0.5 = %d", zlenA*0.5));
402 AliDebug(1, "************************* TOF geometry **************************");
404 // Definition of the Time Of Fligh Resistive Plate Chambers
405 // xFLT, yFLT, zFLT - sizes of TOF modules (large)
407 Float_t xcoor, ycoor, zcoor;
409 Int_t *idtmed = fIdtmed->GetArray()-499;
414 par[2] = zlenA * 0.5;
415 gMC->Gsvolu("FTOA", "BOX ", idtmed[503], par, 3); // fibre glass
420 par[2] = (zlenA*0.5 - kInterCentrModBorder1)*0.5;
421 gMC->Gsvolu("FTOB", "BOX ", idtmed[503], par, 3); // fibre glass
422 gMC->Gsvolu("FTOC", "BOX ", idtmed[503], par, 3); // fibre glass
425 // Positioning of fibre glass modules (FTOA, FTOB and FTOC)
427 //AliMatrix(idrotm[0], 90., 0., 0., 0., 90.,-90.);
428 AliMatrix(idrotm[0], 90., 0., 0., 0., 90.,270.);
433 for(Int_t isec=0;isec<18;isec++){
434 if(fTOFSectors[isec]==-1)continue;
436 sprintf(name, "BTOF%d",isec);
437 if (fTOFHoles && (isec==11||isec==12)) {
438 // if (fTOFHoles && (isec==16||isec==17)) { \\Old 6h convention
440 ycoor = (zlenA*0.5 + kInterCentrModBorder1)*0.5;
442 gMC->Gspos("FTOB", 0, name, xcoor, ycoor, zcoor, idrotm[0], "ONLY");
443 gMC->Gspos("FTOC", 0, name, xcoor,-ycoor, zcoor, idrotm[0], "ONLY");
445 else gMC->Gspos("FTOA", 0,name, xcoor, ycoor, zcoor, idrotm[0], "ONLY");
447 // Large not sensitive volumes with Insensitive Freon (FLTA, FLTB and FLTC)
449 Float_t xFLT, yFLT, zFLTA;
451 xFLT = xtof - kModuleWallThickness*2.;
452 yFLT = ytof - kModuleWallThickness*2.;
453 zFLTA = zlenA - kModuleWallThickness*2.;
458 gMC->Gsvolu("FLTA", "BOX ", idtmed[507], par, 3); // Freon mix
463 gMC->Gspos ("FLTA", 0, "FTOA", xcoor, ycoor, zcoor, 0, "ONLY");
468 par[2] = (zlenA*0.5 - kInterCentrModBorder1-kModuleWallThickness)*0.5;
469 gMC->Gsvolu("FLTB", "BOX ", idtmed[507], par, 3); // Freon mix
470 gMC->Gsvolu("FLTC", "BOX ", idtmed[507], par, 3); // Freon mix
474 zcoor = kModuleWallThickness*0.5;
475 gMC->Gspos ("FLTB", 0, "FTOB", xcoor, ycoor, zcoor, 0, "ONLY");
476 gMC->Gspos ("FLTC", 0, "FTOC", xcoor, ycoor,-zcoor, 0, "ONLY");
479 // Layer of Aluminum before detector (FALA, FALB and FALC)
482 par[1] = khAlWall*0.5;
483 par[2] = kInterCentrModBorder1 - (kModuleWallThickness + khAlWall);
484 gMC->Gsvolu("FALA", "BOX ", idtmed[505], par, 3); // Alluminium
487 ycoor = (-yFLT + khAlWall)*0.5;
489 gMC->Gspos ("FALA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
492 par[1] = khAlWall*0.5;
493 par[2] = (kExterInterModBorder2 - kInterCentrModBorder1 - 2.*(kModuleWallThickness + khAlWall))*0.5;
494 gMC->Gsvolu("FALB", "BOX ", idtmed[505], par, 3); // Alluminium
497 ycoor = (-yFLT + khAlWall)*0.5;
498 zcoor = (kExterInterModBorder2 + kInterCentrModBorder1)*0.5;
499 gMC->Gspos ("FALB", 1, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
500 gMC->Gspos ("FALB", 2, "FLTA", xcoor, ycoor,-zcoor, 0, "ONLY");
503 par[1] = khAlWall*0.5;
504 par[2] = (zlenA*0.5 - kExterInterModBorder2 - 2.*(kModuleWallThickness + khAlWall))*0.5;
505 gMC->Gsvolu("FALC", "BOX ", idtmed[505], par, 3); // Alluminium
508 ycoor = (-yFLT + khAlWall)*0.5;
509 zcoor = (kExterInterModBorder2+zlenA*0.5)*0.5;
510 gMC->Gspos ("FALC", 1, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
511 gMC->Gspos ("FALC", 2, "FLTA", xcoor, ycoor,-zcoor, 0, "ONLY");
515 ycoor = (-yFLT + khAlWall)*0.5;
516 zcoor = (zlenA*0.5 - kExterInterModBorder2)*0.5 - kModuleWallThickness*0.5;
517 gMC->Gspos ("FALB", 1, "FLTB", xcoor, ycoor, zcoor, 0, "ONLY");
518 gMC->Gspos ("FALB", 2, "FLTC", xcoor, ycoor,-zcoor, 0, "ONLY");
521 ycoor = (-yFLT + khAlWall)*0.5;
522 zcoor = (kExterInterModBorder2 - kInterCentrModBorder1)*0.5 + kModuleWallThickness*0.5;
523 gMC->Gspos ("FALC", 1, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
524 gMC->Gspos ("FALC", 2, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
527 Float_t y0, alpha, tgal, beta, tgbe, trpa[11];
529 // Fibre glass walls between central and intermediate modules (FWZ1 and FWZ2; holes -> FZ1B, FZ1C, FZ2B)
531 tgal = (yFLT*0.5 - 2.*kLengthInCeModBorder)/(kInterCentrModBorder2 - kInterCentrModBorder1);
532 alpha = TMath::ATan(tgal);
533 beta = (kPi*0.5 - alpha)*0.5;
534 tgbe = TMath::Tan(beta);
538 trpa[3] = kModuleWallThickness;
539 trpa[4] = (kLengthInCeModBorder - kModuleWallThickness*tgbe)*0.5;
540 trpa[5] = (kLengthInCeModBorder + kModuleWallThickness*tgbe)*0.5;
541 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
542 trpa[7] = kModuleWallThickness;
543 trpa[8] = (kLengthInCeModBorder - kModuleWallThickness*tgbe)*0.5;
544 trpa[9] = (kLengthInCeModBorder + kModuleWallThickness*tgbe)*0.5;
545 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
546 gMC->Gsvolu("FWZ1","TRAP", idtmed[503], trpa, 11); // fibre glass
548 AliMatrix (idrotm[1],90., 90.,180.,0.,90.,180.);
549 AliMatrix (idrotm[4],90., 90., 0.,0.,90., 0.);
552 ycoor = -yFLT*0.5 + kLengthInCeModBorder*0.5;
553 zcoor = kInterCentrModBorder1;
554 gMC->Gspos("FWZ1", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[1],"ONLY");
555 gMC->Gspos("FWZ1", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[4],"ONLY");
558 y0 = kLengthInCeModBorder - kModuleWallThickness*0.5*tgbe;
562 trpa[3] = kModuleWallThickness*0.5;
563 trpa[4] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
564 trpa[5] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
565 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
566 trpa[7] = kModuleWallThickness*0.5;
567 trpa[8] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
568 trpa[9] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
569 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
570 gMC->Gsvolu("FZ1B","TRAP", idtmed[503], trpa, 11); // fibre glass
573 ycoor = -yFLT*0.5 + kLengthInCeModBorder*0.5 - kModuleWallThickness*0.25*tgbe;
574 zcoor = -kInterCentrModBorder1 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
575 gMC->Gspos("FZ1B", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[4],"ONLY");
576 gMC->Gspos("FZ1B", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[1],"ONLY");
579 AliMatrix (idrotm[2],90.,270., 0.,0.,90.,180.);
580 AliMatrix (idrotm[5],90.,270.,180.,0.,90., 0.);
583 ycoor = -kLengthInCeModBorder*0.5;
584 zcoor = kInterCentrModBorder2;
585 gMC->Gspos("FWZ1", 3,"FLTA", xcoor, ycoor, zcoor,idrotm[2],"ONLY");
586 gMC->Gspos("FWZ1", 4,"FLTA", xcoor, ycoor,-zcoor,idrotm[5],"ONLY");
589 y0 = kLengthInCeModBorder + kModuleWallThickness*0.5*tgbe;
593 trpa[3] = kModuleWallThickness*0.5;
594 trpa[4] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
595 trpa[5] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
596 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
597 trpa[7] = kModuleWallThickness*0.5;
598 trpa[8] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
599 trpa[9] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
600 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
601 gMC->Gsvolu("FZ1C","TRAP", idtmed[503], trpa, 11); // fibre glass
604 ycoor = -kLengthInCeModBorder*0.5 - kModuleWallThickness*0.25*tgbe;
605 zcoor = -kInterCentrModBorder2 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
606 gMC->Gspos("FZ1C", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[5],"ONLY");
607 gMC->Gspos("FZ1C", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[2],"ONLY");
610 trpa[0] = 0.5*(kInterCentrModBorder2 - kInterCentrModBorder1)/TMath::Cos(alpha);
611 trpa[1] = kModuleWallThickness;
613 trpa[3] = -beta*kRaddeg;
616 gMC->Gsvolu("FWZ2","PARA", idtmed[503], trpa, 6); // fibre glass
618 AliMatrix (idrotm[3], alpha*kRaddeg,90.,90.+alpha*kRaddeg,90.,90.,180.);
619 AliMatrix (idrotm[6],180.-alpha*kRaddeg,90.,90.-alpha*kRaddeg,90.,90., 0.);
623 zcoor = (kInterCentrModBorder2 + kInterCentrModBorder1)*0.5;
624 gMC->Gspos("FWZ2", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[3],"ONLY");
625 gMC->Gspos("FWZ2", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[6],"ONLY");
628 trpa[0] = 0.5*(kInterCentrModBorder2 - kInterCentrModBorder1)/TMath::Cos(alpha);
629 trpa[1] = kModuleWallThickness*0.5;
631 trpa[3] = -beta*kRaddeg;
634 gMC->Gsvolu("FZ2B","PARA", idtmed[503], trpa, 6); // fibre glass
637 ycoor = -yFLT*0.25 - kModuleWallThickness*0.5*tgbe;
638 zcoor = -(kInterCentrModBorder2 + kInterCentrModBorder1)*0.5 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
639 gMC->Gspos("FZ2B", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[6],"ONLY");
640 gMC->Gspos("FZ2B", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[3],"ONLY");
643 // Fibre glass walls between intermediate and lateral modules (FWZ3 and FWZ4)
645 tgal = (yFLT*0.5 - 2.*kLengthExInModBorder)/(kExterInterModBorder2 - kExterInterModBorder1);
646 alpha = TMath::ATan(tgal);
647 beta = (kPi*0.5 - alpha)*0.5;
648 tgbe = TMath::Tan(beta);
652 trpa[3] = kModuleWallThickness;
653 trpa[4] = (kLengthExInModBorder - kModuleWallThickness*tgbe)*0.5;
654 trpa[5] = (kLengthExInModBorder + kModuleWallThickness*tgbe)*0.5;
655 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
656 trpa[7] = kModuleWallThickness;
657 trpa[8] = (kLengthExInModBorder - kModuleWallThickness*tgbe)*0.5;
658 trpa[9] = (kLengthExInModBorder + kModuleWallThickness*tgbe)*0.5;
659 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
660 gMC->Gsvolu("FWZ3","TRAP", idtmed[503], trpa, 11); // fibre glass
663 ycoor = -kLengthExInModBorder*0.5;
664 zcoor = kExterInterModBorder1;
665 gMC->Gspos("FWZ3", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[5],"ONLY");
666 gMC->Gspos("FWZ3", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[2],"ONLY");
670 ycoor = -kLengthExInModBorder*0.5;
671 zcoor = -kExterInterModBorder1 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
672 gMC->Gspos("FWZ3", 5,"FLTB", xcoor, ycoor, zcoor,idrotm[2],"ONLY");
673 gMC->Gspos("FWZ3", 6,"FLTC", xcoor, ycoor,-zcoor,idrotm[5],"ONLY");
677 ycoor = -yFLT*0.5 + kLengthExInModBorder*0.5;
678 zcoor = kExterInterModBorder2;
679 gMC->Gspos("FWZ3", 3,"FLTA", xcoor, ycoor, zcoor,idrotm[4],"ONLY");
680 gMC->Gspos("FWZ3", 4,"FLTA", xcoor, ycoor,-zcoor,idrotm[1],"ONLY");
684 ycoor = -yFLT*0.5 + kLengthExInModBorder*0.5;
685 zcoor = -kExterInterModBorder2 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
686 gMC->Gspos("FWZ3", 7,"FLTB", xcoor, ycoor, zcoor,idrotm[1],"ONLY");
687 gMC->Gspos("FWZ3", 8,"FLTC", xcoor, ycoor,-zcoor,idrotm[4],"ONLY");
690 trpa[0] = 0.5*(kExterInterModBorder2 - kExterInterModBorder1)/TMath::Cos(alpha);
691 trpa[1] = kModuleWallThickness;
693 trpa[3] = -beta*kRaddeg;
696 gMC->Gsvolu("FWZ4","PARA", idtmed[503], trpa, 6); // fibre glass
698 AliMatrix (idrotm[13],alpha*kRaddeg,90.,90.+alpha*kRaddeg,90.,90.,180.);
699 AliMatrix (idrotm[16],180.-alpha*kRaddeg,90.,90.-alpha*kRaddeg,90.,90.,0.);
703 zcoor = (kExterInterModBorder2 + kExterInterModBorder1)*0.5;
704 gMC->Gspos("FWZ4", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[16],"ONLY");
705 gMC->Gspos("FWZ4", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[13],"ONLY");
710 zcoor = -(kExterInterModBorder2 + kExterInterModBorder1)*0.5 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
711 gMC->Gspos("FWZ4", 3,"FLTB", xcoor, ycoor, zcoor,idrotm[13],"ONLY");
712 gMC->Gspos("FWZ4", 4,"FLTC", xcoor, ycoor,-zcoor,idrotm[16],"ONLY");
716 ///////////////// Detector itself //////////////////////
718 const Int_t knx = fTOFGeometry->NpadX(); // number of pads along x
719 const Int_t knz = fTOFGeometry->NpadZ(); // number of pads along z
720 const Float_t kPadX = fTOFGeometry->XPad(); // pad length along x
721 const Float_t kPadZ = fTOFGeometry->ZPad(); // pad length along z
723 // new description for strip volume -double stack strip-
724 // -- all constants are expressed in cm
725 // heigth of different layers
726 const Float_t khhony = 1.0 ; // heigth of HONY Layer
727 const Float_t khpcby = 0.08 ; // heigth of PCB Layer
728 const Float_t khrgly = 0.055 ; // heigth of RED GLASS Layer
730 const Float_t khfiliy = 0.125 ; // heigth of FISHLINE Layer
731 const Float_t khglassy = 0.160*0.5; // heigth of GLASS Layer
732 const Float_t khglfy = khfiliy+2.*khglassy;// heigth of GLASS+FISHLINE Layer
734 const Float_t khcpcby = 0.16 ; // heigth of PCB Central Layer
735 const Float_t kwhonz = 8.1 ; // z dimension of HONEY Layer
736 const Float_t kwpcbz1 = 10.6 ; // z dimension of PCB Lower Layer
737 const Float_t kwpcbz2 = 11.6 ; // z dimension of PCB Upper Layer
738 const Float_t kwcpcbz = 12.4 ; // z dimension of PCB Central Layer
739 const Float_t kwrglz = 8. ; // z dimension of RED GLASS Layer
740 const Float_t kwglfz = 7. ; // z dimension of GLASS+FISHLN Layer
741 const Float_t klsensmx = knx*kPadX; // length of Sensitive Layer
742 const Float_t khsensmy = 0.05;//0.11;//0.16;// heigth of Sensitive Layer
743 const Float_t kwsensmz = knz*kPadZ; // width of Sensitive Layer
745 // heigth of the FSTR Volume (the strip volume)
746 const Float_t khstripy = 2.*khhony+2.*khpcby+4.*khrgly+2.*khglfy+khcpcby;
748 // width of the FSTR Volume (the strip volume)
749 const Float_t kwstripz = kwcpcbz;
750 // length of the FSTR Volume (the strip volume)
751 const Float_t klstripx = fTOFGeometry->StripLength();
753 Float_t parfp[3]={klstripx*0.5,khstripy*0.5,kwstripz*0.5};
754 // Coordinates of the strip center in the strip reference frame;
755 // used for positioning internal strip volumes
756 Float_t posfp[3]={0.,0.,0.};
758 // FSTR volume definition-filling this volume with non sensitive Gas Mixture
759 gMC->Gsvolu("FSTR","BOX",idtmed[507],parfp,3); // Freon mix
761 //-- HONY Layer definition
762 parfp[1] = khhony*0.5;
763 parfp[2] = kwhonz*0.5;
764 gMC->Gsvolu("FHON","BOX",idtmed[501],parfp,3); // honeycomb (Nomex)
765 // positioning 2 HONY Layers on FSTR volume
766 posfp[1] =-khstripy*0.5+parfp[1];
767 gMC->Gspos("FHON",1,"FSTR",0., posfp[1],0.,0,"ONLY");
768 gMC->Gspos("FHON",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
770 //-- PCB Layer definition
771 parfp[1] = khpcby*0.5;
772 parfp[2] = kwpcbz1*0.5;
773 gMC->Gsvolu("FPC1","BOX",idtmed[502],parfp,3); // G10
774 parfp[2] = kwpcbz2*0.5;
775 gMC->Gsvolu("FPC2","BOX",idtmed[502],parfp,3); // G10
776 // positioning 2 PCB Layers on FSTR volume
777 posfp[1] =-khstripy*0.5+khhony+parfp[1];
778 gMC->Gspos("FPC1",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
779 gMC->Gspos("FPC2",1,"FSTR",0., posfp[1],0.,0,"ONLY");
781 //-- central PCB layer definition
782 parfp[1] = khcpcby*0.5;
783 parfp[2] = kwcpcbz*0.5;
784 gMC->Gsvolu("FPCB","BOX",idtmed[502],parfp,3); // G10
785 // positioning the central PCB layer
786 gMC->Gspos("FPCB",1,"FSTR",0.,0.,0.,0,"ONLY");
789 Float_t parfs[3] = {klsensmx*0.5, khsensmy*0.5, kwsensmz*0.5};
790 gMC->Gsvolu("FSEN","BOX",idtmed[508],parfs,3); // sensitive ...
791 // dividing FSEN along z in knz=2 and along x in knx=48
792 gMC->Gsdvn("FSEZ","FSEN",knz,3);
793 gMC->Gsdvn("FPAD","FSEZ",knx,1);
794 // positioning a Sensitive layer inside FPCB
795 gMC->Gspos("FSEN",1,"FPCB",0.,0.,0.,0,"ONLY");
797 //-- RED GLASS Layer definition
798 parfp[1] = khrgly*0.5;
799 parfp[2] = kwrglz*0.5;
800 gMC->Gsvolu("FRGL","BOX",idtmed[509],parfp,3); // glass
801 // positioning 4 RED GLASS Layers on FSTR volume
802 posfp[1] = -khstripy*0.5+khhony+khpcby+parfp[1];
803 gMC->Gspos("FRGL",1,"FSTR",0., posfp[1],0.,0,"ONLY");
804 gMC->Gspos("FRGL",4,"FSTR",0.,-posfp[1],0.,0,"ONLY");
805 posfp[1] = (khcpcby+khrgly)*0.5;
806 gMC->Gspos("FRGL",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
807 gMC->Gspos("FRGL",3,"FSTR",0., posfp[1],0.,0,"ONLY");
809 //-- GLASS Layer definition
810 parfp[1] = khglassy*0.5;
811 parfp[2] = kwglfz*0.5;
812 gMC->Gsvolu("FGLA","BOX",idtmed[509],parfp,3); // glass
814 // positioning 4 GLASS Layers on FSTR volume
815 posfp[1] = -khstripy*0.5+khhony+khpcby+khrgly+parfp[1];
816 gMC->Gspos("FGLA",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
817 gMC->Gspos("FGLA",4,"FSTR",0., posfp[1],0.,0,"ONLY");
818 posfp[1] = khcpcby*0.5+khrgly+khglassy*0.5;
819 gMC->Gspos("FGLA",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
820 gMC->Gspos("FGLA",3,"FSTR",0., posfp[1],0.,0,"ONLY");
822 //-- FREON Layer definition
823 parfp[1] = khfiliy*0.5;
824 gMC->Gsvolu("FFIS","BOX",idtmed[507],parfp,3); // freon
826 // positioning 2 FREON Layers on FSTR volume
827 posfp[1] = -khstripy*0.5+khhony+khpcby+khrgly+khglassy+parfp[1];
828 gMC->Gspos("FFIS",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
829 gMC->Gspos("FFIS",2,"FSTR",0., posfp[1],0.,0,"ONLY");
832 //-- GLASS+FISHLINE Layer definition
833 parfp[1] = khglfy*0.5;
834 parfp[2] = kwglfz*0.5;
835 gMC->Gsvolu("FGLF","BOX",idtmed[504],parfp,3);
837 // positioning 2 GLASS+FISHLINE Layers on FSTR volume
838 posfp[1] = (khcpcby+khglfy)*0.5+khrgly;
839 gMC->Gspos("FGLF",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
840 gMC->Gspos("FGLF",2,"FSTR",0., posfp[1],0.,0,"ONLY");
843 // Positioning the Strips (FSTR) in the FLT volumes
844 Int_t maxStripNumbers [5] ={fTOFGeometry->NStripC(),
845 fTOFGeometry->NStripB(),
846 fTOFGeometry->NStripA(),
847 fTOFGeometry->NStripB(),
848 fTOFGeometry->NStripC()};
850 Int_t totalStrip = 0;
851 Float_t xpos, zpos, ypos, ang;
852 for(Int_t iplate =0; iplate < fTOFGeometry->NPlates(); iplate++){
853 if (iplate>0) totalStrip += maxStripNumbers[iplate-1];
854 for(Int_t istrip =0; istrip < maxStripNumbers[iplate]; istrip++){
856 ang = fTOFGeometry->GetAngles(iplate,istrip);
857 AliDebug(1, Form(" iplate = %1i, istrip = %2i ---> ang = %f", iplate, istrip, ang));
859 if (ang>0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.+ang,90., ang, 90.);
860 else if (ang==0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.,90., 0., 0.);
861 else if (ang<0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.+ang,90.,-ang,270.);
864 zpos = fTOFGeometry->GetDistances(iplate,istrip);
865 ypos = fTOFGeometry->GetHeights(iplate,istrip);
867 gMC->Gspos("FSTR",istrip+totalStrip+1,"FLTA", xpos, ypos,-zpos,idrotm[istrip+totalStrip+1], "ONLY");
870 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");
871 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");
876 // 1.5 cm Al honeycomb layer between strips and cards
878 par[1] = kHoneycombLayerThickness*0.5;
880 gMC->Gsvolu("FPEA", "BOX ", idtmed[506], par, 3); // Al honeycomb
883 ycoor = kHoneycombLayerThickness*0.5;
885 gMC->Gspos ("FPEA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
889 par[1] = kHoneycombLayerThickness*0.5;
890 par[2] = (zlenA*0.5 - kInterCentrModBorder2-kModuleWallThickness)*0.5;
891 gMC->Gsvolu("FPEB", "BOX ", idtmed[506], par, 3); // Al honeycomb
894 ycoor = kHoneycombLayerThickness*0.5;
895 zcoor = (kInterCentrModBorder2-kInterCentrModBorder1)*0.5;
896 gMC->Gspos ("FPEB", 1, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
897 gMC->Gspos ("FPEB", 2, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
902 par[1] = (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
904 gMC->Gsvolu("FAIA", "BOX ", idtmed[500], par, 3); // Air
907 ycoor = kHoneycombLayerThickness + (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
909 gMC->Gspos ("FAIA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
913 par[1] = (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
914 par[2] = (zlenA*0.5 - kInterCentrModBorder2 - kModuleWallThickness)*0.5;
915 gMC->Gsvolu("FAIB", "BOX ", idtmed[500], par, 3); // Air
916 gMC->Gsvolu("FAIC", "BOX ", idtmed[500], par, 3); // Air
919 ycoor = kHoneycombLayerThickness + (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
920 zcoor = (kInterCentrModBorder2-kInterCentrModBorder1)*0.5;
921 gMC->Gspos ("FAIB", 0, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
922 gMC->Gspos ("FAIC", 0, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
925 // start with cards and cooling tubes
926 // finally, cards, cooling tubes and layer for thermal dispersion
929 // see GEOM200 in GEANT manual
933 // card volume definition
934 cardpar[0]= xFLT*0.5;
937 gMC->Gsvolu("FCAR", "BOX ", idtmed[502], cardpar, 3); // PCB Card
939 //alu plate volume definition
942 gMC->Gsvolu("FALP", "BOX ", idtmed[505], cardpar, 3); // Alu Plate
944 // tube volume definition
949 gMC->Gsvolu("FTUB", "TUBE", idtmed[511], tubepar, 3); // cooling tubes (steel)
954 gMC->Gsvolu("FITU", "TUBE", idtmed[510], tubepar, 3); // cooling water
955 // positioning water tube into the steel one
956 gMC->Gspos("FITU",1,"FTUB",0.,0.,0.,0,"ONLY");
959 AliMatrix(idrotm[99], 180., 90., 90., 90., 90., 0.);
961 // central module positioning
962 Float_t cardpos[3], aplpos2;
963 Float_t stepforcardA = 6.625;
965 Float_t aplpos1 = -2.;
970 // tubepos= -53.+tdis;
972 for (icard=39; icard<54; ++icard) {
973 cardpos[2]= cardpos[2]+stepforcardA;
974 aplpos2 = cardpos[2]+0.15;
975 gMC->Gspos("FCAR",icard,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
976 gMC->Gspos("FALP",icard,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
977 gMC->Gspos("FTUB",icard,"FAIA", 0.,cardpos[1],cardpos[2]+tdis,idrotm[99],"ONLY");
980 // intermediate module positioning
981 Float_t stepforcardB= 7.05;
985 for (icard=20; icard<39; ++icard) {
986 cardpos[2]= cardpos[2]+stepforcardB;
987 aplpos2 = cardpos[2]+0.15;
989 gMC->Gspos("FCAR",icard+34,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
990 gMC->Gspos("FALP",icard+34,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
991 gMC->Gspos("FTUB",icard+34,"FAIA", 0.,cardpos[1], cardpos[2]+tdis,idrotm[99],"ONLY");
992 gMC->Gspos("FCAR",58-icard,"FAIA",cardpos[0],cardpos[1], -cardpos[2], 0,"ONLY");
993 gMC->Gspos("FALP",58-icard,"FAIA",cardpos[0], aplpos1, -aplpos2, 0,"ONLY");
994 gMC->Gspos("FTUB",58-icard,"FAIA", 0.,cardpos[1],-cardpos[2]-tdis,idrotm[99],"ONLY");
997 gMC->Gspos("FCAR",icard+34+182,"FAIC",cardpos[0],cardpos[1], cardpos[2]-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
998 gMC->Gspos("FALP",icard+34+182,"FAIC",cardpos[0], aplpos1, aplpos2-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
999 gMC->Gspos("FTUB",icard+34+182,"FAIC", 0.,cardpos[1], cardpos[2]+tdis-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
1000 gMC->Gspos("FCAR",58-icard+ 91,"FAIB",cardpos[0],cardpos[1], -cardpos[2]+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1001 gMC->Gspos("FALP",58-icard+ 91,"FAIB",cardpos[0], aplpos1, -aplpos2+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1002 gMC->Gspos("FTUB",58-icard+ 91,"FAIB", 0.,cardpos[1],-cardpos[2]-tdis+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
1007 // outer module positioning
1008 Float_t stepforcardC= 8.45238;
1011 for (icard=1; icard<20; ++icard) {
1012 cardpos[2]= cardpos[2]+stepforcardC;
1013 aplpos2 = cardpos[2]+0.15;
1015 gMC->Gspos("FCAR",icard+72,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
1016 gMC->Gspos("FALP",icard+72,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
1017 gMC->Gspos("FTUB",icard+72,"FAIA", 0.,cardpos[1], cardpos[2]+tdis,idrotm[99],"ONLY");
1018 gMC->Gspos("FCAR",20-icard,"FAIA",cardpos[0],cardpos[1], -cardpos[2], 0,"ONLY");
1019 gMC->Gspos("FALP",20-icard,"FAIA",cardpos[0], aplpos1, -aplpos2, 0,"ONLY");
1020 gMC->Gspos("FTUB",20-icard,"FAIA", 0.,cardpos[1],-cardpos[2]-tdis,idrotm[99],"ONLY");
1023 gMC->Gspos("FCAR",icard+72+182,"FAIC",cardpos[0],cardpos[1], cardpos[2]-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1024 gMC->Gspos("FALP",icard+72+182,"FAIC",cardpos[0], aplpos1, aplpos2-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1025 gMC->Gspos("FTUB",icard+72+182,"FAIC", 0.,cardpos[1], cardpos[2]+tdis-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
1026 gMC->Gspos("FCAR",20-icard+ 91,"FAIB",cardpos[0],cardpos[1], -cardpos[2]+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1027 gMC->Gspos("FALP",20-icard+ 91,"FAIB",cardpos[0], aplpos1, -aplpos2+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1028 gMC->Gspos("FTUB",20-icard+ 91,"FAIB", 0.,cardpos[1],-cardpos[2]-tdis+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
1033 //_____________________________________________________________________________
1034 void AliTOFv5T0::DrawModule() const
1037 // Draw a shaded view of the Time Of Flight version 4
1040 // Set everything unseen
1041 gMC->Gsatt("*", "seen", -1);
1044 //Set volumes visible
1047 //Set ALIC mother transparent
1048 gMC->Gsatt("ALIC","SEEN", 0);
1051 // Level 1 for TOF volumes
1052 gMC->Gsatt("B077","seen", 0);
1055 // Level 2 for TOF volumes
1056 gMC->Gsatt("B071","seen", 0);
1057 gMC->Gsatt("B074","seen", 0);
1058 gMC->Gsatt("B075","seen", 0);
1059 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
1060 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
1063 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
1064 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
1065 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
1066 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
1067 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
1069 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
1070 gMC->Gsatt("BTO1","seen", 0);
1073 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
1074 gMC->Gsatt("BTO2","seen", 0);
1077 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
1078 gMC->Gsatt("BTO3","seen", 0);
1080 // Level 3 of B071, B074 and B075
1081 gMC->Gsatt("FTOA","SEEN", 0);
1082 if (fTOFHoles) gMC->Gsatt("FTOB","SEEN", 0);
1084 // Level 4 of B071, B074 and B075
1085 gMC->Gsatt("FLTA","SEEN", 0);
1086 if (fTOFHoles) gMC->Gsatt("FLTB","SEEN",0);
1087 if (fTOFHoles) gMC->Gsatt("FLTC","SEEN",0);
1089 // Level 5 of B071, B074 and B075
1090 gMC->Gsatt("FAIA","SEEN",-1); // all FAIA sub-levels skipped -
1091 if (fTOFHoles) gMC->Gsatt("FAIB","SEEN",-1); // all FAIB sub-levels skipped -
1092 if (fTOFHoles) gMC->Gsatt("FAIC","SEEN",-1); // all FAIC sub-levels skipped -
1094 gMC->Gsatt("FALA","SEEN", 0);
1095 if (fTOFHoles) gMC->Gsatt("FALB","SEEN", 0);
1097 gMC->Gsatt("FPEA","SEEN", 1);
1098 if (fTOFHoles) gMC->Gsatt("FPEB","SEEN", 1);
1100 gMC->Gsatt("FSTR","SEEN",-1); // all FSTR sub-levels skipped -
1102 gMC->Gsatt("FWZ1","SEEN", 0);
1103 gMC->Gsatt("FWZ2","SEEN", 0);
1104 gMC->Gsatt("FWZ3","SEEN", 0);
1105 gMC->Gsatt("FWZ4","SEEN", 0);
1107 gMC->Gsatt("FZ1B","SEEN", 0);
1108 gMC->Gsatt("FZ1C","SEEN", 0);
1109 gMC->Gsatt("FZ2B","SEEN", 0);
1112 gMC->Gdopt("hide", "on");
1113 gMC->Gdopt("shad", "on");
1114 gMC->Gsatt("*", "fill", 7);
1115 gMC->SetClipBox(".");
1116 gMC->SetClipBox("*", 100, 1000, 100, 1000, 100, 1000);
1117 gMC->DefaultRange();
1118 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
1119 gMC->Gdhead(1111, "Time Of Flight");
1120 gMC->Gdman(18, 3, "MAN");
1121 gMC->Gdopt("hide","off");
1123 //_____________________________________________________________________________
1124 void AliTOFv5T0::DrawDetectorModules() const
1127 // Draw a shaded view of the TOF detector version 4
1130 // Set everything unseen
1131 gMC->Gsatt("*", "seen", -1);
1134 //Set volumes visible
1137 //Set ALIC mother transparent
1138 gMC->Gsatt("ALIC","SEEN", 0);
1141 // Level 1 for TOF volumes
1142 gMC->Gsatt("B077","seen", 0);
1145 // Level 2 for TOF volumes
1146 gMC->Gsatt("B071","seen", 0);
1147 gMC->Gsatt("B074","seen", 0);
1148 gMC->Gsatt("B075","seen", 0);
1149 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
1150 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
1153 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
1154 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
1155 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
1156 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
1157 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
1159 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
1160 gMC->Gsatt("BTO1","seen", 0);
1163 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
1164 gMC->Gsatt("BTO2","seen", 0);
1167 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
1168 gMC->Gsatt("BTO3","seen", 0);
1170 // Level 3 of B071, B075 and B074
1171 gMC->Gsatt("FTOA","seen",-2); // all FTOA sub-levels skipped -
1173 gMC->Gsatt("FTOB","seen",-2); // all FTOB sub-levels skipped -
1174 gMC->Gsatt("FTOC","seen",-2); // all FTOC sub-levels skipped -
1177 gMC->Gdopt("hide","on");
1178 gMC->Gdopt("shad","on");
1179 gMC->Gsatt("*", "fill", 5);
1180 gMC->SetClipBox(".");
1181 gMC->SetClipBox("*", 100, 1000, 100, 1000, 0, 1000);
1182 gMC->DefaultRange();
1183 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
1184 gMC->Gdhead(1111,"TOF detector");
1185 gMC->Gdman(18, 3, "MAN");
1186 gMC->Gdopt("hide","off");
1189 //_____________________________________________________________________________
1190 void AliTOFv5T0::DrawDetectorStrips() const
1193 // Draw a shaded view of the TOF strips for version 4
1196 // Set everything unseen
1197 gMC->Gsatt("*", "seen", -1);
1200 //Set volumes visible
1203 //Set ALIC mother transparent
1204 gMC->Gsatt("ALIC","SEEN", 0);
1207 // Level 1 for TOF volumes
1208 gMC->Gsatt("B077","seen", 0);
1211 // Level 2 for TOF volumes
1212 gMC->Gsatt("B071","seen", 0);
1213 gMC->Gsatt("B074","seen", 0);
1214 gMC->Gsatt("B075","seen", 0);
1215 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
1216 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
1219 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
1220 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
1221 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
1222 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
1223 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
1225 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
1226 gMC->Gsatt("BTO1","seen", 0);
1229 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
1230 gMC->Gsatt("BTO2","seen", 0);
1233 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
1234 gMC->Gsatt("BTO3","seen", 0);
1236 // Level 3 of B071, B074 and B075
1237 gMC->Gsatt("FTOA","SEEN", 0);
1239 gMC->Gsatt("FTOB","SEEN", 0);
1240 gMC->Gsatt("FTOC","SEEN", 0);
1243 // Level 4 of B071, B074 and B075
1244 gMC->Gsatt("FLTA","SEEN", 0);
1246 gMC->Gsatt("FLTB","SEEN", 0);
1247 gMC->Gsatt("FLTC","SEEN", 0);
1250 // Level 5 of B071, B074 and B075
1251 gMC->Gsatt("FAIA","SEEN",-1); // all FAIA sub-levels skipped -
1253 gMC->Gsatt("FAIB","SEEN",-1); // all FAIB sub-levels skipped -
1254 gMC->Gsatt("FAIC","SEEN",-1); // all FAIC sub-levels skipped -
1257 gMC->Gsatt("FALA","SEEN", 0);
1258 if (fTOFHoles) gMC->Gsatt("FALB","SEEN", 0);
1260 gMC->Gsatt("FPEA","SEEN", 0);
1261 if (fTOFHoles) gMC->Gsatt("FPEB","SEEN", 0);
1263 gMC->Gsatt("FSTR","SEEN",-2); // all FSTR sub-levels skipped -
1265 gMC->Gsatt("FWZ1","SEEN", 0);
1266 gMC->Gsatt("FWZ2","SEEN", 0);
1267 gMC->Gsatt("FWZ3","SEEN", 0);
1268 gMC->Gsatt("FWZ4","SEEN", 0);
1270 gMC->Gsatt("FZ1B","SEEN", 0);
1271 gMC->Gsatt("FZ1C","SEEN", 0);
1272 gMC->Gsatt("FZ2B","SEEN", 0);
1279 gMC->Gsatt("FALP","SEEN",0);
1280 gMC->Gsatt("FCAR","SEEN",0);
1281 gMC->Gsatt("FTUB","SEEN",-1); // all FTUB sub-levels skipped -
1284 gMC->Gsatt("FITU","SEEN",0);
1289 gMC->Gsatt("FGLF","SEEN",0);
1290 gMC->Gsatt("FHON","SEEN",0);
1291 gMC->Gsatt("FPC1","SEEN",0);
1292 gMC->Gsatt("FPC2","SEEN",0);
1293 gMC->Gsatt("FPCB","SEEN",0);
1294 gMC->Gsatt("FRGL","SEEN",0);
1296 // Level 2 of FPCB => Level 3 of FSTR
1297 gMC->Gsatt("FSEN","SEEN",0);
1298 gMC->Gsatt("FSEZ","SEEN",0);
1299 gMC->Gsatt("FPAD","SEEN",1);
1302 gMC->Gdopt("hide","on");
1303 gMC->Gdopt("shad","on");
1304 gMC->Gsatt("*", "fill", 5);
1305 gMC->SetClipBox(".");
1306 gMC->SetClipBox("*", 0, 1000, 0, 1000, 0, 1000);
1307 gMC->DefaultRange();
1308 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
1309 gMC->Gdhead(1111,"TOF Strips");
1310 gMC->Gdman(18, 3, "MAN");
1311 gMC->Gdopt("hide","off");
1314 //_____________________________________________________________________________
1315 void AliTOFv5T0::CreateMaterials()
1318 // Define materials for the Time Of Flight
1321 //AliTOF::CreateMaterials();
1323 AliMagF *magneticField = (AliMagF*)gAlice->Field();
1325 Int_t isxfld = magneticField->Integ();
1326 Float_t sxmgmx = magneticField->Max();
1328 Float_t we[7], ae[7], na[7], fr[7], vl[7];
1331 //--- Quartz (SiO2) to simulate float glass
1332 // density tuned to have correct float glass
1334 Float_t aq[2] = { 28.0855,15.9994 };
1335 Float_t zq[2] = { 14.,8. };
1336 Float_t wq[2] = { 1.,2. };
1337 Float_t dq = 2.55; // std value: 2.2
1341 Float_t anox[4] = {12.01,1.01,16.00,14.01};
1342 Float_t znox[4] = { 6., 1., 8., 7.};
1343 Float_t wnox[4] = {14., 22., 2., 2.};
1344 Float_t dnox = 0.048;
1348 Float_t ag10[4] = {28.09,12.01,1.01,16.00};
1349 Float_t zg10[4] = {14., 6., 1., 8.};
1352 for (i = 0; i < nlmatg10; ++i) {
1368 MaterialMixer(we,ae,na,fr,vl,5);
1374 Float_t densg10 = 1.7;
1377 Float_t awa[2] = { 1., 16. };
1378 Float_t zwa[2] = { 1., 8. };
1379 Float_t wwa[2] = { 2., 1. };
1384 Float_t asteel[4] = { 55.847,51.9961,58.6934,28.0855 };
1385 Float_t zsteel[4] = { 26.,24.,28.,14. };
1386 Float_t wsteel[4] = { .715,.18,.1,.005 };
1389 Float_t aAir[4]={12.0107,14.0067,15.9994,39.948};
1390 Float_t zAir[4]={6.,7.,8.,18.};
1391 Float_t wAir[4]={0.000124,0.755267,0.231781,0.012827};
1392 Float_t dAir = 1.20479E-3;
1395 Float_t afg[4] = {28.09,16.00,12.01,1.01};
1396 Float_t zfg[4] = {14., 8., 6., 1.};
1397 Float_t wfg[4] = {0.12906,0.29405,0.51502,0.06187};
1398 Float_t dfg = 1.111;
1401 // --- Freon C2F4H2 + SF6
1402 Float_t afre[4]= {12.01,1.01,19.00,32.07};
1403 Float_t zfre[4]= { 6., 1., 9., 16.};
1404 Float_t wfre[4]= {0.21250,0.01787,0.74827,0.021355};
1405 Float_t densfre= 0.00375;
1408 //char namat[15] = " ";
1409 //Float_t ama[2], zma[2], dma, radl, absl, buf[1];
1412 AliMixture ( 0, "Air$", aAir, zAir, dAir, 4, wAir);
1413 AliMixture ( 1, "Nomex$", anox, znox, dnox, nnox, wnox);
1414 AliMixture ( 2, "G10$", ag10, zg10, densg10, nlmatg10, wmatg10);
1415 AliMixture ( 3, "fibre glass$", afg, zfg, dfg, nfg, wfg);
1416 AliMaterial( 4, "Al $", 26.98, 13., 2.7, 8.9, 37.2);
1417 AliMaterial( 5, "Al honeycomb$", 26.98, 13., 0.0496, 483., 2483.);
1418 AliMixture ( 6, "Freon$", afre, zfre, densfre, nfre, wfre);
1419 AliMixture ( 7, "Glass$", aq, zq, dq, nq, wq);
1421 // get freon and glass
1422 gMC->Gfmate((*fIdmate)[6],namat,ama[0],zma[0],dma,radl,absl,buf,nbuf);
1423 gMC->Gfmate((*fIdmate)[7],namat,ama[1],zma[1],dma,radl,absl,buf,nbuf);
1426 Float_t wgfr[2]= {0.0011,0.9989};
1427 Float_t dgfr = 1.434;
1429 AliMixture ( 8, "glass-freon$", ama, zma, dgfr, ngfr, wgfr);
1431 AliMixture ( 9, "Water$", awa, zwa, dwa, nwa, wwa);
1432 AliMixture (10, "STAINLESS STEEL$", asteel, zsteel, 7.88, 4, wsteel);
1434 Float_t epsil, stmin, deemax, stemax;
1437 // EPSIL = 0.1 ! Tracking precision,
1438 // STEMAX = 0.1 ! Maximum displacement for multiple scattering
1439 // DEEMAX = 0.1 ! Maximum fractional energy loss, DLS
1443 epsil = .001; // Tracking precision,
1444 stemax = -1.; // Maximum displacement for multiple scattering
1445 deemax = -.3; // Maximum fractional energy loss, DLS
1448 AliMedium( 1, "Air$", 0, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1449 AliMedium( 2,"Nomex$", 1, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1450 AliMedium( 3,"G10$", 2, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1451 AliMedium( 4,"fibre glass$", 3, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1452 //AliMedium( 5,"glass-freon$", 8, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1453 AliMedium( 6,"Al Frame$", 4, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1454 AliMedium( 7,"Al honeycomb$", 5, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1455 AliMedium( 8,"Fre$", 6, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1456 AliMedium( 9,"PCB-S$", 2, 1, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1457 AliMedium(10,"Glass$", 7, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1458 AliMedium(11,"Water$", 9, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1459 AliMedium(12,"STEEL$", 10, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1462 //_____________________________________________________________________________
1463 void AliTOFv5T0::Init()
1466 // Initialise the detector after the geometry has been defined
1468 AliDebug(1, "**************************************"
1470 "**************************************");
1471 AliDebug(1, " Version 4 of TOF initialing, "
1472 "symmetric TOF - Full Coverage version");
1476 fIdFTOA = gMC->VolId("FTOA");
1478 fIdFTOB = gMC->VolId("FTOB");
1479 fIdFTOC = gMC->VolId("FTOC");
1481 fIdFLTA = gMC->VolId("FLTA");
1483 fIdFLTB = gMC->VolId("FLTB");
1484 fIdFLTC = gMC->VolId("FLTC");
1487 AliDebug(1, "**************************************"
1489 "**************************************");
1492 //_____________________________________________________________________________
1493 void AliTOFv5T0::StepManager()
1497 // Procedure called at each step in the Time Of Flight
1500 TLorentzVector mom, pos;
1501 Float_t xm[3],pm[3],xpad[3],ppad[3];
1504 Int_t sector, plate, padx, padz, strip;
1505 Int_t copy, padzid, padxid, stripid, i;
1506 Int_t *idtmed = fIdtmed->GetArray()-499;
1507 Float_t incidenceAngle;
1509 const char* volpath;
1514 gMC->IsTrackEntering()
1515 && gMC->TrackCharge()
1516 //&& gMC->GetMedium()==idtmed[508]
1517 && gMC->CurrentMedium()==idtmed[508]
1518 && gMC->CurrentVolID(copy)==fIdSens
1522 AliMC *mcApplication = (AliMC*)gAlice->GetMCApp();
1524 AddTrackReference(mcApplication->GetCurrentTrackNumber());
1525 //AddTrackReference(gAlice->GetMCApp()->GetCurrentTrackNumber());
1527 // getting information about hit volumes
1529 padzid=gMC->CurrentVolOffID(1,copy);
1533 padxid=gMC->CurrentVolOffID(0,copy);
1537 stripid=gMC->CurrentVolOffID(4,copy);
1541 gMC->TrackPosition(pos);
1542 gMC->TrackMomentum(mom);
1544 Double_t normMom=1./mom.Rho();
1546 // getting the coordinates in pad ref system
1548 xm[0] = (Float_t)pos.X();
1549 xm[1] = (Float_t)pos.Y();
1550 xm[2] = (Float_t)pos.Z();
1552 pm[0] = (Float_t)mom.X()*normMom;
1553 pm[1] = (Float_t)mom.Y()*normMom;
1554 pm[2] = (Float_t)mom.Z()*normMom;
1556 gMC->Gmtod(xm,xpad,1); // from MRS to DRS: coordinates convertion
1557 gMC->Gmtod(pm,ppad,2); // from MRS to DRS: direction cosinus convertion
1560 if (TMath::Abs(ppad[1])>1) {
1561 AliWarning("Abs(ppad) > 1");
1562 ppad[1]=TMath::Sign((Float_t)1,ppad[1]);
1564 incidenceAngle = TMath::ACos(ppad[1])*kRaddeg;
1567 if (strip < fTOFGeometry->NStripC()) {
1571 else if (strip >= fTOFGeometry->NStripC() &&
1572 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB()) {
1574 strip = strip - fTOFGeometry->NStripC();
1576 else if (strip >= fTOFGeometry->NStripC() + fTOFGeometry->NStripB() &&
1577 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA()) {
1579 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB();
1581 else if (strip >= fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA() &&
1582 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA() + fTOFGeometry->NStripB()) {
1584 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB() - fTOFGeometry->NStripA();
1588 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB() - fTOFGeometry->NStripA() - fTOFGeometry->NStripB();
1591 volpath=gMC->CurrentVolOffName(7);
1592 index=atoi(&volpath[4]);
1609 hits[6] = mom.Rho();
1614 hits[11]= incidenceAngle;
1615 hits[12]= gMC->Edep();
1616 hits[13]= gMC->TrackLength();
1624 AddT0Hit(mcApplication->GetCurrentTrackNumber(),vol, hits);
1625 //AddT0Hit(gAlice->GetMCApp()->GetCurrentTrackNumber(),vol, hits);
1628 //-------------------------------------------------------------------
1629 void AliTOFv5T0::MaterialMixer(Float_t* p,Float_t* a,Float_t* m,Float_t* d,Float_t* s,Int_t n) const
1631 // a[] atomic weights vector (in)
1632 // (atoms present in more compound appear separately)
1633 // m[] number of corresponding atoms in the mixture (in)
1634 // d[] fraction of the compound relative to the corresponding atoms (in)
1635 // s[] further possible weights " " " " (in)
1637 for (Int_t i = 0; i < n; ++i) {
1638 p[i] = a[i]*m[i]*d[i]*s[i];
1641 for (Int_t i = 0; i < n; ++i) {
1643 // AliInfo(Form((\n weight[%i] = %f (,i,p[i]));