#include #include #include #include #include #include #include #include // #include #include "ICDCGeom.hxx" #include "ICTHGeom.hxx" #include "IGeomInfo.hxx" #include "IOADatabase.hxx" #include "IGeomIdManager.hxx" using namespace COMET; // Declare the callback, but make sure it's in the private namespace. void IGeomInfo::IGeometryChange::Callback(const ICOMETEvent* const) { if (!IGeomInfo::fGeomInfo) return; delete IGeomInfo::fGeomInfo; IGeomInfo::fGeomInfo = new IGeomInfo; } namespace {IGeomInfo::IGeometryChange geomInfoGeometryChange;}; // The static member pointer to the singleton. IGeomInfo* IGeomInfo::fGeomInfo = NULL; IGeomInfo::IGeomInfo() : fGeoManager(NULL), fCDCGeom(NULL), fCTHGeom(NULL), fDetectorSolenoidGeom(NULL), fStrawTrkGeom(NULL), fECALGeom(NULL) { FillInformation(); IOADatabase::Get().RegisterGeometryCallback(&geomInfoGeometryChange); } IGeomInfo::~IGeomInfo() { delete fCDCGeom; fCDCGeom = NULL; delete fCTHGeom; fCTHGeom = NULL; delete fDetectorSolenoidGeom; fDetectorSolenoidGeom = NULL; delete fStrawTrkGeom; fStrawTrkGeom = NULL; delete fECALGeom; fECALGeom = NULL; IOADatabase::Get().RemoveGeometryCallback(&geomInfoGeometryChange); fGeomInfo = NULL; } IGeomInfo& IGeomInfo::Get(void) { if (!fGeomInfo || fGeomInfo->fGeoManager != IOADatabase::Get().GetGeometry()) { if (fGeomInfo) delete fGeomInfo; COMETInfo("Create a new Geometry Info object."); fGeomInfo = new IGeomInfo; } return *fGeomInfo; } const ICDCGeom& IGeomInfo::CDC(void) { IGeomInfo::Get(); if (!fGeomInfo->fCDCGeom) { fGeomInfo->fCDCGeom = new ICDCGeom(); fGeomInfo->fCDCGeom->Fill(); } return *(fGeomInfo->fCDCGeom); } const ICTHGeom& IGeomInfo::CTH(void) { IGeomInfo::Get(); if (!fGeomInfo->fCTHGeom) { fGeomInfo->fCTHGeom = new ICTHGeom(); fGeomInfo->fCTHGeom->Fill(); } return *(fGeomInfo->fCTHGeom); } IStrawTrkGeom& IGeomInfo::StrawTrk(void) { IGeomInfo::Get(); if (!fGeomInfo->fStrawTrkGeom) { fGeomInfo->fStrawTrkGeom = new IStrawTrkGeom(); fGeomInfo->fStrawTrkGeom->Fill(); } return *(fGeomInfo->fStrawTrkGeom); } IECALGeom& IGeomInfo::ECAL(void) { IGeomInfo::Get(); if (!fGeomInfo->fECALGeom) { fGeomInfo->fECALGeom = new IECALGeom(); fGeomInfo->fECALGeom->Fill(); } return *(fGeomInfo->fECALGeom); } IDetectorSolenoidGeom& IGeomInfo::DetectorSolenoid(void) { IGeomInfo::Get(); if (!fGeomInfo->fDetectorSolenoidGeom) { fGeomInfo->fDetectorSolenoidGeom = new IDetectorSolenoidGeom(); fGeomInfo->fDetectorSolenoidGeom->Fill(); } return *(fGeomInfo->fDetectorSolenoidGeom); } void IGeomInfo::Clear() { if (fCDCGeom) fCDCGeom->Clear(); if (fCTHGeom) fCTHGeom->Clear(); if (fDetectorSolenoidGeom) fDetectorSolenoidGeom->Clear(); if (fStrawTrkGeom) fStrawTrkGeom->Clear(); if (fECALGeom) fECALGeom->Clear(); } void IGeomInfo::FillInformation(void) { fGeoManager = IOADatabase::Get().GetGeometry(); Clear(); if (fDetectorSolenoidGeom) fDetectorSolenoidGeom->Fill(); if (fCDCGeom) fCDCGeom->Fill(); if (fCTHGeom) fCTHGeom->Fill(); if (fStrawTrkGeom) fStrawTrkGeom->Fill(); if (fECALGeom) fECALGeom->Fill(); } IGeometryId IGeomInfo::GeomId(double x, double y, double z) { IGeometryId geomId; IOADatabase::Get().GeomId().GetGeometryId(x, y, z, geomId); return geomId; } TVector3 IGeomInfo::NodeExtent(const IHit& hit) { return NodeExtent(hit.GetGeomID()); } TVector3 IGeomInfo::NodeExtent(IGeometryId geomId) { return IOADatabase::Get().GeomId().NodeExtent(geomId); } TVector3 IGeomInfo::NodeSize(IGeometryId geomId) { return IOADatabase::Get().GeomId().NodeSize(geomId); } std::string IGeomInfo::NodeName(IGeometryId geomId) { return IOADatabase::Get().GeomId().NodeName(geomId); } TVector3 IGeomInfo::NodePosition(IGeometryId geomId) { return IOADatabase::Get().GeomId().NodePosition(geomId); } TVector3 IGeomInfo::MasterToLocal(IGeometryId geomId, double x, double y, double z) { TVector3 vec(0,0,0); IOADatabase::Get().GeomId().MasterToLocal(geomId,x,y,z,vec); return vec; } TVector3 IGeomInfo::MasterToLocalVect(IGeometryId geomId, double x, double y, double z) { TVector3 vec(0,0,0); IOADatabase::Get().GeomId().MasterToLocalVect(geomId,x,y,z,vec); return vec; } TVector3 IGeomInfo::LocalToMaster(IGeometryId geomId, double x, double y, double z) { TVector3 vec(0,0,0); IOADatabase::Get().GeomId().LocalToMaster(geomId,x,y,z,vec); return vec; } TVector3 IGeomInfo::LocalToMasterVect(IGeometryId geomId, double x, double y, double z) { TVector3 vec(0,0,0); IOADatabase::Get().GeomId().LocalToMasterVect(geomId,x,y,z,vec); return vec; } double IGeomInfo::X0(TGeoMaterial * mat, int method) { return IOADatabase::Get().GeomId().X0(mat,method); }