Line data Source code
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 12 : 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 3 : : AliFMDDetector(3, inner, outer),
49 : // fNoseZ(16.54667)
50 6 : fNoseZ(18.13 - inner->GetModuleDepth()-inner->GetModuleSpacing()/2), // From drawing
51 3 : fFlangeDepth(0),
52 3 : fFlangeHighR(49.25), // From drawing
53 3 : fFlangeLength(0),
54 3 : fFlangeWidth(6), // From drawing
55 3 : fFiducialRadius(.25),
56 3 : fConeInnerAngle(0),
57 3 : fConeOuterAngle(0),
58 3 : fHoleOffset(6.9), // From drawing
59 3 : fHoleDepth(2), // What's needed
60 3 : fHoleLength(31.2), // From drawing
61 3 : fHoleLowWidth(3), // 4), // What's needed
62 3 : fHoleHighWidth(18.5), // 17.5), // 18), // What's needed
63 3 : fBoltLength(1), // Guessed
64 3 : fBoltRadius(0.15), // Estimate
65 3 : fConeRadii(6),
66 3 : fFiducialHoles(4)
67 15 : {
68 : // Constructor.
69 : Double_t off = 0; // -0.39615-0.10185; // -0.25;
70 3 : if (off != 0)
71 0 : AliWarning(Form("Z position of FMD3 rings may be off by %fcm!", off));
72 :
73 3 : SetInnerZ(-62.8+off); // By design
74 3 : SetOuterZ(-75.2+off); // By design
75 :
76 3 : SetInnerHoneyLowR(4.18207); // From drawing
77 3 : SetInnerHoneyHighR(19.74922); // From drawing
78 3 : SetOuterHoneyLowR(13.4776); // From drawing
79 3 : SetOuterHoneyHighR(31.01964); // From drawing
80 :
81 : // These are from the drawings
82 9 : fConeRadii.Add(new TVector3( 0, 5.55, 6.25));
83 9 : fConeRadii.Add(new TVector3( 2.35, 5.55, 6.25));
84 9 : fConeRadii.Add(new TVector3( 2.9935, 5.55, 6.88479));
85 9 : fConeRadii.Add(new TVector3(28.9435, 31.50, 32.75850));
86 9 : fConeRadii.Add(new TVector3(29.5, 31.50, 33.4));
87 9 : fConeRadii.Add(new TVector3(30.9, 31.50, 33.4));
88 :
89 : // These are from the drawings
90 9 : fFiducialHoles.Add(new TVector2(29.666, 32.495));
91 9 : fFiducialHoles.Add(new TVector2(31.082, 33.910));
92 9 : fFiducialHoles.Add(new TVector2(32.674, 35.503));
93 9 : fFiducialHoles.Add(new TVector2(33.403, 34.818));
94 6 : }
95 :
96 : //____________________________________________________________________
97 : void
98 : AliFMD3::Init()
99 : {
100 : // Initialize
101 22 : AliFMDDetector::Init();
102 : // TVector3& v0 = *(static_cast<TVector3*>(fConeRadii.At(0)));
103 11 : TVector3& v1 = *(static_cast<TVector3*>(fConeRadii.At(1)));
104 11 : TVector3& v2 = *(static_cast<TVector3*>(fConeRadii.At(2)));
105 11 : TVector3& v3 = *(static_cast<TVector3*>(fConeRadii.At(3)));
106 11 : TVector3& v4 = *(static_cast<TVector3*>(fConeRadii.At(4)));
107 11 : TVector3& v5 = *(static_cast<TVector3*>(fConeRadii.At(5)));
108 :
109 11 : fFlangeDepth = v5.X() - v4.X();
110 11 : fFlangeLength = fFlangeHighR - v5.Y();
111 :
112 11 : fConeInnerAngle = TMath::ATan2(v4.Z()-v1.Z(), v4.X()-v1.X());
113 11 : 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 11 : }
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 10 : TVector3& v1 = *(static_cast<TVector3*>(fConeRadii.At(1)));
129 5 : TVector3& v2 = *(static_cast<TVector3*>(fConeRadii.At(2)));
130 5 : TVector3& v3 = *(static_cast<TVector3*>(fConeRadii.At(3)));
131 5 : TVector3& v4 = *(static_cast<TVector3*>(fConeRadii.At(4)));
132 5 : TVector3& v5 = *(static_cast<TVector3*>(fConeRadii.At(5)));
133 :
134 5 : if (z > fInnerZ + fNoseZ) {
135 0 : AliWarning(Form("z=%lf is before start of cone %lf", z, fInnerZ + fNoseZ));
136 0 : return -1;
137 : }
138 5 : if (z < fInnerZ + fNoseZ - v5.Z()) {
139 0 : AliWarning(Form("z=%lf is after end of cone %lf", z,
140 : fInnerZ + fNoseZ - v5.Z()));
141 0 : return -1;
142 : }
143 5 : Double_t rz = -(z-fInnerZ-fNoseZ);
144 15 : Bool_t inner = opt[0] == 'I' || opt[1] == 'i';
145 5 : if (inner && rz <= v2.X()) return v2.Y();
146 11 : if (!inner && rz <= v1.X()) return v1.Z();
147 4 : if (inner && rz > v3.X()) return v3.Y();
148 8 : if (!inner && rz > v4.X()) return v4.Z();
149 :
150 12 : rz -= (inner ? v2.X() : v1.X());
151 12 : Double_t sr = (inner ? v2.Y() : v1.Z());
152 12 : Double_t ang = (inner ? fConeInnerAngle : fConeOuterAngle);
153 4 : return sr + rz * TMath::Tan(ang);
154 5 : }
155 :
156 :
157 : //____________________________________________________________________
158 : //
159 : // EOF
160 : //
|