1 /**************************************************************************
2 * Copyright(c) 2004, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
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
21 //____________________________________________________________________
23 // Concrete implementation of AliFMDDetector
25 // This implements the geometry for FMD3.
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
33 #include <TMath.h> // ROOT_TMath
35 #include "AliFMD3.h" // ALIFMD3_H
36 #include "AliFMDDebug.h" // ALIFMDDEBUG_H ALILOG_H
37 #include "AliFMDRing.h" // ALIFMDRING_H
40 //====================================================================
43 ; // This is here to keep Emacs for indenting the next line
46 //____________________________________________________________________
47 AliFMD3::AliFMD3(AliFMDRing* inner, AliFMDRing* outer)
48 : AliFMDDetector(3, inner, outer),
49 fNoseZ(16.54667), // From drawing
51 fFlangeHighR(49.25), // From drawing
53 fFlangeWidth(6), // From drawing
57 fHoleOffset(7), // From drawing
58 fHoleDepth(2), // What's needed
60 fHoleLowWidth(4), // What's needed
61 fHoleHighWidth(18), // What's needed
62 fBoltLength(1), // Guessed
63 fBoltRadius(0.15), // Estimate
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
74 SetInnerHoneyLowR(4.18207); // From drawing
75 SetInnerHoneyHighR(19.74922); // From drawing
76 SetOuterHoneyLowR(13.4776); // From drawing
77 SetOuterHoneyHighR(31.01964); // From drawing
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));
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));
94 //____________________________________________________________________
99 AliFMDDetector::Init();
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)));
107 fFlangeDepth = v5.X() - v4.X();
108 fFlangeLength = fFlangeHighR - v5.Y();
110 fConeInnerAngle = TMath::ATan2(v4.Z()-v1.Z(), v4.X()-v1.X());
111 fConeOuterAngle = TMath::ATan2(v3.Y()-v2.Y(), v3.X()-v2.X());
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));
118 //____________________________________________________________________
120 AliFMD3::ConeR(Double_t z, Option_t* opt) const
122 // Calculate the cone radius at Z
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)));
130 if (z > fInnerZ + fNoseZ) {
131 AliWarning(Form("z=%lf is before start of cone %lf", z, fInnerZ + fNoseZ));
134 if (z < fInnerZ + fNoseZ - v5.Z()) {
135 AliWarning(Form("z=%lf is after end of cone %lf", z,
136 fInnerZ + fNoseZ - v5.Z()));
139 Double_t rz = -(z-fInnerZ-fNoseZ);
140 Bool_t inner = opt[0] == 'I' || opt[1] == 'i';
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();
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);
153 //____________________________________________________________________