Skip to content
GitLab
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
8281cc6d
Commit
8281cc6d
authored
Feb 27, 2020
by
Yaroslav Gevorkov
Browse files
renaming variables to match naming scheme in publication
parent
29f081a5
Changes
9
Hide whitespace changes
Inline
Side-by-side
include/Backprojection.h
View file @
8281cc6d
...
...
@@ -11,7 +11,7 @@ namespace pinkIndexer
public:
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:
ExperimentSettings
experimentSettings
;
...
...
include/PinkIndexer.h
View file @
8281cc6d
...
...
@@ -58,9 +58,9 @@ namespace pinkIndexer
private:
// 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
);
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
);
float
getAngleResolution
();
...
...
include/Refinement.h
View file @
8281cc6d
...
...
@@ -15,16 +15,16 @@ namespace pinkIndexer
Refinement
(
float
tolerance
);
Refinement
(
float
tolerance
,
const
Backprojection
&
backprojection
);
void
refineFixedLattice
(
Lattice
&
lattice
,
const
Eigen
::
Matrix3Xf
&
u
c
sDirections
,
const
Eigen
::
Array2Xf
&
u
c
sBorderNorms
);
void
refineVariableLattice
(
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
l
sDirections
,
const
Eigen
::
Array2Xf
&
u
l
sBorderNorms
);
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
);
int
getFittedPeaksCount
(
Lattice
&
lattice
,
const
Eigen
::
Matrix3Xf
&
u
c
sDirections
,
const
Eigen
::
Array2Xf
&
u
c
sBorderNorms
);
int
getFittedPeaks
(
Lattice
&
lattice
,
Eigen
::
Array
<
bool
,
Eigen
::
Dynamic
,
1
>&
fittedPeaks
,
const
Eigen
::
Matrix3Xf
&
u
c
sDirections
,
const
Eigen
::
Array2Xf
&
u
c
sBorderNorms
);
double
getMeanDefect
(
const
Eigen
::
Matrix3f
&
basis
,
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
l
sDirections
,
const
Eigen
::
Array2Xf
&
u
l
sBorderNorms
);
double
getMeanDefect
(
const
Eigen
::
Matrix3f
&
basis
,
const
Eigen
::
Matrix3Xf
&
u
l
sDirections
,
const
Eigen
::
Array2Xf
&
u
l
sBorderNorms
,
bool
significantChangesToPreviousCall
=
true
);
void
setTolerance
(
float
tolerance
)
...
...
@@ -37,10 +37,10 @@ namespace pinkIndexer
}
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
);
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
);
float
tolerance
;
...
...
@@ -49,7 +49,7 @@ namespace pinkIndexer
// preallocation
Eigen
::
ArrayXf
defects
;
Eigen
::
Array2Xf
u
c
sBorderNormsSquared
;
Eigen
::
Array2Xf
u
l
sBorderNormsSquared
;
Eigen
::
Matrix3Xf
millerIndices_close
;
Eigen
::
Matrix3Xf
millerIndices_far
;
Eigen
::
Matrix3Xf
candidatePeaks
;
...
...
@@ -63,7 +63,7 @@ namespace pinkIndexer
Eigen
::
ArrayXf
meanDefects_centerAdjustment
;
int
validCandidatePeaksCount
;
Eigen
::
Matrix2Xf
detectorPeaks_m_shifted
;
Eigen
::
Matrix3Xf
u
c
sDirections
;
Eigen
::
Array2Xf
u
c
sBorderNorms
;
Eigen
::
Matrix3Xf
u
l
sDirections
;
Eigen
::
Array2Xf
u
l
sBorderNorms
;
};
}
// namespace pinkIndexer
\ No newline at end of file
include/Sinogram.h
View file @
8281cc6d
...
...
@@ -18,9 +18,9 @@ namespace pinkIndexer
void
setSinogramAngleResolution
(
float
angleResolution_deg
);
void
computeSinogram
(
const
Eigen
::
Matrix3Xf
&
u
c
sDirections
,
const
Eigen
::
Matrix2Xf
u
c
sBorderNorms
);
void
computeSinogramParallel
(
const
Eigen
::
Matrix3Xf
&
u
c
sDirections
,
const
Eigen
::
Matrix2Xf
u
c
sBorderNorms
,
int
slaveThreadCount
);
void
computeSinogramParallel2
(
const
Eigen
::
Matrix3Xf
&
u
c
sDirections
,
const
Eigen
::
Matrix2Xf
u
c
sBorderNorms
,
int
slaveThreadCount
);
void
computeSinogram
(
const
Eigen
::
Matrix3Xf
&
u
l
sDirections
,
const
Eigen
::
Matrix2Xf
u
l
sBorderNorms
);
void
computeSinogramParallel
(
const
Eigen
::
Matrix3Xf
&
u
l
sDirections
,
const
Eigen
::
Matrix2Xf
u
l
sBorderNorms
,
int
slaveThreadCount
);
void
computeSinogramParallel2
(
const
Eigen
::
Matrix3Xf
&
u
l
sDirections
,
const
Eigen
::
Matrix2Xf
u
l
sBorderNorms
,
int
slaveThreadCount
);
void
getBestRotation
(
Eigen
::
AngleAxisf
&
bestRotation
);
...
...
src/Backprojection.cpp
View file @
8281cc6d
...
...
@@ -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
());
projectionDirections
<<
RowVectorXf
::
Constant
(
1
,
detectorPeaks_m
.
cols
(),
experimentSettings
.
getDetectorDistance_m
()),
detectorPeaks_m
.
row
(
0
),
...
...
@@ -26,11 +26,11 @@ namespace pinkIndexer
Matrix3Xf
backprojectedPointsFar
=
projectionDirections
*
experimentSettings
.
getReciprocalLambdaShort_1A
();
backprojectedPointsFar
.
row
(
0
)
-=
RowVectorXf
::
Constant
(
backprojectedPointsFar
.
cols
(),
experimentSettings
.
getReciprocalLambdaShort_1A
());
u
c
sBorderNorms
.
resize
(
2
,
detectorPeaks_m
.
cols
());
u
c
sBorderNorms
.
row
(
0
)
=
backprojectedPointsClose
.
colwise
().
norm
().
array
()
-
experimentSettings
.
getReflectionRadius
();
u
c
sBorderNorms
.
row
(
1
)
=
backprojectedPointsFar
.
colwise
().
norm
().
array
()
+
experimentSettings
.
getReflectionRadius
();
u
l
sBorderNorms
.
resize
(
2
,
detectorPeaks_m
.
cols
());
u
l
sBorderNorms
.
row
(
0
)
=
backprojectedPointsClose
.
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
\ No newline at end of file
src/PinkIndexer.cpp
View file @
8281cc6d
...
...
@@ -48,26 +48,26 @@ namespace pinkIndexer
if
(
detectorPeaks_m
.
cols
()
<
2
)
return
0
;
Matrix3Xf
u
c
sDirections
;
// Unit vector of ULS
Array2Xf
u
c
sBorderNorms
;
// 2 borders between intersection with the 2 Ewald spheres
backprojection
.
backProject
(
detectorPeaks_m
,
u
c
sDirections
,
u
c
sBorderNorms
);
Matrix3Xf
u
l
sDirections
;
// Unit vector of ULS
Array2Xf
u
l
sBorderNorms
;
// 2 borders between intersection with the 2 Ewald spheres
backprojection
.
backProject
(
detectorPeaks_m
,
u
l
sDirections
,
u
l
sBorderNorms
);
Matrix3Xf
u
c
sDirections_reduced
=
u
c
sDirections
;
Array2Xf
u
c
sBorderNorms_reduced
=
u
c
sBorderNorms
;
reducePeakCount
(
u
c
sDirections_reduced
,
u
c
sBorderNorms_reduced
,
intensities
,
detectorPeaks_m
);
Matrix3Xf
u
l
sDirections_reduced
=
u
l
sDirections
;
Array2Xf
u
l
sBorderNorms_reduced
=
u
l
sBorderNorms
;
reducePeakCount
(
u
l
sDirections_reduced
,
u
l
sBorderNorms_reduced
,
intensities
,
detectorPeaks_m
);
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
)
{
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
{
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
;
...
...
@@ -76,18 +76,18 @@ namespace pinkIndexer
Matrix3f
bestBasis
=
bestRotation
*
sampleLattice
.
getBasis
();
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
.
reorder
(
sampleLattice
);
//reorder lattice vectors to match sample lattice (from crystfel)
// 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");
}
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
)
{
centerShift
.
setZero
();
...
...
@@ -98,23 +98,23 @@ namespace pinkIndexer
break
;
case
RefinementType
::
fixedLatticeParameters
:
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
.
refineFixedLattice
(
indexedLattice
,
u
c
sDirections
,
u
c
sBorderNorms
);
refinement
.
refineFixedLattice
(
indexedLattice
,
u
l
sDirections
,
u
l
sBorderNorms
);
break
;
case
RefinementType
::
variableLatticeParameters
:
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
.
refineVariableLattice
(
indexedLattice
,
u
c
sDirections
,
u
c
sBorderNorms
);
refinement
.
refineVariableLattice
(
indexedLattice
,
u
l
sDirections
,
u
l
sBorderNorms
);
break
;
case
RefinementType
::
firstFixedThenVariableLatticeParameters
:
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
.
refineVariableLattice
(
indexedLattice
,
u
c
sDirections
,
u
c
sBorderNorms
);
refinement
.
refineVariableLattice
(
indexedLattice
,
u
l
sDirections
,
u
l
sBorderNorms
);
refinement
.
setTolerance
(
finalRefinementTolerance
);
refinement
.
refineVariableLattice
(
indexedLattice
,
u
c
sDirections
,
u
c
sBorderNorms
);
refinement
.
refineVariableLattice
(
indexedLattice
,
u
l
sDirections
,
u
l
sBorderNorms
);
break
;
case
RefinementType
::
firstFixedThenVariableLatticeParametersMultiSeed
:
{
...
...
@@ -146,14 +146,14 @@ namespace pinkIndexer
fittedLattices
[
i
]
=
Lattice
(
currentBasis
);
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
.
refineVariableLattice
(
fittedLattices
[
i
],
u
c
sDirections
,
u
c
sBorderNorms
);
refinement
.
refineVariableLattice
(
fittedLattices
[
i
],
u
l
sDirections
,
u
l
sBorderNorms
);
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
);
fittedNodesMeanDefects
[
i
]
=
refinement
.
getMeanDefect
(
fittedLattices
[
i
].
getBasis
(),
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
l
sDirections
,
u
l
sBorderNorms
);
}
int
maxFittedNodesCount
=
1
;
...
...
@@ -206,14 +206,14 @@ namespace pinkIndexer
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
.
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
.
refineVariableLatticeWithCenter
(
fittedLattices
[
i
],
centerShifts
[
i
],
detectorPeaks_m
);
refinement
.
setTolerance
(
finalRefinementTolerance
);
refinement
.
refineVariableLatticeWithCenter
(
fittedLattices
[
i
],
centerShifts
[
i
],
detectorPeaks_m
);
fittedNodesCount
[
i
]
=
refinement
.
getFittedPeaksCount
(
fittedLattices
[
i
],
u
c
sDirections
,
u
c
sBorderNorms
);
fittedNodesMeanDefects
[
i
]
=
refinement
.
getMeanDefect
(
fittedLattices
[
i
].
getBasis
(),
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
l
sDirections
,
u
l
sBorderNorms
);
}
int
maxFittedNodesCount
=
1
;
...
...
@@ -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
;
...
...
@@ -247,17 +247,17 @@ namespace pinkIndexer
int
peaksKept_res
=
0
;
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
c
sBorderNorms
.
col
(
peaksKept_res
)
=
u
c
sBorderNorms
.
col
(
i
);
u
l
sDirections
.
col
(
peaksKept_res
)
=
u
l
sDirections
.
col
(
i
);
u
l
sBorderNorms
.
col
(
peaksKept_res
)
=
u
l
sBorderNorms
.
col
(
i
);
intensities
[
peaksKept_res
]
=
intensities
[
i
];
detectorPeaks_m_copy
.
col
(
peaksKept_res
)
=
detectorPeaks_m_copy
.
col
(
i
);
peaksKept_res
++
;
}
}
u
c
sDirections
.
conservativeResize
(
NoChange
,
peaksKept_res
);
u
c
sBorderNorms
.
conservativeResize
(
NoChange
,
peaksKept_res
);
u
l
sDirections
.
conservativeResize
(
NoChange
,
peaksKept_res
);
u
l
sBorderNorms
.
conservativeResize
(
NoChange
,
peaksKept_res
);
intensities
.
conservativeResize
(
peaksKept_res
);
detectorPeaks_m_copy
.
conservativeResize
(
NoChange
,
peaksKept_res
);
...
...
@@ -283,8 +283,8 @@ namespace pinkIndexer
{
if
(
norms
[
i
]
>=
minNorm
&&
norms
[
i
]
<=
maxNorm
)
{
u
c
sDirections
.
col
(
peaksKept_norms
)
=
u
c
sDirections
.
col
(
i
);
u
c
sBorderNorms
.
col
(
peaksKept_norms
)
=
u
c
sBorderNorms
.
col
(
i
);
u
l
sDirections
.
col
(
peaksKept_norms
)
=
u
l
sDirections
.
col
(
i
);
u
l
sBorderNorms
.
col
(
peaksKept_norms
)
=
u
l
sBorderNorms
.
col
(
i
);
intensities
[
peaksKept_norms
]
=
intensities
[
i
];
peaksKept_norms
++
;
}
...
...
@@ -300,8 +300,8 @@ namespace pinkIndexer
{
if
(
intensities
[
i
]
>
minIntensity
)
{
u
c
sDirections
.
col
(
peaksKept_normsIntensities
)
=
u
c
sDirections
.
col
(
i
);
u
c
sBorderNorms
.
col
(
peaksKept_normsIntensities
)
=
u
c
sBorderNorms
.
col
(
i
);
u
l
sDirections
.
col
(
peaksKept_normsIntensities
)
=
u
l
sDirections
.
col
(
i
);
u
l
sBorderNorms
.
col
(
peaksKept_normsIntensities
)
=
u
l
sBorderNorms
.
col
(
i
);
intensities
[
peaksKept_normsIntensities
]
=
intensities
[
i
];
peaksKept_normsIntensities
++
;
}
...
...
@@ -313,16 +313,16 @@ namespace pinkIndexer
{
if
(
intensities
[
i
]
==
minIntensity
)
{
u
c
sDirections
.
col
(
peaksKept_normsIntensities
)
=
u
c
sDirections
.
col
(
i
);
u
c
sBorderNorms
.
col
(
peaksKept_normsIntensities
)
=
u
c
sBorderNorms
.
col
(
i
);
u
l
sDirections
.
col
(
peaksKept_normsIntensities
)
=
u
l
sDirections
.
col
(
i
);
u
l
sBorderNorms
.
col
(
peaksKept_normsIntensities
)
=
u
l
sBorderNorms
.
col
(
i
);
intensities
[
peaksKept_normsIntensities
]
=
intensities
[
i
];
peaksKept_normsIntensities
++
;
}
}
}
u
c
sDirections
.
conservativeResize
(
NoChange
,
peaksKept_normsIntensities
);
u
c
sBorderNorms
.
conservativeResize
(
NoChange
,
peaksKept_normsIntensities
);
u
l
sDirections
.
conservativeResize
(
NoChange
,
peaksKept_normsIntensities
);
u
l
sBorderNorms
.
conservativeResize
(
NoChange
,
peaksKept_normsIntensities
);
intensities
.
conservativeResize
(
peaksKept_normsIntensities
);
}
...
...
src/Refinement.cpp
View file @
8281cc6d
...
...
@@ -29,7 +29,7 @@ namespace pinkIndexer
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
();
float
delta
=
1e-8
;
//for numerical differentiation, in A^-1
...
...
@@ -38,7 +38,7 @@ namespace pinkIndexer
float
minStepSize
=
lattice
.
getBasisVectorNorms
().
minCoeff
()
*
0.00001
;
int
maxStepsCount
=
200
;
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
++
)
{
// cout << meanDefects[i] << endl;
...
...
@@ -46,31 +46,31 @@ namespace pinkIndexer
Array33f
gradient
;
//gradient for change of each basis matrix element
Matrix3f
offsetBasis
=
basis
;
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
(
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
(
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
(
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
(
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
(
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
(
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
(
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
(
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
();
gradient
=
gradient
/
norm
*
stepSize
;
...
...
@@ -81,7 +81,7 @@ namespace pinkIndexer
}
basis
=
basis
-
gradient
.
matrix
();
meanDefects
[
i
+
1
]
=
getMeanDefect
(
basis
,
u
c
sDirections
,
u
c
sBorderNorms
);
meanDefects
[
i
+
1
]
=
getMeanDefect
(
basis
,
u
l
sDirections
,
u
l
sBorderNorms
);
if
(
meanDefects
[
i
+
1
]
>
meanDefects
[
i
])
{
...
...
@@ -98,7 +98,7 @@ namespace pinkIndexer
lattice
=
Lattice
(
basis
);
}
void
Refinement
::
refineFixedLattice
(
Lattice
&
lattice
,
const
Matrix3Xf
&
u
c
sDirections
,
const
Array2Xf
&
u
c
sBorderNorms
)
void
Refinement
::
refineFixedLattice
(
Lattice
&
lattice
,
const
Matrix3Xf
&
u
l
sDirections
,
const
Array2Xf
&
u
l
sBorderNorms
)
{
Matrix3f
basis
=
lattice
.
getBasis
();
...
...
@@ -113,20 +113,20 @@ namespace pinkIndexer
float
minStepSize
=
0.001
/
180
*
M_PI
;
int
maxStepsCount
=
200
;
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
++
)
{
// cout << meanDefects[i] << endl;
Vector3f
gradient
;
gradient
(
0
)
=
getMeanDefect
(
rotX
*
basis
,
u
c
sDirections
,
u
c
sBorderNorms
)
-
meanDefects
[
i
];
gradient
(
1
)
=
getMeanDefect
(
rotY
*
basis
,
u
c
sDirections
,
u
c
sBorderNorms
)
-
meanDefects
[
i
];
gradient
(
2
)
=
getMeanDefect
(
rotZ
*
basis
,
u
c
sDirections
,
u
c
sBorderNorms
)
-
meanDefects
[
i
];
gradient
(
0
)
=
getMeanDefect
(
rotX
*
basis
,
u
l
sDirections
,
u
l
sBorderNorms
)
-
meanDefects
[
i
];
gradient
(
1
)
=
getMeanDefect
(
rotY
*
basis
,
u
l
sDirections
,
u
l
sBorderNorms
)
-
meanDefects
[
i
];
gradient
(
2
)
=
getMeanDefect
(
rotZ
*
basis
,
u
l
sDirections
,
u
l
sBorderNorms
)
-
meanDefects
[
i
];
gradient
=
-
gradient
.
normalized
()
*
stepSize
;
basis
=
AngleAxisf
(
gradient
(
0
),
Vector3f
::
UnitX
())
*
AngleAxisf
(
gradient
(
1
),
Vector3f
::
UnitY
())
*
AngleAxisf
(
gradient
(
2
),
Vector3f
::
UnitZ
())
*
basis
;
meanDefects
[
i
+
1
]
=
getMeanDefect
(
basis
,
u
c
sDirections
,
u
c
sBorderNorms
);
meanDefects
[
i
+
1
]
=
getMeanDefect
(
basis
,
u
l
sDirections
,
u
l
sBorderNorms
);
if
(
meanDefects
[
i
+
1
]
>
meanDefects
[
i
])
{
...
...
@@ -153,8 +153,8 @@ namespace pinkIndexer
float
startStepSize_center
=
10e-6
;
int
maxStepsCount
=
200
;
meanDefects
.
resize
(
maxStepsCount
);
getCenterShiftedBackprojection
(
u
c
sDirections
,
u
c
sBorderNorms
,
detectorPeaks_m
,
centerShift
);
meanDefects
[
0
]
=
getMeanDefect
(
basis
,
u
c
sDirections
,
u
c
sBorderNorms
);
getCenterShiftedBackprojection
(
u
l
sDirections
,
u
l
sBorderNorms
,
detectorPeaks_m
,
centerShift
);
meanDefects
[
0
]
=
getMeanDefect
(
basis
,
u
l
sDirections
,
u
l
sBorderNorms
);
if
(
meanDefects
[
0
]
==
1
)
{
return
;
...
...
@@ -166,38 +166,38 @@ namespace pinkIndexer
{
refineCenter
(
centerShift
,
basis
,
detectorPeaks_m
,
startStepSize_center
);
startStepSize_center
*=
0.85
;
getCenterShiftedBackprojection
(
u
c
sDirections
,
u
c
sBorderNorms
,
detectorPeaks_m
,
centerShift
);
meanDefects
[
i
]
=
getMeanDefect
(
basis
,
u
c
sDirections
,
u
c
sBorderNorms
);
getCenterShiftedBackprojection
(
u
l
sDirections
,
u
l
sBorderNorms
,
detectorPeaks_m
,
centerShift
);
meanDefects
[
i
]
=
getMeanDefect
(
basis
,
u
l
sDirections
,
u
l
sBorderNorms
);
}
Array33f
basisGradient
;
Matrix3f
offsetBasis
=
basis
;
offsetBasis
(
0
,
0
)
+=
delta
;
basisGradient
(
0
,
0
)
=
getMeanDefect
(
offsetBasis
,
u
c
sDirections
,
u
c
sBorderNorms
,
false
)
-
meanDefects
[
i
];
basisGradient
(
0
,
0
)
=
getMeanDefect
(
offsetBasis
,
u
l
sDirections
,
u
l
sBorderNorms
,
false
)
-
meanDefects
[
i
];
offsetBasis
(
0
,
0
)
=
basis
(
0
,
0
);
offsetBasis
(
1
,
0
)
+=
delta
;
basisGradient
(
1
,
0
)
=
getMeanDefect
(
offsetBasis
,
u
c
sDirections
,
u
c
sBorderNorms
,
false
)
-
meanDefects
[
i
];
basisGradient
(
1
,
0
)
=
getMeanDefect
(
offsetBasis
,
u
l
sDirections
,
u
l
sBorderNorms
,
false
)
-
meanDefects
[
i
];
offsetBasis
(
1
,
0
)
=
basis
(
1
,
0
);
offsetBasis
(
2
,
0
)
+=
delta
;
basisGradient
(
2
,
0
)
=
getMeanDefect
(
offsetBasis
,
u
c
sDirections
,
u
c
sBorderNorms
,
false
)
-
meanDefects
[
i
];
basisGradient
(
2
,
0
)
=
getMeanDefect
(
offsetBasis
,
u
l
sDirections
,
u
l
sBorderNorms
,
false
)
-
meanDefects
[
i
];
offsetBasis
(
2
,
0
)
=
basis
(
2
,
0
);
offsetBasis
(
0
,
1
)
+=
delta
;
basisGradient
(
0
,
1
)
=
getMeanDefect
(
offsetBasis
,
u
c
sDirections
,
u
c
sBorderNorms
,
false
)
-
meanDefects
[
i
];
basisGradient
(
0
,
1
)
=
getMeanDefect
(
offsetBasis
,
u
l
sDirections
,
u
l
sBorderNorms
,
false
)
-
meanDefects
[
i
];
offsetBasis
(
0
,
1
)
=
basis
(
0
,
1
);
offsetBasis
(
1
,
1
)
+=
delta
;
basisGradient
(
1
,
1
)
=
getMeanDefect
(
offsetBasis
,
u
c
sDirections
,
u
c
sBorderNorms
,
false
)
-
meanDefects
[
i
];
basisGradient
(
1
,
1
)
=
getMeanDefect
(
offsetBasis
,
u
l
sDirections
,
u
l
sBorderNorms
,
false
)
-
meanDefects
[
i
];
offsetBasis
(
1
,
1
)
=
basis
(
1
,
1
);
offsetBasis
(
2
,
1
)
+=
delta
;
basisGradient
(
2
,
1
)
=
getMeanDefect
(
offsetBasis
,
u
c
sDirections
,
u
c
sBorderNorms
,
false
)
-
meanDefects
[
i
];
basisGradient
(
2
,
1
)
=
getMeanDefect
(
offsetBasis
,
u
l
sDirections
,
u
l
sBorderNorms
,
false
)
-
meanDefects
[
i
];
offsetBasis
(
2
,
1
)
=
basis
(
2
,
1
);
offsetBasis
(
0
,
2
)
+=
delta
;
basisGradient
(
0
,
2
)
=
getMeanDefect
(
offsetBasis
,
u
c
sDirections
,
u
c
sBorderNorms
)
-
meanDefects
[
i
];
basisGradient
(
0
,
2
)
=
getMeanDefect
(
offsetBasis
,
u
l
sDirections
,
u
l
sBorderNorms
)
-
meanDefects
[
i
];
offsetBasis
(
0
,
2
)
=
basis
(
0
,
2
);
offsetBasis
(
1
,
2
)
+=
delta
;
basisGradient
(
1
,
2
)
=
getMeanDefect
(
offsetBasis
,
u
c
sDirections
,
u
c
sBorderNorms
)
-
meanDefects
[
i
];
basisGradient
(
1
,
2
)
=
getMeanDefect
(
offsetBasis
,
u
l
sDirections
,
u
l
sBorderNorms
)
-
meanDefects
[
i
];
offsetBasis
(
1
,
2
)
=
basis
(
1
,
2
);
offsetBasis
(
2
,
2
)
+=
delta
;
basisGradient
(
2
,
2
)
=
getMeanDefect
(
offsetBasis
,
u
c
sDirections
,
u
c
sBorderNorms
)
-
meanDefects
[
i
];
basisGradient
(
2
,
2
)
=
getMeanDefect
(
offsetBasis
,
u
l
sDirections
,
u
l
sBorderNorms
)
-
meanDefects
[
i
];
float
norm
=
basisGradient
.
matrix
().
norm
();
basisGradient
=
basisGradient
/
norm
*
stepSize_basis
;
...
...
@@ -208,7 +208,7 @@ namespace pinkIndexer
}
basis
=
basis
-
basisGradient
.
matrix
();
meanDefects
[
i
+
1
]
=
getMeanDefect
(
basis
,
u
c
sDirections
,
u
c
sBorderNorms
);
meanDefects
[
i
+
1
]
=
getMeanDefect
(
basis
,
u
l
sDirections
,
u
l
sBorderNorms
);
if
(
meanDefects
[
i
+
1
]
>
meanDefects
[
i
])
{
...
...
@@ -237,8 +237,8 @@ namespace pinkIndexer
int
maxStepsCount
=
35
;
meanDefects_centerAdjustment
.
resize
(
maxStepsCount
);
getCenterShiftedBackprojection
(
u
c
sDirections
,
u
c
sBorderNorms
,
detectorPeaks_m
,
centerShift
);
meanDefects_centerAdjustment
[
0
]
=
getMeanDefect
(
basis
,
u
c
sDirections
,
u
c
sBorderNorms
);
getCenterShiftedBackprojection
(
u
l
sDirections
,
u
l
sBorderNorms
,
detectorPeaks_m
,
centerShift
);
meanDefects_centerAdjustment
[
0
]
=
getMeanDefect
(
basis
,
u
l
sDirections
,
u
l
sBorderNorms
);
if
(
meanDefects_centerAdjustment
[
0
]
==
1
)
{
return
;
...
...
@@ -249,11 +249,11 @@ namespace pinkIndexer
Vector2f
centerOffsetGradient
;
Vector2f
offsetCenterShift
=
centerShift
+
Vector2f
(
deltaCenterShift
,
0
);
getCenterShiftedBackprojection
(
u
c
sDirections
,
u
c
sBorderNorms
,
detectorPeaks_m
,
offsetCenterShift
);
centerOffsetGradient
.
x
()
=
getMeanDefect
(
basis
,
u
c
sDirections
,
u
c
sBorderNorms
)
-
meanDefects_centerAdjustment
[
i
];
getCenterShiftedBackprojection
(
u
l
sDirections
,
u
l
sBorderNorms
,
detectorPeaks_m
,
offsetCenterShift
);
centerOffsetGradient
.
x
()
=
getMeanDefect
(
basis
,
u
l
sDirections
,
u
l
sBorderNorms
)
-
meanDefects_centerAdjustment
[
i
];
offsetCenterShift
=
centerShift
+
Vector2f
(
0
,
deltaCenterShift
);
getCenterShiftedBackprojection
(
u
c
sDirections
,
u
c
sBorderNorms
,
detectorPeaks_m
,
offsetCenterShift
);
centerOffsetGradient
.
y
()
=
getMeanDefect
(
basis
,
u
c
sDirections
,
u
c
sBorderNorms
)
-
meanDefects_centerAdjustment
[
i
];
getCenterShiftedBackprojection
(
u
l
sDirections
,
u
l
sBorderNorms
,
detectorPeaks_m
,
offsetCenterShift
);
centerOffsetGradient
.
y
()
=
getMeanDefect
(
basis
,
u
l
sDirections
,
u
l
sBorderNorms
)
-
meanDefects_centerAdjustment
[
i
];
float
norm
=
centerOffsetGradient
.
norm
();
centerOffsetGradient
=
centerOffsetGradient
/
norm
*
stepSize_center
;
...
...
@@ -264,8 +264,8 @@ namespace pinkIndexer
}
centerShift
=
centerShift
-
centerOffsetGradient
;
getCenterShiftedBackprojection
(
u
c
sDirections
,
u
c
sBorderNorms
,
detectorPeaks_m
,
centerShift
);
meanDefects_centerAdjustment
[
i
+
1
]
=
getMeanDefect
(
basis
,
u
c
sDirections
,
u
c
sBorderNorms
);
getCenterShiftedBackprojection
(
u
l
sDirections
,
u
l
sBorderNorms
,
detectorPeaks_m
,
centerShift
);
meanDefects_centerAdjustment
[
i
+
1
]
=
getMeanDefect
(
basis
,
u
l
sDirections
,
u
l
sBorderNorms
);
if
(
meanDefects_centerAdjustment
[
i
+
1
]
>
meanDefects_centerAdjustment
[
i
])
{
...
...
@@ -284,44 +284,44 @@ namespace pinkIndexer
}
}
int
Refinement
::
getFittedPeaksCount
(
Lattice
&
lattice
,
const
Eigen
::
Matrix3Xf
&
u
c
sDirections
,
const
Eigen
::
Array2Xf
&
u
c
sBorderNorms
)
int
Refinement
::
getFittedPeaksCount
(
Lattice
&
lattice
,
const
Eigen
::
Matrix3Xf
&
u
l
sDirections
,
const
Eigen
::
Array2Xf
&
u
l
sBorderNorms
)
{
getDefects
(
defects
,
lattice
.
getBasis
(),
u
c
sDirections
,
u
c
sBorderNorms
);
getDefects
(
defects
,
lattice
.
getBasis
(),
u
l
sDirections
,
u
l
sBorderNorms
);
int
fittedPeaksCount
=
(
defects
<
tolerance
).
count
();
return
fittedPeaksCount
;
}
int
Refinement
::
getFittedPeaks
(
Lattice
&
lattice
,
Eigen
::
Array
<
bool
,
Eigen
::
Dynamic
,
1
>&
fittedPeaks
,
const
Eigen
::
Matrix3Xf
&
u
c
sDirections
,
const
Eigen
::
Array2Xf
&
u
c
sBorderNorms
)
int
Refinement
::
getFittedPeaks
(
Lattice
&
lattice
,
Eigen
::
Array
<
bool
,
Eigen
::
Dynamic
,
1
>&
fittedPeaks
,
const
Eigen
::
Matrix3Xf
&
u
l
sDirections
,
const
Eigen
::
Array2Xf
&
u
l
sBorderNorms
)
{
getDefects
(
defects
,
lattice
.
getBasis
(),
u
c
sDirections
,
u
c
sBorderNorms
);
getDefects
(
defects
,
lattice
.
getBasis
(),
u
l
sDirections
,
u
l
sBorderNorms
);
fittedPeaks
=
(
defects
<
tolerance
);
return
fittedPeaks
.
count
();
}
void
Refinement
::
getDefects
(
ArrayXf
&
defects
,
const
Matrix3f
&
basis
,
const
Matrix3Xf
&
u
c
sDirections
,
const
Array2Xf
&
u
c
sBorderNorms
,
void
Refinement
::
getDefects
(
ArrayXf
&
defects
,
const
Matrix3f
&
basis
,
const
Matrix3Xf
&
u
l
sDirections
,
const
Array2Xf
&
u
l
sBorderNorms
,
bool
significantChangesToPreviousCall
)
{
Matrix3f
basis_inverse
=
basis
.
inverse
();
if
(
significantChangesToPreviousCall
)
{
u
c
sBorderNormsSquared
=
u
c
sBorderNorms
.
array
().
square
().
matrix
();
u
l
sBorderNormsSquared
=
u
l
sBorderNorms
.
array
().
square
().
matrix
();
millerIndices_close
=
basis_inverse
*
(
u
c
sDirections
.
array
().
rowwise
()
*
u
c
sBorderNorms
.
array
().
row
(
0
)).
matrix
();
millerIndices_close
=
basis_inverse
*
(
u
l
sDirections
.
array
().
rowwise
()
*
u
l
sBorderNorms
.
array
().
row
(
0
)).
matrix
();
roundTowardsZero
(
millerIndices_close
);
millerIndices_far
=
basis_inverse
*
(
u
c
sDirections
.
array
().
rowwise
()
*
u
c
sBorderNorms
.
array
().
row
(
1
)).
matrix
();
millerIndices_far
=
basis_inverse
*
(
u
l
sDirections
.
array
().
rowwise
()
*
u
l
sBorderNorms
.
array
().
row
(
1
)).
matrix
();
roundAwayFromZero
(
millerIndices_far
);
}
int
peakCount
=
u
c
sDirections
.
cols
();
int
peakCount
=
u
l
sDirections
.
cols
();
defects
.
resize
(
peakCount
);
for
(
int
i
=
0
;
i
<
peakCount
;
i
++
)