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.22 2007/10/07 19:40:46 decaro
19 right handling of l2t matrices and alignable entries in case of TOF staging geometry
21 Revision 1.21 2007/10/04 13:15:30 arcelli
22 updates to comply with AliTOFGeometryV5 becoming AliTOFGeometry
24 Revision 1.20 2007/10/03 18:07:22 arcelli
25 right handling of l2t matrices and alignable entries in case of TOF holes (Annalisa)
27 Revision 1.19 2007/10/03 10:41:12 arcelli
28 adding tracking-to-local matrices for new AliTOFcluster
30 Revision 1.18 2007/07/27 08:14:48 morsch
31 Write all track references into the same branch.
33 Revision 1.17 2007/05/14 14:41:13 decaro
34 Fix a bug in FTOA volume positionig inside BTOF13,14,15,16,17 in case of holes in 11th and 12th sectors
36 Revision 1.16 2007/05/04 12:59:26 arcelli
37 Change the TOF SM paths for misalignment (one layer up)
39 Revision 1.15 2007/02/19 15:41:55 decaro
40 Coding convention: few corrections
42 Revision 1.14 2006/10/17 15:33:14 arcelli
43 Moving some printout from Info to Debug level
45 Revision 1.13 2006/10/12 16:35:43 arcelli
46 definition of the alignable volumes symbolic names added
48 Revision 1.12 2006/08/22 13:34:46 arcelli
49 removal of effective c++ warnings (C.Zampolli)
51 Revision 1.11 2006/07/12 16:03:44 arcelli
52 updates to match the new numbering of the TOF/TRD mother volumes in FRAME (ALICE convention)
54 Revision 1.10 2006/05/10 18:40:17 hristov
55 Larger strings for the names
57 Revision 1.9 2006/05/04 19:41:42 hristov
58 Possibility for partial TOF geometry (S.Arcelli)
60 Revision 1.8 2006/04/20 22:30:50 hristov
61 Coding conventions (Annalisa)
63 Revision 1.7 2006/04/16 22:29:05 hristov
64 Coding conventions (Annalisa)
66 Revision 1.6 2006/03/20 08:20:35 decaro
67 Al layer: positioning correction
69 Revision 1.5 2006/03/20 07:54:20 decaro
70 Correction of some layer thickness
72 Revision 1.4 2006/03/13 12:35:44 decaro
73 Suppression of fractional Z warning
75 Revision 1.3 2006/02/28 10:38:00 decaro
76 AliTOFGeometry::fAngles, AliTOFGeometry::fHeights,
77 AliTOFGeometry::fDistances arrays: dimension definition in the right
80 Revision 1.2 2006/02/27 18:12:14 decaro
81 Remove in StepManager the dependence of hit indexes from parametrized
84 Revision 1.1 2005/12/15 08:55:33 decaro
85 New TOF geometry description (V5) -G. Cara Romeo and A. De Caro
88 Revision 0.1 2004 November G. Cara Romeo and A. De Caro
89 Implement new TOF geometry version
91 suppress few volume overlaps
92 (in the 4th TOF geometry version),
93 insert the realistic strip numbers and positions
97 ///////////////////////////////////////////////////////////////////////////////
99 // This class contains the functions for version 5 of the Time Of Flight //
102 // VERSION WITH 5 MODULES AND TILTED STRIPS //
104 // FULL COVERAGE VERSION + OPTION for PHOS holes //
109 <img src="picts/AliTOFv5T0Class.gif"> //
113 ///////////////////////////////////////////////////////////////////////////////
115 #include <TDirectory.h>
116 #include <TGeoGlobalMagField.h>
117 #include <TGeoManager.h>
118 #include <TGeoMatrix.h>
119 #include <TGeoPhysicalNode.h>
120 #include <TGeoVolume.h>
121 #include <TLorentzVector.h>
122 #include <TVirtualMC.h>
124 #include "AliConst.h"
125 #include "AliGeomManager.h"
130 #include "AliTrackReference.h"
132 #include "AliTOFGeometry.h"
133 #include "AliTOFv5T0.h"
135 extern TDirectory *gDirectory;
136 extern TVirtualMC *gMC;
137 extern TGeoManager *gGeoManager;
139 extern AliRun *gAlice;
143 //_____________________________________________________________________________
144 AliTOFv5T0::AliTOFv5T0():
154 // Default constructor
158 //_____________________________________________________________________________
159 AliTOFv5T0::AliTOFv5T0(const char *name, const char *title):
160 AliTOF(name,title,"tzero"),
170 // Standard constructor
173 // Check that FRAME is there otherwise we have no place where to
177 AliModule* frame = (AliModule*)gAlice->GetModule("FRAME");
179 AliFatal("TOF needs FRAME to be present");
182 if (fTOFGeometry) delete fTOFGeometry;
183 fTOFGeometry = new AliTOFGeometry();
185 if(frame->IsVersion()==1) {
186 AliDebug(1,Form("Frame version %d", frame->IsVersion()));
187 AliDebug(1,"Full Coverage for TOF");
190 AliDebug(1,Form("Frame version %d", frame->IsVersion()));
191 AliDebug(1,"TOF with Holes for PHOS");
194 fTOFGeometry->SetHoles(fTOFHoles);
197 if (fTOFGeometry) delete fTOFGeometry;
198 fTOFGeometry = new AliTOFGeometry();
199 fTOFGeometry->SetHoles(fTOFHoles);
201 //AliTOF::fTOFGeometry = fTOFGeometry;
204 TDirectory* saveDir = gDirectory;
205 AliRunLoader::Instance()->CdGAFile();
206 fTOFGeometry->Write("TOFgeometry");
211 //_____________________________________________________________________________
212 void AliTOFv5T0::AddAlignableVolumes() const
215 // Create entries for alignable volumes associating the symbolic volume
216 // name with the corresponding volume path. Needs to be syncronized with
217 // eventual changes in the geometry.
220 AliGeomManager::ELayerID idTOF = AliGeomManager::kTOF;
221 Int_t modUID, modnum=0;
226 TString vpL0 = "ALIC_1/B077_1/BSEGMO";
227 TString vpL1 = "_1/BTOF";
229 TString vpL3 = "/FTOA_0";
230 TString vpL4 = "/FLTA_0/FSTR_";
232 TString snSM = "TOF/sm";
233 TString snSTRIP = "/strip";
235 Int_t nSectors=fTOFGeometry->NSectors();
236 Int_t nStrips =fTOFGeometry->NStripA()+
237 2*fTOFGeometry->NStripB()+
238 2*fTOFGeometry->NStripC();
241 // The TOF MRPC Strips
242 // The symbolic names are: TOF/sm00/strip01
248 for (Int_t isect = 0; isect < nSectors; isect++) {
249 for (Int_t istr = 1; istr <= nStrips; istr++) {
251 modUID = AliGeomManager::LayerToVolUID(idTOF,modnum++);
252 if (fTOFSectors[isect]==-1) continue;
254 if (fTOFHoles && (isect==13 || isect==14 || isect==15)) {
257 vpL4 = "/FLTB_0/FSTR_";
261 vpL4 = "/FLTC_0/FSTR_";
267 vpL4 = "/FLTA_0/FSTR_";
281 symName += Form("%02d",isect);
283 symName += Form("%02d",istr);
285 AliDebug(2,"--------------------------------------------");
286 AliDebug(2,Form("Alignable object %d", imod));
287 AliDebug(2,Form("volPath=%s\n",volPath.Data()));
288 AliDebug(2,Form("symName=%s\n",symName.Data()));
289 AliDebug(2,"--------------------------------------------");
291 if(!gGeoManager->SetAlignableEntry(symName.Data(),volPath.Data(),modUID))
292 AliError(Form("Alignable entry %s not set",symName.Data()));
294 //T2L matrices for alignment
295 TGeoPNEntry *e = gGeoManager->GetAlignableEntryByUID(modUID);
297 TGeoHMatrix *globMatrix = e->GetGlobalOrig();
298 Double_t phi = 20.0 * (isect % 18) + 10.0;
299 TGeoHMatrix *t2l = new TGeoHMatrix();
301 t2l->MultiplyLeft(&(globMatrix->Inverse()));
305 AliError(Form("Alignable entry %s is not valid!",symName.Data()));
313 // The TOF supermodules
314 // The symbolic names are: TOF/sm00
318 for (Int_t isect = 0; isect < nSectors; isect++) {
327 symName += Form("%02d",isect);
329 AliDebug(2,"--------------------------------------------");
330 AliDebug(2,Form("Alignable object %d", isect+imod));
331 AliDebug(2,Form("volPath=%s\n",volPath.Data()));
332 AliDebug(2,Form("symName=%s\n",symName.Data()));
333 AliDebug(2,"--------------------------------------------");
335 gGeoManager->SetAlignableEntry(symName.Data(),volPath.Data());
341 //_____________________________________________________________________________
342 void AliTOFv5T0::CreateGeometry()
345 // Create geometry for Time Of Flight version 0
349 <img src="picts/AliTOFv5T0.gif">
353 // Creates common geometry
355 AliTOF::CreateGeometry();
359 //_____________________________________________________________________________
360 void AliTOFv5T0::TOFpc(Float_t xtof, Float_t ytof, Float_t zlenA,
364 // Definition of the Time Of Fligh Resistive Plate Chambers
367 const Float_t kPi = TMath::Pi();
369 const Float_t kInterCentrModBorder1 = 49.5;
370 const Float_t kInterCentrModBorder2 = 57.5;
371 const Float_t kExterInterModBorder1 = 196.0;
372 const Float_t kExterInterModBorder2 = 203.5;
374 const Float_t kLengthExInModBorder = 4.7;
375 const Float_t kLengthInCeModBorder = 7.0;
377 // Al layers over all internal module walls (cm)
378 const Float_t khAlWall = 0.03;
380 // module wall thickness (cm)
381 const Float_t kModuleWallThickness = 0.3;
383 // Al honeycomb layer between strips and cards (cm)
384 const Float_t kHoneycombLayerThickness = 1.5;
386 AliDebug(2,Form("zlenA*0.5 = %d", zlenA*0.5));
387 AliDebug(1, "************************* TOF geometry **************************");
389 // Definition of the Time Of Fligh Resistive Plate Chambers
390 // xFLT, yFLT, zFLT - sizes of TOF modules (large)
392 Float_t xcoor, ycoor, zcoor;
394 Int_t *idtmed = fIdtmed->GetArray()-499;
399 par[2] = zlenA * 0.5;
400 gMC->Gsvolu("FTOA", "BOX ", idtmed[503], par, 3); // fibre glass
405 par[2] = (zlenA*0.5 - kInterCentrModBorder1)*0.5;
406 gMC->Gsvolu("FTOB", "BOX ", idtmed[503], par, 3); // fibre glass
407 gMC->Gsvolu("FTOC", "BOX ", idtmed[503], par, 3); // fibre glass
410 // Positioning of fibre glass modules (FTOA, FTOB and FTOC)
412 //AliMatrix(idrotm[0], 90., 0., 0., 0., 90.,-90.);
413 AliMatrix(idrotm[0], 90., 0., 0., 0., 90.,270.);
418 for(Int_t isec=0;isec<18;isec++){
419 if(fTOFSectors[isec]==-1)continue;
421 sprintf(name, "BTOF%d",isec);
422 if (fTOFHoles && (isec==13 || isec==14 || isec==15)) {
423 // if (fTOFHoles && (isec==16||isec==17)) { \\Old 6h convention
425 ycoor = (zlenA*0.5 + kInterCentrModBorder1)*0.5;
427 gMC->Gspos("FTOB", 0, name, xcoor, ycoor, zcoor, idrotm[0], "ONLY");
428 gMC->Gspos("FTOC", 0, name, xcoor,-ycoor, zcoor, idrotm[0], "ONLY");
434 gMC->Gspos("FTOA", 0,name, xcoor, ycoor, zcoor, idrotm[0], "ONLY");
438 // Large not sensitive volumes with Insensitive Freon (FLTA, FLTB and FLTC)
440 Float_t xFLT, yFLT, zFLTA;
442 xFLT = xtof - kModuleWallThickness*2.;
443 yFLT = ytof - kModuleWallThickness*2.;
444 zFLTA = zlenA - kModuleWallThickness*2.;
449 gMC->Gsvolu("FLTA", "BOX ", idtmed[507], par, 3); // Freon mix
454 gMC->Gspos ("FLTA", 0, "FTOA", xcoor, ycoor, zcoor, 0, "ONLY");
459 par[2] = (zlenA*0.5 - kInterCentrModBorder1-kModuleWallThickness)*0.5;
460 gMC->Gsvolu("FLTB", "BOX ", idtmed[507], par, 3); // Freon mix
461 gMC->Gsvolu("FLTC", "BOX ", idtmed[507], par, 3); // Freon mix
465 zcoor = kModuleWallThickness*0.5;
466 gMC->Gspos ("FLTB", 0, "FTOB", xcoor, ycoor, zcoor, 0, "ONLY");
467 gMC->Gspos ("FLTC", 0, "FTOC", xcoor, ycoor,-zcoor, 0, "ONLY");
470 // Layer of Aluminum before detector (FALA, FALB and FALC)
473 par[1] = khAlWall*0.5;
474 par[2] = kInterCentrModBorder1 - (kModuleWallThickness + khAlWall);
475 gMC->Gsvolu("FALA", "BOX ", idtmed[505], par, 3); // Alluminium
478 ycoor = (-yFLT + khAlWall)*0.5;
480 gMC->Gspos ("FALA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
483 par[1] = khAlWall*0.5;
484 par[2] = (kExterInterModBorder2 - kInterCentrModBorder1 - 2.*(kModuleWallThickness + khAlWall))*0.5;
485 gMC->Gsvolu("FALB", "BOX ", idtmed[505], par, 3); // Alluminium
488 ycoor = (-yFLT + khAlWall)*0.5;
489 zcoor = (kExterInterModBorder2 + kInterCentrModBorder1)*0.5;
490 gMC->Gspos ("FALB", 1, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
491 gMC->Gspos ("FALB", 2, "FLTA", xcoor, ycoor,-zcoor, 0, "ONLY");
494 par[1] = khAlWall*0.5;
495 par[2] = (zlenA*0.5 - kExterInterModBorder2 - 2.*(kModuleWallThickness + khAlWall))*0.5;
496 gMC->Gsvolu("FALC", "BOX ", idtmed[505], par, 3); // Alluminium
499 ycoor = (-yFLT + khAlWall)*0.5;
500 zcoor = (kExterInterModBorder2+zlenA*0.5)*0.5;
501 gMC->Gspos ("FALC", 1, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
502 gMC->Gspos ("FALC", 2, "FLTA", xcoor, ycoor,-zcoor, 0, "ONLY");
506 ycoor = (-yFLT + khAlWall)*0.5;
507 zcoor = (zlenA*0.5 - kExterInterModBorder2)*0.5 - kModuleWallThickness*0.5;
508 gMC->Gspos ("FALB", 1, "FLTB", xcoor, ycoor, zcoor, 0, "ONLY");
509 gMC->Gspos ("FALB", 2, "FLTC", xcoor, ycoor,-zcoor, 0, "ONLY");
512 ycoor = (-yFLT + khAlWall)*0.5;
513 zcoor = (kExterInterModBorder2 - kInterCentrModBorder1)*0.5 + kModuleWallThickness*0.5;
514 gMC->Gspos ("FALC", 1, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
515 gMC->Gspos ("FALC", 2, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
518 Float_t y0, alpha, tgal, beta, tgbe, trpa[11];
520 // Fibre glass walls between central and intermediate modules (FWZ1 and FWZ2; holes -> FZ1B, FZ1C, FZ2B)
522 tgal = (yFLT*0.5 - 2.*kLengthInCeModBorder)/(kInterCentrModBorder2 - kInterCentrModBorder1);
523 alpha = TMath::ATan(tgal);
524 beta = (kPi*0.5 - alpha)*0.5;
525 tgbe = TMath::Tan(beta);
529 trpa[3] = kModuleWallThickness;
530 trpa[4] = (kLengthInCeModBorder - kModuleWallThickness*tgbe)*0.5;
531 trpa[5] = (kLengthInCeModBorder + kModuleWallThickness*tgbe)*0.5;
532 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
533 trpa[7] = kModuleWallThickness;
534 trpa[8] = (kLengthInCeModBorder - kModuleWallThickness*tgbe)*0.5;
535 trpa[9] = (kLengthInCeModBorder + kModuleWallThickness*tgbe)*0.5;
536 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
537 gMC->Gsvolu("FWZ1","TRAP", idtmed[503], trpa, 11); // fibre glass
539 AliMatrix (idrotm[1],90., 90.,180.,0.,90.,180.);
540 AliMatrix (idrotm[4],90., 90., 0.,0.,90., 0.);
543 ycoor = -yFLT*0.5 + kLengthInCeModBorder*0.5;
544 zcoor = kInterCentrModBorder1;
545 gMC->Gspos("FWZ1", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[1],"ONLY");
546 gMC->Gspos("FWZ1", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[4],"ONLY");
549 y0 = kLengthInCeModBorder - kModuleWallThickness*0.5*tgbe;
553 trpa[3] = kModuleWallThickness*0.5;
554 trpa[4] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
555 trpa[5] = (y0 + kModuleWallThickness*0.5*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*0.5;
558 trpa[8] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
559 trpa[9] = (y0 + kModuleWallThickness*0.5*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("FZ1B","TRAP", idtmed[503], trpa, 11); // fibre glass
564 ycoor = -yFLT*0.5 + kLengthInCeModBorder*0.5 - kModuleWallThickness*0.25*tgbe;
565 zcoor = -kInterCentrModBorder1 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
566 gMC->Gspos("FZ1B", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[4],"ONLY");
567 gMC->Gspos("FZ1B", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[1],"ONLY");
570 AliMatrix (idrotm[2],90.,270., 0.,0.,90.,180.);
571 AliMatrix (idrotm[5],90.,270.,180.,0.,90., 0.);
574 ycoor = -kLengthInCeModBorder*0.5;
575 zcoor = kInterCentrModBorder2;
576 gMC->Gspos("FWZ1", 3,"FLTA", xcoor, ycoor, zcoor,idrotm[2],"ONLY");
577 gMC->Gspos("FWZ1", 4,"FLTA", xcoor, ycoor,-zcoor,idrotm[5],"ONLY");
580 y0 = kLengthInCeModBorder + kModuleWallThickness*0.5*tgbe;
584 trpa[3] = kModuleWallThickness*0.5;
585 trpa[4] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
586 trpa[5] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
587 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
588 trpa[7] = kModuleWallThickness*0.5;
589 trpa[8] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
590 trpa[9] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
591 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
592 gMC->Gsvolu("FZ1C","TRAP", idtmed[503], trpa, 11); // fibre glass
595 ycoor = -kLengthInCeModBorder*0.5 - kModuleWallThickness*0.25*tgbe;
596 zcoor = -kInterCentrModBorder2 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
597 gMC->Gspos("FZ1C", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[5],"ONLY");
598 gMC->Gspos("FZ1C", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[2],"ONLY");
601 trpa[0] = 0.5*(kInterCentrModBorder2 - kInterCentrModBorder1)/TMath::Cos(alpha);
602 trpa[1] = kModuleWallThickness;
604 trpa[3] = -beta*kRaddeg;
607 gMC->Gsvolu("FWZ2","PARA", idtmed[503], trpa, 6); // fibre glass
609 AliMatrix (idrotm[3], alpha*kRaddeg,90.,90.+alpha*kRaddeg,90.,90.,180.);
610 AliMatrix (idrotm[6],180.-alpha*kRaddeg,90.,90.-alpha*kRaddeg,90.,90., 0.);
614 zcoor = (kInterCentrModBorder2 + kInterCentrModBorder1)*0.5;
615 gMC->Gspos("FWZ2", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[3],"ONLY");
616 gMC->Gspos("FWZ2", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[6],"ONLY");
619 trpa[0] = 0.5*(kInterCentrModBorder2 - kInterCentrModBorder1)/TMath::Cos(alpha);
620 trpa[1] = kModuleWallThickness*0.5;
622 trpa[3] = -beta*kRaddeg;
625 gMC->Gsvolu("FZ2B","PARA", idtmed[503], trpa, 6); // fibre glass
628 ycoor = -yFLT*0.25 - kModuleWallThickness*0.5*tgbe;
629 zcoor = -(kInterCentrModBorder2 + kInterCentrModBorder1)*0.5 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
630 gMC->Gspos("FZ2B", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[6],"ONLY");
631 gMC->Gspos("FZ2B", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[3],"ONLY");
634 // Fibre glass walls between intermediate and lateral modules (FWZ3 and FWZ4)
636 tgal = (yFLT*0.5 - 2.*kLengthExInModBorder)/(kExterInterModBorder2 - kExterInterModBorder1);
637 alpha = TMath::ATan(tgal);
638 beta = (kPi*0.5 - alpha)*0.5;
639 tgbe = TMath::Tan(beta);
643 trpa[3] = kModuleWallThickness;
644 trpa[4] = (kLengthExInModBorder - kModuleWallThickness*tgbe)*0.5;
645 trpa[5] = (kLengthExInModBorder + kModuleWallThickness*tgbe)*0.5;
646 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
647 trpa[7] = kModuleWallThickness;
648 trpa[8] = (kLengthExInModBorder - kModuleWallThickness*tgbe)*0.5;
649 trpa[9] = (kLengthExInModBorder + kModuleWallThickness*tgbe)*0.5;
650 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
651 gMC->Gsvolu("FWZ3","TRAP", idtmed[503], trpa, 11); // fibre glass
654 ycoor = -kLengthExInModBorder*0.5;
655 zcoor = kExterInterModBorder1;
656 gMC->Gspos("FWZ3", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[5],"ONLY");
657 gMC->Gspos("FWZ3", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[2],"ONLY");
661 ycoor = -kLengthExInModBorder*0.5;
662 zcoor = -kExterInterModBorder1 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
663 gMC->Gspos("FWZ3", 5,"FLTB", xcoor, ycoor, zcoor,idrotm[2],"ONLY");
664 gMC->Gspos("FWZ3", 6,"FLTC", xcoor, ycoor,-zcoor,idrotm[5],"ONLY");
668 ycoor = -yFLT*0.5 + kLengthExInModBorder*0.5;
669 zcoor = kExterInterModBorder2;
670 gMC->Gspos("FWZ3", 3,"FLTA", xcoor, ycoor, zcoor,idrotm[4],"ONLY");
671 gMC->Gspos("FWZ3", 4,"FLTA", xcoor, ycoor,-zcoor,idrotm[1],"ONLY");
675 ycoor = -yFLT*0.5 + kLengthExInModBorder*0.5;
676 zcoor = -kExterInterModBorder2 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
677 gMC->Gspos("FWZ3", 7,"FLTB", xcoor, ycoor, zcoor,idrotm[1],"ONLY");
678 gMC->Gspos("FWZ3", 8,"FLTC", xcoor, ycoor,-zcoor,idrotm[4],"ONLY");
681 trpa[0] = 0.5*(kExterInterModBorder2 - kExterInterModBorder1)/TMath::Cos(alpha);
682 trpa[1] = kModuleWallThickness;
684 trpa[3] = -beta*kRaddeg;
687 gMC->Gsvolu("FWZ4","PARA", idtmed[503], trpa, 6); // fibre glass
689 AliMatrix (idrotm[13],alpha*kRaddeg,90.,90.+alpha*kRaddeg,90.,90.,180.);
690 AliMatrix (idrotm[16],180.-alpha*kRaddeg,90.,90.-alpha*kRaddeg,90.,90.,0.);
694 zcoor = (kExterInterModBorder2 + kExterInterModBorder1)*0.5;
695 gMC->Gspos("FWZ4", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[16],"ONLY");
696 gMC->Gspos("FWZ4", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[13],"ONLY");
701 zcoor = -(kExterInterModBorder2 + kExterInterModBorder1)*0.5 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
702 gMC->Gspos("FWZ4", 3,"FLTB", xcoor, ycoor, zcoor,idrotm[13],"ONLY");
703 gMC->Gspos("FWZ4", 4,"FLTC", xcoor, ycoor,-zcoor,idrotm[16],"ONLY");
707 ///////////////// Detector itself //////////////////////
709 const Int_t knx = fTOFGeometry->NpadX(); // number of pads along x
710 const Int_t knz = fTOFGeometry->NpadZ(); // number of pads along z
711 const Float_t kPadX = fTOFGeometry->XPad(); // pad length along x
712 const Float_t kPadZ = fTOFGeometry->ZPad(); // pad length along z
714 // new description for strip volume -double stack strip-
715 // -- all constants are expressed in cm
716 // heigth of different layers
717 const Float_t khhony = 1.0 ; // heigth of HONY Layer
718 const Float_t khpcby = 0.08 ; // heigth of PCB Layer
719 const Float_t khrgly = 0.055 ; // heigth of RED GLASS Layer
721 const Float_t khfiliy = 0.125 ; // heigth of FISHLINE Layer
722 const Float_t khglassy = 0.160*0.5; // heigth of GLASS Layer
723 const Float_t khglfy = khfiliy+2.*khglassy;// heigth of GLASS+FISHLINE Layer
725 const Float_t khcpcby = 0.16 ; // heigth of PCB Central Layer
726 const Float_t kwhonz = 8.1 ; // z dimension of HONEY Layer
727 const Float_t kwpcbz1 = 10.6 ; // z dimension of PCB Lower Layer
728 const Float_t kwpcbz2 = 11.6 ; // z dimension of PCB Upper Layer
729 const Float_t kwcpcbz = 12.4 ; // z dimension of PCB Central Layer
730 const Float_t kwrglz = 8. ; // z dimension of RED GLASS Layer
731 const Float_t kwglfz = 7. ; // z dimension of GLASS+FISHLN Layer
732 const Float_t klsensmx = knx*kPadX; // length of Sensitive Layer
733 const Float_t khsensmy = 0.05;//0.11;//0.16;// heigth of Sensitive Layer
734 const Float_t kwsensmz = knz*kPadZ; // width of Sensitive Layer
736 // heigth of the FSTR Volume (the strip volume)
737 const Float_t khstripy = 2.*khhony+2.*khpcby+4.*khrgly+2.*khglfy+khcpcby;
739 // width of the FSTR Volume (the strip volume)
740 const Float_t kwstripz = kwcpcbz;
741 // length of the FSTR Volume (the strip volume)
742 const Float_t klstripx = fTOFGeometry->StripLength();
744 Float_t parfp[3]={klstripx*0.5,khstripy*0.5,kwstripz*0.5};
745 // Coordinates of the strip center in the strip reference frame;
746 // used for positioning internal strip volumes
747 Float_t posfp[3]={0.,0.,0.};
749 // FSTR volume definition-filling this volume with non sensitive Gas Mixture
750 gMC->Gsvolu("FSTR","BOX",idtmed[507],parfp,3); // Freon mix
752 //-- HONY Layer definition
753 parfp[1] = khhony*0.5;
754 parfp[2] = kwhonz*0.5;
755 gMC->Gsvolu("FHON","BOX",idtmed[501],parfp,3); // honeycomb (Nomex)
756 // positioning 2 HONY Layers on FSTR volume
757 posfp[1] =-khstripy*0.5+parfp[1];
758 gMC->Gspos("FHON",1,"FSTR",0., posfp[1],0.,0,"ONLY");
759 gMC->Gspos("FHON",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
761 //-- PCB Layer definition
762 parfp[1] = khpcby*0.5;
763 parfp[2] = kwpcbz1*0.5;
764 gMC->Gsvolu("FPC1","BOX",idtmed[502],parfp,3); // G10
765 parfp[2] = kwpcbz2*0.5;
766 gMC->Gsvolu("FPC2","BOX",idtmed[502],parfp,3); // G10
767 // positioning 2 PCB Layers on FSTR volume
768 posfp[1] =-khstripy*0.5+khhony+parfp[1];
769 gMC->Gspos("FPC1",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
770 gMC->Gspos("FPC2",1,"FSTR",0., posfp[1],0.,0,"ONLY");
772 //-- central PCB layer definition
773 parfp[1] = khcpcby*0.5;
774 parfp[2] = kwcpcbz*0.5;
775 gMC->Gsvolu("FPCB","BOX",idtmed[502],parfp,3); // G10
776 // positioning the central PCB layer
777 gMC->Gspos("FPCB",1,"FSTR",0.,0.,0.,0,"ONLY");
780 Float_t parfs[3] = {klsensmx*0.5, khsensmy*0.5, kwsensmz*0.5};
781 gMC->Gsvolu("FSEN","BOX",idtmed[508],parfs,3); // sensitive ...
782 // dividing FSEN along z in knz=2 and along x in knx=48
783 gMC->Gsdvn("FSEZ","FSEN",knz,3);
784 gMC->Gsdvn("FPAD","FSEZ",knx,1);
785 // positioning a Sensitive layer inside FPCB
786 gMC->Gspos("FSEN",1,"FPCB",0.,0.,0.,0,"ONLY");
788 //-- RED GLASS Layer definition
789 parfp[1] = khrgly*0.5;
790 parfp[2] = kwrglz*0.5;
791 gMC->Gsvolu("FRGL","BOX",idtmed[509],parfp,3); // glass
792 // positioning 4 RED GLASS Layers on FSTR volume
793 posfp[1] = -khstripy*0.5+khhony+khpcby+parfp[1];
794 gMC->Gspos("FRGL",1,"FSTR",0., posfp[1],0.,0,"ONLY");
795 gMC->Gspos("FRGL",4,"FSTR",0.,-posfp[1],0.,0,"ONLY");
796 posfp[1] = (khcpcby+khrgly)*0.5;
797 gMC->Gspos("FRGL",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
798 gMC->Gspos("FRGL",3,"FSTR",0., posfp[1],0.,0,"ONLY");
800 //-- GLASS Layer definition
801 parfp[1] = khglassy*0.5;
802 parfp[2] = kwglfz*0.5;
803 gMC->Gsvolu("FGLA","BOX",idtmed[509],parfp,3); // glass
805 // positioning 4 GLASS Layers on FSTR volume
806 posfp[1] = -khstripy*0.5+khhony+khpcby+khrgly+parfp[1];
807 gMC->Gspos("FGLA",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
808 gMC->Gspos("FGLA",4,"FSTR",0., posfp[1],0.,0,"ONLY");
809 posfp[1] = khcpcby*0.5+khrgly+khglassy*0.5;
810 gMC->Gspos("FGLA",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
811 gMC->Gspos("FGLA",3,"FSTR",0., posfp[1],0.,0,"ONLY");
813 //-- FREON Layer definition
814 parfp[1] = khfiliy*0.5;
815 gMC->Gsvolu("FFIS","BOX",idtmed[507],parfp,3); // freon
817 // positioning 2 FREON Layers on FSTR volume
818 posfp[1] = -khstripy*0.5+khhony+khpcby+khrgly+khglassy+parfp[1];
819 gMC->Gspos("FFIS",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
820 gMC->Gspos("FFIS",2,"FSTR",0., posfp[1],0.,0,"ONLY");
823 //-- GLASS+FISHLINE Layer definition
824 parfp[1] = khglfy*0.5;
825 parfp[2] = kwglfz*0.5;
826 gMC->Gsvolu("FGLF","BOX",idtmed[504],parfp,3);
828 // positioning 2 GLASS+FISHLINE Layers on FSTR volume
829 posfp[1] = (khcpcby+khglfy)*0.5+khrgly;
830 gMC->Gspos("FGLF",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
831 gMC->Gspos("FGLF",2,"FSTR",0., posfp[1],0.,0,"ONLY");
834 // Positioning the Strips (FSTR) in the FLT volumes
835 Int_t maxStripNumbers [5] ={fTOFGeometry->NStripC(),
836 fTOFGeometry->NStripB(),
837 fTOFGeometry->NStripA(),
838 fTOFGeometry->NStripB(),
839 fTOFGeometry->NStripC()};
841 Int_t totalStrip = 0;
842 Float_t xpos, zpos, ypos, ang;
843 for(Int_t iplate =0; iplate < fTOFGeometry->NPlates(); iplate++){
844 if (iplate>0) totalStrip += maxStripNumbers[iplate-1];
845 for(Int_t istrip =0; istrip < maxStripNumbers[iplate]; istrip++){
847 ang = fTOFGeometry->GetAngles(iplate,istrip);
848 AliDebug(1, Form(" iplate = %1i, istrip = %2i ---> ang = %f", iplate, istrip, ang));
850 if (ang>0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.+ang,90., ang, 90.);
851 else if (ang==0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.,90., 0., 0.);
852 else if (ang<0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.+ang,90.,-ang,270.);
855 zpos = fTOFGeometry->GetDistances(iplate,istrip);
856 ypos = fTOFGeometry->GetHeights(iplate,istrip);
858 gMC->Gspos("FSTR",istrip+totalStrip+1,"FLTA", xpos, ypos,-zpos,idrotm[istrip+totalStrip+1], "ONLY");
861 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");
862 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");
867 // 1.5 cm Al honeycomb layer between strips and cards
869 par[1] = kHoneycombLayerThickness*0.5;
871 gMC->Gsvolu("FPEA", "BOX ", idtmed[506], par, 3); // Al honeycomb
874 ycoor = kHoneycombLayerThickness*0.5;
876 gMC->Gspos ("FPEA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
880 par[1] = kHoneycombLayerThickness*0.5;
881 par[2] = (zlenA*0.5 - kInterCentrModBorder2-kModuleWallThickness)*0.5;
882 gMC->Gsvolu("FPEB", "BOX ", idtmed[506], par, 3); // Al honeycomb
885 ycoor = kHoneycombLayerThickness*0.5;
886 zcoor = (kInterCentrModBorder2-kInterCentrModBorder1)*0.5;
887 gMC->Gspos ("FPEB", 1, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
888 gMC->Gspos ("FPEB", 2, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
893 par[1] = (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
895 gMC->Gsvolu("FAIA", "BOX ", idtmed[500], par, 3); // Air
898 ycoor = kHoneycombLayerThickness + (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
900 gMC->Gspos ("FAIA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
904 par[1] = (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
905 par[2] = (zlenA*0.5 - kInterCentrModBorder2 - kModuleWallThickness)*0.5;
906 gMC->Gsvolu("FAIB", "BOX ", idtmed[500], par, 3); // Air
907 gMC->Gsvolu("FAIC", "BOX ", idtmed[500], par, 3); // Air
910 ycoor = kHoneycombLayerThickness + (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
911 zcoor = (kInterCentrModBorder2-kInterCentrModBorder1)*0.5;
912 gMC->Gspos ("FAIB", 0, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
913 gMC->Gspos ("FAIC", 0, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
916 // start with cards and cooling tubes
917 // finally, cards, cooling tubes and layer for thermal dispersion
920 // see GEOM200 in GEANT manual
924 // card volume definition
925 cardpar[0]= xFLT*0.5;
928 gMC->Gsvolu("FCAR", "BOX ", idtmed[502], cardpar, 3); // PCB Card
930 //alu plate volume definition
933 gMC->Gsvolu("FALP", "BOX ", idtmed[505], cardpar, 3); // Alu Plate
935 // tube volume definition
940 gMC->Gsvolu("FTUB", "TUBE", idtmed[511], tubepar, 3); // cooling tubes (steel)
945 gMC->Gsvolu("FITU", "TUBE", idtmed[510], tubepar, 3); // cooling water
946 // positioning water tube into the steel one
947 gMC->Gspos("FITU",1,"FTUB",0.,0.,0.,0,"ONLY");
950 AliMatrix(idrotm[99], 180., 90., 90., 90., 90., 0.);
952 // central module positioning
953 Float_t cardpos[3], aplpos2;
954 Float_t stepforcardA = 6.625;
956 Float_t aplpos1 = -2.;
961 // tubepos= -53.+tdis;
963 for (icard=39; icard<54; ++icard) {
964 cardpos[2]= cardpos[2]+stepforcardA;
965 aplpos2 = cardpos[2]+0.15;
966 gMC->Gspos("FCAR",icard,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
967 gMC->Gspos("FALP",icard,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
968 gMC->Gspos("FTUB",icard,"FAIA", 0.,cardpos[1],cardpos[2]+tdis,idrotm[99],"ONLY");
971 // intermediate module positioning
972 Float_t stepforcardB= 7.05;
976 for (icard=20; icard<39; ++icard) {
977 cardpos[2]= cardpos[2]+stepforcardB;
978 aplpos2 = cardpos[2]+0.15;
980 gMC->Gspos("FCAR",icard+34,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
981 gMC->Gspos("FALP",icard+34,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
982 gMC->Gspos("FTUB",icard+34,"FAIA", 0.,cardpos[1], cardpos[2]+tdis,idrotm[99],"ONLY");
983 gMC->Gspos("FCAR",58-icard,"FAIA",cardpos[0],cardpos[1], -cardpos[2], 0,"ONLY");
984 gMC->Gspos("FALP",58-icard,"FAIA",cardpos[0], aplpos1, -aplpos2, 0,"ONLY");
985 gMC->Gspos("FTUB",58-icard,"FAIA", 0.,cardpos[1],-cardpos[2]-tdis,idrotm[99],"ONLY");
988 gMC->Gspos("FCAR",icard+34+182,"FAIC",cardpos[0],cardpos[1], cardpos[2]-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
989 gMC->Gspos("FALP",icard+34+182,"FAIC",cardpos[0], aplpos1, aplpos2-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
990 gMC->Gspos("FTUB",icard+34+182,"FAIC", 0.,cardpos[1], cardpos[2]+tdis-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
991 gMC->Gspos("FCAR",58-icard+ 91,"FAIB",cardpos[0],cardpos[1], -cardpos[2]+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
992 gMC->Gspos("FALP",58-icard+ 91,"FAIB",cardpos[0], aplpos1, -aplpos2+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
993 gMC->Gspos("FTUB",58-icard+ 91,"FAIB", 0.,cardpos[1],-cardpos[2]-tdis+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
998 // outer module positioning
999 Float_t stepforcardC= 8.45238;
1002 for (icard=1; icard<20; ++icard) {
1003 cardpos[2]= cardpos[2]+stepforcardC;
1004 aplpos2 = cardpos[2]+0.15;
1006 gMC->Gspos("FCAR",icard+72,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
1007 gMC->Gspos("FALP",icard+72,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
1008 gMC->Gspos("FTUB",icard+72,"FAIA", 0.,cardpos[1], cardpos[2]+tdis,idrotm[99],"ONLY");
1009 gMC->Gspos("FCAR",20-icard,"FAIA",cardpos[0],cardpos[1], -cardpos[2], 0,"ONLY");
1010 gMC->Gspos("FALP",20-icard,"FAIA",cardpos[0], aplpos1, -aplpos2, 0,"ONLY");
1011 gMC->Gspos("FTUB",20-icard,"FAIA", 0.,cardpos[1],-cardpos[2]-tdis,idrotm[99],"ONLY");
1014 gMC->Gspos("FCAR",icard+72+182,"FAIC",cardpos[0],cardpos[1], cardpos[2]-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1015 gMC->Gspos("FALP",icard+72+182,"FAIC",cardpos[0], aplpos1, aplpos2-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1016 gMC->Gspos("FTUB",icard+72+182,"FAIC", 0.,cardpos[1], cardpos[2]+tdis-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
1017 gMC->Gspos("FCAR",20-icard+ 91,"FAIB",cardpos[0],cardpos[1], -cardpos[2]+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1018 gMC->Gspos("FALP",20-icard+ 91,"FAIB",cardpos[0], aplpos1, -aplpos2+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1019 gMC->Gspos("FTUB",20-icard+ 91,"FAIB", 0.,cardpos[1],-cardpos[2]-tdis+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
1024 //_____________________________________________________________________________
1025 void AliTOFv5T0::DrawModule() const
1028 // Draw a shaded view of the Time Of Flight version 4
1031 // Set everything unseen
1032 gMC->Gsatt("*", "seen", -1);
1035 //Set volumes visible
1038 //Set ALIC mother transparent
1039 gMC->Gsatt("ALIC","SEEN", 0);
1042 // Level 1 for TOF volumes
1043 gMC->Gsatt("B077","seen", 0);
1046 // Level 2 for TOF volumes
1047 gMC->Gsatt("B071","seen", 0);
1048 gMC->Gsatt("B074","seen", 0);
1049 gMC->Gsatt("B075","seen", 0);
1050 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
1051 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
1054 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
1055 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
1056 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
1057 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
1058 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
1060 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
1061 gMC->Gsatt("BTO1","seen", 0);
1064 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
1065 gMC->Gsatt("BTO2","seen", 0);
1068 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
1069 gMC->Gsatt("BTO3","seen", 0);
1071 // Level 3 of B071, B074 and B075
1072 gMC->Gsatt("FTOA","SEEN", 0);
1073 if (fTOFHoles) gMC->Gsatt("FTOB","SEEN", 0);
1075 // Level 4 of B071, B074 and B075
1076 gMC->Gsatt("FLTA","SEEN", 0);
1077 if (fTOFHoles) gMC->Gsatt("FLTB","SEEN",0);
1078 if (fTOFHoles) gMC->Gsatt("FLTC","SEEN",0);
1080 // Level 5 of B071, B074 and B075
1081 gMC->Gsatt("FAIA","SEEN",-1); // all FAIA sub-levels skipped -
1082 if (fTOFHoles) gMC->Gsatt("FAIB","SEEN",-1); // all FAIB sub-levels skipped -
1083 if (fTOFHoles) gMC->Gsatt("FAIC","SEEN",-1); // all FAIC sub-levels skipped -
1085 gMC->Gsatt("FALA","SEEN", 0);
1086 if (fTOFHoles) gMC->Gsatt("FALB","SEEN", 0);
1088 gMC->Gsatt("FPEA","SEEN", 1);
1089 if (fTOFHoles) gMC->Gsatt("FPEB","SEEN", 1);
1091 gMC->Gsatt("FSTR","SEEN",-1); // all FSTR sub-levels skipped -
1093 gMC->Gsatt("FWZ1","SEEN", 0);
1094 gMC->Gsatt("FWZ2","SEEN", 0);
1095 gMC->Gsatt("FWZ3","SEEN", 0);
1096 gMC->Gsatt("FWZ4","SEEN", 0);
1098 gMC->Gsatt("FZ1B","SEEN", 0);
1099 gMC->Gsatt("FZ1C","SEEN", 0);
1100 gMC->Gsatt("FZ2B","SEEN", 0);
1103 gMC->Gdopt("hide", "on");
1104 gMC->Gdopt("shad", "on");
1105 gMC->Gsatt("*", "fill", 7);
1106 gMC->SetClipBox(".");
1107 gMC->SetClipBox("*", 100, 1000, 100, 1000, 100, 1000);
1108 gMC->DefaultRange();
1109 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
1110 gMC->Gdhead(1111, "Time Of Flight");
1111 gMC->Gdman(18, 3, "MAN");
1112 gMC->Gdopt("hide","off");
1114 //_____________________________________________________________________________
1115 void AliTOFv5T0::DrawDetectorModules() const
1118 // Draw a shaded view of the TOF detector version 4
1121 // Set everything unseen
1122 gMC->Gsatt("*", "seen", -1);
1125 //Set volumes visible
1128 //Set ALIC mother transparent
1129 gMC->Gsatt("ALIC","SEEN", 0);
1132 // Level 1 for TOF volumes
1133 gMC->Gsatt("B077","seen", 0);
1136 // Level 2 for TOF volumes
1137 gMC->Gsatt("B071","seen", 0);
1138 gMC->Gsatt("B074","seen", 0);
1139 gMC->Gsatt("B075","seen", 0);
1140 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
1141 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
1144 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
1145 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
1146 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
1147 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
1148 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
1150 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
1151 gMC->Gsatt("BTO1","seen", 0);
1154 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
1155 gMC->Gsatt("BTO2","seen", 0);
1158 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
1159 gMC->Gsatt("BTO3","seen", 0);
1161 // Level 3 of B071, B075 and B074
1162 gMC->Gsatt("FTOA","seen",-2); // all FTOA sub-levels skipped -
1164 gMC->Gsatt("FTOB","seen",-2); // all FTOB sub-levels skipped -
1165 gMC->Gsatt("FTOC","seen",-2); // all FTOC sub-levels skipped -
1168 gMC->Gdopt("hide","on");
1169 gMC->Gdopt("shad","on");
1170 gMC->Gsatt("*", "fill", 5);
1171 gMC->SetClipBox(".");
1172 gMC->SetClipBox("*", 100, 1000, 100, 1000, 0, 1000);
1173 gMC->DefaultRange();
1174 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
1175 gMC->Gdhead(1111,"TOF detector");
1176 gMC->Gdman(18, 3, "MAN");
1177 gMC->Gdopt("hide","off");
1180 //_____________________________________________________________________________
1181 void AliTOFv5T0::DrawDetectorStrips() const
1184 // Draw a shaded view of the TOF strips for version 4
1187 // Set everything unseen
1188 gMC->Gsatt("*", "seen", -1);
1191 //Set volumes visible
1194 //Set ALIC mother transparent
1195 gMC->Gsatt("ALIC","SEEN", 0);
1198 // Level 1 for TOF volumes
1199 gMC->Gsatt("B077","seen", 0);
1202 // Level 2 for TOF volumes
1203 gMC->Gsatt("B071","seen", 0);
1204 gMC->Gsatt("B074","seen", 0);
1205 gMC->Gsatt("B075","seen", 0);
1206 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
1207 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
1210 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
1211 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
1212 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
1213 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
1214 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
1216 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
1217 gMC->Gsatt("BTO1","seen", 0);
1220 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
1221 gMC->Gsatt("BTO2","seen", 0);
1224 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
1225 gMC->Gsatt("BTO3","seen", 0);
1227 // Level 3 of B071, B074 and B075
1228 gMC->Gsatt("FTOA","SEEN", 0);
1230 gMC->Gsatt("FTOB","SEEN", 0);
1231 gMC->Gsatt("FTOC","SEEN", 0);
1234 // Level 4 of B071, B074 and B075
1235 gMC->Gsatt("FLTA","SEEN", 0);
1237 gMC->Gsatt("FLTB","SEEN", 0);
1238 gMC->Gsatt("FLTC","SEEN", 0);
1241 // Level 5 of B071, B074 and B075
1242 gMC->Gsatt("FAIA","SEEN",-1); // all FAIA sub-levels skipped -
1244 gMC->Gsatt("FAIB","SEEN",-1); // all FAIB sub-levels skipped -
1245 gMC->Gsatt("FAIC","SEEN",-1); // all FAIC sub-levels skipped -
1248 gMC->Gsatt("FALA","SEEN", 0);
1249 if (fTOFHoles) gMC->Gsatt("FALB","SEEN", 0);
1251 gMC->Gsatt("FPEA","SEEN", 0);
1252 if (fTOFHoles) gMC->Gsatt("FPEB","SEEN", 0);
1254 gMC->Gsatt("FSTR","SEEN",-2); // all FSTR sub-levels skipped -
1256 gMC->Gsatt("FWZ1","SEEN", 0);
1257 gMC->Gsatt("FWZ2","SEEN", 0);
1258 gMC->Gsatt("FWZ3","SEEN", 0);
1259 gMC->Gsatt("FWZ4","SEEN", 0);
1261 gMC->Gsatt("FZ1B","SEEN", 0);
1262 gMC->Gsatt("FZ1C","SEEN", 0);
1263 gMC->Gsatt("FZ2B","SEEN", 0);
1270 gMC->Gsatt("FALP","SEEN",0);
1271 gMC->Gsatt("FCAR","SEEN",0);
1272 gMC->Gsatt("FTUB","SEEN",-1); // all FTUB sub-levels skipped -
1275 gMC->Gsatt("FITU","SEEN",0);
1280 gMC->Gsatt("FGLF","SEEN",0);
1281 gMC->Gsatt("FHON","SEEN",0);
1282 gMC->Gsatt("FPC1","SEEN",0);
1283 gMC->Gsatt("FPC2","SEEN",0);
1284 gMC->Gsatt("FPCB","SEEN",0);
1285 gMC->Gsatt("FRGL","SEEN",0);
1287 // Level 2 of FPCB => Level 3 of FSTR
1288 gMC->Gsatt("FSEN","SEEN",0);
1289 gMC->Gsatt("FSEZ","SEEN",0);
1290 gMC->Gsatt("FPAD","SEEN",1);
1293 gMC->Gdopt("hide","on");
1294 gMC->Gdopt("shad","on");
1295 gMC->Gsatt("*", "fill", 5);
1296 gMC->SetClipBox(".");
1297 gMC->SetClipBox("*", 0, 1000, 0, 1000, 0, 1000);
1298 gMC->DefaultRange();
1299 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
1300 gMC->Gdhead(1111,"TOF Strips");
1301 gMC->Gdman(18, 3, "MAN");
1302 gMC->Gdopt("hide","off");
1305 //_____________________________________________________________________________
1306 void AliTOFv5T0::CreateMaterials()
1309 // Define materials for the Time Of Flight
1312 //AliTOF::CreateMaterials();
1314 AliMagF *magneticField = (AliMagF*)((AliMagF*)TGeoGlobalMagField::Instance()->GetField());
1316 Int_t isxfld = magneticField->Integ();
1317 Float_t sxmgmx = magneticField->Max();
1319 Float_t we[7], ae[7], na[7], fr[7], vl[7];
1322 //--- Quartz (SiO2) to simulate float glass
1323 // density tuned to have correct float glass
1325 Float_t aq[2] = { 28.0855,15.9994 };
1326 Float_t zq[2] = { 14.,8. };
1327 Float_t wq[2] = { 1.,2. };
1328 Float_t dq = 2.55; // std value: 2.2
1332 Float_t anox[4] = {12.01,1.01,16.00,14.01};
1333 Float_t znox[4] = { 6., 1., 8., 7.};
1334 Float_t wnox[4] = {14., 22., 2., 2.};
1335 Float_t dnox = 0.048;
1339 Float_t ag10[4] = {28.09,12.01,1.01,16.00};
1340 Float_t zg10[4] = {14., 6., 1., 8.};
1343 for (i = 0; i < nlmatg10; ++i) {
1359 MaterialMixer(we,ae,na,fr,vl,5);
1365 Float_t densg10 = 1.7;
1368 Float_t awa[2] = { 1., 16. };
1369 Float_t zwa[2] = { 1., 8. };
1370 Float_t wwa[2] = { 2., 1. };
1375 Float_t asteel[4] = { 55.847,51.9961,58.6934,28.0855 };
1376 Float_t zsteel[4] = { 26.,24.,28.,14. };
1377 Float_t wsteel[4] = { .715,.18,.1,.005 };
1380 Float_t aAir[4]={12.0107,14.0067,15.9994,39.948};
1381 Float_t zAir[4]={6.,7.,8.,18.};
1382 Float_t wAir[4]={0.000124,0.755267,0.231781,0.012827};
1383 Float_t dAir = 1.20479E-3;
1386 Float_t afg[4] = {28.09,16.00,12.01,1.01};
1387 Float_t zfg[4] = {14., 8., 6., 1.};
1388 Float_t wfg[4] = {0.12906,0.29405,0.51502,0.06187};
1389 Float_t dfg = 1.111;
1392 // --- Freon C2F4H2 + SF6
1393 Float_t afre[4]= {12.01,1.01,19.00,32.07};
1394 Float_t zfre[4]= { 6., 1., 9., 16.};
1395 Float_t wfre[4]= {0.21250,0.01787,0.74827,0.021355};
1396 Float_t densfre= 0.00375;
1399 //char namat[15] = " ";
1400 //Float_t ama[2], zma[2], dma, radl, absl, buf[1];
1403 AliMixture ( 0, "Air$", aAir, zAir, dAir, 4, wAir);
1404 AliMixture ( 1, "Nomex$", anox, znox, dnox, nnox, wnox);
1405 AliMixture ( 2, "G10$", ag10, zg10, densg10, nlmatg10, wmatg10);
1406 AliMixture ( 3, "fibre glass$", afg, zfg, dfg, nfg, wfg);
1407 AliMaterial( 4, "Al $", 26.98, 13., 2.7, 8.9, 37.2);
1408 AliMaterial( 5, "Al honeycomb$", 26.98, 13., 0.0496, 483., 2483.);
1409 AliMixture ( 6, "Freon$", afre, zfre, densfre, nfre, wfre);
1410 AliMixture ( 7, "Glass$", aq, zq, dq, nq, wq);
1412 // get freon and glass
1413 gMC->Gfmate((*fIdmate)[6],namat,ama[0],zma[0],dma,radl,absl,buf,nbuf);
1414 gMC->Gfmate((*fIdmate)[7],namat,ama[1],zma[1],dma,radl,absl,buf,nbuf);
1417 Float_t wgfr[2]= {0.0011,0.9989};
1418 Float_t dgfr = 1.434;
1420 AliMixture ( 8, "glass-freon$", ama, zma, dgfr, ngfr, wgfr);
1422 AliMixture ( 9, "Water$", awa, zwa, dwa, nwa, wwa);
1423 AliMixture (10, "STAINLESS STEEL$", asteel, zsteel, 7.88, 4, wsteel);
1425 Float_t epsil, stmin, deemax, stemax;
1428 // EPSIL = 0.1 ! Tracking precision,
1429 // STEMAX = 0.1 ! Maximum displacement for multiple scattering
1430 // DEEMAX = 0.1 ! Maximum fractional energy loss, DLS
1434 epsil = .001; // Tracking precision,
1435 stemax = -1.; // Maximum displacement for multiple scattering
1436 deemax = -.3; // Maximum fractional energy loss, DLS
1439 AliMedium( 1, "Air$", 0, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1440 AliMedium( 2,"Nomex$", 1, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1441 AliMedium( 3,"G10$", 2, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1442 AliMedium( 4,"fibre glass$", 3, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1443 //AliMedium( 5,"glass-freon$", 8, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1444 AliMedium( 6,"Al Frame$", 4, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1445 AliMedium( 7,"Al honeycomb$", 5, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1446 AliMedium( 8,"Fre$", 6, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1447 AliMedium( 9,"PCB-S$", 2, 1, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1448 AliMedium(10,"Glass$", 7, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1449 AliMedium(11,"Water$", 9, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1450 AliMedium(12,"STEEL$", 10, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1453 //_____________________________________________________________________________
1454 void AliTOFv5T0::Init()
1457 // Initialise the detector after the geometry has been defined
1459 AliDebug(1, "**************************************"
1461 "**************************************");
1462 AliDebug(1, " Version 4 of TOF initialing, "
1463 "symmetric TOF - Full Coverage version");
1467 fIdFTOA = gMC->VolId("FTOA");
1469 fIdFTOB = gMC->VolId("FTOB");
1470 fIdFTOC = gMC->VolId("FTOC");
1472 fIdFLTA = gMC->VolId("FLTA");
1474 fIdFLTB = gMC->VolId("FLTB");
1475 fIdFLTC = gMC->VolId("FLTC");
1478 AliDebug(1, "**************************************"
1480 "**************************************");
1483 //_____________________________________________________________________________
1484 void AliTOFv5T0::StepManager()
1488 // Procedure called at each step in the Time Of Flight
1491 TLorentzVector mom, pos;
1492 Float_t xm[3],pm[3],xpad[3],ppad[3];
1495 Int_t sector, plate, padx, padz, strip;
1496 Int_t copy, padzid, padxid, stripid, i;
1497 Int_t *idtmed = fIdtmed->GetArray()-499;
1498 Float_t incidenceAngle;
1500 const char* volpath;
1505 gMC->IsTrackEntering()
1506 && gMC->TrackCharge()
1507 //&& gMC->GetMedium()==idtmed[508]
1508 && gMC->CurrentMedium()==idtmed[508]
1509 && gMC->CurrentVolID(copy)==fIdSens
1513 AliMC *mcApplication = (AliMC*)gAlice->GetMCApp();
1515 AddTrackReference(mcApplication->GetCurrentTrackNumber(), AliTrackReference::kTOF);
1516 //AddTrackReference(gAlice->GetMCApp()->GetCurrentTrackNumber());
1518 // getting information about hit volumes
1520 padzid=gMC->CurrentVolOffID(1,copy);
1524 padxid=gMC->CurrentVolOffID(0,copy);
1528 stripid=gMC->CurrentVolOffID(4,copy);
1532 gMC->TrackPosition(pos);
1533 gMC->TrackMomentum(mom);
1535 Double_t normMom=1./mom.Rho();
1537 // getting the coordinates in pad ref system
1539 xm[0] = (Float_t)pos.X();
1540 xm[1] = (Float_t)pos.Y();
1541 xm[2] = (Float_t)pos.Z();
1543 pm[0] = (Float_t)mom.X()*normMom;
1544 pm[1] = (Float_t)mom.Y()*normMom;
1545 pm[2] = (Float_t)mom.Z()*normMom;
1547 gMC->Gmtod(xm,xpad,1); // from MRS to DRS: coordinates convertion
1548 gMC->Gmtod(pm,ppad,2); // from MRS to DRS: direction cosinus convertion
1551 if (TMath::Abs(ppad[1])>1) {
1552 AliWarning("Abs(ppad) > 1");
1553 ppad[1]=TMath::Sign((Float_t)1,ppad[1]);
1555 incidenceAngle = TMath::ACos(ppad[1])*kRaddeg;
1558 if (strip < fTOFGeometry->NStripC()) {
1562 else if (strip >= fTOFGeometry->NStripC() &&
1563 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB()) {
1565 strip = strip - fTOFGeometry->NStripC();
1567 else if (strip >= fTOFGeometry->NStripC() + fTOFGeometry->NStripB() &&
1568 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA()) {
1570 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB();
1572 else if (strip >= fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA() &&
1573 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA() + fTOFGeometry->NStripB()) {
1575 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB() - fTOFGeometry->NStripA();
1579 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB() - fTOFGeometry->NStripA() - fTOFGeometry->NStripB();
1582 volpath=gMC->CurrentVolOffName(7);
1583 index=atoi(&volpath[4]);
1600 hits[6] = mom.Rho();
1605 hits[11]= incidenceAngle;
1606 hits[12]= gMC->Edep();
1607 hits[13]= gMC->TrackLength();
1615 AddT0Hit(mcApplication->GetCurrentTrackNumber(),vol, hits);
1616 //AddT0Hit(gAlice->GetMCApp()->GetCurrentTrackNumber(),vol, hits);
1619 //-------------------------------------------------------------------
1620 void AliTOFv5T0::MaterialMixer(Float_t* p,Float_t* a,Float_t* m,Float_t* d,Float_t* s,Int_t n) const
1622 // a[] atomic weights vector (in)
1623 // (atoms present in more compound appear separately)
1624 // m[] number of corresponding atoms in the mixture (in)
1625 // d[] fraction of the compound relative to the corresponding atoms (in)
1626 // s[] further possible weights " " " " (in)
1628 for (Int_t i = 0; i < n; ++i) {
1629 p[i] = a[i]*m[i]*d[i]*s[i];
1632 for (Int_t i = 0; i < n; ++i) {
1634 // AliInfo(Form((\n weight[%i] = %f (,i,p[i]));