4646# Create measurements using Nurbs-based white Monte Carlo forward solver
4747measurementForwardSolver = 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):
9292scattererInitialGuess = PowerLawScatterer (initialGuess [2 ], initialGuess [3 ])
9393# Compose tissue for initial guess data to obtain OPs
9494opsInitialGuess = 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
107107chromophoresFit = Array .CreateInstance (IChromophoreAbsorber , 2 )
@@ -110,25 +110,44 @@ def residual(valuesSought, wavelengths, fxs, measuredROfFx, forwardSolver):
110110scattererFit = PowerLawScatterer (fit .x [2 ], fit .x [3 ])
111111# Compose tissue for fit data to obtain OPs
112112opsFit = 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
117117chart = go .Figure ()
118118xLabel = "wavelength [nm]"
119119yLabel = "R(wavelength)"
120120wvs = [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 ]
123123midpoint = len (meas ) // 2
124124chart .add_trace (go .Scatter (x = wvs , y = meas [:midpoint ], mode = 'markers' , name = 'measured data: fx1' ))
125125chart .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 ]
128128chart .add_trace (go .Scatter (x = wvs , y = ig [:midpoint ], mode = 'markers' , name = 'initial guess: fx1' ))
129129chart .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 ]]
132151chart .add_trace (go .Scatter (x = wvs , y = conv [:midpoint ], mode = 'lines' , name = 'converged: fx1' ))
133152chart .add_trace (go .Scatter (x = wvs , y = conv [midpoint :], mode = 'lines' , name = 'converged: fx2' ))
134153chart .update_layout ( title = "ROfFx (inverse solution for chromophore concentrations, multiple wavelengths, multiple fx)" , xaxis_title = xLabel , yaxis_title = yLabel )
0 commit comments