]> git.uio.no Git - u/mrichter/AliRoot.git/blob - FMD/AliFMD3.cxx
method AddAlignableVolumes added
[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 #include "AliFMD3.h"            // ALIFMD3_H 
33 #include "AliLog.h"             // ALILOG_H
34 #include "AliFMDRing.h"         // ALIFMDRING_H 
35 // #include <TMath.h>           // ROOT_TMath
36
37 //====================================================================
38 ClassImp(AliFMD3)
39 #if 0
40   ; // This is here to keep Emacs for indenting the next line
41 #endif
42
43 //____________________________________________________________________
44 AliFMD3::AliFMD3(AliFMDRing* inner, AliFMDRing* outer) 
45   : AliFMDDetector(3, inner, outer),
46     fNoseZ(0),
47     fNoseLowR(0),
48     fNoseHighR(0),
49     fNoseLength(0),
50     fBackLowR(0),
51     fBackHighR(0),
52     fBackLength(0),
53     fBeamThickness(0),
54     fBeamWidth(0),
55     fConeLength(0),
56     fFlangeR(0),
57     fZ(0),
58     fAlpha(0), 
59     fNBeam(0), 
60     fNFlange(0)
61 {
62   // Constructor. 
63   SetInnerZ(-62.8);
64   SetOuterZ(-75.2);
65   SetNoseZ();
66   SetNoseLowR();
67   SetNoseHighR();
68   SetNoseLength();
69   SetBackLowR();
70   SetBackHighR();
71   SetBackLength();
72   SetBeamThickness();
73   SetBeamWidth();
74   SetConeLength();
75   SetFlangeR();
76   SetNBeam();
77   SetNFlange();
78 }
79
80 //____________________________________________________________________
81 void
82 AliFMD3::Init() 
83 {
84   // Initialize 
85   AliFMDDetector::Init();
86   SetInnerHoneyHighR(GetOuterHoneyHighR());
87   Double_t zdist   = fConeLength - fBackLength - fNoseLength;
88   Double_t tdist   = fBackHighR - fNoseHighR;
89   Double_t innerZh = fInnerZ - fInner->GetRingDepth() - fHoneycombThickness;
90   Double_t outerZh = fOuterZ - fOuter->GetRingDepth() - fHoneycombThickness;
91   Double_t minZ    = TMath::Min(fNoseZ - fConeLength, outerZh);
92   fAlpha           = tdist / zdist;
93   fZ               = fNoseZ + (minZ - fNoseZ) / 2;
94   fInnerHoneyHighR = ConeR(innerZh + fHoneycombThickness,"O") - 1;
95   fOuterHoneyHighR = GetBackLowR();
96 }
97
98 //____________________________________________________________________
99 Double_t
100 AliFMD3::ConeR(Double_t z, Option_t* opt) const
101 {
102   // Calculate the cone radius at Z
103   if (fAlpha < 0) {
104     AliWarning(Form("alpha not set: %lf", fAlpha));
105     return -1;
106   }
107   if (z > fNoseZ) {
108     AliWarning(Form("z=%lf is before start of cone %lf", z, fNoseZ));
109     return -1;
110   }
111   if (z < fOuterZ - fOuter->GetRingDepth() - fHoneycombThickness) {
112     AliWarning(Form("z=%lf is after end of cone %lf", z, 
113                     fOuterZ - fOuter->GetRingDepth() - fHoneycombThickness));
114     return -1;
115   }
116   Double_t e = fBeamThickness / TMath::Cos(TMath::ATan(fAlpha));
117   if (opt[0] == 'I' || opt[1] == 'i') e *= -1;
118   if (z > fNoseZ - fNoseLength) return fNoseHighR + e;
119   if (z < fNoseZ - fConeLength + fBackLength) return fBackHighR + e;
120   Double_t r = fNoseHighR + fAlpha * TMath::Abs(z - fNoseZ + fNoseLength) + e;
121   return r;
122 }
123
124
125 //____________________________________________________________________
126 //
127 // EOF
128 //