2.0.0-b9 - 8/5/00
Added RPM Spec file for RPM package creation
Added loading of ASCII phanthom definitions from files
+ Added frequency_filter option to reconstruction
2.0.0-b8 - 8/1/00
Added line color support to SGP
** This is part of the CTSim program
** Copyright (C) 1983-2000 Kevin Rosenberg
**
-** $Id: ct.h,v 1.29 2000/08/03 09:21:12 kevin Exp $
+** $Id: ct.h,v 1.30 2000/08/03 09:57:33 kevin Exp $
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License (version 2) as
#ifndef CT_H
#define CT_H
-extern "C" {int strcasecmp(const char*, const char*);}
-
#ifdef _WIN32
+ extern "C" {int strcasecmp(const char*, const char*);}
typedef long off_t;
#define HAVE_STRING_H 1
#include <fcntl.h>
** This is part of the CTSim program
** Copyright (C) 1983-2000 Kevin Rosenberg
**
-** $Id: filter.h,v 1.17 2000/07/22 16:14:49 kevin Exp $
+** $Id: filter.h,v 1.18 2000/08/03 09:57:33 kevin Exp $
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License (version 2) as
static const int DOMAIN_FREQUENCY;
static const int DOMAIN_SPATIAL;
+ static const int FREQUENCY_FILTER_INVALID;
+ static const int FREQUENCY_FILTER_DIRECT_FREQUENCY;
+ static const int FREQUENCY_FILTER_INVERSE_SPATIAL;
- SignalFilter (const char* filterName, const char* filterMethodName,double bw, double signalIncrement, int n, double param, const char* domainName, const int zeropad = 0, const int preinterpolationFactor = 1);
+ SignalFilter (const char* filterName, const char* filterMethodName,double bw, double signalIncrement, int n, double param, const char* domainName, const char* frequencyFilterName, const int zeropad = 0, const int preinterpolationFactor = 1);
- SignalFilter (const int filt_type, int filterMethodID, double bw, double signalIncrement, int n, double param, const int domain, const int zeropad = 0, const int preinterpolationFactor = 1);
+ SignalFilter (const int filt_type, int filterMethodID, double bw, double signalIncrement, int n, double param, const int domain, int filterFilterID, const int zeropad = 0, const int preinterpolationFactor = 1);
SignalFilter (const char* filterName, const char* domainName, double bw, double param);
const string& nameDomain(void) const { return m_nameDomain;}
const int idFilter(void) const { return m_idFilter;}
const int idDomain(void) const { return m_idDomain;}
+ const int idFrequencyFilter() const { return m_idFrequencyFilter;}
const double getFilterMin(void) const {return m_filterMin;}
const double getFilterMax(void) const {return m_filterMax;}
const double getFilterIncrement(void) const {return m_filterInc;}
static int convertDomainNameToID (const char* const domainName);
static const char* convertDomainIDToName (const int idDomain);
static const char* convertDomainIDToTitle (const int idDomain);
-
-
+ static int convertFrequencyFilterNameToID (const char* const ffName);
+ static const char* convertFrequencyFilterIDToName (const int idFF);
+ static const char* convertFrequencyFilterIDToTitle (const int idFF);
private:
double m_bw;
string m_nameFilter;
string m_nameFilterMethod;
string m_nameDomain;
+ string m_nameFrequencyFilter;
int m_idFilter;
int m_idFilterMethod;
+ int m_idFrequencyFilter;
int m_idDomain;
double m_filterParam;
int m_traceLevel;
static const char* s_aszDomainName[];
static const char* s_aszDomainTitle[];
static const int s_iDomainCount;
+ static const char* s_aszFrequencyFilterName[];
+ static const char* s_aszFrequencyFilterTitle[];
+ static const int s_iFrequencyFilterCount;
static int N_INTEGRAL;
static const bool haveAnalyticSpatial (const int filterID);
- void init (const int filt_type, const int filterMethod, double bw, double signalIncrement, int n, double param, const int domain, const int zeropad, const int preInterpScale);
+ void init (const int filt_type, const int filterMethod, double bw, double signalIncrement, int n, double param, const int domain, const int frequencyFilter, const int zeropad, const int preInterpScale);
double spatialResponseCalc (double x, double param) const;
** This is part of the CTSim program
** Copyright (C) 1983-2000 Kevin Rosenberg
**
-** $Id: projections.h,v 1.10 2000/07/15 08:36:13 kevin Exp $
+** $Id: projections.h,v 1.11 2000/08/03 09:57:33 kevin Exp $
**
**
** This program is free software; you can redistribute it and/or modify
bool detarrayRead (fnetorderstream& fs, DetectorArray& darray, const int view_num);
bool detarrayWrite (fnetorderstream& fs, const DetectorArray& darray, const int view_num);
- bool reconstruct (ImageFile& im, const char* const filterName, double filt_param, const char* const filterMethodName, const int zeropad, const char* const interpName, int interp_param, const char* const backprojName, const int trace) const;
+ 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;
void setNView (int nView); // used in MPI to restrict # of views
void setRotInc (double rotInc) { m_rotInc = rotInc;}
** This is part of the CTSim program
** Copyright (C) 1983-2000 Kevin Rosenberg
**
-** $Id: filter.cpp,v 1.23 2000/07/31 14:48:35 kevin Exp $
+** $Id: filter.cpp,v 1.24 2000/08/03 09:57:33 kevin Exp $
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License (version 2) as
const int SignalFilter::s_iDomainCount = sizeof(s_aszDomainName) / sizeof(const char*);
+const int SignalFilter::FREQUENCY_FILTER_INVALID = -1;
+const int SignalFilter::FREQUENCY_FILTER_DIRECT_FREQUENCY = 0;
+const int SignalFilter::FREQUENCY_FILTER_INVERSE_SPATIAL = 1;
+
+const char* SignalFilter::s_aszFrequencyFilterName[] = {
+ {"direct_frequency"},
+ {"inverse_spatial"},
+};
+
+const char* SignalFilter::s_aszFrequencyFilterTitle[] = {
+ {"Direct Frequency"},
+ {"Inverse Spatial"},
+};
+
+const int SignalFilter::s_iFrequencyFilterCount = sizeof(s_aszFrequencyFilterName) / sizeof(const char*);
+
+
/* NAME
* SignalFilter::SignalFilter Construct a signal
*
* int domain FREQUENCY or SPATIAL domain wanted
*/
-SignalFilter::SignalFilter (const char* filterName, const char* filterMethodName, double bw, double signalIncrement, int nSignalPoints, double param, const char* domainName, int zeropad = 0, int preinterpolationFactor = 1)
+SignalFilter::SignalFilter (const char* filterName, const char* filterMethodName, double bw, double signalIncrement, int nSignalPoints, double param, const char* domainName, const char* frequencyFilterName, int zeropad = 0, int preinterpolationFactor = 1)
: m_vecFilter(NULL), m_vecFourierCosTable(NULL), m_vecFourierSinTable(NULL), m_fail(false)
{
m_idFilter = convertFilterNameToID (filterName);
m_failMessage += domainName;
return;
}
- init (m_idFilter, m_idFilterMethod, bw, signalIncrement, nSignalPoints, param, m_idDomain, zeropad, preinterpolationFactor);
+ m_idFrequencyFilter = convertFrequencyFilterNameToID (frequencyFilterName);
+ if (m_idFrequencyFilter == FREQUENCY_FILTER_INVALID) {
+ m_fail = true;
+ m_failMessage = "Invalid frequency filter name ";
+ m_failMessage += frequencyFilterName;
+ return;
+ }
+ init (m_idFilter, m_idFilterMethod, bw, signalIncrement, nSignalPoints, param, m_idDomain, m_idFrequencyFilter, zeropad, preinterpolationFactor);
}
-SignalFilter::SignalFilter (const int filterID, const int filterMethodID, double bw, double signalIncrement, int nSignalPoints, double param, const int domainID, int zeropad = 0, int preinterpolationFactor = 1)
+SignalFilter::SignalFilter (const int filterID, const int filterMethodID, double bw, double signalIncrement, int nSignalPoints, double param, const int domainID, int frequencyFilterID, int zeropad = 0, int preinterpolationFactor = 1)
: m_vecFilter(NULL), m_vecFourierCosTable(NULL), m_vecFourierSinTable(NULL), m_fail(false)
{
- init (filterID, filterMethodID, bw, signalIncrement, nSignalPoints, param, domainID, zeropad, preinterpolationFactor);
+ init (filterID, filterMethodID, bw, signalIncrement, nSignalPoints, param, domainID, frequencyFilterID, zeropad, preinterpolationFactor);
}
SignalFilter::SignalFilter (const char* filterName, const char* domainName, double bw, double param)
}
void
-SignalFilter::init (const int filterID, const int filterMethodID, double bw, double signalIncrement, int nSignalPoints, double filterParam, const int domainID, int zeropad, int preinterpolationFactor)
+SignalFilter::init (const int filterID, const int filterMethodID, double bw, double signalIncrement, int nSignalPoints, double filterParam, const int domainID, const int frequencyFilterID, int zeropad, int preinterpolationFactor)
{
m_bw = bw;
m_idFilter = filterID;
m_idDomain = domainID;
m_idFilterMethod = filterMethodID;
- if (m_idFilter == FILTER_INVALID || m_idDomain == DOMAIN_INVALID || m_idFilterMethod == FILTER_METHOD_INVALID) {
+ m_idFrequencyFilter = frequencyFilterID;
+ if (m_idFilter == FILTER_INVALID || m_idDomain == DOMAIN_INVALID || m_idFilterMethod == FILTER_METHOD_INVALID || m_idFrequencyFilter == FREQUENCY_FILTER_INVALID) {
m_fail = true;
return;
}
m_nameFilter = convertFilterIDToName (m_idFilter);
m_nameDomain = convertDomainIDToName (m_idDomain);
m_nameFilterMethod = convertFilterMethodIDToName (m_idFilterMethod);
+ m_nameFrequencyFilter = convertFrequencyFilterIDToName (m_idFrequencyFilter);
m_nSignalPoints = nSignalPoints;
m_signalInc = signalIncrement;
m_filterParam = filterParam;
return (title);
}
+int
+SignalFilter::convertFrequencyFilterNameToID (const char* const ffName)
+{
+ int ffID = FREQUENCY_FILTER_INVALID;
+
+ for (int i = 0; i < s_iFrequencyFilterCount; i++)
+ if (strcasecmp (ffName, s_aszFrequencyFilterName[i]) == 0) {
+ ffID = i;
+ break;
+ }
+
+ return (ffID);
+}
+
+const char *
+SignalFilter::convertFrequencyFilterIDToName (const int ffID)
+{
+ static const char *name = "";
+
+ if (ffID >= 0 && ffID < s_iFrequencyFilterCount)
+ return (s_aszFrequencyFilterName [ffID]);
+
+ return (name);
+}
+
+const char *
+SignalFilter::convertFrequencyFilterIDToTitle (const int ffID)
+{
+ static const char *name = "";
+
+ if (ffID >= 0 && ffID < s_iFrequencyFilterCount)
+ return (s_aszFrequencyFilterTitle [ffID]);
+
+ return (name);
+}
+
void
SignalFilter::filterSignal (const float input[], double output[]) const
{
** This is part of the CTSim program
** Copyright (C) 1983-2000 Kevin Rosenberg
**
-** $Id: projections.cpp,v 1.18 2000/07/29 19:50:08 kevin Exp $
+** $Id: projections.cpp,v 1.19 2000/08/03 09:57:33 kevin Exp $
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License (version 2) as
*/
bool
-Projections::reconstruct (ImageFile& im, const char* const filterName, double filt_param, const char* const filterMethodName, const int zeropad, const char* const interpName, int interpFactor, const char* const backprojectName, const int trace) const
+Projections::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 interpFactor, const char* const backprojectName, const int trace) const
{
double detInc = m_detInc;
int n_filteredProj = m_nDet * interpFactor;
#endif
double filterBW = 1. / detInc;
- SignalFilter filter (filterName, filterMethodName, filterBW, m_detInc, m_nDet, filt_param, "spatial", zeropad, interpFactor);
+ SignalFilter filter (filterName, filterMethodName, filterBW, m_detInc, m_nDet, filt_param, "spatial", frequencyFilterName, zeropad, interpFactor);
filter.setTraceLevel(trace);
if (filter.fail()) {
** This is part of the CTSim program
** Copyright (C) 1983-2000 Kevin Rosenberg
**
-** $Id: if-1.cpp,v 1.2 2000/08/02 18:09:11 kevin Exp $
+** $Id: if-1.cpp,v 1.3 2000/08/03 09:57:29 kevin Exp $
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License (version 2) as
{0, 0, 0, 0}
};
-static const char* g_szIdStr = "$id$";
+static const char* g_szIdStr = "$Id: if-1.cpp,v 1.3 2000/08/03 09:57:29 kevin Exp $";
void
if1_usage (const char *program)
break;
case O_VERSION:
#ifdef VERSION
- cout << "Version " << VERSION << endl;
+ cout << "Version " << VERSION << endl << g_szIdStr << endl;
#else
cout << "Unknown version number" << endl;
#endif
** This is part of the CTSim program
** Copyright (C) 1983-2000 Kevin Rosenberg
**
-** $Id: if-2.cpp,v 1.4 2000/08/02 18:09:11 kevin Exp $
+** $Id: if-2.cpp,v 1.5 2000/08/03 09:57:29 kevin Exp $
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License (version 2) as
{0, 0, 0, 0}
};
-static const char* g_szIdStr = "$id$";
+static const char* g_szIdStr = "$Id: if-2.cpp,v 1.5 2000/08/03 09:57:29 kevin Exp $";
void
if2_usage (const char *program)
break;
case O_VERSION:
#ifdef VERSION
- cout << "Version " << VERSION << endl;
+ cout << "Version " << VERSION << endl << g_szIdStr << endl;
#else
cout << "Unknown version number" << endl;
#endif
** This is part of the CTSim program
** Copyright (C) 1983-2000 Kevin Rosenberg
**
-** $Id: if2img.cpp,v 1.3 2000/08/02 18:09:11 kevin Exp $
+** $Id: if2img.cpp,v 1.4 2000/08/03 09:57:29 kevin Exp $
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License (version 2) as
{0, 0, 0, 0}
};
-static const char* g_szIdStr = "$id$";
+static const char* g_szIdStr = "$Id: if2img.cpp,v 1.4 2000/08/03 09:57:29 kevin Exp $";
enum { O_AUTO_FULL, O_AUTO_STD0_1, O_AUTO_STD0_5, O_AUTO_STD1, O_AUTO_STD2, O_AUTO_STD3 };
static const char O_AUTO_FULL_STR[]="full";
break;
case O_VERSION:
#ifdef VERSION
- cout << "Version " << VERSION;
+ cout << "Version " << VERSION << endl << g_szIdStr << endl;
#else
cout << "Unknown version number" << endl;
#endif
** This is part of the CTSim program
** Copyright (C) 1983-2000 Kevin Rosenberg
**
-** $Id: ifinfo.cpp,v 1.2 2000/08/02 18:09:11 kevin Exp $
+** $Id: ifinfo.cpp,v 1.3 2000/08/03 09:57:29 kevin Exp $
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License (version 2) as
{0, 0, 0, 0}
};
-static const char* g_szIdStr = "$id$";
+static const char* g_szIdStr = "$Id: ifinfo.cpp,v 1.3 2000/08/03 09:57:29 kevin Exp $";
void
break;
case O_VERSION:
#ifdef VERSION
- cout << "Version " << VERSION << endl;
+ cout << "Version " << VERSION << endl << g_szIdStr << endl;
#else
cout << "Unknown version number" << endl;
#endif
** This is part of the CTSim program
** Copyright (C) 1983-2000 Kevin Rosenberg
**
-** $Id: phm2if.cpp,v 1.8 2000/08/02 19:55:45 kevin Exp $
+** $Id: phm2if.cpp,v 1.9 2000/08/03 09:57:29 kevin Exp $
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License (version 2) as
{0, 0, 0, 0}
};
-static const char* g_szIdStr = "$Id: phm2if.cpp,v 1.8 2000/08/02 19:55:45 kevin Exp $";
+static const char* g_szIdStr = "$Id: phm2if.cpp,v 1.9 2000/08/03 09:57:29 kevin Exp $";
void
phm2if_usage (const char *program)
break;
case O_VERSION:
#ifdef VERSION
- cout << "Version " << VERSION << endl;
+ cout << "Version " << VERSION << endl << g_szIdStr << endl;
#else
cerr << "Unknown version number" << endl;
#endif
** This is part of the CTSim program
** Copyright (C) 1983-2000 Kevin Rosenberg
**
-** $Id: phm2pj.cpp,v 1.8 2000/08/03 09:21:12 kevin Exp $
+** $Id: phm2pj.cpp,v 1.9 2000/08/03 09:57:29 kevin Exp $
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License (version 2) as
{0, 0, 0, 0}
};
-static const char* g_szIdStr = "$id$";
+static const char* g_szIdStr = "$Id: phm2pj.cpp,v 1.9 2000/08/03 09:57:29 kevin Exp $";
void
break;
case O_VERSION:
#ifdef VERSION
- cout << "Version: " << VERSION << endl;
+ cout << "Version: " << VERSION << endl << g_szIdStr << endl;
#else
cout << "Unknown version number" << endl;
#endif
** This is part of the CTSim program
** Copyright (C) 1983-2000 Kevin Rosenberg
**
-** $Id: pj2if.cpp,v 1.2 2000/08/02 18:09:11 kevin Exp $
+** $Id: pj2if.cpp,v 1.3 2000/08/03 09:57:29 kevin Exp $
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License (version 2) as
{0, 0, 0, 0}
};
-static const char* g_szIdStr = "$id$";
+static const char* g_szIdStr = "$Id: pj2if.cpp,v 1.3 2000/08/03 09:57:29 kevin Exp $";
void
pj2if_usage (const char *program)
break;
case O_VERSION:
#ifdef VERSION
- cout << "Version " << VERSION << endl;
+ cout << "Version " << VERSION << endl << g_szIdStr << endl;
#else
cout << "Unknown version number" << endl;
#endif
** This is part of the CTSim program
** Copyright (C) 1983-2000 Kevin Rosenberg
**
-** $Id: pjrec.cpp,v 1.9 2000/08/03 09:53:41 kevin Exp $
+** $Id: pjrec.cpp,v 1.10 2000/08/03 09:57:29 kevin Exp $
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License (version 2) as
{0, 0, 0, 0}
};
-static const char* g_szIdStr = "$Id: pjrec.cpp,v 1.9 2000/08/03 09:53:41 kevin Exp $";
+static const char* g_szIdStr = "$Id: pjrec.cpp,v 1.10 2000/08/03 09:57:29 kevin Exp $";
void
pjrec_usage (const char *program)
break;
case O_VERSION:
#ifdef VERSION
- cout << "Version " << VERSION << endl << "Id " << g_szIdStr << endl;
+ cout << "Version " << VERSION << endl << g_szIdStr << endl;
#else
cout << "Unknown version number" << endl;
#endif