Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
I
imagej-elphel
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
3
Issues
3
List
Board
Labels
Milestones
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
Elphel
imagej-elphel
Commits
b75d6c0f
Commit
b75d6c0f
authored
Sep 07, 2014
by
Andrey Filippov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Adding LMA version to averaging/temperature scan commands
parent
0a57888e
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
163 additions
and
11 deletions
+163
-11
Aberration_Calibration.java
src/main/java/Aberration_Calibration.java
+98
-2
CalibrationHardwareInterface.java
src/main/java/CalibrationHardwareInterface.java
+39
-7
FocusingField.java
src/main/java/FocusingField.java
+26
-2
No files found.
src/main/java/Aberration_Calibration.java
View file @
b75d6c0f
...
...
@@ -50,6 +50,7 @@ import java.util.regex.Pattern;
//import FocusingField.FocusingFieldMeasurement;
//import FocusingField.MeasuredSample;
import
Jama.Matrix
;
// Download here: http://math.nist.gov/javanumerics/jama/
...
...
@@ -5018,6 +5019,8 @@ if (MORE_BUTTONS) {
if
(
label
.
equals
(
"Temp. Scan"
)
||
label
.
equals
(
"Focus Average"
))
{
checkSerialAndRestore
();
// returns true if did not change or was restored
boolean
modeAverage
=
label
.
equals
(
"Focus Average"
);
boolean
noTiltScan
=
true
;
boolean
useLMA
=
true
;
DEBUG_LEVEL
=
MASTER_DEBUG_LEVEL
;
MOTORS
.
focusingHistory
.
optimalMotorPosition
(
// recalculate calibration to estimate current distance from center PSF
FOCUS_MEASUREMENT_PARAMETERS
,
...
...
@@ -5033,6 +5036,8 @@ if (MORE_BUTTONS) {
gd
.
addCheckbox
(
"Turn lasers off to protect from overheating"
,
true
);
}
gd
.
addCheckbox
(
"Erase previous measurement history"
,
modeAverage
);
gd
.
addCheckbox
(
"Allow tilt scan when looking for the best fit"
,!
noTiltScan
);
gd
.
addCheckbox
(
"Use LMA calculations for focus/tilt"
,
useLMA
);
double
scanMinutes
=
modeAverage
?
1.0
:
30.0
;
gd
.
addNumericField
(
"Measure for "
,
scanMinutes
,
1
,
5
,
" minutes"
);
gd
.
showDialog
();
...
...
@@ -5043,6 +5048,9 @@ if (MORE_BUTTONS) {
if
(
MASTER_DEBUG_LEVEL
>
0
)
System
.
out
.
println
(
"Turned laser pointers off to protect from overheating"
);
}
if
(
gd
.
getNextBoolean
())
MOTORS
.
clearHistory
();
noTiltScan
=!
gd
.
getNextBoolean
();
useLMA
=
gd
.
getNextBoolean
();
// int startHistPos=MOTORS.historySize();
scanMinutes
=
gd
.
getNextNumber
();
long
startTime
=
System
.
nanoTime
();
long
endTime
=
startTime
+(
long
)
(
6
E10
*
scanMinutes
);
...
...
@@ -5079,7 +5087,45 @@ if (MORE_BUTTONS) {
}
}
// LMA version
double
pX0
=
FOCUS_MEASUREMENT_PARAMETERS
.
result_PX0
;
double
pY0
=
FOCUS_MEASUREMENT_PARAMETERS
.
result_PY0
;
double
[][][]
sampleCoord
=
FOCUS_MEASUREMENT_PARAMETERS
.
sampleCoordinates
(
//{x,y,r}
pX0
,
// lens center on the sensor
pY0
);
if
(
useLMA
){
FOCUSING_FIELD
=
new
FocusingField
(
FOCUS_MEASUREMENT_PARAMETERS
.
serialNumber
,
FOCUS_MEASUREMENT_PARAMETERS
.
lensSerial
,
// String lensSerial, // if null - do not add average
FOCUS_MEASUREMENT_PARAMETERS
.
comment
,
// String comment,
pX0
,
pY0
,
sampleCoord
,
this
.
SYNC_COMMAND
.
stopRequested
);
FOCUSING_FIELD
.
setDebugLevel
(
DEBUG_LEVEL
);
FOCUSING_FIELD
.
setAdjustMode
(
false
);
if
(
PROPERTIES
!=
null
)
FOCUSING_FIELD
.
getProperties
(
"FOCUSING_FIELD."
,
PROPERTIES
);
MOTORS
.
addCurrentHistoryToFocusingField
(
FOCUSING_FIELD
,
(
runs
==
0
)?
0
:(
MOTORS
.
historySize
()-
runs
),
MOTORS
.
historySize
());
// all newly acquired
if
(
modeAverage
){
// calculate/show average over the last run - only in "average" mode
double
[]
ZTM
=
FOCUSING_FIELD
.
averageZTM
(
noTiltScan
);
// no tilt scan - faster
if
(
MASTER_DEBUG_LEVEL
>
0
)
{
String
msg
=
"Failed to calulate average focus/tilt"
;
if
(
ZTM
!=
null
)
msg
=
"Average:\n"
+
"Relative focal shift "
+
IJ
.
d2s
(
ZTM
[
0
],
3
)+
"um\n"
+
"Horizontal tilt "
+
IJ
.
d2s
(
ZTM
[
1
],
3
)+
"um/mm\n"
+
"Vertical tilt "
+
IJ
.
d2s
(
ZTM
[
2
],
3
)+
"um/mm\n"
+
"Suggested M1 "
+
IJ
.
d2s
(
ZTM
[
3
],
0
)+
"steps\n"
+
"Suggested M2 "
+
IJ
.
d2s
(
ZTM
[
4
],
0
)+
"steps\n"
+
"Suggested M3 "
+
IJ
.
d2s
(
ZTM
[
5
],
0
)+
"steps"
;
System
.
out
.
println
(
msg
);
IJ
.
showMessage
(
msg
);
}
}
}
if
(
FOCUS_MEASUREMENT_PARAMETERS
.
saveResults
)
{
String
dir
=
getResultsPath
(
FOCUS_MEASUREMENT_PARAMETERS
);
File
dFile
=
new
File
(
dir
);
...
...
@@ -5113,8 +5159,16 @@ if (MORE_BUTTONS) {
FOCUS_MEASUREMENT_PARAMETERS
.
result_lastKT
,
FOCUS_MEASUREMENT_PARAMETERS
.
result_allHistoryKT
);
if
(
useLMA
){
String
focusingPath
=
dFile
+
Prefs
.
getFileSeparator
()+
lensPrefix
+
CAMERAS
.
getLastTimestampUnderscored
()+
".history-xml"
;
System
.
out
.
println
(
"Saving measurement history to "
+
focusingPath
);
FOCUSING_FIELD
.
saveXML
(
focusingPath
);
}
}
// Calculate and showaverage distances and tilts for measured history
if
(!
modeAverage
)
{
double
[]
lastKT
=
MOTORS
.
focusingHistory
.
temperatureLinearApproximation
(
runs
,
// number of last samples from history to use, 0 - use all
FOCUS_MEASUREMENT_PARAMETERS
.
lensDistanceWeightK
,
...
...
@@ -5140,6 +5194,48 @@ if (MORE_BUTTONS) {
System
.
out
.
println
(
msg
);
IJ
.
showMessage
(
"Info"
,
msg
);
}
// Now in LMA mode - recalculate and overwrite
if
(
useLMA
){
FOCUSING_FIELD
=
new
FocusingField
(
FOCUS_MEASUREMENT_PARAMETERS
.
serialNumber
,
FOCUS_MEASUREMENT_PARAMETERS
.
lensSerial
,
// String lensSerial, // if null - do not add average
FOCUS_MEASUREMENT_PARAMETERS
.
comment
,
// String comment,
pX0
,
pY0
,
sampleCoord
,
this
.
SYNC_COMMAND
.
stopRequested
);
FOCUSING_FIELD
.
setDebugLevel
(
DEBUG_LEVEL
);
FOCUSING_FIELD
.
setAdjustMode
(
false
);
if
(
PROPERTIES
!=
null
)
FOCUSING_FIELD
.
getProperties
(
"FOCUSING_FIELD."
,
PROPERTIES
);
MOTORS
.
addCurrentHistoryToFocusingField
(
FOCUSING_FIELD
);
// all, not just newly acquired
if
(
MASTER_DEBUG_LEVEL
>
0
){
System
.
out
.
println
(
"*** Calculating focal distance shift for each of "
+
MOTORS
.
historySize
()+
" recorded measurments ***"
);
}
double
[][]
allZTM
=
FOCUSING_FIELD
.
getAllZTM
(
noTiltScan
);
// no tilt scan (supposed to be adjusted
lastKT
=
MOTORS
.
focusingHistory
.
temperatureLinearApproximation
(
allZTM
,
runs
);
allKT
=
MOTORS
.
focusingHistory
.
temperatureLinearApproximation
(
allZTM
,
0
);
FOCUS_MEASUREMENT_PARAMETERS
.
result_lastKT
=
lastKT
[
1
];
// focal distance temperature coefficient (um/C), measured from last run
FOCUS_MEASUREMENT_PARAMETERS
.
result_lastFD20
=
lastKT
[
0
]+
20
*
lastKT
[
1
];
// focal distance for 20C, measured from last run
FOCUS_MEASUREMENT_PARAMETERS
.
result_allHistoryKT
=
allKT
[
1
];
// focal distance temperature coefficient (um/C), measured from all the measurement histgory
FOCUS_MEASUREMENT_PARAMETERS
.
result_allHistoryFD20
=
allKT
[
0
]+
20
*
allKT
[
1
];
// focal distance for 20C, measured from all the measurement histgory
if
(
MASTER_DEBUG_LEVEL
>
0
){
String
msg
=
"Determined by LMA: Focal distance temperature expansion is "
+
IJ
.
d2s
(
FOCUS_MEASUREMENT_PARAMETERS
.
result_lastKT
,
2
)+
" ("
+
IJ
.
d2s
(
FOCUS_MEASUREMENT_PARAMETERS
.
result_allHistoryKT
,
2
)+
")"
+
" microns per C, measured from this run (measured from all the history)\n"
+
"Focal distance at 20C is "
+
IJ
.
d2s
(
FOCUS_MEASUREMENT_PARAMETERS
.
result_lastFD20
,
2
)+
" ("
+
IJ
.
d2s
(
FOCUS_MEASUREMENT_PARAMETERS
.
result_allHistoryFD20
,
2
)+
")"
+
" microns, measured from this run (measured from all the history)"
;
System
.
out
.
println
(
msg
);
IJ
.
showMessage
(
"Info"
,
msg
);
}
}
}
saveCurrentConfig
();
return
;
...
...
@@ -8738,7 +8834,7 @@ if (MORE_BUTTONS) {
//get measurement
FocusingField
.
FocusingFieldMeasurement
fFMeasurement
=
MOTORS
.
getThisFFMeasurement
(
FOCUSING_FIELD
);
// calculate z, tx, ty, m1,m2,m3
double
[]
zTxTyM1M2M3
=
FOCUSING_FIELD
.
adjustLMA
(
f
FMeasurement
,
false
);
double
[]
zTxTyM1M2M3
=
FOCUSING_FIELD
.
adjustLMA
(
f
alse
,
fFMeasurement
,
false
);
// allow tilt scan
// show dialog: Apply, re-calculate, exit
int
[]
currentMotors
=
fFMeasurement
.
motors
;
int
[]
newMotors
=
currentMotors
.
clone
();
...
...
@@ -8836,7 +8932,7 @@ if (MORE_BUTTONS) {
DEBUG_LEVEL
=
MASTER_DEBUG_LEVEL
;
FOCUSING_FIELD
.
setDebugLevel
(
DEBUG_LEVEL
);
if
(
parallelMove
){
// ignore/recalculate newMotors data
zTxTyM1M2M3
=
FOCUSING_FIELD
.
adjustLMA
(
f
FMeasurement
,
true
);
// recalculate with parallel move only
zTxTyM1M2M3
=
FOCUSING_FIELD
.
adjustLMA
(
f
alse
,
fFMeasurement
,
true
);
// recalculate with parallel move only, allow tilt scan
newMotors
=
currentMotors
.
clone
();
if
(
zTxTyM1M2M3
!=
null
){
newMotors
[
0
]=(
int
)
Math
.
round
(
zTxTyM1M2M3
[
3
]);
...
...
src/main/java/CalibrationHardwareInterface.java
View file @
b75d6c0f
...
...
@@ -3100,15 +3100,22 @@ public class CalibrationHardwareInterface {
return
null
;
}
// public void addCurrentHistoryToFocusingField(FocusingField focusingField){
// this.focusingHistory.addCurrentHistory(focusingField);
// }
public
void
addCurrentHistoryToFocusingField
(
FocusingField
focusingFiel
d
){
for
(
int
i
=
0
;
i
<
historySize
()
;
i
++){
public
void
addCurrentHistoryToFocusingField
(
FocusingField
focusingField
,
int
start
,
int
en
d
){
for
(
int
i
=
start
;
i
<
end
;
i
++){
addCurrentHistoryToFocusingField
(
focusingField
,
i
);
}
// this.focusingHistory.addCurrentHistory(focusingField);
}
}
public
void
addCurrentHistoryToFocusingField
(
FocusingField
focusingField
){
addCurrentHistoryToFocusingField
(
focusingField
,
0
,
historySize
()
);
}
public
void
addCurrentHistoryToFocusingField
(
FocusingField
focusingField
,
...
...
@@ -5086,6 +5093,31 @@ if (debugLevel>=debugThreshold) System.out.println(i+" "+diff[0]+" "+diff[1]+" "
double
[]
polyCoeff
=
pa
.
polynomialApproximation1d
(
data
,
1
);
// just linear
return
polyCoeff
;
}
public
double
[]
temperatureLinearApproximation
(
double
[][]
ZTM
,
// Z, tXx, tY, m1,m2,m3 found with LMA
int
numSamples
// number of last samples from history to use, 0 - use all
){
if
(
numSamples
<=
0
)
numSamples
=
this
.
history
.
size
();
if
(
numSamples
>
this
.
history
.
size
())
numSamples
=
this
.
history
.
size
();
int
firstSample
=
this
.
history
.
size
()-
numSamples
;
int
numGoodSamples
=
0
;
for
(
int
nSample
=
0
;
nSample
<
numSamples
;
nSample
++){
if
(
ZTM
[
firstSample
+
nSample
]!=
null
)
numGoodSamples
++;
}
double
[][]
data
=
new
double
[
numGoodSamples
][
2
];
// no weights
int
index
=
0
;
for
(
int
nSample
=
0
;
nSample
<
numSamples
;
nSample
++)
if
(
ZTM
[
firstSample
+
nSample
]!=
null
)
{
data
[
index
][
0
]=
this
.
history
.
get
(
firstSample
+
nSample
).
getTemperature
();
data
[
index
++][
1
]=
ZTM
[
firstSample
+
nSample
][
0
];
// Z
}
PolynomialApproximation
pa
=
new
PolynomialApproximation
(
debugLevel
);
double
[]
polyCoeff
=
pa
.
polynomialApproximation1d
(
data
,
1
);
// just linear
return
polyCoeff
;
}
/**
* will return same coordinates if tolerances are met
* @param useTheBest
...
...
src/main/java/FocusingField.java
View file @
b75d6c0f
...
...
@@ -4373,7 +4373,31 @@ public boolean LevenbergMarquardt(
}
//,
public
double
[][]
getAllZTM
(
boolean
noTiltScan
){
double
[][]
result
=
new
double
[
measurements
.
size
()][
6
];
for
(
int
i
=
0
;
i
<
result
.
length
;
i
++)
result
[
i
]=
adjustLMA
(
noTiltScan
,
measurements
.
get
(
i
),
false
);
return
result
;
}
public
double
[]
averageZTM
(
boolean
noTiltScan
){
double
[]
result
=
new
double
[
6
];
for
(
int
i
=
0
;
i
<
result
.
length
;
i
++)
result
[
i
]=
0.0
;
int
num
=
0
;
for
(
FocusingFieldMeasurement
measurement:
measurements
){
double
[]
ZTM
=
adjustLMA
(
noTiltScan
,
measurement
,
false
);
if
(
ZTM
!=
null
)
{
for
(
int
i
=
0
;
i
<
result
.
length
;
i
++)
result
[
i
]+=
ZTM
[
i
];
num
++;
}
}
if
(
num
==
0
)
return
null
;
for
(
int
i
=
0
;
i
<
result
.
length
;
i
++)
result
[
i
]/=
num
;
return
result
;
}
public
double
[]
adjustLMA
(
boolean
noTiltScan
,
FocusingFieldMeasurement
measurement
,
boolean
parallelMove
){
if
(!
testMeasurement
(
...
...
@@ -4381,8 +4405,8 @@ public boolean LevenbergMarquardt(
zMin
,
//+best_qb_corr[0],
zMax
,
//+best_qb_corr[0],
zStep
,
tMin
,
tMax
,
(
noTiltScan
?
0.0
:
tMin
)
,
(
noTiltScan
?
0.0
:
tMax
)
,
tStep
))
{
if
(
debugLevel
>
0
)
System
.
out
.
println
(
"adjustLMA() failed"
);
return
null
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment