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