// // $Id: BaseGeometry.cpp,v 1.13 2006/01/10 21:14:10 snyder Exp $ // // File: BaseGeometry.cc // Purpose: // Created: 28-OCT-1997 John Hobbs // // $Revision: 1.13 $ // // // Include files #include #include #include #include #include #include #include "geometry_system/utils/GeometryIO.hpp" #include "BaseGeometry.hpp" #include //Get rid of these later #include // when d0om::refcast doesn't #include // need the complete class def #include #include #include #include using namespace std; using namespace edm; using namespace dgs; /// Constructor given sub-detector geometries explicitly BaseGeometry::BaseGeometry( const d0_Ref& si, const d0_Ref& cft, const d0_Ref& cal, const d0_Ref& cps, const d0_Ref& fps, const d0_Ref& muon): _silicon(si), _cft(cft), _cal(cal), _cps(cps), _fps(fps), _muon(muon), _constants_version(-1) {} BaseGeometry::~BaseGeometry(){} // The virtual constructor d0_Ref BaseGeometry::build_default(RCP *rinit) // // Purpose: Construct a complete D0 geometry from RCP (or default) // Arguements: rinit - The RCP for initialization // Returns: A d0 geometry // { // Create an empty geometry and then fill it... d0_Ref iam = new BaseGeometry; // with each detector in turn string dettag; try { // silicon... dettag = "SMT"; if( rinit->getBool("useSmt" ) ) { RCP SmtRCP = rinit->getRCP("SmtBaseGeometry"); iam->_silicon = SiBaseGeometry::build_default(&SmtRCP); iam->_silicon->set_constants_version(-1); } // fiber tracker dettag = "CFT"; if( rinit->getBool("useCft") ) { RCP CftRCP = rinit->getRCP("CftBaseGeometry"); iam->_cft = CftBaseGeometry::build_default(&CftRCP); iam->_cft->set_constants_version(-1); } // with calorimeter (no RCP yet)... dettag = "CAL"; if( rinit->getBool("useCal") ) { iam->_cal = CalBaseGeometry::build_default(); iam->_cal->set_constants_version(-1); } // with CPS dettag = "CPS"; if( rinit->getBool("useCps") ) { RCP CpsRCP = rinit->getRCP("CpsBaseGeometry"); iam->_cps = CpsBaseGeometry::build_default(&CpsRCP); iam->_cps->set_constants_version(-1); } // with FPS (this should tie to EC's, but it currently does not, so // life is a bit more complicated dettag = "FPS"; if( rinit->getBool("useFPS") ) { RCP nFpsRCP = rinit->getRCP("FPSNorthGeometry"); RCP sFpsRCP = rinit->getRCP("FPSSouthGeometry"); iam->_fps = new FPSBaseGeometry(&nFpsRCP,&sFpsRCP); iam->_fps->set_constants_version(-1); } // with muon dettag = "Muon"; if( rinit->getBool("useMuo") ) { RCP MuonRCP = rinit->getRCP("MuoBaseGeometry"); iam->_muon = MuoBaseGeometry::build_default(&MuonRCP); iam->_muon->set_constants_version(-1); } return iam; } catch(XRCPNotFound RCPError) { clog << RCPError.logMessage() << endl; return NULL; } } // Write a geometry instance to the given file bool BaseGeometry::writeGeometry(d0_Ref det, string fname, string type) { return dgs::GeometryIO::writeGeometry(det,fname,type); } // Read a geometry instance from the given file d0_Ref BaseGeometry::readGeometry(string fname, string type) { d0_Ref_Any top = dgs::GeometryIO::readGeometry(fname,type,"BaseGeometry"); d0_Ref theDetector = d0om::refcast(top); return theDetector; } // Constant geometry accessors d0_Ref BaseGeometry::get_silicon() const { return d0om::refcast (_silicon); } d0_Ref BaseGeometry::get_cft() const { return d0om::refcast (_cft); } d0_Ref BaseGeometry::get_calorimeter() const { return d0om::refcast (_cal); } d0_Ref BaseGeometry::get_cps() const { return d0om::refcast (_cps); } d0_Ref BaseGeometry::get_fps() const { return d0om::refcast (_fps); } d0_Ref BaseGeometry::get_muon() const { return d0om::refcast (_muon); } // Mutable geometry accessors d0_Ref BaseGeometry::get_mutable_silicon() { return _silicon; } d0_Ref BaseGeometry::get_mutable_cft() { return _cft; } d0_Ref BaseGeometry::get_mutable_calorimeter() {return _cal; } d0_Ref BaseGeometry::get_mutable_cps() { return _cps; } d0_Ref BaseGeometry::get_mutable_fps() { return _fps; } d0_Ref BaseGeometry::get_mutable_muon() { return _muon; } int BaseGeometry::set_constants_version( int serial_number ) { int old = _constants_version; _constants_version = serial_number; return old; } // Complete the GeometryElement interface const list BaseGeometry::get_children() // // Purpose: Return the list of subdetectors // { list kids; if( _silicon ) kids.push_back(_silicon.ptr()); if( _cft ) kids.push_back(_cft.ptr()); if( _cal ) kids.push_back(_cal.ptr()); if( _cps ) kids.push_back(_cps.ptr()); if( _fps ) { kids.push_back(_fps->get_mutable_north()); kids.push_back(_fps->get_mutable_south()); } if( _muon ) kids.push_back(_muon.ptr()); return kids; } // A dump ostream& operator <<( ostream& os, const BaseGeometry& me) // // Purpose: Print a text dump of a geometry tree. // { os << "BaseGeometry at " << me.get_position() << endl; if( me._silicon ) os << *me._silicon << endl; if( me._cft ) os << *me._cft << endl; if( me._cal ) os << *me._cal << endl; if( me._cps ) os << *me._cps << endl; if( me._fps ) os << *me._fps << endl; if( me._muon ) os << *me._muon << endl; return os; } #include "d0_geometry/base/all_refs.hpp"