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"
117 #include "TGeometry.h"
118 #include "TLorentzVector.h"
120 #include "TVirtualMC.h"
121 #include "TGeoManager.h"
122 #include <TGeoMatrix.h>
123 #include <TGeoPhysicalNode.h>
124 #include <TGeoVolume.h>
126 #include "AliConst.h"
127 #include "AliGeomManager.h"
132 #include "AliTrackReference.h"
134 #include "AliTOFGeometry.h"
135 #include "AliTOFv5T0.h"
137 extern TDirectory *gDirectory;
138 extern TVirtualMC *gMC;
139 extern TGeoManager *gGeoManager;
141 extern AliRun *gAlice;
145 //_____________________________________________________________________________
146 AliTOFv5T0::AliTOFv5T0():
156 // Default constructor
160 //_____________________________________________________________________________
161 AliTOFv5T0::AliTOFv5T0(const char *name, const char *title):
162 AliTOF(name,title,"tzero"),
172 // Standard constructor
175 // Check that FRAME is there otherwise we have no place where to
179 AliModule* frame = (AliModule*)gAlice->GetModule("FRAME");
181 AliFatal("TOF needs FRAME to be present");
184 if (fTOFGeometry) delete fTOFGeometry;
185 fTOFGeometry = new AliTOFGeometry();
187 if(frame->IsVersion()==1) {
188 AliDebug(1,Form("Frame version %d", frame->IsVersion()));
189 AliDebug(1,"Full Coverage for TOF");
192 AliDebug(1,Form("Frame version %d", frame->IsVersion()));
193 AliDebug(1,"TOF with Holes for PHOS");
196 fTOFGeometry->SetHoles(fTOFHoles);
199 if (fTOFGeometry) delete fTOFGeometry;
200 fTOFGeometry = new AliTOFGeometry();
201 fTOFGeometry->SetHoles(fTOFHoles);
203 //AliTOF::fTOFGeometry = fTOFGeometry;
206 TDirectory* saveDir = gDirectory;
207 AliRunLoader::GetRunLoader()->CdGAFile();
208 fTOFGeometry->Write("TOFgeometry");
213 //_____________________________________________________________________________
214 void AliTOFv5T0::AddAlignableVolumes() const
217 // Create entries for alignable volumes associating the symbolic volume
218 // name with the corresponding volume path. Needs to be syncronized with
219 // eventual changes in the geometry.
222 AliGeomManager::ELayerID idTOF = AliGeomManager::kTOF;
223 Int_t modUID, modnum=0;
228 TString vpL0 = "ALIC_1/B077_1/BSEGMO";
229 TString vpL1 = "_1/BTOF";
231 TString vpL3 = "/FTOA_0";
232 TString vpL4 = "/FLTA_0/FSTR_";
234 TString snSM = "TOF/sm";
235 TString snSTRIP = "/strip";
237 Int_t nSectors=fTOFGeometry->NSectors();
238 Int_t nStrips =fTOFGeometry->NStripA()+
239 2*fTOFGeometry->NStripB()+
240 2*fTOFGeometry->NStripC();
243 // The TOF MRPC Strips
244 // The symbolic names are: TOF/sm00/strip01
250 for (Int_t isect = 0; isect < nSectors; isect++) {
251 for (Int_t istr = 1; istr <= nStrips; istr++) {
253 modUID = AliGeomManager::LayerToVolUID(idTOF,modnum++);
254 if (fTOFSectors[isect]==-1) continue;
256 if (fTOFHoles && (isect==13 || isect==14 || isect==15)) {
259 vpL4 = "/FLTB_0/FSTR_";
263 vpL4 = "/FLTC_0/FSTR_";
269 vpL4 = "/FLTA_0/FSTR_";
283 symName += Form("%02d",isect);
285 symName += Form("%02d",istr);
287 AliDebug(2,"--------------------------------------------");
288 AliDebug(2,Form("Alignable object %d", imod));
289 AliDebug(2,Form("volPath=%s\n",volPath.Data()));
290 AliDebug(2,Form("symName=%s\n",symName.Data()));
291 AliDebug(2,"--------------------------------------------");
293 if(!gGeoManager->SetAlignableEntry(symName.Data(),volPath.Data(),modUID))
294 AliError(Form("Alignable entry %s not set",symName.Data()));
296 //T2L matrices for alignment
297 TGeoPNEntry *e = gGeoManager->GetAlignableEntryByUID(modUID);
299 TGeoHMatrix *globMatrix = e->GetGlobalOrig();
300 Double_t phi = 20.0 * (isect % 18) + 10.0;
301 TGeoHMatrix *t2l = new TGeoHMatrix();
303 t2l->MultiplyLeft(&(globMatrix->Inverse()));
307 AliError(Form("Alignable entry %s is not valid!",symName.Data()));
315 // The TOF supermodules
316 // The symbolic names are: TOF/sm00
320 for (Int_t isect = 0; isect < nSectors; isect++) {
329 symName += Form("%02d",isect);
331 AliDebug(2,"--------------------------------------------");
332 AliDebug(2,Form("Alignable object %d", isect+imod));
333 AliDebug(2,Form("volPath=%s\n",volPath.Data()));
334 AliDebug(2,Form("symName=%s\n",symName.Data()));
335 AliDebug(2,"--------------------------------------------");
337 gGeoManager->SetAlignableEntry(symName.Data(),volPath.Data());
343 //_____________________________________________________________________________
344 void AliTOFv5T0::CreateGeometry()
347 // Create geometry for Time Of Flight version 0
351 <img src="picts/AliTOFv5T0.gif">
355 // Creates common geometry
357 AliTOF::CreateGeometry();
361 //_____________________________________________________________________________
362 void AliTOFv5T0::TOFpc(Float_t xtof, Float_t ytof, Float_t zlenA,
366 // Definition of the Time Of Fligh Resistive Plate Chambers
369 const Float_t kPi = TMath::Pi();
371 const Float_t kInterCentrModBorder1 = 49.5;
372 const Float_t kInterCentrModBorder2 = 57.5;
373 const Float_t kExterInterModBorder1 = 196.0;
374 const Float_t kExterInterModBorder2 = 203.5;
376 const Float_t kLengthExInModBorder = 4.7;
377 const Float_t kLengthInCeModBorder = 7.0;
379 // Al layers over all internal module walls (cm)
380 const Float_t khAlWall = 0.03;
382 // module wall thickness (cm)
383 const Float_t kModuleWallThickness = 0.3;
385 // Al honeycomb layer between strips and cards (cm)
386 const Float_t kHoneycombLayerThickness = 1.5;
388 AliDebug(2,Form("zlenA*0.5 = %d", zlenA*0.5));
389 AliDebug(1, "************************* TOF geometry **************************");
391 // Definition of the Time Of Fligh Resistive Plate Chambers
392 // xFLT, yFLT, zFLT - sizes of TOF modules (large)
394 Float_t xcoor, ycoor, zcoor;
396 Int_t *idtmed = fIdtmed->GetArray()-499;
401 par[2] = zlenA * 0.5;
402 gMC->Gsvolu("FTOA", "BOX ", idtmed[503], par, 3); // fibre glass
407 par[2] = (zlenA*0.5 - kInterCentrModBorder1)*0.5;
408 gMC->Gsvolu("FTOB", "BOX ", idtmed[503], par, 3); // fibre glass
409 gMC->Gsvolu("FTOC", "BOX ", idtmed[503], par, 3); // fibre glass
412 // Positioning of fibre glass modules (FTOA, FTOB and FTOC)
414 //AliMatrix(idrotm[0], 90., 0., 0., 0., 90.,-90.);
415 AliMatrix(idrotm[0], 90., 0., 0., 0., 90.,270.);
420 for(Int_t isec=0;isec<18;isec++){
421 if(fTOFSectors[isec]==-1)continue;
423 sprintf(name, "BTOF%d",isec);
424 if (fTOFHoles && (isec==13 || isec==14 || isec==15)) {
425 // if (fTOFHoles && (isec==16||isec==17)) { \\Old 6h convention
427 ycoor = (zlenA*0.5 + kInterCentrModBorder1)*0.5;
429 gMC->Gspos("FTOB", 0, name, xcoor, ycoor, zcoor, idrotm[0], "ONLY");
430 gMC->Gspos("FTOC", 0, name, xcoor,-ycoor, zcoor, idrotm[0], "ONLY");
436 gMC->Gspos("FTOA", 0,name, xcoor, ycoor, zcoor, idrotm[0], "ONLY");
440 // Large not sensitive volumes with Insensitive Freon (FLTA, FLTB and FLTC)
442 Float_t xFLT, yFLT, zFLTA;
444 xFLT = xtof - kModuleWallThickness*2.;
445 yFLT = ytof - kModuleWallThickness*2.;
446 zFLTA = zlenA - kModuleWallThickness*2.;
451 gMC->Gsvolu("FLTA", "BOX ", idtmed[507], par, 3); // Freon mix
456 gMC->Gspos ("FLTA", 0, "FTOA", xcoor, ycoor, zcoor, 0, "ONLY");
461 par[2] = (zlenA*0.5 - kInterCentrModBorder1-kModuleWallThickness)*0.5;
462 gMC->Gsvolu("FLTB", "BOX ", idtmed[507], par, 3); // Freon mix
463 gMC->Gsvolu("FLTC", "BOX ", idtmed[507], par, 3); // Freon mix
467 zcoor = kModuleWallThickness*0.5;
468 gMC->Gspos ("FLTB", 0, "FTOB", xcoor, ycoor, zcoor, 0, "ONLY");
469 gMC->Gspos ("FLTC", 0, "FTOC", xcoor, ycoor,-zcoor, 0, "ONLY");
472 // Layer of Aluminum before detector (FALA, FALB and FALC)
475 par[1] = khAlWall*0.5;
476 par[2] = kInterCentrModBorder1 - (kModuleWallThickness + khAlWall);
477 gMC->Gsvolu("FALA", "BOX ", idtmed[505], par, 3); // Alluminium
480 ycoor = (-yFLT + khAlWall)*0.5;
482 gMC->Gspos ("FALA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
485 par[1] = khAlWall*0.5;
486 par[2] = (kExterInterModBorder2 - kInterCentrModBorder1 - 2.*(kModuleWallThickness + khAlWall))*0.5;
487 gMC->Gsvolu("FALB", "BOX ", idtmed[505], par, 3); // Alluminium
490 ycoor = (-yFLT + khAlWall)*0.5;
491 zcoor = (kExterInterModBorder2 + kInterCentrModBorder1)*0.5;
492 gMC->Gspos ("FALB", 1, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
493 gMC->Gspos ("FALB", 2, "FLTA", xcoor, ycoor,-zcoor, 0, "ONLY");
496 par[1] = khAlWall*0.5;
497 par[2] = (zlenA*0.5 - kExterInterModBorder2 - 2.*(kModuleWallThickness + khAlWall))*0.5;
498 gMC->Gsvolu("FALC", "BOX ", idtmed[505], par, 3); // Alluminium
501 ycoor = (-yFLT + khAlWall)*0.5;
502 zcoor = (kExterInterModBorder2+zlenA*0.5)*0.5;
503 gMC->Gspos ("FALC", 1, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
504 gMC->Gspos ("FALC", 2, "FLTA", xcoor, ycoor,-zcoor, 0, "ONLY");
508 ycoor = (-yFLT + khAlWall)*0.5;
509 zcoor = (zlenA*0.5 - kExterInterModBorder2)*0.5 - kModuleWallThickness*0.5;
510 gMC->Gspos ("FALB", 1, "FLTB", xcoor, ycoor, zcoor, 0, "ONLY");
511 gMC->Gspos ("FALB", 2, "FLTC", xcoor, ycoor,-zcoor, 0, "ONLY");
514 ycoor = (-yFLT + khAlWall)*0.5;
515 zcoor = (kExterInterModBorder2 - kInterCentrModBorder1)*0.5 + kModuleWallThickness*0.5;
516 gMC->Gspos ("FALC", 1, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
517 gMC->Gspos ("FALC", 2, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
520 Float_t y0, alpha, tgal, beta, tgbe, trpa[11];
522 // Fibre glass walls between central and intermediate modules (FWZ1 and FWZ2; holes -> FZ1B, FZ1C, FZ2B)
524 tgal = (yFLT*0.5 - 2.*kLengthInCeModBorder)/(kInterCentrModBorder2 - kInterCentrModBorder1);
525 alpha = TMath::ATan(tgal);
526 beta = (kPi*0.5 - alpha)*0.5;
527 tgbe = TMath::Tan(beta);
531 trpa[3] = kModuleWallThickness;
532 trpa[4] = (kLengthInCeModBorder - kModuleWallThickness*tgbe)*0.5;
533 trpa[5] = (kLengthInCeModBorder + kModuleWallThickness*tgbe)*0.5;
534 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
535 trpa[7] = kModuleWallThickness;
536 trpa[8] = (kLengthInCeModBorder - kModuleWallThickness*tgbe)*0.5;
537 trpa[9] = (kLengthInCeModBorder + kModuleWallThickness*tgbe)*0.5;
538 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
539 gMC->Gsvolu("FWZ1","TRAP", idtmed[503], trpa, 11); // fibre glass
541 AliMatrix (idrotm[1],90., 90.,180.,0.,90.,180.);
542 AliMatrix (idrotm[4],90., 90., 0.,0.,90., 0.);
545 ycoor = -yFLT*0.5 + kLengthInCeModBorder*0.5;
546 zcoor = kInterCentrModBorder1;
547 gMC->Gspos("FWZ1", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[1],"ONLY");
548 gMC->Gspos("FWZ1", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[4],"ONLY");
551 y0 = kLengthInCeModBorder - kModuleWallThickness*0.5*tgbe;
555 trpa[3] = kModuleWallThickness*0.5;
556 trpa[4] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
557 trpa[5] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
558 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
559 trpa[7] = kModuleWallThickness*0.5;
560 trpa[8] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
561 trpa[9] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
562 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
563 gMC->Gsvolu("FZ1B","TRAP", idtmed[503], trpa, 11); // fibre glass
566 ycoor = -yFLT*0.5 + kLengthInCeModBorder*0.5 - kModuleWallThickness*0.25*tgbe;
567 zcoor = -kInterCentrModBorder1 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
568 gMC->Gspos("FZ1B", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[4],"ONLY");
569 gMC->Gspos("FZ1B", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[1],"ONLY");
572 AliMatrix (idrotm[2],90.,270., 0.,0.,90.,180.);
573 AliMatrix (idrotm[5],90.,270.,180.,0.,90., 0.);
576 ycoor = -kLengthInCeModBorder*0.5;
577 zcoor = kInterCentrModBorder2;
578 gMC->Gspos("FWZ1", 3,"FLTA", xcoor, ycoor, zcoor,idrotm[2],"ONLY");
579 gMC->Gspos("FWZ1", 4,"FLTA", xcoor, ycoor,-zcoor,idrotm[5],"ONLY");
582 y0 = kLengthInCeModBorder + kModuleWallThickness*0.5*tgbe;
586 trpa[3] = kModuleWallThickness*0.5;
587 trpa[4] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
588 trpa[5] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
589 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
590 trpa[7] = kModuleWallThickness*0.5;
591 trpa[8] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
592 trpa[9] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
593 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
594 gMC->Gsvolu("FZ1C","TRAP", idtmed[503], trpa, 11); // fibre glass
597 ycoor = -kLengthInCeModBorder*0.5 - kModuleWallThickness*0.25*tgbe;
598 zcoor = -kInterCentrModBorder2 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
599 gMC->Gspos("FZ1C", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[5],"ONLY");
600 gMC->Gspos("FZ1C", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[2],"ONLY");
603 trpa[0] = 0.5*(kInterCentrModBorder2 - kInterCentrModBorder1)/TMath::Cos(alpha);
604 trpa[1] = kModuleWallThickness;
606 trpa[3] = -beta*kRaddeg;
609 gMC->Gsvolu("FWZ2","PARA", idtmed[503], trpa, 6); // fibre glass
611 AliMatrix (idrotm[3], alpha*kRaddeg,90.,90.+alpha*kRaddeg,90.,90.,180.);
612 AliMatrix (idrotm[6],180.-alpha*kRaddeg,90.,90.-alpha*kRaddeg,90.,90., 0.);
616 zcoor = (kInterCentrModBorder2 + kInterCentrModBorder1)*0.5;
617 gMC->Gspos("FWZ2", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[3],"ONLY");
618 gMC->Gspos("FWZ2", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[6],"ONLY");
621 trpa[0] = 0.5*(kInterCentrModBorder2 - kInterCentrModBorder1)/TMath::Cos(alpha);
622 trpa[1] = kModuleWallThickness*0.5;
624 trpa[3] = -beta*kRaddeg;
627 gMC->Gsvolu("FZ2B","PARA", idtmed[503], trpa, 6); // fibre glass
630 ycoor = -yFLT*0.25 - kModuleWallThickness*0.5*tgbe;
631 zcoor = -(kInterCentrModBorder2 + kInterCentrModBorder1)*0.5 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
632 gMC->Gspos("FZ2B", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[6],"ONLY");
633 gMC->Gspos("FZ2B", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[3],"ONLY");
636 // Fibre glass walls between intermediate and lateral modules (FWZ3 and FWZ4)
638 tgal = (yFLT*0.5 - 2.*kLengthExInModBorder)/(kExterInterModBorder2 - kExterInterModBorder1);
639 alpha = TMath::ATan(tgal);
640 beta = (kPi*0.5 - alpha)*0.5;
641 tgbe = TMath::Tan(beta);
645 trpa[3] = kModuleWallThickness;
646 trpa[4] = (kLengthExInModBorder - kModuleWallThickness*tgbe)*0.5;
647 trpa[5] = (kLengthExInModBorder + kModuleWallThickness*tgbe)*0.5;
648 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
649 trpa[7] = kModuleWallThickness;
650 trpa[8] = (kLengthExInModBorder - kModuleWallThickness*tgbe)*0.5;
651 trpa[9] = (kLengthExInModBorder + kModuleWallThickness*tgbe)*0.5;
652 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
653 gMC->Gsvolu("FWZ3","TRAP", idtmed[503], trpa, 11); // fibre glass
656 ycoor = -kLengthExInModBorder*0.5;
657 zcoor = kExterInterModBorder1;
658 gMC->Gspos("FWZ3", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[5],"ONLY");
659 gMC->Gspos("FWZ3", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[2],"ONLY");
663 ycoor = -kLengthExInModBorder*0.5;
664 zcoor = -kExterInterModBorder1 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
665 gMC->Gspos("FWZ3", 5,"FLTB", xcoor, ycoor, zcoor,idrotm[2],"ONLY");
666 gMC->Gspos("FWZ3", 6,"FLTC", xcoor, ycoor,-zcoor,idrotm[5],"ONLY");
670 ycoor = -yFLT*0.5 + kLengthExInModBorder*0.5;
671 zcoor = kExterInterModBorder2;
672 gMC->Gspos("FWZ3", 3,"FLTA", xcoor, ycoor, zcoor,idrotm[4],"ONLY");
673 gMC->Gspos("FWZ3", 4,"FLTA", xcoor, ycoor,-zcoor,idrotm[1],"ONLY");
677 ycoor = -yFLT*0.5 + kLengthExInModBorder*0.5;
678 zcoor = -kExterInterModBorder2 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
679 gMC->Gspos("FWZ3", 7,"FLTB", xcoor, ycoor, zcoor,idrotm[1],"ONLY");
680 gMC->Gspos("FWZ3", 8,"FLTC", xcoor, ycoor,-zcoor,idrotm[4],"ONLY");
683 trpa[0] = 0.5*(kExterInterModBorder2 - kExterInterModBorder1)/TMath::Cos(alpha);
684 trpa[1] = kModuleWallThickness;
686 trpa[3] = -beta*kRaddeg;
689 gMC->Gsvolu("FWZ4","PARA", idtmed[503], trpa, 6); // fibre glass
691 AliMatrix (idrotm[13],alpha*kRaddeg,90.,90.+alpha*kRaddeg,90.,90.,180.);
692 AliMatrix (idrotm[16],180.-alpha*kRaddeg,90.,90.-alpha*kRaddeg,90.,90.,0.);
696 zcoor = (kExterInterModBorder2 + kExterInterModBorder1)*0.5;
697 gMC->Gspos("FWZ4", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[16],"ONLY");
698 gMC->Gspos("FWZ4", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[13],"ONLY");
703 zcoor = -(kExterInterModBorder2 + kExterInterModBorder1)*0.5 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
704 gMC->Gspos("FWZ4", 3,"FLTB", xcoor, ycoor, zcoor,idrotm[13],"ONLY");
705 gMC->Gspos("FWZ4", 4,"FLTC", xcoor, ycoor,-zcoor,idrotm[16],"ONLY");
709 ///////////////// Detector itself //////////////////////
711 const Int_t knx = fTOFGeometry->NpadX(); // number of pads along x
712 const Int_t knz = fTOFGeometry->NpadZ(); // number of pads along z
713 const Float_t kPadX = fTOFGeometry->XPad(); // pad length along x
714 const Float_t kPadZ = fTOFGeometry->ZPad(); // pad length along z
716 // new description for strip volume -double stack strip-
717 // -- all constants are expressed in cm
718 // heigth of different layers
719 const Float_t khhony = 1.0 ; // heigth of HONY Layer
720 const Float_t khpcby = 0.08 ; // heigth of PCB Layer
721 const Float_t khrgly = 0.055 ; // heigth of RED GLASS Layer
723 const Float_t khfiliy = 0.125 ; // heigth of FISHLINE Layer
724 const Float_t khglassy = 0.160*0.5; // heigth of GLASS Layer
725 const Float_t khglfy = khfiliy+2.*khglassy;// heigth of GLASS+FISHLINE Layer
727 const Float_t khcpcby = 0.16 ; // heigth of PCB Central Layer
728 const Float_t kwhonz = 8.1 ; // z dimension of HONEY Layer
729 const Float_t kwpcbz1 = 10.6 ; // z dimension of PCB Lower Layer
730 const Float_t kwpcbz2 = 11.6 ; // z dimension of PCB Upper Layer
731 const Float_t kwcpcbz = 12.4 ; // z dimension of PCB Central Layer
732 const Float_t kwrglz = 8. ; // z dimension of RED GLASS Layer
733 const Float_t kwglfz = 7. ; // z dimension of GLASS+FISHLN Layer
734 const Float_t klsensmx = knx*kPadX; // length of Sensitive Layer
735 const Float_t khsensmy = 0.05;//0.11;//0.16;// heigth of Sensitive Layer
736 const Float_t kwsensmz = knz*kPadZ; // width of Sensitive Layer
738 // heigth of the FSTR Volume (the strip volume)
739 const Float_t khstripy = 2.*khhony+2.*khpcby+4.*khrgly+2.*khglfy+khcpcby;
741 // width of the FSTR Volume (the strip volume)
742 const Float_t kwstripz = kwcpcbz;
743 // length of the FSTR Volume (the strip volume)
744 const Float_t klstripx = fTOFGeometry->StripLength();
746 Float_t parfp[3]={klstripx*0.5,khstripy*0.5,kwstripz*0.5};
747 // Coordinates of the strip center in the strip reference frame;
748 // used for positioning internal strip volumes
749 Float_t posfp[3]={0.,0.,0.};
751 // FSTR volume definition-filling this volume with non sensitive Gas Mixture
752 gMC->Gsvolu("FSTR","BOX",idtmed[507],parfp,3); // Freon mix
754 //-- HONY Layer definition
755 parfp[1] = khhony*0.5;
756 parfp[2] = kwhonz*0.5;
757 gMC->Gsvolu("FHON","BOX",idtmed[501],parfp,3); // honeycomb (Nomex)
758 // positioning 2 HONY Layers on FSTR volume
759 posfp[1] =-khstripy*0.5+parfp[1];
760 gMC->Gspos("FHON",1,"FSTR",0., posfp[1],0.,0,"ONLY");
761 gMC->Gspos("FHON",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
763 //-- PCB Layer definition
764 parfp[1] = khpcby*0.5;
765 parfp[2] = kwpcbz1*0.5;
766 gMC->Gsvolu("FPC1","BOX",idtmed[502],parfp,3); // G10
767 parfp[2] = kwpcbz2*0.5;
768 gMC->Gsvolu("FPC2","BOX",idtmed[502],parfp,3); // G10
769 // positioning 2 PCB Layers on FSTR volume
770 posfp[1] =-khstripy*0.5+khhony+parfp[1];
771 gMC->Gspos("FPC1",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
772 gMC->Gspos("FPC2",1,"FSTR",0., posfp[1],0.,0,"ONLY");
774 //-- central PCB layer definition
775 parfp[1] = khcpcby*0.5;
776 parfp[2] = kwcpcbz*0.5;
777 gMC->Gsvolu("FPCB","BOX",idtmed[502],parfp,3); // G10
778 // positioning the central PCB layer
779 gMC->Gspos("FPCB",1,"FSTR",0.,0.,0.,0,"ONLY");
782 Float_t parfs[3] = {klsensmx*0.5, khsensmy*0.5, kwsensmz*0.5};
783 gMC->Gsvolu("FSEN","BOX",idtmed[508],parfs,3); // sensitive ...
784 // dividing FSEN along z in knz=2 and along x in knx=48
785 gMC->Gsdvn("FSEZ","FSEN",knz,3);
786 gMC->Gsdvn("FPAD","FSEZ",knx,1);
787 // positioning a Sensitive layer inside FPCB
788 gMC->Gspos("FSEN",1,"FPCB",0.,0.,0.,0,"ONLY");
790 //-- RED GLASS Layer definition
791 parfp[1] = khrgly*0.5;
792 parfp[2] = kwrglz*0.5;
793 gMC->Gsvolu("FRGL","BOX",idtmed[509],parfp,3); // glass
794 // positioning 4 RED GLASS Layers on FSTR volume
795 posfp[1] = -khstripy*0.5+khhony+khpcby+parfp[1];
796 gMC->Gspos("FRGL",1,"FSTR",0., posfp[1],0.,0,"ONLY");
797 gMC->Gspos("FRGL",4,"FSTR",0.,-posfp[1],0.,0,"ONLY");
798 posfp[1] = (khcpcby+khrgly)*0.5;
799 gMC->Gspos("FRGL",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
800 gMC->Gspos("FRGL",3,"FSTR",0., posfp[1],0.,0,"ONLY");
802 //-- GLASS Layer definition
803 parfp[1] = khglassy*0.5;
804 parfp[2] = kwglfz*0.5;
805 gMC->Gsvolu("FGLA","BOX",idtmed[509],parfp,3); // glass
807 // positioning 4 GLASS Layers on FSTR volume
808 posfp[1] = -khstripy*0.5+khhony+khpcby+khrgly+parfp[1];
809 gMC->Gspos("FGLA",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
810 gMC->Gspos("FGLA",4,"FSTR",0., posfp[1],0.,0,"ONLY");
811 posfp[1] = khcpcby*0.5+khrgly+khglassy*0.5;
812 gMC->Gspos("FGLA",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
813 gMC->Gspos("FGLA",3,"FSTR",0., posfp[1],0.,0,"ONLY");
815 //-- FREON Layer definition
816 parfp[1] = khfiliy*0.5;
817 gMC->Gsvolu("FFIS","BOX",idtmed[507],parfp,3); // freon
819 // positioning 2 FREON Layers on FSTR volume
820 posfp[1] = -khstripy*0.5+khhony+khpcby+khrgly+khglassy+parfp[1];
821 gMC->Gspos("FFIS",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
822 gMC->Gspos("FFIS",2,"FSTR",0., posfp[1],0.,0,"ONLY");
825 //-- GLASS+FISHLINE Layer definition
826 parfp[1] = khglfy*0.5;
827 parfp[2] = kwglfz*0.5;
828 gMC->Gsvolu("FGLF","BOX",idtmed[504],parfp,3);
830 // positioning 2 GLASS+FISHLINE Layers on FSTR volume
831 posfp[1] = (khcpcby+khglfy)*0.5+khrgly;
832 gMC->Gspos("FGLF",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
833 gMC->Gspos("FGLF",2,"FSTR",0., posfp[1],0.,0,"ONLY");
836 // Positioning the Strips (FSTR) in the FLT volumes
837 Int_t maxStripNumbers [5] ={fTOFGeometry->NStripC(),
838 fTOFGeometry->NStripB(),
839 fTOFGeometry->NStripA(),
840 fTOFGeometry->NStripB(),
841 fTOFGeometry->NStripC()};
843 Int_t totalStrip = 0;
844 Float_t xpos, zpos, ypos, ang;
845 for(Int_t iplate =0; iplate < fTOFGeometry->NPlates(); iplate++){
846 if (iplate>0) totalStrip += maxStripNumbers[iplate-1];
847 for(Int_t istrip =0; istrip < maxStripNumbers[iplate]; istrip++){
849 ang = fTOFGeometry->GetAngles(iplate,istrip);
850 AliDebug(1, Form(" iplate = %1i, istrip = %2i ---> ang = %f", iplate, istrip, ang));
852 if (ang>0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.+ang,90., ang, 90.);
853 else if (ang==0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.,90., 0., 0.);
854 else if (ang<0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.+ang,90.,-ang,270.);
857 zpos = fTOFGeometry->GetDistances(iplate,istrip);
858 ypos = fTOFGeometry->GetHeights(iplate,istrip);
860 gMC->Gspos("FSTR",istrip+totalStrip+1,"FLTA", xpos, ypos,-zpos,idrotm[istrip+totalStrip+1], "ONLY");
863 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");
864 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");
869 // 1.5 cm Al honeycomb layer between strips and cards
871 par[1] = kHoneycombLayerThickness*0.5;
873 gMC->Gsvolu("FPEA", "BOX ", idtmed[506], par, 3); // Al honeycomb
876 ycoor = kHoneycombLayerThickness*0.5;
878 gMC->Gspos ("FPEA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
882 par[1] = kHoneycombLayerThickness*0.5;
883 par[2] = (zlenA*0.5 - kInterCentrModBorder2-kModuleWallThickness)*0.5;
884 gMC->Gsvolu("FPEB", "BOX ", idtmed[506], par, 3); // Al honeycomb
887 ycoor = kHoneycombLayerThickness*0.5;
888 zcoor = (kInterCentrModBorder2-kInterCentrModBorder1)*0.5;
889 gMC->Gspos ("FPEB", 1, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
890 gMC->Gspos ("FPEB", 2, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
895 par[1] = (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
897 gMC->Gsvolu("FAIA", "BOX ", idtmed[500], par, 3); // Air
900 ycoor = kHoneycombLayerThickness + (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
902 gMC->Gspos ("FAIA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
906 par[1] = (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
907 par[2] = (zlenA*0.5 - kInterCentrModBorder2 - kModuleWallThickness)*0.5;
908 gMC->Gsvolu("FAIB", "BOX ", idtmed[500], par, 3); // Air
909 gMC->Gsvolu("FAIC", "BOX ", idtmed[500], par, 3); // Air
912 ycoor = kHoneycombLayerThickness + (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
913 zcoor = (kInterCentrModBorder2-kInterCentrModBorder1)*0.5;
914 gMC->Gspos ("FAIB", 0, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
915 gMC->Gspos ("FAIC", 0, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
918 // start with cards and cooling tubes
919 // finally, cards, cooling tubes and layer for thermal dispersion
922 // see GEOM200 in GEANT manual
926 // card volume definition
927 cardpar[0]= xFLT*0.5;
930 gMC->Gsvolu("FCAR", "BOX ", idtmed[502], cardpar, 3); // PCB Card
932 //alu plate volume definition
935 gMC->Gsvolu("FALP", "BOX ", idtmed[505], cardpar, 3); // Alu Plate
937 // tube volume definition
942 gMC->Gsvolu("FTUB", "TUBE", idtmed[511], tubepar, 3); // cooling tubes (steel)
947 gMC->Gsvolu("FITU", "TUBE", idtmed[510], tubepar, 3); // cooling water
948 // positioning water tube into the steel one
949 gMC->Gspos("FITU",1,"FTUB",0.,0.,0.,0,"ONLY");
952 AliMatrix(idrotm[99], 180., 90., 90., 90., 90., 0.);
954 // central module positioning
955 Float_t cardpos[3], aplpos2;
956 Float_t stepforcardA = 6.625;
958 Float_t aplpos1 = -2.;
963 // tubepos= -53.+tdis;
965 for (icard=39; icard<54; ++icard) {
966 cardpos[2]= cardpos[2]+stepforcardA;
967 aplpos2 = cardpos[2]+0.15;
968 gMC->Gspos("FCAR",icard,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
969 gMC->Gspos("FALP",icard,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
970 gMC->Gspos("FTUB",icard,"FAIA", 0.,cardpos[1],cardpos[2]+tdis,idrotm[99],"ONLY");
973 // intermediate module positioning
974 Float_t stepforcardB= 7.05;
978 for (icard=20; icard<39; ++icard) {
979 cardpos[2]= cardpos[2]+stepforcardB;
980 aplpos2 = cardpos[2]+0.15;
982 gMC->Gspos("FCAR",icard+34,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
983 gMC->Gspos("FALP",icard+34,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
984 gMC->Gspos("FTUB",icard+34,"FAIA", 0.,cardpos[1], cardpos[2]+tdis,idrotm[99],"ONLY");
985 gMC->Gspos("FCAR",58-icard,"FAIA",cardpos[0],cardpos[1], -cardpos[2], 0,"ONLY");
986 gMC->Gspos("FALP",58-icard,"FAIA",cardpos[0], aplpos1, -aplpos2, 0,"ONLY");
987 gMC->Gspos("FTUB",58-icard,"FAIA", 0.,cardpos[1],-cardpos[2]-tdis,idrotm[99],"ONLY");
990 gMC->Gspos("FCAR",icard+34+182,"FAIC",cardpos[0],cardpos[1], cardpos[2]-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
991 gMC->Gspos("FALP",icard+34+182,"FAIC",cardpos[0], aplpos1, aplpos2-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
992 gMC->Gspos("FTUB",icard+34+182,"FAIC", 0.,cardpos[1], cardpos[2]+tdis-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
993 gMC->Gspos("FCAR",58-icard+ 91,"FAIB",cardpos[0],cardpos[1], -cardpos[2]+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
994 gMC->Gspos("FALP",58-icard+ 91,"FAIB",cardpos[0], aplpos1, -aplpos2+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
995 gMC->Gspos("FTUB",58-icard+ 91,"FAIB", 0.,cardpos[1],-cardpos[2]-tdis+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
1000 // outer module positioning
1001 Float_t stepforcardC= 8.45238;
1004 for (icard=1; icard<20; ++icard) {
1005 cardpos[2]= cardpos[2]+stepforcardC;
1006 aplpos2 = cardpos[2]+0.15;
1008 gMC->Gspos("FCAR",icard+72,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
1009 gMC->Gspos("FALP",icard+72,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
1010 gMC->Gspos("FTUB",icard+72,"FAIA", 0.,cardpos[1], cardpos[2]+tdis,idrotm[99],"ONLY");
1011 gMC->Gspos("FCAR",20-icard,"FAIA",cardpos[0],cardpos[1], -cardpos[2], 0,"ONLY");
1012 gMC->Gspos("FALP",20-icard,"FAIA",cardpos[0], aplpos1, -aplpos2, 0,"ONLY");
1013 gMC->Gspos("FTUB",20-icard,"FAIA", 0.,cardpos[1],-cardpos[2]-tdis,idrotm[99],"ONLY");
1016 gMC->Gspos("FCAR",icard+72+182,"FAIC",cardpos[0],cardpos[1], cardpos[2]-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1017 gMC->Gspos("FALP",icard+72+182,"FAIC",cardpos[0], aplpos1, aplpos2-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1018 gMC->Gspos("FTUB",icard+72+182,"FAIC", 0.,cardpos[1], cardpos[2]+tdis-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
1019 gMC->Gspos("FCAR",20-icard+ 91,"FAIB",cardpos[0],cardpos[1], -cardpos[2]+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1020 gMC->Gspos("FALP",20-icard+ 91,"FAIB",cardpos[0], aplpos1, -aplpos2+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1021 gMC->Gspos("FTUB",20-icard+ 91,"FAIB", 0.,cardpos[1],-cardpos[2]-tdis+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
1026 //_____________________________________________________________________________
1027 void AliTOFv5T0::DrawModule() const
1030 // Draw a shaded view of the Time Of Flight version 4
1033 // Set everything unseen
1034 gMC->Gsatt("*", "seen", -1);
1037 //Set volumes visible
1040 //Set ALIC mother transparent
1041 gMC->Gsatt("ALIC","SEEN", 0);
1044 // Level 1 for TOF volumes
1045 gMC->Gsatt("B077","seen", 0);
1048 // Level 2 for TOF volumes
1049 gMC->Gsatt("B071","seen", 0);
1050 gMC->Gsatt("B074","seen", 0);
1051 gMC->Gsatt("B075","seen", 0);
1052 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
1053 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
1056 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
1057 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
1058 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
1059 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
1060 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
1062 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
1063 gMC->Gsatt("BTO1","seen", 0);
1066 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
1067 gMC->Gsatt("BTO2","seen", 0);
1070 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
1071 gMC->Gsatt("BTO3","seen", 0);
1073 // Level 3 of B071, B074 and B075
1074 gMC->Gsatt("FTOA","SEEN", 0);
1075 if (fTOFHoles) gMC->Gsatt("FTOB","SEEN", 0);
1077 // Level 4 of B071, B074 and B075
1078 gMC->Gsatt("FLTA","SEEN", 0);
1079 if (fTOFHoles) gMC->Gsatt("FLTB","SEEN",0);
1080 if (fTOFHoles) gMC->Gsatt("FLTC","SEEN",0);
1082 // Level 5 of B071, B074 and B075
1083 gMC->Gsatt("FAIA","SEEN",-1); // all FAIA sub-levels skipped -
1084 if (fTOFHoles) gMC->Gsatt("FAIB","SEEN",-1); // all FAIB sub-levels skipped -
1085 if (fTOFHoles) gMC->Gsatt("FAIC","SEEN",-1); // all FAIC sub-levels skipped -
1087 gMC->Gsatt("FALA","SEEN", 0);
1088 if (fTOFHoles) gMC->Gsatt("FALB","SEEN", 0);
1090 gMC->Gsatt("FPEA","SEEN", 1);
1091 if (fTOFHoles) gMC->Gsatt("FPEB","SEEN", 1);
1093 gMC->Gsatt("FSTR","SEEN",-1); // all FSTR sub-levels skipped -
1095 gMC->Gsatt("FWZ1","SEEN", 0);
1096 gMC->Gsatt("FWZ2","SEEN", 0);
1097 gMC->Gsatt("FWZ3","SEEN", 0);
1098 gMC->Gsatt("FWZ4","SEEN", 0);
1100 gMC->Gsatt("FZ1B","SEEN", 0);
1101 gMC->Gsatt("FZ1C","SEEN", 0);
1102 gMC->Gsatt("FZ2B","SEEN", 0);
1105 gMC->Gdopt("hide", "on");
1106 gMC->Gdopt("shad", "on");
1107 gMC->Gsatt("*", "fill", 7);
1108 gMC->SetClipBox(".");
1109 gMC->SetClipBox("*", 100, 1000, 100, 1000, 100, 1000);
1110 gMC->DefaultRange();
1111 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
1112 gMC->Gdhead(1111, "Time Of Flight");
1113 gMC->Gdman(18, 3, "MAN");
1114 gMC->Gdopt("hide","off");
1116 //_____________________________________________________________________________
1117 void AliTOFv5T0::DrawDetectorModules() const
1120 // Draw a shaded view of the TOF detector version 4
1123 // Set everything unseen
1124 gMC->Gsatt("*", "seen", -1);
1127 //Set volumes visible
1130 //Set ALIC mother transparent
1131 gMC->Gsatt("ALIC","SEEN", 0);
1134 // Level 1 for TOF volumes
1135 gMC->Gsatt("B077","seen", 0);
1138 // Level 2 for TOF volumes
1139 gMC->Gsatt("B071","seen", 0);
1140 gMC->Gsatt("B074","seen", 0);
1141 gMC->Gsatt("B075","seen", 0);
1142 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
1143 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
1146 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
1147 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
1148 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
1149 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
1150 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
1152 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
1153 gMC->Gsatt("BTO1","seen", 0);
1156 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
1157 gMC->Gsatt("BTO2","seen", 0);
1160 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
1161 gMC->Gsatt("BTO3","seen", 0);
1163 // Level 3 of B071, B075 and B074
1164 gMC->Gsatt("FTOA","seen",-2); // all FTOA sub-levels skipped -
1166 gMC->Gsatt("FTOB","seen",-2); // all FTOB sub-levels skipped -
1167 gMC->Gsatt("FTOC","seen",-2); // all FTOC sub-levels skipped -
1170 gMC->Gdopt("hide","on");
1171 gMC->Gdopt("shad","on");
1172 gMC->Gsatt("*", "fill", 5);
1173 gMC->SetClipBox(".");
1174 gMC->SetClipBox("*", 100, 1000, 100, 1000, 0, 1000);
1175 gMC->DefaultRange();
1176 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
1177 gMC->Gdhead(1111,"TOF detector");
1178 gMC->Gdman(18, 3, "MAN");
1179 gMC->Gdopt("hide","off");
1182 //_____________________________________________________________________________
1183 void AliTOFv5T0::DrawDetectorStrips() const
1186 // Draw a shaded view of the TOF strips for version 4
1189 // Set everything unseen
1190 gMC->Gsatt("*", "seen", -1);
1193 //Set volumes visible
1196 //Set ALIC mother transparent
1197 gMC->Gsatt("ALIC","SEEN", 0);
1200 // Level 1 for TOF volumes
1201 gMC->Gsatt("B077","seen", 0);
1204 // Level 2 for TOF volumes
1205 gMC->Gsatt("B071","seen", 0);
1206 gMC->Gsatt("B074","seen", 0);
1207 gMC->Gsatt("B075","seen", 0);
1208 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
1209 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
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("B056","seen", 0); // B056 does not has sub-levels -
1216 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
1218 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
1219 gMC->Gsatt("BTO1","seen", 0);
1222 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
1223 gMC->Gsatt("BTO2","seen", 0);
1226 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
1227 gMC->Gsatt("BTO3","seen", 0);
1229 // Level 3 of B071, B074 and B075
1230 gMC->Gsatt("FTOA","SEEN", 0);
1232 gMC->Gsatt("FTOB","SEEN", 0);
1233 gMC->Gsatt("FTOC","SEEN", 0);
1236 // Level 4 of B071, B074 and B075
1237 gMC->Gsatt("FLTA","SEEN", 0);
1239 gMC->Gsatt("FLTB","SEEN", 0);
1240 gMC->Gsatt("FLTC","SEEN", 0);
1243 // Level 5 of B071, B074 and B075
1244 gMC->Gsatt("FAIA","SEEN",-1); // all FAIA sub-levels skipped -
1246 gMC->Gsatt("FAIB","SEEN",-1); // all FAIB sub-levels skipped -
1247 gMC->Gsatt("FAIC","SEEN",-1); // all FAIC sub-levels skipped -
1250 gMC->Gsatt("FALA","SEEN", 0);
1251 if (fTOFHoles) gMC->Gsatt("FALB","SEEN", 0);
1253 gMC->Gsatt("FPEA","SEEN", 0);
1254 if (fTOFHoles) gMC->Gsatt("FPEB","SEEN", 0);
1256 gMC->Gsatt("FSTR","SEEN",-2); // all FSTR sub-levels skipped -
1258 gMC->Gsatt("FWZ1","SEEN", 0);
1259 gMC->Gsatt("FWZ2","SEEN", 0);
1260 gMC->Gsatt("FWZ3","SEEN", 0);
1261 gMC->Gsatt("FWZ4","SEEN", 0);
1263 gMC->Gsatt("FZ1B","SEEN", 0);
1264 gMC->Gsatt("FZ1C","SEEN", 0);
1265 gMC->Gsatt("FZ2B","SEEN", 0);
1272 gMC->Gsatt("FALP","SEEN",0);
1273 gMC->Gsatt("FCAR","SEEN",0);
1274 gMC->Gsatt("FTUB","SEEN",-1); // all FTUB sub-levels skipped -
1277 gMC->Gsatt("FITU","SEEN",0);
1282 gMC->Gsatt("FGLF","SEEN",0);
1283 gMC->Gsatt("FHON","SEEN",0);
1284 gMC->Gsatt("FPC1","SEEN",0);
1285 gMC->Gsatt("FPC2","SEEN",0);
1286 gMC->Gsatt("FPCB","SEEN",0);
1287 gMC->Gsatt("FRGL","SEEN",0);
1289 // Level 2 of FPCB => Level 3 of FSTR
1290 gMC->Gsatt("FSEN","SEEN",0);
1291 gMC->Gsatt("FSEZ","SEEN",0);
1292 gMC->Gsatt("FPAD","SEEN",1);
1295 gMC->Gdopt("hide","on");
1296 gMC->Gdopt("shad","on");
1297 gMC->Gsatt("*", "fill", 5);
1298 gMC->SetClipBox(".");
1299 gMC->SetClipBox("*", 0, 1000, 0, 1000, 0, 1000);
1300 gMC->DefaultRange();
1301 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
1302 gMC->Gdhead(1111,"TOF Strips");
1303 gMC->Gdman(18, 3, "MAN");
1304 gMC->Gdopt("hide","off");
1307 //_____________________________________________________________________________
1308 void AliTOFv5T0::CreateMaterials()
1311 // Define materials for the Time Of Flight
1314 //AliTOF::CreateMaterials();
1316 AliMagF *magneticField = (AliMagF*)gAlice->Field();
1318 Int_t isxfld = magneticField->Integ();
1319 Float_t sxmgmx = magneticField->Max();
1321 Float_t we[7], ae[7], na[7], fr[7], vl[7];
1324 //--- Quartz (SiO2) to simulate float glass
1325 // density tuned to have correct float glass
1327 Float_t aq[2] = { 28.0855,15.9994 };
1328 Float_t zq[2] = { 14.,8. };
1329 Float_t wq[2] = { 1.,2. };
1330 Float_t dq = 2.55; // std value: 2.2
1334 Float_t anox[4] = {12.01,1.01,16.00,14.01};
1335 Float_t znox[4] = { 6., 1., 8., 7.};
1336 Float_t wnox[4] = {14., 22., 2., 2.};
1337 Float_t dnox = 0.048;
1341 Float_t ag10[4] = {28.09,12.01,1.01,16.00};
1342 Float_t zg10[4] = {14., 6., 1., 8.};
1345 for (i = 0; i < nlmatg10; ++i) {
1361 MaterialMixer(we,ae,na,fr,vl,5);
1367 Float_t densg10 = 1.7;
1370 Float_t awa[2] = { 1., 16. };
1371 Float_t zwa[2] = { 1., 8. };
1372 Float_t wwa[2] = { 2., 1. };
1377 Float_t asteel[4] = { 55.847,51.9961,58.6934,28.0855 };
1378 Float_t zsteel[4] = { 26.,24.,28.,14. };
1379 Float_t wsteel[4] = { .715,.18,.1,.005 };
1382 Float_t aAir[4]={12.0107,14.0067,15.9994,39.948};
1383 Float_t zAir[4]={6.,7.,8.,18.};
1384 Float_t wAir[4]={0.000124,0.755267,0.231781,0.012827};
1385 Float_t dAir = 1.20479E-3;
1388 Float_t afg[4] = {28.09,16.00,12.01,1.01};
1389 Float_t zfg[4] = {14., 8., 6., 1.};
1390 Float_t wfg[4] = {0.12906,0.29405,0.51502,0.06187};
1391 Float_t dfg = 1.111;
1394 // --- Freon C2F4H2 + SF6
1395 Float_t afre[4]= {12.01,1.01,19.00,32.07};
1396 Float_t zfre[4]= { 6., 1., 9., 16.};
1397 Float_t wfre[4]= {0.21250,0.01787,0.74827,0.021355};
1398 Float_t densfre= 0.00375;
1401 //char namat[15] = " ";
1402 //Float_t ama[2], zma[2], dma, radl, absl, buf[1];
1405 AliMixture ( 0, "Air$", aAir, zAir, dAir, 4, wAir);
1406 AliMixture ( 1, "Nomex$", anox, znox, dnox, nnox, wnox);
1407 AliMixture ( 2, "G10$", ag10, zg10, densg10, nlmatg10, wmatg10);
1408 AliMixture ( 3, "fibre glass$", afg, zfg, dfg, nfg, wfg);
1409 AliMaterial( 4, "Al $", 26.98, 13., 2.7, 8.9, 37.2);
1410 AliMaterial( 5, "Al honeycomb$", 26.98, 13., 0.0496, 483., 2483.);
1411 AliMixture ( 6, "Freon$", afre, zfre, densfre, nfre, wfre);
1412 AliMixture ( 7, "Glass$", aq, zq, dq, nq, wq);
1414 // get freon and glass
1415 gMC->Gfmate((*fIdmate)[6],namat,ama[0],zma[0],dma,radl,absl,buf,nbuf);
1416 gMC->Gfmate((*fIdmate)[7],namat,ama[1],zma[1],dma,radl,absl,buf,nbuf);
1419 Float_t wgfr[2]= {0.0011,0.9989};
1420 Float_t dgfr = 1.434;
1422 AliMixture ( 8, "glass-freon$", ama, zma, dgfr, ngfr, wgfr);
1424 AliMixture ( 9, "Water$", awa, zwa, dwa, nwa, wwa);
1425 AliMixture (10, "STAINLESS STEEL$", asteel, zsteel, 7.88, 4, wsteel);
1427 Float_t epsil, stmin, deemax, stemax;
1430 // EPSIL = 0.1 ! Tracking precision,
1431 // STEMAX = 0.1 ! Maximum displacement for multiple scattering
1432 // DEEMAX = 0.1 ! Maximum fractional energy loss, DLS
1436 epsil = .001; // Tracking precision,
1437 stemax = -1.; // Maximum displacement for multiple scattering
1438 deemax = -.3; // Maximum fractional energy loss, DLS
1441 AliMedium( 1, "Air$", 0, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1442 AliMedium( 2,"Nomex$", 1, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1443 AliMedium( 3,"G10$", 2, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1444 AliMedium( 4,"fibre glass$", 3, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1445 //AliMedium( 5,"glass-freon$", 8, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1446 AliMedium( 6,"Al Frame$", 4, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1447 AliMedium( 7,"Al honeycomb$", 5, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1448 AliMedium( 8,"Fre$", 6, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1449 AliMedium( 9,"PCB-S$", 2, 1, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1450 AliMedium(10,"Glass$", 7, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1451 AliMedium(11,"Water$", 9, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1452 AliMedium(12,"STEEL$", 10, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1455 //_____________________________________________________________________________
1456 void AliTOFv5T0::Init()
1459 // Initialise the detector after the geometry has been defined
1461 AliDebug(1, "**************************************"
1463 "**************************************");
1464 AliDebug(1, " Version 4 of TOF initialing, "
1465 "symmetric TOF - Full Coverage version");
1469 fIdFTOA = gMC->VolId("FTOA");
1471 fIdFTOB = gMC->VolId("FTOB");
1472 fIdFTOC = gMC->VolId("FTOC");
1474 fIdFLTA = gMC->VolId("FLTA");
1476 fIdFLTB = gMC->VolId("FLTB");
1477 fIdFLTC = gMC->VolId("FLTC");
1480 AliDebug(1, "**************************************"
1482 "**************************************");
1485 //_____________________________________________________________________________
1486 void AliTOFv5T0::StepManager()
1490 // Procedure called at each step in the Time Of Flight
1493 TLorentzVector mom, pos;
1494 Float_t xm[3],pm[3],xpad[3],ppad[3];
1497 Int_t sector, plate, padx, padz, strip;
1498 Int_t copy, padzid, padxid, stripid, i;
1499 Int_t *idtmed = fIdtmed->GetArray()-499;
1500 Float_t incidenceAngle;
1502 const char* volpath;
1507 gMC->IsTrackEntering()
1508 && gMC->TrackCharge()
1509 //&& gMC->GetMedium()==idtmed[508]
1510 && gMC->CurrentMedium()==idtmed[508]
1511 && gMC->CurrentVolID(copy)==fIdSens
1515 AliMC *mcApplication = (AliMC*)gAlice->GetMCApp();
1517 AddTrackReference(mcApplication->GetCurrentTrackNumber(), AliTrackReference::kTOF);
1518 //AddTrackReference(gAlice->GetMCApp()->GetCurrentTrackNumber());
1520 // getting information about hit volumes
1522 padzid=gMC->CurrentVolOffID(1,copy);
1526 padxid=gMC->CurrentVolOffID(0,copy);
1530 stripid=gMC->CurrentVolOffID(4,copy);
1534 gMC->TrackPosition(pos);
1535 gMC->TrackMomentum(mom);
1537 Double_t normMom=1./mom.Rho();
1539 // getting the coordinates in pad ref system
1541 xm[0] = (Float_t)pos.X();
1542 xm[1] = (Float_t)pos.Y();
1543 xm[2] = (Float_t)pos.Z();
1545 pm[0] = (Float_t)mom.X()*normMom;
1546 pm[1] = (Float_t)mom.Y()*normMom;
1547 pm[2] = (Float_t)mom.Z()*normMom;
1549 gMC->Gmtod(xm,xpad,1); // from MRS to DRS: coordinates convertion
1550 gMC->Gmtod(pm,ppad,2); // from MRS to DRS: direction cosinus convertion
1553 if (TMath::Abs(ppad[1])>1) {
1554 AliWarning("Abs(ppad) > 1");
1555 ppad[1]=TMath::Sign((Float_t)1,ppad[1]);
1557 incidenceAngle = TMath::ACos(ppad[1])*kRaddeg;
1560 if (strip < fTOFGeometry->NStripC()) {
1564 else if (strip >= fTOFGeometry->NStripC() &&
1565 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB()) {
1567 strip = strip - fTOFGeometry->NStripC();
1569 else if (strip >= fTOFGeometry->NStripC() + fTOFGeometry->NStripB() &&
1570 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA()) {
1572 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB();
1574 else if (strip >= fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA() &&
1575 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA() + fTOFGeometry->NStripB()) {
1577 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB() - fTOFGeometry->NStripA();
1581 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB() - fTOFGeometry->NStripA() - fTOFGeometry->NStripB();
1584 volpath=gMC->CurrentVolOffName(7);
1585 index=atoi(&volpath[4]);
1602 hits[6] = mom.Rho();
1607 hits[11]= incidenceAngle;
1608 hits[12]= gMC->Edep();
1609 hits[13]= gMC->TrackLength();
1617 AddT0Hit(mcApplication->GetCurrentTrackNumber(),vol, hits);
1618 //AddT0Hit(gAlice->GetMCApp()->GetCurrentTrackNumber(),vol, hits);
1621 //-------------------------------------------------------------------
1622 void AliTOFv5T0::MaterialMixer(Float_t* p,Float_t* a,Float_t* m,Float_t* d,Float_t* s,Int_t n) const
1624 // a[] atomic weights vector (in)
1625 // (atoms present in more compound appear separately)
1626 // m[] number of corresponding atoms in the mixture (in)
1627 // d[] fraction of the compound relative to the corresponding atoms (in)
1628 // s[] further possible weights " " " " (in)
1630 for (Int_t i = 0; i < n; ++i) {
1631 p[i] = a[i]*m[i]*d[i]*s[i];
1634 for (Int_t i = 0; i < n; ++i) {
1636 // AliInfo(Form((\n weight[%i] = %f (,i,p[i]));