Skip to content

Commit 08e6cf2

Browse files
committed
Added Cext, Cback, Xparameter plots and a linear graph of the phase function. Active error display for musp fitting sliders.
1 parent bceb4d2 commit 08e6cf2

19 files changed

Lines changed: 2939 additions & 2222 deletions

src/MieSimulator.pro

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ QT += core gui \
1010

1111
greaterThan(QT_MAJOR_VERSION, 5): QT += widgets
1212

13-
TARGET = MieSimulator_v1_07
13+
TARGET = MieSimulator_v1_1
1414
CONFIG -= -qt-freetype
1515
TEMPLATE = app
1616
DEFINES += QT_DEPRECATED_WARNINGS

src/calculate.cpp

Lines changed: 48 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,15 @@ void calculate::DoSimulation(Ui_MainWindow *ui, parameters *para,
1414
double* mus1000, double *g1000)
1515
{
1616
MieSimulation sim;
17-
double sumMus, sumMusG, tempMus, tempG;
18-
double tempForwardHalf, tempBackwardHalf;
17+
double curMus;
18+
double sumMus, sumMusG;
1919
double sumForward, sumBackward;
20-
double rad;
21-
double singleScatCross;
20+
double sumCsca, sumCext, sumCback;
21+
double tempPhase;
22+
double piRadiusSquared;
2223
double refRelRe = 1.0;
2324
double refRelIm = 0.0;
25+
double xPara;
2426

2527
std::complex<double> *curS1 = new std::complex<double> [para->nTheta];
2628
std::complex<double> *curS2 = new std::complex<double> [para->nTheta];
@@ -46,6 +48,9 @@ void calculate::DoSimulation(Ui_MainWindow *ui, parameters *para,
4648
sumMusG = 0.0;
4749
sumForward = 0.0;
4850
sumBackward = 0.0;
51+
sumCsca = 0.0;
52+
sumCext = 0.0;
53+
sumCback = 0.0;
4954
for (int t = 0; t < para->nTheta; t++)
5055
{
5156
sumS1[t] = std::complex<double>(0.0,0.0);
@@ -56,8 +61,8 @@ void calculate::DoSimulation(Ui_MainWindow *ui, parameters *para,
5661
}
5762
for (int r = 0; r < para->nRadius; r++)
5863
{
59-
rad = para->radArray[r];
60-
xPara = k * rad;
64+
xPara = k * para->radArray[r];
65+
piRadiusSquared = M_PI * para->radArray[r] * para->radArray[r];
6166

6267
refRelRe = para->scatRefRealArray[r] / para->medRef;
6368
refRelIm = para->scatRefImagArray[r] / para->medRef;
@@ -67,7 +72,7 @@ void calculate::DoSimulation(Ui_MainWindow *ui, parameters *para,
6772
for (int t = 0; t < para->nTheta; t++)
6873
{
6974
mu = cos(para->minTheta + t * para->stepTheta);
70-
sim.FarFieldSolutionForRealRefIndex(&cS1, &cS2, &qSca, xPara, refRelRe, mu);
75+
sim.FarFieldSolutionForRealRefIndex(&cS1, &cS2, &qSca, &qExt, &qBack, xPara, refRelRe, mu);
7176
curS1[t] = cS1;
7277
curS2[t] = cS2;
7378
}
@@ -77,40 +82,50 @@ void calculate::DoSimulation(Ui_MainWindow *ui, parameters *para,
7782
for (int t = 0; t < para->nTheta; t++)
7883
{
7984
mu = cos(para->minTheta + t * para->stepTheta);
80-
sim.FarFieldSolutionForComplexRefIndex(&cS1, &cS2, &qSca, xPara,
85+
sim.FarFieldSolutionForComplexRefIndex(&cS1, &cS2, &qSca, &qExt, &qBack, xPara,
8186
std::complex<double>(refRelRe,-refRelIm), mu); //multiply by -1 to use "n-ik" convention
8287
curS1[t] = cS1;
8388
curS2[t] = cS2;
8489
}
8590
}
86-
87-
singleScatCross = 2.0 * M_PI * rad * rad * qSca;
91+
//Ref: Schmitt and Kumar, Applied Optics 37(13) 1998
8892
//Mus calculation
89-
tempMus = singleScatCross * para->numDensityArray[r] * 1e-6; //1e-6--> 1micron2 to 1mm2
90-
sumMus += tempMus; //Σμs
93+
curMus = piRadiusSquared * qSca * para->numDensityArray[r];
94+
sumMus += curMus; //Σμs
9195
//G calculation
92-
tempG = CalculateG(curS1, curS2, para);
93-
sumMusG += tempG * tempMus;
96+
sumMusG += CalculateG(curS1, curS2, para) * curMus;
9497
//Forward Scattering
95-
tempForwardHalf = CalculateForwardBackward(curS1, curS2, para, 0, (para->nTheta-1)/2);
96-
sumForward += tempForwardHalf * tempMus;
98+
sumForward += CalculateForwardBackward(curS1, curS2, para, 0, (para->nTheta-1)/2)* curMus;
9799
//Backward Scattering
98-
tempBackwardHalf = CalculateForwardBackward(curS1, curS2, para, ((para->nTheta-1)/2), para->nTheta);
99-
sumBackward += tempBackwardHalf * tempMus;
100+
sumBackward += CalculateForwardBackward(curS1, curS2, para, ((para->nTheta-1)/2), para->nTheta)* curMus;
101+
//Coefficients
102+
sumCsca += piRadiusSquared * qSca * para->numDensityArray[r];
103+
sumCext += piRadiusSquared * qExt * para->numDensityArray[r];
104+
sumCback += piRadiusSquared * qBack * para->numDensityArray[r];
100105

101106
//S1 and S2
102-
double factor = k*k*singleScatCross;
107+
double factor = 1.0 / (M_PI * xPara * xPara * qSca); // 1/(pi *X^2 * qSca);
103108
for (int t = 0; t < para->nTheta; t++)
104109
{
105-
sumS1[t] += curS1[t] * tempMus;
106-
sumS2[t] += curS2[t] * tempMus;
107-
sumPhaseFuncAve[t] += 0.5 * (util.ComplexAbsSquared(curS1[t])+util.ComplexAbsSquared(curS2[t])) * tempMus / factor;
108-
sumPhaseFuncPara[t] += util.ComplexAbsSquared(curS2[t]) * tempMus / factor;
109-
sumPhaseFuncPerp[t] += util.ComplexAbsSquared(curS1[t]) * tempMus / factor;
110+
sumS1[t] += curS1[t] * curMus;
111+
sumS2[t] += curS2[t] * curMus;
112+
//Phase function - Parallel
113+
tempPhase = util.ComplexAbsSquared(curS2[t])*factor; //|S2|^2/(pi X^2 Qsca)
114+
sumPhaseFuncPara[t] += tempPhase*curMus;
115+
//Phase function - Perpendicular
116+
tempPhase = util.ComplexAbsSquared(curS1[t])*factor; //|S1|^2/(pi X^2 Qsca)
117+
sumPhaseFuncPerp[t] += tempPhase*curMus;
118+
//Phase function - Average
119+
tempPhase = 0.5*(util.ComplexAbsSquared(curS1[t])+util.ComplexAbsSquared(curS2[t]))*factor; //(|S1|^2+|S2|^2)/(2 pi X^2 Qsca)
120+
sumPhaseFuncAve[t] += tempPhase*curMus;
110121
}
111122
}
112-
para->scatCross[w] = sumMus * 1e6 / sumNumDen ; //1e6--> 1mm2 to 1micron2
113-
para->mus[w] = sumMus;
123+
//Normalize
124+
para->cSca[w] = sumCsca / sumNumDen ;
125+
para->cExt[w] = sumCext / sumNumDen;
126+
para->cBack[w] = sumCback / sumNumDen;
127+
para->SizePara[w] = xPara;
128+
para->mus[w] = sumMus * 1e-6; //1e-6--> 1micron2 to 1mm2
114129
para->g[w] = sumMusG /sumMus;
115130
para->forward[w] = sumForward*100.0/(sumForward+sumBackward); //Not necessary to divide by sumMus in ratio calculation
116131
para->backward[w] = sumBackward*100.0/(sumForward+sumBackward); //Not necessary to divide by sumMus in ratio calculation
@@ -130,8 +145,8 @@ void calculate::DoSimulation(Ui_MainWindow *ui, parameters *para,
130145
sumMusG = 0.0;
131146
for (int r = 0; r < para->nRadius; r++)
132147
{
133-
rad = para->radArray[r];
134-
xPara = k * rad;
148+
xPara = k * para->radArray[r];
149+
piRadiusSquared = M_PI * para->radArray[r] * para->radArray[r];
135150

136151
refRelRe = para->scatRefRealArray[r] / para->medRef;
137152
refRelIm = para->scatRefImagArray[r] / para->medRef;
@@ -141,7 +156,7 @@ void calculate::DoSimulation(Ui_MainWindow *ui, parameters *para,
141156
for (int t = 0; t < para->nTheta; t++)
142157
{
143158
mu = cos(para->minTheta + t * para->stepTheta);
144-
sim.FarFieldSolutionForRealRefIndex(&cS1, &cS2, &qSca, xPara, refRelRe, mu);
159+
sim.FarFieldSolutionForRealRefIndex(&cS1, &cS2, &qSca, &qExt, &qBack, xPara, refRelRe, mu);
145160
curS1[t] = cS1;
146161
curS2[t] = cS2;
147162
}
@@ -151,20 +166,17 @@ void calculate::DoSimulation(Ui_MainWindow *ui, parameters *para,
151166
for (int t = 0; t < para->nTheta; t++)
152167
{
153168
mu = cos(para->minTheta + t * para->stepTheta);
154-
sim.FarFieldSolutionForComplexRefIndex(&cS1, &cS2, &qSca, xPara,
169+
sim.FarFieldSolutionForComplexRefIndex(&cS1, &cS2, &qSca, &qExt, &qBack, xPara,
155170
std::complex<double>(refRelRe,-refRelIm), mu); //multiply by -1 to use "n-ik" convention
156171
curS1[t] = cS1;
157172
curS2[t] = cS2;
158173
}
159174
}
160-
161-
singleScatCross = 2.0 * M_PI * rad * rad * qSca;
162175
//Mus calculation
163-
tempMus = singleScatCross * para->numDensityArray[r] * 1e-6; //1e-6--> 1micron2 to 1mm2
164-
sumMus += tempMus; //Σμs
176+
curMus = piRadiusSquared * qSca * para->numDensityArray[r] * 1e-6; //1e-6--> 1micron2 to 1mm2
177+
sumMus += curMus; //Σμs
165178
//G calculation
166-
tempG = CalculateG(curS1, curS2, para);
167-
sumMusG += tempG*tempMus;
179+
sumMusG += CalculateG(curS1, curS2, para)*curMus;
168180
}
169181
*mus1000 = sumMus;
170182
*g1000 = sumMusG /sumMus;
@@ -262,7 +274,6 @@ double calculate::CalculateG(std::complex<double> *S1, std::complex<double> *S2,
262274
return num/den;
263275
}
264276

265-
266277
//Set sphere parameters
267278
void calculate::SetSphereRadiusAndRefIndex(parameters *para, int index, bool flagVolOrConc)
268279
{

src/calculate.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,11 @@ class calculate
1818
double wavel; // wavel: wavelength of the light in the medium (in microns)
1919
double mu; // mu: cos angle
2020
double k; // k: wavevector
21-
double xPara; // xPara: x-parameter
2221
std::complex<double> cS2; // complex parallel component: far field
2322
std::complex<double> cS1; // complex perpendicular component: far field
2423
double qSca; // scattering efficiency
24+
double qExt; // extinction efficiency
25+
double qBack; // backscattering efficiency
2526

2627
void DoSimulation(Ui_MainWindow *ui, parameters *para, double* mus1000, double *g1000);
2728
void CalculatePowerLawAutoFit(parameters *para);

src/displaydialog.cpp

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,17 @@ void DisplayDialog::DisplayData(Ui_MainWindow *mainUi, parameters *para)
7878
+ QString::number(para->numDensityArray[i] * margin) + "\t"
7979
+ QString::number(para->scatRefRealArray[i]) + "\t" + QString::number(para->scatRefImagArray[i]) );
8080

81-
ui->textBrowser_Display->append("\n\nOutput:\n");
82-
ui->textBrowser_Display->append("Scattering Coefficient (us):");
81+
ui->textBrowser_Display->append("\n\nOutput:");
82+
if (mainUi->radioButton_MonoDisperse->isChecked())
83+
{
84+
ui->textBrowser_Display->append("\nSize Parameter:");
85+
ui->textBrowser_Display->append("WL(nm)\tSize Parameter");
86+
for (int i = 0; i<para->nWavel; i++)
87+
ui->textBrowser_Display->append(QString::number(para->wavelArray[i]) + "\t"
88+
+ QString::number(para->SizePara[i]) );
89+
}
90+
91+
ui->textBrowser_Display->append("\nScattering Coefficient (us):");
8392
ui->textBrowser_Display->append("WL(nm)\tScattering Coefficient (mm^-1)");
8493
for (int i = 0; i<para->nWavel; i++)
8594
ui->textBrowser_Display->append(QString::number(para->wavelArray[i]) + "\t"
@@ -104,7 +113,19 @@ void DisplayDialog::DisplayData(Ui_MainWindow *mainUi, parameters *para)
104113
ui->textBrowser_Display->append("WL(nm)\tScattering Cross Section (um^2)");
105114
for (int i = 0; i<para->nWavel; i++)
106115
ui->textBrowser_Display->append(QString::number(para->wavelArray[i]) + "\t"
107-
+ QString::number(para->scatCross[i]) );
116+
+ QString::number(para->cSca[i]) );
117+
118+
ui->textBrowser_Display->append("\nExtinction Cross Section (Cext):");
119+
ui->textBrowser_Display->append("WL(nm)\tExtinction Cross Section (um^2)");
120+
for (int i = 0; i<para->nWavel; i++)
121+
ui->textBrowser_Display->append(QString::number(para->wavelArray[i]) + "\t"
122+
+ QString::number(para->cExt[i]) );
123+
124+
ui->textBrowser_Display->append("\nBackscattering Cross Section (Cback):");
125+
ui->textBrowser_Display->append("WL(nm)\tBackcattering Cross Section (um^2)");
126+
for (int i = 0; i<para->nWavel; i++)
127+
ui->textBrowser_Display->append(QString::number(para->wavelArray[i]) + "\t"
128+
+ QString::number(para->cBack[i]) );
108129

109130
ui->textBrowser_Display->append("\nForward and Backward Scattering %");
110131
ui->textBrowser_Display->append("WL(nm)\tForward %\tBackward %");
@@ -114,7 +135,7 @@ void DisplayDialog::DisplayData(Ui_MainWindow *mainUi, parameters *para)
114135

115136
ui->textBrowser_Display->append("\nPhase Function:");
116137
QVector<double> phaseFunction(para->nTheta), theta(para->nTheta);
117-
int indexWL = mainUi->slider_PF_WL->value();
138+
int indexWL = mainUi->slider_WL_PFPolar->value();
118139
double currentWL = para->startWavel + indexWL*para->stepWavel;
119140
for (int i = 0; i<para->nTheta; i++)
120141
{
@@ -132,15 +153,12 @@ void DisplayDialog::DisplayData(Ui_MainWindow *mainUi, parameters *para)
132153
phaseFunction[i] = para->phaseFunctionPerp[indexWL][i];
133154
}
134155
}
135-
136156
if (mainUi->radioButton_PhaseAverage->isChecked())
137-
ui->textBrowser_Display->append("Angle(deg)\t Phase Function (Ave) @ Wavelength of " + QString::number(currentWL) + " nm");
138-
else
139-
if (mainUi->radioButton_PhasePara->isChecked())
140-
ui->textBrowser_Display->append("Angle(deg)\t Phase Function (Para) @ Wavelength of " + QString::number(currentWL) + " nm");
141-
else
142-
if (mainUi->radioButton_PhasePerp->isChecked())
143-
ui->textBrowser_Display->append("Angle(deg)\t Phase Function (Perp @ Wavelength of " + QString::number(currentWL) + " nm");
157+
ui->textBrowser_Display->append("Angle(deg)\t Phase Function (Ave) @ Wavelength of " + QString::number(currentWL) + " nm");
158+
if (mainUi->radioButton_PhasePara->isChecked())
159+
ui->textBrowser_Display->append("Angle(deg)\t Phase Function (Para) @ Wavelength of " + QString::number(currentWL) + " nm");
160+
if (mainUi->radioButton_PhasePerp->isChecked())
161+
ui->textBrowser_Display->append("Angle(deg)\t Phase Function (Perp) @ Wavelength of " + QString::number(currentWL) + " nm");
144162
for (int i = 0; i<para->nTheta; i++)
145163
ui->textBrowser_Display->append(QString::number(theta[i]) + "\t" + QString::number(phaseFunction[i]));
146164
}

src/main.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@
4444
#include <QApplication>
4545
#include <QtPlugin>
4646

47-
4847
int main(int argc, char *argv[])
4948
{
5049
QApplication a(argc, argv);

0 commit comments

Comments
 (0)