Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

GeoGeometry.h

Go to the documentation of this file.
00001 
00002 //
00003 // GeoGeometry
00004 //
00005 // GeoGeometry is single geometry built from ROOT's TGeoManager
00006 //
00007 // Author:  S. Kasahara 11/03
00008 //
00009 // Based on R. Hatcher's UgliGeometry/UgliGeometry class
00011 
00012 #ifndef GEOGEOMETRY_H
00013 #define GEOGEOMETRY_H
00014 
00015 #include <map>
00016 #include <vector>
00017 #include <TVector3.h>
00018 #include <TGeoManager.h>
00019 
00020 #include "GeoGeometry/Geo.h"
00021 #include "GeoGeometry/GeoRefCnt.h"   // base class
00022 #include "GeoGeometry/GeoShield.h"  
00023 #include "Validity/VldRange.h"
00024 #include "Validity/VldContext.h"
00025 #include "Plex/PlexPlaneId.h"
00026 
00027 class PlexScintMdlId;
00028 class PlexStripEndId;
00029 class UgliDbiTables;
00030 class UgliDbiGeometry;
00031 class DbiValidityRec;
00032 
00033 class TGeoManager;
00034 class TGeoNode;
00035 class TGeoVolume;
00036 class GeoStripNode;
00037 class GeoPlnNode;
00038 class GeoScintPlnNode;
00039 class GeoSteelPlnNode;
00040 class GeoScintMdlNode;
00041 class GeoScintMdlVolume;
00042 class GeoNode;
00043 class GeoMediumMap;
00044 
00045 class TGeoRotation;
00046 
00047 class GeoGeometry : public TObject, public GeoRefCnt {
00048 
00049  public:
00050 
00051   // Typedefs and enumerations
00052   typedef  std::map<PlexPlaneId,GeoPlnNode*>::iterator PlaneMapItr; 
00053   typedef  std::map<PlexPlaneId,GeoPlnNode*>::const_iterator PlaneMapConstItr; 
00054   typedef  std::map<PlexPlaneId,GeoPlnNode*>::reverse_iterator PlaneMapRevItr; 
00055   typedef  std::map<PlexPlaneId,GeoPlnNode*>::const_reverse_iterator 
00056                                                         PlaneMapConstRevItr; 
00057 
00058   // Constructors/Destructors
00059   GeoGeometry(); // def ctor
00060   GeoGeometry(const VldContext &vldc, 
00061               Geo::EAppType apptype = Geo::kRecons);  // normal ctor
00062   virtual ~GeoGeometry();
00063   virtual void UpdateGlobalManager() const { gGeoManager = fGeoManager; }
00064       
00065   // State testing methods
00066   bool IsAlgorithmic() const { return false; }
00067   bool IsFrozen() const { return true; }
00068   Geo::EAppType GetAppType() const { return fAppType; }
00069   virtual PlexPlaneId  GetPlaneIdFromZ(Double_t z) const;
00070   virtual GeoStripNode* GetStripNode(const PlexStripEndId& seid) const;
00071   virtual TVector3 GetHallExtentMin() const { return fHallMin; }
00072   virtual TVector3 GetHallExtentMax() const { return fHallMax; }
00073   virtual GeoScintPlnNode* GetScintPlnNode(PlexPlaneId planeId) const;
00074   virtual GeoSteelPlnNode* GetNearestSteelPlnNode(Double_t z) const;
00075   virtual const GeoMediumMap& GetMediumMap() const { return *fMediumMap; }
00076       
00077   static std::string GetGeoCompatibleName(std::string name);
00078 
00079   const std::vector<GeoScintPlnNode*>& GetScintPlnNodePtrVector() const;
00080   const std::vector<GeoSteelPlnNode*>& GetSteelPlnNodePtrVector() const;
00081   const std::vector<GeoPlnNode*>& GetPlnNodePtrVector() const;
00082   const std::map<Float_t,GeoSteelPlnNode*>& GetSteelPlnNodeMap() const;
00083 
00084   virtual GeoSteelPlnNode* GetSteelPlnNode(PlexPlaneId planeId) const;
00085   virtual void GetTransverseExtent(PlaneView::PlaneView_t view,
00086                                    Float_t& tmin, Float_t& tmax) const;
00087   virtual void GetTransverseExtent(PlaneView::PlaneView_t view,
00088                                    Double_t& tmin, Double_t& tmax) const;
00089   virtual void GetZExtent(Float_t& zmin, Float_t& zmax, Int_t isup = -1) 
00090                                                                    const;
00091   virtual void GetZExtent(Double_t& zmin, Double_t& zmax, Int_t isup = -1) 
00092                                                                    const;
00093   virtual const VldRange& GetVldRange() const { return fVldRange; }
00094   bool IsCompatible(const VldContext& vldc, Geo::EAppType apptype) const;
00095   TGeoMedium* GetMedium(const char* name) const;
00096   
00097   virtual void Draw(Option_t* volname="");
00098   virtual void ls(Option_t *option="") const;
00099   virtual void Print(Option_t *option="") const;  
00100   virtual void PrintHeader(Option_t *option="") const;  
00101   virtual void DumpVolume(std::string volname,std::string preface="") const;
00102   virtual void SwitchMedia(bool toswim);
00103    
00104   // methods used during build
00105   TGeoRotation* GetRot45() const { return fRot45; } 
00106   TGeoRotation* GetRot315() const { return fRot315; }
00107       
00108  private:
00109 
00110   // Private state changing methods
00111   virtual void BuildAll(const VldContext& vldc);
00112   virtual void BuildVldRange(const VldContext& vldc);
00113   virtual void TrimVldRange(const char* tblName="",
00114                             const DbiValidityRec* dbivrec=0);
00115   virtual void BuildRotations();
00116   virtual void BuildGeometry(const VldContext& vldc);
00117   virtual void BuildDetector(const VldContext& vldc, TGeoVolume* hallVol); 
00118   virtual void BuildStrips(const UgliDbiTables& tbl, GeoScintMdlNode* node);
00119   virtual void BuildHallExtent();
00120   virtual TGeoVolume* BuildFarMARS();
00121   virtual TGeoVolume* BuildNearMARS();
00122   virtual void BuildFarCoil(TGeoVolume* hallVol);
00123   virtual void BuildFarLeadStacks(TGeoVolume* hallVol);
00124   virtual void BuildNearCoil(TGeoVolume* hallVol);
00125   virtual TGeoVolume* BuildCoilAirGapVolume(const VldContext& vldc) const;
00126   virtual TGeoVolume* BuildFarCoilAirGapVolume() const;
00127   virtual TGeoVolume* BuildNearCoilAirGapVolume() const;
00128   virtual void BuildPlanePairVolumes(const VldContext& vldc); 
00129   virtual void BuildStripVolumes(const VldContext& vldc);
00130   virtual void BuildModules(const UgliDbiTables& tbl, GeoScintPlnNode* node);
00131   virtual void UpdateNodeMatrices(TGeoVolume* volume);
00132   Int_t GetSMPlaneLimits(const VldContext& vldc, Int_t* plnMin, Int_t* plnMax);
00133   
00134   VldRange      fVldRange;  // vld context of this geometry
00135   Geo::EAppType fAppType;   // Application type (Recons or VMC)
00136   Float_t       fSMZMin[2]; // supermodule zmin (global coord)
00137   Float_t       fSMZMax[2]; // supermodule zmax (global coord)
00138   Float_t       fScale;     // Scale factor to build geom in appropriate units
00139   std::string   fHallPath;  // global path to hall
00140   TVector3      fHallMin;   // hall xyz min
00141   TVector3      fHallMax;   // hall xyz max
00142 
00143   TGeoManager*  fGeoManager;  // pointer to manager of this geometry
00144   mutable std::map<PlexPlaneId,GeoPlnNode*> fPlaneMap;  // Map of plane id vs nodes
00145   mutable std::vector<GeoScintPlnNode*> fScintPlnNodes;
00146   mutable std::vector<GeoSteelPlnNode*> fSteelPlnNodes;
00147   mutable std::vector<GeoPlnNode*> fPlnNodes;
00148   mutable std::map<Float_t, GeoSteelPlnNode*> fSteelPlnNodeMap; // Map of z0 vs nodes
00149 
00150   GeoShield     fGeoShield; // helper to manage shield planes
00151   Bool_t        fIsSwimMedia; // media is in swimmer mode
00152   GeoMediumMap* fMediumMap; // build media and associate to det components
00153 
00154   TGeoRotation* fRot45; // reference to common rotation, not owned
00155   TGeoRotation* fRot315; // reference to common rotation, not owned
00156   
00157   ClassDef(GeoGeometry,4)
00158 };
00159 
00160 #endif // GEOGEOMETRY_H

Generated on Mon Nov 23 05:26:53 2009 for loon by  doxygen 1.3.9.1