X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=libctsim%2Fphantom.cpp;h=2b969e87e25128808cc399a2cd23bd95aa5d709a;hp=f02877775729f2f1a4781e78eec84ad2d9f1ef56;hb=747a2ec9e0f3c49723b36da0cc77270fbecc9dfe;hpb=54275dac65e81ac6558d8f5f7ff39f2f8a53a818 diff --git a/libctsim/phantom.cpp b/libctsim/phantom.cpp index f028777..2b969e8 100644 --- a/libctsim/phantom.cpp +++ b/libctsim/phantom.cpp @@ -78,6 +78,7 @@ Phantom::init () m_composition = P_PELEMS; m_fail = false; m_id = PHM_INVALID; + m_im = NULL; } Phantom::~Phantom () @@ -85,9 +86,10 @@ Phantom::~Phantom () for (PElemIterator i = m_listPElem.begin(); i != m_listPElem.end(); i++) { delete *i; } + if (m_im) + delete m_im; } - const char* Phantom::convertPhantomIDToName (int phmID) { @@ -171,10 +173,10 @@ Phantom::createFromPhantom (const int phmid) /* METHOD IDENTIFICATION -* createFromFile Add PhantomElements from file +* createFromPhmFile Add PhantomElements from file * * SYNOPSIS -* createFromFile (filename) +* createFromPhmFile (filename) * * RETURNS * true if pelem were added @@ -182,7 +184,7 @@ Phantom::createFromPhantom (const int phmid) */ bool -Phantom::createFromFile (const char* const fname) +Phantom::createFromPhmFile (const char* const fname) { bool bGoodFile = true; FILE *fp; @@ -201,7 +203,7 @@ Phantom::createFromFile (const char* const fname) if (status == static_cast(EOF)) break; else if (status != 7) { - sys_error (ERR_WARNING, "Insufficient fields reading phantom file %s [Phantom::createFromFile]", fname); + sys_error (ERR_WARNING, "Insufficient fields reading phantom file %s [Phantom::createFromPhmFile]", fname); bGoodFile = false; } addPElem (pelemtype, cx, cy, u, v, rot, dens); @@ -212,6 +214,32 @@ Phantom::createFromFile (const char* const fname) return (bGoodFile); } +bool +Phantom::createFromImageFile (const char* const fname) +{ + bool bGoodFile = true; + + m_im = new ImageFile (); + if (! m_im || ! m_im->fileRead (fname)) { + sys_error (ERR_SEVERE, "Unable to read image file %s", fname); + bGoodFile = false; + delete m_im; + m_im = NULL; + m_fail = true; + } else { + m_name = fname; + m_id = -1; + m_fail = false; + + if (! m_im->getAxisExtent(m_xmin, m_xmax, m_ymin, m_ymax)) { + m_xmax = m_im->nx() / 2.; m_xmin = -m_xmax; + m_ymax = m_im->ny() / 2.; m_ymin = -m_ymax; + } + } + + return (bGoodFile); +} + bool Phantom::fileWrite (const char* const fname) { @@ -516,13 +544,14 @@ Phantom::convertToImagefile (ImageFile& im, const int iTotalRasterCols, const do double x = x_start + ix * xinc; int iColStore = ix + iStorageOffset; ImageFileColumn vCol = v[iColStore]; - for (int iy = 0; iy < ny; iy++) { - double y = ymin + iy * yinc; + + double y = ymin; + for (int iy = 0; iy < ny; iy++, y += yinc) { double dAtten = 0; - for (int kx = 0; kx < nsample; kx++) { - double xi = x + kxofs + kxinc * kx; - for (int ky = 0; ky < nsample; ky++) { - double yi = y + kyofs + ky * kyinc; + double xi = x + kxofs; + for (int kx = 0; kx < nsample; kx++, xi += kxinc) { + double yi = y + kyofs; + for (int ky = 0; ky < nsample; ky++, yi += kyinc) { if (rPElem.isPointInside (xi, yi, PHM_COORD)) dAtten += rPElem.atten(); } // ky @@ -531,9 +560,9 @@ Phantom::convertToImagefile (ImageFile& im, const int iTotalRasterCols, const do } /* iy */ } /* ix */ } /* pelem */ - + #else - + double x_start = xmin + (colStart * xinc); for (PElemConstIterator pelem = m_listPElem.begin(); pelem != m_listPElem.end(); pelem++) { const PhantomElement& rPElem = **pelem; @@ -559,7 +588,7 @@ Phantom::convertToImagefile (ImageFile& im, const int iTotalRasterCols, const do double factor = 1.0 / static_cast(nsample * nsample); #if HAVE_OPENMP #pragma omp parallel for -#endif +#endif for (int ix = 0; ix < colCount; ix++) { int iColStore = ix + iStorageOffset; ImageFileColumn vCol = v[iColStore];