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

// $Id$

/// \ingroup geometry
/// \class AliMUONGeometryBuilder
/// \brief Manager class for geometry construction via geometry builders.
///
/// \author Ivana Hrivnacova, IPN Orsay

#ifndef ALI_MUON_GEOMETRY_BUILDER_H
#define ALI_MUON_GEOMETRY_BUILDER_H

#include "AliMUONGeometry.h"

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

class TObjArray;

class AliModule;
class AliMUONVGeometryBuilder;

class AliMUONGeometryBuilder : public TObject 
{
  public:
    AliMUONGeometryBuilder(AliModule* detector);
    AliMUONGeometryBuilder();
    virtual  ~AliMUONGeometryBuilder();
    
    // static methods
    static TGeoHMatrix Multiply(const TGeoMatrix& m1, const TGeoMatrix& m2); 
    static TGeoHMatrix Multiply(const TGeoMatrix& m1, const TGeoMatrix& m2,
                                const TGeoMatrix& m3); 
    static TGeoHMatrix Multiply(const TGeoMatrix& m1, const TGeoMatrix& m2,
                                const TGeoMatrix& m3, const TGeoMatrix& m4); 

    // methods
    //
    void  AddBuilder(AliMUONVGeometryBuilder* geomBuilder);
    void  CreateGeometry();
    void  CreateMaterials();

    void  InitGeometry();
    void  InitGeometry(const TString& svmapFileName);
    void  UpdateInternalGeometry();

    void  WriteSVMaps();
    void  WriteSVMaps(const TString& fileName, 
                      Bool_t rebuild = true, Bool_t writeEnvelopes = true);
    
    // Geometry parametrisation
    const AliMUONGeometry*            GetGeometry() const;
    const AliMUONGeometryTransformer* GetTransformer() const;

    // Alignement
    virtual Bool_t  GetAlign() const;
    virtual void    SetAlign(Bool_t align = true);
    virtual void    SetAlign(const TString& fileName, Bool_t align = true);
 
  protected:
    /// Not implemented
    AliMUONGeometryBuilder(const AliMUONGeometryBuilder& right);
    /// Not implemented
    AliMUONGeometryBuilder&  operator = (const AliMUONGeometryBuilder& right);
 
  private:
    // static methods
    static const TString& GetDefaultTransformFileName();    
    static const TString& GetDefaultSVMapFileName();    
    static const TString& GetOutFileNameExtension();        

    // method
    void PlaceVolume(const TString& name, const TString& mName, Int_t copyNo, 
             const TGeoHMatrix& matrix, Int_t npar, Double_t* param,
	     const char* only, Bool_t makeAssembly = false) const;
    void CreateGeometryWithTGeo();
    void CreateGeometryWithoutTGeo();
    void SetAlignToBuilder(AliMUONVGeometryBuilder* builder) const;	     

    // data members
    AliModule*       fModule;              ///< the AliRoot module
    Bool_t           fAlign;               ///< \brief option to read transformations 
                                           /// from a file
    TString          fTransformFileName;   ///< transformations file name					   
    TString          fSVMapFileName;       ///< svmaps file name					   
    TGeoCombiTrans   fGlobalTransformation;///< \brief global transformation 
                                           /// applied to the whole geometry 
    TObjArray*       fGeometryBuilders;    ///< list of Geometry Builders
    AliMUONGeometry* fGeometry;            ///< geometry parametrisation

  ClassDef(AliMUONGeometryBuilder,6)  // Geometry builder
};

// inline functions

/// Initialize geometry
inline void  AliMUONGeometryBuilder::InitGeometry()
{ InitGeometry(fSVMapFileName); }

/// Write sensitive volume maps
inline void  AliMUONGeometryBuilder::WriteSVMaps()
{ WriteSVMaps(fSVMapFileName + GetOutFileNameExtension()); }

/// Return geometry parametrisation
inline 
const AliMUONGeometry* AliMUONGeometryBuilder::GetGeometry() const
{ return fGeometry; }

/// Return geometry transformer
inline 
const AliMUONGeometryTransformer* AliMUONGeometryBuilder::GetTransformer() const
{ return fGeometry->GetTransformer(); }

/// Return option for reading transformations from a file
inline Bool_t  AliMUONGeometryBuilder::GetAlign() const
{ return fAlign; }

#endif //ALI_MUON_GEOMETRY_BUILDER_H







 AliMUONGeometryBuilder.h:1
 AliMUONGeometryBuilder.h:2
 AliMUONGeometryBuilder.h:3
 AliMUONGeometryBuilder.h:4
 AliMUONGeometryBuilder.h:5
 AliMUONGeometryBuilder.h:6
 AliMUONGeometryBuilder.h:7
 AliMUONGeometryBuilder.h:8
 AliMUONGeometryBuilder.h:9
 AliMUONGeometryBuilder.h:10
 AliMUONGeometryBuilder.h:11
 AliMUONGeometryBuilder.h:12
 AliMUONGeometryBuilder.h:13
 AliMUONGeometryBuilder.h:14
 AliMUONGeometryBuilder.h:15
 AliMUONGeometryBuilder.h:16
 AliMUONGeometryBuilder.h:17
 AliMUONGeometryBuilder.h:18
 AliMUONGeometryBuilder.h:19
 AliMUONGeometryBuilder.h:20
 AliMUONGeometryBuilder.h:21
 AliMUONGeometryBuilder.h:22
 AliMUONGeometryBuilder.h:23
 AliMUONGeometryBuilder.h:24
 AliMUONGeometryBuilder.h:25
 AliMUONGeometryBuilder.h:26
 AliMUONGeometryBuilder.h:27
 AliMUONGeometryBuilder.h:28
 AliMUONGeometryBuilder.h:29
 AliMUONGeometryBuilder.h:30
 AliMUONGeometryBuilder.h:31
 AliMUONGeometryBuilder.h:32
 AliMUONGeometryBuilder.h:33
 AliMUONGeometryBuilder.h:34
 AliMUONGeometryBuilder.h:35
 AliMUONGeometryBuilder.h:36
 AliMUONGeometryBuilder.h:37
 AliMUONGeometryBuilder.h:38
 AliMUONGeometryBuilder.h:39
 AliMUONGeometryBuilder.h:40
 AliMUONGeometryBuilder.h:41
 AliMUONGeometryBuilder.h:42
 AliMUONGeometryBuilder.h:43
 AliMUONGeometryBuilder.h:44
 AliMUONGeometryBuilder.h:45
 AliMUONGeometryBuilder.h:46
 AliMUONGeometryBuilder.h:47
 AliMUONGeometryBuilder.h:48
 AliMUONGeometryBuilder.h:49
 AliMUONGeometryBuilder.h:50
 AliMUONGeometryBuilder.h:51
 AliMUONGeometryBuilder.h:52
 AliMUONGeometryBuilder.h:53
 AliMUONGeometryBuilder.h:54
 AliMUONGeometryBuilder.h:55
 AliMUONGeometryBuilder.h:56
 AliMUONGeometryBuilder.h:57
 AliMUONGeometryBuilder.h:58
 AliMUONGeometryBuilder.h:59
 AliMUONGeometryBuilder.h:60
 AliMUONGeometryBuilder.h:61
 AliMUONGeometryBuilder.h:62
 AliMUONGeometryBuilder.h:63
 AliMUONGeometryBuilder.h:64
 AliMUONGeometryBuilder.h:65
 AliMUONGeometryBuilder.h:66
 AliMUONGeometryBuilder.h:67
 AliMUONGeometryBuilder.h:68
 AliMUONGeometryBuilder.h:69
 AliMUONGeometryBuilder.h:70
 AliMUONGeometryBuilder.h:71
 AliMUONGeometryBuilder.h:72
 AliMUONGeometryBuilder.h:73
 AliMUONGeometryBuilder.h:74
 AliMUONGeometryBuilder.h:75
 AliMUONGeometryBuilder.h:76
 AliMUONGeometryBuilder.h:77
 AliMUONGeometryBuilder.h:78
 AliMUONGeometryBuilder.h:79
 AliMUONGeometryBuilder.h:80
 AliMUONGeometryBuilder.h:81
 AliMUONGeometryBuilder.h:82
 AliMUONGeometryBuilder.h:83
 AliMUONGeometryBuilder.h:84
 AliMUONGeometryBuilder.h:85
 AliMUONGeometryBuilder.h:86
 AliMUONGeometryBuilder.h:87
 AliMUONGeometryBuilder.h:88
 AliMUONGeometryBuilder.h:89
 AliMUONGeometryBuilder.h:90
 AliMUONGeometryBuilder.h:91
 AliMUONGeometryBuilder.h:92
 AliMUONGeometryBuilder.h:93
 AliMUONGeometryBuilder.h:94
 AliMUONGeometryBuilder.h:95
 AliMUONGeometryBuilder.h:96
 AliMUONGeometryBuilder.h:97
 AliMUONGeometryBuilder.h:98
 AliMUONGeometryBuilder.h:99
 AliMUONGeometryBuilder.h:100
 AliMUONGeometryBuilder.h:101
 AliMUONGeometryBuilder.h:102
 AliMUONGeometryBuilder.h:103
 AliMUONGeometryBuilder.h:104
 AliMUONGeometryBuilder.h:105
 AliMUONGeometryBuilder.h:106
 AliMUONGeometryBuilder.h:107
 AliMUONGeometryBuilder.h:108
 AliMUONGeometryBuilder.h:109
 AliMUONGeometryBuilder.h:110
 AliMUONGeometryBuilder.h:111
 AliMUONGeometryBuilder.h:112
 AliMUONGeometryBuilder.h:113
 AliMUONGeometryBuilder.h:114
 AliMUONGeometryBuilder.h:115
 AliMUONGeometryBuilder.h:116
 AliMUONGeometryBuilder.h:117
 AliMUONGeometryBuilder.h:118
 AliMUONGeometryBuilder.h:119
 AliMUONGeometryBuilder.h:120
 AliMUONGeometryBuilder.h:121
 AliMUONGeometryBuilder.h:122
 AliMUONGeometryBuilder.h:123
 AliMUONGeometryBuilder.h:124
 AliMUONGeometryBuilder.h:125
 AliMUONGeometryBuilder.h:126
 AliMUONGeometryBuilder.h:127