X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;f=include%2Fprojections.h;h=9e64f260d49fd9da53e39468223900565053e625;hb=d850a3477e9ccaecfa85e00bc619848fcc29bdb6;hp=338f37685a321e3e1caa39ef13e5cb6012a12a51;hpb=0eb095f799dd4222e6eb9b1db9e8c6f2831a1540;p=ctsim.git diff --git a/include/projections.h b/include/projections.h index 338f376..9e64f26 100644 --- a/include/projections.h +++ b/include/projections.h @@ -7,9 +7,9 @@ ** Date Started: July 1, 1984 ** ** This is part of the CTSim program -** Copyright (C) 1983-2000 Kevin Rosenberg +** Copyright (c) 1983-2001 Kevin Rosenberg ** -** $Id: projections.h,v 1.19 2001/01/03 22:00:46 kevin Exp $ +** $Id: projections.h,v 1.29 2001/03/10 23:56:58 kevin Exp $ ** ** ** This program is free software; you can redistribute it and/or modify @@ -32,18 +32,82 @@ class Scanner; class DetectorArray; class Array2dFileLabel; +class fnetorderstream; + +#include "array2dfile.h" +#include "imagefile.h" +#include +#include + + +//used for rebinning divergent beam projections to parallel +class ParallelRaysumCoordinate { +public: + double m_dT; // Distance from center of origin + double m_dTheta; // perpendicular angle to origin + int m_iViewNum; // View number for this raysum + int m_iDetNum; // Detector number for this raysum + + bool lessThanT (ParallelRaysumCoordinate& rCompare) + {return m_dT < rCompare.m_dT; } + bool lessThanTheta (ParallelRaysumCoordinate& rCompare) + {return m_dTheta < rCompare.m_dTheta; } + + static compareByTheta(ParallelRaysumCoordinate* a, ParallelRaysumCoordinate* b) + { return a->m_dTheta > b->m_dTheta; } + + static compareByT(ParallelRaysumCoordinate* a, ParallelRaysumCoordinate* b) + { return a->m_dT > b->m_dT; } + +}; + +class ParallelRaysums { +public: + ParallelRaysums (Projections* pProjections); + ~ParallelRaysums (); + + typedef std::vector CoordinateContainer; + typedef CoordinateContainer::iterator CoordinateIterator; + + CoordinateContainer& getCoordinates() {return m_vecpCoordinates;} + int getNumCoordinates() const {return m_iNumCoordinates;} + void getLimits (double* dMinT, double* dMaxT, double* dMinTheta, double* dMaxTheta) const; + CoordinateContainer& getSortedByT(); + CoordinateContainer& getSortedByTheta(); + +private: + CoordinateContainer m_vecpCoordinates; + CoordinateContainer m_vecpSortedByT; + CoordinateContainer m_vecpSortedByTheta; + int m_iNumCoordinates; +}; + // Projections class Projections { public: + + static const int POLAR_INTERP_INVALID; + static const int POLAR_INTERP_NEAREST; + static const int POLAR_INTERP_BILINEAR; + static const int POLAR_INTERP_BICUBIC; + Projections (const int nView, const int nDet); Projections (const Scanner& scanner); Projections (); ~Projections (); + static const int getInterpCount() {return s_iInterpCount;} + static const char* const* getInterpNameArray() {return s_aszInterpName;} + static const char* const* getInterpTitleArray() {return s_aszInterpTitle;} + static int convertInterpNameToID (const char* const interpName); + static const char* convertInterpIDToName (const int interpID); + static const char* convertInterpIDToTitle (const int interpID); + void initFromScanner (const Scanner& scanner); + bool initFromSomatomAR_STAR (int iNViews, int iNDets, unsigned char* pData, unsigned long lDataLength); void printProjectionData (int startView, int endView); void printProjectionData (); @@ -56,15 +120,19 @@ class Projections bool detarrayRead (fnetorderstream& fs, DetectorArray& darray, const int view_num); bool detarrayWrite (fnetorderstream& fs, const DetectorArray& darray, const int view_num); + bool interpolateToParallel(); + bool convertPolar (ImageFile& rIF, int iInterpolation); bool convertFFTPolar (ImageFile& rIF, int iInterpolation, int iZeropad); + bool calcArrayPolarCoordinates (unsigned int nx, unsigned int ny, double** ppdView, double** ppdDet); + void interpolatePolar (ImageFileArray& v, ImageFileArray& vImag, unsigned int nx, unsigned int ny, std::complex** ppcDetValue, + double** ppdDet, double** ppdView, unsigned int nView, unsigned int nDet, int iInterpolate); bool reconstruct (ImageFile& im, const char* const filterName, double filt_param, const char* const filterMethodName, const int zeropad, const char* frequencyFilterName, const char* const interpName, int interp_param, const char* const backprojName, const int trace) const; void setNView (int nView); // used in MPI to restrict # of views void setRotInc (double rotInc) { m_rotInc = rotInc;} void setDetInc (double detInc) { m_detInc = detInc;} - void setPhmLen (double phmLen) { m_phmLen = phmLen;} void setCalcTime (double calcTime) {m_calcTime = calcTime;} void setRemark (const char* remark) {m_remark = remark; m_label.setLabelString(remark);} void setRemark (const std::string& remark) {setRemark(remark.c_str());} @@ -72,15 +140,18 @@ class Projections double detStart() const {return m_detStart;} double rotStart() const {return m_rotStart;} double calcTime() const {return m_calcTime;} - double phmLen() const {return m_phmLen;} + double viewLen() const {return m_dViewDiameter / SQRT2;} const char* remark() const {return m_remark.c_str();} double detInc() const {return m_detInc;} double rotInc() const {return m_rotInc;} int nDet() const {return m_nDet;} int nView() const {return m_nView;} int geometry() const {return m_geometry;} - double focalLength() const {return m_focalLength;} - double fieldOfView() const {return m_fieldOfView;} + double focalLength() const {return m_dFocalLength;} + double sourceDetectorLength() const { return m_dSourceDetectorLength;} + + double phmLen() const { return m_dViewDiameter / SQRT2; } + void setPhmLen(double phmLen) { m_dViewDiameter = phmLen * SQRT2; } const std::string& getFilename() const {return m_filename;} Array2dFileLabel& getLabel() {return m_label;} @@ -110,9 +181,10 @@ class Projections double m_rotInc; // angle between rotations double m_detStart; // distance of beginning detector to center phantom double m_detInc; // increment between detectors - double m_phmLen; // Length of phantom edge (phm is square) - double m_focalLength; - double m_fieldOfView; + double m_dFocalLength; + double m_dSourceDetectorLength; + double m_dViewDiameter; + double m_dFanBeamAngle; kuint32 m_year; // Creation date & time kuint32 m_month; kuint32 m_day; @@ -124,6 +196,10 @@ class Projections const static kuint16 m_signature; + static const char* const s_aszInterpName[]; + static const char* const s_aszInterpTitle[]; + static const int s_iInterpCount; + bool headerWrite (fnetorderstream& fs); bool headerRead (fnetorderstream& fs); void newProjData ();