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.19 2007/10/03 10:41:12 arcelli
19 adding tracking-to-local matrices for new AliTOFcluster
21 Revision 1.18 2007/07/27 08:14:48 morsch
22 Write all track references into the same branch.
24 Revision 1.17 2007/05/14 14:41:13 decaro
25 Fix a bug in FTOA volume positionig inside BTOF13,14,15,16,17 in case of holes in 11th and 12th sectors
27 Revision 1.16 2007/05/04 12:59:26 arcelli
28 Change the TOF SM paths for misalignment (one layer up)
30 Revision 1.15 2007/02/19 15:41:55 decaro
31 Coding convention: few corrections
33 Revision 1.14 2006/10/17 15:33:14 arcelli
34 Moving some printout from Info to Debug level
36 Revision 1.13 2006/10/12 16:35:43 arcelli
37 definition of the alignable volumes symbolic names added
39 Revision 1.12 2006/08/22 13:34:46 arcelli
40 removal of effective c++ warnings (C.Zampolli)
42 Revision 1.11 2006/07/12 16:03:44 arcelli
43 updates to match the new numbering of the TOF/TRD mother volumes in FRAME (ALICE convention)
45 Revision 1.10 2006/05/10 18:40:17 hristov
46 Larger strings for the names
48 Revision 1.9 2006/05/04 19:41:42 hristov
49 Possibility for partial TOF geometry (S.Arcelli)
51 Revision 1.8 2006/04/20 22:30:50 hristov
52 Coding conventions (Annalisa)
54 Revision 1.7 2006/04/16 22:29:05 hristov
55 Coding conventions (Annalisa)
57 Revision 1.6 2006/03/20 08:20:35 decaro
58 Al layer: positioning correction
60 Revision 1.5 2006/03/20 07:54:20 decaro
61 Correction of some layer thickness
63 Revision 1.4 2006/03/13 12:35:44 decaro
64 Suppression of fractional Z warning
66 Revision 1.3 2006/02/28 10:38:00 decaro
67 AliTOFGeometry::fAngles, AliTOFGeometry::fHeights,
68 AliTOFGeometry::fDistances arrays: dimension definition in the right
71 Revision 1.2 2006/02/27 18:12:14 decaro
72 Remove in StepManager the dependence of hit indexes from parametrized
75 Revision 1.1 2005/12/15 08:55:33 decaro
76 New TOF geometry description (V5) -G. Cara Romeo and A. De Caro
79 Revision 0.1 2004 November G. Cara Romeo and A. De Caro
80 Implement new TOF geometry version
82 suppress few volume overlaps
83 (in the 4th TOF geometry version),
84 insert the realistic strip numbers and positions
88 ///////////////////////////////////////////////////////////////////////////////
90 // This class contains the functions for version 5 of the Time Of Flight //
93 // VERSION WITH 5 MODULES AND TILTED STRIPS //
95 // FULL COVERAGE VERSION + OPTION for PHOS holes //
100 <img src="picts/AliTOFv5T0Class.gif"> //
104 ///////////////////////////////////////////////////////////////////////////////
107 #include "TGeometry.h"
108 #include "TLorentzVector.h"
110 #include "TVirtualMC.h"
111 #include "TGeoManager.h"
112 #include <TGeoMatrix.h>
113 #include <TGeoPhysicalNode.h>
114 #include <TGeoVolume.h>
116 #include "AliConst.h"
121 #include "AliTrackReference.h"
123 #include "AliTOFGeometry.h"
124 #include "AliTOFGeometryV5.h"
125 #include "AliTOFv5T0.h"
127 extern TDirectory *gDirectory;
128 extern TVirtualMC *gMC;
129 extern TGeoManager *gGeoManager;
131 extern AliRun *gAlice;
135 //_____________________________________________________________________________
136 AliTOFv5T0::AliTOFv5T0():
146 // Default constructor
150 //_____________________________________________________________________________
151 AliTOFv5T0::AliTOFv5T0(const char *name, const char *title):
152 AliTOF(name,title,"tzero"),
162 // Standard constructor
165 // Check that FRAME is there otherwise we have no place where to
169 AliModule* frame = (AliModule*)gAlice->GetModule("FRAME");
171 AliFatal("TOF needs FRAME to be present");
174 if (fTOFGeometry) delete fTOFGeometry;
175 fTOFGeometry = new AliTOFGeometryV5();
177 if(frame->IsVersion()==1) {
178 AliDebug(1,Form("Frame version %d", frame->IsVersion()));
179 AliDebug(1,"Full Coverage for TOF");
182 AliDebug(1,Form("Frame version %d", frame->IsVersion()));
183 AliDebug(1,"TOF with Holes for PHOS");
186 fTOFGeometry->SetHoles(fTOFHoles);
188 //AliTOF::fTOFGeometry = fTOFGeometry;
191 TDirectory* saveDir = gDirectory;
192 gAlice->GetRunLoader()->CdGAFile();
193 fTOFGeometry->Write("TOFgeometry");
198 //_____________________________________________________________________________
199 void AliTOFv5T0::AddAlignableVolumes() const
202 // Create entries for alignable volumes associating the symbolic volume
203 // name with the corresponding volume path. Needs to be syncronized with
204 // eventual changes in the geometry.
210 TString vpL0 = "ALIC_1/B077_1/BSEGMO";
211 TString vpL1 = "_1/BTOF";
213 TString vpL3 = "/FTOA_0";
214 TString vpL4 = "/FLTA_0/FSTR_";
216 TString snSM = "TOF/sm";
217 TString snSTRIP = "/strip";
219 Int_t nSectors=fTOFGeometry->NSectors();
220 Int_t nStrips =fTOFGeometry->NStripA()+
221 2*fTOFGeometry->NStripB()+
222 2*fTOFGeometry->NStripC();
225 // The TOF MRPC Strips
226 // The symbolic names are: TOF/sm00/strip01
232 for (Int_t isect = 0; isect < nSectors; isect++) {
233 for (Int_t istr = 1; istr <= nStrips; istr++) {
235 if (fTOFHoles && (isect==11 || isect==12)) {
238 vpL4 = "/FLTB_0/FSTR_";
242 vpL4 = "/FLTC_0/FSTR_";
248 vpL4 = "/FLTA_0/FSTR_";
262 symName += Form("%02d",isect);
264 symName += Form("%02d",istr);
266 AliDebug(2,"--------------------------------------------");
267 AliDebug(2,Form("Alignable object %d", imod));
268 AliDebug(2,Form("volPath=%s\n",volPath.Data()));
269 AliDebug(2,Form("symName=%s\n",symName.Data()));
270 AliDebug(2,"--------------------------------------------");
272 gGeoManager->SetAlignableEntry(symName.Data(),volPath.Data());
274 //T2L matrices for alignment
275 TGeoPNEntry *e = gGeoManager->GetAlignableEntry(symName.Data());
277 const char *path = e->GetTitle();
278 if (!gGeoManager->cd(path)) {
279 AliFatal(Form("Volume path %s not valid!",path));
281 TGeoHMatrix *globMatrix = gGeoManager->GetCurrentMatrix();
282 Double_t phi = 20.0 * (isect % 18) + 10.0;
283 TGeoHMatrix *t2l = new TGeoHMatrix();
285 t2l->MultiplyLeft(&(globMatrix->Inverse()));
289 AliError(Form("Alignable entry %s is not valid!",symName.Data()));
297 // The TOF supermodules
298 // The symbolic names are: TOF/sm00
302 for (Int_t isect = 0; isect < nSectors; isect++) {
311 symName += Form("%02d",isect);
313 AliDebug(2,"--------------------------------------------");
314 AliDebug(2,Form("Alignable object %d", isect+imod));
315 AliDebug(2,Form("volPath=%s\n",volPath.Data()));
316 AliDebug(2,Form("symName=%s\n",symName.Data()));
317 AliDebug(2,"--------------------------------------------");
319 gGeoManager->SetAlignableEntry(symName.Data(),volPath.Data());
324 //____________________________________________________________________________
325 void AliTOFv5T0::BuildGeometry()
328 // Build TOF ROOT geometry for the ALICE event display
331 const int kColorTOF = 27;
333 TGeometry *globalGeometry = (TGeometry*)gAlice->GetGeometry();
336 top = globalGeometry->GetNode("alice");
338 // Position the different copies
339 const Float_t krTof =(fTOFGeometry->Rmax()+fTOFGeometry->Rmin())/2.;
340 const Float_t khTof = fTOFGeometry->Rmax()-fTOFGeometry->Rmin();
341 const Int_t kNTof = fTOFGeometry->NSectors();
342 const Float_t kangle = k2PI/kNTof;
344 const Float_t kInterCentrModBorder1 = 49.5;
345 const Float_t kInterCentrModBorder2 = 57.5;
349 // define offset for nodes
350 Float_t zOffsetB = (fTOFGeometry->ZlenA()*0.5 + (kInterCentrModBorder1+kInterCentrModBorder2)*0.5)*0.5;
351 Float_t zOffsetA = 0.;
352 // Define TOF basic volume
354 char nodeName0[16], nodeName1[16], nodeName2[16];
355 char nodeName3[16], nodeName4[16], rotMatNum[16];
358 new TBRIK("S_TOF_B","TOF box","void",
359 fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenB()*0.5);
360 new TBRIK("S_TOF_C","TOF box","void",
361 fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenB()*0.5);
363 new TBRIK("S_TOF_A","TOF box","void",
364 fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenA()*0.5);
366 for (Int_t nodeNum=1;nodeNum<19;nodeNum++){
369 sprintf(rotMatNum,"rot50%i",nodeNum);
370 sprintf(nodeName0,"FTO00%i",nodeNum);
371 sprintf(nodeName1,"FTO10%i",nodeNum);
372 sprintf(nodeName2,"FTO20%i",nodeNum);
373 sprintf(nodeName3,"FTO30%i",nodeNum);
374 sprintf(nodeName4,"FTO40%i",nodeNum);
377 sprintf(rotMatNum,"rot5%i",nodeNum);
378 sprintf(nodeName0,"FTO0%i",nodeNum);
379 sprintf(nodeName1,"FTO1%i",nodeNum);
380 sprintf(nodeName2,"FTO2%i",nodeNum);
381 sprintf(nodeName3,"FTO3%i",nodeNum);
382 sprintf(nodeName4,"FTO4%i",nodeNum);
385 new TRotMatrix(rotMatNum,rotMatNum,90,-20*nodeNum,90,90-20*nodeNum,0,0);
386 ang = (4.5-nodeNum) * kangle;
390 node = new TNode(nodeName2,nodeName2,"S_TOF_B", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang), zOffsetB,rotMatNum);
391 node->SetLineColor(kColorTOF);
395 node = new TNode(nodeName3,nodeName3,"S_TOF_C", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang),-zOffsetB,rotMatNum);
396 node->SetLineColor(kColorTOF);
401 node = new TNode(nodeName4,nodeName4,"S_TOF_A", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang), zOffsetA,rotMatNum);
402 node->SetLineColor(kColorTOF);
404 } // end loop on nodeNum
408 //_____________________________________________________________________________
409 void AliTOFv5T0::CreateGeometry()
412 // Create geometry for Time Of Flight version 0
416 <img src="picts/AliTOFv5T0.gif">
420 // Creates common geometry
422 AliTOF::CreateGeometry();
426 //_____________________________________________________________________________
427 void AliTOFv5T0::TOFpc(Float_t xtof, Float_t ytof, Float_t zlenA,
431 // Definition of the Time Of Fligh Resistive Plate Chambers
434 const Float_t kPi = TMath::Pi();
436 const Float_t kInterCentrModBorder1 = 49.5;
437 const Float_t kInterCentrModBorder2 = 57.5;
438 const Float_t kExterInterModBorder1 = 196.0;
439 const Float_t kExterInterModBorder2 = 203.5;
441 const Float_t kLengthExInModBorder = 4.7;
442 const Float_t kLengthInCeModBorder = 7.0;
444 // Al layers over all internal module walls (cm)
445 const Float_t khAlWall = 0.03;
447 // module wall thickness (cm)
448 const Float_t kModuleWallThickness = 0.3;
450 // Al honeycomb layer between strips and cards (cm)
451 const Float_t kHoneycombLayerThickness = 1.5;
453 AliDebug(2,Form("zlenA*0.5 = %d", zlenA*0.5));
454 AliDebug(1, "************************* TOF geometry **************************");
456 // Definition of the Time Of Fligh Resistive Plate Chambers
457 // xFLT, yFLT, zFLT - sizes of TOF modules (large)
459 Float_t xcoor, ycoor, zcoor;
461 Int_t *idtmed = fIdtmed->GetArray()-499;
466 par[2] = zlenA * 0.5;
467 gMC->Gsvolu("FTOA", "BOX ", idtmed[503], par, 3); // fibre glass
472 par[2] = (zlenA*0.5 - kInterCentrModBorder1)*0.5;
473 gMC->Gsvolu("FTOB", "BOX ", idtmed[503], par, 3); // fibre glass
474 gMC->Gsvolu("FTOC", "BOX ", idtmed[503], par, 3); // fibre glass
477 // Positioning of fibre glass modules (FTOA, FTOB and FTOC)
479 //AliMatrix(idrotm[0], 90., 0., 0., 0., 90.,-90.);
480 AliMatrix(idrotm[0], 90., 0., 0., 0., 90.,270.);
485 for(Int_t isec=0;isec<18;isec++){
486 if(fTOFSectors[isec]==-1)continue;
488 sprintf(name, "BTOF%d",isec);
489 if (fTOFHoles && (isec==11||isec==12)) {
490 // if (fTOFHoles && (isec==16||isec==17)) { \\Old 6h convention
492 ycoor = (zlenA*0.5 + kInterCentrModBorder1)*0.5;
494 gMC->Gspos("FTOB", 0, name, xcoor, ycoor, zcoor, idrotm[0], "ONLY");
495 gMC->Gspos("FTOC", 0, name, xcoor,-ycoor, zcoor, idrotm[0], "ONLY");
501 gMC->Gspos("FTOA", 0,name, xcoor, ycoor, zcoor, idrotm[0], "ONLY");
505 // Large not sensitive volumes with Insensitive Freon (FLTA, FLTB and FLTC)
507 Float_t xFLT, yFLT, zFLTA;
509 xFLT = xtof - kModuleWallThickness*2.;
510 yFLT = ytof - kModuleWallThickness*2.;
511 zFLTA = zlenA - kModuleWallThickness*2.;
516 gMC->Gsvolu("FLTA", "BOX ", idtmed[507], par, 3); // Freon mix
521 gMC->Gspos ("FLTA", 0, "FTOA", xcoor, ycoor, zcoor, 0, "ONLY");
526 par[2] = (zlenA*0.5 - kInterCentrModBorder1-kModuleWallThickness)*0.5;
527 gMC->Gsvolu("FLTB", "BOX ", idtmed[507], par, 3); // Freon mix
528 gMC->Gsvolu("FLTC", "BOX ", idtmed[507], par, 3); // Freon mix
532 zcoor = kModuleWallThickness*0.5;
533 gMC->Gspos ("FLTB", 0, "FTOB", xcoor, ycoor, zcoor, 0, "ONLY");
534 gMC->Gspos ("FLTC", 0, "FTOC", xcoor, ycoor,-zcoor, 0, "ONLY");
537 // Layer of Aluminum before detector (FALA, FALB and FALC)
540 par[1] = khAlWall*0.5;
541 par[2] = kInterCentrModBorder1 - (kModuleWallThickness + khAlWall);
542 gMC->Gsvolu("FALA", "BOX ", idtmed[505], par, 3); // Alluminium
545 ycoor = (-yFLT + khAlWall)*0.5;
547 gMC->Gspos ("FALA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
550 par[1] = khAlWall*0.5;
551 par[2] = (kExterInterModBorder2 - kInterCentrModBorder1 - 2.*(kModuleWallThickness + khAlWall))*0.5;
552 gMC->Gsvolu("FALB", "BOX ", idtmed[505], par, 3); // Alluminium
555 ycoor = (-yFLT + khAlWall)*0.5;
556 zcoor = (kExterInterModBorder2 + kInterCentrModBorder1)*0.5;
557 gMC->Gspos ("FALB", 1, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
558 gMC->Gspos ("FALB", 2, "FLTA", xcoor, ycoor,-zcoor, 0, "ONLY");
561 par[1] = khAlWall*0.5;
562 par[2] = (zlenA*0.5 - kExterInterModBorder2 - 2.*(kModuleWallThickness + khAlWall))*0.5;
563 gMC->Gsvolu("FALC", "BOX ", idtmed[505], par, 3); // Alluminium
566 ycoor = (-yFLT + khAlWall)*0.5;
567 zcoor = (kExterInterModBorder2+zlenA*0.5)*0.5;
568 gMC->Gspos ("FALC", 1, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
569 gMC->Gspos ("FALC", 2, "FLTA", xcoor, ycoor,-zcoor, 0, "ONLY");
573 ycoor = (-yFLT + khAlWall)*0.5;
574 zcoor = (zlenA*0.5 - kExterInterModBorder2)*0.5 - kModuleWallThickness*0.5;
575 gMC->Gspos ("FALB", 1, "FLTB", xcoor, ycoor, zcoor, 0, "ONLY");
576 gMC->Gspos ("FALB", 2, "FLTC", xcoor, ycoor,-zcoor, 0, "ONLY");
579 ycoor = (-yFLT + khAlWall)*0.5;
580 zcoor = (kExterInterModBorder2 - kInterCentrModBorder1)*0.5 + kModuleWallThickness*0.5;
581 gMC->Gspos ("FALC", 1, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
582 gMC->Gspos ("FALC", 2, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
585 Float_t y0, alpha, tgal, beta, tgbe, trpa[11];
587 // Fibre glass walls between central and intermediate modules (FWZ1 and FWZ2; holes -> FZ1B, FZ1C, FZ2B)
589 tgal = (yFLT*0.5 - 2.*kLengthInCeModBorder)/(kInterCentrModBorder2 - kInterCentrModBorder1);
590 alpha = TMath::ATan(tgal);
591 beta = (kPi*0.5 - alpha)*0.5;
592 tgbe = TMath::Tan(beta);
596 trpa[3] = kModuleWallThickness;
597 trpa[4] = (kLengthInCeModBorder - kModuleWallThickness*tgbe)*0.5;
598 trpa[5] = (kLengthInCeModBorder + kModuleWallThickness*tgbe)*0.5;
599 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
600 trpa[7] = kModuleWallThickness;
601 trpa[8] = (kLengthInCeModBorder - kModuleWallThickness*tgbe)*0.5;
602 trpa[9] = (kLengthInCeModBorder + kModuleWallThickness*tgbe)*0.5;
603 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
604 gMC->Gsvolu("FWZ1","TRAP", idtmed[503], trpa, 11); // fibre glass
606 AliMatrix (idrotm[1],90., 90.,180.,0.,90.,180.);
607 AliMatrix (idrotm[4],90., 90., 0.,0.,90., 0.);
610 ycoor = -yFLT*0.5 + kLengthInCeModBorder*0.5;
611 zcoor = kInterCentrModBorder1;
612 gMC->Gspos("FWZ1", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[1],"ONLY");
613 gMC->Gspos("FWZ1", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[4],"ONLY");
616 y0 = kLengthInCeModBorder - kModuleWallThickness*0.5*tgbe;
620 trpa[3] = kModuleWallThickness*0.5;
621 trpa[4] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
622 trpa[5] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
623 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
624 trpa[7] = kModuleWallThickness*0.5;
625 trpa[8] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
626 trpa[9] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
627 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
628 gMC->Gsvolu("FZ1B","TRAP", idtmed[503], trpa, 11); // fibre glass
631 ycoor = -yFLT*0.5 + kLengthInCeModBorder*0.5 - kModuleWallThickness*0.25*tgbe;
632 zcoor = -kInterCentrModBorder1 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
633 gMC->Gspos("FZ1B", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[4],"ONLY");
634 gMC->Gspos("FZ1B", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[1],"ONLY");
637 AliMatrix (idrotm[2],90.,270., 0.,0.,90.,180.);
638 AliMatrix (idrotm[5],90.,270.,180.,0.,90., 0.);
641 ycoor = -kLengthInCeModBorder*0.5;
642 zcoor = kInterCentrModBorder2;
643 gMC->Gspos("FWZ1", 3,"FLTA", xcoor, ycoor, zcoor,idrotm[2],"ONLY");
644 gMC->Gspos("FWZ1", 4,"FLTA", xcoor, ycoor,-zcoor,idrotm[5],"ONLY");
647 y0 = kLengthInCeModBorder + kModuleWallThickness*0.5*tgbe;
651 trpa[3] = kModuleWallThickness*0.5;
652 trpa[4] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
653 trpa[5] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
654 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
655 trpa[7] = kModuleWallThickness*0.5;
656 trpa[8] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
657 trpa[9] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
658 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
659 gMC->Gsvolu("FZ1C","TRAP", idtmed[503], trpa, 11); // fibre glass
662 ycoor = -kLengthInCeModBorder*0.5 - kModuleWallThickness*0.25*tgbe;
663 zcoor = -kInterCentrModBorder2 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
664 gMC->Gspos("FZ1C", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[5],"ONLY");
665 gMC->Gspos("FZ1C", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[2],"ONLY");
668 trpa[0] = 0.5*(kInterCentrModBorder2 - kInterCentrModBorder1)/TMath::Cos(alpha);
669 trpa[1] = kModuleWallThickness;
671 trpa[3] = -beta*kRaddeg;
674 gMC->Gsvolu("FWZ2","PARA", idtmed[503], trpa, 6); // fibre glass
676 AliMatrix (idrotm[3], alpha*kRaddeg,90.,90.+alpha*kRaddeg,90.,90.,180.);
677 AliMatrix (idrotm[6],180.-alpha*kRaddeg,90.,90.-alpha*kRaddeg,90.,90., 0.);
681 zcoor = (kInterCentrModBorder2 + kInterCentrModBorder1)*0.5;
682 gMC->Gspos("FWZ2", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[3],"ONLY");
683 gMC->Gspos("FWZ2", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[6],"ONLY");
686 trpa[0] = 0.5*(kInterCentrModBorder2 - kInterCentrModBorder1)/TMath::Cos(alpha);
687 trpa[1] = kModuleWallThickness*0.5;
689 trpa[3] = -beta*kRaddeg;
692 gMC->Gsvolu("FZ2B","PARA", idtmed[503], trpa, 6); // fibre glass
695 ycoor = -yFLT*0.25 - kModuleWallThickness*0.5*tgbe;
696 zcoor = -(kInterCentrModBorder2 + kInterCentrModBorder1)*0.5 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
697 gMC->Gspos("FZ2B", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[6],"ONLY");
698 gMC->Gspos("FZ2B", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[3],"ONLY");
701 // Fibre glass walls between intermediate and lateral modules (FWZ3 and FWZ4)
703 tgal = (yFLT*0.5 - 2.*kLengthExInModBorder)/(kExterInterModBorder2 - kExterInterModBorder1);
704 alpha = TMath::ATan(tgal);
705 beta = (kPi*0.5 - alpha)*0.5;
706 tgbe = TMath::Tan(beta);
710 trpa[3] = kModuleWallThickness;
711 trpa[4] = (kLengthExInModBorder - kModuleWallThickness*tgbe)*0.5;
712 trpa[5] = (kLengthExInModBorder + kModuleWallThickness*tgbe)*0.5;
713 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
714 trpa[7] = kModuleWallThickness;
715 trpa[8] = (kLengthExInModBorder - kModuleWallThickness*tgbe)*0.5;
716 trpa[9] = (kLengthExInModBorder + kModuleWallThickness*tgbe)*0.5;
717 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
718 gMC->Gsvolu("FWZ3","TRAP", idtmed[503], trpa, 11); // fibre glass
721 ycoor = -kLengthExInModBorder*0.5;
722 zcoor = kExterInterModBorder1;
723 gMC->Gspos("FWZ3", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[5],"ONLY");
724 gMC->Gspos("FWZ3", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[2],"ONLY");
728 ycoor = -kLengthExInModBorder*0.5;
729 zcoor = -kExterInterModBorder1 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
730 gMC->Gspos("FWZ3", 5,"FLTB", xcoor, ycoor, zcoor,idrotm[2],"ONLY");
731 gMC->Gspos("FWZ3", 6,"FLTC", xcoor, ycoor,-zcoor,idrotm[5],"ONLY");
735 ycoor = -yFLT*0.5 + kLengthExInModBorder*0.5;
736 zcoor = kExterInterModBorder2;
737 gMC->Gspos("FWZ3", 3,"FLTA", xcoor, ycoor, zcoor,idrotm[4],"ONLY");
738 gMC->Gspos("FWZ3", 4,"FLTA", xcoor, ycoor,-zcoor,idrotm[1],"ONLY");
742 ycoor = -yFLT*0.5 + kLengthExInModBorder*0.5;
743 zcoor = -kExterInterModBorder2 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
744 gMC->Gspos("FWZ3", 7,"FLTB", xcoor, ycoor, zcoor,idrotm[1],"ONLY");
745 gMC->Gspos("FWZ3", 8,"FLTC", xcoor, ycoor,-zcoor,idrotm[4],"ONLY");
748 trpa[0] = 0.5*(kExterInterModBorder2 - kExterInterModBorder1)/TMath::Cos(alpha);
749 trpa[1] = kModuleWallThickness;
751 trpa[3] = -beta*kRaddeg;
754 gMC->Gsvolu("FWZ4","PARA", idtmed[503], trpa, 6); // fibre glass
756 AliMatrix (idrotm[13],alpha*kRaddeg,90.,90.+alpha*kRaddeg,90.,90.,180.);
757 AliMatrix (idrotm[16],180.-alpha*kRaddeg,90.,90.-alpha*kRaddeg,90.,90.,0.);
761 zcoor = (kExterInterModBorder2 + kExterInterModBorder1)*0.5;
762 gMC->Gspos("FWZ4", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[16],"ONLY");
763 gMC->Gspos("FWZ4", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[13],"ONLY");
768 zcoor = -(kExterInterModBorder2 + kExterInterModBorder1)*0.5 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
769 gMC->Gspos("FWZ4", 3,"FLTB", xcoor, ycoor, zcoor,idrotm[13],"ONLY");
770 gMC->Gspos("FWZ4", 4,"FLTC", xcoor, ycoor,-zcoor,idrotm[16],"ONLY");
774 ///////////////// Detector itself //////////////////////
776 const Int_t knx = fTOFGeometry->NpadX(); // number of pads along x
777 const Int_t knz = fTOFGeometry->NpadZ(); // number of pads along z
778 const Float_t kPadX = fTOFGeometry->XPad(); // pad length along x
779 const Float_t kPadZ = fTOFGeometry->ZPad(); // pad length along z
781 // new description for strip volume -double stack strip-
782 // -- all constants are expressed in cm
783 // heigth of different layers
784 const Float_t khhony = 1.0 ; // heigth of HONY Layer
785 const Float_t khpcby = 0.08 ; // heigth of PCB Layer
786 const Float_t khrgly = 0.055 ; // heigth of RED GLASS Layer
788 const Float_t khfiliy = 0.125 ; // heigth of FISHLINE Layer
789 const Float_t khglassy = 0.160*0.5; // heigth of GLASS Layer
790 const Float_t khglfy = khfiliy+2.*khglassy;// heigth of GLASS+FISHLINE Layer
792 const Float_t khcpcby = 0.16 ; // heigth of PCB Central Layer
793 const Float_t kwhonz = 8.1 ; // z dimension of HONEY Layer
794 const Float_t kwpcbz1 = 10.6 ; // z dimension of PCB Lower Layer
795 const Float_t kwpcbz2 = 11.6 ; // z dimension of PCB Upper Layer
796 const Float_t kwcpcbz = 12.4 ; // z dimension of PCB Central Layer
797 const Float_t kwrglz = 8. ; // z dimension of RED GLASS Layer
798 const Float_t kwglfz = 7. ; // z dimension of GLASS+FISHLN Layer
799 const Float_t klsensmx = knx*kPadX; // length of Sensitive Layer
800 const Float_t khsensmy = 0.05;//0.11;//0.16;// heigth of Sensitive Layer
801 const Float_t kwsensmz = knz*kPadZ; // width of Sensitive Layer
803 // heigth of the FSTR Volume (the strip volume)
804 const Float_t khstripy = 2.*khhony+2.*khpcby+4.*khrgly+2.*khglfy+khcpcby;
806 // width of the FSTR Volume (the strip volume)
807 const Float_t kwstripz = kwcpcbz;
808 // length of the FSTR Volume (the strip volume)
809 const Float_t klstripx = fTOFGeometry->StripLength();
811 Float_t parfp[3]={klstripx*0.5,khstripy*0.5,kwstripz*0.5};
812 // Coordinates of the strip center in the strip reference frame;
813 // used for positioning internal strip volumes
814 Float_t posfp[3]={0.,0.,0.};
816 // FSTR volume definition-filling this volume with non sensitive Gas Mixture
817 gMC->Gsvolu("FSTR","BOX",idtmed[507],parfp,3); // Freon mix
819 //-- HONY Layer definition
820 parfp[1] = khhony*0.5;
821 parfp[2] = kwhonz*0.5;
822 gMC->Gsvolu("FHON","BOX",idtmed[501],parfp,3); // honeycomb (Nomex)
823 // positioning 2 HONY Layers on FSTR volume
824 posfp[1] =-khstripy*0.5+parfp[1];
825 gMC->Gspos("FHON",1,"FSTR",0., posfp[1],0.,0,"ONLY");
826 gMC->Gspos("FHON",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
828 //-- PCB Layer definition
829 parfp[1] = khpcby*0.5;
830 parfp[2] = kwpcbz1*0.5;
831 gMC->Gsvolu("FPC1","BOX",idtmed[502],parfp,3); // G10
832 parfp[2] = kwpcbz2*0.5;
833 gMC->Gsvolu("FPC2","BOX",idtmed[502],parfp,3); // G10
834 // positioning 2 PCB Layers on FSTR volume
835 posfp[1] =-khstripy*0.5+khhony+parfp[1];
836 gMC->Gspos("FPC1",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
837 gMC->Gspos("FPC2",1,"FSTR",0., posfp[1],0.,0,"ONLY");
839 //-- central PCB layer definition
840 parfp[1] = khcpcby*0.5;
841 parfp[2] = kwcpcbz*0.5;
842 gMC->Gsvolu("FPCB","BOX",idtmed[502],parfp,3); // G10
843 // positioning the central PCB layer
844 gMC->Gspos("FPCB",1,"FSTR",0.,0.,0.,0,"ONLY");
847 Float_t parfs[3] = {klsensmx*0.5, khsensmy*0.5, kwsensmz*0.5};
848 gMC->Gsvolu("FSEN","BOX",idtmed[508],parfs,3); // sensitive ...
849 // dividing FSEN along z in knz=2 and along x in knx=48
850 gMC->Gsdvn("FSEZ","FSEN",knz,3);
851 gMC->Gsdvn("FPAD","FSEZ",knx,1);
852 // positioning a Sensitive layer inside FPCB
853 gMC->Gspos("FSEN",1,"FPCB",0.,0.,0.,0,"ONLY");
855 //-- RED GLASS Layer definition
856 parfp[1] = khrgly*0.5;
857 parfp[2] = kwrglz*0.5;
858 gMC->Gsvolu("FRGL","BOX",idtmed[509],parfp,3); // glass
859 // positioning 4 RED GLASS Layers on FSTR volume
860 posfp[1] = -khstripy*0.5+khhony+khpcby+parfp[1];
861 gMC->Gspos("FRGL",1,"FSTR",0., posfp[1],0.,0,"ONLY");
862 gMC->Gspos("FRGL",4,"FSTR",0.,-posfp[1],0.,0,"ONLY");
863 posfp[1] = (khcpcby+khrgly)*0.5;
864 gMC->Gspos("FRGL",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
865 gMC->Gspos("FRGL",3,"FSTR",0., posfp[1],0.,0,"ONLY");
867 //-- GLASS Layer definition
868 parfp[1] = khglassy*0.5;
869 parfp[2] = kwglfz*0.5;
870 gMC->Gsvolu("FGLA","BOX",idtmed[509],parfp,3); // glass
872 // positioning 4 GLASS Layers on FSTR volume
873 posfp[1] = -khstripy*0.5+khhony+khpcby+khrgly+parfp[1];
874 gMC->Gspos("FGLA",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
875 gMC->Gspos("FGLA",4,"FSTR",0., posfp[1],0.,0,"ONLY");
876 posfp[1] = khcpcby*0.5+khrgly+khglassy*0.5;
877 gMC->Gspos("FGLA",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
878 gMC->Gspos("FGLA",3,"FSTR",0., posfp[1],0.,0,"ONLY");
880 //-- FREON Layer definition
881 parfp[1] = khfiliy*0.5;
882 gMC->Gsvolu("FFIS","BOX",idtmed[507],parfp,3); // freon
884 // positioning 2 FREON Layers on FSTR volume
885 posfp[1] = -khstripy*0.5+khhony+khpcby+khrgly+khglassy+parfp[1];
886 gMC->Gspos("FFIS",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
887 gMC->Gspos("FFIS",2,"FSTR",0., posfp[1],0.,0,"ONLY");
890 //-- GLASS+FISHLINE Layer definition
891 parfp[1] = khglfy*0.5;
892 parfp[2] = kwglfz*0.5;
893 gMC->Gsvolu("FGLF","BOX",idtmed[504],parfp,3);
895 // positioning 2 GLASS+FISHLINE Layers on FSTR volume
896 posfp[1] = (khcpcby+khglfy)*0.5+khrgly;
897 gMC->Gspos("FGLF",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
898 gMC->Gspos("FGLF",2,"FSTR",0., posfp[1],0.,0,"ONLY");
901 // Positioning the Strips (FSTR) in the FLT volumes
902 Int_t maxStripNumbers [5] ={fTOFGeometry->NStripC(),
903 fTOFGeometry->NStripB(),
904 fTOFGeometry->NStripA(),
905 fTOFGeometry->NStripB(),
906 fTOFGeometry->NStripC()};
908 Int_t totalStrip = 0;
909 Float_t xpos, zpos, ypos, ang;
910 for(Int_t iplate =0; iplate < fTOFGeometry->NPlates(); iplate++){
911 if (iplate>0) totalStrip += maxStripNumbers[iplate-1];
912 for(Int_t istrip =0; istrip < maxStripNumbers[iplate]; istrip++){
914 ang = fTOFGeometry->GetAngles(iplate,istrip);
915 AliDebug(1, Form(" iplate = %1i, istrip = %2i ---> ang = %f", iplate, istrip, ang));
917 if (ang>0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.+ang,90., ang, 90.);
918 else if (ang==0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.,90., 0., 0.);
919 else if (ang<0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.+ang,90.,-ang,270.);
922 zpos = fTOFGeometry->GetDistances(iplate,istrip);
923 ypos = fTOFGeometry->GetHeights(iplate,istrip);
925 gMC->Gspos("FSTR",istrip+totalStrip+1,"FLTA", xpos, ypos,-zpos,idrotm[istrip+totalStrip+1], "ONLY");
928 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");
929 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");
934 // 1.5 cm Al honeycomb layer between strips and cards
936 par[1] = kHoneycombLayerThickness*0.5;
938 gMC->Gsvolu("FPEA", "BOX ", idtmed[506], par, 3); // Al honeycomb
941 ycoor = kHoneycombLayerThickness*0.5;
943 gMC->Gspos ("FPEA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
947 par[1] = kHoneycombLayerThickness*0.5;
948 par[2] = (zlenA*0.5 - kInterCentrModBorder2-kModuleWallThickness)*0.5;
949 gMC->Gsvolu("FPEB", "BOX ", idtmed[506], par, 3); // Al honeycomb
952 ycoor = kHoneycombLayerThickness*0.5;
953 zcoor = (kInterCentrModBorder2-kInterCentrModBorder1)*0.5;
954 gMC->Gspos ("FPEB", 1, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
955 gMC->Gspos ("FPEB", 2, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
960 par[1] = (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
962 gMC->Gsvolu("FAIA", "BOX ", idtmed[500], par, 3); // Air
965 ycoor = kHoneycombLayerThickness + (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
967 gMC->Gspos ("FAIA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
971 par[1] = (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
972 par[2] = (zlenA*0.5 - kInterCentrModBorder2 - kModuleWallThickness)*0.5;
973 gMC->Gsvolu("FAIB", "BOX ", idtmed[500], par, 3); // Air
974 gMC->Gsvolu("FAIC", "BOX ", idtmed[500], par, 3); // Air
977 ycoor = kHoneycombLayerThickness + (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
978 zcoor = (kInterCentrModBorder2-kInterCentrModBorder1)*0.5;
979 gMC->Gspos ("FAIB", 0, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
980 gMC->Gspos ("FAIC", 0, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
983 // start with cards and cooling tubes
984 // finally, cards, cooling tubes and layer for thermal dispersion
987 // see GEOM200 in GEANT manual
991 // card volume definition
992 cardpar[0]= xFLT*0.5;
995 gMC->Gsvolu("FCAR", "BOX ", idtmed[502], cardpar, 3); // PCB Card
997 //alu plate volume definition
1000 gMC->Gsvolu("FALP", "BOX ", idtmed[505], cardpar, 3); // Alu Plate
1002 // tube volume definition
1007 gMC->Gsvolu("FTUB", "TUBE", idtmed[511], tubepar, 3); // cooling tubes (steel)
1012 gMC->Gsvolu("FITU", "TUBE", idtmed[510], tubepar, 3); // cooling water
1013 // positioning water tube into the steel one
1014 gMC->Gspos("FITU",1,"FTUB",0.,0.,0.,0,"ONLY");
1017 AliMatrix(idrotm[99], 180., 90., 90., 90., 90., 0.);
1019 // central module positioning
1020 Float_t cardpos[3], aplpos2;
1021 Float_t stepforcardA = 6.625;
1023 Float_t aplpos1 = -2.;
1028 // tubepos= -53.+tdis;
1030 for (icard=39; icard<54; ++icard) {
1031 cardpos[2]= cardpos[2]+stepforcardA;
1032 aplpos2 = cardpos[2]+0.15;
1033 gMC->Gspos("FCAR",icard,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
1034 gMC->Gspos("FALP",icard,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
1035 gMC->Gspos("FTUB",icard,"FAIA", 0.,cardpos[1],cardpos[2]+tdis,idrotm[99],"ONLY");
1038 // intermediate module positioning
1039 Float_t stepforcardB= 7.05;
1043 for (icard=20; icard<39; ++icard) {
1044 cardpos[2]= cardpos[2]+stepforcardB;
1045 aplpos2 = cardpos[2]+0.15;
1047 gMC->Gspos("FCAR",icard+34,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
1048 gMC->Gspos("FALP",icard+34,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
1049 gMC->Gspos("FTUB",icard+34,"FAIA", 0.,cardpos[1], cardpos[2]+tdis,idrotm[99],"ONLY");
1050 gMC->Gspos("FCAR",58-icard,"FAIA",cardpos[0],cardpos[1], -cardpos[2], 0,"ONLY");
1051 gMC->Gspos("FALP",58-icard,"FAIA",cardpos[0], aplpos1, -aplpos2, 0,"ONLY");
1052 gMC->Gspos("FTUB",58-icard,"FAIA", 0.,cardpos[1],-cardpos[2]-tdis,idrotm[99],"ONLY");
1055 gMC->Gspos("FCAR",icard+34+182,"FAIC",cardpos[0],cardpos[1], cardpos[2]-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1056 gMC->Gspos("FALP",icard+34+182,"FAIC",cardpos[0], aplpos1, aplpos2-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1057 gMC->Gspos("FTUB",icard+34+182,"FAIC", 0.,cardpos[1], cardpos[2]+tdis-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
1058 gMC->Gspos("FCAR",58-icard+ 91,"FAIB",cardpos[0],cardpos[1], -cardpos[2]+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1059 gMC->Gspos("FALP",58-icard+ 91,"FAIB",cardpos[0], aplpos1, -aplpos2+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1060 gMC->Gspos("FTUB",58-icard+ 91,"FAIB", 0.,cardpos[1],-cardpos[2]-tdis+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
1065 // outer module positioning
1066 Float_t stepforcardC= 8.45238;
1069 for (icard=1; icard<20; ++icard) {
1070 cardpos[2]= cardpos[2]+stepforcardC;
1071 aplpos2 = cardpos[2]+0.15;
1073 gMC->Gspos("FCAR",icard+72,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
1074 gMC->Gspos("FALP",icard+72,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
1075 gMC->Gspos("FTUB",icard+72,"FAIA", 0.,cardpos[1], cardpos[2]+tdis,idrotm[99],"ONLY");
1076 gMC->Gspos("FCAR",20-icard,"FAIA",cardpos[0],cardpos[1], -cardpos[2], 0,"ONLY");
1077 gMC->Gspos("FALP",20-icard,"FAIA",cardpos[0], aplpos1, -aplpos2, 0,"ONLY");
1078 gMC->Gspos("FTUB",20-icard,"FAIA", 0.,cardpos[1],-cardpos[2]-tdis,idrotm[99],"ONLY");
1081 gMC->Gspos("FCAR",icard+72+182,"FAIC",cardpos[0],cardpos[1], cardpos[2]-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1082 gMC->Gspos("FALP",icard+72+182,"FAIC",cardpos[0], aplpos1, aplpos2-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1083 gMC->Gspos("FTUB",icard+72+182,"FAIC", 0.,cardpos[1], cardpos[2]+tdis-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
1084 gMC->Gspos("FCAR",20-icard+ 91,"FAIB",cardpos[0],cardpos[1], -cardpos[2]+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1085 gMC->Gspos("FALP",20-icard+ 91,"FAIB",cardpos[0], aplpos1, -aplpos2+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1086 gMC->Gspos("FTUB",20-icard+ 91,"FAIB", 0.,cardpos[1],-cardpos[2]-tdis+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
1091 //_____________________________________________________________________________
1092 void AliTOFv5T0::DrawModule() const
1095 // Draw a shaded view of the Time Of Flight version 4
1098 // Set everything unseen
1099 gMC->Gsatt("*", "seen", -1);
1102 //Set volumes visible
1105 //Set ALIC mother transparent
1106 gMC->Gsatt("ALIC","SEEN", 0);
1109 // Level 1 for TOF volumes
1110 gMC->Gsatt("B077","seen", 0);
1113 // Level 2 for TOF volumes
1114 gMC->Gsatt("B071","seen", 0);
1115 gMC->Gsatt("B074","seen", 0);
1116 gMC->Gsatt("B075","seen", 0);
1117 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
1118 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
1121 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
1122 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
1123 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
1124 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
1125 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
1127 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
1128 gMC->Gsatt("BTO1","seen", 0);
1131 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
1132 gMC->Gsatt("BTO2","seen", 0);
1135 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
1136 gMC->Gsatt("BTO3","seen", 0);
1138 // Level 3 of B071, B074 and B075
1139 gMC->Gsatt("FTOA","SEEN", 0);
1140 if (fTOFHoles) gMC->Gsatt("FTOB","SEEN", 0);
1142 // Level 4 of B071, B074 and B075
1143 gMC->Gsatt("FLTA","SEEN", 0);
1144 if (fTOFHoles) gMC->Gsatt("FLTB","SEEN",0);
1145 if (fTOFHoles) gMC->Gsatt("FLTC","SEEN",0);
1147 // Level 5 of B071, B074 and B075
1148 gMC->Gsatt("FAIA","SEEN",-1); // all FAIA sub-levels skipped -
1149 if (fTOFHoles) gMC->Gsatt("FAIB","SEEN",-1); // all FAIB sub-levels skipped -
1150 if (fTOFHoles) gMC->Gsatt("FAIC","SEEN",-1); // all FAIC sub-levels skipped -
1152 gMC->Gsatt("FALA","SEEN", 0);
1153 if (fTOFHoles) gMC->Gsatt("FALB","SEEN", 0);
1155 gMC->Gsatt("FPEA","SEEN", 1);
1156 if (fTOFHoles) gMC->Gsatt("FPEB","SEEN", 1);
1158 gMC->Gsatt("FSTR","SEEN",-1); // all FSTR sub-levels skipped -
1160 gMC->Gsatt("FWZ1","SEEN", 0);
1161 gMC->Gsatt("FWZ2","SEEN", 0);
1162 gMC->Gsatt("FWZ3","SEEN", 0);
1163 gMC->Gsatt("FWZ4","SEEN", 0);
1165 gMC->Gsatt("FZ1B","SEEN", 0);
1166 gMC->Gsatt("FZ1C","SEEN", 0);
1167 gMC->Gsatt("FZ2B","SEEN", 0);
1170 gMC->Gdopt("hide", "on");
1171 gMC->Gdopt("shad", "on");
1172 gMC->Gsatt("*", "fill", 7);
1173 gMC->SetClipBox(".");
1174 gMC->SetClipBox("*", 100, 1000, 100, 1000, 100, 1000);
1175 gMC->DefaultRange();
1176 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
1177 gMC->Gdhead(1111, "Time Of Flight");
1178 gMC->Gdman(18, 3, "MAN");
1179 gMC->Gdopt("hide","off");
1181 //_____________________________________________________________________________
1182 void AliTOFv5T0::DrawDetectorModules() const
1185 // Draw a shaded view of the TOF detector version 4
1188 // Set everything unseen
1189 gMC->Gsatt("*", "seen", -1);
1192 //Set volumes visible
1195 //Set ALIC mother transparent
1196 gMC->Gsatt("ALIC","SEEN", 0);
1199 // Level 1 for TOF volumes
1200 gMC->Gsatt("B077","seen", 0);
1203 // Level 2 for TOF volumes
1204 gMC->Gsatt("B071","seen", 0);
1205 gMC->Gsatt("B074","seen", 0);
1206 gMC->Gsatt("B075","seen", 0);
1207 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
1208 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
1211 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
1212 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
1213 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
1214 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
1215 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
1217 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
1218 gMC->Gsatt("BTO1","seen", 0);
1221 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
1222 gMC->Gsatt("BTO2","seen", 0);
1225 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
1226 gMC->Gsatt("BTO3","seen", 0);
1228 // Level 3 of B071, B075 and B074
1229 gMC->Gsatt("FTOA","seen",-2); // all FTOA sub-levels skipped -
1231 gMC->Gsatt("FTOB","seen",-2); // all FTOB sub-levels skipped -
1232 gMC->Gsatt("FTOC","seen",-2); // all FTOC sub-levels skipped -
1235 gMC->Gdopt("hide","on");
1236 gMC->Gdopt("shad","on");
1237 gMC->Gsatt("*", "fill", 5);
1238 gMC->SetClipBox(".");
1239 gMC->SetClipBox("*", 100, 1000, 100, 1000, 0, 1000);
1240 gMC->DefaultRange();
1241 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
1242 gMC->Gdhead(1111,"TOF detector");
1243 gMC->Gdman(18, 3, "MAN");
1244 gMC->Gdopt("hide","off");
1247 //_____________________________________________________________________________
1248 void AliTOFv5T0::DrawDetectorStrips() const
1251 // Draw a shaded view of the TOF strips for version 4
1254 // Set everything unseen
1255 gMC->Gsatt("*", "seen", -1);
1258 //Set volumes visible
1261 //Set ALIC mother transparent
1262 gMC->Gsatt("ALIC","SEEN", 0);
1265 // Level 1 for TOF volumes
1266 gMC->Gsatt("B077","seen", 0);
1269 // Level 2 for TOF volumes
1270 gMC->Gsatt("B071","seen", 0);
1271 gMC->Gsatt("B074","seen", 0);
1272 gMC->Gsatt("B075","seen", 0);
1273 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
1274 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
1277 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
1278 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
1279 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
1280 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
1281 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
1283 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
1284 gMC->Gsatt("BTO1","seen", 0);
1287 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
1288 gMC->Gsatt("BTO2","seen", 0);
1291 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
1292 gMC->Gsatt("BTO3","seen", 0);
1294 // Level 3 of B071, B074 and B075
1295 gMC->Gsatt("FTOA","SEEN", 0);
1297 gMC->Gsatt("FTOB","SEEN", 0);
1298 gMC->Gsatt("FTOC","SEEN", 0);
1301 // Level 4 of B071, B074 and B075
1302 gMC->Gsatt("FLTA","SEEN", 0);
1304 gMC->Gsatt("FLTB","SEEN", 0);
1305 gMC->Gsatt("FLTC","SEEN", 0);
1308 // Level 5 of B071, B074 and B075
1309 gMC->Gsatt("FAIA","SEEN",-1); // all FAIA sub-levels skipped -
1311 gMC->Gsatt("FAIB","SEEN",-1); // all FAIB sub-levels skipped -
1312 gMC->Gsatt("FAIC","SEEN",-1); // all FAIC sub-levels skipped -
1315 gMC->Gsatt("FALA","SEEN", 0);
1316 if (fTOFHoles) gMC->Gsatt("FALB","SEEN", 0);
1318 gMC->Gsatt("FPEA","SEEN", 0);
1319 if (fTOFHoles) gMC->Gsatt("FPEB","SEEN", 0);
1321 gMC->Gsatt("FSTR","SEEN",-2); // all FSTR sub-levels skipped -
1323 gMC->Gsatt("FWZ1","SEEN", 0);
1324 gMC->Gsatt("FWZ2","SEEN", 0);
1325 gMC->Gsatt("FWZ3","SEEN", 0);
1326 gMC->Gsatt("FWZ4","SEEN", 0);
1328 gMC->Gsatt("FZ1B","SEEN", 0);
1329 gMC->Gsatt("FZ1C","SEEN", 0);
1330 gMC->Gsatt("FZ2B","SEEN", 0);
1337 gMC->Gsatt("FALP","SEEN",0);
1338 gMC->Gsatt("FCAR","SEEN",0);
1339 gMC->Gsatt("FTUB","SEEN",-1); // all FTUB sub-levels skipped -
1342 gMC->Gsatt("FITU","SEEN",0);
1347 gMC->Gsatt("FGLF","SEEN",0);
1348 gMC->Gsatt("FHON","SEEN",0);
1349 gMC->Gsatt("FPC1","SEEN",0);
1350 gMC->Gsatt("FPC2","SEEN",0);
1351 gMC->Gsatt("FPCB","SEEN",0);
1352 gMC->Gsatt("FRGL","SEEN",0);
1354 // Level 2 of FPCB => Level 3 of FSTR
1355 gMC->Gsatt("FSEN","SEEN",0);
1356 gMC->Gsatt("FSEZ","SEEN",0);
1357 gMC->Gsatt("FPAD","SEEN",1);
1360 gMC->Gdopt("hide","on");
1361 gMC->Gdopt("shad","on");
1362 gMC->Gsatt("*", "fill", 5);
1363 gMC->SetClipBox(".");
1364 gMC->SetClipBox("*", 0, 1000, 0, 1000, 0, 1000);
1365 gMC->DefaultRange();
1366 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
1367 gMC->Gdhead(1111,"TOF Strips");
1368 gMC->Gdman(18, 3, "MAN");
1369 gMC->Gdopt("hide","off");
1372 //_____________________________________________________________________________
1373 void AliTOFv5T0::CreateMaterials()
1376 // Define materials for the Time Of Flight
1379 //AliTOF::CreateMaterials();
1381 AliMagF *magneticField = (AliMagF*)gAlice->Field();
1383 Int_t isxfld = magneticField->Integ();
1384 Float_t sxmgmx = magneticField->Max();
1386 Float_t we[7], ae[7], na[7], fr[7], vl[7];
1389 //--- Quartz (SiO2) to simulate float glass
1390 // density tuned to have correct float glass
1392 Float_t aq[2] = { 28.0855,15.9994 };
1393 Float_t zq[2] = { 14.,8. };
1394 Float_t wq[2] = { 1.,2. };
1395 Float_t dq = 2.55; // std value: 2.2
1399 Float_t anox[4] = {12.01,1.01,16.00,14.01};
1400 Float_t znox[4] = { 6., 1., 8., 7.};
1401 Float_t wnox[4] = {14., 22., 2., 2.};
1402 Float_t dnox = 0.048;
1406 Float_t ag10[4] = {28.09,12.01,1.01,16.00};
1407 Float_t zg10[4] = {14., 6., 1., 8.};
1410 for (i = 0; i < nlmatg10; ++i) {
1426 MaterialMixer(we,ae,na,fr,vl,5);
1432 Float_t densg10 = 1.7;
1435 Float_t awa[2] = { 1., 16. };
1436 Float_t zwa[2] = { 1., 8. };
1437 Float_t wwa[2] = { 2., 1. };
1442 Float_t asteel[4] = { 55.847,51.9961,58.6934,28.0855 };
1443 Float_t zsteel[4] = { 26.,24.,28.,14. };
1444 Float_t wsteel[4] = { .715,.18,.1,.005 };
1447 Float_t aAir[4]={12.0107,14.0067,15.9994,39.948};
1448 Float_t zAir[4]={6.,7.,8.,18.};
1449 Float_t wAir[4]={0.000124,0.755267,0.231781,0.012827};
1450 Float_t dAir = 1.20479E-3;
1453 Float_t afg[4] = {28.09,16.00,12.01,1.01};
1454 Float_t zfg[4] = {14., 8., 6., 1.};
1455 Float_t wfg[4] = {0.12906,0.29405,0.51502,0.06187};
1456 Float_t dfg = 1.111;
1459 // --- Freon C2F4H2 + SF6
1460 Float_t afre[4]= {12.01,1.01,19.00,32.07};
1461 Float_t zfre[4]= { 6., 1., 9., 16.};
1462 Float_t wfre[4]= {0.21250,0.01787,0.74827,0.021355};
1463 Float_t densfre= 0.00375;
1466 //char namat[15] = " ";
1467 //Float_t ama[2], zma[2], dma, radl, absl, buf[1];
1470 AliMixture ( 0, "Air$", aAir, zAir, dAir, 4, wAir);
1471 AliMixture ( 1, "Nomex$", anox, znox, dnox, nnox, wnox);
1472 AliMixture ( 2, "G10$", ag10, zg10, densg10, nlmatg10, wmatg10);
1473 AliMixture ( 3, "fibre glass$", afg, zfg, dfg, nfg, wfg);
1474 AliMaterial( 4, "Al $", 26.98, 13., 2.7, 8.9, 37.2);
1475 AliMaterial( 5, "Al honeycomb$", 26.98, 13., 0.0496, 483., 2483.);
1476 AliMixture ( 6, "Freon$", afre, zfre, densfre, nfre, wfre);
1477 AliMixture ( 7, "Glass$", aq, zq, dq, nq, wq);
1479 // get freon and glass
1480 gMC->Gfmate((*fIdmate)[6],namat,ama[0],zma[0],dma,radl,absl,buf,nbuf);
1481 gMC->Gfmate((*fIdmate)[7],namat,ama[1],zma[1],dma,radl,absl,buf,nbuf);
1484 Float_t wgfr[2]= {0.0011,0.9989};
1485 Float_t dgfr = 1.434;
1487 AliMixture ( 8, "glass-freon$", ama, zma, dgfr, ngfr, wgfr);
1489 AliMixture ( 9, "Water$", awa, zwa, dwa, nwa, wwa);
1490 AliMixture (10, "STAINLESS STEEL$", asteel, zsteel, 7.88, 4, wsteel);
1492 Float_t epsil, stmin, deemax, stemax;
1495 // EPSIL = 0.1 ! Tracking precision,
1496 // STEMAX = 0.1 ! Maximum displacement for multiple scattering
1497 // DEEMAX = 0.1 ! Maximum fractional energy loss, DLS
1501 epsil = .001; // Tracking precision,
1502 stemax = -1.; // Maximum displacement for multiple scattering
1503 deemax = -.3; // Maximum fractional energy loss, DLS
1506 AliMedium( 1, "Air$", 0, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1507 AliMedium( 2,"Nomex$", 1, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1508 AliMedium( 3,"G10$", 2, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1509 AliMedium( 4,"fibre glass$", 3, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1510 //AliMedium( 5,"glass-freon$", 8, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1511 AliMedium( 6,"Al Frame$", 4, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1512 AliMedium( 7,"Al honeycomb$", 5, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1513 AliMedium( 8,"Fre$", 6, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1514 AliMedium( 9,"PCB-S$", 2, 1, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1515 AliMedium(10,"Glass$", 7, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1516 AliMedium(11,"Water$", 9, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1517 AliMedium(12,"STEEL$", 10, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1520 //_____________________________________________________________________________
1521 void AliTOFv5T0::Init()
1524 // Initialise the detector after the geometry has been defined
1526 AliDebug(1, "**************************************"
1528 "**************************************");
1529 AliDebug(1, " Version 4 of TOF initialing, "
1530 "symmetric TOF - Full Coverage version");
1534 fIdFTOA = gMC->VolId("FTOA");
1536 fIdFTOB = gMC->VolId("FTOB");
1537 fIdFTOC = gMC->VolId("FTOC");
1539 fIdFLTA = gMC->VolId("FLTA");
1541 fIdFLTB = gMC->VolId("FLTB");
1542 fIdFLTC = gMC->VolId("FLTC");
1545 AliDebug(1, "**************************************"
1547 "**************************************");
1550 //_____________________________________________________________________________
1551 void AliTOFv5T0::StepManager()
1555 // Procedure called at each step in the Time Of Flight
1558 TLorentzVector mom, pos;
1559 Float_t xm[3],pm[3],xpad[3],ppad[3];
1562 Int_t sector, plate, padx, padz, strip;
1563 Int_t copy, padzid, padxid, stripid, i;
1564 Int_t *idtmed = fIdtmed->GetArray()-499;
1565 Float_t incidenceAngle;
1567 const char* volpath;
1572 gMC->IsTrackEntering()
1573 && gMC->TrackCharge()
1574 //&& gMC->GetMedium()==idtmed[508]
1575 && gMC->CurrentMedium()==idtmed[508]
1576 && gMC->CurrentVolID(copy)==fIdSens
1580 AliMC *mcApplication = (AliMC*)gAlice->GetMCApp();
1582 AddTrackReference(mcApplication->GetCurrentTrackNumber(), AliTrackReference::kTOF);
1583 //AddTrackReference(gAlice->GetMCApp()->GetCurrentTrackNumber());
1585 // getting information about hit volumes
1587 padzid=gMC->CurrentVolOffID(1,copy);
1591 padxid=gMC->CurrentVolOffID(0,copy);
1595 stripid=gMC->CurrentVolOffID(4,copy);
1599 gMC->TrackPosition(pos);
1600 gMC->TrackMomentum(mom);
1602 Double_t normMom=1./mom.Rho();
1604 // getting the coordinates in pad ref system
1606 xm[0] = (Float_t)pos.X();
1607 xm[1] = (Float_t)pos.Y();
1608 xm[2] = (Float_t)pos.Z();
1610 pm[0] = (Float_t)mom.X()*normMom;
1611 pm[1] = (Float_t)mom.Y()*normMom;
1612 pm[2] = (Float_t)mom.Z()*normMom;
1614 gMC->Gmtod(xm,xpad,1); // from MRS to DRS: coordinates convertion
1615 gMC->Gmtod(pm,ppad,2); // from MRS to DRS: direction cosinus convertion
1618 if (TMath::Abs(ppad[1])>1) {
1619 AliWarning("Abs(ppad) > 1");
1620 ppad[1]=TMath::Sign((Float_t)1,ppad[1]);
1622 incidenceAngle = TMath::ACos(ppad[1])*kRaddeg;
1625 if (strip < fTOFGeometry->NStripC()) {
1629 else if (strip >= fTOFGeometry->NStripC() &&
1630 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB()) {
1632 strip = strip - fTOFGeometry->NStripC();
1634 else if (strip >= fTOFGeometry->NStripC() + fTOFGeometry->NStripB() &&
1635 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA()) {
1637 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB();
1639 else if (strip >= fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA() &&
1640 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA() + fTOFGeometry->NStripB()) {
1642 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB() - fTOFGeometry->NStripA();
1646 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB() - fTOFGeometry->NStripA() - fTOFGeometry->NStripB();
1649 volpath=gMC->CurrentVolOffName(7);
1650 index=atoi(&volpath[4]);
1667 hits[6] = mom.Rho();
1672 hits[11]= incidenceAngle;
1673 hits[12]= gMC->Edep();
1674 hits[13]= gMC->TrackLength();
1682 AddT0Hit(mcApplication->GetCurrentTrackNumber(),vol, hits);
1683 //AddT0Hit(gAlice->GetMCApp()->GetCurrentTrackNumber(),vol, hits);
1686 //-------------------------------------------------------------------
1687 void AliTOFv5T0::MaterialMixer(Float_t* p,Float_t* a,Float_t* m,Float_t* d,Float_t* s,Int_t n) const
1689 // a[] atomic weights vector (in)
1690 // (atoms present in more compound appear separately)
1691 // m[] number of corresponding atoms in the mixture (in)
1692 // d[] fraction of the compound relative to the corresponding atoms (in)
1693 // s[] further possible weights " " " " (in)
1695 for (Int_t i = 0; i < n; ++i) {
1696 p[i] = a[i]*m[i]*d[i]*s[i];
1699 for (Int_t i = 0; i < n; ++i) {
1701 // AliInfo(Form((\n weight[%i] = %f (,i,p[i]));