#define END_NAMESPACE_TOMO #define START_NAMESPACE_TOMO #define USING_NAMESPACE_TOMO template inline NUMBER square(const NUMBER &x) { return x*x; } #include #ifndef __ProjDataInfo_H__ #define __ProjDataInfo_H__ START_NAMESPACE_TOMO template class Sinogram; template class Viewgram; template class SegmentByView; template class SegmentBySinogram; template class RelatedViewgrams; class DataSymmetriesForViewSegmentNumbers; class ViewSegmentNumbers; class PMessage; class ProjDataInfo { public: /************ constructors ***********/ // TODO should probably be protected //! Construct an empty object inline ProjDataInfo(); //! Standard trick for a 'virtual copy-constructor' virtual ProjDataInfo* clone() const = 0; //! Destructor virtual ~ProjDataInfo() {} /**************** member functions *********/ // TODOdoc coordinate system //! Get tangent of the co-polar angle, tan(theta) virtual float get_tantheta(int segment_num,int view_num,int axial_position_num, int transaxial_position_num) const =0; //! Get azimuthal angle phi virtual float get_phi(int segment_num,int view_num,int axial_position_num, int transaxial_position_num) const =0; //! Get value of the (roughly) axial coordinate in the projection plane (in mm) virtual float get_t(int segment_num,int view_num,int axial_position_num, int transaxial_position_num) const =0; //! Get value of the tangential coordinate in the projection plane (in mm) virtual float get_s(int segment_num,int view_num,int axial_position_num, int transaxial_position_num) const =0; private: int min_view_num; int max_view_num; int min_tangential_pos_num; int max_tangential_pos_num; }; END_NAMESPACE_TOMO //#include "ProjDataInfo.inl" // // @(#)ProjDataInfo.inl 1.1: 00/06/14 // START_NAMESPACE_TOMO ProjDataInfo::ProjDataInfo() {} END_NAMESPACE_TOMO #endif // __ProjDataInfo_H__ #ifndef __ProjDataInfoCylindrical_H__ #define __ProjDataInfoCylindrical_H__ //#include"ProjDataInfo.h" START_NAMESPACE_TOMO /*! \ingroup buildblock \brief projection data info for data corresponding to a 'cylindrical' sampling. These data are organised by ring differences (allowing for merging of some ring differences into 1 segment). It is general enough to have both the CTI 'spanned' format, and the GE Advance format. */ // TODOdoc more class ProjDataInfoCylindrical: public ProjDataInfo { public: //! Constructors inline ProjDataInfoCylindrical(); inline float get_phi(int segment_num,int view_num,int axial_position_num, int transaxial_position_num) const; inline float get_t(int segment_num,int view_num,int axial_position_num, int transaxial_position_num) const; protected: float azimuthal_angle_sampling; float ring_radius; private: float ring_spacing; }; END_NAMESPACE_TOMO //#include "ProjDataInfoCylindrical.inl" // // @(#)ProjDataInfoCylindrical.inl 1.1: 00/06/14 // START_NAMESPACE_TOMO ProjDataInfoCylindrical::ProjDataInfoCylindrical() {} float ProjDataInfoCylindrical::get_phi(int segment_num,int view_num,int axial_position_num, int transaxial_position_num)const { return view_num*azimuthal_angle_sampling;} float ProjDataInfoCylindrical::get_t(int segment_num,int view_num,int axial_position_num, int transaxial_position_num) const {return axial_position_num;} END_NAMESPACE_TOMO #endif #ifndef __ProjDataInfoCylindricalArcCorr_H__ #define __ProjDataInfoCylindricalArcCorr_H__ //#include "ProjDataInfoCylindrical.h" START_NAMESPACE_TOMO /*! \ingroup buildblock \brief projection data info for arc-corrected data */ class ProjDataInfoCylindricalArcCorr : public ProjDataInfoCylindrical { public: //! Constructors inline ProjDataInfoCylindricalArcCorr(); inline virtual float get_tantheta(int segment_num,int view_num,int axial_position_num, int transaxial_position_num) const; inline virtual float get_s(int segment_num,int view_num,int axial_position_num, int transaxial_position_num) const; inline ProjDataInfo* clone() const; private: float bin_size; }; END_NAMESPACE_TOMO //#include "ProjDataInfoCylindricalArcCorr.inl" // // @(#)ProjDataInfoCylindricalArcCorr.inl 1.1: 00/06/14 // START_NAMESPACE_TOMO ProjDataInfoCylindricalArcCorr:: ProjDataInfoCylindricalArcCorr() {} float ProjDataInfoCylindricalArcCorr::get_s(int segment_num,int view_num,int axial_position_num, int transaxial_position_num) const {return transaxial_position_num*bin_size;} float ProjDataInfoCylindricalArcCorr::get_tantheta(int segment_num,int view_num,int axial_position_num, int transaxial_position_num) const { return (2*sqrt(square(ring_radius)-square(get_s(segment_num,view_num,axial_position_num, transaxial_position_num)))); } ProjDataInfo* ProjDataInfoCylindricalArcCorr::clone() const { return static_cast(new ProjDataInfoCylindricalArcCorr(*this)); } END_NAMESPACE_TOMO #endif //#include "ProjDataInfoCylindricalArcCorr.h" USING_NAMESPACE_TOMO // a local help function to find appropriate sizes etc. static void find_sampling_and_z_size( const ProjDataInfo* proj_data_info_ptr) { // first z- things const ProjDataInfoCylindrical* proj_data_info_cyl_ptr = dynamic_cast(proj_data_info_ptr); if (proj_data_info_cyl_ptr) { std::cerr << "OK !\n"; } else { std::cerr << " Not OK!\n"; } } int main() { ProjDataInfo * proj_data_info_ptr = new ProjDataInfoCylindricalArcCorr; find_sampling_and_z_size(proj_data_info_ptr); return 0; }