00001
00002
00003
00004
00005
00006
00007
00008
00009
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"
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
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
00059 GeoGeometry();
00060 GeoGeometry(const VldContext &vldc,
00061 Geo::EAppType apptype = Geo::kRecons);
00062 virtual ~GeoGeometry();
00063 virtual void UpdateGlobalManager() const { gGeoManager = fGeoManager; }
00064
00065
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
00105 TGeoRotation* GetRot45() const { return fRot45; }
00106 TGeoRotation* GetRot315() const { return fRot315; }
00107
00108 private:
00109
00110
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;
00135 Geo::EAppType fAppType;
00136 Float_t fSMZMin[2];
00137 Float_t fSMZMax[2];
00138 Float_t fScale;
00139 std::string fHallPath;
00140 TVector3 fHallMin;
00141 TVector3 fHallMax;
00142
00143 TGeoManager* fGeoManager;
00144 mutable std::map<PlexPlaneId,GeoPlnNode*> fPlaneMap;
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;
00149
00150 GeoShield fGeoShield;
00151 Bool_t fIsSwimMedia;
00152 GeoMediumMap* fMediumMap;
00153
00154 TGeoRotation* fRot45;
00155 TGeoRotation* fRot315;
00156
00157 ClassDef(GeoGeometry,4)
00158 };
00159
00160 #endif // GEOGEOMETRY_H