]>
Commit | Line | Data |
---|---|---|
4347b38f | 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 | **************************************************************************/ | |
4347b38f | 15 | /* $Id$ */ |
c2fc1258 | 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 | */ | |
ba224443 | 21 | //____________________________________________________________________ |
4347b38f | 22 | // |
1a1fdef7 | 23 | // Concrete implementation of AliFMDDetector |
4347b38f | 24 | // |
088f8e79 | 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. | |
6169f936 | 29 | // The support is a special cone of carbon-fibre made by a Danish |
30 | // Yacht company. | |
4347b38f | 31 | // |
090026bf | 32 | |
33 | #include <TMath.h> // ROOT_TMath | |
34 | ||
e802be3e | 35 | #include "AliFMD3.h" // ALIFMD3_H |
f95a63c4 | 36 | #include "AliFMDDebug.h" // ALIFMDDEBUG_H ALILOG_H |
e802be3e | 37 | #include "AliFMDRing.h" // ALIFMDRING_H |
ed82d35e | 38 | #include <TVector3.h> |
4347b38f | 39 | |
1a1fdef7 | 40 | //==================================================================== |
925e6570 | 41 | ClassImp(AliFMD3) |
1a1fdef7 | 42 | #if 0 |
43 | ; // This is here to keep Emacs for indenting the next line | |
44 | #endif | |
4347b38f | 45 | |
46 | //____________________________________________________________________ | |
1a1fdef7 | 47 | AliFMD3::AliFMD3(AliFMDRing* inner, AliFMDRing* outer) |
b5ee4425 | 48 | : AliFMDDetector(3, inner, outer), |
ed82d35e | 49 | fNoseZ(16.54667), // From drawing |
50 | fFlangeDepth(0), | |
51 | fFlangeHighR(49.25), // From drawing | |
52 | fFlangeLength(0), | |
53 | fFlangeWidth(6), // From drawing | |
54 | fFiducialRadius(.25), | |
55 | fConeInnerAngle(0), | |
56 | fConeOuterAngle(0), | |
57 | fHoleOffset(7), // From drawing | |
58 | fHoleDepth(2), // What's needed | |
59 | fHoleLength(0), | |
60 | fHoleLowWidth(4), // What's needed | |
61 | fHoleHighWidth(18), // What's needed | |
62 | fBoltLength(1), // Guessed | |
63 | fBoltRadius(0.15), // Estimate | |
64 | fConeRadii(6), | |
65 | fFiducialHoles(4) | |
4347b38f | 66 | { |
088f8e79 | 67 | // Constructor. |
ed82d35e | 68 | // SetInnerZ(-62.8); // By design |
69 | // SetOuterZ(-75.2); // By design | |
70 | AliWarning("Z position of FMD3 rings may be off by 0.25cm!"); | |
71 | SetInnerZ(-63.05); // Slightly off (2.5mm) from design | |
72 | SetOuterZ(-75.45); // Slightly off (2.5mm) from design | |
73 | ||
74 | SetInnerHoneyLowR(4.18207); // From drawing | |
75 | SetInnerHoneyHighR(19.74922); // From drawing | |
76 | SetOuterHoneyLowR(13.4776); // From drawing | |
77 | SetOuterHoneyHighR(31.01964); // From drawing | |
78 | ||
79 | // These are from the drawings | |
80 | fConeRadii.Add(new TVector3( 0, 5.55, 6.25)); | |
81 | fConeRadii.Add(new TVector3( 2.35, 5.55, 6.25)); | |
82 | fConeRadii.Add(new TVector3( 2.9935, 5.55, 6.88479)); | |
83 | fConeRadii.Add(new TVector3(28.9435, 31.50, 32.75850)); | |
84 | fConeRadii.Add(new TVector3(29.5, 31.50, 33.4)); | |
85 | fConeRadii.Add(new TVector3(30.9, 31.50, 33.4)); | |
86 | ||
87 | // These are from the drawings | |
88 | fFiducialHoles.Add(new TVector2(29.666, 32.495)); | |
89 | fFiducialHoles.Add(new TVector2(31.082, 33.910)); | |
90 | fFiducialHoles.Add(new TVector2(32.674, 35.503)); | |
91 | fFiducialHoles.Add(new TVector2(33.403, 34.818)); | |
4347b38f | 92 | } |
93 | ||
94 | //____________________________________________________________________ | |
1a1fdef7 | 95 | void |
96 | AliFMD3::Init() | |
4347b38f | 97 | { |
088f8e79 | 98 | // Initialize |
1a1fdef7 | 99 | AliFMDDetector::Init(); |
ed82d35e | 100 | // TVector3& v0 = *(static_cast<TVector3*>(fConeRadii.At(0))); |
101 | TVector3& v1 = *(static_cast<TVector3*>(fConeRadii.At(1))); | |
102 | TVector3& v2 = *(static_cast<TVector3*>(fConeRadii.At(2))); | |
103 | TVector3& v3 = *(static_cast<TVector3*>(fConeRadii.At(3))); | |
104 | TVector3& v4 = *(static_cast<TVector3*>(fConeRadii.At(4))); | |
105 | TVector3& v5 = *(static_cast<TVector3*>(fConeRadii.At(5))); | |
106 | ||
107 | fFlangeDepth = v5.X() - v4.X(); | |
108 | fFlangeLength = fFlangeHighR - v5.Y(); | |
109 | ||
110 | fConeInnerAngle = TMath::ATan2(v4.Z()-v1.Z(), v4.X()-v1.X()); | |
111 | fConeOuterAngle = TMath::ATan2(v3.Y()-v2.Y(), v3.X()-v2.X()); | |
112 | ||
113 | Double_t hz1 = -fHoleOffset+fInnerZ+fNoseZ; | |
114 | fHoleLength = TMath::Sqrt(TMath::Power(v4.Z()-ConeR(hz1),2) + | |
115 | TMath::Power(v4.X()-fHoleOffset,2)); | |
4347b38f | 116 | } |
117 | ||
ba224443 | 118 | //____________________________________________________________________ |
1a1fdef7 | 119 | Double_t |
120 | AliFMD3::ConeR(Double_t z, Option_t* opt) const | |
ba224443 | 121 | { |
1a1fdef7 | 122 | // Calculate the cone radius at Z |
ed82d35e | 123 | // TVector3& v0 = *(static_cast<TVector3*>(fConeRadii.At(0))); |
124 | TVector3& v1 = *(static_cast<TVector3*>(fConeRadii.At(1))); | |
125 | TVector3& v2 = *(static_cast<TVector3*>(fConeRadii.At(2))); | |
126 | TVector3& v3 = *(static_cast<TVector3*>(fConeRadii.At(3))); | |
127 | TVector3& v4 = *(static_cast<TVector3*>(fConeRadii.At(4))); | |
128 | TVector3& v5 = *(static_cast<TVector3*>(fConeRadii.At(5))); | |
129 | ||
130 | if (z > fInnerZ + fNoseZ) { | |
131 | AliWarning(Form("z=%lf is before start of cone %lf", z, fInnerZ + fNoseZ)); | |
1a1fdef7 | 132 | return -1; |
ba224443 | 133 | } |
ed82d35e | 134 | if (z < fInnerZ + fNoseZ - v5.Z()) { |
088f8e79 | 135 | AliWarning(Form("z=%lf is after end of cone %lf", z, |
ed82d35e | 136 | fInnerZ + fNoseZ - v5.Z())); |
1a1fdef7 | 137 | return -1; |
138 | } | |
ed82d35e | 139 | Double_t rz = -(z-fInnerZ-fNoseZ); |
d98fbfa5 | 140 | Bool_t inner = opt[0] == 'I' || opt[1] == 'i'; |
ed82d35e | 141 | if (inner && rz <= v2.X()) return v2.Y(); |
142 | if (!inner && rz <= v1.X()) return v1.Z(); | |
143 | if (inner && rz > v3.X()) return v3.Y(); | |
144 | if (!inner && rz > v4.X()) return v4.Z(); | |
145 | ||
146 | rz -= (inner ? v2.X() : v1.X()); | |
147 | Double_t sr = (inner ? v2.Y() : v1.Z()); | |
148 | Double_t ang = (inner ? fConeInnerAngle : fConeOuterAngle); | |
149 | return sr + rz * TMath::Tan(ang); | |
ba224443 | 150 | } |
151 | ||
4347b38f | 152 | |
153 | //____________________________________________________________________ | |
154 | // | |
155 | // EOF | |
156 | // |