Fixed Coverity issues
[u/mrichter/AliRoot.git] / FMD / AliFMD3.cxx
1 /**************************************************************************
2  * Copyright(c) 2004, 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 /* $Id$ */
16 /** @file    AliFMD3.cxx
17     @author  Christian Holm Christensen <cholm@nbi.dk>
18     @date    Sun Mar 26 18:26:12 2006
19     @brief   Concrete implementation of AliFMDDetector for FMD3
20 */
21 //____________________________________________________________________
22 //                                                                          
23 // Concrete implementation of AliFMDDetector 
24 //
25 // This implements the geometry for FMD3.
26 // This has 2 rings.
27 // The support of the FMD3 is a carbon-fibre cone, attached to the ITS
28 // support via flanges.  The cone also supports the beam-pipe.
29 // The support is a special cone of carbon-fibre made by a Danish
30 // Yacht company.
31 //
32
33 #include <TMath.h>              // ROOT_TMath
34
35 #include "AliFMD3.h"            // ALIFMD3_H 
36 #include "AliFMDDebug.h"                // ALIFMDDEBUG_H ALILOG_H
37 #include "AliFMDRing.h"         // ALIFMDRING_H 
38 #include <TVector3.h>
39
40 //====================================================================
41 ClassImp(AliFMD3)
42 #if 0
43   ; // This is here to keep Emacs for indenting the next line
44 #endif
45
46 //____________________________________________________________________
47 AliFMD3::AliFMD3(AliFMDRing* inner, AliFMDRing* outer) 
48   : AliFMDDetector(3, inner, outer),
49     // fNoseZ(16.54667)
50     fNoseZ(18.13 - inner->GetModuleDepth()-inner->GetModuleSpacing()/2),    // From drawing
51     fFlangeDepth(0),
52     fFlangeHighR(49.25), // From drawing 
53     fFlangeLength(0),
54     fFlangeWidth(6),     // From drawing 
55     fFiducialRadius(.25),
56     fConeInnerAngle(0),
57     fConeOuterAngle(0),
58     fHoleOffset(6.9),    // From drawing
59     fHoleDepth(2),       // What's needed
60     fHoleLength(31.2),   // From drawing
61     fHoleLowWidth(3), // 4),    // What's needed
62     fHoleHighWidth(18.5), // 17.5), // 18),  // What's needed
63     fBoltLength(1),      // Guessed
64     fBoltRadius(0.15),   // Estimate
65     fConeRadii(6),    
66     fFiducialHoles(4)
67 {
68   // Constructor. 
69   Double_t off = 0; // -0.39615-0.10185; // -0.25;
70   if (off != 0) 
71     AliWarning(Form("Z position of FMD3 rings may be off by %fcm!", off));
72
73   SetInnerZ(-62.8+off);             // By design
74   SetOuterZ(-75.2+off);             // By design
75
76   SetInnerHoneyLowR(4.18207);   // From drawing
77   SetInnerHoneyHighR(19.74922); // From drawing
78   SetOuterHoneyLowR(13.4776);   // From drawing
79   SetOuterHoneyHighR(31.01964); // From drawing
80   
81   // These are from the drawings
82   fConeRadii.Add(new TVector3( 0,       5.55,  6.25));
83   fConeRadii.Add(new TVector3( 2.35,    5.55,  6.25));
84   fConeRadii.Add(new TVector3( 2.9935,  5.55,  6.88479));
85   fConeRadii.Add(new TVector3(28.9435, 31.50, 32.75850));
86   fConeRadii.Add(new TVector3(29.5,    31.50, 33.4));
87   fConeRadii.Add(new TVector3(30.9,    31.50, 33.4));
88
89   // These are from the drawings
90   fFiducialHoles.Add(new TVector2(29.666, 32.495));
91   fFiducialHoles.Add(new TVector2(31.082, 33.910));
92   fFiducialHoles.Add(new TVector2(32.674, 35.503));
93   fFiducialHoles.Add(new TVector2(33.403, 34.818));
94 }
95
96 //____________________________________________________________________
97 void
98 AliFMD3::Init() 
99 {
100   // Initialize 
101   AliFMDDetector::Init();
102   // TVector3& v0 = *(static_cast<TVector3*>(fConeRadii.At(0)));
103   TVector3& v1 = *(static_cast<TVector3*>(fConeRadii.At(1)));
104   TVector3& v2 = *(static_cast<TVector3*>(fConeRadii.At(2)));
105   TVector3& v3 = *(static_cast<TVector3*>(fConeRadii.At(3)));
106   TVector3& v4 = *(static_cast<TVector3*>(fConeRadii.At(4)));
107   TVector3& v5 = *(static_cast<TVector3*>(fConeRadii.At(5)));
108   
109   fFlangeDepth     = v5.X() - v4.X();
110   fFlangeLength    = fFlangeHighR - v5.Y();
111   
112   fConeInnerAngle  = TMath::ATan2(v4.Z()-v1.Z(), v4.X()-v1.X());
113   fConeOuterAngle  = TMath::ATan2(v3.Y()-v2.Y(), v3.X()-v2.X());
114   
115 #if 0
116   Double_t    hz1  = -fHoleOffset+fInnerZ+fNoseZ;
117   fHoleLength      = TMath::Sqrt(TMath::Power(v4.Z()-ConeR(hz1),2) + 
118                                  TMath::Power(v4.X()-fHoleOffset,2));  
119 #endif
120 }
121
122 //____________________________________________________________________
123 Double_t
124 AliFMD3::ConeR(Double_t z, Option_t* opt) const
125 {
126   // Calculate the cone radius at Z
127   // TVector3& v0 = *(static_cast<TVector3*>(fConeRadii.At(0)));
128   TVector3& v1 = *(static_cast<TVector3*>(fConeRadii.At(1)));
129   TVector3& v2 = *(static_cast<TVector3*>(fConeRadii.At(2)));
130   TVector3& v3 = *(static_cast<TVector3*>(fConeRadii.At(3)));
131   TVector3& v4 = *(static_cast<TVector3*>(fConeRadii.At(4)));
132   TVector3& v5 = *(static_cast<TVector3*>(fConeRadii.At(5)));
133
134   if (z > fInnerZ + fNoseZ) {
135     AliWarning(Form("z=%lf is before start of cone %lf", z, fInnerZ + fNoseZ));
136     return -1;
137   }
138   if (z < fInnerZ + fNoseZ - v5.Z()) {
139     AliWarning(Form("z=%lf is after end of cone %lf", z, 
140                     fInnerZ + fNoseZ - v5.Z()));
141     return -1;
142   }
143   Double_t rz    = -(z-fInnerZ-fNoseZ);
144   Bool_t   inner = opt[0] == 'I' || opt[1] == 'i';
145   if (inner  && rz <= v2.X()) return v2.Y();
146   if (!inner && rz <= v1.X()) return v1.Z();
147   if (inner  && rz >  v3.X()) return v3.Y();
148   if (!inner && rz >  v4.X()) return v4.Z();
149   
150   rz             -= (inner ? v2.X() : v1.X());
151   Double_t sr    =  (inner ? v2.Y() : v1.Z());
152   Double_t ang   =  (inner ? fConeInnerAngle : fConeOuterAngle);
153   return sr + rz * TMath::Tan(ang);
154 }
155
156
157 //____________________________________________________________________
158 //
159 // EOF
160 //