X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;ds=sidebyside;f=include%2Fprojections.h;h=79e8f71be149ea8a62e2d2a9665c96521cc56ae1;hb=1a050c98763fbbc0662731b0b76953acede6f5d7;hp=9e64f260d49fd9da53e39468223900565053e625;hpb=d850a3477e9ccaecfa85e00bc619848fcc29bdb6;p=ctsim.git diff --git a/include/projections.h b/include/projections.h index 9e64f26..79e8f71 100644 --- a/include/projections.h +++ b/include/projections.h @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (c) 1983-2001 Kevin Rosenberg ** -** $Id: projections.h,v 1.29 2001/03/10 23:56:58 kevin Exp $ +** $Id$ ** ** ** This program is free software; you can redistribute it and/or modify @@ -41,29 +41,31 @@ class fnetorderstream; //used for rebinning divergent beam projections to parallel -class ParallelRaysumCoordinate { +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 + double m_dRaysum; - bool lessThanT (ParallelRaysumCoordinate& rCompare) - {return m_dT < rCompare.m_dT; } - bool lessThanTheta (ParallelRaysumCoordinate& rCompare) - {return m_dTheta < rCompare.m_dTheta; } + static bool compareByTheta (ParallelRaysumCoordinate* a, ParallelRaysumCoordinate* b) + { return a->m_dTheta == b->m_dTheta ? b->m_dT > a->m_dT : b->m_dTheta > a->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; } + // sort first by T, then Theta + static bool compareByT (ParallelRaysumCoordinate* a, ParallelRaysumCoordinate* b) + { return a->m_dT == b->m_dT ? b->m_dTheta > a->m_dTheta : b->m_dT > a->m_dT; } }; class ParallelRaysums { public: - ParallelRaysums (Projections* pProjections); + + enum { + THETA_RANGE_UNCONSTRAINED = 0, + THETA_RANGE_NORMALIZE_TO_TWOPI, + THETA_RANGE_FOLD_TO_PI, + }; + + ParallelRaysums (const Projections* pProjections, int iThetaRange); ~ParallelRaysums (); typedef std::vector CoordinateContainer; @@ -74,12 +76,19 @@ public: void getLimits (double* dMinT, double* dMaxT, double* dMinTheta, double* dMaxTheta) const; CoordinateContainer& getSortedByT(); CoordinateContainer& getSortedByTheta(); + double interpolate (double* pdX, double* pdY, int n, double dXValue, int* iLastFloor = NULL); + void getThetaAndRaysumsForT (int iT, double* pdTheta, double* pdRaysum); + void getDetPositions (double* pdDetPos); private: CoordinateContainer m_vecpCoordinates; CoordinateContainer m_vecpSortedByT; CoordinateContainer m_vecpSortedByTheta; + ParallelRaysumCoordinate* m_pCoordinates; int m_iNumCoordinates; + int m_iNumView; + int m_iNumDet; + int m_iThetaRange; }; @@ -113,6 +122,10 @@ class Projections void printProjectionData (); void printScanInfo (std::ostringstream& os) const; + int Helical180LI(int interpView); + int Helical180LI_Equiangular(int interpView); + int HalfScanFeather(void); + bool read (const std::string& fname); bool read (const char* fname); bool write (const char* fname); @@ -120,13 +133,15 @@ 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(); + Projections* interpolateToParallel() const; 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 calcArrayPolarCoordinates (unsigned int nx, unsigned int ny, double** ppdView, double** ppdDet, + int iNumDetWithZeros, double dZeropadRatio, double dDetInc); 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); + double** ppdDet, double** ppdView, unsigned int nView, unsigned int nDet, unsigned int nDetWithZeros, + 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; @@ -149,7 +164,7 @@ class Projections int geometry() const {return m_geometry;} double focalLength() const {return m_dFocalLength;} double sourceDetectorLength() const { return m_dSourceDetectorLength;} - + double viewDiameter() const {return m_dViewDiameter; } double phmLen() const { return m_dViewDiameter / SQRT2; } void setPhmLen(double phmLen) { m_dViewDiameter = phmLen * SQRT2; } @@ -159,7 +174,7 @@ class Projections DetectorArray& getDetectorArray (const int iview) { return (*m_projData[iview]); } - + const DetectorArray& getDetectorArray (const int iview) const { return (*m_projData[iview]); } @@ -168,19 +183,19 @@ class Projections static bool copyViewData (const char* const filename, std::ostream& os, int startView, int endView); static bool copyViewData (const std::string& filename, std::ostream& os, int startView, int endView); - + private: - int m_headerSize; // Size of disk file header - int m_geometry; // Geometry of scanner - class DetectorArray **m_projData; // Pointer to array of detarray_st pointers - std::string m_remark; // description of raysum data - int m_nDet; // number of detectors in array - int m_nView; // number of rotated views - double m_calcTime; // time required to calculate raysums - double m_rotStart; // starting view rotation - double m_rotInc; // angle between rotations - double m_detStart; // distance of beginning detector to center phantom - double m_detInc; // increment between detectors + int m_headerSize; // Size of disk file header + int m_geometry; // Geometry of scanner + class DetectorArray **m_projData; // Pointer to array of detarray_st pointers + std::string m_remark; // description of raysum data + int m_nDet; // number of detectors in array + int m_nView; // number of rotated views + double m_calcTime; // time required to calculate raysums + double m_rotStart; // starting view rotation + double m_rotInc; // angle between rotations + double m_detStart; // distance of beginning detector to center phantom + double m_detInc; // increment between detectors double m_dFocalLength; double m_dSourceDetectorLength; double m_dViewDiameter;