Skip to content

Commit 996b8c5

Browse files
committed
Variable name inconsistency corrected. Trying to add plot to r-of-fx-... script but having trouble converting IScatterer.GetMusp(wavelength) to an array that python understands.
1 parent 970d0a6 commit 996b8c5

3 files changed

Lines changed: 50 additions & 31 deletions

File tree

inverse-solutions/r-of-fx-multi-op-prop-inversion.py

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
# Create measurements using Nurbs-based white Monte Carlo forward solver
4747
measurementForwardSolver = NurbsForwardSolver()
4848
# len(measuredROfFx)=(#fxs)x(#wavelengths) flattened
49-
measuredROfFx=np.concatenate(
49+
rOfFxMeasured=np.concatenate(
5050
[np.array(measurementForwardSolver.ROfFx(opsMeasured, fxs[0]), dtype=float),
5151
np.array(measurementForwardSolver.ROfFx(opsMeasured, fxs[1]), dtype=float)])
5252
# Create a forward solver as a model function for inversion
@@ -92,7 +92,7 @@ def residual(valuesSought, wavelengths, fxs, measuredROfFx, forwardSolver):
9292
scattererInitialGuess = PowerLawScatterer(initialGuess[2], initialGuess[3])
9393
# Compose tissue for initial guess data to obtain OPs
9494
opsInitialGuess = Tissue(chromophoresInitialGuess, scattererInitialGuess, "", n=1.4).GetOpticalProperties(wavelengths)
95-
initialGuessROfFx=np.concatenate(
95+
rOfFxInitialGuess=np.concatenate(
9696
[np.array(forwardSolverForInversion.ROfFx(opsInitialGuess, fxs[0]), dtype=float),
9797
np.array(forwardSolverForInversion.ROfFx(opsInitialGuess, fxs[1]), dtype=float)])
9898
# Run the levenberg-marquardt inversion
@@ -101,7 +101,7 @@ def residual(valuesSought, wavelengths, fxs, measuredROfFx, forwardSolver):
101101
residual,
102102
initialGuess,
103103
ftol=1e-9, xtol=1e-9, max_nfev=10000, # max_nfev needs to be integer
104-
args=(wavelengths, fxs, measuredROfFx, forwardSolverForInversion),
104+
args=(wavelengths, fxs, rOfFxMeasured, forwardSolverForInversion),
105105
method='lm')
106106
# Calculate final reflectance from model at fit values
107107
chromophoresFit = Array.CreateInstance(IChromophoreAbsorber, 2)
@@ -110,25 +110,44 @@ def residual(valuesSought, wavelengths, fxs, measuredROfFx, forwardSolver):
110110
scattererFit = PowerLawScatterer(fit.x[2], fit.x[3])
111111
# Compose tissue for fit data to obtain OPs
112112
opsFit= Tissue(chromophoresFit, scattererFit, "", n=1.4).GetOpticalProperties(wavelengths)
113-
fitROfFx=np.concatenate(
113+
rOfFxFit=np.concatenate(
114114
[np.array(forwardSolverForInversion.ROfFx(opsFit, fxs[0]), dtype=float),
115115
np.array(forwardSolverForInversion.ROfFx(opsFit, fxs[1]), dtype=float)])
116-
# plot the results using Plotly results flattened so have to unflat
116+
# plot Reflectance: flattened so have to separate
117117
chart = go.Figure()
118118
xLabel = "wavelength [nm]"
119119
yLabel = "R(wavelength)"
120120
wvs = [w for w in wavelengths]
121121
# plot measured data first fx first
122-
meas= [m for m in measuredROfFx]
122+
meas= [m for m in rOfFxMeasured]
123123
midpoint=len(meas) // 2
124124
chart.add_trace(go.Scatter(x=wvs, y=meas[:midpoint], mode='markers', name='measured data: fx1'))
125125
chart.add_trace(go.Scatter(x=wvs, y=meas[midpoint:], mode='markers', name='measured data: fx2'))
126126
# plot initial guess data
127-
ig = [i for i in initialGuessROfFx]
127+
ig = [i for i in rOfFxInitialGuess]
128128
chart.add_trace(go.Scatter(x=wvs, y=ig[:midpoint], mode='markers', name='initial guess: fx1'))
129129
chart.add_trace(go.Scatter(x=wvs, y=ig[midpoint:], mode='markers', name='initial guess: fx2'))
130130
# plot fit: need to organize by fx
131-
conv = [f for f in fitROfFx]
131+
conv = [f for f in rOfFxFit]
132+
chart.add_trace(go.Scatter(x=wvs, y=conv[:midpoint], mode='lines', name='converged: fx1'))
133+
chart.add_trace(go.Scatter(x=wvs, y=conv[midpoint:], mode='lines', name='converged: fx2'))
134+
chart.update_layout( title="ROfFx (inverse solution for chromophore concentrations, multiple wavelengths, multiple fx)", xaxis_title=xLabel, yaxis_title=yLabel)
135+
# plot Mus': flattened so have to separate
136+
chart = go.Figure()
137+
xLabel = "wavelength [nm]"
138+
yLabel = "us'(wavelength)"
139+
wvs = [w for w in wavelengths]
140+
# plot measured data first fx first
141+
meas= [m for m in scattererMeasuredData]
142+
midpoint=len(meas) // 2
143+
chart.add_trace(go.Scatter(x=wvs, y=meas[:midpoint], mode='markers', name='measured data: fx1'))
144+
chart.add_trace(go.Scatter(x=wvs, y=meas[midpoint:], mode='markers', name='measured data: fx2'))
145+
# plot initial guess data
146+
ig = [i for i in [scattererInitialGuess]]
147+
chart.add_trace(go.Scatter(x=wvs, y=ig[:midpoint], mode='markers', name='initial guess: fx1'))
148+
chart.add_trace(go.Scatter(x=wvs, y=ig[midpoint:], mode='markers', name='initial guess: fx2'))
149+
# plot fit: need to organize by fx
150+
conv = [f for f in [scattererFit]]
132151
chart.add_trace(go.Scatter(x=wvs, y=conv[:midpoint], mode='lines', name='converged: fx1'))
133152
chart.add_trace(go.Scatter(x=wvs, y=conv[midpoint:], mode='lines', name='converged: fx2'))
134153
chart.update_layout( title="ROfFx (inverse solution for chromophore concentrations, multiple wavelengths, multiple fx)", xaxis_title=xLabel, yaxis_title=yLabel)

inverse-solutions/r-of-rho-multi-op-prop-inversion-using-csharp-solve.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
opsMeasured = Tissue(chromophoresMeasuredData, scatterer, "", n=1.4).GetOpticalProperties(wavelengths)
4646
# Create measurements using Nurbs-based white Monte Carlo forward solver
4747
measurementForwardSolver = NurbsForwardSolver()
48-
measuredROfRho = measurementForwardSolver.ROfRho(opsMeasured, rho)
48+
rOfRhoMeasured = measurementForwardSolver.ROfRho(opsMeasured, rho)
4949
# Create a forward solver as a model function for inversion
5050
forwardSolverForInversion = PointSourceSDAForwardSolver()
5151

@@ -77,53 +77,53 @@ def CalculateReflectanceFuncVsWavelengthFromChromophoreConcentration(
7777
chromophoresInitialGuess[2] = ChromophoreAbsorber(ChromophoreType.H2O, initialGuess[2])
7878
# Compose tissue for initial guess data to obtain OPs
7979
opsInitialGuess = Tissue(chromophoresInitialGuess, scatterer, "", n=1.4).GetOpticalProperties(wavelengths)
80-
initialGuessROfRho = forwardSolverForInversion.ROfRho(opsInitialGuess, rho)
80+
rOfRhoInitialGuess = forwardSolverForInversion.ROfRho(opsInitialGuess, rho)
8181
# Run the levenberg-marquardt inversion
8282
optimizer = MPFitLevenbergMarquardtOptimizer()
8383
initialGuessCopy = Array.CreateInstance(float, 3)
8484
initialGuessCopy = initialGuess
8585
parametersToFit = Array.CreateInstance(bool, 3)
8686
parametersToFit = [True, True, True]
87-
measuredDataWeight = Array.CreateInstance(float, len(measuredROfRho))
87+
measuredDataWeight = Array.CreateInstance(float, len(rOfRhoMeasured))
8888
measuredDataWeight = [1] * len(measuredDataWeight)
8989
params = Array.CreateInstance(Object, 3)
9090
params = [wavelengths, rho, scatterer]
9191

9292
# try calling our LM
93-
fit = optimizer.Solve(initialGuessCopy, parametersToFit, measuredROfRho, measuredDataWeight,
93+
fit = optimizer.Solve(initialGuessCopy, parametersToFit, rOfRhoMeasured, measuredDataWeight,
9494
forward_func, params)
9595
# Calculate final reflectance from model at fit values
9696
chromophoresFit = Array.CreateInstance(IChromophoreAbsorber, 3)
9797
chromophoresFit[0] = ChromophoreAbsorber(ChromophoreType.HbO2, fit[0])
9898
chromophoresFit[1] = ChromophoreAbsorber(ChromophoreType.Hb, fit[1])
9999
chromophoresFit[2] = ChromophoreAbsorber(ChromophoreType.H2O, fit[2])
100100
opsFit = Tissue(chromophoresFit, scatterer, "", n=1.4).GetOpticalProperties(wavelengths)
101-
fitROfRho= forwardSolverForInversion.ROfRho(opsFit, rho)
101+
rOfRhoFit= forwardSolverForInversion.ROfRho(opsFit, rho)
102102
# plot the results using Plotly
103103
xLabel = "wavelengths [nm]"
104104
yLabel = "R(wavelength) [mm-2]"
105105
wvs = [w for w in wavelengths]
106106
# plot measured data
107-
meas = [m for m in measuredROfRho]
107+
meas = [m for m in rOfRhoMeasured]
108108
chart = go.Figure()
109109
chart.add_trace(go.Scatter(x=wvs, y=meas, mode='markers', name='measured data'))
110110
# plot initial guess data
111-
ig = [i for i in initialGuessROfRho]
111+
ig = [i for i in rOfRhoInitialGuess]
112112
chart.add_trace(go.Scatter(x=wvs, y=ig, mode='markers', name='initial guess'))
113113
# plot fit
114-
conv = [f for f in fitROfRho]
114+
conv = [f for f in rOfRhoFit]
115115
chart.add_trace(go.Scatter(x=wvs, y=conv, mode='lines', name='converged'))
116116
chart.update_layout( title="ROfRho (inverse solution for chromophore concentrations, multiple wavelengths, single rho)", xaxis_title=xLabel, yaxis_title=yLabel)
117117
chart.show(renderer="browser")
118118
# output results
119119
print("Meas = [%5.3f %5.3f %5.3f]" % (measuredData[0], measuredData[1], measuredData[2]))
120120
print("IG = [%5.3f %5.3f %5.3f] Chi2=%5.3e" % (
121121
initialGuess[0], initialGuess[1], initialGuess[2],
122-
np.dot(np.subtract(measuredROfRho,initialGuessROfRho),
123-
np.subtract(measuredROfRho,initialGuessROfRho))))
122+
np.dot(np.subtract(rOfRhoMeasured,rOfRhoInitialGuess),
123+
np.subtract(rOfRhoMeasured,rOfRhoInitialGuess))))
124124
print("Conv = [%5.3f %5.3f %5.3f] Chi2=%5.3e" % (fit[0], fit[1], fit[2],
125-
np.dot(np.subtract(measuredROfRho,fitROfRho),
126-
np.subtract(measuredROfRho,fitROfRho))))
125+
np.dot(np.subtract(rOfRhoMeasured,rOfRhoFit),
126+
np.subtract(rOfRhoMeasured,rOfRhoFit))))
127127
print("error = [%5.3f %5.3f %5.3f]%%" % (
128128
100*abs((measuredData[0]-fit[0])/measuredData[0]),
129129
100*abs((measuredData[1]-fit[1])/measuredData[1]),

inverse-solutions/r-of-rho-multi-op-prop-inversion.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
opsMeasured = Tissue(chromophoresMeasuredData, scatterer, "", n=1.4).GetOpticalProperties(wavelengths)
4545
# Create measurements using Nurbs-based white Monte Carlo forward solver
4646
measurementForwardSolver = NurbsForwardSolver()
47-
measuredROfRho= measurementForwardSolver.ROfRho(opsMeasured, rho)
47+
rOfRhoMeasured = measurementForwardSolver.ROfRho(opsMeasured, rho)
4848
# Create a forward solver as a model function for inversion
4949
forwardSolverForInversion = PointSourceSDAForwardSolver()
5050

@@ -84,46 +84,46 @@ def residual(chromophoreConcentration, wavelengths, rho, scatterer, measuredROfR
8484
chromophoresInitialGuess[2] = ChromophoreAbsorber(ChromophoreType.H2O, initialGuess[2])
8585
# Compose tissue for initial guess data to obtain OPs
8686
opsInitialGuess = Tissue(chromophoresInitialGuess, scatterer, "", n=1.4).GetOpticalProperties(wavelengths)
87-
initialGuessROfRho = forwardSolverForInversion.ROfRho(opsInitialGuess, rho)
87+
rOfRhoInitialGuess= forwardSolverForInversion.ROfRho(opsInitialGuess, rho)
8888
# Run the levenberg-marquardt inversion
8989
from scipy.optimize import least_squares
9090
fit = least_squares(
9191
residual,
9292
initialGuess,
9393
ftol=1e-9, xtol=1e-9, max_nfev=10000, # max_nfev needs to be integer
94-
args=(wavelengths, rho, scatterer, measuredROfRho, forwardSolverForInversion),
94+
args=(wavelengths, rho, scatterer, rOfRhoMeasured, forwardSolverForInversion),
9595
method='lm')
9696
# Calculate final reflectance from model at fit values
9797
chromophoresFit = Array.CreateInstance(IChromophoreAbsorber, 3)
9898
chromophoresFit[0] = ChromophoreAbsorber(ChromophoreType.HbO2, fit.x[0])
9999
chromophoresFit[1] = ChromophoreAbsorber(ChromophoreType.Hb, fit.x[1])
100100
chromophoresFit[2] = ChromophoreAbsorber(ChromophoreType.H2O, fit.x[2])
101101
opsFit = Tissue(chromophoresFit, scatterer, "", n=1.4).GetOpticalProperties(wavelengths)
102-
fitROfRho= forwardSolverForInversion.ROfRho(opsFit, rho)
102+
rOfRhoFit= forwardSolverForInversion.ROfRho(opsFit, rho)
103103
# plot the results using Plotly
104104
xLabel = "wavelength [nm]"
105105
yLabel = "R(wavelength)"
106106
wvs = [w for w in wavelengths]
107107
# plot measured data
108-
meas = [m for m in measuredROfRho]
108+
meas = [m for m in rOfRhoMeasured]
109109
chart = go.Figure()
110110
chart.add_trace(go.Scatter(x=wvs, y=meas, mode='markers', name='measured data'))
111111
# plot initial guess data
112-
ig = [i for i in initialGuessROfRho]
112+
ig = [i for i in rOfRhoInitialGuess]
113113
chart.add_trace(go.Scatter(x=wvs, y=ig, mode='markers', name='initial guess'))
114114
# plot fit
115-
conv = [f for f in fitROfRho]
115+
conv = [f for f in rOfRhoFit]
116116
chart.add_trace(go.Scatter(x=wvs, y=conv, mode='lines', name='converged'))
117117
chart.update_layout( title="ROfRho (inverse solution for chromophore concentrations, multiple wavelengths, single rho)", xaxis_title=xLabel, yaxis_title=yLabel)
118118
chart.show(renderer="browser")
119119
# output results
120120
print("Meas = [%5.3f %5.3f %5.3f]" % (measuredData[0], measuredData[1], measuredData[2]))
121121
print("IG = [%5.3f %5.3f %5.3f] Chi2=%5.3e" % (initialGuess[0], initialGuess[1], initialGuess[2],
122-
np.dot(np.subtract(measuredROfRho,initialGuessROfRho),
123-
np.subtract(measuredROfRho,initialGuessROfRho))))
122+
np.dot(np.subtract(rOfRhoMeasured,rOfRhoInitialGuess),
123+
np.subtract(rOfRhoMeasured,rOfRhoInitialGuess))))
124124
print("Conv = [%5.3f %5.3f %5.3f] Chi2=%5.3e" % (fit.x[0], fit.x[1], fit.x[2],
125-
np.dot(np.subtract(measuredROfRho,fitROfRho),
126-
np.subtract(measuredROfRho,fitROfRho))))
125+
np.dot(np.subtract(rOfRhoMeasured,rOfRhoFit),
126+
np.subtract(rOfRhoMeasured,rOfRhoFit))))
127127
print("error = [%5.3f %5.3f %5.3f]%%" % (
128128
100*abs((measuredData[0]-fit.x[0])/measuredData[0]),
129129
100*abs((measuredData[1]-fit.x[1])/measuredData[1]),

0 commit comments

Comments
 (0)