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