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.13 2006/10/12 16:35:43 arcelli
19 definition of the alignable volumes symbolic names added
21 Revision 1.12 2006/08/22 13:34:46 arcelli
22 removal of effective c++ warnings (C.Zampolli)
24 Revision 1.11 2006/07/12 16:03:44 arcelli
25 updates to match the new numbering of the TOF/TRD mother volumes in FRAME (ALICE convention)
27 Revision 1.10 2006/05/10 18:40:17 hristov
28 Larger strings for the names
30 Revision 1.9 2006/05/04 19:41:42 hristov
31 Possibility for partial TOF geometry (S.Arcelli)
33 Revision 1.8 2006/04/20 22:30:50 hristov
34 Coding conventions (Annalisa)
36 Revision 1.7 2006/04/16 22:29:05 hristov
37 Coding conventions (Annalisa)
39 Revision 1.6 2006/03/20 08:20:35 decaro
40 Al layer: positioning correction
42 Revision 1.5 2006/03/20 07:54:20 decaro
43 Correction of some layer thickness
45 Revision 1.4 2006/03/13 12:35:44 decaro
46 Suppression of fractional Z warning
48 Revision 1.3 2006/02/28 10:38:00 decaro
49 AliTOFGeometry::fAngles, AliTOFGeometry::fHeights,
50 AliTOFGeometry::fDistances arrays: dimension definition in the right
53 Revision 1.2 2006/02/27 18:12:14 decaro
54 Remove in StepManager the dependence of hit indexes from parametrized
57 Revision 1.1 2005/12/15 08:55:33 decaro
58 New TOF geometry description (V5) -G. Cara Romeo and A. De Caro
61 Revision 0.1 2004 November G. Cara Romeo and A. De Caro
62 Implement new TOF geometry version
64 suppress few volume overlaps
65 (in the 4th TOF geometry version),
66 insert the realistic strip numbers and positions
70 ///////////////////////////////////////////////////////////////////////////////
72 // This class contains the functions for version 5 of the Time Of Flight //
75 // VERSION WITH 5 MODULES AND TILTED STRIPS //
77 // FULL COVERAGE VERSION + OPTION for PHOS holes //
82 <img src="picts/AliTOFv5T0Class.gif"> //
86 ///////////////////////////////////////////////////////////////////////////////
89 #include "TGeometry.h"
90 #include "TLorentzVector.h"
92 #include "TVirtualMC.h"
93 #include "TGeoManager.h"
101 #include "AliTOFGeometry.h"
102 #include "AliTOFGeometryV5.h"
103 #include "AliTOFv5T0.h"
105 extern TDirectory *gDirectory;
106 extern TVirtualMC *gMC;
108 extern AliRun *gAlice;
112 //_____________________________________________________________________________
113 AliTOFv5T0::AliTOFv5T0():
123 // Default constructor
127 //_____________________________________________________________________________
128 AliTOFv5T0::AliTOFv5T0(const char *name, const char *title):
129 AliTOF(name,title,"tzero"),
139 // Standard constructor
142 // Check that FRAME is there otherwise we have no place where to
146 AliModule* frame = (AliModule*)gAlice->GetModule("FRAME");
148 AliFatal("TOF needs FRAME to be present");
151 if (fTOFGeometry) delete fTOFGeometry;
152 fTOFGeometry = new AliTOFGeometryV5();
154 if(frame->IsVersion()==1) {
155 AliDebug(1,Form("Frame version %d", frame->IsVersion()));
156 AliDebug(1,"Full Coverage for TOF");
159 AliDebug(1,Form("Frame version %d", frame->IsVersion()));
160 AliDebug(1,"TOF with Holes for PHOS");
163 fTOFGeometry->SetHoles(fTOFHoles);
165 //AliTOF::fTOFGeometry = fTOFGeometry;
168 TDirectory* saveDir = gDirectory;
169 gAlice->GetRunLoader()->CdGAFile();
170 fTOFGeometry->Write("TOFgeometry");
175 //_____________________________________________________________________________
176 void AliTOFv5T0::AddAlignableVolumes() const
179 // Create entries for alignable volumes associating the symbolic volume
180 // name with the corresponding volume path. Needs to be syncronized with
181 // eventual changes in the geometry.
187 TString vpL0 = "ALIC_1/B077_1/BSEGMO";
188 TString vpL1 = "_1/BTOF";
190 TString vpL3 = "/FTOA_0";
191 TString vpL4 = "/FLTA_0/FSTR_";
193 TString snSM = "TOF/sm";
194 TString snSTRIP = "/strip";
196 Int_t nSectors=fTOFGeometry->NSectors();
197 Int_t nStrips =fTOFGeometry->NStripA()+
198 2*fTOFGeometry->NStripB()+
199 2*fTOFGeometry->NStripC();
202 // The TOF MRPC Strips
203 // The symbolic names are: TOF/sm00/strip01
209 for (Int_t isect = 0; isect < nSectors; isect++) {
210 for (Int_t istr = 1; istr <= nStrips; istr++) {
223 symName += Form("%02d",isect);
225 symName += Form("%02d",istr);
227 AliDebug(2,"--------------------------------------------");
228 AliDebug(2,Form("Alignable object %d", imod));
229 AliDebug(2,Form("volPath=%s\n",volPath.Data()));
230 AliDebug(2,Form("symName=%s\n",symName.Data()));
231 AliDebug(2,"--------------------------------------------");
233 gGeoManager->SetAlignableEntry(symName.Data(),volPath.Data());
240 // The TOF supermodules
241 // The symbolic names are: TOF/sm00
245 for (Int_t isect = 0; isect < nSectors; isect++) {
255 symName += Form("%02d",isect);
257 AliDebug(2,"--------------------------------------------");
258 AliDebug(2,Form("Alignable object %d", isect+imod));
259 AliDebug(2,Form("volPath=%s\n",volPath.Data()));
260 AliDebug(2,Form("symName=%s\n",symName.Data()));
261 AliDebug(2,"--------------------------------------------");
263 gGeoManager->SetAlignableEntry(symName.Data(),volPath.Data());
268 //____________________________________________________________________________
269 void AliTOFv5T0::BuildGeometry()
272 // Build TOF ROOT geometry for the ALICE event display
275 const int kColorTOF = 27;
277 TGeometry *globalGeometry = (TGeometry*)gAlice->GetGeometry();
280 top = globalGeometry->GetNode("alice");
282 // Position the different copies
283 const Float_t krTof =(fTOFGeometry->Rmax()+fTOFGeometry->Rmin())/2.;
284 const Float_t khTof = fTOFGeometry->Rmax()-fTOFGeometry->Rmin();
285 const Int_t kNTof = fTOFGeometry->NSectors();
286 const Float_t kangle = k2PI/kNTof;
288 const Float_t kInterCentrModBorder1 = 49.5;
289 const Float_t kInterCentrModBorder2 = 57.5;
293 // define offset for nodes
294 Float_t zOffsetB = (fTOFGeometry->ZlenA()*0.5 + (kInterCentrModBorder1+kInterCentrModBorder2)*0.5)*0.5;
295 Float_t zOffsetA = 0.;
296 // Define TOF basic volume
298 char nodeName0[16], nodeName1[16], nodeName2[16];
299 char nodeName3[16], nodeName4[16], rotMatNum[16];
302 new TBRIK("S_TOF_B","TOF box","void",
303 fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenB()*0.5);
304 new TBRIK("S_TOF_C","TOF box","void",
305 fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenB()*0.5);
307 new TBRIK("S_TOF_A","TOF box","void",
308 fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenA()*0.5);
310 for (Int_t nodeNum=1;nodeNum<19;nodeNum++){
313 sprintf(rotMatNum,"rot50%i",nodeNum);
314 sprintf(nodeName0,"FTO00%i",nodeNum);
315 sprintf(nodeName1,"FTO10%i",nodeNum);
316 sprintf(nodeName2,"FTO20%i",nodeNum);
317 sprintf(nodeName3,"FTO30%i",nodeNum);
318 sprintf(nodeName4,"FTO40%i",nodeNum);
321 sprintf(rotMatNum,"rot5%i",nodeNum);
322 sprintf(nodeName0,"FTO0%i",nodeNum);
323 sprintf(nodeName1,"FTO1%i",nodeNum);
324 sprintf(nodeName2,"FTO2%i",nodeNum);
325 sprintf(nodeName3,"FTO3%i",nodeNum);
326 sprintf(nodeName4,"FTO4%i",nodeNum);
329 new TRotMatrix(rotMatNum,rotMatNum,90,-20*nodeNum,90,90-20*nodeNum,0,0);
330 ang = (4.5-nodeNum) * kangle;
334 node = new TNode(nodeName2,nodeName2,"S_TOF_B", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang), zOffsetB,rotMatNum);
335 node->SetLineColor(kColorTOF);
339 node = new TNode(nodeName3,nodeName3,"S_TOF_C", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang),-zOffsetB,rotMatNum);
340 node->SetLineColor(kColorTOF);
345 node = new TNode(nodeName4,nodeName4,"S_TOF_A", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang), zOffsetA,rotMatNum);
346 node->SetLineColor(kColorTOF);
348 } // end loop on nodeNum
352 //_____________________________________________________________________________
353 void AliTOFv5T0::CreateGeometry()
356 // Create geometry for Time Of Flight version 0
360 <img src="picts/AliTOFv5T0.gif">
364 // Creates common geometry
366 AliTOF::CreateGeometry();
370 //_____________________________________________________________________________
371 void AliTOFv5T0::TOFpc(Float_t xtof, Float_t ytof, Float_t zlenA,
375 // Definition of the Time Of Fligh Resistive Plate Chambers
378 const Float_t kPi = TMath::Pi();
380 const Float_t kInterCentrModBorder1 = 49.5;
381 const Float_t kInterCentrModBorder2 = 57.5;
382 const Float_t kExterInterModBorder1 = 196.0;
383 const Float_t kExterInterModBorder2 = 203.5;
385 const Float_t kLengthExInModBorder = 4.7;
386 const Float_t kLengthInCeModBorder = 7.0;
388 // Al layers over all internal module walls (cm)
389 const Float_t khAlWall = 0.03;
391 // module wall thickness (cm)
392 const Float_t kModuleWallThickness = 0.3;
394 // Al honeycomb layer between strips and cards (cm)
395 const Float_t kHoneycombLayerThickness = 1.5;
397 AliDebug(2,Form("zlenA*0.5 = %d", zlenA*0.5));
398 AliDebug(1, "************************* TOF geometry **************************");
400 // Definition of the Time Of Fligh Resistive Plate Chambers
401 // xFLT, yFLT, zFLT - sizes of TOF modules (large)
403 Float_t xcoor, ycoor, zcoor;
405 Int_t *idtmed = fIdtmed->GetArray()-499;
410 par[2] = zlenA * 0.5;
411 gMC->Gsvolu("FTOA", "BOX ", idtmed[503], par, 3); // fibre glass
416 par[2] = (zlenA*0.5 - kInterCentrModBorder1)*0.5;
417 gMC->Gsvolu("FTOB", "BOX ", idtmed[503], par, 3); // fibre glass
418 gMC->Gsvolu("FTOC", "BOX ", idtmed[503], par, 3); // fibre glass
421 // Positioning of fibre glass modules (FTOA, FTOB and FTOC)
423 //AliMatrix(idrotm[0], 90., 0., 0., 0., 90.,-90.);
424 AliMatrix(idrotm[0], 90., 0., 0., 0., 90.,270.);
429 for(Int_t isec=0;isec<18;isec++){
430 if(fTOFSectors[isec]==-1)continue;
432 sprintf(name, "BTOF%d",isec);
433 if (fTOFHoles && (isec==11||isec==12)) {
434 // if (fTOFHoles && (isec==16||isec==17)) { \\Old 6h convention
436 ycoor = (zlenA*0.5 + kInterCentrModBorder1)*0.5;
438 gMC->Gspos("FTOB", 0, name, xcoor, ycoor, zcoor, idrotm[0], "ONLY");
439 gMC->Gspos("FTOC", 0, name, xcoor,-ycoor, zcoor, idrotm[0], "ONLY");
441 else gMC->Gspos("FTOA", 0,name, xcoor, ycoor, zcoor, idrotm[0], "ONLY");
443 // Large not sensitive volumes with Insensitive Freon (FLTA, FLTB and FLTC)
445 Float_t xFLT, yFLT, zFLTA;
447 xFLT = xtof - kModuleWallThickness*2.;
448 yFLT = ytof - kModuleWallThickness*2.;
449 zFLTA = zlenA - kModuleWallThickness*2.;
454 gMC->Gsvolu("FLTA", "BOX ", idtmed[507], par, 3); // Freon mix
459 gMC->Gspos ("FLTA", 0, "FTOA", xcoor, ycoor, zcoor, 0, "ONLY");
464 par[2] = (zlenA*0.5 - kInterCentrModBorder1-kModuleWallThickness)*0.5;
465 gMC->Gsvolu("FLTB", "BOX ", idtmed[507], par, 3); // Freon mix
466 gMC->Gsvolu("FLTC", "BOX ", idtmed[507], par, 3); // Freon mix
470 zcoor = kModuleWallThickness*0.5;
471 gMC->Gspos ("FLTB", 0, "FTOB", xcoor, ycoor, zcoor, 0, "ONLY");
472 gMC->Gspos ("FLTC", 0, "FTOC", xcoor, ycoor,-zcoor, 0, "ONLY");
475 // Layer of Aluminum before detector (FALA, FALB and FALC)
478 par[1] = khAlWall*0.5;
479 par[2] = kInterCentrModBorder1 - (kModuleWallThickness + khAlWall);
480 gMC->Gsvolu("FALA", "BOX ", idtmed[505], par, 3); // Alluminium
483 ycoor = (-yFLT + khAlWall)*0.5;
485 gMC->Gspos ("FALA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
488 par[1] = khAlWall*0.5;
489 par[2] = (kExterInterModBorder2 - kInterCentrModBorder1 - 2.*(kModuleWallThickness + khAlWall))*0.5;
490 gMC->Gsvolu("FALB", "BOX ", idtmed[505], par, 3); // Alluminium
493 ycoor = (-yFLT + khAlWall)*0.5;
494 zcoor = (kExterInterModBorder2 + kInterCentrModBorder1)*0.5;
495 gMC->Gspos ("FALB", 1, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
496 gMC->Gspos ("FALB", 2, "FLTA", xcoor, ycoor,-zcoor, 0, "ONLY");
499 par[1] = khAlWall*0.5;
500 par[2] = (zlenA*0.5 - kExterInterModBorder2 - 2.*(kModuleWallThickness + khAlWall))*0.5;
501 gMC->Gsvolu("FALC", "BOX ", idtmed[505], par, 3); // Alluminium
504 ycoor = (-yFLT + khAlWall)*0.5;
505 zcoor = (kExterInterModBorder2+zlenA*0.5)*0.5;
506 gMC->Gspos ("FALC", 1, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
507 gMC->Gspos ("FALC", 2, "FLTA", xcoor, ycoor,-zcoor, 0, "ONLY");
511 ycoor = (-yFLT + khAlWall)*0.5;
512 zcoor = (zlenA*0.5 - kExterInterModBorder2)*0.5 - kModuleWallThickness*0.5;
513 gMC->Gspos ("FALB", 1, "FLTB", xcoor, ycoor, zcoor, 0, "ONLY");
514 gMC->Gspos ("FALB", 2, "FLTC", xcoor, ycoor,-zcoor, 0, "ONLY");
517 ycoor = (-yFLT + khAlWall)*0.5;
518 zcoor = (kExterInterModBorder2 - kInterCentrModBorder1)*0.5 + kModuleWallThickness*0.5;
519 gMC->Gspos ("FALC", 1, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
520 gMC->Gspos ("FALC", 2, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
523 Float_t y0, alpha, tgal, beta, tgbe, trpa[11];
525 // Fibre glass walls between central and intermediate modules (FWZ1 and FWZ2; holes -> FZ1B, FZ1C, FZ2B)
527 tgal = (yFLT*0.5 - 2.*kLengthInCeModBorder)/(kInterCentrModBorder2 - kInterCentrModBorder1);
528 alpha = TMath::ATan(tgal);
529 beta = (kPi*0.5 - alpha)*0.5;
530 tgbe = TMath::Tan(beta);
534 trpa[3] = kModuleWallThickness;
535 trpa[4] = (kLengthInCeModBorder - kModuleWallThickness*tgbe)*0.5;
536 trpa[5] = (kLengthInCeModBorder + kModuleWallThickness*tgbe)*0.5;
537 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
538 trpa[7] = kModuleWallThickness;
539 trpa[8] = (kLengthInCeModBorder - kModuleWallThickness*tgbe)*0.5;
540 trpa[9] = (kLengthInCeModBorder + kModuleWallThickness*tgbe)*0.5;
541 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
542 gMC->Gsvolu("FWZ1","TRAP", idtmed[503], trpa, 11); // fibre glass
544 AliMatrix (idrotm[1],90., 90.,180.,0.,90.,180.);
545 AliMatrix (idrotm[4],90., 90., 0.,0.,90., 0.);
548 ycoor = -yFLT*0.5 + kLengthInCeModBorder*0.5;
549 zcoor = kInterCentrModBorder1;
550 gMC->Gspos("FWZ1", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[1],"ONLY");
551 gMC->Gspos("FWZ1", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[4],"ONLY");
554 y0 = kLengthInCeModBorder - kModuleWallThickness*0.5*tgbe;
558 trpa[3] = kModuleWallThickness*0.5;
559 trpa[4] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
560 trpa[5] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
561 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
562 trpa[7] = kModuleWallThickness*0.5;
563 trpa[8] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
564 trpa[9] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
565 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
566 gMC->Gsvolu("FZ1B","TRAP", idtmed[503], trpa, 11); // fibre glass
569 ycoor = -yFLT*0.5 + kLengthInCeModBorder*0.5 - kModuleWallThickness*0.25*tgbe;
570 zcoor = -kInterCentrModBorder1 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
571 gMC->Gspos("FZ1B", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[4],"ONLY");
572 gMC->Gspos("FZ1B", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[1],"ONLY");
575 AliMatrix (idrotm[2],90.,270., 0.,0.,90.,180.);
576 AliMatrix (idrotm[5],90.,270.,180.,0.,90., 0.);
579 ycoor = -kLengthInCeModBorder*0.5;
580 zcoor = kInterCentrModBorder2;
581 gMC->Gspos("FWZ1", 3,"FLTA", xcoor, ycoor, zcoor,idrotm[2],"ONLY");
582 gMC->Gspos("FWZ1", 4,"FLTA", xcoor, ycoor,-zcoor,idrotm[5],"ONLY");
585 y0 = kLengthInCeModBorder + kModuleWallThickness*0.5*tgbe;
589 trpa[3] = kModuleWallThickness*0.5;
590 trpa[4] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
591 trpa[5] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
592 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
593 trpa[7] = kModuleWallThickness*0.5;
594 trpa[8] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
595 trpa[9] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
596 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
597 gMC->Gsvolu("FZ1C","TRAP", idtmed[503], trpa, 11); // fibre glass
600 ycoor = -kLengthInCeModBorder*0.5 - kModuleWallThickness*0.25*tgbe;
601 zcoor = -kInterCentrModBorder2 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
602 gMC->Gspos("FZ1C", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[5],"ONLY");
603 gMC->Gspos("FZ1C", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[2],"ONLY");
606 trpa[0] = 0.5*(kInterCentrModBorder2 - kInterCentrModBorder1)/TMath::Cos(alpha);
607 trpa[1] = kModuleWallThickness;
609 trpa[3] = -beta*kRaddeg;
612 gMC->Gsvolu("FWZ2","PARA", idtmed[503], trpa, 6); // fibre glass
614 AliMatrix (idrotm[3], alpha*kRaddeg,90.,90.+alpha*kRaddeg,90.,90.,180.);
615 AliMatrix (idrotm[6],180.-alpha*kRaddeg,90.,90.-alpha*kRaddeg,90.,90., 0.);
619 zcoor = (kInterCentrModBorder2 + kInterCentrModBorder1)*0.5;
620 gMC->Gspos("FWZ2", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[3],"ONLY");
621 gMC->Gspos("FWZ2", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[6],"ONLY");
624 trpa[0] = 0.5*(kInterCentrModBorder2 - kInterCentrModBorder1)/TMath::Cos(alpha);
625 trpa[1] = kModuleWallThickness*0.5;
627 trpa[3] = -beta*kRaddeg;
630 gMC->Gsvolu("FZ2B","PARA", idtmed[503], trpa, 6); // fibre glass
633 ycoor = -yFLT*0.25 - kModuleWallThickness*0.5*tgbe;
634 zcoor = -(kInterCentrModBorder2 + kInterCentrModBorder1)*0.5 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
635 gMC->Gspos("FZ2B", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[6],"ONLY");
636 gMC->Gspos("FZ2B", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[3],"ONLY");
639 // Fibre glass walls between intermediate and lateral modules (FWZ3 and FWZ4)
641 tgal = (yFLT*0.5 - 2.*kLengthExInModBorder)/(kExterInterModBorder2 - kExterInterModBorder1);
642 alpha = TMath::ATan(tgal);
643 beta = (kPi*0.5 - alpha)*0.5;
644 tgbe = TMath::Tan(beta);
648 trpa[3] = kModuleWallThickness;
649 trpa[4] = (kLengthExInModBorder - kModuleWallThickness*tgbe)*0.5;
650 trpa[5] = (kLengthExInModBorder + kModuleWallThickness*tgbe)*0.5;
651 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
652 trpa[7] = kModuleWallThickness;
653 trpa[8] = (kLengthExInModBorder - kModuleWallThickness*tgbe)*0.5;
654 trpa[9] = (kLengthExInModBorder + kModuleWallThickness*tgbe)*0.5;
655 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
656 gMC->Gsvolu("FWZ3","TRAP", idtmed[503], trpa, 11); // fibre glass
659 ycoor = -kLengthExInModBorder*0.5;
660 zcoor = kExterInterModBorder1;
661 gMC->Gspos("FWZ3", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[5],"ONLY");
662 gMC->Gspos("FWZ3", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[2],"ONLY");
666 ycoor = -kLengthExInModBorder*0.5;
667 zcoor = -kExterInterModBorder1 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
668 gMC->Gspos("FWZ3", 5,"FLTB", xcoor, ycoor, zcoor,idrotm[2],"ONLY");
669 gMC->Gspos("FWZ3", 6,"FLTC", xcoor, ycoor,-zcoor,idrotm[5],"ONLY");
673 ycoor = -yFLT*0.5 + kLengthExInModBorder*0.5;
674 zcoor = kExterInterModBorder2;
675 gMC->Gspos("FWZ3", 3,"FLTA", xcoor, ycoor, zcoor,idrotm[4],"ONLY");
676 gMC->Gspos("FWZ3", 4,"FLTA", xcoor, ycoor,-zcoor,idrotm[1],"ONLY");
680 ycoor = -yFLT*0.5 + kLengthExInModBorder*0.5;
681 zcoor = -kExterInterModBorder2 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
682 gMC->Gspos("FWZ3", 7,"FLTB", xcoor, ycoor, zcoor,idrotm[1],"ONLY");
683 gMC->Gspos("FWZ3", 8,"FLTC", xcoor, ycoor,-zcoor,idrotm[4],"ONLY");
686 trpa[0] = 0.5*(kExterInterModBorder2 - kExterInterModBorder1)/TMath::Cos(alpha);
687 trpa[1] = kModuleWallThickness;
689 trpa[3] = -beta*kRaddeg;
692 gMC->Gsvolu("FWZ4","PARA", idtmed[503], trpa, 6); // fibre glass
694 AliMatrix (idrotm[13],alpha*kRaddeg,90.,90.+alpha*kRaddeg,90.,90.,180.);
695 AliMatrix (idrotm[16],180.-alpha*kRaddeg,90.,90.-alpha*kRaddeg,90.,90.,0.);
699 zcoor = (kExterInterModBorder2 + kExterInterModBorder1)*0.5;
700 gMC->Gspos("FWZ4", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[16],"ONLY");
701 gMC->Gspos("FWZ4", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[13],"ONLY");
706 zcoor = -(kExterInterModBorder2 + kExterInterModBorder1)*0.5 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
707 gMC->Gspos("FWZ4", 3,"FLTB", xcoor, ycoor, zcoor,idrotm[13],"ONLY");
708 gMC->Gspos("FWZ4", 4,"FLTC", xcoor, ycoor,-zcoor,idrotm[16],"ONLY");
712 ///////////////// Detector itself //////////////////////
714 const Int_t knx = fTOFGeometry->NpadX(); // number of pads along x
715 const Int_t knz = fTOFGeometry->NpadZ(); // number of pads along z
716 const Float_t kPadX = fTOFGeometry->XPad(); // pad length along x
717 const Float_t kPadZ = fTOFGeometry->ZPad(); // pad length along z
719 // new description for strip volume -double stack strip-
720 // -- all constants are expressed in cm
721 // heigth of different layers
722 const Float_t khhony = 1.0 ; // heigth of HONY Layer
723 const Float_t khpcby = 0.08 ; // heigth of PCB Layer
724 const Float_t khrgly = 0.055 ; // heigth of RED GLASS Layer
726 const Float_t khfiliy = 0.125 ; // heigth of FISHLINE Layer
727 const Float_t khglassy = 0.160*0.5; // heigth of GLASS Layer
728 const Float_t khglfy = khfiliy+2.*khglassy;// heigth of GLASS+FISHLINE Layer
730 const Float_t khcpcby = 0.16 ; // heigth of PCB Central Layer
731 const Float_t kwhonz = 8.1 ; // z dimension of HONEY Layer
732 const Float_t kwpcbz1 = 10.6 ; // z dimension of PCB Lower Layer
733 const Float_t kwpcbz2 = 11.6 ; // z dimension of PCB Upper Layer
734 const Float_t kwcpcbz = 12.4 ; // z dimension of PCB Central Layer
735 const Float_t kwrglz = 8. ; // z dimension of RED GLASS Layer
736 const Float_t kwglfz = 7. ; // z dimension of GLASS+FISHLN Layer
737 const Float_t klsensmx = knx*kPadX; // length of Sensitive Layer
738 const Float_t khsensmy = 0.05;//0.11;//0.16;// heigth of Sensitive Layer
739 const Float_t kwsensmz = knz*kPadZ; // width of Sensitive Layer
741 // heigth of the FSTR Volume (the strip volume)
742 const Float_t khstripy = 2.*khhony+2.*khpcby+4.*khrgly+2.*khglfy+khcpcby;
744 // width of the FSTR Volume (the strip volume)
745 const Float_t kwstripz = kwcpcbz;
746 // length of the FSTR Volume (the strip volume)
747 const Float_t klstripx = fTOFGeometry->StripLength();
749 Float_t parfp[3]={klstripx*0.5,khstripy*0.5,kwstripz*0.5};
750 // Coordinates of the strip center in the strip reference frame;
751 // used for positioning internal strip volumes
752 Float_t posfp[3]={0.,0.,0.};
754 // FSTR volume definition-filling this volume with non sensitive Gas Mixture
755 gMC->Gsvolu("FSTR","BOX",idtmed[507],parfp,3); // Freon mix
757 //-- HONY Layer definition
758 parfp[1] = khhony*0.5;
759 parfp[2] = kwhonz*0.5;
760 gMC->Gsvolu("FHON","BOX",idtmed[501],parfp,3); // honeycomb (Nomex)
761 // positioning 2 HONY Layers on FSTR volume
762 posfp[1] =-khstripy*0.5+parfp[1];
763 gMC->Gspos("FHON",1,"FSTR",0., posfp[1],0.,0,"ONLY");
764 gMC->Gspos("FHON",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
766 //-- PCB Layer definition
767 parfp[1] = khpcby*0.5;
768 parfp[2] = kwpcbz1*0.5;
769 gMC->Gsvolu("FPC1","BOX",idtmed[502],parfp,3); // G10
770 parfp[2] = kwpcbz2*0.5;
771 gMC->Gsvolu("FPC2","BOX",idtmed[502],parfp,3); // G10
772 // positioning 2 PCB Layers on FSTR volume
773 posfp[1] =-khstripy*0.5+khhony+parfp[1];
774 gMC->Gspos("FPC1",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
775 gMC->Gspos("FPC2",1,"FSTR",0., posfp[1],0.,0,"ONLY");
777 //-- central PCB layer definition
778 parfp[1] = khcpcby*0.5;
779 parfp[2] = kwcpcbz*0.5;
780 gMC->Gsvolu("FPCB","BOX",idtmed[502],parfp,3); // G10
781 // positioning the central PCB layer
782 gMC->Gspos("FPCB",1,"FSTR",0.,0.,0.,0,"ONLY");
785 Float_t parfs[3] = {klsensmx*0.5, khsensmy*0.5, kwsensmz*0.5};
786 gMC->Gsvolu("FSEN","BOX",idtmed[508],parfs,3); // sensitive ...
787 // dividing FSEN along z in knz=2 and along x in knx=48
788 gMC->Gsdvn("FSEZ","FSEN",knz,3);
789 gMC->Gsdvn("FPAD","FSEZ",knx,1);
790 // positioning a Sensitive layer inside FPCB
791 gMC->Gspos("FSEN",1,"FPCB",0.,0.,0.,0,"ONLY");
793 //-- RED GLASS Layer definition
794 parfp[1] = khrgly*0.5;
795 parfp[2] = kwrglz*0.5;
796 gMC->Gsvolu("FRGL","BOX",idtmed[509],parfp,3); // glass
797 // positioning 4 RED GLASS Layers on FSTR volume
798 posfp[1] = -khstripy*0.5+khhony+khpcby+parfp[1];
799 gMC->Gspos("FRGL",1,"FSTR",0., posfp[1],0.,0,"ONLY");
800 gMC->Gspos("FRGL",4,"FSTR",0.,-posfp[1],0.,0,"ONLY");
801 posfp[1] = (khcpcby+khrgly)*0.5;
802 gMC->Gspos("FRGL",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
803 gMC->Gspos("FRGL",3,"FSTR",0., posfp[1],0.,0,"ONLY");
805 //-- GLASS Layer definition
806 parfp[1] = khglassy*0.5;
807 parfp[2] = kwglfz*0.5;
808 gMC->Gsvolu("FGLA","BOX",idtmed[509],parfp,3); // glass
810 // positioning 4 GLASS Layers on FSTR volume
811 posfp[1] = -khstripy*0.5+khhony+khpcby+khrgly+parfp[1];
812 gMC->Gspos("FGLA",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
813 gMC->Gspos("FGLA",4,"FSTR",0., posfp[1],0.,0,"ONLY");
814 posfp[1] = khcpcby*0.5+khrgly+khglassy*0.5;
815 gMC->Gspos("FGLA",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
816 gMC->Gspos("FGLA",3,"FSTR",0., posfp[1],0.,0,"ONLY");
818 //-- FREON Layer definition
819 parfp[1] = khfiliy*0.5;
820 gMC->Gsvolu("FFIS","BOX",idtmed[507],parfp,3); // freon
822 // positioning 2 FREON Layers on FSTR volume
823 posfp[1] = -khstripy*0.5+khhony+khpcby+khrgly+khglassy+parfp[1];
824 gMC->Gspos("FFIS",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
825 gMC->Gspos("FFIS",2,"FSTR",0., posfp[1],0.,0,"ONLY");
828 //-- GLASS+FISHLINE Layer definition
829 parfp[1] = khglfy*0.5;
830 parfp[2] = kwglfz*0.5;
831 gMC->Gsvolu("FGLF","BOX",idtmed[504],parfp,3);
833 // positioning 2 GLASS+FISHLINE Layers on FSTR volume
834 posfp[1] = (khcpcby+khglfy)*0.5+khrgly;
835 gMC->Gspos("FGLF",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
836 gMC->Gspos("FGLF",2,"FSTR",0., posfp[1],0.,0,"ONLY");
839 // Positioning the Strips (FSTR) in the FLT volumes
840 Int_t maxStripNumbers [5] ={fTOFGeometry->NStripC(),
841 fTOFGeometry->NStripB(),
842 fTOFGeometry->NStripA(),
843 fTOFGeometry->NStripB(),
844 fTOFGeometry->NStripC()};
846 Int_t totalStrip = 0;
847 Float_t xpos, zpos, ypos, ang;
848 for(Int_t iplate =0; iplate < fTOFGeometry->NPlates(); iplate++){
849 if (iplate>0) totalStrip += maxStripNumbers[iplate-1];
850 for(Int_t istrip =0; istrip < maxStripNumbers[iplate]; istrip++){
852 ang = fTOFGeometry->GetAngles(iplate,istrip);
853 AliDebug(1, Form(" iplate = %1i, istrip = %2i ---> ang = %f", iplate, istrip, ang));
855 if (ang>0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.+ang,90., ang, 90.);
856 else if (ang==0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.,90., 0., 0.);
857 else if (ang<0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.+ang,90.,-ang,270.);
860 zpos = fTOFGeometry->GetDistances(iplate,istrip);
861 ypos = fTOFGeometry->GetHeights(iplate,istrip);
863 gMC->Gspos("FSTR",istrip+totalStrip+1,"FLTA", xpos, ypos,-zpos,idrotm[istrip+totalStrip+1], "ONLY");
866 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");
867 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");
872 // 1.5 cm Al honeycomb layer between strips and cards
874 par[1] = kHoneycombLayerThickness*0.5;
876 gMC->Gsvolu("FPEA", "BOX ", idtmed[506], par, 3); // Al honeycomb
879 ycoor = kHoneycombLayerThickness*0.5;
881 gMC->Gspos ("FPEA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
885 par[1] = kHoneycombLayerThickness*0.5;
886 par[2] = (zlenA*0.5 - kInterCentrModBorder2-kModuleWallThickness)*0.5;
887 gMC->Gsvolu("FPEB", "BOX ", idtmed[506], par, 3); // Al honeycomb
890 ycoor = kHoneycombLayerThickness*0.5;
891 zcoor = (kInterCentrModBorder2-kInterCentrModBorder1)*0.5;
892 gMC->Gspos ("FPEB", 1, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
893 gMC->Gspos ("FPEB", 2, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
898 par[1] = (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
900 gMC->Gsvolu("FAIA", "BOX ", idtmed[500], par, 3); // Air
903 ycoor = kHoneycombLayerThickness + (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
905 gMC->Gspos ("FAIA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
909 par[1] = (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
910 par[2] = (zlenA*0.5 - kInterCentrModBorder2 - kModuleWallThickness)*0.5;
911 gMC->Gsvolu("FAIB", "BOX ", idtmed[500], par, 3); // Air
912 gMC->Gsvolu("FAIC", "BOX ", idtmed[500], par, 3); // Air
915 ycoor = kHoneycombLayerThickness + (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
916 zcoor = (kInterCentrModBorder2-kInterCentrModBorder1)*0.5;
917 gMC->Gspos ("FAIB", 0, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
918 gMC->Gspos ("FAIC", 0, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
921 // start with cards and cooling tubes
922 // finally, cards, cooling tubes and layer for thermal dispersion
925 // see GEOM200 in GEANT manual
929 // card volume definition
930 cardpar[0]= xFLT*0.5;
933 gMC->Gsvolu("FCAR", "BOX ", idtmed[502], cardpar, 3); // PCB Card
935 //alu plate volume definition
938 gMC->Gsvolu("FALP", "BOX ", idtmed[505], cardpar, 3); // Alu Plate
940 // tube volume definition
945 gMC->Gsvolu("FTUB", "TUBE", idtmed[511], tubepar, 3); // cooling tubes (steel)
950 gMC->Gsvolu("FITU", "TUBE", idtmed[510], tubepar, 3); // cooling water
951 // positioning water tube into the steel one
952 gMC->Gspos("FITU",1,"FTUB",0.,0.,0.,0,"ONLY");
955 AliMatrix(idrotm[99], 180., 90., 90., 90., 90., 0.);
957 // central module positioning
958 Float_t cardpos[3], aplpos2;
959 Float_t stepforcardA = 6.625;
961 Float_t aplpos1 = -2.;
966 // tubepos= -53.+tdis;
968 for (icard=39; icard<54; ++icard) {
969 cardpos[2]= cardpos[2]+stepforcardA;
970 aplpos2 = cardpos[2]+0.15;
971 gMC->Gspos("FCAR",icard,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
972 gMC->Gspos("FALP",icard,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
973 gMC->Gspos("FTUB",icard,"FAIA", 0.,cardpos[1],cardpos[2]+tdis,idrotm[99],"ONLY");
976 // intermediate module positioning
977 Float_t stepforcardB= 7.05;
981 for (icard=20; icard<39; ++icard) {
982 cardpos[2]= cardpos[2]+stepforcardB;
983 aplpos2 = cardpos[2]+0.15;
985 gMC->Gspos("FCAR",icard+34,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
986 gMC->Gspos("FALP",icard+34,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
987 gMC->Gspos("FTUB",icard+34,"FAIA", 0.,cardpos[1], cardpos[2]+tdis,idrotm[99],"ONLY");
988 gMC->Gspos("FCAR",58-icard,"FAIA",cardpos[0],cardpos[1], -cardpos[2], 0,"ONLY");
989 gMC->Gspos("FALP",58-icard,"FAIA",cardpos[0], aplpos1, -aplpos2, 0,"ONLY");
990 gMC->Gspos("FTUB",58-icard,"FAIA", 0.,cardpos[1],-cardpos[2]-tdis,idrotm[99],"ONLY");
993 gMC->Gspos("FCAR",icard+34+182,"FAIC",cardpos[0],cardpos[1], cardpos[2]-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
994 gMC->Gspos("FALP",icard+34+182,"FAIC",cardpos[0], aplpos1, aplpos2-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
995 gMC->Gspos("FTUB",icard+34+182,"FAIC", 0.,cardpos[1], cardpos[2]+tdis-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
996 gMC->Gspos("FCAR",58-icard+ 91,"FAIB",cardpos[0],cardpos[1], -cardpos[2]+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
997 gMC->Gspos("FALP",58-icard+ 91,"FAIB",cardpos[0], aplpos1, -aplpos2+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
998 gMC->Gspos("FTUB",58-icard+ 91,"FAIB", 0.,cardpos[1],-cardpos[2]-tdis+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
1003 // outer module positioning
1004 Float_t stepforcardC= 8.45238;
1007 for (icard=1; icard<20; ++icard) {
1008 cardpos[2]= cardpos[2]+stepforcardC;
1009 aplpos2 = cardpos[2]+0.15;
1011 gMC->Gspos("FCAR",icard+72,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
1012 gMC->Gspos("FALP",icard+72,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
1013 gMC->Gspos("FTUB",icard+72,"FAIA", 0.,cardpos[1], cardpos[2]+tdis,idrotm[99],"ONLY");
1014 gMC->Gspos("FCAR",20-icard,"FAIA",cardpos[0],cardpos[1], -cardpos[2], 0,"ONLY");
1015 gMC->Gspos("FALP",20-icard,"FAIA",cardpos[0], aplpos1, -aplpos2, 0,"ONLY");
1016 gMC->Gspos("FTUB",20-icard,"FAIA", 0.,cardpos[1],-cardpos[2]-tdis,idrotm[99],"ONLY");
1019 gMC->Gspos("FCAR",icard+72+182,"FAIC",cardpos[0],cardpos[1], cardpos[2]-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1020 gMC->Gspos("FALP",icard+72+182,"FAIC",cardpos[0], aplpos1, aplpos2-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1021 gMC->Gspos("FTUB",icard+72+182,"FAIC", 0.,cardpos[1], cardpos[2]+tdis-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
1022 gMC->Gspos("FCAR",20-icard+ 91,"FAIB",cardpos[0],cardpos[1], -cardpos[2]+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1023 gMC->Gspos("FALP",20-icard+ 91,"FAIB",cardpos[0], aplpos1, -aplpos2+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1024 gMC->Gspos("FTUB",20-icard+ 91,"FAIB", 0.,cardpos[1],-cardpos[2]-tdis+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
1029 //_____________________________________________________________________________
1030 void AliTOFv5T0::DrawModule() const
1033 // Draw a shaded view of the Time Of Flight version 4
1036 // Set everything unseen
1037 gMC->Gsatt("*", "seen", -1);
1040 //Set volumes visible
1043 //Set ALIC mother transparent
1044 gMC->Gsatt("ALIC","SEEN", 0);
1047 // Level 1 for TOF volumes
1048 gMC->Gsatt("B077","seen", 0);
1051 // Level 2 for TOF volumes
1052 gMC->Gsatt("B071","seen", 0);
1053 gMC->Gsatt("B074","seen", 0);
1054 gMC->Gsatt("B075","seen", 0);
1055 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
1056 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
1059 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
1060 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
1061 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
1062 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
1063 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
1065 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
1066 gMC->Gsatt("BTO1","seen", 0);
1069 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
1070 gMC->Gsatt("BTO2","seen", 0);
1073 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
1074 gMC->Gsatt("BTO3","seen", 0);
1076 // Level 3 of B071, B074 and B075
1077 gMC->Gsatt("FTOA","SEEN", 0);
1078 if (fTOFHoles) gMC->Gsatt("FTOB","SEEN", 0);
1080 // Level 4 of B071, B074 and B075
1081 gMC->Gsatt("FLTA","SEEN", 0);
1082 if (fTOFHoles) gMC->Gsatt("FLTB","SEEN",0);
1083 if (fTOFHoles) gMC->Gsatt("FLTC","SEEN",0);
1085 // Level 5 of B071, B074 and B075
1086 gMC->Gsatt("FAIA","SEEN",-1); // all FAIA sub-levels skipped -
1087 if (fTOFHoles) gMC->Gsatt("FAIB","SEEN",-1); // all FAIB sub-levels skipped -
1088 if (fTOFHoles) gMC->Gsatt("FAIC","SEEN",-1); // all FAIC sub-levels skipped -
1090 gMC->Gsatt("FALA","SEEN", 0);
1091 if (fTOFHoles) gMC->Gsatt("FALB","SEEN", 0);
1093 gMC->Gsatt("FPEA","SEEN", 1);
1094 if (fTOFHoles) gMC->Gsatt("FPEB","SEEN", 1);
1096 gMC->Gsatt("FSTR","SEEN",-1); // all FSTR sub-levels skipped -
1098 gMC->Gsatt("FWZ1","SEEN", 0);
1099 gMC->Gsatt("FWZ2","SEEN", 0);
1100 gMC->Gsatt("FWZ3","SEEN", 0);
1101 gMC->Gsatt("FWZ4","SEEN", 0);
1103 gMC->Gsatt("FZ1B","SEEN", 0);
1104 gMC->Gsatt("FZ1C","SEEN", 0);
1105 gMC->Gsatt("FZ2B","SEEN", 0);
1108 gMC->Gdopt("hide", "on");
1109 gMC->Gdopt("shad", "on");
1110 gMC->Gsatt("*", "fill", 7);
1111 gMC->SetClipBox(".");
1112 gMC->SetClipBox("*", 100, 1000, 100, 1000, 100, 1000);
1113 gMC->DefaultRange();
1114 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
1115 gMC->Gdhead(1111, "Time Of Flight");
1116 gMC->Gdman(18, 3, "MAN");
1117 gMC->Gdopt("hide","off");
1119 //_____________________________________________________________________________
1120 void AliTOFv5T0::DrawDetectorModules() const
1123 // Draw a shaded view of the TOF detector version 4
1126 // Set everything unseen
1127 gMC->Gsatt("*", "seen", -1);
1130 //Set volumes visible
1133 //Set ALIC mother transparent
1134 gMC->Gsatt("ALIC","SEEN", 0);
1137 // Level 1 for TOF volumes
1138 gMC->Gsatt("B077","seen", 0);
1141 // Level 2 for TOF volumes
1142 gMC->Gsatt("B071","seen", 0);
1143 gMC->Gsatt("B074","seen", 0);
1144 gMC->Gsatt("B075","seen", 0);
1145 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
1146 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
1149 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
1150 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
1151 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
1152 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
1153 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
1155 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
1156 gMC->Gsatt("BTO1","seen", 0);
1159 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
1160 gMC->Gsatt("BTO2","seen", 0);
1163 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
1164 gMC->Gsatt("BTO3","seen", 0);
1166 // Level 3 of B071, B075 and B074
1167 gMC->Gsatt("FTOA","seen",-2); // all FTOA sub-levels skipped -
1169 gMC->Gsatt("FTOB","seen",-2); // all FTOB sub-levels skipped -
1170 gMC->Gsatt("FTOC","seen",-2); // all FTOC sub-levels skipped -
1173 gMC->Gdopt("hide","on");
1174 gMC->Gdopt("shad","on");
1175 gMC->Gsatt("*", "fill", 5);
1176 gMC->SetClipBox(".");
1177 gMC->SetClipBox("*", 100, 1000, 100, 1000, 0, 1000);
1178 gMC->DefaultRange();
1179 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
1180 gMC->Gdhead(1111,"TOF detector");
1181 gMC->Gdman(18, 3, "MAN");
1182 gMC->Gdopt("hide","off");
1185 //_____________________________________________________________________________
1186 void AliTOFv5T0::DrawDetectorStrips() const
1189 // Draw a shaded view of the TOF strips for version 4
1192 // Set everything unseen
1193 gMC->Gsatt("*", "seen", -1);
1196 //Set volumes visible
1199 //Set ALIC mother transparent
1200 gMC->Gsatt("ALIC","SEEN", 0);
1203 // Level 1 for TOF volumes
1204 gMC->Gsatt("B077","seen", 0);
1207 // Level 2 for TOF volumes
1208 gMC->Gsatt("B071","seen", 0);
1209 gMC->Gsatt("B074","seen", 0);
1210 gMC->Gsatt("B075","seen", 0);
1211 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
1212 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
1215 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
1216 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
1217 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
1218 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
1219 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
1221 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
1222 gMC->Gsatt("BTO1","seen", 0);
1225 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
1226 gMC->Gsatt("BTO2","seen", 0);
1229 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
1230 gMC->Gsatt("BTO3","seen", 0);
1232 // Level 3 of B071, B074 and B075
1233 gMC->Gsatt("FTOA","SEEN", 0);
1235 gMC->Gsatt("FTOB","SEEN", 0);
1236 gMC->Gsatt("FTOC","SEEN", 0);
1239 // Level 4 of B071, B074 and B075
1240 gMC->Gsatt("FLTA","SEEN", 0);
1242 gMC->Gsatt("FLTB","SEEN", 0);
1243 gMC->Gsatt("FLTC","SEEN", 0);
1246 // Level 5 of B071, B074 and B075
1247 gMC->Gsatt("FAIA","SEEN",-1); // all FAIA sub-levels skipped -
1249 gMC->Gsatt("FAIB","SEEN",-1); // all FAIB sub-levels skipped -
1250 gMC->Gsatt("FAIC","SEEN",-1); // all FAIC sub-levels skipped -
1253 gMC->Gsatt("FALA","SEEN", 0);
1254 if (fTOFHoles) gMC->Gsatt("FALB","SEEN", 0);
1256 gMC->Gsatt("FPEA","SEEN", 0);
1257 if (fTOFHoles) gMC->Gsatt("FPEB","SEEN", 0);
1259 gMC->Gsatt("FSTR","SEEN",-2); // all FSTR sub-levels skipped -
1261 gMC->Gsatt("FWZ1","SEEN", 0);
1262 gMC->Gsatt("FWZ2","SEEN", 0);
1263 gMC->Gsatt("FWZ3","SEEN", 0);
1264 gMC->Gsatt("FWZ4","SEEN", 0);
1266 gMC->Gsatt("FZ1B","SEEN", 0);
1267 gMC->Gsatt("FZ1C","SEEN", 0);
1268 gMC->Gsatt("FZ2B","SEEN", 0);
1275 gMC->Gsatt("FALP","SEEN",0);
1276 gMC->Gsatt("FCAR","SEEN",0);
1277 gMC->Gsatt("FTUB","SEEN",-1); // all FTUB sub-levels skipped -
1280 gMC->Gsatt("FITU","SEEN",0);
1285 gMC->Gsatt("FGLF","SEEN",0);
1286 gMC->Gsatt("FHON","SEEN",0);
1287 gMC->Gsatt("FPC1","SEEN",0);
1288 gMC->Gsatt("FPC2","SEEN",0);
1289 gMC->Gsatt("FPCB","SEEN",0);
1290 gMC->Gsatt("FRGL","SEEN",0);
1292 // Level 2 of FPCB => Level 3 of FSTR
1293 gMC->Gsatt("FSEN","SEEN",0);
1294 gMC->Gsatt("FSEZ","SEEN",0);
1295 gMC->Gsatt("FPAD","SEEN",1);
1298 gMC->Gdopt("hide","on");
1299 gMC->Gdopt("shad","on");
1300 gMC->Gsatt("*", "fill", 5);
1301 gMC->SetClipBox(".");
1302 gMC->SetClipBox("*", 0, 1000, 0, 1000, 0, 1000);
1303 gMC->DefaultRange();
1304 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
1305 gMC->Gdhead(1111,"TOF Strips");
1306 gMC->Gdman(18, 3, "MAN");
1307 gMC->Gdopt("hide","off");
1310 //_____________________________________________________________________________
1311 void AliTOFv5T0::CreateMaterials()
1314 // Define materials for the Time Of Flight
1317 //AliTOF::CreateMaterials();
1319 AliMagF *magneticField = (AliMagF*)gAlice->Field();
1321 Int_t isxfld = magneticField->Integ();
1322 Float_t sxmgmx = magneticField->Max();
1324 Float_t we[7], ae[7], na[7], fr[7], vl[7];
1327 //--- Quartz (SiO2) to simulate float glass
1328 // density tuned to have correct float glass
1330 Float_t aq[2] = { 28.0855,15.9994 };
1331 Float_t zq[2] = { 14.,8. };
1332 Float_t wq[2] = { 1.,2. };
1333 Float_t dq = 2.55; // std value: 2.2
1337 Float_t anox[4] = {12.01,1.01,16.00,14.01};
1338 Float_t znox[4] = { 6., 1., 8., 7.};
1339 Float_t wnox[4] = {14., 22., 2., 2.};
1340 Float_t dnox = 0.048;
1344 Float_t ag10[4] = {28.09,12.01,1.01,16.00};
1345 Float_t zg10[4] = {14., 6., 1., 8.};
1348 for (i = 0; i < nlmatg10; ++i) {
1364 MaterialMixer(we,ae,na,fr,vl,5);
1370 Float_t densg10 = 1.7;
1373 Float_t awa[2] = { 1., 16. };
1374 Float_t zwa[2] = { 1., 8. };
1375 Float_t wwa[2] = { 2., 1. };
1380 Float_t asteel[4] = { 55.847,51.9961,58.6934,28.0855 };
1381 Float_t zsteel[4] = { 26.,24.,28.,14. };
1382 Float_t wsteel[4] = { .715,.18,.1,.005 };
1385 Float_t aAir[4]={12.0107,14.0067,15.9994,39.948};
1386 Float_t zAir[4]={6.,7.,8.,18.};
1387 Float_t wAir[4]={0.000124,0.755267,0.231781,0.012827};
1388 Float_t dAir = 1.20479E-3;
1391 Float_t afg[4] = {28.09,16.00,12.01,1.01};
1392 Float_t zfg[4] = {14., 8., 6., 1.};
1393 Float_t wfg[4] = {0.12906,0.29405,0.51502,0.06187};
1394 Float_t dfg = 1.111;
1397 // --- Freon C2F4H2 + SF6
1398 Float_t afre[4]= {12.01,1.01,19.00,32.07};
1399 Float_t zfre[4]= { 6., 1., 9., 16.};
1400 Float_t wfre[4]= {0.21250,0.01787,0.74827,0.021355};
1401 Float_t densfre= 0.00375;
1404 //char namat[15] = " ";
1405 //Float_t ama[2], zma[2], dma, radl, absl, buf[1];
1408 AliMixture ( 0, "Air$", aAir, zAir, dAir, 4, wAir);
1409 AliMixture ( 1, "Nomex$", anox, znox, dnox, nnox, wnox);
1410 AliMixture ( 2, "G10$", ag10, zg10, densg10, nlmatg10, wmatg10);
1411 AliMixture ( 3, "fibre glass$", afg, zfg, dfg, nfg, wfg);
1412 AliMaterial( 4, "Al $", 26.98, 13., 2.7, 8.9, 37.2);
1413 AliMaterial( 5, "Al honeycomb$", 26.98, 13., 0.0496, 483., 2483.);
1414 AliMixture ( 6, "Freon$", afre, zfre, densfre, nfre, wfre);
1415 AliMixture ( 7, "Glass$", aq, zq, dq, nq, wq);
1417 // get freon and glass
1418 gMC->Gfmate((*fIdmate)[6],namat,ama[0],zma[0],dma,radl,absl,buf,nbuf);
1419 gMC->Gfmate((*fIdmate)[7],namat,ama[1],zma[1],dma,radl,absl,buf,nbuf);
1422 Float_t wgfr[2]= {0.0011,0.9989};
1423 Float_t dgfr = 1.434;
1425 AliMixture ( 8, "glass-freon$", ama, zma, dgfr, ngfr, wgfr);
1427 AliMixture ( 9, "Water$", awa, zwa, dwa, nwa, wwa);
1428 AliMixture (10, "STAINLESS STEEL$", asteel, zsteel, 7.88, 4, wsteel);
1430 Float_t epsil, stmin, deemax, stemax;
1433 // EPSIL = 0.1 ! Tracking precision,
1434 // STEMAX = 0.1 ! Maximum displacement for multiple scattering
1435 // DEEMAX = 0.1 ! Maximum fractional energy loss, DLS
1439 epsil = .001; // Tracking precision,
1440 stemax = -1.; // Maximum displacement for multiple scattering
1441 deemax = -.3; // Maximum fractional energy loss, DLS
1444 AliMedium( 1, "Air$", 0, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1445 AliMedium( 2,"Nomex$", 1, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1446 AliMedium( 3,"G10$", 2, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1447 AliMedium( 4,"fibre glass$", 3, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1448 //AliMedium( 5,"glass-freon$", 8, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1449 AliMedium( 6,"Al Frame$", 4, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1450 AliMedium( 7,"Al honeycomb$", 5, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1451 AliMedium( 8,"Fre$", 6, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1452 AliMedium( 9,"PCB-S$", 2, 1, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1453 AliMedium(10,"Glass$", 7, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1454 AliMedium(11,"Water$", 9, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1455 AliMedium(12,"STEEL$", 10, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1458 //_____________________________________________________________________________
1459 void AliTOFv5T0::Init()
1462 // Initialise the detector after the geometry has been defined
1464 AliDebug(1, "**************************************"
1466 "**************************************");
1467 AliDebug(1, " Version 4 of TOF initialing, "
1468 "symmetric TOF - Full Coverage version");
1472 fIdFTOA = gMC->VolId("FTOA");
1474 fIdFTOB = gMC->VolId("FTOB");
1475 fIdFTOC = gMC->VolId("FTOC");
1477 fIdFLTA = gMC->VolId("FLTA");
1479 fIdFLTB = gMC->VolId("FLTB");
1480 fIdFLTC = gMC->VolId("FLTC");
1483 AliDebug(1, "**************************************"
1485 "**************************************");
1488 //_____________________________________________________________________________
1489 void AliTOFv5T0::StepManager()
1493 // Procedure called at each step in the Time Of Flight
1496 TLorentzVector mom, pos;
1497 Float_t xm[3],pm[3],xpad[3],ppad[3];
1500 Int_t sector, plate, padx, padz, strip;
1501 Int_t copy, padzid, padxid, stripid, i;
1502 Int_t *idtmed = fIdtmed->GetArray()-499;
1503 Float_t incidenceAngle;
1505 const char* volpath;
1510 gMC->IsTrackEntering()
1511 && gMC->TrackCharge()
1512 //&& gMC->GetMedium()==idtmed[508]
1513 && gMC->CurrentMedium()==idtmed[508]
1514 && gMC->CurrentVolID(copy)==fIdSens
1518 AliMC *mcApplication = (AliMC*)gAlice->GetMCApp();
1520 AddTrackReference(mcApplication->GetCurrentTrackNumber());
1521 //AddTrackReference(gAlice->GetMCApp()->GetCurrentTrackNumber());
1523 // getting information about hit volumes
1525 padzid=gMC->CurrentVolOffID(1,copy);
1529 padxid=gMC->CurrentVolOffID(0,copy);
1533 stripid=gMC->CurrentVolOffID(4,copy);
1537 gMC->TrackPosition(pos);
1538 gMC->TrackMomentum(mom);
1540 Double_t normMom=1./mom.Rho();
1542 // getting the coordinates in pad ref system
1544 xm[0] = (Float_t)pos.X();
1545 xm[1] = (Float_t)pos.Y();
1546 xm[2] = (Float_t)pos.Z();
1548 pm[0] = (Float_t)mom.X()*normMom;
1549 pm[1] = (Float_t)mom.Y()*normMom;
1550 pm[2] = (Float_t)mom.Z()*normMom;
1552 gMC->Gmtod(xm,xpad,1); // from MRS to DRS: coordinates convertion
1553 gMC->Gmtod(pm,ppad,2); // from MRS to DRS: direction cosinus convertion
1556 if (TMath::Abs(ppad[1])>1) {
1557 AliWarning("Abs(ppad) > 1");
1558 ppad[1]=TMath::Sign((Float_t)1,ppad[1]);
1560 incidenceAngle = TMath::ACos(ppad[1])*kRaddeg;
1563 if (strip < fTOFGeometry->NStripC()) {
1567 else if (strip >= fTOFGeometry->NStripC() &&
1568 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB()) {
1570 strip = strip - fTOFGeometry->NStripC();
1572 else if (strip >= fTOFGeometry->NStripC() + fTOFGeometry->NStripB() &&
1573 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA()) {
1575 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB();
1577 else if (strip >= fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA() &&
1578 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA() + fTOFGeometry->NStripB()) {
1580 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB() - fTOFGeometry->NStripA();
1584 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB() - fTOFGeometry->NStripA() - fTOFGeometry->NStripB();
1587 volpath=gMC->CurrentVolOffName(7);
1588 index=atoi(&volpath[4]);
1605 hits[6] = mom.Rho();
1610 hits[11]= incidenceAngle;
1611 hits[12]= gMC->Edep();
1612 hits[13]= gMC->TrackLength();
1620 AddT0Hit(mcApplication->GetCurrentTrackNumber(),vol, hits);
1621 //AddT0Hit(gAlice->GetMCApp()->GetCurrentTrackNumber(),vol, hits);
1624 //-------------------------------------------------------------------
1625 void AliTOFv5T0::MaterialMixer(Float_t* p,Float_t* a,Float_t* m,Float_t* d,Float_t* s,Int_t n) const
1627 // a[] atomic weights vector (in)
1628 // (atoms present in more compound appear separately)
1629 // m[] number of corresponding atoms in the mixture (in)
1630 // d[] fraction of the compound relative to the corresponding atoms (in)
1631 // s[] further possible weights " " " " (in)
1633 for (Int_t i = 0; i < n; ++i) {
1634 p[i] = a[i]*m[i]*d[i]*s[i];
1637 for (Int_t i = 0; i < n; ++i) {
1639 // AliInfo(Form((\n weight[%i] = %f (,i,p[i]));