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.16 2007/05/04 12:59:26 arcelli
19 Change the TOF SM paths for misalignment (one layer up)
21 Revision 1.15 2007/02/19 15:41:55 decaro
22 Coding convention: few corrections
24 Revision 1.14 2006/10/17 15:33:14 arcelli
25 Moving some printout from Info to Debug level
27 Revision 1.13 2006/10/12 16:35:43 arcelli
28 definition of the alignable volumes symbolic names added
30 Revision 1.12 2006/08/22 13:34:46 arcelli
31 removal of effective c++ warnings (C.Zampolli)
33 Revision 1.11 2006/07/12 16:03:44 arcelli
34 updates to match the new numbering of the TOF/TRD mother volumes in FRAME (ALICE convention)
36 Revision 1.10 2006/05/10 18:40:17 hristov
37 Larger strings for the names
39 Revision 1.9 2006/05/04 19:41:42 hristov
40 Possibility for partial TOF geometry (S.Arcelli)
42 Revision 1.8 2006/04/20 22:30:50 hristov
43 Coding conventions (Annalisa)
45 Revision 1.7 2006/04/16 22:29:05 hristov
46 Coding conventions (Annalisa)
48 Revision 1.6 2006/03/20 08:20:35 decaro
49 Al layer: positioning correction
51 Revision 1.5 2006/03/20 07:54:20 decaro
52 Correction of some layer thickness
54 Revision 1.4 2006/03/13 12:35:44 decaro
55 Suppression of fractional Z warning
57 Revision 1.3 2006/02/28 10:38:00 decaro
58 AliTOFGeometry::fAngles, AliTOFGeometry::fHeights,
59 AliTOFGeometry::fDistances arrays: dimension definition in the right
62 Revision 1.2 2006/02/27 18:12:14 decaro
63 Remove in StepManager the dependence of hit indexes from parametrized
66 Revision 1.1 2005/12/15 08:55:33 decaro
67 New TOF geometry description (V5) -G. Cara Romeo and A. De Caro
70 Revision 0.1 2004 November G. Cara Romeo and A. De Caro
71 Implement new TOF geometry version
73 suppress few volume overlaps
74 (in the 4th TOF geometry version),
75 insert the realistic strip numbers and positions
79 ///////////////////////////////////////////////////////////////////////////////
81 // This class contains the functions for version 5 of the Time Of Flight //
84 // VERSION WITH 5 MODULES AND TILTED STRIPS //
86 // FULL COVERAGE VERSION + OPTION for PHOS holes //
91 <img src="picts/AliTOFv5T0Class.gif"> //
95 ///////////////////////////////////////////////////////////////////////////////
98 #include "TGeometry.h"
99 #include "TLorentzVector.h"
101 #include "TVirtualMC.h"
102 #include "TGeoManager.h"
104 #include "AliConst.h"
110 #include "AliTOFGeometry.h"
111 #include "AliTOFGeometryV5.h"
112 #include "AliTOFv5T0.h"
114 extern TDirectory *gDirectory;
115 extern TVirtualMC *gMC;
116 extern TGeoManager *gGeoManager;
118 extern AliRun *gAlice;
122 //_____________________________________________________________________________
123 AliTOFv5T0::AliTOFv5T0():
133 // Default constructor
137 //_____________________________________________________________________________
138 AliTOFv5T0::AliTOFv5T0(const char *name, const char *title):
139 AliTOF(name,title,"tzero"),
149 // Standard constructor
152 // Check that FRAME is there otherwise we have no place where to
156 AliModule* frame = (AliModule*)gAlice->GetModule("FRAME");
158 AliFatal("TOF needs FRAME to be present");
161 if (fTOFGeometry) delete fTOFGeometry;
162 fTOFGeometry = new AliTOFGeometryV5();
164 if(frame->IsVersion()==1) {
165 AliDebug(1,Form("Frame version %d", frame->IsVersion()));
166 AliDebug(1,"Full Coverage for TOF");
169 AliDebug(1,Form("Frame version %d", frame->IsVersion()));
170 AliDebug(1,"TOF with Holes for PHOS");
173 fTOFGeometry->SetHoles(fTOFHoles);
175 //AliTOF::fTOFGeometry = fTOFGeometry;
178 TDirectory* saveDir = gDirectory;
179 gAlice->GetRunLoader()->CdGAFile();
180 fTOFGeometry->Write("TOFgeometry");
185 //_____________________________________________________________________________
186 void AliTOFv5T0::AddAlignableVolumes() const
189 // Create entries for alignable volumes associating the symbolic volume
190 // name with the corresponding volume path. Needs to be syncronized with
191 // eventual changes in the geometry.
197 TString vpL0 = "ALIC_1/B077_1/BSEGMO";
198 TString vpL1 = "_1/BTOF";
200 TString vpL3 = "/FTOA_0";
201 TString vpL4 = "/FLTA_0/FSTR_";
203 TString snSM = "TOF/sm";
204 TString snSTRIP = "/strip";
206 Int_t nSectors=fTOFGeometry->NSectors();
207 Int_t nStrips =fTOFGeometry->NStripA()+
208 2*fTOFGeometry->NStripB()+
209 2*fTOFGeometry->NStripC();
212 // The TOF MRPC Strips
213 // The symbolic names are: TOF/sm00/strip01
219 for (Int_t isect = 0; isect < nSectors; isect++) {
220 for (Int_t istr = 1; istr <= nStrips; istr++) {
233 symName += Form("%02d",isect);
235 symName += Form("%02d",istr);
237 AliDebug(2,"--------------------------------------------");
238 AliDebug(2,Form("Alignable object %d", imod));
239 AliDebug(2,Form("volPath=%s\n",volPath.Data()));
240 AliDebug(2,Form("symName=%s\n",symName.Data()));
241 AliDebug(2,"--------------------------------------------");
243 gGeoManager->SetAlignableEntry(symName.Data(),volPath.Data());
250 // The TOF supermodules
251 // The symbolic names are: TOF/sm00
255 for (Int_t isect = 0; isect < nSectors; isect++) {
264 symName += Form("%02d",isect);
266 AliDebug(2,"--------------------------------------------");
267 AliDebug(2,Form("Alignable object %d", isect+imod));
268 AliDebug(2,Form("volPath=%s\n",volPath.Data()));
269 AliDebug(2,Form("symName=%s\n",symName.Data()));
270 AliDebug(2,"--------------------------------------------");
272 gGeoManager->SetAlignableEntry(symName.Data(),volPath.Data());
277 //____________________________________________________________________________
278 void AliTOFv5T0::BuildGeometry()
281 // Build TOF ROOT geometry for the ALICE event display
284 const int kColorTOF = 27;
286 TGeometry *globalGeometry = (TGeometry*)gAlice->GetGeometry();
289 top = globalGeometry->GetNode("alice");
291 // Position the different copies
292 const Float_t krTof =(fTOFGeometry->Rmax()+fTOFGeometry->Rmin())/2.;
293 const Float_t khTof = fTOFGeometry->Rmax()-fTOFGeometry->Rmin();
294 const Int_t kNTof = fTOFGeometry->NSectors();
295 const Float_t kangle = k2PI/kNTof;
297 const Float_t kInterCentrModBorder1 = 49.5;
298 const Float_t kInterCentrModBorder2 = 57.5;
302 // define offset for nodes
303 Float_t zOffsetB = (fTOFGeometry->ZlenA()*0.5 + (kInterCentrModBorder1+kInterCentrModBorder2)*0.5)*0.5;
304 Float_t zOffsetA = 0.;
305 // Define TOF basic volume
307 char nodeName0[16], nodeName1[16], nodeName2[16];
308 char nodeName3[16], nodeName4[16], rotMatNum[16];
311 new TBRIK("S_TOF_B","TOF box","void",
312 fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenB()*0.5);
313 new TBRIK("S_TOF_C","TOF box","void",
314 fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenB()*0.5);
316 new TBRIK("S_TOF_A","TOF box","void",
317 fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenA()*0.5);
319 for (Int_t nodeNum=1;nodeNum<19;nodeNum++){
322 sprintf(rotMatNum,"rot50%i",nodeNum);
323 sprintf(nodeName0,"FTO00%i",nodeNum);
324 sprintf(nodeName1,"FTO10%i",nodeNum);
325 sprintf(nodeName2,"FTO20%i",nodeNum);
326 sprintf(nodeName3,"FTO30%i",nodeNum);
327 sprintf(nodeName4,"FTO40%i",nodeNum);
330 sprintf(rotMatNum,"rot5%i",nodeNum);
331 sprintf(nodeName0,"FTO0%i",nodeNum);
332 sprintf(nodeName1,"FTO1%i",nodeNum);
333 sprintf(nodeName2,"FTO2%i",nodeNum);
334 sprintf(nodeName3,"FTO3%i",nodeNum);
335 sprintf(nodeName4,"FTO4%i",nodeNum);
338 new TRotMatrix(rotMatNum,rotMatNum,90,-20*nodeNum,90,90-20*nodeNum,0,0);
339 ang = (4.5-nodeNum) * kangle;
343 node = new TNode(nodeName2,nodeName2,"S_TOF_B", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang), zOffsetB,rotMatNum);
344 node->SetLineColor(kColorTOF);
348 node = new TNode(nodeName3,nodeName3,"S_TOF_C", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang),-zOffsetB,rotMatNum);
349 node->SetLineColor(kColorTOF);
354 node = new TNode(nodeName4,nodeName4,"S_TOF_A", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang), zOffsetA,rotMatNum);
355 node->SetLineColor(kColorTOF);
357 } // end loop on nodeNum
361 //_____________________________________________________________________________
362 void AliTOFv5T0::CreateGeometry()
365 // Create geometry for Time Of Flight version 0
369 <img src="picts/AliTOFv5T0.gif">
373 // Creates common geometry
375 AliTOF::CreateGeometry();
379 //_____________________________________________________________________________
380 void AliTOFv5T0::TOFpc(Float_t xtof, Float_t ytof, Float_t zlenA,
384 // Definition of the Time Of Fligh Resistive Plate Chambers
387 const Float_t kPi = TMath::Pi();
389 const Float_t kInterCentrModBorder1 = 49.5;
390 const Float_t kInterCentrModBorder2 = 57.5;
391 const Float_t kExterInterModBorder1 = 196.0;
392 const Float_t kExterInterModBorder2 = 203.5;
394 const Float_t kLengthExInModBorder = 4.7;
395 const Float_t kLengthInCeModBorder = 7.0;
397 // Al layers over all internal module walls (cm)
398 const Float_t khAlWall = 0.03;
400 // module wall thickness (cm)
401 const Float_t kModuleWallThickness = 0.3;
403 // Al honeycomb layer between strips and cards (cm)
404 const Float_t kHoneycombLayerThickness = 1.5;
406 AliDebug(2,Form("zlenA*0.5 = %d", zlenA*0.5));
407 AliDebug(1, "************************* TOF geometry **************************");
409 // Definition of the Time Of Fligh Resistive Plate Chambers
410 // xFLT, yFLT, zFLT - sizes of TOF modules (large)
412 Float_t xcoor, ycoor, zcoor;
414 Int_t *idtmed = fIdtmed->GetArray()-499;
419 par[2] = zlenA * 0.5;
420 gMC->Gsvolu("FTOA", "BOX ", idtmed[503], par, 3); // fibre glass
425 par[2] = (zlenA*0.5 - kInterCentrModBorder1)*0.5;
426 gMC->Gsvolu("FTOB", "BOX ", idtmed[503], par, 3); // fibre glass
427 gMC->Gsvolu("FTOC", "BOX ", idtmed[503], par, 3); // fibre glass
430 // Positioning of fibre glass modules (FTOA, FTOB and FTOC)
432 //AliMatrix(idrotm[0], 90., 0., 0., 0., 90.,-90.);
433 AliMatrix(idrotm[0], 90., 0., 0., 0., 90.,270.);
438 for(Int_t isec=0;isec<18;isec++){
439 if(fTOFSectors[isec]==-1)continue;
441 sprintf(name, "BTOF%d",isec);
442 if (fTOFHoles && (isec==11||isec==12)) {
443 // if (fTOFHoles && (isec==16||isec==17)) { \\Old 6h convention
445 ycoor = (zlenA*0.5 + kInterCentrModBorder1)*0.5;
447 gMC->Gspos("FTOB", 0, name, xcoor, ycoor, zcoor, idrotm[0], "ONLY");
448 gMC->Gspos("FTOC", 0, name, xcoor,-ycoor, zcoor, idrotm[0], "ONLY");
454 gMC->Gspos("FTOA", 0,name, xcoor, ycoor, zcoor, idrotm[0], "ONLY");
458 // Large not sensitive volumes with Insensitive Freon (FLTA, FLTB and FLTC)
460 Float_t xFLT, yFLT, zFLTA;
462 xFLT = xtof - kModuleWallThickness*2.;
463 yFLT = ytof - kModuleWallThickness*2.;
464 zFLTA = zlenA - kModuleWallThickness*2.;
469 gMC->Gsvolu("FLTA", "BOX ", idtmed[507], par, 3); // Freon mix
474 gMC->Gspos ("FLTA", 0, "FTOA", xcoor, ycoor, zcoor, 0, "ONLY");
479 par[2] = (zlenA*0.5 - kInterCentrModBorder1-kModuleWallThickness)*0.5;
480 gMC->Gsvolu("FLTB", "BOX ", idtmed[507], par, 3); // Freon mix
481 gMC->Gsvolu("FLTC", "BOX ", idtmed[507], par, 3); // Freon mix
485 zcoor = kModuleWallThickness*0.5;
486 gMC->Gspos ("FLTB", 0, "FTOB", xcoor, ycoor, zcoor, 0, "ONLY");
487 gMC->Gspos ("FLTC", 0, "FTOC", xcoor, ycoor,-zcoor, 0, "ONLY");
490 // Layer of Aluminum before detector (FALA, FALB and FALC)
493 par[1] = khAlWall*0.5;
494 par[2] = kInterCentrModBorder1 - (kModuleWallThickness + khAlWall);
495 gMC->Gsvolu("FALA", "BOX ", idtmed[505], par, 3); // Alluminium
498 ycoor = (-yFLT + khAlWall)*0.5;
500 gMC->Gspos ("FALA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
503 par[1] = khAlWall*0.5;
504 par[2] = (kExterInterModBorder2 - kInterCentrModBorder1 - 2.*(kModuleWallThickness + khAlWall))*0.5;
505 gMC->Gsvolu("FALB", "BOX ", idtmed[505], par, 3); // Alluminium
508 ycoor = (-yFLT + khAlWall)*0.5;
509 zcoor = (kExterInterModBorder2 + kInterCentrModBorder1)*0.5;
510 gMC->Gspos ("FALB", 1, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
511 gMC->Gspos ("FALB", 2, "FLTA", xcoor, ycoor,-zcoor, 0, "ONLY");
514 par[1] = khAlWall*0.5;
515 par[2] = (zlenA*0.5 - kExterInterModBorder2 - 2.*(kModuleWallThickness + khAlWall))*0.5;
516 gMC->Gsvolu("FALC", "BOX ", idtmed[505], par, 3); // Alluminium
519 ycoor = (-yFLT + khAlWall)*0.5;
520 zcoor = (kExterInterModBorder2+zlenA*0.5)*0.5;
521 gMC->Gspos ("FALC", 1, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
522 gMC->Gspos ("FALC", 2, "FLTA", xcoor, ycoor,-zcoor, 0, "ONLY");
526 ycoor = (-yFLT + khAlWall)*0.5;
527 zcoor = (zlenA*0.5 - kExterInterModBorder2)*0.5 - kModuleWallThickness*0.5;
528 gMC->Gspos ("FALB", 1, "FLTB", xcoor, ycoor, zcoor, 0, "ONLY");
529 gMC->Gspos ("FALB", 2, "FLTC", xcoor, ycoor,-zcoor, 0, "ONLY");
532 ycoor = (-yFLT + khAlWall)*0.5;
533 zcoor = (kExterInterModBorder2 - kInterCentrModBorder1)*0.5 + kModuleWallThickness*0.5;
534 gMC->Gspos ("FALC", 1, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
535 gMC->Gspos ("FALC", 2, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
538 Float_t y0, alpha, tgal, beta, tgbe, trpa[11];
540 // Fibre glass walls between central and intermediate modules (FWZ1 and FWZ2; holes -> FZ1B, FZ1C, FZ2B)
542 tgal = (yFLT*0.5 - 2.*kLengthInCeModBorder)/(kInterCentrModBorder2 - kInterCentrModBorder1);
543 alpha = TMath::ATan(tgal);
544 beta = (kPi*0.5 - alpha)*0.5;
545 tgbe = TMath::Tan(beta);
549 trpa[3] = kModuleWallThickness;
550 trpa[4] = (kLengthInCeModBorder - kModuleWallThickness*tgbe)*0.5;
551 trpa[5] = (kLengthInCeModBorder + kModuleWallThickness*tgbe)*0.5;
552 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
553 trpa[7] = kModuleWallThickness;
554 trpa[8] = (kLengthInCeModBorder - kModuleWallThickness*tgbe)*0.5;
555 trpa[9] = (kLengthInCeModBorder + kModuleWallThickness*tgbe)*0.5;
556 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
557 gMC->Gsvolu("FWZ1","TRAP", idtmed[503], trpa, 11); // fibre glass
559 AliMatrix (idrotm[1],90., 90.,180.,0.,90.,180.);
560 AliMatrix (idrotm[4],90., 90., 0.,0.,90., 0.);
563 ycoor = -yFLT*0.5 + kLengthInCeModBorder*0.5;
564 zcoor = kInterCentrModBorder1;
565 gMC->Gspos("FWZ1", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[1],"ONLY");
566 gMC->Gspos("FWZ1", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[4],"ONLY");
569 y0 = kLengthInCeModBorder - kModuleWallThickness*0.5*tgbe;
573 trpa[3] = kModuleWallThickness*0.5;
574 trpa[4] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
575 trpa[5] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
576 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
577 trpa[7] = kModuleWallThickness*0.5;
578 trpa[8] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
579 trpa[9] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
580 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
581 gMC->Gsvolu("FZ1B","TRAP", idtmed[503], trpa, 11); // fibre glass
584 ycoor = -yFLT*0.5 + kLengthInCeModBorder*0.5 - kModuleWallThickness*0.25*tgbe;
585 zcoor = -kInterCentrModBorder1 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
586 gMC->Gspos("FZ1B", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[4],"ONLY");
587 gMC->Gspos("FZ1B", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[1],"ONLY");
590 AliMatrix (idrotm[2],90.,270., 0.,0.,90.,180.);
591 AliMatrix (idrotm[5],90.,270.,180.,0.,90., 0.);
594 ycoor = -kLengthInCeModBorder*0.5;
595 zcoor = kInterCentrModBorder2;
596 gMC->Gspos("FWZ1", 3,"FLTA", xcoor, ycoor, zcoor,idrotm[2],"ONLY");
597 gMC->Gspos("FWZ1", 4,"FLTA", xcoor, ycoor,-zcoor,idrotm[5],"ONLY");
600 y0 = kLengthInCeModBorder + kModuleWallThickness*0.5*tgbe;
604 trpa[3] = kModuleWallThickness*0.5;
605 trpa[4] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
606 trpa[5] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
607 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
608 trpa[7] = kModuleWallThickness*0.5;
609 trpa[8] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
610 trpa[9] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
611 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
612 gMC->Gsvolu("FZ1C","TRAP", idtmed[503], trpa, 11); // fibre glass
615 ycoor = -kLengthInCeModBorder*0.5 - kModuleWallThickness*0.25*tgbe;
616 zcoor = -kInterCentrModBorder2 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
617 gMC->Gspos("FZ1C", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[5],"ONLY");
618 gMC->Gspos("FZ1C", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[2],"ONLY");
621 trpa[0] = 0.5*(kInterCentrModBorder2 - kInterCentrModBorder1)/TMath::Cos(alpha);
622 trpa[1] = kModuleWallThickness;
624 trpa[3] = -beta*kRaddeg;
627 gMC->Gsvolu("FWZ2","PARA", idtmed[503], trpa, 6); // fibre glass
629 AliMatrix (idrotm[3], alpha*kRaddeg,90.,90.+alpha*kRaddeg,90.,90.,180.);
630 AliMatrix (idrotm[6],180.-alpha*kRaddeg,90.,90.-alpha*kRaddeg,90.,90., 0.);
634 zcoor = (kInterCentrModBorder2 + kInterCentrModBorder1)*0.5;
635 gMC->Gspos("FWZ2", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[3],"ONLY");
636 gMC->Gspos("FWZ2", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[6],"ONLY");
639 trpa[0] = 0.5*(kInterCentrModBorder2 - kInterCentrModBorder1)/TMath::Cos(alpha);
640 trpa[1] = kModuleWallThickness*0.5;
642 trpa[3] = -beta*kRaddeg;
645 gMC->Gsvolu("FZ2B","PARA", idtmed[503], trpa, 6); // fibre glass
648 ycoor = -yFLT*0.25 - kModuleWallThickness*0.5*tgbe;
649 zcoor = -(kInterCentrModBorder2 + kInterCentrModBorder1)*0.5 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
650 gMC->Gspos("FZ2B", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[6],"ONLY");
651 gMC->Gspos("FZ2B", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[3],"ONLY");
654 // Fibre glass walls between intermediate and lateral modules (FWZ3 and FWZ4)
656 tgal = (yFLT*0.5 - 2.*kLengthExInModBorder)/(kExterInterModBorder2 - kExterInterModBorder1);
657 alpha = TMath::ATan(tgal);
658 beta = (kPi*0.5 - alpha)*0.5;
659 tgbe = TMath::Tan(beta);
663 trpa[3] = kModuleWallThickness;
664 trpa[4] = (kLengthExInModBorder - kModuleWallThickness*tgbe)*0.5;
665 trpa[5] = (kLengthExInModBorder + kModuleWallThickness*tgbe)*0.5;
666 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
667 trpa[7] = kModuleWallThickness;
668 trpa[8] = (kLengthExInModBorder - kModuleWallThickness*tgbe)*0.5;
669 trpa[9] = (kLengthExInModBorder + kModuleWallThickness*tgbe)*0.5;
670 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
671 gMC->Gsvolu("FWZ3","TRAP", idtmed[503], trpa, 11); // fibre glass
674 ycoor = -kLengthExInModBorder*0.5;
675 zcoor = kExterInterModBorder1;
676 gMC->Gspos("FWZ3", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[5],"ONLY");
677 gMC->Gspos("FWZ3", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[2],"ONLY");
681 ycoor = -kLengthExInModBorder*0.5;
682 zcoor = -kExterInterModBorder1 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
683 gMC->Gspos("FWZ3", 5,"FLTB", xcoor, ycoor, zcoor,idrotm[2],"ONLY");
684 gMC->Gspos("FWZ3", 6,"FLTC", xcoor, ycoor,-zcoor,idrotm[5],"ONLY");
688 ycoor = -yFLT*0.5 + kLengthExInModBorder*0.5;
689 zcoor = kExterInterModBorder2;
690 gMC->Gspos("FWZ3", 3,"FLTA", xcoor, ycoor, zcoor,idrotm[4],"ONLY");
691 gMC->Gspos("FWZ3", 4,"FLTA", xcoor, ycoor,-zcoor,idrotm[1],"ONLY");
695 ycoor = -yFLT*0.5 + kLengthExInModBorder*0.5;
696 zcoor = -kExterInterModBorder2 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
697 gMC->Gspos("FWZ3", 7,"FLTB", xcoor, ycoor, zcoor,idrotm[1],"ONLY");
698 gMC->Gspos("FWZ3", 8,"FLTC", xcoor, ycoor,-zcoor,idrotm[4],"ONLY");
701 trpa[0] = 0.5*(kExterInterModBorder2 - kExterInterModBorder1)/TMath::Cos(alpha);
702 trpa[1] = kModuleWallThickness;
704 trpa[3] = -beta*kRaddeg;
707 gMC->Gsvolu("FWZ4","PARA", idtmed[503], trpa, 6); // fibre glass
709 AliMatrix (idrotm[13],alpha*kRaddeg,90.,90.+alpha*kRaddeg,90.,90.,180.);
710 AliMatrix (idrotm[16],180.-alpha*kRaddeg,90.,90.-alpha*kRaddeg,90.,90.,0.);
714 zcoor = (kExterInterModBorder2 + kExterInterModBorder1)*0.5;
715 gMC->Gspos("FWZ4", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[16],"ONLY");
716 gMC->Gspos("FWZ4", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[13],"ONLY");
721 zcoor = -(kExterInterModBorder2 + kExterInterModBorder1)*0.5 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
722 gMC->Gspos("FWZ4", 3,"FLTB", xcoor, ycoor, zcoor,idrotm[13],"ONLY");
723 gMC->Gspos("FWZ4", 4,"FLTC", xcoor, ycoor,-zcoor,idrotm[16],"ONLY");
727 ///////////////// Detector itself //////////////////////
729 const Int_t knx = fTOFGeometry->NpadX(); // number of pads along x
730 const Int_t knz = fTOFGeometry->NpadZ(); // number of pads along z
731 const Float_t kPadX = fTOFGeometry->XPad(); // pad length along x
732 const Float_t kPadZ = fTOFGeometry->ZPad(); // pad length along z
734 // new description for strip volume -double stack strip-
735 // -- all constants are expressed in cm
736 // heigth of different layers
737 const Float_t khhony = 1.0 ; // heigth of HONY Layer
738 const Float_t khpcby = 0.08 ; // heigth of PCB Layer
739 const Float_t khrgly = 0.055 ; // heigth of RED GLASS Layer
741 const Float_t khfiliy = 0.125 ; // heigth of FISHLINE Layer
742 const Float_t khglassy = 0.160*0.5; // heigth of GLASS Layer
743 const Float_t khglfy = khfiliy+2.*khglassy;// heigth of GLASS+FISHLINE Layer
745 const Float_t khcpcby = 0.16 ; // heigth of PCB Central Layer
746 const Float_t kwhonz = 8.1 ; // z dimension of HONEY Layer
747 const Float_t kwpcbz1 = 10.6 ; // z dimension of PCB Lower Layer
748 const Float_t kwpcbz2 = 11.6 ; // z dimension of PCB Upper Layer
749 const Float_t kwcpcbz = 12.4 ; // z dimension of PCB Central Layer
750 const Float_t kwrglz = 8. ; // z dimension of RED GLASS Layer
751 const Float_t kwglfz = 7. ; // z dimension of GLASS+FISHLN Layer
752 const Float_t klsensmx = knx*kPadX; // length of Sensitive Layer
753 const Float_t khsensmy = 0.05;//0.11;//0.16;// heigth of Sensitive Layer
754 const Float_t kwsensmz = knz*kPadZ; // width of Sensitive Layer
756 // heigth of the FSTR Volume (the strip volume)
757 const Float_t khstripy = 2.*khhony+2.*khpcby+4.*khrgly+2.*khglfy+khcpcby;
759 // width of the FSTR Volume (the strip volume)
760 const Float_t kwstripz = kwcpcbz;
761 // length of the FSTR Volume (the strip volume)
762 const Float_t klstripx = fTOFGeometry->StripLength();
764 Float_t parfp[3]={klstripx*0.5,khstripy*0.5,kwstripz*0.5};
765 // Coordinates of the strip center in the strip reference frame;
766 // used for positioning internal strip volumes
767 Float_t posfp[3]={0.,0.,0.};
769 // FSTR volume definition-filling this volume with non sensitive Gas Mixture
770 gMC->Gsvolu("FSTR","BOX",idtmed[507],parfp,3); // Freon mix
772 //-- HONY Layer definition
773 parfp[1] = khhony*0.5;
774 parfp[2] = kwhonz*0.5;
775 gMC->Gsvolu("FHON","BOX",idtmed[501],parfp,3); // honeycomb (Nomex)
776 // positioning 2 HONY Layers on FSTR volume
777 posfp[1] =-khstripy*0.5+parfp[1];
778 gMC->Gspos("FHON",1,"FSTR",0., posfp[1],0.,0,"ONLY");
779 gMC->Gspos("FHON",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
781 //-- PCB Layer definition
782 parfp[1] = khpcby*0.5;
783 parfp[2] = kwpcbz1*0.5;
784 gMC->Gsvolu("FPC1","BOX",idtmed[502],parfp,3); // G10
785 parfp[2] = kwpcbz2*0.5;
786 gMC->Gsvolu("FPC2","BOX",idtmed[502],parfp,3); // G10
787 // positioning 2 PCB Layers on FSTR volume
788 posfp[1] =-khstripy*0.5+khhony+parfp[1];
789 gMC->Gspos("FPC1",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
790 gMC->Gspos("FPC2",1,"FSTR",0., posfp[1],0.,0,"ONLY");
792 //-- central PCB layer definition
793 parfp[1] = khcpcby*0.5;
794 parfp[2] = kwcpcbz*0.5;
795 gMC->Gsvolu("FPCB","BOX",idtmed[502],parfp,3); // G10
796 // positioning the central PCB layer
797 gMC->Gspos("FPCB",1,"FSTR",0.,0.,0.,0,"ONLY");
800 Float_t parfs[3] = {klsensmx*0.5, khsensmy*0.5, kwsensmz*0.5};
801 gMC->Gsvolu("FSEN","BOX",idtmed[508],parfs,3); // sensitive ...
802 // dividing FSEN along z in knz=2 and along x in knx=48
803 gMC->Gsdvn("FSEZ","FSEN",knz,3);
804 gMC->Gsdvn("FPAD","FSEZ",knx,1);
805 // positioning a Sensitive layer inside FPCB
806 gMC->Gspos("FSEN",1,"FPCB",0.,0.,0.,0,"ONLY");
808 //-- RED GLASS Layer definition
809 parfp[1] = khrgly*0.5;
810 parfp[2] = kwrglz*0.5;
811 gMC->Gsvolu("FRGL","BOX",idtmed[509],parfp,3); // glass
812 // positioning 4 RED GLASS Layers on FSTR volume
813 posfp[1] = -khstripy*0.5+khhony+khpcby+parfp[1];
814 gMC->Gspos("FRGL",1,"FSTR",0., posfp[1],0.,0,"ONLY");
815 gMC->Gspos("FRGL",4,"FSTR",0.,-posfp[1],0.,0,"ONLY");
816 posfp[1] = (khcpcby+khrgly)*0.5;
817 gMC->Gspos("FRGL",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
818 gMC->Gspos("FRGL",3,"FSTR",0., posfp[1],0.,0,"ONLY");
820 //-- GLASS Layer definition
821 parfp[1] = khglassy*0.5;
822 parfp[2] = kwglfz*0.5;
823 gMC->Gsvolu("FGLA","BOX",idtmed[509],parfp,3); // glass
825 // positioning 4 GLASS Layers on FSTR volume
826 posfp[1] = -khstripy*0.5+khhony+khpcby+khrgly+parfp[1];
827 gMC->Gspos("FGLA",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
828 gMC->Gspos("FGLA",4,"FSTR",0., posfp[1],0.,0,"ONLY");
829 posfp[1] = khcpcby*0.5+khrgly+khglassy*0.5;
830 gMC->Gspos("FGLA",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
831 gMC->Gspos("FGLA",3,"FSTR",0., posfp[1],0.,0,"ONLY");
833 //-- FREON Layer definition
834 parfp[1] = khfiliy*0.5;
835 gMC->Gsvolu("FFIS","BOX",idtmed[507],parfp,3); // freon
837 // positioning 2 FREON Layers on FSTR volume
838 posfp[1] = -khstripy*0.5+khhony+khpcby+khrgly+khglassy+parfp[1];
839 gMC->Gspos("FFIS",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
840 gMC->Gspos("FFIS",2,"FSTR",0., posfp[1],0.,0,"ONLY");
843 //-- GLASS+FISHLINE Layer definition
844 parfp[1] = khglfy*0.5;
845 parfp[2] = kwglfz*0.5;
846 gMC->Gsvolu("FGLF","BOX",idtmed[504],parfp,3);
848 // positioning 2 GLASS+FISHLINE Layers on FSTR volume
849 posfp[1] = (khcpcby+khglfy)*0.5+khrgly;
850 gMC->Gspos("FGLF",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
851 gMC->Gspos("FGLF",2,"FSTR",0., posfp[1],0.,0,"ONLY");
854 // Positioning the Strips (FSTR) in the FLT volumes
855 Int_t maxStripNumbers [5] ={fTOFGeometry->NStripC(),
856 fTOFGeometry->NStripB(),
857 fTOFGeometry->NStripA(),
858 fTOFGeometry->NStripB(),
859 fTOFGeometry->NStripC()};
861 Int_t totalStrip = 0;
862 Float_t xpos, zpos, ypos, ang;
863 for(Int_t iplate =0; iplate < fTOFGeometry->NPlates(); iplate++){
864 if (iplate>0) totalStrip += maxStripNumbers[iplate-1];
865 for(Int_t istrip =0; istrip < maxStripNumbers[iplate]; istrip++){
867 ang = fTOFGeometry->GetAngles(iplate,istrip);
868 AliDebug(1, Form(" iplate = %1i, istrip = %2i ---> ang = %f", iplate, istrip, ang));
870 if (ang>0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.+ang,90., ang, 90.);
871 else if (ang==0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.,90., 0., 0.);
872 else if (ang<0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.+ang,90.,-ang,270.);
875 zpos = fTOFGeometry->GetDistances(iplate,istrip);
876 ypos = fTOFGeometry->GetHeights(iplate,istrip);
878 gMC->Gspos("FSTR",istrip+totalStrip+1,"FLTA", xpos, ypos,-zpos,idrotm[istrip+totalStrip+1], "ONLY");
881 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");
882 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");
887 // 1.5 cm Al honeycomb layer between strips and cards
889 par[1] = kHoneycombLayerThickness*0.5;
891 gMC->Gsvolu("FPEA", "BOX ", idtmed[506], par, 3); // Al honeycomb
894 ycoor = kHoneycombLayerThickness*0.5;
896 gMC->Gspos ("FPEA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
900 par[1] = kHoneycombLayerThickness*0.5;
901 par[2] = (zlenA*0.5 - kInterCentrModBorder2-kModuleWallThickness)*0.5;
902 gMC->Gsvolu("FPEB", "BOX ", idtmed[506], par, 3); // Al honeycomb
905 ycoor = kHoneycombLayerThickness*0.5;
906 zcoor = (kInterCentrModBorder2-kInterCentrModBorder1)*0.5;
907 gMC->Gspos ("FPEB", 1, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
908 gMC->Gspos ("FPEB", 2, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
913 par[1] = (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
915 gMC->Gsvolu("FAIA", "BOX ", idtmed[500], par, 3); // Air
918 ycoor = kHoneycombLayerThickness + (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
920 gMC->Gspos ("FAIA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
924 par[1] = (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
925 par[2] = (zlenA*0.5 - kInterCentrModBorder2 - kModuleWallThickness)*0.5;
926 gMC->Gsvolu("FAIB", "BOX ", idtmed[500], par, 3); // Air
927 gMC->Gsvolu("FAIC", "BOX ", idtmed[500], par, 3); // Air
930 ycoor = kHoneycombLayerThickness + (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
931 zcoor = (kInterCentrModBorder2-kInterCentrModBorder1)*0.5;
932 gMC->Gspos ("FAIB", 0, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
933 gMC->Gspos ("FAIC", 0, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
936 // start with cards and cooling tubes
937 // finally, cards, cooling tubes and layer for thermal dispersion
940 // see GEOM200 in GEANT manual
944 // card volume definition
945 cardpar[0]= xFLT*0.5;
948 gMC->Gsvolu("FCAR", "BOX ", idtmed[502], cardpar, 3); // PCB Card
950 //alu plate volume definition
953 gMC->Gsvolu("FALP", "BOX ", idtmed[505], cardpar, 3); // Alu Plate
955 // tube volume definition
960 gMC->Gsvolu("FTUB", "TUBE", idtmed[511], tubepar, 3); // cooling tubes (steel)
965 gMC->Gsvolu("FITU", "TUBE", idtmed[510], tubepar, 3); // cooling water
966 // positioning water tube into the steel one
967 gMC->Gspos("FITU",1,"FTUB",0.,0.,0.,0,"ONLY");
970 AliMatrix(idrotm[99], 180., 90., 90., 90., 90., 0.);
972 // central module positioning
973 Float_t cardpos[3], aplpos2;
974 Float_t stepforcardA = 6.625;
976 Float_t aplpos1 = -2.;
981 // tubepos= -53.+tdis;
983 for (icard=39; icard<54; ++icard) {
984 cardpos[2]= cardpos[2]+stepforcardA;
985 aplpos2 = cardpos[2]+0.15;
986 gMC->Gspos("FCAR",icard,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
987 gMC->Gspos("FALP",icard,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
988 gMC->Gspos("FTUB",icard,"FAIA", 0.,cardpos[1],cardpos[2]+tdis,idrotm[99],"ONLY");
991 // intermediate module positioning
992 Float_t stepforcardB= 7.05;
996 for (icard=20; icard<39; ++icard) {
997 cardpos[2]= cardpos[2]+stepforcardB;
998 aplpos2 = cardpos[2]+0.15;
1000 gMC->Gspos("FCAR",icard+34,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
1001 gMC->Gspos("FALP",icard+34,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
1002 gMC->Gspos("FTUB",icard+34,"FAIA", 0.,cardpos[1], cardpos[2]+tdis,idrotm[99],"ONLY");
1003 gMC->Gspos("FCAR",58-icard,"FAIA",cardpos[0],cardpos[1], -cardpos[2], 0,"ONLY");
1004 gMC->Gspos("FALP",58-icard,"FAIA",cardpos[0], aplpos1, -aplpos2, 0,"ONLY");
1005 gMC->Gspos("FTUB",58-icard,"FAIA", 0.,cardpos[1],-cardpos[2]-tdis,idrotm[99],"ONLY");
1008 gMC->Gspos("FCAR",icard+34+182,"FAIC",cardpos[0],cardpos[1], cardpos[2]-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1009 gMC->Gspos("FALP",icard+34+182,"FAIC",cardpos[0], aplpos1, aplpos2-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1010 gMC->Gspos("FTUB",icard+34+182,"FAIC", 0.,cardpos[1], cardpos[2]+tdis-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
1011 gMC->Gspos("FCAR",58-icard+ 91,"FAIB",cardpos[0],cardpos[1], -cardpos[2]+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1012 gMC->Gspos("FALP",58-icard+ 91,"FAIB",cardpos[0], aplpos1, -aplpos2+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1013 gMC->Gspos("FTUB",58-icard+ 91,"FAIB", 0.,cardpos[1],-cardpos[2]-tdis+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
1018 // outer module positioning
1019 Float_t stepforcardC= 8.45238;
1022 for (icard=1; icard<20; ++icard) {
1023 cardpos[2]= cardpos[2]+stepforcardC;
1024 aplpos2 = cardpos[2]+0.15;
1026 gMC->Gspos("FCAR",icard+72,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
1027 gMC->Gspos("FALP",icard+72,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
1028 gMC->Gspos("FTUB",icard+72,"FAIA", 0.,cardpos[1], cardpos[2]+tdis,idrotm[99],"ONLY");
1029 gMC->Gspos("FCAR",20-icard,"FAIA",cardpos[0],cardpos[1], -cardpos[2], 0,"ONLY");
1030 gMC->Gspos("FALP",20-icard,"FAIA",cardpos[0], aplpos1, -aplpos2, 0,"ONLY");
1031 gMC->Gspos("FTUB",20-icard,"FAIA", 0.,cardpos[1],-cardpos[2]-tdis,idrotm[99],"ONLY");
1034 gMC->Gspos("FCAR",icard+72+182,"FAIC",cardpos[0],cardpos[1], cardpos[2]-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1035 gMC->Gspos("FALP",icard+72+182,"FAIC",cardpos[0], aplpos1, aplpos2-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1036 gMC->Gspos("FTUB",icard+72+182,"FAIC", 0.,cardpos[1], cardpos[2]+tdis-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
1037 gMC->Gspos("FCAR",20-icard+ 91,"FAIB",cardpos[0],cardpos[1], -cardpos[2]+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1038 gMC->Gspos("FALP",20-icard+ 91,"FAIB",cardpos[0], aplpos1, -aplpos2+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1039 gMC->Gspos("FTUB",20-icard+ 91,"FAIB", 0.,cardpos[1],-cardpos[2]-tdis+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
1044 //_____________________________________________________________________________
1045 void AliTOFv5T0::DrawModule() const
1048 // Draw a shaded view of the Time Of Flight version 4
1051 // Set everything unseen
1052 gMC->Gsatt("*", "seen", -1);
1055 //Set volumes visible
1058 //Set ALIC mother transparent
1059 gMC->Gsatt("ALIC","SEEN", 0);
1062 // Level 1 for TOF volumes
1063 gMC->Gsatt("B077","seen", 0);
1066 // Level 2 for TOF volumes
1067 gMC->Gsatt("B071","seen", 0);
1068 gMC->Gsatt("B074","seen", 0);
1069 gMC->Gsatt("B075","seen", 0);
1070 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
1071 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
1074 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
1075 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
1076 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
1077 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
1078 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
1080 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
1081 gMC->Gsatt("BTO1","seen", 0);
1084 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
1085 gMC->Gsatt("BTO2","seen", 0);
1088 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
1089 gMC->Gsatt("BTO3","seen", 0);
1091 // Level 3 of B071, B074 and B075
1092 gMC->Gsatt("FTOA","SEEN", 0);
1093 if (fTOFHoles) gMC->Gsatt("FTOB","SEEN", 0);
1095 // Level 4 of B071, B074 and B075
1096 gMC->Gsatt("FLTA","SEEN", 0);
1097 if (fTOFHoles) gMC->Gsatt("FLTB","SEEN",0);
1098 if (fTOFHoles) gMC->Gsatt("FLTC","SEEN",0);
1100 // Level 5 of B071, B074 and B075
1101 gMC->Gsatt("FAIA","SEEN",-1); // all FAIA sub-levels skipped -
1102 if (fTOFHoles) gMC->Gsatt("FAIB","SEEN",-1); // all FAIB sub-levels skipped -
1103 if (fTOFHoles) gMC->Gsatt("FAIC","SEEN",-1); // all FAIC sub-levels skipped -
1105 gMC->Gsatt("FALA","SEEN", 0);
1106 if (fTOFHoles) gMC->Gsatt("FALB","SEEN", 0);
1108 gMC->Gsatt("FPEA","SEEN", 1);
1109 if (fTOFHoles) gMC->Gsatt("FPEB","SEEN", 1);
1111 gMC->Gsatt("FSTR","SEEN",-1); // all FSTR sub-levels skipped -
1113 gMC->Gsatt("FWZ1","SEEN", 0);
1114 gMC->Gsatt("FWZ2","SEEN", 0);
1115 gMC->Gsatt("FWZ3","SEEN", 0);
1116 gMC->Gsatt("FWZ4","SEEN", 0);
1118 gMC->Gsatt("FZ1B","SEEN", 0);
1119 gMC->Gsatt("FZ1C","SEEN", 0);
1120 gMC->Gsatt("FZ2B","SEEN", 0);
1123 gMC->Gdopt("hide", "on");
1124 gMC->Gdopt("shad", "on");
1125 gMC->Gsatt("*", "fill", 7);
1126 gMC->SetClipBox(".");
1127 gMC->SetClipBox("*", 100, 1000, 100, 1000, 100, 1000);
1128 gMC->DefaultRange();
1129 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
1130 gMC->Gdhead(1111, "Time Of Flight");
1131 gMC->Gdman(18, 3, "MAN");
1132 gMC->Gdopt("hide","off");
1134 //_____________________________________________________________________________
1135 void AliTOFv5T0::DrawDetectorModules() const
1138 // Draw a shaded view of the TOF detector version 4
1141 // Set everything unseen
1142 gMC->Gsatt("*", "seen", -1);
1145 //Set volumes visible
1148 //Set ALIC mother transparent
1149 gMC->Gsatt("ALIC","SEEN", 0);
1152 // Level 1 for TOF volumes
1153 gMC->Gsatt("B077","seen", 0);
1156 // Level 2 for TOF volumes
1157 gMC->Gsatt("B071","seen", 0);
1158 gMC->Gsatt("B074","seen", 0);
1159 gMC->Gsatt("B075","seen", 0);
1160 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
1161 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
1164 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
1165 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
1166 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
1167 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
1168 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
1170 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
1171 gMC->Gsatt("BTO1","seen", 0);
1174 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
1175 gMC->Gsatt("BTO2","seen", 0);
1178 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
1179 gMC->Gsatt("BTO3","seen", 0);
1181 // Level 3 of B071, B075 and B074
1182 gMC->Gsatt("FTOA","seen",-2); // all FTOA sub-levels skipped -
1184 gMC->Gsatt("FTOB","seen",-2); // all FTOB sub-levels skipped -
1185 gMC->Gsatt("FTOC","seen",-2); // all FTOC sub-levels skipped -
1188 gMC->Gdopt("hide","on");
1189 gMC->Gdopt("shad","on");
1190 gMC->Gsatt("*", "fill", 5);
1191 gMC->SetClipBox(".");
1192 gMC->SetClipBox("*", 100, 1000, 100, 1000, 0, 1000);
1193 gMC->DefaultRange();
1194 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
1195 gMC->Gdhead(1111,"TOF detector");
1196 gMC->Gdman(18, 3, "MAN");
1197 gMC->Gdopt("hide","off");
1200 //_____________________________________________________________________________
1201 void AliTOFv5T0::DrawDetectorStrips() const
1204 // Draw a shaded view of the TOF strips for version 4
1207 // Set everything unseen
1208 gMC->Gsatt("*", "seen", -1);
1211 //Set volumes visible
1214 //Set ALIC mother transparent
1215 gMC->Gsatt("ALIC","SEEN", 0);
1218 // Level 1 for TOF volumes
1219 gMC->Gsatt("B077","seen", 0);
1222 // Level 2 for TOF volumes
1223 gMC->Gsatt("B071","seen", 0);
1224 gMC->Gsatt("B074","seen", 0);
1225 gMC->Gsatt("B075","seen", 0);
1226 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
1227 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
1230 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
1231 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
1232 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
1233 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
1234 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
1236 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
1237 gMC->Gsatt("BTO1","seen", 0);
1240 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
1241 gMC->Gsatt("BTO2","seen", 0);
1244 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
1245 gMC->Gsatt("BTO3","seen", 0);
1247 // Level 3 of B071, B074 and B075
1248 gMC->Gsatt("FTOA","SEEN", 0);
1250 gMC->Gsatt("FTOB","SEEN", 0);
1251 gMC->Gsatt("FTOC","SEEN", 0);
1254 // Level 4 of B071, B074 and B075
1255 gMC->Gsatt("FLTA","SEEN", 0);
1257 gMC->Gsatt("FLTB","SEEN", 0);
1258 gMC->Gsatt("FLTC","SEEN", 0);
1261 // Level 5 of B071, B074 and B075
1262 gMC->Gsatt("FAIA","SEEN",-1); // all FAIA sub-levels skipped -
1264 gMC->Gsatt("FAIB","SEEN",-1); // all FAIB sub-levels skipped -
1265 gMC->Gsatt("FAIC","SEEN",-1); // all FAIC sub-levels skipped -
1268 gMC->Gsatt("FALA","SEEN", 0);
1269 if (fTOFHoles) gMC->Gsatt("FALB","SEEN", 0);
1271 gMC->Gsatt("FPEA","SEEN", 0);
1272 if (fTOFHoles) gMC->Gsatt("FPEB","SEEN", 0);
1274 gMC->Gsatt("FSTR","SEEN",-2); // all FSTR sub-levels skipped -
1276 gMC->Gsatt("FWZ1","SEEN", 0);
1277 gMC->Gsatt("FWZ2","SEEN", 0);
1278 gMC->Gsatt("FWZ3","SEEN", 0);
1279 gMC->Gsatt("FWZ4","SEEN", 0);
1281 gMC->Gsatt("FZ1B","SEEN", 0);
1282 gMC->Gsatt("FZ1C","SEEN", 0);
1283 gMC->Gsatt("FZ2B","SEEN", 0);
1290 gMC->Gsatt("FALP","SEEN",0);
1291 gMC->Gsatt("FCAR","SEEN",0);
1292 gMC->Gsatt("FTUB","SEEN",-1); // all FTUB sub-levels skipped -
1295 gMC->Gsatt("FITU","SEEN",0);
1300 gMC->Gsatt("FGLF","SEEN",0);
1301 gMC->Gsatt("FHON","SEEN",0);
1302 gMC->Gsatt("FPC1","SEEN",0);
1303 gMC->Gsatt("FPC2","SEEN",0);
1304 gMC->Gsatt("FPCB","SEEN",0);
1305 gMC->Gsatt("FRGL","SEEN",0);
1307 // Level 2 of FPCB => Level 3 of FSTR
1308 gMC->Gsatt("FSEN","SEEN",0);
1309 gMC->Gsatt("FSEZ","SEEN",0);
1310 gMC->Gsatt("FPAD","SEEN",1);
1313 gMC->Gdopt("hide","on");
1314 gMC->Gdopt("shad","on");
1315 gMC->Gsatt("*", "fill", 5);
1316 gMC->SetClipBox(".");
1317 gMC->SetClipBox("*", 0, 1000, 0, 1000, 0, 1000);
1318 gMC->DefaultRange();
1319 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
1320 gMC->Gdhead(1111,"TOF Strips");
1321 gMC->Gdman(18, 3, "MAN");
1322 gMC->Gdopt("hide","off");
1325 //_____________________________________________________________________________
1326 void AliTOFv5T0::CreateMaterials()
1329 // Define materials for the Time Of Flight
1332 //AliTOF::CreateMaterials();
1334 AliMagF *magneticField = (AliMagF*)gAlice->Field();
1336 Int_t isxfld = magneticField->Integ();
1337 Float_t sxmgmx = magneticField->Max();
1339 Float_t we[7], ae[7], na[7], fr[7], vl[7];
1342 //--- Quartz (SiO2) to simulate float glass
1343 // density tuned to have correct float glass
1345 Float_t aq[2] = { 28.0855,15.9994 };
1346 Float_t zq[2] = { 14.,8. };
1347 Float_t wq[2] = { 1.,2. };
1348 Float_t dq = 2.55; // std value: 2.2
1352 Float_t anox[4] = {12.01,1.01,16.00,14.01};
1353 Float_t znox[4] = { 6., 1., 8., 7.};
1354 Float_t wnox[4] = {14., 22., 2., 2.};
1355 Float_t dnox = 0.048;
1359 Float_t ag10[4] = {28.09,12.01,1.01,16.00};
1360 Float_t zg10[4] = {14., 6., 1., 8.};
1363 for (i = 0; i < nlmatg10; ++i) {
1379 MaterialMixer(we,ae,na,fr,vl,5);
1385 Float_t densg10 = 1.7;
1388 Float_t awa[2] = { 1., 16. };
1389 Float_t zwa[2] = { 1., 8. };
1390 Float_t wwa[2] = { 2., 1. };
1395 Float_t asteel[4] = { 55.847,51.9961,58.6934,28.0855 };
1396 Float_t zsteel[4] = { 26.,24.,28.,14. };
1397 Float_t wsteel[4] = { .715,.18,.1,.005 };
1400 Float_t aAir[4]={12.0107,14.0067,15.9994,39.948};
1401 Float_t zAir[4]={6.,7.,8.,18.};
1402 Float_t wAir[4]={0.000124,0.755267,0.231781,0.012827};
1403 Float_t dAir = 1.20479E-3;
1406 Float_t afg[4] = {28.09,16.00,12.01,1.01};
1407 Float_t zfg[4] = {14., 8., 6., 1.};
1408 Float_t wfg[4] = {0.12906,0.29405,0.51502,0.06187};
1409 Float_t dfg = 1.111;
1412 // --- Freon C2F4H2 + SF6
1413 Float_t afre[4]= {12.01,1.01,19.00,32.07};
1414 Float_t zfre[4]= { 6., 1., 9., 16.};
1415 Float_t wfre[4]= {0.21250,0.01787,0.74827,0.021355};
1416 Float_t densfre= 0.00375;
1419 //char namat[15] = " ";
1420 //Float_t ama[2], zma[2], dma, radl, absl, buf[1];
1423 AliMixture ( 0, "Air$", aAir, zAir, dAir, 4, wAir);
1424 AliMixture ( 1, "Nomex$", anox, znox, dnox, nnox, wnox);
1425 AliMixture ( 2, "G10$", ag10, zg10, densg10, nlmatg10, wmatg10);
1426 AliMixture ( 3, "fibre glass$", afg, zfg, dfg, nfg, wfg);
1427 AliMaterial( 4, "Al $", 26.98, 13., 2.7, 8.9, 37.2);
1428 AliMaterial( 5, "Al honeycomb$", 26.98, 13., 0.0496, 483., 2483.);
1429 AliMixture ( 6, "Freon$", afre, zfre, densfre, nfre, wfre);
1430 AliMixture ( 7, "Glass$", aq, zq, dq, nq, wq);
1432 // get freon and glass
1433 gMC->Gfmate((*fIdmate)[6],namat,ama[0],zma[0],dma,radl,absl,buf,nbuf);
1434 gMC->Gfmate((*fIdmate)[7],namat,ama[1],zma[1],dma,radl,absl,buf,nbuf);
1437 Float_t wgfr[2]= {0.0011,0.9989};
1438 Float_t dgfr = 1.434;
1440 AliMixture ( 8, "glass-freon$", ama, zma, dgfr, ngfr, wgfr);
1442 AliMixture ( 9, "Water$", awa, zwa, dwa, nwa, wwa);
1443 AliMixture (10, "STAINLESS STEEL$", asteel, zsteel, 7.88, 4, wsteel);
1445 Float_t epsil, stmin, deemax, stemax;
1448 // EPSIL = 0.1 ! Tracking precision,
1449 // STEMAX = 0.1 ! Maximum displacement for multiple scattering
1450 // DEEMAX = 0.1 ! Maximum fractional energy loss, DLS
1454 epsil = .001; // Tracking precision,
1455 stemax = -1.; // Maximum displacement for multiple scattering
1456 deemax = -.3; // Maximum fractional energy loss, DLS
1459 AliMedium( 1, "Air$", 0, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1460 AliMedium( 2,"Nomex$", 1, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1461 AliMedium( 3,"G10$", 2, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1462 AliMedium( 4,"fibre glass$", 3, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1463 //AliMedium( 5,"glass-freon$", 8, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1464 AliMedium( 6,"Al Frame$", 4, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1465 AliMedium( 7,"Al honeycomb$", 5, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1466 AliMedium( 8,"Fre$", 6, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1467 AliMedium( 9,"PCB-S$", 2, 1, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1468 AliMedium(10,"Glass$", 7, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1469 AliMedium(11,"Water$", 9, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1470 AliMedium(12,"STEEL$", 10, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1473 //_____________________________________________________________________________
1474 void AliTOFv5T0::Init()
1477 // Initialise the detector after the geometry has been defined
1479 AliDebug(1, "**************************************"
1481 "**************************************");
1482 AliDebug(1, " Version 4 of TOF initialing, "
1483 "symmetric TOF - Full Coverage version");
1487 fIdFTOA = gMC->VolId("FTOA");
1489 fIdFTOB = gMC->VolId("FTOB");
1490 fIdFTOC = gMC->VolId("FTOC");
1492 fIdFLTA = gMC->VolId("FLTA");
1494 fIdFLTB = gMC->VolId("FLTB");
1495 fIdFLTC = gMC->VolId("FLTC");
1498 AliDebug(1, "**************************************"
1500 "**************************************");
1503 //_____________________________________________________________________________
1504 void AliTOFv5T0::StepManager()
1508 // Procedure called at each step in the Time Of Flight
1511 TLorentzVector mom, pos;
1512 Float_t xm[3],pm[3],xpad[3],ppad[3];
1515 Int_t sector, plate, padx, padz, strip;
1516 Int_t copy, padzid, padxid, stripid, i;
1517 Int_t *idtmed = fIdtmed->GetArray()-499;
1518 Float_t incidenceAngle;
1520 const char* volpath;
1525 gMC->IsTrackEntering()
1526 && gMC->TrackCharge()
1527 //&& gMC->GetMedium()==idtmed[508]
1528 && gMC->CurrentMedium()==idtmed[508]
1529 && gMC->CurrentVolID(copy)==fIdSens
1533 AliMC *mcApplication = (AliMC*)gAlice->GetMCApp();
1535 AddTrackReference(mcApplication->GetCurrentTrackNumber());
1536 //AddTrackReference(gAlice->GetMCApp()->GetCurrentTrackNumber());
1538 // getting information about hit volumes
1540 padzid=gMC->CurrentVolOffID(1,copy);
1544 padxid=gMC->CurrentVolOffID(0,copy);
1548 stripid=gMC->CurrentVolOffID(4,copy);
1552 gMC->TrackPosition(pos);
1553 gMC->TrackMomentum(mom);
1555 Double_t normMom=1./mom.Rho();
1557 // getting the coordinates in pad ref system
1559 xm[0] = (Float_t)pos.X();
1560 xm[1] = (Float_t)pos.Y();
1561 xm[2] = (Float_t)pos.Z();
1563 pm[0] = (Float_t)mom.X()*normMom;
1564 pm[1] = (Float_t)mom.Y()*normMom;
1565 pm[2] = (Float_t)mom.Z()*normMom;
1567 gMC->Gmtod(xm,xpad,1); // from MRS to DRS: coordinates convertion
1568 gMC->Gmtod(pm,ppad,2); // from MRS to DRS: direction cosinus convertion
1571 if (TMath::Abs(ppad[1])>1) {
1572 AliWarning("Abs(ppad) > 1");
1573 ppad[1]=TMath::Sign((Float_t)1,ppad[1]);
1575 incidenceAngle = TMath::ACos(ppad[1])*kRaddeg;
1578 if (strip < fTOFGeometry->NStripC()) {
1582 else if (strip >= fTOFGeometry->NStripC() &&
1583 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB()) {
1585 strip = strip - fTOFGeometry->NStripC();
1587 else if (strip >= fTOFGeometry->NStripC() + fTOFGeometry->NStripB() &&
1588 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA()) {
1590 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB();
1592 else if (strip >= fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA() &&
1593 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA() + fTOFGeometry->NStripB()) {
1595 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB() - fTOFGeometry->NStripA();
1599 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB() - fTOFGeometry->NStripA() - fTOFGeometry->NStripB();
1602 volpath=gMC->CurrentVolOffName(7);
1603 index=atoi(&volpath[4]);
1620 hits[6] = mom.Rho();
1625 hits[11]= incidenceAngle;
1626 hits[12]= gMC->Edep();
1627 hits[13]= gMC->TrackLength();
1635 AddT0Hit(mcApplication->GetCurrentTrackNumber(),vol, hits);
1636 //AddT0Hit(gAlice->GetMCApp()->GetCurrentTrackNumber(),vol, hits);
1639 //-------------------------------------------------------------------
1640 void AliTOFv5T0::MaterialMixer(Float_t* p,Float_t* a,Float_t* m,Float_t* d,Float_t* s,Int_t n) const
1642 // a[] atomic weights vector (in)
1643 // (atoms present in more compound appear separately)
1644 // m[] number of corresponding atoms in the mixture (in)
1645 // d[] fraction of the compound relative to the corresponding atoms (in)
1646 // s[] further possible weights " " " " (in)
1648 for (Int_t i = 0; i < n; ++i) {
1649 p[i] = a[i]*m[i]*d[i]*s[i];
1652 for (Int_t i = 0; i < n; ++i) {
1654 // AliInfo(Form((\n weight[%i] = %f (,i,p[i]));