]> git.uio.no Git - u/mrichter/AliRoot.git/blame - TOF/AliTOFv5T0.cxx
definition of the alignable volumes symbolic names added
[u/mrichter/AliRoot.git] / TOF / AliTOFv5T0.cxx
CommitLineData
d3c7bfac 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
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 **************************************************************************/
15
16/*
17$Log$
93f8b8bc 18Revision 1.12 2006/08/22 13:34:46 arcelli
19removal of effective c++ warnings (C.Zampolli)
20
655e379f 21Revision 1.11 2006/07/12 16:03:44 arcelli
22updates to match the new numbering of the TOF/TRD mother volumes in FRAME (ALICE convention)
23
96c2b15b 24Revision 1.10 2006/05/10 18:40:17 hristov
25Larger strings for the names
26
8ce41745 27Revision 1.9 2006/05/04 19:41:42 hristov
28Possibility for partial TOF geometry (S.Arcelli)
29
06e24a91 30Revision 1.8 2006/04/20 22:30:50 hristov
31Coding conventions (Annalisa)
32
0e46b9ae 33Revision 1.7 2006/04/16 22:29:05 hristov
34Coding conventions (Annalisa)
35
7aeeaf38 36Revision 1.6 2006/03/20 08:20:35 decaro
37Al layer: positioning correction
38
7fa116c9 39Revision 1.5 2006/03/20 07:54:20 decaro
40Correction of some layer thickness
41
43b40e69 42Revision 1.4 2006/03/13 12:35:44 decaro
43Suppression of fractional Z warning
44
1ac1b685 45Revision 1.3 2006/02/28 10:38:00 decaro
46AliTOFGeometry::fAngles, AliTOFGeometry::fHeights,
47AliTOFGeometry::fDistances arrays: dimension definition in the right
48location
49
4402e7cb 50Revision 1.2 2006/02/27 18:12:14 decaro
1ac1b685 51Remove in StepManager the dependence of hit indexes from parametrized
52TOF position
4402e7cb 53
0dadb22b 54Revision 1.1 2005/12/15 08:55:33 decaro
55New TOF geometry description (V5) -G. Cara Romeo and A. De Caro
56
d3c7bfac 57
58Revision 0.1 2004 November G. Cara Romeo and A. De Caro
59 Implement new TOF geometry version
60 in order to
61 suppress few volume overlaps
62 (in the 4th TOF geometry version),
63 insert the realistic strip numbers and positions
64
65*/
66
67///////////////////////////////////////////////////////////////////////////////
68// //
69// This class contains the functions for version 5 of the Time Of Flight //
70// detector. //
71// //
72// VERSION WITH 5 MODULES AND TILTED STRIPS //
73// //
74// FULL COVERAGE VERSION + OPTION for PHOS holes //
75// //
76// //
77//Begin_Html //
78/* //
79<img src="picts/AliTOFv5T0Class.gif"> //
80*/ //
81//End_Html //
82// //
83///////////////////////////////////////////////////////////////////////////////
84
0e46b9ae 85#include "TBRIK.h"
86#include "TGeometry.h"
87#include "TLorentzVector.h"
88#include "TNode.h"
d3c7bfac 89#include "TVirtualMC.h"
93f8b8bc 90#include "TGeoManager.h"
d3c7bfac 91
d3c7bfac 92#include "AliConst.h"
0e46b9ae 93#include "AliLog.h"
d3c7bfac 94#include "AliMagF.h"
0e46b9ae 95#include "AliMC.h"
96#include "AliRun.h"
d3c7bfac 97
98#include "AliTOFGeometry.h"
99#include "AliTOFGeometryV5.h"
100#include "AliTOFv5T0.h"
101
0e46b9ae 102extern TDirectory *gDirectory;
103extern TVirtualMC *gMC;
104
105extern AliRun *gAlice;
106
d3c7bfac 107ClassImp(AliTOFv5T0)
108
109//_____________________________________________________________________________
655e379f 110 AliTOFv5T0::AliTOFv5T0():
111 fIdFTOA(-1),
112 fIdFTOB(-1),
113 fIdFTOC(-1),
114 fIdFLTA(-1),
115 fIdFLTB(-1),
116 fIdFLTC(-1),
117 fTOFHoles(kFALSE)
d3c7bfac 118{
119 //
120 // Default constructor
121 //
122}
123
124//_____________________________________________________________________________
655e379f 125AliTOFv5T0::AliTOFv5T0(const char *name, const char *title):
126 AliTOF(name,title,"tzero"),
127 fIdFTOA(-1),
128 fIdFTOB(-1),
129 fIdFTOC(-1),
130 fIdFLTA(-1),
131 fIdFLTB(-1),
132 fIdFLTC(-1),
133 fTOFHoles(kFALSE)
d3c7bfac 134{
135 //
136 // Standard constructor
137 //
138 //
139 // Check that FRAME is there otherwise we have no place where to
140 // put TOF
141
142
0e46b9ae 143 AliModule* frame = (AliModule*)gAlice->GetModule("FRAME");
d3c7bfac 144 if(!frame) {
145 AliFatal("TOF needs FRAME to be present");
146 } else{
147
148 if (fTOFGeometry) delete fTOFGeometry;
149 fTOFGeometry = new AliTOFGeometryV5();
150
151 if(frame->IsVersion()==1) {
152 AliInfo(Form("Frame version %d", frame->IsVersion()));
153 AliInfo("Full Coverage for TOF");
154 fTOFHoles=false;}
155 else {
156 AliInfo(Form("Frame version %d", frame->IsVersion()));
157 AliInfo("TOF with Holes for PHOS");
158 fTOFHoles=true;}
159 }
160 fTOFGeometry->SetHoles(fTOFHoles);
161
162 //AliTOF::fTOFGeometry = fTOFGeometry;
163
164 // Save the geometry
165 TDirectory* saveDir = gDirectory;
166 gAlice->GetRunLoader()->CdGAFile();
167 fTOFGeometry->Write("TOFgeometry");
168 saveDir->cd();
169
170}
171
93f8b8bc 172//_____________________________________________________________________________
173void AliTOFv5T0::AddAlignableVolumes() const
174{
175 //
176 // Create entries for alignable volumes associating the symbolic volume
177 // name with the corresponding volume path. Needs to be syncronized with
178 // eventual changes in the geometry.
179 //
180
181 TString volPath;
182 TString symName;
183
184 TString vpL0 = "ALIC_1/B077_1/BSEGMO";
185 TString vpL1 = "_1/BTOF";
186 TString vpL2 = "_1";
187 TString vpL3 = "/FTOA_0";
188 TString vpL4 = "/FLTA_0/FSTR_";
189
190 TString snSM = "TOF/sm";
191 TString snSTRIP = "/strip";
192
193 Int_t nSectors=fTOFGeometry->NSectors();
194 Int_t nStrips =fTOFGeometry->NStripA()+
195 2*fTOFGeometry->NStripB()+
196 2*fTOFGeometry->NStripC();
197
198 //
199 // The TOF MRPC Strips
200 // The symbolic names are: TOF/sm00/strip01
201 // ...
202 // TOF/sm17/strip91
203
204 Int_t imod=0;
205
206 for (Int_t isect = 0; isect < nSectors; isect++) {
207 for (Int_t istr = 1; istr <= nStrips; istr++) {
208
209 volPath = vpL0;
210 volPath += isect;
211 volPath += vpL1;
212 volPath += isect;
213 volPath += vpL2;
214 volPath += vpL3;
215 volPath += vpL4;
216 volPath += istr;
217
218
219 symName = snSM;
220 symName += Form("%02d",isect);
221 symName += snSTRIP;
222 symName += Form("%02d",istr);
223
224 AliDebug(2,"--------------------------------------------");
225 AliDebug(2,Form("Alignable object %d", imod));
226 AliDebug(2,Form("volPath=%s\n",volPath.Data()));
227 AliDebug(2,Form("symName=%s\n",symName.Data()));
228 AliDebug(2,"--------------------------------------------");
229
230 gGeoManager->SetAlignableEntry(symName.Data(),volPath.Data());
231 imod++;
232 }
233 }
234
235
236 //
237 // The TOF supermodules
238 // The symbolic names are: TOF/sm00
239 // ...
240 // TOF/sm17
241 //
242 for (Int_t isect = 0; isect < nSectors; isect++) {
243
244 volPath = vpL0;
245 volPath += isect;
246 volPath += vpL1;
247 volPath += isect;
248 volPath += vpL2;
249 volPath += vpL3;
250
251 symName = snSM;
252 symName += Form("%02d",isect);
253
254 AliDebug(2,"--------------------------------------------");
255 AliDebug(2,Form("Alignable object %d", isect+imod));
256 AliDebug(2,Form("volPath=%s\n",volPath.Data()));
257 AliDebug(2,Form("symName=%s\n",symName.Data()));
258 AliDebug(2,"--------------------------------------------");
259
260 gGeoManager->SetAlignableEntry(symName.Data(),volPath.Data());
261
262 }
263
264}
d3c7bfac 265//____________________________________________________________________________
266void AliTOFv5T0::BuildGeometry()
267{
268 //
269 // Build TOF ROOT geometry for the ALICE event display
270 //
271 TNode *node, *top;
272 const int kColorTOF = 27;
273
0e46b9ae 274 TGeometry *globalGeometry = (TGeometry*)gAlice->GetGeometry();
275
d3c7bfac 276 // Find top TNODE
0e46b9ae 277 top = globalGeometry->GetNode("alice");
d3c7bfac 278
279 // Position the different copies
280 const Float_t krTof =(fTOFGeometry->Rmax()+fTOFGeometry->Rmin())/2.;
281 const Float_t khTof = fTOFGeometry->Rmax()-fTOFGeometry->Rmin();
282 const Int_t kNTof = fTOFGeometry->NSectors();
283 const Float_t kangle = k2PI/kNTof;
284
285 const Float_t kInterCentrModBorder1 = 49.5;
286 const Float_t kInterCentrModBorder2 = 57.5;
287
288 Float_t ang;
289
290 // define offset for nodes
291 Float_t zOffsetB = (fTOFGeometry->ZlenA()*0.5 + (kInterCentrModBorder1+kInterCentrModBorder2)*0.5)*0.5;
292 Float_t zOffsetA = 0.;
293 // Define TOF basic volume
294
8ce41745 295 char nodeName0[16], nodeName1[16], nodeName2[16];
296 char nodeName3[16], nodeName4[16], rotMatNum[16];
d3c7bfac 297
298 if (fTOFHoles) {
299 new TBRIK("S_TOF_B","TOF box","void",
300 fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenB()*0.5);
301 new TBRIK("S_TOF_C","TOF box","void",
302 fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenB()*0.5);
303 }
304 new TBRIK("S_TOF_A","TOF box","void",
305 fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenA()*0.5);
306
307 for (Int_t nodeNum=1;nodeNum<19;nodeNum++){
308
309 if (nodeNum<10) {
310 sprintf(rotMatNum,"rot50%i",nodeNum);
311 sprintf(nodeName0,"FTO00%i",nodeNum);
312 sprintf(nodeName1,"FTO10%i",nodeNum);
313 sprintf(nodeName2,"FTO20%i",nodeNum);
314 sprintf(nodeName3,"FTO30%i",nodeNum);
315 sprintf(nodeName4,"FTO40%i",nodeNum);
316 }
317 if (nodeNum>9) {
318 sprintf(rotMatNum,"rot5%i",nodeNum);
319 sprintf(nodeName0,"FTO0%i",nodeNum);
320 sprintf(nodeName1,"FTO1%i",nodeNum);
321 sprintf(nodeName2,"FTO2%i",nodeNum);
322 sprintf(nodeName3,"FTO3%i",nodeNum);
323 sprintf(nodeName4,"FTO4%i",nodeNum);
324 }
325
326 new TRotMatrix(rotMatNum,rotMatNum,90,-20*nodeNum,90,90-20*nodeNum,0,0);
327 ang = (4.5-nodeNum) * kangle;
328
329 if (fTOFHoles) {
330 top->cd();
331 node = new TNode(nodeName2,nodeName2,"S_TOF_B", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang), zOffsetB,rotMatNum);
332 node->SetLineColor(kColorTOF);
333 fNodes->Add(node);
334
335 top->cd();
336 node = new TNode(nodeName3,nodeName3,"S_TOF_C", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang),-zOffsetB,rotMatNum);
337 node->SetLineColor(kColorTOF);
338 fNodes->Add(node);
339 }
340
341 top->cd();
342 node = new TNode(nodeName4,nodeName4,"S_TOF_A", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang), zOffsetA,rotMatNum);
343 node->SetLineColor(kColorTOF);
344 fNodes->Add(node);
345 } // end loop on nodeNum
346
347}
348
349//_____________________________________________________________________________
350void AliTOFv5T0::CreateGeometry()
351{
352 //
353 // Create geometry for Time Of Flight version 0
354 //
355 //Begin_Html
356 /*
357 <img src="picts/AliTOFv5T0.gif">
358 */
359 //End_Html
360 //
361 // Creates common geometry
362 //
363 AliTOF::CreateGeometry();
364}
365
366
367//_____________________________________________________________________________
368void AliTOFv5T0::TOFpc(Float_t xtof, Float_t ytof, Float_t zlenA,
369 Float_t zlenB)
370{
7aeeaf38 371 //
372 // Definition of the Time Of Fligh Resistive Plate Chambers
373 //
d3c7bfac 374
375 const Float_t kPi = TMath::Pi();
376
377 const Float_t kInterCentrModBorder1 = 49.5;
378 const Float_t kInterCentrModBorder2 = 57.5;
379 const Float_t kExterInterModBorder1 = 196.0;
380 const Float_t kExterInterModBorder2 = 203.5;
381
382 const Float_t kLengthExInModBorder = 4.7;
383 const Float_t kLengthInCeModBorder = 7.0;
384
7fa116c9 385 // Al layers over all internal module walls (cm)
386 const Float_t khAlWall = 0.03;
d3c7bfac 387
1ac1b685 388 // module wall thickness (cm)
d3c7bfac 389 const Float_t kModuleWallThickness = 0.3;
390
1ac1b685 391 // Al honeycomb layer between strips and cards (cm)
d3c7bfac 392 const Float_t kHoneycombLayerThickness = 1.5;
393
394 AliDebug(2,Form("zlenA*0.5 = %d", zlenA*0.5));
395 AliDebug(1, "************************* TOF geometry **************************");
396
397 // Definition of the Time Of Fligh Resistive Plate Chambers
398 // xFLT, yFLT, zFLT - sizes of TOF modules (large)
399
1ac1b685 400 Float_t xcoor, ycoor, zcoor;
d3c7bfac 401 Float_t par[3];
402 Int_t *idtmed = fIdtmed->GetArray()-499;
403 Int_t idrotm[100];
404
405 par[0] = xtof * 0.5;
406 par[1] = ytof * 0.5;
407 par[2] = zlenA * 0.5;
408 gMC->Gsvolu("FTOA", "BOX ", idtmed[503], par, 3); // fibre glass
409
410 if (fTOFHoles) {
1ac1b685 411 par[0] = xtof * 0.5;
412 par[1] = ytof * 0.5;
d3c7bfac 413 par[2] = (zlenA*0.5 - kInterCentrModBorder1)*0.5;
1ac1b685 414 gMC->Gsvolu("FTOB", "BOX ", idtmed[503], par, 3); // fibre glass
415 gMC->Gsvolu("FTOC", "BOX ", idtmed[503], par, 3); // fibre glass
d3c7bfac 416 }
417
1ac1b685 418 // Positioning of fibre glass modules (FTOA, FTOB and FTOC)
d3c7bfac 419
420 //AliMatrix(idrotm[0], 90., 0., 0., 0., 90.,-90.);
1ac1b685 421 AliMatrix(idrotm[0], 90., 0., 0., 0., 90.,270.);
d3c7bfac 422
1ac1b685 423 xcoor = 0.;
424 ycoor = 0.;
425 zcoor = 0.;
06e24a91 426 for(Int_t isec=0;isec<18;isec++){
427 if(fTOFSectors[isec]==-1)continue;
8ce41745 428 char name[16];
06e24a91 429 sprintf(name, "BTOF%d",isec);
96c2b15b 430 if (fTOFHoles && (isec==11||isec==12)) {
431 // if (fTOFHoles && (isec==16||isec==17)) { \\Old 6h convention
06e24a91 432 xcoor = 0.;
433 ycoor = (zlenA*0.5 + kInterCentrModBorder1)*0.5;
434 zcoor = 0.;
435 gMC->Gspos("FTOB", 0, name, xcoor, ycoor, zcoor, idrotm[0], "ONLY");
436 gMC->Gspos("FTOC", 0, name, xcoor,-ycoor, zcoor, idrotm[0], "ONLY");
437 }
438 else gMC->Gspos("FTOA", 0,name, xcoor, ycoor, zcoor, idrotm[0], "ONLY");
d3c7bfac 439 }
1ac1b685 440 // Large not sensitive volumes with Insensitive Freon (FLTA, FLTB and FLTC)
06e24a91 441
d3c7bfac 442 Float_t xFLT, yFLT, zFLTA;
443
444 xFLT = xtof - kModuleWallThickness*2.;
445 yFLT = ytof - kModuleWallThickness*2.;
446 zFLTA = zlenA - kModuleWallThickness*2.;
447
448 par[0] = xFLT*0.5;
449 par[1] = yFLT*0.5;
d3c7bfac 450 par[2] = zFLTA*0.5;
1ac1b685 451 gMC->Gsvolu("FLTA", "BOX ", idtmed[507], par, 3); // Freon mix
452
453 xcoor = 0.;
454 ycoor = 0.;
455 zcoor = 0.;
456 gMC->Gspos ("FLTA", 0, "FTOA", xcoor, ycoor, zcoor, 0, "ONLY");
d3c7bfac 457
458 if (fTOFHoles) {
1ac1b685 459 par[0] = xFLT*0.5;
460 par[1] = yFLT*0.5;
d3c7bfac 461 par[2] = (zlenA*0.5 - kInterCentrModBorder1-kModuleWallThickness)*0.5;
462 gMC->Gsvolu("FLTB", "BOX ", idtmed[507], par, 3); // Freon mix
d3c7bfac 463 gMC->Gsvolu("FLTC", "BOX ", idtmed[507], par, 3); // Freon mix
1ac1b685 464
465 xcoor = 0.;
466 ycoor = 0.;
467 zcoor = kModuleWallThickness*0.5;
468 gMC->Gspos ("FLTB", 0, "FTOB", xcoor, ycoor, zcoor, 0, "ONLY");
469 gMC->Gspos ("FLTC", 0, "FTOC", xcoor, ycoor,-zcoor, 0, "ONLY");
d3c7bfac 470 }
471
7fa116c9 472 // Layer of Aluminum before detector (FALA, FALB and FALC)
473
474 par[0] = xFLT*0.5;
d3c7bfac 475 par[1] = khAlWall*0.5;
7fa116c9 476 par[2] = kInterCentrModBorder1 - (kModuleWallThickness + khAlWall);
477 gMC->Gsvolu("FALA", "BOX ", idtmed[505], par, 3); // Alluminium
478
1ac1b685 479 xcoor = 0.;
d3c7bfac 480 ycoor = (-yFLT + khAlWall)*0.5;
1ac1b685 481 zcoor = 0.;
7fa116c9 482 gMC->Gspos ("FALA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
483
484 par[0] = xFLT*0.5;
485 par[1] = khAlWall*0.5;
486 par[2] = (kExterInterModBorder2 - kInterCentrModBorder1 - 2.*(kModuleWallThickness + khAlWall))*0.5;
487 gMC->Gsvolu("FALB", "BOX ", idtmed[505], par, 3); // Alluminium
488
489 xcoor = 0.;
490 ycoor = (-yFLT + khAlWall)*0.5;
491 zcoor = (kExterInterModBorder2 + kInterCentrModBorder1)*0.5;
492 gMC->Gspos ("FALB", 1, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
493 gMC->Gspos ("FALB", 2, "FLTA", xcoor, ycoor,-zcoor, 0, "ONLY");
494
495 par[0] = xFLT*0.5;
496 par[1] = khAlWall*0.5;
497 par[2] = (zlenA*0.5 - kExterInterModBorder2 - 2.*(kModuleWallThickness + khAlWall))*0.5;
498 gMC->Gsvolu("FALC", "BOX ", idtmed[505], par, 3); // Alluminium
499
500 xcoor = 0.;
501 ycoor = (-yFLT + khAlWall)*0.5;
502 zcoor = (kExterInterModBorder2+zlenA*0.5)*0.5;
503 gMC->Gspos ("FALC", 1, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
504 gMC->Gspos ("FALC", 2, "FLTA", xcoor, ycoor,-zcoor, 0, "ONLY");
d3c7bfac 505
506 if (fTOFHoles) {
7fa116c9 507 xcoor = 0.;
1ac1b685 508 ycoor = (-yFLT + khAlWall)*0.5;
7fa116c9 509 zcoor = (zlenA*0.5 - kExterInterModBorder2)*0.5 - kModuleWallThickness*0.5;
510 gMC->Gspos ("FALB", 1, "FLTB", xcoor, ycoor, zcoor, 0, "ONLY");
511 gMC->Gspos ("FALB", 2, "FLTC", xcoor, ycoor,-zcoor, 0, "ONLY");
512
513 xcoor = 0.;
514 ycoor = (-yFLT + khAlWall)*0.5;
515 zcoor = (kExterInterModBorder2 - kInterCentrModBorder1)*0.5 + kModuleWallThickness*0.5;
516 gMC->Gspos ("FALC", 1, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
517 gMC->Gspos ("FALC", 2, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
d3c7bfac 518 }
519
1ac1b685 520 Float_t y0, alpha, tgal, beta, tgbe, trpa[11];
d3c7bfac 521
1ac1b685 522 // Fibre glass walls between central and intermediate modules (FWZ1 and FWZ2; holes -> FZ1B, FZ1C, FZ2B)
523
524 tgal = (yFLT*0.5 - 2.*kLengthInCeModBorder)/(kInterCentrModBorder2 - kInterCentrModBorder1);
525 alpha = TMath::ATan(tgal);
526 beta = (kPi*0.5 - alpha)*0.5;
d3c7bfac 527 tgbe = TMath::Tan(beta);
1ac1b685 528 trpa[0] = xFLT*0.5;
d3c7bfac 529 trpa[1] = 0.;
530 trpa[2] = 0.;
531 trpa[3] = kModuleWallThickness;
1ac1b685 532 trpa[4] = (kLengthInCeModBorder - kModuleWallThickness*tgbe)*0.5;
533 trpa[5] = (kLengthInCeModBorder + kModuleWallThickness*tgbe)*0.5;
7fa116c9 534 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
d3c7bfac 535 trpa[7] = kModuleWallThickness;
1ac1b685 536 trpa[8] = (kLengthInCeModBorder - kModuleWallThickness*tgbe)*0.5;
537 trpa[9] = (kLengthInCeModBorder + kModuleWallThickness*tgbe)*0.5;
7fa116c9 538 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
d3c7bfac 539 gMC->Gsvolu("FWZ1","TRAP", idtmed[503], trpa, 11); // fibre glass
540
541 AliMatrix (idrotm[1],90., 90.,180.,0.,90.,180.);
d3c7bfac 542 AliMatrix (idrotm[4],90., 90., 0.,0.,90., 0.);
1ac1b685 543
544 xcoor = 0.;
545 ycoor = -yFLT*0.5 + kLengthInCeModBorder*0.5;
546 zcoor = kInterCentrModBorder1;
547 gMC->Gspos("FWZ1", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[1],"ONLY");
548 gMC->Gspos("FWZ1", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[4],"ONLY");
d3c7bfac 549
550 if (fTOFHoles) {
1ac1b685 551 y0 = kLengthInCeModBorder - kModuleWallThickness*0.5*tgbe;
552 trpa[0] = xFLT*0.5;
d3c7bfac 553 trpa[1] = 0.;
554 trpa[2] = 0.;
555 trpa[3] = kModuleWallThickness*0.5;
1ac1b685 556 trpa[4] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
557 trpa[5] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
7fa116c9 558 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
d3c7bfac 559 trpa[7] = kModuleWallThickness*0.5;
1ac1b685 560 trpa[8] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
561 trpa[9] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
7fa116c9 562 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
d3c7bfac 563 gMC->Gsvolu("FZ1B","TRAP", idtmed[503], trpa, 11); // fibre glass
1ac1b685 564
565 xcoor = 0.;
566 ycoor = -yFLT*0.5 + kLengthInCeModBorder*0.5 - kModuleWallThickness*0.25*tgbe;
567 zcoor = -kInterCentrModBorder1 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
568 gMC->Gspos("FZ1B", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[4],"ONLY");
569 gMC->Gspos("FZ1B", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[1],"ONLY");
d3c7bfac 570 }
571
572 AliMatrix (idrotm[2],90.,270., 0.,0.,90.,180.);
d3c7bfac 573 AliMatrix (idrotm[5],90.,270.,180.,0.,90., 0.);
1ac1b685 574
575 xcoor = 0.;
576 ycoor = -kLengthInCeModBorder*0.5;
577 zcoor = kInterCentrModBorder2;
578 gMC->Gspos("FWZ1", 3,"FLTA", xcoor, ycoor, zcoor,idrotm[2],"ONLY");
579 gMC->Gspos("FWZ1", 4,"FLTA", xcoor, ycoor,-zcoor,idrotm[5],"ONLY");
d3c7bfac 580
581 if (fTOFHoles) {
1ac1b685 582 y0 = kLengthInCeModBorder + kModuleWallThickness*0.5*tgbe;
583 trpa[0] = xFLT*0.5;
d3c7bfac 584 trpa[1] = 0.;
585 trpa[2] = 0.;
586 trpa[3] = kModuleWallThickness*0.5;
1ac1b685 587 trpa[4] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
588 trpa[5] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
7fa116c9 589 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
d3c7bfac 590 trpa[7] = kModuleWallThickness*0.5;
1ac1b685 591 trpa[8] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
592 trpa[9] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
7fa116c9 593 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
d3c7bfac 594 gMC->Gsvolu("FZ1C","TRAP", idtmed[503], trpa, 11); // fibre glass
1ac1b685 595
596 xcoor = 0.;
597 ycoor = -kLengthInCeModBorder*0.5 - kModuleWallThickness*0.25*tgbe;
598 zcoor = -kInterCentrModBorder2 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
599 gMC->Gspos("FZ1C", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[5],"ONLY");
600 gMC->Gspos("FZ1C", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[2],"ONLY");
d3c7bfac 601 }
602
1ac1b685 603 trpa[0] = 0.5*(kInterCentrModBorder2 - kInterCentrModBorder1)/TMath::Cos(alpha);
d3c7bfac 604 trpa[1] = kModuleWallThickness;
1ac1b685 605 trpa[2] = xFLT*0.5;
d3c7bfac 606 trpa[3] = -beta*kRaddeg;
607 trpa[4] = 0.;
608 trpa[5] = 0.;
609 gMC->Gsvolu("FWZ2","PARA", idtmed[503], trpa, 6); // fibre glass
1ac1b685 610
d3c7bfac 611 AliMatrix (idrotm[3], alpha*kRaddeg,90.,90.+alpha*kRaddeg,90.,90.,180.);
d3c7bfac 612 AliMatrix (idrotm[6],180.-alpha*kRaddeg,90.,90.-alpha*kRaddeg,90.,90., 0.);
1ac1b685 613
614 xcoor = 0.;
615 ycoor = -yFLT*0.25;
616 zcoor = (kInterCentrModBorder2 + kInterCentrModBorder1)*0.5;
617 gMC->Gspos("FWZ2", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[3],"ONLY");
618 gMC->Gspos("FWZ2", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[6],"ONLY");
d3c7bfac 619
620 if (fTOFHoles) {
1ac1b685 621 trpa[0] = 0.5*(kInterCentrModBorder2 - kInterCentrModBorder1)/TMath::Cos(alpha);
d3c7bfac 622 trpa[1] = kModuleWallThickness*0.5;
1ac1b685 623 trpa[2] = xFLT*0.5;
d3c7bfac 624 trpa[3] = -beta*kRaddeg;
625 trpa[4] = 0.;
626 trpa[5] = 0.;
627 gMC->Gsvolu("FZ2B","PARA", idtmed[503], trpa, 6); // fibre glass
1ac1b685 628
629 xcoor = 0.;
630 ycoor = -yFLT*0.25 - kModuleWallThickness*0.5*tgbe;
631 zcoor = -(kInterCentrModBorder2 + kInterCentrModBorder1)*0.5 + (zlenA*0.5 + kInterCentrModBorder1)*0.5 - kModuleWallThickness;
632 gMC->Gspos("FZ2B", 1,"FLTB", xcoor, ycoor, zcoor,idrotm[6],"ONLY");
633 gMC->Gspos("FZ2B", 2,"FLTC", xcoor, ycoor,-zcoor,idrotm[3],"ONLY");
d3c7bfac 634 }
635
7fa116c9 636 // Fibre glass walls between intermediate and lateral modules (FWZ3 and FWZ4)
637
1ac1b685 638 tgal = (yFLT*0.5 - 2.*kLengthExInModBorder)/(kExterInterModBorder2 - kExterInterModBorder1);
639 alpha = TMath::ATan(tgal);
640 beta = (kPi*0.5 - alpha)*0.5;
d3c7bfac 641 tgbe = TMath::Tan(beta);
1ac1b685 642 trpa[0] = xFLT*0.5;
d3c7bfac 643 trpa[1] = 0.;
644 trpa[2] = 0.;
645 trpa[3] = kModuleWallThickness;
1ac1b685 646 trpa[4] = (kLengthExInModBorder - kModuleWallThickness*tgbe)*0.5;
647 trpa[5] = (kLengthExInModBorder + kModuleWallThickness*tgbe)*0.5;
7fa116c9 648 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
d3c7bfac 649 trpa[7] = kModuleWallThickness;
1ac1b685 650 trpa[8] = (kLengthExInModBorder - kModuleWallThickness*tgbe)*0.5;
651 trpa[9] = (kLengthExInModBorder + kModuleWallThickness*tgbe)*0.5;
7fa116c9 652 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
d3c7bfac 653 gMC->Gsvolu("FWZ3","TRAP", idtmed[503], trpa, 11); // fibre glass
1ac1b685 654
655 xcoor = 0.;
656 ycoor = -kLengthExInModBorder*0.5;
657 zcoor = kExterInterModBorder1;
658 gMC->Gspos("FWZ3", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[5],"ONLY");
659 gMC->Gspos("FWZ3", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[2],"ONLY");
d3c7bfac 660
661 if (fTOFHoles) {
1ac1b685 662 xcoor = 0.;
663 ycoor = -kLengthExInModBorder*0.5;
664 zcoor = -kExterInterModBorder1 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
665 gMC->Gspos("FWZ3", 5,"FLTB", xcoor, ycoor, zcoor,idrotm[2],"ONLY");
666 gMC->Gspos("FWZ3", 6,"FLTC", xcoor, ycoor,-zcoor,idrotm[5],"ONLY");
d3c7bfac 667 }
1ac1b685 668
669 xcoor = 0.;
670 ycoor = -yFLT*0.5 + kLengthExInModBorder*0.5;
671 zcoor = kExterInterModBorder2;
672 gMC->Gspos("FWZ3", 3,"FLTA", xcoor, ycoor, zcoor,idrotm[4],"ONLY");
673 gMC->Gspos("FWZ3", 4,"FLTA", xcoor, ycoor,-zcoor,idrotm[1],"ONLY");
d3c7bfac 674
675 if (fTOFHoles) {
1ac1b685 676 xcoor = 0.;
677 ycoor = -yFLT*0.5 + kLengthExInModBorder*0.5;
678 zcoor = -kExterInterModBorder2 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
679 gMC->Gspos("FWZ3", 7,"FLTB", xcoor, ycoor, zcoor,idrotm[1],"ONLY");
680 gMC->Gspos("FWZ3", 8,"FLTC", xcoor, ycoor,-zcoor,idrotm[4],"ONLY");
d3c7bfac 681 }
682
1ac1b685 683 trpa[0] = 0.5*(kExterInterModBorder2 - kExterInterModBorder1)/TMath::Cos(alpha);
d3c7bfac 684 trpa[1] = kModuleWallThickness;
1ac1b685 685 trpa[2] = xFLT*0.5;
d3c7bfac 686 trpa[3] = -beta*kRaddeg;
687 trpa[4] = 0.;
688 trpa[5] = 0.;
689 gMC->Gsvolu("FWZ4","PARA", idtmed[503], trpa, 6); // fibre glass
1ac1b685 690
691 AliMatrix (idrotm[13],alpha*kRaddeg,90.,90.+alpha*kRaddeg,90.,90.,180.);
692 AliMatrix (idrotm[16],180.-alpha*kRaddeg,90.,90.-alpha*kRaddeg,90.,90.,0.);
693
694 xcoor = 0.;
695 ycoor = -yFLT*0.25;
696 zcoor = (kExterInterModBorder2 + kExterInterModBorder1)*0.5;
697 gMC->Gspos("FWZ4", 1,"FLTA", xcoor, ycoor, zcoor,idrotm[16],"ONLY");
698 gMC->Gspos("FWZ4", 2,"FLTA", xcoor, ycoor,-zcoor,idrotm[13],"ONLY");
d3c7bfac 699
700 if (fTOFHoles) {
1ac1b685 701 xcoor = 0.;
702 ycoor = -yFLT*0.25;
703 zcoor = -(kExterInterModBorder2 + kExterInterModBorder1)*0.5 + (zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5;
704 gMC->Gspos("FWZ4", 3,"FLTB", xcoor, ycoor, zcoor,idrotm[13],"ONLY");
705 gMC->Gspos("FWZ4", 4,"FLTC", xcoor, ycoor,-zcoor,idrotm[16],"ONLY");
d3c7bfac 706 }
707
1ac1b685 708
d3c7bfac 709 ///////////////// Detector itself //////////////////////
710
711 const Int_t knx = fTOFGeometry->NpadX(); // number of pads along x
712 const Int_t knz = fTOFGeometry->NpadZ(); // number of pads along z
713 const Float_t kPadX = fTOFGeometry->XPad(); // pad length along x
714 const Float_t kPadZ = fTOFGeometry->ZPad(); // pad length along z
715
716 // new description for strip volume -double stack strip-
717 // -- all constants are expressed in cm
718 // heigth of different layers
719 const Float_t khhony = 1.0 ; // heigth of HONY Layer
720 const Float_t khpcby = 0.08 ; // heigth of PCB Layer
721 const Float_t khrgly = 0.055 ; // heigth of RED GLASS Layer
1ac1b685 722
723 const Float_t khfiliy = 0.125 ; // heigth of FISHLINE Layer
724 const Float_t khglassy = 0.160*0.5; // heigth of GLASS Layer
725 const Float_t khglfy = khfiliy+2.*khglassy;// heigth of GLASS+FISHLINE Layer
726
d3c7bfac 727 const Float_t khcpcby = 0.16 ; // heigth of PCB Central Layer
728 const Float_t kwhonz = 8.1 ; // z dimension of HONEY Layer
729 const Float_t kwpcbz1 = 10.6 ; // z dimension of PCB Lower Layer
730 const Float_t kwpcbz2 = 11.6 ; // z dimension of PCB Upper Layer
731 const Float_t kwcpcbz = 12.4 ; // z dimension of PCB Central Layer
732 const Float_t kwrglz = 8. ; // z dimension of RED GLASS Layer
733 const Float_t kwglfz = 7. ; // z dimension of GLASS+FISHLN Layer
734 const Float_t klsensmx = knx*kPadX; // length of Sensitive Layer
1ac1b685 735 const Float_t khsensmy = 0.05;//0.11;//0.16;// heigth of Sensitive Layer
d3c7bfac 736 const Float_t kwsensmz = knz*kPadZ; // width of Sensitive Layer
737
738 // heigth of the FSTR Volume (the strip volume)
739 const Float_t khstripy = 2.*khhony+2.*khpcby+4.*khrgly+2.*khglfy+khcpcby;
740
741 // width of the FSTR Volume (the strip volume)
742 const Float_t kwstripz = kwcpcbz;
743 // length of the FSTR Volume (the strip volume)
1ac1b685 744 const Float_t klstripx = fTOFGeometry->StripLength();
d3c7bfac 745
746 Float_t parfp[3]={klstripx*0.5,khstripy*0.5,kwstripz*0.5};
747 // Coordinates of the strip center in the strip reference frame;
748 // used for positioning internal strip volumes
749 Float_t posfp[3]={0.,0.,0.};
750
751 // FSTR volume definition-filling this volume with non sensitive Gas Mixture
752 gMC->Gsvolu("FSTR","BOX",idtmed[507],parfp,3); // Freon mix
753
754 //-- HONY Layer definition
755 parfp[1] = khhony*0.5;
756 parfp[2] = kwhonz*0.5;
757 gMC->Gsvolu("FHON","BOX",idtmed[501],parfp,3); // honeycomb (Nomex)
758 // positioning 2 HONY Layers on FSTR volume
759 posfp[1] =-khstripy*0.5+parfp[1];
760 gMC->Gspos("FHON",1,"FSTR",0., posfp[1],0.,0,"ONLY");
761 gMC->Gspos("FHON",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
762
763 //-- PCB Layer definition
764 parfp[1] = khpcby*0.5;
765 parfp[2] = kwpcbz1*0.5;
766 gMC->Gsvolu("FPC1","BOX",idtmed[502],parfp,3); // G10
767 parfp[2] = kwpcbz2*0.5;
768 gMC->Gsvolu("FPC2","BOX",idtmed[502],parfp,3); // G10
769 // positioning 2 PCB Layers on FSTR volume
770 posfp[1] =-khstripy*0.5+khhony+parfp[1];
771 gMC->Gspos("FPC1",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
772 gMC->Gspos("FPC2",1,"FSTR",0., posfp[1],0.,0,"ONLY");
773
774 //-- central PCB layer definition
775 parfp[1] = khcpcby*0.5;
776 parfp[2] = kwcpcbz*0.5;
777 gMC->Gsvolu("FPCB","BOX",idtmed[502],parfp,3); // G10
778 // positioning the central PCB layer
779 gMC->Gspos("FPCB",1,"FSTR",0.,0.,0.,0,"ONLY");
780
781 // Sensitive volume
782 Float_t parfs[3] = {klsensmx*0.5, khsensmy*0.5, kwsensmz*0.5};
783 gMC->Gsvolu("FSEN","BOX",idtmed[508],parfs,3); // sensitive ...
784 // dividing FSEN along z in knz=2 and along x in knx=48
785 gMC->Gsdvn("FSEZ","FSEN",knz,3);
786 gMC->Gsdvn("FPAD","FSEZ",knx,1);
787 // positioning a Sensitive layer inside FPCB
788 gMC->Gspos("FSEN",1,"FPCB",0.,0.,0.,0,"ONLY");
789
790 //-- RED GLASS Layer definition
791 parfp[1] = khrgly*0.5;
792 parfp[2] = kwrglz*0.5;
793 gMC->Gsvolu("FRGL","BOX",idtmed[509],parfp,3); // glass
794 // positioning 4 RED GLASS Layers on FSTR volume
795 posfp[1] = -khstripy*0.5+khhony+khpcby+parfp[1];
796 gMC->Gspos("FRGL",1,"FSTR",0., posfp[1],0.,0,"ONLY");
797 gMC->Gspos("FRGL",4,"FSTR",0.,-posfp[1],0.,0,"ONLY");
798 posfp[1] = (khcpcby+khrgly)*0.5;
799 gMC->Gspos("FRGL",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
800 gMC->Gspos("FRGL",3,"FSTR",0., posfp[1],0.,0,"ONLY");
801
1ac1b685 802 //-- GLASS Layer definition
803 parfp[1] = khglassy*0.5;
804 parfp[2] = kwglfz*0.5;
805 gMC->Gsvolu("FGLA","BOX",idtmed[509],parfp,3); // glass
806
807 // positioning 4 GLASS Layers on FSTR volume
808 posfp[1] = -khstripy*0.5+khhony+khpcby+khrgly+parfp[1];
809 gMC->Gspos("FGLA",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
810 gMC->Gspos("FGLA",4,"FSTR",0., posfp[1],0.,0,"ONLY");
811 posfp[1] = khcpcby*0.5+khrgly+khglassy*0.5;
812 gMC->Gspos("FGLA",2,"FSTR",0.,-posfp[1],0.,0,"ONLY");
813 gMC->Gspos("FGLA",3,"FSTR",0., posfp[1],0.,0,"ONLY");
814
815 //-- FREON Layer definition
816 parfp[1] = khfiliy*0.5;
817 gMC->Gsvolu("FFIS","BOX",idtmed[507],parfp,3); // freon
818
819 // positioning 2 FREON Layers on FSTR volume
820 posfp[1] = -khstripy*0.5+khhony+khpcby+khrgly+khglassy+parfp[1];
821 gMC->Gspos("FFIS",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
822 gMC->Gspos("FFIS",2,"FSTR",0., posfp[1],0.,0,"ONLY");
823
824 /*
d3c7bfac 825 //-- GLASS+FISHLINE Layer definition
826 parfp[1] = khglfy*0.5;
827 parfp[2] = kwglfz*0.5;
828 gMC->Gsvolu("FGLF","BOX",idtmed[504],parfp,3);
829
830 // positioning 2 GLASS+FISHLINE Layers on FSTR volume
831 posfp[1] = (khcpcby+khglfy)*0.5+khrgly;
832 gMC->Gspos("FGLF",1,"FSTR",0.,-posfp[1],0.,0,"ONLY");
833 gMC->Gspos("FGLF",2,"FSTR",0., posfp[1],0.,0,"ONLY");
1ac1b685 834 */
d3c7bfac 835
836 // Positioning the Strips (FSTR) in the FLT volumes
837 Int_t maxStripNumbers [5] ={fTOFGeometry->NStripC(),
838 fTOFGeometry->NStripB(),
839 fTOFGeometry->NStripA(),
840 fTOFGeometry->NStripB(),
841 fTOFGeometry->NStripC()};
842
843 Int_t totalStrip = 0;
1ac1b685 844 Float_t xpos, zpos, ypos, ang;
d3c7bfac 845 for(Int_t iplate =0; iplate < fTOFGeometry->NPlates(); iplate++){
846 if (iplate>0) totalStrip += maxStripNumbers[iplate-1];
847 for(Int_t istrip =0; istrip < maxStripNumbers[iplate]; istrip++){
848
849 ang = fTOFGeometry->GetAngles(iplate,istrip);
850 AliDebug(1, Form(" iplate = %1i, istrip = %2i ---> ang = %f", iplate, istrip, ang));
851
852 if (ang>0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.+ang,90., ang, 90.);
853 else if (ang==0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.,90., 0., 0.);
854 else if (ang<0.) AliMatrix (idrotm[istrip+totalStrip+1],90.,0.,90.+ang,90.,-ang,270.);
855
1ac1b685 856 xpos = 0.;
d3c7bfac 857 zpos = fTOFGeometry->GetDistances(iplate,istrip);
858 ypos = fTOFGeometry->GetHeights(iplate,istrip);
859
1ac1b685 860 gMC->Gspos("FSTR",istrip+totalStrip+1,"FLTA", xpos, ypos,-zpos,idrotm[istrip+totalStrip+1], "ONLY");
d3c7bfac 861
862 if (fTOFHoles) {
1ac1b685 863 if (istrip+totalStrip+1>53) gMC->Gspos("FSTR",istrip+totalStrip+1,"FLTC", xpos, ypos,-zpos-(zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5,idrotm[istrip+totalStrip+1],"ONLY");
864 if (istrip+totalStrip+1<39) gMC->Gspos("FSTR",istrip+totalStrip+1,"FLTB", xpos, ypos,-zpos+(zlenA*0.5 + kInterCentrModBorder1 - kModuleWallThickness)*0.5,idrotm[istrip+totalStrip+1],"ONLY");
d3c7bfac 865 }
866 }
867 }
868
869 // 1.5 cm Al honeycomb layer between strips and cards
870 par[0] = xFLT*0.5;
871 par[1] = kHoneycombLayerThickness*0.5;
872 par[2] = zFLTA*0.5;
1ac1b685 873 gMC->Gsvolu("FPEA", "BOX ", idtmed[506], par, 3); // Al honeycomb
874
875 xcoor = 0.;
876 ycoor = kHoneycombLayerThickness*0.5;
877 zcoor = 0.;
878 gMC->Gspos ("FPEA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
d3c7bfac 879
880 if (fTOFHoles) {
1ac1b685 881 par[0] = xFLT*0.5;
882 par[1] = kHoneycombLayerThickness*0.5;
d3c7bfac 883 par[2] = (zlenA*0.5 - kInterCentrModBorder2-kModuleWallThickness)*0.5;
1ac1b685 884 gMC->Gsvolu("FPEB", "BOX ", idtmed[506], par, 3); // Al honeycomb
885
886 xcoor = 0.;
d3c7bfac 887 ycoor = kHoneycombLayerThickness*0.5;
1ac1b685 888 zcoor = (kInterCentrModBorder2-kInterCentrModBorder1)*0.5;
889 gMC->Gspos ("FPEB", 1, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
890 gMC->Gspos ("FPEB", 2, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
d3c7bfac 891 }
892
893 // frame of Air
1ac1b685 894 par[0] = xFLT*0.5;
7fa116c9 895 par[1] = (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
d3c7bfac 896 par[2] = zFLTA *0.5;
d3c7bfac 897 gMC->Gsvolu("FAIA", "BOX ", idtmed[500], par, 3); // Air
1ac1b685 898
899 xcoor = 0.;
7fa116c9 900 ycoor = kHoneycombLayerThickness + (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
1ac1b685 901 zcoor = 0.;
902 gMC->Gspos ("FAIA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
d3c7bfac 903
904 if (fTOFHoles) {
1ac1b685 905 par[0] = xFLT*0.5;
7fa116c9 906 par[1] = (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
d3c7bfac 907 par[2] = (zlenA*0.5 - kInterCentrModBorder2 - kModuleWallThickness)*0.5;
908 gMC->Gsvolu("FAIB", "BOX ", idtmed[500], par, 3); // Air
d3c7bfac 909 gMC->Gsvolu("FAIC", "BOX ", idtmed[500], par, 3); // Air
1ac1b685 910
911 xcoor = 0.;
7fa116c9 912 ycoor = kHoneycombLayerThickness + (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
1ac1b685 913 zcoor = (kInterCentrModBorder2-kInterCentrModBorder1)*0.5;
914 gMC->Gspos ("FAIB", 0, "FLTB", xcoor, ycoor,-zcoor, 0, "ONLY");
915 gMC->Gspos ("FAIC", 0, "FLTC", xcoor, ycoor, zcoor, 0, "ONLY");
d3c7bfac 916 }
917
918 // start with cards and cooling tubes
919 // finally, cards, cooling tubes and layer for thermal dispersion
920 // 3 volumes
921
922 // see GEOM200 in GEANT manual
923
d3c7bfac 924 Float_t cardpar[3];
925
926 // card volume definition
927 cardpar[0]= xFLT*0.5;
928 cardpar[1]= 5.;
929 cardpar[2]= 0.1;
930 gMC->Gsvolu("FCAR", "BOX ", idtmed[502], cardpar, 3); // PCB Card
931
932 //alu plate volume definition
933 cardpar[1]= 3.5;
934 cardpar[2]= 0.05;
935 gMC->Gsvolu("FALP", "BOX ", idtmed[505], cardpar, 3); // Alu Plate
936
937 // tube volume definition
938 Float_t tubepar[3];
939 tubepar[0]= 0.;
940 tubepar[1]= 0.4;
941 tubepar[2]= 61.;
942 gMC->Gsvolu("FTUB", "TUBE", idtmed[511], tubepar, 3); // cooling tubes (steel)
943
944 //tubepar[0]= 0.;
945 tubepar[1]= 0.35;
946 //tubepar[2]= 61.;
947 gMC->Gsvolu("FITU", "TUBE", idtmed[510], tubepar, 3); // cooling water
948 // positioning water tube into the steel one
949 gMC->Gspos("FITU",1,"FTUB",0.,0.,0.,0,"ONLY");
950
951 // rotation matrix
952 AliMatrix(idrotm[99], 180., 90., 90., 90., 90., 0.);
953
954 // central module positioning
955 Float_t cardpos[3], aplpos2;
1ac1b685 956 Float_t stepforcardA = 6.625;
957 Float_t tdis = 0.6;
d3c7bfac 958 Float_t aplpos1 = -2.;
959
960 cardpos[0]= 0.;
961 cardpos[1]= -0.5;
962 cardpos[2]= -53.;
963 // tubepos= -53.+tdis;
964 Int_t icard;
965 for (icard=39; icard<54; ++icard) {
966 cardpos[2]= cardpos[2]+stepforcardA;
967 aplpos2 = cardpos[2]+0.15;
968 gMC->Gspos("FCAR",icard,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
969 gMC->Gspos("FALP",icard,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
970 gMC->Gspos("FTUB",icard,"FAIA", 0.,cardpos[1],cardpos[2]+tdis,idrotm[99],"ONLY");
971 }
972
973 // intermediate module positioning
974 Float_t stepforcardB= 7.05;
975 Float_t offs = 53.;
976
977 cardpos[2]= offs;
978 for (icard=20; icard<39; ++icard) {
979 cardpos[2]= cardpos[2]+stepforcardB;
980 aplpos2 = cardpos[2]+0.15;
981
982 gMC->Gspos("FCAR",icard+34,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
983 gMC->Gspos("FALP",icard+34,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
984 gMC->Gspos("FTUB",icard+34,"FAIA", 0.,cardpos[1], cardpos[2]+tdis,idrotm[99],"ONLY");
985 gMC->Gspos("FCAR",58-icard,"FAIA",cardpos[0],cardpos[1], -cardpos[2], 0,"ONLY");
986 gMC->Gspos("FALP",58-icard,"FAIA",cardpos[0], aplpos1, -aplpos2, 0,"ONLY");
987 gMC->Gspos("FTUB",58-icard,"FAIA", 0.,cardpos[1],-cardpos[2]-tdis,idrotm[99],"ONLY");
988
989 if (fTOFHoles) {
990 gMC->Gspos("FCAR",icard+34+182,"FAIC",cardpos[0],cardpos[1], cardpos[2]-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
991 gMC->Gspos("FALP",icard+34+182,"FAIC",cardpos[0], aplpos1, aplpos2-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
992 gMC->Gspos("FTUB",icard+34+182,"FAIC", 0.,cardpos[1], cardpos[2]+tdis-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
993 gMC->Gspos("FCAR",58-icard+ 91,"FAIB",cardpos[0],cardpos[1], -cardpos[2]+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
994 gMC->Gspos("FALP",58-icard+ 91,"FAIB",cardpos[0], aplpos1, -aplpos2+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
995 gMC->Gspos("FTUB",58-icard+ 91,"FAIB", 0.,cardpos[1],-cardpos[2]-tdis+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
996 }
997
998 }
999
1000 // outer module positioning
1001 Float_t stepforcardC= 8.45238;
1002 offs += zlenB;
1003 cardpos[2]= offs;
1004 for (icard=1; icard<20; ++icard) {
1005 cardpos[2]= cardpos[2]+stepforcardC;
1006 aplpos2 = cardpos[2]+0.15;
1007
1008 gMC->Gspos("FCAR",icard+72,"FAIA",cardpos[0],cardpos[1], cardpos[2], 0,"ONLY");
1009 gMC->Gspos("FALP",icard+72,"FAIA",cardpos[0], aplpos1, aplpos2, 0,"ONLY");
1010 gMC->Gspos("FTUB",icard+72,"FAIA", 0.,cardpos[1], cardpos[2]+tdis,idrotm[99],"ONLY");
1011 gMC->Gspos("FCAR",20-icard,"FAIA",cardpos[0],cardpos[1], -cardpos[2], 0,"ONLY");
1012 gMC->Gspos("FALP",20-icard,"FAIA",cardpos[0], aplpos1, -aplpos2, 0,"ONLY");
1013 gMC->Gspos("FTUB",20-icard,"FAIA", 0.,cardpos[1],-cardpos[2]-tdis,idrotm[99],"ONLY");
1014
1015 if (fTOFHoles) {
1016 gMC->Gspos("FCAR",icard+72+182,"FAIC",cardpos[0],cardpos[1], cardpos[2]-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1017 gMC->Gspos("FALP",icard+72+182,"FAIC",cardpos[0], aplpos1, aplpos2-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1018 gMC->Gspos("FTUB",icard+72+182,"FAIC", 0.,cardpos[1], cardpos[2]+tdis-(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
1019 gMC->Gspos("FCAR",20-icard+ 91,"FAIB",cardpos[0],cardpos[1], -cardpos[2]+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1020 gMC->Gspos("FALP",20-icard+ 91,"FAIB",cardpos[0], aplpos1, -aplpos2+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5, 0,"ONLY");
1021 gMC->Gspos("FTUB",20-icard+ 91,"FAIB", 0.,cardpos[1],-cardpos[2]-tdis+(zlenA*0.5 + kInterCentrModBorder2 - kModuleWallThickness)*0.5,idrotm[99],"ONLY");
1022 }
1023 }
1024
1025}
1026//_____________________________________________________________________________
1027void AliTOFv5T0::DrawModule() const
1028{
1029 //
1030 // Draw a shaded view of the Time Of Flight version 4
1031 //
1032
1033 // Set everything unseen
1034 gMC->Gsatt("*", "seen", -1);
1035
1036 //
1037 //Set volumes visible
1038 //
1039
1040 //Set ALIC mother transparent
1041 gMC->Gsatt("ALIC","SEEN", 0);
1042
1043//=====> Level 1
1044 // Level 1 for TOF volumes
1045 gMC->Gsatt("B077","seen", 0);
1046
1047//=====> Level 2
1048 // Level 2 for TOF volumes
1049 gMC->Gsatt("B071","seen", 0);
1050 gMC->Gsatt("B074","seen", 0);
1051 gMC->Gsatt("B075","seen", 0);
1052 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
1053 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
1054
1055 // Level 2 of B071
1056 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
1057 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
1058 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
1059 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
1060 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
1061
1062 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
1063 gMC->Gsatt("BTO1","seen", 0);
1064
1065 // Level 2 of B074
1066 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
1067 gMC->Gsatt("BTO2","seen", 0);
1068
1069 // Level 2 of B075
1070 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
1071 gMC->Gsatt("BTO3","seen", 0);
1072
1073 // Level 3 of B071, B074 and B075
1074 gMC->Gsatt("FTOA","SEEN", 0);
1075 if (fTOFHoles) gMC->Gsatt("FTOB","SEEN", 0);
1076
1077 // Level 4 of B071, B074 and B075
1078 gMC->Gsatt("FLTA","SEEN", 0);
1079 if (fTOFHoles) gMC->Gsatt("FLTB","SEEN",0);
1080 if (fTOFHoles) gMC->Gsatt("FLTC","SEEN",0);
1081
1082 // Level 5 of B071, B074 and B075
1083 gMC->Gsatt("FAIA","SEEN",-1); // all FAIA sub-levels skipped -
1084 if (fTOFHoles) gMC->Gsatt("FAIB","SEEN",-1); // all FAIB sub-levels skipped -
1085 if (fTOFHoles) gMC->Gsatt("FAIC","SEEN",-1); // all FAIC sub-levels skipped -
1086
1087 gMC->Gsatt("FALA","SEEN", 0);
1088 if (fTOFHoles) gMC->Gsatt("FALB","SEEN", 0);
1089
1090 gMC->Gsatt("FPEA","SEEN", 1);
1091 if (fTOFHoles) gMC->Gsatt("FPEB","SEEN", 1);
1092
1093 gMC->Gsatt("FSTR","SEEN",-1); // all FSTR sub-levels skipped -
1094
1095 gMC->Gsatt("FWZ1","SEEN", 0);
1096 gMC->Gsatt("FWZ2","SEEN", 0);
1097 gMC->Gsatt("FWZ3","SEEN", 0);
1098 gMC->Gsatt("FWZ4","SEEN", 0);
1099 if (fTOFHoles) {
1100 gMC->Gsatt("FZ1B","SEEN", 0);
1101 gMC->Gsatt("FZ1C","SEEN", 0);
1102 gMC->Gsatt("FZ2B","SEEN", 0);
1103 }
1104
1105 gMC->Gdopt("hide", "on");
1106 gMC->Gdopt("shad", "on");
1107 gMC->Gsatt("*", "fill", 7);
1108 gMC->SetClipBox(".");
1109 gMC->SetClipBox("*", 100, 1000, 100, 1000, 100, 1000);
1110 gMC->DefaultRange();
1111 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
1112 gMC->Gdhead(1111, "Time Of Flight");
1113 gMC->Gdman(18, 3, "MAN");
1114 gMC->Gdopt("hide","off");
1115}
1116//_____________________________________________________________________________
7aeeaf38 1117void AliTOFv5T0::DrawDetectorModules() const
d3c7bfac 1118{
1119 //
1120 // Draw a shaded view of the TOF detector version 4
1121 //
1122
1123 // Set everything unseen
1124 gMC->Gsatt("*", "seen", -1);
1125
1126 //
1127 //Set volumes visible
1128 //
1129
1130 //Set ALIC mother transparent
1131 gMC->Gsatt("ALIC","SEEN", 0);
1132
1133//=====> Level 1
1134 // Level 1 for TOF volumes
1135 gMC->Gsatt("B077","seen", 0);
1136
1137//=====> Level 2
1138 // Level 2 for TOF volumes
1139 gMC->Gsatt("B071","seen", 0);
1140 gMC->Gsatt("B074","seen", 0);
1141 gMC->Gsatt("B075","seen", 0);
1142 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
1143 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
1144
1145 // Level 2 of B071
1146 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
1147 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
1148 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
1149 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
1150 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
1151
1152 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
1153 gMC->Gsatt("BTO1","seen", 0);
1154
1155 // Level 2 of B074
1156 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
1157 gMC->Gsatt("BTO2","seen", 0);
1158
1159 // Level 2 of B075
1160 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
1161 gMC->Gsatt("BTO3","seen", 0);
1162
1163 // Level 3 of B071, B075 and B074
1164 gMC->Gsatt("FTOA","seen",-2); // all FTOA sub-levels skipped -
1165 if (fTOFHoles) {
1166 gMC->Gsatt("FTOB","seen",-2); // all FTOB sub-levels skipped -
1167 gMC->Gsatt("FTOC","seen",-2); // all FTOC sub-levels skipped -
1168 }
1169
1170 gMC->Gdopt("hide","on");
1171 gMC->Gdopt("shad","on");
1172 gMC->Gsatt("*", "fill", 5);
1173 gMC->SetClipBox(".");
1174 gMC->SetClipBox("*", 100, 1000, 100, 1000, 0, 1000);
1175 gMC->DefaultRange();
1176 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
1177 gMC->Gdhead(1111,"TOF detector");
1178 gMC->Gdman(18, 3, "MAN");
1179 gMC->Gdopt("hide","off");
1180}
1181
1182//_____________________________________________________________________________
7aeeaf38 1183void AliTOFv5T0::DrawDetectorStrips() const
d3c7bfac 1184{
1185 //
1186 // Draw a shaded view of the TOF strips for version 4
1187 //
1188
1189 // Set everything unseen
1190 gMC->Gsatt("*", "seen", -1);
1191
1192 //
1193 //Set volumes visible
1194 //
1195
1196 //Set ALIC mother transparent
1197 gMC->Gsatt("ALIC","SEEN", 0);
1198
1199//=====> Level 1
1200 // Level 1 for TOF volumes
1201 gMC->Gsatt("B077","seen", 0);
1202
1203//=====> Level 2
1204 // Level 2 for TOF volumes
1205 gMC->Gsatt("B071","seen", 0);
1206 gMC->Gsatt("B074","seen", 0);
1207 gMC->Gsatt("B075","seen", 0);
1208 gMC->Gsatt("B076","seen",-1); // all B076 sub-levels skipped -
1209 gMC->Gsatt("B080","seen", 0); // B080 does not has sub-level
1210
1211 // Level 2 of B071
1212 gMC->Gsatt("B063","seen",-1); // all B063 sub-levels skipped -
1213 gMC->Gsatt("B065","seen",-1); // all B065 sub-levels skipped -
1214 gMC->Gsatt("B067","seen",-1); // all B067 sub-levels skipped -
1215 gMC->Gsatt("B056","seen", 0); // B056 does not has sub-levels -
1216 gMC->Gsatt("B072","seen",-1); // all B072 sub-levels skipped -
1217
1218 gMC->Gsatt("BTR1","seen", 0); // all BTR1 sub-levels skipped -
1219 gMC->Gsatt("BTO1","seen", 0);
1220
1221 // Level 2 of B074
1222 gMC->Gsatt("BTR2","seen", 0); // all BTR1 sub-levels skipped -
1223 gMC->Gsatt("BTO2","seen", 0);
1224
1225 // Level 2 of B075
1226 gMC->Gsatt("BTR3","seen", 0); // all BTR1 sub-levels skipped -
1227 gMC->Gsatt("BTO3","seen", 0);
1228
1229 // Level 3 of B071, B074 and B075
1230 gMC->Gsatt("FTOA","SEEN", 0);
1231 if (fTOFHoles) {
1232 gMC->Gsatt("FTOB","SEEN", 0);
1233 gMC->Gsatt("FTOC","SEEN", 0);
1234 }
1235
1236 // Level 4 of B071, B074 and B075
1237 gMC->Gsatt("FLTA","SEEN", 0);
1238 if (fTOFHoles) {
1239 gMC->Gsatt("FLTB","SEEN", 0);
1240 gMC->Gsatt("FLTC","SEEN", 0);
1241 }
1242
1243 // Level 5 of B071, B074 and B075
1244 gMC->Gsatt("FAIA","SEEN",-1); // all FAIA sub-levels skipped -
1245 if (fTOFHoles) {
1246 gMC->Gsatt("FAIB","SEEN",-1); // all FAIB sub-levels skipped -
1247 gMC->Gsatt("FAIC","SEEN",-1); // all FAIC sub-levels skipped -
1248 }
1249
1250 gMC->Gsatt("FALA","SEEN", 0);
1251 if (fTOFHoles) gMC->Gsatt("FALB","SEEN", 0);
1252
1253 gMC->Gsatt("FPEA","SEEN", 0);
1254 if (fTOFHoles) gMC->Gsatt("FPEB","SEEN", 0);
1255
1256 gMC->Gsatt("FSTR","SEEN",-2); // all FSTR sub-levels skipped -
1257
1258 gMC->Gsatt("FWZ1","SEEN", 0);
1259 gMC->Gsatt("FWZ2","SEEN", 0);
1260 gMC->Gsatt("FWZ3","SEEN", 0);
1261 gMC->Gsatt("FWZ4","SEEN", 0);
1262 if (fTOFHoles){
1263 gMC->Gsatt("FZ1B","SEEN", 0);
1264 gMC->Gsatt("FZ1C","SEEN", 0);
1265 gMC->Gsatt("FZ2B","SEEN", 0);
1266 }
1267
1268 /*
1269 // Level 2 of FAIA
1270 // Level 2 of FAIB
1271 // Level 2 of FAIC
1272 gMC->Gsatt("FALP","SEEN",0);
1273 gMC->Gsatt("FCAR","SEEN",0);
1274 gMC->Gsatt("FTUB","SEEN",-1); // all FTUB sub-levels skipped -
1275
1276 // Level 2 of FTUB
1277 gMC->Gsatt("FITU","SEEN",0);
1278 */
1279
1280 /*
1281 // Level 2 of FSTR
1282 gMC->Gsatt("FGLF","SEEN",0);
1283 gMC->Gsatt("FHON","SEEN",0);
1284 gMC->Gsatt("FPC1","SEEN",0);
1285 gMC->Gsatt("FPC2","SEEN",0);
1286 gMC->Gsatt("FPCB","SEEN",0);
1287 gMC->Gsatt("FRGL","SEEN",0);
1288
1289 // Level 2 of FPCB => Level 3 of FSTR
1290 gMC->Gsatt("FSEN","SEEN",0);
1291 gMC->Gsatt("FSEZ","SEEN",0);
1292 gMC->Gsatt("FPAD","SEEN",1);
1293 */
1294
1295 gMC->Gdopt("hide","on");
1296 gMC->Gdopt("shad","on");
1297 gMC->Gsatt("*", "fill", 5);
1298 gMC->SetClipBox(".");
1299 gMC->SetClipBox("*", 0, 1000, 0, 1000, 0, 1000);
1300 gMC->DefaultRange();
1301 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .018, .018);
1302 gMC->Gdhead(1111,"TOF Strips");
1303 gMC->Gdman(18, 3, "MAN");
1304 gMC->Gdopt("hide","off");
1305}
1306
1307//_____________________________________________________________________________
1308void AliTOFv5T0::CreateMaterials()
1309{
1310 //
1311 // Define materials for the Time Of Flight
1312 //
1313
1314 //AliTOF::CreateMaterials();
1315
0e46b9ae 1316 AliMagF *magneticField = (AliMagF*)gAlice->Field();
1317
1318 Int_t isxfld = magneticField->Integ();
1319 Float_t sxmgmx = magneticField->Max();
1320
d3c7bfac 1321 Float_t we[7], ae[7], na[7], fr[7], vl[7];
1322 Int_t i;
1323
d3c7bfac 1324 //--- Quartz (SiO2) to simulate float glass
1325 // density tuned to have correct float glass
1326 // radiation length
1327 Float_t aq[2] = { 28.0855,15.9994 };
1328 Float_t zq[2] = { 14.,8. };
1329 Float_t wq[2] = { 1.,2. };
1330 Float_t dq = 2.55; // std value: 2.2
1331 Int_t nq = -2;
1332
1333 // --- Nomex
1334 Float_t anox[4] = {12.01,1.01,16.00,14.01};
1335 Float_t znox[4] = { 6., 1., 8., 7.};
1336 Float_t wnox[4] = {14., 22., 2., 2.};
1337 Float_t dnox = 0.048;
1338 Int_t nnox = -4;
1339
1340 // { Si, C, H, O }
1341 Float_t ag10[4] = {28.09,12.01,1.01,16.00};
1342 Float_t zg10[4] = {14., 6., 1., 8.};
1343 Float_t wmatg10[4];
1344 Int_t nlmatg10 = 4;
1345 for (i = 0; i < nlmatg10; ++i) {
1346 ae[i] = ag10[i];
1347 vl[i] = 1.;
1348 }
1349 ae[4] = 16.00;
1350 vl[4] = 1.;
1351 na[0] = 1.;
1352 na[1] = 14.;
1353 na[2] = 20.;
1354 na[3] = 2.;
1355 na[4] = 3.;
1356 fr[0] = 0.6;
1357 fr[1] = 0.4;
1358 fr[2] = 0.4;
1359 fr[3] = 0.6;
1360 fr[4] = 0.4;
1361 MaterialMixer(we,ae,na,fr,vl,5);
1362 we[3] += we[4];
1363 wmatg10[0]= we[0];
1364 wmatg10[1]= we[1];
1365 wmatg10[2]= we[2];
1366 wmatg10[3]= we[3];
1367 Float_t densg10 = 1.7;
1368
1369 // -- Water
1370 Float_t awa[2] = { 1., 16. };
1371 Float_t zwa[2] = { 1., 8. };
1372 Float_t wwa[2] = { 2., 1. };
1373 Float_t dwa = 1.0;
1374 Int_t nwa = -2;
1375
1376 // stainless steel
1377 Float_t asteel[4] = { 55.847,51.9961,58.6934,28.0855 };
1378 Float_t zsteel[4] = { 26.,24.,28.,14. };
1379 Float_t wsteel[4] = { .715,.18,.1,.005 };
1380
1381 // AIR
1382 Float_t aAir[4]={12.0107,14.0067,15.9994,39.948};
1383 Float_t zAir[4]={6.,7.,8.,18.};
1384 Float_t wAir[4]={0.000124,0.755267,0.231781,0.012827};
1385 Float_t dAir = 1.20479E-3;
1386
1387 // --- fibre glass
1388 Float_t afg[4] = {28.09,16.00,12.01,1.01};
1389 Float_t zfg[4] = {14., 8., 6., 1.};
1390 Float_t wfg[4] = {0.12906,0.29405,0.51502,0.06187};
1391 Float_t dfg = 1.111;
1392 Int_t nfg = 4;
1393
1394 // --- Freon C2F4H2 + SF6
1395 Float_t afre[4]= {12.01,1.01,19.00,32.07};
1396 Float_t zfre[4]= { 6., 1., 9., 16.};
1397 Float_t wfre[4]= {0.21250,0.01787,0.74827,0.021355};
1398 Float_t densfre= 0.00375;
1399 Int_t nfre = 4;
1400
1ac1b685 1401 //char namat[15] = " ";
1402 //Float_t ama[2], zma[2], dma, radl, absl, buf[1];
1403 //Int_t nbuf;
d3c7bfac 1404
1405 AliMixture ( 0, "Air$", aAir, zAir, dAir, 4, wAir);
1406 AliMixture ( 1, "Nomex$", anox, znox, dnox, nnox, wnox);
1407 AliMixture ( 2, "G10$", ag10, zg10, densg10, nlmatg10, wmatg10);
1408 AliMixture ( 3, "fibre glass$", afg, zfg, dfg, nfg, wfg);
1409 AliMaterial( 4, "Al $", 26.98, 13., 2.7, 8.9, 37.2);
1410 AliMaterial( 5, "Al honeycomb$", 26.98, 13., 0.0496, 483., 2483.);
1411 AliMixture ( 6, "Freon$", afre, zfre, densfre, nfre, wfre);
1412 AliMixture ( 7, "Glass$", aq, zq, dq, nq, wq);
1ac1b685 1413 /*
d3c7bfac 1414 // get freon and glass
1415 gMC->Gfmate((*fIdmate)[6],namat,ama[0],zma[0],dma,radl,absl,buf,nbuf);
1416 gMC->Gfmate((*fIdmate)[7],namat,ama[1],zma[1],dma,radl,absl,buf,nbuf);
1417
1418 // --- glass-freon
1419 Float_t wgfr[2]= {0.0011,0.9989};
1420 Float_t dgfr = 1.434;
1421 Int_t ngfr = 2;
1422 AliMixture ( 8, "glass-freon$", ama, zma, dgfr, ngfr, wgfr);
1ac1b685 1423 */
d3c7bfac 1424 AliMixture ( 9, "Water$", awa, zwa, dwa, nwa, wwa);
1425 AliMixture (10, "STAINLESS STEEL$", asteel, zsteel, 7.88, 4, wsteel);
1426
1427 Float_t epsil, stmin, deemax, stemax;
1428
1429 // Previous data
1430 // EPSIL = 0.1 ! Tracking precision,
1431 // STEMAX = 0.1 ! Maximum displacement for multiple scattering
1432 // DEEMAX = 0.1 ! Maximum fractional energy loss, DLS
1433 // STMIN = 0.1
1434
1435 // New data
1436 epsil = .001; // Tracking precision,
1437 stemax = -1.; // Maximum displacement for multiple scattering
1438 deemax = -.3; // Maximum fractional energy loss, DLS
1439 stmin = -.8;
1440
1441 AliMedium( 1, "Air$", 0, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1442 AliMedium( 2,"Nomex$", 1, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1443 AliMedium( 3,"G10$", 2, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1444 AliMedium( 4,"fibre glass$", 3, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1ac1b685 1445 //AliMedium( 5,"glass-freon$", 8, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
d3c7bfac 1446 AliMedium( 6,"Al Frame$", 4, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1447 AliMedium( 7,"Al honeycomb$", 5, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1448 AliMedium( 8,"Fre$", 6, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1449 AliMedium( 9,"PCB-S$", 2, 1, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1450 AliMedium(10,"Glass$", 7, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1451 AliMedium(11,"Water$", 9, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1452 AliMedium(12,"STEEL$", 10, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
1453
1454}
1455//_____________________________________________________________________________
1456void AliTOFv5T0::Init()
1457{
1458 //
1459 // Initialise the detector after the geometry has been defined
1460 //
1461 AliDebug(1, "**************************************"
1462 " TOF "
1463 "**************************************");
1464 AliDebug(1, " Version 4 of TOF initialing, "
1465 "symmetric TOF - Full Coverage version");
1466
1467 AliTOF::Init();
1468
1469 fIdFTOA = gMC->VolId("FTOA");
1470 if (fTOFHoles) {
1471 fIdFTOB = gMC->VolId("FTOB");
1472 fIdFTOC = gMC->VolId("FTOC");
1473 }
1474 fIdFLTA = gMC->VolId("FLTA");
1475 if (fTOFHoles) {
1476 fIdFLTB = gMC->VolId("FLTB");
1477 fIdFLTC = gMC->VolId("FLTC");
1478 }
1479
1480 AliDebug(1, "**************************************"
1481 " TOF "
1482 "**************************************");
1483}
1484
1485//_____________________________________________________________________________
1486void AliTOFv5T0::StepManager()
1487{
1488
1489 //
1490 // Procedure called at each step in the Time Of Flight
1491 //
1492
1493 TLorentzVector mom, pos;
1494 Float_t xm[3],pm[3],xpad[3],ppad[3];
0dadb22b 1495 Float_t hits[14];
d3c7bfac 1496 Int_t vol[5];
0dadb22b 1497 Int_t sector, plate, padx, padz, strip;
d3c7bfac 1498 Int_t copy, padzid, padxid, stripid, i;
1499 Int_t *idtmed = fIdtmed->GetArray()-499;
1500 Float_t incidenceAngle;
1501
0dadb22b 1502 const char* volpath;
1503
1504 Int_t index = 0;
1505
d3c7bfac 1506 if(
1507 gMC->IsTrackEntering()
1508 && gMC->TrackCharge()
4402e7cb 1509 //&& gMC->GetMedium()==idtmed[508]
1510 && gMC->CurrentMedium()==idtmed[508]
d3c7bfac 1511 && gMC->CurrentVolID(copy)==fIdSens
1512 )
1513 {
1514
0e46b9ae 1515 AliMC *mcApplication = (AliMC*)gAlice->GetMCApp();
1516
1517 AddTrackReference(mcApplication->GetCurrentTrackNumber());
1518 //AddTrackReference(gAlice->GetMCApp()->GetCurrentTrackNumber());
d3c7bfac 1519
1520 // getting information about hit volumes
1521
1522 padzid=gMC->CurrentVolOffID(1,copy);
1523 padz=copy;
1524 padz--;
1525
1526 padxid=gMC->CurrentVolOffID(0,copy);
1527 padx=copy;
1528 padx--;
1529
1530 stripid=gMC->CurrentVolOffID(4,copy);
1531 strip=copy;
1532 strip--;
1533
1534 gMC->TrackPosition(pos);
1535 gMC->TrackMomentum(mom);
1536
1537 Double_t normMom=1./mom.Rho();
1538
1539 // getting the coordinates in pad ref system
1540
1541 xm[0] = (Float_t)pos.X();
1542 xm[1] = (Float_t)pos.Y();
1543 xm[2] = (Float_t)pos.Z();
1544
1545 pm[0] = (Float_t)mom.X()*normMom;
1546 pm[1] = (Float_t)mom.Y()*normMom;
1547 pm[2] = (Float_t)mom.Z()*normMom;
1548
1549 gMC->Gmtod(xm,xpad,1); // from MRS to DRS: coordinates convertion
1550 gMC->Gmtod(pm,ppad,2); // from MRS to DRS: direction cosinus convertion
1551
1552
1553 if (TMath::Abs(ppad[1])>1) {
1554 AliWarning("Abs(ppad) > 1");
1555 ppad[1]=TMath::Sign((Float_t)1,ppad[1]);
1556 }
1557 incidenceAngle = TMath::ACos(ppad[1])*kRaddeg;
1558
0dadb22b 1559 plate = -1;
d3c7bfac 1560 if (strip < fTOFGeometry->NStripC()) {
1561 plate = 0;
1562 //strip = strip;
1563 }
1564 else if (strip >= fTOFGeometry->NStripC() &&
1565 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB()) {
1566 plate = 1;
1567 strip = strip - fTOFGeometry->NStripC();
1568 }
1569 else if (strip >= fTOFGeometry->NStripC() + fTOFGeometry->NStripB() &&
1570 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA()) {
1571 plate = 2;
1572 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB();
1573 }
1574 else if (strip >= fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA() &&
1575 strip < fTOFGeometry->NStripC() + fTOFGeometry->NStripB() + fTOFGeometry->NStripA() + fTOFGeometry->NStripB()) {
1576 plate = 3;
1577 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB() - fTOFGeometry->NStripA();
1578 }
1579 else {
1580 plate = 4;
1581 strip = strip - fTOFGeometry->NStripC() - fTOFGeometry->NStripB() - fTOFGeometry->NStripA() - fTOFGeometry->NStripB();
1582 }
1583
06e24a91 1584 volpath=gMC->CurrentVolOffName(7);
1585 index=atoi(&volpath[4]);
0dadb22b 1586 sector=-1;
96c2b15b 1587 sector=index;
1588
1589 //Old 6h convention
1590 // if(index<5){
1591 // sector=index+13;
1592 // }
1593 // else{
1594 // sector=index-5;
1595 // }
06e24a91 1596
d3c7bfac 1597 for(i=0;i<3;++i) {
1598 hits[i] = pos[i];
1599 hits[i+3] = pm[i];
1600 }
1601
1602 hits[6] = mom.Rho();
1603 hits[7] = pos[3];
1604 hits[8] = xpad[0];
1605 hits[9] = xpad[1];
1606 hits[10]= xpad[2];
1607 hits[11]= incidenceAngle;
1608 hits[12]= gMC->Edep();
1609 hits[13]= gMC->TrackLength();
1610
1611 vol[0]= sector;
1612 vol[1]= plate;
1613 vol[2]= strip;
1614 vol[3]= padx;
1615 vol[4]= padz;
1616
0e46b9ae 1617 AddT0Hit(mcApplication->GetCurrentTrackNumber(),vol, hits);
1618 //AddT0Hit(gAlice->GetMCApp()->GetCurrentTrackNumber(),vol, hits);
d3c7bfac 1619 }
1620}
1621//-------------------------------------------------------------------
7aeeaf38 1622void AliTOFv5T0::MaterialMixer(Float_t* p,Float_t* a,Float_t* m,Float_t* d,Float_t* s,Int_t n) const
1623{
d3c7bfac 1624 // a[] atomic weights vector (in)
1625 // (atoms present in more compound appear separately)
1626 // m[] number of corresponding atoms in the mixture (in)
1627 // d[] fraction of the compound relative to the corresponding atoms (in)
1628 // s[] further possible weights " " " " (in)
1629 Float_t t = 0.;
1630 for (Int_t i = 0; i < n; ++i) {
1631 p[i] = a[i]*m[i]*d[i]*s[i];
1632 t += p[i];
1633 }
1634 for (Int_t i = 0; i < n; ++i) {
1635 p[i] = p[i]/t;
1636 // AliInfo(Form((\n weight[%i] = %f (,i,p[i]));
1637 }
1638}