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

// $Id$
// Revision of includes 07/05/2004

/// \ingroup geometry
/// \class AliMUONVGeometryBuilder
/// \brief Abstract base class for geometry construction per module(s)
///
/// \author Ivana Hrivnacova, IPN Orsay

#ifndef ALI_MUONV_GEOMETRY_BUILDER_H
#define ALI_MUONV_GEOMETRY_BUILDER_H

#include <fstream>

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

class TGeoTranslation;
class TGeoRotation;
class TGeoCombiTrans;

class AliMUONGeometryModule;
class AliMUONGeometryEnvelopeStore;
class AliMUONStringIntMap;

class AliMUONVGeometryBuilder : public TObject
{
  public:
    AliMUONVGeometryBuilder(Int_t firstModuleId, Int_t nofModules);
    AliMUONVGeometryBuilder();
    virtual ~AliMUONVGeometryBuilder();
  
    // methods
    void  SetReferenceFrame(const TGeoCombiTrans& referenceFrame);
    void  RebuildSVMaps(Bool_t withEnvelopes = true) const;
    void  UpdateDetElements(Bool_t create) const;

                  /// Function to be overriden in a concrete chamber/station
		  /// geometry builder class.
		  /// Only materials that are not defined in the common
		  /// functions should be defined here.
    virtual void CreateMaterials() {}  // make = 0; ?

                  /// Function to be overriden in a concrete chamber/station
		  /// geometry builder class. \n
		  /// The geometry built there should not be placed
		  /// in ALIC; but all volumes going to ALIC
		  /// have to be added as envelopes to the chamber
		  /// geometries
		  /// (They will be then placed automatically 
		  /// usind the provided transformation.
    virtual void CreateGeometry() = 0;

                  /// Function to be overriden in a concrete chamber/station
		  /// geometry class. \n
		  /// The volume name for each geometry module, its virtuality
                  /// and eventually the mother volume name should be defined
    virtual void SetVolumes() = 0;

                  /// Function to be overriden in a concrete chamber/station
		  /// geometry class. \n
		  /// The transformation of each chamber(s) wrt ALICE
		  /// should be defined and set to its geometry class. 
    virtual void SetTransformations() = 0;

                  /// Function to be overriden in a concrete chamber/station
		  /// geometry class. \n
		  /// The sensitive volumes Ids for each chamber
		  /// should be defined and set to its geometry class. 
    virtual void SetSensitiveVolumes() = 0;

                  /// Function to be overriden (and return false) 
		  /// in the concrete geometry builder classes 
		  /// which are already defined in the new ALICE
		  /// coordinate frame
    virtual bool ApplyGlobalTransformation() { return true; }

    // access to module geometries
    Int_t  NofGeometries() const;
    AliMUONGeometryModule* Geometry(Int_t i) const;
                  // In difference from protected GetGeometry()
		  // this function access geometry via index and not
		  // via moduleId

  protected:
    // methods
    AliMUONGeometryModule*         GetGeometry(Int_t moduleId) const;
    AliMUONGeometryEnvelopeStore*  GetEnvelopes(Int_t moduleId) const;
    AliMUONStringIntMap*           GetSVMap(Int_t moduleId) const;
    Int_t                          GetModuleId(const TString& envName) const;
    
    // set module transformation
    void SetTranslation(Int_t moduleId, 
                        const TGeoTranslation& translation);
    void SetTransformation(Int_t moduleId, 
                        const TGeoTranslation& translation,
			const TGeoRotation& rotation);
			
    // set volumes 
    void SetVolume(Int_t moduleId, const TString& volumeName, 
                   Bool_t isVirtual = false);			
    void SetMotherVolume(Int_t moduleId, const TString& volumeName);			
    
  private:
    //methods
    
    /// Not implemented
    AliMUONVGeometryBuilder(const AliMUONVGeometryBuilder& rhs);
    /// Not implemented
    AliMUONVGeometryBuilder& operator = (const AliMUONVGeometryBuilder& rhs);

    TGeoHMatrix ConvertTransform(const TGeoHMatrix& transform) const;
    TGeoHMatrix ConvertDETransform(const TGeoHMatrix& transform) const;
    TString     ComposePath(const TString& volName, Int_t copyNo) const; 
    void        MapSV(const TString& path0, 
                      const TString& volName, Int_t detElemId) const;

    // data members
    TObjArray*  fGeometryModules;   ///< \brief the modules geometries that will be built
                                    /// by this builder				    
    TGeoCombiTrans fReferenceFrame; ///< \brief the transformation from the builder 
                                    /// reference frame to that of the transform 
				    /// data files
				        
  ClassDef(AliMUONVGeometryBuilder,4) // MUON chamber geometry base class
};

// inline functions

/// Return the number of geometry modules
inline Int_t  AliMUONVGeometryBuilder::NofGeometries() const
{ return fGeometryModules->GetEntriesFast(); }

/// Return the \a i th geometry module
inline AliMUONGeometryModule* AliMUONVGeometryBuilder::Geometry(Int_t i) const
{ return (AliMUONGeometryModule*)fGeometryModules->At(i); }

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