// InteractingLayer.cpp #include "InteractingLayer.h" #include "ptr/Ptr.h" #include "objstream/ObjData.hpp" #include "objstream/ObjTable.hpp" using std::ostream; using trf::ClusterList; using trf::LayerPtr; using trf::ConstLayerPtr; using trf::InteractorPtr; using trf::InteractingLayer; //********************************************************************** // Free functions. //********************************************************************** namespace { // Creator. // Layers are held with mutable pointers so we can add or remove // clusters. Thus we must cast away const after extracting the layer // from the table. ObjPtr create(const ObjData& data) { assert( data.get_object_type() == "InteractingLayer" ); if ( data.get_object_type() != "InteractingLayer" ) return ObjPtr(0); ConstLayerPtr plyr_const; data.get_share_pointer("layer",plyr_const); LayerPtr plyr; plyr.assign_with_const_cast(plyr_const); InteractorPtr pint; data.get_share_pointer("interactor",pint); return ObjPtr( new InteractingLayer(plyr,pint) ); } } //********************************************************************** // Member functions. //********************************************************************** // Constructor. InteractingLayer:: InteractingLayer(const LayerPtr& plyr, const InteractorPtr& pinter) : _plyr(plyr), _pinter(pinter) { } //********************************************************************** // Destructor. InteractingLayer::~InteractingLayer() { } //********************************************************************** // Return the creator. ObjCreator InteractingLayer::get_creator() { return create; } //********************************************************************** // Write the object data. ObjData InteractingLayer::write_data() const { ObjData data("InteractingLayer"); data.add_share_pointer("layer", _plyr); data.add_share_pointer("interactor", _pinter); return data; } //********************************************************************** // Interact a track. void InteractingLayer::_interact(ETrack& tre) const { _pinter->interact(tre); } //********************************************************************** // Propagate a track. void InteractingLayer:: _propagate(const LTrack& trl, const Propagator& prop, LTrackList& ltracks) const { // update the status chain LTrack trl0(trl); trl0.pop_status(); LayerStat lstat(*_plyr); trl0.push_status(lstat); _plyr->propagate(trl0, prop, ltracks); LTrackList::iterator ltrIter; for( ltrIter=ltracks.begin(); ltrIter < ltracks.end(); ++ltrIter ) { ETrack& etrk = (*ltrIter).get_track(); _pinter->interact( etrk ); //(*ltrIter).pop_status(); const TrackError& terr = etrk.get_error(); } return; } //********************************************************************** // Output stream. void InteractingLayer::ostr(ostream& stream) const { stream << "Interacting "; stream << *_plyr; } //********************************************************************** InteractingLayer::SurfaceList InteractingLayer::get_cluster_surfaces() const { return _plyr->get_cluster_surfaces(); } //********************************************************************** ClusterList InteractingLayer::get_clusters() const { return _plyr->get_clusters(); } //********************************************************************** ClusterList InteractingLayer::get_clusters(SurfacePtr psrf) const { return _plyr->get_clusters(psrf); } //********************************************************************** int InteractingLayer::add_cluster(const ClusterPtr& pclu) { return _plyr->add_cluster( pclu ); } //********************************************************************** int InteractingLayer::add_cluster(const ClusterPtr& pclu, SurfacePtr psrf) { return _plyr->add_cluster( pclu, psrf ); } //********************************************************************** void InteractingLayer::drop_clusters() { _plyr->drop_clusters(); } //**********************************************************************