From 792eea57bab19b067448a0027c2315b47fe9b734 Mon Sep 17 00:00:00 2001 From: Kris Thielemans Date: Sun, 29 Oct 2023 14:18:09 +0000 Subject: [PATCH 1/9] update developer's overview It was wildly out-of-date w.r.t. C++ ffeatures etc. --- documentation/STIR-developers-overview.tex | 120 ++++++++++----------- documentation/release_5.2.htm | 9 +- 2 files changed, 65 insertions(+), 64 deletions(-) diff --git a/documentation/STIR-developers-overview.tex b/documentation/STIR-developers-overview.tex index b06805c054..35a6d43707 100644 --- a/documentation/STIR-developers-overview.tex +++ b/documentation/STIR-developers-overview.tex @@ -16,7 +16,7 @@ \textbf{{\huge STIR \\ Overview for developers}}\\ \textbf{Kris Thielemans}\\ -\textbf{\textit{version 5.1}} +\textbf{\textit{version 5.2}} \end{center} @@ -60,7 +60,8 @@ \section{ doxygen on the source files that come in the STIR distribution). \subsection{Language support} -STIR is written in C++ and currently requires C++-11, but it should be compatible with nNewer versions of the C++ standard. +STIR is written in C++ and currently requires C++-11, but it is compatible with newer versions of the C++ standard. +We will enforce C++-14 from STIR 6.0. Python and MATLAB support is provided via \R2Lurl{http://www.swig.org/}{SWIG}. This means that Python/MATLAB interfaces follow the C++ classes closely, although some differences are required as these languages do not support templates for instance. @@ -139,31 +140,25 @@ \subsection{ In 3D PET, two data storage modes are generally used for a \textbf{segment}\footnote{{The -GE Advance file format does \textit{not} store the data per segment, -but per view. In addition, the segments are then mixed. However, +GE file formats does \textit{not} store the data per segment, +but per view. However, once read into STIR, this organisation is no longer available. -\\ -The ECAT6 sinograms also have no easy way to understand which -ring-pair corresponds to which sinogram number for 3D PET. This -is the main reason why STIR does not attempt to read ECAT6 sinograms -directly, but leaves this to a separate conversion utility.}} +}} \begin{itemize} \item where the 3D data is ordered by \textbf{sinogram} (i.e \textbf{axial position}, \textbf{view -angle}, \textbf{tangential position}) (CTI terminology: \textit{Volume} mode) +angle}, \textbf{tangential position}) (see Figure \ref{fig:sinogramstorage}) \item where the 3D dataset is ordered by \textbf{view} (i.e \textbf{view angle}, \textbf{axial -position}, \textbf{tangential position}) (CTI terminology: \textit{View} -mode) (see Figure \ref{fig:viewgramstorage}) +position}, \textbf{tangential position}) +(see Figure \ref{fig:viewgramstorage}) \end{itemize} This notation means that for a sinogram, the tangential position runs fastest.\\ In both modes, the 3D dataset has been stored in several segments where the number of axial positions in each \textbf{segment} depends -on the \textbf{axial compression (span)}.\\ -Note that we find the CTI terminology confusing, so you will -see it nowhere in STIR except in this document. +on the \textbf{axial compression (span)}. From both modes, 2 different types of 2D datasets can be obtained @@ -175,6 +170,18 @@ \subsection{ view. \end{itemize} +Note that in STIR version 6.0, Time-of-Flight (TOF) will be supported. This introduces another +index. However, \texttt{Sinogram} and \texttt{Viewgram} will remain 2D objects, and \texttt{Segment*} 3D. +This will also be the case once we have layers and energy windows. +In STIR 5.2, we have therefore introduced new classes +\texttt{SinogramIndices}, \texttt{ViewgramIndices}\footnote{Replacing \texttt{ViewSegmentNumbers} in previous versions of STIR.} +and \texttt{SegmentIndices}, containing all ``other'' +indices necessary to get at the corresponding data. This means that the recommended coding style is now +\begin{verbatim} +ViewgramIndices vg_idx(view_num,segment_num); +auto viewgram = proj_data.get_viewgram(vg_idx); +\end{verbatim} +In the next version of STIR, we will introduce extra methods to be able to conveniently loop over all viewgrams etc. \begin{figure}[htbp] \begin{center} @@ -231,8 +238,8 @@ \subsection{ The file \textit{stir}/\textit{common.h} contains general configuration info and tries to iron out some incompatibilities for certain compilers. If you include any STIR \textit{.h} file, you are guaranteed -to have included \textit{stir}/\textit{common.h} as well, hence it should -never be included explicitly by a 'user'. +to have included \textit{stir}/\textit{common.h} as well, hence there is usually no need +to include it explicitly. \subsection{ Namespace} @@ -241,12 +248,9 @@ \subsection{ are within this namespace. The effect of this is that conflicts with other symbols are impossible (except when somebody else is using the same namespace). STIR also uses sub-namespaces for -certain things. This usage will probably be expanded in the future.\\ -For older compilers, the namespace can be disabled (see \textit{stir}/\textit{common.h}). -For this reason, we have introduced some macros such as \textit{START\_NAMESPACE\_STIR.} You -could use the macros in your own code as well, although people -with a compiler that does not support namespace really should -upgrade. +certain things. This usage will probably be expanded in the future. +In most of the code, we use macros such as \textit{START\_NAMESPACE\_STIR} +(originally used for older compilers). \subsection{ Naming conventions } @@ -262,6 +266,7 @@ \subsection{ with \textit{num}, e.g. \textit{num\_gates}. \item the number of an item in a sequence end with \textit{num}, e.g. \textit{gate\_num}. +\footnote{We are slowly starting to use \texttt{\_idx} in a few places as ``indices'' are a more general concept, and avoid confusion between the pre- and postfix use of \texttt{num}.} \item a relative time (normally with respect to the scan start) end with \textit{rel\_time}, e.g. \textit{tracer\_injection\_rel\_time}. @@ -389,15 +394,14 @@ \subsection{ \subsection{\label{ssect:AdvancedCppFeatures} Advanced (?) C++ features used} -We attempted to follow the ANSI C++ standard as close as possible. -We expect to have some marginal problems with a 'strict' ANSI -C++ compiler, although there should now be very few cases (as -gcc warns about a lot of stuff). We have used some preprocessor -macros (see \textit{stir/common.h}) to isolate work-arounds for older +STIR uses C++-11 an dis compatible with C++-20 to the best of our knowledge. +For legacy reasons, we have some preprocessor +macros (see \textit{stir/common.h}) that were used isolate work-arounds for older compilers. Ideally, all these \#ifdefs should disappear at a -later development stage of the library. We gradually give up -on supporting older compilers anyway. +later development stage of the library. +This section describes some C++ features used in STIR that might not be so familiar to +non-C++ programmers. \subsubsection{Templates} The library uses templates very often. This allows us to write @@ -417,23 +421,15 @@ \subsubsection{Templates} actual definition is in a \textit{.txx} file that you can include.\\ We do use partial class template specialisation in some places. However, (very ugly) work-arounds are provided for compilers -that do not support this feature (although not anymore in recent code).\\ -Very occasionally we use member templates (in such a form that -it could be compiled by Visual C++ 6.0, i.e. inline in the class definition). +that do not support this feature (although these areee being gradually removed).\\ +Very occasionally we use member templates. \subsubsection{Run Time Type Information} Another C++ feature that we use is Run Time Type Information (RTTI). We almost exclusively use this to check validity of pointer (or reference) casts down a hierarchy ('down-casting'). See section \ref{sect:classhierarchies} -for an example. If a compiler does not support -RTTI (but all compilers do these days), it would be possible to declare -a (essentially empty) \texttt{dynamic\_cast} -template function such that the above code would compile. The -resulting programme would become inherently type-unsafe though, -and we recommend that you upgrade your compiler. Some code does -rely on explicit type checking, you would have to check this -in detail if you don't have RTTI. +for an example. \subsubsection{ Iterators} @@ -447,7 +443,7 @@ \subsubsection{ \begin{verbatim} void f(vector& v) { - for (vector::iterator iter = v.begin(); iter != v.end(); ++iter) + for (auto iter = v.begin(); iter != v.end(); ++iter) *iter += 2; } \end{verbatim} @@ -464,7 +460,7 @@ \subsubsection{ template void f(Container& v) { - for (typename Container::iterator iter = v.begin(); iter != v.end(); ++iter) + for (auto iter = v.begin(); iter != v.end(); ++iter) *iter += 2; } \end{verbatim} @@ -483,7 +479,7 @@ \subsubsection{ template void f(Array& a) { - for (typename Array::full_iterator iter = a.begin_all(); + for (auto iter = a.begin_all(); iter != a.end_all(); ++iter) *iter += 2; } @@ -511,18 +507,14 @@ \subsubsection{ (something which you cannot achieve with an ordinary pointer). Generally, the destructor of the smart pointer will make sure that the object it points to is deleted (when appropriate).\\ -\textit{std::auto\_ptr} is a standard smart pointer class which is +\textit{std::unique\_ptr} is a standard smart pointer class which is suitable for pointers to objects where there's only one smart -pointer for each object. Unfortunately, its syntax has been decided -rather late in ANSI C++ and its implementation requires some -advanced C++ features, leading to a non-standard implementation -of \texttt{std::auto\_ptr} in older compilers (including VC 6.0) and it is now -superseded by \texttt{std::unique\_ptr} in C++11. For this -reason, we do not use this smart pointer class too much, and +pointer for each object. Unfortunately, a lot of STIR was written +pre-C++-11 and we do not use this smart pointer class too much, and generally use \texttt{shared\_ptr} instead. This is somewhat unfortunate as these two smart pointers are generally quite different concepts. -\texttt{shared\_ptr} is a STIR (or boost) smart pointer class which +\texttt{shared\_ptr} is a wrapper around the \texttt{std} (or boost\footnote{Boost smart pointer are probably no longer supported, and will no longer be from STIR 6.0.}) smart pointer class which is suitable when there are (potentially) more than one pointer pointing to the same object. It keeps a reference count such that the object is (only) deleted when the last shared pointer @@ -561,7 +553,8 @@ \subsubsection{ to test if a pointer is `null', i.e. does not point to anything. \textit{is\_null\_ptr} works with ordinary pointers, shared\_ptrs and auto\_ptrs. Use it to avoid that your code depends on what type of (smart) pointer -you are using. +you are using. Note however that since C++-11, it is more convenient to use the +automatic converstion to \texttt{bool}. \subsection{Generic functionality of STIR classes} This is a (very incomplete) section describing some functionality that @@ -749,8 +742,9 @@ \subsection{ \end{figure} -Currently missing is support for fan-beam data.\\ -List-mode data is experimentally supported since version 1.2. +Currently missing is support for fan-beam data. + +List-mode data is supported as well. See the \textit{Listmode} base-class and its hierarchy. \subsection{ Data (or image) processor hierarchy} @@ -1046,6 +1040,11 @@ \section{ number = 1; a = 2.4F; } + bool post_processing() // will be renamed to post_parsing() + { + // do some checks and handle some extra variables + return false; // everything was ok + } }; int main(int argc, char **argv) @@ -1088,8 +1087,7 @@ \subsection{Images} You will have to include \texttt{stir/IO/write\_to\_file.h} for this to work. This will write using the default output file format and is equivalent to the following: \begin{verbatim} - typedef DiscretisedDensity<3,float> DataType ; - shared_ptr output_format_sptr = + auto output_format_sptr = OutputFileFormat::default_sptr(); output_format_sptr->write_to_file(filename, density); \end{verbatim} @@ -1189,10 +1187,10 @@ \section{ template void f(DiscretisedDensity<3, elemT>& density) { - VoxelsOnCartesianGrid * voxels_ptr = + auto voxels_ptr = dynamic_cast< VoxelsOnCartesianGrid * > (&density); - if (voxels_ptr == NULL) - error("f: can only handle images of type VoxelsOnCartesianGrid\n"); + if (!voxels_ptr) + error("f: can only handle images of type VoxelsOnCartesianGrid"); ... } \end{verbatim} @@ -1286,7 +1284,7 @@ \section{ ) # declare dependencies on other STIR libraries, for instance -target_link_libraries($(dir) buildblock) +target_link_libraries($(dir) PUBLIC buildblock) # add to list of libraries for STIR to include in linking list(APPEND STIR_LIBRARIES $(dir)) diff --git a/documentation/release_5.2.htm b/documentation/release_5.2.htm index 58d95054d1..550c1ed137 100644 --- a/documentation/release_5.2.htm +++ b/documentation/release_5.2.htm @@ -15,7 +15,8 @@

Overall summary

improvements to the documentation. See also the 5.2 milestone on GitHub.

-

Overall code management and assistance by Kris Thielemans (UCL and ASC).

+

Overall code management and assistance by Kris Thielemans (UCL and ASC). Other main contributors + were Daniel Deidda (NPL) and Markus Jehl (Positrigo).

Patch release info

    @@ -149,12 +150,12 @@

    Deprecated functionality

    and should be replaced by their respective versions that use SegmentIndices, ViewgramIndices or SinogramIndices. The former will not be compatible with TOF information that will be introduced in version 6.0.0. -
  • STIR version 6.0.0 will likely require C++ 14 (currently we require C++ 11, but already support C++ 20).
  • +
  • STIR version 6.0.0 will require C++ 14 (currently we require C++ 11, but already support C++ 20).

Build system and dependencies

    -
  • CMake 3.12 is now required on Windows. (It will be required on all platforms in the next version).
  • +
  • CMake 3.12 is now required on Windows. (It will be required on all platforms in STIR 6.0).
  • We now use CMake's OBJECT library feature for the registries. This avoids re-compilation of the registries for every executable and therefore speeds-up building time. Use of STIR in an external project is not affected as long as the recommended practice was followed. This is now documented in the User's Guide.
    PR #1141.
  • @@ -206,10 +207,12 @@

    Minor (?) bug fixes

    Documentation changes

      +
    • Updated the STIR developers guide, which was quite out-of-date w.r.t. C++ features etc.

    recon_test_pack changes

      +
    • Updated headers of most images and projection data to avoid warnings.

    Other changes to tests

    From 9e6fdf690d2dd97e00af09cb1f617a1a5d47167b Mon Sep 17 00:00:00 2001 From: Kris Thielemans Date: Sun, 29 Oct 2023 15:47:11 +0000 Subject: [PATCH 2/9] updated mailmap and CITATION.cff --- .mailmap | 7 ++++-- CITATION.cff | 44 ++++++++++++++++----------------- scripts/maintenance/git-fame.sh | 6 ++--- 3 files changed, 30 insertions(+), 27 deletions(-) diff --git a/.mailmap b/.mailmap index e0b863e5c9..66b9eb55f0 100644 --- a/.mailmap +++ b/.mailmap @@ -45,8 +45,10 @@ Palak Wadhwa Rebecca Gillen <43674917+RebeccaGillen@users.noreply.github.com> Richard Brown <33289025+rijobro@users.noreply.github.com> Richard Brown -Robert Twyman -Robert Twyman +Robert Twyman Skelly +Robert Twyman Skelly +Robert Twyman Skelly +Robert Twyman Skelly <117300855+Robert-PrescientImaging@users.noreply.github.com> Yu-jung Tsai Gemma Fardell Gemma Fardell <47746591+gfardell@users.noreply.github.com> @@ -62,5 +64,6 @@ Nicole Jurjew Tahereh Niknejad Tahereh Niknejad Sam D Porter <92305641+samdporter@users.noreply.github.com> +Sam D Porter <92305641+samdporter@users.noreply.github.com> Matthew Strugari Matthew Strugari <56315593+mastergari@users.noreply.github.com> diff --git a/CITATION.cff b/CITATION.cff index 70d589c8ce..77d74b0396 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -18,31 +18,34 @@ authors: given-names: Richard orcid: 'https://orcid.org/0000-0001-6989-9200' affiliation: University College London + - family-names: Twyman Skelly + given-names: Robert + affiliation: University College London and Prescient Imaging - family-names: Tsoumpas given-names: Charalampos - - family-names: Twyman - given-names: Robert - affiliation: University College London - family-names: Deidda given-names: Daniel orcid: 'https://orcid.org/0000-0002-2766-4339' affiliation: National Physics Laboratory (UK) + - family-names: Falcon + given-names: Carles - family-names: Borgeaud given-names: Tim affiliation: Hammersmith Imanet Ltd - - family-names: Falcon - given-names: Carles - family-names: Khateri given-names: Parisa affiliation: ETH Zuerich + - family-names: Jehl + given-names: Markus + affiliation: Positrigo - family-names: Wadhwa given-names: Palak affiliation: University of Leeds (UK) - - family-names: Beisel - given-names: Tobias - family-names: Strugari given-names: Matthew affiliation: Dalhousie University (Canada) + - family-names: Beisel + given-names: Tobias - family-names: Jacobson given-names: Matthew - family-names: Gillman @@ -69,9 +72,6 @@ authors: - family-names: Fischer given-names: Jannis orcid: 'https://orcid.org/0000-0002-8329-0220' - - family-names: Jehl - given-names: Markus - affiliation: Positrigo - family-names: Roethlisberger given-names: Michael affiliation: ETH Zuerich @@ -80,13 +80,17 @@ authors: - family-names: Brusaferri given-names: Ludovica affiliation: University College London - - family-names: Bertolli - given-names: Ottavia - affiliation: University College London - family-names: Pasca given-names: Edoardo affiliation: UK Research & Innovation orcid: 'https://orcid.org/0000-0001-6957-2160' + - family-names: Thomas + given-names: Benjamin + orcid: 'https://orcid.org/0000-0002-9784-1177' + affiliation: University College London + - family-names: Bertolli + given-names: Ottavia + affiliation: University College London - family-names: Niknejad given-names: Tahereh - family-names: Dikaios @@ -113,10 +117,6 @@ authors: - family-names: Valente given-names: Patrick affiliation: Brunel University (UK) - - family-names: Thomas - given-names: Benjamin - orcid: 'https://orcid.org/0000-0002-9784-1177' - affiliation: University College London - family-names: Schramm given-names: Georg affiliation: Katholieke Universiteit Leuven (Belgium) @@ -143,12 +143,12 @@ authors: - family-names: Mikhaylova given-names: Ekaterina affiliation: Positrigo - - family-names: da Costa-Luis - given-names: Casper O. - orcid: 'https://orcid.org/0000-0002-7211-1557' - family-names: Porter given-names: Sam David affiliation: University College London, National Physics Laboratory (UK) + - family-names: da Costa-Luis + given-names: Casper O. + orcid: 'https://orcid.org/0000-0002-7211-1557' - family-names: Rashidnasab given-names: Alaleh affiliation: University College London @@ -160,11 +160,11 @@ authors: affiliation: University College London - family-names: Vavrek given-names: Jayson - - family-names: Kohr - given-names: Holger - family-names: Tsai given-names: Yu-jung affiliation: University College London + - family-names: Kohr + given-names: Holger - name: tokkot - family-names: El Katib given-names: Mahmoud diff --git a/scripts/maintenance/git-fame.sh b/scripts/maintenance/git-fame.sh index b6823bba47..cd3a26c98e 100755 --- a/scripts/maintenance/git-fame.sh +++ b/scripts/maintenance/git-fame.sh @@ -37,7 +37,7 @@ exit | Darren Hague | 50 # Also, SPECTUB files were checked in by KT, but actually written by Carles Falcon. -# Finally PinholeSPECTUB is attributed (mostly to Carles), but git fame doesn't count his loc for some reason. +# Finally PinholeSPECTUB is now attributed correctly (mostly to Carles) # Just before release 5.1, we have the following loc $ wc -l *SPECTUB*x 1346 PinholeSPECTUB_Tools.cxx @@ -48,12 +48,12 @@ exit 989 SPECTUB_Weight3d.cxx Roughly leading to -| Carles Falcon | 3000 +| Carles Falcon | 3500 | Berta Marti-Fuster | 1000 Summary for corrections to output: | Author | loc -| Carles Falcon | 3000 +| Carles Falcon | 3500 | Berta Marti-Fuster | 1000 | Claire Labbe | 1000 | Mustapha Sadki | 400 From b154f5c6768b3b7eb9c48a82cb29c2ded39674e7 Mon Sep 17 00:00:00 2001 From: Kris Thielemans Date: Sun, 29 Oct 2023 18:34:36 +0000 Subject: [PATCH 3/9] update STIR general overview and user's guide The general overview was wildly out-of-date... Now somewhat ok. The User's guide still contained old material as well, now removed. --- documentation/STIR-UsersGuide.tex | 173 ++++++++++++------------ documentation/STIR-general-overview.tex | 118 +++++----------- documentation/release_5.2.htm | 8 +- 3 files changed, 121 insertions(+), 178 deletions(-) diff --git a/documentation/STIR-UsersGuide.tex b/documentation/STIR-UsersGuide.tex index 80a91a9aed..0d14db36be 100644 --- a/documentation/STIR-UsersGuide.tex +++ b/documentation/STIR-UsersGuide.tex @@ -44,7 +44,7 @@ \\[3cm] \textbf{{\huge User's Guide\\ - Version 5.1}} + Version 5.2}} \end{center} \end{spacing} @@ -53,7 +53,7 @@ \noindent K. Thielemans \\ -{\it \small Hammersmith Imanet Ltd; Algorithms and Software Consulting Ltd; University College London}\\ +{\it \small University College London; Algorithms and Software Consulting Ltd (formerly Hammersmith Imanet Ltd}\\ Ch. Tsoumpas\\ {\it \small Hammersmith Imanet Ltd; Imperial College London; King's College London}\\ D. Sauge, C. Labb\'e, C. Morel \\ @@ -142,11 +142,42 @@ \section{ Any comments on documentation, and especially contributions are always welcome. Please use the stir-users mailing list. +\section{Installing STIR via a pre-built version } +\subsection{ +Installing via conda} +The easiest way is to use \texttt{conda} (or one of its derivatives such as \texttt{mamba}): +\begin{verbatim} +conda config --add channels conda-forge +conda create -n stirenv stir matplotlib +conda activate stirenv + +# use STIR executable or python + +# deactivate the environment +conda deactivate +\end{verbatim} +See \url{https://stir.sourceforge.net/wiki/index.php/Installing_STIR_with_conda}{our Wiki page} for +more detail, including on how to get a development version. + +\subsection{SIRF distributions} +CCP SyneRBI distributes SIRF with its dependencies, including STIR, +see \url{https://www.ccpsynerbi.ac.uk/downloads/}{its download page} for +a Virtual Machine, docker etc. However, only the STIR libraries are included in +these distributions. You can easily install ``full'' STIR on the Virtual Machine though, +see \url{https://github.com/SyneRBI/SIRF-SuperBuild/blob/master/VirtualBox/documentation/README.md}{its documentation}. + \section{ -Installation} +Installation from source} This section describes how to install STIR. It is complemented by information on the \url{http://stir.sourceforge.net/wiki}{STIR Wiki} with information for specific systems etc. +Note that as opposed to using the instructions below, you can also +the \url{https://github.com/SyneRBI/SIRF-SuperBuild/blob/master/README.md}{SIRF-Superbuild} +of \url{https://www.ccpsynerbi.ac.uk/}{SyneRBI} to build STIR with CMake. This will take care of all dependencies. +Note that you will need to use advanced CMake variables \texttt{STIR\_BUILD\_EXECUTABLES=ON} +and \texttt{STIR\_BUILD\_SWIG\_PYTHON=ON}. + + \subsection{ Installing source files} @@ -156,26 +187,15 @@ \subsection{ \end{center} or from \url{https://github.com/UCL/STIR/releases}{github.com/UCL/STIR/releases}.\\ Alternatively, if you are feeling adventurous, you can get the most-recent -developer version (no guarantees!) of STIR from\\ +developer version (no guarantees!) of STIR from \url{https://github.com/UCL/STIR}{https://github.com/UCL/STIR}.\\ -Download the source files in the zip format. You can then use unzip from \\ -\url{http://www.info-zip.org/pub/infozip/}{http://www.info-zip.org/pub/infozip/}. -Extract using -\cmdline{unzip -a file.zip} - - -The \texttt{-a} option makes sure that files are extracted using the -end-of-line convention appropriate for your system. Note that -other programs that can handle zip files (such as WinZip) should -work as well, although you might have problems with the EOL convention. - Note that you can put the distribution in any location (it does not have to be your home directory). -The result is a \textbf{STIR} directory and subdirectories, described -in the annex section. +After unpacking, you should have a \textbf{STIR} directory (subdirectories are described +in the doxygen documentation). \subsection{ Installing external software} @@ -183,6 +203,13 @@ \subsection{ On most systems, you should be able to get these using your package manager. Please check the Wiki for most up-to-date information. +\subsubsection{ +C++ Compiler} + +In order to compile and run the \textit{STIR} programs, you will need a compiler +and associated tools such as \texttt{CMake}. These days, any compiler should work. We would love +to hear from any attempts where there are failures. + \subsubsection{BOOST} The only required external library is the well-respected \textit{boost} library. If it is not installed on your system, you can download it from @@ -195,29 +222,19 @@ \subsubsection{BOOST} \subsubsection{JSON} The \texttt{HUToMu} and \texttt{Radionuclide} database functionality parse a file in JSON format. We use the \url{https://github.com/nlohmann/json}{nlohman\_json} library for this. Installation -instructions for this library are available on its github page. +instructions for this library are available on its github page or you can get it via \texttt{conda}. +Without it, we only support a few basic radionuclides. \subsubsection{ -C++ Compiler} +Enabling ECAT 7 support\label{sec:ECAT67support}} +{\em ECAT7 support is no longer tested.} -In order to compile and run the \textit{STIR} programs, you will need a compiler -and associated tools. These days, any compiler should work. See the -\url{http://sourceforge.net/stir}{STIR Wiki} for more -specific information of which compilers we have tried. -We would love -to hear from any attempts of using another compiler. - -\subsubsection{ -Enabling ECAT 7 support} -\label{sec:ECAT67support} Older CTI (Siemens) scanners use a file format called ECAT\texttrademark{}. At present, \textit{STIR} uses parts of the Louvain la Neuve ecat library (called LLN in the rest of this document).\footnote{\textit{STIR} versions 1.? came with specific files for ECAT6 support without the need for the LLN library. However, due to license restrictions this is now no longer the case.} -The library might still be available on -\url{ftp://ftp.topo.ucl.ac.be/pub/ecat }{ftp://ftp.topo.ucl.ac.be/pub/ecat}. -It is also available for GATE users. +The library could be available on the OpenGATE website. You have to download that library and issue 'make --f Makefile.unix' (or 'make --f Makefile.cygwin' if you are using CYGWIN on Windows) @@ -235,10 +252,26 @@ \subsubsection{ For most operating systems this can be done via your package manager which we highly recommend. You could also download from the \url{https://www.hdfgroup.org/downloads/hdf5/}{HDF5 group download page}. +\subsubsection{ +Enabling ROOT support\label{sec:installROOT}} +STIR can read CERN ROOT files from GATE (see section \ref{sec:ROOTIO}). Check the \url{https://root.cern/install/}{installation instructions for ROOT}. + +\subsubsection{ +Enabling ITK support\label{sec:installITK}} +STIR can use \url{http://www.itk.org}{ITK}, a large open source library. Specifying this + enables NRRD, MetaIO and Nifti IO, and DICOM reading. + Use your package manager, including conda or pip, or check the \url{https://itk.org/download/}{installation instructions for ITK}. + +\subsubsection{ +Enabling AVW support\label{sec:installAVW}} +AVW was the library used by the commercial program \url{https://analyzedirect.com/}{Analyze}. +\textit{AVW support has not been tested since about 2010 and we have no idea of STIR still builds with it.} AVW support will be dropped in STIR 6.0. +See \ref{sec:convAVW} for usage. + \subsection{ Building} Since version 2.2, \textit{STIR} contains files to build STIR using the platform-independent -\url{"http://www.cmake.org"}{CMake}. This is now the only to build STIR as +\url{"http://www.cmake.org"}{CMake}. This is now the only option to build STIR as it is easier for configuration and finding system dependencies. \subsubsection{ Using CMake} @@ -309,10 +342,6 @@ \subsubsection{ % ROW {\raggedright \textit{STIR\_OPENMP}} & {\raggedright Toggles between ON, OFF. Enable threaded processing using OPENMP. -\footnote{Since version 2.0, \textit{STIR} contains preliminary code for running \texttt{FBP2D} in threaded mode -(contribution by Tobias Beisel, Univ. of Paderborn). You need a compiler that -supports \texttt{OPENMP}. Note however, that this code doesn't presently result -in a decent speed-up of \texttt{FBP2D}.} See section \ref{sec:RunningWithOPENMP} for information on how to run programs using OPENMP. } \\ \hline @@ -347,14 +376,13 @@ \subsubsection{ capabilities of STIR. \begin{itemize} \item LLN files for ECAT support via \texttt{LLN\_INCLUDE\_DIRS} and \texttt{LLN\_LIBRARIES}. -\item AVW\texttrademark{} (a commercial library\footnote{See \url{http://www.mayo.edu/bir/Software/AVW/AVW1.html} -{www.mayo.edu/bir/Software/AVW/AVW1.html}.}) -via \texttt{AVW\_ROOT\_DIR}. See section \ref{sec:convAVW} for usage.\\ -\textit{AVW support has not been tested since about 2010.} -\item ITK\_DIR, use IO from \url{http://www.itk.org}{ITK}, a large open source library. Specifying this - enables NRRD, MetaIO and Nifti IO. +See section \ref{sec:ECAT67support}. +\item AVW\texttrademark{} [deprecated] (a commercial library, probably no longer available) +via \texttt{AVW\_ROOT\_DIR}. See section \ref{sec:installAVW}. +\item ITK\_DIR, use IO from ITK, see section \ref{sec:installITK}. \item CERN ROOT files used by GEANT and GATE via \texttt{ROOT\_DIR}. If this is not set, we will try to get it from the \texttt{ROOTSYS} environment (or CMake) variable. + See \ref{sec:installROOT}. \item GE RDF\texttrademark{} 9 support via \texttt{HDF5\_ROOT} and related variables (requires the HDF5 library). \end{itemize} @@ -371,14 +399,15 @@ \subsubsection{ \item \textit{CMAKE\_CXX\_STANDARD} can be used to tell CMake to add flags to your compiler to use a particular version of the C++ standard (if it supports it). It is set to \texttt{11} since STIR 5.0. Other possible allowed values are -\texttt{14} and \texttt{17}. More recent version have not yet been tested. +\texttt{14}, \texttt{17} and \textit{20}. More recent version have not yet been tested. \end{itemize} When building the Python code, and you have multiple versions of Python installed, it is often necessary to specify the correct Python executable that you want, together with -the libraries. You can use the \texttt{PYTHON\_EXECUTABLE} variable for this. If you -specify the full path to the actual executable, this should be sufficient. If not, set -\texttt{PYTHON\_LIBRARY} as well. +the libraries. You can use the \texttt{Python\_EXECUTABLE} variable for this. If you +specify the full path to the actual executable, this should be sufficient. +\footnote{If you are using CMake 3.13 or older, use \texttt{PYTHON\_EXECUTABLE}. +In this case, you might have to set \texttt{PYTHON\_LIBRARY} as well.} There are various other variables that can be set, some of which are only visible if you toggled the display of \texttt{Advanced} variables on. They should only be set by advanced users, or if a package @@ -5723,12 +5752,12 @@ \section{Using STIR in an external C++ project \label{sec:ExternalProjectC++}} STIR exports its CMake settings. Therefore, an external project can do \begin{verbatim} -find_package(STIR 5.1 CONFIG) +find_package(STIR 5.2 CONFIG) add_library(my_lib file1.cxx file2.cxx) # my_lib uses STIR functionality -target_link_libraries(my_lib ${STIR_LIBRARIES}) +target_link_libraries(my_lib PUBLIC ${STIR_LIBRARIES}) add_executable(my_exe my_exe.cxx ${STIR_REGISTRIES}) -target_link_libraries(my_exe my_lib) +target_link_libraries(my_exe PUBLIC my_lib) \end{verbatim} In addition, if your CMake is older than 3.12, you need to add \begin{verbatim} @@ -5749,20 +5778,9 @@ \section{ The \textit{STIR} library, in its current state, possesses many capabilities. The developers, however, look forward to still further increases -in the flexibility and power of the software. Some of the developments -being discussed are: - -\begin{itemize} -\item -expanded library of polymorphic classes (e.g. image grids, and -ordered subsets) -\item -additional scanners, also for SPECT -\item -additional data formats support, without conversion to Interfile. -\item -point-spread function reconstruction -\end{itemize} +in the flexibility and power of the software. +Please check the \url{https://github.com/UCL/STIR/milestones}{GitHub milestones} +for some information. While support for the library is on a voluntary basis, users @@ -5771,35 +5789,12 @@ \section{ \url{http://stir.sourceforge.net/ }{http://stir.sourceforge.net}) where they can follow developments of the software and obtain helpful information from other users. Questions will ONLY be -answered (if at all) when directed to the mailing list. +answered (if at all) when creating a \url{https://github.com/UCL/STIR/issues}{GitHub issue} (preferred) or +when directed to the mailing list. Commercial support is available from \url{http://asc.uk.com}{Algorithms and Software Consulting Ltd}. -Below, we list of some of the features that might make it into the next releases. -However, which feature is actually finalised/implemented depends -on the needs of the developers. If you want one of these features -and are willing to help, let us know. -\begin{itemize} -\item -More automatic testing programs -\item -More algorithms: potentially ART, -OSCB [Ben99b] -\item -More projectors -\item -More priors -\item -Extending the parallelisation of OSMAPOSL and OSSPS to FBP3DRP etc, or using OPEMMP -\item -Compatibility of the interpolating backprojector with recent -processors. -\item -More kinetic models: Spectral Analysis, Logan Plot -\end{itemize} - - diff --git a/documentation/STIR-general-overview.tex b/documentation/STIR-general-overview.tex index ca233c4afb..28d8b8626b 100644 --- a/documentation/STIR-general-overview.tex +++ b/documentation/STIR-general-overview.tex @@ -17,7 +17,7 @@ \textbf{{\huge STIR \\ General Overview}}\\ \textbf{Kris Thielemans}\\ -\textbf{\textit{version 2.3}} +\textbf{\textit{version 5.2}} \end{spacing} @@ -57,18 +57,21 @@ \section{ Disclaimer} Many names used below are trademarks owned by various companies. They are -is fully acknowledged, but not explicitly stated. +fully acknowledged, but not explicitly stated. + +This document has been brought somewhat up-to-date for version 5.2, but there is more work to do. \section{ Overview} STIR (\textit{Software for Tomographic Image Reconstruction}) is Open Source software (written in C++) consisting of classes, functions -and utilities for 3D PET image reconstruction, although it is +and utilities for 3D PET and SPECT image reconstruction, although it is general enough to accommodate other imaging modalities. An overview of STIR 2.x is given in [Thi12], which you ideally refer to in your paper. +See the STIR website for more details on how to reference STIR, depending on which functionality you use. -STIR consists of 2 parts. +STIR consists of 3 parts. \begin{itemize} \item A library providing building blocks for image and projection @@ -76,6 +79,7 @@ \section{ \item Applications using this library including basic image manipulations, file format conversions and of course image reconstructions. +\item Python interface to the library via SWIG. \end{itemize} The library has been designed so that it can be used for many @@ -85,8 +89,8 @@ \section{ yet. This will enable the software to be run not only on single processors, but also on massively parallel computers, or on clusters of workstations. \\ -STIR is portable on all systems supporting the GNU C++ compiler -or MS Visual C++ (or hopefully any ANSI C++ compliant compiler). +STIR is portable on all systems supporting the GNU C++ compiler, CLang++, Intel C++, +or MS Visual C++ (or hopefully any C++-11 compliant compiler). The library is fully documented.\\ The object-oriented features make this library very modular and flexible. This means that it is relatively easy to add new algorithms, @@ -94,17 +98,16 @@ \section{ It is even possible to select at run-time which version of these components you want to use.\\ The software is \textbf{freely available} for downloading under the -GNU LPGL (the library) or GNU GPL (the applications) license, -see the 'Registration' section of our web-site. \\ +Apache 2.0 license.\\ \textbf{It is the hope of the collaborators of the STIR project that -other researchers in the PET community will use this library +other researchers in the PET and SPECT will use this library for their own work, extending it and making their work available as well.} Please subscribe to some of our mailing lists if you are interested. \\ In its current status, the software is mainly a research tool. It is probably not friendly enough to use in a clinical setting. In any case, \textbf{STIR should not be used to generate images for diagnostic -purposes}, as there is no warranty, and most definitely no FDA approval +purposes}, as there is no warranty, and most definitely no FDA approval nor CE marking @@ -132,10 +135,7 @@ \section{ algorithm type, etc.); \item multi-dimensional arrays (any dimension) with various operations, including numeric manipulations; -\item reading and writing (I/O) data in Interfile format (for -which a 3D PET extension is proposed), reading of GE Advance -sinogram data, limited reading and writing of ECAT6 and ECAT7 -and conversion between ECAT6 and Interfile; +\item reading of various raw data as well as writing in Interfile format; \item classes of projection data (complete data set, segments, sinograms, viewgrams) and images (2D and 3D); \item various filter transfer functions (1D, 2D and 3D); @@ -156,7 +156,7 @@ \section{ \begin{figure}[htbp] \begin{center} \includegraphics[width=5.667in, height=1.137in]{graphics/STIR-general-overviewFig1} -\caption{Current hierarchy for back projectors.} +\caption{Somewhat outdated hierarchy for back projectors.} \end{center} \end{figure} @@ -193,7 +193,7 @@ \subsection{FBP} \subsection{3DRP} The 3DRP [Kin89] algorithm is often considered the 'reference' algorithm for 3D PET. It is a 3D FBP algorithm which uses reprojection -to fill in the missing data. +to fill in the missing data. However, this is not actively maintained anymore. \subsection{ Ordered Subsets Maximum A Posteriori using the One Step Late @@ -203,11 +203,7 @@ \subsection{ its accelerated variant OSEM (Ordered Set Expectation Maximization) [Hud94] are iterative methods for computing the maximum likelihood estimate of the tracer distribution based on the measured projection -data. Their benefits have been examined in various reports. Notably, -it has been found (e.g. [Rea98b]) that 3D OSEM can produce images -of higher quality, in terms of both resolution and contrast, -than analytic algorithms of common commercial use such as the -reprojection (3DRP) algorithm [Kin89]. +data. One drawback of OSEM is its tendency to develop noise artefacts with increasing iterations. As a remedy, various modifications @@ -371,47 +367,17 @@ \section{ \section{ Currently supported systems} - -These are the systems we tested our software on. We think that -it will work in other cases as well with minor tuning. Experience -will tell\dots - - - -\subsection{ -Computing platforms} +We regularly run STIR on Lniux, MacOS and Windows. Check our GitHub Actions +and Appveyor for details. -\subsubsection{ -Serial versions of algorithms} -A lot of STIR was developed kust before 2000. Therefore, the code -contains in various places work-arounds for deficient C++ compilers -(e.g. GNU g++ 2.95.2 or Microsoft Visual C++ 6.0 service pack 3). -However, we are no longer -testing STIR on such older systems. It might be possible to revive this, -but we strongly recommend that you get a recent compiler instead. -\begin{itemize} -\item -Intel based PCs using Windows XP or higher (NT probably still works if you -find a compiler for it). These were tested with Microsoft Visual C++ 2003, 2005 up to -Visual Studio 2010, -and various GNU g++ versions (up to at least 4.5.3) via CYGWIN (http://cygwin.com). -\item -Linux using GNU g++ (from 3.5 to 4.6). -Intel's C++ compiler 12.1.0 works fine (tested on Linux), older versions had some problems with the Fourier transform code but the reconstruction itself was fine. -\item -MacOS using GNU g++. -\end{itemize} -However, people run STIR on various other systems, including Solaris. Please -check the mailing lists. - \textbf{Warning}: We currently have a problem in the incremental backprojection routines due to different rounding -of floating point calculations on Sparc, HP and Opteron processors. -Thanks to a fix of Bing Bai this problem might have disappeared on your processor, but it is still there on recent 64-bit processors. +of floating point calculations. You will find out if this problem still exists when you run the recon\_text\_pack available on the STIR web-site. Please let us know. +This currently only affects the FBP routines. See the User's Guide for how to use another backprojector. @@ -419,7 +385,8 @@ \subsubsection{ Parallel versions of algorithms} \begin{itemize} \item a parallel version of \texttt{OSMAPOSL} and \texttt{OSSPS} using MPI -\item a threaded version of FBP2D using OPENMP, but for most systems, there is no performance gain. +\item OpenMP versions of many functions +\item CUDA versions for NiftyPET and parallelproj \end{itemize} @@ -427,18 +394,7 @@ \subsubsection{ \subsection{ PET scanners} -\begin{itemize} -\item -GE Advance, Discovery LS, Discovery ST, Discvoery STE, Discovery RX, -Discovery 600 -\item -PRT-1 -\item -ECAT 921, 931, 953, 951, 962, 966 (and most other ECAT systems) -\item -HRRT apparently works as well -\item Philips Allegro (using its convention of having a ``virtual'' extra crystal to cover the gaps). -\end{itemize} +See \texttt{buildblock/Scanners.cxx}. Other cylindrical PET scanners can easily be added. This can be done without modifying the code (see the Wiki). @@ -449,37 +405,27 @@ \subsection{ \begin{itemize} \item An extension of the Interfile standard (see the ''Other info'' section of the STIR website.) +\item +ITK can be used to read many image file formats +\item Siemens ``interfile-like'' data +\item GE RDF9 (if you have the HDF5 libraries) \item The commercial AnalyzeAVW library from the BIR, Mayo University, can be used -to read images via a conversion utility. +to read images via a conversion utility. This will be dropped in version 6.0. \item -GE Advance VOLPET sinogram format, but for reading only (with -very limited support for the header). If you have a research contract with GE, -you might be able to get a STIR extension to read Discovery ST, STE and RX data in both -VOLPET and RDF format. +GE Advance VOLPET sinogram format, but for reading only. This will be dropped in version 6.0. \item -ECAT 7 matrix format for reading only (for reading multiple -frames/gates, an Interfile -header has to be created using a utility we provide). Single -frame/gate/bed images can be directly read or written. Single -frame/gate/bed sinograms can be directly read. +ECAT 7 matrix format for reading only might work but is no longer supported. However, this file format needs the ECAT Matrix library (developed previously by M. Sibomana and C. Michel at Louvain la Neuve, Belgium). This library is no longer maintained however. -\item -ECAT 6 matrix format was supported in previous version of STIR, but -is currently broken on some systems (probably due to a bug in the ECAT -MATRIX library for ECAT 6). ECAT6 was supported by using conversion -utilities to and from -Interfile. Single frame/gate/bed images could be directly read -or written. \end{itemize} See the User's Guide for more detail on the supported file formats.\\ In addition, a separate set of classes is avalailable to read list-mode data. Only a few scanners are currently supported (such as the -ECAT HR+ and HR++), although it should not be too difficult to +ECAT HR+ and HR++, GE RDF9, Siemens mMR and SAFIR), although it should not be too difficult to add your own (if you know the list-mode file format!). diff --git a/documentation/release_5.2.htm b/documentation/release_5.2.htm index 550c1ed137..91258cb749 100644 --- a/documentation/release_5.2.htm +++ b/documentation/release_5.2.htm @@ -141,7 +141,7 @@

    Changed functionality

-

Deprecated functionality

+

Deprecated functionality and upcoming changes to required tool versions

  • The following functions (previously used for upsampling the scatter estimate) have been made obsolete or replaced, and will be removed in STIR version 6.0.0: interpolate_axial_position, extend_sinogram_in_views and extend_segment_in_views @@ -150,12 +150,14 @@

    Deprecated functionality

    and should be replaced by their respective versions that use SegmentIndices, ViewgramIndices or SinogramIndices. The former will not be compatible with TOF information that will be introduced in version 6.0.0.
  • -
  • STIR version 6.0.0 will require C++ 14 (currently we require C++ 11, but already support C++ 20).
  • +
  • Use of the AVW library to read Analyze files will be removed in 6.0, as this has not been checked in more than 15 years. Use ITK instead.
  • +
  • GE VOLPET and IE support will be removed in 6.0, as we have no files to test this, and it's obsolete anyway.
  • +
  • STIR version 6.0.0 will require C++ 14 (currently we require C++ 11, but already support C++ 20) and CMake 3.14.

Build system and dependencies

    -
  • CMake 3.12 is now required on Windows. (It will be required on all platforms in STIR 6.0).
  • +
  • CMake 3.12 is now required on Windows.
  • We now use CMake's OBJECT library feature for the registries. This avoids re-compilation of the registries for every executable and therefore speeds-up building time. Use of STIR in an external project is not affected as long as the recommended practice was followed. This is now documented in the User's Guide.
    PR #1141.
  • From 6ae96eaebd57d4252ee05306f7284cfa509b2e8d Mon Sep 17 00:00:00 2001 From: Kris Thielemans Date: Sun, 29 Oct 2023 21:50:07 +0000 Subject: [PATCH 4/9] updated version number to 5.2.0 --- CMakeLists.txt | 6 +++--- VERSION.txt | 2 +- recon_test_pack/run_ML_norm_tests.sh | 12 ++---------- recon_test_pack/run_root_GATE.sh | 2 +- recon_test_pack/run_scatter_tests.sh | 2 +- recon_test_pack/run_test_listmode_recon.sh | 2 +- recon_test_pack/run_test_simulate_and_recon.sh | 2 +- .../run_test_simulate_and_recon_with_motion.sh | 2 +- recon_test_pack/run_test_zoom_image.sh | 2 +- recon_test_pack/run_tests.sh | 2 +- recon_test_pack/simulate_PET_data_for_tests.sh | 2 +- 11 files changed, 14 insertions(+), 22 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index cec25b64b3..2873ad6dc5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -56,9 +56,9 @@ endif() ####### Set Version number etc set(VERSION_MAJOR 5) -set(VERSION_MINOR 1) -set(VERSION_PATCH 2) -set(VERSION 050102) # only used in STIRConfig.h.in +set(VERSION_MINOR 2) +set(VERSION_PATCH 0) +set(VERSION 050200) # only used in STIRConfig.h.in set(STIR_VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}) diff --git a/VERSION.txt b/VERSION.txt index 61fcc87350..91ff57278e 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -1 +1 @@ -5.1.2 +5.2.0 diff --git a/recon_test_pack/run_ML_norm_tests.sh b/recon_test_pack/run_ML_norm_tests.sh index bb4199f3b2..73b3f342f7 100755 --- a/recon_test_pack/run_ML_norm_tests.sh +++ b/recon_test_pack/run_ML_norm_tests.sh @@ -10,22 +10,14 @@ # Copyright (C) 2013, 2020, 2021 University College London # This file is part of STIR. # -# This file is free software; you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation; either version 2.1 of the License, or -# (at your option) any later version. - -# This file is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. +# SPDX-License-Identifier: Apache-2.0 # # See STIR/LICENSE.txt for details # # Author Kris Thielemans # -echo This script should work with STIR version 5.0. If you have +echo This script should work with STIR version 5.2. If you have echo a later version, you might have to update your test pack. echo Please check the web site. echo diff --git a/recon_test_pack/run_root_GATE.sh b/recon_test_pack/run_root_GATE.sh index 0eb0f29c68..070da72cae 100755 --- a/recon_test_pack/run_root_GATE.sh +++ b/recon_test_pack/run_root_GATE.sh @@ -11,7 +11,7 @@ # # Author Nikos Efthimiou, Kris Thielemans -echo This script should work with STIR version ">"3.0. If you have +echo This script should work with STIR version 5.2. If you have echo a later version, you might have to update your test pack. echo Please check the web site. echo diff --git a/recon_test_pack/run_scatter_tests.sh b/recon_test_pack/run_scatter_tests.sh index 8a2ee00f00..8dd29343bb 100755 --- a/recon_test_pack/run_scatter_tests.sh +++ b/recon_test_pack/run_scatter_tests.sh @@ -13,7 +13,7 @@ # Author Kris Thielemans # -echo This script should work with STIR version 5.1. If you have +echo This script should work with STIR version 5.1 and 5.2. If you have echo a later version, you might have to update your test pack. echo Please check the web site. echo diff --git a/recon_test_pack/run_test_listmode_recon.sh b/recon_test_pack/run_test_listmode_recon.sh index 5003040a8b..e3d1ece552 100755 --- a/recon_test_pack/run_test_listmode_recon.sh +++ b/recon_test_pack/run_test_listmode_recon.sh @@ -20,7 +20,7 @@ if [ -n "$TRAVIS" -o -n "$GITHUB_WORKSPACE" ]; then set -e fi -echo This script should work with STIR version ">=" 5.1. If you have +echo This script should work with STIR version 5.1 and 5.2. If you have echo a later version, you might have to update your test pack. echo Please check the web site. echo diff --git a/recon_test_pack/run_test_simulate_and_recon.sh b/recon_test_pack/run_test_simulate_and_recon.sh index d955c58142..b277fa3fe5 100755 --- a/recon_test_pack/run_test_simulate_and_recon.sh +++ b/recon_test_pack/run_test_simulate_and_recon.sh @@ -19,7 +19,7 @@ if [ -n "$TRAVIS" -o -n "$GITHUB_WORKSPACE" ]; then set -e fi -echo This script should work with STIR version 2.2, 2.3, 2.4 and 3.0. If you have +echo This script should work with STIR version 5.2. If you have echo a later version, you might have to update your test pack. echo Please check the web site. echo diff --git a/recon_test_pack/run_test_simulate_and_recon_with_motion.sh b/recon_test_pack/run_test_simulate_and_recon_with_motion.sh index 61fda54345..46527cc989 100755 --- a/recon_test_pack/run_test_simulate_and_recon_with_motion.sh +++ b/recon_test_pack/run_test_simulate_and_recon_with_motion.sh @@ -21,7 +21,7 @@ if [ -n "$TRAVIS" -o -n "$GITHUB_WORKSPACE" ]; then set -e fi -echo This script should work with STIR version 2.4 and 3.0. If you have +echo This script should work with STIR version 5.2. If you have echo a later version, you might have to update your test pack. echo Please check the web site. echo diff --git a/recon_test_pack/run_test_zoom_image.sh b/recon_test_pack/run_test_zoom_image.sh index d46aa80c9f..d53a2280a6 100755 --- a/recon_test_pack/run_test_zoom_image.sh +++ b/recon_test_pack/run_test_zoom_image.sh @@ -18,7 +18,7 @@ if [ -n "$TRAVIS" -o -n "$GITHUB_WORKSPACE" ]; then set -e fi -echo This script should work with STIR version 4.0. If you have +echo This script should work with STIR version 5.2. If you have echo a later version, you might have to update your test pack. echo Please check the web site. echo diff --git a/recon_test_pack/run_tests.sh b/recon_test_pack/run_tests.sh index 7d74b1761e..9aa41f4dff 100755 --- a/recon_test_pack/run_tests.sh +++ b/recon_test_pack/run_tests.sh @@ -19,7 +19,7 @@ if [ -n "$TRAVIS" -o -n "$GITHUB_WORKSPACE" ]; then set -e fi -echo This script should work with STIR version 2.1, 2.2, 2.3, 2.4 and 3.0. If you have +echo This script should work with STIR version 5.2. If you have echo a later version, you might have to update your test pack. echo Please check the web site. echo diff --git a/recon_test_pack/simulate_PET_data_for_tests.sh b/recon_test_pack/simulate_PET_data_for_tests.sh index 6c0d759f13..3eece2ba8a 100755 --- a/recon_test_pack/simulate_PET_data_for_tests.sh +++ b/recon_test_pack/simulate_PET_data_for_tests.sh @@ -17,7 +17,7 @@ # Author Kris Thielemans # -echo This script should work with STIR version 5.x. If you have +echo This script should work with STIR version 5.2. If you have echo a later version, you might have to update your test pack. echo Please check the web site. echo From 5c1cd22ad9cef592f9fdf855118e2f3549913712 Mon Sep 17 00:00:00 2001 From: Kris Thielemans Date: Sun, 29 Oct 2023 21:54:23 +0000 Subject: [PATCH 5/9] removed mention of Travis --- CONTRIBUTING.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7210cb7641..3c8ea7411a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -44,7 +44,6 @@ Please by mindful about the resources used by our Continuous Integration (CI) wo - Use specific keywords in the first line of the last commit that you push to prevent CI being run: - `[ci skip]` skips all CI runs (e.g. when you only change documentation, or when your update isn't ready yet) - `[actions skip]` does not run GitHub Actions, see [here](https://github.blog/changelog/2021-02-08-github-actions-skip-pull-request-and-push-workflows-with-skip-ci/). Note: this can be in the main commit message. - - `[travis skip]` does not run Travis-CI, see [here](https://docs.travis-ci.com/user/customizing-the-build/#skipping-a-build). Note: this can be in the main commit message. - `[skip appveyor]` does not run Appveyor, see [here](https://www.appveyor.com/docs/how-to/filtering-commits/#skip-directive-in-commit-message) 8. After acceptance of your PR, go home with a nice warm feeling. From e2a359a10033ffc45f61b969d9148f3bebb8c884 Mon Sep 17 00:00:00 2001 From: Kris Thielemans Date: Sun, 29 Oct 2023 21:58:16 +0000 Subject: [PATCH 6/9] add PR template --- .github/PULL_REQUEST_TEMPLATE.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000000..aed2641f0e --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,22 @@ + + +## Changes in this pull request + + +## Testing performed + + +## Related issues + + + +## Checklist before requesting a review + + - [] I have performed a self-review of my code + - [] I have added docstrings/doxygen in line with the guidance in the developer guide + - [] I have implemented unit tests that cover any new or modified functionality (if applicable) + - [] The code builds and runs on my machine + - [] `documentation/release_XXX.md` has been updated with any functionality change (if applicable) From 2086080978ad57bb6492b6a1a0905eecd60956d3 Mon Sep 17 00:00:00 2001 From: Kris Thielemans Date: Sun, 29 Oct 2023 22:03:22 +0000 Subject: [PATCH 7/9] update release 5.2.0 dates --- documentation/history.htm | 4 +++- documentation/release_5.2.htm | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/documentation/history.htm b/documentation/history.htm index 076f96d3b3..c4a258e8bb 100644 --- a/documentation/history.htm +++ b/documentation/history.htm @@ -11,6 +11,8 @@

    History of public releases of the STIR software

    The following links give you a summary what has changed. However, the ChangeLog is the definite (but tedious) information.
      +
    • version 5.2.0 (dated 30 October 2023)
    • +
    • version 5.1.2 (dated 10 September 2023)
    • version 5.1.1 (dated 26 Augustus 2023)
    • version 5.1.0 (dated 14 Jan 2023)
    • version 5.0.2 (dated 26 May 2022)
    • @@ -46,7 +48,7 @@

      History of public releases of the PARAPET software

      -Last modified: January 02 2023 +Last modified: 29 October 2023 diff --git a/documentation/release_5.2.htm b/documentation/release_5.2.htm index 91258cb749..287b2ae0c6 100644 --- a/documentation/release_5.2.htm +++ b/documentation/release_5.2.htm @@ -20,7 +20,7 @@

      Overall summary

      Patch release info

        -
      • 5.2.0 released ??/??/2023
      • +
      • 5.2.0 released 30/10/2023

      Summary for end users (also to be read by developers)

      From a92c5e5173b8d3dff3da2862da85127826c3bcd2 Mon Sep 17 00:00:00 2001 From: Kris Thielemans Date: Sun, 29 Oct 2023 23:31:49 +0000 Subject: [PATCH 8/9] corrected doxygen and removed some obsolete macros --- src/include/stir/common.h | 57 +++++++-------------------------------- 1 file changed, 9 insertions(+), 48 deletions(-) diff --git a/src/include/stir/common.h b/src/include/stir/common.h index c636c61f56..294404e19a 100644 --- a/src/include/stir/common.h +++ b/src/include/stir/common.h @@ -34,34 +34,23 @@
      • macros for namespace support: - #defines STIR_NO_NAMESPACES if the compiler does not support namespaces - #defines START_NAMESPACE_STIR etc. - -
      • #defines STIR_NO_COVARIANT_RETURN_TYPES when the compiler does not - support virtual functions of a derived class differing only in the return - type. - Define when your compiler does not handle the following: - \code - class A { virtual A* f();} - class B:A { virtual B* f(); } - \endcode + \c \#defines \c START_NAMESPACE_STIR etc. +
      • preprocessor definitions which attempt to determine the operating system this is going to run on. - use as #ifdef __OS_WIN__ ... #elif ... #endif + use as \c "#ifdef __OS_WIN__ ... #elif ... #endif" Possible values are __OS_WIN__, __OS_MAC__, __OS_VAX__, __OS_UNIX__ The __OS_UNIX__ case has 'subbranches'. At the moment we attempt to find out on __OS_AIX__, __OS_SUN__, __OS_OSF__, __OS_LINUX__. (If the attempts fail to determine the correct OS, you can pass the correct value as a preprocessor definition to the compiler) - -
      • #includes cstdio, cstdlib, cstring, cmath - -
      • a trick to get ANSI C++ 'for' scoping rules work for compilers - which do not follow the new standard - -
      • #ifdef STIR_ASSERT, then define our own assert, else include <cassert> +
      • +
      • \c \#includes cstdio, cstdlib, cstring, cmath +
      • +
      • \c \#ifdef \c STIR_ASSERT, then define our own assert, else include <cassert> +

      Speeding up std::copy

      @@ -69,6 +58,7 @@
      • For old compilers (check the source!), overloads of std::copy for built-in types to use memmove (so it's faster) +

      stir namespace members declared here

      @@ -83,8 +73,6 @@

      stir include files included here

      • stir/config.h sets various preprocessor defines (generated from STIRConfig.in)
      • -
      • stir/error.h defining stir::error
      • -
      • stir/warning.h defining stir::warning
      */ #include "stir/config.h" @@ -96,22 +84,12 @@ #include //*************** namespace macros -#ifndef STIR_NO_NAMESPACES - # define START_NAMESPACE_STIR namespace stir { # define END_NAMESPACE_STIR } # define USING_NAMESPACE_STIR using namespace stir; # define START_NAMESPACE_STD namespace std { # define END_NAMESPACE_STD } # define USING_NAMESPACE_STD using namespace std; -#else -# define START_NAMESPACE_STIR -# define END_NAMESPACE_STIR -# define USING_NAMESPACE_STIR -# define START_NAMESPACE_STD -# define END_NAMESPACE_STD -# define USING_NAMESPACE_STD -#endif //*************** define __OS_xxx__ @@ -239,23 +217,6 @@ END_NAMESPACE_STD #endif // #ifdef STIR_SPEED_UP_STD_COPY -//*************** for() scope trick - -/* ANSI C++ (re)defines the scope of variables declared in a for() statement. - Example: the 'i' variable has scope only within the for statement. - for (int i=0; ...) - do_something; - The next trick (by AZ) solves this problem. - At the moment, we only need it for VC++ - */ - -#if defined(STIR_ENABLE_FOR_SCOPE_WORKAROUND) -# ifndef for -# define for if (0) ; else for -# else -# error 'for' is already #defined to something -# endif -#endif //*************** assert From eccfd810d90632e9896e6d0e5e5681a210efd781 Mon Sep 17 00:00:00 2001 From: Kris Thielemans Date: Sun, 29 Oct 2023 23:48:29 +0000 Subject: [PATCH 9/9] reduce amount of doxygen warnings --- src/Doxyfile.in | 2 +- .../utilities/list_TAC_ROI_values.cxx | 2 +- src/include/stir/DetectorCoordinateMap.h | 2 +- src/include/stir/GeometryBlocksOnCylindrical.h | 10 +++++----- src/include/stir/HighResWallClockTimer.h | 3 ++- .../ForwardProjectorByBinUsingRayTracing.h | 4 ++-- src/include/stir/recon_buildblock/PLSPrior.h | 2 +- .../ProjMatrixByBinPinholeSPECTUB.h | 18 ++++-------------- .../ProjMatrixByBinUsingRayTracing.h | 4 ++-- .../modelling/BloodFrameData.inl | 3 ++- .../motion/RigidObject3DTransformation.h | 2 +- ...MatrixByDenselOnCartesianGridUsingElement.h | 4 ++-- .../ProjMatrixByDenselUsingRayTracing.h | 4 ++-- ...ProjectorByBinUsingInterpolation_linear.cxx | 2 +- ...yBinUsingInterpolation_piecewise_linear.cxx | 2 +- 15 files changed, 28 insertions(+), 36 deletions(-) diff --git a/src/Doxyfile.in b/src/Doxyfile.in index 612be456c8..9325caa4ec 100644 --- a/src/Doxyfile.in +++ b/src/Doxyfile.in @@ -853,7 +853,7 @@ EXAMPLE_RECURSIVE = NO # that contain images that are to be included in the documentation (see the # \image command). -IMAGE_PATH = @PROJECT_SOURCE_DIR@/../doximages +IMAGE_PATH = @PROJECT_SOURCE_DIR@/doximages # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program diff --git a/src/experimental/utilities/list_TAC_ROI_values.cxx b/src/experimental/utilities/list_TAC_ROI_values.cxx index de1d8a80af..cd739302b2 100644 --- a/src/experimental/utilities/list_TAC_ROI_values.cxx +++ b/src/experimental/utilities/list_TAC_ROI_values.cxx @@ -23,7 +23,7 @@ \param output_filename a text file sorted in list form of: | Frame_num | Start Time | End Time | Mean | StdDev | CV | \param data_filename should be in ECAT7 format. \param --CV is used to output the Coefficient of Variation as well. - \Note When ROI_filename.par is not given, the user will be asked for the parameters. + Note: When ROI_filename.par is not given, the user will be asked for the parameters. The .par file has the following format \verbatim diff --git a/src/include/stir/DetectorCoordinateMap.h b/src/include/stir/DetectorCoordinateMap.h index 0aac7c2359..ecc79bf199 100644 --- a/src/include/stir/DetectorCoordinateMap.h +++ b/src/include/stir/DetectorCoordinateMap.h @@ -47,7 +47,7 @@ class Succeeded; ring,detector,(layer,)x,y,z An empty line will terminate the reading at that line. - Optionally LOR end-points can be randomly displaced using a Gaussian distribution with standard deviation \sigma (in mm). + Optionally LOR end-points can be randomly displaced using a Gaussian distribution with standard deviation sigma (in mm). */ class DetectorCoordinateMap { diff --git a/src/include/stir/GeometryBlocksOnCylindrical.h b/src/include/stir/GeometryBlocksOnCylindrical.h index a14f5cea5f..fba4b1802d 100644 --- a/src/include/stir/GeometryBlocksOnCylindrical.h +++ b/src/include/stir/GeometryBlocksOnCylindrical.h @@ -36,12 +36,12 @@ START_NAMESPACE_STIR \ingroup projdata \brief A helper class to build the crystal map based on scanner info. - \This class builds two maps between cartesian coordinates (z, y, x) - \ and the corresponding detection position (tangential_num, axial_num, radial_num) for each crystal. - \The crystal map, then, is used in ProjDataInfoBlocksOnCylindrical, ProjDataInfoBlocksOnCylindricalNoArcCorr, and CListRecordSAFIR + This class builds two maps between cartesian coordinates (z, y, x) + and the corresponding detection position (tangential_num, axial_num, radial_num) for each crystal. + The crystal map, then, is used in ProjDataInfoBlocksOnCylindrical, ProjDataInfoBlocksOnCylindricalNoArcCorr, and CListRecordSAFIR - \The center of first ring is the center of coordinates. - \Distances are from center to center of crystals. + The center of first ring is the center of coordinates. + Distances are from center to center of crystals. */ diff --git a/src/include/stir/HighResWallClockTimer.h b/src/include/stir/HighResWallClockTimer.h index a723465790..eb1ce6a6bc 100644 --- a/src/include/stir/HighResWallClockTimer.h +++ b/src/include/stir/HighResWallClockTimer.h @@ -17,7 +17,8 @@ \author Alexey Zverovich \author PARAPET project - +*/ +/* Modification history: diff --git a/src/include/stir/recon_buildblock/ForwardProjectorByBinUsingRayTracing.h b/src/include/stir/recon_buildblock/ForwardProjectorByBinUsingRayTracing.h index ad14ccfde0..b6a36ff389 100644 --- a/src/include/stir/recon_buildblock/ForwardProjectorByBinUsingRayTracing.h +++ b/src/include/stir/recon_buildblock/ForwardProjectorByBinUsingRayTracing.h @@ -44,8 +44,8 @@ class ProjDataInfoCylindrical; \brief This class implements forward projection using Siddon's algorithm for ray tracing. That is, it computes length of intersection with the voxels. - Currently, the LOIs are divided by voxel_size.x(), unless NEWSCALE is - #defined during compilation time of ForwardProjectorByBinUsingRayTracing_Siddon.cxx. + Currently, the LOIs are divided by voxel_size.x(), unless \c NEWSCALE is + \c \#defined during compilation time of ForwardProjectorByBinUsingRayTracing_Siddon.cxx. If the z voxel size is exactly twice the sampling in axial direction, multiple LORs are used, to avoid missing voxels. (TODOdoc describe how). diff --git a/src/include/stir/recon_buildblock/PLSPrior.h b/src/include/stir/recon_buildblock/PLSPrior.h index f2e363991d..018d47c44c 100644 --- a/src/include/stir/recon_buildblock/PLSPrior.h +++ b/src/include/stir/recon_buildblock/PLSPrior.h @@ -48,7 +48,7 @@ START_NAMESPACE_STIR \phi(f) = \sqrt{\alpha^2 + |\nabla f|^2 - {\langle\nabla f,\xi\rangle}^2} \f] where \f$ f \f$ is the PET image, - \f$\nabla \f$ is the finite difference operator (\textrm{not} taking voxel-sizes into account) and + \f$\nabla \f$ is the finite difference operator (\b not taking voxel-sizes into account) and \f$ \xi \f$ is the normalised gradient of the anatomical image calculated as follows: \f[ diff --git a/src/include/stir/recon_buildblock/ProjMatrixByBinPinholeSPECTUB.h b/src/include/stir/recon_buildblock/ProjMatrixByBinPinholeSPECTUB.h index 44d3ad2c23..1b584356b6 100644 --- a/src/include/stir/recon_buildblock/ProjMatrixByBinPinholeSPECTUB.h +++ b/src/include/stir/recon_buildblock/ProjMatrixByBinPinholeSPECTUB.h @@ -3,17 +3,7 @@ Copyright (C) 2021, University College London This file is part of STIR. - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. + SPDX-License-Identifier: Apache-2.0 See STIR/LICENSE.txt for details */ @@ -53,7 +43,7 @@ class Bin; \warning this class currently only works with VoxelsOnCartesianGrid. - \Sample parameter file + \par Sample parameter file \verbatim Projection Matrix By Bin Pinhole SPECT UB Parameters:= @@ -83,7 +73,7 @@ class Bin; End Projection Matrix By Bin Pinhole SPECT UB Parameters:= \endverbatim - \Sample detector file + \par Sample detector file \verbatim Information of detector @@ -104,7 +94,7 @@ class Bin; \#…………until here……………\# \endverbatim - \Sample collimator file + \par Sample collimator file \verbatim Information of collimator Comments are allowed here or anywhere in lines not containing parameters. diff --git a/src/include/stir/recon_buildblock/ProjMatrixByBinUsingRayTracing.h b/src/include/stir/recon_buildblock/ProjMatrixByBinUsingRayTracing.h index 6fb89f8af4..54784c2b72 100644 --- a/src/include/stir/recon_buildblock/ProjMatrixByBinUsingRayTracing.h +++ b/src/include/stir/recon_buildblock/ProjMatrixByBinUsingRayTracing.h @@ -38,8 +38,8 @@ class ProjDataInfo; \brief Computes projection matrix elements for VoxelsOnCartesianGrid images by using a Length of Intersection (LOI) model. - Currently, the LOIs are divided by voxel_size.x(), unless NEWSCALE is - #defined during compilation time of ProjMatrixByBinUsingRayTracing.cxx. + Currently, the LOIs are divided by voxel_size.x(), unless \c NEWSCALE is + \c \#defined during compilation time of ProjMatrixByBinUsingRayTracing.cxx. It is possible to use multiple LORs in tangential direction. The result will then be the average of the various contributions. Currently all these diff --git a/src/include/stir_experimental/modelling/BloodFrameData.inl b/src/include/stir_experimental/modelling/BloodFrameData.inl index e526910fe0..5fd4a1a1df 100644 --- a/src/include/stir_experimental/modelling/BloodFrameData.inl +++ b/src/include/stir_experimental/modelling/BloodFrameData.inl @@ -25,7 +25,8 @@ START_NAMESPACE_STIR BloodFrameData::BloodFrameData() { } -//! constructor giving a vector //ChT::ToDO: Better to use iterators +//! constructor giving a vector +//ChT::ToDO: Better to use iterators BloodFrameData::BloodFrameData(const std::vector & blood_plot) {this->_blood_plot=blood_plot;} diff --git a/src/include/stir_experimental/motion/RigidObject3DTransformation.h b/src/include/stir_experimental/motion/RigidObject3DTransformation.h index c3432a83b9..7fc0aa723c 100644 --- a/src/include/stir_experimental/motion/RigidObject3DTransformation.h +++ b/src/include/stir_experimental/motion/RigidObject3DTransformation.h @@ -143,7 +143,7 @@ class RigidObject3DTransformation //! Transform bin from some projection data /*! Finds 'closest' (in some sense) bin to the transformed LOR. - if NEW_ROT is not #defined at compilation time, + if \c NEW_ROT is not \c \#defined at compilation time, it will throw an exception when arc-corrected data is used.*/ void transform_bin(Bin& bin,const ProjDataInfo& out_proj_data_info, const ProjDataInfo& in_proj_data_info) const; diff --git a/src/include/stir_experimental/recon_buildblock/ProjMatrixByDenselOnCartesianGridUsingElement.h b/src/include/stir_experimental/recon_buildblock/ProjMatrixByDenselOnCartesianGridUsingElement.h index 47baf865db..a1b8304b63 100644 --- a/src/include/stir_experimental/recon_buildblock/ProjMatrixByDenselOnCartesianGridUsingElement.h +++ b/src/include/stir_experimental/recon_buildblock/ProjMatrixByDenselOnCartesianGridUsingElement.h @@ -32,8 +32,8 @@ template class DiscretisedDensity; \brief Computes projection matrix elements for VoxelsOnCartesianGrid images by using a Length of Intersection (LOI) model. - Currently, the LOIs are divided by voxel_size.x(), unless NEWSCALE is - #defined during compilation time of ProjMatrixByDenselOnCartesianGridUsingElement.cxx. + Currently, the LOIs are divided by voxel_size.x(), unless \c NEWSCALE is + \c \#defined during compilation time of ProjMatrixByDenselOnCartesianGridUsingElement.cxx. If the z voxel size is exactly twice the sampling in axial direction, multiple LORs are used, to avoid missing voxels. (TODOdoc describe how). diff --git a/src/include/stir_experimental/recon_buildblock/ProjMatrixByDenselUsingRayTracing.h b/src/include/stir_experimental/recon_buildblock/ProjMatrixByDenselUsingRayTracing.h index e3bb0adef7..a1da9e19ec 100644 --- a/src/include/stir_experimental/recon_buildblock/ProjMatrixByDenselUsingRayTracing.h +++ b/src/include/stir_experimental/recon_buildblock/ProjMatrixByDenselUsingRayTracing.h @@ -32,8 +32,8 @@ class DataSymmetriesForDensels_PET_CartesianGrid; \brief Computes projection matrix elements for VoxelsOnCartesianGrid images by using a Length of Intersection (LOI) model. - Currently, the LOIs are divided by voxel_size.x(), unless NEWSCALE is - #defined during compilation time of ProjMatrixByDenselUsingRayTracing.cxx. + Currently, the LOIs are divided by voxel_size.x(), unless \c NEWSCALE is + \c \#defined during compilation time of ProjMatrixByDenselUsingRayTracing.cxx. If the z voxel size is exactly twice the sampling in axial direction, multiple LORs are used, to avoid missing voxels. (TODOdoc describe how). diff --git a/src/recon_buildblock/BackProjectorByBinUsingInterpolation_linear.cxx b/src/recon_buildblock/BackProjectorByBinUsingInterpolation_linear.cxx index 14782cb022..9061e5979e 100644 --- a/src/recon_buildblock/BackProjectorByBinUsingInterpolation_linear.cxx +++ b/src/recon_buildblock/BackProjectorByBinUsingInterpolation_linear.cxx @@ -9,7 +9,7 @@ stir::BackProjectorByBinUsingInterpolation, for the case of piecewise linear interpolation. - \warning This #includes BackProjectorByBinUsingInterpolation_3DCho.cxx + \warning This \c \#includes BackProjectorByBinUsingInterpolation_3DCho.cxx This very ugly way of including a .cxx file is used to avoid replication of a lot of (difficult) code. diff --git a/src/recon_buildblock/BackProjectorByBinUsingInterpolation_piecewise_linear.cxx b/src/recon_buildblock/BackProjectorByBinUsingInterpolation_piecewise_linear.cxx index 716d1cef8c..aa5ed32f44 100644 --- a/src/recon_buildblock/BackProjectorByBinUsingInterpolation_piecewise_linear.cxx +++ b/src/recon_buildblock/BackProjectorByBinUsingInterpolation_piecewise_linear.cxx @@ -9,7 +9,7 @@ stir::BackProjectorByBinUsingInterpolation, for the case of piecewise linear interpolation. - \warning This #includes BackProjectorByBinUsingInterpolation_3DCho.cxx + \warning This \c \#includes BackProjectorByBinUsingInterpolation_3DCho.cxx This very ugly way of including a .cxx file is used to avoid replication of a lot of (difficult) code.