Update from Alberica. Addition of VZERO equalized signals and ZNC.
[u/mrichter/AliRoot.git] / MUON / AliMUONGeometryTransformer.h
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