]> git.uio.no Git - u/mrichter/AliRoot.git/blame - ITS/AliITSBaseGeometry.cxx
Transition to NewIO
[u/mrichter/AliRoot.git] / ITS / AliITSBaseGeometry.cxx
CommitLineData
aa9bc63b 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
88cb7938 16/* $Id$ */
aa9bc63b 17
18/*
19 A base geometry class defining all of the ITS volumes that make up an ITS
20geometry.
21Auhors: B. S. Nilsen
22Version 0
23Created February 2003.
24*/
25
26#include <Riostream.h>
27#include <stdio.h>
28#include <stdlib.h>
29#include <string.h>
30#include <TMath.h>
31#include <TGeometry.h>
32#include <TNode.h>
33#include <TTUBE.h>
34#include <TTUBS.h>
35#include <TPCON.h>
bc825688 36#include <TVector3.h>
aa9bc63b 37#include <TFile.h> // only required for Tracking function?
38#include <TCanvas.h>
39#include <TObjArray.h>
40#include <TLorentzVector.h>
41#include <TObjString.h>
42#include <TClonesArray.h>
43#include <TBRIK.h>
44#include <TSystem.h>
45#include <AliRun.h>
46#include <AliMagF.h>
47#include <AliConst.h>
48#include "AliITSBaseGeometry.h"
49
50ClassImp(AliITSBaseGeometry)
162acd47 51
0b126f29 52const Double_t AliITSBaseGeometry::fAlpha = 7.297352533e-3;
53const Double_t AliITSBaseGeometry::fRe = 2.81794028e-13;
54const Double_t AliITSBaseGeometry::fNa = 6.02214199e+23;
162acd47 55Int_t AliITSBaseGeometry::fNCreates = 0;
56Int_t* AliITSBaseGeometry::fidrot = 0;
57Int_t AliITSBaseGeometry::fidrotsize = 0;
58Int_t AliITSBaseGeometry::fidrotlast = 0;
59Int_t AliITSBaseGeometry::fVolNameSize = 0;
60Int_t AliITSBaseGeometry::fVolNameLast = 0;
61TString* AliITSBaseGeometry::fVolName = 0;
62
aa9bc63b 63//______________________________________________________________________
64AliITSBaseGeometry::AliITSBaseGeometry(){
65 // Default construtor for the ITS Base Geometry class.
66 // Inputs:
67 // none.
68 // Outputs:
69 // none.
70 // Return:
71 // none.
72
73 fScale = 1.0; // Default value.
74 fits = 0; // zero pointers.
162acd47 75 if(fNCreates==0){ // only for very first init
76 } // end if
aa9bc63b 77 fNCreates++; // incrament this creation counter.
78}
79//______________________________________________________________________
80AliITSBaseGeometry::AliITSBaseGeometry(AliModule *its,Int_t iflag){
81 // Standard construtor for the ITS Base Geometry class.
82 // Inputs:
83 // Int_t iflag flag to indecate specific swiches in the geometry
84 // Outputs:
85 // none.
86 // Return:
87 // none.
88
89 fScale = 1.0; // Default value.
90 fits = its; // get a copy of the pointer to the ITS.
162acd47 91 if(fNCreates==0){ // only for very first init
92 fidrotsize = ITSG3VnameToIndex("TSV")+1;
93 fidrot = new Int_t[fidrotsize];
94 fidrotlast = 0;
95 } // end if
aa9bc63b 96 fNCreates++; // incrament this creation counter.
97}
98//______________________________________________________________________
99AliITSBaseGeometry::~AliITSBaseGeometry(){
100 // Standeard destructor for the ITS Base Geometry class.
101 // Inputs:
102 // Int_t iflag flag to indecate specific swiches in the geometry
103 // Outputs:
104 // none.
105 // Return:
106 // none.
107
108 fits = 0; // This class does not own this class. It contaitns a pointer
109 // to it for conveniance.
aa9bc63b 110 fNCreates--;
111 if(fNCreates==0){ // Now delete the static members
112 Int_t i;
113 if(fVolName!=0){
114 for(i=0;i<fVolNameLast;i++) delete fVolName[i];
115 fVolNameSize = 0;
116 fVolNameLast = 0;
117 delete[] fVolName;
118 }// end if
119 delete[] fidrot;
120 fidrotsize = fidrotlast = 0;
121 }// end if
122}
123//______________________________________________________________________
124Int_t AliITSBaseGeometry::AddVolName(const TString name){
125 // Checks if the volume name already exist, if not it adds it to
126 // the list of volume names and returns an index to that volume name.
127 // it will create and expand the array of volume names as needed.
128 // If the volume name already exists, it will give an error message and
129 // return an index <0.
130 // Inputs:
131 // const TString name Volume name to be added to the list.
132 // Outputs:
133 // none.
134 // Return:
135 // The index where this volume name is stored.
136 Int_t i;
137
138 if(fVolName==0){ // must create array.
162acd47 139 fVolNameSize = 38624;
aa9bc63b 140 fVolName = new TString[fVolNameSize];
141 fVolNameLast = 0;
142 } // end if
143 for(i=0;i<fVolNameLast;i++) if(fVolName[i].CompareTo(name)==0){ // Error
162acd47 144 Error("AddVolName","Volume name already exists for volume %d name %s",
145 i,name.Data());
aa9bc63b 146 return -1;
147 } // end for i
148 if(fVolNameSize==fVolNameLast-1){ // Array is full must expand.
149 Int_t size = fVolNameSize*2;
150 TString *old = fVolName;
151 fVolName = new TString[fVolNameSize];
152 for(i=0;i<fVolNameLast;i++) fVolName[i] = old[i];
153 delete[] old;
154 fVolNameSize = size;
155 } // end if
162acd47 156 i=ITSIndexToITSG3name(fVolNameLast);
157 if(strcmp((char*)(&i),"ITSV")==0){
aa9bc63b 158 // Special Reserved Geant 3 volumen name. Skip it
159 // fill it with explination for conveniance.
160 fVolName[fVolNameLast] = "ITS Master Mother Volume";
161 fVolNameLast++;
162 } // end if
163 fVolName[fVolNameLast] = name;
164 fVolNameLast++;
165 return fVolNameLast-1; // return the index
166}
167//______________________________________________________________________
162acd47 168Int_t AliITSBaseGeometry::ITSIndexToITSG3name(const Int_t i){
aa9bc63b 169 // Given the ITS volume index i, it returns the Geant3 ITS volume
170 // name. The valid characters must be in the range
171 // '0' through 'Z'. This will include all upper case letter and the
172 // numbers 0-9. In addition it does not will include the following simbols
173 // ":;<=>?@"
174 // Inputs:
175 // const Int_t i the ITS volume index
176 // Output:
177 // none.
178 // Return:
179 // char[4] with the ITS volume name starting from "I000" to "IZZZ"
180 const Int_t rangen=(Int_t)('9'-'0'+1); // range of numbers
181 const Int_t rangel=(Int_t)('Z'-'A'+1); // range of letters
182 const Int_t range = rangen+rangel; // the number of characters between
183 // 0-9 and A-Z.
162acd47 184 Int_t k;
185 Byte_t *a = (Byte_t*) &k;
aa9bc63b 186 Int_t j = i;
187
162acd47 188 k = 0;
189 a[0] = (Byte_t)('I');
190 a[1] = (Byte_t)('0'+j/(range*range));
191 if(a[1]>'9') a[1] += 'A'-'9'-1;//if it is a letter add in gap for simples.
192 j -= range*range*((Int_t)(j/(range*range)));
193 a[2] = (Byte_t)('0'+j/range);
194 if(a[2]>'9') a[2] += 'A'-'9'-1;//if it is a letter add in gap for simples.
195 j -= range*((Int_t)(j/range));
196 a[3] = (Byte_t)('0'+j);
197 if(a[3]>'9') a[3] += 'A'-'9'-1;//if it is a letter add in gap for simples.
198 return k;
aa9bc63b 199}
200//______________________________________________________________________
bc825688 201Int_t AliITSBaseGeometry::ITSG3VnameToIndex(const char *name){
aa9bc63b 202 // Given the last three characters of the ITS Geant3 volume name,
203 // this returns the index. The valid characters must be in the range
204 // '0' through 'Z'. This will include all upper case letter and the
205 // numbers 0-9. In addition it will include the following simbles
206 // ":;<=>?@"
207 // Inputs:
208 // const char name[3] The last three characters of the ITS Geant3
209 // volume name
210 // Output:
211 // none.
212 // Return:
213 // Int_t the index.
162acd47 214 const Int_t rangen = (Int_t)('9'-'0'+1); // range of numbers
215 const Int_t rangel = (Int_t)('Z'-'A'+1); // range of letters
216 const Int_t range = rangen+rangel; // the number of characters between
217 // 0-9 + A-Z.
218 Int_t i=0,j,k;
219
220 k = strlen(name)-1;
221 for(j=k;j>k-3;j--) if(isdigit(name[j])) // number
222 i += (Int_t)((name[j]-'0')*TMath::Power((Double_t)range,
223 (Double_t)(k-j)));
224 else
225 i += (Int_t)((name[j]-'A'+rangen)*TMath::Power((Double_t)range,
226 (Double_t)(k-j)));
aa9bc63b 227 return i;
228}
229//______________________________________________________________________
230TString AliITSBaseGeometry::GetVolName(const Int_t i)const{
231 // Returns the volume name at a given index i. Index must be in
232 // range and the array of volume names must exist. If there is an
233 // error, a message is written and 0 is returned.
234 // Inputs:
235 // const Int_t i Index
236 // Output:
237 // none.
238 // Return:
239 // A TString contianing the ITS volume name.
240
241 if(i<0||i>=fVolNameLast){
242 Error("GetVolName","Index=%d out of range but be witin 0<%d",i,
243 fVolName-1);
244 return 0;
245 } // end if Error
246 return fVolName[i];
247}
248//______________________________________________________________________
249Int_t AliITSBaseGeometry::GetVolumeIndex(const TString &a){
250 // Return the index corresponding the the volume name a. If the
251 // Volumen name is not found, return -1, and a warning message given.
252 // Inputs:
253 // const TString &a Name of volume for which index is wanted.
254 // Output:
255 // none.
256 // Return:
257 // Int_t Index corresponding the volume a. If not found -1 is returned.
258 Int_t i;
259
260 for(i=0;i<fVolNameLast;i++) if(fVolName[i].CompareTo(a)==0) return i;
261 Info("GetVolumeIndex","Volume name %s not found",a.Data());
262 return -1;
263}
264//______________________________________________________________________
162acd47 265void AliITSBaseGeometry::Box(const char *gnam,const TString &dis,
aa9bc63b 266 Double_t dx,Double_t dy,Double_t dz,Int_t med){
bc825688 267 // Interface to TMC->Gsvolu() for ITS box geometries. Box with faces
aa9bc63b 268 // perpendicular to the axes. It has 3 paramters. See SetScale() for
269 // units. Default units are geant 3 [cm].
270 // Inputs:
162acd47 271 // const char *gnam 3 character geant volume name. The letter "I"
aa9bc63b 272 // is appended to the front to indecate that this
273 // is an ITS volume.
274 // TString &dis String containging part discription.
275 // Double_t dx half-length of box in x-axis
276 // Double_t dy half-length of box in y-axis
277 // Double_t dz half-length of box in z-axis
278 // Int_t med media index number.
279 // Output:
280 // none.
281 // Return.
282 // none.
162acd47 283 char name[5];
aa9bc63b 284 Float_t param[3];
285
aa9bc63b 286 param[0] = fScale*dx;
287 param[1] = fScale*dy;
288 param[2] = fScale*dz;
162acd47 289 G3name(gnam,name);
290 gMC->Gsvolu(name,"BOX ",GetMed(med),param,3);
aa9bc63b 291}
292//______________________________________________________________________
bc825688 293void AliITSBaseGeometry::Box(AliITSBoxData &d,Int_t med){
294 // Interface to TMC->Gsvolu() for ITS box geometries. Box with faces
295 // perpendicular to the axes. It has 3 paramters. See SetScale() for
296 // units. Default units are geant 3 [cm].
297 // Inputs:
298 // AliITSBoxData &d Structure with the Box parameters defined.
299 // Int_t med media index number.
300 // Output:
301 // none.
302 // Return.
303 // none.
304 char name[5];
305 Float_t param[3];
306 Int_t i,k;
307 char *j = (char *) &k;
308
309 param[0] = fScale*d.DxAt();
310 param[1] = fScale*d.DyAt();
311 param[2] = fScale*d.DzAt();
312 d.SetVid(AddVolName((d.GetName())->Data()));
313 k = ITSIndexToITSG3name(d.GetVid());
314 for(i=0;i<4;i++) name[i] = j[i];
315 name[4] = '\0';
316 gMC->Gsvolu(name,"BOX ",GetMed(med),param,3);
317}
318//______________________________________________________________________
162acd47 319void AliITSBaseGeometry::Trapezoid1(const char *gnam,const TString &dis,
aa9bc63b 320 Double_t dxn,Double_t dxp,Double_t dy,
321 Double_t dz,Int_t med){
322 // Interface to TMC->Gsvolu() for ITS TRD1 geometries. Trapezoid with the
323 // x dimension varing along z. It has 4 parameters. See SetScale() for
324 // units. Default units are geant 3 [cm].
325 // Inputs:
162acd47 326 // const char *gnam 3 character geant volume name. The letter "I"
aa9bc63b 327 // is appended to the front to indecate that this
328 // is an ITS volume.
329 // TString &dis String containging part discription.
330 // Double_t dxn half-length along x at the z surface positioned
331 // at -DZ
332 // Double_t dxp half-length along x at the z surface positioned
333 // at +DZ
334 // Double_t dy half-length along the y-axis
335 // Double_t dz half-length along the z-axis
336 // Int_t med media index number.
337 // Output:
338 // none.
339 // Return.
340 // none.
162acd47 341 char name[5];
aa9bc63b 342 Float_t param[4];
343
aa9bc63b 344 param[0] = fScale*dxn;
345 param[1] = fScale*dxp;
346 param[2] = fScale*dy;
347 param[3] = fScale*dz;
162acd47 348 G3name(gnam,name);
349 gMC->Gsvolu(name,"TRD1",GetMed(med),param,4);
aa9bc63b 350}
351//______________________________________________________________________
bc825688 352void AliITSBaseGeometry::Trapezoid1(AliITSTrapezoid1Data &d,Int_t med){
353 // Interface to TMC->Gsvolu() for ITS TRD1 geometries. Trapezoid with the
354 // x dimension varing along z. It has 4 parameters. See SetScale() for
355 // units. Default units are geant 3 [cm].
356 // Inputs:
357 // AliITSTrapezoid1Data &d Structure with the Trapazoid data in it.
358 // Int_t med media index number.
359 // Output:
360 // none.
361 // Return.
362 // none.
363 char name[5];
364 Float_t param[4];
365 Int_t i,k;
366 char *j = (char *) &k;
367
368 param[0] = fScale*d.DxAt(0);
369 param[1] = fScale*d.DxAt(1);
370 param[2] = fScale*d.DyAt();
371 param[3] = fScale*d.DzAt();
372 d.SetVid(AddVolName((d.GetName())->Data()));
373 k = ITSIndexToITSG3name(d.GetVid());
374 for(i=0;i<4;i++) name[i] = j[i];
375 name[4] = '\0';
376 gMC->Gsvolu(name,"TRD1",GetMed(med),param,4);
377}
378//______________________________________________________________________
162acd47 379void AliITSBaseGeometry::Trapezoid2(const char *gnam,const TString &dis,
aa9bc63b 380 Double_t dxn,Double_t dxp,Double_t dyn,
381 Double_t dyp,Double_t dz,Int_t med){
382 // Interface to TMC->Gsvolu() for ITS TRD2 geometries. Trapezoid with the
383 // x and y dimension varing along z. It has 5 parameters. See SetScale()
384 // for units. Default units are geant 3 [cm].
385 // Inputs:
162acd47 386 // const char *gnam 3 character geant volume name. The letter "I"
aa9bc63b 387 // is appended to the front to indecate that this
388 // is an ITS volume.
389 // TString &dis String containging part discription.
390 // Double_t dxn half-length along x at the z surface positioned
391 // at -DZ
392 // Double_t dxp half-length along x at the z surface positioned
393 // at +DZ
394 // Double_t dyn half-length along x at the z surface positioned
395 // at -DZ
396 // Double_t dyp half-length along x at the z surface positioned
397 // at +DZ
398 // Double_t dz half-length along the z-axis
399 // Int_t med media index number.
400 // Output:
401 // none.
402 // Return.
403 // none.
162acd47 404 char name[5];
aa9bc63b 405 Float_t param[5];
406
aa9bc63b 407 param[0] = fScale*dxn;
408 param[1] = fScale*dxp;
409 param[2] = fScale*dyn;
410 param[3] = fScale*dyp;
411 param[4] = fScale*dz;
162acd47 412 G3name(gnam,name);
413 gMC->Gsvolu(name,"TRD2",GetMed(med),param,5);
aa9bc63b 414}
415//______________________________________________________________________
bc825688 416void AliITSBaseGeometry::Trapezoid2(AliITSTrapezoid2Data &d,Int_t med){
417 // Interface to TMC->Gsvolu() for ITS TRD2 geometries. Trapezoid with the
418 // x and y dimension varing along z. It has 5 parameters. See SetScale()
419 // for units. Default units are geant 3 [cm].
420 // Inputs:
421 // AliITSTrapezoid2Data &d Structure with the Trapazoid data in it.
422 // Int_t med media index number.
423 // Output:
424 // none.
425 // Return.
426 // none.
427 char name[5];
428 Float_t param[5];
429 Int_t i,k;
430 char *j = (char *) &k;
431
432 param[0] = fScale*d.DxAt(0);
433 param[1] = fScale*d.DxAt(1);
434 param[2] = fScale*d.DyAt(0);
435 param[3] = fScale*d.DyAt(1);
436 param[4] = fScale*d.DzAt();
437 d.SetVid(AddVolName((d.GetName())->Data()));
438 k = ITSIndexToITSG3name(d.GetVid());
439 for(i=0;i<4;i++) name[i] = j[i];
440 name[4] = '\0';
441 gMC->Gsvolu(name,"TRD2",GetMed(med),param,5);
442}
443//______________________________________________________________________
162acd47 444void AliITSBaseGeometry::Trapezoid(const char *gnam,const TString &dis,
aa9bc63b 445 Double_t dz,Double_t thet,Double_t phi,
446 Double_t h1,Double_t bl1,Double_t tl1,
447 Double_t alp1,Double_t h2,Double_t bl2,
448 Double_t tl2,Double_t alp2,Int_t med){
449 // Interface to TMC->Gsvolu() for ITS TRAP geometries. General Trapezoid,
450 // The faces perpendicular to z are trapezia and their centers are not
451 // necessarily on a line parallel to the z axis. This shape has 11
162acd47 452 // parameters, but only cosidering that the faces should be planar, only
453 // 9 are really independent. A check is performed on the user parameters
454 // and a message is printed in case of non-planar faces. Ignoring this
455 // warning may cause unpredictable effects at tracking time. See
456 // SetScale() for units. Default units are geant 3 [cm].
aa9bc63b 457 // Inputs:
162acd47 458 // const char *gnam 3 character geant volume name. The letter "I"
aa9bc63b 459 // is appended to the front to indecate that this
460 // is an ITS volume.
461 // TString &dis String containging part discription.
462 // Double_t dz Half-length along the z-asix
463 // Double_t thet Polar angle of the line joing the center of the
464 // face at -dz to the center of the one at dz
465 // [degree].
466 // Double_t phi aximuthal angle of the line joing the center of
467 // the face at -dz to the center of the one at +dz
468 // [degree].
469 // Double_t h1 half-length along y of the face at -dz.
470 // Double_t bl1 half-length along x of the side at -h1 in y of
471 // the face at -dz in z.
472 // Double_t tl1 half-length along x of teh side at +h1 in y of
473 // the face at -dz in z.
162acd47 474 // Double_t alp1 angle with respect to the y axis from the
475 // center of the side at -h1 in y to the cetner
476 // of the side at +h1 in y of the face at -dz in z
aa9bc63b 477 // [degree].
478 // Double_t h2 half-length along y of the face at +dz
479 // Double_t bl2 half-length along x of the side at -h2 in y of
480 // the face at +dz in z.
481 // Double_t tl2 half-length along x of the side at _h2 in y of
482 // the face at +dz in z.
162acd47 483 // Double_t alp2 angle with respect to the y axis from the
484 // center of the side at -h2 in y to the center
485 // of the side at +h2 in y of the face at +dz in z
aa9bc63b 486 // [degree].
487 // Int_t med media index number.
488 // Output:
489 // none.
490 // Return.
491 // none.
162acd47 492 char name[5];
aa9bc63b 493 Float_t param[11];
494
aa9bc63b 495 param[0] = fScale*dz;
496 param[1] = thet;
497 param[2] = phi;
498 param[3] = fScale*h1;
499 param[4] = fScale*bl1;
500 param[5] = fScale*tl1;
501 param[6] = alp1;
502 param[7] = fScale*h2;
503 param[8] = fScale*bl2;
504 param[9] = fScale*tl2;
505 param[10] = alp2;
162acd47 506 G3name(gnam,name);
507 gMC->Gsvolu(name,"TRAP",GetMed(med),param,11);
aa9bc63b 508}
509//______________________________________________________________________
bc825688 510void AliITSBaseGeometry::Trapezoid(AliITSTrapezoidData &d,Int_t med){
511 // Interface to TMC->Gsvolu() for ITS TRAP geometries. General Trapezoid,
512 // The faces perpendicular to z are trapezia and their centers are not
513 // necessarily on a line parallel to the z axis. This shape has 11
514 // parameters, but only cosidering that the faces should be planar, only
515 // 9 are really independent. A check is performed on the user parameters
516 // and a message is printed in case of non-planar faces. Ignoring this
517 // warning may cause unpredictable effects at tracking time. See
518 // SetScale() for units. Default units are geant 3 [cm].
162acd47 519 // Inputs:
bc825688 520 // AliITSTrapezoidData &d Structure with the Trapazoid data in it.
162acd47 521 // Int_t med media index number.
522 // Output:
523 // none.
524 // Return.
525 // none.
526 char name[5];
bc825688 527 Float_t param[11];
162acd47 528 Int_t i,k;
529 char *j = (char *) &k;
530
bc825688 531 param[0] = fScale*d.DzAt();
532 param[1] = d.Theta();
533 param[2] = d.Phi();
534 param[3] = fScale*d.HAt(0);
535 param[4] = fScale*d.Bl(0);
536 param[5] = fScale*d.Tl(0);
537 param[6] = d.Alpha(0);
538 param[7] = fScale*d.HAt(1);
539 param[8] = fScale*d.Bl(1);
540 param[9] = fScale*d.Tl(1);
541 param[10] = d.Alpha(1);
162acd47 542 d.SetVid(AddVolName((d.GetName())->Data()));
543 k = ITSIndexToITSG3name(d.GetVid());
544 for(i=0;i<4;i++) name[i] = j[i];
545 name[4] = '\0';
bc825688 546 gMC->Gsvolu(name,"TRAP",GetMed(med),param,11);
aa9bc63b 547}
548//______________________________________________________________________
bc825688 549void AliITSBaseGeometry::TwistedTrapezoid(const char *gnam,
550 const TString &dis,
551 Double_t dz,Double_t thet,Double_t phi,
552 Double_t twist,Double_t h1,Double_t bl1,
553 Double_t tl1,Double_t apl1,Double_t h2,
554 Double_t bl2,Double_t tl2,Double_t apl2,
555 Int_t med){
556 // Interface to TMC->Gsvolu() for ITS GTRA geometries. General twisted
557 // trapazoid. The faces perpendicular to z are trapazia and their centers
558 // are not necessarily on a line parallel to the z axis as the TRAP.
559 // Additionally, the faces may be twisted so that none of their edges are
560 // parallel. It is a TRAP shape, exept that it is twisted in the x-y
561 // plane as a function of z. The parallel sides perpendicular to the x
562 // axis are rotated with respect to the x axis by an angle TWIST, which
563 // is one of the parameters. The shape is defined by the eight corners
564 // and is assumed to be constructed of straight lines joingin points on
565 // the boundry of the trapezoidal face at Z=-dz to the coresponding
566 // points on the face at z=+dz. Divisions are not allowed. It has 12
567 // parameters. See SetScale() for units. Default units are geant 3 [cm].
568 // Note: This shape suffers from the same limitations than the TRAP. The
569 // tracking routines assume that the faces are planar, but htis
570 // constraint is not easily expressed in terms of the 12 parameters.
571 // Additionally, no check on th efaces is performed in this case. Users
572 // should avoid to use this shape as much as possible, and if they have
573 // to do so, they should make sure that the faces are really planes.
574 // If this is not the case, the result of the trasport is unpredictable.
575 // To accelerat ethe computations necessary for trasport, 18 additioanl
576 // parameters are calculated for this shape are 1 DXODZ dx/dz of the
577 // line joing the centers of the faces at z=+_dz. 2 DYODZ dy/dz of the
578 // line joing the centers of the faces at z=+_dz.
579 // 3 XO1 x at z=0 for line joing the + on parallel side, perpendicular
580 // corners at z=+_dz.
581 // 4 YO1 y at z=0 for line joing the + on parallel side, + on
582 // perpendicular corners at z=+-dz.
583 // 5 DXDZ1 dx/dz for line joing the + on parallel side, + on
584 // perpendicular corners at z=+-dz.
585 // 6 DYDZ1 dy/dz for line joing the + on parallel side, + on
586 // perpendicular corners at z=+-dz.
587 // 7 X02 x at z=0 for line joing the - on parallel side, + on
588 // perpendicular corners at z=+-dz.
589 // 8 YO2 y at z=0 for line joing the - on parallel side, + on
590 // perpendicular corners at z=+-dz.
591 // 9 DXDZ2 dx/dz for line joing the - on parallel side, + on
592 // perpendicular corners at z=+-dz.
593 // 10 DYDZ2dy/dz for line joing the - on parallel side, + on
594 // perpendicular corners at z=+-dz.
595 // 11 XO3 x at z=0 for line joing the - on parallel side, - on
596 // perpendicular corners at z=+-dz.
597 // 12 YO3 y at z=0 for line joing the - on parallel side, - on
598 // perpendicular corners at z=+-dz.
599 // 13 DXDZ3 dx/dzfor line joing the - on parallel side, - on
600 // perpendicular corners at z=+-dz.
601 // 14 DYDZ3 dydz for line joing the - on parallel side, - on
602 // perpendicular corners at z=+-dz.
603 // 15 XO4 x at z=0 for line joing the + on parallel side, - on
604 // perpendicular corners at z=+-dz.
605 // 16 YO4 y at z=0 for line joing the + on parallel side, - on
606 // perpendicular corners at z=+-dz.
607 // 17 DXDZ4 dx/dz for line joing the + on parallel side, - on
608 // perpendicular corners at z=+-dz.
609 // 18 DYDZ4 dydz for line joing the + on parallel side, - on
610 // perpendicular corners at z=+-dz.
aa9bc63b 611 // Inputs:
162acd47 612 // const char *gnam 3 character geant volume name. The letter "I"
aa9bc63b 613 // is appended to the front to indecate that this
614 // is an ITS volume.
615 // TString &dis String containging part discription.
bc825688 616 // Double_t dz half-length along the z axis.
617 // Double_t thet polar angle of the line joing the center of the
618 // face at -dz to the center of the one at +dz
619 // [degrees].
620 // Double_t phi Azymuthal angle of teh line joing the centre of
621 // the face at -dz to the center of the one at +dz
622 // [degrees].
623 // Double_t twist Twist angle of the faces parallel to the x-y
624 // plane at z=+-dz around an axis parallel to z
625 // passing through their centre [degrees].
626 // Double_t h1 Half-length along y of the face at -dz.
627 // Double_t bl1 half-length along x of the side -h1 in y of the
628 // face at -dz in z.
629 // Double_t tl1 half-length along x of the side at +h1 in y of
630 // the face at -dz in z.
631 // Double_t apl1 Angle with respect to the y ais from the center
632 // of the side at -h1 in y to the centere of the
633 // side at +h1 in y of the face at -dz in z
634 // [degrees].
635 // Double_t h2 half-length along the face at +dz.
636 // Double_t bl2 half-length along x of the side at -h2 in y of
637 // the face at -dz in z.
638 // Double_t tl2 half-length along x of the side at +h2 in y of
639 // the face at +dz in z.
640 // Double_t apl2 angle with respect to the y axis from the
641 // center of the side at -h2 in y to the center
642 // of the side at +h2 in y of the face at +dz in
643 // z [degrees].
aa9bc63b 644 // Int_t med media index number.
645 // Output:
646 // none.
647 // Return.
648 // none.
162acd47 649 char name[5];
bc825688 650 Float_t param[12];
aa9bc63b 651
bc825688 652 param[0] = fScale*dz;
653 param[1] = thet;
654 param[2] = phi;
655 param[3] = twist;
656 param[4] = fScale*h1;
657 param[5] = fScale*bl1;
658 param[6] = fScale*tl1;
659 param[7] = apl1;
660 param[8] = fScale*h2;
661 param[9] = fScale*bl2;
662 param[10] = fScale*tl2;
663 param[11] = apl2;
162acd47 664 G3name(gnam,name);
bc825688 665 gMC->Gsvolu(name,"GTRA",GetMed(med),param,12);
aa9bc63b 666}
667//______________________________________________________________________
bc825688 668void AliITSBaseGeometry::TwistedTrapezoid(AliITSTrapezoidTwistedData &d,
669 Int_t med){
670 // Interface to TMC->Gsvolu() for ITS GTRA geometries. General twisted
671 // trapazoid. The faces perpendicular to z are trapazia and their centers
672 // are not necessarily on a line parallel to the z axis as the TRAP.
673 // Additionally, the faces may be twisted so that none of their edges are
674 // parallel. It is a TRAP shape, exept that it is twisted in the x-y
675 // plane as a function of z. The parallel sides perpendicular to the x
676 // axis are rotated with respect to the x axis by an angle TWIST, which
677 // is one of the parameters. The shape is defined by the eight corners
678 // and is assumed to be constructed of straight lines joingin points on
679 // the boundry of the trapezoidal face at Z=-dz to the coresponding
680 // points on the face at z=+dz. Divisions are not allowed. It has 12
681 // parameters. See SetScale() for units. Default units are geant 3 [cm].
682 // Note: This shape suffers from the same limitations than the TRAP. The
683 // tracking routines assume that the faces are planar, but htis
684 // constraint is not easily expressed in terms of the 12 parameters.
685 // Additionally, no check on th efaces is performed in this case. Users
686 // should avoid to use this shape as much as possible, and if they have
687 // to do so, they should make sure that the faces are really planes.
688 // If this is not the case, the result of the trasport is unpredictable.
689 // To accelerat ethe computations necessary for trasport, 18 additioanl
690 // parameters are calculated for this shape are 1 DXODZ dx/dz of the
691 // line joing the centers of the faces at z=+_dz. 2 DYODZ dy/dz of the
692 // line joing the centers of the faces at z=+_dz.
693 // 3 XO1 x at z=0 for line joing the + on parallel side, perpendicular
694 // corners at z=+_dz.
695 // 4 YO1 y at z=0 for line joing the + on parallel side, + on
696 // perpendicular corners at z=+-dz.
697 // 5 DXDZ1 dx/dz for line joing the + on parallel side, + on
698 // perpendicular corners at z=+-dz.
699 // 6 DYDZ1 dy/dz for line joing the + on parallel side, + on
700 // perpendicular corners at z=+-dz.
701 // 7 X02 x at z=0 for line joing the - on parallel side, + on
702 // perpendicular corners at z=+-dz.
703 // 8 YO2 y at z=0 for line joing the - on parallel side, + on
704 // perpendicular corners at z=+-dz.
705 // 9 DXDZ2 dx/dz for line joing the - on parallel side, + on
706 // perpendicular corners at z=+-dz.
707 // 10 DYDZ2dy/dz for line joing the - on parallel side, + on
708 // perpendicular corners at z=+-dz.
709 // 11 XO3 x at z=0 for line joing the - on parallel side, - on
710 // perpendicular corners at z=+-dz.
711 // 12 YO3 y at z=0 for line joing the - on parallel side, - on
712 // perpendicular corners at z=+-dz.
713 // 13 DXDZ3 dx/dzfor line joing the - on parallel side, - on
714 // perpendicular corners at z=+-dz.
715 // 14 DYDZ3 dydz for line joing the - on parallel side, - on
716 // perpendicular corners at z=+-dz.
717 // 15 XO4 x at z=0 for line joing the + on parallel side, - on
718 // perpendicular corners at z=+-dz.
719 // 16 YO4 y at z=0 for line joing the + on parallel side, - on
720 // perpendicular corners at z=+-dz.
721 // 17 DXDZ4 dx/dz for line joing the + on parallel side, - on
722 // perpendicular corners at z=+-dz.
723 // 18 DYDZ4 dydz for line joing the + on parallel side, - on
724 // perpendicular corners at z=+-dz.
aa9bc63b 725 // Inputs:
bc825688 726 // AliITSTrapezoidTwistedData &d Structure with the tube parameters
727 // Int_t med media index number.
aa9bc63b 728 // Output:
729 // none.
730 // Return.
731 // none.
162acd47 732 char name[5];
bc825688 733 Float_t param[12];
734 Int_t i,k;
735 char *j = (char *) &k;
aa9bc63b 736
bc825688 737 param[0] = fScale*d.DzAt();
738 param[1] = d.Theta();
739 param[2] = d.Phi();
740 param[3] = d.Twist();
741 param[4] = fScale*d.HAt(0);
742 param[5] = fScale*d.Bl(0);
743 param[6] = fScale*d.Tl(0);
744 param[7] = d.Alpha(0);
745 param[8] = fScale*d.HAt(1);
746 param[9] = fScale*d.Bl(1);
747 param[10] = fScale*d.Tl(1);
748 param[11] = d.Alpha(1);
749 d.SetVid(AddVolName((d.GetName())->Data()));
750 k = ITSIndexToITSG3name(d.GetVid());
751 for(i=0;i<4;i++) name[i] = j[i];
752 name[4] = '\0';
753 gMC->Gsvolu(name,"GTRA",GetMed(med),param,12);
aa9bc63b 754}
755//______________________________________________________________________
bc825688 756void AliITSBaseGeometry::Tube(const char *gnam,const TString &dis,
757 Double_t rmin,Double_t rmax,Double_t dz,
758 Int_t med){
759 // Interface to TMC->Gsvolu() for ITS TUBE geometries. Simple Tube. It has
760 // 3 parameters. See SetScale()
aa9bc63b 761 // for units. Default units are geant 3 [cm].
762 // Inputs:
162acd47 763 // const char *gnam 3 character geant volume name. The letter "I"
aa9bc63b 764 // is appended to the front to indecate that this
765 // is an ITS volume.
766 // TString &dis String containging part discription.
767 // Double_t rmin Inside Radius.
768 // Double_t rmax Outside Radius.
bc825688 769 // Double_t dz half-length along the z-axis
aa9bc63b 770 // Int_t med media index number.
771 // Output:
772 // none.
773 // Return.
774 // none.
162acd47 775 char name[5];
bc825688 776 Float_t param[3];
aa9bc63b 777
aa9bc63b 778 param[0] = fScale*rmin;
779 param[1] = fScale*rmax;
bc825688 780 param[2] = fScale*dz;
162acd47 781 G3name(gnam,name);
bc825688 782 gMC->Gsvolu(name,"TUBE",GetMed(med),param,3);
aa9bc63b 783}
784//______________________________________________________________________
bc825688 785void AliITSBaseGeometry::Tube(AliITSTubeData &d,Int_t med){
786 // Interface to TMC->Gsvolu() for ITS TUBE geometries. Simple Tube. It has
787 // 3 parameters. See SetScale()
788 // for units. Default units are geant 3 [cm].
aa9bc63b 789 // Inputs:
bc825688 790 // AliITSTubeData &d Structure with the tube parameters
791 // Int_t med media index number.
aa9bc63b 792 // Output:
793 // none.
794 // Return.
795 // none.
162acd47 796 char name[5];
bc825688 797 Float_t param[3];
798 Int_t i,k;
799 char *j = (char *) &k;
aa9bc63b 800
bc825688 801 param[0] = fScale*d.Rmin();
802 param[1] = fScale*d.Rmax();
803 param[2] = fScale*d.DzAt();
804 d.SetVid(AddVolName((d.GetName())->Data()));
805 k = ITSIndexToITSG3name(d.GetVid());
806 for(i=0;i<4;i++) name[i] = j[i];
807 name[4] = '\0';
808 gMC->Gsvolu(name,"TUBE",GetMed(med),param,3);
aa9bc63b 809}
810//______________________________________________________________________
bc825688 811void AliITSBaseGeometry::TubeSegment(const char *gnam,const TString &dis,
812 Double_t rmin,Double_t rmax,Double_t dz,
813 Double_t phi1,Double_t phi2,Int_t med){
814 // Interface to TMC->Gsvolu() for ITS TUBE geometries. Phi segment of a
815 // tube. It has 5 parameters. Phi1 should be smaller than phi2. If this
816 // is not the case, the system adds 360 degrees to phi2. See SetScale()
817 // for units. Default units are geant 3 [cm].
aa9bc63b 818 // Inputs:
162acd47 819 // const char *gnam 3 character geant volume name. The letter "I"
aa9bc63b 820 // is appended to the front to indecate that this
821 // is an ITS volume.
822 // TString &dis String containging part discription.
bc825688 823 // Double_t rmin Inside Radius.
824 // Double_t rmax Outside Radius.
825 // Double_t dz half-length along the z-axis
826 // Double_t phi1 Starting angle of the segment [degree].
827 // Double_t phi2 Ending angle of the segment [degree].
aa9bc63b 828 // Int_t med media index number.
829 // Output:
830 // none.
831 // Return.
832 // none.
162acd47 833 char name[5];
bc825688 834 Float_t param[5];
aa9bc63b 835
bc825688 836 param[0] = fScale*rmin;
837 param[1] = fScale*rmax;
838 param[2] = fScale*dz;
839 param[3] = phi1;
840 param[4] = phi2;
162acd47 841 G3name(gnam,name);
bc825688 842 gMC->Gsvolu(name,"TUBS",GetMed(med),param,5);
162acd47 843}
844//______________________________________________________________________
bc825688 845void AliITSBaseGeometry::TubeSegment(AliITSTubeSegData &d,Int_t med){
846 // Interface to TMC->Gsvolu() for ITS TUBE geometries. Phi segment of a
847 // tube. It has 5 parameters. Phi1 should be smaller than phi2. If this
848 // is not the case, the system adds 360 degrees to phi2. See SetScale()
849 // for units. Default units are geant 3 [cm].
162acd47 850 // Inputs:
bc825688 851 // AliITSTubeSegData &d Structure with the tube parameters
852 // Int_t med media index number.
162acd47 853 // Output:
854 // none.
855 // Return.
856 // none.
857 char name[5];
bc825688 858 Float_t param[5];
859 Int_t i,k;
162acd47 860 char *j = (char *) &k;
861
bc825688 862 param[0] = fScale*d.Rmin();
863 param[1] = fScale*d.Rmax();
864 param[2] = fScale*d.DzAt();
865 param[3] = d.Phi0();
866 param[4] = d.Phi1();
162acd47 867 d.SetVid(AddVolName((d.GetName())->Data()));
868 k = ITSIndexToITSG3name(d.GetVid());
869 for(i=0;i<4;i++) name[i] = j[i];
870 name[4] = '\0';
bc825688 871 gMC->Gsvolu(name,"TUBS",GetMed(med),param,5);
aa9bc63b 872}
873//______________________________________________________________________
bc825688 874void AliITSBaseGeometry::CutTube(const char *gnam,const TString &dis,
875 Double_t rmin,Double_t rmax,Double_t dz,
876 Double_t phi1,Double_t phi2,Double_t lx,
877 Double_t ly,Double_t lz,Double_t hx,
878 Double_t hy,Double_t hz,Int_t med){
879 // Interface to TMC->Gsvolu() for ITS CTUB geometries. Cut tube. A tube
880 // cut at the extremities with planes not necessarily perpendicular to
881 // the z axis. It has 11 parameters. See SetScale() for units. Default
882 // units are geant 3 [cm]. phi1 should be smaller than phi2. If this is
883 // not the case, the system adds 360 degrees to phi2.
aa9bc63b 884 // Inputs:
162acd47 885 // const char *gnam 3 character geant volume name. The letter "I"
aa9bc63b 886 // is appended to the front to indecate that this
887 // is an ITS volume.
888 // TString &dis String containging part discription.
bc825688 889 // Double_t rmin Inner radius at z=0 where tube is narrowest.
890 // Double_t rmax Outer radius at z=0 where tube is narrowest.
891 // Double_t dz half-length along the z-axis
892 // Double_t phi1 Starting angle of the segment [degree].
893 // Double_t phi2 Ending angle of the segment [degree].
894 // Double_t lx x component of a unit vector perpendicular to
895 // the face at -dz.
896 // Double_t ly y component of a unit vector perpendicular to
897 // the face at -dz.
898 // Double_t lz z component of a unit vector perpendicular to
899 // the face at -dz.
900 // Double_t hx x component of a unit vector perpendicular to
901 // the face at +dz.
902 // Double_t hy y component of a unit vector perpendicular to
903 // the face at +dz.
904 // Double_t hz z component of a unit vector perpendicular to
905 // the face at +dz.
aa9bc63b 906 // Int_t med media index number.
907 // Output:
908 // none.
909 // Return.
910 // none.
162acd47 911 char name[5];
bc825688 912 Float_t param[11];
aa9bc63b 913
bc825688 914 param[0] = fScale*rmin;
915 param[1] = fScale*rmax;
916 param[2] = fScale*dz;
917 param[3] = phi1;
918 param[4] = phi2;
919 param[5] = lx;
920 param[6] = ly;
921 param[7] = lz;
922 param[8] = hx;
923 param[9] = hy;
924 param[10] = hz;
162acd47 925 G3name(gnam,name);
bc825688 926 gMC->Gsvolu(name,"CTUB",GetMed(med),param,11);
aa9bc63b 927}
928//______________________________________________________________________
bc825688 929void AliITSBaseGeometry::CutTube(AliITSTubeCutData &d,Int_t med){
930 // Interface to TMC->Gsvolu() for ITS CTUB geometries. Cut tube. A tube
931 // cut at the extremities with planes not necessarily perpendicular to
932 // the z axis. It has 11 parameters. See SetScale() for units. Default
933 // units are geant 3 [cm]. phi1 should be smaller than phi2. If this is
934 // not the case, the system adds 360 degrees to phi2.
162acd47 935 // Inputs:
bc825688 936 // AliITSTubeCutData &d Structure with the tube parameters
937 // Int_t med media index number.
162acd47 938 // Output:
939 // none.
940 // Return.
941 // none.
942 char name[5];
bc825688 943 Float_t param[11];
944 Int_t i,k;
162acd47 945 char *j = (char *) &k;
946
bc825688 947 param[0] = fScale*d.Rmin();
948 param[1] = fScale*d.Rmax();
949 param[2] = fScale*d.DzAt();
950 param[3] = d.Phi0();
951 param[4] = d.Phi1();
952 param[5] = d.Normal(0,0);
953 param[6] = d.Normal(0,1);
954 param[7] = d.Normal(0,2);
955 param[8] = d.Normal(1,0);
956 param[9] = d.Normal(1,1);
957 param[10] = d.Normal(1,2);
162acd47 958 d.SetVid(AddVolName((d.GetName())->Data()));
959 k = ITSIndexToITSG3name(d.GetVid());
960 for(i=0;i<4;i++) name[i] = j[i];
961 name[4] = '\0';
bc825688 962 gMC->Gsvolu(name,"CTUB",GetMed(med),param,11);
162acd47 963}
964//______________________________________________________________________
965void AliITSBaseGeometry::TubeElliptical(const char *gnam,const TString &dis,
aa9bc63b 966 Double_t p1,Double_t p2,Double_t dz,Int_t med){
967 // Interface to TMC->Gsvolu() for ITS ELTU geometries. Elliptical
968 // cross-section Tube. It has 3 parameters. See SetScale()
969 // for units. Default units are geant 3 [cm]. The equation of the surface
970 // is x^2 * p1^-2 + y^2 * p2^-2 = 1.
971 // Inputs:
162acd47 972 // const char *gnam 3 character geant volume name. The letter "I"
aa9bc63b 973 // is appended to the front to indecate that this
974 // is an ITS volume.
975 // TString &dis String containging part discription.
976 // Double_t p1 semi-axis of the elipse along x.
977 // Double_t p2 semi-axis of the elipse along y.
978 // Double_t dz half-length along the z-axis
979 // Int_t med media index number.
980 // Output:
981 // none.
982 // Return.
983 // none.
162acd47 984 char name[5];
aa9bc63b 985 Float_t param[3];
986
aa9bc63b 987 param[0] = fScale*p1;
988 param[1] = fScale*p2;
989 param[2] = fScale*dz;
162acd47 990 G3name(gnam,name);
991 gMC->Gsvolu(name,"ELTU",GetMed(med),param,3);
aa9bc63b 992}
993//______________________________________________________________________
bc825688 994void AliITSBaseGeometry::TubeElliptical(AliITSTubeEllipticalData &d,
995 Int_t med){
996 // Interface to TMC->Gsvolu() for ITS ELTU geometries. Elliptical
997 // cross-section Tube. It has 3 parameters. See SetScale()
998 // for units. Default units are geant 3 [cm]. The equation of the surface
999 // is x^2 * p1^-2 + y^2 * p2^-2 = 1.
1000 // Inputs:
1001 // AliITSTubeElipticData &d Structure with the tube parameters
1002 // Int_t med media index number.
1003 // Output:
1004 // none.
1005 // Return.
1006 // none.
1007 char name[5];
1008 Float_t param[3];
1009 Int_t i,k;
1010 char *j = (char *) &k;
1011
1012 param[0] = fScale*d.P0();
1013 param[1] = fScale*d.P1();
1014 param[2] = fScale*d.DzAt();
1015 d.SetVid(AddVolName((d.GetName())->Data()));
1016 k = ITSIndexToITSG3name(d.GetVid());
1017 for(i=0;i<4;i++) name[i] = j[i];
1018 name[4] = '\0';
1019 gMC->Gsvolu(name,"ELTU",GetMed(med),param,3);
1020}
1021//______________________________________________________________________
162acd47 1022void AliITSBaseGeometry::HyperbolicTube(const char *gnam,const TString &dis,
aa9bc63b 1023 Double_t rmin,Double_t rmax,Double_t dz,
1024 Double_t thet,Int_t med){
1025 // Interface to TMC->Gsvolu() for ITS HYPE geometries. Hyperbolic tube.
162acd47 1026 // Fore example the inner and outer surfaces are hyperboloids, as would
1027 // be foumed by a system of cylinderical wires which were then rotated
aa9bc63b 1028 // tangentially about their centers. It has 4 parameters. See SetScale()
1029 // for units. Default units are geant 3 [cm]. The hyperbolic surfaces are
1030 // given by r^2 = (ztan(thet)^2 + r(z=0)^2.
1031 // Inputs:
162acd47 1032 // const char *gnam 3 character geant volume name. The letter "I"
aa9bc63b 1033 // is appended to the front to indecate that this
1034 // is an ITS volume.
1035 // TString &dis String containging part discription.
1036 // Double_t rmin Inner radius at z=0 where tube is narrowest.
1037 // Double_t rmax Outer radius at z=0 where tube is narrowest.
1038 // Double_t dz half-length along the z-axis
1039 // Double_t thet stero angel of rotation of the two faces
1040 // [degrees].
1041 // Int_t med media index number.
1042 // Output:
1043 // none.
1044 // Return.
1045 // none.
162acd47 1046 char name[5];
aa9bc63b 1047 Float_t param[4];
1048
aa9bc63b 1049 param[0] = fScale*rmin;
1050 param[1] = fScale*rmax;
1051 param[2] = fScale*dz;
1052 param[3] = thet;
162acd47 1053 G3name(gnam,name);
1054 gMC->Gsvolu(name,"HYPE",GetMed(med),param,4);
aa9bc63b 1055}
1056//______________________________________________________________________
bc825688 1057void AliITSBaseGeometry::HyperbolicTube(AliITSTubeHyperbolicData &d,
1058 Int_t med){
1059 // Interface to TMC->Gsvolu() for ITS HYPE geometries. Hyperbolic tube.
1060 // Fore example the inner and outer surfaces are hyperboloids, as would
1061 // be foumed by a system of cylinderical wires which were then rotated
1062 // tangentially about their centers. It has 4 parameters. See SetScale()
1063 // for units. Default units are geant 3 [cm]. The hyperbolic surfaces are
1064 // given by r^2 = (ztan(thet)^2 + r(z=0)^2.
aa9bc63b 1065 // Inputs:
bc825688 1066 // AliITSTubeHyperbolicData &d Structure with the tube parameters
1067 // Int_t med media index number.
aa9bc63b 1068 // Output:
1069 // none.
1070 // Return.
1071 // none.
162acd47 1072 char name[5];
bc825688 1073 Float_t param[4];
1074 Int_t i,k;
1075 char *j = (char *) &k;
aa9bc63b 1076
bc825688 1077 param[0] = fScale*d.Rmin();
1078 param[1] = fScale*d.Rmax();
1079 param[2] = fScale*d.DzAt();
1080 param[3] = d.Theta();
1081 d.SetVid(AddVolName((d.GetName())->Data()));
1082 k = ITSIndexToITSG3name(d.GetVid());
1083 for(i=0;i<4;i++) name[i] = j[i];
1084 name[4] = '\0';
1085 gMC->Gsvolu(name,"HYPE",GetMed(med),param,4);
aa9bc63b 1086}
1087//______________________________________________________________________
bc825688 1088void AliITSBaseGeometry::Cone(const char *gnam,const TString &dis,
1089 Double_t dz,Double_t rmin1,Double_t rmax1,
1090 Double_t rmin2,Double_t rmax2,Int_t med){
1091 // Interface to TMC->Gsvolu() for ITS Cone geometries. Conical tube. It
1092 // has 5 parameters. See SetScale()
1093 // for units. Default units are geant 3 [cm].
aa9bc63b 1094 // Inputs:
162acd47 1095 // const char *gnam 3 character geant volume name. The letter "I"
aa9bc63b 1096 // is appended to the front to indecate that this
1097 // is an ITS volume.
1098 // TString &dis String containging part discription.
aa9bc63b 1099 // Double_t dz half-length along the z-axis
bc825688 1100 // Double_t rmin1 Inside Radius at -dz.
1101 // Double_t rmax1 Outside Radius at -dz.
1102 // Double_t rmin2 inside radius at +dz.
1103 // Double_t rmax2 outside radius at +dz.
1104 // Int_t med media index number.
1105 // Output:
1106 // none.
1107 // Return.
1108 // none.
1109 char name[5];
1110 Float_t param[5];
1111
1112 param[0] = fScale*dz;
1113 param[1] = fScale*rmin1;
1114 param[2] = fScale*rmax1;
1115 param[3] = fScale*rmin2;
1116 param[4] = fScale*rmax2;
1117 G3name(gnam,name);
1118 gMC->Gsvolu(name,"CONS",GetMed(med),param,5);
1119}
1120//______________________________________________________________________
1121void AliITSBaseGeometry::Cone(AliITSConeData &d,Int_t med){
1122 // Interface to TMC->Gsvolu() for ITS Cone geometries. Conical tube. It
1123 // has 5 parameters. See SetScale()
1124 // for units. Default units are geant 3 [cm].
1125 // Inputs:
1126 // AliITSConeData &d Structure with the tube parameters
1127 // Int_t med media index number.
1128 // Output:
1129 // none.
1130 // Return.
1131 // none.
1132 char name[5];
1133 Float_t param[5];
1134 Int_t i,k;
1135 char *j = (char *) &k;
1136
1137 param[0] = fScale*d.DzAt();
1138 param[1] = fScale*d.Rmin0();
1139 param[2] = fScale*d.Rmax0();
1140 param[3] = fScale*d.Rmin1();
1141 param[4] = fScale*d.Rmax1();
1142 d.SetVid(AddVolName((d.GetName())->Data()));
1143 k = ITSIndexToITSG3name(d.GetVid());
1144 for(i=0;i<4;i++) name[i] = j[i];
1145 name[4] = '\0';
1146 gMC->Gsvolu(name,"CONS",GetMed(med),param,5);
1147}
1148//______________________________________________________________________
1149void AliITSBaseGeometry::ConeSegment(const char *gnam,const TString &dis,
1150 Double_t dz,Double_t rmin1,
1151 Double_t rmax1,Double_t rmin2,
1152 Double_t rmax2,Double_t phi1,
1153 Double_t phi2,Int_t med){
1154 // Interface to TMC->Gsvolu() for ITS ConS geometries. One segment of a
1155 // conical tube. It has 7 parameters. Phi1 should be smaller than phi2.
1156 // If this is not the case, the system adds 360 degrees to phi2. See
1157 // SetScale() for units. Default units are geant 3 [cm].
1158 // Inputs:
1159 // const char *gnam 3 character geant volume name. The letter "I"
1160 // is appended to the front to indecate that
1161 // this is an ITS volume.
1162 // TString &dis String containging part discription.
aa9bc63b 1163 // Double_t dz half-length along the z-axis
bc825688 1164 // Double_t rmin1 Inside Radius at -dz.
1165 // Double_t rmax1 Outside Radius at -dz.
1166 // Double_t rmin2 inside radius at +dz.
1167 // Double_t rmax2 outside radius at +dz.
aa9bc63b 1168 // Double_t phi1 Starting angle of the segment [degree].
1169 // Double_t phi2 Ending angle of the segment [degree].
aa9bc63b 1170 // Int_t med media index number.
1171 // Output:
1172 // none.
bc825688 1173 // Return.
1174 // none.
1175 char name[5];
1176 Float_t param[7];
1177
1178 param[0] = fScale*dz;
1179 param[1] = fScale*rmin1;
1180 param[2] = fScale*rmax1;
1181 param[3] = fScale*rmin2;
1182 param[4] = fScale*rmax2;
1183 param[5] = phi1;
1184 param[6] = phi2;
1185 G3name(gnam,name);
1186 gMC->Gsvolu(name,"CONS",GetMed(med),param,7);
1187}
1188//______________________________________________________________________
1189void AliITSBaseGeometry::ConeSegment(AliITSConeSegData &d,Int_t med){
1190 // Interface to TMC->Gsvolu() for ITS ConS geometries. One segment of a
1191 // conical tube. It has 7 parameters. Phi1 should be smaller than phi2.
1192 // If this is not the case, the system adds 360 degrees to phi2. See
1193 // SetScale() for units. Default units are geant 3 [cm].
1194 // Inputs:
1195 // AliITSConeSegData &d Structure with the tube parameters
1196 // Int_t med media index number.
1197 // Output:
1198 // none.
1199 // Return.
1200 // none.
1201 char name[5];
1202 Float_t param[7];
1203 Int_t i,k;
1204 char *j = (char *) &k;
1205
1206 param[0] = fScale*d.DzAt();
1207 param[1] = fScale*d.Rmin0();
1208 param[2] = fScale*d.Rmax0();
1209 param[3] = fScale*d.Rmin1();
1210 param[4] = fScale*d.Rmax1();
1211 param[5] = d.Phi0();
1212 param[6] = d.Phi1();
1213 d.SetVid(AddVolName((d.GetName())->Data()));
1214 k = ITSIndexToITSG3name(d.GetVid());
1215 for(i=0;i<4;i++) name[i] = j[i];
1216 name[4] = '\0';
1217 gMC->Gsvolu(name,"CONS",GetMed(med),param,7);
1218}
1219//______________________________________________________________________
1220void AliITSBaseGeometry::PolyCone(const char *gnam,const TString &dis,
1221 Double_t phi1,Double_t dphi,Int_t nz,
1222 Double_t *z,Double_t *rmin,Double_t *rmax,
1223 Int_t med){
1224 // Interface to TMC->Gsvolu() for ITS PCON geometry. Poly-cone It has 9
1225 // parameters or more. See SetScale() for units. Default units are geant
1226 // 3 [cm].
1227 // Inputs:
1228 // const char *gnam 3 character geant volume name. The letter "I"
1229 // is appended to the front to indecate that this
1230 // is an ITS volume.
1231 // TString &dis String containging part discription.
1232 // Double_t phi1 the azimuthal angle at which the volume begins
1233 // (angles are counted clouterclockwise) [degrees].
1234 // Double_t dphi opening angle of the volume, which extends from
1235 // phi1 to phi1+dphi [degree].
1236 // Int_t nz number of planes perpendicular to the z axis
1237 // where the dimension of the section is given -
1238 // this number should be at least 2 and NP triples
1239 // of number must follow.
1240 // Double_t *z Array [nz] of z coordinate of the section.
1241 // Double_t *rmin Array [nz] of radius of teh inner circle in the
1242 // cross-section.
1243 // Double_t *rmax Array [nz] of radius of the outer circle in the
1244 // cross-section.
1245 // Int_t med media index number.
1246 // Output:
1247 // none.
1248 // Return.
1249 // none.
1250 char name[5];
1251 Float_t *param;
1252 Int_t n,i;
1253
1254 n = 3+3*nz;
1255 param = new Float_t[n];
1256 param[0] = phi1;
1257 param[1] = dphi;
1258 param[2] = (Float_t) nz;
1259 for(i=0;i<nz;i++){
1260 param[3+3*i] = fScale*z[i];
1261 param[4+3*i] = fScale*rmin[i];
1262 param[5+3*i] = fScale*rmax[i];
1263 } // end for i
1264 G3name(gnam,name);
1265 gMC->Gsvolu(name,"PCON",GetMed(med),param,n);
1266
1267 delete[] param;
1268}
1269//______________________________________________________________________
1270void AliITSBaseGeometry::PolyCone(AliITSPConeData &d,Int_t med){
1271 // Interface to TMC->Gsvolu() for ITS PCON geometry. Poly-cone It has 9
1272 // parameters or more. See SetScale() for units. Default units are geant
1273 // 3 [cm].
1274 // Inputs:
1275 // AliITSPConeData &d Object with poly cone data stored in it.
1276 // Int_t med media index number.
1277 // Output:
1278 // none.
1279 // Return.
1280 // none.
1281 char name[5];
1282 Float_t *param;
1283 Int_t n,i,k;
1284 char *j = (char *) &k;
1285
1286 n = 3+3*d.Nz();
1287 param = new Float_t[n];
1288 param[0] = d.Phi0();
1289 param[1] = d.DPhi();
1290 param[2] = (Float_t) d.Nz();
1291 for(i=0;i<d.Nz();i++){
1292 param[3+3*i] = fScale*d.ZAt(i);
1293 param[4+3*i] = fScale*d.Rmin(i);
1294 param[5+3*i] = fScale*d.Rmax(i);
1295 } // end for if
1296 d.SetVid(AddVolName((d.GetName())->Data()));
1297 k = ITSIndexToITSG3name(d.GetVid());
1298 for(i=0;i<4;i++) name[i] = j[i];
1299 name[4] = '\0';
1300 gMC->Gsvolu(name,"PCON",GetMed(med),param,n);
1301
1302 delete[] param;
1303}
1304//______________________________________________________________________
1305void AliITSBaseGeometry::Sphere(const char *gnam,const TString &dis,
1306 Double_t rmin,Double_t rmax,Double_t the1,
1307 Double_t the2,Double_t phi1,Double_t phi2,
1308 Int_t med){
1309 // Interface to TMC->Gsvolu() for ITS SPHE geometries. Segment of a
1310 // sphereical shell. It has 6 parameters. See SetScale()
1311 // for units. Default units are geant 3 [cm].
1312 // Inputs:
1313 // const char *gnam 3 character geant volume name. The letter "I"
1314 // is appended to the front to indecate that this
1315 // is an ITS volume.
1316 // TString &dis String containging part discription.
1317 // Double_t rmin Inside Radius.
1318 // Double_t rmax Outside Radius.
1319 // Double_t the1 staring polar angle of the shell [degree].
1320 // Double_t the2 ending polar angle of the shell [degree].
1321 // Double_t phui staring asimuthal angle of the shell [degree].
1322 // Double_t phi2 ending asimuthal angle of the shell [degree].
1323 // Int_t med media index number.
1324 // Output:
1325 // none.
1326 // Return.
1327 // none.
1328 char name[5];
1329 Float_t param[6];
1330
1331 param[0] = fScale*rmin;
1332 param[1] = fScale*rmax;
1333 param[2] = the1;
1334 param[3] = the2;
1335 param[4] = phi1;
1336 param[5] = phi2;
1337 G3name(gnam,name);
1338 gMC->Gsvolu(name,"SPHE",GetMed(med),param,6);
1339}
1340//______________________________________________________________________
1341void AliITSBaseGeometry::Sphere(AliITSSphereData &d,Int_t med){
1342 // Interface to TMC->Gsvolu() for ITS SPHE geometries. Segment of a
1343 // sphereical shell. It has 6 parameters. See SetScale()
1344 // for units. Default units are geant 3 [cm].
1345 // Inputs:
1346 // AliITSSphereData &d Structure with the tube parameters
1347 // Int_t med media index number.
1348 // Output:
1349 // none.
1350 // Return.
1351 // none.
1352 char name[5];
1353 Float_t param[6];
1354 Int_t i,k;
1355 char *j = (char *) &k;
1356
1357 param[0] = fScale*d.Rmin();
1358 param[1] = fScale*d.Rmax();
1359 param[2] = d.Theta0();
1360 param[3] = d.Theta1();
1361 param[4] = d.Phi0();
1362 param[5] = d.Phi1();
1363 d.SetVid(AddVolName((d.GetName())->Data()));
1364 k = ITSIndexToITSG3name(d.GetVid());
1365 for(i=0;i<4;i++) name[i] = j[i];
1366 name[4] = '\0';
1367 gMC->Gsvolu(name,"SPHE",GetMed(med),param,6);
1368}
1369//______________________________________________________________________
1370void AliITSBaseGeometry::Parallelepiped(const char *gnam,const TString &dis,
1371 Double_t dx,Double_t dy,Double_t dz,
1372 Double_t alpha,Double_t thet,
1373 Double_t phi,Int_t med){
1374 // Interface to TMC->Gsvolu() for ITS PARA geometries. Parallelepiped. It
1375 // has 6 parameters. See SetScale() for units. Default units are geant 3
1376 // [cm].
1377 // Inputs:
1378 // const char *gnam 3 character geant volume name. The letter "I"
1379 // is appended to the front to indecate that this
1380 // is an ITS volume.
1381 // TString &dis String containging part discription.
1382 // Double_t dx half-length allong x-axis
1383 // Double_t dy half-length allong y-axis
1384 // Double_t dz half-length allong z-axis
1385 // Double_t alpha angle formed by the y axis and by the plane
1386 // joining the center of teh faces parallel to the
1387 // z-x plane at -dY and +dy [degree].
1388 // Double_t thet polar angle of the line joining the centers of
1389 // the faces at -dz and +dz in z [degree].
1390 // Double_t phi azimuthal angle of teh line joing the centers
1391 // of the faaces at -dz and +dz in z [degree].
1392 // Int_t med media index number.
1393 // Output:
1394 // none.
1395 // Return.
1396 // none.
1397 char name[5];
1398 Float_t param[6];
1399
1400 param[0] = fScale*dx;
1401 param[1] = fScale*dy;
1402 param[2] = fScale*dz;
1403 param[3] = alpha;
1404 param[4] = thet;
1405 param[5] = phi;
1406 G3name(gnam,name);
1407 gMC->Gsvolu(name,"PARA",GetMed(med),param,6);
1408}
1409//______________________________________________________________________
1410void AliITSBaseGeometry::Parallelepiped(AliITSParallelpipedData &d,Int_t med){
1411 // Interface to TMC->Gsvolu() for ITS PARA geometries. Parallelepiped. It
1412 // has 6 parameters. See SetScale() for units. Default units are geant 3
1413 // [cm].
1414 // Inputs:
1415 // AliITSParrellepipedData &d Structre witht the volume data in it.
1416 // Int_t med media index number.
1417 // Output:
1418 // none.
1419 // Return.
1420 // none.
1421 char name[5];
1422 Float_t param[6];
1423 Int_t i,k;
1424 char *j = (char *) &k;
1425
1426 param[0] = fScale*d.DxAt();
1427 param[1] = fScale*d.DyAt();
1428 param[2] = fScale*d.DzAt();
1429 param[3] = d.Alpha();
1430 param[4] = d.Theta();
1431 param[5] = d.Phi();
1432 d.SetVid(AddVolName((d.GetName())->Data()));
1433 k = ITSIndexToITSG3name(d.GetVid());
1434 for(i=0;i<4;i++) name[i] = j[i];
1435 name[4] = '\0';
1436 gMC->Gsvolu(name,"PARA",GetMed(med),param,6);
1437}
1438//______________________________________________________________________
1439void AliITSBaseGeometry::PolyGon(const char *gnam,const TString &dis,
1440 Double_t phi1,Double_t dphi,Int_t npdv,
1441 Int_t nz,Double_t *z,Double_t *rmin,
1442 Double_t *rmax,Int_t med){
1443 // Interface to TMC->Gsvolu() for ITS PGON geometry. Polygon It has 10
1444 // parameters or more. See SetScale() for units. Default units are geant
1445 // 3 [cm].
1446 // Inputs:
1447 // const char *gnam 3 character geant volume name. The letter "I"
1448 // is appended to the front to indecate that this
1449 // is an ITS volume.
1450 // TString &dis String containging part discription.
1451 // Double_t phi1 the azimuthal angle at which the volume begins
1452 // (angles are counted clouterclockwise) [degrees].
1453 // Double_t dphi opening angle of the volume, which extends from
1454 // phi1 to phi1+dphi [degree].
1455 // Int_t npdv the number of sides of teh cross section
1456 // between the given phi limits.
1457 // Int_t nz number of planes perpendicular to the z axis
1458 // where the dimension of the section is given -
1459 // this number should be at least 2 and NP triples
1460 // of number must follow.
1461 // Double_t *z array [nz] of z coordiates of the sections..
1462 // Double_t *rmin array [nz] of radius of teh circle tangent to
1463 // the sides of the inner polygon in teh
1464 // cross-section.
1465 // Double_t *rmax array [nz] of radius of the circle tangent to
1466 // the sides of the outer polygon in the
1467 // cross-section.
1468 // Int_t med media index number.
1469 // Output:
1470 // none.
1471 // Return.
1472 // none.
1473 char name[5];
1474 Float_t *param;
1475 Int_t n,i;
1476
1477 n = 4+3*nz;
1478 param = new Float_t[n];
1479 param[0] = phi1;
1480 param[1] = dphi;
1481 param[2] = (Float_t)npdv;
1482 param[3] = (Float_t)nz;
1483 for(i=0;i<nz;i++){
1484 param[4+3*i] = fScale*z[i];
1485 param[5+3*i] = fScale*rmin[i];
1486 param[6+3*i] = fScale*rmax[i];
1487 } // end for i
1488 G3name(gnam,name);
1489 gMC->Gsvolu(name,"PGON",GetMed(med),param,n);
1490
1491 delete[] param;
1492}
1493//______________________________________________________________________
1494void AliITSBaseGeometry::PolyGon(AliITSPGonData &d,Int_t med){
1495 // Interface to TMC->Gsvolu() for ITS PCON geometry. Poly-cone It has 9
1496 // parameters or more. See SetScale() for units. Default units are geant
1497 // 3 [cm].
1498 // Inputs:
1499 // AliITSPGonData &d Object with poly cone data stored in it.
1500 // Int_t med media index number.
1501 // Output:
1502 // none.
1503 // Return.
1504 // none.
1505 char name[5];
1506 Float_t *param;
1507 Int_t n,i,k;
1508 char *j = (char *) &k;
1509
1510 n = 4+3*d.Nz();
1511 param = new Float_t[n];
1512 param[0] = d.Phi0();
1513 param[1] = d.DPhi();
1514 param[2] = (Float_t) d.NPhi();
1515 param[3] = (Float_t) d.Nz();
1516 for(i=0;i<d.Nz();i++){
1517 param[4+3*i] = fScale*d.ZAt(i);
1518 param[5+3*i] = fScale*d.Rmin(i);
1519 param[6+3*i] = fScale*d.Rmax(i);
1520 } // end for i
1521 d.SetVid(AddVolName((d.GetName())->Data()));
1522 k = ITSIndexToITSG3name(d.GetVid());
1523 for(i=0;i<4;i++) name[i] = j[i];
1524 name[4] = '\0';
1525 gMC->Gsvolu(name,"PGON",GetMed(med),param,n);
1526
1527 delete[] param;
1528}
1529//______________________________________________________________________
1530void AliITSBaseGeometry::Pos(AliITSBaseVolParams &v,Int_t cn,
1531 AliITSBaseVolParams &m,
1532 TVector3 &t,Int_t irot){
1533 // Place a copy of a volume previously defined by a call to GSVOLU inside
1534 // its mother volulme moth.
1535 // Inputs:
1536 // const char vol[3] 3 character geant volume name. The letter "I"
1537 // is appended to the front to indecate that this
1538 // is an ITS volume.
1539 // const char moth[3] 3 character geant volume name of the mother
1540 // volume in which vol will be placed. The letter
1541 // "I" is appended to the front to indecate that
1542 // this is an ITS volume.
1543 // Double_t x The x positon of the volume in the mother's
1544 // reference system
1545 // Double_t y The y positon of the volume in the mother's
1546 // reference system
1547 // Double_t z The z positon of the volume in the mother's
1548 // reference system
1549 // Int_t irot the index for the rotation matrix to be used.
1550 // irot=-1 => unit rotation.
1551 // Outputs:
1552 // none.
1553 // Return:
1554 // none.
1555 char name[5],mother[5];
1556 Float_t param[3];
1557 Int_t r=0,i;
1558 char *n = (char*)&r;
1559
1560 param[0] = fScale*t.X();
1561 param[1] = fScale*t.Y();
1562 param[2] = fScale*t.Z();
1563 r = ITSIndexToITSG3name(v.GetVid());
1564 for(i=0;i<4;i++) name[i] = n[i]; name[4] ='\0';
1565 r = ITSIndexToITSG3name(m.GetVid());
1566 for(i=0;i<4;i++) mother[i] = n[i]; mother[4] ='\0';
1567 if(irot>0) r = fidrot[irot]; else r=0;
1568 gMC->Gspos(name,cn,mother,param[0],param[1],param[2],r,"ONLY");
1569}
1570//______________________________________________________________________
1571void AliITSBaseGeometry::Pos(const char *vol,Int_t cn,const char *moth,
1572 Double_t x,Double_t y,Double_t z,Int_t irot){
1573 // Place a copy of a volume previously defined by a call to GSVOLU inside
1574 // its mother volulme moth.
1575 // Inputs:
1576 // const char vol[3] 3 character geant volume name. The letter "I"
1577 // is appended to the front to indecate that this
1578 // is an ITS volume.
1579 // const char moth[3] 3 character geant volume name of the mother
1580 // volume in which vol will be placed. The letter
1581 // "I" is appended to the front to indecate that
1582 // this is an ITS volume.
1583 // Double_t x The x positon of the volume in the mother's
1584 // reference system
1585 // Double_t y The y positon of the volume in the mother's
1586 // reference system
1587 // Double_t z The z positon of the volume in the mother's
1588 // reference system
1589 // Int_t irot the index for the rotation matrix to be used.
1590 // irot=-1 => unit rotation.
1591 // Outputs:
1592 // none.
1593 // Return:
1594 // none.
1595 char name[5],mother[5];
1596 Float_t param[3];
1597 Int_t r=0;
1598
1599 param[0] = fScale*x;
1600 param[1] = fScale*y;
1601 param[2] = fScale*z;
1602 G3name(vol,name);
1603 G3name(moth,mother);
1604 if(irot>0) r = fidrot[irot];
1605 gMC->Gspos(name,cn,mother,param[0],param[1],param[2],r,"ONLY");
1606}
1607//______________________________________________________________________
1608void AliITSBaseGeometry::Matrix(Int_t irot,Double_t thet1,Double_t phi1,
1609 Double_t thet2,Double_t phi2,
1610 Double_t thet3,Double_t phi3){
1611 // Defines a Geant rotation matrix. checks to see if it is the unit
1612 // matrix. If so, then no additonal matrix is defined. Stores rotation
1613 // matrix irot in the data structure JROTM. If the matrix is not
1614 // orthonormal, it will be corrected by setting y' perpendicular to x'
1615 // and z' = x' X y'. A warning message is printed in this case.
1616 // Inputs:
1617 // Int_t irot Intex specifing which rotation matrix.
1618 // Double_t thet1 Polar angle for axisw x [degrees].
1619 // Double_t phi1 azimuthal angle for axis x [degrees].
1620 // Double_t thet12Polar angle for axisw y [degrees].
1621 // Double_t phi2 azimuthal angle for axis y [degrees].
1622 // Double_t thet3 Polar angle for axisw z [degrees].
1623 // Double_t phi3 azimuthal angle for axis z [degrees].
1624 // Outputs:
1625 // none.
1626 // Return:
1627 // none.
1628 Float_t t1=0.0,p1=0.0,t2=0.0,p2=0.0,t3=0.0,p3=0.0;
1629
1630 if(thet1==90.0&&phi1== 0.0&&
1631 thet2==90.0&&phi2==90.0&&
1632 thet3== 0.0&&phi3== 0.0){
1633 fidrot[irot] = 0; // Unit matrix
1634 }else{
1635 t1 = thet1;
1636 p1 = phi1;
1637 t2 = thet2;
1638 p2 = phi2;
1639 t3 = thet3;
1640 p3 = phi3;
1641 fits->AliMatrix(fidrot[irot],t1,p1,t2,p2,t3,p3);
1642 } // end if
1643 cout << "Matrix:: fidrot["<<irot<<"]="<<fidrot[irot];
1644 cout <<" angles="<<t1<<" "<<p1<<" "<<t2<<" "<<p2<<" "<<t3<< " "<<p3<<endl;
1645}
1646//______________________________________________________________________
1647void AliITSBaseGeometry::Matrix(Int_t irot,Int_t axis,Double_t thet){
1648 // Defines a Geant rotation matrix. checks to see if it is the unit
1649 // matrix. If so, then no additonal matrix is defined. Stores rotation
1650 // matrix irot in the data structure JROTM. If the matrix is not
1651 // orthonormal, it will be corrected by setting y' perpendicular to x'
1652 // and z' = x' X y'. A warning message is printed in this case.
1653 // Inputs:
1654 // Int_t irot Intex specifing which rotation matrix.
1655 // Int_t axis Axis about which rotation is to be done.
1656 // Double_t thet Angle to rotate by [degrees].
1657 // Outputs:
1658 // none.
1659 // Return:
1660 // none.
1661
1662 if(thet==0.0){
1663 fidrot[irot] = 0; // Unit matrix
1664 }else{
1665 switch (axis) {
1666 case 0: //Rotate about x-axis, x-axis does not change.
1667 fits->AliMatrix(fidrot[irot],90.0,0.0,90.0+thet,90.0,thet,90.0);
1668 /*
1669 cout << "Matrix:: axis="<<axis<<" fidrot["<<irot<<"]=";
1670 cout <<fidrot[irot];
1671 cout <<" angles="<<90.0<<" "<<0.0<<" "<<90.0+thet<<" "<<90.0;
1672 cout <<" "<<thet<< " "<<90.0<<endl;
1673 */
1674 break;
1675 case 1: //Rotate about y-axis, y-axis does not change.
1676 fits->AliMatrix(fidrot[irot],90.0-thet,0.0,90.0,90.0,-thet,0.0);
1677 /*
1678 cout << "Matrix:: axis="<<axis<<" fidrot["<<irot<<"]=";
1679 cout << fidrot[irot];
1680 cout <<" angles="<<90.-thet<<" "<<0.0<<" "<<90.0<<" "<<90.0;
1681 cout <<" "<<-thet<< " "<<0.0<<endl;
1682 */
1683 break;
1684 case 2: //Rotate about z-axis, z-axis does not change.
1685 fits->AliMatrix(fidrot[irot],90.0,thet,90.0,90.+thet,0.0,0.0);
1686 /*
1687 cout << "Matrix:: axis="<<axis<<" fidrot["<<irot<<"]=";
1688 cout <<fidrot[irot];
1689 cout <<" angles="<<90.0<<" "<<thet<<" "<<90.0<<" "<<90.0+thet;
1690 cout <<" "<<0.0<< " "<<0.0<<endl;
1691 */
1692 break;
1693 default:
1694 Error("Matrix","axis must be either 0, 1, or 2. for matrix=%d",
1695 irot);
1696 /*
1697 cout << "Matrix:: axis="<<axis<<" fidrot["<<irot<<"]=";
1698 cout <<fidrot[irot];
1699 cout <<" thet=" << thet<< endl;
1700 */
1701 break;
1702 } // end switch
1703 } // end if
1704}
1705//______________________________________________________________________
1706void AliITSBaseGeometry::Matrix(Int_t irot,Double_t rot[3][3]){
1707 // Defines a Geant rotation matrix. checks to see if it is the unit
1708 // matrix. If so, then no additonal matrix is defined. Stores rotation
1709 // matrix irot in the data structure JROTM. If the matrix is not
1710 // orthonormal, it will be corrected by setting y' perpendicular to x'
1711 // and z' = x' X y'. A warning message is printed in this case.
1712 // Inputs:
1713 // Int_t irot Intex specifing which rotation matrix.
1714 // Double_t rot[3][3] The 3 by 3 rotation matrix.
1715 // Outputs:
1716 // none.
1717 // Return:
1718 // none.
1719 Double_t si,c=180./TMath::Pi();
1720 Double_t ang[6]={90.0,0.0,90.0,90.0,0.0,0.0};
1721
1722 if(rot[0][0]==1.0&&rot[1][1]==1.0&&rot[2][2]==1.0&&
1723 rot[0][1]==0.0&&rot[0][2]==0.0&&rot[1][0]==0.0&&
1724 rot[1][2]==0.0&&rot[2][0]==0.0&&rot[2][1]==0.0){
1725 fidrot[irot] = 0; // Unit matrix
1726 }else{
1727 ang[1] = TMath::ATan2(rot[0][1],rot[0][0]);
1728 if(TMath::Cos(ang[1])!=0.0) si = rot[0][0]/TMath::Cos(ang[1]);
1729 else si = rot[0][1]/TMath::Sin(ang[1]);
1730 ang[0] = TMath::ATan2(si,rot[0][2]);
1731
1732 ang[3] = TMath::ATan2(rot[1][1],rot[1][0]);
1733 if(TMath::Cos(ang[3])!=0.0) si = rot[1][0]/TMath::Cos(ang[3]);
1734 else si = rot[1][1]/TMath::Sin(ang[3]);
1735 ang[2] = TMath::ATan2(si,rot[1][2]);
1736
1737 ang[5] = TMath::ATan2(rot[2][1],rot[2][0]);
1738 if(TMath::Cos(ang[5])!=0.0) si = rot[2][0]/TMath::Cos(ang[5]);
1739 else si = rot[2][1]/TMath::Sin(ang[5]);
1740 ang[4] = TMath::ATan2(si,rot[2][2]);
1741
1742 for(Int_t i=0;i<6;i++) {ang[i] *= c; if(ang[i]<0.0) ang[i] += 360.;}
1743 fits->AliMatrix(fidrot[irot],ang[0],ang[1],ang[2],ang[3],
1744 ang[4],ang[5]);
1745 } // end if
1746 cout << "Matrix rot[3][3]:: fidrot["<<irot<<"]="<<fidrot[irot];
1747 cout <<" angles="<<ang[0]<<" "<<ang[1]<<" "<<ang[2]<<" "<<
1748 ang[3]<<" "<<ang[4]<< " "<<ang[5]<<endl;
1749}
1750//______________________________________________________________________
1751Float_t AliITSBaseGeometry::GetA(Int_t z){
1752 // Returns the isotopicaly averaged atomic number.
1753 // Inputs:
1754 // Int_t z Elemental number
1755 // Outputs:
1756 // none.
1757 // Return:
1758 // The atomic mass number.
1759 const Float_t A[]={
1760 1.00794 , 4.0026902, 6.941 , 9.012182 , 10.811 , // H-B
1761 12.01007 , 14.00674 , 15.9994 , 18.9984032, 20.1797 , // C-Ne
1762 22.98970 , 24.3050 , 26.981538, 28.0855 , 30.973761, // Na-P
1763 32.066 , 35.4527 , 39.948 , 39.0983 , 40.078 , // S-Ca
1764 44.95591 , 47.867 , 50.9415 , 51.9961 , 54.938049, // Sc-Mn
1765 55.845 , 58.933200 , 58.6934 , 63.546 , 65.39 , // Fe-Zn
1766 69.723 , 72.61 , 74.92160 , 78.96 , 79.904 , // Ga-Br
1767 83.80 , 85.4678 , 87.62 , 88.9085 , 91.224 , // Kr-Zr
1768 92.90638 , 95.94 , 97.907215, 101.07 ,102.90550 , // Nb-Rh
1769 106.42 ,107.8682 ,112.411 ,114.818 ,118.710 , // Pd-Sn
1770 121.760 ,127.60 ,126.90447 ,131.29 ,132.90545 , // Sb-Cs
1771 137.327 ,138.9055 ,140.116 ,140.90765 ,144.24 , // La-Nd
1772 144.912746,150.36 ,151.964 ,157.25 ,158.92534 , // Pm-Tb
1773 162.50 ,164.93032 ,167.26 ,168.93421 ,173.04 , // Dy-Yb
1774 174.967 ,178.49 ,180.9479 ,183.84 ,186.207 , // Lu-Re
1775 190.23 ,192.217 ,195.078 ,196.96655 ,200.59 , // Os-Hg
1776 204.3833 ,207.2 ,208.98038,208.982415 ,209.987131, // Tl-At
1777 222.017570,223.019731 ,226.025402,227.027747 ,232.0381 , // Rn-Th
1778 231.03588 ,238.0289 }; // Pa,U
1779
1780 if(z<1||z>92){
1781 Error("GetA","z must be 0<z<93. z=%d",z);
1782 return 0.0;
1783 } // end if
1784 return A[z-1];
1785}
1786//______________________________________________________________________
1787Float_t AliITSBaseGeometry::GetStandardMaxStepSize(Int_t istd){
1788 // Returns one of a set of standard Maximum Step Size values.
1789 // Inputs:
1790 // Int_t istd Index to indecate which standard.
1791 // Outputs:
1792 // none.
1793 // Return:
1794 // The appropreate standard Maximum Step Size value [cm].
1795 Float_t t[]={1.0, // default
1796 0.0075, // Silicon detectors...
1797 1.0, // Air in central detectors region
1798 1.0 // Material in non-centeral region
1799 };
1800 return t[istd];
1801}
1802//______________________________________________________________________
1803Float_t AliITSBaseGeometry::GetStandardThetaMax(Int_t istd){
1804 // Returns one of a set of standard Theata Max values.
1805 // Inputs:
1806 // Int_t istd Index to indecate which standard.
1807 // Outputs:
1808 // none.
1809 // Return:
1810 // The appropreate standard Theta max value [degrees].
1811 Float_t t[]={0.1, // default
1812 0.1, // Silicon detectors...
1813 0.1, // Air in central detectors region
1814 1.0 // Material in non-centeral region
1815 };
1816 return t[istd];
1817}
1818//______________________________________________________________________
1819Float_t AliITSBaseGeometry::GetStandardEfraction(Int_t istd){
1820 // Returns one of a set of standard E fraction values.
1821 // Inputs:
1822 // Int_t istd Index to indecate which standard.
1823 // Outputs:
1824 // none.
1825 // Return:
1826 // The appropreate standard E fraction value [#].
1827 Float_t t[]={0.1, // default
1828 0.1, // Silicon detectors...
1829 0.1, // Air in central detectors region
1830 0.5 // Material in non-centeral region
1831 };
1832 return t[istd];
1833}
1834//______________________________________________________________________
1835Float_t AliITSBaseGeometry::GetStandardEpsilon(Int_t istd){
1836 // Returns one of the standard Epsilon valuse
1837 // Inputs:
1838 // Int_t istd index of standard cuts to get
1839 // Output:
1840 // none.
1841 // Return:
1842 // Float_t the standard Epsilon cut value.
1843 Float_t t[]={1.0E-4, // default
1844 1.0E-4, // Silicon detectors...
1845 1.0E-4, // Air in central detector region
1846 1.0E-3, // Material in non-cneteral regions
1847 };
1848
1849 return t[istd];
1850}
1851//______________________________________________________________________
1852void AliITSBaseGeometry::Element(Int_t imat,const char* name,Int_t z,
1853 Double_t dens,Int_t istd){
1854 // Defines a Geant single element material and sets its Geant medium
1855 // proporties. The average atomic A is assumed to be given by their
1856 // natural abundances. Things like the radiation length are calculated
1857 // for you.
1858 // Inputs:
1859 // Int_t imat Material number.
1860 // const char* name Material name. No need to add a $ at the end.
1861 // Int_t z The elemental number.
1862 // Double_t dens The density of the material [g/cm^3].
1863 // Int_t istd Defines which standard set of transport parameters
1864 // which should be used.
1865 // Output:
1866 // none.
1867 // Return:
1868 // none.
1869 Float_t rad,Z,A=GetA(z),tmax,stemax,deemax,epsilon;
1870 char *name2;
1871 Int_t len;
1872
1873 len = strlen(name)+1;
1874 name2 = new char[len];
1875 strncpy(name2,name,len-1);
1876 name2[len-1] = '\0';
1877 name2[len-2] = '$';
1878 Z = (Float_t)z;
1879 rad = GetRadLength(z)/dens;
1880 fits->AliMaterial(imat,name2,A,Z,dens,rad,0.0,0,0);
1881 tmax = GetStandardThetaMax(istd); // degree
1882 stemax = GetStandardMaxStepSize(istd); // cm
1883 deemax = GetStandardEfraction(istd); // ratio
1884 epsilon = GetStandardEpsilon(istd); //
1885 fits->AliMedium(imat,name2,imat,0,gAlice->Field()->Integ(),
1886 gAlice->Field()->Max(),tmax,stemax,deemax,epsilon,0.0);
1887 delete[] name2;
1888}
1889//______________________________________________________________________
1890void AliITSBaseGeometry::MixtureByWeight(Int_t imat,const char* name,Int_t *z,
1891 Double_t *w,Double_t dens,Int_t n,Int_t istd){
1892 // Defines a Geant material by a set of elements and weights, and sets
1893 // its Geant medium proporties. The average atomic A is assumed to be
1894 // given by their natural abundances. Things like the radiation length
1895 // are calculated for you.
1896 // Inputs:
1897 // Int_t imat Material number.
1898 // const char* name Material name. No need to add a $ at the end.
1899 // Int_t *z Array of The elemental numbers.
1900 // Double_t *w Array of relative weights.
1901 // Double_t dens The density of the material [g/cm^3].
1902 // Int_t n the number of elements making up the mixture.
1903 // Int_t istd Defines which standard set of transport parameters
1904 // which should be used.
1905 // Output:
1906 // none.
1907 // Return:
1908 // none.
1909 Float_t *Z,*A,*W,tmax,stemax,deemax,epsilon;
1910 char *name2;
1911 Int_t len,i;
1912 Z = new Float_t[n];
1913 A = new Float_t[n];
1914 W = new Float_t[n];
1915
1916 len = strlen(name)+2;
1917 name2 = new char[len];
1918 strncpy(name2,name,len-1);
1919 name2[len-1] = '\0';
1920 name2[len-2] = '$';
1921 for(i=0;i<n;i++){Z[i] = (Float_t)z[i];A[i] = (Float_t)GetA(z[i]);
1922 W[i] = (Float_t)w[i];}
1923 fits->AliMixture(imat,name2,A,Z,dens,n,W);
1924 tmax = GetStandardThetaMax(istd); // degree
1925 stemax = GetStandardMaxStepSize(istd); // cm
1926 deemax = GetStandardEfraction(istd); // #
1927 epsilon = GetStandardEpsilon(istd);
1928 fits->AliMedium(imat,name2,imat,0,gAlice->Field()->Integ(),
1929 gAlice->Field()->Max(),tmax,stemax,deemax,epsilon,0.0);
1930 delete[] name2;
1931 delete[] Z;
1932 delete[] A;
1933 delete[] W;
1934}
1935//______________________________________________________________________
1936void AliITSBaseGeometry::MixtureByNumber(Int_t imat,const char* name,Int_t *z,
1937 Int_t *w,Double_t dens,Int_t n,Int_t istd){
1938 // Defines a Geant material by a set of elements and number, and sets
1939 // its Geant medium proporties. The average atomic A is assumed to be
1940 // given by their natural abundances. Things like the radiation length
1941 // are calculated for you.
1942 // Inputs:
1943 // Int_t imat Material number.
1944 // const char* name Material name. No need to add a $ at the end.
1945 // Int_t *z Array of The elemental numbers.
1946 // Int_t_t *w Array of relative number.
1947 // Double_t dens The density of the material [g/cm^3].
1948 // Int_t n the number of elements making up the mixture.
1949 // Int_t istd Defines which standard set of transport parameters
1950 // which should be used.
1951 // Output:
1952 // none.
1953 // Return:
1954 // none.
1955 Float_t *Z,*A,*W,tmax,stemax,deemax,epsilon;
1956 char *name2;
1957 Int_t len,i;
1958 Z = new Float_t[n];
1959 A = new Float_t[n];
1960 W = new Float_t[n];
1961
1962 len = strlen(name)+1;
1963 name2 = new char[len];
1964 strncpy(name2,name,len-1);
1965 name2[len-1] = '\0';
1966 name2[len-2] = '$';
1967 for(i=0;i<n;i++){Z[i] = (Float_t)z[i];A[i] = (Float_t)GetA(z[i]);
1968 W[i] = (Float_t)w[i];}
1969 fits->AliMixture(imat,name2,A,Z,dens,-n,W);
1970 tmax = GetStandardThetaMax(istd); // degree
1971 stemax = GetStandardMaxStepSize(istd); // cm
1972 deemax = GetStandardEfraction(istd); // #
1973 epsilon = GetStandardEpsilon(istd);
1974 fits->AliMedium(imat,name2,imat,0,gAlice->Field()->Integ(),
1975 gAlice->Field()->Max(),tmax,stemax,deemax,epsilon,0.0);
1976 delete[] name2;
1977 delete[] Z;
1978 delete[] A;
1979 delete[] W;
1980}
1981//______________________________________________________________________
1982Double_t AliITSBaseGeometry::RadLength(Int_t iz,Double_t a){
1983 // Computes the radiation length in accordance to the PDG 2000 Section
1984 // 23.4.1 p. 166. Transladed from the c code of Flavio Tosello.
1985 // Inputs:
1986 // Int_t iz The elemental number
1987 // Dougle_t The elemental average atomic mass number
1988 // Outputs:
1989 // Return:
1990 // Double_t returns the radiation length of the element iz in
1991 // [gm/cm^2].
1992 Double_t z = (Double_t)iz;
1993 Double_t alphaz = fAlpha*z;
1994 Double_t alphaz2 = alphaz*alphaz;
1995 Double_t c0 = +0.20206,c1 = -0.0369,c2 = +0.0083,c3 = -0.0020;
1996 Double_t z12,z23,l,lp,c;
1997
1998 c = alphaz2*(1./(1.+alphaz2) + c0 + c1*alphaz2 + c2*alphaz2*alphaz2
1999 +c3*alphaz2*alphaz2*alphaz2);
2000 z12 = TMath::Exp(TMath::Log(z)/3.0);
2001 z23 = z12*z12;
2002 switch (iz){
2003 case 1: //Hydrogen
2004 l = 5.31;
2005 lp = 6.144;
2006 break;
2007 case 2: //Helium
2008 l = 4.79;
2009 lp = 5,621;
2010 break;
2011 case 3: //Lithium
2012 l = 4.74;
2013 lp = 5.805;
2014 break;
2015 case 4: //Berilium
2016 l = 4.71;
2017 lp = 5.924;
2018 break;
2019 default: //Others
2020 l = TMath::Log(184.15/z12);
2021 lp = TMath::Log(1194.0/z23);
2022 break;
2023 } // end switch
2024 Double_t re2,b,r,xz;
2025
2026 re2 = fRe*fRe;
2027 b = 4.0*fAlpha*re2*fNa/a;
2028 r = b*z*(z*(l-c)+lp);
2029 xz = 1.0/r;
2030 return xz; // [gm/cm^2]
2031}
2032//======================================================================
2033ClassImp(AliITSBaseVolParams)
2034//______________________________________________________________________
2035void AliITSBaseVolParams::Print(ostream *os){
2036 // Prints out the data kept in this class
2037 // Inputs:
2038 // ostream *os The output stream pointer
2039 // Outputs:
2040 // none.
2041 // Return:
2042 // none.
2043
2044 *os<<"Volume Id="<<fVol<<" Copy="<<fCpn<<" Name: "<<fName<<endl;
2045}
2046//______________________________________________________________________
2047void AliITSBaseVolParams::Read(istream *is){
2048 // Read in data kept in this class
2049 // Inputs:
2050 // istream *is the input stream
2051 // Outputs:
2052 // none.
2053 // Return:
2054 // none.
2055 char s[50];
2056
2057 is->get(s,10);
2058 *is >> fVol;
2059 is->get(s,6);
2060 *is >> fCpn;
2061 is->get(s,7);
2062 *is >> fName;
2063}
2064//______________________________________________________________________
2065ostream &operator<<(ostream &os,AliITSBaseVolParams &p){
2066 // Operator << for C++ like output
2067 // Inputs:
2068 // ostream &os The output stream
2069 // AliITSBaseVolParams &p The class to be outputed
2070 // Output:
2071 // none.
2072 // Return:
2073 // ostream &os The output stream
2074
2075 p.Print(&os);
2076 return os;
2077}
2078//______________________________________________________________________
2079istream &operator>>(istream &is,AliITSBaseVolParams &r){
2080 // Operator << for C++ like output
2081 // Inputs:
2082 // istream &is The input stream
2083 // AliITSBaseVolParams &r The class to be read in
2084 // Output:
2085 // none.
2086 // Return:
2087 // istream &is The input stream
2088
2089 r.Read(&is);
2090 return is;
2091}
2092//======================================================================
2093ClassImp(AliITSBoxData)
2094//______________________________________________________________________
2095void AliITSBoxData::Print(ostream *os){
2096 // Prints out the data kept in this class
2097 // Inputs:
2098 // ostream *os The output stream pointer
2099 // Outputs:
2100 // none.
2101 // Return:
2102 // none.
2103
2104#if defined __GNUC__
2105#if __GNUC__ > 2
2106 ios::fmtflags fmt;
2107#else
2108 Int_t fmt;
2109#endif
2110#else
2111#if defined __ICC || defined __ECC
2112 ios::fmtflags fmt;
2113#else
2114 Int_t fmt;
2115#endif
2116#endif
2117
2118 AliITSBaseVolParams::Print(os);
2119 fmt = os->setf(ios::scientific); // set scientific floating point output
2120 *os << "fDx=" << fDx << " fDy=" << fDy << " fDz=" << fDz << endl;
2121 os->flags(fmt); // reset back to old formating.
2122 return;
2123}
2124//______________________________________________________________________
2125void AliITSBoxData::Read(istream *is){
2126 // Read in data kept in this class
2127 // Inputs:
2128 // istream *is the input stream
2129 // Outputs:
2130 // none.
2131 // Return:
2132 // none.
2133 char s[50];
2134
2135 AliITSBaseVolParams::Read(is);
2136 is->get(s,4);
2137 *is >> fDx;
2138 is->get(s,5);
2139 *is >> fDy;
2140 is->get(s,5);
2141 *is >> fDz;
2142}
2143//______________________________________________________________________
2144ostream &operator<<(ostream &os,AliITSBoxData &p){
2145 // Operator << for C++ like output
2146 // Inputs:
2147 // ostream &os The output stream
2148 // AliITSBoxData &p The class to be outputed
2149 // Output:
2150 // none.
2151 // Return:
2152 // ostream &os The output stream
2153
2154 p.Print(&os);
2155 return os;
2156}
2157//______________________________________________________________________
2158istream &operator>>(istream &is,AliITSBoxData &r){
2159 // Operator << for C++ like output
2160 // Inputs:
2161 // istream &is The input stream
2162 // AliITSBoxData &r The class to be read in
2163 // Output:
2164 // none.
2165 // Return:
2166 // istream &is The input stream
2167
2168 r.Read(&is);
2169 return is;
2170}
2171//======================================================================
2172ClassImp(AliITSTrapezoid1Data)
2173//______________________________________________________________________
2174void AliITSTrapezoid1Data::Print(ostream *os){
2175 // Prints out the data kept in this class
2176 // Inputs:
2177 // ostream *os The output stream pointer
2178 // Outputs:
2179 // none.
2180 // Return:
2181 // none.
2182
2183#if defined __GNUC__
2184#if __GNUC__ > 2
2185 ios::fmtflags fmt;
2186#else
2187 Int_t fmt;
2188#endif
2189#else
2190#if defined __ICC || defined __ECC
2191 ios::fmtflags fmt;
2192#else
2193 Int_t fmt;
2194#endif
2195#endif
2196
2197 AliITSBaseVolParams::Print(os);
2198 fmt = os->setf(ios::scientific); // set scientific floating point output
2199 *os << "fDx[0]=" << fDx[0]<< " fDx[1]=" << fDx[1] << " fDy=" << fDy;
2200 *os << " fDz=" << fDz << endl;
2201 os->flags(fmt); // reset back to old formating.
2202 return;
2203}
2204//______________________________________________________________________
2205void AliITSTrapezoid1Data::Read(istream *is){
2206 // Read in data kept in this class
2207 // Inputs:
2208 // istream *is the input stream
2209 // Outputs:
2210 // none.
2211 // Return:
2212 // none.
2213 char s[50];
2214
2215 AliITSBaseVolParams::Read(is);
2216 is->get(s,7);
2217 *is >> fDx[0];
2218 is->get(s,8);
2219 *is >> fDx[1];
2220 is->get(s,5);
2221 *is >> fDy;
2222 is->get(s,5);
2223 *is >> fDz;
2224}
2225//______________________________________________________________________
2226ostream &operator<<(ostream &os,AliITSTrapezoid1Data &p){
2227 // Operator << for C++ like output
2228 // Inputs:
2229 // ostream &os The output stream
2230 // AliITSBoxData &p The class to be outputed
2231 // Output:
2232 // none.
2233 // Return:
2234 // ostream &os The output stream
2235
2236 p.Print(&os);
2237 return os;
2238}
2239//______________________________________________________________________
2240istream &operator>>(istream &is,AliITSTrapezoid1Data &r){
2241 // Operator << for C++ like output
2242 // Inputs:
2243 // istream &is The input stream
2244 // AliITSPGonData &r The class to be read in
2245 // Output:
2246 // none.
2247 // Return:
2248 // istream &is The input stream
2249
2250 r.Read(&is);
2251 return is;
2252}
2253//======================================================================
2254ClassImp(AliITSTrapezoid2Data)
2255//______________________________________________________________________
2256void AliITSTrapezoid2Data::Print(ostream *os){
2257 // Prints out the data kept in this class
2258 // Inputs:
2259 // ostream *os The output stream pointer
2260 // Outputs:
2261 // none.
2262 // Return:
2263 // none.
2264
2265#if defined __GNUC__
2266#if __GNUC__ > 2
2267 ios::fmtflags fmt;
2268#else
2269 Int_t fmt;
2270#endif
2271#else
2272#if defined __ICC || defined __ECC
2273 ios::fmtflags fmt;
2274#else
2275 Int_t fmt;
2276#endif
2277#endif
2278
2279 AliITSBaseVolParams::Print(os);
2280 fmt = os->setf(ios::scientific); // set scientific floating point output
2281 *os << "fDx[0]=" << fDx[0]<< " fDx[1]=" << fDx[1];
2282 *os << " fDy[0]=" << fDy[0] << " fDy[1]=" << fDy[1];
2283 *os << " fDz=" << fDz << endl;
2284 os->flags(fmt); // reset back to old formating.
2285 return;
2286}
2287//______________________________________________________________________
2288void AliITSTrapezoid2Data::Read(istream *is){
2289 // Read in data kept in this class
2290 // Inputs:
2291 // istream *is the input stream
2292 // Outputs:
2293 // none.
2294 // Return:
2295 // none.
2296 char s[50];
2297
2298 AliITSBaseVolParams::Read(is);
2299 is->get(s,7);
2300 *is >> fDx[0];
2301 is->get(s,8);
2302 *is >> fDx[1];
2303 is->get(s,8);
2304 *is >> fDy[0];
2305 is->get(s,8);
2306 *is >> fDy[1];
2307 is->get(s,5);
2308 *is >> fDz;
2309}
2310//______________________________________________________________________
2311ostream &operator<<(ostream &os,AliITSTrapezoid2Data &p){
2312 // Operator << for C++ like output
2313 // Inputs:
2314 // ostream &os The output stream
2315 // AliITSBoxData &p The class to be outputed
2316 // Output:
2317 // none.
2318 // Return:
2319 // ostream &os The output stream
2320
2321 p.Print(&os);
2322 return os;
2323}
2324//______________________________________________________________________
2325istream &operator>>(istream &is,AliITSTrapezoid2Data &r){
2326 // Operator << for C++ like output
2327 // Inputs:
2328 // istream &is The input stream
2329 // AliITSPGonData &r The class to be read in
2330 // Output:
2331 // none.
2332 // Return:
2333 // istream &is The input stream
2334
2335 r.Read(&is);
2336 return is;
2337}
2338//======================================================================
2339ClassImp(AliITSTrapezoidData)
2340//______________________________________________________________________
2341void AliITSTrapezoidData::Print(ostream *os){
2342 // Prints out the data kept in this class
2343 // Inputs:
2344 // ostream *os The output stream pointer
2345 // Outputs:
2346 // none.
2347 // Return:
2348 // none.
2349
2350#if defined __GNUC__
2351#if __GNUC__ > 2
2352 ios::fmtflags fmt;
2353#else
2354 Int_t fmt;
2355#endif
2356#else
2357#if defined __ICC || defined __ECC
2358 ios::fmtflags fmt;
2359#else
2360 Int_t fmt;
2361#endif
2362#endif
2363
2364 AliITSBaseVolParams::Print(os);
2365 fmt = os->setf(ios::scientific); // set scientific floating point output
2366 *os << "fTheta=" << fTheta << " fPhi=" << fPhi << " fDz=" << fDz;
2367 *os << " fH[0]=" << fH[0]<< " fH[1]=" << fH[1];
2368 *os << " fBl[0]=" << fBl[0] << " fBl[1]=" << fBl[1];
2369 *os << " fTl[0]=" << fTl[0] << " fTl[1]=" << fTl[1];
2370 *os << " fAlp[0]=" << fAlp[0] << " fAlp[1]=" << fAlp[1];
2371 *os << endl;
2372 os->flags(fmt); // reset back to old formating.
2373 return;
2374}
2375//______________________________________________________________________
2376void AliITSTrapezoidData::Read(istream *is){
2377 // Read in data kept in this class
2378 // Inputs:
2379 // istream *is the input stream
2380 // Outputs:
2381 // none.
2382 // Return:
2383 // none.
2384 char s[50];
2385
2386 AliITSBaseVolParams::Read(is);
2387 is->get(s,6);
2388 *is >> fTheta;
2389 is->get(s,6);
2390 *is >> fPhi;
2391 is->get(s,5);
2392 *is >> fDz;
2393 is->get(s,7);
2394 *is >> fH[0];
2395 is->get(s,7);
2396 *is >> fH[1];
2397 is->get(s,8);
2398 *is >> fBl[0];
2399 is->get(s,8);
2400 *is >> fBl[1];
2401 is->get(s,8);
2402 *is >> fTl[0];
2403 is->get(s,8);
2404 *is >> fTl[1];
2405 is->get(s,9);
2406 *is >> fAlp[0];
2407 is->get(s,9);
2408 *is >> fAlp[1];
2409}
2410//______________________________________________________________________
2411ostream &operator<<(ostream &os,AliITSTrapezoidData &p){
2412 // Operator << for C++ like output
2413 // Inputs:
2414 // ostream &os The output stream
2415 // AliITSBoxData &p The class to be outputed
2416 // Output:
2417 // none.
2418 // Return:
2419 // ostream &os The output stream
2420
2421 p.Print(&os);
2422 return os;
2423}
2424//______________________________________________________________________
2425istream &operator>>(istream &is,AliITSTrapezoidData &r){
2426 // Operator << for C++ like output
2427 // Inputs:
2428 // istream &is The input stream
2429 // AliITSPGonData &r The class to be read in
2430 // Output:
2431 // none.
2432 // Return:
2433 // istream &is The input stream
2434
2435 r.Read(&is);
2436 return is;
2437}
2438//======================================================================
2439ClassImp(AliITSTrapezoidTwistedData)
2440//______________________________________________________________________
2441void AliITSTrapezoidTwistedData::Print(ostream *os){
2442 // Prints out the data kept in this class
2443 // Inputs:
2444 // ostream *os The output stream pointer
2445 // Outputs:
2446 // none.
2447 // Return:
2448 // none.
2449
2450#if defined __GNUC__
2451#if __GNUC__ > 2
2452 ios::fmtflags fmt;
2453#else
2454 Int_t fmt;
2455#endif
2456#else
2457#if defined __ICC || defined __ECC
2458 ios::fmtflags fmt;
2459#else
2460 Int_t fmt;
2461#endif
2462#endif
2463
2464 AliITSBaseVolParams::Print(os);
2465 fmt = os->setf(ios::scientific); // set scientific floating point output
2466 *os << "fTheta=" << fTheta << " fPhi=" << fPhi << " fDz=" << fDz;
2467 *os << " fTwist=" << fTwist;
2468 *os << " fH[0]=" << fH[0]<< " fH[1]=" << fH[1];
2469 *os << " fBl[0]=" << fBl[0] << " fBl[1]=" << fBl[1];
2470 *os << " fTl[0]=" << fTl[0] << " fTl[1]=" << fTl[1];
2471 *os << " fAlp[0]=" << fAlp[0] << " fAlp[1]=" << fAlp[1];
2472 *os << endl;
2473 os->flags(fmt); // reset back to old formating.
2474 return;
2475}
2476//______________________________________________________________________
2477void AliITSTrapezoidTwistedData::Read(istream *is){
2478 // Read in data kept in this class
2479 // Inputs:
2480 // istream *is the input stream
2481 // Outputs:
2482 // none.
2483 // Return:
2484 // none.
2485 char s[50];
2486
2487 AliITSBaseVolParams::Read(is);
2488 is->get(s,6);
2489 *is >> fTheta;
2490 is->get(s,6);
2491 *is >> fPhi;
2492 is->get(s,5);
2493 *is >> fDz;
2494 is->get(s,8);
2495 *is >> fTwist;
2496 is->get(s,7);
2497 *is >> fH[0];
2498 is->get(s,7);
2499 *is >> fH[1];
2500 is->get(s,8);
2501 *is >> fBl[0];
2502 is->get(s,8);
2503 *is >> fBl[1];
2504 is->get(s,8);
2505 *is >> fTl[0];
2506 is->get(s,8);
2507 *is >> fTl[1];
2508 is->get(s,9);
2509 *is >> fAlp[0];
2510 is->get(s,9);
2511 *is >> fAlp[1];
2512}
2513//______________________________________________________________________
2514ostream &operator<<(ostream &os,AliITSTrapezoidTwistedData &p){
2515 // Operator << for C++ like output
2516 // Inputs:
2517 // ostream &os The output stream
2518 // AliITSBoxData &p The class to be outputed
2519 // Output:
2520 // none.
2521 // Return:
2522 // ostream &os The output stream
2523
2524 p.Print(&os);
2525 return os;
2526}
2527//______________________________________________________________________
2528istream &operator>>(istream &is,AliITSTrapezoidTwistedData &r){
2529 // Operator << for C++ like output
2530 // Inputs:
2531 // istream &is The input stream
2532 // AliITSPGonData &r The class to be read in
2533 // Output:
2534 // none.
2535 // Return:
2536 // istream &is The input stream
2537
2538 r.Read(&is);
2539 return is;
2540}
2541//======================================================================
2542ClassImp(AliITSTubeData)
2543//______________________________________________________________________
2544void AliITSTubeData::Print(ostream *os){
2545 // Prints out the data kept in this class
2546 // Inputs:
2547 // ostream *os The output stream pointer
2548 // Outputs:
2549 // none.
2550 // Return:
2551 // none.
2552
2553#if defined __GNUC__
2554#if __GNUC__ > 2
2555 ios::fmtflags fmt;
2556#else
2557 Int_t fmt;
2558#endif
2559#else
2560#if defined __ICC || defined __ECC
2561 ios::fmtflags fmt;
2562#else
2563 Int_t fmt;
2564#endif
2565#endif
2566
2567 AliITSBaseVolParams::Print(os);
2568 fmt = os->setf(ios::scientific); // set scientific floating point output
2569 *os <<" Z , Rmin , Rmax " << endl;
2570 fmt = os->setf(ios::scientific); // set scientific floating point output
2571 *os << setprecision(16) << fDz <<"\t";
2572 *os << setprecision(16) << fRmin << "\t";
2573 *os << setprecision(16) << fRmax << endl;
2574 os->flags(fmt); // reset back to old formating.
2575 return;
2576}
2577
2578//______________________________________________________________________
2579void AliITSTubeData::Read(istream *is){
2580 // Read in data kept in this class
2581 // Inputs:
2582 // istream *is the input stream
2583 // Outputs:
2584 // none.
2585 // Return:
2586 // none.
2587 char s[50];
2588
2589 AliITSBaseVolParams::Read(is);
2590
2591 is->getline(s,49);
2592 *is >> fDz >> fRmin >> fRmax;
2593}
2594//______________________________________________________________________
2595ostream &operator<<(ostream &os,AliITSTubeData &p){
2596 // Operator << for C++ like output
2597 // Inputs:
2598 // ostream &os The output stream
2599 // AliITSTubeData &p The class to be outputed
2600 // Output:
2601 // none.
2602 // Return:
2603 // ostream &os The output stream
2604
2605 p.Print(&os);
2606 return os;
2607}
2608//______________________________________________________________________
2609istream &operator>>(istream &is,AliITSTubeData &r){
2610 // Operator << for C++ like output
2611 // Inputs:
2612 // istream &is The input stream
2613 // AliITSTubeData &r The class to be read in
2614 // Output:
2615 // none.
2616 // Return:
2617 // istream &is The input stream
2618
2619 r.Read(&is);
2620 return is;
2621}
2622//======================================================================
2623ClassImp(AliITSTubeSegData)
2624//______________________________________________________________________
2625void AliITSTubeSegData::Print(ostream *os){
2626 // Prints out the data kept in this class
2627 // Inputs:
2628 // ostream *os The output stream pointer
2629 // Outputs:
2630 // none.
2631 // Return:
2632 // none.
2633
2634#if defined __GNUC__
2635#if __GNUC__ > 2
2636 ios::fmtflags fmt;
2637#else
2638 Int_t fmt;
2639#endif
2640#else
2641#if defined __ICC || defined __ECC
2642 ios::fmtflags fmt;
2643#else
2644 Int_t fmt;
2645#endif
2646#endif
2647
2648 AliITSBaseVolParams::Print(os);
2649 fmt = os->setf(ios::scientific); // set scientific floating point output
2650 *os << "fPhi0=" << fPhi0 << " fPhi1=" << fPhi1 << endl;
2651 *os <<" Z , Rmin , Rmax " << endl;
2652 fmt = os->setf(ios::scientific); // set scientific floating point output
2653 *os << setprecision(16) << fDz <<"\t";
2654 *os << setprecision(16) << fRmin << "\t";
2655 *os << setprecision(16) << fRmax << endl;
2656 os->flags(fmt); // reset back to old formating.
2657 return;
2658}
2659//______________________________________________________________________
2660void AliITSTubeSegData::Read(istream *is){
2661 // Read in data kept in this class
2662 // Inputs:
2663 // istream *is the input stream
2664 // Outputs:
2665 // none.
2666 // Return:
2667 // none.
2668 char s[50];
2669
2670 AliITSBaseVolParams::Read(is);
2671
2672 is->get(s,6);
2673 *is >> fPhi0;
2674 is->get(s,7);
2675 *is >> fPhi1;
2676 is->getline(s,49);
2677 *is >> fDz >> fRmin >> fRmax;
2678}
2679//______________________________________________________________________
2680ostream &operator<<(ostream &os,AliITSTubeSegData &p){
2681 // Operator << for C++ like output
2682 // Inputs:
2683 // ostream &os The output stream
2684 // AliITSTubeData &p The class to be outputed
2685 // Output:
2686 // none.
2687 // Return:
2688 // ostream &os The output stream
2689
2690 p.Print(&os);
2691 return os;
2692}
2693//______________________________________________________________________
2694istream &operator>>(istream &is,AliITSTubeSegData &r){
2695 // Operator << for C++ like output
2696 // Inputs:
2697 // istream &is The input stream
2698 // AliITSTubeData &r The class to be read in
2699 // Output:
2700 // none.
2701 // Return:
2702 // istream &is The input stream
2703
2704 r.Read(&is);
2705 return is;
2706}
2707//======================================================================
2708ClassImp(AliITSTubeCutData)
2709//______________________________________________________________________
2710void AliITSTubeCutData::Print(ostream *os){
2711 // Prints out the data kept in this class
2712 // Inputs:
2713 // ostream *os The output stream pointer
2714 // Outputs:
2715 // none.
2716 // Return:
2717 // none.
2718
2719#if defined __GNUC__
2720#if __GNUC__ > 2
2721 ios::fmtflags fmt;
2722#else
2723 Int_t fmt;
2724#endif
2725#else
2726#if defined __ICC || defined __ECC
2727 ios::fmtflags fmt;
2728#else
2729 Int_t fmt;
2730#endif
2731#endif
2732
2733 AliITSBaseVolParams::Print(os);
2734 fmt = os->setf(ios::scientific); // set scientific floating point output
2735 *os << "fPhi0=" << fPhi0 << " fPhi1=" << fPhi1;
2736 *os << " Norm0=("<<(fNorm[0])[0]<<" "<<(fNorm[0])[1]<<" "<<(fNorm[0])[2];
2737 *os << ") Norm1=("<<(fNorm[1])[0]<<" "<<(fNorm[1])[1]<<" "<<(fNorm[1])[2];
2738 *os << ")"<< endl;
2739 *os <<" Z , Rmin , Rmax " << endl;
2740 *os << setprecision(16) << fDz <<"\t";
2741 *os << setprecision(16) << fRmin << "\t";
2742 *os << setprecision(16) << fRmax << endl;
2743 os->flags(fmt); // reset back to old formating.
2744 return;
2745}
2746//______________________________________________________________________
2747void AliITSTubeCutData::Read(istream *is){
2748 // Read in data kept in this class
2749 // Inputs:
2750 // istream *is the input stream
2751 // Outputs:
2752 // none.
2753 // Return:
2754 // none.
2755 char s[50];
2756
2757 AliITSBaseVolParams::Read(is);
2758
2759 is->get(s,6);
2760 *is >> fPhi0;
2761 is->get(s,7);
2762 *is >> fPhi1;
2763 is->get(s,8);
2764 *is >> (fNorm[0])[0]>>(fNorm[0])[1]>>(fNorm[0])[2];
2765 is->get(s,9);
2766 *is >> (fNorm[1])[0]>>(fNorm[1])[1]>>(fNorm[1])[2];
2767 is->get(s,1);
2768 is->getline(s,49);
2769 *is >> fDz >> fRmin >> fRmax;
2770}
2771//______________________________________________________________________
2772ostream &operator<<(ostream &os,AliITSTubeCutData &p){
2773 // Operator << for C++ like output
2774 // Inputs:
2775 // ostream &os The output stream
2776 // AliITSTubeData &p The class to be outputed
2777 // Output:
2778 // none.
2779 // Return:
2780 // ostream &os The output stream
aa9bc63b 2781
bc825688 2782 p.Print(&os);
2783 return os;
aa9bc63b 2784}
2785//______________________________________________________________________
bc825688 2786istream &operator>>(istream &is,AliITSTubeCutData &r){
2787 // Operator << for C++ like output
aa9bc63b 2788 // Inputs:
bc825688 2789 // istream &is The input stream
2790 // AliITSTubeData &r The class to be read in
2791 // Output:
aa9bc63b 2792 // none.
2793 // Return:
bc825688 2794 // istream &is The input stream
aa9bc63b 2795
bc825688 2796 r.Read(&is);
2797 return is;
162acd47 2798}
bc825688 2799
2800//======================================================================
2801ClassImp(AliITSTubeEllipticalData)
162acd47 2802//______________________________________________________________________
bc825688 2803void AliITSTubeEllipticalData::Print(ostream *os){
2804 // Prints out the data kept in this class
162acd47 2805 // Inputs:
bc825688 2806 // ostream *os The output stream pointer
162acd47 2807 // Outputs:
2808 // none.
2809 // Return:
2810 // none.
162acd47 2811
bc825688 2812#if defined __GNUC__
2813#if __GNUC__ > 2
2814 ios::fmtflags fmt;
2815#else
2816 Int_t fmt;
2817#endif
2818#else
2819#if defined __ICC || defined __ECC
2820 ios::fmtflags fmt;
2821#else
2822 Int_t fmt;
2823#endif
2824#endif
2825
2826 AliITSBaseVolParams::Print(os);
2827 fmt = os->setf(ios::scientific); // set scientific floating point output
2828 *os <<" Z , Semi-axis-x , Semi-axis-y " << endl;
2829 fmt = os->setf(ios::scientific); // set scientific floating point output
2830 *os << setprecision(16) << fDz <<"\t";
2831 *os << setprecision(16) << fP0 << "\t";
2832 *os << setprecision(16) << fP1 << endl;
2833 os->flags(fmt); // reset back to old formating.
2834 return;
aa9bc63b 2835}
bc825688 2836
aa9bc63b 2837//______________________________________________________________________
bc825688 2838void AliITSTubeEllipticalData::Read(istream *is){
2839 // Read in data kept in this class
aa9bc63b 2840 // Inputs:
bc825688 2841 // istream *is the input stream
aa9bc63b 2842 // Outputs:
bc825688 2843 // none.
aa9bc63b 2844 // Return:
bc825688 2845 // none.
2846 char s[50];
aa9bc63b 2847
bc825688 2848 AliITSBaseVolParams::Read(is);
2849
2850 is->getline(s,49);
2851 *is >> fDz >> fP0 >> fP1;
aa9bc63b 2852}
2853//______________________________________________________________________
bc825688 2854ostream &operator<<(ostream &os,AliITSTubeEllipticalData &p){
2855 // Operator << for C++ like output
aa9bc63b 2856 // Inputs:
bc825688 2857 // ostream &os The output stream
2858 // AliITSTubeData &p The class to be outputed
2859 // Output:
aa9bc63b 2860 // none.
2861 // Return:
bc825688 2862 // ostream &os The output stream
2863
2864 p.Print(&os);
2865 return os;
2866}
2867//______________________________________________________________________
2868istream &operator>>(istream &is,AliITSTubeEllipticalData &r){
2869 // Operator << for C++ like output
2870 // Inputs:
2871 // istream &is The input stream
2872 // AliITSTubeData &r The class to be read in
2873 // Output:
aa9bc63b 2874 // none.
bc825688 2875 // Return:
2876 // istream &is The input stream
aa9bc63b 2877
bc825688 2878 r.Read(&is);
2879 return is;
aa9bc63b 2880}
bc825688 2881//======================================================================
2882ClassImp(AliITSTubeHyperbolicData)
aa9bc63b 2883//______________________________________________________________________
bc825688 2884void AliITSTubeHyperbolicData::Print(ostream *os){
2885 // Prints out the data kept in this class
aa9bc63b 2886 // Inputs:
bc825688 2887 // ostream *os The output stream pointer
aa9bc63b 2888 // Outputs:
2889 // none.
2890 // Return:
2891 // none.
2892
bc825688 2893#if defined __GNUC__
2894#if __GNUC__ > 2
2895 ios::fmtflags fmt;
2896#else
2897 Int_t fmt;
2898#endif
2899#else
2900#if defined __ICC || defined __ECC
2901 ios::fmtflags fmt;
2902#else
2903 Int_t fmt;
2904#endif
2905#endif
aa9bc63b 2906
bc825688 2907 AliITSBaseVolParams::Print(os);
2908 fmt = os->setf(ios::scientific); // set scientific floating point output
2909 *os <<" Z Rmin Rmax Theta"<<endl;
2910 fmt = os->setf(ios::scientific); // set scientific floating point output
2911 *os << setprecision(16) << fDz <<"\t";
2912 *os << setprecision(16) << fRmin << "\t";
2913 *os << setprecision(16) << fRmax << "\t";
2914 *os << setprecision(16) << fTheta << endl;
2915 os->flags(fmt); // reset back to old formating.
2916 return;
2917}
aa9bc63b 2918
bc825688 2919//______________________________________________________________________
2920void AliITSTubeHyperbolicData::Read(istream *is){
2921 // Read in data kept in this class
2922 // Inputs:
2923 // istream *is the input stream
2924 // Outputs:
2925 // none.
2926 // Return:
2927 // none.
2928 char s[50];
aa9bc63b 2929
bc825688 2930 AliITSBaseVolParams::Read(is);
aa9bc63b 2931
bc825688 2932 is->getline(s,49);
2933 *is >> fDz >> fRmin >> fRmax >> fTheta;
aa9bc63b 2934}
2935//______________________________________________________________________
bc825688 2936ostream &operator<<(ostream &os,AliITSTubeHyperbolicData &p){
2937 // Operator << for C++ like output
aa9bc63b 2938 // Inputs:
bc825688 2939 // ostream &os The output stream
2940 // AliITSTubeData &p The class to be outputed
2941 // Output:
aa9bc63b 2942 // none.
2943 // Return:
bc825688 2944 // ostream &os The output stream
aa9bc63b 2945
bc825688 2946 p.Print(&os);
2947 return os;
aa9bc63b 2948}
2949//______________________________________________________________________
bc825688 2950istream &operator>>(istream &is,AliITSTubeHyperbolicData &r){
2951 // Operator << for C++ like output
aa9bc63b 2952 // Inputs:
bc825688 2953 // istream &is The input stream
2954 // AliITSTubeData &r The class to be read in
2955 // Output:
aa9bc63b 2956 // none.
2957 // Return:
bc825688 2958 // istream &is The input stream
2959
2960 r.Read(&is);
2961 return is;
aa9bc63b 2962}
bc825688 2963//======================================================================
2964ClassImp(AliITSConeData)
aa9bc63b 2965//______________________________________________________________________
bc825688 2966void AliITSConeData::Print(ostream *os){
2967 // Prints out the data kept in this class
aa9bc63b 2968 // Inputs:
bc825688 2969 // ostream *os The output stream pointer
aa9bc63b 2970 // Outputs:
2971 // none.
2972 // Return:
bc825688 2973 // none.
2974
2975#if defined __GNUC__
2976#if __GNUC__ > 2
2977 ios::fmtflags fmt;
2978#else
2979 Int_t fmt;
2980#endif
2981#else
2982#if defined __ICC || defined __ECC
2983 ios::fmtflags fmt;
2984#else
2985 Int_t fmt;
2986#endif
2987#endif
2988
2989 AliITSBaseVolParams::Print(os);
2990 fmt = os->setf(ios::scientific); // set scientific floating point output
2991 *os <<" Z Rmin Rmax" << endl;
2992 fmt = os->setf(ios::scientific); // set scientific floating point output
2993 *os << setprecision(16) << fDz <<"\t";
2994 *os << setprecision(16) << fRmin0 << "\t";
2995 *os << setprecision(16) << fRmax0 << endl;
2996 *os << setprecision(16) << fDz <<"\t";
2997 *os << setprecision(16) << fRmin1 << "\t";
2998 *os << setprecision(16) << fRmax1 << endl;
2999 os->flags(fmt); // reset back to old formating.
3000 return;
aa9bc63b 3001}
3002//______________________________________________________________________
bc825688 3003void AliITSConeData::Read(istream *is){
3004 // Read in data kept in this class
aa9bc63b 3005 // Inputs:
bc825688 3006 // istream *is the input stream
aa9bc63b 3007 // Outputs:
bc825688 3008 // none.
aa9bc63b 3009 // Return:
bc825688 3010 // none.
3011 char s[50];
3012
3013 AliITSBaseVolParams::Read(is);
3014
3015 is->getline(s,49);
3016 *is >> fDz >> fRmin0 >> fRmax0;
3017 *is >> fDz >> fRmin1 >> fRmax1;
aa9bc63b 3018}
162acd47 3019//______________________________________________________________________
bc825688 3020ostream &operator<<(ostream &os,AliITSConeData &p){
3021 // Operator << for C++ like output
aa9bc63b 3022 // Inputs:
bc825688 3023 // ostream &os The output stream
3024 // AliITSTubeData &p The class to be outputed
aa9bc63b 3025 // Output:
3026 // none.
3027 // Return:
bc825688 3028 // ostream &os The output stream
aa9bc63b 3029
bc825688 3030 p.Print(&os);
3031 return os;
aa9bc63b 3032}
3033//______________________________________________________________________
bc825688 3034istream &operator>>(istream &is,AliITSConeData &r){
3035 // Operator << for C++ like output
aa9bc63b 3036 // Inputs:
bc825688 3037 // istream &is The input stream
3038 // AliITSTubeData &r The class to be read in
aa9bc63b 3039 // Output:
bc825688 3040 // none.
aa9bc63b 3041 // Return:
bc825688 3042 // istream &is The input stream
aa9bc63b 3043
bc825688 3044 r.Read(&is);
3045 return is;
aa9bc63b 3046}
bc825688 3047//======================================================================
3048ClassImp(AliITSConeSegData)
aa9bc63b 3049//______________________________________________________________________
bc825688 3050void AliITSConeSegData::Print(ostream *os){
3051 // Prints out the data kept in this class
aa9bc63b 3052 // Inputs:
bc825688 3053 // ostream *os The output stream pointer
3054 // Outputs:
3055 // none.
aa9bc63b 3056 // Return:
bc825688 3057 // none.
aa9bc63b 3058
bc825688 3059#if defined __GNUC__
3060#if __GNUC__ > 2
3061 ios::fmtflags fmt;
3062#else
3063 Int_t fmt;
3064#endif
3065#else
3066#if defined __ICC || defined __ECC
3067 ios::fmtflags fmt;
3068#else
3069 Int_t fmt;
3070#endif
3071#endif
3072
3073 AliITSBaseVolParams::Print(os);
3074 fmt = os->setf(ios::scientific); // set scientific floating point output
3075 *os << "fPhi0=" << fPhi0 << " fPhi1=" << fPhi1 << endl;
3076 *os <<" Z , Rmin , Rmax " << endl;
3077 fmt = os->setf(ios::scientific); // set scientific floating point output
3078 *os << setprecision(16) << fDz <<"\t";
3079 *os << setprecision(16) << fRmin0 << "\t";
3080 *os << setprecision(16) << fRmax0 << endl;
3081 *os << setprecision(16) << fDz <<"\t";
3082 *os << setprecision(16) << fRmin1 << "\t";
3083 *os << setprecision(16) << fRmax1 << endl;
3084 os->flags(fmt); // reset back to old formating.
3085 return;
3086}
3087//______________________________________________________________________
3088void AliITSConeSegData::Read(istream *is){
3089 // Read in data kept in this class
3090 // Inputs:
3091 // istream *is the input stream
3092 // Outputs:
3093 // none.
3094 // Return:
3095 // none.
3096 char s[50];
3097
3098 AliITSBaseVolParams::Read(is);
3099 is->get(s,6);
3100 *is >> fPhi0;
3101 is->get(s,7);
3102 *is >> fPhi1;
3103 is->getline(s,49);
3104 *is >> fDz >> fRmin0 >> fRmax0;
3105 *is >> fDz >> fRmin1 >> fRmax1;
aa9bc63b 3106}
3107//______________________________________________________________________
bc825688 3108ostream &operator<<(ostream &os,AliITSConeSegData &p){
3109 // Operator << for C++ like output
aa9bc63b 3110 // Inputs:
bc825688 3111 // ostream &os The output stream
3112 // AliITSConeSegData &p The class to be outputed
aa9bc63b 3113 // Output:
bc825688 3114 // none.
aa9bc63b 3115 // Return:
bc825688 3116 // ostream &os The output stream
aa9bc63b 3117
bc825688 3118 p.Print(&os);
3119 return os;
aa9bc63b 3120}
3121//______________________________________________________________________
bc825688 3122istream &operator>>(istream &is,AliITSConeSegData &r){
3123 // Operator << for C++ like output
aa9bc63b 3124 // Inputs:
bc825688 3125 // istream &is The input stream
3126 // AliITSConeSegData &r The class to be read in
3127 // Output:
3128 // none.
aa9bc63b 3129 // Return:
bc825688 3130 // istream &is The input stream
aa9bc63b 3131
bc825688 3132 r.Read(&is);
3133 return is;
aa9bc63b 3134}
162acd47 3135//======================================================================
3136ClassImp(AliITSPConeData)
3137//______________________________________________________________________
3138void AliITSPConeData::Print(ostream *os){
3139 // Prints out the data kept in this class
3140 // Inputs:
3141 // ostream *os The output stream pointer
3142 // Outputs:
3143 // none.
3144 // Return:
3145 // none.
3146 Int_t i;
3147
3148#if defined __GNUC__
3149#if __GNUC__ > 2
3150 ios::fmtflags fmt;
3151#else
3152 Int_t fmt;
3153#endif
3154#else
3155#if defined __ICC || defined __ECC
3156 ios::fmtflags fmt;
3157#else
3158 Int_t fmt;
3159#endif
3160#endif
3161
bc825688 3162 AliITSBaseVolParams::Print(os);
3163 fmt = os->setf(ios::scientific); // set scientific floating point output
162acd47 3164 *os << "fNz=" << fNz << " fPhi0=" << fPhi0 << " fdPhi=" << fDphi << endl;
3165 *os <<" Z , Rmin , Rmax " << endl;
3166 fmt = os->setf(ios::scientific); // set scientific floating point output
3167 for(i=0;i<fNz;i++){
887366e2 3168 *os << setprecision(16) << fZ[i] <<"\t";
3169 *os << setprecision(16) << fRmin[i] << "\t";
162acd47 3170 *os << setprecision(16) << fRmax[i] << endl;
3171 } // end for i
3172 os->flags(fmt); // reset back to old formating.
3173 return;
3174}
3175//______________________________________________________________________
3176void AliITSPConeData::Read(istream *is){
3177 // Read in data kept in this class
3178 // Inputs:
3179 // istream *is the input stream
3180 // Outputs:
3181 // none.
3182 // Return:
3183 // none.
3184 Int_t i;
3185 char s[50];
162acd47 3186
bc825688 3187 AliITSBaseVolParams::Read(is);
162acd47 3188 is->get(s,4);
3189 *is >> fNz;
3190 is->get(s,6);
3191 *is >> fPhi0;
3192 is->get(s,6);
3193 *is >> fDphi;
3194 is->getline(s,49);
3195 Size(fNz);
3196 for(i=0;i<fNz;i++){
3197 *is >> fZ[i] >> fRmin[i] >> fRmax[i];
3198 } // end for i
3199}
3200//______________________________________________________________________
3201ostream &operator<<(ostream &os,AliITSPConeData &p){
3202 // Operator << for C++ like output
3203 // Inputs:
3204 // ostream &os The output stream
3205 // AliITSPConeData &p The class to be outputed
3206 // Output:
3207 // none.
3208 // Return:
3209 // ostream &os The output stream
3210
3211 p.Print(&os);
3212 return os;
3213}
3214//______________________________________________________________________
3215istream &operator>>(istream &is,AliITSPConeData &r){
3216 // Operator << for C++ like output
3217 // Inputs:
3218 // istream &is The input stream
3219 // AliITSPConeData &r The class to be read in
3220 // Output:
3221 // none.
3222 // Return:
3223 // istream &is The input stream
3224
3225 r.Read(&is);
3226 return is;
3227}
3228//======================================================================
bc825688 3229ClassImp(AliITSSphereData)
162acd47 3230//______________________________________________________________________
bc825688 3231void AliITSSphereData::Print(ostream *os){
162acd47 3232 // Prints out the data kept in this class
3233 // Inputs:
3234 // ostream *os The output stream pointer
3235 // Outputs:
3236 // none.
3237 // Return:
3238 // none.
162acd47 3239
3240#if defined __GNUC__
3241#if __GNUC__ > 2
3242 ios::fmtflags fmt;
3243#else
3244 Int_t fmt;
3245#endif
3246#else
3247#if defined __ICC || defined __ECC
3248 ios::fmtflags fmt;
3249#else
3250 Int_t fmt;
3251#endif
3252#endif
3253
bc825688 3254 AliITSBaseVolParams::Print(os);
162acd47 3255 fmt = os->setf(ios::scientific); // set scientific floating point output
bc825688 3256 *os << "fTheta[0]=" << fTheta[0] << " fTheta[1]=" << fTheta[1] << endl;
3257 *os << "fPhi[0]=" << fPhi[0] << " fPhi[1]=" << fPhi[1] << endl;
3258 *os <<" Rmin , Rmax " << endl;
3259 fmt = os->setf(ios::scientific); // set scientific floating point output
3260 *os << setprecision(16) << fRmin << "\t";
3261 *os << setprecision(16) << fRmax << endl;
162acd47 3262 os->flags(fmt); // reset back to old formating.
3263 return;
3264}
3265//______________________________________________________________________
bc825688 3266void AliITSSphereData::Read(istream *is){
162acd47 3267 // Read in data kept in this class
3268 // Inputs:
3269 // istream *is the input stream
3270 // Outputs:
3271 // none.
3272 // Return:
3273 // none.
162acd47 3274 char s[50];
162acd47 3275
bc825688 3276 AliITSBaseVolParams::Read(is);
3277 is->get(s,10);
3278 *is >> fTheta[0];
3279 is->get(s,11);
3280 *is >> fTheta[1];
3281 is->get(s,8);
3282 *is >> fPhi[0];
3283 is->get(s,9);
3284 *is >> fPhi[1];
162acd47 3285 is->getline(s,49);
bc825688 3286 *is >>fRmin >> fRmax;
3287}
3288//______________________________________________________________________
3289ostream &operator<<(ostream &os,AliITSSphereData &p){
3290 // Operator << for C++ like output
3291 // Inputs:
3292 // ostream &os The output stream
3293 // AliITSPConeData &p The class to be outputed
3294 // Output:
3295 // none.
3296 // Return:
3297 // ostream &os The output stream
162acd47 3298
bc825688 3299 p.Print(&os);
3300 return os;
162acd47 3301}
3302//______________________________________________________________________
bc825688 3303istream &operator>>(istream &is,AliITSSphereData &r){
162acd47 3304 // Operator << for C++ like output
3305 // Inputs:
bc825688 3306 // istream &is The input stream
3307 // AliITSPConeData &r The class to be read in
3308 // Output:
3309 // none.
3310 // Return:
3311 // istream &is The input stream
3312
3313 r.Read(&is);
3314 return is;
3315}
3316//======================================================================
3317ClassImp(AliITSParallelpipedData)
3318//______________________________________________________________________
3319void AliITSParallelpipedData::Print(ostream *os){
3320 // Prints out the data kept in this class
3321 // Inputs:
3322 // ostream *os The output stream pointer
3323 // Outputs:
3324 // none.
3325 // Return:
3326 // none.
3327
3328#if defined __GNUC__
3329#if __GNUC__ > 2
3330 ios::fmtflags fmt;
3331#else
3332 Int_t fmt;
3333#endif
3334#else
3335#if defined __ICC || defined __ECC
3336 ios::fmtflags fmt;
3337#else
3338 Int_t fmt;
3339#endif
3340#endif
3341
3342 AliITSBaseVolParams::Print(os);
3343 fmt = os->setf(ios::scientific); // set scientific floating point output
3344 *os << "fDx=" << fDx << " fDy=" << fDy << " fDz=" << fDz << endl;
3345 *os << "fAlpha=" << fAlpha << " fTheta=" << fTheta <<" fPhi="<<fPhi<<endl;
3346 os->flags(fmt); // reset back to old formating.
3347 return;
3348}
3349//______________________________________________________________________
3350void AliITSParallelpipedData::Read(istream *is){
3351 // Read in data kept in this class
3352 // Inputs:
3353 // istream *is the input stream
3354 // Outputs:
3355 // none.
3356 // Return:
3357 // none.
3358 char s[50];
3359
3360 AliITSBaseVolParams::Read(is);
3361 is->get(s,4);
3362 *is >> fDx;
3363 is->get(s,5);
3364 *is >> fDy;
3365 is->get(s,5);
3366 *is >> fDz;
3367 is->get(s,7);
3368 *is >> fAlpha;
3369 is->get(s,8);
3370 *is >> fTheta;
3371 is->get(s,6);
3372 *is >> fPhi;
3373}
3374//______________________________________________________________________
3375ostream &operator<<(ostream &os,AliITSParallelpipedData &p){
3376 // Operator << for C++ like output
3377 // Inputs:
3378 // ostream &os The output stream
3379 // AliITSBoxData &p The class to be outputed
162acd47 3380 // Output:
3381 // none.
3382 // Return:
3383 // ostream &os The output stream
3384
3385 p.Print(&os);
3386 return os;
3387}
3388//______________________________________________________________________
bc825688 3389istream &operator>>(istream &is,AliITSParallelpipedData &r){
162acd47 3390 // Operator << for C++ like output
3391 // Inputs:
bc825688 3392 // istream &is The input stream
3393 // AliITSBoxData &r The class to be read in
162acd47 3394 // Output:
3395 // none.
3396 // Return:
3397 // istream &is The input stream
3398
3399 r.Read(&is);
3400 return is;
3401}
3402//======================================================================
bc825688 3403ClassImp(AliITSPGonData)
162acd47 3404//______________________________________________________________________
bc825688 3405void AliITSPGonData::Print(ostream *os){
162acd47 3406 // Prints out the data kept in this class
3407 // Inputs:
3408 // ostream *os The output stream pointer
3409 // Outputs:
3410 // none.
3411 // Return:
3412 // none.
bc825688 3413 Int_t i;
162acd47 3414
3415#if defined __GNUC__
3416#if __GNUC__ > 2
3417 ios::fmtflags fmt;
3418#else
3419 Int_t fmt;
3420#endif
3421#else
3422#if defined __ICC || defined __ECC
3423 ios::fmtflags fmt;
3424#else
3425 Int_t fmt;
3426#endif
3427#endif
3428
bc825688 3429 AliITSBaseVolParams::Print(os);
162acd47 3430 fmt = os->setf(ios::scientific); // set scientific floating point output
bc825688 3431 fmt = os->setf(ios::scientific); // set scientific floating point output
3432 *os << "fNz=" << fNz << " fNphi=" << fNphi << " fPhi0=" << fPhi0;
3433 *os << " fdPhi=" << fDphi << endl;
3434 *os <<" Z , Rmin , Rmax " << endl;
3435 for(i=0;i<fNz;i++){
3436 *os << setprecision(16) << fZ[i] <<"\t";
3437 *os << setprecision(16) << fRmin[i] << "\t";
3438 *os << setprecision(16) << fRmax[i] << endl;
3439 } // end for i
162acd47 3440 os->flags(fmt); // reset back to old formating.
3441 return;
3442}
3443//______________________________________________________________________
bc825688 3444void AliITSPGonData::Read(istream *is){
162acd47 3445 // Read in data kept in this class
3446 // Inputs:
3447 // istream *is the input stream
3448 // Outputs:
3449 // none.
3450 // Return:
3451 // none.
3452 Int_t i;
3453 char s[50];
162acd47 3454
bc825688 3455 AliITSBaseVolParams::Read(is);
162acd47 3456
bc825688 3457 is->get(s,4);
3458 *is >> fNz;
3459 is->get(s,6);
3460 *is >> fNphi;
3461 is->get(s,6);
3462 *is >> fPhi0;
3463 is->get(s,6);
3464 *is >> fDphi;
162acd47 3465 is->getline(s,49);
bc825688 3466
3467 Size(fNz);
3468 for(i=0;i<fNz;i++){
3469 *is >> fZ[i] >> fRmin[i] >> fRmax[i];
3470 } // end for i
162acd47 3471}
3472//______________________________________________________________________
bc825688 3473ostream &operator<<(ostream &os,AliITSPGonData &p){
162acd47 3474 // Operator << for C++ like output
3475 // Inputs:
3476 // ostream &os The output stream
bc825688 3477 // AliITSPGonData &p The class to be outputed
162acd47 3478 // Output:
3479 // none.
3480 // Return:
3481 // ostream &os The output stream
3482
3483 p.Print(&os);
3484 return os;
3485}
3486//______________________________________________________________________
bc825688 3487istream &operator>>(istream &is,AliITSPGonData &r){
162acd47 3488 // Operator << for C++ like output
3489 // Inputs:
3490 // istream &is The input stream
bc825688 3491 // AliITSPGonData &r The class to be read in
162acd47 3492 // Output:
3493 // none.
3494 // Return:
3495 // istream &is The input stream
3496
3497 r.Read(&is);
3498 return is;
3499}