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