X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;f=include%2Fprojections.h;h=67cae86462ad282856fdf99733c1756f5425481f;hb=999a754d1519a49ca062ee87b22bf601c1ee9f21;hp=35325dfe370ca34e1f0b5227d4819e2aae17680a;hpb=11ea72090da18aa290e2c3ab217f1d27736bca50;p=ctsim.git diff --git a/include/projections.h b/include/projections.h index 35325df..67cae86 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.24 2001/02/20 17:44:14 kevin Exp $ +** $Id: projections.h,v 1.30 2001/03/11 06:34:37 kevin Exp $ ** ** ** This program is free software; you can redistribute it and/or modify @@ -37,6 +37,57 @@ 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 + 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; } + + // 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); + ~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(); + double interpolate (double* pdX, double* pdY, int n, double dXValue); + void getThetaAndRaysumsForT (int iT, double* pdTheta, double* pdRaysum); + void getDetPositions (double* pdDetPos); + +private: + CoordinateContainer m_vecpCoordinates; + CoordinateContainer m_vecpSortedByT; + CoordinateContainer m_vecpSortedByTheta; + int m_iNumCoordinates; + int m_iNumView; + int m_iNumDet; +}; + + // Projections class Projections @@ -54,13 +105,14 @@ class Projections ~Projections (); static const int getInterpCount() {return s_iInterpCount;} - static const char** getInterpNameArray() {return s_aszInterpName;} - static const char** getInterpTitleArray() {return s_aszInterpTitle;} + 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 (); @@ -73,6 +125,8 @@ class Projections bool detarrayRead (fnetorderstream& fs, DetectorArray& darray, const int view_num); bool detarrayWrite (fnetorderstream& fs, const DetectorArray& darray, const int view_num); + Projections* 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); @@ -99,6 +153,8 @@ class Projections int nView() const {return m_nView;} int geometry() const {return m_geometry;} 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; } @@ -131,6 +187,7 @@ class Projections 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; double m_dFanBeamAngle; kuint32 m_year; // Creation date & time @@ -144,8 +201,8 @@ class Projections const static kuint16 m_signature; - static const char* s_aszInterpName[]; - static const char* s_aszInterpTitle[]; + static const char* const s_aszInterpName[]; + static const char* const s_aszInterpTitle[]; static const int s_iInterpCount; bool headerWrite (fnetorderstream& fs);