]>
Commit | Line | Data |
---|---|---|
1 | /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * | |
2 | * See cxx source for full Copyright notice */ | |
3 | ||
4 | // $Id$ | |
5 | ||
6 | /// \ingroup geometry | |
7 | /// \class AliMUONGeometryTransformer | |
8 | /// \brief Top container class for geometry transformations | |
9 | /// | |
10 | /// Geometry transformations can be filled in these ways: | |
11 | /// - by geometry builder when geometry is built via builders | |
12 | /// (this way is used when running simulation and building geometry | |
13 | /// via VirtualMC) | |
14 | /// - from Root geometry file (*.root) or ASCII file (*.dat) using | |
15 | /// the method LoadGeometryData(const TString& fileName) | |
16 | /// - from geometry loaded in AliGeomManager using | |
17 | /// the method LoadGeometryData() without arguments | |
18 | /// | |
19 | /// \author Ivana Hrivnacova, IPN Orsay | |
20 | ||
21 | #ifndef ALI_MUON_GEOMETRY_TRANSFORMER_H | |
22 | #define ALI_MUON_GEOMETRY_TRANSFORMER_H | |
23 | ||
24 | #include <TObject.h> | |
25 | #include <TObjArray.h> | |
26 | #include <TGeoMatrix.h> | |
27 | ||
28 | class AliMUONGeometryModuleTransformer; | |
29 | class AliMUONGeometryDetElement; | |
30 | ||
31 | class TGeoManager; | |
32 | class TClonesArray; | |
33 | class AliMpExMap; | |
34 | class AliMpArea; | |
35 | ||
36 | using std::ifstream; | |
37 | using std::ofstream; | |
38 | ||
39 | class AliMUONGeometryTransformer : public TObject | |
40 | { | |
41 | public: | |
42 | AliMUONGeometryTransformer(); | |
43 | AliMUONGeometryTransformer(TRootIOCtor* /*ioCtor*/); | |
44 | virtual ~AliMUONGeometryTransformer(); | |
45 | ||
46 | // methods | |
47 | void AddModuleTransformer(AliMUONGeometryModuleTransformer* transformer); | |
48 | void AddMisAlignModule(Int_t moduleId, const TGeoHMatrix& matrix, Bool_t bGlobal = kTRUE); | |
49 | void AddMisAlignDetElement(Int_t detElemId, const TGeoHMatrix& matrix, Bool_t bGlobal = kTRUE); | |
50 | void CreateModules(); | |
51 | ||
52 | void AddAlignableVolumes() const; | |
53 | TClonesArray* CreateZeroAlignmentData() const; | |
54 | void ClearMisAlignmentData(); | |
55 | ||
56 | // IO | |
57 | // | |
58 | Bool_t LoadTransformations(); | |
59 | Bool_t LoadGeometryData(const TString& fileName); | |
60 | Bool_t LoadGeometryData(); | |
61 | ||
62 | Bool_t WriteTransformations(const TString& fileName) const; | |
63 | Bool_t WriteMisAlignmentData(const TString& fileName) const; | |
64 | ||
65 | // Transformation methods | |
66 | // | |
67 | void Global2Local(Int_t detElemId, | |
68 | Float_t xg, Float_t yg, Float_t zg, | |
69 | Float_t& xl, Float_t& yl, Float_t& zl) const; | |
70 | void Global2Local(Int_t detElemId, | |
71 | Double_t xg, Double_t yg, Double_t zg, | |
72 | Double_t& xl, Double_t& yl, Double_t& zl) const; | |
73 | ||
74 | void Local2Global(Int_t detElemId, | |
75 | Float_t xl, Float_t yl, Float_t zl, | |
76 | Float_t& xg, Float_t& yg, Float_t& zg) const; | |
77 | void Local2Global(Int_t detElemId, | |
78 | Double_t xl, Double_t yl, Double_t zl, | |
79 | Double_t& xg, Double_t& yg, Double_t& zg) const; | |
80 | ||
81 | // Set methods | |
82 | void SetDetName(const TString& detName); | |
83 | void SetOwner(Bool_t isOwner); | |
84 | ||
85 | // Get methods | |
86 | // | |
87 | Int_t GetNofModuleTransformers() const; | |
88 | const AliMUONGeometryModuleTransformer* GetModuleTransformer( | |
89 | Int_t index, Bool_t warn = true) const; | |
90 | ||
91 | const AliMUONGeometryModuleTransformer* GetModuleTransformerByDEId( | |
92 | Int_t detElemId, Bool_t warn = true) const; | |
93 | ||
94 | const AliMUONGeometryDetElement* GetDetElement( | |
95 | Int_t detElemId, Bool_t warn = true) const; | |
96 | ||
97 | const TClonesArray* GetMisAlignmentData() const; | |
98 | ||
99 | Bool_t HasDE(Int_t detElemId) const; | |
100 | ||
101 | AliMpArea* GetDEArea(Int_t detElemId) const; | |
102 | ||
103 | protected: | |
104 | /// Not implemented | |
105 | AliMUONGeometryTransformer(const AliMUONGeometryTransformer& right); | |
106 | /// Not implemented | |
107 | AliMUONGeometryTransformer& operator = (const AliMUONGeometryTransformer& right); | |
108 | ||
109 | private: | |
110 | // static methods | |
111 | static const TString& GetDefaultDetectorName(); | |
112 | ||
113 | // methods | |
114 | ||
115 | void CreateDEAreas() const; | |
116 | ||
117 | Bool_t LoadMapping() const; | |
118 | AliMUONGeometryModuleTransformer* GetModuleTransformerNonConst( | |
119 | Int_t index, Bool_t warn = true) const; | |
120 | ||
121 | TGeoHMatrix GetTransform( | |
122 | Double_t x, Double_t y, Double_t z, | |
123 | Double_t a1, Double_t a2, Double_t a3, | |
124 | Double_t a4, Double_t a5, Double_t a6) const; | |
125 | ||
126 | void FillModuleTransform(Int_t moduleId, | |
127 | Double_t x, Double_t y, Double_t z, | |
128 | Double_t a1, Double_t a2, Double_t a3, | |
129 | Double_t a4, Double_t a5, Double_t a6); | |
130 | void FillDetElemTransform(Int_t id, | |
131 | Double_t x, Double_t y, Double_t z, | |
132 | Double_t a1, Double_t a2, Double_t a3, | |
133 | Double_t a4, Double_t a5, Double_t a6); | |
134 | ||
135 | TString ReadModuleTransforms(ifstream& in); | |
136 | TString ReadDetElemTransforms(ifstream& in); | |
137 | Bool_t ReadTransformations(const TString& fileName); | |
138 | ||
139 | void WriteTransform(ofstream& out, const TGeoMatrix* transform) const; | |
140 | void WriteModuleTransforms(ofstream& out) const; | |
141 | void WriteDetElemTransforms(ofstream& out) const; | |
142 | ||
143 | TString GetModuleSymName(Int_t moduleId) const; | |
144 | TString GetDESymName(Int_t detElemId) const; | |
145 | ||
146 | // data members | |
147 | TString fDetectorName; ///< Detector name | |
148 | TObjArray* fModuleTransformers; ///< array of module transformers | |
149 | TClonesArray* fMisAlignArray; ///< array of misalignment data | |
150 | mutable AliMpExMap* fDEAreas; ///< areas of detection elements in global coordinates | |
151 | ||
152 | ClassDef(AliMUONGeometryTransformer,4) // Geometry parametrisation | |
153 | }; | |
154 | ||
155 | // inline methods | |
156 | ||
157 | /// Return the number of contained module transformers | |
158 | inline Int_t AliMUONGeometryTransformer::GetNofModuleTransformers() const | |
159 | { return fModuleTransformers->GetEntriesFast(); } | |
160 | ||
161 | /// Return the array of misalignment data | |
162 | inline const TClonesArray* AliMUONGeometryTransformer::GetMisAlignmentData() const | |
163 | { return fMisAlignArray; } | |
164 | ||
165 | /// Set detector name | |
166 | inline void AliMUONGeometryTransformer::SetDetName(const TString& detName) | |
167 | { fDetectorName = detName; } | |
168 | ||
169 | /// Set ownership of array module transformers | |
170 | inline void AliMUONGeometryTransformer::SetOwner(Bool_t isOwner) | |
171 | { fModuleTransformers->SetOwner(isOwner); } | |
172 | ||
173 | #endif //ALI_MUON_GEOMETRY_TRANSFORMER_H | |
174 | ||
175 | ||
176 | ||
177 | ||
178 | ||
179 | ||
180 |