81e1da3bd041d9055d9ef0bb2c6a6a0441ef92c7
[u/mrichter/AliRoot.git] / ITS / AliITSBaseGeometry.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15 /*
16   $Id:
17  */
18
19 #include <TObject.h>
20 #include <TObjArray.h>
21
22 #include <TGeoMaterial.h>
23 #include <TGeoMatrix.h>
24 #include <TGeoMedium.h>
25 #include <TGeoPgon.h>
26 #include "AliITSBaseGeometry.h"
27
28
29 ClassImp(AliITSMixture)
30
31 AliITSMixture::AliITSMixture(const char *name,Int_t N,Double_t *w,TObjArray *m,
32                              Double_t rho,Double_t radlen,Double_t intleng)
33     :TGeoMixture(name,1,rho){
34     // Defines a new mixture from a number of Mixtures, and put the
35     // resulting mixture into this object. This will compute avarage
36     // isotopic value between different elements.
37     // Inputs:
38     //   Int_t    N   The number of mixtures in te TObjArray
39     //   Double_t *w  The array of weights of each mixture
40     //   TObjArray *m The array of AliITSMixture (TGeoMixture)s 
41     //                to be mixed.
42     // Output:
43     //   none.
44     // Return:
45     //   none.
46     Int_t i,z=0,j,Nel;
47     Double_t tw,*nw,wel[110],Ael[110],el[110];
48     TGeoMixture *mix;
49
50     if(N>m->GetEntries()){ // Error not enough mixtures defined
51         Error("Mixing","There are more weight defined than mixtures");
52         return;
53     } // end if
54     // First normilize the weights just in case.
55     tw = 0.0;
56     for(i=0;i<N;i++) if(w[i]>0.0) tw += w[i];
57     nw = new Double_t[N];
58     for(i=0;i<N;i++) {if(w[i]>0.0) nw[i] = w[i]/tw;else nw[i] = 0.0;}
59     //
60     Nel=0;
61     for(i=0;i<110;i++) {el[i] = wel[i] = Ael[i] = 0.0;}
62     for(i=0;i<N;i++)if(w[i]>0.0) {
63         mix = (TGeoMixture*) (m->At(i));
64         for(j=0;j<mix->GetNelements();j++) {
65             z = (Int_t) ((mix->GetZmixt())[j]);
66             wel[z] += nw[i]*((mix->GetWmixt())[j]);
67             el[z]  += wel[z]*((mix->GetZmixt())[j]);
68             Ael[z] += wel[z]*((mix->GetAmixt())[j]);
69         } // end for j
70     } // end for i
71     tw = 0.0;
72     for(i=1;i<110;i++) if(wel[i]>0.0){
73         Nel++;
74         tw += wel[i];
75     } // end for
76     if(tw<=0.0) {  // Error no elements defined.
77         Error("Mixing","Total weight of this mixture is zero");
78         delete[] nw;
79         return;
80     } // end if
81     // setup TGeoMixture data members.
82     fNelements = Nel;
83     if(fZmixture!=0) delete[] fZmixture;
84     if(fAmixture!=0) delete[] fAmixture;
85     if(fWeights!=0)  delete[] fWeights;
86     fZmixture = new Double_t[Nel];
87     fAmixture = new Double_t[Nel];
88     fWeights  = new Double_t[Nel];
89     if(rho>0.) fDensity = rho;
90     else { // try to compute density form mixture.
91         rho = 0.0;
92         for(i=0;i<N;i++) if(nw[i]>0.0) {
93             mix = (TGeoMixture*) (m->At(i));
94             rho += nw[i]*(mix->GetDensity());
95         } // end for i
96         fDensity = rho;
97     } // end if
98     if(radlen>0.) fRadLen = radlen;
99     else { // try to compute radiation form mixture.
100         // From "Review of Particle Physics" Particle Data Group Section
101         // 26.4.1 equation 26.21 (2002).
102         radlen = 0.0;
103         for(i=0;i<N;i++) if(nw[i]>0.0) {
104             mix = (TGeoMixture*) (m->At(i));
105             if(mix->GetRadLen()>0.0) rho += 1.0/(nw[i]*(mix->GetRadLen()));
106         } // end for i
107         fRadLen = 1.0/radlen;
108     } // end if
109     if(intleng>0.) fIntLen = intleng;
110     else { // try to compute interaction form mixture.
111         intleng = 0.0;
112         for(i=0;i<N;i++) if(nw[i]>0.0) {
113             mix = (TGeoMixture*) (m->At(i));
114             if(mix->GetIntLen()>0.0) intleng += 1.0/(nw[i]*(mix->GetIntLen()));
115         } // end for i
116         fIntLen = 1.0/intleng;
117     } // end if
118     j = 0;
119     for(z=1;z<110;z++){
120         wel[z] /= tw;
121         el[z]  /= tw;
122         Ael[z] /= tw;
123         if(wel[z]>0.0) this->DefineElement(j++,Ael[z],el[z],wel[z]);
124     } // end for i
125     delete[] nw;
126 }
127 //======================================================================
128 ClassImp(AliITSGeoCable)
129 ;
130 AliITSGeoCable::AliITSGepCable(){
131     //
132
133     fRmin = fRmax = 0.0;
134     fNs.SetXYZ(0.0,0.0,0.0);
135     fNe.SetXYZ(0.0,0.0,0.0);
136     fTubes    = 0;
137     fTranRot  = 0;
138 }
139 //----------------------------------------------------------------------
140 AliITSGeoCable::AliITSGepCable(const char *name,TObjArray *vect,
141                                const Double_t Rmin,const Double_t Rmax
142                                const TVector3 ns,const TVector3 ne){
143     //
144     // Inputs:
145     //    char      *name   Name of this compound object
146     //    TObjArray *vect   Array of TVector3's of points representing the
147     //                      path of the cable
148     //    TVector3  ns=0    Normal vector representing the angle of the 
149     //                      starting surface, default perpendicular
150     //    TVector3  ne=0    Normal vector representing the angle of the 
151     //                      ending surface, default perpendicular
152     // Outputs:
153     //    none.
154     // Return:
155     //    A fully initilized and created AliITSGeoCable class.
156     Char_t nam[500];
157     Int_t i,n;
158     Double_t s,th,ph;
159     TVector3 x0,x1,x2,d,t;
160
161     fRmin = fRmax = 0.0;
162     fNs.SetXYZ(0.0,0.0,-1.0);
163     fNe.SetXYZ(0.0,0.0,1.0);
164     n = vect->GetEnteries();
165     fTubes = new TObjArray(n-1);
166     fTran  = new TObjArray(n-1);
167     fRot   = new TObjArray(n-1);
168     if(ns!=0) fNs = ns/ns.Mag();
169     if(ne!=0) fNe = ne/ne.Mag();
170     //
171     x0 = (TVector3)(*(vect->At(0)));
172     n0 = ns;
173     for(i=1;i<n;i++){
174         x1 = (TVector3)(*(vect->At(i)));
175         d  = x1 - x0;
176         if(i<n-1) {
177             x2 = (TVector3)(*(vect->At(i+1)));
178             n1 = d + (x2-x1);
179             n1 /= n1.Mag();
180         }else{
181             n1 = fNe;
182         } // end if
183         t  = 0.5*(x1 + x0);
184         th =  TMath::ATan2(TMath::Sqrt(2.*d.Mag2()-d.z()-2.*d.Mag()*d.y()-
185                                         2.*d.Mag()*d.x()),
186                            TMath::Sqrt(d.z()*d.z()-2.*d.Mag()*d.z()+d.Mag2()));
187         th *= TMath::RadToDeg();
188         ph =  TMath::ATan2(d.y()-d.Mag(),d.x()-d.Mag());
189         ph *= TMath::RadToDeg();
190         sprintf(nam,"%sCombiTrans%dCable",name,i-1);
191         fTranRot[i-1] = new TCombiTrans(nam,t.x(),t.y(),t.z(),
192                                         new TGeoRotation("",ph,th,0.0);)
193         s  = d.Mag();
194         sprintf(nam,"%sPart%dCable",name,i-1);
195         fTubes[i-1]  = new TGeoCtub(nam,fRmin,fRmax,0.5*s,0.0,360.0,
196                                   n0.x(),n0.y(),n0.z(),n1.x(),n1.y(),n1.z());
197         n0 = -n1;
198         x0 = x1;
199     } // end for i
200 }
201 //----------------------------------------------------------------------
202 AliITSGeoCable::~AliITSGepCable(){
203     //
204     // Inputs:
205     //    none.
206     // Outputs:
207     //    none.
208     // Return:
209     //    none.
210     Int_t i;
211
212     if(fTubes){
213         for(i=0;i<fTubes->GetEnteries();i++) 
214             delete (TGeoCtub*)(fTubes->At(i));
215         delete fTubes;
216     } // end if
217     fTubes = 0;
218     if(fTran){
219         for(i=0;i<fTram->GetEnteries();i++) 
220             delete (TGeoTransofmation*)(fTran->At(i));
221         delete fTran;
222     } // end if
223     fTran  = 0;
224     if(fRot){
225         for(i=0;i<fRot->GetEnteries();i++) 
226             delete (TGeoRotation*)(fRot->At(i));
227         delete fRot;
228     } // end if
229     fRot   = 0;
230 }
231 //----------------------------------------------------------------------