]> git.uio.no Git - u/mrichter/AliRoot.git/blame_incremental - TOF/AliTOFv5T0.cxx
clustering parameter is set to decide the clustering algo
[u/mrichter/AliRoot.git] / TOF / AliTOFv5T0.cxx
... / ...
CommitLineData
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$
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
21Revision 1.21 2007/10/04 13:15:30 arcelli
22updates to comply with AliTOFGeometryV5 becoming AliTOFGeometry
23
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
27Revision 1.19 2007/10/03 10:41:12 arcelli
28adding tracking-to-local matrices for new AliTOFcluster
29
30Revision 1.18 2007/07/27 08:14:48 morsch
31Write all track references into the same branch.
32
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
36Revision 1.16 2007/05/04 12:59:26 arcelli
37Change the TOF SM paths for misalignment (one layer up)
38
39Revision 1.15 2007/02/19 15:41:55 decaro
40Coding convention: few corrections
41
42Revision 1.14 2006/10/17 15:33:14 arcelli
43Moving some printout from Info to Debug level
44
45Revision 1.13 2006/10/12 16:35:43 arcelli
46definition of the alignable volumes symbolic names added
47
48Revision 1.12 2006/08/22 13:34:46 arcelli
49removal of effective c++ warnings (C.Zampolli)
50
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
54Revision 1.10 2006/05/10 18:40:17 hristov
55Larger strings for the names
56
57Revision 1.9 2006/05/04 19:41:42 hristov
58Possibility for partial TOF geometry (S.Arcelli)
59
60Revision 1.8 2006/04/20 22:30:50 hristov
61Coding conventions (Annalisa)
62
63Revision 1.7 2006/04/16 22:29:05 hristov
64Coding conventions (Annalisa)
65
66Revision 1.6 2006/03/20 08:20:35 decaro
67Al layer: positioning correction
68
69Revision 1.5 2006/03/20 07:54:20 decaro
70Correction of some layer thickness
71
72Revision 1.4 2006/03/13 12:35:44 decaro
73Suppression of fractional Z warning
74
75Revision 1.3 2006/02/28 10:38:00 decaro
76AliTOFGeometry::fAngles, AliTOFGeometry::fHeights,
77AliTOFGeometry::fDistances arrays: dimension definition in the right
78location
79
80Revision 1.2 2006/02/27 18:12:14 decaro
81Remove in StepManager the dependence of hit indexes from parametrized
82TOF position
83
84Revision 1.1 2005/12/15 08:55:33 decaro
85New TOF geometry description (V5) -G. Cara Romeo and A. De Caro
86
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
115#include <TDirectory.h>
116#include <TGeoGlobalMagField.h>
117#include <TGeoManager.h>
118#include <TGeoMatrix.h>
119#include <TGeoPhysicalNode.h>
120#include <TGeoVolume.h>
121#include <TLorentzVector.h>
122#include <TVirtualMC.h>
123
124#include "AliConst.h"
125#include "AliGeomManager.h"
126#include "AliLog.h"
127#include "AliMagF.h"
128#include "AliMC.h"
129#include "AliRun.h"
130#include "AliTrackReference.h"
131
132#include "AliTOFGeometry.h"
133#include "AliTOFv5T0.h"
134
135extern TDirectory *gDirectory;
136extern TVirtualMC *gMC;
137extern TGeoManager *gGeoManager;
138
139extern AliRun *gAlice;
140
141ClassImp(AliTOFv5T0)
142
143//_____________________________________________________________________________
144 AliTOFv5T0::AliTOFv5T0():
145 fIdFTOA(-1),
146 fIdFTOB(-1),
147 fIdFTOC(-1),
148 fIdFLTA(-1),
149 fIdFLTB(-1),
150 fIdFLTC(-1)//,
151 //fTOFHoles(kFALSE)
152{
153 //
154 // Default constructor
155 //
156}
157
158//_____________________________________________________________________________
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),
166 fIdFLTC(-1)//,
167 //fTOFHoles(kFALSE)
168{
169 //
170 // Standard constructor
171 //
172 //
173 // Check that FRAME is there otherwise we have no place where to
174 // put TOF
175
176 /*
177 AliModule* frame = (AliModule*)gAlice->GetModule("FRAME");
178 if(!frame) {
179 AliFatal("TOF needs FRAME to be present");
180 } else{
181
182 if (fTOFGeometry) delete fTOFGeometry;
183 fTOFGeometry = new AliTOFGeometry();
184
185 if(frame->IsVersion()==1) {
186 AliDebug(1,Form("Frame version %d", frame->IsVersion()));
187 AliDebug(1,"Full Coverage for TOF");
188 fTOFHoles=false;}
189 else {
190 AliDebug(1,Form("Frame version %d", frame->IsVersion()));
191 AliDebug(1,"TOF with Holes for PHOS");
192 fTOFHoles=true;}
193 }
194 fTOFGeometry->SetHoles(fTOFHoles);
195 */
196
197 if (fTOFGeometry) delete fTOFGeometry;
198 fTOFGeometry = new AliTOFGeometry();
199 fTOFGeometry->SetHoles(fTOFHoles);
200
201 //AliTOF::fTOFGeometry = fTOFGeometry;
202
203 // Save the geometry
204 TDirectory* saveDir = gDirectory;
205 AliRunLoader::Instance()->CdGAFile();
206 fTOFGeometry->Write("TOFgeometry");
207 saveDir->cd();
208
209}
210
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
220 AliGeomManager::ELayerID idTOF = AliGeomManager::kTOF;
221 Int_t modUID, modnum=0;
222
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++) {
250
251 modUID = AliGeomManager::LayerToVolUID(idTOF,modnum++);
252 if (fTOFSectors[isect]==-1) continue;
253
254 if (fTOFHoles && (isect==13 || isect==14 || isect==15)) {
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
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
291 if(!gGeoManager->SetAlignableEntry(symName.Data(),volPath.Data(),modUID))
292 AliError(Form("Alignable entry %s not set",symName.Data()));
293
294 //T2L matrices for alignment
295 TGeoPNEntry *e = gGeoManager->GetAlignableEntryByUID(modUID);
296 if (e) {
297 TGeoHMatrix *globMatrix = e->GetGlobalOrig();
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 }
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;
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}
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{
363 //
364 // Definition of the Time Of Fligh Resistive Plate Chambers
365 //
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
377 // Al layers over all internal module walls (cm)
378 const Float_t khAlWall = 0.03;
379
380 // module wall thickness (cm)
381 const Float_t kModuleWallThickness = 0.3;
382
383 // Al honeycomb layer between strips and cards (cm)
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
392 Float_t xcoor, ycoor, zcoor;
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) {
403 par[0] = xtof * 0.5;
404 par[1] = ytof * 0.5;
405 par[2] = (zlenA*0.5 - kInterCentrModBorder1)*0.5;
406 gMC->Gsvolu("FTOB", "BOX ", idtmed[503], par, 3); // fibre glass
407 gMC->Gsvolu("FTOC", "BOX ", idtmed[503], par, 3); // fibre glass
408 }
409
410 // Positioning of fibre glass modules (FTOA, FTOB and FTOC)
411
412 //AliMatrix(idrotm[0], 90., 0., 0., 0., 90.,-90.);
413 AliMatrix(idrotm[0], 90., 0., 0., 0., 90.,270.);
414
415 xcoor = 0.;
416 ycoor = 0.;
417 zcoor = 0.;
418 for(Int_t isec=0;isec<18;isec++){
419 if(fTOFSectors[isec]==-1)continue;
420 char name[16];
421 sprintf(name, "BTOF%d",isec);
422 if (fTOFHoles && (isec==13 || isec==14 || isec==15)) {
423 // if (fTOFHoles && (isec==16||isec==17)) { \\Old 6h convention
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 }
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
437 }
438 // Large not sensitive volumes with Insensitive Freon (FLTA, FLTB and FLTC)
439
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;
448 par[2] = zFLTA*0.5;
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");
455
456 if (fTOFHoles) {
457 par[0] = xFLT*0.5;
458 par[1] = yFLT*0.5;
459 par[2] = (zlenA*0.5 - kInterCentrModBorder1-kModuleWallThickness)*0.5;
460 gMC->Gsvolu("FLTB", "BOX ", idtmed[507], par, 3); // Freon mix
461 gMC->Gsvolu("FLTC", "BOX ", idtmed[507], par, 3); // Freon mix
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");
468 }
469
470 // Layer of Aluminum before detector (FALA, FALB and FALC)
471
472 par[0] = xFLT*0.5;
473 par[1] = khAlWall*0.5;
474 par[2] = kInterCentrModBorder1 - (kModuleWallThickness + khAlWall);
475 gMC->Gsvolu("FALA", "BOX ", idtmed[505], par, 3); // Alluminium
476
477 xcoor = 0.;
478 ycoor = (-yFLT + khAlWall)*0.5;
479 zcoor = 0.;
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");
503
504 if (fTOFHoles) {
505 xcoor = 0.;
506 ycoor = (-yFLT + khAlWall)*0.5;
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");
516 }
517
518 Float_t y0, alpha, tgal, beta, tgbe, trpa[11];
519
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;
525 tgbe = TMath::Tan(beta);
526 trpa[0] = xFLT*0.5;
527 trpa[1] = 0.;
528 trpa[2] = 0.;
529 trpa[3] = kModuleWallThickness;
530 trpa[4] = (kLengthInCeModBorder - kModuleWallThickness*tgbe)*0.5;
531 trpa[5] = (kLengthInCeModBorder + kModuleWallThickness*tgbe)*0.5;
532 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
533 trpa[7] = kModuleWallThickness;
534 trpa[8] = (kLengthInCeModBorder - kModuleWallThickness*tgbe)*0.5;
535 trpa[9] = (kLengthInCeModBorder + kModuleWallThickness*tgbe)*0.5;
536 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
537 gMC->Gsvolu("FWZ1","TRAP", idtmed[503], trpa, 11); // fibre glass
538
539 AliMatrix (idrotm[1],90., 90.,180.,0.,90.,180.);
540 AliMatrix (idrotm[4],90., 90., 0.,0.,90., 0.);
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");
547
548 if (fTOFHoles) {
549 y0 = kLengthInCeModBorder - kModuleWallThickness*0.5*tgbe;
550 trpa[0] = xFLT*0.5;
551 trpa[1] = 0.;
552 trpa[2] = 0.;
553 trpa[3] = kModuleWallThickness*0.5;
554 trpa[4] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
555 trpa[5] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
556 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
557 trpa[7] = kModuleWallThickness*0.5;
558 trpa[8] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
559 trpa[9] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
560 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
561 gMC->Gsvolu("FZ1B","TRAP", idtmed[503], trpa, 11); // fibre glass
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");
568 }
569
570 AliMatrix (idrotm[2],90.,270., 0.,0.,90.,180.);
571 AliMatrix (idrotm[5],90.,270.,180.,0.,90., 0.);
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");
578
579 if (fTOFHoles) {
580 y0 = kLengthInCeModBorder + kModuleWallThickness*0.5*tgbe;
581 trpa[0] = xFLT*0.5;
582 trpa[1] = 0.;
583 trpa[2] = 0.;
584 trpa[3] = kModuleWallThickness*0.5;
585 trpa[4] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
586 trpa[5] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
587 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
588 trpa[7] = kModuleWallThickness*0.5;
589 trpa[8] = (y0 - kModuleWallThickness*0.5*tgbe)*0.5;
590 trpa[9] = (y0 + kModuleWallThickness*0.5*tgbe)*0.5;
591 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
592 gMC->Gsvolu("FZ1C","TRAP", idtmed[503], trpa, 11); // fibre glass
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");
599 }
600
601 trpa[0] = 0.5*(kInterCentrModBorder2 - kInterCentrModBorder1)/TMath::Cos(alpha);
602 trpa[1] = kModuleWallThickness;
603 trpa[2] = xFLT*0.5;
604 trpa[3] = -beta*kRaddeg;
605 trpa[4] = 0.;
606 trpa[5] = 0.;
607 gMC->Gsvolu("FWZ2","PARA", idtmed[503], trpa, 6); // fibre glass
608
609 AliMatrix (idrotm[3], alpha*kRaddeg,90.,90.+alpha*kRaddeg,90.,90.,180.);
610 AliMatrix (idrotm[6],180.-alpha*kRaddeg,90.,90.-alpha*kRaddeg,90.,90., 0.);
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");
617
618 if (fTOFHoles) {
619 trpa[0] = 0.5*(kInterCentrModBorder2 - kInterCentrModBorder1)/TMath::Cos(alpha);
620 trpa[1] = kModuleWallThickness*0.5;
621 trpa[2] = xFLT*0.5;
622 trpa[3] = -beta*kRaddeg;
623 trpa[4] = 0.;
624 trpa[5] = 0.;
625 gMC->Gsvolu("FZ2B","PARA", idtmed[503], trpa, 6); // fibre glass
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");
632 }
633
634 // Fibre glass walls between intermediate and lateral modules (FWZ3 and FWZ4)
635
636 tgal = (yFLT*0.5 - 2.*kLengthExInModBorder)/(kExterInterModBorder2 - kExterInterModBorder1);
637 alpha = TMath::ATan(tgal);
638 beta = (kPi*0.5 - alpha)*0.5;
639 tgbe = TMath::Tan(beta);
640 trpa[0] = xFLT*0.5;
641 trpa[1] = 0.;
642 trpa[2] = 0.;
643 trpa[3] = kModuleWallThickness;
644 trpa[4] = (kLengthExInModBorder - kModuleWallThickness*tgbe)*0.5;
645 trpa[5] = (kLengthExInModBorder + kModuleWallThickness*tgbe)*0.5;
646 trpa[6] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
647 trpa[7] = kModuleWallThickness;
648 trpa[8] = (kLengthExInModBorder - kModuleWallThickness*tgbe)*0.5;
649 trpa[9] = (kLengthExInModBorder + kModuleWallThickness*tgbe)*0.5;
650 trpa[10] = TMath::ATan(tgbe*0.5)*kRaddeg; //TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*kRaddeg;
651 gMC->Gsvolu("FWZ3","TRAP", idtmed[503], trpa, 11); // fibre glass
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");
658
659 if (fTOFHoles) {
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");
665 }
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");
672
673 if (fTOFHoles) {
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");
679 }
680
681 trpa[0] = 0.5*(kExterInterModBorder2 - kExterInterModBorder1)/TMath::Cos(alpha);
682 trpa[1] = kModuleWallThickness;
683 trpa[2] = xFLT*0.5;
684 trpa[3] = -beta*kRaddeg;
685 trpa[4] = 0.;
686 trpa[5] = 0.;
687 gMC->Gsvolu("FWZ4","PARA", idtmed[503], trpa, 6); // fibre glass
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");
697
698 if (fTOFHoles) {
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");
704 }
705
706
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
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
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
733 const Float_t khsensmy = 0.05;//0.11;//0.16;// heigth of Sensitive Layer
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)
742 const Float_t klstripx = fTOFGeometry->StripLength();
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
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 /*
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");
832 */
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;
842 Float_t xpos, zpos, ypos, ang;
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
854 xpos = 0.;
855 zpos = fTOFGeometry->GetDistances(iplate,istrip);
856 ypos = fTOFGeometry->GetHeights(iplate,istrip);
857
858 gMC->Gspos("FSTR",istrip+totalStrip+1,"FLTA", xpos, ypos,-zpos,idrotm[istrip+totalStrip+1], "ONLY");
859
860 if (fTOFHoles) {
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");
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;
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");
877
878 if (fTOFHoles) {
879 par[0] = xFLT*0.5;
880 par[1] = kHoneycombLayerThickness*0.5;
881 par[2] = (zlenA*0.5 - kInterCentrModBorder2-kModuleWallThickness)*0.5;
882 gMC->Gsvolu("FPEB", "BOX ", idtmed[506], par, 3); // Al honeycomb
883
884 xcoor = 0.;
885 ycoor = kHoneycombLayerThickness*0.5;
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");
889 }
890
891 // frame of Air
892 par[0] = xFLT*0.5;
893 par[1] = (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
894 par[2] = zFLTA *0.5;
895 gMC->Gsvolu("FAIA", "BOX ", idtmed[500], par, 3); // Air
896
897 xcoor = 0.;
898 ycoor = kHoneycombLayerThickness + (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
899 zcoor = 0.;
900 gMC->Gspos ("FAIA", 0, "FLTA", xcoor, ycoor, zcoor, 0, "ONLY");
901
902 if (fTOFHoles) {
903 par[0] = xFLT*0.5;
904 par[1] = (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
905 par[2] = (zlenA*0.5 - kInterCentrModBorder2 - kModuleWallThickness)*0.5;
906 gMC->Gsvolu("FAIB", "BOX ", idtmed[500], par, 3); // Air
907 gMC->Gsvolu("FAIC", "BOX ", idtmed[500], par, 3); // Air
908
909 xcoor = 0.;
910 ycoor = kHoneycombLayerThickness + (yFLT*0.5 - kHoneycombLayerThickness)*0.5;
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");
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
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;
954 Float_t stepforcardA = 6.625;
955 Float_t tdis = 0.6;
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//_____________________________________________________________________________
1115void AliTOFv5T0::DrawDetectorModules() const
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//_____________________________________________________________________________
1181void AliTOFv5T0::DrawDetectorStrips() const
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
1314 AliMagF *magneticField = (AliMagF*)((AliMagF*)TGeoGlobalMagField::Instance()->GetField());
1315
1316 Int_t isxfld = magneticField->Integ();
1317 Float_t sxmgmx = magneticField->Max();
1318
1319 Float_t we[7], ae[7], na[7], fr[7], vl[7];
1320 Int_t i;
1321
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
1399 //char namat[15] = " ";
1400 //Float_t ama[2], zma[2], dma, radl, absl, buf[1];
1401 //Int_t nbuf;
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);
1411 /*
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);
1421 */
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);
1443 //AliMedium( 5,"glass-freon$", 8, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
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];
1493 Float_t hits[14];
1494 Int_t vol[5];
1495 Int_t sector, plate, padx, padz, strip;
1496 Int_t copy, padzid, padxid, stripid, i;
1497 Int_t *idtmed = fIdtmed->GetArray()-499;
1498 Float_t incidenceAngle;
1499
1500 const char* volpath;
1501
1502 Int_t index = 0;
1503
1504 if(
1505 gMC->IsTrackEntering()
1506 && gMC->TrackCharge()
1507 //&& gMC->GetMedium()==idtmed[508]
1508 && gMC->CurrentMedium()==idtmed[508]
1509 && gMC->CurrentVolID(copy)==fIdSens
1510 )
1511 {
1512
1513 AliMC *mcApplication = (AliMC*)gAlice->GetMCApp();
1514
1515 AddTrackReference(mcApplication->GetCurrentTrackNumber(), AliTrackReference::kTOF);
1516 //AddTrackReference(gAlice->GetMCApp()->GetCurrentTrackNumber());
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
1557 plate = -1;
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
1582 volpath=gMC->CurrentVolOffName(7);
1583 index=atoi(&volpath[4]);
1584 sector=-1;
1585 sector=index;
1586
1587 //Old 6h convention
1588 // if(index<5){
1589 // sector=index+13;
1590 // }
1591 // else{
1592 // sector=index-5;
1593 // }
1594
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
1615 AddT0Hit(mcApplication->GetCurrentTrackNumber(),vol, hits);
1616 //AddT0Hit(gAlice->GetMCApp()->GetCurrentTrackNumber(),vol, hits);
1617 }
1618}
1619//-------------------------------------------------------------------
1620void AliTOFv5T0::MaterialMixer(Float_t* p,Float_t* a,Float_t* m,Float_t* d,Float_t* s,Int_t n) const
1621{
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}