Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Thomas White
pinkindexer
Commits
54dad96a
Commit
54dad96a
authored
Mar 02, 2020
by
Yaroslav Gevorkov
Browse files
Merge branch 'master' of
https://stash.desy.de/scm/~gevorkov/pinkindexer
parents
0e3742ce
8281cc6d
Changes
9
Hide whitespace changes
Inline
Side-by-side
include/Backprojection.h
View file @
54dad96a
...
@@ -11,7 +11,7 @@ namespace pinkIndexer
...
@@ -11,7 +11,7 @@ namespace pinkIndexer
public:
public:
Backprojection
(
const
ExperimentSettings
&
experimentSettings
);
Backprojection
(
const
ExperimentSettings
&
experimentSettings
);
void
backProject
(
const
Eigen
::
Matrix2Xf
&
detectorPeaks_m
,
Eigen
::
Matrix3Xf
&
u
c
sDirections
,
Eigen
::
Array2Xf
&
u
c
sBorderNorms
)
const
;
void
backProject
(
const
Eigen
::
Matrix2Xf
&
detectorPeaks_m
,
Eigen
::
Matrix3Xf
&
u
l
sDirections
,
Eigen
::
Array2Xf
&
u
l
sBorderNorms
)
const
;
private:
private:
ExperimentSettings
experimentSettings
;
ExperimentSettings
experimentSettings
;
...
...
include/PinkIndexer.h
View file @
54dad96a
...
@@ -58,9 +58,9 @@ namespace pinkIndexer
...
@@ -58,9 +58,9 @@ namespace pinkIndexer
private:
private:
// reduces number of peaks according to parameter "ConsideredPeaksCount"
// reduces number of peaks according to parameter "ConsideredPeaksCount"
void
reducePeakCount
(
Eigen
::
Matrix3Xf
&
u
c
sDirections
,
Eigen
::
Array2Xf
&
u
c
sBorderNorms
,
Eigen
::
RowVectorXf
&
intensities
,
void
reducePeakCount
(
Eigen
::
Matrix3Xf
&
u
l
sDirections
,
Eigen
::
Array2Xf
&
u
l
sBorderNorms
,
Eigen
::
RowVectorXf
&
intensities
,
const
Eigen
::
Matrix2Xf
&
detectorPeaks_m
);
const
Eigen
::
Matrix2Xf
&
detectorPeaks_m
);
void
refine
(
Lattice
&
indexedLattice
,
Eigen
::
Vector2f
&
centerShift
,
const
Eigen
::
Matrix3Xf
&
u
c
sDirections
,
const
Eigen
::
Array2Xf
&
u
c
sBorderNorms
,
void
refine
(
Lattice
&
indexedLattice
,
Eigen
::
Vector2f
&
centerShift
,
const
Eigen
::
Matrix3Xf
&
u
l
sDirections
,
const
Eigen
::
Array2Xf
&
u
l
sBorderNorms
,
const
Eigen
::
Matrix2Xf
&
detectorPeaks_m
,
int
threadCount
);
const
Eigen
::
Matrix2Xf
&
detectorPeaks_m
,
int
threadCount
);
float
getAngleResolution
();
float
getAngleResolution
();
...
...
include/Refinement.h
View file @
54dad96a
...
@@ -15,16 +15,16 @@ namespace pinkIndexer
...
@@ -15,16 +15,16 @@ namespace pinkIndexer
Refinement
(
float
tolerance
);
Refinement
(
float
tolerance
);
Refinement
(
float
tolerance
,
const
Backprojection
&
backprojection
);
Refinement
(
float
tolerance
,
const
Backprojection
&
backprojection
);
void
refineFixedLattice
(
Lattice
&
lattice
,
const
Eigen
::
Matrix3Xf
&
u
c
sDirections
,
const
Eigen
::
Array2Xf
&
u
c
sBorderNorms
);
void
refineFixedLattice
(
Lattice
&
lattice
,
const
Eigen
::
Matrix3Xf
&
u
l
sDirections
,
const
Eigen
::
Array2Xf
&
u
l
sBorderNorms
);
void
refineVariableLattice
(
Lattice
&
lattice
,
const
Eigen
::
Matrix3Xf
&
u
c
sDirections
,
const
Eigen
::
Array2Xf
&
u
c
sBorderNorms
);
void
refineVariableLattice
(
Lattice
&
lattice
,
const
Eigen
::
Matrix3Xf
&
u
l
sDirections
,
const
Eigen
::
Array2Xf
&
u
l
sBorderNorms
);
void
refineVariableLatticeWithCenter
(
Lattice
&
lattice
,
Eigen
::
Vector2f
&
centerShift
,
const
Eigen
::
Matrix2Xf
&
detectorPeaks_m
);
void
refineVariableLatticeWithCenter
(
Lattice
&
lattice
,
Eigen
::
Vector2f
&
centerShift
,
const
Eigen
::
Matrix2Xf
&
detectorPeaks_m
);
void
refineCenter
(
Eigen
::
Vector2f
&
centerShift
,
const
Eigen
::
Matrix3f
&
basis
,
const
Eigen
::
Matrix2Xf
&
detectorPeaks_m
,
float
startStepSize
=
20e-6
);
void
refineCenter
(
Eigen
::
Vector2f
&
centerShift
,
const
Eigen
::
Matrix3f
&
basis
,
const
Eigen
::
Matrix2Xf
&
detectorPeaks_m
,
float
startStepSize
=
20e-6
);
int
getFittedPeaksCount
(
Lattice
&
lattice
,
const
Eigen
::
Matrix3Xf
&
u
c
sDirections
,
const
Eigen
::
Array2Xf
&
u
c
sBorderNorms
);
int
getFittedPeaksCount
(
Lattice
&
lattice
,
const
Eigen
::
Matrix3Xf
&
u
l
sDirections
,
const
Eigen
::
Array2Xf
&
u
l
sBorderNorms
);
int
getFittedPeaks
(
Lattice
&
lattice
,
Eigen
::
Array
<
bool
,
Eigen
::
Dynamic
,
1
>&
fittedPeaks
,
const
Eigen
::
Matrix3Xf
&
u
c
sDirections
,
int
getFittedPeaks
(
Lattice
&
lattice
,
Eigen
::
Array
<
bool
,
Eigen
::
Dynamic
,
1
>&
fittedPeaks
,
const
Eigen
::
Matrix3Xf
&
u
l
sDirections
,
const
Eigen
::
Array2Xf
&
u
c
sBorderNorms
);
const
Eigen
::
Array2Xf
&
u
l
sBorderNorms
);
double
getMeanDefect
(
const
Eigen
::
Matrix3f
&
basis
,
const
Eigen
::
Matrix3Xf
&
u
c
sDirections
,
const
Eigen
::
Array2Xf
&
u
c
sBorderNorms
,
double
getMeanDefect
(
const
Eigen
::
Matrix3f
&
basis
,
const
Eigen
::
Matrix3Xf
&
u
l
sDirections
,
const
Eigen
::
Array2Xf
&
u
l
sBorderNorms
,
bool
significantChangesToPreviousCall
=
true
);
bool
significantChangesToPreviousCall
=
true
);
void
setTolerance
(
float
tolerance
)
void
setTolerance
(
float
tolerance
)
...
@@ -37,10 +37,10 @@ namespace pinkIndexer
...
@@ -37,10 +37,10 @@ namespace pinkIndexer
}
}
private:
private:
void
getDefects
(
Eigen
::
ArrayXf
&
defects
,
const
Eigen
::
Matrix3f
&
basis
,
const
Eigen
::
Matrix3Xf
&
u
c
sDirections
,
const
Eigen
::
Array2Xf
&
u
c
sBorderNorms
,
void
getDefects
(
Eigen
::
ArrayXf
&
defects
,
const
Eigen
::
Matrix3f
&
basis
,
const
Eigen
::
Matrix3Xf
&
u
l
sDirections
,
const
Eigen
::
Array2Xf
&
u
l
sBorderNorms
,
bool
significantChangesToPreviousCall
=
true
);
bool
significantChangesToPreviousCall
=
true
);
void
getCenterShiftedBackprojection
(
Eigen
::
Matrix3Xf
&
u
c
sDirections
,
Eigen
::
Array2Xf
&
u
c
sBorderNorms
,
const
Eigen
::
Matrix2Xf
&
detectorPeaks_m
,
void
getCenterShiftedBackprojection
(
Eigen
::
Matrix3Xf
&
u
l
sDirections
,
Eigen
::
Array2Xf
&
u
l
sBorderNorms
,
const
Eigen
::
Matrix2Xf
&
detectorPeaks_m
,
const
Eigen
::
Vector2f
&
centerShift
);
const
Eigen
::
Vector2f
&
centerShift
);
float
tolerance
;
float
tolerance
;
...
@@ -49,7 +49,7 @@ namespace pinkIndexer
...
@@ -49,7 +49,7 @@ namespace pinkIndexer
// preallocation
// preallocation
Eigen
::
ArrayXf
defects
;
Eigen
::
ArrayXf
defects
;
Eigen
::
Array2Xf
u
c
sBorderNormsSquared
;
Eigen
::
Array2Xf
u
l
sBorderNormsSquared
;
Eigen
::
Matrix3Xf
millerIndices_close
;
Eigen
::
Matrix3Xf
millerIndices_close
;
Eigen
::
Matrix3Xf
millerIndices_far
;
Eigen
::
Matrix3Xf
millerIndices_far
;
Eigen
::
Matrix3Xf
candidatePeaks
;
Eigen
::
Matrix3Xf
candidatePeaks
;
...
@@ -63,7 +63,7 @@ namespace pinkIndexer
...
@@ -63,7 +63,7 @@ namespace pinkIndexer
Eigen
::
ArrayXf
meanDefects_centerAdjustment
;
Eigen
::
ArrayXf
meanDefects_centerAdjustment
;
int
validCandidatePeaksCount
;
int
validCandidatePeaksCount
;
Eigen
::
Matrix2Xf
detectorPeaks_m_shifted
;
Eigen
::
Matrix2Xf
detectorPeaks_m_shifted
;
Eigen
::
Matrix3Xf
u
c
sDirections
;
Eigen
::
Matrix3Xf
u
l
sDirections
;
Eigen
::
Array2Xf
u
c
sBorderNorms
;
Eigen
::
Array2Xf
u
l
sBorderNorms
;
};
};
}
// namespace pinkIndexer
}
// namespace pinkIndexer
\ No newline at end of file
include/Sinogram.h
View file @
54dad96a
...
@@ -18,9 +18,9 @@ namespace pinkIndexer
...
@@ -18,9 +18,9 @@ namespace pinkIndexer
void
setSinogramAngleResolution
(
float
angleResolution_deg
);
void
setSinogramAngleResolution
(
float
angleResolution_deg
);
void
computeSinogram
(
const
Eigen
::
Matrix3Xf
&
u
c
sDirections
,
const
Eigen
::
Matrix2Xf
u
c
sBorderNorms
);
void
computeSinogram
(
const
Eigen
::
Matrix3Xf
&
u
l
sDirections
,
const
Eigen
::
Matrix2Xf
u
l
sBorderNorms
);
void
computeSinogramParallel
(
const
Eigen
::
Matrix3Xf
&
u
c
sDirections
,
const
Eigen
::
Matrix2Xf
u
c
sBorderNorms
,
int
slaveThreadCount
);
void
computeSinogramParallel
(
const
Eigen
::
Matrix3Xf
&
u
l
sDirections
,
const
Eigen
::
Matrix2Xf
u
l
sBorderNorms
,
int
slaveThreadCount
);
void
computeSinogramParallel2
(
const
Eigen
::
Matrix3Xf
&
u
c
sDirections
,
const
Eigen
::
Matrix2Xf
u
c
sBorderNorms
,
int
slaveThreadCount
);
void
computeSinogramParallel2
(
const
Eigen
::
Matrix3Xf
&
u
l
sDirections
,
const
Eigen
::
Matrix2Xf
u
l
sBorderNorms
,
int
slaveThreadCount
);
void
getBestRotation
(
Eigen
::
AngleAxisf
&
bestRotation
);
void
getBestRotation
(
Eigen
::
AngleAxisf
&
bestRotation
);
...
...
src/Backprojection.cpp
View file @
54dad96a
...
@@ -14,7 +14,7 @@ namespace pinkIndexer
...
@@ -14,7 +14,7 @@ namespace pinkIndexer
{
{
}
}
void
Backprojection
::
backProject
(
const
Matrix2Xf
&
detectorPeaks_m
,
Matrix3Xf
&
u
c
sDirections
,
Array2Xf
&
u
c
sBorderNorms
)
const
void
Backprojection
::
backProject
(
const
Matrix2Xf
&
detectorPeaks_m
,
Matrix3Xf
&
u
l
sDirections
,
Array2Xf
&
u
l
sBorderNorms
)
const
{
{
Matrix3Xf
projectionDirections
(
3
,
detectorPeaks_m
.
cols
());
Matrix3Xf
projectionDirections
(
3
,
detectorPeaks_m
.
cols
());
projectionDirections
<<
RowVectorXf
::
Constant
(
1
,
detectorPeaks_m
.
cols
(),
experimentSettings
.
getDetectorDistance_m
()),
detectorPeaks_m
.
row
(
0
),
projectionDirections
<<
RowVectorXf
::
Constant
(
1
,
detectorPeaks_m
.
cols
(),
experimentSettings
.
getDetectorDistance_m
()),
detectorPeaks_m
.
row
(
0
),
...
@@ -26,11 +26,11 @@ namespace pinkIndexer
...
@@ -26,11 +26,11 @@ namespace pinkIndexer
Matrix3Xf
backprojectedPointsFar
=
projectionDirections
*
experimentSettings
.
getReciprocalLambdaShort_1A
();
Matrix3Xf
backprojectedPointsFar
=
projectionDirections
*
experimentSettings
.
getReciprocalLambdaShort_1A
();
backprojectedPointsFar
.
row
(
0
)
-=
RowVectorXf
::
Constant
(
backprojectedPointsFar
.
cols
(),
experimentSettings
.
getReciprocalLambdaShort_1A
());
backprojectedPointsFar
.
row
(
0
)
-=
RowVectorXf
::
Constant
(
backprojectedPointsFar
.
cols
(),
experimentSettings
.
getReciprocalLambdaShort_1A
());
u
c
sBorderNorms
.
resize
(
2
,
detectorPeaks_m
.
cols
());
u
l
sBorderNorms
.
resize
(
2
,
detectorPeaks_m
.
cols
());
u
c
sBorderNorms
.
row
(
0
)
=
backprojectedPointsClose
.
colwise
().
norm
().
array
()
-
experimentSettings
.
getReflectionRadius
();
u
l
sBorderNorms
.
row
(
0
)
=
backprojectedPointsClose
.
colwise
().
norm
().
array
()
-
experimentSettings
.
getReflectionRadius
();
u
c
sBorderNorms
.
row
(
1
)
=
backprojectedPointsFar
.
colwise
().
norm
().
array
()
+
experimentSettings
.
getReflectionRadius
();
u
l
sBorderNorms
.
row
(
1
)
=
backprojectedPointsFar
.
colwise
().
norm
().
array
()
+
experimentSettings
.
getReflectionRadius
();
u
c
sDirections
=
backprojectedPointsFar
.
colwise
().
normalized
();
u
l
sDirections
=
backprojectedPointsFar
.
colwise
().
normalized
();
}
}
}
// namespace pinkIndexer
}
// namespace pinkIndexer
\ No newline at end of file
src/PinkIndexer.cpp
View file @
54dad96a
...
@@ -48,26 +48,26 @@ namespace pinkIndexer
...
@@ -48,26 +48,26 @@ namespace pinkIndexer
if
(
detectorPeaks_m
.
cols
()
<
2
)
if
(
detectorPeaks_m
.
cols
()
<
2
)
return
0
;
return
0
;
Matrix3Xf
u
c
sDirections
;
// Unit vector of ULS
Matrix3Xf
u
l
sDirections
;
// Unit vector of ULS
Array2Xf
u
c
sBorderNorms
;
// 2 borders between intersection with the 2 Ewald spheres
Array2Xf
u
l
sBorderNorms
;
// 2 borders between intersection with the 2 Ewald spheres
backprojection
.
backProject
(
detectorPeaks_m
,
u
c
sDirections
,
u
c
sBorderNorms
);
backprojection
.
backProject
(
detectorPeaks_m
,
u
l
sDirections
,
u
l
sBorderNorms
);
Matrix3Xf
u
c
sDirections_reduced
=
u
c
sDirections
;
Matrix3Xf
u
l
sDirections_reduced
=
u
l
sDirections
;
Array2Xf
u
c
sBorderNorms_reduced
=
u
c
sBorderNorms
;
Array2Xf
u
l
sBorderNorms_reduced
=
u
l
sBorderNorms
;
reducePeakCount
(
u
c
sDirections_reduced
,
u
c
sBorderNorms_reduced
,
intensities
,
detectorPeaks_m
);
reducePeakCount
(
u
l
sDirections_reduced
,
u
l
sBorderNorms_reduced
,
intensities
,
detectorPeaks_m
);
if
(
threadCount
==
1
)
//threads from crystfel (--pinkIndexer_thread_count)
if
(
threadCount
==
1
)
//threads from crystfel (--pinkIndexer_thread_count)
{
{
sinogram
.
computeSinogram
(
u
c
sDirections_reduced
,
u
c
sBorderNorms_reduced
);
sinogram
.
computeSinogram
(
u
l
sDirections_reduced
,
u
l
sBorderNorms_reduced
);
}
}
else
if
(
threadCount
<
32
)
else
if
(
threadCount
<
32
)
{
{
sinogram
.
computeSinogramParallel
(
u
c
sDirections_reduced
,
u
c
sBorderNorms_reduced
,
threadCount
);
sinogram
.
computeSinogramParallel
(
u
l
sDirections_reduced
,
u
l
sBorderNorms_reduced
,
threadCount
);
}
}
else
// probably not ran in parellel to other instances
else
// probably not ran in parellel to other instances
{
{
int
slaveThreadCount
=
threadCount
-
1
;
int
slaveThreadCount
=
threadCount
-
1
;
sinogram
.
computeSinogramParallel2
(
u
c
sDirections_reduced
,
u
c
sBorderNorms_reduced
,
slaveThreadCount
);
sinogram
.
computeSinogramParallel2
(
u
l
sDirections_reduced
,
u
l
sBorderNorms_reduced
,
slaveThreadCount
);
}
}
AngleAxisf
bestRotation
;
AngleAxisf
bestRotation
;
...
@@ -76,18 +76,18 @@ namespace pinkIndexer
...
@@ -76,18 +76,18 @@ namespace pinkIndexer
Matrix3f
bestBasis
=
bestRotation
*
sampleLattice
.
getBasis
();
Matrix3f
bestBasis
=
bestRotation
*
sampleLattice
.
getBasis
();
indexedLattice
=
Lattice
(
bestBasis
);
indexedLattice
=
Lattice
(
bestBasis
);
refine
(
indexedLattice
,
centerShift
,
u
c
sDirections
,
u
c
sBorderNorms
,
detectorPeaks_m
,
threadCount
);
refine
(
indexedLattice
,
centerShift
,
u
l
sDirections
,
u
l
sBorderNorms
,
detectorPeaks_m
,
threadCount
);
indexedLattice
.
minimize
();
indexedLattice
.
minimize
();
indexedLattice
.
reorder
(
sampleLattice
);
//reorder lattice vectors to match sample lattice (from crystfel)
indexedLattice
.
reorder
(
sampleLattice
);
//reorder lattice vectors to match sample lattice (from crystfel)
// return how many peaks have been fitted correctly (according to tolerance)
// return how many peaks have been fitted correctly (according to tolerance)
return
refinement
.
getFittedPeaks
(
indexedLattice
,
fittedPeaks
,
u
c
sDirections
,
u
c
sBorderNorms
);
return
refinement
.
getFittedPeaks
(
indexedLattice
,
fittedPeaks
,
u
l
sDirections
,
u
l
sBorderNorms
);
// sinogram.saveToFile("C:\\DesyFiles\\workspaces\\VisualStudio_workspace\\pinkIndexer\\workfolder\\sinogram");
// sinogram.saveToFile("C:\\DesyFiles\\workspaces\\VisualStudio_workspace\\pinkIndexer\\workfolder\\sinogram");
}
}
void
PinkIndexer
::
refine
(
Lattice
&
indexedLattice
,
Vector2f
&
centerShift
,
const
Matrix3Xf
&
u
c
sDirections
,
const
Array2Xf
&
u
c
sBorderNorms
,
void
PinkIndexer
::
refine
(
Lattice
&
indexedLattice
,
Vector2f
&
centerShift
,
const
Matrix3Xf
&
u
l
sDirections
,
const
Array2Xf
&
u
l
sBorderNorms
,
const
Matrix2Xf
&
detectorPeaks_m
,
int
threadCount
)
const
Matrix2Xf
&
detectorPeaks_m
,
int
threadCount
)
{
{
centerShift
.
setZero
();
centerShift
.
setZero
();
...
@@ -98,32 +98,32 @@ namespace pinkIndexer
...
@@ -98,32 +98,32 @@ namespace pinkIndexer
break
;
break
;
case
RefinementType
::
fixedLatticeParameters
:
case
RefinementType
::
fixedLatticeParameters
:
refinement
.
setTolerance
(
min
(
finalRefinementTolerance
*
2.0
,
0.12
));
refinement
.
setTolerance
(
min
(
finalRefinementTolerance
*
2.0
,
0.12
));
refinement
.
refineFixedLattice
(
indexedLattice
,
u
c
sDirections
,
u
c
sBorderNorms
);
refinement
.
refineFixedLattice
(
indexedLattice
,
u
l
sDirections
,
u
l
sBorderNorms
);
refinement
.
setTolerance
(
finalRefinementTolerance
);
refinement
.
setTolerance
(
finalRefinementTolerance
);
refinement
.
refineFixedLattice
(
indexedLattice
,
u
c
sDirections
,
u
c
sBorderNorms
);
refinement
.
refineFixedLattice
(
indexedLattice
,
u
l
sDirections
,
u
l
sBorderNorms
);
break
;
break
;
case
RefinementType
::
variableLatticeParameters
:
case
RefinementType
::
variableLatticeParameters
:
refinement
.
setTolerance
(
min
(
finalRefinementTolerance
*
2.0
,
0.12
));
refinement
.
setTolerance
(
min
(
finalRefinementTolerance
*
2.0
,
0.12
));
refinement
.
refineVariableLattice
(
indexedLattice
,
u
c
sDirections
,
u
c
sBorderNorms
);
refinement
.
refineVariableLattice
(
indexedLattice
,
u
l
sDirections
,
u
l
sBorderNorms
);
refinement
.
setTolerance
(
finalRefinementTolerance
);
refinement
.
setTolerance
(
finalRefinementTolerance
);
refinement
.
refineVariableLattice
(
indexedLattice
,
u
c
sDirections
,
u
c
sBorderNorms
);
refinement
.
refineVariableLattice
(
indexedLattice
,
u
l
sDirections
,
u
l
sBorderNorms
);
break
;
break
;
case
RefinementType
::
firstFixedThenVariableLatticeParameters
:
case
RefinementType
::
firstFixedThenVariableLatticeParameters
:
refinement
.
setTolerance
(
min
(
finalRefinementTolerance
*
2.5
,
0.12
));
refinement
.
setTolerance
(
min
(
finalRefinementTolerance
*
2.5
,
0.12
));
refinement
.
refineFixedLattice
(
indexedLattice
,
u
c
sDirections
,
u
c
sBorderNorms
);
refinement
.
refineFixedLattice
(
indexedLattice
,
u
l
sDirections
,
u
l
sBorderNorms
);
refinement
.
setTolerance
(
min
(
finalRefinementTolerance
*
1.8
,
0.10
));
refinement
.
setTolerance
(
min
(
finalRefinementTolerance
*
1.8
,
0.10
));
refinement
.
refineVariableLattice
(
indexedLattice
,
u
c
sDirections
,
u
c
sBorderNorms
);
refinement
.
refineVariableLattice
(
indexedLattice
,
u
l
sDirections
,
u
l
sBorderNorms
);
refinement
.
setTolerance
(
finalRefinementTolerance
);
refinement
.
setTolerance
(
finalRefinementTolerance
);
refinement
.
refineVariableLattice
(
indexedLattice
,
u
c
sDirections
,
u
c
sBorderNorms
);
refinement
.
refineVariableLattice
(
indexedLattice
,
u
l
sDirections
,
u
l
sBorderNorms
);
break
;
break
;
case
RefinementType
::
firstFixedThenVariableLatticeParametersMultiSeed
:
case
RefinementType
::
firstFixedThenVariableLatticeParametersMultiSeed
:
{
{
constexpr
int
refinementTries
=
1000
;
constexpr
int
refinementTries
=
1000
;
//TODO: increase if better refinement needed
int
fittedNodesCount
[
refinementTries
];
int
fittedNodesCount
[
refinementTries
];
double
fittedNodesMeanDefects
[
refinementTries
];
double
fittedNodesMeanDefects
[
refinementTries
];
Lattice
fittedLattices
[
refinementTries
];
Lattice
fittedLattices
[
refinementTries
];
float
maxRelativeDeviation
=
0.0125
;
float
maxRelativeDeviation
=
0.0125
;
//TODO: Parameter??
Array
<
float
,
1
,
3
>
columnDeviationNorms
=
indexedLattice
.
getBasis
().
colwise
().
norm
()
*
maxRelativeDeviation
;
Array
<
float
,
1
,
3
>
columnDeviationNorms
=
indexedLattice
.
getBasis
().
colwise
().
norm
()
*
maxRelativeDeviation
;
#ifdef OPENMP_AVAILABLE
#ifdef OPENMP_AVAILABLE
...
@@ -146,14 +146,14 @@ namespace pinkIndexer
...
@@ -146,14 +146,14 @@ namespace pinkIndexer
fittedLattices
[
i
]
=
Lattice
(
currentBasis
);
fittedLattices
[
i
]
=
Lattice
(
currentBasis
);
refinement
.
setTolerance
(
min
(
finalRefinementTolerance
*
2.5
,
0.12
));
refinement
.
setTolerance
(
min
(
finalRefinementTolerance
*
2.5
,
0.12
));
refinement
.
refineFixedLattice
(
fittedLattices
[
i
],
u
c
sDirections
,
u
c
sBorderNorms
);
refinement
.
refineFixedLattice
(
fittedLattices
[
i
],
u
l
sDirections
,
u
l
sBorderNorms
);
refinement
.
setTolerance
(
min
(
finalRefinementTolerance
*
1.8
,
0.10
));
refinement
.
setTolerance
(
min
(
finalRefinementTolerance
*
1.8
,
0.10
));
refinement
.
refineVariableLattice
(
fittedLattices
[
i
],
u
c
sDirections
,
u
c
sBorderNorms
);
refinement
.
refineVariableLattice
(
fittedLattices
[
i
],
u
l
sDirections
,
u
l
sBorderNorms
);
refinement
.
setTolerance
(
finalRefinementTolerance
);
refinement
.
setTolerance
(
finalRefinementTolerance
);
refinement
.
refineVariableLattice
(
fittedLattices
[
i
],
u
c
sDirections
,
u
c
sBorderNorms
);
refinement
.
refineVariableLattice
(
fittedLattices
[
i
],
u
l
sDirections
,
u
l
sBorderNorms
);
fittedNodesCount
[
i
]
=
refinement
.
getFittedPeaksCount
(
fittedLattices
[
i
],
u
c
sDirections
,
u
c
sBorderNorms
);
fittedNodesCount
[
i
]
=
refinement
.
getFittedPeaksCount
(
fittedLattices
[
i
],
u
l
sDirections
,
u
l
sBorderNorms
);
fittedNodesMeanDefects
[
i
]
=
refinement
.
getMeanDefect
(
fittedLattices
[
i
].
getBasis
(),
u
c
sDirections
,
u
c
sBorderNorms
);
fittedNodesMeanDefects
[
i
]
=
refinement
.
getMeanDefect
(
fittedLattices
[
i
].
getBasis
(),
u
l
sDirections
,
u
l
sBorderNorms
);
}
}
int
maxFittedNodesCount
=
1
;
int
maxFittedNodesCount
=
1
;
...
@@ -164,7 +164,7 @@ namespace pinkIndexer
...
@@ -164,7 +164,7 @@ namespace pinkIndexer
// (fittedNodesCount[i] == maxFittedNodesCount && fittedNodesMeanDefects[i] < minFittedNodesMeanDefect))
// (fittedNodesCount[i] == maxFittedNodesCount && fittedNodesMeanDefects[i] < minFittedNodesMeanDefect))
if
(
fittedNodesCount
[
i
]
/
maxFittedNodesCount
>
1.2
||
if
(
fittedNodesCount
[
i
]
/
maxFittedNodesCount
>
1.2
||
((
fittedNodesCount
[
i
]
>
maxFittedNodesCount
||
fittedNodesMeanDefects
[
i
]
<
minFittedNodesMeanDefect
)
&&
((
fittedNodesCount
[
i
]
>
maxFittedNodesCount
||
fittedNodesMeanDefects
[
i
]
<
minFittedNodesMeanDefect
)
&&
(
fittedNodesCount
[
i
]
/
maxFittedNodesCount
-
1
)
*
3
>
(
minFittedNodesMeanDefect
/
fittedNodesMeanDefects
[
i
]
-
1
)))
(
fittedNodesCount
[
i
]
/
maxFittedNodesCount
-
1
)
*
3
>
(
minFittedNodesMeanDefect
/
fittedNodesMeanDefects
[
i
]
-
1
)))
//TODO: can be optimized
{
{
maxFittedNodesCount
=
fittedNodesCount
[
i
];
maxFittedNodesCount
=
fittedNodesCount
[
i
];
minFittedNodesMeanDefect
=
fittedNodesMeanDefects
[
i
];
minFittedNodesMeanDefect
=
fittedNodesMeanDefects
[
i
];
...
@@ -175,7 +175,7 @@ namespace pinkIndexer
...
@@ -175,7 +175,7 @@ namespace pinkIndexer
break
;
break
;
case
RefinementType
::
firstFixedThenVariableLatticeParametersCenterAdjustmentMultiSeed
:
case
RefinementType
::
firstFixedThenVariableLatticeParametersCenterAdjustmentMultiSeed
:
{
{
constexpr
int
refinementTries
=
2000
;
constexpr
int
refinementTries
=
2000
;
//TODO: increase if better refinement needed
int
fittedNodesCount
[
refinementTries
];
int
fittedNodesCount
[
refinementTries
];
double
fittedNodesMeanDefects
[
refinementTries
];
double
fittedNodesMeanDefects
[
refinementTries
];
Lattice
fittedLattices
[
refinementTries
];
Lattice
fittedLattices
[
refinementTries
];
...
@@ -203,17 +203,17 @@ namespace pinkIndexer
...
@@ -203,17 +203,17 @@ namespace pinkIndexer
currentBasis
=
indexedLattice
.
getBasis
();
currentBasis
=
indexedLattice
.
getBasis
();
}
}
fittedLattices
[
i
]
=
Lattice
(
currentBasis
);
fittedLattices
[
i
]
=
Lattice
(
currentBasis
);
centerShifts
[
i
]
=
Vector2f
::
Random
()
*
80e-6
;
centerShifts
[
i
]
=
Vector2f
::
Random
()
*
80e-6
;
//TODO: hardcoded JUNGFRAU pixel size. Can be improved (maybe parameter??)
refinement
.
setTolerance
(
min
(
finalRefinementTolerance
*
2.5
,
0.12
));
refinement
.
setTolerance
(
min
(
finalRefinementTolerance
*
2.5
,
0.12
));
refinement
.
refineFixedLattice
(
fittedLattices
[
i
],
u
c
sDirections
,
u
c
sBorderNorms
);
refinement
.
refineFixedLattice
(
fittedLattices
[
i
],
u
l
sDirections
,
u
l
sBorderNorms
);
refinement
.
setTolerance
(
min
(
finalRefinementTolerance
*
1.8
,
0.10
));
refinement
.
setTolerance
(
min
(
finalRefinementTolerance
*
1.8
,
0.10
));
refinement
.
refineVariableLatticeWithCenter
(
fittedLattices
[
i
],
centerShifts
[
i
],
detectorPeaks_m
);
refinement
.
refineVariableLatticeWithCenter
(
fittedLattices
[
i
],
centerShifts
[
i
],
detectorPeaks_m
);
refinement
.
setTolerance
(
finalRefinementTolerance
);
refinement
.
setTolerance
(
finalRefinementTolerance
);
refinement
.
refineVariableLatticeWithCenter
(
fittedLattices
[
i
],
centerShifts
[
i
],
detectorPeaks_m
);
refinement
.
refineVariableLatticeWithCenter
(
fittedLattices
[
i
],
centerShifts
[
i
],
detectorPeaks_m
);
fittedNodesCount
[
i
]
=
refinement
.
getFittedPeaksCount
(
fittedLattices
[
i
],
u
c
sDirections
,
u
c
sBorderNorms
);
fittedNodesCount
[
i
]
=
refinement
.
getFittedPeaksCount
(
fittedLattices
[
i
],
u
l
sDirections
,
u
l
sBorderNorms
);
fittedNodesMeanDefects
[
i
]
=
refinement
.
getMeanDefect
(
fittedLattices
[
i
].
getBasis
(),
u
c
sDirections
,
u
c
sBorderNorms
);
fittedNodesMeanDefects
[
i
]
=
refinement
.
getMeanDefect
(
fittedLattices
[
i
].
getBasis
(),
u
l
sDirections
,
u
l
sBorderNorms
);
}
}
int
maxFittedNodesCount
=
1
;
int
maxFittedNodesCount
=
1
;
...
@@ -239,7 +239,7 @@ namespace pinkIndexer
...
@@ -239,7 +239,7 @@ namespace pinkIndexer
}
}
}
}
void
PinkIndexer
::
reducePeakCount
(
Matrix3Xf
&
u
c
sDirections
,
Array2Xf
&
u
c
sBorderNorms
,
RowVectorXf
&
intensities
,
const
Eigen
::
Matrix2Xf
&
detectorPeaks_m
)
void
PinkIndexer
::
reducePeakCount
(
Matrix3Xf
&
u
l
sDirections
,
Array2Xf
&
u
l
sBorderNorms
,
RowVectorXf
&
intensities
,
const
Eigen
::
Matrix2Xf
&
detectorPeaks_m
)
{
{
Matrix2Xf
detectorPeaks_m_copy
=
detectorPeaks_m
;
Matrix2Xf
detectorPeaks_m_copy
=
detectorPeaks_m
;
...
@@ -247,17 +247,17 @@ namespace pinkIndexer
...
@@ -247,17 +247,17 @@ namespace pinkIndexer
int
peaksKept_res
=
0
;
int
peaksKept_res
=
0
;
for
(
int
i
=
0
;
i
<
intensities
.
size
();
i
++
)
for
(
int
i
=
0
;
i
<
intensities
.
size
();
i
++
)
{
{
if
(
u
c
sBorderNorms
(
1
,
i
)
<=
maxResolutionForIndexing_1_per_A
)
if
(
u
l
sBorderNorms
(
1
,
i
)
<=
maxResolutionForIndexing_1_per_A
)
{
{
u
c
sDirections
.
col
(
peaksKept_res
)
=
u
c
sDirections
.
col
(
i
);
u
l
sDirections
.
col
(
peaksKept_res
)
=
u
l
sDirections
.
col
(
i
);
u
c
sBorderNorms
.
col
(
peaksKept_res
)
=
u
c
sBorderNorms
.
col
(
i
);
u
l
sBorderNorms
.
col
(
peaksKept_res
)
=
u
l
sBorderNorms
.
col
(
i
);
intensities
[
peaksKept_res
]
=
intensities
[
i
];
intensities
[
peaksKept_res
]
=
intensities
[
i
];
detectorPeaks_m_copy
.
col
(
peaksKept_res
)
=
detectorPeaks_m_copy
.
col
(
i
);
detectorPeaks_m_copy
.
col
(
peaksKept_res
)
=
detectorPeaks_m_copy
.
col
(
i
);
peaksKept_res
++
;
peaksKept_res
++
;
}
}
}
}
u
c
sDirections
.
conservativeResize
(
NoChange
,
peaksKept_res
);
u
l
sDirections
.
conservativeResize
(
NoChange
,
peaksKept_res
);
u
c
sBorderNorms
.
conservativeResize
(
NoChange
,
peaksKept_res
);
u
l
sBorderNorms
.
conservativeResize
(
NoChange
,
peaksKept_res
);
intensities
.
conservativeResize
(
peaksKept_res
);
intensities
.
conservativeResize
(
peaksKept_res
);
detectorPeaks_m_copy
.
conservativeResize
(
NoChange
,
peaksKept_res
);
detectorPeaks_m_copy
.
conservativeResize
(
NoChange
,
peaksKept_res
);
...
@@ -283,8 +283,8 @@ namespace pinkIndexer
...
@@ -283,8 +283,8 @@ namespace pinkIndexer
{
{
if
(
norms
[
i
]
>=
minNorm
&&
norms
[
i
]
<=
maxNorm
)
if
(
norms
[
i
]
>=
minNorm
&&
norms
[
i
]
<=
maxNorm
)
{
{
u
c
sDirections
.
col
(
peaksKept_norms
)
=
u
c
sDirections
.
col
(
i
);
u
l
sDirections
.
col
(
peaksKept_norms
)
=
u
l
sDirections
.
col
(
i
);
u
c
sBorderNorms
.
col
(
peaksKept_norms
)
=
u
c
sBorderNorms
.
col
(
i
);
u
l
sBorderNorms
.
col
(
peaksKept_norms
)
=
u
l
sBorderNorms
.
col
(
i
);
intensities
[
peaksKept_norms
]
=
intensities
[
i
];
intensities
[
peaksKept_norms
]
=
intensities
[
i
];
peaksKept_norms
++
;
peaksKept_norms
++
;
}
}
...
@@ -300,8 +300,8 @@ namespace pinkIndexer
...
@@ -300,8 +300,8 @@ namespace pinkIndexer
{
{
if
(
intensities
[
i
]
>
minIntensity
)
if
(
intensities
[
i
]
>
minIntensity
)
{
{
u
c
sDirections
.
col
(
peaksKept_normsIntensities
)
=
u
c
sDirections
.
col
(
i
);
u
l
sDirections
.
col
(
peaksKept_normsIntensities
)
=
u
l
sDirections
.
col
(
i
);
u
c
sBorderNorms
.
col
(
peaksKept_normsIntensities
)
=
u
c
sBorderNorms
.
col
(
i
);
u
l
sBorderNorms
.
col
(
peaksKept_normsIntensities
)
=
u
l
sBorderNorms
.
col
(
i
);
intensities
[
peaksKept_normsIntensities
]
=
intensities
[
i
];
intensities
[
peaksKept_normsIntensities
]
=
intensities
[
i
];
peaksKept_normsIntensities
++
;
peaksKept_normsIntensities
++
;
}
}
...
@@ -313,16 +313,16 @@ namespace pinkIndexer
...
@@ -313,16 +313,16 @@ namespace pinkIndexer
{
{
if
(
intensities
[
i
]
==
minIntensity
)
if
(
intensities
[
i
]
==
minIntensity
)
{
{
u
c
sDirections
.
col
(
peaksKept_normsIntensities
)
=
u
c
sDirections
.
col
(
i
);
u
l
sDirections
.
col
(
peaksKept_normsIntensities
)
=
u
l
sDirections
.
col
(
i
);
u
c
sBorderNorms
.
col
(
peaksKept_normsIntensities
)
=
u
c
sBorderNorms
.
col
(
i
);
u
l
sBorderNorms
.
col
(
peaksKept_normsIntensities
)
=
u
l
sBorderNorms
.
col
(
i
);
intensities
[
peaksKept_normsIntensities
]
=
intensities
[
i
];
intensities
[
peaksKept_normsIntensities
]
=
intensities
[
i
];
peaksKept_normsIntensities
++
;
peaksKept_normsIntensities
++
;
}
}
}
}
}
}
u
c
sDirections
.
conservativeResize
(
NoChange
,
peaksKept_normsIntensities
);
u
l
sDirections
.
conservativeResize
(
NoChange
,
peaksKept_normsIntensities
);
u
c
sBorderNorms
.
conservativeResize
(
NoChange
,
peaksKept_normsIntensities
);
u
l
sBorderNorms
.
conservativeResize
(
NoChange
,
peaksKept_normsIntensities
);
intensities
.
conservativeResize
(
peaksKept_normsIntensities
);
intensities
.
conservativeResize
(
peaksKept_normsIntensities
);
}
}
...
...
src/Refinement.cpp
View file @
54dad96a
...
@@ -29,48 +29,48 @@ namespace pinkIndexer
...
@@ -29,48 +29,48 @@ namespace pinkIndexer
millerIndices
.
reserve
(
500
);
millerIndices
.
reserve
(
500
);
}
}
void
Refinement
::
refineVariableLattice
(
Lattice
&
lattice
,
const
Matrix3Xf
&
u
c
sDirections
,
const
Array2Xf
&
u
c
sBorderNorms
)
void
Refinement
::
refineVariableLattice
(
Lattice
&
lattice
,
const
Matrix3Xf
&
u
l
sDirections
,
const
Array2Xf
&
u
l
sBorderNorms
)
{
{
Matrix3f
basis
=
lattice
.
getBasis
();
Matrix3f
basis
=
lattice
.
getBasis
();
float
delta
=
1e-8
;
float
delta
=
1e-8
;
//for numerical differentiation, in A^-1
float
stepSize
=
lattice
.
getBasisVectorNorms
().
maxCoeff
()
*
0.002
;
float
stepSize
=
lattice
.
getBasisVectorNorms
().
maxCoeff
()
*
0.002
;
float
minStepSize
=
lattice
.
getBasisVectorNorms
().
minCoeff
()
*
0.00001
;
float
minStepSize
=
lattice
.
getBasisVectorNorms
().
minCoeff
()
*
0.00001
;
int
maxStepsCount
=
200
;
int
maxStepsCount
=
200
;
meanDefects
.
resize
(
maxStepsCount
);
meanDefects
.
resize
(
maxStepsCount
);
meanDefects
[
0
]
=
getMeanDefect
(
basis
,
u
c
sDirections
,
u
c
sBorderNorms
);
meanDefects
[
0
]
=
getMeanDefect
(
basis
,
u
l
sDirections
,
u
l
sBorderNorms
);
for
(
int
i
=
0
;
i
<
maxStepsCount
;
i
++
)
for
(
int
i
=
0
;
i
<
maxStepsCount
;
i
++
)
{
{
// cout << meanDefects[i] << endl;
// cout << meanDefects[i] << endl;
Array33f
gradient
;
Array33f
gradient
;
//gradient for change of each basis matrix element
Matrix3f
offsetBasis
=
basis
;
Matrix3f
offsetBasis
=
basis
;
offsetBasis
(
0
,
0
)
+=
delta
;
offsetBasis
(
0
,
0
)
+=
delta
;
gradient
(
0
,
0
)
=
getMeanDefect
(
offsetBasis
,
u
c
sDirections
,
u
c
sBorderNorms
,
false
)
-
meanDefects
[
i
];
gradient
(
0
,
0
)
=
getMeanDefect
(
offsetBasis
,
u
l
sDirections
,
u
l
sBorderNorms
,
false
)
-
meanDefects
[
i
];
offsetBasis
(
0
,
0
)
=
basis
(
0
,
0
);
offsetBasis
(
0
,
0
)
=
basis
(
0
,
0
);
offsetBasis
(
1
,
0
)
+=
delta
;
offsetBasis
(
1
,
0
)
+=
delta
;
gradient
(
1
,
0
)
=
getMeanDefect
(
offsetBasis
,
u
c
sDirections
,
u
c
sBorderNorms
,
false
)
-
meanDefects
[
i
];
gradient
(
1
,
0
)
=
getMeanDefect
(
offsetBasis
,
u
l
sDirections
,
u
l
sBorderNorms
,
false
)
-
meanDefects
[
i
];
offsetBasis
(
1
,
0
)
=
basis
(
1
,
0
);
offsetBasis
(
1
,
0
)
=
basis
(
1
,
0
);
offsetBasis
(
2
,
0
)
+=
delta
;
offsetBasis
(
2
,
0
)
+=
delta
;
gradient
(
2
,
0
)
=
getMeanDefect
(
offsetBasis
,
u
c
sDirections
,
u
c
sBorderNorms
,
false
)
-
meanDefects
[
i
];
gradient
(
2
,
0
)
=
getMeanDefect
(
offsetBasis
,
u
l
sDirections
,
u
l
sBorderNorms
,
false
)
-
meanDefects
[
i
];
offsetBasis
(
2
,
0
)
=
basis
(
2
,
0
);
offsetBasis
(
2
,
0
)
=
basis
(
2
,
0
);
offsetBasis
(
0
,
1
)
+=
delta
;
offsetBasis
(
0
,
1
)
+=
delta
;
gradient
(
0
,
1
)
=
getMeanDefect
(
offsetBasis
,
u
c
sDirections
,
u
c
sBorderNorms
,
false
)
-
meanDefects
[
i
];
gradient
(
0
,
1
)
=
getMeanDefect
(
offsetBasis
,
u
l
sDirections
,
u
l
sBorderNorms
,
false
)
-
meanDefects
[
i
];
offsetBasis
(
0
,
1
)
=
basis
(
0
,
1
);
offsetBasis
(
0
,
1
)
=
basis
(
0
,
1
);
offsetBasis
(
1
,
1
)
+=
delta
;
offsetBasis
(
1
,
1
)
+=
delta
;
gradient
(
1
,
1
)
=
getMeanDefect
(
offsetBasis
,
u
c
sDirections
,
u
c
sBorderNorms
,
false
)
-
meanDefects
[
i
];
gradient
(
1
,
1
)
=
getMeanDefect
(
offsetBasis
,
u
l
sDirections
,
u
l
sBorderNorms
,
false
)
-
meanDefects
[
i
];
offsetBasis
(
1
,
1
)
=
basis
(
1
,
1
);
offsetBasis
(
1
,
1
)
=
basis
(
1
,
1
);
offsetBasis
(
2
,
1
)
+=
delta
;
offsetBasis
(
2
,
1
)
+=
delta
;
gradient
(
2
,
1
)
=
getMeanDefect
(
offsetBasis
,
u
c
sDirections
,
u
c
sBorderNorms
,
false
)
-
meanDefects
[
i
];
gradient
(
2
,
1
)
=
getMeanDefect
(
offsetBasis
,
u
l
sDirections
,
u
l
sBorderNorms
,
false
)
-
meanDefects
[
i
];
offsetBasis
(
2
,
1
)
=
basis
(
2
,
1
);
offsetBasis
(
2
,
1
)
=
basis
(
2
,
1
);
offsetBasis
(
0
,
2
)
+=
delta
;
offsetBasis
(
0
,
2
)
+=
delta
;
gradient
(
0
,
2
)
=
getMeanDefect
(
offsetBasis
,
u
c
sDirections
,
u
c
sBorderNorms
)
-
meanDefects
[
i
];
gradient
(
0
,
2
)
=
getMeanDefect
(
offsetBasis
,
u
l
sDirections
,
u
l
sBorderNorms
)
-
meanDefects
[
i
];
offsetBasis
(
0
,
2
)
=
basis
(
0
,
2
);
offsetBasis
(
0
,
2
)
=
basis
(
0
,
2
);
offsetBasis
(
1
,
2
)
+=
delta
;
offsetBasis
(
1
,
2
)
+=
delta
;
gradient
(
1
,
2
)
=
getMeanDefect
(
offsetBasis
,
u
c
sDirections
,
u
c
sBorderNorms
)
-
meanDefects
[
i
];
gradient
(
1
,
2
)
=
getMeanDefect
(
offsetBasis
,
u
l
sDirections
,
u
l
sBorderNorms
)
-
meanDefects
[
i
];
offsetBasis
(
1
,
2
)
=
basis
(
1
,
2
);
offsetBasis
(
1
,
2
)
=
basis
(
1
,
2
);
offsetBasis
(
2
,
2
)
+=
delta
;
offsetBasis
(
2
,
2
)
+=
delta
;
gradient
(
2
,
2
)
=
getMeanDefect
(
offsetBasis
,
u
c
sDirections
,
u
c
sBorderNorms
)
-
meanDefects
[
i
];
gradient
(
2
,
2
)
=
getMeanDefect
(
offsetBasis
,
u
l
sDirections
,
u
l
sBorderNorms
)
-
meanDefects
[
i
];
float
norm
=
gradient
.
matrix
().
norm
();
float
norm
=
gradient
.
matrix
().
norm
();
gradient
=
gradient
/
norm
*
stepSize
;
gradient
=
gradient
/
norm
*
stepSize
;
...
@@ -81,7 +81,7 @@ namespace pinkIndexer
...
@@ -81,7 +81,7 @@ namespace pinkIndexer
}