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