X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=libctsim%2Fphantom.cpp;h=2b969e87e25128808cc399a2cd23bd95aa5d709a;hp=ba4b0e43561de92191e50a6bf9f981cffdf41063;hb=747a2ec9e0f3c49723b36da0cc77270fbecc9dfe;hpb=d952113d9428857800f2e31230131f53c67d8db9 diff --git a/libctsim/phantom.cpp b/libctsim/phantom.cpp index ba4b0e4..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) { @@ -115,13 +117,13 @@ Phantom::convertNameToPhantomID (const char* const phmName) { int id = PHM_INVALID; - for (int i = 0; i < s_iPhantomCount; i++) + for (int i = 0; i < s_iPhantomCount; i++) { if (strcasecmp (phmName, s_aszPhantomName[i]) == 0) { id = i; break; } - - return (id); + } + return (id); } @@ -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) { @@ -507,6 +535,34 @@ Phantom::convertToImagefile (ImageFile& im, const int iTotalRasterCols, const do *vCol++ = 0; } +#if HAVE_OPENMP + double x_start = xmin + (colStart * xinc); + for (PElemConstIterator pelem = m_listPElem.begin(); pelem != m_listPElem.end(); pelem++) { + const PhantomElement& rPElem = **pelem; + #pragma omp parallel for + for (int ix = 0; ix < colCount; ix++) { + double x = x_start + ix * xinc; + int iColStore = ix + iStorageOffset; + ImageFileColumn vCol = v[iColStore]; + + double y = ymin; + for (int iy = 0; iy < ny; iy++, y += yinc) { + double dAtten = 0; + 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 + } // kx + *vCol++ += dAtten; + } /* 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; @@ -526,12 +582,13 @@ Phantom::convertToImagefile (ImageFile& im, const int iTotalRasterCols, const do } /* for iy */ } /* for ix */ } /* for pelem */ - +#endif if (nsample > 1) { double factor = 1.0 / static_cast(nsample * nsample); - - +#if HAVE_OPENMP + #pragma omp parallel for +#endif for (int ix = 0; ix < colCount; ix++) { int iColStore = ix + iStorageOffset; ImageFileColumn vCol = v[iColStore];