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.17 2007/05/14 14:41:13 decaro
19 Fix a bug in FTOA volume positionig inside BTOF13,14,15,16,17 in case of holes in 11th and 12th sectors
21 Revision 1.16 2007/05/04 12:59:26 arcelli
22 Change the TOF SM paths for misalignment (one layer up)
24 Revision 1.15 2007/02/19 15:41:55 decaro
25 Coding convention: few corrections
27 Revision 1.14 2006/10/17 15:33:14 arcelli
28 Moving some printout from Info to Debug level
30 Revision 1.13 2006/10/12 16:35:43 arcelli
31 definition of the alignable volumes symbolic names added
33 Revision 1.12 2006/08/22 13:34:46 arcelli
34 removal of effective c++ warnings (C.Zampolli)
36 Revision 1.11 2006/07/12 16:03:44 arcelli
37 updates to match the new numbering of the TOF/TRD mother volumes in FRAME (ALICE convention)
39 Revision 1.10 2006/05/10 18:40:17 hristov
40 Larger strings for the names
42 Revision 1.9 2006/05/04 19:41:42 hristov
43 Possibility for partial TOF geometry (S.Arcelli)
45 Revision 1.8 2006/04/20 22:30:50 hristov
46 Coding conventions (Annalisa)
48 Revision 1.7 2006/04/16 22:29:05 hristov
49 Coding conventions (Annalisa)
51 Revision 1.6 2006/03/20 08:20:35 decaro
52 Al layer: positioning correction
54 Revision 1.5 2006/03/20 07:54:20 decaro
55 Correction of some layer thickness
57 Revision 1.4 2006/03/13 12:35:44 decaro
58 Suppression of fractional Z warning
60 Revision 1.3 2006/02/28 10:38:00 decaro
61 AliTOFGeometry::fAngles, AliTOFGeometry::fHeights,
62 AliTOFGeometry::fDistances arrays: dimension definition in the right
65 Revision 1.2 2006/02/27 18:12:14 decaro
66 Remove in StepManager the dependence of hit indexes from parametrized
69 Revision 1.1 2005/12/15 08:55:33 decaro
70 New TOF geometry description (V5) -G. Cara Romeo and A. De Caro
73 Revision 0.1 2004 November G. Cara Romeo and A. De Caro
74 Implement new TOF geometry version
76 suppress few volume overlaps
77 (in the 4th TOF geometry version),
78 insert the realistic strip numbers and positions
82 ///////////////////////////////////////////////////////////////////////////////
84 // This class contains the functions for version 5 of the Time Of Flight //
87 // VERSION WITH 5 MODULES AND TILTED STRIPS //
89 // FULL COVERAGE VERSION + OPTION for PHOS holes //
94 <img src="picts/AliTOFv5T0Class.gif"> //
98 ///////////////////////////////////////////////////////////////////////////////
101 #include "TGeometry.h"
102 #include "TLorentzVector.h"
104 #include "TVirtualMC.h"
105 #include "TGeoManager.h"
107 #include "AliConst.h"
112 #include "AliTrackReference.h"
114 #include "AliTOFGeometry.h"
115 #include "AliTOFGeometryV5.h"
116 #include "AliTOFv5T0.h"
118 extern TDirectory *gDirectory;
119 extern TVirtualMC *gMC;
120 extern TGeoManager *gGeoManager;
122 extern AliRun *gAlice;
126 //_____________________________________________________________________________
127 AliTOFv5T0::AliTOFv5T0():
137 // Default constructor
141 //_____________________________________________________________________________
142 AliTOFv5T0::AliTOFv5T0(const char *name, const char *title):
143 AliTOF(name,title,"tzero"),
153 // Standard constructor
156 // Check that FRAME is there otherwise we have no place where to
160 AliModule* frame = (AliModule*)gAlice->GetModule("FRAME");
162 AliFatal("TOF needs FRAME to be present");
165 if (fTOFGeometry) delete fTOFGeometry;
166 fTOFGeometry = new AliTOFGeometryV5();
168 if(frame->IsVersion()==1) {
169 AliDebug(1,Form("Frame version %d", frame->IsVersion()));
170 AliDebug(1,"Full Coverage for TOF");
173 AliDebug(1,Form("Frame version %d", frame->IsVersion()));
174 AliDebug(1,"TOF with Holes for PHOS");
177 fTOFGeometry->SetHoles(fTOFHoles);
179 //AliTOF::fTOFGeometry = fTOFGeometry;
182 TDirectory* saveDir = gDirectory;
183 gAlice->GetRunLoader()->CdGAFile();
184 fTOFGeometry->Write("TOFgeometry");
189 //_____________________________________________________________________________
190 void AliTOFv5T0::AddAlignableVolumes() const
193 // Create entries for alignable volumes associating the symbolic volume
194 // name with the corresponding volume path. Needs to be syncronized with
195 // eventual changes in the geometry.
201 TString vpL0 = "ALIC_1/B077_1/BSEGMO";
202 TString vpL1 = "_1/BTOF";
204 TString vpL3 = "/FTOA_0";
205 TString vpL4 = "/FLTA_0/FSTR_";
207 TString snSM = "TOF/sm";
208 TString snSTRIP = "/strip";
210 Int_t nSectors=fTOFGeometry->NSectors();
211 Int_t nStrips =fTOFGeometry->NStripA()+
212 2*fTOFGeometry->NStripB()+
213 2*fTOFGeometry->NStripC();
216 // The TOF MRPC Strips
217 // The symbolic names are: TOF/sm00/strip01
223 for (Int_t isect = 0; isect < nSectors; isect++) {
224 for (Int_t istr = 1; istr <= nStrips; istr++) {
237 symName += Form("%02d",isect);
239 symName += Form("%02d",istr);
241 AliDebug(2,"--------------------------------------------");
242 AliDebug(2,Form("Alignable object %d", imod));
243 AliDebug(2,Form("volPath=%s\n",volPath.Data()));
244 AliDebug(2,Form("symName=%s\n",symName.Data()));
245 AliDebug(2,"--------------------------------------------");
247 gGeoManager->SetAlignableEntry(symName.Data(),volPath.Data());
254 // The TOF supermodules
255 // The symbolic names are: TOF/sm00
259 for (Int_t isect = 0; isect < nSectors; isect++) {
268 symName += Form("%02d",isect);
270 AliDebug(2,"--------------------------------------------");
271 AliDebug(2,Form("Alignable object %d", isect+imod));
272 AliDebug(2,Form("volPath=%s\n",volPath.Data()));
273 AliDebug(2,Form("symName=%s\n",symName.Data()));
274 AliDebug(2,"--------------------------------------------");
276 gGeoManager->SetAlignableEntry(symName.Data(),volPath.Data());
281 //____________________________________________________________________________
282 void AliTOFv5T0::BuildGeometry()
285 // Build TOF ROOT geometry for the ALICE event display
288 const int kColorTOF = 27;
290 TGeometry *globalGeometry = (TGeometry*)gAlice->GetGeometry();
293 top = globalGeometry->GetNode("alice");
295 // Position the different copies
296 const Float_t krTof =(fTOFGeometry->Rmax()+fTOFGeometry->Rmin())/2.;
297 const Float_t khTof = fTOFGeometry->Rmax()-fTOFGeometry->Rmin();
298 const Int_t kNTof = fTOFGeometry->NSectors();
299 const Float_t kangle = k2PI/kNTof;
301 const Float_t kInterCentrModBorder1 = 49.5;
302 const Float_t kInterCentrModBorder2 = 57.5;
306 // define offset for nodes
307 Float_t zOffsetB = (fTOFGeometry->ZlenA()*0.5 + (kInterCentrModBorder1+kInterCentrModBorder2)*0.5)*0.5;
308 Float_t zOffsetA = 0.;
309 // Define TOF basic volume
311 char nodeName0[16], nodeName1[16], nodeName2[16];
312 char nodeName3[16], nodeName4[16], rotMatNum[16];
315 new TBRIK("S_TOF_B","TOF box","void",
316 fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenB()*0.5);
317 new TBRIK("S_TOF_C","TOF box","void",
318 fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenB()*0.5);
320 new TBRIK("S_TOF_A","TOF box","void",
321 fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenA()*0.5);
323 for (Int_t nodeNum=1;nodeNum<19;nodeNum++){
326 sprintf(rotMatNum,"rot50%i",nodeNum);
327 sprintf(nodeName0,"FTO00%i",nodeNum);
328 sprintf(nodeName1,"FTO10%i",nodeNum);
329 sprintf(nodeName2,"FTO20%i",nodeNum);
330 sprintf(nodeName3,"FTO30%i",nodeNum);
331 sprintf(nodeName4,"FTO40%i",nodeNum);
334 sprintf(rotMatNum,"rot5%i",nodeNum);
335 sprintf(nodeName0,"FTO0%i",nodeNum);
336 sprintf(nodeName1,"FTO1%i",nodeNum);
337 sprintf(nodeName2,"FTO2%i",nodeNum);
338 sprintf(nodeName3,"FTO3%i",nodeNum);
339 sprintf(nodeName4,"FTO4%i",nodeNum);
342 new TRotMatrix(rotMatNum,rotMatNum,90,-20*nodeNum,90,90-20*nodeNum,0,0);
343 ang = (4.5-nodeNum) * kangle;
347 node = new TNode(nodeName2,nodeName2,"S_TOF_B", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang), zOffsetB,rotMatNum);
348 node->SetLineColor(kColorTOF);
352 node = new TNode(nodeName3,nodeName3,"S_TOF_C", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang),-zOffsetB,rotMatNum);
353 node->SetLineColor(kColorTOF);
358 node = new TNode(nodeName4,nodeName4,"S_TOF_A", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang), zOffsetA,rotMatNum);
359 node->SetLineColor(kColorTOF);
361 } // end loop on nodeNum
365 //_____________________________________________________________________________
366 void AliTOFv5T0::CreateGeometry()
369 // Create geometry for Time Of Flight version 0
373 <img src="picts/AliTOFv5T0.gif">
377 // Creates common geometry
379 AliTOF::CreateGeometry();
383 //_____________________________________________________________________________
384 void AliTOFv5T0::TOFpc(Float_t xtof, Float_t ytof, Float_t zlenA,
388 // Definition of the Time Of Fligh Resistive Plate Chambers
391 const Float_t kPi = TMath::Pi();
393 const Float_t kInterCentrModBorder1 = 49.5;
394 const Float_t kInterCentrModBorder2 = 57.5;
395 const Float_t kExterInterModBorder1 = 196.0;
396 const Float_t kExterInterModBorder2 = 203.5;
398 const Float_t kLengthExInModBorder = 4.7;
399 const Float_t kLengthInCeModBorder = 7.0;
401 // Al layers over all internal module walls (cm)
402 const Float_t khAlWall = 0.03;
404 // module wall thickness (cm)
405 const Float_t kModuleWallThickness = 0.3;
407 // Al honeycomb layer between strips and cards (cm)
408 const Float_t kHoneycombLayerThickness = 1.5;
410 AliDebug(2,Form("zlenA*0.5 = %d", zlenA*0.5));
411 AliDebug(1, "************************* TOF geometry **************************");
413 // Definition of the Time Of Fligh Resistive Plate Chambers
414 // xFLT, yFLT, zFLT - sizes of TOF modules (large)
416 Float_t xcoor, ycoor, zcoor;
418 Int_t *idtmed = fIdtmed->GetArray()-499;
423 par[2] = zlenA * 0.5;
424 gMC->Gsvolu("FTOA", "BOX ", idtmed[503], par, 3); // fibre glass
429 par[2] = (zlenA*0.5 - kInterCentrModBorder1)*0.5;
430 gMC->Gsvolu("FTOB", "BOX ", idtmed[503], par, 3); // fibre glass
431 gMC->Gsvolu("FTOC", "BOX ", idtmed[503], par, 3); // fibre glass
434 // Positioning of fibre glass modules (FTOA, FTOB and FTOC)
436 //AliMatrix(idrotm[0], 90., 0., 0., 0., 90.,-90.);
437 AliMatrix(idrotm[0], 90., 0., 0., 0., 90.,270.);
442 for(Int_t isec=0;isec<18;isec++){
443 if(fTOFSectors[isec]==-1)continue;
445 sprintf(name, "BTOF%d",isec);
446 if (fTOFHoles && (isec==11||isec==12)) {
447 // if (fTOFHoles && (isec==16||isec==17)) { \\Old 6h convention
449 ycoor = (zlenA*0.5 + kInterCentrModBorder1)*0.5;
451 gMC->Gspos("FTOB", 0, name, xcoor, ycoor, zcoor, idrotm[0], "ONLY");
452 gMC->Gspos("FTOC", 0, name, xcoor,-ycoor, zcoor, idrotm[0], "ONLY");
458 gMC->Gspos("FTOA", 0,name, xcoor, ycoor, zcoor, idrotm[0], "ONLY");
462 // Large not sensitive volumes with Insensitive Freon (FLTA, FLTB and FLTC)
464 Float_t xFLT, yFLT, zFLTA;
466 xFLT = xtof - kModuleWallThickness*2.;
467 yFLT = ytof - kModuleWallThickness*2.;
468 zFLTA = zlenA - kModuleWallThickness*2.;
473 gMC->Gsvolu("FLTA", "BOX ", idtmed[507], par, 3); // Freon mix
478 gMC->Gspos ("FLTA", 0, "FTOA", xcoor, ycoor, zcoor, 0, "ONLY");
483 par[2] = (zlenA*0.5 - kInterCentrModBorder1-kModuleWallThickness)*0.5;
484 gMC->Gsvolu("FLTB", "BOX ", idtmed[507], par, 3); // Freon mix
485 gMC->Gsvolu("FLTC", "BOX ", idtmed[507], par, 3); // Freon mix
489 zcoor = kModuleWallThickness*0.5;
490 gMC->Gspos ("FLTB", 0, "FTOB", xcoor, ycoor, zcoor, 0, "ONLY");
491 gMC->Gspos ("FLTC", 0, "FTOC", xcoor, ycoor,-zcoor, 0, "ONLY");
494 // Layer of Aluminum before detector (FALA, FALB and FALC)
497 par[1] = khAlWall*0.5;
498 par[2] = kInterCentrModBorder1 - (kModuleWallThickness + khAlWall);
499 gMC->Gsvolu("FALA", "BOX ", idtmed[505], par, 3); // Alluminium
502 ycoor = (-yFLT + khAlWall)*0.5;
504 gMC->Gspos ("FALA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
507 par[1] = khAlWall*0.5;
508 par[2] = (kExterInterModBorder2 - kInterCentrModBorder1 - 2.*(kModuleWallThickness + khAlWall))*0.5;
509 gMC->Gsvolu("FALB", "BOX ", idtmed[505], par, 3); // Alluminium
512 ycoor = (-yFLT + khAlWall)*0.5;
513 zcoor = (kExterInterModBorder2 + kInterCentrModBorder1)*0.5;
514 gMC->Gspos ("FALB", 1, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
515 gMC->Gspos ("FALB", 2, "FLTA", xcoor, ycoor,-zcoor, 0, "ONLY");
518 par[1] = khAlWall*0.5;
519 par[2] = (zlenA*0.5 - kExterInterModBorder2 - 2.*(kModuleWallThickness + khAlWall))*0.5;
520 gMC->Gsvolu("FALC", "BOX ", idtmed[505], par, 3); // Alluminium
523 ycoor = (-yFLT + khAlWall)*0.5;
524 zcoor = (kExterInterModBorder2+zlenA*0.5)*0.5;
525 gMC->Gspos ("FALC", 1, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
526 gMC->Gspos ("FALC", 2, "FLTA", xcoor, ycoor,-zcoor, 0, "ONLY");
530 ycoor = (-yFLT + khAlWall)*0.5;
531 zcoor = (zlenA*0.5 - kExterInterModBorder2)*0.5 - kModuleWallThickness*0.5;
532 gMC->Gspos ("FALB", 1, "FLTB", xcoor, ycoor, zcoor, 0, "ONLY");
533 gMC->Gspos ("FALB", 2, "FLTC", xcoor, ycoor,-zcoor, 0, "ONLY");
536 ycoor = (-yFLT + khAlWall)*0.5;
537 zcoor = (kExterInterModBorder2 - kInterCentrModBorder1)*0.5 + kModuleWallThickness*0.5;
538 gMC->Gspos ("FALC", 1, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
539 gMC->Gspos ("FALC", 2, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
542 Float_t y0, alpha, tgal, beta, tgbe, trpa[11];
544 // Fibre glass walls between central and intermediate modules (FWZ1 and FWZ2; holes -> FZ1B, FZ1C, FZ2B)
546 tgal = (yFLT*0.5 - 2.*kLengthInCeModBorder)/(kInterCentrModBorder2 - kInterCentrModBorder1);
547 alpha = TMath::ATan(tgal);
548 beta = (kPi*0.5 - alpha)*0.5;
549 tgbe = TMath::Tan(beta);
553 trpa[3] = kModuleWallThickness;
554 trpa[4] = (kLengthInCeModBorder - kModuleWallThickness*tgbe)*0.5;
555 trpa[5] = (kLengthInCeModBorder + kModuleWallThickness*tgbe)*0.5;
556 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
557 trpa[7] = kModuleWallThickness;
558 trpa[8] = (kLengthInCeModBorder - kModuleWallThickness*tgbe)*0.5;
559 trpa[9] = (kLengthInCeModBorder + kModuleWallThickness*tgbe)*0.5;
560 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
561 gMC->Gsvolu("FWZ1","TRAP", idtmed[503], trpa, 11); // fibre glass
563 AliMatrix (idrotm[1],90., 90.,180.,0.,90.,180.);
564 AliMatrix (idrotm[4],90., 90., 0.,0.,90., 0.);
567 ycoor = -yFLT*0.5 + kLengthInCeModBorder*0.5;
568 zcoor = kInterCentrModBorder1;
569 gMC->Gspos("FWZ1", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[1],"ONLY");
570 gMC->Gspos("FWZ1", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[4],"ONLY");
573 y0 = kLengthInCeModBorder - kModuleWallThickness*0.5*tgbe;
577 trpa[3] = kModuleWallThickness*0.5;
578 trpa[4] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
579 trpa[5] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
580 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
581 trpa[7] = kModuleWallThickness*0.5;
582 trpa[8] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
583 trpa[9] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
584 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
585 gMC->Gsvolu("FZ1B","TRAP", idtmed[503], trpa, 11); // fibre glass
588 ycoor = -yFLT*0.5 + kLengthInCeModBorder*0.5 - kModuleWallThickness*0.25*tgbe;
589 zcoor = -kInterCentrModBorder1 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
590 gMC->Gspos("FZ1B", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[4],"ONLY");
591 gMC->Gspos("FZ1B", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[1],"ONLY");
594 AliMatrix (idrotm[2],90.,270., 0.,0.,90.,180.);
595 AliMatrix (idrotm[5],90.,270.,180.,0.,90., 0.);
598 ycoor = -kLengthInCeModBorder*0.5;
599 zcoor = kInterCentrModBorder2;
600 gMC->Gspos("FWZ1", 3,"FLTA", xcoor, ycoor, zcoor,idrotm[2],"ONLY");
601 gMC->Gspos("FWZ1", 4,"FLTA", xcoor, ycoor,-zcoor,idrotm[5],"ONLY");
604 y0 = kLengthInCeModBorder + kModuleWallThickness*0.5*tgbe;
608 trpa[3] = kModuleWallThickness*0.5;
609 trpa[4] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
610 trpa[5] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
611 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
612 trpa[7] = kModuleWallThickness*0.5;
613 trpa[8] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
614 trpa[9] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
615 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
616 gMC->Gsvolu("FZ1C","TRAP", idtmed[503], trpa, 11); // fibre glass
619 ycoor = -kLengthInCeModBorder*0.5 - kModuleWallThickness*0.25*tgbe;
620 zcoor = -kInterCentrModBorder2 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
621 gMC->Gspos("FZ1C", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[5],"ONLY");
622 gMC->Gspos("FZ1C", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[2],"ONLY");
625 trpa[0] = 0.5*(kInterCentrModBorder2 - kInterCentrModBorder1)/TMath::Cos(alpha);
626 trpa[1] = kModuleWallThickness;
628 trpa[3] = -beta*kRaddeg;
631 gMC->Gsvolu("FWZ2","PARA", idtmed[503], trpa, 6); // fibre glass
633 AliMatrix (idrotm[3], alpha*kRaddeg,90.,90.+alpha*kRaddeg,90.,90.,180.);
634 AliMatrix (idrotm[6],180.-alpha*kRaddeg,90.,90.-alpha*kRaddeg,90.,90., 0.);
638 zcoor = (kInterCentrModBorder2 + kInterCentrModBorder1)*0.5;
639 gMC->Gspos("FWZ2", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[3],"ONLY");
640 gMC->Gspos("FWZ2", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[6],"ONLY");
643 trpa[0] = 0.5*(kInterCentrModBorder2 - kInterCentrModBorder1)/TMath::Cos(alpha);
644 trpa[1] = kModuleWallThickness*0.5;
646 trpa[3] = -beta*kRaddeg;
649 gMC->Gsvolu("FZ2B","PARA", idtmed[503], trpa, 6); // fibre glass
652 ycoor = -yFLT*0.25 - kModuleWallThickness*0.5*tgbe;
653 zcoor = -(kInterCentrModBorder2 + kInterCentrModBorder1)*0.5 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
654 gMC->Gspos("FZ2B", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[6],"ONLY");
655 gMC->Gspos("FZ2B", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[3],"ONLY");
658 // Fibre glass walls between intermediate and lateral modules (FWZ3 and FWZ4)
660 tgal = (yFLT*0.5 - 2.*kLengthExInModBorder)/(kExterInterModBorder2 - kExterInterModBorder1);
661 alpha = TMath::ATan(tgal);
662 beta = (kPi*0.5 - alpha)*0.5;
663 tgbe = TMath::Tan(beta);
667 trpa[3] = kModuleWallThickness;
668 trpa[4] = (kLengthExInModBorder - kModuleWallThickness*tgbe)*0.5;
669 trpa[5] = (kLengthExInModBorder + kModuleWallThickness*tgbe)*0.5;
670 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
671 trpa[7] = kModuleWallThickness;
672 trpa[8] = (kLengthExInModBorder - kModuleWallThickness*tgbe)*0.5;
673 trpa[9] = (kLengthExInModBorder + kModuleWallThickness*tgbe)*0.5;
674 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
675 gMC->Gsvolu("FWZ3","TRAP", idtmed[503], trpa, 11); // fibre glass
678 ycoor = -kLengthExInModBorder*0.5;
679 zcoor = kExterInterModBorder1;
680 gMC->Gspos("FWZ3", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[5],"ONLY");
681 gMC->Gspos("FWZ3", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[2],"ONLY");
685 ycoor = -kLengthExInModBorder*0.5;
686 zcoor = -kExterInterModBorder1 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
687 gMC->Gspos("FWZ3", 5,"FLTB", xcoor, ycoor, zcoor,idrotm[2],"ONLY");
688 gMC->Gspos("FWZ3", 6,"FLTC", xcoor, ycoor,-zcoor,idrotm[5],"ONLY");
692 ycoor = -yFLT*0.5 + kLengthExInModBorder*0.5;
693 zcoor = kExterInterModBorder2;
694 gMC->Gspos("FWZ3", 3,"FLTA", xcoor, ycoor, zcoor,idrotm[4],"ONLY");
695 gMC->Gspos("FWZ3", 4,"FLTA", xcoor, ycoor,-zcoor,idrotm[1],"ONLY");
699 ycoor = -yFLT*0.5 + kLengthExInModBorder*0.5;
700 zcoor = -kExterInterModBorder2 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
701 gMC->Gspos("FWZ3", 7,"FLTB", xcoor, ycoor, zcoor,idrotm[1],"ONLY");
702 gMC->Gspos("FWZ3", 8,"FLTC", xcoor, ycoor,-zcoor,idrotm[4],"ONLY");
705 trpa[0] = 0.5*(kExterInterModBorder2 - kExterInterModBorder1)/TMath::Cos(alpha);
706 trpa[1] = kModuleWallThickness;
708 trpa[3] = -beta*kRaddeg;
711 gMC->Gsvolu("FWZ4","PARA", idtmed[503], trpa, 6); // fibre glass
713 AliMatrix (idrotm[13],alpha*kRaddeg,90.,90.+alpha*kRaddeg,90.,90.,180.);
714 AliMatrix (idrotm[16],180.-alpha*kRaddeg,90.,90.-alpha*kRaddeg,90.,90.,0.);
718 zcoor = (kExterInterModBorder2 + kExterInterModBorder1)*0.5;
719 gMC->Gspos("FWZ4", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[16],"ONLY");
720 gMC->Gspos("FWZ4", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[13],"ONLY");
725 zcoor = -(kExterInterModBorder2 + kExterInterModBorder1)*0.5 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
726 gMC->Gspos("FWZ4", 3,"FLTB", xcoor, ycoor, zcoor,idrotm[13],"ONLY");
727 gMC->Gspos("FWZ4", 4,"FLTC", xcoor, ycoor,-zcoor,idrotm[16],"ONLY");
731 ///////////////// Detector itself //////////////////////
733 const Int_t knx = fTOFGeometry->NpadX(); // number of pads along x
734 const Int_t knz = fTOFGeometry->NpadZ(); // number of pads along z
735 const Float_t kPadX = fTOFGeometry->XPad(); // pad length along x
736 const Float_t kPadZ = fTOFGeometry->ZPad(); // pad length along z
738 // new description for strip volume -double stack strip-
739 // -- all constants are expressed in cm
740 // heigth of different layers
741 const Float_t khhony = 1.0 ; // heigth of HONY Layer
742 const Float_t khpcby = 0.08 ; // heigth of PCB Layer
743 const Float_t khrgly = 0.055 ; // heigth of RED GLASS Layer
745 const Float_t khfiliy = 0.125 ; // heigth of FISHLINE Layer
746 const Float_t khglassy = 0.160*0.5; // heigth of GLASS Layer
747 const Float_t khglfy = khfiliy+2.*khglassy;// heigth of GLASS+FISHLINE Layer
749 const Float_t khcpcby = 0.16 ; // heigth of PCB Central Layer
750 const Float_t kwhonz = 8.1 ; // z dimension of HONEY Layer
751 const Float_t kwpcbz1 = 10.6 ; // z dimension of PCB Lower Layer
752 const Float_t kwpcbz2 = 11.6 ; // z dimension of PCB Upper Layer
753 const Float_t kwcpcbz = 12.4 ; // z dimension of PCB Central Layer
754 const Float_t kwrglz = 8. ; // z dimension of RED GLASS Layer
755 const Float_t kwglfz = 7. ; // z dimension of GLASS+FISHLN Layer
756 const Float_t klsensmx = knx*kPadX; // length of Sensitive Layer
757 const Float_t khsensmy = 0.05;//0.11;//0.16;// heigth of Sensitive Layer
758 const Float_t kwsensmz = knz*kPadZ; // width of Sensitive Layer
760 // heigth of the FSTR Volume (the strip volume)
761 const Float_t khstripy = 2.*khhony+2.*khpcby+4.*khrgly+2.*khglfy+khcpcby;
763 // width of the FSTR Volume (the strip volume)
764 const Float_t kwstripz = kwcpcbz;
765 // length of the FSTR Volume (the strip volume)
766 const Float_t klstripx = fTOFGeometry->StripLength();
768 Float_t parfp[3]={klstripx*0.5,khstripy*0.5,kwstripz*0.5};
769 // Coordinates of the strip center in the strip reference frame;
770 // used for positioning internal strip volumes
771 Float_t posfp[3]={0.,0.,0.};
773 // FSTR volume definition-filling this volume with non sensitive Gas Mixture
774 gMC->Gsvolu("FSTR","BOX",idtmed[507],parfp,3); // Freon mix
776 //-- HONY Layer definition
777 parfp[1] = khhony*0.5;
778 parfp[2] = kwhonz*0.5;
779 gMC->Gsvolu("FHON","BOX",idtmed[501],parfp,3); // honeycomb (Nomex)
780 // positioning 2 HONY Layers on FSTR volume
781 posfp[1] =-khstripy*0.5+parfp[1];
782 gMC->Gspos("FHON",1,"FSTR",0., posfp[1],0.,0,"ONLY");
783 gMC->Gspos("FHON",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
785 //-- PCB Layer definition
786 parfp[1] = khpcby*0.5;
787 parfp[2] = kwpcbz1*0.5;
788 gMC->Gsvolu("FPC1","BOX",idtmed[502],parfp,3); // G10
789 parfp[2] = kwpcbz2*0.5;
790 gMC->Gsvolu("FPC2","BOX",idtmed[502],parfp,3); // G10
791 // positioning 2 PCB Layers on FSTR volume
792 posfp[1] =-khstripy*0.5+khhony+parfp[1];
793 gMC->Gspos("FPC1",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
794 gMC->Gspos("FPC2",1,"FSTR",0., posfp[1],0.,0,"ONLY");
796 //-- central PCB layer definition
797 parfp[1] = khcpcby*0.5;
798 parfp[2] = kwcpcbz*0.5;
799 gMC->Gsvolu("FPCB","BOX",idtmed[502],parfp,3); // G10
800 // positioning the central PCB layer
801 gMC->Gspos("FPCB",1,"FSTR",0.,0.,0.,0,"ONLY");
804 Float_t parfs[3] = {klsensmx*0.5, khsensmy*0.5, kwsensmz*0.5};
805 gMC->Gsvolu("FSEN","BOX",idtmed[508],parfs,3); // sensitive ...
806 // dividing FSEN along z in knz=2 and along x in knx=48
807 gMC->Gsdvn("FSEZ","FSEN",knz,3);
808 gMC->Gsdvn("FPAD","FSEZ",knx,1);
809 // positioning a Sensitive layer inside FPCB
810 gMC->Gspos("FSEN",1,"FPCB",0.,0.,0.,0,"ONLY");
812 //-- RED GLASS Layer definition
813 parfp[1] = khrgly*0.5;
814 parfp[2] = kwrglz*0.5;
815 gMC->Gsvolu("FRGL","BOX",idtmed[509],parfp,3); // glass
816 // positioning 4 RED GLASS Layers on FSTR volume
817 posfp[1] = -khstripy*0.5+khhony+khpcby+parfp[1];
818 gMC->Gspos("FRGL",1,"FSTR",0., posfp[1],0.,0,"ONLY");
819 gMC->Gspos("FRGL",4,"FSTR",0.,-posfp[1],0.,0,"ONLY");
820 posfp[1] = (khcpcby+khrgly)*0.5;
821 gMC->Gspos("FRGL",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
822 gMC->Gspos("FRGL",3,"FSTR",0., posfp[1],0.,0,"ONLY");
824 //-- GLASS Layer definition
825 parfp[1] = khglassy*0.5;
826 parfp[2] = kwglfz*0.5;
827 gMC->Gsvolu("FGLA","BOX",idtmed[509],parfp,3); // glass
829 // positioning 4 GLASS Layers on FSTR volume
830 posfp[1] = -khstripy*0.5+khhony+khpcby+khrgly+parfp[1];
831 gMC->Gspos("FGLA",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
832 gMC->Gspos("FGLA",4,"FSTR",0., posfp[1],0.,0,"ONLY");
833 posfp[1] = khcpcby*0.5+khrgly+khglassy*0.5;
834 gMC->Gspos("FGLA",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
835 gMC->Gspos("FGLA",3,"FSTR",0., posfp[1],0.,0,"ONLY");
837 //-- FREON Layer definition
838 parfp[1] = khfiliy*0.5;
839 gMC->Gsvolu("FFIS","BOX",idtmed[507],parfp,3); // freon
841 // positioning 2 FREON Layers on FSTR volume
842 posfp[1] = -khstripy*0.5+khhony+khpcby+khrgly+khglassy+parfp[1];
843 gMC->Gspos("FFIS",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
844 gMC->Gspos("FFIS",2,"FSTR",0., posfp[1],0.,0,"ONLY");
847 //-- GLASS+FISHLINE Layer definition
848 parfp[1] = khglfy*0.5;
849 parfp[2] = kwglfz*0.5;
850 gMC->Gsvolu("FGLF","BOX",idtmed[504],parfp,3);
852 // positioning 2 GLASS+FISHLINE Layers on FSTR volume
853 posfp[1] = (khcpcby+khglfy)*0.5+khrgly;
854 gMC->Gspos("FGLF",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
855 gMC->Gspos("FGLF",2,"FSTR",0., posfp[1],0.,0,"ONLY");
858 // Positioning the Strips (FSTR) in the FLT volumes
859 Int_t maxStripNumbers [5] ={fTOFGeometry->NStripC(),
860 fTOFGeometry->NStripB(),
861 fTOFGeometry->NStripA(),
862 fTOFGeometry->NStripB(),
863 fTOFGeometry->NStripC()};
865 Int_t totalStrip = 0;
866 Float_t xpos, zpos, ypos, ang;
867 for(Int_t iplate =0; iplate < fTOFGeometry->NPlates(); iplate++){
868 if (iplate>0) totalStrip += maxStripNumbers[iplate-1];
869 for(Int_t istrip =0; istrip < maxStripNumbers[iplate]; istrip++){
871 ang = fTOFGeometry->GetAngles(iplate,istrip);
872 AliDebug(1, Form(" iplate = %1i, istrip = %2i ---> ang = %f", iplate, istrip, ang));
874 if (ang>0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.+ang,90., ang, 90.);
875 else if (ang==0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.,90., 0., 0.);
876 else if (ang<0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.+ang,90.,-ang,270.);
879 zpos = fTOFGeometry->GetDistances(iplate,istrip);
880 ypos = fTOFGeometry->GetHeights(iplate,istrip);
882 gMC->Gspos("FSTR",istrip+totalStrip+1,"FLTA", xpos, ypos,-zpos,idrotm[istrip+totalStrip+1], "ONLY");
885 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");
886 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");
891 // 1.5 cm Al honeycomb layer between strips and cards
893 par[1] = kHoneycombLayerThickness*0.5;
895 gMC->Gsvolu("FPEA", "BOX ", idtmed[506], par, 3); // Al honeycomb
898 ycoor = kHoneycombLayerThickness*0.5;
900 gMC->Gspos ("FPEA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
904 par[1] = kHoneycombLayerThickness*0.5;
905 par[2] = (zlenA*0.5 - kInterCentrModBorder2-kModuleWallThickness)*0.5;
906 gMC->Gsvolu("FPEB", "BOX ", idtmed[506], par, 3); // Al honeycomb
909 ycoor = kHoneycombLayerThickness*0.5;
910 zcoor = (kInterCentrModBorder2-kInterCentrModBorder1)*0.5;
911 gMC->Gspos ("FPEB", 1, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
912 gMC->Gspos ("FPEB", 2, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
917 par[1] = (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
919 gMC->Gsvolu("FAIA", "BOX ", idtmed[500], par, 3); // Air
922 ycoor = kHoneycombLayerThickness + (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
924 gMC->Gspos ("FAIA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
928 par[1] = (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
929 par[2] = (zlenA*0.5 - kInterCentrModBorder2 - kModuleWallThickness)*0.5;
930 gMC->Gsvolu("FAIB", "BOX ", idtmed[500], par, 3); // Air
931 gMC->Gsvolu("FAIC", "BOX ", idtmed[500], par, 3); // Air
934 ycoor = kHoneycombLayerThickness + (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
935 zcoor = (kInterCentrModBorder2-kInterCentrModBorder1)*0.5;
936 gMC->Gspos ("FAIB", 0, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
937 gMC->Gspos ("FAIC", 0, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
940 // start with cards and cooling tubes
941 // finally, cards, cooling tubes and layer for thermal dispersion
944 // see GEOM200 in GEANT manual
948 // card volume definition
949 cardpar[0]= xFLT*0.5;
952 gMC->Gsvolu("FCAR", "BOX ", idtmed[502], cardpar, 3); // PCB Card
954 //alu plate volume definition
957 gMC->Gsvolu("FALP", "BOX ", idtmed[505], cardpar, 3); // Alu Plate
959 // tube volume definition
964 gMC->Gsvolu("FTUB", "TUBE", idtmed[511], tubepar, 3); // cooling tubes (steel)
969 gMC->Gsvolu("FITU", "TUBE", idtmed[510], tubepar, 3); // cooling water
970 // positioning water tube into the steel one
971 gMC->Gspos("FITU",1,"FTUB",0.,0.,0.,0,"ONLY");
974 AliMatrix(idrotm[99], 180., 90., 90., 90., 90., 0.);
976 // central module positioning
977 Float_t cardpos[3], aplpos2;
978 Float_t stepforcardA = 6.625;
980 Float_t aplpos1 = -2.;
985 // tubepos= -53.+tdis;
987 for (icard=39; icard<54; ++icard) {
988 cardpos[2]= cardpos[2]+stepforcardA;
989 aplpos2 = cardpos[2]+0.15;
990 gMC->Gspos("FCAR",icard,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
991 gMC->Gspos("FALP",icard,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
992 gMC->Gspos("FTUB",icard,"FAIA", 0.,cardpos[1],cardpos[2]+tdis,idrotm[99],"ONLY");
995 // intermediate module positioning
996 Float_t stepforcardB= 7.05;
1000 for (icard=20; icard<39; ++icard) {
1001 cardpos[2]= cardpos[2]+stepforcardB;
1002 aplpos2 = cardpos[2]+0.15;
1004 gMC->Gspos("FCAR",icard+34,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
1005 gMC->Gspos("FALP",icard+34,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
1006 gMC->Gspos("FTUB",icard+34,"FAIA", 0.,cardpos[1], cardpos[2]+tdis,idrotm[99],"ONLY");
1007 gMC->Gspos("FCAR",58-icard,"FAIA",cardpos[0],cardpos[1], -cardpos[2], 0,"ONLY");
1008 gMC->Gspos("FALP",58-icard,"FAIA",cardpos[0], aplpos1, -aplpos2, 0,"ONLY");
1009 gMC->Gspos("FTUB",58-icard,"FAIA", 0.,cardpos[1],-cardpos[2]-tdis,idrotm[99],"ONLY");
1012 gMC->Gspos("FCAR",icard+34+182,"FAIC",cardpos[0],cardpos[1], cardpos[2]-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1013 gMC->Gspos("FALP",icard+34+182,"FAIC",cardpos[0], aplpos1, aplpos2-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1014 gMC->Gspos("FTUB",icard+34+182,"FAIC", 0.,cardpos[1], cardpos[2]+tdis-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
1015 gMC->Gspos("FCAR",58-icard+ 91,"FAIB",cardpos[0],cardpos[1], -cardpos[2]+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1016 gMC->Gspos("FALP",58-icard+ 91,"FAIB",cardpos[0], aplpos1, -aplpos2+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1017 gMC->Gspos("FTUB",58-icard+ 91,"FAIB", 0.,cardpos[1],-cardpos[2]-tdis+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
1022 // outer module positioning
1023 Float_t stepforcardC= 8.45238;
1026 for (icard=1; icard<20; ++icard) {
1027 cardpos[2]= cardpos[2]+stepforcardC;
1028 aplpos2 = cardpos[2]+0.15;
1030 gMC->Gspos("FCAR",icard+72,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
1031 gMC->Gspos("FALP",icard+72,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
1032 gMC->Gspos("FTUB",icard+72,"FAIA", 0.,cardpos[1], cardpos[2]+tdis,idrotm[99],"ONLY");
1033 gMC->Gspos("FCAR",20-icard,"FAIA",cardpos[0],cardpos[1], -cardpos[2], 0,"ONLY");
1034 gMC->Gspos("FALP",20-icard,"FAIA",cardpos[0], aplpos1, -aplpos2, 0,"ONLY");
1035 gMC->Gspos("FTUB",20-icard,"FAIA", 0.,cardpos[1],-cardpos[2]-tdis,idrotm[99],"ONLY");
1038 gMC->Gspos("FCAR",icard+72+182,"FAIC",cardpos[0],cardpos[1], cardpos[2]-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1039 gMC->Gspos("FALP",icard+72+182,"FAIC",cardpos[0], aplpos1, aplpos2-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1040 gMC->Gspos("FTUB",icard+72+182,"FAIC", 0.,cardpos[1], cardpos[2]+tdis-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
1041 gMC->Gspos("FCAR",20-icard+ 91,"FAIB",cardpos[0],cardpos[1], -cardpos[2]+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1042 gMC->Gspos("FALP",20-icard+ 91,"FAIB",cardpos[0], aplpos1, -aplpos2+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1043 gMC->Gspos("FTUB",20-icard+ 91,"FAIB", 0.,cardpos[1],-cardpos[2]-tdis+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
1048 //_____________________________________________________________________________
1049 void AliTOFv5T0::DrawModule() const
1052 // Draw a shaded view of the Time Of Flight version 4
1055 // Set everything unseen
1056 gMC->Gsatt("*", "seen", -1);
1059 //Set volumes visible
1062 //Set ALIC mother transparent
1063 gMC->Gsatt("ALIC","SEEN", 0);
1066 // Level 1 for TOF volumes
1067 gMC->Gsatt("B077","seen", 0);
1070 // Level 2 for TOF volumes
1071 gMC->Gsatt("B071","seen", 0);
1072 gMC->Gsatt("B074","seen", 0);
1073 gMC->Gsatt("B075","seen", 0);
1074 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
1075 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
1078 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
1079 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
1080 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
1081 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
1082 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
1084 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
1085 gMC->Gsatt("BTO1","seen", 0);
1088 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
1089 gMC->Gsatt("BTO2","seen", 0);
1092 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
1093 gMC->Gsatt("BTO3","seen", 0);
1095 // Level 3 of B071, B074 and B075
1096 gMC->Gsatt("FTOA","SEEN", 0);
1097 if (fTOFHoles) gMC->Gsatt("FTOB","SEEN", 0);
1099 // Level 4 of B071, B074 and B075
1100 gMC->Gsatt("FLTA","SEEN", 0);
1101 if (fTOFHoles) gMC->Gsatt("FLTB","SEEN",0);
1102 if (fTOFHoles) gMC->Gsatt("FLTC","SEEN",0);
1104 // Level 5 of B071, B074 and B075
1105 gMC->Gsatt("FAIA","SEEN",-1); // all FAIA sub-levels skipped -
1106 if (fTOFHoles) gMC->Gsatt("FAIB","SEEN",-1); // all FAIB sub-levels skipped -
1107 if (fTOFHoles) gMC->Gsatt("FAIC","SEEN",-1); // all FAIC sub-levels skipped -
1109 gMC->Gsatt("FALA","SEEN", 0);
1110 if (fTOFHoles) gMC->Gsatt("FALB","SEEN", 0);
1112 gMC->Gsatt("FPEA","SEEN", 1);
1113 if (fTOFHoles) gMC->Gsatt("FPEB","SEEN", 1);
1115 gMC->Gsatt("FSTR","SEEN",-1); // all FSTR sub-levels skipped -
1117 gMC->Gsatt("FWZ1","SEEN", 0);
1118 gMC->Gsatt("FWZ2","SEEN", 0);
1119 gMC->Gsatt("FWZ3","SEEN", 0);
1120 gMC->Gsatt("FWZ4","SEEN", 0);
1122 gMC->Gsatt("FZ1B","SEEN", 0);
1123 gMC->Gsatt("FZ1C","SEEN", 0);
1124 gMC->Gsatt("FZ2B","SEEN", 0);
1127 gMC->Gdopt("hide", "on");
1128 gMC->Gdopt("shad", "on");
1129 gMC->Gsatt("*", "fill", 7);
1130 gMC->SetClipBox(".");
1131 gMC->SetClipBox("*", 100, 1000, 100, 1000, 100, 1000);
1132 gMC->DefaultRange();
1133 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
1134 gMC->Gdhead(1111, "Time Of Flight");
1135 gMC->Gdman(18, 3, "MAN");
1136 gMC->Gdopt("hide","off");
1138 //_____________________________________________________________________________
1139 void AliTOFv5T0::DrawDetectorModules() const
1142 // Draw a shaded view of the TOF detector version 4
1145 // Set everything unseen
1146 gMC->Gsatt("*", "seen", -1);
1149 //Set volumes visible
1152 //Set ALIC mother transparent
1153 gMC->Gsatt("ALIC","SEEN", 0);
1156 // Level 1 for TOF volumes
1157 gMC->Gsatt("B077","seen", 0);
1160 // Level 2 for TOF volumes
1161 gMC->Gsatt("B071","seen", 0);
1162 gMC->Gsatt("B074","seen", 0);
1163 gMC->Gsatt("B075","seen", 0);
1164 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
1165 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
1168 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
1169 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
1170 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
1171 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
1172 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
1174 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
1175 gMC->Gsatt("BTO1","seen", 0);
1178 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
1179 gMC->Gsatt("BTO2","seen", 0);
1182 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
1183 gMC->Gsatt("BTO3","seen", 0);
1185 // Level 3 of B071, B075 and B074
1186 gMC->Gsatt("FTOA","seen",-2); // all FTOA sub-levels skipped -
1188 gMC->Gsatt("FTOB","seen",-2); // all FTOB sub-levels skipped -
1189 gMC->Gsatt("FTOC","seen",-2); // all FTOC sub-levels skipped -
1192 gMC->Gdopt("hide","on");
1193 gMC->Gdopt("shad","on");
1194 gMC->Gsatt("*", "fill", 5);
1195 gMC->SetClipBox(".");
1196 gMC->SetClipBox("*", 100, 1000, 100, 1000, 0, 1000);
1197 gMC->DefaultRange();
1198 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
1199 gMC->Gdhead(1111,"TOF detector");
1200 gMC->Gdman(18, 3, "MAN");
1201 gMC->Gdopt("hide","off");
1204 //_____________________________________________________________________________
1205 void AliTOFv5T0::DrawDetectorStrips() const
1208 // Draw a shaded view of the TOF strips for version 4
1211 // Set everything unseen
1212 gMC->Gsatt("*", "seen", -1);
1215 //Set volumes visible
1218 //Set ALIC mother transparent
1219 gMC->Gsatt("ALIC","SEEN", 0);
1222 // Level 1 for TOF volumes
1223 gMC->Gsatt("B077","seen", 0);
1226 // Level 2 for TOF volumes
1227 gMC->Gsatt("B071","seen", 0);
1228 gMC->Gsatt("B074","seen", 0);
1229 gMC->Gsatt("B075","seen", 0);
1230 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
1231 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
1234 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
1235 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
1236 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
1237 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
1238 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
1240 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
1241 gMC->Gsatt("BTO1","seen", 0);
1244 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
1245 gMC->Gsatt("BTO2","seen", 0);
1248 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
1249 gMC->Gsatt("BTO3","seen", 0);
1251 // Level 3 of B071, B074 and B075
1252 gMC->Gsatt("FTOA","SEEN", 0);
1254 gMC->Gsatt("FTOB","SEEN", 0);
1255 gMC->Gsatt("FTOC","SEEN", 0);
1258 // Level 4 of B071, B074 and B075
1259 gMC->Gsatt("FLTA","SEEN", 0);
1261 gMC->Gsatt("FLTB","SEEN", 0);
1262 gMC->Gsatt("FLTC","SEEN", 0);
1265 // Level 5 of B071, B074 and B075
1266 gMC->Gsatt("FAIA","SEEN",-1); // all FAIA sub-levels skipped -
1268 gMC->Gsatt("FAIB","SEEN",-1); // all FAIB sub-levels skipped -
1269 gMC->Gsatt("FAIC","SEEN",-1); // all FAIC sub-levels skipped -
1272 gMC->Gsatt("FALA","SEEN", 0);
1273 if (fTOFHoles) gMC->Gsatt("FALB","SEEN", 0);
1275 gMC->Gsatt("FPEA","SEEN", 0);
1276 if (fTOFHoles) gMC->Gsatt("FPEB","SEEN", 0);
1278 gMC->Gsatt("FSTR","SEEN",-2); // all FSTR sub-levels skipped -
1280 gMC->Gsatt("FWZ1","SEEN", 0);
1281 gMC->Gsatt("FWZ2","SEEN", 0);
1282 gMC->Gsatt("FWZ3","SEEN", 0);
1283 gMC->Gsatt("FWZ4","SEEN", 0);
1285 gMC->Gsatt("FZ1B","SEEN", 0);
1286 gMC->Gsatt("FZ1C","SEEN", 0);
1287 gMC->Gsatt("FZ2B","SEEN", 0);
1294 gMC->Gsatt("FALP","SEEN",0);
1295 gMC->Gsatt("FCAR","SEEN",0);
1296 gMC->Gsatt("FTUB","SEEN",-1); // all FTUB sub-levels skipped -
1299 gMC->Gsatt("FITU","SEEN",0);
1304 gMC->Gsatt("FGLF","SEEN",0);
1305 gMC->Gsatt("FHON","SEEN",0);
1306 gMC->Gsatt("FPC1","SEEN",0);
1307 gMC->Gsatt("FPC2","SEEN",0);
1308 gMC->Gsatt("FPCB","SEEN",0);
1309 gMC->Gsatt("FRGL","SEEN",0);
1311 // Level 2 of FPCB => Level 3 of FSTR
1312 gMC->Gsatt("FSEN","SEEN",0);
1313 gMC->Gsatt("FSEZ","SEEN",0);
1314 gMC->Gsatt("FPAD","SEEN",1);
1317 gMC->Gdopt("hide","on");
1318 gMC->Gdopt("shad","on");
1319 gMC->Gsatt("*", "fill", 5);
1320 gMC->SetClipBox(".");
1321 gMC->SetClipBox("*", 0, 1000, 0, 1000, 0, 1000);
1322 gMC->DefaultRange();
1323 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
1324 gMC->Gdhead(1111,"TOF Strips");
1325 gMC->Gdman(18, 3, "MAN");
1326 gMC->Gdopt("hide","off");
1329 //_____________________________________________________________________________
1330 void AliTOFv5T0::CreateMaterials()
1333 // Define materials for the Time Of Flight
1336 //AliTOF::CreateMaterials();
1338 AliMagF *magneticField = (AliMagF*)gAlice->Field();
1340 Int_t isxfld = magneticField->Integ();
1341 Float_t sxmgmx = magneticField->Max();
1343 Float_t we[7], ae[7], na[7], fr[7], vl[7];
1346 //--- Quartz (SiO2) to simulate float glass
1347 // density tuned to have correct float glass
1349 Float_t aq[2] = { 28.0855,15.9994 };
1350 Float_t zq[2] = { 14.,8. };
1351 Float_t wq[2] = { 1.,2. };
1352 Float_t dq = 2.55; // std value: 2.2
1356 Float_t anox[4] = {12.01,1.01,16.00,14.01};
1357 Float_t znox[4] = { 6., 1., 8., 7.};
1358 Float_t wnox[4] = {14., 22., 2., 2.};
1359 Float_t dnox = 0.048;
1363 Float_t ag10[4] = {28.09,12.01,1.01,16.00};
1364 Float_t zg10[4] = {14., 6., 1., 8.};
1367 for (i = 0; i < nlmatg10; ++i) {
1383 MaterialMixer(we,ae,na,fr,vl,5);
1389 Float_t densg10 = 1.7;
1392 Float_t awa[2] = { 1., 16. };
1393 Float_t zwa[2] = { 1., 8. };
1394 Float_t wwa[2] = { 2., 1. };
1399 Float_t asteel[4] = { 55.847,51.9961,58.6934,28.0855 };
1400 Float_t zsteel[4] = { 26.,24.,28.,14. };
1401 Float_t wsteel[4] = { .715,.18,.1,.005 };
1404 Float_t aAir[4]={12.0107,14.0067,15.9994,39.948};
1405 Float_t zAir[4]={6.,7.,8.,18.};
1406 Float_t wAir[4]={0.000124,0.755267,0.231781,0.012827};
1407 Float_t dAir = 1.20479E-3;
1410 Float_t afg[4] = {28.09,16.00,12.01,1.01};
1411 Float_t zfg[4] = {14., 8., 6., 1.};
1412 Float_t wfg[4] = {0.12906,0.29405,0.51502,0.06187};
1413 Float_t dfg = 1.111;
1416 // --- Freon C2F4H2 + SF6
1417 Float_t afre[4]= {12.01,1.01,19.00,32.07};
1418 Float_t zfre[4]= { 6., 1., 9., 16.};
1419 Float_t wfre[4]= {0.21250,0.01787,0.74827,0.021355};
1420 Float_t densfre= 0.00375;
1423 //char namat[15] = " ";
1424 //Float_t ama[2], zma[2], dma, radl, absl, buf[1];
1427 AliMixture ( 0, "Air$", aAir, zAir, dAir, 4, wAir);
1428 AliMixture ( 1, "Nomex$", anox, znox, dnox, nnox, wnox);
1429 AliMixture ( 2, "G10$", ag10, zg10, densg10, nlmatg10, wmatg10);
1430 AliMixture ( 3, "fibre glass$", afg, zfg, dfg, nfg, wfg);
1431 AliMaterial( 4, "Al $", 26.98, 13., 2.7, 8.9, 37.2);
1432 AliMaterial( 5, "Al honeycomb$", 26.98, 13., 0.0496, 483., 2483.);
1433 AliMixture ( 6, "Freon$", afre, zfre, densfre, nfre, wfre);
1434 AliMixture ( 7, "Glass$", aq, zq, dq, nq, wq);
1436 // get freon and glass
1437 gMC->Gfmate((*fIdmate)[6],namat,ama[0],zma[0],dma,radl,absl,buf,nbuf);
1438 gMC->Gfmate((*fIdmate)[7],namat,ama[1],zma[1],dma,radl,absl,buf,nbuf);
1441 Float_t wgfr[2]= {0.0011,0.9989};
1442 Float_t dgfr = 1.434;
1444 AliMixture ( 8, "glass-freon$", ama, zma, dgfr, ngfr, wgfr);
1446 AliMixture ( 9, "Water$", awa, zwa, dwa, nwa, wwa);
1447 AliMixture (10, "STAINLESS STEEL$", asteel, zsteel, 7.88, 4, wsteel);
1449 Float_t epsil, stmin, deemax, stemax;
1452 // EPSIL = 0.1 ! Tracking precision,
1453 // STEMAX = 0.1 ! Maximum displacement for multiple scattering
1454 // DEEMAX = 0.1 ! Maximum fractional energy loss, DLS
1458 epsil = .001; // Tracking precision,
1459 stemax = -1.; // Maximum displacement for multiple scattering
1460 deemax = -.3; // Maximum fractional energy loss, DLS
1463 AliMedium( 1, "Air$", 0, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1464 AliMedium( 2,"Nomex$", 1, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1465 AliMedium( 3,"G10$", 2, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1466 AliMedium( 4,"fibre glass$", 3, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1467 //AliMedium( 5,"glass-freon$", 8, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1468 AliMedium( 6,"Al Frame$", 4, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1469 AliMedium( 7,"Al honeycomb$", 5, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1470 AliMedium( 8,"Fre$", 6, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1471 AliMedium( 9,"PCB-S$", 2, 1, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1472 AliMedium(10,"Glass$", 7, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1473 AliMedium(11,"Water$", 9, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1474 AliMedium(12,"STEEL$", 10, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1477 //_____________________________________________________________________________
1478 void AliTOFv5T0::Init()
1481 // Initialise the detector after the geometry has been defined
1483 AliDebug(1, "**************************************"
1485 "**************************************");
1486 AliDebug(1, " Version 4 of TOF initialing, "
1487 "symmetric TOF - Full Coverage version");
1491 fIdFTOA = gMC->VolId("FTOA");
1493 fIdFTOB = gMC->VolId("FTOB");
1494 fIdFTOC = gMC->VolId("FTOC");
1496 fIdFLTA = gMC->VolId("FLTA");
1498 fIdFLTB = gMC->VolId("FLTB");
1499 fIdFLTC = gMC->VolId("FLTC");
1502 AliDebug(1, "**************************************"
1504 "**************************************");
1507 //_____________________________________________________________________________
1508 void AliTOFv5T0::StepManager()
1512 // Procedure called at each step in the Time Of Flight
1515 TLorentzVector mom, pos;
1516 Float_t xm[3],pm[3],xpad[3],ppad[3];
1519 Int_t sector, plate, padx, padz, strip;
1520 Int_t copy, padzid, padxid, stripid, i;
1521 Int_t *idtmed = fIdtmed->GetArray()-499;
1522 Float_t incidenceAngle;
1524 const char* volpath;
1529 gMC->IsTrackEntering()
1530 && gMC->TrackCharge()
1531 //&& gMC->GetMedium()==idtmed[508]
1532 && gMC->CurrentMedium()==idtmed[508]
1533 && gMC->CurrentVolID(copy)==fIdSens
1537 AliMC *mcApplication = (AliMC*)gAlice->GetMCApp();
1539 AddTrackReference(mcApplication->GetCurrentTrackNumber(), AliTrackReference::kTOF);
1540 //AddTrackReference(gAlice->GetMCApp()->GetCurrentTrackNumber());
1542 // getting information about hit volumes
1544 padzid=gMC->CurrentVolOffID(1,copy);
1548 padxid=gMC->CurrentVolOffID(0,copy);
1552 stripid=gMC->CurrentVolOffID(4,copy);
1556 gMC->TrackPosition(pos);
1557 gMC->TrackMomentum(mom);
1559 Double_t normMom=1./mom.Rho();
1561 // getting the coordinates in pad ref system
1563 xm[0] = (Float_t)pos.X();
1564 xm[1] = (Float_t)pos.Y();
1565 xm[2] = (Float_t)pos.Z();
1567 pm[0] = (Float_t)mom.X()*normMom;
1568 pm[1] = (Float_t)mom.Y()*normMom;
1569 pm[2] = (Float_t)mom.Z()*normMom;
1571 gMC->Gmtod(xm,xpad,1); // from MRS to DRS: coordinates convertion
1572 gMC->Gmtod(pm,ppad,2); // from MRS to DRS: direction cosinus convertion
1575 if (TMath::Abs(ppad[1])>1) {
1576 AliWarning("Abs(ppad) > 1");
1577 ppad[1]=TMath::Sign((Float_t)1,ppad[1]);
1579 incidenceAngle = TMath::ACos(ppad[1])*kRaddeg;
1582 if (strip < fTOFGeometry->NStripC()) {
1586 else if (strip >= fTOFGeometry->NStripC() &&
1587 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB()) {
1589 strip = strip - fTOFGeometry->NStripC();
1591 else if (strip >= fTOFGeometry->NStripC() + fTOFGeometry->NStripB() &&
1592 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA()) {
1594 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB();
1596 else if (strip >= fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA() &&
1597 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA() + fTOFGeometry->NStripB()) {
1599 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB() - fTOFGeometry->NStripA();
1603 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB() - fTOFGeometry->NStripA() - fTOFGeometry->NStripB();
1606 volpath=gMC->CurrentVolOffName(7);
1607 index=atoi(&volpath[4]);
1624 hits[6] = mom.Rho();
1629 hits[11]= incidenceAngle;
1630 hits[12]= gMC->Edep();
1631 hits[13]= gMC->TrackLength();
1639 AddT0Hit(mcApplication->GetCurrentTrackNumber(),vol, hits);
1640 //AddT0Hit(gAlice->GetMCApp()->GetCurrentTrackNumber(),vol, hits);
1643 //-------------------------------------------------------------------
1644 void AliTOFv5T0::MaterialMixer(Float_t* p,Float_t* a,Float_t* m,Float_t* d,Float_t* s,Int_t n) const
1646 // a[] atomic weights vector (in)
1647 // (atoms present in more compound appear separately)
1648 // m[] number of corresponding atoms in the mixture (in)
1649 // d[] fraction of the compound relative to the corresponding atoms (in)
1650 // s[] further possible weights " " " " (in)
1652 for (Int_t i = 0; i < n; ++i) {
1653 p[i] = a[i]*m[i]*d[i]*s[i];
1656 for (Int_t i = 0; i < n; ++i) {
1658 // AliInfo(Form((\n weight[%i] = %f (,i,p[i]));