ROOT logo
/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 * See cxx source for full Copyright notice                               */

// $Id$

/// \ingroup geometry
/// \class AliMUONGeometryTransformer
/// \brief Top container class for geometry transformations
///
/// Geometry transformations can be filled in these ways:
/// - by geometry builder when geometry is built via builders
///   (this way is used when running simulation and building geometry
///    via VirtualMC)
/// - from Root geometry file (*.root) or ASCII file (*.dat) using
///   the method LoadGeometryData(const TString& fileName)
/// - from geometry loaded in AliGeomManager using
///   the method LoadGeometryData() without arguments
/// 
/// \author Ivana Hrivnacova, IPN Orsay

#ifndef ALI_MUON_GEOMETRY_TRANSFORMER_H
#define ALI_MUON_GEOMETRY_TRANSFORMER_H

#include <TObject.h>
#include <TObjArray.h>
#include <TGeoMatrix.h>

class AliMUONGeometryModuleTransformer;
class AliMUONGeometryDetElement;

class TGeoManager;
class TClonesArray;
class AliMpExMap;
class AliMpArea;

using std::ifstream;
using std::ofstream;

class AliMUONGeometryTransformer : public TObject
{
  public:
    AliMUONGeometryTransformer();
    AliMUONGeometryTransformer(TRootIOCtor* /*ioCtor*/);
    virtual  ~AliMUONGeometryTransformer();
    
    // methods
    void  AddModuleTransformer(AliMUONGeometryModuleTransformer* transformer);
    void  AddMisAlignModule(Int_t moduleId, const TGeoHMatrix& matrix, Bool_t bGlobal = kTRUE);
    void  AddMisAlignDetElement(Int_t detElemId, const TGeoHMatrix& matrix, Bool_t bGlobal = kTRUE);
    void  CreateModules();

    void  AddAlignableVolumes() const; 
    TClonesArray* CreateZeroAlignmentData() const;
    void  ClearMisAlignmentData();	

    // IO
    //
    Bool_t  LoadTransformations(); 
    Bool_t  LoadGeometryData(const TString& fileName);
    Bool_t  LoadGeometryData();

    Bool_t  WriteTransformations(const TString& fileName) const;
    Bool_t  WriteMisAlignmentData(const TString& fileName) const;

    // Transformation methods 
    //
    void Global2Local(Int_t detElemId,
                 Float_t xg, Float_t yg, Float_t zg, 
                 Float_t& xl, Float_t& yl, Float_t& zl) const;
    void Global2Local(Int_t detElemId,
                 Double_t xg, Double_t yg, Double_t zg, 
                 Double_t& xl, Double_t& yl, Double_t& zl) const;

    void Local2Global(Int_t detElemId,
                 Float_t xl, Float_t yl, Float_t zl, 
                 Float_t& xg, Float_t& yg, Float_t& zg) const;
    void Local2Global(Int_t detElemId,
                 Double_t xl, Double_t yl, Double_t zl, 
                 Double_t& xg, Double_t& yg, Double_t& zg) const;
                 
    // Set methods
    void SetDetName(const TString& detName);                 
    void SetOwner(Bool_t isOwner);                 

    // Get methods
    //
    Int_t GetNofModuleTransformers() const;
    const AliMUONGeometryModuleTransformer* GetModuleTransformer(
                               Int_t index, Bool_t warn = true) const;

    const AliMUONGeometryModuleTransformer* GetModuleTransformerByDEId(
                               Int_t detElemId, Bool_t warn = true) const;

    const AliMUONGeometryDetElement* GetDetElement(
                               Int_t detElemId, Bool_t warn = true) const;

    const TClonesArray* GetMisAlignmentData() const;
    
    Bool_t  HasDE(Int_t detElemId) const;

    AliMpArea* GetDEArea(Int_t detElemId) const;
    
  protected:
    /// Not implemented
    AliMUONGeometryTransformer(const AliMUONGeometryTransformer& right);
    /// Not implemented
    AliMUONGeometryTransformer&  operator = (const AliMUONGeometryTransformer& right);
 
  private:
    // static methods
    static const TString&  GetDefaultDetectorName(); 

    // methods
      
    void CreateDEAreas() const;
    
    Bool_t LoadMapping() const;
    AliMUONGeometryModuleTransformer* GetModuleTransformerNonConst(
                                    Int_t index, Bool_t warn = true) const;

    TGeoHMatrix GetTransform(
                  Double_t x, Double_t y, Double_t z,
		  Double_t a1, Double_t a2, Double_t a3, 
 		  Double_t a4, Double_t a5, Double_t a6) const;

    void FillModuleTransform(Int_t moduleId,
                  Double_t x, Double_t y, Double_t z,
		  Double_t a1, Double_t a2, Double_t a3, 
 		  Double_t a4, Double_t a5, Double_t a6); 
    void FillDetElemTransform(Int_t id, 
                  Double_t x, Double_t y, Double_t z,
		  Double_t a1, Double_t a2, Double_t a3, 
 		  Double_t a4, Double_t a5, Double_t a6);

    TString ReadModuleTransforms(ifstream& in);
    TString ReadDetElemTransforms(ifstream& in);
    Bool_t  ReadTransformations(const TString& fileName);

    void    WriteTransform(ofstream& out, const TGeoMatrix* transform) const;
    void    WriteModuleTransforms(ofstream& out) const;
    void    WriteDetElemTransforms(ofstream& out) const;
    
    TString GetModuleSymName(Int_t moduleId) const;
    TString GetDESymName(Int_t detElemId) const;

    // data members
    TString        fDetectorName;       ///< Detector name
    TObjArray*     fModuleTransformers; ///< array of module transformers
    TClonesArray*  fMisAlignArray;      ///< array of misalignment data
    mutable AliMpExMap*    fDEAreas; ///< areas of detection elements in global coordinates
    
  ClassDef(AliMUONGeometryTransformer,4)  // Geometry parametrisation
};

// inline methods

/// Return the number of contained module transformers
inline Int_t AliMUONGeometryTransformer::GetNofModuleTransformers() const
{ return fModuleTransformers->GetEntriesFast(); }

/// Return the array of misalignment data
inline const TClonesArray* AliMUONGeometryTransformer::GetMisAlignmentData() const	
{ return fMisAlignArray; }		       
			       
/// Set detector name
inline void AliMUONGeometryTransformer::SetDetName(const TString& detName)
{  fDetectorName = detName; }               

/// Set ownership of array module transformers
inline void AliMUONGeometryTransformer::SetOwner(Bool_t isOwner)
{  fModuleTransformers->SetOwner(isOwner); }               

#endif //ALI_MUON_GEOMETRY_TRANSFORMER_H







 AliMUONGeometryTransformer.h:1
 AliMUONGeometryTransformer.h:2
 AliMUONGeometryTransformer.h:3
 AliMUONGeometryTransformer.h:4
 AliMUONGeometryTransformer.h:5
 AliMUONGeometryTransformer.h:6
 AliMUONGeometryTransformer.h:7
 AliMUONGeometryTransformer.h:8
 AliMUONGeometryTransformer.h:9
 AliMUONGeometryTransformer.h:10
 AliMUONGeometryTransformer.h:11
 AliMUONGeometryTransformer.h:12
 AliMUONGeometryTransformer.h:13
 AliMUONGeometryTransformer.h:14
 AliMUONGeometryTransformer.h:15
 AliMUONGeometryTransformer.h:16
 AliMUONGeometryTransformer.h:17
 AliMUONGeometryTransformer.h:18
 AliMUONGeometryTransformer.h:19
 AliMUONGeometryTransformer.h:20
 AliMUONGeometryTransformer.h:21
 AliMUONGeometryTransformer.h:22
 AliMUONGeometryTransformer.h:23
 AliMUONGeometryTransformer.h:24
 AliMUONGeometryTransformer.h:25
 AliMUONGeometryTransformer.h:26
 AliMUONGeometryTransformer.h:27
 AliMUONGeometryTransformer.h:28
 AliMUONGeometryTransformer.h:29
 AliMUONGeometryTransformer.h:30
 AliMUONGeometryTransformer.h:31
 AliMUONGeometryTransformer.h:32
 AliMUONGeometryTransformer.h:33
 AliMUONGeometryTransformer.h:34
 AliMUONGeometryTransformer.h:35
 AliMUONGeometryTransformer.h:36
 AliMUONGeometryTransformer.h:37
 AliMUONGeometryTransformer.h:38
 AliMUONGeometryTransformer.h:39
 AliMUONGeometryTransformer.h:40
 AliMUONGeometryTransformer.h:41
 AliMUONGeometryTransformer.h:42
 AliMUONGeometryTransformer.h:43
 AliMUONGeometryTransformer.h:44
 AliMUONGeometryTransformer.h:45
 AliMUONGeometryTransformer.h:46
 AliMUONGeometryTransformer.h:47
 AliMUONGeometryTransformer.h:48
 AliMUONGeometryTransformer.h:49
 AliMUONGeometryTransformer.h:50
 AliMUONGeometryTransformer.h:51
 AliMUONGeometryTransformer.h:52
 AliMUONGeometryTransformer.h:53
 AliMUONGeometryTransformer.h:54
 AliMUONGeometryTransformer.h:55
 AliMUONGeometryTransformer.h:56
 AliMUONGeometryTransformer.h:57
 AliMUONGeometryTransformer.h:58
 AliMUONGeometryTransformer.h:59
 AliMUONGeometryTransformer.h:60
 AliMUONGeometryTransformer.h:61
 AliMUONGeometryTransformer.h:62
 AliMUONGeometryTransformer.h:63
 AliMUONGeometryTransformer.h:64
 AliMUONGeometryTransformer.h:65
 AliMUONGeometryTransformer.h:66
 AliMUONGeometryTransformer.h:67
 AliMUONGeometryTransformer.h:68
 AliMUONGeometryTransformer.h:69
 AliMUONGeometryTransformer.h:70
 AliMUONGeometryTransformer.h:71
 AliMUONGeometryTransformer.h:72
 AliMUONGeometryTransformer.h:73
 AliMUONGeometryTransformer.h:74
 AliMUONGeometryTransformer.h:75
 AliMUONGeometryTransformer.h:76
 AliMUONGeometryTransformer.h:77
 AliMUONGeometryTransformer.h:78
 AliMUONGeometryTransformer.h:79
 AliMUONGeometryTransformer.h:80
 AliMUONGeometryTransformer.h:81
 AliMUONGeometryTransformer.h:82
 AliMUONGeometryTransformer.h:83
 AliMUONGeometryTransformer.h:84
 AliMUONGeometryTransformer.h:85
 AliMUONGeometryTransformer.h:86
 AliMUONGeometryTransformer.h:87
 AliMUONGeometryTransformer.h:88
 AliMUONGeometryTransformer.h:89
 AliMUONGeometryTransformer.h:90
 AliMUONGeometryTransformer.h:91
 AliMUONGeometryTransformer.h:92
 AliMUONGeometryTransformer.h:93
 AliMUONGeometryTransformer.h:94
 AliMUONGeometryTransformer.h:95
 AliMUONGeometryTransformer.h:96
 AliMUONGeometryTransformer.h:97
 AliMUONGeometryTransformer.h:98
 AliMUONGeometryTransformer.h:99
 AliMUONGeometryTransformer.h:100
 AliMUONGeometryTransformer.h:101
 AliMUONGeometryTransformer.h:102
 AliMUONGeometryTransformer.h:103
 AliMUONGeometryTransformer.h:104
 AliMUONGeometryTransformer.h:105
 AliMUONGeometryTransformer.h:106
 AliMUONGeometryTransformer.h:107
 AliMUONGeometryTransformer.h:108
 AliMUONGeometryTransformer.h:109
 AliMUONGeometryTransformer.h:110
 AliMUONGeometryTransformer.h:111
 AliMUONGeometryTransformer.h:112
 AliMUONGeometryTransformer.h:113
 AliMUONGeometryTransformer.h:114
 AliMUONGeometryTransformer.h:115
 AliMUONGeometryTransformer.h:116
 AliMUONGeometryTransformer.h:117
 AliMUONGeometryTransformer.h:118
 AliMUONGeometryTransformer.h:119
 AliMUONGeometryTransformer.h:120
 AliMUONGeometryTransformer.h:121
 AliMUONGeometryTransformer.h:122
 AliMUONGeometryTransformer.h:123
 AliMUONGeometryTransformer.h:124
 AliMUONGeometryTransformer.h:125
 AliMUONGeometryTransformer.h:126
 AliMUONGeometryTransformer.h:127
 AliMUONGeometryTransformer.h:128
 AliMUONGeometryTransformer.h:129
 AliMUONGeometryTransformer.h:130
 AliMUONGeometryTransformer.h:131
 AliMUONGeometryTransformer.h:132
 AliMUONGeometryTransformer.h:133
 AliMUONGeometryTransformer.h:134
 AliMUONGeometryTransformer.h:135
 AliMUONGeometryTransformer.h:136
 AliMUONGeometryTransformer.h:137
 AliMUONGeometryTransformer.h:138
 AliMUONGeometryTransformer.h:139
 AliMUONGeometryTransformer.h:140
 AliMUONGeometryTransformer.h:141
 AliMUONGeometryTransformer.h:142
 AliMUONGeometryTransformer.h:143
 AliMUONGeometryTransformer.h:144
 AliMUONGeometryTransformer.h:145
 AliMUONGeometryTransformer.h:146
 AliMUONGeometryTransformer.h:147
 AliMUONGeometryTransformer.h:148
 AliMUONGeometryTransformer.h:149
 AliMUONGeometryTransformer.h:150
 AliMUONGeometryTransformer.h:151
 AliMUONGeometryTransformer.h:152
 AliMUONGeometryTransformer.h:153
 AliMUONGeometryTransformer.h:154
 AliMUONGeometryTransformer.h:155
 AliMUONGeometryTransformer.h:156
 AliMUONGeometryTransformer.h:157
 AliMUONGeometryTransformer.h:158
 AliMUONGeometryTransformer.h:159
 AliMUONGeometryTransformer.h:160
 AliMUONGeometryTransformer.h:161
 AliMUONGeometryTransformer.h:162
 AliMUONGeometryTransformer.h:163
 AliMUONGeometryTransformer.h:164
 AliMUONGeometryTransformer.h:165
 AliMUONGeometryTransformer.h:166
 AliMUONGeometryTransformer.h:167
 AliMUONGeometryTransformer.h:168
 AliMUONGeometryTransformer.h:169
 AliMUONGeometryTransformer.h:170
 AliMUONGeometryTransformer.h:171
 AliMUONGeometryTransformer.h:172
 AliMUONGeometryTransformer.h:173
 AliMUONGeometryTransformer.h:174
 AliMUONGeometryTransformer.h:175
 AliMUONGeometryTransformer.h:176
 AliMUONGeometryTransformer.h:177
 AliMUONGeometryTransformer.h:178
 AliMUONGeometryTransformer.h:179
 AliMUONGeometryTransformer.h:180