Work continues.
[u/mrichter/AliRoot.git] / ITS / AliITSv11.cxx
CommitLineData
2b680d9b 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$
2cf828ba 18Revision 1.4 2003/01/29 16:01:14 nilsen
19Update today's work.
20
db708caf 21Revision 1.3 2003/01/28 17:59:54 nilsen
22Work continuing.
23
3717ba94 24Revision 1.2 2003/01/26 14:35:15 nilsen
25Some more geometry interface functions added and a start at the SSD support
26cone geometry. Committed to allow easy updates of partical work between authors.
27
dfefbaec 28Revision 1.1 2003/01/20 23:32:49 nilsen
29New ITS geometry. Only a Skeleton for now.
30
2b680d9b 31$Id$
32*/
33
34//////////////////////////////////////////////////////////////////////////////
35// //
36// Inner Traking System version 11 //
37// This class contains the base procedures for the Inner Tracking System //
38// //
39// Authors: R. Barbera //
40// version 6. //
41// Created 2000. //
42// //
43// NOTE: THIS IS THE SYMMETRIC PPR geometry of the ITS. //
44// THIS WILL NOT WORK //
45// with the geometry or module classes or any analysis classes. You are //
46// strongly encouraged to uses AliITSv5. //
47// //
48//////////////////////////////////////////////////////////////////////////////
49// See AliITSv11::StepManager().
50#include <Riostream.h>
51#include <stdio.h>
52#include <stdlib.h>
53#include <TMath.h>
54#include <TGeometry.h>
55#include <TNode.h>
56#include <TTUBE.h>
57#include <TTUBS.h>
58#include <TPCON.h>
59#include <TFile.h> // only required for Tracking function?
60#include <TCanvas.h>
61#include <TObjArray.h>
62#include <TLorentzVector.h>
63#include <TObjString.h>
64#include <TClonesArray.h>
65#include <TBRIK.h>
66#include <TSystem.h>
67
68
69#include "AliRun.h"
70#include "AliMagF.h"
71#include "AliConst.h"
72#include "AliITSGeant3Geometry.h"
73#include "AliITShit.h"
74#include "AliITS.h"
75#include "AliITSv11.h"
76#include "AliITSgeom.h"
77#include "AliITSgeomSPD.h"
78#include "AliITSgeomSDD.h"
79#include "AliITSgeomSSD.h"
80#include "AliITSDetType.h"
81#include "AliITSresponseSPD.h"
82#include "AliITSresponseSDD.h"
83#include "AliITSresponseSSD.h"
84#include "AliITSsegmentationSPD.h"
85#include "AliITSsegmentationSDD.h"
86#include "AliITSsegmentationSSD.h"
87#include "AliITSsimulationSPD.h"
88#include "AliITSsimulationSDD.h"
89#include "AliITSsimulationSSD.h"
90#include "AliITSClusterFinderSPD.h"
91#include "AliITSClusterFinderSDD.h"
92#include "AliITSClusterFinderSSD.h"
93
94
95ClassImp(AliITSv11)
96
97//______________________________________________________________________
98AliITSv11::AliITSv11() : AliITS() {
dfefbaec 99 ////////////////////////////////////////////////////////////////////////
100 // Standard default constructor for the ITS version 11.
101 ////////////////////////////////////////////////////////////////////////
2b680d9b 102}
103//______________________________________________________________________
104AliITSv11::AliITSv11(const char *title) : AliITS("ITS", title){
dfefbaec 105 ////////////////////////////////////////////////////////////////////////
106 // Standard constructor for the ITS version 11.
107 ////////////////////////////////////////////////////////////////////////
2b680d9b 108}
109//______________________________________________________________________
110AliITSv11::~AliITSv11() {
dfefbaec 111 ////////////////////////////////////////////////////////////////////////
112 // Standard destructor for the ITS version 11.
113 ////////////////////////////////////////////////////////////////////////
2b680d9b 114}
115//______________________________________________________________________
116void AliITSv11::Box(const char gnam[3],const TString &dis,
117 Double_t dx,Double_t dy,Double_t dz,Int_t med){
118 // Interface to TMC->Gsvolu() for ITS bos geometries. Box with faces
119 // perpendicular to the axes. It has 3 paramters. See SetScale() for
120 // units. Default units are geant 3 [cm].
121 // Inputs:
122 // const char gnam[3] 3 character geant volume name. The letter "I"
123 // is appended to the front to indecate that this
124 // is an ITS volume.
125 // TString &dis String containging part discription.
126 // Double_t dx half-length of box in x-axis
127 // Double_t dy half-length of box in y-axis
128 // Double_t dz half-length of box in z-axis
129 // Int_t med media index number.
130 // Output:
131 // none.
132 // Return.
133 // none.
134 char name[4];
135 Float_t param[3];
136
137 param[0] = fScale*dx;
138 param[1] = fScale*dy;
139 param[2] = fScale*dz;
140 name[0] = 'I';
141 for(Int_t i=0;i<3;i++) name[i+1] = gnam[i];
142 gMC->Gsvolu(name,"BOX ",fidmed[med],param,3);
143}
144//______________________________________________________________________
145void AliITSv11::Trapezoid1(const char gnam[3],const TString &dis,
146 Double_t dxn,Double_t dxp,Double_t dy,Double_t dz,
147 Int_t med){
148 // Interface to TMC->Gsvolu() for ITS TRD1 geometries. Trapezoid with the
149 // x dimension varing along z. It has 4 parameters. See SetScale() for
150 // units. Default units are geant 3 [cm].
151 // Inputs:
152 // const char gnam[3] 3 character geant volume name. The letter "I"
153 // is appended to the front to indecate that this
154 // is an ITS volume.
155 // TString &dis String containging part discription.
156 // Double_t dxn half-length along x at the z surface positioned
157 // at -DZ
158 // Double_t dxp half-length along x at the z surface positioned
159 // at +DZ
160 // Double_t dy half-length along the y-axis
161 // Double_t dz half-length along the z-axis
162 // Int_t med media index number.
163 // Output:
164 // none.
165 // Return.
166 // none.
167 char name[4];
168 Float_t param[4];
169
170 param[0] = fScale*dxn;
171 param[1] = fScale*dxp;
172 param[2] = fScale*dy;
173 param[3] = fScale*dz;
174 name[0] = 'I';
175 for(Int_t i=0;i<3;i++) name[i+1] = gnam[i];
176 gMC->Gsvolu(name,"TRD1",fidmed[med],param,4);
177}
178//______________________________________________________________________
179void AliITSv11::Trapezoid2(const char gnam[3],const TString &dis,Double_t dxn,
180 Double_t dxp,Double_t dyn,Double_t dyp,Double_t dz,
181 Int_t med){
182 // Interface to TMC->Gsvolu() for ITS TRD2 geometries. Trapezoid with the
183 // x and y dimension varing along z. It has 5 parameters. See SetScale()
184 // for units. Default units are geant 3 [cm].
185 // Inputs:
186 // const char gnam[3] 3 character geant volume name. The letter "I"
187 // is appended to the front to indecate that this
188 // is an ITS volume.
189 // TString &dis String containging part discription.
190 // Double_t dxn half-length along x at the z surface positioned
191 // at -DZ
192 // Double_t dxp half-length along x at the z surface positioned
193 // at +DZ
194 // Double_t dyn half-length along x at the z surface positioned
195 // at -DZ
196 // Double_t dyp half-length along x at the z surface positioned
197 // at +DZ
198 // Double_t dz half-length along the z-axis
199 // Int_t med media index number.
200 // Output:
201 // none.
202 // Return.
203 // none.
204 char name[4];
205 Float_t param[5];
206
207 param[0] = fScale*dxn;
208 param[1] = fScale*dxp;
209 param[2] = fScale*dyn;
210 param[3] = fScale*dyp;
211 param[4] = fScale*dz;
212 name[0] = 'I';
213 for(Int_t i=0;i<3;i++) name[i+1] = gnam[i];
214 gMC->Gsvolu(name,"TRD2",fidmed[med],param,5);
215}
216//______________________________________________________________________
217void AliITSv11::Trapezoid(const char gnam[3],const TString &dis,Double_t dz,
218 Double_t thet,Double_t phi,Double_t h1,Double_t bl1,
219 Double_t tl1,Double_t alp1,Double_t h2,Double_t bl2,
220 Double_t tl2,Double_t alp2,Int_t med){
221 // Interface to TMC->Gsvolu() for ITS TRAP geometries. General Trapezoid,
222 // The faces perpendicular to z are trapezia and their centers are not
223 // necessarily on a line parallel to the z axis. This shape has 11
224 // parameters, but only cosidering that the faces should be planar, only 9
225 // are really independent. A check is performed on the user parameters and
226 // a message is printed in case of non-planar faces. Ignoring this warning
227 // may cause unpredictable effects at tracking time. See SetScale()
228 // for units. Default units are geant 3 [cm].
229 // Inputs:
230 // const char gnam[3] 3 character geant volume name. The letter "I"
231 // is appended to the front to indecate that this
232 // is an ITS volume.
233 // TString &dis String containging part discription.
234 // Double_t dz Half-length along the z-asix
235 // Double_t thet Polar angle of the line joing the center of the
236 // face at -dz to the center of the one at dz
237 // [degree].
238 // Double_t phi aximuthal angle of the line joing the center of
239 // the face at -dz to the center of the one at +dz
240 // [degree].
241 // Double_t h1 half-length along y of the face at -dz.
242 // Double_t bl1 half-length along x of the side at -h1 in y of
243 // the face at -dz in z.
244 // Double_t tl1 half-length along x of teh side at +h1 in y of
245 // the face at -dz in z.
246 // Double_t alp1 angle with respect to the y axis from the center
247 // of the side at -h1 in y to the cetner of the
248 // side at +h1 in y of the face at -dz in z
249 // [degree].
250 // Double_t h2 half-length along y of the face at +dz
251 // Double_t bl2 half-length along x of the side at -h2 in y of
252 // the face at +dz in z.
253 // Double_t tl2 half-length along x of the side at _h2 in y of
254 // the face at +dz in z.
255 // Double_t alp2 angle with respect to the y axis from the center
256 // of the side at -h2 in y to the center of the
257 // side at +h2 in y of the face at +dz in z
258 // [degree].
259 // Int_t med media index number.
260 // Output:
261 // none.
262 // Return.
263 // none.
264 char name[4];
265 Float_t param[11];
266
267 param[0] = fScale*dz;
268 param[1] = thet;
269 param[2] = phi;
270 param[3] = fScale*h1;
271 param[4] = fScale*bl1;
272 param[5] = fScale*tl1;
273 param[6] = alp1;
274 param[7] = fScale*h2;
275 param[8] = fScale*bl2;
276 param[9] = fScale*tl2;
277 param[10] = alp2;
278 name[0] = 'I';
279 for(Int_t i=0;i<3;i++) name[i+1] = gnam[i];
280 gMC->Gsvolu(name,"TRAP",fidmed[med],param,11);
281}
282//______________________________________________________________________
283void AliITSv11::Tube(const char gnam[3],const TString &dis,Double_t rmin,
284 Double_t rmax,Double_t dz,Int_t med){
285 // Interface to TMC->Gsvolu() for ITS TUBE geometries. Simple Tube. It has
286 // 3 parameters. See SetScale()
287 // for units. Default units are geant 3 [cm].
288 // Inputs:
289 // const char gnam[3] 3 character geant volume name. The letter "I"
290 // is appended to the front to indecate that this
291 // is an ITS volume.
292 // TString &dis String containging part discription.
293 // Double_t rmin Inside Radius.
294 // Double_t rmax Outside Radius.
295 // Double_t dz half-length along the z-axis
296 // Int_t med media index number.
297 // Output:
298 // none.
299 // Return.
300 // none.
301 char name[4];
302 Float_t param[3];
303
304 param[0] = fScale*rmin;
305 param[1] = fScale*rmax;
306 param[2] = fScale*dz;
307 name[0] = 'I';
308 for(Int_t i=0;i<3;i++) name[i+1] = gnam[i];
309 gMC->Gsvolu(name,"TUBE",fidmed[med],param,3);
310}
311//______________________________________________________________________
312void AliITSv11::TubeSegment(const char gnam[3],const TString &dis,
313 Double_t rmin,Double_t rmax,Double_t dz,
314 Double_t phi1,Double_t phi2,Int_t med){
315 // Interface to TMC->Gsvolu() for ITS TUBE geometries. Phi segment of a
316 // tube. It has 5 parameters. Phi1 should be smaller than phi2. If this is
317 // not the case, the system adds 360 degrees to phi2. See SetScale()
318 // for units. Default units are geant 3 [cm].
319 // Inputs:
320 // const char gnam[3] 3 character geant volume name. The letter "I"
321 // is appended to the front to indecate that this
322 // is an ITS volume.
323 // TString &dis String containging part discription.
324 // Double_t rmin Inside Radius.
325 // Double_t rmax Outside Radius.
326 // Double_t dz half-length along the z-axis
327 // Double_t phi1 Starting angle of the segment [degree].
328 // Double_t phi2 Ending angle of the segment [degree].
329 // Int_t med media index number.
330 // Output:
331 // none.
332 // Return.
333 // none.
334 char name[4];
335 Float_t param[5];
336
337 param[0] = fScale*rmin;
338 param[1] = fScale*rmax;
339 param[2] = fScale*dz;
340 param[3] = phi1;
341 param[4] = phi2;
342 name[0] = 'I';
343 for(Int_t i=0;i<3;i++) name[i+1] = gnam[i];
344 gMC->Gsvolu(name,"TUBS",fidmed[med],param,5);
345}
346//______________________________________________________________________
347void AliITSv11::Cone(const char gnam[3],const TString &dis,Double_t dz,
348 Double_t rmin1,Double_t rmax1,Double_t rmin2,
349 Double_t rmax2,Int_t med){
350 // Interface to TMC->Gsvolu() for ITS Cone geometries. Conical tube. It
351 // has 5 parameters. See SetScale()
352 // for units. Default units are geant 3 [cm].
353 // Inputs:
354 // const char gnam[3] 3 character geant volume name. The letter "I"
355 // is appended to the front to indecate that this
356 // is an ITS volume.
357 // TString &dis String containging part discription.
358 // Double_t dz half-length along the z-axis
359 // Double_t rmin1 Inside Radius at -dz.
360 // Double_t rmax1 Outside Radius at -dz.
361 // Double_t rmin2 inside radius at +dz.
362 // Double_t rmax2 outside radius at +dz.
363 // Int_t med media index number.
364 // Output:
365 // none.
366 // Return.
367 // none.
368 char name[4];
369 Float_t param[5];
370
371 param[0] = fScale*dz;
372 param[1] = fScale*rmin1;
373 param[2] = fScale*rmax1;
374 param[3] = fScale*rmin2;
375 param[4] = fScale*rmax2;
376 name[0] = 'I';
377 for(Int_t i=0;i<3;i++) name[i+1] = gnam[i];
378 gMC->Gsvolu(name,"CONS",fidmed[med],param,5);
379}
380//______________________________________________________________________
381void AliITSv11::ConeSegment(const char gnam[3],const TString &dis,Double_t dz,
382 Double_t rmin1,Double_t rmax1,Double_t rmin2,
383 Double_t rmax2,Double_t phi1,Double_t phi2,
384 Int_t med){
385 // Interface to TMC->Gsvolu() for ITS ConS geometries. One segment of a
386 // conical tube. It has 7 parameters. Phi1 should be smaller than phi2. If
387 // this is not the case, the system adds 360 degrees to phi2. See
388 // SetScale() for units. Default units are geant 3 [cm].
389 // Inputs:
390 // const char gnam[3] 3 character geant volume name. The letter "I"
391 // is appended to the front to indecate that this
392 // is an ITS volume.
393 // TString &dis String containging part discription.
394 // Double_t dz half-length along the z-axis
395 // Double_t rmin1 Inside Radius at -dz.
396 // Double_t rmax1 Outside Radius at -dz.
397 // Double_t rmin2 inside radius at +dz.
398 // Double_t rmax2 outside radius at +dz.
399 // Double_t phi1 Starting angle of the segment [degree].
400 // Double_t phi2 Ending angle of the segment [degree].
401 // Int_t med media index number.
402 // Output:
403 // none.
404 // Return.
405 // none.
406 char name[4];
407 Float_t param[7];
408
409 param[0] = fScale*dz;
410 param[1] = fScale*rmin1;
411 param[2] = fScale*rmax1;
412 param[3] = fScale*rmin2;
413 param[4] = fScale*rmax2;
414 param[5] = phi1;
415 param[6] = phi2;
416 name[0] = 'I';
417 for(Int_t i=0;i<3;i++) name[i+1] = gnam[i];
418 gMC->Gsvolu(name,"CONS",fidmed[med],param,7);
419}
420//______________________________________________________________________
421void AliITSv11::Sphere(const char gnam[3],const TString &dis,Double_t rmin,
422 Double_t rmax,Double_t the1,Double_t the2,Double_t phi1,
423 Double_t phi2,Int_t med){
424 // Interface to TMC->Gsvolu() for ITS SPHE geometries. Segment of a
425 // sphereical shell. It has 6 parameters. See SetScale()
426 // for units. Default units are geant 3 [cm].
427 // Inputs:
428 // const char gnam[3] 3 character geant volume name. The letter "I"
429 // is appended to the front to indecate that this
430 // is an ITS volume.
431 // TString &dis String containging part discription.
432 // Double_t rmin Inside Radius.
433 // Double_t rmax Outside Radius.
434 // Double_t the1 staring polar angle of the shell [degree].
435 // Double_t the2 ending polar angle of the shell [degree].
436 // Double_t phui staring asimuthal angle of the shell [degree].
437 // Double_t phi2 ending asimuthal angle of the shell [degree].
438 // Int_t med media index number.
439 // Output:
440 // none.
441 // Return.
442 // none.
443 char name[4];
444 Float_t param[6];
445
446 param[0] = fScale*rmin;
447 param[1] = fScale*rmax;
448 param[2] = the1;
449 param[3] = the2;
450 param[4] = phi1;
451 param[5] = phi2;
452 name[0] = 'I';
453 for(Int_t i=0;i<3;i++) name[i+1] = gnam[i];
454 gMC->Gsvolu(name,"SPHE",fidmed[med],param,6);
455}
456//______________________________________________________________________
457void AliITSv11::Parallelepiped(const char gnam[3],const TString &dis,
458 Double_t dx,Double_t dy,Double_t dz,
459 Double_t alph,Double_t thet,Double_t phi,
460 Int_t med){
461 // Interface to TMC->Gsvolu() for ITS PARA geometries. Parallelepiped. It
462 // has 6 parameters. See SetScale() for units. Default units are geant 3
463 // [cm].
464 // Inputs:
465 // const char gnam[3] 3 character geant volume name. The letter "I"
466 // is appended to the front to indecate that this
467 // is an ITS volume.
468 // TString &dis String containging part discription.
469 // Double_t dx half-length allong x-axis
470 // Double_t dy half-length allong y-axis
471 // Double_t dz half-length allong z-axis
472 // Double_t alpha angle formed by the y axis and by the plane
473 // joining the center of teh faces parallel to the
474 // z-x plane at -dY and +dy [degree].
475 // Double_t thet polar angle of the line joining the centers of
476 // the faces at -dz and +dz in z [degree].
477 // Double_t phi azimuthal angle of teh line joing the centers of
478 // the faaces at -dz and +dz in z [degree].
479 // Int_t med media index number.
480 // Output:
481 // none.
482 // Return.
483 // none.
484 char name[4];
485 Float_t param[6];
486
487 param[0] = fScale*dx;
488 param[1] = fScale*dy;
489 param[2] = fScale*dz;
490 param[3] = alpha;
491 param[4] = thet;
492 param[5] = phi;
493 name[0] = 'I';
494 for(Int_t i=0;i<3;i++) name[i+1] = gnam[i];
495 gMC->Gsvolu(name,"PARA",fidmed[med],param,6);
496}
497//______________________________________________________________________
498void AliITSv11::Polygon(const char gnam[3],const TString &dis,Double_t phi1,
499 Double_t dphi,Int_t npdv,Int_t nz,Double_t *z,
500 Double_t *rmin,Double_t *rmax,Double_t ,Int_t med){
501 // Interface to TMC->Gsvolu() for ITS PGON geometry. Polygon It has 10
502 // parameters or more. See SetScale() for units. Default units are geant 3
503 // [cm].
504 // Inputs:
505 // const char gnam[3] 3 character geant volume name. The letter "I"
506 // is appended to the front to indecate that this
507 // is an ITS volume.
508 // TString &dis String containging part discription.
509 // Double_t phi1 the azimuthal angle at which the volume begins
510 // (angles are counted clouterclockwise) [degrees].
511 // Double_t dphi opening angle of the volume, which extends from
512 // phi1 to phi1+dphi [degree].
513 // Int_t npdv the number of sides of teh cross section between
514 // the given phi limits.
515 // Int_t nz number of planes perpendicular to the z axis
516 // where the dimension of the section is given -
517 // this number should be at least 2 and NP triples
518 // of number must follow.
519 // Double_t *z array [nz] of z coordiates of the sections..
520 // Double_t *rmin array [nz] of radius of teh circle tangent to
521 // the sides of the inner polygon in teh
522 // cross-section.
523 // Double_t *rmax array [nz] of radius of the circle tangent to
524 // the sides of the outer polygon in the
525 // cross-section.
526 // Int_t med media index number.
527 // Output:
528 // none.
529 // Return.
530 // none.
531 char name[4];
532 Float_t *param;
533 Int_t n,i;
534
535 n = 4+3*nz;
536 param = new Float_t[n]
537 param[0] = phi1;
538 param[1] = dphi;
539 param[2] = (Float_t)npdv;
540 param[3] = (Float_t)nz;
541 for(i=0;i<nz;i++){
542 param[4+3*i] = z[i];
543 param[5+3*i] = rmin[i];
544 param[6+3*i] = rmax[i];
545 } // end for i
546 name[0] = 'I';
547 for(i=0;i<3;i++) name[i+1] = gnam[i];
548 gMC->Gsvolu(name,"PGON",fidmed[med],param,n);
549
550 delete[] param;
551}
552//______________________________________________________________________
553void AliITSv11::PolyCone(const char gnam[3],const TString &dis,Double_t phi1,
554 Double_t dphi,Int_t nz,Double_t *z,Double_t *rmin,
555 Double_t *rmax,Int_t med){
556 // Interface to TMC->Gsvolu() for ITS PCON geometry. Poly-cone It has 9
557 // parameters or more. See SetScale() for units. Default units are geant 3
558 // [cm].
559 // Inputs:
560 // const char gnam[3] 3 character geant volume name. The letter "I"
561 // is appended to the front to indecate that this
562 // is an ITS volume.
563 // TString &dis String containging part discription.
564 // Double_t phi1 the azimuthal angle at which the volume begins
565 // (angles are counted clouterclockwise) [degrees].
566 // Double_t dphi opening angle of the volume, which extends from
567 // phi1 to phi1+dphi [degree].
568 // Int_t nz number of planes perpendicular to the z axis
569 // where the dimension of the section is given -
570 // this number should be at least 2 and NP triples
571 // of number must follow.
572 // Double_t *z Array [nz] of z coordinate of the section.
573 // Double_t *rmin Array [nz] of radius of teh inner circle in the
574 // cross-section.
575 // Double_t *rmax Array [nz] of radius of the outer circle in the
576 // cross-section.
577 // Int_t med media index number.
578 // Output:
579 // none.
580 // Return.
581 // none.
582 char name[4];
583 Float_t *param;
584 Int_t n,i;
585
586 n = 3+3*nz;
587 param = new Float_t[n];
588 param[0] = phi1;
589 param[1] = dphi;
590 param[2] = (Float_t) nz;
591 for(i=0;i<nz;i++){
592 param[3+3*i] = z[i];
593 param[4+3*i] = rmin[i];
594 param[5+3*i] = rmax[i];
595 } // end for i
596 name[0] = 'I';
597 for(i=0;i<3;i++) name[i+1] = gnam[i];
598 gMC->Gsvolu(name,"PCON",fidmed[med],param,n);
599
600 delete[] param;
601}
602//______________________________________________________________________
603void AliITSv11::TubeElliptical(const char gnam[3],const TString &dis,
604 Double_t p1,Double_t p2,Double_t dz,Int_t med){
605 // Interface to TMC->Gsvolu() for ITS ELTU geometries. Elliptical
606 // cross-section Tube. It has 3 parameters. See SetScale()
607 // for units. Default units are geant 3 [cm]. The equation of the surface
608 // is x^2 * p1^-2 + y^2 * p2^-2 = 1.
609 // Inputs:
610 // const char gnam[3] 3 character geant volume name. The letter "I"
611 // is appended to the front to indecate that this
612 // is an ITS volume.
613 // TString &dis String containging part discription.
614 // Double_t p1 semi-axis of the elipse along x.
615 // Double_t p2 semi-axis of the elipse along y.
616 // Double_t dz half-length along the z-axis
617 // Int_t med media index number.
618 // Output:
619 // none.
620 // Return.
621 // none.
622 char name[4];
623 Float_t param[3];
624
625 param[0] = fScale*p1;
626 param[1] = fScale*p2;
627 param[2] = fScale*dz;
628 name[0] = 'I';
629 for(Int_t i=0;i<3;i++) name[i+1] = gnam[i];
630 gMC->Gsvolu(name,"ELTU",fidmed[med],param,3);
631}
632//______________________________________________________________________
633void AliITSv11::HyperbolicTube(const char gnam[3],const TString &dis,
634 Double_t rmin,Double_t rmax,Double_t dz,
635 Double_t thet,Int_t med){
636 // Interface to TMC->Gsvolu() for ITS HYPE geometries. Hyperbolic tube.
637 // Fore example the inner and outer surfaces are hyperboloids, as would be
638 // foumed by a system of cylinderical wires which were then rotated
639 // tangentially about their centers. It has 4 parameters. See SetScale()
640 // for units. Default units are geant 3 [cm]. The hyperbolic surfaces are
641 // given by r^2 = (ztan(thet)^2 + r(z=0)^2.
642 // Inputs:
643 // const char gnam[3] 3 character geant volume name. The letter "I"
644 // is appended to the front to indecate that this
645 // is an ITS volume.
646 // TString &dis String containging part discription.
647 // Double_t rmin Inner radius at z=0 where tube is narrowest.
648 // Double_t rmax Outer radius at z=0 where tube is narrowest.
649 // Double_t dz half-length along the z-axis
650 // Double_t thet stero angel of rotation of the two faces
651 // [degrees].
652 // Int_t med media index number.
653 // Output:
654 // none.
655 // Return.
656 // none.
657 char name[4];
658 Float_t param[4];
659
660 param[0] = fScale*rmin;
661 param[1] = fScale*rmax;
662 param[2] = fScale*dz;
663 param[3] = thet;
664 name[0] = 'I';
665 for(Int_t i=0;i<3;i++) name[i+1] = gnam[i];
666 gMC->Gsvolu(name,"HYPE",fidmed[med],param,4);
667}
668//______________________________________________________________________
669void AliITSv11::TwistedTrapezoid(const char gnam[3],const TString &dis,
670 Double_t dz,Double_t thet,Double_t phi,
671 Double_t twist,Double_t h1,Double_t bl1,
672 Double_t tl1,Double_t apl1,Double_t h2,
673 Double_t bl2,Double_t tl2,Double_t apl2,
674 Int_t med){
675 // Interface to TMC->Gsvolu() for ITS GTRA geometries. General twisted
676 // trapazoid. The faces perpendicular to z are trapazia and their centers
677 // are not necessarily on a line parallel to the z axis as the TRAP.
678 // Additionally, the faces may be twisted so that none of their edges are
679 // parallel. It is a TRAP shape, exept that it is twisted in the x-y plane
680 // as a function of z. The parallel sides perpendicular to the x axis are
681 // rotated with respect to the x axis by an angle TWIST, which is one of
682 // the parameters. The shape is defined by the eight corners and is assumed
683 // to be constructed of straight lines joingin points on the boundry of the
684 // trapezoidal face at Z=-dz to the coresponding points on the face at
685 // z=+dz. Divisions are not allowed. It has 12 parameters. See SetScale()
686 // for units. Default units are geant 3 [cm]. Note: This shape suffers from
687 // the same limitations than the TRAP. The tracking routines assume that
688 // the faces are planar, but htis constraint is not easily expressed in
689 // terms of the 12 parameters. Additionally, no check on th efaces is
690 // performed in this case. Users should avoid to use this shape as much as
691 // possible, and if they have to do so, they should make sure that the
692 // faces are really planes. If this is not the case, the result of the
693 // trasport is unpredictable. To accelerat ethe computations necessary for
694 // trasport, 18 additioanl parameters are calculated for this shape are
695 // 1 DXODZ dx/dz of the line joing the centers of the faces at z=+_dz.
696 // 2 DYODZ dy/dz of the line joing the centers of the faces at z=+_dz.
697 // 3 XO1 x at z=0 for line joing the + on parallel side, perpendicular
698 // corners at z=+_dz.
699 // 4 YO1 y at z=0 for line joing the + on parallel side, + on
700 // perpendicular corners at z=+-dz.
701 // 5 DXDZ1 dx/dz for line joing the + on parallel side, + on
702 // perpendicular corners at z=+-dz.
703 // 6 DYDZ1 dy/dz for line joing the + on parallel side, + on
704 // perpendicular corners at z=+-dz.
705 // 7 X02 x at z=0 for line joing the - on parallel side, + on
706 // perpendicular corners at z=+-dz.
707 // 8 YO2 y at z=0 for line joing the - on parallel side, + on
708 // perpendicular corners at z=+-dz.
709 // 9 DXDZ2 dx/dz for line joing the - on parallel side, + on
710 // perpendicular corners at z=+-dz.
711 // 10 DYDZ2dy/dz for line joing the - on parallel side, + on
712 // perpendicular corners at z=+-dz.
713 // 11 XO3 x at z=0 for line joing the - on parallel side, - on
714 // perpendicular corners at z=+-dz.
715 // 12 YO3 y at z=0 for line joing the - on parallel side, - on
716 // perpendicular corners at z=+-dz.
717 // 13 DXDZ3 dx/dzfor line joing the - on parallel side, - on
718 // perpendicular corners at z=+-dz.
719 // 14 DYDZ3 dydz for line joing the - on parallel side, - on
720 // perpendicular corners at z=+-dz.
721 // 15 XO4 x at z=0 for line joing the + on parallel side, - on
722 // perpendicular corners at z=+-dz.
723 // 16 YO4 y at z=0 for line joing the + on parallel side, - on
724 // perpendicular corners at z=+-dz.
725 // 17 DXDZ4 dx/dz for line joing the + on parallel side, - on
726 // perpendicular corners at z=+-dz.
727 // 18 DYDZ4 dydz for line joing the + on parallel side, - on
728 // perpendicular corners at z=+-dz.
729 // Inputs:
730 // const char gnam[3] 3 character geant volume name. The letter "I"
731 // is appended to the front to indecate that this
732 // is an ITS volume.
733 // TString &dis String containging part discription.
734 // Double_t dz half-length along the z axis.
735 // Double_t thet polar angle of the line joing the center of the
736 // face at -dz to the center of the one at +dz
737 // [degrees].
738 // Double_t phi Azymuthal angle of teh line joing the centre of
739 // the face at -dz to the center of the one at +dz
740 // [degrees].
741 // Double_t twist Twist angle of the faces parallel to the x-y
742 // plane at z=+-dz around an axis parallel to z
743 // passing through their centre [degrees].
744 // Double_t h1 Half-length along y of the face at -dz.
745 // Double_t bl1 half-length along x of the side -h1 in y of the
746 // face at -dz in z.
747 // Double_t tl1 half-length along x of the side at +h1 in y of
748 // the face at -dz in z.
749 // Double_t apl1 Angle with respect to the y ais from the center
750 // of the side at -h1 in y to the centere of the
751 // side at +h1 in y of the face at -dz in z
752 // [degrees].
753 // Double_t h2 half-length along the face at +dz.
754 // Double_t bl2 half-length along x of the side at -h2 in y of
755 // the face at -dz in z.
756 // Double_t tl2 half-length along x of the side at +h2 in y of
757 // the face at +dz in z.
758 // Double_t apl2 angle with respect to the y axis from the center
759 // of the side at -h2 in y to the center of the side
760 // at +h2 in y of the face at +dz in z [degrees].
761 // Int_t med media index number.
762 // Output:
763 // none.
764 // Return.
765 // none.
766 char name[4];
767 Float_t param[12];
768
769 param[0] = fScale*dz;
770 param[1] = thet;
771 param[2] = phi;
772 param[3] = twist;
773 param[4] = fScale*h1;
774 param[5] = fScale*bl1;
775 param[6] = fScale*tl1;
776 param[7] = alp1;
777 param[8] = fScale*h2;
778 param[9] = fScale*bl2;
779 param[10] = fScale*tl2;
780 param[11] = alp2;
781 name[0] = 'I';
782 for(Int_t i=0;i<3;i++) name[i+1] = gnam[i];
783 gMC->Gsvolu(name,"GTRA",fidmed[med],param,12);
784}
785//______________________________________________________________________
786void AliITSv11::CutTube(const char gnam[3],const TString &dis,Double_t rmin,
787 Double_t rmax,Double_t dz,Double_t phi1,Double_t phi2,
788 Double_t lx,Double_t ly,Double_t lz,Double_t hx,
789 Double_t hy,Double_t hz,Int_t med){
790 // Interface to TMC->Gsvolu() for ITS CTUB geometries. Cut tube. A tube cut
791 // at the extremities with planes not necessarily perpendicular tot he z
792 // axis. It has 11 parameters. See SetScale() for units. Default units are
793 // geant 3 [cm]. phi1 should be smaller than phi2. If this is not the case,
794 // the system adds 360 degrees to phi2.
795 // Inputs:
796 // const char gnam[3] 3 character geant volume name. The letter "I"
797 // is appended to the front to indecate that this
798 // is an ITS volume.
799 // TString &dis String containging part discription.
800 // Double_t rmin Inner radius at z=0 where tube is narrowest.
801 // Double_t rmax Outer radius at z=0 where tube is narrowest.
802 // Double_t dz half-length along the z-axis
803 // Double_t dz half-length along the z-axis
804 // Double_t phi1 Starting angle of the segment [degree].
805 // Double_t phi2 Ending angle of the segment [degree].
806 // Double_t lx x component of a unit vector perpendicular to
807 // the face at -dz.
808 // Double_t ly y component of a unit vector perpendicular to
809 // the face at -dz.
810 // Double_t lz z component of a unit vector perpendicular to
811 // the face at -dz.
812 // Double_t hx x component of a unit vector perpendicular to
813 // the face at +dz.
814 // Double_t hy y component of a unit vector perpendicular to
815 // the face at +dz.
816 // Double_t hz z component of a unit vector perpendicular to
817 // the face at +dz.
818 // Int_t med media index number.
819 // Output:
820 // none.
821 // Return.
822 // none.
823 char name[4];
824 Float_t param[11];
825
826 param[0] = fScale*rmin;
827 param[1] = fScale*rmax;
828 param[2] = fScale*dz;
829 param[3] = phi1;
830 param[4] = phi2;
831 param[5] = lx;
832 param[6] = ly;
833 param[7] = lz;
834 param[8] = hx;
835 param[9] = hy;
836 param[10] = hz;
837 name[0] = 'I';
838 for(Int_t i=0;i<3;i++) name[i+1] = gnam[i];
839 gMC->Gsvolu(name,"CTUB",fidmed[med],param,11);
840}
841//______________________________________________________________________
842void AliITSv11::Pos(const char vol[3],Int_t cn,const char moth[3],Double_t x,
843 Double_t y,Double_t z,Int_t irot){
844 // Place a copy of a volume previously defined by a call to GSVOLU inside
845 // its mother volulme moth.
846 // Inputs:
847 // const char vol[3] 3 character geant volume name. The letter "I"
848 // is appended to the front to indecate that this
849 // is an ITS volume.
850 // const char moth[3] 3 character geant volume name of the mother volume
851 // in which vol will be placed. The letter "I" is
852 // appended to the front to indecate that this is an
853 // ITS volume.
854 // Double_t x The x positon of the volume in the mother's
855 // reference system
856 // Double_t y The y positon of the volume in the mother's
857 // reference system
858 // Double_t z The z positon of the volume in the mother's
859 // reference system
860 // Int_t irot the index for the rotation matrix to be used.
861 // irot=-1 => unit rotation.
862 // Outputs:
863 // none.
864 // Return:
865 // none.
866 char name[4],mother[4];
867 Float_t param[3];
868 Int_t r=0,i;
869
870 param[0] = x;
871 param[1] = y;
872 param[2] = z;
873 name[0] = 'I';
874 for(i=0;i<3;i++) name[i+1] = vol[i];
875 mother[0] = 'I';
876 for(i=0;i<3;i++) mother[i+1] = moth[i];
877 if(irot>=0) r=fidrot[irot];
878 fMC->Gspos(name,mother,param[0],param[1],param[2],r,"ONLY");
879}
880//______________________________________________________________________
881void AliITSv11::Matrix(Int_t irot,Double_t thet1,Double_t phi1,
882 Double_t thet2,Double_t phi2,
883 Double_t thet3,Double_t phi3){
884 // Defines a Geant rotation matrix. checks to see if it is the unit
885 // matrix. If so, then no additonal matrix is defined. Stores rotation
886 // matrix irot in the data structure JROTM. If the matrix is not
887 // orthonormal, it will be corrected by setting y' perpendicular to x'
888 // and z' = x' X y'. A warning message is printed in this case.
889 // Inputs:
890 // Int_t irot Intex specifing which rotation matrix.
891 // Double_t thet1 Polar angle for axisw x [degrees].
892 // Double_t phi1 azimuthal angle for axis x [degrees].
893 // Double_t thet12Polar angle for axisw y [degrees].
894 // Double_t phi2 azimuthal angle for axis y [degrees].
895 // Double_t thet3 Polar angle for axisw z [degrees].
896 // Double_t phi3 azimuthal angle for axis z [degrees].
897 // Outputs:
898 // none.
899 // Return:
900 // none.
901 Float_t t1,p1,t2,p2,t3,p3;
902
903 if(thet1==90.0&&phi1==0.0&&thet2==90.0&&phi2==90.0&&thet3==0.0&&phi3==0.0){
904 fidrot[irot] = 0; // Unit matrix
905 }else{
906 t1 = thet1;
907 p1 = phi1;
908 t2 = thet2;
909 p2 = phi2;
910 t3 = thet3;
911 p3 = phi3
912 AliMatrix(fidrot[irot],t1,p1,t2,p2,t3,p3);
913 } // end if
914}
915//______________________________________________________________________
dfefbaec 916void AliITSv11::Matrix(Int_t irot,Int_t axis,Double_t thet){
917 // Defines a Geant rotation matrix. checks to see if it is the unit
918 // matrix. If so, then no additonal matrix is defined. Stores rotation
919 // matrix irot in the data structure JROTM. If the matrix is not
920 // orthonormal, it will be corrected by setting y' perpendicular to x'
921 // and z' = x' X y'. A warning message is printed in this case.
922 // Inputs:
923 // Int_t irot Intex specifing which rotation matrix.
924 // Int_t axis Axis about which rotation is to be done.
925 // Double_t thet Angle to rotate by [degrees].
926 // Outputs:
927 // none.
928 // Return:
929 // none.
930
931 if(thet==0.0){
932 fidrot[irot] = 0; // Unit matrix
933 }else{
934 switch (irot) {
935 case 0: //Rotate about x-axis, x-axis does not change.
936 AliMatrix(fidrot[irot],90.0,0.0,90.0+thet,90.0,thet,90.0);
937 break;
938 case 1: //Rotate about y-axis, y-axis does not change.
939 AliMatrix(fidrot[irot],-90.0-thet,0.0,90.0,90.0,thet,90.0);
940 break;
941 case 2: //Rotate about z-axis, z-axis does not change.
942 AliMatrix(fidrot[irot],90.0,thet,90.0,-thet-90.0,0.0,0.0);
943 break;
944 default:
945 Error("Matrix","axis must be either 0, 1, or 2. for matrix=%d",
946 irot);
947 break;
948 } // end switch
949 } // end if
950}
951//______________________________________________________________________
2b680d9b 952void AliITSv11::Matrix(Int_t irot,Double_t rot[3][3]){
953 // Defines a Geant rotation matrix. checks to see if it is the unit
954 // matrix. If so, then no additonal matrix is defined. Stores rotation
955 // matrix irot in the data structure JROTM. If the matrix is not
956 // orthonormal, it will be corrected by setting y' perpendicular to x'
957 // and z' = x' X y'. A warning message is printed in this case.
958 // Inputs:
959 // Int_t irot Intex specifing which rotation matrix.
960 // Double_t rot[3][3] The 3 by 3 rotation matrix.
961 // Outputs:
962 // none.
963 // Return:
964 // none.
965
966 if(rot[0][0]==1.0&&rot[1][1]==1.0&&rot[2][2]==1.0&&
967 rot[0][1]==0.0&&rot[0][2]==0.0&&rot[1][0]==0.0&&
968 rot[1][2]==0.0&&rot[2][0]==0.0&&rot[2][1]==0.0){
969 fidrot[irot] = 0; // Unit matrix
970 }else{
971 Double_t si,c=180./TMath::Pi();
972 Double_t ang[6];
973
974 ang[1] = TMath::ATan2(rot[0][1],rot[0][0]);
975 if(TMath::Cos(ang[1])!=0.0) si = rot[0][0]/TMath::Cos(ang[1]);
976 else si = rot[0][1]/TMath::Sin(ang[1]);
977 ang[0] = TMath::ATan2(si,rot[0][2]);
978
979 ang[3] = TMath::ATan2(rot[1][1],rot[1][0]);
980 if(TMath::Cos(ang[3])!=0.0) si = rot[1][0]/TMath::Cos(ang[3]);
981 else si = rot[1][1]/TMath::Sin(ang[3]);
982 ang[2] = TMath::ATan2(si,rot[1][2]);
983
984 ang[5] = TMath::ATan2(rot[2][1],rot[2][0]);
985 if(TMath::Cos(ang[5])!=0.0) si = rot[2][0]/TMath::Cos(ang[5]);
986 else si = rot[2][1]/TMath::Sin(ang[5]);
987 ang[4] = TMath::ATan2(si,rot[2][2]);
988
989 for(Int_t i=0;i<6;i++) {ang[i] *= c; if(ang[i]<0.0) ang[i] += 360.;}
990 AliMatrix(fidrot[irot],ang[0],ang[1],ang[2],ang[3],ang[4],ang[5]);
991 } // end if
992}
993//______________________________________________________________________
dfefbaec 994Float_t AliITSv11::GetA(Int_t z){
995 // Returns the isotopicaly averaged atomic number.
2b680d9b 996 // Inputs:
dfefbaec 997 // Int_t z Elemental number
2b680d9b 998 // Outputs:
999 // none.
1000 // Return:
dfefbaec 1001 // The atomic mass number.
1002 const Float_t A[]={ 1.00794 , 4.0026902, 6.941 , 9.012182 , 10.811 ,
1003 12.01007 , 14.00674 , 15.9994 , 18.9984032, 20.1797 ,
1004 22.98970 , 24.3050 , 26.981538, 28.0855 , 30.973761,
1005 32.066 , 35.4527 , 39.948 , 39.0983 , 40.078 ,
1006 44.95591 , 47.867 , 50.9415 , 51.9961 , 54.938049,
1007 55.845 , 58.933200 , 58.6934 , 63.546 , 65.39 ,
1008 69.723 , 72.61 , 74.92160 , 78.96 , 79.904 ,
1009 83.80 , 85.4678 , 87.62 , 88.9085 , 91.224 ,
1010 92.90638 , 95.94 , 97.907215, 101.07 ,102.90550 ,
1011 106.42 ,107.8682 ,112.411 ,114.818 ,118.710 ,
1012 121.760 ,127.60 ,126.90447 ,131.29 ,132.90545 ,
1013 137.327 ,138.9055 ,140.116 ,140.90765 ,144.24 ,
1014 144.912746,150.36 ,151.964 ,157.25 ,158.92534 ,
1015 162.50 ,164.93032 ,167.26 ,168.93421 ,173.04 ,
1016 174.967 ,178.49 ,180.9479 ,183.84 ,186.207 ,
1017 190.23 ,192.217 ,195.078 ,196.96655 ,200.59 ,
1018 204.3833 ,207.2 ,208.98038,208.982415 ,209.987131,
1019 222.017570 ,223.019731,226.025402,227.027747 ,232.0381 ,
1020 231.03588 238.0289};
2b680d9b 1021
dfefbaec 1022 if(z<1||z>92){
1023 Error("GetA","z must be 0<z<93. z=%d",z);
1024 return 0.0;
2b680d9b 1025 } // end if
dfefbaec 1026 return A[z-1];
1027}
1028//______________________________________________________________________
1029Float_t AliITSv11::GetStandardMaxStepSize(Int_t istd){
1030 // Returns one of a set of standard Maximum Step Size values.
1031 // Inputs:
1032 // Int_t istd Index to indecate which standard.
1033 // Outputs:
1034 // none.
1035 // Return:
1036 // The appropreate standard Maximum Step Size value [cm].
1037 Float_t t[]={1.0, // default
1038 0.0075, // Silicon detectors...
1039 1.0, // Air in central detectors region
1040 1.0 // Material in non-centeral region
1041 };
1042 return t[istd];
1043}
1044//______________________________________________________________________
1045Float_t AliITSv11::GetStandardThetaMax(Int_t istd){
1046 // Returns one of a set of standard Theata Max values.
1047 // Inputs:
1048 // Int_t istd Index to indecate which standard.
1049 // Outputs:
1050 // none.
1051 // Return:
1052 // The appropreate standard Theta max value [degrees].
1053 Float_t t[]={0.1, // default
1054 0.1, // Silicon detectors...
1055 0.1, // Air in central detectors region
1056 1.0 // Material in non-centeral region
1057 };
1058 return t[istd];
1059}
1060//______________________________________________________________________
1061Float_t AliITSv11::GetStandardEfraction(Int_t istd){
1062 // Returns one of a set of standard E fraction values.
1063 // Inputs:
1064 // Int_t istd Index to indecate which standard.
1065 // Outputs:
1066 // none.
1067 // Return:
1068 // The appropreate standard E fraction value [#].
1069 Float_t t[]={0.1, // default
1070 0.1, // Silicon detectors...
1071 0.1, // Air in central detectors region
1072 1.0 // Material in non-centeral region
1073 };
1074 return t[istd];
1075}
1076//______________________________________________________________________
1077void AliITSv11::Element(Int_t imat,const char* name,Int_t z,Double_t dens,
1078 Int_t istd){
1079 // Defines a Geant single element material and sets its Geant medium
1080 // proporties. The average atomic A is assumed to be given by their
1081 // natural abundances. Things like the radiation length are calculated
1082 // for you.
1083 // Inputs:
1084 // Int_t imat Material number.
1085 // const char* name Material name. No need to add a $ at the end.
1086 // Int_t z The elemental number.
1087 // Double_t dens The density of the material [g/cm^3].
1088 // Int_t istd Defines which standard set of transport parameters
1089 // which should be used.
1090 // Output:
1091 // none.
1092 // Return:
1093 // none.
1094 Float_t rad,Z,A=GetA(z),tmax,stemax,deemax,epsilon;
1095 char *name2;
1096 Int_t len;
1097
1098 len = strlng(name)+1;
1099 name2 = new char[len];
1100 strncpy(name2,name,len-1);
1101 name2[len-1] = '\0';
1102 name2[len-2] = '$';
1103 Z = (Float_t)z;
1104 rad = GetRadLength(z)/dens;
1105 AliMaterial(imat,name2,A,Z,dens,rad,0.0,0,0);
1106 tmax = GetStandardTheataMax(istd); // degree
1107 stemax = GetStandardMaxStepSize(istd); // cm
1108 deemax = GetStandardEfraction(istd); // #
1109 epsilon = GetStandardEpsilon(istd);
1110 AliMedium(imat,name2,imat,0,gAlice->Field()->Integ(),
1111 gAlice->Field()->Max(),tmax,stemax,deemax,epsilon,0.0);
1112 delete[] name2;
1113}
1114//______________________________________________________________________
3717ba94 1115void AliITSv11::MixtureByWeight(Int_t imat,const char* name,Int_t *z,
1116 Double_t *w,Double_t dens,Int_t n,Int_t istd){
1117 // Defines a Geant material by a set of elements and weights, and sets
1118 // its Geant medium proporties. The average atomic A is assumed to be
1119 // given by their natural abundances. Things like the radiation length
1120 // are calculated for you.
1121 // Inputs:
1122 // Int_t imat Material number.
1123 // const char* name Material name. No need to add a $ at the end.
1124 // Int_t *z Array of The elemental numbers.
1125 // Double_t *w Array of relative weights.
1126 // Double_t dens The density of the material [g/cm^3].
1127 // Int_t n the number of elements making up the mixture.
1128 // Int_t istd Defines which standard set of transport parameters
1129 // which should be used.
1130 // Output:
1131 // none.
1132 // Return:
1133 // none.
1134 Float_t rad,*Z,*A,tmax,stemax,deemax,epsilon;
1135 char *name2;
1136 Int_t len,i;
1137 Z = new Float_t[n];
1138 A = new Float_t[n];
1139
1140 len = strlng(name)+1;
1141 name2 = new char[len];
1142 strncpy(name2,name,len-1);
1143 name2[len-1] = '\0';
1144 name2[len-2] = '$';
1145 for(i=0;i<n;i++){Z[i] = (Float_t)z[i];A[i] = (Float_t)GetA(z[i]);
1146 W[i] = (Float_t)w[i]}
1147 rad = GetRadLength(z)/dens;
1148 AliMixture(imat,name2,A,Z,dens,n,W);
1149 tmax = GetStandardTheataMax(istd); // degree
1150 stemax = GetStandardMaxStepSize(istd); // cm
1151 deemax = GetStandardEfraction(istd); // #
1152 epsilon = GetStandardEpsilon(istd);
1153 AliMedium(imat,name2,imat,0,gAlice->Field()->Integ(),
1154 gAlice->Field()->Max(),tmax,stemax,deemax,epsilon,0.0);
1155 delete[] name2;
1156}
1157//______________________________________________________________________
1158void AliITSv11::MixtureByNumber(Int_t imat,const char* name,Int_t *z,
1159 Int_t *w,Double_t dens,Int_t n,Int_t istd){
1160 // Defines a Geant material by a set of elements and number, and sets
1161 // its Geant medium proporties. The average atomic A is assumed to be
1162 // given by their natural abundances. Things like the radiation length
1163 // are calculated for you.
1164 // Inputs:
1165 // Int_t imat Material number.
1166 // const char* name Material name. No need to add a $ at the end.
1167 // Int_t *z Array of The elemental numbers.
1168 // Int_t_t *w Array of relative number.
1169 // Double_t dens The density of the material [g/cm^3].
1170 // Int_t n the number of elements making up the mixture.
1171 // Int_t istd Defines which standard set of transport parameters
1172 // which should be used.
1173 // Output:
1174 // none.
1175 // Return:
1176 // none.
1177 Float_t rad,*Z,*A,tmax,stemax,deemax,epsilon;
1178 char *name2;
1179 Int_t len,i;
1180 Z = new Float_t[n];
1181 A = new Float_t[n];
1182
1183 len = strlng(name)+1;
1184 name2 = new char[len];
1185 strncpy(name2,name,len-1);
1186 name2[len-1] = '\0';
1187 name2[len-2] = '$';
1188 for(i=0;i<n;i++){Z[i] = (Float_t)z[i];A[i] = (Float_t)GetA(z[i]);
1189 W[i] = (Float_t)w[i]}
1190 rad = GetRadLength(z)/dens;
1191 AliMixture(imat,name2,A,Z,dens,-n,W);
1192 tmax = GetStandardTheataMax(istd); // degree
1193 stemax = GetStandardMaxStepSize(istd); // cm
1194 deemax = GetStandardEfraction(istd); // #
1195 epsilon = GetStandardEpsilon(istd);
1196 AliMedium(imat,name2,imat,0,gAlice->Field()->Integ(),
1197 gAlice->Field()->Max(),tmax,stemax,deemax,epsilon,0.0);
1198 delete[] name2;
1199//______________________________________________________________________
1200void AliITSv11::SSDConeDetail(TVector3 &tran,const char moth[3],Int_t mat0){
dfefbaec 1201 // Defines the volumes and materials for the ITS SSD Support cone.
1202 // Based on drawings ALR-0767 and ALR-0767/3. Units are in mm.
3717ba94 1203 // Inputs:
1204 // Double_t zShift The z shift to be applied to the final volume.
1205 // Outputs:
1206 // none.
1207 // Return:
1208 // none.
1209 Double_t th = 13.0; //mm, Thickness of Rohacell+carbon fiber
1210 Double_t ct=1.5; //mm, Carbon finber thickness
1211 Double_t r=15.0; // mm, Radius of curvature.
1212 Double_t tc=51.0; // angle of SSD cone [degrees].
1213 Double_t sintc=Sind(tc),costc=Cosd(tc),tantc=Tand(tc);
2cf828ba 1214 Double_t z0=0.0,zcylinder=170.0,zpost=196.0;
1215 Double_t Routmax=0.5*985.0,RoutHole=0.5*965.0,Routmin=0.5*945.0;
1216 Double_t Rholemax=0.5*890.0,Rholemin=0.5*740.0;
1217 Double_t RPostmin=316.0,dRPost=23.0,zpostmax=196.0,phi0post=30.0;
1218 Double_t Rinmax=0.5*590.0,Rincylinder=0.5*597.0,RinHole=0.5*575.0,
1219 Rinmin=0.5*562.0,dzin=15.0;
1220 Int_t nspoaks=12,ninscrews=40,npost=4,nmounts=4;
3717ba94 1221 Int_t SSDcf=man0+1; // SSD support cone Carbon Fiber materal number.
1222 Int_t SSDfs=mat0+2; // SSD support cone inserto stesalite 4411w.
1223 Int_t SSDfo=mat0+3; // SSD support cone foam, Rohacell 50A.
1224 Int_t SSDsw=mat0+4; // SSD support cone screw material,Stainless steal
2cf828ba 1225 Int_t ncse=0; // number of screw ends (copy number)
1226 Int_t ncpe=0; // number of pin end (copy number)
1227 Int_t ncst=0; // number of screw tops (copy number)
3717ba94 1228 Double_t t; // some general angle [degrees].
db708caf 1229 Double_t phi0=0.0,dphi=360.0,x,y,z;
1230 Int_t i,j,k,l,n,nz,nrad=0;
3717ba94 1231
1232 SetScalemm();
1233 // Lets start with the upper left outer carbon fiber surface.
1234 // Between za[2],rmaxa[2] and za[4],rmaxa[4] there is a curved section
1235 // given by rmaxa = rmaxa[2]-r*Sind(t) for 0<=t<=tc and
1236 // za = za[2] + r*Cosd(t) for 0<=t<=tc. Simularly between za[1],rmina[1
1237 // and za[3],rmina[3] there is a curve section given by
1238 // rmina = rmina[1]-r*Sind(t) for 0<=t<=tc and za = za[1]+r&Sind(t)
1239 // for t<=0<=tc. These curves have been replaced by straight lines
1240 // between the equivelent points for simplicity.
1241 Double_t dza = th/sintc-(Routmax-Routmin)/tantc;
1242 if(dza<=0){ // The number or order of the points are in error for a proper
1243 // call to pcons!
1244 Error("SSDcone","The definition of the points for a call to PCONS is"
1245 " in error. abort.");
1246 return;
1247 } // end if
1248 nz = 7;
1249 Double_t *za = new Double_t[nz];
1250 Double_t *rmina = new Double_t[nz];
1251 Double_t *rmaxa = new Double_t[nz];
1252 za[0] = z0;
1253 rmina[0] = Routmin;
1254 rmaxa[0] = Routmax;
1255 za[1] = za[0]+13.5-5.0 - dza; // za[2] - dza.
1256 rmina[1] = rmina[0];
1257 rmaxa[1] =rmaxa[0];
1258 za[2] = za[0]+13.5-5.0; // From Drawing ALR-0767 and ALR-0767/3
1259 rmaxa[2] = rmaxa[0];
1260 za[3] = za[1]+rc*sintc;
1261 rmina[3] = rmina[1]-rc*sintc;
1262 rmina[2] = rmina[1]+(rmina[3]-rmina[1])*(za[2]-za[1])/(za[3]-za[1]);
1263 za[4] = za[2]+rc*sintc;
1264 rmaxa[4] = rmaxa[2]-rc*sintc;
1265 rmaxa[3] = rmaxa[2]+(rmaxa[4]-rmaxa[2])*(za[3]-za[2])/(za[4]-za[2]);
1266 rmina[5] = Rholemax;
1267 za[5] = za[3]+(za[4]-za[3])*(rmina[5]-rmina[3])/(rmina[4]-rmina[3]);
1268 rmina[4] = rmina[3]+(rmina[5]-rmina[3])*(za[4]-za[3])/(za[5]-za[3]);
1269 za[6] = th/sinth+za[5];
1270 rmina[6] = Rholemax;
1271 rmaxa[6] = rmina[6];
1272 rmaxa[5] = rmaxa[4]+(rmaxa[6]-rmaxa[4])*(za[5]-za[4])/(za[6]-za[4]);
1273 //
1274 PolyCone("SCA","SSD Suport cone Carbon Fiber Surface outer left",
1275 phi0,dphi,nz,*z,*rmin,*rmax,SSDcf);
1276 Pos("SCA",1,moth,trans.x(),trans.y(),trans.z(),0);
1277 XMatrix(1,180.0);
1278 Pos("SCA",2,moth,trans.x(),trans.y(),-trans.z(),1);
1279 Za[0] = 1.; Wa[0] = ; // Hydrogen Content
1280 Za[1] = 6.; Wa[1] = ; // Carbon Content
1281 MixtureByWeight(SSDcf,"Carbon Fiber for SSD support cone",Z,W,dens,2);
1282 //
1283 // Now lets define the Inserto Stesalite 4411w material volume.
1284 nz = 6;
1285 Double_t *zb = new Double_t[nz];
1286 Double_t *rminb = new Double_t[nz];
1287 Double_t *rmaxb = new Double_t[nz];
1288 zb[0] = z0;
1289 rminb[0] = rmina[0]+ct;
1290 rmaxb[0] = rmaxa[0]-ct;
1291 zb[1] = za[1];
1292 rminb[1] = rminb[0];
1293 rmaxb[1] = rmaxb[0];
1294 zb[2] = za[2];
1295 rmaxb[2] = rmaxb[1];
1296 zb[3] = za[4] - ct/sintc;
1297 rmaxb[3] = rmaxb[2] - (rc-ct)*sintc;
1298 zb[4] = za[3]+ct/sintc;
1299 rminb[4] = rminb[1]-(rc-ct)*sintc;
1300 rminb[2] = rminb[1]+(rminb[4]-rminb[1])*(zb[2]-zb[1])/(zb[4]-zb[1]);
1301 rminb[3] = rminb[1]+(rminb[4]-rminb[1])*(zb[3]-zb[1])/(zb[4]-zb[1]);
1302 zb[5] = zb[4]+(ct-2.*ct)/sintc;
1303 rminb[5] = rminb[4]+(ct-2.*ct)*tantc;
1304 rmaxb[5] = rminb[5];
1305 rmaxb[4] = rmaxb[3]+(rmaxb[5]-rmaxb[3])*(zb[4]-zb[3])/(zb[5]-zb[3]);
1306 PolyCone("SCB","SSD Suport cone Inserto Stesalite left edge",
1307 phi0,dphi,nz,*zb,*rminb,*rmaxb,SSDfs);
1308 Pos("SCB",1,"SCA",0.0,.0,0.0,0);
1309 Za[0] = 1.; Wa[0] = ; // Hydrogen Content
1310 Za[1] = 6.; Wa[1] = ; // Carbon Content
1311 MixtureByWeight(SSDfs,"Inserto stealite 4411w for SSD support cone",
1312 Z,W,dens,3);
1313 //
1314 // Now lets define the Rohacell foam material volume.
1315 nz = 4;
1316 Double_t *zc = new Double_t[nz];
1317 Double_t *rminc = new Double_t[nz];
1318 Double_t *rmaxc = new Double_t[nz];
1319 zc[0] = zb[4];
1320 rminc[0] = rminb[4];
1321 rmaxc[0] = rmminc[0];
1322 zc[1] = zb[5];
1323 rmaxc[1] = rminb[5];
1324 zc[2] = za[5] + ct/sintc;
db708caf 1325 rminc[2] = rmina[5]+ct; // leave space for carbon fiber covering hole.
1326 rminc[1] = rminc[0] +(rminc[2]-rminc[0])*(zc[1]-zc[0])/(zc[2]-zc[0]);
3717ba94 1327 zc[3] = za[6] - ct/sintc;
db708caf 1328 rminc[3] = rmina[6]+ct;
3717ba94 1329 rmaxc[3] = rminc[3];
1330 rmaxc[2] = rmaxc[1]+(rmaxc[3]-rmaxc[1])*(zc[2]-zc[1])/(zc[3]-zc[1]);
1331 PolyCone("SCC","SSD Suport cone Rohacell foam left edge",
db708caf 1332 phi0,dphi,nz,*zc,*rminc,*rmaxc,SSDfo);
3717ba94 1333 Pos("SCC",1,"SCA",0.0,.0,0.0,0);
1334 Za[0] = 1.; Wa[0] = ; // Hydrogen Content
1335 Za[1] = 6.; Wa[1] = ; // Carbon Content
1336 MixtureByWeight(SSDfo,"Foam core (Rohacell 50A) for SSD support cone",
1337 Z,W,dens,3);
3717ba94 1338 //
db708caf 1339 // In volume SCB, th Inserto Stesalite 4411w material volume, there
1340 // are a number of Stainless steel screw and pin studs which will be
1341 // filled with screws/studs.
1342 Double_t rmin=0.0,rmax=6.0,dz=0.5*10.0; // mm
1343 Tube("SCD","Screw+stud used to mount things to the SSD support cone",
1344 rmin,rmax,dz,SSDsw);
1345 rmin=0.0;rmax=6.0;dz=0.5*12.0; // mm
1346 Tube("SCE","pin used to mount things to the SSD support cone",
1347 rmin,rmax,dz,SSDsw);
1348 Za[0] = 6.; Wa[0] = ; // Carbon Content
1349 Za[1] = 25.; Wa[1] = ; // Iron Content
1350 MixtureByWeight(SSDsw,"Stainless steal screw, pin, and stud material",
3717ba94 1351 Z,W,dens,3);
db708caf 1352 k=l=0;
1353 for(i=0;i<2;i++){ // position for ITS-TPC mounting brackets
1354 for(j=0;j<2;j++){ // 2 screws per bracket
2cf828ba 1355 ncse++;
db708caf 1356 t = -5.0+10.0*((Double_t)j)+180.*((Double_t)i);
1357 x = RoutHole*Sind(t);
1358 y = RoutHole*Cosd(t);
1359 z = dz;
2cf828ba 1360 Pos("SCD",ncse,"SCB",x,y,z,0);
db708caf 1361 } // end for j
1362 for(j=0;j<3;j++){ // 3 pins per bracket
2cf828ba 1363 ncpe++;
db708caf 1364 t = -3.0+3.0*((Double_t)j)+180.*((Double_t)i);
1365 x = RoutHole*Sind(t);
1366 y = RoutHole*Cosd(t);
1367 z = dz;
2cf828ba 1368 Pos("SCE",ncpe,"SCB",x,y,z,0);
db708caf 1369 } // end for j
3717ba94 1370 } // end for i
db708caf 1371 for(i=0;i<2;i++){ // position for ITS-rail mounting brackets
1372 for(j=0;j<4;j++){ // 4 screws per bracket
1373 Double_t a[4]={0.0,2.0,5.0,7.0}; // Relative angles.
2cf828ba 1374 ncse++;
db708caf 1375 t = 90.0-a[j]+187.*((Double_t)i);
1376 x = RoutHole*Sind(t);
1377 y = RoutHole*Cosd(t);
1378 z = dz;
2cf828ba 1379 Pos("SCD",kncs,"SCB",x,y,z,0);
db708caf 1380 } // end for j
1381 for(j=0;j<2;j++){ // 2 pins per bracket
2cf828ba 1382 ncpe++;
db708caf 1383 t = 88+7.0*((Double_t)j)+184.*((Double_t)i);
1384 x = RoutHole*Sind(t);
1385 y = RoutHole*Cosd(t);
1386 z = dz;
2cf828ba 1387 Pos("SCE",ncse,"SCB",x,y,z,0);
1388 } // end for j
1389 } // end for i
1390 for(i=0;i<nmounts;i++){ // mounting holes/screws for beam pipe support
1391 // and SPD cone support (dump side,non-dump side has them to).
1392 for(j=0;j<2;j++){ // 2 screws per bracket
1393 ncse++;
1394 t = 180.*20./(RoutHole*TMath::Pi());
1395 t = 45.0+((Doulbe_t)(j-1))*t+90.*((Double_t)i);
1396 x = RoutHole*Sind(t);
1397 y = RoutHole*Cosd(t);
1398 z = dz;
1399 Pos("SCD",ncse,"SCB",x,y,z,0);
1400 } // end for j
1401 for(j=0;j<1;j++){ // 1 pins per bracket
1402 ncpe++;
1403 t = 45.0+90.*((Double_t)i);
1404 x = RoutHole*Sind(t);
1405 y = RoutHole*Cosd(t);
1406 z = dz;
1407 Pos("SCE",ncpe,"SCB",x,y,z,0);
db708caf 1408 } // end for j
3717ba94 1409 } // end for i
1410 //
db708caf 1411 // There is no carbon fiber between this upper left section and the
1412 // SSD spoaks. We remove it by replacing it with Rohacell foam.
2cf828ba 1413 t = ct/(0.5*(Rholemax+Rholemin));// It is not posible to get the
1414 // carbon fiber thickness uniform in this phi direction. We can only
1415 // make it a fixed angular thickness.
1416 t *= 180.0/TMath::Pi();
1417 dphi = 5.0 - 2.0*t; // degrees
1418 phi0 = 12.5+t; // degrees see drawing ALR-0767.
db708caf 1419 nz = 4;
1420 Double_t *zf = new Double_t[nz];
1421 Double_t *rminf = new Double_t[nz];
1422 Double_t *rmaxf = new Double_t[nz];
1423 zf[0] = zc[2];
1424 rminf[0] = rminc[3];
1425 rmaxf[0] = rminf[0];
1426 rminf[1] = rmina[5];
1427 rmaxf[1] = rminf[0];
1428 zf[1] = zc[0]+(zc[2]-zc[0])*(rminf[1]-rminc[0])/(rminc[2]-rminc[0]);
1429 zf[2] = zc[3];
1430 rminf[2] = rminf[1];
1431 rmaxf[2] = rmaxf[1];
1432 zf[3] = zc[1]+(zc[3]-zc[1])*(rmaxf[3]-rmaxc[1])/(rmaxc[3]-rmaxc[1]);
1433 rminf[3] = rmina[5];
1434 rmaxf[3] = rminf[3];
1435 PolyCone("SCF","SSD Suport cone Rohacell foam left edge",
1436 phi0,dphi,nz,*zc,*rminc,*rmaxc,SSDfo);
1437 Pos("SCF",1,"SCA",0.0,.0,0.0,0);
2cf828ba 1438 for(i=1;i<nspoaks;i++){
1439 Zmatrix(irot+i,360./((Double_t)nspoaks));
1440 Pos("SCG",i+1,"SCA",0.0,.0,0.0,irot+i);
1441 } // end for i
db708caf 1442 //=================================================================
1443 // Now for the spoak part of the SSD cone.
1444 // It is not posible to inclue the radius of curvature between
1445 // the spoak part and the upper left part of the SSD cone or lowwer right
1446 // part. This would be discribed by the following curves.
1447 // R = Rmax - (5mm)*Sin(t) phi = phi0+(5mm*180/(Pi*RoutHole))*Sin(t)
1448 // where 0<=t<=90 For the inner curve a simular equiation holds.
1449 phi0 = 12.5; // degrees see drawing ALR-0767.
1450 dphi = 5.0; // degrees
1451 nz = 4;
1452 Double_t *zg = new Double_t[nz];
1453 Double_t *rming = new Double_t[nz];
1454 Double_t *rmaxg = new Double_t[nz];
1455 zg[0] = zb[5];
1456 rming[0] = rmina[5];
3717ba94 1457 rmaxg[0] = rming[0];
db708caf 1458 zg[1] = za[6];
1459 rming[1] = -thatc*(zg[1]-za[3])+rmina[3];
1460 rmaxg[1] = rmaxg[0];
1461 rming[2] = Rholemin;
1462 zg[2] = za[3]-(rming[2]-rmina[3])/tantc;
1463 rmaxg[2] = -thatc*(zg[2]-za[4])+rmaxa[4];
1464 rming[3] = rming[2];
3717ba94 1465 rmaxg[3] = rming[3];
db708caf 1466 zg[3] = za[4]-(rmaxg[3]-rmaxa[4])/tantc;
1467 PolyCone("SCG","SSD spoak carbon fiber surfaces",
1468 phi0,dphi,nz,*zc,*rminc,*rmaxc,SSDcf);
db708caf 1469 Pos("SCG",i+1,"SCA",0.0,.0,0.0,0);
1470 for(i=1;i<nspoaks;i++){
db708caf 1471 Pos("SCG",i+1,"SCA",0.0,.0,0.0,irot+i);
3717ba94 1472 } // end for i
db708caf 1473 // For the foam core.
1474 t = ct/(0.5*(Rholemax+Rholemin));// It is not posible to get the
1475 // carbon fiber thickness uniform in this phi direction. We can only
1476 // make it a fixed angular thickness.
1477 t *= 180.0/TMath::Pi();
1478 dphi = 5.0 - 2.0*t; // degrees
1479 phi0 = 12.5+t; // degrees see drawing ALR-0767.
3717ba94 1480 nz = 4;
db708caf 1481 Double_t *zh = new Double_t[nz];
1482 Double_t *rminh = new Double_t[nz];
1483 Double_t *rmaxh = new Double_t[nz];
1484 zh[0] = zf[2];
1485 rminh[0] = rming[0];
1486 rmaxh[0] = rmaxg[0];
1487 zh[1] = zf[3];
1488 rminh[1] = rming[1]-(ct/sintc-(zg[1]-zh[1]))*tantc;
1489 rmaxh[1] = rmaxh[0];
1490 zh[2] = zg[2]+ct/tanth;
1491 rminh[2] = rming[2];
1492 rmaxh[2] = rmaxg[2]-(ct/sintc-(zg[2]-zh[2]))*tantc;
1493 zh[3] = zg[3]-ct/sintc;
1494 rminh[3] = rminh[2];
1495 rmaxh[3] = rminh[3];
2cf828ba 1496 PolyCone("SCH","SSD spoak foam core",
1497 phi0,dphi,nz,*zc,*rminc,*rmaxc,SSDfo);
db708caf 1498 Pos("SCH",1,"SCG",0.0,.0,0.0,0);
3717ba94 1499 //
db708caf 1500 //==================================================================
2cf828ba 1501 // Now for the Inner most part of the SSD cone.
1502 phi0 = 0.0;
1503 dphi = 360.0;
1504 nz = 8;
1505 Double_t *zi = new Double_t[nz];
1506 Double_t *rmini = new Double_t[nz];
1507 Double_t *rmaxi = new Double_t[nz];
1508 Double_t za,rmina,rmaxa; // additional point not needed in call to pcons.
1509 zi[0] = zg[2];
1510 rmini[0] = rming[2];
1511 rmaxi[0] = rmini[0];
1512 zi[1] = zg[3];
1513 rmini[1] = -tantc*(zi[1]-za[3])+rmina[3];
1514 rmaxi[1] = rmaxi[0];
1515 rmini[5] = Rinmin;
1516 rmaxi[5] = Rinmax+rc*sintc;
1517 zi[5] =za[4]+(rmaxa[4]-rmaxi[5])/tantc;
1518 zia = zi[5]+rc*costc;
1519 rminia = rmini[5];
1520 rmaxia = Rinmax;
1521 zi[3] = zia-dzin;
1522 zi[2] = zi[3] -rc*costc;
1523 rmini[2] = -tantc*(zi[2]-za[3])+rmina[3];
1524 rmaxi[2] = -tantc*(zi[2]-za[4])+rmaxa[4];
1525 rmini[3] = rmini[2] -rc*costc;
1526 zi[4] = zi[3];
1527 rmini[4] = Rinmin;
1528 rmaxi[4] = -tantc*(zi[4]-za[4])+rmaxa[4];
1529 rmaxi[3] = rmaxi[4];
1530 zi[6] = zcylinder;
1531 rmini[6] = Rinmin;
1532 rmaxi[6] = rmaxi[5] - (zi[5]-zi[6])*(rmaxi[5]-rmaxa)/(zi[5]-zia);
1533 zi[7] = zi[6];
1534 rmini[7] = Rincylinder;
1535 rmaxi[7] = rmaxi[6];
1536 rmini[8] = Rincylinder;
1537 rmaxi[8] = Rini[8];
1538 zi[8] = zi[5]+(rmaxi[8]-rmaxi[5])*(zia-zi[5])/(rmaxa-rmaxi[5]);
1539 PolyCone("SCI","SSD lower/inner right part of SSD cone",
1540 phi0,dphi,nz,*zc,*rminc,*rmaxc,SSDcf);
1541 Pos("SCI",1,mother,0.0,.0,0.0,0);
1542 // Now for Inserto volume at the inner most radius.
1543 phi0 = 0.0;
1544 dphi = 360.0;
1545 nz = 7;
1546 Double_t *zk = new Double_t[nz];
1547 Double_t *rmink = new Double_t[nz];
1548 Double_t *rmaxk = new Double_t[nz];
1549 zk[1] = zi[3]+ct;
1550 zk[0] = zk[1]-(rc+ct)*costc;
1551 rmink[0] = rmini[3]+(rc+ct)*sintc;
1552 rmaxk[0] = rmink[0];
1553 rmink[1] = rmini[3];
1554 zk[2] = zk[1];
1555 rmink[2] = rmini[6];
1556 rmaxk[2] = rmaxk[1];
1557 zk[3] = zk[0]+(th+2.0*ct)*costc;
1558 rmink[3] = rmini[6];
1559 rmaxk[3] = rmaxk[0]+(th+2.0*ct)*sintc;
1560 rmaxk[1] = rmaxk[0]+(rmaxk[3]-rmaxk[0])*(zk[1]-zk[0])/(zk[3]-zk[0]);
1561 rmink[4] = rmini[6];
1562 rmaxk[4] = rmaxi[5]-ct*sintc;
1563 zk[4] = zc[1]+(zc3[3]-zc[1])*(rmaxk[4]-rmaxc[1])/(rmaxc[3]-rmaxc[1]);
1564 zk[5] = zi[5]-rc*costc-ct;
1565 rmink[5] = rmini[6];
1566 rmaxk[5] = rmini[8];
1567 zk[6] = zi[6];
1568 rmink[6] = rmini[6];
1569 rmaxk[6] = rmaxi[6];
1570 PolyCone("SCK","SSD inner most inserto material",
1571 phi0,dphi,nz,*zc,*rminc,*rmaxc,SSDfs);
1572 Pos("SCK",1,"SCI",0.0,.0,0.0,0);
1573 // Now for foam core at the inner most radius.
1574 phi0 = 0.0;
1575 dphi = 360.0;
1576 nz = 4;
1577 Double_t *zj = new Double_t[nz];
1578 Double_t *rminj = new Double_t[nz];
1579 Double_t *rmaxj = new Double_t[nz];
1580 rminj[0] = rmini[0]-ct;
1581 zj[0] = zc[0]+(zc[2]-zc[0])*(rminj[0]-rminc[0])/(rminc[2]-rminc[0]);
1582 rmaxj[0] = rminj[0];
1583 rmaxj[1] = rmaxj[0];
1584 zj[1] = zc[1]+(zc[3]-zc[1])*(rmaxj[1]-rmaxc[1])/(rmaxc[3]-rmaxc[1]);
1585 rminj[1] = rminc[0]+(rminc[2]-rminc[0])*(zj[1]-zc[0])/(zc[2]-zc[0]);
1586 zj[2] = zk[0];
1587 rminj[2] = rkmin[0];
1588 rmaxj[2] = rmaxc[1]+(rmaxc[3]-rmaxc[1])*(zj[2]-zc[1])/(zc[3]-zc[1]);
1589 zj[3] = zk[3];
1590 rminj[3] = rmaxk[3];
1591 rmaxj[3] = rminj[3];
1592 PolyCone("SCJ","SSD inner most foam core",
1593 phi0,dphi,nz,*zc,*rminc,*rmaxc,SSDfo);
1594 Pos("SCJ",1,"SCI",0.0,.0,0.0,0);
1595 // Now for foam core at the top of the inner most radius where
1596 // the spoaks are.
1597 t = ct/(0.5*(Rholemax+Rholemin));// It is not posible to get the
1598 // carbon fiber thickness uniform in this phi direction. We can only
1599 // make it a fixed angular thickness.
1600 t *= 180.0/TMath::Pi();
1601 dphi = 5.0 - 2.0*t; // degrees
1602 phi0 = 12.5+t; // degrees see drawing ALR-0767.
1603 nz = 4;
1604 Double_t *zl = new Double_t[nz];
1605 Double_t *rminl = new Double_t[nz];
1606 Double_t *rmaxl = new Double_t[nz];
1607 zl[0] = zh[2];
1608 rminl[0] = rmini[0];
1609 rmaxl[0] = rminl[0];
1610 zl[1] = zj[0];
1611 rminl[1] = rminj[1];
1612 rmaxl[1] = rmaxi[0];
1613 zl[2] = zh[3];
1614 rminl[2] = rminl[1];
1615 rmaxl[2] = rmaxl[1];
1616 zl[3] = zj[1];
1617 rminl[3] = rminl[2];
1618 rmaxl[3] = rminl[3];
1619 PolyCone("SCL","SSD inner most foam core",
1620 phi0,dphi,nz,*zc,*rminc,*rmaxc,SSDfo);
1621 Pos("SCL",1,"SCI",0.0,.0,0.0,0);
1622 for(i=1;i<nspoaks;i++){
1623 Pos("SCG",i+1,"SCA",0.0,.0,0.0,irot+i);
1624 } // end for i
1625 // Now for the SSD mounting posts
1626 dphi = 180.0*dRPost/(RPostmin+0.5*dRPost)/TMath::Pi(); // degrees
1627 phi0 = phi0post; //
1628 nz = 3;
1629 Double_t *zo = new Double_t[nz];
1630 Double_t *rmino = new Double_t[nz];
1631 Double_t *rmaxo = new Double_t[nz];
1632 rmino[0] = RPostmin+dRPost;
1633 rmaxo[0] = rmino[0];
1634 zo[0] = za[4]+(rmaxa[4]-Rmaxo[0])/tantc;
1635 rmino[1] = RPostmin;
1636 zo[1] = za[4]+(rmaxa[4]-Rmino[1])/tantc;
1637 rmaxo[1] = rmaxo[0];
1638 zo[2] = z0+zpostmax;
1639 rmino[2] = RPostmin;
1640 rmaxo[2] = rmin0[2]+dRPost;
1641 PolyCone("SCO","SSD mounting post, carbon fiber",
1642 phi0,dphi,nz,*zc,*rminc,*rmaxc,SSDcf);
1643 Pos("SCO",1,mother,0.0,.0,0.0,0);
1644 for(i=1;i<nposts;i++){
1645 Zmatrix(irot+i,360./((Double_t)nposts));
1646 Pos("SCO",i+1,mother,0.0,.0,0.0,irot+i);
1647 } // end for i
1648 // Now for the SSD mounting posts
1649 t = 180.0*ct/(RPostmin+0.5*dRPost)/TMath::Pi();
1650 dphi = dphi-2.0*t; // degrees
1651 phi0 = phi0+t; //
1652 nz = 3;
1653 Double_t *zp = new Double_t[nz];
1654 Double_t *rminp = new Double_t[nz];
1655 Double_t *rmaxp = new Double_t[nz];
1656 rminp[0] = rmino[0]-ct;
1657 rmaxp[0] = rminp[0];
1658 zp[0] = za[4]+(rmaxa[4]-Rmaxp[0])/tantc;
1659 rminp[1] = rmino[0]+ct;
1660 rmaxp[1] = rmino[0]-ct;
1661 zp[1] = za[4]+(rmaxa[4]-Rminp[1])/tantc;
1662 rminp[2] = rminp[1];
1663 rmaxp[2] = rmaxp[1];
1664 zp[2] = z0-zpostmax;
1665 PolyCone("SCP","SSD mounting post, Inserto",
1666 phi0,dphi,nz,*zc,*rminc,*rmaxc,SSDfs);
1667 Pos("SCP",1,"SCO",0.0,.0,0.0,0);
1668 // This insrto continues into the SSD cone displacing the foam
1669 // and the carbon fiber surface at those points where the posts are.
1670 nz = 4;
1671 Double_t *zm = new Double_t[nz];
1672 Double_t *rminm = new Double_t[nz];
1673 Double_t *rmaxm = new Double_t[nz];
1674 Double_t *zn = new Double_t[nz];
1675 Double_t *rminn = new Double_t[nz];
1676 Double_t *rmaxn = new Double_t[nz];
1677 rminm[0] = RPostmin+dRPost-ct;
1678 rmaxm[0] = rminm[0];
1679 zm[0] = zj[0]+(zj[2]-zj[0])*(rminm[0]-rminj[0])/(rminj[2]-rminj[0]);
1680 rmaxm[1] = rmaxm[0];
1681 zm[1] = zj[1]+(zj[3]-zj[1])*(rmaxm[1]-rmaxj[1])/(rmaxj[3]-rmaxj[1]);
1682 rminm[2] = RPostmin+ct;
1683 zm[2] = zj[0]+(zj[2]-zj[0])*(rminm[2]-rminj[0])/(rminj[2]-rminm[0]);
1684 rmaxm[2] = rjmax[1]+(rjmax[3]-rmnax[1])*(zm[2]-zj[1])/(zj[3]-zj[1]);
1685 rminm[3] = rminm[2];
1686 rmaxm[3] = rminm[3];
1687 zn[0] = zm[1];
1688 rminn[0] = rmaxm[1];
1689 rmaxn[0] = rminn[0];
1690 rmaxn[1] = rmaxn[0];
1691 zn[1] = za4+(rmaxa[4]-rmaxn[1])/tantc;
1692 rminn[1] = rmaxj[1]+(rmaxj[3]-rmaxj[1])*(zn[1]-zj[1])/(zj[3]-zj[1]);
1693 zn[2] = zm[3];
1694 rminn[2] = rminm[3];
1695 rmaxn[2] = -tantc*(zn[2]-za[4])+rmaxa[4];
1696 rminn[3] = rminn[2];
1697 rmaxn[3] = rminn[3];
1698 zn]3] = za[4]+(rmaxa[4]-rmaxn[3])/tantc;
1699 Pos("SCM",1,"SCJ",0.0,.0,0.0,0);
1700 Pos("SCN",1,"SCI",0.0,.0,0.0,0);
1701 for(i=1;i<nposts;i++){
1702 Pos("SCN",i+1,"SCJ",0.0,.0,0.0,irot+i);
1703 Pos("SCM",i+1,"SCI",0.0,.0,0.0,irot+i);
1704 } // end for i
3717ba94 1705 //
3717ba94 1706 //==============================================================
dfefbaec 1707 delete[] za;delete[] rmina;delete[] rmaxa;
3717ba94 1708 delete[] zb;delete[] rminb;delete[] rmaxb;
1709 delete[] zc;delete[] rminc;delete[] rmaxc;
1710 delete[] zd;delete[] rmind;delete[] rmaxd;
1711 delete[] ze;delete[] rmine;delete[] rmaxe;
1712 delete[] zf;delete[] rminf;delete[] rmaxf;
1713 delete[] zg;delete[] rming;delete[] rmaxg;
1714 delete[] zh;delete[] rminh;delete[] rmaxh;
1715 delete[] zi;delete[] rmini;delete[] rmaxi;
1716 delete[] zj;delete[] rminj;delete[] rmaxj;
dfefbaec 1717 // Set back to cm default scale before exiting.
1718 SetScalecm();
1719 return;
2b680d9b 1720}
1721//______________________________________________________________________
1722void AliITSv11::CreateGeometry(){
dfefbaec 1723 ////////////////////////////////////////////////////////////////////////
1724 // This routine defines and Creates the geometry for version 11 of the ITS.
1725 ////////////////////////////////////////////////////////////////////////
1726}
1727//______________________________________________________________________
1728void AliITSv11::CreateMaterials(){
2b680d9b 1729////////////////////////////////////////////////////////////////////////
dfefbaec 1730 //
1731 // Create ITS materials
1732 // This function defines the default materials used in the Geant
1733 // Monte Carlo simulations for the geometries AliITSv1, AliITSv3,
1734 // AliITSv11.
1735 // In general it is automatically replaced by
1736 // the CreatMaterials routine defined in AliITSv?. Should the function
1737 // CreateMaterials not exist for the geometry version you are using this
1738 // one is used. See the definition found in AliITSv5 or the other routine
1739 // for a complete definition.
1740 //
1741}
1742//______________________________________________________________________
1743void AliITSv11::InitAliITSgeom(){
1744 // Based on the geometry tree defined in Geant 3.21, this
1745 // routine initilizes the Class AliITSgeom from the Geant 3.21 ITS geometry
1746 // sturture.
1747}
1748
1749//______________________________________________________________________
1750void AliITSv11::Init(){
1751 ////////////////////////////////////////////////////////////////////////
1752 // Initialise the ITS after it has been created.
1753 ////////////////////////////////////////////////////////////////////////
1754}
1755//______________________________________________________________________
1756void AliITSv11::SetDefaults(){
1757 // sets the default segmentation, response, digit and raw cluster classes
1758}
1759//______________________________________________________________________
1760void AliITSv11::DrawModule(){
1761 ////////////////////////////////////////////////////////////////////////
1762 // Draw a shaded view of the FMD version 11.
1763 ////////////////////////////////////////////////////////////////////////
1764}
1765//______________________________________________________________________
1766void AliITSv11::StepManager(){
1767 ////////////////////////////////////////////////////////////////////////
1768 // Called for every step in the ITS, then calles the AliITShit class
1769 // creator with the information to be recoreded about that hit.
1770 // The value of the macro ALIITSPRINTGEOM if set to 1 will allow the
1771 // printing of information to a file which can be used to create a .det
1772 // file read in by the routine CreateGeometry(). If set to 0 or any other
1773 // value except 1, the default behavior, then no such file is created nor
1774 // it the extra variables and the like used in the printing allocated.
1775 ////////////////////////////////////////////////////////////////////////
2b680d9b 1776}
dfefbaec 1777