#ifndef ABSGEOMETRYMESSENGER_HH #define ABSGEOMETRYMESSENGER_HH // // $Id: absGeometryMessenger.hpp,v 1.7 2003/01/23 17:36:20 melanson Exp $ // // Global definitions // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- // // File: absGeometryMessenger.hpp // Purpose: // Created: 29-OCT-1997 John Hobbs // // $Revision: 1.7 $ // // // Include files #include "d0_geometry/base/BaseGeometry.hpp" #include "d0om/d0_Ref.hpp" #include "geometry_db/dbidSet.hpp" #include "identifiers/EnvID.hpp" #include /** Abstract Geometry Messenger. Rather than include the specific headers for each sub-detector {\bf Geometer}, we use a {\em messenger} to enhance physical separation. The messenger is a trivial class for each subdetector which implements only a method {\em refresh()}. If the subdetector is X, {\bf XGeometryMessenger} is typically defined as follows: \begin{verbatim} class XGeometryMessenger { XGeometryMessenger(); void refresh(d0_Refsubdet_geometry); }; \end{verbatim} and the typical implementation of {\em refresh()} is: \begin{verbatim} void XGeometryMessenger::refresh(d0_Refsubdet_geometry) { XGeometer* g=XGeometer::get_instance(); g->refresh(subdet_geometry); } \end{verbatim} To achieve the desired decoupling, {\em refresh()} cannot be implemented in the messenger header file. For an example, see silicon\_geometry/base/SiGeometerDecoupler.* */ class absGeometryMessenger { public: /// Constructor absGeometryMessenger(absGeometryMessenger* chain=0): _next(chain) {} /// Destructor virtual ~absGeometryMessenger() { if( _next) delete _next; } /// Notify subdetectors of new BaseGeometry void notify_subdetectors(d0_Refbg, const bool passnull=false) const; /// Implement this to tell specific subdetectors there is a new geometry virtual void refresh(d0_Refbg, const bool pass_null=false) const =0; friend std::ostream& operator<<(std::ostream& os, const absGeometryMessenger& me); protected: edm::EnvID build_envid(dbidSet::DETDB reco, dbidSet::DETDB user, int serial) const; private: /// Allow a chain of messengers const absGeometryMessenger* _next; /// Private constructor absGeometryMessenger(const absGeometryMessenger& org) {} /// Overload = operator absGeometryMessenger& operator=(const absGeometryMessenger& org) { return *this; } }; // Constructors/Destructors // Accessors #endif //ABSGEOMETRYMESSENGER_HH