Line data Source code
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 70 : 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 0 : { return fModuleTransformers->GetEntriesFast(); }
160 :
161 : /// Return the array of misalignment data
162 : inline const TClonesArray* AliMUONGeometryTransformer::GetMisAlignmentData() const
163 0 : { return fMisAlignArray; }
164 :
165 : /// Set detector name
166 : inline void AliMUONGeometryTransformer::SetDetName(const TString& detName)
167 0 : { fDetectorName = detName; }
168 :
169 : /// Set ownership of array module transformers
170 : inline void AliMUONGeometryTransformer::SetOwner(Bool_t isOwner)
171 1 : { fModuleTransformers->SetOwner(isOwner); }
172 :
173 : #endif //ALI_MUON_GEOMETRY_TRANSFORMER_H
174 :
175 :
176 :
177 :
178 :
179 :
180 :
|